diff --git a/.eslintrc.js b/.eslintrc.cjs similarity index 100% rename from .eslintrc.js rename to .eslintrc.cjs diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3603a39e..11516e25 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '14' + node-version: '18' - name: npm-install run: npm install diff --git a/.mocharc.json b/.mocharc.json new file mode 100644 index 00000000..aaca5dc6 --- /dev/null +++ b/.mocharc.json @@ -0,0 +1,6 @@ +{ + "node-option": [ + "experimental-specifier-resolution=node", + "loader=ts-node/esm" + ] +} \ No newline at end of file diff --git a/build-utils/declarationTransformer.js b/build-utils/declarationTransformer.cjs similarity index 94% rename from build-utils/declarationTransformer.js rename to build-utils/declarationTransformer.cjs index fc294be9..4435264e 100644 --- a/build-utils/declarationTransformer.js +++ b/build-utils/declarationTransformer.cjs @@ -1,6 +1,6 @@ -import ts from 'typescript'; +const ts = require('typescript'); -export default options => context => node => { +module.exports = options => context => node => { return ts.visitEachChild(node, (node) => visitor(context.factory, node, options), context); } @@ -9,10 +9,10 @@ function visitor(factory, node, options) { !isClassIncluded(node.name.escapedText, options)) { return node; } - if (isClassDerived(node)) { - // workaround for https://github.com/microsoft/TypeScript/issues/46503 - return splitClassIntoConstAndInterface(factory, node); - } + // if (isClassDerived(node)) { + // // workaround for https://github.com/microsoft/TypeScript/issues/46503 + // return splitClassIntoConstAndInterface(factory, node); + // } return createNodeWithFactories(factory, node); } diff --git a/build-utils/license.js b/build-utils/license.cjs similarity index 98% rename from build-utils/license.js rename to build-utils/license.cjs index 83066aa4..35ea604c 100644 --- a/build-utils/license.js +++ b/build-utils/license.cjs @@ -1,6 +1,6 @@ const version = process.env.npm_package_version; -export default ` +module.exports = ` Planck.js v${version} @license The MIT license @copyright Copyright (c) 2021 Erin Catto, Ali Shakiba diff --git a/dist/planck-with-testbed.cjs b/dist/planck-with-testbed.cjs new file mode 100644 index 00000000..18732188 --- /dev/null +++ b/dist/planck-with-testbed.cjs @@ -0,0 +1,18310 @@ +/** + * Planck.js v1.0.0-beta.0 + * @license The MIT license + * @copyright Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var __defProp = Object.defineProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +const stats$1 = { + create: 0, + tick: 0, + node: 0, + draw: 0, + fps: 0 +}; +class Matrix { + constructor(a, b, c, d, e, f) { + this.reset(a, b, c, d, e, f); + } + toString() { + return "[" + this.a + ", " + this.b + ", " + this.c + ", " + this.d + ", " + this.e + ", " + this.f + "]"; + } + clone() { + return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f); + } + reset(a, b, c, d, e, f) { + this._dirty = true; + if (typeof a === "object") { + this.a = a.a, this.d = a.d; + this.b = a.b, this.c = a.c; + this.e = a.e, this.f = a.f; + } else { + this.a = a || 1, this.d = d || 1; + this.b = b || 0, this.c = c || 0; + this.e = e || 0, this.f = f || 0; + } + return this; + } + identity() { + this._dirty = true; + this.a = 1; + this.b = 0; + this.c = 0; + this.d = 1; + this.e = 0; + this.f = 0; + return this; + } + rotate(angle) { + if (!angle) { + return this; + } + this._dirty = true; + var u = angle ? Math.cos(angle) : 1; + var v = angle ? Math.sin(angle) : 0; + var a = u * this.a - v * this.b; + var b = u * this.b + v * this.a; + var c = u * this.c - v * this.d; + var d = u * this.d + v * this.c; + var e = u * this.e - v * this.f; + var f = u * this.f + v * this.e; + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.e = e; + this.f = f; + return this; + } + translate(x, y) { + if (!x && !y) { + return this; + } + this._dirty = true; + this.e += x; + this.f += y; + return this; + } + scale(x, y) { + if (!(x - 1) && !(y - 1)) { + return this; + } + this._dirty = true; + this.a *= x; + this.b *= y; + this.c *= x; + this.d *= y; + this.e *= x; + this.f *= y; + return this; + } + skew(x, y) { + if (!x && !y) { + return this; + } + this._dirty = true; + var a = this.a + this.b * x; + var b = this.b + this.a * y; + var c = this.c + this.d * x; + var d = this.d + this.c * y; + var e = this.e + this.f * x; + var f = this.f + this.e * y; + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.e = e; + this.f = f; + return this; + } + concat(m) { + this._dirty = true; + var n = this; + var a = n.a * m.a + n.b * m.c; + var b = n.b * m.d + n.a * m.b; + var c = n.c * m.a + n.d * m.c; + var d = n.d * m.d + n.c * m.b; + var e = n.e * m.a + m.e + n.f * m.c; + var f = n.f * m.d + m.f + n.e * m.b; + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.e = e; + this.f = f; + return this; + } + inverse() { + if (this._dirty) { + this._dirty = false; + this.inverted = this.inverted || new Matrix(); + var z = this.a * this.d - this.b * this.c; + this.inverted.a = this.d / z; + this.inverted.b = -this.b / z; + this.inverted.c = -this.c / z; + this.inverted.d = this.a / z; + this.inverted.e = (this.c * this.f - this.e * this.d) / z; + this.inverted.f = (this.e * this.b - this.a * this.f) / z; + } + return this.inverted; + } + map(p, q) { + q = q || {}; + q.x = this.a * p.x + this.c * p.y + this.e; + q.y = this.b * p.x + this.d * p.y + this.f; + return q; + } + mapX(x, y) { + if (typeof x === "object") + y = x.y, x = x.x; + return this.a * x + this.c * y + this.e; + } + mapY(x, y) { + if (typeof x === "object") + y = x.y, x = x.x; + return this.b * x + this.d * y + this.f; + } +} +var iid$1 = 0; +function Pin(owner) { + this._owner = owner; + this._parent = null; + this._relativeMatrix = new Matrix(); + this._absoluteMatrix = new Matrix(); + this.reset(); +} +Pin.prototype.reset = function() { + this._textureAlpha = 1; + this._alpha = 1; + this._width = 0; + this._height = 0; + this._scaleX = 1; + this._scaleY = 1; + this._skewX = 0; + this._skewY = 0; + this._rotation = 0; + this._pivoted = false; + this._pivotX = null; + this._pivotY = null; + this._handled = false; + this._handleX = 0; + this._handleY = 0; + this._aligned = false; + this._alignX = 0; + this._alignY = 0; + this._offsetX = 0; + this._offsetY = 0; + this._boxX = 0; + this._boxY = 0; + this._boxWidth = this._width; + this._boxHeight = this._height; + this._ts_translate = ++iid$1; + this._ts_transform = ++iid$1; + this._ts_matrix = ++iid$1; +}; +Pin.prototype._update = function() { + this._parent = this._owner._parent && this._owner._parent._pin; + if (this._handled && this._mo_handle != this._ts_transform) { + this._mo_handle = this._ts_transform; + this._ts_translate = ++iid$1; + } + if (this._aligned && this._parent && this._mo_align != this._parent._ts_transform) { + this._mo_align = this._parent._ts_transform; + this._ts_translate = ++iid$1; + } + return this; +}; +Pin.prototype.toString = function() { + return this._owner + " (" + (this._parent ? this._parent._owner : null) + ")"; +}; +Pin.prototype.absoluteMatrix = function() { + this._update(); + var ts = Math.max( + this._ts_transform, + this._ts_translate, + this._parent ? this._parent._ts_matrix : 0 + ); + if (this._mo_abs == ts) { + return this._absoluteMatrix; + } + this._mo_abs = ts; + var abs2 = this._absoluteMatrix; + abs2.reset(this.relativeMatrix()); + this._parent && abs2.concat(this._parent._absoluteMatrix); + this._ts_matrix = ++iid$1; + return abs2; +}; +Pin.prototype.relativeMatrix = function() { + this._update(); + var ts = Math.max( + this._ts_transform, + this._ts_translate, + this._parent ? this._parent._ts_transform : 0 + ); + if (this._mo_rel == ts) { + return this._relativeMatrix; + } + this._mo_rel = ts; + var rel2 = this._relativeMatrix; + rel2.identity(); + if (this._pivoted) { + rel2.translate(-this._pivotX * this._width, -this._pivotY * this._height); + } + rel2.scale(this._scaleX, this._scaleY); + rel2.skew(this._skewX, this._skewY); + rel2.rotate(this._rotation); + if (this._pivoted) { + rel2.translate(this._pivotX * this._width, this._pivotY * this._height); + } + if (this._pivoted) { + this._boxX = 0; + this._boxY = 0; + this._boxWidth = this._width; + this._boxHeight = this._height; + } else { + var p, q; + if (rel2.a > 0 && rel2.c > 0 || rel2.a < 0 && rel2.c < 0) { + p = 0, q = rel2.a * this._width + rel2.c * this._height; + } else { + p = rel2.a * this._width, q = rel2.c * this._height; + } + if (p > q) { + this._boxX = q; + this._boxWidth = p - q; + } else { + this._boxX = p; + this._boxWidth = q - p; + } + if (rel2.b > 0 && rel2.d > 0 || rel2.b < 0 && rel2.d < 0) { + p = 0, q = rel2.b * this._width + rel2.d * this._height; + } else { + p = rel2.b * this._width, q = rel2.d * this._height; + } + if (p > q) { + this._boxY = q; + this._boxHeight = p - q; + } else { + this._boxY = p; + this._boxHeight = q - p; + } + } + this._x = this._offsetX; + this._y = this._offsetY; + this._x -= this._boxX + this._handleX * this._boxWidth; + this._y -= this._boxY + this._handleY * this._boxHeight; + if (this._aligned && this._parent) { + this._parent.relativeMatrix(); + this._x += this._alignX * this._parent._width; + this._y += this._alignY * this._parent._height; + } + rel2.translate(this._x, this._y); + return this._relativeMatrix; +}; +Pin.prototype.get = function(key) { + if (typeof getters[key] === "function") { + return getters[key](this); + } +}; +Pin.prototype.set = function(a, b) { + if (typeof a === "string") { + if (typeof setters[a] === "function" && typeof b !== "undefined") { + setters[a](this, b); + } + } else if (typeof a === "object") { + for (b in a) { + if (typeof setters[b] === "function" && typeof a[b] !== "undefined") { + setters[b](this, a[b], a); + } + } + } + if (this._owner) { + this._owner._ts_pin = ++iid$1; + this._owner.touch(); + } + return this; +}; +var getters = { + alpha: function(pin) { + return pin._alpha; + }, + textureAlpha: function(pin) { + return pin._textureAlpha; + }, + width: function(pin) { + return pin._width; + }, + height: function(pin) { + return pin._height; + }, + boxWidth: function(pin) { + return pin._boxWidth; + }, + boxHeight: function(pin) { + return pin._boxHeight; + }, + // scale : function(pin) { + // }, + scaleX: function(pin) { + return pin._scaleX; + }, + scaleY: function(pin) { + return pin._scaleY; + }, + // skew : function(pin) { + // }, + skewX: function(pin) { + return pin._skewX; + }, + skewY: function(pin) { + return pin._skewY; + }, + rotation: function(pin) { + return pin._rotation; + }, + // pivot : function(pin) { + // }, + pivotX: function(pin) { + return pin._pivotX; + }, + pivotY: function(pin) { + return pin._pivotY; + }, + // offset : function(pin) { + // }, + offsetX: function(pin) { + return pin._offsetX; + }, + offsetY: function(pin) { + return pin._offsetY; + }, + // align : function(pin) { + // }, + alignX: function(pin) { + return pin._alignX; + }, + alignY: function(pin) { + return pin._alignY; + }, + // handle : function(pin) { + // }, + handleX: function(pin) { + return pin._handleX; + }, + handleY: function(pin) { + return pin._handleY; + } +}; +var setters = { + alpha: function(pin, value) { + pin._alpha = value; + }, + textureAlpha: function(pin, value) { + pin._textureAlpha = value; + }, + width: function(pin, value) { + pin._width_ = value; + pin._width = value; + pin._ts_transform = ++iid$1; + }, + height: function(pin, value) { + pin._height_ = value; + pin._height = value; + pin._ts_transform = ++iid$1; + }, + scale: function(pin, value) { + pin._scaleX = value; + pin._scaleY = value; + pin._ts_transform = ++iid$1; + }, + scaleX: function(pin, value) { + pin._scaleX = value; + pin._ts_transform = ++iid$1; + }, + scaleY: function(pin, value) { + pin._scaleY = value; + pin._ts_transform = ++iid$1; + }, + skew: function(pin, value) { + pin._skewX = value; + pin._skewY = value; + pin._ts_transform = ++iid$1; + }, + skewX: function(pin, value) { + pin._skewX = value; + pin._ts_transform = ++iid$1; + }, + skewY: function(pin, value) { + pin._skewY = value; + pin._ts_transform = ++iid$1; + }, + rotation: function(pin, value) { + pin._rotation = value; + pin._ts_transform = ++iid$1; + }, + pivot: function(pin, value) { + pin._pivotX = value; + pin._pivotY = value; + pin._pivoted = true; + pin._ts_transform = ++iid$1; + }, + pivotX: function(pin, value) { + pin._pivotX = value; + pin._pivoted = true; + pin._ts_transform = ++iid$1; + }, + pivotY: function(pin, value) { + pin._pivotY = value; + pin._pivoted = true; + pin._ts_transform = ++iid$1; + }, + offset: function(pin, value) { + pin._offsetX = value; + pin._offsetY = value; + pin._ts_translate = ++iid$1; + }, + offsetX: function(pin, value) { + pin._offsetX = value; + pin._ts_translate = ++iid$1; + }, + offsetY: function(pin, value) { + pin._offsetY = value; + pin._ts_translate = ++iid$1; + }, + align: function(pin, value) { + this.alignX(pin, value); + this.alignY(pin, value); + }, + alignX: function(pin, value) { + pin._alignX = value; + pin._aligned = true; + pin._ts_translate = ++iid$1; + this.handleX(pin, value); + }, + alignY: function(pin, value) { + pin._alignY = value; + pin._aligned = true; + pin._ts_translate = ++iid$1; + this.handleY(pin, value); + }, + handle: function(pin, value) { + this.handleX(pin, value); + this.handleY(pin, value); + }, + handleX: function(pin, value) { + pin._handleX = value; + pin._handled = true; + pin._ts_translate = ++iid$1; + }, + handleY: function(pin, value) { + pin._handleY = value; + pin._handled = true; + pin._ts_translate = ++iid$1; + }, + resizeMode: function(pin, value, all) { + if (all) { + if (value == "in") { + value = "in-pad"; + } else if (value == "out") { + value = "out-crop"; + } + scaleTo(pin, all.resizeWidth, all.resizeHeight, value); + } + }, + resizeWidth: function(pin, value, all) { + if (!all || !all.resizeMode) { + scaleTo(pin, value, null); + } + }, + resizeHeight: function(pin, value, all) { + if (!all || !all.resizeMode) { + scaleTo(pin, null, value); + } + }, + scaleMode: function(pin, value, all) { + if (all) { + scaleTo(pin, all.scaleWidth, all.scaleHeight, value); + } + }, + scaleWidth: function(pin, value, all) { + if (!all || !all.scaleMode) { + scaleTo(pin, value, null); + } + }, + scaleHeight: function(pin, value, all) { + if (!all || !all.scaleMode) { + scaleTo(pin, null, value); + } + }, + matrix: function(pin, value) { + this.scaleX(pin, value.a); + this.skewX(pin, value.c / value.d); + this.skewY(pin, value.b / value.a); + this.scaleY(pin, value.d); + this.offsetX(pin, value.e); + this.offsetY(pin, value.f); + this.rotation(pin, 0); + } +}; +Pin.prototype.scaleTo = function(width, height, mode) { + scaleTo(this, width, height, mode); +}; +function scaleTo(pin, width, height, mode) { + var w = typeof width === "number"; + var h = typeof height === "number"; + var m = typeof mode === "string"; + pin._ts_transform = ++iid$1; + if (w) { + pin._scaleX = width / pin._width_; + pin._width = pin._width_; + } + if (h) { + pin._scaleY = height / pin._height_; + pin._height = pin._height_; + } + if (w && h && m) { + if (mode == "out" || mode == "out-crop") { + pin._scaleX = pin._scaleY = Math.max(pin._scaleX, pin._scaleY); + } else if (mode == "in" || mode == "in-pad") { + pin._scaleX = pin._scaleY = Math.min(pin._scaleX, pin._scaleY); + } + if (mode == "out-crop" || mode == "in-pad") { + pin._width = width / pin._scaleX; + pin._height = height / pin._scaleY; + } + } +} +Pin._add_shortcuts = function(prototype) { + prototype.size = function(w, h) { + this.pin("width", w); + this.pin("height", h); + return this; + }; + prototype.width = function(w) { + if (typeof w === "undefined") { + return this.pin("width"); + } + this.pin("width", w); + return this; + }; + prototype.height = function(h) { + if (typeof h === "undefined") { + return this.pin("height"); + } + this.pin("height", h); + return this; + }; + prototype.offset = function(a, b) { + if (typeof a === "object") + b = a.y, a = a.x; + this.pin("offsetX", a); + this.pin("offsetY", b); + return this; + }; + prototype.rotate = function(a) { + this.pin("rotation", a); + return this; + }; + prototype.skew = function(a, b) { + if (typeof a === "object") + b = a.y, a = a.x; + else if (typeof b === "undefined") + b = a; + this.pin("skewX", a); + this.pin("skewY", b); + return this; + }; + prototype.scale = function(a, b) { + if (typeof a === "object") + b = a.y, a = a.x; + else if (typeof b === "undefined") + b = a; + this.pin("scaleX", a); + this.pin("scaleY", b); + return this; + }; + prototype.alpha = function(a, ta) { + this.pin("alpha", a); + if (typeof ta !== "undefined") { + this.pin("textureAlpha", ta); + } + return this; + }; +}; +var iid = 0; +stats$1.create = 0; +function assertType(obj) { + if (obj && obj instanceof Node) { + return obj; + } + throw "Invalid node: " + obj; +} +const create = function() { + return new Node(); +}; +function Node() { + stats$1.create++; + this._pin = new Pin(this); +} +Node.prototype.matrix = function(relative) { + if (relative === true) { + return this._pin.relativeMatrix(); + } + return this._pin.absoluteMatrix(); +}; +Node.prototype.pin = function(a, b) { + if (typeof a === "object") { + this._pin.set(a); + return this; + } else if (typeof a === "string") { + if (typeof b === "undefined") { + return this._pin.get(a); + } else { + this._pin.set(a, b); + return this; + } + } else if (typeof a === "undefined") { + return this._pin; + } +}; +Node.prototype.scaleTo = function(a, b, c) { + if (typeof a === "object") + c = b, b = a.y, a = a.x; + this._pin.scaleTo(a, b, c); + return this; +}; +Pin._add_shortcuts(Node.prototype); +Node.prototype._label = ""; +Node.prototype._visible = true; +Node.prototype._parent = null; +Node.prototype._next = null; +Node.prototype._prev = null; +Node.prototype._first = null; +Node.prototype._last = null; +Node.prototype._attrs = null; +Node.prototype._flags = null; +Node.prototype.toString = function() { + return "[" + this._label + "]"; +}; +Node.prototype.id = function(id) { + return this.label(id); +}; +Node.prototype.label = function(label) { + if (typeof label === "undefined") { + return this._label; + } + this._label = label; + return this; +}; +Node.prototype.attr = function(name, value) { + if (typeof value === "undefined") { + return this._attrs !== null ? this._attrs[name] : void 0; + } + (this._attrs !== null ? this._attrs : this._attrs = {})[name] = value; + return this; +}; +Node.prototype.visible = function(visible) { + if (typeof visible === "undefined") { + return this._visible; + } + this._visible = visible; + this._parent && (this._parent._ts_children = ++iid); + this._ts_pin = ++iid; + this.touch(); + return this; +}; +Node.prototype.hide = function() { + return this.visible(false); +}; +Node.prototype.show = function() { + return this.visible(true); +}; +Node.prototype.parent = function() { + return this._parent; +}; +Node.prototype.next = function(visible) { + var next = this._next; + while (next && visible && !next._visible) { + next = next._next; + } + return next; +}; +Node.prototype.prev = function(visible) { + var prev = this._prev; + while (prev && visible && !prev._visible) { + prev = prev._prev; + } + return prev; +}; +Node.prototype.first = function(visible) { + var next = this._first; + while (next && visible && !next._visible) { + next = next._next; + } + return next; +}; +Node.prototype.last = function(visible) { + var prev = this._last; + while (prev && visible && !prev._visible) { + prev = prev._prev; + } + return prev; +}; +Node.prototype.visit = function(visitor, data) { + var reverse = visitor.reverse; + var visible = visitor.visible; + if (visitor.start && visitor.start(this, data)) { + return; + } + var child, next = reverse ? this.last(visible) : this.first(visible); + while (child = next) { + next = reverse ? child.prev(visible) : child.next(visible); + if (child.visit(visitor, data)) { + return true; + } + } + return visitor.end && visitor.end(this, data); +}; +Node.prototype.append = function(child, more) { + if (Array.isArray(child)) + for (var i = 0; i < child.length; i++) + append(this, child[i]); + else if (typeof more !== "undefined") + for (var i = 0; i < arguments.length; i++) + append(this, arguments[i]); + else if (typeof child !== "undefined") + append(this, child); + return this; +}; +Node.prototype.prepend = function(child, more) { + if (Array.isArray(child)) + for (var i = child.length - 1; i >= 0; i--) + prepend(this, child[i]); + else if (typeof more !== "undefined") + for (var i = arguments.length - 1; i >= 0; i--) + prepend(this, arguments[i]); + else if (typeof child !== "undefined") + prepend(this, child); + return this; +}; +Node.prototype.appendTo = function(parent) { + append(parent, this); + return this; +}; +Node.prototype.prependTo = function(parent) { + prepend(parent, this); + return this; +}; +Node.prototype.insertNext = function(sibling, more) { + if (Array.isArray(sibling)) + for (var i = 0; i < sibling.length; i++) + insertAfter(sibling[i], this); + else if (typeof more !== "undefined") + for (var i = 0; i < arguments.length; i++) + insertAfter(arguments[i], this); + else if (typeof sibling !== "undefined") + insertAfter(sibling, this); + return this; +}; +Node.prototype.insertPrev = function(sibling, more) { + if (Array.isArray(sibling)) + for (var i = sibling.length - 1; i >= 0; i--) + insertBefore(sibling[i], this); + else if (typeof more !== "undefined") + for (var i = arguments.length - 1; i >= 0; i--) + insertBefore(arguments[i], this); + else if (typeof sibling !== "undefined") + insertBefore(sibling, this); + return this; +}; +Node.prototype.insertAfter = function(prev) { + insertAfter(this, prev); + return this; +}; +Node.prototype.insertBefore = function(next) { + insertBefore(this, next); + return this; +}; +function append(parent, child) { + assertType(child); + assertType(parent); + child.remove(); + if (parent._last) { + parent._last._next = child; + child._prev = parent._last; + } + child._parent = parent; + parent._last = child; + if (!parent._first) { + parent._first = child; + } + child._parent._flag(child, true); + child._ts_parent = ++iid; + parent._ts_children = ++iid; + parent.touch(); +} +function prepend(parent, child) { + assertType(child); + assertType(parent); + child.remove(); + if (parent._first) { + parent._first._prev = child; + child._next = parent._first; + } + child._parent = parent; + parent._first = child; + if (!parent._last) { + parent._last = child; + } + child._parent._flag(child, true); + child._ts_parent = ++iid; + parent._ts_children = ++iid; + parent.touch(); +} +function insertBefore(self, next) { + assertType(self); + assertType(next); + self.remove(); + var parent = next._parent; + var prev = next._prev; + next._prev = self; + prev && (prev._next = self) || parent && (parent._first = self); + self._parent = parent; + self._prev = prev; + self._next = next; + self._parent._flag(self, true); + self._ts_parent = ++iid; + self.touch(); +} +function insertAfter(self, prev) { + assertType(self); + assertType(prev); + self.remove(); + var parent = prev._parent; + var next = prev._next; + prev._next = self; + next && (next._prev = self) || parent && (parent._last = self); + self._parent = parent; + self._prev = prev; + self._next = next; + self._parent._flag(self, true); + self._ts_parent = ++iid; + self.touch(); +} +Node.prototype.remove = function(child, more) { + if (typeof child !== "undefined") { + if (Array.isArray(child)) { + for (var i = 0; i < child.length; i++) + assertType(child[i]).remove(); + } else if (typeof more !== "undefined") { + for (var i = 0; i < arguments.length; i++) + assertType(arguments[i]).remove(); + } else { + assertType(child).remove(); + } + return this; + } + if (this._prev) { + this._prev._next = this._next; + } + if (this._next) { + this._next._prev = this._prev; + } + if (this._parent) { + if (this._parent._first === this) { + this._parent._first = this._next; + } + if (this._parent._last === this) { + this._parent._last = this._prev; + } + this._parent._flag(this, false); + this._parent._ts_children = ++iid; + this._parent.touch(); + } + this._prev = this._next = this._parent = null; + this._ts_parent = ++iid; + return this; +}; +Node.prototype.empty = function() { + var child, next = this._first; + while (child = next) { + next = child._next; + child._prev = child._next = child._parent = null; + this._flag(child, false); + } + this._first = this._last = null; + this._ts_children = ++iid; + this.touch(); + return this; +}; +Node.prototype._ts_touch = null; +Node.prototype.touch = function() { + this._ts_touch = ++iid; + this._parent && this._parent.touch(); + return this; +}; +Node.prototype._flag = function(obj, name) { + if (typeof name === "undefined") { + return this._flags !== null && this._flags[obj] || 0; + } + if (typeof obj === "string") { + if (name) { + this._flags = this._flags || {}; + if (!this._flags[obj] && this._parent) { + this._parent._flag(obj, true); + } + this._flags[obj] = (this._flags[obj] || 0) + 1; + } else if (this._flags && this._flags[obj] > 0) { + if (this._flags[obj] == 1 && this._parent) { + this._parent._flag(obj, false); + } + this._flags[obj] = this._flags[obj] - 1; + } + } + if (typeof obj === "object") { + if (obj._flags) { + for (var type in obj._flags) { + if (obj._flags[type] > 0) { + this._flag(type, name); + } + } + } + } + return this; +}; +Node.prototype.hitTest = function(hit) { + var width = this._pin._width; + var height = this._pin._height; + return hit.x >= 0 && hit.x <= width && hit.y >= 0 && hit.y <= height; +}; +Node.prototype._textures = null; +Node.prototype._alpha = 1; +Node.prototype.render = function(context) { + if (!this._visible) { + return; + } + stats$1.node++; + var m = this.matrix(); + context.setTransform(m.a, m.b, m.c, m.d, m.e, m.f); + this._alpha = this._pin._alpha * (this._parent ? this._parent._alpha : 1); + var alpha = this._pin._textureAlpha * this._alpha; + if (context.globalAlpha != alpha) { + context.globalAlpha = alpha; + } + if (this._textures !== null) { + for (var i = 0, n = this._textures.length; i < n; i++) { + this._textures[i].draw(context); + } + } + if (context.globalAlpha != this._alpha) { + context.globalAlpha = this._alpha; + } + var child, next = this._first; + while (child = next) { + next = child._next; + child.render(context); + } +}; +Node.prototype._tickBefore = null; +Node.prototype._tickAfter = null; +Node.prototype.MAX_ELAPSE = Infinity; +Node.prototype._tick = function(elapsed, now, last) { + if (!this._visible) { + return; + } + if (elapsed > this.MAX_ELAPSE) { + elapsed = this.MAX_ELAPSE; + } + var ticked = false; + if (this._tickBefore !== null) { + for (var i = 0; i < this._tickBefore.length; i++) { + stats$1.tick++; + var tickFn = this._tickBefore[i]; + ticked = tickFn.call(this, elapsed, now, last) === true || ticked; + } + } + var child, next = this._first; + while (child = next) { + next = child._next; + if (child._flag("_tick")) { + ticked = child._tick(elapsed, now, last) === true ? true : ticked; + } + } + if (this._tickAfter !== null) { + for (var i = 0; i < this._tickAfter.length; i++) { + stats$1.tick++; + var tickFn = this._tickAfter[i]; + ticked = tickFn.call(this, elapsed, now, last) === true || ticked; + } + } + return ticked; +}; +Node.prototype.tick = function(ticker, before) { + if (typeof ticker !== "function") { + return; + } + if (before) { + if (this._tickBefore === null) { + this._tickBefore = []; + } + this._tickBefore.push(ticker); + } else { + if (this._tickAfter === null) { + this._tickAfter = []; + } + this._tickAfter.push(ticker); + } + this._flag("_tick", this._tickAfter !== null && this._tickAfter.length > 0 || this._tickBefore !== null && this._tickBefore.length > 0); +}; +Node.prototype.untick = function(ticker) { + if (typeof ticker !== "function") { + return; + } + var i; + if (this._tickBefore !== null && (i = this._tickBefore.indexOf(ticker)) >= 0) { + this._tickBefore.splice(i, 1); + } + if (this._tickAfter !== null && (i = this._tickAfter.indexOf(ticker)) >= 0) { + this._tickAfter.splice(i, 1); + } +}; +Node.prototype.timeout = function(fn, time) { + this.setTimeout(fn, time); +}; +Node.prototype.setTimeout = function(fn, time) { + function timer(t) { + if ((time -= t) < 0) { + this.untick(timer); + fn.call(this); + } else { + return true; + } + } + this.tick(timer); + return timer; +}; +Node.prototype.clearTimeout = function(timer) { + this.untick(timer); +}; +Node.prototype._listeners = null; +Node.prototype._event_callback = function(name, on) { + this._flag(name, on); +}; +Node.prototype.on = function(types, listener) { + if (!types || !types.length || typeof listener !== "function") { + return this; + } + if (this._listeners === null) { + this._listeners = {}; + } + var isarray = typeof types !== "string" && typeof types.join === "function"; + if (types = (isarray ? types.join(" ") : types).match(/\S+/g)) { + for (var i = 0; i < types.length; i++) { + var type = types[i]; + this._listeners[type] = this._listeners[type] || []; + this._listeners[type].push(listener); + if (typeof this._event_callback === "function") { + this._event_callback(type, true); + } + } + } + return this; +}; +Node.prototype.off = function(types, listener) { + if (!types || !types.length || typeof listener !== "function") { + return this; + } + if (this._listeners === null) { + return this; + } + var isarray = typeof types !== "string" && typeof types.join === "function"; + if (types = (isarray ? types.join(" ") : types).match(/\S+/g)) { + for (var i = 0; i < types.length; i++) { + var type = types[i], all = this._listeners[type], index; + if (all && (index = all.indexOf(listener)) >= 0) { + all.splice(index, 1); + if (!all.length) { + delete this._listeners[type]; + } + if (typeof this._event_callback === "function") { + this._event_callback(type, false); + } + } + } + } + return this; +}; +Node.prototype.listeners = function(type) { + return this._listeners && this._listeners[type]; +}; +Node.prototype.publish = function(name, args) { + var listeners = this.listeners(name); + if (!listeners || !listeners.length) { + return 0; + } + for (var l = 0; l < listeners.length; l++) { + listeners[l].apply(this, args); + } + return listeners.length; +}; +Node.prototype.trigger = function(name, args) { + this.publish(name, args); + return this; +}; +var native = Math; +const math$1 = Object.create(Math); +math$1.random = function(min, max) { + if (typeof min === "undefined") { + max = 1, min = 0; + } else if (typeof max === "undefined") { + max = min, min = 0; + } + return min == max ? min : native.random() * (max - min) + min; +}; +math$1.wrap = function(num, min, max) { + if (typeof min === "undefined") { + max = 1, min = 0; + } else if (typeof max === "undefined") { + max = min, min = 0; + } + if (max > min) { + num = (num - min) % (max - min); + return num + (num < 0 ? max : min); + } else { + num = (num - max) % (min - max); + return num + (num <= 0 ? min : max); + } +}; +math$1.clamp = function(num, min, max) { + if (num < min) { + return min; + } else if (num > max) { + return max; + } else { + return num; + } +}; +math$1.length = function(x, y) { + return native.sqrt(x * x + y * y); +}; +math$1.rotate = math$1.wrap; +math$1.limit = math$1.clamp; +const isFn = function(value) { + var str = Object.prototype.toString.call(value); + return str === "[object Function]" || str === "[object GeneratorFunction]" || str === "[object AsyncFunction]"; +}; +const isHash = function(value) { + return Object.prototype.toString.call(value) === "[object Object]" && value.constructor === Object; +}; +class Texture { + constructor(texture2, ratio) { + if (typeof texture2 === "object") { + this.src(texture2, ratio); + } + } + pipe() { + return new Texture(this); + } + /** + * Signatures: (texture), (x, y, w, h), (w, h) + */ + src(x, y, w, h) { + if (typeof x === "object") { + var drawable = x, ratio = y || 1; + this._image = drawable; + this._sx = this._dx = 0; + this._sy = this._dy = 0; + this._sw = this._dw = drawable.width / ratio; + this._sh = this._dh = drawable.height / ratio; + this.width = drawable.width / ratio; + this.height = drawable.height / ratio; + this.ratio = ratio; + } else { + if (typeof w === "undefined") { + w = x, h = y; + } else { + this._sx = x, this._sy = y; + } + this._sw = this._dw = w; + this._sh = this._dh = h; + this.width = w; + this.height = h; + } + return this; + } + /** + * Signatures: (x, y, w, h), (x, y) + */ + dest(x, y, w, h) { + this._dx = x, this._dy = y; + this._dx = x, this._dy = y; + if (typeof w !== "undefined") { + this._dw = w, this._dh = h; + this.width = w, this.height = h; + } + return this; + } + draw(context, x1, y1, x2, y2, x3, y3, x4, y4) { + var drawable = this._image; + if (drawable === null || typeof drawable !== "object") { + return; + } + var sx = this._sx, sy = this._sy; + var sw = this._sw, sh = this._sh; + var dx = this._dx, dy = this._dy; + var dw = this._dw, dh = this._dh; + if (typeof x3 !== "undefined") { + x1 = math$1.clamp(x1, 0, this._sw), x2 = math$1.clamp(x2, 0, this._sw - x1); + y1 = math$1.clamp(y1, 0, this._sh), y2 = math$1.clamp(y2, 0, this._sh - y1); + sx += x1, sy += y1, sw = x2, sh = y2; + dx = x3, dy = y3, dw = x4, dh = y4; + } else if (typeof x2 !== "undefined") { + dx = x1, dy = y1, dw = x2, dh = y2; + } else if (typeof x1 !== "undefined") { + dw = x1, dh = y1; + } + var ratio = this.ratio || 1; + sx *= ratio, sy *= ratio, sw *= ratio, sh *= ratio; + try { + if (typeof drawable.draw === "function") { + drawable.draw(context, sx, sy, sw, sh, dx, dy, dw, dh); + } else { + stats$1.draw++; + context.drawImage(drawable, sx, sy, sw, sh, dx, dy, dw, dh); + } + } catch (ex) { + if (!drawable._draw_failed) { + console.log("Unable to draw: ", drawable); + console.log(ex); + drawable._draw_failed = true; + } + } + } +} +var NO_TEXTURE = new class extends Texture { + constructor() { + super(); + __publicField(this, "pipe", function() { + return this; + }); + __publicField(this, "src", function() { + return this; + }); + __publicField(this, "dest", function() { + return this; + }); + __publicField(this, "draw", function() { + }); + this.x = this.y = this.width = this.height = 0; + } +}(); +var NO_SELECTION = new Selection(NO_TEXTURE); +function preloadImage(src) { + console.log("Loading image: " + src); + return new Promise(function(resolve, reject) { + const img = new Image(); + img.onload = function() { + console.log("Image loaded: " + src); + resolve(img); + }; + img.onerror = function(error) { + console.log("Loading failed: " + src); + reject(error); + }; + img.src = src; + }); +} +var _atlases_map = {}; +var _atlases_arr = []; +const atlas = async function(def) { + var atlas2 = isFn(def.draw) ? def : new Atlas(def); + if (def.name) { + _atlases_map[def.name] = atlas2; + } + _atlases_arr.push(atlas2); + deprecated(def, "imagePath"); + deprecated(def, "imageRatio"); + var url = def.imagePath; + var ratio = def.imageRatio || 1; + if ("string" === typeof def.image) { + url = def.image; + } else if (isHash(def.image)) { + url = def.image.src || def.image.url; + ratio = def.image.ratio || ratio; + } + if (url) { + const image2 = await preloadImage(url); + atlas2.src(image2, ratio); + } + return atlas2; +}; +class Atlas extends Texture { + constructor(def) { + super(); + var atlas2 = this; + deprecated(def, "filter"); + deprecated(def, "cutouts"); + deprecated(def, "sprites"); + deprecated(def, "factory"); + var map = def.map || def.filter; + var ppu = def.ppu || def.ratio || 1; + var trim = def.trim || 0; + var textures = def.textures; + var factory = def.factory; + var cutouts = def.cutouts || def.sprites; + function make(def2) { + if (!def2 || isFn(def2.draw)) { + return def2; + } + def2 = Object.assign({}, def2); + if (isFn(map)) { + def2 = map(def2); + } + if (ppu != 1) { + def2.x *= ppu, def2.y *= ppu; + def2.width *= ppu, def2.height *= ppu; + def2.top *= ppu, def2.bottom *= ppu; + def2.left *= ppu, def2.right *= ppu; + } + if (trim != 0) { + def2.x += trim, def2.y += trim; + def2.width -= 2 * trim, def2.height -= 2 * trim; + def2.top -= trim, def2.bottom -= trim; + def2.left -= trim, def2.right -= trim; + } + var texture2 = atlas2.pipe(); + texture2.top = def2.top, texture2.bottom = def2.bottom; + texture2.left = def2.left, texture2.right = def2.right; + texture2.src(def2.x, def2.y, def2.width, def2.height); + return texture2; + } + function find(query) { + if (textures) { + if (isFn(textures)) { + return textures(query); + } else if (isHash(textures)) { + return textures[query]; + } + } + if (cutouts) { + var result = null, n = 0; + for (var i = 0; i < cutouts.length; i++) { + if (string.startsWith(cutouts[i].name, query)) { + if (n === 0) { + result = cutouts[i]; + } else if (n === 1) { + result = [result, cutouts[i]]; + } else { + result.push(cutouts[i]); + } + n++; + } + } + if (n === 0 && isFn(factory)) { + result = function(subquery) { + return factory(query + (subquery ? subquery : "")); + }; + } + return result; + } + } + this.select = function(query) { + if (!query) { + return new Selection(this.pipe()); + } + var found = find(query); + if (found) { + return new Selection(found, find, make); + } + }; + } +} +function Selection(result, find, make) { + function link(result2, subquery) { + if (!result2) { + return NO_TEXTURE; + } else if (isFn(result2.draw)) { + return result2; + } else if (isHash(result2) && "number" === typeof result2.width && "number" === typeof result2.height && isFn(make)) { + return make(result2); + } else if (isHash(result2) && "undefined" !== typeof subquery) { + return link(result2[subquery]); + } else if (isFn(result2)) { + return link(result2(subquery)); + } else if (Array.isArray(result2)) { + return link(result2[0]); + } else if ("string" === typeof result2 && isFn(find)) { + return link(find(result2)); + } + } + this.one = function(subquery) { + return link(result, subquery); + }; + this.array = function(arr) { + var array = Array.isArray(arr) ? arr : []; + if (Array.isArray(result)) { + for (var i = 0; i < result.length; i++) { + array[i] = link(result[i]); + } + } else { + array[0] = link(result); + } + return array; + }; +} +const texture = function(query) { + if (!("string" === typeof query)) { + return new Selection(query); + } + var result = null, atlas2, i; + if ((i = query.indexOf(":")) > 0 && query.length > i + 1) { + atlas2 = _atlases_map[query.slice(0, i)]; + result = atlas2 && atlas2.select(query.slice(i + 1)); + } + if (!result && (atlas2 = _atlases_map[query])) { + result = atlas2.select(); + } + for (i = 0; !result && i < _atlases_arr.length; i++) { + result = _atlases_arr[i].select(query); + } + if (!result) { + console.error("Texture not found: " + query); + result = NO_SELECTION; + } + return result; +}; +function deprecated(hash, name, msg) { + if (name in hash) + console.log(msg ? msg.replace("%name", name) : "'" + name + "' field of texture atlas is deprecated."); +} +const canvas = function(type, attributes, plotter) { + if (typeof type === "string") { + if (typeof attributes === "object") + ; + else { + if (typeof attributes === "function") { + plotter = attributes; + } + attributes = {}; + } + } else { + if (typeof type === "function") { + plotter = type; + } + attributes = {}; + type = "2d"; + } + var canvas2 = document.createElement("canvas"); + var context = canvas2.getContext(type, attributes); + var texture2 = new Texture(canvas2); + texture2.context = function() { + return context; + }; + texture2.size = function(width, height, ratio) { + ratio = ratio || 1; + canvas2.width = width * ratio; + canvas2.height = height * ratio; + this.src(canvas2, ratio); + return this; + }; + texture2.canvas = function(fn) { + if (typeof fn === "function") { + fn.call(this, context); + } else if (typeof fn === "undefined" && typeof plotter === "function") { + plotter.call(this, context); + } + return this; + }; + if (typeof plotter === "function") { + plotter.call(texture2, context); + } + return texture2; +}; +const PIXEL_RATIO = window.devicePixelRatio || 1; +let M; +function memoizeDraw(callback, memoKey = () => null) { + let lastRatio = 0; + let lastSelection = void 0; + let texture2 = Stage.canvas(); + let sprite2 = Stage.sprite(); + let first = true; + sprite2.tick(function() { + let m = this._parent.matrix(); + if (first) { + first = false; + if (!(m = M)) { + return; + } + } + M = m; + let newRatio = Math.max(Math.abs(m.a), Math.abs(m.b)); + let rationChange = lastRatio / newRatio; + if (lastRatio === 0 || rationChange > 1.25 || rationChange < 0.8) { + const newSelection = memoKey(); + if (lastSelection !== newSelection) { + lastRatio = newRatio; + callback(2.5 * newRatio / PIXEL_RATIO, texture2, sprite2); + sprite2.texture(texture2); + sprite2.__timestamp = Date.now(); + } + } + }, false); + return sprite2; +} +class Mouse { + constructor() { + __publicField(this, "x", 0); + __publicField(this, "y", 0); + __publicField(this, "ratio", 1); + __publicField(this, "stage"); + __publicField(this, "elem"); + __publicField(this, "clicklist", []); + __publicField(this, "cancellist", []); + __publicField(this, "handleStart", (event) => { + event.preventDefault(); + this.locate(event); + this.publish(event.type, event); + this.lookup("click", this.clicklist); + this.lookup("mousecancel", this.cancellist); + }); + __publicField(this, "handleMove", (event) => { + event.preventDefault(); + this.locate(event); + this.publish(event.type, event); + }); + __publicField(this, "handleEnd", (event) => { + event.preventDefault(); + this.publish(event.type, event); + if (this.clicklist.length) { + this.publish("click", event, this.clicklist); + } + this.cancellist.length = 0; + }); + __publicField(this, "handleCancel", (event) => { + if (this.cancellist.length) { + this.publish("mousecancel", event, this.cancellist); + } + this.clicklist.length = 0; + }); + __publicField(this, "toString", function() { + return (this.x | 0) + "x" + (this.y | 0); + }); + __publicField(this, "locate", function(event) { + const elem = this.elem; + let x; + let y; + if (event.touches && event.touches.length) { + x = event.touches[0].clientX; + y = event.touches[0].clientY; + } else { + x = event.clientX; + y = event.clientY; + } + var rect = elem.getBoundingClientRect(); + x -= rect.left; + y -= rect.top; + x -= elem.clientLeft | 0; + y -= elem.clientTop | 0; + this.x = x * this.ratio; + this.y = y * this.ratio; + }); + __publicField(this, "lookup", function(type, collect) { + this.type = type; + this.root = this.stage; + this.event = null; + collect.length = 0; + this.collect = collect; + this.root.visit({ + reverse: true, + visible: true, + start: this.visitStart, + end: this.visitEnd + }, this); + }); + __publicField(this, "publish", function(type, event, targets) { + this.type = type; + this.root = this.stage; + this.event = event; + this.collect = false; + this.timeStamp = Date.now(); + if (type !== "mousemove" && type !== "touchmove") { + console.log(this.type + " " + this); + } + if (targets) { + while (targets.length) + if (this.visitEnd(targets.shift())) + break; + targets.length = 0; + } else { + this.root.visit({ + reverse: true, + visible: true, + start: this.visitStart, + end: this.visitEnd + }, this); + } + }); + __publicField(this, "visitStart", (node) => { + return !node._flag(this.type); + }); + __publicField(this, "visitEnd", (node) => { + rel.raw = this.event; + rel.type = this.type; + rel.timeStamp = this.timeStamp; + rel.abs.x = this.x; + rel.abs.y = this.y; + var listeners = node.listeners(this.type); + if (!listeners) { + return; + } + node.matrix().inverse().map(this, rel); + if (!(node === this.root || node.attr("spy") || node.hitTest(rel))) { + return; + } + if (this.collect) { + this.collect.push(node); + } + if (this.event) { + var cancel = false; + for (var l = 0; l < listeners.length; l++) { + cancel = listeners[l].call(node, rel) ? true : cancel; + } + return cancel; + } + }); + } + mount(stage, elem) { + this.stage = stage; + this.elem = elem; + this.ratio = stage.viewport().ratio || 1; + stage.on("viewport", (size) => { + this.ratio = size.ratio ?? this.ratio; + }); + elem.addEventListener("touchstart", this.handleStart); + elem.addEventListener("touchend", this.handleEnd); + elem.addEventListener("touchmove", this.handleMove); + elem.addEventListener("touchcancel", this.handleCancel); + elem.addEventListener("mousedown", this.handleStart); + elem.addEventListener("mouseup", this.handleEnd); + elem.addEventListener("mousemove", this.handleMove); + document.addEventListener("mouseup", this.handleCancel); + window.addEventListener("blur", this.handleCancel); + return this; + } + unmount() { + const elem = this.elem; + elem.removeEventListener("touchstart", this.handleStart); + elem.removeEventListener("touchend", this.handleEnd); + elem.removeEventListener("touchmove", this.handleMove); + elem.removeEventListener("touchcancel", this.handleCancel); + elem.removeEventListener("mousedown", this.handleStart); + elem.removeEventListener("mouseup", this.handleEnd); + elem.removeEventListener("mousemove", this.handleMove); + document.removeEventListener("mouseup", this.handleCancel); + window.removeEventListener("blur", this.handleCancel); + return this; + } +} +__publicField(Mouse, "CLICK", "click"); +__publicField(Mouse, "START", "touchstart mousedown"); +__publicField(Mouse, "MOVE", "touchmove mousemove"); +__publicField(Mouse, "END", "touchend mouseup"); +__publicField(Mouse, "CANCEL", "touchcancel mousecancel"); +var rel = {}, abs = {}; +defineValue(rel, "clone", function(obj) { + obj = obj || {}, obj.x = this.x, obj.y = this.y; + return obj; +}); +defineValue(rel, "toString", function() { + return (this.x | 0) + "x" + (this.y | 0) + " (" + this.abs + ")"; +}); +defineValue(rel, "abs", abs); +defineValue(abs, "clone", function(obj) { + obj = obj || {}, obj.x = this.x, obj.y = this.y; + return obj; +}); +defineValue(abs, "toString", function() { + return (this.x | 0) + "x" + (this.y | 0); +}); +function defineValue(obj, name, value) { + Object.defineProperty(obj, name, { + value + }); +} +function IDENTITY(x) { + return x; +} +var _cache = {}; +var _modes = {}; +var _easings = {}; +class Easing { + static get(token, fallback = IDENTITY) { + if (typeof token === "function") { + return token; + } + if (typeof token !== "string") { + return fallback; + } + var fn = _cache[token]; + if (fn) { + return fn; + } + var match = /^(\w+)(-(in|out|in-out|out-in))?(\((.*)\))?$/i.exec(token); + if (!match || !match.length) { + return fallback; + } + var easing = _easings[match[1]]; + var mode = _modes[match[3]]; + var params = match[5]; + if (easing && easing.fn) { + fn = easing.fn; + } else if (easing && easing.fc) { + fn = easing.fc.apply(easing.fc, params && params.replace(/\s+/, "").split(",")); + } else { + fn = fallback; + } + if (mode) { + fn = mode.fn(fn); + } + _cache[token] = fn; + return fn; + } + static add(data) { + var names = (data.name || data.mode).split(/\s+/); + for (var i = 0; i < names.length; i++) { + var name = names[i]; + if (name) { + (data.name ? _easings : _modes)[name] = data; + } + } + } +} +Easing.add({ + mode: "in", + fn: function(f) { + return f; + } +}); +Easing.add({ + mode: "out", + fn: function(f) { + return function(t) { + return 1 - f(1 - t); + }; + } +}); +Easing.add({ + mode: "in-out", + fn: function(f) { + return function(t) { + return t < 0.5 ? f(2 * t) / 2 : 1 - f(2 * (1 - t)) / 2; + }; + } +}); +Easing.add({ + mode: "out-in", + fn: function(f) { + return function(t) { + return t < 0.5 ? 1 - f(2 * (1 - t)) / 2 : f(2 * t) / 2; + }; + } +}); +Easing.add({ + name: "linear", + fn: function(t) { + return t; + } +}); +Easing.add({ + name: "quad", + fn: function(t) { + return t * t; + } +}); +Easing.add({ + name: "cubic", + fn: function(t) { + return t * t * t; + } +}); +Easing.add({ + name: "quart", + fn: function(t) { + return t * t * t * t; + } +}); +Easing.add({ + name: "quint", + fn: function(t) { + return t * t * t * t * t; + } +}); +Easing.add({ + name: "sin sine", + fn: function(t) { + return 1 - Math.cos(t * Math.PI / 2); + } +}); +Easing.add({ + name: "exp expo", + fn: function(t) { + return t == 0 ? 0 : Math.pow(2, 10 * (t - 1)); + } +}); +Easing.add({ + name: "circle circ", + fn: function(t) { + return 1 - Math.sqrt(1 - t * t); + } +}); +Easing.add({ + name: "bounce", + fn: function(t) { + return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + 0.75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375 : 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375; + } +}); +Easing.add({ + name: "poly", + fc: function(e) { + return function(t) { + return Math.pow(t, e); + }; + } +}); +Easing.add({ + name: "elastic", + fc: function(a, p) { + p = p || 0.45; + a = a || 1; + var s = p / (2 * Math.PI) * Math.asin(1 / a); + return function(t) { + return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p); + }; + } +}); +Easing.add({ + name: "back", + fc: function(s) { + s = typeof s !== "undefined" ? s : 1.70158; + return function(t) { + return t * t * ((s + 1) * t - s); + }; + } +}); +Node.prototype.tween = function(a, b, c) { + let options; + if (typeof a === "object" && a !== null) { + options = a; + } else if (typeof a === "number" && typeof b === "number") { + options = { + duration: a, + delay: b, + append: c + }; + } else if (typeof a === "number") { + options = { + duration: a, + delay: 0, + append: b + }; + } else { + options = { + duration: 400, + delay: 0, + append: a + }; + } + if (!this._tweens) { + this._tweens = []; + var ticktime = 0; + this.tick(function(elapsed, now, last) { + if (!this._tweens.length) { + return false; + } + var ignore = ticktime != last; + ticktime = now; + if (ignore) { + return true; + } + var head = this._tweens[0]; + var ended = head.tick(this, elapsed, now, last); + if (ended) { + if (head === this._tweens[0]) { + this._tweens.shift(); + } + var next = head.finish(); + if (next) { + this._tweens.unshift(next); + } + } + return true; + }, true); + } + this.touch(); + if (!options.append) { + this._tweens.length = 0; + } + var tween = new Tween(this, options); + this._tweens.push(tween); + return tween; +}; +class Tween { + constructor(owner, options = {}) { + __publicField(this, "_ending", []); + this._end = {}; + this._duration = options.duration || 400; + this._delay = options.delay || 0; + this._owner = owner; + this._time = 0; + } + // @internal + tick(node, elapsed, now, last) { + this._time += elapsed; + if (this._time < this._delay) { + return; + } + var time = this._time - this._delay; + if (!this._start) { + this._start = {}; + for (var key in this._end) { + this._start[key] = this._owner.pin(key); + } + } + var p = Math.min(time / this._duration, 1); + var ended = p >= 1; + if (typeof this._easing == "function") { + p = this._easing(p); + } + var q = 1 - p; + for (var key in this._end) { + this._owner.pin(key, this._start[key] * q + this._end[key] * p); + } + return ended; + } + // @internal + finish() { + this._ending.forEach((callback) => { + try { + callback.call(this._owner); + } catch (e) { + console.error(e); + } + }); + return this._next; + } + tween(duration, delay) { + return this._next = new Tween(this._owner, duration, delay); + } + duration(duration) { + this._duration = duration; + return this; + } + delay(delay) { + this._delay = delay; + return this; + } + ease(easing) { + this._easing = Easing.get(easing); + return this; + } + done(fn) { + this._ending.push(fn); + return this; + } + hide() { + this._ending.push(function() { + this.hide(); + }); + this._hide = true; + return this; + } + remove() { + this._ending.push(function() { + this.remove(); + }); + this._remove = true; + return this; + } + pin(a, b) { + if (typeof a === "object") { + for (var attr in a) { + pinning(this._owner, this._end, attr, a[attr]); + } + } else if (typeof b !== "undefined") { + pinning(this._owner, this._end, a, b); + } + return this; + } + /** + * @deprecated Use .done(fn) instead. + */ + then(fn) { + this.done(fn); + return this; + } + /** + * @deprecated this doesn't do anything anymore, call tween on the node instead. + */ + clear(forward) { + return this; + } +} +function pinning(node, map, key, value) { + if (typeof node.pin(key) === "number") { + map[key] = value; + } else if (typeof node.pin(key + "X") === "number" && typeof node.pin(key + "Y") === "number") { + map[key + "X"] = value; + map[key + "Y"] = value; + } +} +Pin._add_shortcuts(Tween.prototype); +const _stages = []; +const pause = function() { + for (let i = _stages.length - 1; i >= 0; i--) { + _stages[i].pause(); + } +}; +const resume = function() { + for (let i = _stages.length - 1; i >= 0; i--) { + _stages[i].resume(); + } +}; +const mount = function(configs = {}) { + let root = new Root(); + root.mount(configs); + root.mouse = new Mouse().mount(root, root.dom); + return root; +}; +class Root extends Node { + constructor() { + super(); + __publicField(this, "canvas", null); + __publicField(this, "dom", null); + __publicField(this, "context", null); + __publicField(this, "pixelWidth", -1); + __publicField(this, "pixelHeight", -1); + __publicField(this, "pixelRatio", 1); + __publicField(this, "drawingWidth", 0); + __publicField(this, "drawingHeight", 0); + __publicField(this, "mounted", false); + __publicField(this, "paused", false); + __publicField(this, "sleep", false); + __publicField(this, "mount", (configs = {}) => { + if (typeof configs.canvas === "string") { + this.canvas = document.getElementById(configs.canvas); + } else if (configs.canvas instanceof HTMLCanvasElement) { + this.canvas = configs.canvas; + } else if (configs.canvas) + ; + if (!this.canvas) { + this.canvas = document.getElementById("cutjs") || document.getElementById("stage"); + } + if (!this.canvas) { + console.log("Creating Canvas..."); + this.canvas = document.createElement("canvas"); + Object.assign(this.canvas.style, { + position: "absolute", + display: "block", + top: "0", + left: "0", + bottom: "0", + right: "0", + width: "100%", + height: "100%" + }); + let body = document.body; + body.insertBefore(this.canvas, body.firstChild); + } + this.dom = this.canvas; + this.context = this.canvas.getContext("2d"); + this.devicePixelRatio = window.devicePixelRatio || 1; + this.backingStoreRatio = this.context.webkitBackingStorePixelRatio || this.context.mozBackingStorePixelRatio || this.context.msBackingStorePixelRatio || this.context.oBackingStorePixelRatio || this.context.backingStorePixelRatio || 1; + this.pixelRatio = this.devicePixelRatio / this.backingStoreRatio; + this.mounted = true; + _stages.push(this); + this.requestFrame(this.onFrame); + }); + __publicField(this, "frameRequested", false); + __publicField(this, "requestFrame", () => { + if (!this.frameRequested) { + this.frameRequested = true; + requestAnimationFrame(this.onFrame); + } + }); + __publicField(this, "lastTime", 0); + __publicField(this, "_mo_touch", null); + // monitor touch + __publicField(this, "onFrame", (now) => { + this.frameRequested = false; + if (!this.mounted) { + return; + } + this.requestFrame(); + const newPixelWidth = this.canvas.clientWidth; + const newPixelHeight = this.canvas.clientHeight; + if (this.pixelWidth !== newPixelWidth || this.pixelHeight !== newPixelHeight) { + this.pixelWidth = newPixelWidth; + this.pixelHeight = newPixelHeight; + this.drawingWidth = newPixelWidth * this.pixelRatio; + this.drawingHeight = newPixelHeight * this.pixelRatio; + if (this.canvas.width !== this.drawingWidth || this.canvas.height !== this.drawingHeight) { + this.canvas.width = this.drawingWidth; + this.canvas.height = this.drawingHeight; + console.log("Resize: [" + this.drawingWidth + ", " + this.drawingHeight + "] = " + this.pixelRatio + " x [" + this.pixelWidth + ", " + this.pixelHeight + "]"); + this.viewport({ + width: this.drawingWidth, + height: this.drawingHeight, + ratio: this.pixelRatio + }); + } + } + let last = this.lastTime || now; + let elapsed = now - last; + if (!this.mounted || this.paused || this.sleep) { + return; + } + this.lastTime = now; + let tickRequest = this._tick(elapsed, now, last); + if (this._mo_touch != this._ts_touch) { + this._mo_touch = this._ts_touch; + this.sleep = false; + if (this.drawingWidth > 0 && this.drawingHeight > 0) { + this.context.setTransform(1, 0, 0, 1, 0, 0); + this.context.clearRect(0, 0, this.drawingWidth, this.drawingHeight); + this.render(this.context); + } + } else if (tickRequest) { + this.sleep = false; + } else { + this.sleep = true; + } + stats$1.fps = elapsed ? 1e3 / elapsed : 0; + }); + this.label("Root"); + } + resume() { + if (this.sleep || this.paused) { + this.requestFrame(); + } + this.paused = false; + this.sleep = false; + this.publish("resume"); + return this; + } + pause() { + if (!this.paused) { + this.publish("pause"); + } + this.paused = true; + return this; + } + touch() { + if (this.sleep || this.paused) { + this.requestFrame(); + } + this.sleep = false; + return Node.prototype.touch(); + } + unmount() { + var _a; + this.mounted = false; + let index = _stages.indexOf(this); + if (index >= 0) { + _stages.splice(index, 1); + } + (_a = this.mouse) == null ? void 0 : _a.unmount(); + return this; + } + background(color) { + this.dom.style.backgroundColor = color; + return this; + } + /** + * Set/Get viewport. + * This is used along with viewbox to determine the scale and position of the viewbox within the viewport. + * Viewport is the size of the container, for example size of the canvas element. + * Viewbox is provided by the user, and is the ideal size of the content. + */ + viewport(width, height, ratio) { + if (typeof width === "undefined") { + return Object.assign({}, this._viewport); + } + if (typeof width === "object") { + const options = width; + width = options.width; + height = options.height; + ratio = options.ratio; + } + this._viewport = { + width, + height, + ratio: ratio || 1 + }; + this.viewbox(); + let data = Object.assign({}, this._viewport); + this.visit({ + start: function(node) { + if (!node._flag("viewport")) { + return true; + } + node.publish("viewport", [data]); + } + }); + return this; + } + /** + * Set viewbox. + * + * @param {mode} string - One of: 'in-pad' (like css object-fit: 'contain'), 'in', 'out-crop' (like css object-fit: 'cover'), 'out' + */ + // TODO: static/fixed viewbox + // TODO: use css object-fit values + viewbox(width, height, mode) { + if (typeof width === "number" && typeof height === "number") { + this._viewbox = { + width, + height, + mode + }; + } else if (typeof width === "object" && width !== null) { + this._viewbox = { + ...width + }; + } + this.rescale(); + return this; + } + camera(matrix) { + this._camera = matrix; + this.rescale(); + return this; + } + rescale() { + let viewbox = this._viewbox; + let viewport = this._viewport; + let camera = this._camera; + if (viewport && viewbox) { + const viewportWidth = viewport.width; + const viewportHeight = viewport.height; + const viewboxMode = /^(in|out|in-pad|out-crop)$/.test(viewbox.mode) ? viewbox.mode : "in-pad"; + const viewboxWidth = viewbox.width; + const viewboxHeight = viewbox.height; + this.pin({ + width: viewboxWidth, + height: viewboxHeight + }); + this.scaleTo(viewportWidth, viewportHeight, viewboxMode); + const viewboxX = viewbox.x || 0; + const viewboxY = viewbox.y || 0; + const cameraZoom = (camera == null ? void 0 : camera.a) || 1; + const cameraX = (camera == null ? void 0 : camera.e) || 0; + const cameraY = (camera == null ? void 0 : camera.f) || 0; + const scaleX = this.pin("scaleX"); + const scaleY = this.pin("scaleY"); + this.pin("scaleX", scaleX * cameraZoom); + this.pin("scaleY", scaleY * cameraZoom); + this.pin("offsetX", cameraX - viewboxX * scaleX * cameraZoom); + this.pin("offsetY", cameraY - viewboxY * scaleY * cameraZoom); + } else if (viewport) { + this.pin({ + width: viewport.width, + height: viewport.height + }); + } + return this; + } +} +const sprite = function(frame) { + var sprite2 = new Sprite(); + frame && sprite2.texture(frame); + return sprite2; +}; +Sprite._super = Node; +Sprite.prototype = Object.create(Sprite._super.prototype); +function Sprite() { + Sprite._super.call(this); + this.label("Sprite"); + this._textures = []; + this._image = null; +} +Sprite.prototype.texture = function(frame) { + this._image = texture(frame).one(); + this.pin("width", this._image ? this._image.width : 0); + this.pin("height", this._image ? this._image.height : 0); + this._textures[0] = this._image.pipe(); + this._textures.length = 1; + return this; +}; +Sprite.prototype.tile = function(inner) { + this._repeat(false, inner); + return this; +}; +Sprite.prototype.stretch = function(inner) { + this._repeat(true, inner); + return this; +}; +Sprite.prototype._repeat = function(stretch, inner) { + var self = this; + this.untick(this._repeatTicker); + this.tick(this._repeatTicker = function() { + if (this._mo_stretch == this._pin._ts_transform) { + return; + } + this._mo_stretch = this._pin._ts_transform; + var width = this.pin("width"); + var height = this.pin("height"); + this._textures.length = repeat(this._image, width, height, stretch, inner, insert); + }); + function insert(i, sx, sy, sw, sh, dx, dy, dw, dh) { + var repeat2 = self._textures.length > i ? self._textures[i] : self._textures[i] = self._image.pipe(); + repeat2.src(sx, sy, sw, sh); + repeat2.dest(dx, dy, dw, dh); + } +}; +function repeat(img, owidth, oheight, stretch, inner, insert) { + var width = img.width; + var height = img.height; + var left = img.left; + var right = img.right; + var top = img.top; + var bottom = img.bottom; + left = typeof left === "number" && left === left ? left : 0; + right = typeof right === "number" && right === right ? right : 0; + top = typeof top === "number" && top === top ? top : 0; + bottom = typeof bottom === "number" && bottom === bottom ? bottom : 0; + width = width - left - right; + height = height - top - bottom; + if (!inner) { + owidth = Math.max(owidth - left - right, 0); + oheight = Math.max(oheight - top - bottom, 0); + } + var i = 0; + if (top > 0 && left > 0) + insert(i++, 0, 0, left, top, 0, 0, left, top); + if (bottom > 0 && left > 0) + insert(i++, 0, height + top, left, bottom, 0, oheight + top, left, bottom); + if (top > 0 && right > 0) + insert(i++, width + left, 0, right, top, owidth + left, 0, right, top); + if (bottom > 0 && right > 0) + insert( + i++, + width + left, + height + top, + right, + bottom, + owidth + left, + oheight + top, + right, + bottom + ); + if (stretch) { + if (top > 0) + insert(i++, left, 0, width, top, left, 0, owidth, top); + if (bottom > 0) + insert( + i++, + left, + height + top, + width, + bottom, + left, + oheight + top, + owidth, + bottom + ); + if (left > 0) + insert(i++, 0, top, left, height, 0, top, left, oheight); + if (right > 0) + insert( + i++, + width + left, + top, + right, + height, + owidth + left, + top, + right, + oheight + ); + insert(i++, left, top, width, height, left, top, owidth, oheight); + } else { + var l = left, r = owidth, w; + while (r > 0) { + w = Math.min(width, r), r -= width; + var t = top, b = oheight, h; + while (b > 0) { + h = Math.min(height, b), b -= height; + insert(i++, left, top, w, h, l, t, w, h); + if (r <= 0) { + if (left) + insert(i++, 0, top, left, h, 0, t, left, h); + if (right) + insert(i++, width + left, top, right, h, l + w, t, right, h); + } + t += h; + } + if (top) + insert(i++, left, 0, w, top, l, 0, w, top); + if (bottom) + insert(i++, left, height + top, w, bottom, l, t, w, bottom); + l += w; + } + } + return i; +} +Sprite.prototype.image = Sprite.prototype.texture; +const image = sprite; +const Image$1 = Sprite; +const anim = function(frames, fps) { + var anim2 = new Anim(); + anim2.frames(frames).gotoFrame(0); + fps && anim2.fps(fps); + return anim2; +}; +Anim._super = Node; +Anim.prototype = Object.create(Anim._super.prototype); +const FPS = 15; +function Anim() { + Anim._super.call(this); + this.label("Anim"); + this._textures = []; + this._fps = FPS; + this._ft = 1e3 / this._fps; + this._time = -1; + this._repeat = 0; + this._index = 0; + this._frames = []; + var lastTime = 0; + this.tick(function(t, now, last) { + if (this._time < 0 || this._frames.length <= 1) { + return; + } + var ignore = lastTime != last; + lastTime = now; + if (ignore) { + return true; + } + this._time += t; + if (this._time < this._ft) { + return true; + } + var n = this._time / this._ft | 0; + this._time -= n * this._ft; + this.moveFrame(n); + if (this._repeat > 0 && (this._repeat -= n) <= 0) { + this.stop(); + this._callback && this._callback(); + return false; + } + return true; + }, false); +} +Anim.prototype.fps = function(fps) { + if (typeof fps === "undefined") { + return this._fps; + } + this._fps = fps > 0 ? fps : FPS; + this._ft = 1e3 / this._fps; + return this; +}; +Anim.prototype.setFrames = function(a, b, c) { + return this.frames(a, b, c); +}; +Anim.prototype.frames = function(frames) { + this._index = 0; + this._frames = texture(frames).array(); + this.touch(); + return this; +}; +Anim.prototype.length = function() { + return this._frames ? this._frames.length : 0; +}; +Anim.prototype.gotoFrame = function(frame, resize) { + this._index = math$1.wrap(frame, this._frames.length) | 0; + resize = resize || !this._textures[0]; + this._textures[0] = this._frames[this._index]; + if (resize) { + this.pin("width", this._textures[0].width); + this.pin("height", this._textures[0].height); + } + this.touch(); + return this; +}; +Anim.prototype.moveFrame = function(move) { + return this.gotoFrame(this._index + move); +}; +Anim.prototype.repeat = function(repeat2, callback) { + this._repeat = repeat2 * this._frames.length - 1; + this._callback = callback; + this.play(); + return this; +}; +Anim.prototype.play = function(frame) { + if (typeof frame !== "undefined") { + this.gotoFrame(frame); + this._time = 0; + } else if (this._time < 0) { + this._time = 0; + } + this.touch(); + return this; +}; +Anim.prototype.stop = function(frame) { + this._time = -1; + if (typeof frame !== "undefined") { + this.gotoFrame(frame); + } + return this; +}; +const string$1 = function(frames) { + return new Str().frames(frames); +}; +Str._super = Node; +Str.prototype = Object.create(Str._super.prototype); +function Str() { + Str._super.call(this); + this.label("String"); + this._textures = []; +} +Str.prototype.setFont = function(a, b, c) { + return this.frames(a, b, c); +}; +Str.prototype.frames = function(frames) { + this._textures = []; + if (typeof frames == "string") { + frames = texture(frames); + this._item = function(value) { + return frames.one(value); + }; + } else if (typeof frames === "object") { + this._item = function(value) { + return frames[value]; + }; + } else if (typeof frames === "function") { + this._item = frames; + } + return this; +}; +Str.prototype.setValue = function(a, b, c) { + return this.value(a, b, c); +}; +Str.prototype.value = function(value) { + if (typeof value === "undefined") { + return this._value; + } + if (this._value === value) { + return this; + } + this._value = value; + if (value === null) { + value = ""; + } else if (typeof value !== "string" && !Array.isArray(value)) { + value = value.toString(); + } + this._spacing = this._spacing || 0; + var width = 0, height = 0; + for (var i = 0; i < value.length; i++) { + var texture2 = this._textures[i] = this._item(value[i]); + width += i > 0 ? this._spacing : 0; + texture2.dest(width, 0); + width = width + texture2.width; + height = Math.max(height, texture2.height); + } + this.pin("width", width); + this.pin("height", height); + this._textures.length = value.length; + return this; +}; +const row = function(align) { + return create().row(align).label("Row"); +}; +Node.prototype.row = function(align) { + this.align("row", align); + return this; +}; +const column = function(align) { + return create().column(align).label("Row"); +}; +Node.prototype.column = function(align) { + this.align("column", align); + return this; +}; +Node.prototype.align = function(type, align) { + this._padding = this._padding || 0; + this._spacing = this._spacing || 0; + this.untick(this._layoutTiker); + this.tick(this._layoutTiker = function() { + if (this._mo_seq == this._ts_touch) { + return; + } + this._mo_seq = this._ts_touch; + var alignChildren = this._mo_seqAlign != this._ts_children; + this._mo_seqAlign = this._ts_children; + var width = 0, height = 0; + var child, next = this.first(true); + var first = true; + while (child = next) { + next = child.next(true); + child.matrix(true); + var w = child.pin("boxWidth"); + var h = child.pin("boxHeight"); + if (type == "column") { + !first && (height += this._spacing); + child.pin("offsetY") != height && child.pin("offsetY", height); + width = Math.max(width, w); + height = height + h; + alignChildren && child.pin("alignX", align); + } else if (type == "row") { + !first && (width += this._spacing); + child.pin("offsetX") != width && child.pin("offsetX", width); + width = width + w; + height = Math.max(height, h); + alignChildren && child.pin("alignY", align); + } + first = false; + } + width += 2 * this._padding; + height += 2 * this._padding; + this.pin("width") != width && this.pin("width", width); + this.pin("height") != height && this.pin("height", height); + }); + return this; +}; +const box = function() { + return create().box().label("Box"); +}; +Node.prototype.box = function() { + this._padding = this._padding || 0; + this.untick(this._layoutTiker); + this.tick(this._layoutTiker = function() { + if (this._mo_box == this._ts_touch) { + return; + } + this._mo_box = this._ts_touch; + var width = 0, height = 0; + var child, next = this.first(true); + while (child = next) { + next = child.next(true); + child.matrix(true); + var w = child.pin("boxWidth"); + var h = child.pin("boxHeight"); + width = Math.max(width, w); + height = Math.max(height, h); + } + width += 2 * this._padding; + height += 2 * this._padding; + this.pin("width") != width && this.pin("width", width); + this.pin("height") != height && this.pin("height", height); + }); + return this; +}; +const layer = function() { + return create().layer().label("Layer"); +}; +Node.prototype.layer = function() { + this.untick(this._layoutTiker); + this.tick(this._layoutTiker = function() { + var parent = this.parent(); + if (parent) { + var width = parent.pin("width"); + if (this.pin("width") != width) { + this.pin("width", width); + } + var height = parent.pin("height"); + if (this.pin("height") != height) { + this.pin("height", height); + } + } + }, true); + return this; +}; +Node.prototype.padding = function(pad) { + this._padding = pad; + return this; +}; +Node.prototype.spacing = function(space) { + this._spacing = space; + return this; +}; +const Stage$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + Anim, + Atlas, + Image: Image$1, + Math: math$1, + Matrix, + Mouse, + Node, + Pin, + Root, + Sprite, + Str, + Texture, + Tween, + anim, + atlas, + box, + canvas, + column, + create, + image, + layer, + math: math$1, + memoizeDraw, + mount, + pause, + resume, + row, + sprite, + string: string$1, + texture +}, Symbol.toStringTag, { value: "Module" })); + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; + +var options = function (input, defaults) { + if (input === null || typeof input === 'undefined') { + // tslint:disable-next-line:no-object-literal-type-assertion + input = {}; + } + var output = __assign({}, input); + // tslint:disable-next-line:no-for-in + for (var key in defaults) { + if (defaults.hasOwnProperty(key) && typeof input[key] === 'undefined') { + output[key] = defaults[key]; + } + } + if (typeof Object.getOwnPropertySymbols === 'function') { + var symbols = Object.getOwnPropertySymbols(defaults); + for (var i = 0; i < symbols.length; i++) { + var symbol = symbols[i]; + if (defaults.propertyIsEnumerable(symbol) && typeof input[symbol] === 'undefined') { + output[symbol] = defaults[symbol]; + } + } + } + return output; +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var math = Object.assign(Object.create(Math), { + EPSILON: 1e-9, + /** + * This function is used to ensure that a floating point number is not a NaN or + * infinity. + */ + isFinite: function (x) { + return (typeof x === 'number') && isFinite(x) && !isNaN(x); + }, + assert: function (x) { + }, + /** + * Next Largest Power of 2 Given a binary integer value x, the next largest + * power of 2 can be computed by a SWAR algorithm that recursively "folds" the + * upper bits into the lower bits. This process yields a bit vector with the + * same most significant 1 as x, but all 1's below it. Adding 1 to that value + * yields the next largest power of 2. For a 32-bit value: + */ + nextPowerOfTwo: function (x) { + // TODO + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + return x + 1; + }, + isPowerOfTwo: function (x) { + return x > 0 && (x & (x - 1)) === 0; + }, + mod: function (num, min, max) { + if (typeof min === 'undefined') { + max = 1; + min = 0; + } + else if (typeof max === 'undefined') { + max = min; + min = 0; + } + if (max > min) { + num = (num - min) % (max - min); + return num + (num < 0 ? max : min); + } + else { + num = (num - max) % (min - max); + return num + (num <= 0 ? min : max); + } + }, + /** + * Returns a min if num is less than min, and max if more than max, otherwise returns num. + */ + clamp: function (num, min, max) { + if (num < min) { + return min; + } + else if (num > max) { + return max; + } + else { + return num; + } + }, + /** + * Returns a random number between min and max when two arguments are provided. + * If one arg is provided between 0 to max. + * If one arg is passed between 0 to 1. + */ + random: function (min, max) { + if (typeof min === 'undefined') { + max = 1; + min = 0; + } + else if (typeof max === 'undefined') { + max = min; + min = 0; + } + return min === max ? min : Math.random() * (max - min) + min; + } +}); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Vec2 = /** @class */ (function () { + // tslint:disable-next-line:typedef + function Vec2(x, y) { + if (!(this instanceof Vec2)) { + return new Vec2(x, y); + } + if (typeof x === 'undefined') { + this.x = 0; + this.y = 0; + } + else if (typeof x === 'object') { + this.x = x.x; + this.y = x.y; + } + else { + this.x = x; + this.y = y; + } + } + /** @internal */ + Vec2.prototype._serialize = function () { + return { + x: this.x, + y: this.y + }; + }; + /** @internal */ + Vec2._deserialize = function (data) { + var obj = Object.create(Vec2.prototype); + obj.x = data.x; + obj.y = data.y; + return obj; + }; + Vec2.zero = function () { + var obj = Object.create(Vec2.prototype); + obj.x = 0; + obj.y = 0; + return obj; + }; + /** @internal */ + Vec2.neo = function (x, y) { + var obj = Object.create(Vec2.prototype); + obj.x = x; + obj.y = y; + return obj; + }; + Vec2.clone = function (v) { + return Vec2.neo(v.x, v.y); + }; + /** @internal */ + Vec2.prototype.toString = function () { + return JSON.stringify(this); + }; + /** + * Does this vector contain finite coordinates? + */ + Vec2.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return math.isFinite(obj.x) && math.isFinite(obj.y); + }; + Vec2.assert = function (o) { + }; + Vec2.prototype.clone = function () { + return Vec2.clone(this); + }; + /** + * Set this vector to all zeros. + * + * @returns this + */ + Vec2.prototype.setZero = function () { + this.x = 0.0; + this.y = 0.0; + return this; + }; + /** + * Set this vector to some specified coordinates. + * + * @returns this + */ + // tslint:disable-next-line:typedef + Vec2.prototype.set = function (x, y) { + if (typeof x === 'object') { + this.x = x.x; + this.y = x.y; + } + else { + this.x = x; + this.y = y; + } + return this; + }; + /** + * Set this vector to some specified coordinates. + * + * @returns this + */ + Vec2.prototype.setNum = function (x, y) { + this.x = x; + this.y = y; + return this; + }; + /** + * Set this vector to some specified coordinates. + * + * @returns this + */ + Vec2.prototype.setVec2 = function (value) { + this.x = value.x; + this.y = value.y; + return this; + }; + /** + * @internal + * @deprecated Use setCombine or setMul + */ + Vec2.prototype.wSet = function (a, v, b, w) { + if (typeof b !== 'undefined' || typeof w !== 'undefined') { + return this.setCombine(a, v, b, w); + } + else { + return this.setMul(a, v); + } + }; + /** + * Set linear combination of v and w: `a * v + b * w` + */ + Vec2.prototype.setCombine = function (a, v, b, w) { + var x = a * v.x + b * w.x; + var y = a * v.y + b * w.y; + // `this` may be `w` + this.x = x; + this.y = y; + return this; + }; + Vec2.prototype.setMul = function (a, v) { + var x = a * v.x; + var y = a * v.y; + this.x = x; + this.y = y; + return this; + }; + /** + * Add a vector to this vector. + * + * @returns this + */ + Vec2.prototype.add = function (w) { + this.x += w.x; + this.y += w.y; + return this; + }; + /** + * @internal + * @deprecated Use addCombine or addMul + */ + Vec2.prototype.wAdd = function (a, v, b, w) { + if (typeof b !== 'undefined' || typeof w !== 'undefined') { + return this.addCombine(a, v, b, w); + } + else { + return this.addMul(a, v); + } + }; + /** + * Add linear combination of v and w: `a * v + b * w` + */ + Vec2.prototype.addCombine = function (a, v, b, w) { + var x = a * v.x + b * w.x; + var y = a * v.y + b * w.y; + // `this` may be `w` + this.x += x; + this.y += y; + return this; + }; + Vec2.prototype.addMul = function (a, v) { + var x = a * v.x; + var y = a * v.y; + this.x += x; + this.y += y; + return this; + }; + /** + * @deprecated Use subCombine or subMul + */ + Vec2.prototype.wSub = function (a, v, b, w) { + if (typeof b !== 'undefined' || typeof w !== 'undefined') { + return this.subCombine(a, v, b, w); + } + else { + return this.subMul(a, v); + } + }; + /** + * Subtract linear combination of v and w: `a * v + b * w` + */ + Vec2.prototype.subCombine = function (a, v, b, w) { + var x = a * v.x + b * w.x; + var y = a * v.y + b * w.y; + // `this` may be `w` + this.x -= x; + this.y -= y; + return this; + }; + Vec2.prototype.subMul = function (a, v) { + var x = a * v.x; + var y = a * v.y; + this.x -= x; + this.y -= y; + return this; + }; + /** + * Subtract a vector from this vector + * + * @returns this + */ + Vec2.prototype.sub = function (w) { + this.x -= w.x; + this.y -= w.y; + return this; + }; + /** + * Multiply this vector by a scalar. + * + * @returns this + */ + Vec2.prototype.mul = function (m) { + this.x *= m; + this.y *= m; + return this; + }; + /** + * Get the length of this vector (the norm). + * + * For performance, use this instead of lengthSquared (if possible). + */ + Vec2.prototype.length = function () { + return Vec2.lengthOf(this); + }; + /** + * Get the length squared. + */ + Vec2.prototype.lengthSquared = function () { + return Vec2.lengthSquared(this); + }; + /** + * Convert this vector into a unit vector. + * + * @returns old length + */ + Vec2.prototype.normalize = function () { + var length = this.length(); + if (length < math.EPSILON) { + return 0.0; + } + var invLength = 1.0 / length; + this.x *= invLength; + this.y *= invLength; + return length; + }; + /** + * Get the length of this vector (the norm). + * + * For performance, use this instead of lengthSquared (if possible). + */ + Vec2.lengthOf = function (v) { + return math.sqrt(v.x * v.x + v.y * v.y); + }; + /** + * Get the length squared. + */ + Vec2.lengthSquared = function (v) { + return v.x * v.x + v.y * v.y; + }; + Vec2.distance = function (v, w) { + var dx = v.x - w.x; + var dy = v.y - w.y; + return math.sqrt(dx * dx + dy * dy); + }; + Vec2.distanceSquared = function (v, w) { + var dx = v.x - w.x; + var dy = v.y - w.y; + return dx * dx + dy * dy; + }; + Vec2.areEqual = function (v, w) { + return v === w || typeof w === 'object' && w !== null && v.x === w.x && v.y === w.y; + }; + /** + * Get the skew vector such that dot(skew_vec, other) == cross(vec, other) + */ + Vec2.skew = function (v) { + return Vec2.neo(-v.y, v.x); + }; + /** + * Perform the dot product on two vectors. + */ + Vec2.dot = function (v, w) { + return v.x * w.x + v.y * w.y; + }; + /** + * Perform the cross product on two vectors. In 2D this produces a scalar. + * + * Perform the cross product on a vector and a scalar. In 2D this produces a + * vector. + */ + // tslint:disable-next-line:typedef + Vec2.cross = function (v, w) { + if (typeof w === 'number') { + return Vec2.neo(w * v.y, -w * v.x); + } + else if (typeof v === 'number') { + return Vec2.neo(-v * w.y, v * w.x); + } + else { + return v.x * w.y - v.y * w.x; + } + }; + /** + * Perform the cross product on two vectors. In 2D this produces a scalar. + */ + Vec2.crossVec2Vec2 = function (v, w) { + return v.x * w.y - v.y * w.x; + }; + /** + * Perform the cross product on a vector and a scalar. In 2D this produces a + * vector. + */ + Vec2.crossVec2Num = function (v, w) { + return Vec2.neo(w * v.y, -w * v.x); + }; + /** + * Perform the cross product on a vector and a scalar. In 2D this produces a + * vector. + */ + Vec2.crossNumVec2 = function (v, w) { + return Vec2.neo(-v * w.y, v * w.x); + }; + /** + * Returns `a + (v x w)` + */ + // tslint:disable-next-line:typedef + Vec2.addCross = function (a, v, w) { + if (typeof w === 'number') { + return Vec2.neo(w * v.y + a.x, -w * v.x + a.y); + } + else if (typeof v === 'number') { + return Vec2.neo(-v * w.y + a.x, v * w.x + a.y); + } + }; + /** + * Returns `a + (v x w)` + */ + Vec2.addCrossVec2Num = function (a, v, w) { + return Vec2.neo(w * v.y + a.x, -w * v.x + a.y); + }; + /** + * Returns `a + (v x w)` + */ + Vec2.addCrossNumVec2 = function (a, v, w) { + return Vec2.neo(-v * w.y + a.x, v * w.x + a.y); + }; + Vec2.add = function (v, w) { + return Vec2.neo(v.x + w.x, v.y + w.y); + }; + /** @internal @deprecated */ + Vec2.wAdd = function (a, v, b, w) { + if (typeof b !== 'undefined' || typeof w !== 'undefined') { + return Vec2.combine(a, v, b, w); + } + else { + return Vec2.mulNumVec2(a, v); + } + }; + Vec2.combine = function (a, v, b, w) { + return Vec2.zero().setCombine(a, v, b, w); + }; + Vec2.sub = function (v, w) { + return Vec2.neo(v.x - w.x, v.y - w.y); + }; + // tslint:disable-next-line:typedef + Vec2.mul = function (a, b) { + if (typeof a === 'object') { + return Vec2.neo(a.x * b, a.y * b); + } + else if (typeof b === 'object') { + return Vec2.neo(a * b.x, a * b.y); + } + }; + Vec2.mulVec2Num = function (a, b) { + return Vec2.neo(a.x * b, a.y * b); + }; + Vec2.mulNumVec2 = function (a, b) { + return Vec2.neo(a * b.x, a * b.y); + }; + Vec2.prototype.neg = function () { + this.x = -this.x; + this.y = -this.y; + return this; + }; + Vec2.neg = function (v) { + return Vec2.neo(-v.x, -v.y); + }; + Vec2.abs = function (v) { + return Vec2.neo(math.abs(v.x), math.abs(v.y)); + }; + Vec2.mid = function (v, w) { + return Vec2.neo((v.x + w.x) * 0.5, (v.y + w.y) * 0.5); + }; + Vec2.upper = function (v, w) { + return Vec2.neo(math.max(v.x, w.x), math.max(v.y, w.y)); + }; + Vec2.lower = function (v, w) { + return Vec2.neo(math.min(v.x, w.x), math.min(v.y, w.y)); + }; + Vec2.prototype.clamp = function (max) { + var lengthSqr = this.x * this.x + this.y * this.y; + if (lengthSqr > max * max) { + var scale = max / math.sqrt(lengthSqr); + this.x *= scale; + this.y *= scale; + } + return this; + }; + Vec2.clamp = function (v, max) { + var r = Vec2.neo(v.x, v.y); + r.clamp(max); + return r; + }; + /** @internal @deprecated */ + // tslint:disable-next-line:typedef + Vec2.scaleFn = function (x, y) { + return function (v) { + return Vec2.neo(v.x * x, v.y * y); + }; + }; + /** @internal @deprecated */ + // tslint:disable-next-line:typedef + Vec2.translateFn = function (x, y) { + return function (v) { + return Vec2.neo(v.x + x, v.y + y); + }; + }; + return Vec2; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var AABB = /** @class */ (function () { + function AABB(lower, upper) { + if (!(this instanceof AABB)) { + return new AABB(lower, upper); + } + this.lowerBound = Vec2.zero(); + this.upperBound = Vec2.zero(); + if (typeof lower === 'object') { + this.lowerBound.setVec2(lower); + } + if (typeof upper === 'object') { + this.upperBound.setVec2(upper); + } + else if (typeof lower === 'object') { + this.upperBound.setVec2(lower); + } + } + /** + * Verify that the bounds are sorted. + */ + AABB.prototype.isValid = function () { + return AABB.isValid(this); + }; + AABB.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return Vec2.isValid(obj.lowerBound) && Vec2.isValid(obj.upperBound) && Vec2.sub(obj.upperBound, obj.lowerBound).lengthSquared() >= 0; + }; + AABB.assert = function (o) { + }; + /** + * Get the center of the AABB. + */ + AABB.prototype.getCenter = function () { + return Vec2.neo((this.lowerBound.x + this.upperBound.x) * 0.5, (this.lowerBound.y + this.upperBound.y) * 0.5); + }; + /** + * Get the extents of the AABB (half-widths). + */ + AABB.prototype.getExtents = function () { + return Vec2.neo((this.upperBound.x - this.lowerBound.x) * 0.5, (this.upperBound.y - this.lowerBound.y) * 0.5); + }; + /** + * Get the perimeter length. + */ + AABB.prototype.getPerimeter = function () { + return 2.0 * (this.upperBound.x - this.lowerBound.x + this.upperBound.y - this.lowerBound.y); + }; + /** + * Combine one or two AABB into this one. + */ + AABB.prototype.combine = function (a, b) { + b = b || this; + var lowerA = a.lowerBound; + var upperA = a.upperBound; + var lowerB = b.lowerBound; + var upperB = b.upperBound; + var lowerX = math.min(lowerA.x, lowerB.x); + var lowerY = math.min(lowerA.y, lowerB.y); + var upperX = math.max(upperB.x, upperA.x); + var upperY = math.max(upperB.y, upperA.y); + this.lowerBound.setNum(lowerX, lowerY); + this.upperBound.setNum(upperX, upperY); + }; + AABB.prototype.combinePoints = function (a, b) { + this.lowerBound.setNum(math.min(a.x, b.x), math.min(a.y, b.y)); + this.upperBound.setNum(math.max(a.x, b.x), math.max(a.y, b.y)); + }; + AABB.prototype.set = function (aabb) { + this.lowerBound.setNum(aabb.lowerBound.x, aabb.lowerBound.y); + this.upperBound.setNum(aabb.upperBound.x, aabb.upperBound.y); + }; + AABB.prototype.contains = function (aabb) { + var result = true; + result = result && this.lowerBound.x <= aabb.lowerBound.x; + result = result && this.lowerBound.y <= aabb.lowerBound.y; + result = result && aabb.upperBound.x <= this.upperBound.x; + result = result && aabb.upperBound.y <= this.upperBound.y; + return result; + }; + AABB.prototype.extend = function (value) { + AABB.extend(this, value); + return this; + }; + AABB.extend = function (aabb, value) { + aabb.lowerBound.x -= value; + aabb.lowerBound.y -= value; + aabb.upperBound.x += value; + aabb.upperBound.y += value; + }; + AABB.testOverlap = function (a, b) { + var d1x = b.lowerBound.x - a.upperBound.x; + var d2x = a.lowerBound.x - b.upperBound.x; + var d1y = b.lowerBound.y - a.upperBound.y; + var d2y = a.lowerBound.y - b.upperBound.y; + if (d1x > 0 || d1y > 0 || d2x > 0 || d2y > 0) { + return false; + } + return true; + }; + AABB.areEqual = function (a, b) { + return Vec2.areEqual(a.lowerBound, b.lowerBound) && Vec2.areEqual(a.upperBound, b.upperBound); + }; + AABB.diff = function (a, b) { + var wD = math.max(0, math.min(a.upperBound.x, b.upperBound.x) - math.max(b.lowerBound.x, a.lowerBound.x)); + var hD = math.max(0, math.min(a.upperBound.y, b.upperBound.y) - math.max(b.lowerBound.y, a.lowerBound.y)); + var wA = a.upperBound.x - a.lowerBound.x; + var hA = a.upperBound.y - a.lowerBound.y; + var wB = b.upperBound.x - b.lowerBound.x; + var hB = b.upperBound.y - b.lowerBound.y; + return wA * hA + wB * hB - wD * hD; + }; + AABB.prototype.rayCast = function (output, input) { + // From Real-time Collision Detection, p179. + var tmin = -Infinity; + var tmax = Infinity; + var p = input.p1; + var d = Vec2.sub(input.p2, input.p1); + var absD = Vec2.abs(d); + var normal = Vec2.zero(); + for (var f = 'x'; f !== null; f = (f === 'x' ? 'y' : null)) { + if (absD.x < math.EPSILON) { + // Parallel. + if (p[f] < this.lowerBound[f] || this.upperBound[f] < p[f]) { + return false; + } + } + else { + var inv_d = 1.0 / d[f]; + var t1 = (this.lowerBound[f] - p[f]) * inv_d; + var t2 = (this.upperBound[f] - p[f]) * inv_d; + // Sign of the normal vector. + var s = -1.0; + if (t1 > t2) { + var temp = t1; + t1 = t2; + t2 = temp; + s = 1.0; + } + // Push the min up + if (t1 > tmin) { + normal.setZero(); + normal[f] = s; + tmin = t1; + } + // Pull the max down + tmax = math.min(tmax, t2); + if (tmin > tmax) { + return false; + } + } + } + // Does the ray start inside the box? + // Does the ray intersect beyond the max fraction? + if (tmin < 0.0 || input.maxFraction < tmin) { + return false; + } + // Intersection. + output.fraction = tmin; + output.normal = normal; + return true; + }; + /** @internal */ + AABB.prototype.toString = function () { + return JSON.stringify(this); + }; + return AABB; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +// TODO merge with World options? +/** + * Tuning constants based on meters-kilograms-seconds (MKS) units. + */ +// tslint:disable-next-line:no-unnecessary-class +var Settings = /** @class */ (function () { + function Settings() { + } + Object.defineProperty(Settings, "linearSlopSquared", { + get: function () { return Settings.linearSlop * Settings.linearSlop; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "polygonRadius", { + /** + * The radius of the polygon/edge shape skin. This should not be modified. + * Making this smaller means polygons will have an insufficient buffer for + * continuous collision. Making it larger may create artifacts for vertex + * collision. + */ + get: function () { return 2.0 * Settings.linearSlop; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "maxTranslationSquared", { + get: function () { return Settings.maxTranslation * Settings.maxTranslation; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "maxRotationSquared", { + get: function () { return Settings.maxRotation * Settings.maxRotation; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "linearSleepToleranceSqr", { + get: function () { return Math.pow(Settings.linearSleepTolerance, 2); }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "angularSleepToleranceSqr", { + get: function () { return Math.pow(Settings.angularSleepTolerance, 2); }, + enumerable: false, + configurable: true + }); + // Collision + /** + * The maximum number of contact points between two convex shapes. Do not change + * this value. + */ + Settings.maxManifoldPoints = 2; + /** + * The maximum number of vertices on a convex polygon. You cannot increase this + * too much because BlockAllocator has a maximum object size. + */ + Settings.maxPolygonVertices = 12; + /** + * This is used to fatten AABBs in the dynamic tree. This allows proxies to move + * by a small amount without triggering a tree adjustment. This is in meters. + */ + Settings.aabbExtension = 0.1; + /** + * This is used to fatten AABBs in the dynamic tree. This is used to predict the + * future position based on the current displacement. This is a dimensionless + * multiplier. + */ + Settings.aabbMultiplier = 2.0; + /** + * A small length used as a collision and constraint tolerance. Usually it is + * chosen to be numerically significant, but visually insignificant. + */ + Settings.linearSlop = 0.005; + /** + * A small angle used as a collision and constraint tolerance. Usually it is + * chosen to be numerically significant, but visually insignificant. + */ + Settings.angularSlop = (2.0 / 180.0 * Math.PI); + /** + * Maximum number of sub-steps per contact in continuous physics simulation. + */ + Settings.maxSubSteps = 8; + // Dynamics + /** + * Maximum number of contacts to be handled to solve a TOI impact. + */ + Settings.maxTOIContacts = 32; + /** + * Maximum iterations to solve a TOI. + */ + Settings.maxTOIIterations = 20; + /** + * Maximum iterations to find Distance. + */ + Settings.maxDistnceIterations = 20; + /** + * A velocity threshold for elastic collisions. Any collision with a relative + * linear velocity below this threshold will be treated as inelastic. + */ + Settings.velocityThreshold = 1.0; + /** + * The maximum linear position correction used when solving constraints. This + * helps to prevent overshoot. + */ + Settings.maxLinearCorrection = 0.2; + /** + * The maximum angular position correction used when solving constraints. This + * helps to prevent overshoot. + */ + Settings.maxAngularCorrection = (8.0 / 180.0 * Math.PI); + /** + * The maximum linear velocity of a body. This limit is very large and is used + * to prevent numerical problems. You shouldn't need to adjust Settings. + */ + Settings.maxTranslation = 2.0; + /** + * The maximum angular velocity of a body. This limit is very large and is used + * to prevent numerical problems. You shouldn't need to adjust Settings. + */ + Settings.maxRotation = (0.5 * Math.PI); + /** + * This scale factor controls how fast overlap is resolved. Ideally this would + * be 1 so that overlap is removed in one time step. However using values close + * to 1 often lead to overshoot. + */ + Settings.baumgarte = 0.2; + Settings.toiBaugarte = 0.75; + // Sleep + /** + * The time that a body must be still before it will go to sleep. + */ + Settings.timeToSleep = 0.5; + /** + * A body cannot sleep if its linear velocity is above this tolerance. + */ + Settings.linearSleepTolerance = 0.01; + /** + * A body cannot sleep if its angular velocity is above this tolerance. + */ + Settings.angularSleepTolerance = (2.0 / 180.0 * Math.PI); + return Settings; +}()); + +/* + * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + */ +var Pool = /** @class */ (function () { + function Pool(opts) { + this._list = []; + this._max = Infinity; + this._createCount = 0; + this._outCount = 0; + this._inCount = 0; + this._discardCount = 0; + this._list = []; + this._max = opts.max || this._max; + this._createFn = opts.create; + this._outFn = opts.allocate; + this._inFn = opts.release; + this._discardFn = opts.discard; + } + Pool.prototype.max = function (n) { + if (typeof n === 'number') { + this._max = n; + return this; + } + return this._max; + }; + Pool.prototype.size = function () { + return this._list.length; + }; + Pool.prototype.allocate = function () { + var item; + if (this._list.length > 0) { + item = this._list.shift(); + } + else { + this._createCount++; + if (typeof this._createFn === 'function') { + item = this._createFn(); + } + else { + // tslint:disable-next-line:no-object-literal-type-assertion + item = {}; + } + } + this._outCount++; + if (typeof this._outFn === 'function') { + this._outFn(item); + } + return item; + }; + Pool.prototype.release = function (item) { + if (this._list.length < this._max) { + this._inCount++; + if (typeof this._inFn === 'function') { + this._inFn(item); + } + this._list.push(item); + } + else { + this._discardCount++; + if (typeof this._discardFn === 'function') { + item = this._discardFn(item); + } + } + }; + /** @internal */ + Pool.prototype.toString = function () { + return " +" + this._createCount + " >" + this._outCount + " <" + this._inCount + " -" + + this._discardCount + " =" + this._list.length + "/" + this._max; + }; + return Pool; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A node in the dynamic tree. The client does not interact with this directly. + */ +var TreeNode = /** @class */ (function () { + function TreeNode(id) { + /** Enlarged AABB */ + this.aabb = new AABB(); + this.userData = null; + this.parent = null; + this.child1 = null; + this.child2 = null; + /** 0: leaf, -1: free node */ + this.height = -1; + this.id = id; + } + /** @internal */ + TreeNode.prototype.toString = function () { + return this.id + ": " + this.userData; + }; + TreeNode.prototype.isLeaf = function () { + return this.child1 == null; + }; + return TreeNode; +}()); +/** + * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A + * dynamic tree arranges data in a binary tree to accelerate queries such as + * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we + * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger + * than the client object. This allows the client object to move by small + * amounts without triggering a tree update. + * + * Nodes are pooled and relocatable, so we use node indices rather than + * pointers. + */ +var DynamicTree = /** @class */ (function () { + function DynamicTree() { + this.inputPool = new Pool({ + create: function () { + // tslint:disable-next-line:no-object-literal-type-assertion + return {}; + }, + release: function (stack) { + } + }); + this.stackPool = new Pool({ + create: function () { + return []; + }, + release: function (stack) { + stack.length = 0; + } + }); + this.iteratorPool = new Pool({ + create: function () { + return new Iterator(); + }, + release: function (iterator) { + iterator.close(); + } + }); + this.m_root = null; + this.m_nodes = {}; + this.m_lastProxyId = 0; + this.m_pool = new Pool({ + create: function () { + return new TreeNode(); + } + }); + } + /** + * Get proxy user data. + * + * @return the proxy user data or 0 if the id is invalid. + */ + DynamicTree.prototype.getUserData = function (id) { + var node = this.m_nodes[id]; + return node.userData; + }; + /** + * Get the fat AABB for a node id. + * + * @return the proxy user data or 0 if the id is invalid. + */ + DynamicTree.prototype.getFatAABB = function (id) { + var node = this.m_nodes[id]; + return node.aabb; + }; + DynamicTree.prototype.allocateNode = function () { + var node = this.m_pool.allocate(); + node.id = ++this.m_lastProxyId; + node.userData = null; + node.parent = null; + node.child1 = null; + node.child2 = null; + node.height = -1; + this.m_nodes[node.id] = node; + return node; + }; + DynamicTree.prototype.freeNode = function (node) { + this.m_pool.release(node); + node.height = -1; + // tslint:disable-next-line:no-dynamic-delete + delete this.m_nodes[node.id]; + }; + /** + * Create a proxy in the tree as a leaf node. We return the index of the node + * instead of a pointer so that we can grow the node pool. + * + * Create a proxy. Provide a tight fitting AABB and a userData pointer. + */ + DynamicTree.prototype.createProxy = function (aabb, userData) { + var node = this.allocateNode(); + node.aabb.set(aabb); + // Fatten the aabb. + AABB.extend(node.aabb, Settings.aabbExtension); + node.userData = userData; + node.height = 0; + this.insertLeaf(node); + return node.id; + }; + /** + * Destroy a proxy. This asserts if the id is invalid. + */ + DynamicTree.prototype.destroyProxy = function (id) { + var node = this.m_nodes[id]; + this.removeLeaf(node); + this.freeNode(node); + }; + /** + * Move a proxy with a swepted AABB. If the proxy has moved outside of its + * fattened AABB, then the proxy is removed from the tree and re-inserted. + * Otherwise the function returns immediately. + * + * @param d Displacement + * + * @return true if the proxy was re-inserted. + */ + DynamicTree.prototype.moveProxy = function (id, aabb, d) { + var node = this.m_nodes[id]; + if (node.aabb.contains(aabb)) { + return false; + } + this.removeLeaf(node); + node.aabb.set(aabb); + // Extend AABB. + aabb = node.aabb; + AABB.extend(aabb, Settings.aabbExtension); + // Predict AABB displacement. + // const d = Vec2.mul(Settings.aabbMultiplier, displacement); + if (d.x < 0.0) { + aabb.lowerBound.x += d.x * Settings.aabbMultiplier; + } + else { + aabb.upperBound.x += d.x * Settings.aabbMultiplier; + } + if (d.y < 0.0) { + aabb.lowerBound.y += d.y * Settings.aabbMultiplier; + } + else { + aabb.upperBound.y += d.y * Settings.aabbMultiplier; + } + this.insertLeaf(node); + return true; + }; + DynamicTree.prototype.insertLeaf = function (leaf) { + if (this.m_root == null) { + this.m_root = leaf; + this.m_root.parent = null; + return; + } + // Find the best sibling for this node + var leafAABB = leaf.aabb; + var index = this.m_root; + while (!index.isLeaf()) { + var child1 = index.child1; + var child2 = index.child2; + var area = index.aabb.getPerimeter(); + var combinedAABB = new AABB(); + combinedAABB.combine(index.aabb, leafAABB); + var combinedArea = combinedAABB.getPerimeter(); + // Cost of creating a new parent for this node and the new leaf + var cost = 2.0 * combinedArea; + // Minimum cost of pushing the leaf further down the tree + var inheritanceCost = 2.0 * (combinedArea - area); + // Cost of descending into child1 + var cost1 = void 0; + if (child1.isLeaf()) { + var aabb = new AABB(); + aabb.combine(leafAABB, child1.aabb); + cost1 = aabb.getPerimeter() + inheritanceCost; + } + else { + var aabb = new AABB(); + aabb.combine(leafAABB, child1.aabb); + var oldArea = child1.aabb.getPerimeter(); + var newArea = aabb.getPerimeter(); + cost1 = (newArea - oldArea) + inheritanceCost; + } + // Cost of descending into child2 + var cost2 = void 0; + if (child2.isLeaf()) { + var aabb = new AABB(); + aabb.combine(leafAABB, child2.aabb); + cost2 = aabb.getPerimeter() + inheritanceCost; + } + else { + var aabb = new AABB(); + aabb.combine(leafAABB, child2.aabb); + var oldArea = child2.aabb.getPerimeter(); + var newArea = aabb.getPerimeter(); + cost2 = newArea - oldArea + inheritanceCost; + } + // Descend according to the minimum cost. + if (cost < cost1 && cost < cost2) { + break; + } + // Descend + if (cost1 < cost2) { + index = child1; + } + else { + index = child2; + } + } + var sibling = index; + // Create a new parent. + var oldParent = sibling.parent; + var newParent = this.allocateNode(); + newParent.parent = oldParent; + newParent.userData = null; + newParent.aabb.combine(leafAABB, sibling.aabb); + newParent.height = sibling.height + 1; + if (oldParent != null) { + // The sibling was not the root. + if (oldParent.child1 === sibling) { + oldParent.child1 = newParent; + } + else { + oldParent.child2 = newParent; + } + newParent.child1 = sibling; + newParent.child2 = leaf; + sibling.parent = newParent; + leaf.parent = newParent; + } + else { + // The sibling was the root. + newParent.child1 = sibling; + newParent.child2 = leaf; + sibling.parent = newParent; + leaf.parent = newParent; + this.m_root = newParent; + } + // Walk back up the tree fixing heights and AABBs + index = leaf.parent; + while (index != null) { + index = this.balance(index); + var child1 = index.child1; + var child2 = index.child2; + index.height = 1 + math.max(child1.height, child2.height); + index.aabb.combine(child1.aabb, child2.aabb); + index = index.parent; + } + // validate(); + }; + DynamicTree.prototype.removeLeaf = function (leaf) { + if (leaf === this.m_root) { + this.m_root = null; + return; + } + var parent = leaf.parent; + var grandParent = parent.parent; + var sibling; + if (parent.child1 === leaf) { + sibling = parent.child2; + } + else { + sibling = parent.child1; + } + if (grandParent != null) { + // Destroy parent and connect sibling to grandParent. + if (grandParent.child1 === parent) { + grandParent.child1 = sibling; + } + else { + grandParent.child2 = sibling; + } + sibling.parent = grandParent; + this.freeNode(parent); + // Adjust ancestor bounds. + var index = grandParent; + while (index != null) { + index = this.balance(index); + var child1 = index.child1; + var child2 = index.child2; + index.aabb.combine(child1.aabb, child2.aabb); + index.height = 1 + math.max(child1.height, child2.height); + index = index.parent; + } + } + else { + this.m_root = sibling; + sibling.parent = null; + this.freeNode(parent); + } + // validate(); + }; + /** + * Perform a left or right rotation if node A is imbalanced. Returns the new + * root index. + */ + DynamicTree.prototype.balance = function (iA) { + var A = iA; + if (A.isLeaf() || A.height < 2) { + return iA; + } + var B = A.child1; + var C = A.child2; + var balance = C.height - B.height; + // Rotate C up + if (balance > 1) { + var F = C.child1; + var G = C.child2; + // Swap A and C + C.child1 = A; + C.parent = A.parent; + A.parent = C; + // A's old parent should point to C + if (C.parent != null) { + if (C.parent.child1 === iA) { + C.parent.child1 = C; + } + else { + C.parent.child2 = C; + } + } + else { + this.m_root = C; + } + // Rotate + if (F.height > G.height) { + C.child2 = F; + A.child2 = G; + G.parent = A; + A.aabb.combine(B.aabb, G.aabb); + C.aabb.combine(A.aabb, F.aabb); + A.height = 1 + math.max(B.height, G.height); + C.height = 1 + math.max(A.height, F.height); + } + else { + C.child2 = G; + A.child2 = F; + F.parent = A; + A.aabb.combine(B.aabb, F.aabb); + C.aabb.combine(A.aabb, G.aabb); + A.height = 1 + math.max(B.height, F.height); + C.height = 1 + math.max(A.height, G.height); + } + return C; + } + // Rotate B up + if (balance < -1) { + var D = B.child1; + var E = B.child2; + // Swap A and B + B.child1 = A; + B.parent = A.parent; + A.parent = B; + // A's old parent should point to B + if (B.parent != null) { + if (B.parent.child1 === A) { + B.parent.child1 = B; + } + else { + B.parent.child2 = B; + } + } + else { + this.m_root = B; + } + // Rotate + if (D.height > E.height) { + B.child2 = D; + A.child1 = E; + E.parent = A; + A.aabb.combine(C.aabb, E.aabb); + B.aabb.combine(A.aabb, D.aabb); + A.height = 1 + math.max(C.height, E.height); + B.height = 1 + math.max(A.height, D.height); + } + else { + B.child2 = E; + A.child1 = D; + D.parent = A; + A.aabb.combine(C.aabb, D.aabb); + B.aabb.combine(A.aabb, E.aabb); + A.height = 1 + math.max(C.height, D.height); + B.height = 1 + math.max(A.height, E.height); + } + return B; + } + return A; + }; + /** + * Compute the height of the binary tree in O(N) time. Should not be called + * often. + */ + DynamicTree.prototype.getHeight = function () { + if (this.m_root == null) { + return 0; + } + return this.m_root.height; + }; + /** + * Get the ratio of the sum of the node areas to the root area. + */ + DynamicTree.prototype.getAreaRatio = function () { + if (this.m_root == null) { + return 0.0; + } + var root = this.m_root; + var rootArea = root.aabb.getPerimeter(); + var totalArea = 0.0; + var node; + var it = this.iteratorPool.allocate().preorder(this.m_root); + while (node = it.next()) { + if (node.height < 0) { + // Free node in pool + continue; + } + totalArea += node.aabb.getPerimeter(); + } + this.iteratorPool.release(it); + return totalArea / rootArea; + }; + /** + * Compute the height of a sub-tree. + */ + DynamicTree.prototype.computeHeight = function (id) { + var node; + if (typeof id !== 'undefined') { + node = this.m_nodes[id]; + } + else { + node = this.m_root; + } + // false && console.assert(0 <= id && id < this.m_nodeCapacity); + if (node.isLeaf()) { + return 0; + } + var height1 = this.computeHeight(node.child1.id); + var height2 = this.computeHeight(node.child2.id); + return 1 + math.max(height1, height2); + }; + DynamicTree.prototype.validateStructure = function (node) { + if (node == null) { + return; + } + if (node === this.m_root) ; + var child1 = node.child1; + var child2 = node.child2; + if (node.isLeaf()) { + return; + } + this.validateStructure(child1); + this.validateStructure(child2); + }; + DynamicTree.prototype.validateMetrics = function (node) { + if (node == null) { + return; + } + var child1 = node.child1; + var child2 = node.child2; + if (node.isLeaf()) { + return; + } + // false && console.assert(0 <= child1 && child1 < this.m_nodeCapacity); + // false && console.assert(0 <= child2 && child2 < this.m_nodeCapacity); + var height1 = child1.height; + var height2 = child2.height; + 1 + math.max(height1, height2); + var aabb = new AABB(); + aabb.combine(child1.aabb, child2.aabb); + this.validateMetrics(child1); + this.validateMetrics(child2); + }; + /** + * Validate this tree. For testing. + */ + DynamicTree.prototype.validate = function () { + this.validateStructure(this.m_root); + this.validateMetrics(this.m_root); + }; + /** + * Get the maximum balance of an node in the tree. The balance is the difference + * in height of the two children of a node. + */ + DynamicTree.prototype.getMaxBalance = function () { + var maxBalance = 0; + var node; + var it = this.iteratorPool.allocate().preorder(this.m_root); + while (node = it.next()) { + if (node.height <= 1) { + continue; + } + var balance = math.abs(node.child2.height - node.child1.height); + maxBalance = math.max(maxBalance, balance); + } + this.iteratorPool.release(it); + return maxBalance; + }; + /** + * Build an optimal tree. Very expensive. For testing. + */ + DynamicTree.prototype.rebuildBottomUp = function () { + var nodes = []; + var count = 0; + // Build array of leaves. Free the rest. + var node; + var it = this.iteratorPool.allocate().preorder(this.m_root); + while (node = it.next()) { + if (node.height < 0) { + // free node in pool + continue; + } + if (node.isLeaf()) { + node.parent = null; + nodes[count] = node; + ++count; + } + else { + this.freeNode(node); + } + } + this.iteratorPool.release(it); + while (count > 1) { + var minCost = Infinity; + var iMin = -1; + var jMin = -1; + for (var i = 0; i < count; ++i) { + var aabbi = nodes[i].aabb; + for (var j = i + 1; j < count; ++j) { + var aabbj = nodes[j].aabb; + var b = new AABB(); + b.combine(aabbi, aabbj); + var cost = b.getPerimeter(); + if (cost < minCost) { + iMin = i; + jMin = j; + minCost = cost; + } + } + } + var child1 = nodes[iMin]; + var child2 = nodes[jMin]; + var parent_1 = this.allocateNode(); + parent_1.child1 = child1; + parent_1.child2 = child2; + parent_1.height = 1 + math.max(child1.height, child2.height); + parent_1.aabb.combine(child1.aabb, child2.aabb); + parent_1.parent = null; + child1.parent = parent_1; + child2.parent = parent_1; + nodes[jMin] = nodes[count - 1]; + nodes[iMin] = parent_1; + --count; + } + this.m_root = nodes[0]; + }; + /** + * Shift the world origin. Useful for large worlds. The shift formula is: + * position -= newOrigin + * + * @param newOrigin The new origin with respect to the old origin + */ + DynamicTree.prototype.shiftOrigin = function (newOrigin) { + // Build array of leaves. Free the rest. + var node; + var it = this.iteratorPool.allocate().preorder(this.m_root); + while (node = it.next()) { + var aabb = node.aabb; + aabb.lowerBound.x -= newOrigin.x; + aabb.lowerBound.y -= newOrigin.y; + aabb.upperBound.x -= newOrigin.x; + aabb.upperBound.y -= newOrigin.y; + } + this.iteratorPool.release(it); + }; + /** + * Query an AABB for overlapping proxies. The callback class is called for each + * proxy that overlaps the supplied AABB. + */ + DynamicTree.prototype.query = function (aabb, queryCallback) { + var stack = this.stackPool.allocate(); + stack.push(this.m_root); + while (stack.length > 0) { + var node = stack.pop(); + if (node == null) { + continue; + } + if (AABB.testOverlap(node.aabb, aabb)) { + if (node.isLeaf()) { + var proceed = queryCallback(node.id); + if (proceed === false) { + return; + } + } + else { + stack.push(node.child1); + stack.push(node.child2); + } + } + } + this.stackPool.release(stack); + }; + /** + * Ray-cast against the proxies in the tree. This relies on the callback to + * perform a exact ray-cast in the case were the proxy contains a shape. The + * callback also performs the any collision filtering. This has performance + * roughly equal to k * log(n), where k is the number of collisions and n is the + * number of proxies in the tree. + * + * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. + * @param rayCastCallback A function that is called for each proxy that is hit by the ray. + */ + DynamicTree.prototype.rayCast = function (input, rayCastCallback) { + var p1 = input.p1; + var p2 = input.p2; + var r = Vec2.sub(p2, p1); + r.normalize(); + // v is perpendicular to the segment. + var v = Vec2.crossNumVec2(1.0, r); + var abs_v = Vec2.abs(v); + // Separating axis for segment (Gino, p80). + // |dot(v, p1 - c)| > dot(|v|, h) + var maxFraction = input.maxFraction; + // Build a bounding box for the segment. + var segmentAABB = new AABB(); + var t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2); + segmentAABB.combinePoints(p1, t); + var stack = this.stackPool.allocate(); + var subInput = this.inputPool.allocate(); + stack.push(this.m_root); + while (stack.length > 0) { + var node = stack.pop(); + if (node == null) { + continue; + } + if (AABB.testOverlap(node.aabb, segmentAABB) === false) { + continue; + } + // Separating axis for segment (Gino, p80). + // |dot(v, p1 - c)| > dot(|v|, h) + var c = node.aabb.getCenter(); + var h = node.aabb.getExtents(); + var separation = math.abs(Vec2.dot(v, Vec2.sub(p1, c))) - Vec2.dot(abs_v, h); + if (separation > 0.0) { + continue; + } + if (node.isLeaf()) { + subInput.p1 = Vec2.clone(input.p1); + subInput.p2 = Vec2.clone(input.p2); + subInput.maxFraction = maxFraction; + var value = rayCastCallback(subInput, node.id); + if (value === 0.0) { + // The client has terminated the ray cast. + return; + } + if (value > 0.0) { + // update segment bounding box. + maxFraction = value; + t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2); + segmentAABB.combinePoints(p1, t); + } + } + else { + stack.push(node.child1); + stack.push(node.child2); + } + } + this.stackPool.release(stack); + this.inputPool.release(subInput); + }; + return DynamicTree; +}()); +var Iterator = /** @class */ (function () { + function Iterator() { + this.parents = []; + this.states = []; + } + Iterator.prototype.preorder = function (root) { + this.parents.length = 0; + this.parents.push(root); + this.states.length = 0; + this.states.push(0); + return this; + }; + Iterator.prototype.next = function () { + while (this.parents.length > 0) { + var i = this.parents.length - 1; + var node = this.parents[i]; + if (this.states[i] === 0) { + this.states[i] = 1; + return node; + } + if (this.states[i] === 1) { + this.states[i] = 2; + if (node.child1) { + this.parents.push(node.child1); + this.states.push(1); + return node.child1; + } + } + if (this.states[i] === 2) { + this.states[i] = 3; + if (node.child2) { + this.parents.push(node.child2); + this.states.push(1); + return node.child2; + } + } + this.parents.pop(); + this.states.pop(); + } + }; + Iterator.prototype.close = function () { + this.parents.length = 0; + }; + return Iterator; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * The broad-phase wraps and extends a dynamic-tree to keep track of moved + * objects and query them on update. + */ +var BroadPhase = /** @class */ (function () { + function BroadPhase() { + var _this = this; + this.m_tree = new DynamicTree(); + this.m_proxyCount = 0; + this.m_moveBuffer = []; + /** + * Query an AABB for overlapping proxies. The callback class is called for each + * proxy that overlaps the supplied AABB. + */ + this.query = function (aabb, queryCallback) { + _this.m_tree.query(aabb, queryCallback); + }; + this.queryCallback = function (proxyId) { + // A proxy cannot form a pair with itself. + if (proxyId === _this.m_queryProxyId) { + return true; + } + var proxyIdA = math.min(proxyId, _this.m_queryProxyId); + var proxyIdB = math.max(proxyId, _this.m_queryProxyId); + // TODO: Skip any duplicate pairs. + var userDataA = _this.m_tree.getUserData(proxyIdA); + var userDataB = _this.m_tree.getUserData(proxyIdB); + // Send the pairs back to the client. + _this.m_callback(userDataA, userDataB); + return true; + }; + } + /** + * Get user data from a proxy. Returns null if the id is invalid. + */ + BroadPhase.prototype.getUserData = function (proxyId) { + return this.m_tree.getUserData(proxyId); + }; + /** + * Test overlap of fat AABBs. + */ + BroadPhase.prototype.testOverlap = function (proxyIdA, proxyIdB) { + var aabbA = this.m_tree.getFatAABB(proxyIdA); + var aabbB = this.m_tree.getFatAABB(proxyIdB); + return AABB.testOverlap(aabbA, aabbB); + }; + /** + * Get the fat AABB for a proxy. + */ + BroadPhase.prototype.getFatAABB = function (proxyId) { + return this.m_tree.getFatAABB(proxyId); + }; + /** + * Get the number of proxies. + */ + BroadPhase.prototype.getProxyCount = function () { + return this.m_proxyCount; + }; + /** + * Get the height of the embedded tree. + */ + BroadPhase.prototype.getTreeHeight = function () { + return this.m_tree.getHeight(); + }; + /** + * Get the balance (integer) of the embedded tree. + */ + BroadPhase.prototype.getTreeBalance = function () { + return this.m_tree.getMaxBalance(); + }; + /** + * Get the quality metric of the embedded tree. + */ + BroadPhase.prototype.getTreeQuality = function () { + return this.m_tree.getAreaRatio(); + }; + /** + * Ray-cast against the proxies in the tree. This relies on the callback to + * perform a exact ray-cast in the case were the proxy contains a shape. The + * callback also performs the any collision filtering. This has performance + * roughly equal to k * log(n), where k is the number of collisions and n is the + * number of proxies in the tree. + * + * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. + * @param rayCastCallback A function that is called for each proxy that is hit by the ray. + */ + BroadPhase.prototype.rayCast = function (input, rayCastCallback) { + this.m_tree.rayCast(input, rayCastCallback); + }; + /** + * Shift the world origin. Useful for large worlds. The shift formula is: + * position -= newOrigin + * + * @param newOrigin The new origin with respect to the old origin + */ + BroadPhase.prototype.shiftOrigin = function (newOrigin) { + this.m_tree.shiftOrigin(newOrigin); + }; + /** + * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs + * is called. + */ + BroadPhase.prototype.createProxy = function (aabb, userData) { + var proxyId = this.m_tree.createProxy(aabb, userData); + this.m_proxyCount++; + this.bufferMove(proxyId); + return proxyId; + }; + /** + * Destroy a proxy. It is up to the client to remove any pairs. + */ + BroadPhase.prototype.destroyProxy = function (proxyId) { + this.unbufferMove(proxyId); + this.m_proxyCount--; + this.m_tree.destroyProxy(proxyId); + }; + /** + * Call moveProxy as many times as you like, then when you are done call + * UpdatePairs to finalized the proxy pairs (for your time step). + */ + BroadPhase.prototype.moveProxy = function (proxyId, aabb, displacement) { + var changed = this.m_tree.moveProxy(proxyId, aabb, displacement); + if (changed) { + this.bufferMove(proxyId); + } + }; + /** + * Call to trigger a re-processing of it's pairs on the next call to + * UpdatePairs. + */ + BroadPhase.prototype.touchProxy = function (proxyId) { + this.bufferMove(proxyId); + }; + BroadPhase.prototype.bufferMove = function (proxyId) { + this.m_moveBuffer.push(proxyId); + }; + BroadPhase.prototype.unbufferMove = function (proxyId) { + for (var i = 0; i < this.m_moveBuffer.length; ++i) { + if (this.m_moveBuffer[i] === proxyId) { + this.m_moveBuffer[i] = null; + } + } + }; + /** + * Update the pairs. This results in pair callbacks. This can only add pairs. + */ + BroadPhase.prototype.updatePairs = function (addPairCallback) { + this.m_callback = addPairCallback; + // Perform tree queries for all moving proxies. + while (this.m_moveBuffer.length > 0) { + this.m_queryProxyId = this.m_moveBuffer.pop(); + if (this.m_queryProxyId === null) { + continue; + } + // We have to query the tree with the fat AABB so that + // we don't fail to create a pair that may touch later. + var fatAABB = this.m_tree.getFatAABB(this.m_queryProxyId); + // Query tree, create pairs and add them pair buffer. + this.m_tree.query(fatAABB, this.queryCallback); + } + // Try to keep the tree balanced. + // this.m_tree.rebalance(4); + }; + return BroadPhase; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Rot = /** @class */ (function () { + /** Initialize from an angle in radians. */ + function Rot(angle) { + if (!(this instanceof Rot)) { + return new Rot(angle); + } + if (typeof angle === 'number') { + this.setAngle(angle); + } + else if (typeof angle === 'object') { + this.setRot(angle); + } + else { + this.setIdentity(); + } + } + /** @internal */ + Rot.neo = function (angle) { + var obj = Object.create(Rot.prototype); + obj.setAngle(angle); + return obj; + }; + Rot.clone = function (rot) { + var obj = Object.create(Rot.prototype); + obj.s = rot.s; + obj.c = rot.c; + return obj; + }; + Rot.identity = function () { + var obj = Object.create(Rot.prototype); + obj.s = 0.0; + obj.c = 1.0; + return obj; + }; + Rot.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return math.isFinite(obj.s) && math.isFinite(obj.c); + }; + Rot.assert = function (o) { + }; + /** Set to the identity rotation. */ + Rot.prototype.setIdentity = function () { + this.s = 0.0; + this.c = 1.0; + }; + Rot.prototype.set = function (angle) { + if (typeof angle === 'object') { + this.s = angle.s; + this.c = angle.c; + } + else { + // TODO_ERIN optimize + this.s = math.sin(angle); + this.c = math.cos(angle); + } + }; + Rot.prototype.setRot = function (angle) { + this.s = angle.s; + this.c = angle.c; + }; + /** Set using an angle in radians. */ + Rot.prototype.setAngle = function (angle) { + // TODO_ERIN optimize + this.s = math.sin(angle); + this.c = math.cos(angle); + }; + /** Get the angle in radians. */ + Rot.prototype.getAngle = function () { + return math.atan2(this.s, this.c); + }; + /** Get the x-axis. */ + Rot.prototype.getXAxis = function () { + return Vec2.neo(this.c, this.s); + }; + /** Get the u-axis. */ + Rot.prototype.getYAxis = function () { + return Vec2.neo(-this.s, this.c); + }; + // tslint:disable-next-line:typedef + Rot.mul = function (rot, m) { + if ('c' in m && 's' in m) { + // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc] + // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc] + // s = qs * rc + qc * rs + // c = qc * rc - qs * rs + var qr = Rot.identity(); + qr.s = rot.s * m.c + rot.c * m.s; + qr.c = rot.c * m.c - rot.s * m.s; + return qr; + } + else if ('x' in m && 'y' in m) { + return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y); + } + }; + /** Multiply two rotations: q * r */ + Rot.mulRot = function (rot, m) { + // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc] + // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc] + // s = qs * rc + qc * rs + // c = qc * rc - qs * rs + var qr = Rot.identity(); + qr.s = rot.s * m.c + rot.c * m.s; + qr.c = rot.c * m.c - rot.s * m.s; + return qr; + }; + /** Rotate a vector */ + Rot.mulVec2 = function (rot, m) { + return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y); + }; + Rot.mulSub = function (rot, v, w) { + var x = rot.c * (v.x - w.x) - rot.s * (v.y - w.y); + var y = rot.s * (v.x - w.x) + rot.c * (v.y - w.y); + return Vec2.neo(x, y); + }; + // tslint:disable-next-line:typedef + Rot.mulT = function (rot, m) { + if ('c' in m && 's' in m) { + // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc] + // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc] + // s = qc * rs - qs * rc + // c = qc * rc + qs * rs + var qr = Rot.identity(); + qr.s = rot.c * m.s - rot.s * m.c; + qr.c = rot.c * m.c + rot.s * m.s; + return qr; + } + else if ('x' in m && 'y' in m) { + return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y); + } + }; + /** Transpose multiply two rotations: qT * r */ + Rot.mulTRot = function (rot, m) { + // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc] + // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc] + // s = qc * rs - qs * rc + // c = qc * rc + qs * rs + var qr = Rot.identity(); + qr.s = rot.c * m.s - rot.s * m.c; + qr.c = rot.c * m.c + rot.s * m.s; + return qr; + }; + /** Inverse rotate a vector */ + Rot.mulTVec2 = function (rot, m) { + return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y); + }; + return Rot; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A transform contains translation and rotation. It is used to represent the + * position and orientation of rigid frames. Initialize using a position vector + * and a rotation. + */ +var Transform = /** @class */ (function () { + function Transform(position, rotation) { + if (!(this instanceof Transform)) { + return new Transform(position, rotation); + } + this.p = Vec2.zero(); + this.q = Rot.identity(); + if (typeof position !== 'undefined') { + this.p.setVec2(position); + } + if (typeof rotation !== 'undefined') { + this.q.setAngle(rotation); + } + } + Transform.clone = function (xf) { + var obj = Object.create(Transform.prototype); + obj.p = Vec2.clone(xf.p); + obj.q = Rot.clone(xf.q); + return obj; + }; + /** @internal */ + Transform.neo = function (position, rotation) { + var obj = Object.create(Transform.prototype); + obj.p = Vec2.clone(position); + obj.q = Rot.clone(rotation); + return obj; + }; + Transform.identity = function () { + var obj = Object.create(Transform.prototype); + obj.p = Vec2.zero(); + obj.q = Rot.identity(); + return obj; + }; + /** + * Set this to the identity transform. + */ + Transform.prototype.setIdentity = function () { + this.p.setZero(); + this.q.setIdentity(); + }; + /** + * Set this based on the position and angle. + */ + // tslint:disable-next-line:typedef + Transform.prototype.set = function (a, b) { + if (typeof b === 'undefined') { + this.p.set(a.p); + this.q.set(a.q); + } + else { + this.p.set(a); + this.q.set(b); + } + }; + /** + * Set this based on the position and angle. + */ + Transform.prototype.setNum = function (position, rotation) { + this.p.setVec2(position); + this.q.setAngle(rotation); + }; + Transform.prototype.setTransform = function (xf) { + this.p.setVec2(xf.p); + this.q.setRot(xf.q); + }; + Transform.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return Vec2.isValid(obj.p) && Rot.isValid(obj.q); + }; + Transform.assert = function (o) { + }; + // static mul(a: Transform, b: Vec2Value[]): Vec2[]; + // static mul(a: Transform, b: Transform[]): Transform[]; + // tslint:disable-next-line:typedef + Transform.mul = function (a, b) { + if (Array.isArray(b)) { + var arr = []; + for (var i = 0; i < b.length; i++) { + arr[i] = Transform.mul(a, b[i]); + } + return arr; + } + else if ('x' in b && 'y' in b) { + return Transform.mulVec2(a, b); + } + else if ('p' in b && 'q' in b) { + return Transform.mulXf(a, b); + } + }; + // tslint:disable-next-line:typedef + Transform.mulAll = function (a, b) { + var arr = []; + for (var i = 0; i < b.length; i++) { + arr[i] = Transform.mul(a, b[i]); + } + return arr; + }; + /** @internal @deprecated */ + // tslint:disable-next-line:typedef + Transform.mulFn = function (a) { + return function (b) { + return Transform.mul(a, b); + }; + }; + Transform.mulVec2 = function (a, b) { + var x = (a.q.c * b.x - a.q.s * b.y) + a.p.x; + var y = (a.q.s * b.x + a.q.c * b.y) + a.p.y; + return Vec2.neo(x, y); + }; + Transform.mulXf = function (a, b) { + // v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p + // = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p + var xf = Transform.identity(); + xf.q = Rot.mulRot(a.q, b.q); + xf.p = Vec2.add(Rot.mulVec2(a.q, b.p), a.p); + return xf; + }; + // tslint:disable-next-line:typedef + Transform.mulT = function (a, b) { + if ('x' in b && 'y' in b) { + return Transform.mulTVec2(a, b); + } + else if ('p' in b && 'q' in b) { + return Transform.mulTXf(a, b); + } + }; + Transform.mulTVec2 = function (a, b) { + var px = b.x - a.p.x; + var py = b.y - a.p.y; + var x = (a.q.c * px + a.q.s * py); + var y = (-a.q.s * px + a.q.c * py); + return Vec2.neo(x, y); + }; + Transform.mulTXf = function (a, b) { + // v2 = A.q' * (B.q * v1 + B.p - A.p) + // = A.q' * B.q * v1 + A.q' * (B.p - A.p) + var xf = Transform.identity(); + xf.q.setRot(Rot.mulTRot(a.q, b.q)); + xf.p.setVec2(Rot.mulTVec2(a.q, Vec2.sub(b.p, a.p))); + return xf; + }; + return Transform; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * This describes the motion of a body/shape for TOI computation. Shapes are + * defined with respect to the body origin, which may not coincide with the + * center of mass. However, to support dynamics we must interpolate the center + * of mass position. + */ +var Sweep = /** @class */ (function () { + function Sweep(c, a) { + this.localCenter = Vec2.zero(); + this.c = Vec2.zero(); + this.a = 0; + this.alpha0 = 0; + this.c0 = Vec2.zero(); + this.a0 = 0; + } + Sweep.prototype.setTransform = function (xf) { + var c = Transform.mulVec2(xf, this.localCenter); + this.c.setVec2(c); + this.c0.setVec2(c); + this.a = xf.q.getAngle(); + this.a0 = xf.q.getAngle(); + }; + Sweep.prototype.setLocalCenter = function (localCenter, xf) { + this.localCenter.setVec2(localCenter); + var c = Transform.mulVec2(xf, this.localCenter); + this.c.setVec2(c); + this.c0.setVec2(c); + }; + /** + * Get the interpolated transform at a specific time. + * + * @param xf + * @param beta A factor in [0,1], where 0 indicates alpha0 + */ + Sweep.prototype.getTransform = function (xf, beta) { + if (beta === void 0) { beta = 0; } + xf.q.setAngle((1.0 - beta) * this.a0 + beta * this.a); + xf.p.setCombine((1.0 - beta), this.c0, beta, this.c); + // shift to origin + xf.p.sub(Rot.mulVec2(xf.q, this.localCenter)); + }; + /** + * Advance the sweep forward, yielding a new initial state. + * + * @param alpha The new initial time + */ + Sweep.prototype.advance = function (alpha) { + var beta = (alpha - this.alpha0) / (1.0 - this.alpha0); + this.c0.setCombine(beta, this.c, 1 - beta, this.c0); + this.a0 = beta * this.a + (1 - beta) * this.a0; + this.alpha0 = alpha; + }; + Sweep.prototype.forward = function () { + this.a0 = this.a; + this.c0.setVec2(this.c); + }; + /** + * normalize the angles in radians to be between -pi and pi. + */ + Sweep.prototype.normalize = function () { + var a0 = math.mod(this.a0, -math.PI, +math.PI); + this.a -= this.a0 - a0; + this.a0 = a0; + }; + Sweep.prototype.clone = function () { + var clone = new Sweep(); + clone.localCenter.setVec2(this.localCenter); + clone.alpha0 = this.alpha0; + clone.a0 = this.a0; + clone.a = this.a; + clone.c0.setVec2(this.c0); + clone.c.setVec2(this.c); + return clone; + }; + Sweep.prototype.set = function (that) { + this.localCenter.setVec2(that.localCenter); + this.alpha0 = that.alpha0; + this.a0 = that.a0; + this.a = that.a; + this.c0.setVec2(that.c0); + this.c.setVec2(that.c); + }; + return Sweep; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Velocity = /** @class */ (function () { + function Velocity() { + this.v = Vec2.zero(); + this.w = 0; + } + return Velocity; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Position = /** @class */ (function () { + function Position() { + this.c = Vec2.zero(); + this.a = 0; + } + Position.prototype.getTransform = function (xf, p) { + xf.q.setAngle(this.a); + xf.p.setVec2(Vec2.sub(this.c, Rot.mulVec2(xf.q, p))); + return xf; + }; + return Position; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +// todo make shape an interface +/** + * A shape is used for collision detection. You can create a shape however you + * like. Shapes used for simulation in World are created automatically when a + * Fixture is created. Shapes may encapsulate one or more child shapes. + */ +var Shape = /** @class */ (function () { + function Shape() { + } + Shape.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return typeof obj.m_type === 'string' && typeof obj.m_radius === 'number'; + }; + return Shape; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var FixtureDefDefault = { + userData: null, + friction: 0.2, + restitution: 0.0, + density: 0.0, + isSensor: false, + filterGroupIndex: 0, + filterCategoryBits: 0x0001, + filterMaskBits: 0xFFFF +}; +/** + * This proxy is used internally to connect shape children to the broad-phase. + */ +var FixtureProxy = /** @class */ (function () { + function FixtureProxy(fixture, childIndex) { + this.aabb = new AABB(); + this.fixture = fixture; + this.childIndex = childIndex; + this.proxyId; + } + return FixtureProxy; +}()); +/** + * A fixture is used to attach a shape to a body for collision detection. A + * fixture inherits its transform from its parent. Fixtures hold additional + * non-geometric data such as friction, collision filters, etc. + * + * To create a new Fixture use {@link Body.createFixture}. + */ +var Fixture = /** @class */ (function () { + // tslint:disable-next-line:typedef + /** @internal */ function Fixture(body, shape, def) { + if (shape.shape) { + def = shape; + shape = shape.shape; + } + else if (typeof def === 'number') { + def = { density: def }; + } + def = options(def, FixtureDefDefault); + this.m_body = body; + this.m_friction = def.friction; + this.m_restitution = def.restitution; + this.m_density = def.density; + this.m_isSensor = def.isSensor; + this.m_filterGroupIndex = def.filterGroupIndex; + this.m_filterCategoryBits = def.filterCategoryBits; + this.m_filterMaskBits = def.filterMaskBits; + // TODO validate shape + this.m_shape = shape; // .clone(); + this.m_next = null; + this.m_proxies = []; + this.m_proxyCount = 0; + var childCount = this.m_shape.getChildCount(); + for (var i = 0; i < childCount; ++i) { + this.m_proxies[i] = new FixtureProxy(this, i); + } + this.m_userData = def.userData; + } + /** + * Re-setup fixture. + * @internal + */ + Fixture.prototype._reset = function () { + var body = this.getBody(); + var broadPhase = body.m_world.m_broadPhase; + this.destroyProxies(broadPhase); + if (this.m_shape._reset) { + this.m_shape._reset(); + } + var childCount = this.m_shape.getChildCount(); + for (var i = 0; i < childCount; ++i) { + this.m_proxies[i] = new FixtureProxy(this, i); + } + this.createProxies(broadPhase, body.m_xf); + body.resetMassData(); + }; + /** @internal */ + Fixture.prototype._serialize = function () { + return { + friction: this.m_friction, + restitution: this.m_restitution, + density: this.m_density, + isSensor: this.m_isSensor, + filterGroupIndex: this.m_filterGroupIndex, + filterCategoryBits: this.m_filterCategoryBits, + filterMaskBits: this.m_filterMaskBits, + shape: this.m_shape, + }; + }; + /** @internal */ + Fixture._deserialize = function (data, body, restore) { + var shape = restore(Shape, data.shape); + var fixture = shape && new Fixture(body, shape, data); + return fixture; + }; + /** + * Get the type of the child shape. You can use this to down cast to the + * concrete shape. + */ + Fixture.prototype.getType = function () { + return this.m_shape.getType(); + }; + /** + * Get the child shape. You can modify the child shape, however you should not + * change the number of vertices because this will crash some collision caching + * mechanisms. Manipulating the shape may lead to non-physical behavior. + */ + Fixture.prototype.getShape = function () { + return this.m_shape; + }; + /** + * A sensor shape collects contact information but never generates a collision + * response. + */ + Fixture.prototype.isSensor = function () { + return this.m_isSensor; + }; + /** + * Set if this fixture is a sensor. + */ + Fixture.prototype.setSensor = function (sensor) { + if (sensor != this.m_isSensor) { + this.m_body.setAwake(true); + this.m_isSensor = sensor; + } + }; + // /** + // * Get the contact filtering data. + // */ + // getFilterData() { + // return this.m_filter; + // } + /** + * Get the user data that was assigned in the fixture definition. Use this to + * store your application specific data. + */ + Fixture.prototype.getUserData = function () { + return this.m_userData; + }; + /** + * Set the user data. Use this to store your application specific data. + */ + Fixture.prototype.setUserData = function (data) { + this.m_userData = data; + }; + /** + * Get the parent body of this fixture. This is null if the fixture is not + * attached. + */ + Fixture.prototype.getBody = function () { + return this.m_body; + }; + /** + * Get the next fixture in the parent body's fixture list. + */ + Fixture.prototype.getNext = function () { + return this.m_next; + }; + /** + * Get the density of this fixture. + */ + Fixture.prototype.getDensity = function () { + return this.m_density; + }; + /** + * Set the density of this fixture. This will _not_ automatically adjust the + * mass of the body. You must call Body.resetMassData to update the body's mass. + */ + Fixture.prototype.setDensity = function (density) { + this.m_density = density; + }; + /** + * Get the coefficient of friction, usually in the range [0,1]. + */ + Fixture.prototype.getFriction = function () { + return this.m_friction; + }; + /** + * Set the coefficient of friction. This will not change the friction of + * existing contacts. + */ + Fixture.prototype.setFriction = function (friction) { + this.m_friction = friction; + }; + /** + * Get the coefficient of restitution. + */ + Fixture.prototype.getRestitution = function () { + return this.m_restitution; + }; + /** + * Set the coefficient of restitution. This will not change the restitution of + * existing contacts. + */ + Fixture.prototype.setRestitution = function (restitution) { + this.m_restitution = restitution; + }; + /** + * Test a point in world coordinates for containment in this fixture. + */ + Fixture.prototype.testPoint = function (p) { + return this.m_shape.testPoint(this.m_body.getTransform(), p); + }; + /** + * Cast a ray against this shape. + */ + Fixture.prototype.rayCast = function (output, input, childIndex) { + return this.m_shape.rayCast(output, input, this.m_body.getTransform(), childIndex); + }; + /** + * Get the mass data for this fixture. The mass data is based on the density and + * the shape. The rotational inertia is about the shape's origin. This operation + * may be expensive. + */ + Fixture.prototype.getMassData = function (massData) { + this.m_shape.computeMass(massData, this.m_density); + }; + /** + * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a + * more accurate AABB, compute it using the shape and the body transform. + */ + Fixture.prototype.getAABB = function (childIndex) { + return this.m_proxies[childIndex].aabb; + }; + /** + * These support body activation/deactivation. + */ + Fixture.prototype.createProxies = function (broadPhase, xf) { + // Create proxies in the broad-phase. + this.m_proxyCount = this.m_shape.getChildCount(); + for (var i = 0; i < this.m_proxyCount; ++i) { + var proxy = this.m_proxies[i]; + this.m_shape.computeAABB(proxy.aabb, xf, i); + proxy.proxyId = broadPhase.createProxy(proxy.aabb, proxy); + } + }; + Fixture.prototype.destroyProxies = function (broadPhase) { + // Destroy proxies in the broad-phase. + for (var i = 0; i < this.m_proxyCount; ++i) { + var proxy = this.m_proxies[i]; + broadPhase.destroyProxy(proxy.proxyId); + proxy.proxyId = null; + } + this.m_proxyCount = 0; + }; + /** + * Updates this fixture proxy in broad-phase (with combined AABB of current and + * next transformation). + */ + Fixture.prototype.synchronize = function (broadPhase, xf1, xf2) { + for (var i = 0; i < this.m_proxyCount; ++i) { + var proxy = this.m_proxies[i]; + // Compute an AABB that covers the swept shape (may miss some rotation + // effect). + var aabb1 = new AABB(); + var aabb2 = new AABB(); + this.m_shape.computeAABB(aabb1, xf1, proxy.childIndex); + this.m_shape.computeAABB(aabb2, xf2, proxy.childIndex); + proxy.aabb.combine(aabb1, aabb2); + var displacement = Vec2.sub(xf2.p, xf1.p); + broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement); + } + }; + /** + * Set the contact filtering data. This will not update contacts until the next + * time step when either parent body is active and awake. This automatically + * calls refilter. + */ + Fixture.prototype.setFilterData = function (filter) { + this.m_filterGroupIndex = filter.groupIndex; + this.m_filterCategoryBits = filter.categoryBits; + this.m_filterMaskBits = filter.maskBits; + this.refilter(); + }; + Fixture.prototype.getFilterGroupIndex = function () { + return this.m_filterGroupIndex; + }; + Fixture.prototype.setFilterGroupIndex = function (groupIndex) { + this.m_filterGroupIndex = groupIndex; + }; + Fixture.prototype.getFilterCategoryBits = function () { + return this.m_filterCategoryBits; + }; + Fixture.prototype.setFilterCategoryBits = function (categoryBits) { + this.m_filterCategoryBits = categoryBits; + }; + Fixture.prototype.getFilterMaskBits = function () { + return this.m_filterMaskBits; + }; + Fixture.prototype.setFilterMaskBits = function (maskBits) { + this.m_filterMaskBits = maskBits; + }; + /** + * Call this if you want to establish collision that was previously disabled by + * ContactFilter. + */ + Fixture.prototype.refilter = function () { + if (this.m_body == null) { + return; + } + // Flag associated contacts for filtering. + var edge = this.m_body.getContactList(); + while (edge) { + var contact = edge.contact; + var fixtureA = contact.getFixtureA(); + var fixtureB = contact.getFixtureB(); + if (fixtureA == this || fixtureB == this) { + contact.flagForFiltering(); + } + edge = edge.next; + } + var world = this.m_body.getWorld(); + if (world == null) { + return; + } + // Touch each proxy so that new pairs may be created + var broadPhase = world.m_broadPhase; + for (var i = 0; i < this.m_proxyCount; ++i) { + broadPhase.touchProxy(this.m_proxies[i].proxyId); + } + }; + /** + * Implement this method to provide collision filtering, if you want finer + * control over contact creation. + * + * Return true if contact calculations should be performed between these two + * fixtures. + * + * Warning: for performance reasons this is only called when the AABBs begin to + * overlap. + */ + Fixture.prototype.shouldCollide = function (that) { + if (that.m_filterGroupIndex === this.m_filterGroupIndex && that.m_filterGroupIndex !== 0) { + return that.m_filterGroupIndex > 0; + } + var collideA = (that.m_filterMaskBits & this.m_filterCategoryBits) !== 0; + var collideB = (that.m_filterCategoryBits & this.m_filterMaskBits) !== 0; + var collide = collideA && collideB; + return collide; + }; + return Fixture; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var STATIC = 'static'; +var KINEMATIC = 'kinematic'; +var DYNAMIC = 'dynamic'; +var BodyDefDefault = { + type: STATIC, + position: Vec2.zero(), + angle: 0.0, + linearVelocity: Vec2.zero(), + angularVelocity: 0.0, + linearDamping: 0.0, + angularDamping: 0.0, + fixedRotation: false, + bullet: false, + gravityScale: 1.0, + allowSleep: true, + awake: true, + active: true, + userData: null +}; +/** + * MassData This holds the mass data computed for a shape. + */ +var MassData = /** @class */ (function () { + function MassData() { + /** The mass of the shape, usually in kilograms. */ + this.mass = 0; + /** The position of the shape's centroid relative to the shape's origin. */ + this.center = Vec2.zero(); + /** The rotational inertia of the shape about the local origin. */ + this.I = 0; + } + return MassData; +}()); +/** + * A rigid body composed of one or more fixtures. + * + * To create a new Body use {@link World.createBody}. + */ +var Body = /** @class */ (function () { + /** @internal */ + function Body(world, def) { + def = options(def, BodyDefDefault); + this.m_world = world; + this.m_awakeFlag = def.awake; + this.m_autoSleepFlag = def.allowSleep; + this.m_bulletFlag = def.bullet; + this.m_fixedRotationFlag = def.fixedRotation; + this.m_activeFlag = def.active; + this.m_islandFlag = false; + this.m_toiFlag = false; + this.m_userData = def.userData; + this.m_type = def.type; + if (this.m_type == DYNAMIC) { + this.m_mass = 1.0; + this.m_invMass = 1.0; + } + else { + this.m_mass = 0.0; + this.m_invMass = 0.0; + } + // Rotational inertia about the center of mass. + this.m_I = 0.0; + this.m_invI = 0.0; + // the body origin transform + this.m_xf = Transform.identity(); + this.m_xf.p = Vec2.clone(def.position); + this.m_xf.q.setAngle(def.angle); + // the swept motion for CCD + this.m_sweep = new Sweep(); + this.m_sweep.setTransform(this.m_xf); + // position and velocity correction + this.c_velocity = new Velocity(); + this.c_position = new Position(); + this.m_force = Vec2.zero(); + this.m_torque = 0.0; + this.m_linearVelocity = Vec2.clone(def.linearVelocity); + this.m_angularVelocity = def.angularVelocity; + this.m_linearDamping = def.linearDamping; + this.m_angularDamping = def.angularDamping; + this.m_gravityScale = def.gravityScale; + this.m_sleepTime = 0.0; + this.m_jointList = null; + this.m_contactList = null; + this.m_fixtureList = null; + this.m_prev = null; + this.m_next = null; + this.m_destroyed = false; + } + /** @internal */ + Body.prototype._serialize = function () { + var fixtures = []; + for (var f = this.m_fixtureList; f; f = f.m_next) { + fixtures.push(f); + } + return { + type: this.m_type, + bullet: this.m_bulletFlag, + position: this.m_xf.p, + angle: this.m_xf.q.getAngle(), + linearVelocity: this.m_linearVelocity, + angularVelocity: this.m_angularVelocity, + fixtures: fixtures, + }; + }; + /** @internal */ + Body._deserialize = function (data, world, restore) { + var body = new Body(world, data); + if (data.fixtures) { + for (var i = data.fixtures.length - 1; i >= 0; i--) { + var fixture = restore(Fixture, data.fixtures[i], body); + body._addFixture(fixture); + } + } + return body; + }; + Body.prototype.isWorldLocked = function () { + return this.m_world && this.m_world.isLocked() ? true : false; + }; + Body.prototype.getWorld = function () { + return this.m_world; + }; + Body.prototype.getNext = function () { + return this.m_next; + }; + Body.prototype.setUserData = function (data) { + this.m_userData = data; + }; + Body.prototype.getUserData = function () { + return this.m_userData; + }; + Body.prototype.getFixtureList = function () { + return this.m_fixtureList; + }; + Body.prototype.getJointList = function () { + return this.m_jointList; + }; + /** + * Warning: this list changes during the time step and you may miss some + * collisions if you don't use ContactListener. + */ + Body.prototype.getContactList = function () { + return this.m_contactList; + }; + Body.prototype.isStatic = function () { + return this.m_type == STATIC; + }; + Body.prototype.isDynamic = function () { + return this.m_type == DYNAMIC; + }; + Body.prototype.isKinematic = function () { + return this.m_type == KINEMATIC; + }; + /** + * This will alter the mass and velocity. + */ + Body.prototype.setStatic = function () { + this.setType(STATIC); + return this; + }; + Body.prototype.setDynamic = function () { + this.setType(DYNAMIC); + return this; + }; + Body.prototype.setKinematic = function () { + this.setType(KINEMATIC); + return this; + }; + /** + * @internal + */ + Body.prototype.getType = function () { + return this.m_type; + }; + /** + * @internal + */ + Body.prototype.setType = function (type) { + if (this.isWorldLocked() == true) { + return; + } + if (this.m_type == type) { + return; + } + this.m_type = type; + this.resetMassData(); + if (this.m_type == STATIC) { + this.m_linearVelocity.setZero(); + this.m_angularVelocity = 0.0; + this.m_sweep.forward(); + this.synchronizeFixtures(); + } + this.setAwake(true); + this.m_force.setZero(); + this.m_torque = 0.0; + // Delete the attached contacts. + var ce = this.m_contactList; + while (ce) { + var ce0 = ce; + ce = ce.next; + this.m_world.destroyContact(ce0.contact); + } + this.m_contactList = null; + // Touch the proxies so that new contacts will be created (when appropriate) + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + var proxyCount = f.m_proxyCount; + for (var i = 0; i < proxyCount; ++i) { + broadPhase.touchProxy(f.m_proxies[i].proxyId); + } + } + }; + Body.prototype.isBullet = function () { + return this.m_bulletFlag; + }; + /** + * Should this body be treated like a bullet for continuous collision detection? + */ + Body.prototype.setBullet = function (flag) { + this.m_bulletFlag = !!flag; + }; + Body.prototype.isSleepingAllowed = function () { + return this.m_autoSleepFlag; + }; + Body.prototype.setSleepingAllowed = function (flag) { + this.m_autoSleepFlag = !!flag; + if (this.m_autoSleepFlag == false) { + this.setAwake(true); + } + }; + Body.prototype.isAwake = function () { + return this.m_awakeFlag; + }; + /** + * Set the sleep state of the body. A sleeping body has very low CPU cost. + * + * @param flag Set to true to wake the body, false to put it to sleep. + */ + Body.prototype.setAwake = function (flag) { + if (flag) { + if (this.m_awakeFlag == false) { + this.m_awakeFlag = true; + this.m_sleepTime = 0.0; + } + } + else { + this.m_awakeFlag = false; + this.m_sleepTime = 0.0; + this.m_linearVelocity.setZero(); + this.m_angularVelocity = 0.0; + this.m_force.setZero(); + this.m_torque = 0.0; + } + }; + Body.prototype.isActive = function () { + return this.m_activeFlag; + }; + /** + * Set the active state of the body. An inactive body is not simulated and + * cannot be collided with or woken up. If you pass a flag of true, all fixtures + * will be added to the broad-phase. If you pass a flag of false, all fixtures + * will be removed from the broad-phase and all contacts will be destroyed. + * Fixtures and joints are otherwise unaffected. + * + * You may continue to create/destroy fixtures and joints on inactive bodies. + * Fixtures on an inactive body are implicitly inactive and will not participate + * in collisions, ray-casts, or queries. Joints connected to an inactive body + * are implicitly inactive. An inactive body is still owned by a World object + * and remains + */ + Body.prototype.setActive = function (flag) { + if (flag == this.m_activeFlag) { + return; + } + this.m_activeFlag = !!flag; + if (this.m_activeFlag) { + // Create all proxies. + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + f.createProxies(broadPhase, this.m_xf); + } + // Contacts are created the next time step. + } + else { + // Destroy all proxies. + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + f.destroyProxies(broadPhase); + } + // Destroy the attached contacts. + var ce = this.m_contactList; + while (ce) { + var ce0 = ce; + ce = ce.next; + this.m_world.destroyContact(ce0.contact); + } + this.m_contactList = null; + } + }; + Body.prototype.isFixedRotation = function () { + return this.m_fixedRotationFlag; + }; + /** + * Set this body to have fixed rotation. This causes the mass to be reset. + */ + Body.prototype.setFixedRotation = function (flag) { + if (this.m_fixedRotationFlag == flag) { + return; + } + this.m_fixedRotationFlag = !!flag; + this.m_angularVelocity = 0.0; + this.resetMassData(); + }; + /** + * Get the world transform for the body's origin. + */ + Body.prototype.getTransform = function () { + return this.m_xf; + }; + /** + * Set the position of the body's origin and rotation. Manipulating a body's + * transform may cause non-physical behavior. Note: contacts are updated on the + * next call to World.step. + * + * @param position The world position of the body's local origin. + * @param angle The world rotation in radians. + */ + Body.prototype.setTransform = function (position, angle) { + if (this.isWorldLocked() == true) { + return; + } + this.m_xf.setNum(position, angle); + this.m_sweep.setTransform(this.m_xf); + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + f.synchronize(broadPhase, this.m_xf, this.m_xf); + } + }; + Body.prototype.synchronizeTransform = function () { + this.m_sweep.getTransform(this.m_xf, 1); + }; + /** + * Update fixtures in broad-phase. + */ + Body.prototype.synchronizeFixtures = function () { + var xf = Transform.identity(); + this.m_sweep.getTransform(xf, 0); + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + f.synchronize(broadPhase, xf, this.m_xf); + } + }; + /** + * Used in TOI. + */ + Body.prototype.advance = function (alpha) { + // Advance to the new safe time. This doesn't sync the broad-phase. + this.m_sweep.advance(alpha); + this.m_sweep.c.setVec2(this.m_sweep.c0); + this.m_sweep.a = this.m_sweep.a0; + this.m_sweep.getTransform(this.m_xf, 1); + }; + /** + * Get the world position for the body's origin. + */ + Body.prototype.getPosition = function () { + return this.m_xf.p; + }; + Body.prototype.setPosition = function (p) { + this.setTransform(p, this.m_sweep.a); + }; + /** + * Get the current world rotation angle in radians. + */ + Body.prototype.getAngle = function () { + return this.m_sweep.a; + }; + Body.prototype.setAngle = function (angle) { + this.setTransform(this.m_xf.p, angle); + }; + /** + * Get the world position of the center of mass. + */ + Body.prototype.getWorldCenter = function () { + return this.m_sweep.c; + }; + /** + * Get the local position of the center of mass. + */ + Body.prototype.getLocalCenter = function () { + return this.m_sweep.localCenter; + }; + /** + * Get the linear velocity of the center of mass. + * + * @return the linear velocity of the center of mass. + */ + Body.prototype.getLinearVelocity = function () { + return this.m_linearVelocity; + }; + /** + * Get the world linear velocity of a world point attached to this body. + * + * @param worldPoint A point in world coordinates. + */ + Body.prototype.getLinearVelocityFromWorldPoint = function (worldPoint) { + var localCenter = Vec2.sub(worldPoint, this.m_sweep.c); + return Vec2.add(this.m_linearVelocity, Vec2.crossNumVec2(this.m_angularVelocity, localCenter)); + }; + /** + * Get the world velocity of a local point. + * + * @param localPoint A point in local coordinates. + */ + Body.prototype.getLinearVelocityFromLocalPoint = function (localPoint) { + return this.getLinearVelocityFromWorldPoint(this.getWorldPoint(localPoint)); + }; + /** + * Set the linear velocity of the center of mass. + * + * @param v The new linear velocity of the center of mass. + */ + Body.prototype.setLinearVelocity = function (v) { + if (this.m_type == STATIC) { + return; + } + if (Vec2.dot(v, v) > 0.0) { + this.setAwake(true); + } + this.m_linearVelocity.setVec2(v); + }; + /** + * Get the angular velocity. + * + * @returns the angular velocity in radians/second. + */ + Body.prototype.getAngularVelocity = function () { + return this.m_angularVelocity; + }; + /** + * Set the angular velocity. + * + * @param omega The new angular velocity in radians/second. + */ + Body.prototype.setAngularVelocity = function (w) { + if (this.m_type == STATIC) { + return; + } + if (w * w > 0.0) { + this.setAwake(true); + } + this.m_angularVelocity = w; + }; + Body.prototype.getLinearDamping = function () { + return this.m_linearDamping; + }; + Body.prototype.setLinearDamping = function (linearDamping) { + this.m_linearDamping = linearDamping; + }; + Body.prototype.getAngularDamping = function () { + return this.m_angularDamping; + }; + Body.prototype.setAngularDamping = function (angularDamping) { + this.m_angularDamping = angularDamping; + }; + Body.prototype.getGravityScale = function () { + return this.m_gravityScale; + }; + /** + * Scale the gravity applied to this body. + */ + Body.prototype.setGravityScale = function (scale) { + this.m_gravityScale = scale; + }; + /** + * Get the total mass of the body. + * + * @returns The mass, usually in kilograms (kg). + */ + Body.prototype.getMass = function () { + return this.m_mass; + }; + /** + * Get the rotational inertia of the body about the local origin. + * + * @return the rotational inertia, usually in kg-m^2. + */ + Body.prototype.getInertia = function () { + return this.m_I + this.m_mass + * Vec2.dot(this.m_sweep.localCenter, this.m_sweep.localCenter); + }; + /** + * Copy the mass data of the body to data. + */ + Body.prototype.getMassData = function (data) { + data.mass = this.m_mass; + data.I = this.getInertia(); + data.center.setVec2(this.m_sweep.localCenter); + }; + /** + * This resets the mass properties to the sum of the mass properties of the + * fixtures. This normally does not need to be called unless you called + * SetMassData to override the mass and you later want to reset the mass. + */ + Body.prototype.resetMassData = function () { + // Compute mass data from shapes. Each shape has its own density. + this.m_mass = 0.0; + this.m_invMass = 0.0; + this.m_I = 0.0; + this.m_invI = 0.0; + this.m_sweep.localCenter.setZero(); + // Static and kinematic bodies have zero mass. + if (this.isStatic() || this.isKinematic()) { + this.m_sweep.c0.setVec2(this.m_xf.p); + this.m_sweep.c.setVec2(this.m_xf.p); + this.m_sweep.a0 = this.m_sweep.a; + return; + } + // Accumulate mass over all fixtures. + var localCenter = Vec2.zero(); + for (var f = this.m_fixtureList; f; f = f.m_next) { + if (f.m_density == 0.0) { + continue; + } + var massData = new MassData(); + f.getMassData(massData); + this.m_mass += massData.mass; + localCenter.addMul(massData.mass, massData.center); + this.m_I += massData.I; + } + // Compute center of mass. + if (this.m_mass > 0.0) { + this.m_invMass = 1.0 / this.m_mass; + localCenter.mul(this.m_invMass); + } + else { + // Force all dynamic bodies to have a positive mass. + this.m_mass = 1.0; + this.m_invMass = 1.0; + } + if (this.m_I > 0.0 && this.m_fixedRotationFlag == false) { + // Center the inertia about the center of mass. + this.m_I -= this.m_mass * Vec2.dot(localCenter, localCenter); + this.m_invI = 1.0 / this.m_I; + } + else { + this.m_I = 0.0; + this.m_invI = 0.0; + } + // Move center of mass. + var oldCenter = Vec2.clone(this.m_sweep.c); + this.m_sweep.setLocalCenter(localCenter, this.m_xf); + // Update center of mass velocity. + this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(this.m_sweep.c, oldCenter))); + }; + /** + * Set the mass properties to override the mass properties of the fixtures. Note + * that this changes the center of mass position. Note that creating or + * destroying fixtures can also alter the mass. This function has no effect if + * the body isn't dynamic. + * + * @param massData The mass properties. + */ + Body.prototype.setMassData = function (massData) { + if (this.isWorldLocked() == true) { + return; + } + if (this.m_type != DYNAMIC) { + return; + } + this.m_invMass = 0.0; + this.m_I = 0.0; + this.m_invI = 0.0; + this.m_mass = massData.mass; + if (this.m_mass <= 0.0) { + this.m_mass = 1.0; + } + this.m_invMass = 1.0 / this.m_mass; + if (massData.I > 0.0 && this.m_fixedRotationFlag == false) { + this.m_I = massData.I - this.m_mass + * Vec2.dot(massData.center, massData.center); + this.m_invI = 1.0 / this.m_I; + } + // Move center of mass. + var oldCenter = Vec2.clone(this.m_sweep.c); + this.m_sweep.setLocalCenter(massData.center, this.m_xf); + // Update center of mass velocity. + this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(this.m_sweep.c, oldCenter))); + }; + /** + * Apply a force at a world point. If the force is not applied at the center of + * mass, it will generate a torque and affect the angular velocity. This wakes + * up the body. + * + * @param force The world force vector, usually in Newtons (N). + * @param point The world position of the point of application. + * @param wake Also wake up the body + */ + Body.prototype.applyForce = function (force, point, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate a force if the body is sleeping. + if (this.m_awakeFlag) { + this.m_force.add(force); + this.m_torque += Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), force); + } + }; + /** + * Apply a force to the center of mass. This wakes up the body. + * + * @param force The world force vector, usually in Newtons (N). + * @param wake Also wake up the body + */ + Body.prototype.applyForceToCenter = function (force, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate a force if the body is sleeping + if (this.m_awakeFlag) { + this.m_force.add(force); + } + }; + /** + * Apply a torque. This affects the angular velocity without affecting the + * linear velocity of the center of mass. This wakes up the body. + * + * @param torque About the z-axis (out of the screen), usually in N-m. + * @param wake Also wake up the body + */ + Body.prototype.applyTorque = function (torque, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate a force if the body is sleeping + if (this.m_awakeFlag) { + this.m_torque += torque; + } + }; + /** + * Apply an impulse at a point. This immediately modifies the velocity. It also + * modifies the angular velocity if the point of application is not at the + * center of mass. This wakes up the body. + * + * @param impulse The world impulse vector, usually in N-seconds or kg-m/s. + * @param point The world position of the point of application. + * @param wake Also wake up the body + */ + Body.prototype.applyLinearImpulse = function (impulse, point, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate velocity if the body is sleeping + if (this.m_awakeFlag) { + this.m_linearVelocity.addMul(this.m_invMass, impulse); + this.m_angularVelocity += this.m_invI * Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), impulse); + } + }; + /** + * Apply an angular impulse. + * + * @param impulse The angular impulse in units of kg*m*m/s + * @param wake Also wake up the body + */ + Body.prototype.applyAngularImpulse = function (impulse, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate velocity if the body is sleeping + if (this.m_awakeFlag) { + this.m_angularVelocity += this.m_invI * impulse; + } + }; + /** + * This is used to prevent connected bodies (by joints) from colliding, + * depending on the joint's collideConnected flag. + */ + Body.prototype.shouldCollide = function (that) { + // At least one body should be dynamic. + if (this.m_type != DYNAMIC && that.m_type != DYNAMIC) { + return false; + } + // Does a joint prevent collision? + for (var jn = this.m_jointList; jn; jn = jn.next) { + if (jn.other == that) { + if (jn.joint.m_collideConnected == false) { + return false; + } + } + } + return true; + }; + /** + * @internal Used for deserialize. + */ + Body.prototype._addFixture = function (fixture) { + if (this.isWorldLocked() == true) { + return null; + } + if (this.m_activeFlag) { + var broadPhase = this.m_world.m_broadPhase; + fixture.createProxies(broadPhase, this.m_xf); + } + fixture.m_next = this.m_fixtureList; + this.m_fixtureList = fixture; + // Adjust mass properties if needed. + if (fixture.m_density > 0.0) { + this.resetMassData(); + } + // Let the world know we have a new fixture. This will cause new contacts + // to be created at the beginning of the next time step. + this.m_world.m_newFixture = true; + return fixture; + }; + // tslint:disable-next-line:typedef + Body.prototype.createFixture = function (shape, fixdef) { + if (this.isWorldLocked() == true) { + return null; + } + var fixture = new Fixture(this, shape, fixdef); + this._addFixture(fixture); + return fixture; + }; + /** + * Destroy a fixture. This removes the fixture from the broad-phase and destroys + * all contacts associated with this fixture. This will automatically adjust the + * mass of the body if the body is dynamic and the fixture has positive density. + * All fixtures attached to a body are implicitly destroyed when the body is + * destroyed. + * + * Warning: This function is locked during callbacks. + * + * @param fixture The fixture to be removed. + */ + Body.prototype.destroyFixture = function (fixture) { + if (this.isWorldLocked() == true) { + return; + } + if (this.m_fixtureList === fixture) { + this.m_fixtureList = fixture.m_next; + } + else { + var node = this.m_fixtureList; + while (node != null) { + if (node.m_next === fixture) { + node.m_next = fixture.m_next; + break; + } + node = node.m_next; + } + } + // Destroy any contacts associated with the fixture. + var edge = this.m_contactList; + while (edge) { + var c = edge.contact; + edge = edge.next; + var fixtureA = c.getFixtureA(); + var fixtureB = c.getFixtureB(); + if (fixture == fixtureA || fixture == fixtureB) { + // This destroys the contact and removes it from + // this body's contact list. + this.m_world.destroyContact(c); + } + } + if (this.m_activeFlag) { + var broadPhase = this.m_world.m_broadPhase; + fixture.destroyProxies(broadPhase); + } + fixture.m_body = null; + fixture.m_next = null; + this.m_world.publish('remove-fixture', fixture); + // Reset the mass data. + this.resetMassData(); + }; + /** + * Get the corresponding world point of a local point. + */ + Body.prototype.getWorldPoint = function (localPoint) { + return Transform.mulVec2(this.m_xf, localPoint); + }; + /** + * Get the corresponding world vector of a local vector. + */ + Body.prototype.getWorldVector = function (localVector) { + return Rot.mulVec2(this.m_xf.q, localVector); + }; + /** + * Gets the corresponding local point of a world point. + */ + Body.prototype.getLocalPoint = function (worldPoint) { + return Transform.mulTVec2(this.m_xf, worldPoint); + }; + /** + * Gets the corresponding local vector of a world vector. + */ + Body.prototype.getLocalVector = function (worldVector) { + return Rot.mulTVec2(this.m_xf.q, worldVector); + }; + /** + * A static body does not move under simulation and behaves as if it has infinite mass. + * Internally, zero is stored for the mass and the inverse mass. + * Static bodies can be moved manually by the user. + * A static body has zero velocity. + * Static bodies do not collide with other static or kinematic bodies. + */ + Body.STATIC = 'static'; + /** + * A kinematic body moves under simulation according to its velocity. + * Kinematic bodies do not respond to forces. + * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity. + * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass. + * Kinematic bodies do not collide with other kinematic or static bodies. + */ + Body.KINEMATIC = 'kinematic'; + /** + * A dynamic body is fully simulated. + * They can be moved manually by the user, but normally they move according to forces. + * A dynamic body can collide with all body types. + * A dynamic body always has finite, non-zero mass. + * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate. + */ + Body.DYNAMIC = 'dynamic'; + return Body; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A joint edge is used to connect bodies and joints together in a joint graph + * where each body is a node and each joint is an edge. A joint edge belongs to + * a doubly linked list maintained in each attached body. Each joint has two + * joint nodes, one for each attached body. + */ +var JointEdge = /** @class */ (function () { + function JointEdge() { + /** + * provides quick access to the other body attached. + */ + this.other = null; + /** + * the joint + */ + this.joint = null; + /** + * prev the previous joint edge in the body's joint list + */ + this.prev = null; + /** + * the next joint edge in the body's joint list + */ + this.next = null; + } + return JointEdge; +}()); +/** + * The base joint class. Joints are used to constraint two bodies together in + * various fashions. Some joints also feature limits and motors. + */ +var Joint = /** @class */ (function () { + function Joint(def, bodyA, bodyB) { + /** @internal */ this.m_type = 'unknown-joint'; + /** @internal */ this.m_prev = null; + /** @internal */ this.m_next = null; + /** @internal */ this.m_edgeA = new JointEdge(); + /** @internal */ this.m_edgeB = new JointEdge(); + /** @internal */ this.m_islandFlag = false; + bodyA = 'bodyA' in def ? def.bodyA : bodyA; + bodyB = 'bodyB' in def ? def.bodyB : bodyB; + this.m_bodyA = bodyA; + this.m_bodyB = bodyB; + this.m_collideConnected = !!def.collideConnected; + this.m_userData = def.userData; + } + /** + * Short-cut function to determine if either body is inactive. + */ + Joint.prototype.isActive = function () { + return this.m_bodyA.isActive() && this.m_bodyB.isActive(); + }; + /** + * Get the type of the concrete joint. + */ + Joint.prototype.getType = function () { + return this.m_type; + }; + /** + * Get the first body attached to this joint. + */ + Joint.prototype.getBodyA = function () { + return this.m_bodyA; + }; + /** + * Get the second body attached to this joint. + */ + Joint.prototype.getBodyB = function () { + return this.m_bodyB; + }; + /** + * Get the next joint the world joint list. + */ + Joint.prototype.getNext = function () { + return this.m_next; + }; + Joint.prototype.getUserData = function () { + return this.m_userData; + }; + Joint.prototype.setUserData = function (data) { + this.m_userData = data; + }; + /** + * Get collide connected. Note: modifying the collide connect flag won't work + * correctly because the flag is only checked when fixture AABBs begin to + * overlap. + */ + Joint.prototype.getCollideConnected = function () { + return this.m_collideConnected; + }; + /** + * Shift the origin for any points stored in world coordinates. + */ + Joint.prototype.shiftOrigin = function (newOrigin) { }; + return Joint; +}()); + +var stats = { + gjkCalls: 0, + gjkIters: 0, + gjkMaxIters: 0, + toiTime: 0, + toiMaxTime: 0, + toiCalls: 0, + toiIters: 0, + toiMaxIters: 0, + toiRootIters: 0, + toiMaxRootIters: 0, + toString: function (newline) { + newline = typeof newline === 'string' ? newline : '\n'; + var string = ""; + // tslint:disable-next-line:no-for-in + for (var name_1 in this) { + if (typeof this[name_1] !== 'function' && typeof this[name_1] !== 'object') { + string += name_1 + ': ' + this[name_1] + newline; + } + } + return string; + } +}; + +var now = function () { + return Date.now(); +}; +var diff = function (time) { + return Date.now() - time; +}; +var Timer = { + now: now, + diff: diff, +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates. + */ +stats.gjkCalls = 0; +stats.gjkIters = 0; +stats.gjkMaxIters = 0; +/** + * Input for Distance. You have to option to use the shape radii in the + * computation. Even + */ +var DistanceInput = /** @class */ (function () { + function DistanceInput() { + this.proxyA = new DistanceProxy(); + this.proxyB = new DistanceProxy(); + this.transformA = null; + this.transformB = null; + this.useRadii = false; + } + return DistanceInput; +}()); +/** + * Output for Distance. + * + * @prop {Vec2} pointA closest point on shapeA + * @prop {Vec2} pointB closest point on shapeB + * @prop distance + * @prop iterations number of GJK iterations used + */ +var DistanceOutput = /** @class */ (function () { + function DistanceOutput() { + this.pointA = Vec2.zero(); + this.pointB = Vec2.zero(); + } + return DistanceOutput; +}()); +/** + * Used to warm start Distance. Set count to zero on first call. + * + * @prop {number} metric length or area + * @prop {array} indexA vertices on shape A + * @prop {array} indexB vertices on shape B + * @prop {number} count + */ +var SimplexCache = /** @class */ (function () { + function SimplexCache() { + this.metric = 0; + this.indexA = []; + this.indexB = []; + this.count = 0; + } + return SimplexCache; +}()); +/** + * Compute the closest points between two shapes. Supports any combination of: + * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On + * the first call set SimplexCache.count to zero. + */ +var Distance = function (output, cache, input) { + ++stats.gjkCalls; + var proxyA = input.proxyA; + var proxyB = input.proxyB; + var xfA = input.transformA; + var xfB = input.transformB; + // Initialize the simplex. + var simplex = new Simplex(); + simplex.readCache(cache, proxyA, xfA, proxyB, xfB); + // Get simplex vertices as an array. + var vertices = simplex.m_v; + var k_maxIters = Settings.maxDistnceIterations; + // These store the vertices of the last simplex so that we + // can check for duplicates and prevent cycling. + var saveA = []; + var saveB = []; // int[3] + var saveCount = 0; + // Main iteration loop. + var iter = 0; + while (iter < k_maxIters) { + // Copy simplex so we can identify duplicates. + saveCount = simplex.m_count; + for (var i = 0; i < saveCount; ++i) { + saveA[i] = vertices[i].indexA; + saveB[i] = vertices[i].indexB; + } + simplex.solve(); + // If we have 3 points, then the origin is in the corresponding triangle. + if (simplex.m_count === 3) { + break; + } + // Compute closest point. + var p = simplex.getClosestPoint(); + p.lengthSquared(); + // Get search direction. + var d = simplex.getSearchDirection(); + // Ensure the search direction is numerically fit. + if (d.lengthSquared() < math.EPSILON * math.EPSILON) { + // The origin is probably contained by a line segment + // or triangle. Thus the shapes are overlapped. + // We can't return zero here even though there may be overlap. + // In case the simplex is a point, segment, or triangle it is difficult + // to determine if the origin is contained in the CSO or very close to it. + break; + } + // Compute a tentative new simplex vertex using support points. + var vertex = vertices[simplex.m_count]; // SimplexVertex + vertex.indexA = proxyA.getSupport(Rot.mulTVec2(xfA.q, Vec2.neg(d))); + vertex.wA = Transform.mulVec2(xfA, proxyA.getVertex(vertex.indexA)); + vertex.indexB = proxyB.getSupport(Rot.mulTVec2(xfB.q, d)); + vertex.wB = Transform.mulVec2(xfB, proxyB.getVertex(vertex.indexB)); + vertex.w = Vec2.sub(vertex.wB, vertex.wA); + // Iteration count is equated to the number of support point calls. + ++iter; + ++stats.gjkIters; + // Check for duplicate support points. This is the main termination + // criteria. + var duplicate = false; + for (var i = 0; i < saveCount; ++i) { + if (vertex.indexA === saveA[i] && vertex.indexB === saveB[i]) { + duplicate = true; + break; + } + } + // If we found a duplicate support point we must exit to avoid cycling. + if (duplicate) { + break; + } + // New vertex is ok and needed. + ++simplex.m_count; + } + stats.gjkMaxIters = math.max(stats.gjkMaxIters, iter); + // Prepare output. + simplex.getWitnessPoints(output.pointA, output.pointB); + output.distance = Vec2.distance(output.pointA, output.pointB); + output.iterations = iter; + // Cache the simplex. + simplex.writeCache(cache); + // Apply radii if requested. + if (input.useRadii) { + var rA = proxyA.m_radius; + var rB = proxyB.m_radius; + if (output.distance > rA + rB && output.distance > math.EPSILON) { + // Shapes are still no overlapped. + // Move the witness points to the outer surface. + output.distance -= rA + rB; + var normal = Vec2.sub(output.pointB, output.pointA); + normal.normalize(); + output.pointA.addMul(rA, normal); + output.pointB.subMul(rB, normal); + } + else { + // Shapes are overlapped when radii are considered. + // Move the witness points to the middle. + var p = Vec2.mid(output.pointA, output.pointB); + output.pointA.setVec2(p); + output.pointB.setVec2(p); + output.distance = 0.0; + } + } +}; +/** + * A distance proxy is used by the GJK algorithm. It encapsulates any shape. + */ +var DistanceProxy = /** @class */ (function () { + function DistanceProxy() { + this.m_buffer = []; // Vec2[2] + this.m_vertices = []; // Vec2[] + this.m_count = 0; + this.m_radius = 0; + } + /** + * Get the vertex count. + */ + DistanceProxy.prototype.getVertexCount = function () { + return this.m_count; + }; + /** + * Get a vertex by index. Used by Distance. + */ + DistanceProxy.prototype.getVertex = function (index) { + return this.m_vertices[index]; + }; + /** + * Get the supporting vertex index in the given direction. + */ + DistanceProxy.prototype.getSupport = function (d) { + var bestIndex = 0; + var bestValue = Vec2.dot(this.m_vertices[0], d); + for (var i = 0; i < this.m_count; ++i) { + var value = Vec2.dot(this.m_vertices[i], d); + if (value > bestValue) { + bestIndex = i; + bestValue = value; + } + } + return bestIndex; + }; + /** + * Get the supporting vertex in the given direction. + */ + DistanceProxy.prototype.getSupportVertex = function (d) { + return this.m_vertices[this.getSupport(d)]; + }; + /** + * Initialize the proxy using the given shape. The shape must remain in scope + * while the proxy is in use. + */ + DistanceProxy.prototype.set = function (shape, index) { + shape.computeDistanceProxy(this, index); + }; + return DistanceProxy; +}()); +var SimplexVertex = /** @class */ (function () { + function SimplexVertex() { + /** support point in proxyA */ + this.wA = Vec2.zero(); + /** support point in proxyB */ + this.wB = Vec2.zero(); + /** wB - wA; */ + this.w = Vec2.zero(); + } + SimplexVertex.prototype.set = function (v) { + this.indexA = v.indexA; + this.indexB = v.indexB; + this.wA = Vec2.clone(v.wA); + this.wB = Vec2.clone(v.wB); + this.w = Vec2.clone(v.w); + this.a = v.a; + }; + return SimplexVertex; +}()); +var Simplex = /** @class */ (function () { + function Simplex() { + this.m_v1 = new SimplexVertex(); + this.m_v2 = new SimplexVertex(); + this.m_v3 = new SimplexVertex(); + this.m_v = [this.m_v1, this.m_v2, this.m_v3]; + this.m_count; + } + /** @internal */ + Simplex.prototype.toString = function () { + if (this.m_count === 3) { + return ["+" + this.m_count, + this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y, + this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y, + this.m_v3.a, this.m_v3.wA.x, this.m_v3.wA.y, this.m_v3.wB.x, this.m_v3.wB.y + ].toString(); + } + else if (this.m_count === 2) { + return ["+" + this.m_count, + this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y, + this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y + ].toString(); + } + else if (this.m_count === 1) { + return ["+" + this.m_count, + this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y + ].toString(); + } + else { + return "+" + this.m_count; + } + }; + Simplex.prototype.readCache = function (cache, proxyA, transformA, proxyB, transformB) { + // Copy data from cache. + this.m_count = cache.count; + for (var i = 0; i < this.m_count; ++i) { + var v = this.m_v[i]; + v.indexA = cache.indexA[i]; + v.indexB = cache.indexB[i]; + var wALocal = proxyA.getVertex(v.indexA); + var wBLocal = proxyB.getVertex(v.indexB); + v.wA = Transform.mulVec2(transformA, wALocal); + v.wB = Transform.mulVec2(transformB, wBLocal); + v.w = Vec2.sub(v.wB, v.wA); + v.a = 0.0; + } + // Compute the new simplex metric, if it is substantially different than + // old metric then flush the simplex. + if (this.m_count > 1) { + var metric1 = cache.metric; + var metric2 = this.getMetric(); + if (metric2 < 0.5 * metric1 || 2.0 * metric1 < metric2 + || metric2 < math.EPSILON) { + // Reset the simplex. + this.m_count = 0; + } + } + // If the cache is empty or invalid... + if (this.m_count === 0) { + var v = this.m_v[0]; + v.indexA = 0; + v.indexB = 0; + var wALocal = proxyA.getVertex(0); + var wBLocal = proxyB.getVertex(0); + v.wA = Transform.mulVec2(transformA, wALocal); + v.wB = Transform.mulVec2(transformB, wBLocal); + v.w = Vec2.sub(v.wB, v.wA); + v.a = 1.0; + this.m_count = 1; + } + }; + Simplex.prototype.writeCache = function (cache) { + cache.metric = this.getMetric(); + cache.count = this.m_count; + for (var i = 0; i < this.m_count; ++i) { + cache.indexA[i] = this.m_v[i].indexA; + cache.indexB[i] = this.m_v[i].indexB; + } + }; + Simplex.prototype.getSearchDirection = function () { + switch (this.m_count) { + case 1: + return Vec2.neg(this.m_v1.w); + case 2: { + var e12 = Vec2.sub(this.m_v2.w, this.m_v1.w); + var sgn = Vec2.crossVec2Vec2(e12, Vec2.neg(this.m_v1.w)); + if (sgn > 0.0) { + // Origin is left of e12. + return Vec2.crossNumVec2(1.0, e12); + } + else { + // Origin is right of e12. + return Vec2.crossVec2Num(e12, 1.0); + } + } + default: + return Vec2.zero(); + } + }; + Simplex.prototype.getClosestPoint = function () { + switch (this.m_count) { + case 0: + return Vec2.zero(); + case 1: + return Vec2.clone(this.m_v1.w); + case 2: + return Vec2.combine(this.m_v1.a, this.m_v1.w, this.m_v2.a, this.m_v2.w); + case 3: + return Vec2.zero(); + default: + return Vec2.zero(); + } + }; + Simplex.prototype.getWitnessPoints = function (pA, pB) { + switch (this.m_count) { + case 0: + break; + case 1: + pA.setVec2(this.m_v1.wA); + pB.setVec2(this.m_v1.wB); + break; + case 2: + pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA); + pB.setCombine(this.m_v1.a, this.m_v1.wB, this.m_v2.a, this.m_v2.wB); + break; + case 3: + pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA); + pA.addMul(this.m_v3.a, this.m_v3.wA); + pB.setVec2(pA); + break; + } + }; + Simplex.prototype.getMetric = function () { + switch (this.m_count) { + case 0: + return 0.0; + case 1: + return 0.0; + case 2: + return Vec2.distance(this.m_v1.w, this.m_v2.w); + case 3: + return Vec2.crossVec2Vec2(Vec2.sub(this.m_v2.w, this.m_v1.w), Vec2.sub(this.m_v3.w, this.m_v1.w)); + default: + return 0.0; + } + }; + Simplex.prototype.solve = function () { + switch (this.m_count) { + case 1: + break; + case 2: + this.solve2(); + break; + case 3: + this.solve3(); + break; + } + }; + // Solve a line segment using barycentric coordinates. + // + // p = a1 * w1 + a2 * w2 + // a1 + a2 = 1 + // + // The vector from the origin to the closest point on the line is + // perpendicular to the line. + // e12 = w2 - w1 + // dot(p, e) = 0 + // a1 * dot(w1, e) + a2 * dot(w2, e) = 0 + // + // 2-by-2 linear system + // [1 1 ][a1] = [1] + // [w1.e12 w2.e12][a2] = [0] + // + // Define + // d12_1 = dot(w2, e12) + // d12_2 = -dot(w1, e12) + // d12 = d12_1 + d12_2 + // + // Solution + // a1 = d12_1 / d12 + // a2 = d12_2 / d12 + Simplex.prototype.solve2 = function () { + var w1 = this.m_v1.w; + var w2 = this.m_v2.w; + var e12 = Vec2.sub(w2, w1); + // w1 region + var d12_2 = -Vec2.dot(w1, e12); + if (d12_2 <= 0.0) { + // a2 <= 0, so we clamp it to 0 + this.m_v1.a = 1.0; + this.m_count = 1; + return; + } + // w2 region + var d12_1 = Vec2.dot(w2, e12); + if (d12_1 <= 0.0) { + // a1 <= 0, so we clamp it to 0 + this.m_v2.a = 1.0; + this.m_count = 1; + this.m_v1.set(this.m_v2); + return; + } + // Must be in e12 region. + var inv_d12 = 1.0 / (d12_1 + d12_2); + this.m_v1.a = d12_1 * inv_d12; + this.m_v2.a = d12_2 * inv_d12; + this.m_count = 2; + }; + // Possible regions: + // - points[2] + // - edge points[0]-points[2] + // - edge points[1]-points[2] + // - inside the triangle + Simplex.prototype.solve3 = function () { + var w1 = this.m_v1.w; + var w2 = this.m_v2.w; + var w3 = this.m_v3.w; + // Edge12 + // [1 1 ][a1] = [1] + // [w1.e12 w2.e12][a2] = [0] + // a3 = 0 + var e12 = Vec2.sub(w2, w1); + var w1e12 = Vec2.dot(w1, e12); + var w2e12 = Vec2.dot(w2, e12); + var d12_1 = w2e12; + var d12_2 = -w1e12; + // Edge13 + // [1 1 ][a1] = [1] + // [w1.e13 w3.e13][a3] = [0] + // a2 = 0 + var e13 = Vec2.sub(w3, w1); + var w1e13 = Vec2.dot(w1, e13); + var w3e13 = Vec2.dot(w3, e13); + var d13_1 = w3e13; + var d13_2 = -w1e13; + // Edge23 + // [1 1 ][a2] = [1] + // [w2.e23 w3.e23][a3] = [0] + // a1 = 0 + var e23 = Vec2.sub(w3, w2); + var w2e23 = Vec2.dot(w2, e23); + var w3e23 = Vec2.dot(w3, e23); + var d23_1 = w3e23; + var d23_2 = -w2e23; + // Triangle123 + var n123 = Vec2.crossVec2Vec2(e12, e13); + var d123_1 = n123 * Vec2.crossVec2Vec2(w2, w3); + var d123_2 = n123 * Vec2.crossVec2Vec2(w3, w1); + var d123_3 = n123 * Vec2.crossVec2Vec2(w1, w2); + // w1 region + if (d12_2 <= 0.0 && d13_2 <= 0.0) { + this.m_v1.a = 1.0; + this.m_count = 1; + return; + } + // e12 + if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) { + var inv_d12 = 1.0 / (d12_1 + d12_2); + this.m_v1.a = d12_1 * inv_d12; + this.m_v2.a = d12_2 * inv_d12; + this.m_count = 2; + return; + } + // e13 + if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) { + var inv_d13 = 1.0 / (d13_1 + d13_2); + this.m_v1.a = d13_1 * inv_d13; + this.m_v3.a = d13_2 * inv_d13; + this.m_count = 2; + this.m_v2.set(this.m_v3); + return; + } + // w2 region + if (d12_1 <= 0.0 && d23_2 <= 0.0) { + this.m_v2.a = 1.0; + this.m_count = 1; + this.m_v1.set(this.m_v2); + return; + } + // w3 region + if (d13_1 <= 0.0 && d23_1 <= 0.0) { + this.m_v3.a = 1.0; + this.m_count = 1; + this.m_v1.set(this.m_v3); + return; + } + // e23 + if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) { + var inv_d23 = 1.0 / (d23_1 + d23_2); + this.m_v2.a = d23_1 * inv_d23; + this.m_v3.a = d23_2 * inv_d23; + this.m_count = 2; + this.m_v1.set(this.m_v3); + return; + } + // Must be in triangle123 + var inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3); + this.m_v1.a = d123_1 * inv_d123; + this.m_v2.a = d123_2 * inv_d123; + this.m_v3.a = d123_3 * inv_d123; + this.m_count = 3; + }; + return Simplex; +}()); +/** + * Determine if two generic shapes overlap. + */ +var testOverlap = function (shapeA, indexA, shapeB, indexB, xfA, xfB) { + var input = new DistanceInput(); + input.proxyA.set(shapeA, indexA); + input.proxyB.set(shapeB, indexB); + input.transformA = xfA; + input.transformB = xfB; + input.useRadii = true; + var cache = new SimplexCache(); + var output = new DistanceOutput(); + Distance(output, cache, input); + return output.distance < 10.0 * math.EPSILON; +}; +// legacy exports +Distance.testOverlap = testOverlap; +Distance.Input = DistanceInput; +Distance.Output = DistanceOutput; +Distance.Proxy = DistanceProxy; +Distance.Cache = SimplexCache; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * Input parameters for TimeOfImpact. + */ +var TOIInput = /** @class */ (function () { + function TOIInput() { + this.proxyA = new DistanceProxy(); + this.proxyB = new DistanceProxy(); + this.sweepA = new Sweep(); + this.sweepB = new Sweep(); + } + return TOIInput; +}()); +exports.TOIOutputState = void 0; +(function (TOIOutputState) { + TOIOutputState[TOIOutputState["e_unknown"] = 0] = "e_unknown"; + TOIOutputState[TOIOutputState["e_failed"] = 1] = "e_failed"; + TOIOutputState[TOIOutputState["e_overlapped"] = 2] = "e_overlapped"; + TOIOutputState[TOIOutputState["e_touching"] = 3] = "e_touching"; + TOIOutputState[TOIOutputState["e_separated"] = 4] = "e_separated"; +})(exports.TOIOutputState || (exports.TOIOutputState = {})); +/** + * Output parameters for TimeOfImpact. + */ +var TOIOutput = /** @class */ (function () { + function TOIOutput() { + } + return TOIOutput; +}()); +stats.toiTime = 0; +stats.toiMaxTime = 0; +stats.toiCalls = 0; +stats.toiIters = 0; +stats.toiMaxIters = 0; +stats.toiRootIters = 0; +stats.toiMaxRootIters = 0; +/** + * Compute the upper bound on time before two shapes penetrate. Time is + * represented as a fraction between [0,tMax]. This uses a swept separating axis + * and may miss some intermediate, non-tunneling collision. If you change the + * time interval, you should call this function again. + * + * Note: use Distance to compute the contact point and normal at the time of + * impact. + * + * CCD via the local separating axis method. This seeks progression by computing + * the largest time at which separation is maintained. + */ +var TimeOfImpact = function (output, input) { + var timer = Timer.now(); + ++stats.toiCalls; + output.state = exports.TOIOutputState.e_unknown; + output.t = input.tMax; + var proxyA = input.proxyA; // DistanceProxy + var proxyB = input.proxyB; // DistanceProxy + var sweepA = input.sweepA; // Sweep + var sweepB = input.sweepB; // Sweep + // Large rotations can make the root finder fail, so we normalize the + // sweep angles. + sweepA.normalize(); + sweepB.normalize(); + var tMax = input.tMax; + var totalRadius = proxyA.m_radius + proxyB.m_radius; + var target = math.max(Settings.linearSlop, totalRadius - 3.0 * Settings.linearSlop); + var tolerance = 0.25 * Settings.linearSlop; + var t1 = 0.0; + var k_maxIterations = Settings.maxTOIIterations; + var iter = 0; + // Prepare input for distance query. + var cache = new SimplexCache(); + var distanceInput = new DistanceInput(); + distanceInput.proxyA = input.proxyA; + distanceInput.proxyB = input.proxyB; + distanceInput.useRadii = false; + // The outer loop progressively attempts to compute new separating axes. + // This loop terminates when an axis is repeated (no progress is made). + while (true) { + var xfA = Transform.identity(); + var xfB = Transform.identity(); + sweepA.getTransform(xfA, t1); + sweepB.getTransform(xfB, t1); + // Get the distance between shapes. We can also use the results + // to get a separating axis. + distanceInput.transformA = xfA; + distanceInput.transformB = xfB; + var distanceOutput = new DistanceOutput(); + Distance(distanceOutput, cache, distanceInput); + // If the shapes are overlapped, we give up on continuous collision. + if (distanceOutput.distance <= 0.0) { + // Failure! + output.state = exports.TOIOutputState.e_overlapped; + output.t = 0.0; + break; + } + if (distanceOutput.distance < target + tolerance) { + // Victory! + output.state = exports.TOIOutputState.e_touching; + output.t = t1; + break; + } + // Initialize the separating axis. + var fcn = new SeparationFunction(); + fcn.initialize(cache, proxyA, sweepA, proxyB, sweepB, t1); + // if (false) { + // // Dump the curve seen by the root finder + // const N = 100; + // const dx = 1.0 / N; + // const xs = []; // [ N + 1 ]; + // const fs = []; // [ N + 1 ]; + // const x = 0.0; + // for (const i = 0; i <= N; ++i) { + // sweepA.getTransform(xfA, x); + // sweepB.getTransform(xfB, x); + // const f = fcn.evaluate(xfA, xfB) - target; + // printf("%g %g\n", x, f); + // xs[i] = x; + // fs[i] = f; + // x += dx; + // } + // } + // Compute the TOI on the separating axis. We do this by successively + // resolving the deepest point. This loop is bounded by the number of + // vertices. + var done = false; + var t2 = tMax; + var pushBackIter = 0; + while (true) { + // Find the deepest point at t2. Store the witness point indices. + var s2 = fcn.findMinSeparation(t2); + // const indexA = fcn.indexA; + // const indexB = fcn.indexB; + // Is the final configuration separated? + if (s2 > target + tolerance) { + // Victory! + output.state = exports.TOIOutputState.e_separated; + output.t = tMax; + done = true; + break; + } + // Has the separation reached tolerance? + if (s2 > target - tolerance) { + // Advance the sweeps + t1 = t2; + break; + } + // Compute the initial separation of the witness points. + var s1 = fcn.evaluate(t1); + // const indexA = fcn.indexA; + // const indexB = fcn.indexB; + // Check for initial overlap. This might happen if the root finder + // runs out of iterations. + if (s1 < target - tolerance) { + output.state = exports.TOIOutputState.e_failed; + output.t = t1; + done = true; + break; + } + // Check for touching + if (s1 <= target + tolerance) { + // Victory! t1 should hold the TOI (could be 0.0). + output.state = exports.TOIOutputState.e_touching; + output.t = t1; + done = true; + break; + } + // Compute 1D root of: f(x) - target = 0 + var rootIterCount = 0; + var a1 = t1; + var a2 = t2; + while (true) { + // Use a mix of the secant rule and bisection. + var t = void 0; + if (rootIterCount & 1) { + // Secant rule to improve convergence. + t = a1 + (target - s1) * (a2 - a1) / (s2 - s1); + } + else { + // Bisection to guarantee progress. + t = 0.5 * (a1 + a2); + } + ++rootIterCount; + ++stats.toiRootIters; + var s = fcn.evaluate(t); + fcn.indexA; + fcn.indexB; + if (math.abs(s - target) < tolerance) { + // t2 holds a tentative value for t1 + t2 = t; + break; + } + // Ensure we continue to bracket the root. + if (s > target) { + a1 = t; + s1 = s; + } + else { + a2 = t; + s2 = s; + } + if (rootIterCount === 50) { + break; + } + } + stats.toiMaxRootIters = math.max(stats.toiMaxRootIters, rootIterCount); + ++pushBackIter; + if (pushBackIter === Settings.maxPolygonVertices) { + break; + } + } + ++iter; + ++stats.toiIters; + if (done) { + break; + } + if (iter === k_maxIterations) { + // Root finder got stuck. Semi-victory. + output.state = exports.TOIOutputState.e_failed; + output.t = t1; + break; + } + } + stats.toiMaxIters = math.max(stats.toiMaxIters, iter); + var time = Timer.diff(timer); + stats.toiMaxTime = math.max(stats.toiMaxTime, time); + stats.toiTime += time; +}; +var SeparationFunctionType; +(function (SeparationFunctionType) { + SeparationFunctionType[SeparationFunctionType["e_points"] = 1] = "e_points"; + SeparationFunctionType[SeparationFunctionType["e_faceA"] = 2] = "e_faceA"; + SeparationFunctionType[SeparationFunctionType["e_faceB"] = 3] = "e_faceB"; +})(SeparationFunctionType || (SeparationFunctionType = {})); +var SeparationFunction = /** @class */ (function () { + function SeparationFunction() { + this.m_proxyA = new DistanceProxy(); + this.m_proxyB = new DistanceProxy(); + this.m_localPoint = Vec2.zero(); + this.m_axis = Vec2.zero(); + } + // TODO_ERIN might not need to return the separation + SeparationFunction.prototype.initialize = function (cache, proxyA, sweepA, proxyB, sweepB, t1) { + this.m_proxyA = proxyA; + this.m_proxyB = proxyB; + var count = cache.count; + this.m_sweepA = sweepA; + this.m_sweepB = sweepB; + var xfA = Transform.identity(); + var xfB = Transform.identity(); + this.m_sweepA.getTransform(xfA, t1); + this.m_sweepB.getTransform(xfB, t1); + if (count === 1) { + this.m_type = SeparationFunctionType.e_points; + var localPointA = this.m_proxyA.getVertex(cache.indexA[0]); + var localPointB = this.m_proxyB.getVertex(cache.indexB[0]); + var pointA = Transform.mulVec2(xfA, localPointA); + var pointB = Transform.mulVec2(xfB, localPointB); + this.m_axis.setCombine(1, pointB, -1, pointA); + var s = this.m_axis.normalize(); + return s; + } + else if (cache.indexA[0] === cache.indexA[1]) { + // Two points on B and one on A. + this.m_type = SeparationFunctionType.e_faceB; + var localPointB1 = proxyB.getVertex(cache.indexB[0]); + var localPointB2 = proxyB.getVertex(cache.indexB[1]); + this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointB2, localPointB1), 1.0); + this.m_axis.normalize(); + var normal = Rot.mulVec2(xfB.q, this.m_axis); + this.m_localPoint = Vec2.mid(localPointB1, localPointB2); + var pointB = Transform.mulVec2(xfB, this.m_localPoint); + var localPointA = proxyA.getVertex(cache.indexA[0]); + var pointA = Transform.mulVec2(xfA, localPointA); + var s = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal); + if (s < 0.0) { + this.m_axis = Vec2.neg(this.m_axis); + s = -s; + } + return s; + } + else { + // Two points on A and one or two points on B. + this.m_type = SeparationFunctionType.e_faceA; + var localPointA1 = this.m_proxyA.getVertex(cache.indexA[0]); + var localPointA2 = this.m_proxyA.getVertex(cache.indexA[1]); + this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointA2, localPointA1), 1.0); + this.m_axis.normalize(); + var normal = Rot.mulVec2(xfA.q, this.m_axis); + this.m_localPoint = Vec2.mid(localPointA1, localPointA2); + var pointA = Transform.mulVec2(xfA, this.m_localPoint); + var localPointB = this.m_proxyB.getVertex(cache.indexB[0]); + var pointB = Transform.mulVec2(xfB, localPointB); + var s = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal); + if (s < 0.0) { + this.m_axis = Vec2.neg(this.m_axis); + s = -s; + } + return s; + } + }; + SeparationFunction.prototype.compute = function (find, t) { + // It was findMinSeparation and evaluate + var xfA = Transform.identity(); + var xfB = Transform.identity(); + this.m_sweepA.getTransform(xfA, t); + this.m_sweepB.getTransform(xfB, t); + switch (this.m_type) { + case SeparationFunctionType.e_points: { + if (find) { + var axisA = Rot.mulTVec2(xfA.q, this.m_axis); + var axisB = Rot.mulTVec2(xfB.q, Vec2.neg(this.m_axis)); + this.indexA = this.m_proxyA.getSupport(axisA); + this.indexB = this.m_proxyB.getSupport(axisB); + } + var localPointA = this.m_proxyA.getVertex(this.indexA); + var localPointB = this.m_proxyB.getVertex(this.indexB); + var pointA = Transform.mulVec2(xfA, localPointA); + var pointB = Transform.mulVec2(xfB, localPointB); + var sep = Vec2.dot(pointB, this.m_axis) - Vec2.dot(pointA, this.m_axis); + return sep; + } + case SeparationFunctionType.e_faceA: { + var normal = Rot.mulVec2(xfA.q, this.m_axis); + var pointA = Transform.mulVec2(xfA, this.m_localPoint); + if (find) { + var axisB = Rot.mulTVec2(xfB.q, Vec2.neg(normal)); + this.indexA = -1; + this.indexB = this.m_proxyB.getSupport(axisB); + } + var localPointB = this.m_proxyB.getVertex(this.indexB); + var pointB = Transform.mulVec2(xfB, localPointB); + var sep = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal); + return sep; + } + case SeparationFunctionType.e_faceB: { + var normal = Rot.mulVec2(xfB.q, this.m_axis); + var pointB = Transform.mulVec2(xfB, this.m_localPoint); + if (find) { + var axisA = Rot.mulTVec2(xfA.q, Vec2.neg(normal)); + this.indexB = -1; + this.indexA = this.m_proxyA.getSupport(axisA); + } + var localPointA = this.m_proxyA.getVertex(this.indexA); + var pointA = Transform.mulVec2(xfA, localPointA); + var sep = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal); + return sep; + } + default: + if (find) { + this.indexA = -1; + this.indexB = -1; + } + return 0.0; + } + }; + SeparationFunction.prototype.findMinSeparation = function (t) { + return this.compute(true, t); + }; + SeparationFunction.prototype.evaluate = function (t) { + return this.compute(false, t); + }; + return SeparationFunction; +}()); +new SeparationFunction(); +// legacy exports +TimeOfImpact.Input = TOIInput; +TimeOfImpact.Output = TOIOutput; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var TimeStep = /** @class */ (function () { + function TimeStep() { + /** time step */ + this.dt = 0; + /** inverse time step (0 if dt == 0) */ + this.inv_dt = 0; + this.velocityIterations = 0; + this.positionIterations = 0; + this.warmStarting = false; + this.blockSolve = true; + /** timestep ratio for variable timestep */ + this.inv_dt0 = 0.0; + /** dt * inv_dt0 */ + this.dtRatio = 1; + } + TimeStep.prototype.reset = function (dt) { + if (this.dt > 0.0) { + this.inv_dt0 = this.inv_dt; + } + this.dt = dt; + this.inv_dt = dt == 0 ? 0 : 1 / dt; + this.dtRatio = dt * this.inv_dt0; + }; + return TimeStep; +}()); +// reuse +var s_subStep = new TimeStep(); +/** + * Contact impulses for reporting. Impulses are used instead of forces because + * sub-step forces may approach infinity for rigid body collisions. These match + * up one-to-one with the contact points in Manifold. + */ +var ContactImpulse = /** @class */ (function () { + function ContactImpulse(contact) { + this.contact = contact; + this.normals = []; + this.tangents = []; + } + Object.defineProperty(ContactImpulse.prototype, "normalImpulses", { + get: function () { + var contact = this.contact; + var normals = this.normals; + normals.length = 0; + for (var p = 0; p < contact.v_points.length; ++p) { + normals.push(contact.v_points[p].normalImpulse); + } + return normals; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContactImpulse.prototype, "tangentImpulses", { + get: function () { + var contact = this.contact; + var tangents = this.tangents; + tangents.length = 0; + for (var p = 0; p < contact.v_points.length; ++p) { + tangents.push(contact.v_points[p].tangentImpulse); + } + return tangents; + }, + enumerable: false, + configurable: true + }); + return ContactImpulse; +}()); +/** + * Finds and solves islands. An island is a connected subset of the world. + */ +var Solver = /** @class */ (function () { + function Solver(world) { + this.m_world = world; + this.m_stack = []; + this.m_bodies = []; + this.m_contacts = []; + this.m_joints = []; + } + Solver.prototype.clear = function () { + this.m_stack.length = 0; + this.m_bodies.length = 0; + this.m_contacts.length = 0; + this.m_joints.length = 0; + }; + Solver.prototype.addBody = function (body) { + this.m_bodies.push(body); + // why? + // body.c_position.c.setZero(); + // body.c_position.a = 0; + // body.c_velocity.v.setZero(); + // body.c_velocity.w = 0; + }; + Solver.prototype.addContact = function (contact) { + // false && console.assert(contact instanceof Contact, 'Not a Contact!', contact); + this.m_contacts.push(contact); + }; + Solver.prototype.addJoint = function (joint) { + this.m_joints.push(joint); + }; + Solver.prototype.solveWorld = function (step) { + var world = this.m_world; + // Clear all the island flags. + for (var b = world.m_bodyList; b; b = b.m_next) { + b.m_islandFlag = false; + } + for (var c = world.m_contactList; c; c = c.m_next) { + c.m_islandFlag = false; + } + for (var j = world.m_jointList; j; j = j.m_next) { + j.m_islandFlag = false; + } + // Build and simulate all awake islands. + var stack = this.m_stack; + for (var seed = world.m_bodyList; seed; seed = seed.m_next) { + if (seed.m_islandFlag) { + continue; + } + if (seed.isAwake() == false || seed.isActive() == false) { + continue; + } + // The seed can be dynamic or kinematic. + if (seed.isStatic()) { + continue; + } + // Reset island and stack. + this.clear(); + stack.push(seed); + seed.m_islandFlag = true; + // Perform a depth first search (DFS) on the constraint graph. + while (stack.length > 0) { + // Grab the next body off the stack and add it to the island. + var b = stack.pop(); + this.addBody(b); + // Make sure the body is awake. + b.setAwake(true); + // To keep islands as small as possible, we don't + // propagate islands across static bodies. + if (b.isStatic()) { + continue; + } + // Search all contacts connected to this body. + for (var ce = b.m_contactList; ce; ce = ce.next) { + var contact = ce.contact; + // Has this contact already been added to an island? + if (contact.m_islandFlag) { + continue; + } + // Is this contact solid and touching? + if (contact.isEnabled() == false || contact.isTouching() == false) { + continue; + } + // Skip sensors. + var sensorA = contact.m_fixtureA.m_isSensor; + var sensorB = contact.m_fixtureB.m_isSensor; + if (sensorA || sensorB) { + continue; + } + this.addContact(contact); + contact.m_islandFlag = true; + var other = ce.other; + // Was the other body already added to this island? + if (other.m_islandFlag) { + continue; + } + // false && console.assert(stack.length < world.m_bodyCount); + stack.push(other); + other.m_islandFlag = true; + } + // Search all joints connect to this body. + for (var je = b.m_jointList; je; je = je.next) { + if (je.joint.m_islandFlag == true) { + continue; + } + var other = je.other; + // Don't simulate joints connected to inactive bodies. + if (other.isActive() == false) { + continue; + } + this.addJoint(je.joint); + je.joint.m_islandFlag = true; + if (other.m_islandFlag) { + continue; + } + // false && console.assert(stack.length < world.m_bodyCount); + stack.push(other); + other.m_islandFlag = true; + } + } + this.solveIsland(step); + // Post solve cleanup. + for (var i = 0; i < this.m_bodies.length; ++i) { + // Allow static bodies to participate in other islands. + // TODO: are they added at all? + var b = this.m_bodies[i]; + if (b.isStatic()) { + b.m_islandFlag = false; + } + } + } + }; + Solver.prototype.solveIsland = function (step) { + // B2: Island Solve + var world = this.m_world; + var gravity = world.m_gravity; + var allowSleep = world.m_allowSleep; + var h = step.dt; + // Integrate velocities and apply damping. Initialize the body state. + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + var c = Vec2.clone(body.m_sweep.c); + var a = body.m_sweep.a; + var v = Vec2.clone(body.m_linearVelocity); + var w = body.m_angularVelocity; + // Store positions for continuous collision. + body.m_sweep.c0.setVec2(body.m_sweep.c); + body.m_sweep.a0 = body.m_sweep.a; + if (body.isDynamic()) { + // Integrate velocities. + v.addMul(h * body.m_gravityScale, gravity); + v.addMul(h * body.m_invMass, body.m_force); + w += h * body.m_invI * body.m_torque; + /** + *
+                 * Apply damping.
+                 * ODE: dv/dt + c * v = 0
+                 * Solution: v(t) = v0 * exp(-c * t)
+                 * Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)
+                 * v2 = exp(-c * dt) * v1
+                 * Pade approximation:
+                 * v2 = v1 * 1 / (1 + c * dt)
+                 * 
+ */ + v.mul(1.0 / (1.0 + h * body.m_linearDamping)); + w *= 1.0 / (1.0 + h * body.m_angularDamping); + } + body.c_position.c = c; + body.c_position.a = a; + body.c_velocity.v = v; + body.c_velocity.w = w; + } + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.initConstraint(step); + } + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.initVelocityConstraint(step); + } + if (step.warmStarting) { + // Warm start. + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.warmStartConstraint(step); + } + } + for (var i = 0; i < this.m_joints.length; ++i) { + var joint = this.m_joints[i]; + joint.initVelocityConstraints(step); + } + // Solve velocity constraints + for (var i = 0; i < step.velocityIterations; ++i) { + for (var j = 0; j < this.m_joints.length; ++j) { + var joint = this.m_joints[j]; + joint.solveVelocityConstraints(step); + } + for (var j = 0; j < this.m_contacts.length; ++j) { + var contact = this.m_contacts[j]; + contact.solveVelocityConstraint(step); + } + } + // Store impulses for warm starting + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.storeConstraintImpulses(step); + } + // Integrate positions + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + var c = Vec2.clone(body.c_position.c); + var a = body.c_position.a; + var v = Vec2.clone(body.c_velocity.v); + var w = body.c_velocity.w; + // Check for large velocities + var translation = Vec2.mulNumVec2(h, v); + if (Vec2.lengthSquared(translation) > Settings.maxTranslationSquared) { + var ratio = Settings.maxTranslation / translation.length(); + v.mul(ratio); + } + var rotation = h * w; + if (rotation * rotation > Settings.maxRotationSquared) { + var ratio = Settings.maxRotation / math.abs(rotation); + w *= ratio; + } + // Integrate + c.addMul(h, v); + a += h * w; + body.c_position.c.setVec2(c); + body.c_position.a = a; + body.c_velocity.v.setVec2(v); + body.c_velocity.w = w; + } + // Solve position constraints + var positionSolved = false; + for (var i = 0; i < step.positionIterations; ++i) { + var minSeparation = 0.0; + for (var j = 0; j < this.m_contacts.length; ++j) { + var contact = this.m_contacts[j]; + var separation = contact.solvePositionConstraint(step); + minSeparation = math.min(minSeparation, separation); + } + // We can't expect minSpeparation >= -Settings.linearSlop because we don't + // push the separation above -Settings.linearSlop. + var contactsOkay = minSeparation >= -3.0 * Settings.linearSlop; + var jointsOkay = true; + for (var j = 0; j < this.m_joints.length; ++j) { + var joint = this.m_joints[j]; + var jointOkay = joint.solvePositionConstraints(step); + jointsOkay = jointsOkay && jointOkay; + } + if (contactsOkay && jointsOkay) { + // Exit early if the position errors are small. + positionSolved = true; + break; + } + } + // Copy state buffers back to the bodies + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + body.m_sweep.c.setVec2(body.c_position.c); + body.m_sweep.a = body.c_position.a; + body.m_linearVelocity.setVec2(body.c_velocity.v); + body.m_angularVelocity = body.c_velocity.w; + body.synchronizeTransform(); + } + this.postSolveIsland(); + if (allowSleep) { + var minSleepTime = Infinity; + var linTolSqr = Settings.linearSleepToleranceSqr; + var angTolSqr = Settings.angularSleepToleranceSqr; + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + if (body.isStatic()) { + continue; + } + if ((body.m_autoSleepFlag == false) + || (body.m_angularVelocity * body.m_angularVelocity > angTolSqr) + || (Vec2.lengthSquared(body.m_linearVelocity) > linTolSqr)) { + body.m_sleepTime = 0.0; + minSleepTime = 0.0; + } + else { + body.m_sleepTime += h; + minSleepTime = math.min(minSleepTime, body.m_sleepTime); + } + } + if (minSleepTime >= Settings.timeToSleep && positionSolved) { + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + body.setAwake(false); + } + } + } + }; + /** + * Find TOI contacts and solve them. + */ + Solver.prototype.solveWorldTOI = function (step) { + var world = this.m_world; + if (world.m_stepComplete) { + for (var b = world.m_bodyList; b; b = b.m_next) { + b.m_islandFlag = false; + b.m_sweep.alpha0 = 0.0; + } + for (var c = world.m_contactList; c; c = c.m_next) { + // Invalidate TOI + c.m_toiFlag = false; + c.m_islandFlag = false; + c.m_toiCount = 0; + c.m_toi = 1.0; + } + } + // Find TOI events and solve them. + while (true) { + // Find the first TOI. + var minContact = null; // Contact + var minAlpha = 1.0; + for (var c = world.m_contactList; c; c = c.m_next) { + // Is this contact disabled? + if (c.isEnabled() == false) { + continue; + } + // Prevent excessive sub-stepping. + if (c.m_toiCount > Settings.maxSubSteps) { + continue; + } + var alpha = 1.0; + if (c.m_toiFlag) { + // This contact has a valid cached TOI. + alpha = c.m_toi; + } + else { + var fA_1 = c.getFixtureA(); + var fB_1 = c.getFixtureB(); + // Is there a sensor? + if (fA_1.isSensor() || fB_1.isSensor()) { + continue; + } + var bA_1 = fA_1.getBody(); + var bB_1 = fB_1.getBody(); + var activeA = bA_1.isAwake() && !bA_1.isStatic(); + var activeB = bB_1.isAwake() && !bB_1.isStatic(); + // Is at least one body active (awake and dynamic or kinematic)? + if (activeA == false && activeB == false) { + continue; + } + var collideA = bA_1.isBullet() || !bA_1.isDynamic(); + var collideB = bB_1.isBullet() || !bB_1.isDynamic(); + // Are these two non-bullet dynamic bodies? + if (collideA == false && collideB == false) { + continue; + } + // Compute the TOI for this contact. + // Put the sweeps onto the same time interval. + var alpha0 = bA_1.m_sweep.alpha0; + if (bA_1.m_sweep.alpha0 < bB_1.m_sweep.alpha0) { + alpha0 = bB_1.m_sweep.alpha0; + bA_1.m_sweep.advance(alpha0); + } + else if (bB_1.m_sweep.alpha0 < bA_1.m_sweep.alpha0) { + alpha0 = bA_1.m_sweep.alpha0; + bB_1.m_sweep.advance(alpha0); + } + var indexA = c.getChildIndexA(); + var indexB = c.getChildIndexB(); + bA_1.m_sweep; + bB_1.m_sweep; + // Compute the time of impact in interval [0, minTOI] + var input = new TOIInput(); // TODO: reuse + input.proxyA.set(fA_1.getShape(), indexA); + input.proxyB.set(fB_1.getShape(), indexB); + input.sweepA.set(bA_1.m_sweep); + input.sweepB.set(bB_1.m_sweep); + input.tMax = 1.0; + var output = new TOIOutput(); // TODO: reuse + TimeOfImpact(output, input); + // Beta is the fraction of the remaining portion of the [time?]. + var beta = output.t; + if (output.state == exports.TOIOutputState.e_touching) { + alpha = math.min(alpha0 + (1.0 - alpha0) * beta, 1.0); + } + else { + alpha = 1.0; + } + c.m_toi = alpha; + c.m_toiFlag = true; + } + if (alpha < minAlpha) { + // This is the minimum TOI found so far. + minContact = c; + minAlpha = alpha; + } + } + if (minContact == null || 1.0 - 10.0 * math.EPSILON < minAlpha) { + // No more TOI events. Done! + world.m_stepComplete = true; + break; + } + // Advance the bodies to the TOI. + var fA = minContact.getFixtureA(); + var fB = minContact.getFixtureB(); + var bA = fA.getBody(); + var bB = fB.getBody(); + var backup1 = bA.m_sweep.clone(); + var backup2 = bB.m_sweep.clone(); + bA.advance(minAlpha); + bB.advance(minAlpha); + // The TOI contact likely has some new contact points. + minContact.update(world); + minContact.m_toiFlag = false; + ++minContact.m_toiCount; + // Is the contact solid? + if (minContact.isEnabled() == false || minContact.isTouching() == false) { + // Restore the sweeps. + minContact.setEnabled(false); + bA.m_sweep.set(backup1); + bB.m_sweep.set(backup2); + bA.synchronizeTransform(); + bB.synchronizeTransform(); + continue; + } + bA.setAwake(true); + bB.setAwake(true); + // Build the island + this.clear(); + this.addBody(bA); + this.addBody(bB); + this.addContact(minContact); + bA.m_islandFlag = true; + bB.m_islandFlag = true; + minContact.m_islandFlag = true; + // Get contacts on bodyA and bodyB. + var bodies = [bA, bB]; + for (var i = 0; i < bodies.length; ++i) { + var body = bodies[i]; + if (body.isDynamic()) { + for (var ce = body.m_contactList; ce; ce = ce.next) { + // if (this.m_bodyCount == this.m_bodyCapacity) { break; } + // if (this.m_contactCount == this.m_contactCapacity) { break; } + var contact = ce.contact; + // Has this contact already been added to the island? + if (contact.m_islandFlag) { + continue; + } + // Only add if either is static, kinematic or bullet. + var other = ce.other; + if (other.isDynamic() && !body.isBullet() && !other.isBullet()) { + continue; + } + // Skip sensors. + var sensorA = contact.m_fixtureA.m_isSensor; + var sensorB = contact.m_fixtureB.m_isSensor; + if (sensorA || sensorB) { + continue; + } + // Tentatively advance the body to the TOI. + var backup = other.m_sweep.clone(); + if (other.m_islandFlag == false) { + other.advance(minAlpha); + } + // Update the contact points + contact.update(world); + // Was the contact disabled by the user? + // Are there contact points? + if (contact.isEnabled() == false || contact.isTouching() == false) { + other.m_sweep.set(backup); + other.synchronizeTransform(); + continue; + } + // Add the contact to the island + contact.m_islandFlag = true; + this.addContact(contact); + // Has the other body already been added to the island? + if (other.m_islandFlag) { + continue; + } + // Add the other body to the island. + other.m_islandFlag = true; + if (!other.isStatic()) { + other.setAwake(true); + } + this.addBody(other); + } + } + } + s_subStep.reset((1.0 - minAlpha) * step.dt); + s_subStep.dtRatio = 1.0; + s_subStep.positionIterations = 20; + s_subStep.velocityIterations = step.velocityIterations; + s_subStep.warmStarting = false; + this.solveIslandTOI(s_subStep, bA, bB); + // Reset island flags and synchronize broad-phase proxies. + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + body.m_islandFlag = false; + if (!body.isDynamic()) { + continue; + } + body.synchronizeFixtures(); + // Invalidate all contact TOIs on this displaced body. + for (var ce = body.m_contactList; ce; ce = ce.next) { + ce.contact.m_toiFlag = false; + ce.contact.m_islandFlag = false; + } + } + // Commit fixture proxy movements to the broad-phase so that new contacts + // are created. + // Also, some contacts can be destroyed. + world.findNewContacts(); + if (world.m_subStepping) { + world.m_stepComplete = false; + break; + } + } + }; + Solver.prototype.solveIslandTOI = function (subStep, toiA, toiB) { + this.m_world; + // Initialize the body state. + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + body.c_position.c.setVec2(body.m_sweep.c); + body.c_position.a = body.m_sweep.a; + body.c_velocity.v.setVec2(body.m_linearVelocity); + body.c_velocity.w = body.m_angularVelocity; + } + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.initConstraint(subStep); + } + // Solve position constraints. + for (var i = 0; i < subStep.positionIterations; ++i) { + var minSeparation = 0.0; + for (var j = 0; j < this.m_contacts.length; ++j) { + var contact = this.m_contacts[j]; + var separation = contact.solvePositionConstraintTOI(subStep, toiA, toiB); + minSeparation = math.min(minSeparation, separation); + } + // We can't expect minSpeparation >= -Settings.linearSlop because we don't + // push the separation above -Settings.linearSlop. + var contactsOkay = minSeparation >= -1.5 * Settings.linearSlop; + if (contactsOkay) { + break; + } + } + var i, c; + // Leap of faith to new safe state. + toiA.m_sweep.c0.setVec2(toiA.c_position.c); + toiA.m_sweep.a0 = toiA.c_position.a; + toiB.m_sweep.c0.setVec2(toiB.c_position.c); + toiB.m_sweep.a0 = toiB.c_position.a; + // No warm starting is needed for TOI events because warm + // starting impulses were applied in the discrete solver. + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.initVelocityConstraint(subStep); + } + // Solve velocity constraints. + for (var i = 0; i < subStep.velocityIterations; ++i) { + for (var j = 0; j < this.m_contacts.length; ++j) { + var contact = this.m_contacts[j]; + contact.solveVelocityConstraint(subStep); + } + } + // Don't store the TOI contact forces for warm starting + // because they can be quite large. + var h = subStep.dt; + // Integrate positions + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + var c = Vec2.clone(body.c_position.c); + var a = body.c_position.a; + var v = Vec2.clone(body.c_velocity.v); + var w = body.c_velocity.w; + // Check for large velocities + var translation = Vec2.mulNumVec2(h, v); + if (Vec2.dot(translation, translation) > Settings.maxTranslationSquared) { + var ratio = Settings.maxTranslation / translation.length(); + v.mul(ratio); + } + var rotation = h * w; + if (rotation * rotation > Settings.maxRotationSquared) { + var ratio = Settings.maxRotation / math.abs(rotation); + w *= ratio; + } + // Integrate + c.addMul(h, v); + a += h * w; + body.c_position.c = c; + body.c_position.a = a; + body.c_velocity.v = v; + body.c_velocity.w = w; + // Sync bodies + body.m_sweep.c = c; + body.m_sweep.a = a; + body.m_linearVelocity = v; + body.m_angularVelocity = w; + body.synchronizeTransform(); + } + this.postSolveIsland(); + }; + /** @internal */ + Solver.prototype.postSolveIsland = function () { + for (var c = 0; c < this.m_contacts.length; ++c) { + var contact = this.m_contacts[c]; + this.m_world.postSolve(contact, contact.m_impulse); + } + }; + return Solver; +}()); +// @ts-ignore +Solver.TimeStep = TimeStep; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A 2-by-2 matrix. Stored in column-major order. + */ +var Mat22 = /** @class */ (function () { + // tslint:disable-next-line:typedef + function Mat22(a, b, c, d) { + if (typeof a === 'object' && a !== null) { + this.ex = Vec2.clone(a); + this.ey = Vec2.clone(b); + } + else if (typeof a === 'number') { + this.ex = Vec2.neo(a, c); + this.ey = Vec2.neo(b, d); + } + else { + this.ex = Vec2.zero(); + this.ey = Vec2.zero(); + } + } + /** @internal */ + Mat22.prototype.toString = function () { + return JSON.stringify(this); + }; + Mat22.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return Vec2.isValid(obj.ex) && Vec2.isValid(obj.ey); + }; + Mat22.assert = function (o) { + }; + // tslint:disable-next-line:typedef + Mat22.prototype.set = function (a, b, c, d) { + if (typeof a === 'number' && typeof b === 'number' && typeof c === 'number' + && typeof d === 'number') { + this.ex.setNum(a, c); + this.ey.setNum(b, d); + } + else if (typeof a === 'object' && typeof b === 'object') { + this.ex.setVec2(a); + this.ey.setVec2(b); + } + else if (typeof a === 'object') { + this.ex.setVec2(a.ex); + this.ey.setVec2(a.ey); + } + else ; + }; + Mat22.prototype.setIdentity = function () { + this.ex.x = 1.0; + this.ey.x = 0.0; + this.ex.y = 0.0; + this.ey.y = 1.0; + }; + Mat22.prototype.setZero = function () { + this.ex.x = 0.0; + this.ey.x = 0.0; + this.ex.y = 0.0; + this.ey.y = 0.0; + }; + Mat22.prototype.getInverse = function () { + var a = this.ex.x; + var b = this.ey.x; + var c = this.ex.y; + var d = this.ey.y; + var det = a * d - b * c; + if (det !== 0.0) { + det = 1.0 / det; + } + var imx = new Mat22(); + imx.ex.x = det * d; + imx.ey.x = -det * b; + imx.ex.y = -det * c; + imx.ey.y = det * a; + return imx; + }; + /** + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. + */ + Mat22.prototype.solve = function (v) { + var a = this.ex.x; + var b = this.ey.x; + var c = this.ex.y; + var d = this.ey.y; + var det = a * d - b * c; + if (det !== 0.0) { + det = 1.0 / det; + } + var w = Vec2.zero(); + w.x = det * (d * v.x - b * v.y); + w.y = det * (a * v.y - c * v.x); + return w; + }; + // tslint:disable-next-line:typedef + Mat22.mul = function (mx, v) { + if (v && 'x' in v && 'y' in v) { + var x = mx.ex.x * v.x + mx.ey.x * v.y; + var y = mx.ex.y * v.x + mx.ey.y * v.y; + return Vec2.neo(x, y); + } + else if (v && 'ex' in v && 'ey' in v) { // Mat22 + // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey)); + var a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y; + var b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y; + var c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y; + var d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y; + return new Mat22(a, b, c, d); + } + }; + Mat22.mulVec2 = function (mx, v) { + var x = mx.ex.x * v.x + mx.ey.x * v.y; + var y = mx.ex.y * v.x + mx.ey.y * v.y; + return Vec2.neo(x, y); + }; + Mat22.mulMat22 = function (mx, v) { + // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey)); + var a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y; + var b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y; + var c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y; + var d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y; + return new Mat22(a, b, c, d); + }; + // tslint:disable-next-line:typedef + Mat22.mulT = function (mx, v) { + if (v && 'x' in v && 'y' in v) { // Vec2 + return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey)); + } + else if (v && 'ex' in v && 'ey' in v) { // Mat22 + var c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex)); + var c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey)); + return new Mat22(c1, c2); + } + }; + Mat22.mulTVec2 = function (mx, v) { + return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey)); + }; + Mat22.mulTMat22 = function (mx, v) { + var c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex)); + var c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey)); + return new Mat22(c1, c2); + }; + Mat22.abs = function (mx) { + return new Mat22(Vec2.abs(mx.ex), Vec2.abs(mx.ey)); + }; + Mat22.add = function (mx1, mx2) { + return new Mat22(Vec2.add(mx1.ex, mx2.ex), Vec2.add(mx1.ey, mx2.ey)); + }; + return Mat22; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +exports.ManifoldType = void 0; +(function (ManifoldType) { + ManifoldType[ManifoldType["e_circles"] = 0] = "e_circles"; + ManifoldType[ManifoldType["e_faceA"] = 1] = "e_faceA"; + ManifoldType[ManifoldType["e_faceB"] = 2] = "e_faceB"; +})(exports.ManifoldType || (exports.ManifoldType = {})); +exports.ContactFeatureType = void 0; +(function (ContactFeatureType) { + ContactFeatureType[ContactFeatureType["e_vertex"] = 0] = "e_vertex"; + ContactFeatureType[ContactFeatureType["e_face"] = 1] = "e_face"; +})(exports.ContactFeatureType || (exports.ContactFeatureType = {})); +/** + * This is used for determining the state of contact points. + */ +exports.PointState = void 0; +(function (PointState) { + /** Point does not exist */ + PointState[PointState["nullState"] = 0] = "nullState"; + /** Point was added in the update */ + PointState[PointState["addState"] = 1] = "addState"; + /** Point persisted across the update */ + PointState[PointState["persistState"] = 2] = "persistState"; + /** Point was removed in the update */ + PointState[PointState["removeState"] = 3] = "removeState"; +})(exports.PointState || (exports.PointState = {})); +/** + * Used for computing contact manifolds. + */ +var ClipVertex = /** @class */ (function () { + function ClipVertex() { + this.v = Vec2.zero(); + this.id = new ContactID(); + } + ClipVertex.prototype.set = function (o) { + this.v.setVec2(o.v); + this.id.set(o.id); + }; + return ClipVertex; +}()); +/** + * A manifold for two touching convex shapes. Manifolds are created in `evaluate` + * method of Contact subclasses. + * + * Supported manifold types are e_faceA or e_faceB for clip point versus plane + * with radius and e_circles point versus point with radius. + * + * We store contacts in this way so that position correction can account for + * movement, which is critical for continuous physics. All contact scenarios + * must be expressed in one of these types. This structure is stored across time + * steps, so we keep it small. + * + * @prop type e_circle, e_faceA, e_faceB + * @prop localPoint Usage depends on manifold type:
+ * e_circles: the local center of circleA
+ * e_faceA: the center of faceA
+ * e_faceB: the center of faceB + * @prop localNormal Usage depends on manifold type:
+ * e_circles: not used
+ * e_faceA: the normal on polygonA
+ * e_faceB: the normal on polygonB + * @prop points The points of contact {ManifoldPoint[]} + * @prop pointCount The number of manifold points + */ +var Manifold = /** @class */ (function () { + function Manifold() { + this.localNormal = Vec2.zero(); + this.localPoint = Vec2.zero(); + this.points = [new ManifoldPoint(), new ManifoldPoint()]; + this.pointCount = 0; + } + /** + * Evaluate the manifold with supplied transforms. This assumes modest motion + * from the original state. This does not change the point count, impulses, etc. + * The radii must come from the shapes that generated the manifold. + */ + Manifold.prototype.getWorldManifold = function (wm, xfA, radiusA, xfB, radiusB) { + if (this.pointCount == 0) { + return; + } + wm = wm || new WorldManifold(); + var normal = wm.normal; + var points = wm.points; + var separations = wm.separations; + // TODO: improve + switch (this.type) { + case exports.ManifoldType.e_circles: { + normal = Vec2.neo(1.0, 0.0); + var pointA = Transform.mulVec2(xfA, this.localPoint); + var pointB = Transform.mulVec2(xfB, this.points[0].localPoint); + var dist = Vec2.sub(pointB, pointA); + if (Vec2.lengthSquared(dist) > math.EPSILON * math.EPSILON) { + normal.setVec2(dist); + normal.normalize(); + } + var cA = pointA.clone().addMul(radiusA, normal); + var cB = pointB.clone().addMul(-radiusB, normal); + points[0] = Vec2.mid(cA, cB); + separations[0] = Vec2.dot(Vec2.sub(cB, cA), normal); + points.length = 1; + separations.length = 1; + break; + } + case exports.ManifoldType.e_faceA: { + normal = Rot.mulVec2(xfA.q, this.localNormal); + var planePoint = Transform.mulVec2(xfA, this.localPoint); + for (var i = 0; i < this.pointCount; ++i) { + var clipPoint = Transform.mulVec2(xfB, this.points[i].localPoint); + var cA = Vec2.clone(clipPoint).addMul(radiusA - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal); + var cB = Vec2.clone(clipPoint).subMul(radiusB, normal); + points[i] = Vec2.mid(cA, cB); + separations[i] = Vec2.dot(Vec2.sub(cB, cA), normal); + } + points.length = this.pointCount; + separations.length = this.pointCount; + break; + } + case exports.ManifoldType.e_faceB: { + normal = Rot.mulVec2(xfB.q, this.localNormal); + var planePoint = Transform.mulVec2(xfB, this.localPoint); + for (var i = 0; i < this.pointCount; ++i) { + var clipPoint = Transform.mulVec2(xfA, this.points[i].localPoint); + var cB = Vec2.combine(1, clipPoint, radiusB - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal); + var cA = Vec2.combine(1, clipPoint, -radiusA, normal); + points[i] = Vec2.mid(cA, cB); + separations[i] = Vec2.dot(Vec2.sub(cA, cB), normal); + } + points.length = this.pointCount; + separations.length = this.pointCount; + // Ensure normal points from A to B. + normal.mul(-1); + break; + } + } + wm.normal = normal; + wm.points = points; + wm.separations = separations; + return wm; + }; + Manifold.clipSegmentToLine = clipSegmentToLine; + Manifold.ClipVertex = ClipVertex; + Manifold.getPointStates = getPointStates; + Manifold.PointState = exports.PointState; + return Manifold; +}()); +/** + * A manifold point is a contact point belonging to a contact manifold. It holds + * details related to the geometry and dynamics of the contact points. + * + * This structure is stored across time steps, so we keep it small. + * + * Note: impulses are used for internal caching and may not provide reliable + * contact forces, especially for high speed collisions. + */ +var ManifoldPoint = /** @class */ (function () { + function ManifoldPoint() { + /** + * Usage depends on manifold type. + * e_circles: the local center of circleB, + * e_faceA: the local center of cirlceB or the clip point of polygonB, + * e_faceB: the clip point of polygonA. + */ + this.localPoint = Vec2.zero(); + /** + * The non-penetration impulse + */ + this.normalImpulse = 0; + /** + * The friction impulse + */ + this.tangentImpulse = 0; + /** + * Uniquely identifies a contact point between two shapes to facilatate warm starting + */ + this.id = new ContactID(); + } + return ManifoldPoint; +}()); +/** + * Contact ids to facilitate warm starting. + */ +var ContactID = /** @class */ (function () { + function ContactID() { + this.cf = new ContactFeature(); + } + Object.defineProperty(ContactID.prototype, "key", { + /** + * Used to quickly compare contact ids. + */ + get: function () { + return this.cf.indexA + this.cf.indexB * 4 + this.cf.typeA * 16 + this.cf.typeB * 64; + }, + enumerable: false, + configurable: true + }); + ContactID.prototype.set = function (o) { + // this.key = o.key; + this.cf.set(o.cf); + }; + return ContactID; +}()); +/** + * The features that intersect to form the contact point. + */ +var ContactFeature = /** @class */ (function () { + function ContactFeature() { + } + ContactFeature.prototype.set = function (o) { + this.indexA = o.indexA; + this.indexB = o.indexB; + this.typeA = o.typeA; + this.typeB = o.typeB; + }; + return ContactFeature; +}()); +/** + * This is used to compute the current state of a contact manifold. + */ +var WorldManifold = /** @class */ (function () { + function WorldManifold() { + /** + * World contact point (point of intersection) + */ + this.points = []; // [maxManifoldPoints] + /** + * A negative value indicates overlap, in meters + */ + this.separations = []; // [maxManifoldPoints] + } + return WorldManifold; +}()); +/** + * Compute the point states given two manifolds. The states pertain to the + * transition from manifold1 to manifold2. So state1 is either persist or remove + * while state2 is either add or persist. + */ +function getPointStates(state1, state2, manifold1, manifold2) { + // state1, state2: PointState[Settings.maxManifoldPoints] + // for (var i = 0; i < Settings.maxManifoldPoints; ++i) { + // state1[i] = PointState.nullState; + // state2[i] = PointState.nullState; + // } + // Detect persists and removes. + for (var i = 0; i < manifold1.pointCount; ++i) { + var id = manifold1.points[i].id; + state1[i] = exports.PointState.removeState; + for (var j = 0; j < manifold2.pointCount; ++j) { + if (manifold2.points[j].id.key == id.key) { + state1[i] = exports.PointState.persistState; + break; + } + } + } + // Detect persists and adds. + for (var i = 0; i < manifold2.pointCount; ++i) { + var id = manifold2.points[i].id; + state2[i] = exports.PointState.addState; + for (var j = 0; j < manifold1.pointCount; ++j) { + if (manifold1.points[j].id.key == id.key) { + state2[i] = exports.PointState.persistState; + break; + } + } + } +} +/** + * Clipping for contact manifolds. Sutherland-Hodgman clipping. + */ +function clipSegmentToLine(vOut, vIn, normal, offset, vertexIndexA) { + // Start with no output points + var numOut = 0; + // Calculate the distance of end points to the line + var distance0 = Vec2.dot(normal, vIn[0].v) - offset; + var distance1 = Vec2.dot(normal, vIn[1].v) - offset; + // If the points are behind the plane + if (distance0 <= 0.0) + vOut[numOut++].set(vIn[0]); + if (distance1 <= 0.0) + vOut[numOut++].set(vIn[1]); + // If the points are on different sides of the plane + if (distance0 * distance1 < 0.0) { + // Find intersection point of edge and plane + var interp = distance0 / (distance0 - distance1); + vOut[numOut].v.setCombine(1 - interp, vIn[0].v, interp, vIn[1].v); + // VertexA is hitting edgeB. + vOut[numOut].id.cf.indexA = vertexIndexA; + vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB; + vOut[numOut].id.cf.typeA = exports.ContactFeatureType.e_vertex; + vOut[numOut].id.cf.typeB = exports.ContactFeatureType.e_face; + ++numOut; + } + return numOut; +} + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A contact edge is used to connect bodies and contacts together in a contact + * graph where each body is a node and each contact is an edge. A contact edge + * belongs to a doubly linked list maintained in each attached body. Each + * contact has two contact nodes, one for each attached body. + * + * @prop {Contact} contact The contact + * @prop {ContactEdge} prev The previous contact edge in the body's contact list + * @prop {ContactEdge} next The next contact edge in the body's contact list + * @prop {Body} other Provides quick access to the other body attached. + */ +var ContactEdge = /** @class */ (function () { + function ContactEdge(contact) { + this.contact = contact; + } + return ContactEdge; +}()); +/** + * Friction mixing law. The idea is to allow either fixture to drive the + * restitution to zero. For example, anything slides on ice. + */ +function mixFriction(friction1, friction2) { + return math.sqrt(friction1 * friction2); +} +/** + * Restitution mixing law. The idea is allow for anything to bounce off an + * inelastic surface. For example, a superball bounces on anything. + */ +function mixRestitution(restitution1, restitution2) { + return restitution1 > restitution2 ? restitution1 : restitution2; +} +// TODO: move this to Settings? +var s_registers = []; +// TODO: merge with ManifoldPoint? +var VelocityConstraintPoint = /** @class */ (function () { + function VelocityConstraintPoint() { + this.rA = Vec2.zero(); + this.rB = Vec2.zero(); + this.normalImpulse = 0; + this.tangentImpulse = 0; + this.normalMass = 0; + this.tangentMass = 0; + this.velocityBias = 0; + } + return VelocityConstraintPoint; +}()); +/** + * The class manages contact between two shapes. A contact exists for each + * overlapping AABB in the broad-phase (except if filtered). Therefore a contact + * object may exist that has no contact points. + */ +var Contact = /** @class */ (function () { + function Contact(fA, indexA, fB, indexB, evaluateFcn) { + /** @internal */ + this.m_manifold = new Manifold(); + /** @internal */ + this.m_prev = null; + /** @internal */ + this.m_next = null; + /** @internal */ + this.m_toi = 1.0; + /** @internal */ + this.m_toiCount = 0; + /** @internal This contact has a valid TOI in m_toi */ + this.m_toiFlag = false; + /** @internal */ + this.m_tangentSpeed = 0.0; + /** @internal This contact can be disabled (by user) */ + this.m_enabledFlag = true; + /** @internal Used when crawling contact graph when forming islands. */ + this.m_islandFlag = false; + /** @internal Set when the shapes are touching. */ + this.m_touchingFlag = false; + /** @internal This contact needs filtering because a fixture filter was changed. */ + this.m_filterFlag = false; + /** @internal This bullet contact had a TOI event */ + this.m_bulletHitFlag = false; + /** @internal Contact reporting impulse object cache */ + this.m_impulse = new ContactImpulse(this); + // VelocityConstraint + /** @internal */ this.v_points = []; // [maxManifoldPoints]; + /** @internal */ this.v_normal = Vec2.zero(); + /** @internal */ this.v_normalMass = new Mat22(); + /** @internal */ this.v_K = new Mat22(); + // PositionConstraint + /** @internal */ this.p_localPoints = []; // [maxManifoldPoints]; + /** @internal */ this.p_localNormal = Vec2.zero(); + /** @internal */ this.p_localPoint = Vec2.zero(); + /** @internal */ this.p_localCenterA = Vec2.zero(); + /** @internal */ this.p_localCenterB = Vec2.zero(); + // Nodes for connecting bodies. + this.m_nodeA = new ContactEdge(this); + this.m_nodeB = new ContactEdge(this); + this.m_fixtureA = fA; + this.m_fixtureB = fB; + this.m_indexA = indexA; + this.m_indexB = indexB; + this.m_evaluateFcn = evaluateFcn; + this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction); + this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution); + } + Contact.prototype.initConstraint = function (step) { + var fixtureA = this.m_fixtureA; + var fixtureB = this.m_fixtureB; + var shapeA = fixtureA.getShape(); + var shapeB = fixtureB.getShape(); + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + var manifold = this.getManifold(); + var pointCount = manifold.pointCount; + this.v_invMassA = bodyA.m_invMass; + this.v_invMassB = bodyB.m_invMass; + this.v_invIA = bodyA.m_invI; + this.v_invIB = bodyB.m_invI; + this.v_friction = this.m_friction; + this.v_restitution = this.m_restitution; + this.v_tangentSpeed = this.m_tangentSpeed; + this.v_pointCount = pointCount; + this.v_K.setZero(); + this.v_normalMass.setZero(); + this.p_invMassA = bodyA.m_invMass; + this.p_invMassB = bodyB.m_invMass; + this.p_invIA = bodyA.m_invI; + this.p_invIB = bodyB.m_invI; + this.p_localCenterA = Vec2.clone(bodyA.m_sweep.localCenter); + this.p_localCenterB = Vec2.clone(bodyB.m_sweep.localCenter); + this.p_radiusA = shapeA.m_radius; + this.p_radiusB = shapeB.m_radius; + this.p_type = manifold.type; + this.p_localNormal = Vec2.clone(manifold.localNormal); + this.p_localPoint = Vec2.clone(manifold.localPoint); + this.p_pointCount = pointCount; + for (var j = 0; j < pointCount; ++j) { + var cp = manifold.points[j]; + var vcp = this.v_points[j] = new VelocityConstraintPoint(); + if (step.warmStarting) { + vcp.normalImpulse = step.dtRatio * cp.normalImpulse; + vcp.tangentImpulse = step.dtRatio * cp.tangentImpulse; + } + else { + vcp.normalImpulse = 0.0; + vcp.tangentImpulse = 0.0; + } + vcp.rA.setZero(); + vcp.rB.setZero(); + vcp.normalMass = 0.0; + vcp.tangentMass = 0.0; + vcp.velocityBias = 0.0; + this.p_localPoints[j] = Vec2.clone(cp.localPoint); + } + }; + /** + * Get the contact manifold. Do not modify the manifold unless you understand + * the internals of the library. + */ + Contact.prototype.getManifold = function () { + return this.m_manifold; + }; + /** + * Get the world manifold. + */ + Contact.prototype.getWorldManifold = function (worldManifold) { + var bodyA = this.m_fixtureA.getBody(); + var bodyB = this.m_fixtureB.getBody(); + var shapeA = this.m_fixtureA.getShape(); + var shapeB = this.m_fixtureB.getShape(); + return this.m_manifold.getWorldManifold(worldManifold, bodyA.getTransform(), shapeA.m_radius, bodyB.getTransform(), shapeB.m_radius); + }; + /** + * Enable/disable this contact. This can be used inside the pre-solve contact + * listener. The contact is only disabled for the current time step (or sub-step + * in continuous collisions). + */ + Contact.prototype.setEnabled = function (flag) { + this.m_enabledFlag = !!flag; + }; + /** + * Has this contact been disabled? + */ + Contact.prototype.isEnabled = function () { + return this.m_enabledFlag; + }; + /** + * Is this contact touching? + */ + Contact.prototype.isTouching = function () { + return this.m_touchingFlag; + }; + /** + * Get the next contact in the world's contact list. + */ + Contact.prototype.getNext = function () { + return this.m_next; + }; + /** + * Get fixture A in this contact. + */ + Contact.prototype.getFixtureA = function () { + return this.m_fixtureA; + }; + /** + * Get fixture B in this contact. + */ + Contact.prototype.getFixtureB = function () { + return this.m_fixtureB; + }; + /** + * Get the child primitive index for fixture A. + */ + Contact.prototype.getChildIndexA = function () { + return this.m_indexA; + }; + /** + * Get the child primitive index for fixture B. + */ + Contact.prototype.getChildIndexB = function () { + return this.m_indexB; + }; + /** + * Flag this contact for filtering. Filtering will occur the next time step. + */ + Contact.prototype.flagForFiltering = function () { + this.m_filterFlag = true; + }; + /** + * Override the default friction mixture. You can call this in + * ContactListener.preSolve. This value persists until set or reset. + */ + Contact.prototype.setFriction = function (friction) { + this.m_friction = friction; + }; + /** + * Get the friction. + */ + Contact.prototype.getFriction = function () { + return this.m_friction; + }; + /** + * Reset the friction mixture to the default value. + */ + Contact.prototype.resetFriction = function () { + this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction); + }; + /** + * Override the default restitution mixture. You can call this in + * ContactListener.preSolve. The value persists until you set or reset. + */ + Contact.prototype.setRestitution = function (restitution) { + this.m_restitution = restitution; + }; + /** + * Get the restitution. + */ + Contact.prototype.getRestitution = function () { + return this.m_restitution; + }; + /** + * Reset the restitution to the default value. + */ + Contact.prototype.resetRestitution = function () { + this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution); + }; + /** + * Set the desired tangent speed for a conveyor belt behavior. In meters per + * second. + */ + Contact.prototype.setTangentSpeed = function (speed) { + this.m_tangentSpeed = speed; + }; + /** + * Get the desired tangent speed. In meters per second. + */ + Contact.prototype.getTangentSpeed = function () { + return this.m_tangentSpeed; + }; + /** + * Called by Update method, and implemented by subclasses. + */ + Contact.prototype.evaluate = function (manifold, xfA, xfB) { + this.m_evaluateFcn(manifold, xfA, this.m_fixtureA, this.m_indexA, xfB, this.m_fixtureB, this.m_indexB); + }; + /** + * Updates the contact manifold and touching status. + * + * Note: do not assume the fixture AABBs are overlapping or are valid. + * + * @param listener.beginContact + * @param listener.endContact + * @param listener.preSolve + */ + Contact.prototype.update = function (listener) { + // Re-enable this contact. + this.m_enabledFlag = true; + var touching = false; + var wasTouching = this.m_touchingFlag; + var sensorA = this.m_fixtureA.isSensor(); + var sensorB = this.m_fixtureB.isSensor(); + var sensor = sensorA || sensorB; + var bodyA = this.m_fixtureA.getBody(); + var bodyB = this.m_fixtureB.getBody(); + var xfA = bodyA.getTransform(); + var xfB = bodyB.getTransform(); + var oldManifold; + // Is this contact a sensor? + if (sensor) { + var shapeA = this.m_fixtureA.getShape(); + var shapeB = this.m_fixtureB.getShape(); + touching = testOverlap(shapeA, this.m_indexA, shapeB, this.m_indexB, xfA, xfB); + // Sensors don't generate manifolds. + this.m_manifold.pointCount = 0; + } + else { + // TODO reuse manifold + oldManifold = this.m_manifold; + this.m_manifold = new Manifold(); + this.evaluate(this.m_manifold, xfA, xfB); + touching = this.m_manifold.pointCount > 0; + // Match old contact ids to new contact ids and copy the + // stored impulses to warm start the solver. + for (var i = 0; i < this.m_manifold.pointCount; ++i) { + var nmp = this.m_manifold.points[i]; + nmp.normalImpulse = 0.0; + nmp.tangentImpulse = 0.0; + for (var j = 0; j < oldManifold.pointCount; ++j) { + var omp = oldManifold.points[j]; + if (omp.id.key == nmp.id.key) { + nmp.normalImpulse = omp.normalImpulse; + nmp.tangentImpulse = omp.tangentImpulse; + break; + } + } + } + if (touching != wasTouching) { + bodyA.setAwake(true); + bodyB.setAwake(true); + } + } + this.m_touchingFlag = touching; + if (!wasTouching && touching && listener) { + listener.beginContact(this); + } + if (wasTouching && !touching && listener) { + listener.endContact(this); + } + if (!sensor && touching && listener) { + listener.preSolve(this, oldManifold); + } + }; + Contact.prototype.solvePositionConstraint = function (step) { + return this._solvePositionConstraint(step); + }; + Contact.prototype.solvePositionConstraintTOI = function (step, toiA, toiB) { + return this._solvePositionConstraint(step, toiA, toiB); + }; + Contact.prototype._solvePositionConstraint = function (step, toiA, toiB) { + var toi = !!toiA && !!toiB; + var fixtureA = this.m_fixtureA; + var fixtureB = this.m_fixtureB; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + bodyA.c_velocity; + bodyB.c_velocity; + var positionA = bodyA.c_position; + var positionB = bodyB.c_position; + var localCenterA = Vec2.clone(this.p_localCenterA); + var localCenterB = Vec2.clone(this.p_localCenterB); + var mA = 0.0; + var iA = 0.0; + if (!toi || (bodyA == toiA || bodyA == toiB)) { + mA = this.p_invMassA; + iA = this.p_invIA; + } + var mB = 0.0; + var iB = 0.0; + if (!toi || (bodyB == toiA || bodyB == toiB)) { + mB = this.p_invMassB; + iB = this.p_invIB; + } + var cA = Vec2.clone(positionA.c); + var aA = positionA.a; + var cB = Vec2.clone(positionB.c); + var aB = positionB.a; + var minSeparation = 0.0; + // Solve normal constraints + for (var j = 0; j < this.p_pointCount; ++j) { + var xfA = Transform.identity(); + var xfB = Transform.identity(); + xfA.q.setAngle(aA); + xfB.q.setAngle(aB); + xfA.p = Vec2.sub(cA, Rot.mulVec2(xfA.q, localCenterA)); + xfB.p = Vec2.sub(cB, Rot.mulVec2(xfB.q, localCenterB)); + // PositionSolverManifold + var normal = void 0; + var point = void 0; + var separation = void 0; + switch (this.p_type) { + case exports.ManifoldType.e_circles: { + var pointA = Transform.mulVec2(xfA, this.p_localPoint); + var pointB = Transform.mulVec2(xfB, this.p_localPoints[0]); + normal = Vec2.sub(pointB, pointA); + normal.normalize(); + point = Vec2.combine(0.5, pointA, 0.5, pointB); + separation = Vec2.dot(Vec2.sub(pointB, pointA), normal) - this.p_radiusA - this.p_radiusB; + break; + } + case exports.ManifoldType.e_faceA: { + normal = Rot.mulVec2(xfA.q, this.p_localNormal); + var planePoint = Transform.mulVec2(xfA, this.p_localPoint); + var clipPoint = Transform.mulVec2(xfB, this.p_localPoints[j]); + separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB; + point = clipPoint; + break; + } + case exports.ManifoldType.e_faceB: { + normal = Rot.mulVec2(xfB.q, this.p_localNormal); + var planePoint = Transform.mulVec2(xfB, this.p_localPoint); + var clipPoint = Transform.mulVec2(xfA, this.p_localPoints[j]); + separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB; + point = clipPoint; + // Ensure normal points from A to B + normal.mul(-1); + break; + } + } + var rA = Vec2.sub(point, cA); + var rB = Vec2.sub(point, cB); + // Track max constraint error. + minSeparation = math.min(minSeparation, separation); + var baumgarte = toi ? Settings.toiBaugarte : Settings.baumgarte; + var linearSlop = Settings.linearSlop; + var maxLinearCorrection = Settings.maxLinearCorrection; + // Prevent large corrections and allow slop. + var C = math.clamp(baumgarte * (separation + linearSlop), -maxLinearCorrection, 0.0); + // Compute the effective mass. + var rnA = Vec2.crossVec2Vec2(rA, normal); + var rnB = Vec2.crossVec2Vec2(rB, normal); + var K = mA + mB + iA * rnA * rnA + iB * rnB * rnB; + // Compute normal impulse + var impulse = K > 0.0 ? -C / K : 0.0; + var P = Vec2.mulNumVec2(impulse, normal); + cA.subMul(mA, P); + aA -= iA * Vec2.crossVec2Vec2(rA, P); + cB.addMul(mB, P); + aB += iB * Vec2.crossVec2Vec2(rB, P); + } + positionA.c.setVec2(cA); + positionA.a = aA; + positionB.c.setVec2(cB); + positionB.a = aB; + return minSeparation; + }; + Contact.prototype.initVelocityConstraint = function (step) { + var fixtureA = this.m_fixtureA; + var fixtureB = this.m_fixtureB; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + var velocityA = bodyA.c_velocity; + var velocityB = bodyB.c_velocity; + var positionA = bodyA.c_position; + var positionB = bodyB.c_position; + var radiusA = this.p_radiusA; + var radiusB = this.p_radiusB; + var manifold = this.getManifold(); + var mA = this.v_invMassA; + var mB = this.v_invMassB; + var iA = this.v_invIA; + var iB = this.v_invIB; + var localCenterA = Vec2.clone(this.p_localCenterA); + var localCenterB = Vec2.clone(this.p_localCenterB); + var cA = Vec2.clone(positionA.c); + var aA = positionA.a; + var vA = Vec2.clone(velocityA.v); + var wA = velocityA.w; + var cB = Vec2.clone(positionB.c); + var aB = positionB.a; + var vB = Vec2.clone(velocityB.v); + var wB = velocityB.w; + var xfA = Transform.identity(); + var xfB = Transform.identity(); + xfA.q.setAngle(aA); + xfB.q.setAngle(aB); + xfA.p.setCombine(1, cA, -1, Rot.mulVec2(xfA.q, localCenterA)); + xfB.p.setCombine(1, cB, -1, Rot.mulVec2(xfB.q, localCenterB)); + var worldManifold = manifold.getWorldManifold(null, xfA, radiusA, xfB, radiusB); + this.v_normal.setVec2(worldManifold.normal); + for (var j = 0; j < this.v_pointCount; ++j) { + var vcp = this.v_points[j]; // VelocityConstraintPoint + vcp.rA.setVec2(Vec2.sub(worldManifold.points[j], cA)); + vcp.rB.setVec2(Vec2.sub(worldManifold.points[j], cB)); + var rnA = Vec2.crossVec2Vec2(vcp.rA, this.v_normal); + var rnB = Vec2.crossVec2Vec2(vcp.rB, this.v_normal); + var kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB; + vcp.normalMass = kNormal > 0.0 ? 1.0 / kNormal : 0.0; + var tangent = Vec2.crossVec2Num(this.v_normal, 1.0); + var rtA = Vec2.crossVec2Vec2(vcp.rA, tangent); + var rtB = Vec2.crossVec2Vec2(vcp.rB, tangent); + var kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB; + vcp.tangentMass = kTangent > 0.0 ? 1.0 / kTangent : 0.0; + // Setup a velocity bias for restitution. + vcp.velocityBias = 0.0; + var vRel = Vec2.dot(this.v_normal, vB) + + Vec2.dot(this.v_normal, Vec2.crossNumVec2(wB, vcp.rB)) + - Vec2.dot(this.v_normal, vA) + - Vec2.dot(this.v_normal, Vec2.crossNumVec2(wA, vcp.rA)); + if (vRel < -Settings.velocityThreshold) { + vcp.velocityBias = -this.v_restitution * vRel; + } + } + // If we have two points, then prepare the block solver. + if (this.v_pointCount == 2 && step.blockSolve) { + var vcp1 = this.v_points[0]; // VelocityConstraintPoint + var vcp2 = this.v_points[1]; // VelocityConstraintPoint + var rn1A = Vec2.crossVec2Vec2(vcp1.rA, this.v_normal); + var rn1B = Vec2.crossVec2Vec2(vcp1.rB, this.v_normal); + var rn2A = Vec2.crossVec2Vec2(vcp2.rA, this.v_normal); + var rn2B = Vec2.crossVec2Vec2(vcp2.rB, this.v_normal); + var k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B; + var k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B; + var k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B; + // Ensure a reasonable condition number. + var k_maxConditionNumber = 1000.0; + if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) { + // K is safe to invert. + this.v_K.ex.setNum(k11, k12); + this.v_K.ey.setNum(k12, k22); + this.v_normalMass.set(this.v_K.getInverse()); + } + else { + // The constraints are redundant, just use one. + // TODO_ERIN use deepest? + this.v_pointCount = 1; + } + } + positionA.c.setVec2(cA); + positionA.a = aA; + velocityA.v.setVec2(vA); + velocityA.w = wA; + positionB.c.setVec2(cB); + positionB.a = aB; + velocityB.v.setVec2(vB); + velocityB.w = wB; + }; + Contact.prototype.warmStartConstraint = function (step) { + var fixtureA = this.m_fixtureA; + var fixtureB = this.m_fixtureB; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + var velocityA = bodyA.c_velocity; + var velocityB = bodyB.c_velocity; + bodyA.c_position; + bodyB.c_position; + var mA = this.v_invMassA; + var iA = this.v_invIA; + var mB = this.v_invMassB; + var iB = this.v_invIB; + var vA = Vec2.clone(velocityA.v); + var wA = velocityA.w; + var vB = Vec2.clone(velocityB.v); + var wB = velocityB.w; + var normal = this.v_normal; + var tangent = Vec2.crossVec2Num(normal, 1.0); + for (var j = 0; j < this.v_pointCount; ++j) { + var vcp = this.v_points[j]; // VelocityConstraintPoint + var P = Vec2.combine(vcp.normalImpulse, normal, vcp.tangentImpulse, tangent); + wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); + vA.subMul(mA, P); + wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); + vB.addMul(mB, P); + } + velocityA.v.setVec2(vA); + velocityA.w = wA; + velocityB.v.setVec2(vB); + velocityB.w = wB; + }; + Contact.prototype.storeConstraintImpulses = function (step) { + var manifold = this.m_manifold; + for (var j = 0; j < this.v_pointCount; ++j) { + manifold.points[j].normalImpulse = this.v_points[j].normalImpulse; + manifold.points[j].tangentImpulse = this.v_points[j].tangentImpulse; + } + }; + Contact.prototype.solveVelocityConstraint = function (step) { + var bodyA = this.m_fixtureA.m_body; + var bodyB = this.m_fixtureB.m_body; + var velocityA = bodyA.c_velocity; + bodyA.c_position; + var velocityB = bodyB.c_velocity; + bodyB.c_position; + var mA = this.v_invMassA; + var iA = this.v_invIA; + var mB = this.v_invMassB; + var iB = this.v_invIB; + var vA = Vec2.clone(velocityA.v); + var wA = velocityA.w; + var vB = Vec2.clone(velocityB.v); + var wB = velocityB.w; + var normal = this.v_normal; + var tangent = Vec2.crossVec2Num(normal, 1.0); + var friction = this.v_friction; + // Solve tangent constraints first because non-penetration is more important + // than friction. + for (var j = 0; j < this.v_pointCount; ++j) { + var vcp = this.v_points[j]; // VelocityConstraintPoint + // Relative velocity at contact + var dv = Vec2.zero(); + dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB)); + dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA)); + // Compute tangent force + var vt = Vec2.dot(dv, tangent) - this.v_tangentSpeed; + var lambda = vcp.tangentMass * (-vt); + // Clamp the accumulated force + var maxFriction = friction * vcp.normalImpulse; + var newImpulse = math.clamp(vcp.tangentImpulse + lambda, -maxFriction, maxFriction); + lambda = newImpulse - vcp.tangentImpulse; + vcp.tangentImpulse = newImpulse; + // Apply contact impulse + var P = Vec2.mulNumVec2(lambda, tangent); + vA.subMul(mA, P); + wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); + vB.addMul(mB, P); + wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); + } + // Solve normal constraints + if (this.v_pointCount == 1 || step.blockSolve == false) { + for (var i = 0; i < this.v_pointCount; ++i) { + var vcp = this.v_points[i]; // VelocityConstraintPoint + // Relative velocity at contact + var dv = Vec2.zero(); + dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB)); + dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA)); + // Compute normal impulse + var vn = Vec2.dot(dv, normal); + var lambda = -vcp.normalMass * (vn - vcp.velocityBias); + // Clamp the accumulated impulse + var newImpulse = math.max(vcp.normalImpulse + lambda, 0.0); + lambda = newImpulse - vcp.normalImpulse; + vcp.normalImpulse = newImpulse; + // Apply contact impulse + var P = Vec2.mulNumVec2(lambda, normal); + vA.subMul(mA, P); + wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); + vB.addMul(mB, P); + wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); + } + } + else { + // Block solver developed in collaboration with Dirk Gregorius (back in + // 01/07 on Box2D_Lite). + // Build the mini LCP for this contact patch + // + // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i = + // 1..2 + // + // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n ) + // b = vn0 - velocityBias + // + // The system is solved using the "Total enumeration method" (s. Murty). + // The complementary constraint vn_i * x_i + // implies that we must have in any solution either vn_i = 0 or x_i = 0. + // So for the 2D contact problem the cases + // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and + // vn1 = 0 need to be tested. The first valid + // solution that satisfies the problem is chosen. + // + // In order to account of the accumulated impulse 'a' (because of the + // iterative nature of the solver which only requires + // that the accumulated impulse is clamped and not the incremental + // impulse) we change the impulse variable (x_i). + // + // Substitute: + // + // x = a + d + // + // a := old total impulse + // x := new total impulse + // d := incremental impulse + // + // For the current iteration we extend the formula for the incremental + // impulse + // to compute the new total impulse: + // + // vn = A * d + b + // = A * (x - a) + b + // = A * x + b - A * a + // = A * x + b' + // b' = b - A * a; + var vcp1 = this.v_points[0]; // VelocityConstraintPoint + var vcp2 = this.v_points[1]; // VelocityConstraintPoint + var a = Vec2.neo(vcp1.normalImpulse, vcp2.normalImpulse); + // Relative velocity at contact + var dv1 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp1.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp1.rA)); + var dv2 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp2.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp2.rA)); + // Compute normal velocity + var vn1 = Vec2.dot(dv1, normal); + var vn2 = Vec2.dot(dv2, normal); + var b = Vec2.neo(vn1 - vcp1.velocityBias, vn2 - vcp2.velocityBias); + // Compute b' + b.sub(Mat22.mulVec2(this.v_K, a)); + // NOT_USED(k_errorTol); + while (true) { + // + // Case 1: vn = 0 + // + // 0 = A * x + b' + // + // Solve for x: + // + // x = - inv(A) * b' + // + var x = Mat22.mulVec2(this.v_normalMass, b).neg(); + if (x.x >= 0.0 && x.y >= 0.0) { + // Get the incremental impulse + var d = Vec2.sub(x, a); + // Apply incremental impulse + var P1 = Vec2.mulNumVec2(d.x, normal); + var P2 = Vec2.mulNumVec2(d.y, normal); + vA.subCombine(mA, P1, mA, P2); + wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); + vB.addCombine(mB, P1, mB, P2); + wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); + // Accumulate + vcp1.normalImpulse = x.x; + vcp2.normalImpulse = x.y; + break; + } + // + // Case 2: vn1 = 0 and x2 = 0 + // + // 0 = a11 * x1 + a12 * 0 + b1' + // vn2 = a21 * x1 + a22 * 0 + b2' + // + x.x = -vcp1.normalMass * b.x; + x.y = 0.0; + vn1 = 0.0; + vn2 = this.v_K.ex.y * x.x + b.y; + if (x.x >= 0.0 && vn2 >= 0.0) { + // Get the incremental impulse + var d = Vec2.sub(x, a); + // Apply incremental impulse + var P1 = Vec2.mulNumVec2(d.x, normal); + var P2 = Vec2.mulNumVec2(d.y, normal); + vA.subCombine(mA, P1, mA, P2); + wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); + vB.addCombine(mB, P1, mB, P2); + wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); + // Accumulate + vcp1.normalImpulse = x.x; + vcp2.normalImpulse = x.y; + break; + } + // + // Case 3: vn2 = 0 and x1 = 0 + // + // vn1 = a11 * 0 + a12 * x2 + b1' + // 0 = a21 * 0 + a22 * x2 + b2' + // + x.x = 0.0; + x.y = -vcp2.normalMass * b.y; + vn1 = this.v_K.ey.x * x.y + b.x; + vn2 = 0.0; + if (x.y >= 0.0 && vn1 >= 0.0) { + // Resubstitute for the incremental impulse + var d = Vec2.sub(x, a); + // Apply incremental impulse + var P1 = Vec2.mulNumVec2(d.x, normal); + var P2 = Vec2.mulNumVec2(d.y, normal); + vA.subCombine(mA, P1, mA, P2); + wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); + vB.addCombine(mB, P1, mB, P2); + wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); + // Accumulate + vcp1.normalImpulse = x.x; + vcp2.normalImpulse = x.y; + break; + } + // + // Case 4: x1 = 0 and x2 = 0 + // + // vn1 = b1 + // vn2 = b2; + // + x.x = 0.0; + x.y = 0.0; + vn1 = b.x; + vn2 = b.y; + if (vn1 >= 0.0 && vn2 >= 0.0) { + // Resubstitute for the incremental impulse + var d = Vec2.sub(x, a); + // Apply incremental impulse + var P1 = Vec2.mulNumVec2(d.x, normal); + var P2 = Vec2.mulNumVec2(d.y, normal); + vA.subCombine(mA, P1, mA, P2); + wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); + vB.addCombine(mB, P1, mB, P2); + wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); + // Accumulate + vcp1.normalImpulse = x.x; + vcp2.normalImpulse = x.y; + break; + } + // No solution, give up. This is hit sometimes, but it doesn't seem to + // matter. + break; + } + } + velocityA.v.setVec2(vA); + velocityA.w = wA; + velocityB.v.setVec2(vB); + velocityB.w = wB; + }; + /** + * @internal + */ + Contact.addType = function (type1, type2, callback) { + s_registers[type1] = s_registers[type1] || {}; + s_registers[type1][type2] = callback; + }; + /** + * @internal + */ + Contact.create = function (fixtureA, indexA, fixtureB, indexB) { + var typeA = fixtureA.getType(); + var typeB = fixtureB.getType(); + // TODO: pool contacts + var contact; + var evaluateFcn; + if (evaluateFcn = s_registers[typeA] && s_registers[typeA][typeB]) { + contact = new Contact(fixtureA, indexA, fixtureB, indexB, evaluateFcn); + } + else if (evaluateFcn = s_registers[typeB] && s_registers[typeB][typeA]) { + contact = new Contact(fixtureB, indexB, fixtureA, indexA, evaluateFcn); + } + else { + return null; + } + // Contact creation may swap fixtures. + fixtureA = contact.getFixtureA(); + fixtureB = contact.getFixtureB(); + indexA = contact.getChildIndexA(); + indexB = contact.getChildIndexB(); + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + // Connect to body A + contact.m_nodeA.contact = contact; + contact.m_nodeA.other = bodyB; + contact.m_nodeA.prev = null; + contact.m_nodeA.next = bodyA.m_contactList; + if (bodyA.m_contactList != null) { + bodyA.m_contactList.prev = contact.m_nodeA; + } + bodyA.m_contactList = contact.m_nodeA; + // Connect to body B + contact.m_nodeB.contact = contact; + contact.m_nodeB.other = bodyA; + contact.m_nodeB.prev = null; + contact.m_nodeB.next = bodyB.m_contactList; + if (bodyB.m_contactList != null) { + bodyB.m_contactList.prev = contact.m_nodeB; + } + bodyB.m_contactList = contact.m_nodeB; + // Wake up the bodies + if (fixtureA.isSensor() == false && fixtureB.isSensor() == false) { + bodyA.setAwake(true); + bodyB.setAwake(true); + } + return contact; + }; + /** + * @internal + */ + Contact.destroy = function (contact, listener) { + var fixtureA = contact.m_fixtureA; + var fixtureB = contact.m_fixtureB; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + if (contact.isTouching()) { + listener.endContact(contact); + } + // Remove from body 1 + if (contact.m_nodeA.prev) { + contact.m_nodeA.prev.next = contact.m_nodeA.next; + } + if (contact.m_nodeA.next) { + contact.m_nodeA.next.prev = contact.m_nodeA.prev; + } + if (contact.m_nodeA == bodyA.m_contactList) { + bodyA.m_contactList = contact.m_nodeA.next; + } + // Remove from body 2 + if (contact.m_nodeB.prev) { + contact.m_nodeB.prev.next = contact.m_nodeB.next; + } + if (contact.m_nodeB.next) { + contact.m_nodeB.next.prev = contact.m_nodeB.prev; + } + if (contact.m_nodeB == bodyB.m_contactList) { + bodyB.m_contactList = contact.m_nodeB.next; + } + if (contact.m_manifold.pointCount > 0 && fixtureA.isSensor() == false + && fixtureB.isSensor() == false) { + bodyA.setAwake(true); + bodyB.setAwake(true); + } + fixtureA.getType(); + fixtureB.getType(); + // const destroyFcn = s_registers[typeA][typeB].destroyFcn; + // if (typeof destroyFcn === 'function') { + // destroyFcn(contact); + // } + }; + return Contact; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var WorldDefDefault = { + gravity: Vec2.zero(), + allowSleep: true, + warmStarting: true, + continuousPhysics: true, + subStepping: false, + blockSolve: true, + velocityIterations: 8, + positionIterations: 3 +}; +var World = /** @class */ (function () { + /** + * @param def World definition or gravity vector. + */ + function World(def) { + if (!(this instanceof World)) { + return new World(def); + } + this.s_step = new TimeStep(); + if (def && Vec2.isValid(def)) { + def = { gravity: def }; + } + def = options(def, WorldDefDefault); + this.m_solver = new Solver(this); + this.m_broadPhase = new BroadPhase(); + this.m_contactList = null; + this.m_contactCount = 0; + this.m_bodyList = null; + this.m_bodyCount = 0; + this.m_jointList = null; + this.m_jointCount = 0; + this.m_stepComplete = true; + this.m_allowSleep = def.allowSleep; + this.m_gravity = Vec2.clone(def.gravity); + this.m_clearForces = true; + this.m_newFixture = false; + this.m_locked = false; + // These are for debugging the solver. + this.m_warmStarting = def.warmStarting; + this.m_continuousPhysics = def.continuousPhysics; + this.m_subStepping = def.subStepping; + this.m_blockSolve = def.blockSolve; + this.m_velocityIterations = def.velocityIterations; + this.m_positionIterations = def.positionIterations; + this.m_t = 0; + } + /** @internal */ + World.prototype._serialize = function () { + var bodies = []; + var joints = []; + for (var b = this.getBodyList(); b; b = b.getNext()) { + bodies.push(b); + } + for (var j = this.getJointList(); j; j = j.getNext()) { + // @ts-ignore + if (typeof j._serialize === 'function') { + joints.push(j); + } + } + return { + gravity: this.m_gravity, + bodies: bodies, + joints: joints, + }; + }; + /** @internal */ + World._deserialize = function (data, context, restore) { + if (!data) { + return new World(); + } + var world = new World(data.gravity); + if (data.bodies) { + for (var i = data.bodies.length - 1; i >= 0; i -= 1) { + world._addBody(restore(Body, data.bodies[i], world)); + } + } + if (data.joints) { + for (var i = data.joints.length - 1; i >= 0; i--) { + world.createJoint(restore(Joint, data.joints[i], world)); + } + } + return world; + }; + /** + * Get the world body list. With the returned body, use Body.getNext to get the + * next body in the world list. A null body indicates the end of the list. + * + * @return the head of the world body list. + */ + World.prototype.getBodyList = function () { + return this.m_bodyList; + }; + /** + * Get the world joint list. With the returned joint, use Joint.getNext to get + * the next joint in the world list. A null joint indicates the end of the list. + * + * @return the head of the world joint list. + */ + World.prototype.getJointList = function () { + return this.m_jointList; + }; + /** + * Get the world contact list. With the returned contact, use Contact.getNext to + * get the next contact in the world list. A null contact indicates the end of + * the list. + * + * Warning: contacts are created and destroyed in the middle of a time step. + * Use ContactListener to avoid missing contacts. + * + * @return the head of the world contact list. + */ + World.prototype.getContactList = function () { + return this.m_contactList; + }; + World.prototype.getBodyCount = function () { + return this.m_bodyCount; + }; + World.prototype.getJointCount = function () { + return this.m_jointCount; + }; + /** + * Get the number of contacts (each may have 0 or more contact points). + */ + World.prototype.getContactCount = function () { + return this.m_contactCount; + }; + /** + * Change the global gravity vector. + */ + World.prototype.setGravity = function (gravity) { + this.m_gravity = gravity; + }; + /** + * Get the global gravity vector. + */ + World.prototype.getGravity = function () { + return this.m_gravity; + }; + /** + * Is the world locked (in the middle of a time step). + */ + World.prototype.isLocked = function () { + return this.m_locked; + }; + /** + * Enable/disable sleep. + */ + World.prototype.setAllowSleeping = function (flag) { + if (flag == this.m_allowSleep) { + return; + } + this.m_allowSleep = flag; + if (this.m_allowSleep == false) { + for (var b = this.m_bodyList; b; b = b.m_next) { + b.setAwake(true); + } + } + }; + World.prototype.getAllowSleeping = function () { + return this.m_allowSleep; + }; + /** + * Enable/disable warm starting. For testing. + */ + World.prototype.setWarmStarting = function (flag) { + this.m_warmStarting = flag; + }; + World.prototype.getWarmStarting = function () { + return this.m_warmStarting; + }; + /** + * Enable/disable continuous physics. For testing. + */ + World.prototype.setContinuousPhysics = function (flag) { + this.m_continuousPhysics = flag; + }; + World.prototype.getContinuousPhysics = function () { + return this.m_continuousPhysics; + }; + /** + * Enable/disable single stepped continuous physics. For testing. + */ + World.prototype.setSubStepping = function (flag) { + this.m_subStepping = flag; + }; + World.prototype.getSubStepping = function () { + return this.m_subStepping; + }; + /** + * Set flag to control automatic clearing of forces after each time step. + */ + World.prototype.setAutoClearForces = function (flag) { + this.m_clearForces = flag; + }; + /** + * Get the flag that controls automatic clearing of forces after each time step. + */ + World.prototype.getAutoClearForces = function () { + return this.m_clearForces; + }; + /** + * Manually clear the force buffer on all bodies. By default, forces are cleared + * automatically after each call to step. The default behavior is modified by + * calling setAutoClearForces. The purpose of this function is to support + * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step + * under a variable frame-rate. When you perform sub-stepping you will disable + * auto clearing of forces and instead call clearForces after all sub-steps are + * complete in one pass of your game loop. + * + * See {@link World.setAutoClearForces} + */ + World.prototype.clearForces = function () { + for (var body = this.m_bodyList; body; body = body.getNext()) { + body.m_force.setZero(); + body.m_torque = 0.0; + } + }; + /** + * Query the world for all fixtures that potentially overlap the provided AABB. + * + * @param aabb The query box. + * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query. + */ + World.prototype.queryAABB = function (aabb, callback) { + var broadPhase = this.m_broadPhase; + this.m_broadPhase.query(aabb, function (proxyId) { + var proxy = broadPhase.getUserData(proxyId); + return callback(proxy.fixture); + }); + }; + /** + * Ray-cast the world for all fixtures in the path of the ray. Your callback + * controls whether you get the closest point, any point, or n-points. The + * ray-cast ignores shapes that contain the starting point. + * + * @param point1 The ray starting point + * @param point2 The ray ending point + * @param callback A user implemented callback function. + */ + World.prototype.rayCast = function (point1, point2, callback) { + var broadPhase = this.m_broadPhase; + this.m_broadPhase.rayCast({ + maxFraction: 1.0, + p1: point1, + p2: point2 + }, function (input, proxyId) { + var proxy = broadPhase.getUserData(proxyId); + var fixture = proxy.fixture; + var index = proxy.childIndex; + // @ts-ignore + var output = {}; // TODO GC + var hit = fixture.rayCast(output, input, index); + if (hit) { + var fraction = output.fraction; + var point = Vec2.add(Vec2.mulNumVec2((1.0 - fraction), input.p1), Vec2.mulNumVec2(fraction, input.p2)); + return callback(fixture, point, output.normal, fraction); + } + return input.maxFraction; + }); + }; + /** + * Get the number of broad-phase proxies. + */ + World.prototype.getProxyCount = function () { + return this.m_broadPhase.getProxyCount(); + }; + /** + * Get the height of broad-phase dynamic tree. + */ + World.prototype.getTreeHeight = function () { + return this.m_broadPhase.getTreeHeight(); + }; + /** + * Get the balance of broad-phase dynamic tree. + */ + World.prototype.getTreeBalance = function () { + return this.m_broadPhase.getTreeBalance(); + }; + /** + * Get the quality metric of broad-phase dynamic tree. The smaller the better. + * The minimum is 1. + */ + World.prototype.getTreeQuality = function () { + return this.m_broadPhase.getTreeQuality(); + }; + /** + * Shift the world origin. Useful for large worlds. The body shift formula is: + * position -= newOrigin + * + * @param newOrigin The new origin with respect to the old origin + */ + World.prototype.shiftOrigin = function (newOrigin) { + if (this.m_locked) { + return; + } + for (var b = this.m_bodyList; b; b = b.m_next) { + b.m_xf.p.sub(newOrigin); + b.m_sweep.c0.sub(newOrigin); + b.m_sweep.c.sub(newOrigin); + } + for (var j = this.m_jointList; j; j = j.m_next) { + j.shiftOrigin(newOrigin); + } + this.m_broadPhase.shiftOrigin(newOrigin); + }; + /** + * @internal Used for deserialize. + */ + World.prototype._addBody = function (body) { + if (this.isLocked()) { + return; + } + // Add to world doubly linked list. + body.m_prev = null; + body.m_next = this.m_bodyList; + if (this.m_bodyList) { + this.m_bodyList.m_prev = body; + } + this.m_bodyList = body; + ++this.m_bodyCount; + }; + // tslint:disable-next-line:typedef + World.prototype.createBody = function (arg1, arg2) { + if (this.isLocked()) { + return null; + } + var def = {}; + if (!arg1) ; + else if (Vec2.isValid(arg1)) { + def = { position: arg1, angle: arg2 }; + } + else if (typeof arg1 === 'object') { + def = arg1; + } + var body = new Body(this, def); + this._addBody(body); + return body; + }; + // tslint:disable-next-line:typedef + World.prototype.createDynamicBody = function (arg1, arg2) { + var def = {}; + if (!arg1) ; + else if (Vec2.isValid(arg1)) { + def = { position: arg1, angle: arg2 }; + } + else if (typeof arg1 === 'object') { + def = arg1; + } + def.type = 'dynamic'; + return this.createBody(def); + }; + // tslint:disable-next-line:typedef + World.prototype.createKinematicBody = function (arg1, arg2) { + var def = {}; + if (!arg1) ; + else if (Vec2.isValid(arg1)) { + def = { position: arg1, angle: arg2 }; + } + else if (typeof arg1 === 'object') { + def = arg1; + } + def.type = 'kinematic'; + return this.createBody(def); + }; + /** + * Destroy a rigid body given a definition. No reference to the definition is + * retained. + * + * Warning: This automatically deletes all associated shapes and joints. + * + * Warning: This function is locked during callbacks. + */ + World.prototype.destroyBody = function (b) { + if (this.isLocked()) { + return; + } + if (b.m_destroyed) { + return false; + } + // Delete the attached joints. + var je = b.m_jointList; + while (je) { + var je0 = je; + je = je.next; + this.publish('remove-joint', je0.joint); + this.destroyJoint(je0.joint); + b.m_jointList = je; + } + b.m_jointList = null; + // Delete the attached contacts. + var ce = b.m_contactList; + while (ce) { + var ce0 = ce; + ce = ce.next; + this.destroyContact(ce0.contact); + b.m_contactList = ce; + } + b.m_contactList = null; + // Delete the attached fixtures. This destroys broad-phase proxies. + var f = b.m_fixtureList; + while (f) { + var f0 = f; + f = f.m_next; + this.publish('remove-fixture', f0); + f0.destroyProxies(this.m_broadPhase); + b.m_fixtureList = f; + } + b.m_fixtureList = null; + // Remove world body list. + if (b.m_prev) { + b.m_prev.m_next = b.m_next; + } + if (b.m_next) { + b.m_next.m_prev = b.m_prev; + } + if (b == this.m_bodyList) { + this.m_bodyList = b.m_next; + } + b.m_destroyed = true; + --this.m_bodyCount; + this.publish('remove-body', b); + return true; + }; + /** + * Create a joint to constrain bodies together. No reference to the definition + * is retained. This may cause the connected bodies to cease colliding. + * + * Warning: This function is locked during callbacks. + */ + World.prototype.createJoint = function (joint) { + if (this.isLocked()) { + return null; + } + // Connect to the world list. + joint.m_prev = null; + joint.m_next = this.m_jointList; + if (this.m_jointList) { + this.m_jointList.m_prev = joint; + } + this.m_jointList = joint; + ++this.m_jointCount; + // Connect to the bodies' doubly linked lists. + joint.m_edgeA.joint = joint; + joint.m_edgeA.other = joint.m_bodyB; + joint.m_edgeA.prev = null; + joint.m_edgeA.next = joint.m_bodyA.m_jointList; + if (joint.m_bodyA.m_jointList) + joint.m_bodyA.m_jointList.prev = joint.m_edgeA; + joint.m_bodyA.m_jointList = joint.m_edgeA; + joint.m_edgeB.joint = joint; + joint.m_edgeB.other = joint.m_bodyA; + joint.m_edgeB.prev = null; + joint.m_edgeB.next = joint.m_bodyB.m_jointList; + if (joint.m_bodyB.m_jointList) + joint.m_bodyB.m_jointList.prev = joint.m_edgeB; + joint.m_bodyB.m_jointList = joint.m_edgeB; + // If the joint prevents collisions, then flag any contacts for filtering. + if (joint.m_collideConnected == false) { + for (var edge = joint.m_bodyB.getContactList(); edge; edge = edge.next) { + if (edge.other == joint.m_bodyA) { + // Flag the contact for filtering at the next time step (where either + // body is awake). + edge.contact.flagForFiltering(); + } + } + } + // Note: creating a joint doesn't wake the bodies. + return joint; + }; + /** + * Destroy a joint. This may cause the connected bodies to begin colliding. + * Warning: This function is locked during callbacks. + */ + World.prototype.destroyJoint = function (joint) { + if (this.isLocked()) { + return; + } + // Remove from the doubly linked list. + if (joint.m_prev) { + joint.m_prev.m_next = joint.m_next; + } + if (joint.m_next) { + joint.m_next.m_prev = joint.m_prev; + } + if (joint == this.m_jointList) { + this.m_jointList = joint.m_next; + } + // Disconnect from bodies. + var bodyA = joint.m_bodyA; + var bodyB = joint.m_bodyB; + // Wake up connected bodies. + bodyA.setAwake(true); + bodyB.setAwake(true); + // Remove from body 1. + if (joint.m_edgeA.prev) { + joint.m_edgeA.prev.next = joint.m_edgeA.next; + } + if (joint.m_edgeA.next) { + joint.m_edgeA.next.prev = joint.m_edgeA.prev; + } + if (joint.m_edgeA == bodyA.m_jointList) { + bodyA.m_jointList = joint.m_edgeA.next; + } + joint.m_edgeA.prev = null; + joint.m_edgeA.next = null; + // Remove from body 2 + if (joint.m_edgeB.prev) { + joint.m_edgeB.prev.next = joint.m_edgeB.next; + } + if (joint.m_edgeB.next) { + joint.m_edgeB.next.prev = joint.m_edgeB.prev; + } + if (joint.m_edgeB == bodyB.m_jointList) { + bodyB.m_jointList = joint.m_edgeB.next; + } + joint.m_edgeB.prev = null; + joint.m_edgeB.next = null; + --this.m_jointCount; + // If the joint prevents collisions, then flag any contacts for filtering. + if (joint.m_collideConnected == false) { + var edge = bodyB.getContactList(); + while (edge) { + if (edge.other == bodyA) { + // Flag the contact for filtering at the next time step (where either + // body is awake). + edge.contact.flagForFiltering(); + } + edge = edge.next; + } + } + this.publish('remove-joint', joint); + }; + /** + * Take a time step. This performs collision detection, integration, and + * constraint solution. + * + * Broad-phase, narrow-phase, solve and solve time of impacts. + * + * @param timeStep Time step, this should not vary. + */ + World.prototype.step = function (timeStep, velocityIterations, positionIterations) { + this.publish('pre-step', timeStep); + if ((velocityIterations | 0) !== velocityIterations) { + // TODO: remove this in future + velocityIterations = 0; + } + velocityIterations = velocityIterations || this.m_velocityIterations; + positionIterations = positionIterations || this.m_positionIterations; + // If new fixtures were added, we need to find the new contacts. + if (this.m_newFixture) { + this.findNewContacts(); + this.m_newFixture = false; + } + this.m_locked = true; + this.s_step.reset(timeStep); + this.s_step.velocityIterations = velocityIterations; + this.s_step.positionIterations = positionIterations; + this.s_step.warmStarting = this.m_warmStarting; + this.s_step.blockSolve = this.m_blockSolve; + // Update contacts. This is where some contacts are destroyed. + this.updateContacts(); + // Integrate velocities, solve velocity constraints, and integrate positions. + if (this.m_stepComplete && timeStep > 0.0) { + this.m_solver.solveWorld(this.s_step); + // Synchronize fixtures, check for out of range bodies. + for (var b = this.m_bodyList; b; b = b.getNext()) { + // If a body was not in an island then it did not move. + if (b.m_islandFlag == false) { + continue; + } + if (b.isStatic()) { + continue; + } + // Update fixtures (for broad-phase). + b.synchronizeFixtures(); + } + // Look for new contacts. + this.findNewContacts(); + } + // Handle TOI events. + if (this.m_continuousPhysics && timeStep > 0.0) { + this.m_solver.solveWorldTOI(this.s_step); + } + if (this.m_clearForces) { + this.clearForces(); + } + this.m_locked = false; + this.publish('post-step', timeStep); + }; + /** + * @internal + * Call this method to find new contacts. + */ + World.prototype.findNewContacts = function () { + var _this = this; + this.m_broadPhase.updatePairs(function (proxyA, proxyB) { return _this.createContact(proxyA, proxyB); }); + }; + /** + * @internal + * Callback for broad-phase. + */ + World.prototype.createContact = function (proxyA, proxyB) { + var fixtureA = proxyA.fixture; + var fixtureB = proxyB.fixture; + var indexA = proxyA.childIndex; + var indexB = proxyB.childIndex; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + // Are the fixtures on the same body? + if (bodyA == bodyB) { + return; + } + // TODO_ERIN use a hash table to remove a potential bottleneck when both + // bodies have a lot of contacts. + // Does a contact already exist? + var edge = bodyB.getContactList(); // ContactEdge + while (edge) { + if (edge.other == bodyA) { + var fA = edge.contact.getFixtureA(); + var fB = edge.contact.getFixtureB(); + var iA = edge.contact.getChildIndexA(); + var iB = edge.contact.getChildIndexB(); + if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) { + // A contact already exists. + return; + } + if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) { + // A contact already exists. + return; + } + } + edge = edge.next; + } + if (bodyB.shouldCollide(bodyA) == false) { + return; + } + if (fixtureB.shouldCollide(fixtureA) == false) { + return; + } + // Call the factory. + var contact = Contact.create(fixtureA, indexA, fixtureB, indexB); + if (contact == null) { + return; + } + // Insert into the world. + contact.m_prev = null; + if (this.m_contactList != null) { + contact.m_next = this.m_contactList; + this.m_contactList.m_prev = contact; + } + this.m_contactList = contact; + ++this.m_contactCount; + }; + /** + * @internal + * Removes old non-overlapping contacts, applies filters and updates contacts. + */ + World.prototype.updateContacts = function () { + // Update awake contacts. + var c; + var next_c = this.m_contactList; + while (c = next_c) { + next_c = c.getNext(); + var fixtureA = c.getFixtureA(); + var fixtureB = c.getFixtureB(); + var indexA = c.getChildIndexA(); + var indexB = c.getChildIndexB(); + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + // Is this contact flagged for filtering? + if (c.m_filterFlag) { + if (bodyB.shouldCollide(bodyA) == false) { + this.destroyContact(c); + continue; + } + if (fixtureB.shouldCollide(fixtureA) == false) { + this.destroyContact(c); + continue; + } + // Clear the filtering flag. + c.m_filterFlag = false; + } + var activeA = bodyA.isAwake() && !bodyA.isStatic(); + var activeB = bodyB.isAwake() && !bodyB.isStatic(); + // At least one body must be awake and it must be dynamic or kinematic. + if (activeA == false && activeB == false) { + continue; + } + var proxyIdA = fixtureA.m_proxies[indexA].proxyId; + var proxyIdB = fixtureB.m_proxies[indexB].proxyId; + var overlap = this.m_broadPhase.testOverlap(proxyIdA, proxyIdB); + // Here we destroy contacts that cease to overlap in the broad-phase. + if (overlap == false) { + this.destroyContact(c); + continue; + } + // The contact persists. + c.update(this); + } + }; + /** + * @internal + */ + World.prototype.destroyContact = function (contact) { + Contact.destroy(contact, this); + // Remove from the world. + if (contact.m_prev) { + contact.m_prev.m_next = contact.m_next; + } + if (contact.m_next) { + contact.m_next.m_prev = contact.m_prev; + } + if (contact == this.m_contactList) { + this.m_contactList = contact.m_next; + } + --this.m_contactCount; + }; + /** + * Register an event listener. + */ + // tslint:disable-next-line:typedef + World.prototype.on = function (name, listener) { + if (typeof name !== 'string' || typeof listener !== 'function') { + return this; + } + if (!this._listeners) { + this._listeners = {}; + } + if (!this._listeners[name]) { + this._listeners[name] = []; + } + this._listeners[name].push(listener); + return this; + }; + /** + * Remove an event listener. + */ + // tslint:disable-next-line:typedef + World.prototype.off = function (name, listener) { + if (typeof name !== 'string' || typeof listener !== 'function') { + return this; + } + var listeners = this._listeners && this._listeners[name]; + if (!listeners || !listeners.length) { + return this; + } + var index = listeners.indexOf(listener); + if (index >= 0) { + listeners.splice(index, 1); + } + return this; + }; + World.prototype.publish = function (name, arg1, arg2, arg3) { + var listeners = this._listeners && this._listeners[name]; + if (!listeners || !listeners.length) { + return 0; + } + for (var l = 0; l < listeners.length; l++) { + listeners[l].call(this, arg1, arg2, arg3); + } + return listeners.length; + }; + /** + * @internal + */ + World.prototype.beginContact = function (contact) { + this.publish('begin-contact', contact); + }; + /** + * @internal + */ + World.prototype.endContact = function (contact) { + this.publish('end-contact', contact); + }; + /** + * @internal + */ + World.prototype.preSolve = function (contact, oldManifold) { + this.publish('pre-solve', contact, oldManifold); + }; + /** + * @internal + */ + World.prototype.postSolve = function (contact, impulse) { + this.publish('post-solve', contact, impulse); + }; + return World; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Vec3 = /** @class */ (function () { + // tslint:disable-next-line:typedef + function Vec3(x, y, z) { + if (!(this instanceof Vec3)) { + return new Vec3(x, y, z); + } + if (typeof x === 'undefined') { + this.x = 0; + this.y = 0; + this.z = 0; + } + else if (typeof x === 'object') { + this.x = x.x; + this.y = x.y; + this.z = x.z; + } + else { + this.x = x; + this.y = y; + this.z = z; + } + } + /** @internal */ + Vec3.prototype._serialize = function () { + return { + x: this.x, + y: this.y, + z: this.z + }; + }; + /** @internal */ + Vec3._deserialize = function (data) { + var obj = Object.create(Vec3.prototype); + obj.x = data.x; + obj.y = data.y; + obj.z = data.z; + return obj; + }; + /** @internal */ + Vec3.neo = function (x, y, z) { + var obj = Object.create(Vec3.prototype); + obj.x = x; + obj.y = y; + obj.z = z; + return obj; + }; + Vec3.zero = function () { + var obj = Object.create(Vec3.prototype); + obj.x = 0; + obj.y = 0; + obj.z = 0; + return obj; + }; + Vec3.clone = function (v) { + return Vec3.neo(v.x, v.y, v.z); + }; + /** @internal */ + Vec3.prototype.toString = function () { + return JSON.stringify(this); + }; + /** + * Does this vector contain finite coordinates? + */ + Vec3.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return math.isFinite(obj.x) && math.isFinite(obj.y) && math.isFinite(obj.z); + }; + Vec3.assert = function (o) { + }; + Vec3.prototype.setZero = function () { + this.x = 0.0; + this.y = 0.0; + this.z = 0.0; + return this; + }; + Vec3.prototype.set = function (x, y, z) { + this.x = x; + this.y = y; + this.z = z; + return this; + }; + Vec3.prototype.add = function (w) { + this.x += w.x; + this.y += w.y; + this.z += w.z; + return this; + }; + Vec3.prototype.sub = function (w) { + this.x -= w.x; + this.y -= w.y; + this.z -= w.z; + return this; + }; + Vec3.prototype.mul = function (m) { + this.x *= m; + this.y *= m; + this.z *= m; + return this; + }; + Vec3.areEqual = function (v, w) { + return v === w || + typeof v === 'object' && v !== null && + typeof w === 'object' && w !== null && + v.x === w.x && v.y === w.y && v.z === w.z; + }; + /** + * Perform the dot product on two vectors. + */ + Vec3.dot = function (v, w) { + return v.x * w.x + v.y * w.y + v.z * w.z; + }; + /** + * Perform the cross product on two vectors. In 2D this produces a scalar. + */ + Vec3.cross = function (v, w) { + return new Vec3(v.y * w.z - v.z * w.y, v.z * w.x - v.x * w.z, v.x * w.y - v.y * w.x); + }; + Vec3.add = function (v, w) { + return new Vec3(v.x + w.x, v.y + w.y, v.z + w.z); + }; + Vec3.sub = function (v, w) { + return new Vec3(v.x - w.x, v.y - w.y, v.z - w.z); + }; + Vec3.mul = function (v, m) { + return new Vec3(m * v.x, m * v.y, m * v.z); + }; + Vec3.prototype.neg = function () { + this.x = -this.x; + this.y = -this.y; + this.z = -this.z; + return this; + }; + Vec3.neg = function (v) { + return new Vec3(-v.x, -v.y, -v.z); + }; + return Vec3; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A line segment (edge) shape. These can be connected in chains or loops to + * other edge shapes. The connectivity information is used to ensure correct + * contact normals. + */ +var EdgeShape = /** @class */ (function (_super) { + __extends(EdgeShape, _super); + function EdgeShape(v1, v2) { + var _this = this; + // @ts-ignore + if (!(_this instanceof EdgeShape)) { + return new EdgeShape(v1, v2); + } + _this = _super.call(this) || this; + _this.m_type = EdgeShape.TYPE; + _this.m_radius = Settings.polygonRadius; + _this.m_vertex1 = v1 ? Vec2.clone(v1) : Vec2.zero(); + _this.m_vertex2 = v2 ? Vec2.clone(v2) : Vec2.zero(); + _this.m_vertex0 = Vec2.zero(); + _this.m_vertex3 = Vec2.zero(); + _this.m_hasVertex0 = false; + _this.m_hasVertex3 = false; + return _this; + } + /** @internal */ + EdgeShape.prototype._serialize = function () { + return { + type: this.m_type, + vertex1: this.m_vertex1, + vertex2: this.m_vertex2, + vertex0: this.m_vertex0, + vertex3: this.m_vertex3, + hasVertex0: this.m_hasVertex0, + hasVertex3: this.m_hasVertex3, + }; + }; + /** @internal */ + EdgeShape._deserialize = function (data) { + var shape = new EdgeShape(data.vertex1, data.vertex2); + if (shape.m_hasVertex0) { + shape.setPrevVertex(data.vertex0); + } + if (shape.m_hasVertex3) { + shape.setNextVertex(data.vertex3); + } + return shape; + }; + /** @internal */ + EdgeShape.prototype._reset = function () { + // noop + }; + EdgeShape.prototype.getRadius = function () { + return this.m_radius; + }; + EdgeShape.prototype.getType = function () { + return this.m_type; + }; + /** @internal @deprecated */ + EdgeShape.prototype.setNext = function (v) { + return this.setNextVertex(v); + }; + /** + * Optional next vertex, used for smooth collision. + */ + EdgeShape.prototype.setNextVertex = function (v) { + if (v) { + this.m_vertex3.setVec2(v); + this.m_hasVertex3 = true; + } + else { + this.m_vertex3.setZero(); + this.m_hasVertex3 = false; + } + return this; + }; + /** + * Optional next vertex, used for smooth collision. + */ + EdgeShape.prototype.getNextVertex = function () { + return this.m_vertex3; + }; + /** @internal @deprecated */ + EdgeShape.prototype.setPrev = function (v) { + return this.setPrevVertex(v); + }; + /** + * Optional prev vertex, used for smooth collision. + */ + EdgeShape.prototype.setPrevVertex = function (v) { + if (v) { + this.m_vertex0.setVec2(v); + this.m_hasVertex0 = true; + } + else { + this.m_vertex0.setZero(); + this.m_hasVertex0 = false; + } + return this; + }; + /** + * Optional prev vertex, used for smooth collision. + */ + EdgeShape.prototype.getPrevVertex = function () { + return this.m_vertex0; + }; + /** + * Set this as an isolated edge. + */ + EdgeShape.prototype._set = function (v1, v2) { + this.m_vertex1.setVec2(v1); + this.m_vertex2.setVec2(v2); + this.m_hasVertex0 = false; + this.m_hasVertex3 = false; + return this; + }; + /** + * @internal + * @deprecated Shapes should be treated as immutable. + * + * clone the concrete shape. + */ + EdgeShape.prototype._clone = function () { + var clone = new EdgeShape(); + clone.m_type = this.m_type; + clone.m_radius = this.m_radius; + clone.m_vertex1.setVec2(this.m_vertex1); + clone.m_vertex2.setVec2(this.m_vertex2); + clone.m_vertex0.setVec2(this.m_vertex0); + clone.m_vertex3.setVec2(this.m_vertex3); + clone.m_hasVertex0 = this.m_hasVertex0; + clone.m_hasVertex3 = this.m_hasVertex3; + return clone; + }; + /** + * Get the number of child primitives. + */ + EdgeShape.prototype.getChildCount = function () { + return 1; + }; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + EdgeShape.prototype.testPoint = function (xf, p) { + return false; + }; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + EdgeShape.prototype.rayCast = function (output, input, xf, childIndex) { + // p = p1 + t * d + // v = v1 + s * e + // p1 + t * d = v1 + s * e + // s * e - t * d = p1 - v1 + // NOT_USED(childIndex); + // Put the ray into the edge's frame of reference. + var p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p)); + var p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p)); + var d = Vec2.sub(p2, p1); + var v1 = this.m_vertex1; + var v2 = this.m_vertex2; + var e = Vec2.sub(v2, v1); + var normal = Vec2.neo(e.y, -e.x); + normal.normalize(); + // q = p1 + t * d + // dot(normal, q - v1) = 0 + // dot(normal, p1 - v1) + t * dot(normal, d) = 0 + var numerator = Vec2.dot(normal, Vec2.sub(v1, p1)); + var denominator = Vec2.dot(normal, d); + if (denominator == 0.0) { + return false; + } + var t = numerator / denominator; + if (t < 0.0 || input.maxFraction < t) { + return false; + } + var q = Vec2.add(p1, Vec2.mulNumVec2(t, d)); + // q = v1 + s * r + // s = dot(q - v1, r) / dot(r, r) + var r = Vec2.sub(v2, v1); + var rr = Vec2.dot(r, r); + if (rr == 0.0) { + return false; + } + var s = Vec2.dot(Vec2.sub(q, v1), r) / rr; + if (s < 0.0 || 1.0 < s) { + return false; + } + output.fraction = t; + if (numerator > 0.0) { + output.normal = Rot.mulVec2(xf.q, normal).neg(); + } + else { + output.normal = Rot.mulVec2(xf.q, normal); + } + return true; + }; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + EdgeShape.prototype.computeAABB = function (aabb, xf, childIndex) { + var v1 = Transform.mulVec2(xf, this.m_vertex1); + var v2 = Transform.mulVec2(xf, this.m_vertex2); + aabb.combinePoints(v1, v2); + aabb.extend(this.m_radius); + }; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + EdgeShape.prototype.computeMass = function (massData, density) { + massData.mass = 0.0; + massData.center.setCombine(0.5, this.m_vertex1, 0.5, this.m_vertex2); + massData.I = 0.0; + }; + EdgeShape.prototype.computeDistanceProxy = function (proxy) { + proxy.m_vertices.push(this.m_vertex1); + proxy.m_vertices.push(this.m_vertex2); + proxy.m_count = 2; + proxy.m_radius = this.m_radius; + }; + EdgeShape.TYPE = 'edge'; + return EdgeShape; +}(Shape)); +var Edge = EdgeShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A chain shape is a free form sequence of line segments. The chain has + * two-sided collision, so you can use inside and outside collision. Therefore, + * you may use any winding order. Connectivity information is used to create + * smooth collisions. + * + * WARNING: The chain will not collide properly if there are self-intersections. + */ +var ChainShape = /** @class */ (function (_super) { + __extends(ChainShape, _super); + function ChainShape(vertices, loop) { + var _this = this; + // @ts-ignore + if (!(_this instanceof ChainShape)) { + return new ChainShape(vertices, loop); + } + _this = _super.call(this) || this; + _this.m_type = ChainShape.TYPE; + _this.m_radius = Settings.polygonRadius; + _this.m_vertices = []; + _this.m_count = 0; + _this.m_prevVertex = null; + _this.m_nextVertex = null; + _this.m_hasPrevVertex = false; + _this.m_hasNextVertex = false; + _this.m_isLoop = !!loop; + if (vertices && vertices.length) { + if (loop) { + _this._createLoop(vertices); + } + else { + _this._createChain(vertices); + } + } + return _this; + } + /** @internal */ + ChainShape.prototype._serialize = function () { + var data = { + type: this.m_type, + vertices: this.m_vertices, + isLoop: this.m_isLoop, + hasPrevVertex: this.m_hasPrevVertex, + hasNextVertex: this.m_hasNextVertex, + prevVertex: null, + nextVertex: null, + }; + if (this.m_prevVertex) { + data.prevVertex = this.m_prevVertex; + } + if (this.m_nextVertex) { + data.nextVertex = this.m_nextVertex; + } + return data; + }; + /** @internal */ + ChainShape._deserialize = function (data, fixture, restore) { + var vertices = []; + if (data.vertices) { + for (var i = 0; i < data.vertices.length; i++) { + vertices.push(restore(Vec2, data.vertices[i])); + } + } + var shape = new ChainShape(vertices, data.isLoop); + if (data.prevVertex) { + shape.setPrevVertex(data.prevVertex); + } + if (data.nextVertex) { + shape.setNextVertex(data.nextVertex); + } + return shape; + }; + // clear() { + // this.m_vertices.length = 0; + // this.m_count = 0; + // } + ChainShape.prototype.getType = function () { + return this.m_type; + }; + ChainShape.prototype.getRadius = function () { + return this.m_radius; + }; + /** + * @internal + * Create a loop. This automatically adjusts connectivity. + * + * @param vertices an array of vertices, these are copied + * @param count the vertex count + */ + ChainShape.prototype._createLoop = function (vertices) { + for (var i = 1; i < vertices.length; ++i) { + vertices[i - 1]; + vertices[i]; + } + this.m_vertices = []; + this.m_count = vertices.length + 1; + for (var i = 0; i < vertices.length; ++i) { + this.m_vertices[i] = Vec2.clone(vertices[i]); + } + this.m_vertices[vertices.length] = Vec2.clone(vertices[0]); + this.m_prevVertex = this.m_vertices[this.m_count - 2]; + this.m_nextVertex = this.m_vertices[1]; + this.m_hasPrevVertex = true; + this.m_hasNextVertex = true; + return this; + }; + /** + * @internal + * Create a chain with isolated end vertices. + * + * @param vertices an array of vertices, these are copied + * @param count the vertex count + */ + ChainShape.prototype._createChain = function (vertices) { + for (var i = 1; i < vertices.length; ++i) { + // If the code crashes here, it means your vertices are too close together. + vertices[i - 1]; + vertices[i]; + } + this.m_count = vertices.length; + for (var i = 0; i < vertices.length; ++i) { + this.m_vertices[i] = Vec2.clone(vertices[i]); + } + this.m_hasPrevVertex = false; + this.m_hasNextVertex = false; + this.m_prevVertex = null; + this.m_nextVertex = null; + return this; + }; + /** @internal */ + ChainShape.prototype._reset = function () { + if (this.m_isLoop) { + this._createLoop(this.m_vertices); + } + else { + this._createChain(this.m_vertices); + } + }; + /** + * Establish connectivity to a vertex that precedes the first vertex. Don't call + * this for loops. + */ + ChainShape.prototype.setPrevVertex = function (prevVertex) { + this.m_prevVertex = prevVertex; + this.m_hasPrevVertex = true; + }; + ChainShape.prototype.getPrevVertex = function () { + return this.m_prevVertex; + }; + /** + * Establish connectivity to a vertex that follows the last vertex. Don't call + * this for loops. + */ + ChainShape.prototype.setNextVertex = function (nextVertex) { + this.m_nextVertex = nextVertex; + this.m_hasNextVertex = true; + }; + ChainShape.prototype.getNextVertex = function () { + return this.m_nextVertex; + }; + /** + * @internal + * @deprecated Shapes should be treated as immutable. + * + * clone the concrete shape. + */ + ChainShape.prototype._clone = function () { + var clone = new ChainShape(); + clone._createChain(this.m_vertices); + clone.m_type = this.m_type; + clone.m_radius = this.m_radius; + clone.m_prevVertex = this.m_prevVertex; + clone.m_nextVertex = this.m_nextVertex; + clone.m_hasPrevVertex = this.m_hasPrevVertex; + clone.m_hasNextVertex = this.m_hasNextVertex; + return clone; + }; + /** + * Get the number of child primitives. + */ + ChainShape.prototype.getChildCount = function () { + // edge count = vertex count - 1 + return this.m_count - 1; + }; + // Get a child edge. + ChainShape.prototype.getChildEdge = function (edge, childIndex) { + edge.m_type = EdgeShape.TYPE; + edge.m_radius = this.m_radius; + edge.m_vertex1 = this.m_vertices[childIndex]; + edge.m_vertex2 = this.m_vertices[childIndex + 1]; + if (childIndex > 0) { + edge.m_vertex0 = this.m_vertices[childIndex - 1]; + edge.m_hasVertex0 = true; + } + else { + edge.m_vertex0 = this.m_prevVertex; + edge.m_hasVertex0 = this.m_hasPrevVertex; + } + if (childIndex < this.m_count - 2) { + edge.m_vertex3 = this.m_vertices[childIndex + 2]; + edge.m_hasVertex3 = true; + } + else { + edge.m_vertex3 = this.m_nextVertex; + edge.m_hasVertex3 = this.m_hasNextVertex; + } + }; + ChainShape.prototype.getVertex = function (index) { + if (index < this.m_count) { + return this.m_vertices[index]; + } + else { + return this.m_vertices[0]; + } + }; + ChainShape.prototype.isLoop = function () { + return this.m_isLoop; + }; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * This always return false. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + ChainShape.prototype.testPoint = function (xf, p) { + return false; + }; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + ChainShape.prototype.rayCast = function (output, input, xf, childIndex) { + var edgeShape = new EdgeShape(this.getVertex(childIndex), this.getVertex(childIndex + 1)); + return edgeShape.rayCast(output, input, xf, 0); + }; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + ChainShape.prototype.computeAABB = function (aabb, xf, childIndex) { + var v1 = Transform.mulVec2(xf, this.getVertex(childIndex)); + var v2 = Transform.mulVec2(xf, this.getVertex(childIndex + 1)); + aabb.combinePoints(v1, v2); + }; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * Chains have zero mass. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + ChainShape.prototype.computeMass = function (massData, density) { + massData.mass = 0.0; + massData.center = Vec2.zero(); + massData.I = 0.0; + }; + ChainShape.prototype.computeDistanceProxy = function (proxy, childIndex) { + proxy.m_buffer[0] = this.getVertex(childIndex); + proxy.m_buffer[1] = this.getVertex(childIndex + 1); + proxy.m_vertices = proxy.m_buffer; + proxy.m_count = 2; + proxy.m_radius = this.m_radius; + }; + ChainShape.TYPE = 'chain'; + return ChainShape; +}(Shape)); +var Chain = ChainShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A convex polygon. It is assumed that the interior of the polygon is to the + * left of each edge. Polygons have a maximum number of vertices equal to + * Settings.maxPolygonVertices. In most cases you should not need many vertices + * for a convex polygon. extends Shape + */ +var PolygonShape = /** @class */ (function (_super) { + __extends(PolygonShape, _super); + // @ts-ignore + function PolygonShape(vertices) { + var _this = this; + // @ts-ignore + if (!(_this instanceof PolygonShape)) { + return new PolygonShape(vertices); + } + _this = _super.call(this) || this; + _this.m_type = PolygonShape.TYPE; + _this.m_radius = Settings.polygonRadius; + _this.m_centroid = Vec2.zero(); + _this.m_vertices = []; + _this.m_normals = []; + _this.m_count = 0; + if (vertices && vertices.length) { + _this._set(vertices); + } + return _this; + } + /** @internal */ + PolygonShape.prototype._serialize = function () { + return { + type: this.m_type, + vertices: this.m_vertices, + }; + }; + /** @internal */ + PolygonShape._deserialize = function (data, fixture, restore) { + var vertices = []; + if (data.vertices) { + for (var i = 0; i < data.vertices.length; i++) { + vertices.push(restore(Vec2, data.vertices[i])); + } + } + var shape = new PolygonShape(vertices); + return shape; + }; + PolygonShape.prototype.getType = function () { + return this.m_type; + }; + PolygonShape.prototype.getRadius = function () { + return this.m_radius; + }; + PolygonShape.prototype.getVertex = function (index) { + return this.m_vertices[index]; + }; + /** + * @internal + * @deprecated Shapes should be treated as immutable. + * + * clone the concrete shape. + */ + PolygonShape.prototype._clone = function () { + var clone = new PolygonShape(); + clone.m_type = this.m_type; + clone.m_radius = this.m_radius; + clone.m_count = this.m_count; + clone.m_centroid.setVec2(this.m_centroid); + for (var i = 0; i < this.m_count; i++) { + clone.m_vertices.push(this.m_vertices[i].clone()); + } + for (var i = 0; i < this.m_normals.length; i++) { + clone.m_normals.push(this.m_normals[i].clone()); + } + return clone; + }; + /** + * Get the number of child primitives. + */ + PolygonShape.prototype.getChildCount = function () { + return 1; + }; + /** @internal */ + PolygonShape.prototype._reset = function () { + this._set(this.m_vertices); + }; + /** + * @internal + * + * Create a convex hull from the given array of local points. The count must be + * in the range [3, Settings.maxPolygonVertices]. + * + * Warning: the points may be re-ordered, even if they form a convex polygon + * Warning: collinear points are handled but not removed. Collinear points may + * lead to poor stacking behavior. + */ + PolygonShape.prototype._set = function (vertices) { + if (vertices.length < 3) { + this._setAsBox(1.0, 1.0); + return; + } + var n = math.min(vertices.length, Settings.maxPolygonVertices); + // Perform welding and copy vertices into local buffer. + var ps = []; // [Settings.maxPolygonVertices]; + for (var i = 0; i < n; ++i) { + var v = vertices[i]; + var unique = true; + for (var j = 0; j < ps.length; ++j) { + if (Vec2.distanceSquared(v, ps[j]) < 0.25 * Settings.linearSlopSquared) { + unique = false; + break; + } + } + if (unique) { + ps.push(Vec2.clone(v)); + } + } + n = ps.length; + if (n < 3) { + this._setAsBox(1.0, 1.0); + return; + } + // Create the convex hull using the Gift wrapping algorithm + // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm + // Find the right most point on the hull (in case of multiple points bottom most is used) + var i0 = 0; + var x0 = ps[0].x; + for (var i = 1; i < n; ++i) { + var x = ps[i].x; + if (x > x0 || (x === x0 && ps[i].y < ps[i0].y)) { + i0 = i; + x0 = x; + } + } + var hull = []; // [Settings.maxPolygonVertices]; + var m = 0; + var ih = i0; + while (true) { + hull[m] = ih; + var ie = 0; + for (var j = 1; j < n; ++j) { + if (ie === ih) { + ie = j; + continue; + } + var r = Vec2.sub(ps[ie], ps[hull[m]]); + var v = Vec2.sub(ps[j], ps[hull[m]]); + var c = Vec2.crossVec2Vec2(r, v); + // c < 0 means counter-clockwise wrapping, c > 0 means clockwise wrapping + if (c < 0.0) { + ie = j; + } + // Collinearity check + if (c === 0.0 && v.lengthSquared() > r.lengthSquared()) { + ie = j; + } + } + ++m; + ih = ie; + if (ie === i0) { + break; + } + } + if (m < 3) { + this._setAsBox(1.0, 1.0); + return; + } + this.m_count = m; + // Copy vertices. + this.m_vertices = []; + for (var i = 0; i < m; ++i) { + this.m_vertices[i] = ps[hull[i]]; + } + // Compute normals. Ensure the edges have non-zero length. + for (var i = 0; i < m; ++i) { + var i1 = i; + var i2 = i + 1 < m ? i + 1 : 0; + var edge = Vec2.sub(this.m_vertices[i2], this.m_vertices[i1]); + this.m_normals[i] = Vec2.crossVec2Num(edge, 1.0); + this.m_normals[i].normalize(); + } + // Compute the polygon centroid. + this.m_centroid = ComputeCentroid(this.m_vertices, m); + }; + /** @internal */ + PolygonShape.prototype._setAsBox = function (hx, hy, center, angle) { + // start with right-bottom, counter-clockwise, as in Gift wrapping algorithm in PolygonShape._set() + this.m_vertices[0] = Vec2.neo(hx, -hy); + this.m_vertices[1] = Vec2.neo(hx, hy); + this.m_vertices[2] = Vec2.neo(-hx, hy); + this.m_vertices[3] = Vec2.neo(-hx, -hy); + this.m_normals[0] = Vec2.neo(1.0, 0.0); + this.m_normals[1] = Vec2.neo(0.0, 1.0); + this.m_normals[2] = Vec2.neo(-1.0, 0.0); + this.m_normals[3] = Vec2.neo(0.0, -1.0); + this.m_count = 4; + if (Vec2.isValid(center)) { + angle = angle || 0; + this.m_centroid.setVec2(center); + var xf = Transform.identity(); + xf.p.setVec2(center); + xf.q.setAngle(angle); + // Transform vertices and normals. + for (var i = 0; i < this.m_count; ++i) { + this.m_vertices[i] = Transform.mulVec2(xf, this.m_vertices[i]); + this.m_normals[i] = Rot.mulVec2(xf.q, this.m_normals[i]); + } + } + }; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + PolygonShape.prototype.testPoint = function (xf, p) { + var pLocal = Rot.mulTVec2(xf.q, Vec2.sub(p, xf.p)); + for (var i = 0; i < this.m_count; ++i) { + var dot = Vec2.dot(this.m_normals[i], Vec2.sub(pLocal, this.m_vertices[i])); + if (dot > 0.0) { + return false; + } + } + return true; + }; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + PolygonShape.prototype.rayCast = function (output, input, xf, childIndex) { + // Put the ray into the polygon's frame of reference. + var p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p)); + var p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p)); + var d = Vec2.sub(p2, p1); + var lower = 0.0; + var upper = input.maxFraction; + var index = -1; + for (var i = 0; i < this.m_count; ++i) { + // p = p1 + a * d + // dot(normal, p - v) = 0 + // dot(normal, p1 - v) + a * dot(normal, d) = 0 + var numerator = Vec2.dot(this.m_normals[i], Vec2.sub(this.m_vertices[i], p1)); + var denominator = Vec2.dot(this.m_normals[i], d); + if (denominator == 0.0) { + if (numerator < 0.0) { + return false; + } + } + else { + // Note: we want this predicate without division: + // lower < numerator / denominator, where denominator < 0 + // Since denominator < 0, we have to flip the inequality: + // lower < numerator / denominator <==> denominator * lower > numerator. + if (denominator < 0.0 && numerator < lower * denominator) { + // Increase lower. + // The segment enters this half-space. + lower = numerator / denominator; + index = i; + } + else if (denominator > 0.0 && numerator < upper * denominator) { + // Decrease upper. + // The segment exits this half-space. + upper = numerator / denominator; + } + } + // The use of epsilon here causes the assert on lower to trip + // in some cases. Apparently the use of epsilon was to make edge + // shapes work, but now those are handled separately. + // if (upper < lower - Math.EPSILON) + if (upper < lower) { + return false; + } + } + if (index >= 0) { + output.fraction = lower; + output.normal = Rot.mulVec2(xf.q, this.m_normals[index]); + return true; + } + return false; + }; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + PolygonShape.prototype.computeAABB = function (aabb, xf, childIndex) { + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + for (var i = 0; i < this.m_count; ++i) { + var v = Transform.mulVec2(xf, this.m_vertices[i]); + minX = math.min(minX, v.x); + maxX = math.max(maxX, v.x); + minY = math.min(minY, v.y); + maxY = math.max(maxY, v.y); + } + aabb.lowerBound.setNum(minX, minY); + aabb.upperBound.setNum(maxX, maxY); + aabb.extend(this.m_radius); + }; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + PolygonShape.prototype.computeMass = function (massData, density) { + var center = Vec2.zero(); + var area = 0.0; + var I = 0.0; + // s is the reference point for forming triangles. + // It's location doesn't change the result (except for rounding error). + var s = Vec2.zero(); + // This code would put the reference point inside the polygon. + for (var i = 0; i < this.m_count; ++i) { + s.add(this.m_vertices[i]); + } + s.mul(1.0 / this.m_count); + var k_inv3 = 1.0 / 3.0; + for (var i = 0; i < this.m_count; ++i) { + // Triangle vertices. + var e1 = Vec2.sub(this.m_vertices[i], s); + var e2 = i + 1 < this.m_count ? Vec2.sub(this.m_vertices[i + 1], s) : Vec2.sub(this.m_vertices[0], s); + var D = Vec2.crossVec2Vec2(e1, e2); + var triangleArea = 0.5 * D; + area += triangleArea; + // Area weighted centroid + center.addCombine(triangleArea * k_inv3, e1, triangleArea * k_inv3, e2); + var ex1 = e1.x; + var ey1 = e1.y; + var ex2 = e2.x; + var ey2 = e2.y; + var intx2 = ex1 * ex1 + ex2 * ex1 + ex2 * ex2; + var inty2 = ey1 * ey1 + ey2 * ey1 + ey2 * ey2; + I += (0.25 * k_inv3 * D) * (intx2 + inty2); + } + // Total mass + massData.mass = density * area; + center.mul(1.0 / area); + massData.center.setCombine(1, center, 1, s); + // Inertia tensor relative to the local origin (point s). + massData.I = density * I; + // Shift to center of mass then to original body origin. + massData.I += massData.mass * (Vec2.dot(massData.center, massData.center) - Vec2.dot(center, center)); + }; + /** + * Validate convexity. This is a very time consuming operation. + * @returns true if valid + */ + PolygonShape.prototype.validate = function () { + for (var i = 0; i < this.m_count; ++i) { + var i1 = i; + var i2 = i < this.m_count - 1 ? i1 + 1 : 0; + var p = this.m_vertices[i1]; + var e = Vec2.sub(this.m_vertices[i2], p); + for (var j = 0; j < this.m_count; ++j) { + if (j == i1 || j == i2) { + continue; + } + var v = Vec2.sub(this.m_vertices[j], p); + var c = Vec2.crossVec2Vec2(e, v); + if (c < 0.0) { + return false; + } + } + } + return true; + }; + PolygonShape.prototype.computeDistanceProxy = function (proxy) { + proxy.m_vertices = this.m_vertices; + proxy.m_count = this.m_count; + proxy.m_radius = this.m_radius; + }; + PolygonShape.TYPE = 'polygon'; + return PolygonShape; +}(Shape)); +function ComputeCentroid(vs, count) { + var c = Vec2.zero(); + var area = 0.0; + // pRef is the reference point for forming triangles. + // It's location doesn't change the result (except for rounding error). + var pRef = Vec2.zero(); + var i; + var inv3 = 1.0 / 3.0; + for (var i = 0; i < count; ++i) { + // Triangle vertices. + var p1 = pRef; + var p2 = vs[i]; + var p3 = i + 1 < count ? vs[i + 1] : vs[0]; + var e1 = Vec2.sub(p2, p1); + var e2 = Vec2.sub(p3, p1); + var D = Vec2.crossVec2Vec2(e1, e2); + var triangleArea = 0.5 * D; + area += triangleArea; + // Area weighted centroid + c.addMul(triangleArea * inv3, p1); + c.addMul(triangleArea * inv3, p2); + c.addMul(triangleArea * inv3, p3); + } + c.mul(1.0 / area); + return c; +} +var Polygon = PolygonShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A rectangle polygon which extend PolygonShape. + */ +var BoxShape = /** @class */ (function (_super) { + __extends(BoxShape, _super); + function BoxShape(hx, hy, center, angle) { + var _this = this; + // @ts-ignore + if (!(_this instanceof BoxShape)) { + return new BoxShape(hx, hy, center, angle); + } + _this = _super.call(this) || this; + _this._setAsBox(hx, hy, center, angle); + return _this; + } + BoxShape.TYPE = 'polygon'; + return BoxShape; +}(PolygonShape)); +var Box = BoxShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var CircleShape = /** @class */ (function (_super) { + __extends(CircleShape, _super); + // tslint:disable-next-line:typedef + function CircleShape(a, b) { + var _this = this; + // @ts-ignore + if (!(_this instanceof CircleShape)) { + return new CircleShape(a, b); + } + _this = _super.call(this) || this; + _this.m_type = CircleShape.TYPE; + _this.m_p = Vec2.zero(); + _this.m_radius = 1; + if (typeof a === 'object' && Vec2.isValid(a)) { + _this.m_p.setVec2(a); + if (typeof b === 'number') { + _this.m_radius = b; + } + } + else if (typeof a === 'number') { + _this.m_radius = a; + } + return _this; + } + /** @internal */ + CircleShape.prototype._serialize = function () { + return { + type: this.m_type, + p: this.m_p, + radius: this.m_radius, + }; + }; + /** @internal */ + CircleShape._deserialize = function (data) { + return new CircleShape(data.p, data.radius); + }; + /** @internal */ + CircleShape.prototype._reset = function () { + // noop + }; + CircleShape.prototype.getType = function () { + return this.m_type; + }; + CircleShape.prototype.getRadius = function () { + return this.m_radius; + }; + CircleShape.prototype.getCenter = function () { + return this.m_p; + }; + CircleShape.prototype.getVertex = function (index) { + return this.m_p; + }; + /** + * @internal + * @deprecated Shapes should be treated as immutable. + * + * clone the concrete shape. + */ + CircleShape.prototype._clone = function () { + var clone = new CircleShape(); + clone.m_type = this.m_type; + clone.m_radius = this.m_radius; + clone.m_p = this.m_p.clone(); + return clone; + }; + /** + * Get the number of child primitives. + */ + CircleShape.prototype.getChildCount = function () { + return 1; + }; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + CircleShape.prototype.testPoint = function (xf, p) { + var center = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); + var d = Vec2.sub(p, center); + return Vec2.dot(d, d) <= this.m_radius * this.m_radius; + }; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + CircleShape.prototype.rayCast = function (output, input, xf, childIndex) { + // Collision Detection in Interactive 3D Environments by Gino van den Bergen + // From Section 3.1.2 + // x = s + a * r + // norm(x) = radius + var position = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); + var s = Vec2.sub(input.p1, position); + var b = Vec2.dot(s, s) - this.m_radius * this.m_radius; + // Solve quadratic equation. + var r = Vec2.sub(input.p2, input.p1); + var c = Vec2.dot(s, r); + var rr = Vec2.dot(r, r); + var sigma = c * c - rr * b; + // Check for negative discriminant and short segment. + if (sigma < 0.0 || rr < math.EPSILON) { + return false; + } + // Find the point of intersection of the line with the circle. + var a = -(c + math.sqrt(sigma)); + // Is the intersection point on the segment? + if (0.0 <= a && a <= input.maxFraction * rr) { + a /= rr; + output.fraction = a; + output.normal = Vec2.add(s, Vec2.mulNumVec2(a, r)); + output.normal.normalize(); + return true; + } + return false; + }; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + CircleShape.prototype.computeAABB = function (aabb, xf, childIndex) { + var p = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); + aabb.lowerBound.setNum(p.x - this.m_radius, p.y - this.m_radius); + aabb.upperBound.setNum(p.x + this.m_radius, p.y + this.m_radius); + }; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + CircleShape.prototype.computeMass = function (massData, density) { + massData.mass = density * math.PI * this.m_radius * this.m_radius; + massData.center = this.m_p; + // inertia about the local origin + massData.I = massData.mass + * (0.5 * this.m_radius * this.m_radius + Vec2.dot(this.m_p, this.m_p)); + }; + CircleShape.prototype.computeDistanceProxy = function (proxy) { + proxy.m_vertices.push(this.m_p); + proxy.m_count = 1; + proxy.m_radius = this.m_radius; + }; + CircleShape.TYPE = 'circle'; + return CircleShape; +}(Shape)); +var Circle = CircleShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$a = { + frequencyHz: 0.0, + dampingRatio: 0.0 +}; +/** + * A distance joint constrains two points on two bodies to remain at a fixed + * distance from each other. You can view this as a massless, rigid rod. + * + * @param anchorA Anchor A in global coordination. + * @param anchorB Anchor B in global coordination. + */ +var DistanceJoint = /** @class */ (function (_super) { + __extends(DistanceJoint, _super); + function DistanceJoint(def, bodyA, bodyB, anchorA, anchorB) { + var _this = this; + // @ts-ignore + if (!(_this instanceof DistanceJoint)) { + return new DistanceJoint(def, bodyA, bodyB, anchorA, anchorB); + } + // order of constructor arguments is changed in v0.2 + if (bodyB && anchorA && ('m_type' in anchorA) && ('x' in bodyB) && ('y' in bodyB)) { + var temp = bodyB; + bodyB = anchorA; + anchorA = temp; + } + def = options(def, DEFAULTS$a); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = DistanceJoint.TYPE; + // Solver shared + _this.m_localAnchorA = Vec2.clone(anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.zero()); + _this.m_length = math.isFinite(def.length) ? def.length : + Vec2.distance(bodyA.getWorldPoint(_this.m_localAnchorA), bodyB.getWorldPoint(_this.m_localAnchorB)); + _this.m_frequencyHz = def.frequencyHz; + _this.m_dampingRatio = def.dampingRatio; + _this.m_impulse = 0.0; + _this.m_gamma = 0.0; + _this.m_bias = 0.0; + return _this; + // 1-D constrained system + // m (v2 - v1) = lambda + // v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass. + // x2 = x1 + h * v2 + // 1-D mass-damper-spring system + // m (v2 - v1) + h * d * v2 + h * k * + // C = norm(p2 - p1) - L + // u = (p2 - p1) / norm(p2 - p1) + // Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1)) + // J = [-u -cross(r1, u) u cross(r2, u)] + // K = J * invM * JT + // = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2 + } + /** @internal */ + DistanceJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + frequencyHz: this.m_frequencyHz, + dampingRatio: this.m_dampingRatio, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + length: this.m_length, + impulse: this.m_impulse, + gamma: this.m_gamma, + bias: this.m_bias, + }; + }; + /** @internal */ + DistanceJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new DistanceJoint(data); + return joint; + }; + /** @internal */ + DistanceJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + if (def.length > 0) { + this.m_length = +def.length; + } + else if (def.length < 0) ; + else if (def.anchorA || def.anchorA || def.anchorA || def.anchorA) { + this.m_length = Vec2.distance(this.m_bodyA.getWorldPoint(this.m_localAnchorA), this.m_bodyB.getWorldPoint(this.m_localAnchorB)); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + DistanceJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + DistanceJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * Set the natural length. Manipulating the length can lead to non-physical + * behavior when the frequency is zero. + */ + DistanceJoint.prototype.setLength = function (length) { + this.m_length = length; + }; + /** + * Get the natural length. + */ + DistanceJoint.prototype.getLength = function () { + return this.m_length; + }; + DistanceJoint.prototype.setFrequency = function (hz) { + this.m_frequencyHz = hz; + }; + DistanceJoint.prototype.getFrequency = function () { + return this.m_frequencyHz; + }; + DistanceJoint.prototype.setDampingRatio = function (ratio) { + this.m_dampingRatio = ratio; + }; + DistanceJoint.prototype.getDampingRatio = function () { + return this.m_dampingRatio; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + DistanceJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + DistanceJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + DistanceJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + DistanceJoint.prototype.getReactionTorque = function (inv_dt) { + return 0.0; + }; + DistanceJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + this.m_u = Vec2.sub(Vec2.add(cB, this.m_rB), Vec2.add(cA, this.m_rA)); + // Handle singularity. + var length = this.m_u.length(); + if (length > Settings.linearSlop) { + this.m_u.mul(1.0 / length); + } + else { + this.m_u.setNum(0.0, 0.0); + } + var crAu = Vec2.crossVec2Vec2(this.m_rA, this.m_u); + var crBu = Vec2.crossVec2Vec2(this.m_rB, this.m_u); + var invMass = this.m_invMassA + this.m_invIA * crAu * crAu + this.m_invMassB + + this.m_invIB * crBu * crBu; + // Compute the effective mass matrix. + this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0; + if (this.m_frequencyHz > 0.0) { + var C = length - this.m_length; + // Frequency + var omega = 2.0 * math.PI * this.m_frequencyHz; + // Damping coefficient + var d = 2.0 * this.m_mass * this.m_dampingRatio * omega; + // Spring stiffness + var k = this.m_mass * omega * omega; + // magic formulas + var h = step.dt; + this.m_gamma = h * (d + h * k); + this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0; + this.m_bias = C * h * k * this.m_gamma; + invMass += this.m_gamma; + this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0; + } + else { + this.m_gamma = 0.0; + this.m_bias = 0.0; + } + if (step.warmStarting) { + // Scale the impulse to support a variable time step. + this.m_impulse *= step.dtRatio; + var P = Vec2.mulNumVec2(this.m_impulse, this.m_u); + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); + } + else { + this.m_impulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + DistanceJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + // Cdot = dot(u, v + cross(w, r)) + var vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA)); + var vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)); + var Cdot = Vec2.dot(this.m_u, vpB) - Vec2.dot(this.m_u, vpA); + var impulse = -this.m_mass + * (Cdot + this.m_bias + this.m_gamma * this.m_impulse); + this.m_impulse += impulse; + var P = Vec2.mulNumVec2(impulse, this.m_u); + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + DistanceJoint.prototype.solvePositionConstraints = function (step) { + if (this.m_frequencyHz > 0.0) { + // There is no position correction for soft distance constraints. + return true; + } + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); + var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); + var u = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); + var length = u.normalize(); + var C = length - this.m_length; + C = math + .clamp(C, -Settings.maxLinearCorrection, Settings.maxLinearCorrection); + var impulse = -this.m_mass * C; + var P = Vec2.mulNumVec2(impulse, u); + cA.subMul(this.m_invMassA, P); + aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P); + cB.addMul(this.m_invMassB, P); + aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P); + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + return math.abs(C) < Settings.linearSlop; + }; + DistanceJoint.TYPE = 'distance-joint'; + return DistanceJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$9 = { + maxForce: 0.0, + maxTorque: 0.0, +}; +/** + * Friction joint. This is used for top-down friction. It provides 2D + * translational friction and angular friction. + * + * @param anchor Anchor in global coordination. + */ +var FrictionJoint = /** @class */ (function (_super) { + __extends(FrictionJoint, _super); + function FrictionJoint(def, bodyA, bodyB, anchor) { + var _this = this; + // @ts-ignore + if (!(_this instanceof FrictionJoint)) { + return new FrictionJoint(def, bodyA, bodyB, anchor); + } + def = options(def, DEFAULTS$9); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = FrictionJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + // Solver shared + _this.m_linearImpulse = Vec2.zero(); + _this.m_angularImpulse = 0.0; + _this.m_maxForce = def.maxForce; + _this.m_maxTorque = def.maxTorque; + return _this; + // Point-to-point constraint + // Cdot = v2 - v1 + // = v2 + cross(w2, r2) - v1 - cross(w1, r1) + // J = [-I -r1_skew I r2_skew ] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + // Angle constraint + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // K = invI1 + invI2 + } + /** @internal */ + FrictionJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + maxForce: this.m_maxForce, + maxTorque: this.m_maxTorque, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + }; + }; + /** @internal */ + FrictionJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new FrictionJoint(data); + return joint; + }; + /** @internal */ + FrictionJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + FrictionJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + FrictionJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * Set the maximum friction force in N. + */ + FrictionJoint.prototype.setMaxForce = function (force) { + this.m_maxForce = force; + }; + /** + * Get the maximum friction force in N. + */ + FrictionJoint.prototype.getMaxForce = function () { + return this.m_maxForce; + }; + /** + * Set the maximum friction torque in N*m. + */ + FrictionJoint.prototype.setMaxTorque = function (torque) { + this.m_maxTorque = torque; + }; + /** + * Get the maximum friction torque in N*m. + */ + FrictionJoint.prototype.getMaxTorque = function () { + return this.m_maxTorque; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + FrictionJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + FrictionJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + FrictionJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + FrictionJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_angularImpulse; + }; + FrictionJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + // Compute the effective mass matrix. + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var K = new Mat22(); + K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y + * this.m_rB.y; + K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y; + K.ey.x = K.ex.y; + K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x + * this.m_rB.x; + this.m_linearMass = K.getInverse(); + this.m_angularMass = iA + iB; + if (this.m_angularMass > 0.0) { + this.m_angularMass = 1.0 / this.m_angularMass; + } + if (step.warmStarting) { + // Scale impulses to support a variable time step. + this.m_linearImpulse.mul(step.dtRatio); + this.m_angularImpulse *= step.dtRatio; + var P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse); + } + else { + this.m_linearImpulse.setZero(); + this.m_angularImpulse = 0.0; + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + FrictionJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var h = step.dt; // float + // Solve angular friction + { + var Cdot = wB - wA; // float + var impulse = -this.m_angularMass * Cdot; // float + var oldImpulse = this.m_angularImpulse; // float + var maxImpulse = h * this.m_maxTorque; // float + this.m_angularImpulse = math.clamp(this.m_angularImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_angularImpulse - oldImpulse; + wA -= iA * impulse; + wB += iB * impulse; + } + // Solve linear friction + { + var Cdot = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA))); // Vec2 + var impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); // Vec2 + var oldImpulse = this.m_linearImpulse; // Vec2 + this.m_linearImpulse.add(impulse); + var maxImpulse = h * this.m_maxForce; // float + if (this.m_linearImpulse.lengthSquared() > maxImpulse * maxImpulse) { + this.m_linearImpulse.normalize(); + this.m_linearImpulse.mul(maxImpulse); + } + impulse = Vec2.sub(this.m_linearImpulse, oldImpulse); + vA.subMul(mA, impulse); + wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); + vB.addMul(mB, impulse); + wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + FrictionJoint.prototype.solvePositionConstraints = function (step) { + return true; + }; + FrictionJoint.TYPE = 'friction-joint'; + return FrictionJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A 3-by-3 matrix. Stored in column-major order. + */ +var Mat33 = /** @class */ (function () { + function Mat33(a, b, c) { + if (typeof a === 'object' && a !== null) { + this.ex = Vec3.clone(a); + this.ey = Vec3.clone(b); + this.ez = Vec3.clone(c); + } + else { + this.ex = Vec3.zero(); + this.ey = Vec3.zero(); + this.ez = Vec3.zero(); + } + } + /** @internal */ + Mat33.prototype.toString = function () { + return JSON.stringify(this); + }; + Mat33.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return Vec3.isValid(obj.ex) && Vec3.isValid(obj.ey) && Vec3.isValid(obj.ez); + }; + Mat33.assert = function (o) { + }; + /** + * Set this matrix to all zeros. + */ + Mat33.prototype.setZero = function () { + this.ex.setZero(); + this.ey.setZero(); + this.ez.setZero(); + return this; + }; + /** + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. + */ + Mat33.prototype.solve33 = function (v) { + var det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez)); + if (det !== 0.0) { + det = 1.0 / det; + } + var r = new Vec3(); + r.x = det * Vec3.dot(v, Vec3.cross(this.ey, this.ez)); + r.y = det * Vec3.dot(this.ex, Vec3.cross(v, this.ez)); + r.z = det * Vec3.dot(this.ex, Vec3.cross(this.ey, v)); + return r; + }; + /** + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix + * equation. + */ + Mat33.prototype.solve22 = function (v) { + var a11 = this.ex.x; + var a12 = this.ey.x; + var a21 = this.ex.y; + var a22 = this.ey.y; + var det = a11 * a22 - a12 * a21; + if (det !== 0.0) { + det = 1.0 / det; + } + var r = Vec2.zero(); + r.x = det * (a22 * v.x - a12 * v.y); + r.y = det * (a11 * v.y - a21 * v.x); + return r; + }; + /** + * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if + * singular. + */ + Mat33.prototype.getInverse22 = function (M) { + var a = this.ex.x; + var b = this.ey.x; + var c = this.ex.y; + var d = this.ey.y; + var det = a * d - b * c; + if (det !== 0.0) { + det = 1.0 / det; + } + M.ex.x = det * d; + M.ey.x = -det * b; + M.ex.z = 0.0; + M.ex.y = -det * c; + M.ey.y = det * a; + M.ey.z = 0.0; + M.ez.x = 0.0; + M.ez.y = 0.0; + M.ez.z = 0.0; + }; + /** + * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix + * if singular. + */ + Mat33.prototype.getSymInverse33 = function (M) { + var det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez)); + if (det !== 0.0) { + det = 1.0 / det; + } + var a11 = this.ex.x; + var a12 = this.ey.x; + var a13 = this.ez.x; + var a22 = this.ey.y; + var a23 = this.ez.y; + var a33 = this.ez.z; + M.ex.x = det * (a22 * a33 - a23 * a23); + M.ex.y = det * (a13 * a23 - a12 * a33); + M.ex.z = det * (a12 * a23 - a13 * a22); + M.ey.x = M.ex.y; + M.ey.y = det * (a11 * a33 - a13 * a13); + M.ey.z = det * (a13 * a12 - a11 * a23); + M.ez.x = M.ex.z; + M.ez.y = M.ey.z; + M.ez.z = det * (a11 * a22 - a12 * a12); + }; + // tslint:disable-next-line:typedef + Mat33.mul = function (a, b) { + if (b && 'z' in b && 'y' in b && 'x' in b) { + var x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z; + var y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z; + var z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z; + return new Vec3(x, y, z); + } + else if (b && 'y' in b && 'x' in b) { + var x = a.ex.x * b.x + a.ey.x * b.y; + var y = a.ex.y * b.x + a.ey.y * b.y; + return Vec2.neo(x, y); + } + }; + Mat33.mulVec3 = function (a, b) { + var x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z; + var y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z; + var z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z; + return new Vec3(x, y, z); + }; + Mat33.mulVec2 = function (a, b) { + var x = a.ex.x * b.x + a.ey.x * b.y; + var y = a.ex.y * b.x + a.ey.y * b.y; + return Vec2.neo(x, y); + }; + Mat33.add = function (a, b) { + return new Mat33(Vec3.add(a.ex, b.ex), Vec3.add(a.ey, b.ey), Vec3.add(a.ez, b.ez)); + }; + return Mat33; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var inactiveLimit$2 = 0; +var atLowerLimit$1 = 1; +var atUpperLimit$2 = 2; +var equalLimits$1 = 3; +var DEFAULTS$8 = { + lowerAngle: 0.0, + upperAngle: 0.0, + maxMotorTorque: 0.0, + motorSpeed: 0.0, + enableLimit: false, + enableMotor: false +}; +/** + * A revolute joint constrains two bodies to share a common point while they are + * free to rotate about the point. The relative rotation about the shared point + * is the joint angle. You can limit the relative rotation with a joint limit + * that specifies a lower and upper angle. You can use a motor to drive the + * relative rotation about the shared point. A maximum motor torque is provided + * so that infinite forces are not generated. + */ +var RevoluteJoint = /** @class */ (function (_super) { + __extends(RevoluteJoint, _super); + // @ts-ignore + function RevoluteJoint(def, bodyA, bodyB, anchor) { + var _this = this; + // @ts-ignore + if (!(_this instanceof RevoluteJoint)) { + return new RevoluteJoint(def, bodyA, bodyB, anchor); + } + def = options(def, DEFAULTS$8); + _this = _super.call(this, def, bodyA, bodyB) || this; + // effective mass for point-to-point constraint. + /** @internal */ _this.m_mass = new Mat33(); + /** @internal */ _this.m_limitState = inactiveLimit$2; // TODO enum + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = RevoluteJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + _this.m_referenceAngle = math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); + _this.m_impulse = new Vec3(); + _this.m_motorImpulse = 0.0; + _this.m_lowerAngle = def.lowerAngle; + _this.m_upperAngle = def.upperAngle; + _this.m_maxMotorTorque = def.maxMotorTorque; + _this.m_motorSpeed = def.motorSpeed; + _this.m_enableLimit = def.enableLimit; + _this.m_enableMotor = def.enableMotor; + return _this; + // Point-to-point constraint + // C = p2 - p1 + // Cdot = v2 - v1 + // = v2 + cross(w2, r2) - v1 - cross(w1, r1) + // J = [-I -r1_skew I r2_skew ] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + // Motor constraint + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // K = invI1 + invI2 + } + /** @internal */ + RevoluteJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + lowerAngle: this.m_lowerAngle, + upperAngle: this.m_upperAngle, + maxMotorTorque: this.m_maxMotorTorque, + motorSpeed: this.m_motorSpeed, + enableLimit: this.m_enableLimit, + enableMotor: this.m_enableMotor, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + referenceAngle: this.m_referenceAngle, + }; + }; + /** @internal */ + RevoluteJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new RevoluteJoint(data); + return joint; + }; + /** @internal */ + RevoluteJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + RevoluteJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + RevoluteJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * Get the reference angle. + */ + RevoluteJoint.prototype.getReferenceAngle = function () { + return this.m_referenceAngle; + }; + /** + * Get the current joint angle in radians. + */ + RevoluteJoint.prototype.getJointAngle = function () { + var bA = this.m_bodyA; + var bB = this.m_bodyB; + return bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle; + }; + /** + * Get the current joint angle speed in radians per second. + */ + RevoluteJoint.prototype.getJointSpeed = function () { + var bA = this.m_bodyA; + var bB = this.m_bodyB; + return bB.m_angularVelocity - bA.m_angularVelocity; + }; + /** + * Is the joint motor enabled? + */ + RevoluteJoint.prototype.isMotorEnabled = function () { + return this.m_enableMotor; + }; + /** + * Enable/disable the joint motor. + */ + RevoluteJoint.prototype.enableMotor = function (flag) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableMotor = flag; + }; + /** + * Get the current motor torque given the inverse time step. Unit is N*m. + */ + RevoluteJoint.prototype.getMotorTorque = function (inv_dt) { + return inv_dt * this.m_motorImpulse; + }; + /** + * Set the motor speed in radians per second. + */ + RevoluteJoint.prototype.setMotorSpeed = function (speed) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_motorSpeed = speed; + }; + /** + * Get the motor speed in radians per second. + */ + RevoluteJoint.prototype.getMotorSpeed = function () { + return this.m_motorSpeed; + }; + /** + * Set the maximum motor torque, usually in N-m. + */ + RevoluteJoint.prototype.setMaxMotorTorque = function (torque) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_maxMotorTorque = torque; + }; + RevoluteJoint.prototype.getMaxMotorTorque = function () { + return this.m_maxMotorTorque; + }; + /** + * Is the joint limit enabled? + */ + RevoluteJoint.prototype.isLimitEnabled = function () { + return this.m_enableLimit; + }; + /** + * Enable/disable the joint limit. + */ + RevoluteJoint.prototype.enableLimit = function (flag) { + if (flag != this.m_enableLimit) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableLimit = flag; + this.m_impulse.z = 0.0; + } + }; + /** + * Get the lower joint limit in radians. + */ + RevoluteJoint.prototype.getLowerLimit = function () { + return this.m_lowerAngle; + }; + /** + * Get the upper joint limit in radians. + */ + RevoluteJoint.prototype.getUpperLimit = function () { + return this.m_upperAngle; + }; + /** + * Set the joint limits in radians. + */ + RevoluteJoint.prototype.setLimits = function (lower, upper) { + if (lower != this.m_lowerAngle || upper != this.m_upperAngle) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_impulse.z = 0.0; + this.m_lowerAngle = lower; + this.m_upperAngle = upper; + } + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + RevoluteJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + RevoluteJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force given the inverse time step. Unit is N. + */ + RevoluteJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt); + }; + /** + * Get the reaction torque due to the joint limit given the inverse time step. + * Unit is N*m. + */ + RevoluteJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_impulse.z; + }; + RevoluteJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var fixedRotation = (iA + iB === 0.0); // bool + this.m_mass.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y + * this.m_rB.y * iB; + this.m_mass.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y + * this.m_rB.x * iB; + this.m_mass.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB; + this.m_mass.ex.y = this.m_mass.ey.x; + this.m_mass.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x + * this.m_rB.x * iB; + this.m_mass.ez.y = this.m_rA.x * iA + this.m_rB.x * iB; + this.m_mass.ex.z = this.m_mass.ez.x; + this.m_mass.ey.z = this.m_mass.ez.y; + this.m_mass.ez.z = iA + iB; + this.m_motorMass = iA + iB; + if (this.m_motorMass > 0.0) { + this.m_motorMass = 1.0 / this.m_motorMass; + } + if (this.m_enableMotor == false || fixedRotation) { + this.m_motorImpulse = 0.0; + } + if (this.m_enableLimit && fixedRotation == false) { + var jointAngle = aB - aA - this.m_referenceAngle; // float + if (math.abs(this.m_upperAngle - this.m_lowerAngle) < 2.0 * Settings.angularSlop) { + this.m_limitState = equalLimits$1; + } + else if (jointAngle <= this.m_lowerAngle) { + if (this.m_limitState != atLowerLimit$1) { + this.m_impulse.z = 0.0; + } + this.m_limitState = atLowerLimit$1; + } + else if (jointAngle >= this.m_upperAngle) { + if (this.m_limitState != atUpperLimit$2) { + this.m_impulse.z = 0.0; + } + this.m_limitState = atUpperLimit$2; + } + else { + this.m_limitState = inactiveLimit$2; + this.m_impulse.z = 0.0; + } + } + else { + this.m_limitState = inactiveLimit$2; + } + if (step.warmStarting) { + // Scale impulses to support a variable time step. + this.m_impulse.mul(step.dtRatio); + this.m_motorImpulse *= step.dtRatio; + var P = Vec2.neo(this.m_impulse.x, this.m_impulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_motorImpulse + this.m_impulse.z); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_motorImpulse + this.m_impulse.z); + } + else { + this.m_impulse.setZero(); + this.m_motorImpulse = 0.0; + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + RevoluteJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var fixedRotation = (iA + iB === 0.0); // bool + // Solve motor constraint. + if (this.m_enableMotor && this.m_limitState != equalLimits$1 + && fixedRotation == false) { + var Cdot = wB - wA - this.m_motorSpeed; // float + var impulse = -this.m_motorMass * Cdot; // float + var oldImpulse = this.m_motorImpulse; // float + var maxImpulse = step.dt * this.m_maxMotorTorque; // float + this.m_motorImpulse = math.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_motorImpulse - oldImpulse; + wA -= iA * impulse; + wB += iB * impulse; + } + // Solve limit constraint. + if (this.m_enableLimit && this.m_limitState != inactiveLimit$2 + && fixedRotation == false) { + var Cdot1 = Vec2.zero(); + Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); + var Cdot2 = wB - wA; // float + var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); + var impulse = Vec3.neg(this.m_mass.solve33(Cdot)); // Vec3 + if (this.m_limitState == equalLimits$1) { + this.m_impulse.add(impulse); + } + else if (this.m_limitState == atLowerLimit$1) { + var newImpulse = this.m_impulse.z + impulse.z; // float + if (newImpulse < 0.0) { + var rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2 + var reduced = this.m_mass.solve22(rhs); // Vec2 + impulse.x = reduced.x; + impulse.y = reduced.y; + impulse.z = -this.m_impulse.z; + this.m_impulse.x += reduced.x; + this.m_impulse.y += reduced.y; + this.m_impulse.z = 0.0; + } + else { + this.m_impulse.add(impulse); + } + } + else if (this.m_limitState == atUpperLimit$2) { + var newImpulse = this.m_impulse.z + impulse.z; // float + if (newImpulse > 0.0) { + var rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2 + var reduced = this.m_mass.solve22(rhs); // Vec2 + impulse.x = reduced.x; + impulse.y = reduced.y; + impulse.z = -this.m_impulse.z; + this.m_impulse.x += reduced.x; + this.m_impulse.y += reduced.y; + this.m_impulse.z = 0.0; + } + else { + this.m_impulse.add(impulse); + } + } + var P = Vec2.neo(impulse.x, impulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z); + } + else { + // Solve point-to-point constraint + var Cdot = Vec2.zero(); + Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); + var impulse = this.m_mass.solve22(Vec2.neg(Cdot)); // Vec2 + this.m_impulse.x += impulse.x; + this.m_impulse.y += impulse.y; + vA.subMul(mA, impulse); + wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); + vB.addMul(mB, impulse); + wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + RevoluteJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var angularError = 0.0; // float + var positionError = 0.0; // float + var fixedRotation = (this.m_invIA + this.m_invIB == 0.0); // bool + // Solve angular limit constraint. + if (this.m_enableLimit && this.m_limitState != inactiveLimit$2 + && fixedRotation == false) { + var angle = aB - aA - this.m_referenceAngle; // float + var limitImpulse = 0.0; // float + if (this.m_limitState == equalLimits$1) { + // Prevent large angular corrections + var C = math.clamp(angle - this.m_lowerAngle, -Settings.maxAngularCorrection, Settings.maxAngularCorrection); // float + limitImpulse = -this.m_motorMass * C; + angularError = math.abs(C); + } + else if (this.m_limitState == atLowerLimit$1) { + var C = angle - this.m_lowerAngle; // float + angularError = -C; + // Prevent large angular corrections and allow some slop. + C = math.clamp(C + Settings.angularSlop, -Settings.maxAngularCorrection, 0.0); + limitImpulse = -this.m_motorMass * C; + } + else if (this.m_limitState == atUpperLimit$2) { + var C = angle - this.m_upperAngle; // float + angularError = C; + // Prevent large angular corrections and allow some slop. + C = math.clamp(C - Settings.angularSlop, 0.0, Settings.maxAngularCorrection); + limitImpulse = -this.m_motorMass * C; + } + aA -= this.m_invIA * limitImpulse; + aB += this.m_invIB * limitImpulse; + } + // Solve point-to-point constraint. + { + qA.setAngle(aA); + qB.setAngle(aB); + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2 + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2 + var C = Vec2.zero(); + C.addCombine(1, cB, 1, rB); + C.subCombine(1, cA, 1, rA); + positionError = C.length(); + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var K = new Mat22(); + K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y; + K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y; + K.ey.x = K.ex.y; + K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x; + var impulse = Vec2.neg(K.solve(C)); // Vec2 + cA.subMul(mA, impulse); + aA -= iA * Vec2.crossVec2Vec2(rA, impulse); + cB.addMul(mB, impulse); + aB += iB * Vec2.crossVec2Vec2(rB, impulse); + } + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + return positionError <= Settings.linearSlop + && angularError <= Settings.angularSlop; + }; + RevoluteJoint.TYPE = 'revolute-joint'; + return RevoluteJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var inactiveLimit$1 = 0; +var atLowerLimit = 1; +var atUpperLimit$1 = 2; +var equalLimits = 3; +var DEFAULTS$7 = { + enableLimit: false, + lowerTranslation: 0.0, + upperTranslation: 0.0, + enableMotor: false, + maxMotorForce: 0.0, + motorSpeed: 0.0 +}; +/** + * A prismatic joint. This joint provides one degree of freedom: translation + * along an axis fixed in bodyA. Relative rotation is prevented. You can use a + * joint limit to restrict the range of motion and a joint motor to drive the + * motion or to model joint friction. + */ +var PrismaticJoint = /** @class */ (function (_super) { + __extends(PrismaticJoint, _super); + function PrismaticJoint(def, bodyA, bodyB, anchor, axis) { + var _this = this; + // @ts-ignore + if (!(_this instanceof PrismaticJoint)) { + return new PrismaticJoint(def, bodyA, bodyB, anchor, axis); + } + def = options(def, DEFAULTS$7); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = PrismaticJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + _this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || Vec2.neo(1.0, 0.0)); + _this.m_localXAxisA.normalize(); + _this.m_localYAxisA = Vec2.crossNumVec2(1.0, _this.m_localXAxisA); + _this.m_referenceAngle = math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); + _this.m_impulse = new Vec3(); + _this.m_motorMass = 0.0; + _this.m_motorImpulse = 0.0; + _this.m_lowerTranslation = def.lowerTranslation; + _this.m_upperTranslation = def.upperTranslation; + _this.m_maxMotorForce = def.maxMotorForce; + _this.m_motorSpeed = def.motorSpeed; + _this.m_enableLimit = def.enableLimit; + _this.m_enableMotor = def.enableMotor; + _this.m_limitState = inactiveLimit$1; + _this.m_axis = Vec2.zero(); + _this.m_perp = Vec2.zero(); + _this.m_K = new Mat33(); + return _this; + // Linear constraint (point-to-line) + // d = p2 - p1 = x2 + r2 - x1 - r1 + // C = dot(perp, d) + // Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 - + // cross(w1, r1)) + // = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) + + // dot(cross(r2, perp), v2) + // J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)] + // + // Angular constraint + // C = a2 - a1 + a_initial + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // + // K = J * invM * JT + // + // J = [-a -s1 a s2] + // [0 -1 0 1] + // a = perp + // s1 = cross(d + r1, a) = cross(p2 - x1, a) + // s2 = cross(r2, a) = cross(p2 - x2, a) + // Motor/Limit linear constraint + // C = dot(ax1, d) + // Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) + + // dot(cross(r2, ax1), v2) + // J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)] + // Block Solver + // We develop a block solver that includes the joint limit. This makes the + // limit stiff (inelastic) even + // when the mass has poor distribution (leading to large torques about the + // joint anchor points). + // + // The Jacobian has 3 rows: + // J = [-uT -s1 uT s2] // linear + // [0 -1 0 1] // angular + // [-vT -a1 vT a2] // limit + // + // u = perp + // v = axis + // s1 = cross(d + r1, u), s2 = cross(r2, u) + // a1 = cross(d + r1, v), a2 = cross(r2, v) + // M * (v2 - v1) = JT * df + // J * v2 = bias + // + // v2 = v1 + invM * JT * df + // J * (v1 + invM * JT * df) = bias + // K * df = bias - J * v1 = -Cdot + // K = J * invM * JT + // Cdot = J * v1 - bias + // + // Now solve for f2. + // df = f2 - f1 + // K * (f2 - f1) = -Cdot + // f2 = invK * (-Cdot) + f1 + // + // Clamp accumulated limit impulse. + // lower: f2(3) = max(f2(3), 0) + // upper: f2(3) = min(f2(3), 0) + // + // Solve for correct f2(1:2) + // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1 + // = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3) + // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) + + // K(1:2,1:2) * f1(1:2) + // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + + // f1(1:2) + // + // Now compute impulse to be applied: + // df = f2 - f1 + } + /** @internal */ + PrismaticJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + lowerTranslation: this.m_lowerTranslation, + upperTranslation: this.m_upperTranslation, + maxMotorForce: this.m_maxMotorForce, + motorSpeed: this.m_motorSpeed, + enableLimit: this.m_enableLimit, + enableMotor: this.m_enableMotor, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + localAxisA: this.m_localXAxisA, + referenceAngle: this.m_referenceAngle, + }; + }; + /** @internal */ + PrismaticJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + data.localAxisA = Vec2.clone(data.localAxisA); + var joint = new PrismaticJoint(data); + return joint; + }; + /** @internal */ + PrismaticJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + if (def.localAxisA) { + this.m_localXAxisA.setVec2(def.localAxisA); + this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA)); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + PrismaticJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + PrismaticJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * The local joint axis relative to bodyA. + */ + PrismaticJoint.prototype.getLocalAxisA = function () { + return this.m_localXAxisA; + }; + /** + * Get the reference angle. + */ + PrismaticJoint.prototype.getReferenceAngle = function () { + return this.m_referenceAngle; + }; + /** + * Get the current joint translation, usually in meters. + */ + PrismaticJoint.prototype.getJointTranslation = function () { + var pA = this.m_bodyA.getWorldPoint(this.m_localAnchorA); + var pB = this.m_bodyB.getWorldPoint(this.m_localAnchorB); + var d = Vec2.sub(pB, pA); + var axis = this.m_bodyA.getWorldVector(this.m_localXAxisA); + var translation = Vec2.dot(d, axis); + return translation; + }; + /** + * Get the current joint translation speed, usually in meters per second. + */ + PrismaticJoint.prototype.getJointSpeed = function () { + var bA = this.m_bodyA; + var bB = this.m_bodyB; + var rA = Rot.mulVec2(bA.m_xf.q, Vec2.sub(this.m_localAnchorA, bA.m_sweep.localCenter)); // Vec2 + var rB = Rot.mulVec2(bB.m_xf.q, Vec2.sub(this.m_localAnchorB, bB.m_sweep.localCenter)); // Vec2 + var p1 = Vec2.add(bA.m_sweep.c, rA); // Vec2 + var p2 = Vec2.add(bB.m_sweep.c, rB); // Vec2 + var d = Vec2.sub(p2, p1); // Vec2 + var axis = Rot.mulVec2(bA.m_xf.q, this.m_localXAxisA); // Vec2 + var vA = bA.m_linearVelocity; // Vec2 + var vB = bB.m_linearVelocity; // Vec2 + var wA = bA.m_angularVelocity; // float + var wB = bB.m_angularVelocity; // float + var speed = Vec2.dot(d, Vec2.crossNumVec2(wA, axis)) + + Vec2.dot(axis, Vec2.sub(Vec2.addCrossNumVec2(vB, wB, rB), Vec2.addCrossNumVec2(vA, wA, rA))); // float + return speed; + }; + /** + * Is the joint limit enabled? + */ + PrismaticJoint.prototype.isLimitEnabled = function () { + return this.m_enableLimit; + }; + /** + * Enable/disable the joint limit. + */ + PrismaticJoint.prototype.enableLimit = function (flag) { + if (flag != this.m_enableLimit) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableLimit = flag; + this.m_impulse.z = 0.0; + } + }; + /** + * Get the lower joint limit, usually in meters. + */ + PrismaticJoint.prototype.getLowerLimit = function () { + return this.m_lowerTranslation; + }; + /** + * Get the upper joint limit, usually in meters. + */ + PrismaticJoint.prototype.getUpperLimit = function () { + return this.m_upperTranslation; + }; + /** + * Set the joint limits, usually in meters. + */ + PrismaticJoint.prototype.setLimits = function (lower, upper) { + if (lower != this.m_lowerTranslation || upper != this.m_upperTranslation) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_lowerTranslation = lower; + this.m_upperTranslation = upper; + this.m_impulse.z = 0.0; + } + }; + /** + * Is the joint motor enabled? + */ + PrismaticJoint.prototype.isMotorEnabled = function () { + return this.m_enableMotor; + }; + /** + * Enable/disable the joint motor. + */ + PrismaticJoint.prototype.enableMotor = function (flag) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableMotor = flag; + }; + /** + * Set the motor speed, usually in meters per second. + */ + PrismaticJoint.prototype.setMotorSpeed = function (speed) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_motorSpeed = speed; + }; + /** + * Set the maximum motor force, usually in N. + */ + PrismaticJoint.prototype.setMaxMotorForce = function (force) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_maxMotorForce = force; + }; + PrismaticJoint.prototype.getMaxMotorForce = function () { + return this.m_maxMotorForce; + }; + /** + * Get the motor speed, usually in meters per second. + */ + PrismaticJoint.prototype.getMotorSpeed = function () { + return this.m_motorSpeed; + }; + /** + * Get the current motor force given the inverse time step, usually in N. + */ + PrismaticJoint.prototype.getMotorForce = function (inv_dt) { + return inv_dt * this.m_motorImpulse; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + PrismaticJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + PrismaticJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + PrismaticJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + this.m_impulse.z, this.m_axis).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + PrismaticJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_impulse.y; + }; + PrismaticJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + // Compute the effective masses. + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + var d = Vec2.zero(); + d.addCombine(1, cB, 1, rB); + d.subCombine(1, cA, 1, rA); + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + // Compute motor Jacobian and effective mass. + { + this.m_axis = Rot.mulVec2(qA, this.m_localXAxisA); + this.m_a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_axis); + this.m_a2 = Vec2.crossVec2Vec2(rB, this.m_axis); + this.m_motorMass = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 + * this.m_a2; + if (this.m_motorMass > 0.0) { + this.m_motorMass = 1.0 / this.m_motorMass; + } + } + // Prismatic constraint. + { + this.m_perp = Rot.mulVec2(qA, this.m_localYAxisA); + this.m_s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_perp); + this.m_s2 = Vec2.crossVec2Vec2(rB, this.m_perp); + Vec2.crossVec2Vec2(rA, this.m_perp); + var k11 = mA + mB + iA * this.m_s1 * this.m_s1 + iB * this.m_s2 * this.m_s2; + var k12 = iA * this.m_s1 + iB * this.m_s2; + var k13 = iA * this.m_s1 * this.m_a1 + iB * this.m_s2 * this.m_a2; + var k22 = iA + iB; + if (k22 == 0.0) { + // For bodies with fixed rotation. + k22 = 1.0; + } + var k23 = iA * this.m_a1 + iB * this.m_a2; + var k33 = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 * this.m_a2; + this.m_K.ex.set(k11, k12, k13); + this.m_K.ey.set(k12, k22, k23); + this.m_K.ez.set(k13, k23, k33); + } + // Compute motor and limit terms. + if (this.m_enableLimit) { + var jointTranslation = Vec2.dot(this.m_axis, d); // float + if (math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * Settings.linearSlop) { + this.m_limitState = equalLimits; + } + else if (jointTranslation <= this.m_lowerTranslation) { + if (this.m_limitState != atLowerLimit) { + this.m_limitState = atLowerLimit; + this.m_impulse.z = 0.0; + } + } + else if (jointTranslation >= this.m_upperTranslation) { + if (this.m_limitState != atUpperLimit$1) { + this.m_limitState = atUpperLimit$1; + this.m_impulse.z = 0.0; + } + } + else { + this.m_limitState = inactiveLimit$1; + this.m_impulse.z = 0.0; + } + } + else { + this.m_limitState = inactiveLimit$1; + this.m_impulse.z = 0.0; + } + if (this.m_enableMotor == false) { + this.m_motorImpulse = 0.0; + } + if (step.warmStarting) { + // Account for variable time step. + this.m_impulse.mul(step.dtRatio); + this.m_motorImpulse *= step.dtRatio; + var P = Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + + this.m_impulse.z, this.m_axis); + var LA = this.m_impulse.x * this.m_s1 + this.m_impulse.y + + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1; + var LB = this.m_impulse.x * this.m_s2 + this.m_impulse.y + + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2; + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + else { + this.m_impulse.setZero(); + this.m_motorImpulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + PrismaticJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + // Solve linear motor constraint. + if (this.m_enableMotor && this.m_limitState != equalLimits) { + var Cdot = Vec2.dot(this.m_axis, Vec2.sub(vB, vA)) + this.m_a2 * wB + - this.m_a1 * wA; + var impulse = this.m_motorMass * (this.m_motorSpeed - Cdot); + var oldImpulse = this.m_motorImpulse; + var maxImpulse = step.dt * this.m_maxMotorForce; + this.m_motorImpulse = math.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_motorImpulse - oldImpulse; + var P = Vec2.mulNumVec2(impulse, this.m_axis); + var LA = impulse * this.m_a1; + var LB = impulse * this.m_a2; + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + var Cdot1 = Vec2.zero(); + Cdot1.x += Vec2.dot(this.m_perp, vB) + this.m_s2 * wB; + Cdot1.x -= Vec2.dot(this.m_perp, vA) + this.m_s1 * wA; + Cdot1.y = wB - wA; + if (this.m_enableLimit && this.m_limitState != inactiveLimit$1) { + // Solve prismatic and limit constraint in block form. + var Cdot2 = 0; + Cdot2 += Vec2.dot(this.m_axis, vB) + this.m_a2 * wB; + Cdot2 -= Vec2.dot(this.m_axis, vA) + this.m_a1 * wA; + var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); + var f1 = Vec3.clone(this.m_impulse); + var df = this.m_K.solve33(Vec3.neg(Cdot)); // Vec3 + this.m_impulse.add(df); + if (this.m_limitState == atLowerLimit) { + this.m_impulse.z = math.max(this.m_impulse.z, 0.0); + } + else if (this.m_limitState == atUpperLimit$1) { + this.m_impulse.z = math.min(this.m_impulse.z, 0.0); + } + // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + + // f1(1:2) + var b = Vec2.combine(-1, Cdot1, -(this.m_impulse.z - f1.z), Vec2.neo(this.m_K.ez.x, this.m_K.ez.y)); // Vec2 + var f2r = Vec2.add(this.m_K.solve22(b), Vec2.neo(f1.x, f1.y)); // Vec2 + this.m_impulse.x = f2r.x; + this.m_impulse.y = f2r.y; + df = Vec3.sub(this.m_impulse, f1); + var P = Vec2.combine(df.x, this.m_perp, df.z, this.m_axis); // Vec2 + var LA = df.x * this.m_s1 + df.y + df.z * this.m_a1; // float + var LB = df.x * this.m_s2 + df.y + df.z * this.m_a2; // float + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + else { + // Limit is inactive, just solve the prismatic constraint in block form. + var df = this.m_K.solve22(Vec2.neg(Cdot1)); // Vec2 + this.m_impulse.x += df.x; + this.m_impulse.y += df.y; + var P = Vec2.mulNumVec2(df.x, this.m_perp); // Vec2 + var LA = df.x * this.m_s1 + df.y; // float + var LB = df.x * this.m_s2 + df.y; // float + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + PrismaticJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + // Compute fresh Jacobians + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2 + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2 + var d = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); // Vec2 + var axis = Rot.mulVec2(qA, this.m_localXAxisA); // Vec2 + var a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), axis); // float + var a2 = Vec2.crossVec2Vec2(rB, axis); // float + var perp = Rot.mulVec2(qA, this.m_localYAxisA); // Vec2 + var s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), perp); // float + var s2 = Vec2.crossVec2Vec2(rB, perp); // float + var impulse = new Vec3(); + var C1 = Vec2.zero(); // Vec2 + C1.x = Vec2.dot(perp, d); + C1.y = aB - aA - this.m_referenceAngle; + var linearError = math.abs(C1.x); // float + var angularError = math.abs(C1.y); // float + var linearSlop = Settings.linearSlop; + var maxLinearCorrection = Settings.maxLinearCorrection; + var active = false; // bool + var C2 = 0.0; // float + if (this.m_enableLimit) { + var translation = Vec2.dot(axis, d); // float + if (math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * linearSlop) { + // Prevent large angular corrections + C2 = math.clamp(translation, -maxLinearCorrection, maxLinearCorrection); + linearError = math.max(linearError, math.abs(translation)); + active = true; + } + else if (translation <= this.m_lowerTranslation) { + // Prevent large linear corrections and allow some slop. + C2 = math.clamp(translation - this.m_lowerTranslation + linearSlop, -maxLinearCorrection, 0.0); + linearError = math + .max(linearError, this.m_lowerTranslation - translation); + active = true; + } + else if (translation >= this.m_upperTranslation) { + // Prevent large linear corrections and allow some slop. + C2 = math.clamp(translation - this.m_upperTranslation - linearSlop, 0.0, maxLinearCorrection); + linearError = math + .max(linearError, translation - this.m_upperTranslation); + active = true; + } + } + if (active) { + var k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float + var k12 = iA * s1 + iB * s2; // float + var k13 = iA * s1 * a1 + iB * s2 * a2; // float + var k22 = iA + iB; // float + if (k22 == 0.0) { + // For fixed rotation + k22 = 1.0; + } + var k23 = iA * a1 + iB * a2; // float + var k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; // float + var K = new Mat33(); + K.ex.set(k11, k12, k13); + K.ey.set(k12, k22, k23); + K.ez.set(k13, k23, k33); + var C = new Vec3(); + C.x = C1.x; + C.y = C1.y; + C.z = C2; + impulse = K.solve33(Vec3.neg(C)); + } + else { + var k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float + var k12 = iA * s1 + iB * s2; // float + var k22 = iA + iB; // float + if (k22 == 0.0) { + k22 = 1.0; + } + var K = new Mat22(); + K.ex.setNum(k11, k12); + K.ey.setNum(k12, k22); + var impulse1 = K.solve(Vec2.neg(C1)); // Vec2 + impulse.x = impulse1.x; + impulse.y = impulse1.y; + impulse.z = 0.0; + } + var P = Vec2.combine(impulse.x, perp, impulse.z, axis); // Vec2 + var LA = impulse.x * s1 + impulse.y + impulse.z * a1; // float + var LB = impulse.x * s2 + impulse.y + impulse.z * a2; // float + cA.subMul(mA, P); + aA -= iA * LA; + cB.addMul(mB, P); + aB += iB * LB; + this.m_bodyA.c_position.c = cA; + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c = cB; + this.m_bodyB.c_position.a = aB; + return linearError <= Settings.linearSlop + && angularError <= Settings.angularSlop; + }; + PrismaticJoint.TYPE = 'prismatic-joint'; + return PrismaticJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$6 = { + ratio: 1.0 +}; +/** + * A gear joint is used to connect two joints together. Either joint can be a + * revolute or prismatic joint. You specify a gear ratio to bind the motions + * together: coordinate1 + ratio * coordinate2 = constant + * + * The ratio can be negative or positive. If one joint is a revolute joint and + * the other joint is a prismatic joint, then the ratio will have units of + * length or units of 1/length. Warning: You have to manually destroy the gear + * joint if joint1 or joint2 is destroyed. + * + * This definition requires two existing revolute or prismatic joints (any + * combination will work). + */ +var GearJoint = /** @class */ (function (_super) { + __extends(GearJoint, _super); + function GearJoint(def, bodyA, bodyB, joint1, joint2, ratio) { + var _this = this; + // @ts-ignore + if (!(_this instanceof GearJoint)) { + return new GearJoint(def, bodyA, bodyB, joint1, joint2, ratio); + } + def = options(def, DEFAULTS$6); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = GearJoint.TYPE; + _this.m_joint1 = joint1 ? joint1 : def.joint1; + _this.m_joint2 = joint2 ? joint2 : def.joint2; + _this.m_ratio = math.isFinite(ratio) ? ratio : def.ratio; + _this.m_type1 = _this.m_joint1.getType(); + _this.m_type2 = _this.m_joint2.getType(); + // joint1 connects body A to body C + // joint2 connects body B to body D + var coordinateA; + var coordinateB; + // TODO_ERIN there might be some problem with the joint edges in Joint. + _this.m_bodyC = _this.m_joint1.getBodyA(); + _this.m_bodyA = _this.m_joint1.getBodyB(); + // Get geometry of joint1 + var xfA = _this.m_bodyA.m_xf; + var aA = _this.m_bodyA.m_sweep.a; + var xfC = _this.m_bodyC.m_xf; + var aC = _this.m_bodyC.m_sweep.a; + if (_this.m_type1 === RevoluteJoint.TYPE) { + var revolute = _this.m_joint1; + _this.m_localAnchorC = revolute.m_localAnchorA; + _this.m_localAnchorA = revolute.m_localAnchorB; + _this.m_referenceAngleA = revolute.m_referenceAngle; + _this.m_localAxisC = Vec2.zero(); + coordinateA = aA - aC - _this.m_referenceAngleA; + } + else { + var prismatic = _this.m_joint1; + _this.m_localAnchorC = prismatic.m_localAnchorA; + _this.m_localAnchorA = prismatic.m_localAnchorB; + _this.m_referenceAngleA = prismatic.m_referenceAngle; + _this.m_localAxisC = prismatic.m_localXAxisA; + var pC = _this.m_localAnchorC; + var pA = Rot.mulTVec2(xfC.q, Vec2.add(Rot.mulVec2(xfA.q, _this.m_localAnchorA), Vec2.sub(xfA.p, xfC.p))); + coordinateA = Vec2.dot(pA, _this.m_localAxisC) - Vec2.dot(pC, _this.m_localAxisC); + } + _this.m_bodyD = _this.m_joint2.getBodyA(); + _this.m_bodyB = _this.m_joint2.getBodyB(); + // Get geometry of joint2 + var xfB = _this.m_bodyB.m_xf; + var aB = _this.m_bodyB.m_sweep.a; + var xfD = _this.m_bodyD.m_xf; + var aD = _this.m_bodyD.m_sweep.a; + if (_this.m_type2 === RevoluteJoint.TYPE) { + var revolute = _this.m_joint2; + _this.m_localAnchorD = revolute.m_localAnchorA; + _this.m_localAnchorB = revolute.m_localAnchorB; + _this.m_referenceAngleB = revolute.m_referenceAngle; + _this.m_localAxisD = Vec2.zero(); + coordinateB = aB - aD - _this.m_referenceAngleB; + } + else { + var prismatic = _this.m_joint2; + _this.m_localAnchorD = prismatic.m_localAnchorA; + _this.m_localAnchorB = prismatic.m_localAnchorB; + _this.m_referenceAngleB = prismatic.m_referenceAngle; + _this.m_localAxisD = prismatic.m_localXAxisA; + var pD = _this.m_localAnchorD; + var pB = Rot.mulTVec2(xfD.q, Vec2.add(Rot.mulVec2(xfB.q, _this.m_localAnchorB), Vec2.sub(xfB.p, xfD.p))); + coordinateB = Vec2.dot(pB, _this.m_localAxisD) - Vec2.dot(pD, _this.m_localAxisD); + } + _this.m_constant = coordinateA + _this.m_ratio * coordinateB; + _this.m_impulse = 0.0; + return _this; + // Gear Joint: + // C0 = (coordinate1 + ratio * coordinate2)_initial + // C = (coordinate1 + ratio * coordinate2) - C0 = 0 + // J = [J1 ratio * J2] + // K = J * invM * JT + // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T + // + // Revolute: + // coordinate = rotation + // Cdot = angularVelocity + // J = [0 0 1] + // K = J * invM * JT = invI + // + // Prismatic: + // coordinate = dot(p - pg, ug) + // Cdot = dot(v + cross(w, r), ug) + // J = [ug cross(r, ug)] + // K = J * invM * JT = invMass + invI * cross(r, ug)^2 + } + /** @internal */ + GearJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + joint1: this.m_joint1, + joint2: this.m_joint2, + ratio: this.m_ratio, + // _constant: this.m_constant, + }; + }; + /** @internal */ + GearJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + data.joint1 = restore(Joint, data.joint1, world); + data.joint2 = restore(Joint, data.joint2, world); + var joint = new GearJoint(data); + // if (data._constant) joint.m_constant = data._constant; + return joint; + }; + /** + * Get the first joint. + */ + GearJoint.prototype.getJoint1 = function () { + return this.m_joint1; + }; + /** + * Get the second joint. + */ + GearJoint.prototype.getJoint2 = function () { + return this.m_joint2; + }; + /** + * Set the gear ratio. + */ + GearJoint.prototype.setRatio = function (ratio) { + this.m_ratio = ratio; + }; + /** + * Get the gear ratio. + */ + GearJoint.prototype.getRatio = function () { + return this.m_ratio; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + GearJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + GearJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + GearJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(this.m_impulse, this.m_JvAC).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + GearJoint.prototype.getReactionTorque = function (inv_dt) { + var L = this.m_impulse * this.m_JwA; // float + return inv_dt * L; + }; + GearJoint.prototype.initVelocityConstraints = function (step) { + this.m_lcA = this.m_bodyA.m_sweep.localCenter; + this.m_lcB = this.m_bodyB.m_sweep.localCenter; + this.m_lcC = this.m_bodyC.m_sweep.localCenter; + this.m_lcD = this.m_bodyD.m_sweep.localCenter; + this.m_mA = this.m_bodyA.m_invMass; + this.m_mB = this.m_bodyB.m_invMass; + this.m_mC = this.m_bodyC.m_invMass; + this.m_mD = this.m_bodyD.m_invMass; + this.m_iA = this.m_bodyA.m_invI; + this.m_iB = this.m_bodyB.m_invI; + this.m_iC = this.m_bodyC.m_invI; + this.m_iD = this.m_bodyD.m_invI; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var aC = this.m_bodyC.c_position.a; + var vC = this.m_bodyC.c_velocity.v; + var wC = this.m_bodyC.c_velocity.w; + var aD = this.m_bodyD.c_position.a; + var vD = this.m_bodyD.c_velocity.v; + var wD = this.m_bodyD.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var qC = Rot.neo(aC); + var qD = Rot.neo(aD); + this.m_mass = 0.0; + if (this.m_type1 == RevoluteJoint.TYPE) { + this.m_JvAC = Vec2.zero(); + this.m_JwA = 1.0; + this.m_JwC = 1.0; + this.m_mass += this.m_iA + this.m_iC; + } + else { + var u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2 + var rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2 + var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2 + this.m_JvAC = u; + this.m_JwC = Vec2.crossVec2Vec2(rC, u); + this.m_JwA = Vec2.crossVec2Vec2(rA, u); + this.m_mass += this.m_mC + this.m_mA + this.m_iC * this.m_JwC * this.m_JwC + this.m_iA * this.m_JwA * this.m_JwA; + } + if (this.m_type2 == RevoluteJoint.TYPE) { + this.m_JvBD = Vec2.zero(); + this.m_JwB = this.m_ratio; + this.m_JwD = this.m_ratio; + this.m_mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD); + } + else { + var u = Rot.mulVec2(qD, this.m_localAxisD); // Vec2 + var rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); // Vec2 + var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); // Vec2 + this.m_JvBD = Vec2.mulNumVec2(this.m_ratio, u); + this.m_JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u); + this.m_JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u); + this.m_mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD * this.m_JwD * this.m_JwD + this.m_iB * this.m_JwB * this.m_JwB; + } + // Compute effective mass. + this.m_mass = this.m_mass > 0.0 ? 1.0 / this.m_mass : 0.0; + if (step.warmStarting) { + vA.addMul(this.m_mA * this.m_impulse, this.m_JvAC); + wA += this.m_iA * this.m_impulse * this.m_JwA; + vB.addMul(this.m_mB * this.m_impulse, this.m_JvBD); + wB += this.m_iB * this.m_impulse * this.m_JwB; + vC.subMul(this.m_mC * this.m_impulse, this.m_JvAC); + wC -= this.m_iC * this.m_impulse * this.m_JwC; + vD.subMul(this.m_mD * this.m_impulse, this.m_JvBD); + wD -= this.m_iD * this.m_impulse * this.m_JwD; + } + else { + this.m_impulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + this.m_bodyC.c_velocity.v.setVec2(vC); + this.m_bodyC.c_velocity.w = wC; + this.m_bodyD.c_velocity.v.setVec2(vD); + this.m_bodyD.c_velocity.w = wD; + }; + GearJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var vC = this.m_bodyC.c_velocity.v; + var wC = this.m_bodyC.c_velocity.w; + var vD = this.m_bodyD.c_velocity.v; + var wD = this.m_bodyD.c_velocity.w; + var Cdot = Vec2.dot(this.m_JvAC, vA) - Vec2.dot(this.m_JvAC, vC) + + Vec2.dot(this.m_JvBD, vB) - Vec2.dot(this.m_JvBD, vD); // float + Cdot += (this.m_JwA * wA - this.m_JwC * wC) + + (this.m_JwB * wB - this.m_JwD * wD); + var impulse = -this.m_mass * Cdot; // float + this.m_impulse += impulse; + vA.addMul(this.m_mA * impulse, this.m_JvAC); + wA += this.m_iA * impulse * this.m_JwA; + vB.addMul(this.m_mB * impulse, this.m_JvBD); + wB += this.m_iB * impulse * this.m_JwB; + vC.subMul(this.m_mC * impulse, this.m_JvAC); + wC -= this.m_iC * impulse * this.m_JwC; + vD.subMul(this.m_mD * impulse, this.m_JvBD); + wD -= this.m_iD * impulse * this.m_JwD; + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + this.m_bodyC.c_velocity.v.setVec2(vC); + this.m_bodyC.c_velocity.w = wC; + this.m_bodyD.c_velocity.v.setVec2(vD); + this.m_bodyD.c_velocity.w = wD; + }; + /** + * This returns true if the position errors are within tolerance. + */ + GearJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var cC = this.m_bodyC.c_position.c; + var aC = this.m_bodyC.c_position.a; + var cD = this.m_bodyD.c_position.c; + var aD = this.m_bodyD.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var qC = Rot.neo(aC); + var qD = Rot.neo(aD); + var linearError = 0.0; + var coordinateA; + var coordinateB; + var JvAC; + var JvBD; + var JwA; + var JwB; + var JwC; + var JwD; + var mass = 0.0; + if (this.m_type1 == RevoluteJoint.TYPE) { + JvAC = Vec2.zero(); + JwA = 1.0; + JwC = 1.0; + mass += this.m_iA + this.m_iC; + coordinateA = aA - aC - this.m_referenceAngleA; + } + else { + var u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2 + var rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2 + var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2 + JvAC = u; + JwC = Vec2.crossVec2Vec2(rC, u); + JwA = Vec2.crossVec2Vec2(rA, u); + mass += this.m_mC + this.m_mA + this.m_iC * JwC * JwC + this.m_iA * JwA * JwA; + var pC = Vec2.sub(this.m_localAnchorC, this.m_lcC); // Vec2 + var pA = Rot.mulTVec2(qC, Vec2.add(rA, Vec2.sub(cA, cC))); // Vec2 + coordinateA = Vec2.dot(Vec2.sub(pA, pC), this.m_localAxisC); + } + if (this.m_type2 == RevoluteJoint.TYPE) { + JvBD = Vec2.zero(); + JwB = this.m_ratio; + JwD = this.m_ratio; + mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD); + coordinateB = aB - aD - this.m_referenceAngleB; + } + else { + var u = Rot.mulVec2(qD, this.m_localAxisD); + var rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); + var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); + JvBD = Vec2.mulNumVec2(this.m_ratio, u); + JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u); + JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u); + mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD + * JwD * JwD + this.m_iB * JwB * JwB; + var pD = Vec2.sub(this.m_localAnchorD, this.m_lcD); // Vec2 + var pB = Rot.mulTVec2(qD, Vec2.add(rB, Vec2.sub(cB, cD))); // Vec2 + coordinateB = Vec2.dot(pB, this.m_localAxisD) + - Vec2.dot(pD, this.m_localAxisD); + } + var C = (coordinateA + this.m_ratio * coordinateB) - this.m_constant; // float + var impulse = 0.0; // float + if (mass > 0.0) { + impulse = -C / mass; + } + cA.addMul(this.m_mA * impulse, JvAC); + aA += this.m_iA * impulse * JwA; + cB.addMul(this.m_mB * impulse, JvBD); + aB += this.m_iB * impulse * JwB; + cC.subMul(this.m_mC * impulse, JvAC); + aC -= this.m_iC * impulse * JwC; + cD.subMul(this.m_mD * impulse, JvBD); + aD -= this.m_iD * impulse * JwD; + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + this.m_bodyC.c_position.c.setVec2(cC); + this.m_bodyC.c_position.a = aC; + this.m_bodyD.c_position.c.setVec2(cD); + this.m_bodyD.c_position.a = aD; + // TODO_ERIN not implemented + return linearError < Settings.linearSlop; + }; + GearJoint.TYPE = 'gear-joint'; + return GearJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$5 = { + maxForce: 1.0, + maxTorque: 1.0, + correctionFactor: 0.3 +}; +/** + * A motor joint is used to control the relative motion between two bodies. A + * typical usage is to control the movement of a dynamic body with respect to + * the ground. + */ +var MotorJoint = /** @class */ (function (_super) { + __extends(MotorJoint, _super); + function MotorJoint(def, bodyA, bodyB) { + var _this = this; + // @ts-ignore + if (!(_this instanceof MotorJoint)) { + return new MotorJoint(def, bodyA, bodyB); + } + def = options(def, DEFAULTS$5); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = MotorJoint.TYPE; + _this.m_linearOffset = math.isFinite(def.linearOffset) ? def.linearOffset : bodyA.getLocalPoint(bodyB.getPosition()); + _this.m_angularOffset = math.isFinite(def.angularOffset) ? def.angularOffset : bodyB.getAngle() - bodyA.getAngle(); + _this.m_linearImpulse = Vec2.zero(); + _this.m_angularImpulse = 0.0; + _this.m_maxForce = def.maxForce; + _this.m_maxTorque = def.maxTorque; + _this.m_correctionFactor = def.correctionFactor; + return _this; + // Point-to-point constraint + // Cdot = v2 - v1 + // = v2 + cross(w2, r2) - v1 - cross(w1, r1) + // J = [-I -r1_skew I r2_skew ] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + // Angle constraint + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // K = invI1 + invI2 + } + /** @internal */ + MotorJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + maxForce: this.m_maxForce, + maxTorque: this.m_maxTorque, + correctionFactor: this.m_correctionFactor, + linearOffset: this.m_linearOffset, + angularOffset: this.m_angularOffset, + }; + }; + /** @internal */ + MotorJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new MotorJoint(data); + return joint; + }; + /** @internal */ + MotorJoint.prototype._setAnchors = function (def) { + }; + /** + * Set the maximum friction force in N. + */ + MotorJoint.prototype.setMaxForce = function (force) { + this.m_maxForce = force; + }; + /** + * Get the maximum friction force in N. + */ + MotorJoint.prototype.getMaxForce = function () { + return this.m_maxForce; + }; + /** + * Set the maximum friction torque in N*m. + */ + MotorJoint.prototype.setMaxTorque = function (torque) { + this.m_maxTorque = torque; + }; + /** + * Get the maximum friction torque in N*m. + */ + MotorJoint.prototype.getMaxTorque = function () { + return this.m_maxTorque; + }; + /** + * Set the position correction factor in the range [0,1]. + */ + MotorJoint.prototype.setCorrectionFactor = function (factor) { + this.m_correctionFactor = factor; + }; + /** + * Get the position correction factor in the range [0,1]. + */ + MotorJoint.prototype.getCorrectionFactor = function () { + return this.m_correctionFactor; + }; + /** + * Set/get the target linear offset, in frame A, in meters. + */ + MotorJoint.prototype.setLinearOffset = function (linearOffset) { + if (linearOffset.x != this.m_linearOffset.x + || linearOffset.y != this.m_linearOffset.y) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_linearOffset = linearOffset; + } + }; + MotorJoint.prototype.getLinearOffset = function () { + return this.m_linearOffset; + }; + /** + * Set/get the target angular offset, in radians. + */ + MotorJoint.prototype.setAngularOffset = function (angularOffset) { + if (angularOffset != this.m_angularOffset) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_angularOffset = angularOffset; + } + }; + MotorJoint.prototype.getAngularOffset = function () { + return this.m_angularOffset; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + MotorJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getPosition(); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + MotorJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getPosition(); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + MotorJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + MotorJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_angularImpulse; + }; + MotorJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + // Compute the effective mass matrix. + this.m_rA = Rot.mulVec2(qA, Vec2.neg(this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.neg(this.m_localCenterB)); + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var K = new Mat22(); + K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y * this.m_rB.y; + K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y; + K.ey.x = K.ex.y; + K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x * this.m_rB.x; + this.m_linearMass = K.getInverse(); + this.m_angularMass = iA + iB; + if (this.m_angularMass > 0.0) { + this.m_angularMass = 1.0 / this.m_angularMass; + } + this.m_linearError = Vec2.zero(); + this.m_linearError.addCombine(1, cB, 1, this.m_rB); + this.m_linearError.subCombine(1, cA, 1, this.m_rA); + this.m_linearError.sub(Rot.mulVec2(qA, this.m_linearOffset)); + this.m_angularError = aB - aA - this.m_angularOffset; + if (step.warmStarting) { + // Scale impulses to support a variable time step. + this.m_linearImpulse.mul(step.dtRatio); + this.m_angularImpulse *= step.dtRatio; + var P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse); + } + else { + this.m_linearImpulse.setZero(); + this.m_angularImpulse = 0.0; + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + MotorJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var h = step.dt; + var inv_h = step.inv_dt; + // Solve angular friction + { + var Cdot = wB - wA + inv_h * this.m_correctionFactor * this.m_angularError; + var impulse = -this.m_angularMass * Cdot; + var oldImpulse = this.m_angularImpulse; + var maxImpulse = h * this.m_maxTorque; + this.m_angularImpulse = math.clamp(this.m_angularImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_angularImpulse - oldImpulse; + wA -= iA * impulse; + wB += iB * impulse; + } + // Solve linear friction + { + var Cdot = Vec2.zero(); + Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); + Cdot.addMul(inv_h * this.m_correctionFactor, this.m_linearError); + var impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); + var oldImpulse = Vec2.clone(this.m_linearImpulse); + this.m_linearImpulse.add(impulse); + var maxImpulse = h * this.m_maxForce; + this.m_linearImpulse.clamp(maxImpulse); + impulse = Vec2.sub(this.m_linearImpulse, oldImpulse); + vA.subMul(mA, impulse); + wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); + vB.addMul(mB, impulse); + wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + MotorJoint.prototype.solvePositionConstraints = function (step) { + return true; + }; + MotorJoint.TYPE = 'motor-joint'; + return MotorJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$4 = { + maxForce: 0.0, + frequencyHz: 5.0, + dampingRatio: 0.7 +}; +/** + * A mouse joint is used to make a point on a body track a specified world + * point. This a soft constraint with a maximum force. This allows the + * constraint to stretch and without applying huge forces. + * + * NOTE: this joint is not documented in the manual because it was developed to + * be used in the testbed. If you want to learn how to use the mouse joint, look + * at the testbed. + */ +var MouseJoint = /** @class */ (function (_super) { + __extends(MouseJoint, _super); + function MouseJoint(def, bodyA, bodyB, target) { + var _this = this; + // @ts-ignore + if (!(_this instanceof MouseJoint)) { + return new MouseJoint(def, bodyA, bodyB, target); + } + def = options(def, DEFAULTS$4); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = MouseJoint.TYPE; + if (Vec2.isValid(target)) { + _this.m_targetA = Vec2.clone(target); + } + else if (Vec2.isValid(def.target)) { + _this.m_targetA = Vec2.clone(def.target); + } + else { + _this.m_targetA = Vec2.zero(); + } + _this.m_localAnchorB = Transform.mulTVec2(bodyB.getTransform(), _this.m_targetA); + _this.m_maxForce = def.maxForce; + _this.m_impulse = Vec2.zero(); + _this.m_frequencyHz = def.frequencyHz; + _this.m_dampingRatio = def.dampingRatio; + _this.m_beta = 0.0; + _this.m_gamma = 0.0; + // Solver temp + _this.m_rB = Vec2.zero(); + _this.m_localCenterB = Vec2.zero(); + _this.m_invMassB = 0.0; + _this.m_invIB = 0.0; + _this.m_mass = new Mat22(); + _this.m_C = Vec2.zero(); + return _this; + // p = attached point, m = mouse point + // C = p - m + // Cdot = v + // = v + cross(w, r) + // J = [I r_skew] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + } + /** @internal */ + MouseJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + target: this.m_targetA, + maxForce: this.m_maxForce, + frequencyHz: this.m_frequencyHz, + dampingRatio: this.m_dampingRatio, + _localAnchorB: this.m_localAnchorB, + }; + }; + /** @internal */ + MouseJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + data.target = Vec2.clone(data.target); + var joint = new MouseJoint(data); + if (data._localAnchorB) { + joint.m_localAnchorB = data._localAnchorB; + } + return joint; + }; + /** + * Use this to update the target point. + */ + MouseJoint.prototype.setTarget = function (target) { + if (this.m_bodyB.isAwake() == false) { + this.m_bodyB.setAwake(true); + } + this.m_targetA = Vec2.clone(target); + }; + MouseJoint.prototype.getTarget = function () { + return this.m_targetA; + }; + /** + * Set the maximum force in Newtons. + */ + MouseJoint.prototype.setMaxForce = function (force) { + this.m_maxForce = force; + }; + /** + * Get the maximum force in Newtons. + */ + MouseJoint.prototype.getMaxForce = function () { + return this.m_maxForce; + }; + /** + * Set the frequency in Hertz. + */ + MouseJoint.prototype.setFrequency = function (hz) { + this.m_frequencyHz = hz; + }; + /** + * Get the frequency in Hertz. + */ + MouseJoint.prototype.getFrequency = function () { + return this.m_frequencyHz; + }; + /** + * Set the damping ratio (dimensionless). + */ + MouseJoint.prototype.setDampingRatio = function (ratio) { + this.m_dampingRatio = ratio; + }; + /** + * Get the damping ratio (dimensionless). + */ + MouseJoint.prototype.getDampingRatio = function () { + return this.m_dampingRatio; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + MouseJoint.prototype.getAnchorA = function () { + return Vec2.clone(this.m_targetA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + MouseJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + MouseJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(inv_dt, this.m_impulse); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + MouseJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * 0.0; + }; + /** + * Shift the origin for any points stored in world coordinates. + */ + MouseJoint.prototype.shiftOrigin = function (newOrigin) { + this.m_targetA.sub(newOrigin); + }; + MouseJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIB = this.m_bodyB.m_invI; + var position = this.m_bodyB.c_position; + var velocity = this.m_bodyB.c_velocity; + var cB = position.c; + var aB = position.a; + var vB = velocity.v; + var wB = velocity.w; + var qB = Rot.neo(aB); + var mass = this.m_bodyB.getMass(); + // Frequency + var omega = 2.0 * math.PI * this.m_frequencyHz; + // Damping coefficient + var d = 2.0 * mass * this.m_dampingRatio * omega; + // Spring stiffness + var k = mass * (omega * omega); + // magic formulas + // gamma has units of inverse mass. + // beta has units of inverse time. + var h = step.dt; + this.m_gamma = h * (d + h * k); + if (this.m_gamma != 0.0) { + this.m_gamma = 1.0 / this.m_gamma; + } + this.m_beta = h * k * this.m_gamma; + // Compute the effective mass matrix. + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) * + // invI2 * skew(r2)] + // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y + // -r1.x*r1.y] + // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x] + var K = new Mat22(); + K.ex.x = this.m_invMassB + this.m_invIB * this.m_rB.y * this.m_rB.y + + this.m_gamma; + K.ex.y = -this.m_invIB * this.m_rB.x * this.m_rB.y; + K.ey.x = K.ex.y; + K.ey.y = this.m_invMassB + this.m_invIB * this.m_rB.x * this.m_rB.x + + this.m_gamma; + this.m_mass = K.getInverse(); + this.m_C.setVec2(cB); + this.m_C.addCombine(1, this.m_rB, -1, this.m_targetA); + this.m_C.mul(this.m_beta); + // Cheat with some damping + wB *= 0.98; + if (step.warmStarting) { + this.m_impulse.mul(step.dtRatio); + vB.addMul(this.m_invMassB, this.m_impulse); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, this.m_impulse); + } + else { + this.m_impulse.setZero(); + } + velocity.v.setVec2(vB); + velocity.w = wB; + }; + MouseJoint.prototype.solveVelocityConstraints = function (step) { + var velocity = this.m_bodyB.c_velocity; + var vB = Vec2.clone(velocity.v); + var wB = velocity.w; + // Cdot = v + cross(w, r) + var Cdot = Vec2.crossNumVec2(wB, this.m_rB); + Cdot.add(vB); + Cdot.addCombine(1, this.m_C, this.m_gamma, this.m_impulse); + Cdot.neg(); + var impulse = Mat22.mulVec2(this.m_mass, Cdot); + var oldImpulse = Vec2.clone(this.m_impulse); + this.m_impulse.add(impulse); + var maxImpulse = step.dt * this.m_maxForce; + this.m_impulse.clamp(maxImpulse); + impulse = Vec2.sub(this.m_impulse, oldImpulse); + vB.addMul(this.m_invMassB, impulse); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, impulse); + velocity.v.setVec2(vB); + velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + MouseJoint.prototype.solvePositionConstraints = function (step) { + return true; + }; + MouseJoint.TYPE = 'mouse-joint'; + return MouseJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$3 = { + collideConnected: true +}; +/** + * The pulley joint is connected to two bodies and two fixed ground points. The + * pulley supports a ratio such that: length1 + ratio * length2 <= constant + * + * Yes, the force transmitted is scaled by the ratio. + * + * Warning: the pulley joint can get a bit squirrelly by itself. They often work + * better when combined with prismatic joints. You should also cover the the + * anchor points with static shapes to prevent one side from going to zero + * length. + */ +var PulleyJoint = /** @class */ (function (_super) { + __extends(PulleyJoint, _super); + function PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio) { + var _this = this; + // @ts-ignore + if (!(_this instanceof PulleyJoint)) { + return new PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio); + } + def = options(def, DEFAULTS$3); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = PulleyJoint.TYPE; + _this.m_groundAnchorA = groundA ? groundA : def.groundAnchorA || Vec2.neo(-1.0, 1.0); + _this.m_groundAnchorB = groundB ? groundB : def.groundAnchorB || Vec2.neo(1.0, 1.0); + _this.m_localAnchorA = anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.neo(-1.0, 0.0); + _this.m_localAnchorB = anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.neo(1.0, 0.0); + _this.m_lengthA = math.isFinite(def.lengthA) ? def.lengthA : Vec2.distance(anchorA, groundA); + _this.m_lengthB = math.isFinite(def.lengthB) ? def.lengthB : Vec2.distance(anchorB, groundB); + _this.m_ratio = math.isFinite(ratio) ? ratio : def.ratio; + _this.m_constant = _this.m_lengthA + _this.m_ratio * _this.m_lengthB; + _this.m_impulse = 0.0; + return _this; + // Pulley: + // length1 = norm(p1 - s1) + // length2 = norm(p2 - s2) + // C0 = (length1 + ratio * length2)_initial + // C = C0 - (length1 + ratio * length2) + // u1 = (p1 - s1) / norm(p1 - s1) + // u2 = (p2 - s2) / norm(p2 - s2) + // Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2)) + // J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)] + // K = J * invM * JT + // = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 * + // cross(r2, u2)^2) + } + PulleyJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + groundAnchorA: this.m_groundAnchorA, + groundAnchorB: this.m_groundAnchorB, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + lengthA: this.m_lengthA, + lengthB: this.m_lengthB, + ratio: this.m_ratio, + }; + }; + /** @internal */ + PulleyJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new PulleyJoint(data); + return joint; + }; + /** + * Get the first ground anchor. + */ + PulleyJoint.prototype.getGroundAnchorA = function () { + return this.m_groundAnchorA; + }; + /** + * Get the second ground anchor. + */ + PulleyJoint.prototype.getGroundAnchorB = function () { + return this.m_groundAnchorB; + }; + /** + * Get the current length of the segment attached to bodyA. + */ + PulleyJoint.prototype.getLengthA = function () { + return this.m_lengthA; + }; + /** + * Get the current length of the segment attached to bodyB. + */ + PulleyJoint.prototype.getLengthB = function () { + return this.m_lengthB; + }; + /** + * Get the pulley ratio. + */ + PulleyJoint.prototype.getRatio = function () { + return this.m_ratio; + }; + /** + * Get the current length of the segment attached to bodyA. + */ + PulleyJoint.prototype.getCurrentLengthA = function () { + var p = this.m_bodyA.getWorldPoint(this.m_localAnchorA); + var s = this.m_groundAnchorA; + return Vec2.distance(p, s); + }; + /** + * Get the current length of the segment attached to bodyB. + */ + PulleyJoint.prototype.getCurrentLengthB = function () { + var p = this.m_bodyB.getWorldPoint(this.m_localAnchorB); + var s = this.m_groundAnchorB; + return Vec2.distance(p, s); + }; + /** + * Shift the origin for any points stored in world coordinates. + * + * @param newOrigin + */ + PulleyJoint.prototype.shiftOrigin = function (newOrigin) { + this.m_groundAnchorA.sub(newOrigin); + this.m_groundAnchorB.sub(newOrigin); + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + PulleyJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + PulleyJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + PulleyJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(this.m_impulse, this.m_uB).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + PulleyJoint.prototype.getReactionTorque = function (inv_dt) { + return 0.0; + }; + PulleyJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // Get the pulley axes. + this.m_uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA); + this.m_uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB); + var lengthA = this.m_uA.length(); + var lengthB = this.m_uB.length(); + if (lengthA > 10.0 * Settings.linearSlop) { + this.m_uA.mul(1.0 / lengthA); + } + else { + this.m_uA.setZero(); + } + if (lengthB > 10.0 * Settings.linearSlop) { + this.m_uB.mul(1.0 / lengthB); + } + else { + this.m_uB.setZero(); + } + // Compute effective mass. + var ruA = Vec2.crossVec2Vec2(this.m_rA, this.m_uA); // float + var ruB = Vec2.crossVec2Vec2(this.m_rB, this.m_uB); // float + var mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float + var mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float + this.m_mass = mA + this.m_ratio * this.m_ratio * mB; + if (this.m_mass > 0.0) { + this.m_mass = 1.0 / this.m_mass; + } + if (step.warmStarting) { + // Scale impulses to support variable time steps. + this.m_impulse *= step.dtRatio; + // Warm starting. + var PA = Vec2.mulNumVec2(-this.m_impulse, this.m_uA); + var PB = Vec2.mulNumVec2(-this.m_ratio * this.m_impulse, this.m_uB); + vA.addMul(this.m_invMassA, PA); + wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA); + vB.addMul(this.m_invMassB, PB); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB); + } + else { + this.m_impulse = 0.0; + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + PulleyJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA)); + var vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)); + var Cdot = -Vec2.dot(this.m_uA, vpA) - this.m_ratio + * Vec2.dot(this.m_uB, vpB); // float + var impulse = -this.m_mass * Cdot; // float + this.m_impulse += impulse; + var PA = Vec2.mulNumVec2(-impulse, this.m_uA); // Vec2 + var PB = Vec2.mulNumVec2(-this.m_ratio * impulse, this.m_uB); // Vec2 + vA.addMul(this.m_invMassA, PA); + wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA); + vB.addMul(this.m_invMassB, PB); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB); + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + PulleyJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // Get the pulley axes. + var uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA); + var uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB); + var lengthA = uA.length(); + var lengthB = uB.length(); + if (lengthA > 10.0 * Settings.linearSlop) { + uA.mul(1.0 / lengthA); + } + else { + uA.setZero(); + } + if (lengthB > 10.0 * Settings.linearSlop) { + uB.mul(1.0 / lengthB); + } + else { + uB.setZero(); + } + // Compute effective mass. + var ruA = Vec2.crossVec2Vec2(rA, uA); + var ruB = Vec2.crossVec2Vec2(rB, uB); + var mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float + var mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float + var mass = mA + this.m_ratio * this.m_ratio * mB; // float + if (mass > 0.0) { + mass = 1.0 / mass; + } + var C = this.m_constant - lengthA - this.m_ratio * lengthB; // float + var linearError = math.abs(C); // float + var impulse = -mass * C; // float + var PA = Vec2.mulNumVec2(-impulse, uA); // Vec2 + var PB = Vec2.mulNumVec2(-this.m_ratio * impulse, uB); // Vec2 + cA.addMul(this.m_invMassA, PA); + aA += this.m_invIA * Vec2.crossVec2Vec2(rA, PA); + cB.addMul(this.m_invMassB, PB); + aB += this.m_invIB * Vec2.crossVec2Vec2(rB, PB); + this.m_bodyA.c_position.c = cA; + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c = cB; + this.m_bodyB.c_position.a = aB; + return linearError < Settings.linearSlop; + }; + PulleyJoint.TYPE = 'pulley-joint'; + return PulleyJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var inactiveLimit = 0; +var atUpperLimit = 2; +var DEFAULTS$2 = { + maxLength: 0.0, +}; +/** + * A rope joint enforces a maximum distance between two points on two bodies. It + * has no other effect. + * + * Warning: if you attempt to change the maximum length during the simulation + * you will get some non-physical behavior. + * + * A model that would allow you to dynamically modify the length would have some + * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you + * want to dynamically control length. + */ +var RopeJoint = /** @class */ (function (_super) { + __extends(RopeJoint, _super); + function RopeJoint(def, bodyA, bodyB, anchor) { + var _this = this; + // @ts-ignore + if (!(_this instanceof RopeJoint)) { + return new RopeJoint(def, bodyA, bodyB, anchor); + } + def = options(def, DEFAULTS$2); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = RopeJoint.TYPE; + _this.m_localAnchorA = anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.neo(-1.0, 0.0); + _this.m_localAnchorB = anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.neo(1.0, 0.0); + _this.m_maxLength = def.maxLength; + _this.m_mass = 0.0; + _this.m_impulse = 0.0; + _this.m_length = 0.0; + _this.m_state = inactiveLimit; + return _this; + // Limit: + // C = norm(pB - pA) - L + // u = (pB - pA) / norm(pB - pA) + // Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA)) + // J = [-u -cross(rA, u) u cross(rB, u)] + // K = J * invM * JT + // = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2 + } + /** @internal */ + RopeJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + maxLength: this.m_maxLength, + }; + }; + /** @internal */ + RopeJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new RopeJoint(data); + return joint; + }; + /** + * The local anchor point relative to bodyA's origin. + */ + RopeJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + RopeJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * Set the maximum length of the rope. + */ + RopeJoint.prototype.setMaxLength = function (length) { + this.m_maxLength = length; + }; + /** + * Get the maximum length of the rope. + */ + RopeJoint.prototype.getMaxLength = function () { + return this.m_maxLength; + }; + RopeJoint.prototype.getLimitState = function () { + // TODO LimitState + return this.m_state; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + RopeJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + RopeJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + RopeJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + RopeJoint.prototype.getReactionTorque = function (inv_dt) { + return 0.0; + }; + RopeJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); + this.m_rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); + this.m_u = Vec2.zero(); + this.m_u.addCombine(1, cB, 1, this.m_rB); + this.m_u.subCombine(1, cA, 1, this.m_rA); // Vec2 + this.m_length = this.m_u.length(); + var C = this.m_length - this.m_maxLength; // float + if (C > 0.0) { + this.m_state = atUpperLimit; + } + else { + this.m_state = inactiveLimit; + } + if (this.m_length > Settings.linearSlop) { + this.m_u.mul(1.0 / this.m_length); + } + else { + this.m_u.setZero(); + this.m_mass = 0.0; + this.m_impulse = 0.0; + return; + } + // Compute effective mass. + var crA = Vec2.crossVec2Vec2(this.m_rA, this.m_u); // float + var crB = Vec2.crossVec2Vec2(this.m_rB, this.m_u); // float + var invMass = this.m_invMassA + this.m_invIA * crA * crA + this.m_invMassB + + this.m_invIB * crB * crB; // float + this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0; + if (step.warmStarting) { + // Scale the impulse to support a variable time step. + this.m_impulse *= step.dtRatio; + var P = Vec2.mulNumVec2(this.m_impulse, this.m_u); + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); + } + else { + this.m_impulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + RopeJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + // Cdot = dot(u, v + cross(w, r)) + var vpA = Vec2.addCrossNumVec2(vA, wA, this.m_rA); // Vec2 + var vpB = Vec2.addCrossNumVec2(vB, wB, this.m_rB); // Vec2 + var C = this.m_length - this.m_maxLength; // float + var Cdot = Vec2.dot(this.m_u, Vec2.sub(vpB, vpA)); // float + // Predictive constraint. + if (C < 0.0) { + Cdot += step.inv_dt * C; + } + var impulse = -this.m_mass * Cdot; // float + var oldImpulse = this.m_impulse; // float + this.m_impulse = math.min(0.0, this.m_impulse + impulse); + impulse = this.m_impulse - oldImpulse; + var P = Vec2.mulNumVec2(impulse, this.m_u); // Vec2 + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + RopeJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; // Vec2 + var aA = this.m_bodyA.c_position.a; // float + var cB = this.m_bodyB.c_position.c; // Vec2 + var aB = this.m_bodyB.c_position.a; // float + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); + var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); + var u = Vec2.zero(); + u.addCombine(1, cB, 1, rB); + u.subCombine(1, cA, 1, rA); // Vec2 + var length = u.normalize(); // float + var C = length - this.m_maxLength; // float + C = math.clamp(C, 0.0, Settings.maxLinearCorrection); + var impulse = -this.m_mass * C; // float + var P = Vec2.mulNumVec2(impulse, u); // Vec2 + cA.subMul(this.m_invMassA, P); + aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P); + cB.addMul(this.m_invMassB, P); + aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P); + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + return length - this.m_maxLength < Settings.linearSlop; + }; + RopeJoint.TYPE = 'rope-joint'; + return RopeJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$1 = { + frequencyHz: 0.0, + dampingRatio: 0.0, +}; +/** + * A weld joint essentially glues two bodies together. A weld joint may distort + * somewhat because the island constraint solver is approximate. + */ +var WeldJoint = /** @class */ (function (_super) { + __extends(WeldJoint, _super); + function WeldJoint(def, bodyA, bodyB, anchor) { + var _this = this; + // @ts-ignore + if (!(_this instanceof WeldJoint)) { + return new WeldJoint(def, bodyA, bodyB, anchor); + } + def = options(def, DEFAULTS$1); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = WeldJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + _this.m_referenceAngle = math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); + _this.m_frequencyHz = def.frequencyHz; + _this.m_dampingRatio = def.dampingRatio; + _this.m_impulse = new Vec3(); + _this.m_bias = 0.0; + _this.m_gamma = 0.0; + // Solver temp + _this.m_rA; // Vec2 + _this.m_rB; // Vec2 + _this.m_localCenterA; // Vec2 + _this.m_localCenterB; // Vec2 + _this.m_invMassA; // float + _this.m_invMassB; // float + _this.m_invIA; // float + _this.m_invIB; // float + _this.m_mass = new Mat33(); + return _this; + // Point-to-point constraint + // C = p2 - p1 + // Cdot = v2 - v1 + // / = v2 + cross(w2, r2) - v1 - cross(w1, r1) + // J = [-I -r1_skew I r2_skew ] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + // Angle constraint + // C = angle2 - angle1 - referenceAngle + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // K = invI1 + invI2 + } + /** @internal */ + WeldJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + frequencyHz: this.m_frequencyHz, + dampingRatio: this.m_dampingRatio, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + referenceAngle: this.m_referenceAngle, + }; + }; + /** @internal */ + WeldJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new WeldJoint(data); + return joint; + }; + /** @internal */ + WeldJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + WeldJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + WeldJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * Get the reference angle. + */ + WeldJoint.prototype.getReferenceAngle = function () { + return this.m_referenceAngle; + }; + /** + * Set frequency in Hz. + */ + WeldJoint.prototype.setFrequency = function (hz) { + this.m_frequencyHz = hz; + }; + /** + * Get frequency in Hz. + */ + WeldJoint.prototype.getFrequency = function () { + return this.m_frequencyHz; + }; + /** + * Set damping ratio. + */ + WeldJoint.prototype.setDampingRatio = function (ratio) { + this.m_dampingRatio = ratio; + }; + /** + * Get damping ratio. + */ + WeldJoint.prototype.getDampingRatio = function () { + return this.m_dampingRatio; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + WeldJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + WeldJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + WeldJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + WeldJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_impulse.z; + }; + WeldJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var K = new Mat33(); + K.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y * this.m_rB.y + * iB; + K.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y * this.m_rB.x * iB; + K.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB; + K.ex.y = K.ey.x; + K.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x * this.m_rB.x + * iB; + K.ez.y = this.m_rA.x * iA + this.m_rB.x * iB; + K.ex.z = K.ez.x; + K.ey.z = K.ez.y; + K.ez.z = iA + iB; + if (this.m_frequencyHz > 0.0) { + K.getInverse22(this.m_mass); + var invM = iA + iB; // float + var m = invM > 0.0 ? 1.0 / invM : 0.0; // float + var C = aB - aA - this.m_referenceAngle; // float + // Frequency + var omega = 2.0 * math.PI * this.m_frequencyHz; // float + // Damping coefficient + var d = 2.0 * m * this.m_dampingRatio * omega; // float + // Spring stiffness + var k = m * omega * omega; // float + // magic formulas + var h = step.dt; // float + this.m_gamma = h * (d + h * k); + this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0; + this.m_bias = C * h * k * this.m_gamma; + invM += this.m_gamma; + this.m_mass.ez.z = invM != 0.0 ? 1.0 / invM : 0.0; + } + else if (K.ez.z == 0.0) { + K.getInverse22(this.m_mass); + this.m_gamma = 0.0; + this.m_bias = 0.0; + } + else { + K.getSymInverse33(this.m_mass); + this.m_gamma = 0.0; + this.m_bias = 0.0; + } + if (step.warmStarting) { + // Scale impulses to support a variable time step. + this.m_impulse.mul(step.dtRatio); + var P = Vec2.neo(this.m_impulse.x, this.m_impulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_impulse.z); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_impulse.z); + } + else { + this.m_impulse.setZero(); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + WeldJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + if (this.m_frequencyHz > 0.0) { + var Cdot2 = wB - wA; // float + var impulse2 = -this.m_mass.ez.z + * (Cdot2 + this.m_bias + this.m_gamma * this.m_impulse.z); // float + this.m_impulse.z += impulse2; + wA -= iA * impulse2; + wB += iB * impulse2; + var Cdot1 = Vec2.zero(); + Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2 + var impulse1 = Vec2.neg(Mat33.mulVec2(this.m_mass, Cdot1)); // Vec2 + this.m_impulse.x += impulse1.x; + this.m_impulse.y += impulse1.y; + var P = Vec2.clone(impulse1); // Vec2 + vA.subMul(mA, P); + wA -= iA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(mB, P); + wB += iB * Vec2.crossVec2Vec2(this.m_rB, P); + } + else { + var Cdot1 = Vec2.zero(); + Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2 + var Cdot2 = wB - wA; // float + var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); // Vec3 + var impulse = Vec3.neg(Mat33.mulVec3(this.m_mass, Cdot)); // Vec3 + this.m_impulse.add(impulse); + var P = Vec2.neo(impulse.x, impulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + WeldJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + var positionError; + var angularError; + var K = new Mat33(); + K.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB; + K.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB; + K.ez.x = -rA.y * iA - rB.y * iB; + K.ex.y = K.ey.x; + K.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB; + K.ez.y = rA.x * iA + rB.x * iB; + K.ex.z = K.ez.x; + K.ey.z = K.ez.y; + K.ez.z = iA + iB; + if (this.m_frequencyHz > 0.0) { + var C1 = Vec2.zero(); + C1.addCombine(1, cB, 1, rB); + C1.subCombine(1, cA, 1, rA); // Vec2 + positionError = C1.length(); + angularError = 0.0; + var P = Vec2.neg(K.solve22(C1)); // Vec2 + cA.subMul(mA, P); + aA -= iA * Vec2.crossVec2Vec2(rA, P); + cB.addMul(mB, P); + aB += iB * Vec2.crossVec2Vec2(rB, P); + } + else { + var C1 = Vec2.zero(); + C1.addCombine(1, cB, 1, rB); + C1.subCombine(1, cA, 1, rA); + var C2 = aB - aA - this.m_referenceAngle; // float + positionError = C1.length(); + angularError = math.abs(C2); + var C = new Vec3(C1.x, C1.y, C2); + var impulse = new Vec3(); + if (K.ez.z > 0.0) { + impulse = Vec3.neg(K.solve33(C)); + } + else { + var impulse2 = Vec2.neg(K.solve22(C1)); + impulse.set(impulse2.x, impulse2.y, 0.0); + } + var P = Vec2.neo(impulse.x, impulse.y); + cA.subMul(mA, P); + aA -= iA * (Vec2.crossVec2Vec2(rA, P) + impulse.z); + cB.addMul(mB, P); + aB += iB * (Vec2.crossVec2Vec2(rB, P) + impulse.z); + } + this.m_bodyA.c_position.c = cA; + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c = cB; + this.m_bodyB.c_position.a = aB; + return positionError <= Settings.linearSlop && angularError <= Settings.angularSlop; + }; + WeldJoint.TYPE = 'weld-joint'; + return WeldJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS = { + enableMotor: false, + maxMotorTorque: 0.0, + motorSpeed: 0.0, + frequencyHz: 2.0, + dampingRatio: 0.7, +}; +/** + * A wheel joint. This joint provides two degrees of freedom: translation along + * an axis fixed in bodyA and rotation in the plane. In other words, it is a + * point to line constraint with a rotational motor and a linear spring/damper. + * This joint is designed for vehicle suspensions. + */ +var WheelJoint = /** @class */ (function (_super) { + __extends(WheelJoint, _super); + // @ts-ignore + function WheelJoint(def, bodyA, bodyB, anchor, axis) { + var _this = this; + // @ts-ignore + if (!(_this instanceof WheelJoint)) { + return new WheelJoint(def, bodyA, bodyB, anchor, axis); + } + def = options(def, DEFAULTS); + _this = _super.call(this, def, bodyA, bodyB) || this; + /** @internal */ _this.m_ax = Vec2.zero(); + /** @internal */ _this.m_ay = Vec2.zero(); + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = WheelJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + // @ts-ignore localAxis + _this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || def.localAxis || Vec2.neo(1.0, 0.0)); + _this.m_localYAxisA = Vec2.crossNumVec2(1.0, _this.m_localXAxisA); + _this.m_mass = 0.0; + _this.m_impulse = 0.0; + _this.m_motorMass = 0.0; + _this.m_motorImpulse = 0.0; + _this.m_springMass = 0.0; + _this.m_springImpulse = 0.0; + _this.m_maxMotorTorque = def.maxMotorTorque; + _this.m_motorSpeed = def.motorSpeed; + _this.m_enableMotor = def.enableMotor; + _this.m_frequencyHz = def.frequencyHz; + _this.m_dampingRatio = def.dampingRatio; + _this.m_bias = 0.0; + _this.m_gamma = 0.0; + return _this; + // Linear constraint (point-to-line) + // d = pB - pA = xB + rB - xA - rA + // C = dot(ay, d) + // Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA, + // rA)) + // = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB, + // ay), vB) + // J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)] + // Spring linear constraint + // C = dot(ax, d) + // Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) + + // dot(cross(rB, ax), vB) + // J = [-ax -cross(d+rA, ax) ax cross(rB, ax)] + // Motor rotational constraint + // Cdot = wB - wA + // J = [0 0 -1 0 0 1] + } + /** @internal */ + WheelJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + enableMotor: this.m_enableMotor, + maxMotorTorque: this.m_maxMotorTorque, + motorSpeed: this.m_motorSpeed, + frequencyHz: this.m_frequencyHz, + dampingRatio: this.m_dampingRatio, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + localAxisA: this.m_localXAxisA, + }; + }; + /** @internal */ + WheelJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new WheelJoint(data); + return joint; + }; + /** @internal */ + WheelJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + if (def.localAxisA) { + this.m_localXAxisA.setVec2(def.localAxisA); + this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA)); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + WheelJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + WheelJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * The local joint axis relative to bodyA. + */ + WheelJoint.prototype.getLocalAxisA = function () { + return this.m_localXAxisA; + }; + /** + * Get the current joint translation, usually in meters. + */ + WheelJoint.prototype.getJointTranslation = function () { + var bA = this.m_bodyA; + var bB = this.m_bodyB; + var pA = bA.getWorldPoint(this.m_localAnchorA); // Vec2 + var pB = bB.getWorldPoint(this.m_localAnchorB); // Vec2 + var d = Vec2.sub(pB, pA); // Vec2 + var axis = bA.getWorldVector(this.m_localXAxisA); // Vec2 + var translation = Vec2.dot(d, axis); // float + return translation; + }; + /** + * Get the current joint translation speed, usually in meters per second. + */ + WheelJoint.prototype.getJointSpeed = function () { + var wA = this.m_bodyA.m_angularVelocity; + var wB = this.m_bodyB.m_angularVelocity; + return wB - wA; + }; + /** + * Is the joint motor enabled? + */ + WheelJoint.prototype.isMotorEnabled = function () { + return this.m_enableMotor; + }; + /** + * Enable/disable the joint motor. + */ + WheelJoint.prototype.enableMotor = function (flag) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableMotor = flag; + }; + /** + * Set the motor speed, usually in radians per second. + */ + WheelJoint.prototype.setMotorSpeed = function (speed) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_motorSpeed = speed; + }; + /** + * Get the motor speed, usually in radians per second. + */ + WheelJoint.prototype.getMotorSpeed = function () { + return this.m_motorSpeed; + }; + /** + * Set/Get the maximum motor force, usually in N-m. + */ + WheelJoint.prototype.setMaxMotorTorque = function (torque) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_maxMotorTorque = torque; + }; + WheelJoint.prototype.getMaxMotorTorque = function () { + return this.m_maxMotorTorque; + }; + /** + * Get the current motor torque given the inverse time step, usually in N-m. + */ + WheelJoint.prototype.getMotorTorque = function (inv_dt) { + return inv_dt * this.m_motorImpulse; + }; + /** + * Set/Get the spring frequency in hertz. Setting the frequency to zero disables + * the spring. + */ + WheelJoint.prototype.setSpringFrequencyHz = function (hz) { + this.m_frequencyHz = hz; + }; + WheelJoint.prototype.getSpringFrequencyHz = function () { + return this.m_frequencyHz; + }; + /** + * Set/Get the spring damping ratio + */ + WheelJoint.prototype.setSpringDampingRatio = function (ratio) { + this.m_dampingRatio = ratio; + }; + WheelJoint.prototype.getSpringDampingRatio = function () { + return this.m_dampingRatio; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + WheelJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + WheelJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + WheelJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + WheelJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_motorImpulse; + }; + WheelJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + // Compute the effective masses. + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + var d = Vec2.zero(); + d.addCombine(1, cB, 1, rB); + d.subCombine(1, cA, 1, rA); // Vec2 + // Point to line constraint + { + this.m_ay = Rot.mulVec2(qA, this.m_localYAxisA); + this.m_sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ay); + this.m_sBy = Vec2.crossVec2Vec2(rB, this.m_ay); + this.m_mass = mA + mB + iA * this.m_sAy * this.m_sAy + iB * this.m_sBy + * this.m_sBy; + if (this.m_mass > 0.0) { + this.m_mass = 1.0 / this.m_mass; + } + } + // Spring constraint + this.m_springMass = 0.0; + this.m_bias = 0.0; + this.m_gamma = 0.0; + if (this.m_frequencyHz > 0.0) { + this.m_ax = Rot.mulVec2(qA, this.m_localXAxisA); + this.m_sAx = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ax); + this.m_sBx = Vec2.crossVec2Vec2(rB, this.m_ax); + var invMass = mA + mB + iA * this.m_sAx * this.m_sAx + iB * this.m_sBx + * this.m_sBx; // float + if (invMass > 0.0) { + this.m_springMass = 1.0 / invMass; + var C = Vec2.dot(d, this.m_ax); // float + // Frequency + var omega = 2.0 * math.PI * this.m_frequencyHz; // float + // Damping coefficient + var damp = 2.0 * this.m_springMass * this.m_dampingRatio * omega; // float + // Spring stiffness + var k = this.m_springMass * omega * omega; // float + // magic formulas + var h = step.dt; // float + this.m_gamma = h * (damp + h * k); + if (this.m_gamma > 0.0) { + this.m_gamma = 1.0 / this.m_gamma; + } + this.m_bias = C * h * k * this.m_gamma; + this.m_springMass = invMass + this.m_gamma; + if (this.m_springMass > 0.0) { + this.m_springMass = 1.0 / this.m_springMass; + } + } + } + else { + this.m_springImpulse = 0.0; + } + // Rotational motor + if (this.m_enableMotor) { + this.m_motorMass = iA + iB; + if (this.m_motorMass > 0.0) { + this.m_motorMass = 1.0 / this.m_motorMass; + } + } + else { + this.m_motorMass = 0.0; + this.m_motorImpulse = 0.0; + } + if (step.warmStarting) { + // Account for variable time step. + this.m_impulse *= step.dtRatio; + this.m_springImpulse *= step.dtRatio; + this.m_motorImpulse *= step.dtRatio; + var P = Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax); + var LA = this.m_impulse * this.m_sAy + this.m_springImpulse * this.m_sAx + this.m_motorImpulse; + var LB = this.m_impulse * this.m_sBy + this.m_springImpulse * this.m_sBx + this.m_motorImpulse; + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * LA; + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * LB; + } + else { + this.m_impulse = 0.0; + this.m_springImpulse = 0.0; + this.m_motorImpulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + WheelJoint.prototype.solveVelocityConstraints = function (step) { + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + // Solve spring constraint + { + var Cdot = Vec2.dot(this.m_ax, vB) - Vec2.dot(this.m_ax, vA) + this.m_sBx + * wB - this.m_sAx * wA; // float + var impulse = -this.m_springMass + * (Cdot + this.m_bias + this.m_gamma * this.m_springImpulse); // float + this.m_springImpulse += impulse; + var P = Vec2.mulNumVec2(impulse, this.m_ax); // Vec2 + var LA = impulse * this.m_sAx; // float + var LB = impulse * this.m_sBx; // float + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + // Solve rotational motor constraint + { + var Cdot = wB - wA - this.m_motorSpeed; // float + var impulse = -this.m_motorMass * Cdot; // float + var oldImpulse = this.m_motorImpulse; // float + var maxImpulse = step.dt * this.m_maxMotorTorque; // float + this.m_motorImpulse = math.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_motorImpulse - oldImpulse; + wA -= iA * impulse; + wB += iB * impulse; + } + // Solve point to line constraint + { + var Cdot = Vec2.dot(this.m_ay, vB) - Vec2.dot(this.m_ay, vA) + this.m_sBy + * wB - this.m_sAy * wA; // float + var impulse = -this.m_mass * Cdot; // float + this.m_impulse += impulse; + var P = Vec2.mulNumVec2(impulse, this.m_ay); // Vec2 + var LA = impulse * this.m_sAy; // float + var LB = impulse * this.m_sBy; // float + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + WheelJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + var d = Vec2.zero(); + d.addCombine(1, cB, 1, rB); + d.subCombine(1, cA, 1, rA); + var ay = Rot.mulVec2(qA, this.m_localYAxisA); + var sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), ay); // float + var sBy = Vec2.crossVec2Vec2(rB, ay); // float + var C = Vec2.dot(d, ay); // float + var k = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_sAy + * this.m_sAy + this.m_invIB * this.m_sBy * this.m_sBy; // float + var impulse; // float + if (k != 0.0) { + impulse = -C / k; + } + else { + impulse = 0.0; + } + var P = Vec2.mulNumVec2(impulse, ay); // Vec2 + var LA = impulse * sAy; // float + var LB = impulse * sBy; // float + cA.subMul(this.m_invMassA, P); + aA -= this.m_invIA * LA; + cB.addMul(this.m_invMassB, P); + aB += this.m_invIB * LB; + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + return math.abs(C) <= Settings.linearSlop; + }; + WheelJoint.TYPE = 'wheel-joint'; + return WheelJoint; +}(Joint)); + +var SID = 0; +function Serializer(opts) { + var _a; + opts = opts || {}; + var rootClass = opts.rootClass || World; + var preSerialize = opts.preSerialize || function (obj) { return obj; }; + var postSerialize = opts.postSerialize || function (data, obj) { return data; }; + var preDeserialize = opts.preDeserialize || function (data) { return data; }; + var postDeserialize = opts.postDeserialize || function (obj, data) { return obj; }; + // This is used to create ref objects during serialize + var refTypes = { + World: World, + Body: Body, + Joint: Joint, + Fixture: Fixture, + Shape: Shape, + }; + // This is used by restore to deserialize objects and refs + var restoreTypes = __assign({ Vec2: Vec2, + Vec3: Vec3 }, refTypes); + var CLASS_BY_TYPE_PROP = (_a = {}, + _a[Body.STATIC] = Body, + _a[Body.DYNAMIC] = Body, + _a[Body.KINEMATIC] = Body, + _a[ChainShape.TYPE] = ChainShape, + _a[BoxShape.TYPE] = BoxShape, + _a[EdgeShape.TYPE] = EdgeShape, + _a[PolygonShape.TYPE] = PolygonShape, + _a[CircleShape.TYPE] = CircleShape, + _a[DistanceJoint.TYPE] = DistanceJoint, + _a[FrictionJoint.TYPE] = FrictionJoint, + _a[GearJoint.TYPE] = GearJoint, + _a[MotorJoint.TYPE] = MotorJoint, + _a[MouseJoint.TYPE] = MouseJoint, + _a[PrismaticJoint.TYPE] = PrismaticJoint, + _a[PulleyJoint.TYPE] = PulleyJoint, + _a[RevoluteJoint.TYPE] = RevoluteJoint, + _a[RopeJoint.TYPE] = RopeJoint, + _a[WeldJoint.TYPE] = WeldJoint, + _a[WheelJoint.TYPE] = WheelJoint, + _a); + this.toJson = function (root) { + var json = []; + var queue = [root]; + var refMap = {}; + function storeRef(value, typeName) { + value.__sid = value.__sid || ++SID; + if (!refMap[value.__sid]) { + queue.push(value); + var index = json.length + queue.length; + var ref = { + refIndex: index, + refType: typeName + }; + refMap[value.__sid] = ref; + } + return refMap[value.__sid]; + } + function serialize(obj) { + obj = preSerialize(obj); + var data = obj._serialize(); + data = postSerialize(data, obj); + return data; + } + function toJson(value, top) { + if (typeof value !== 'object' || value === null) { + return value; + } + if (typeof value._serialize === 'function') { + if (value !== top) { + // tslint:disable-next-line:no-for-in + for (var typeName in refTypes) { + if (value instanceof refTypes[typeName]) { + return storeRef(value, typeName); + } + } + } + value = serialize(value); + } + if (Array.isArray(value)) { + var newValue = []; + for (var key = 0; key < value.length; key++) { + newValue[key] = toJson(value[key]); + } + value = newValue; + } + else { + var newValue = {}; + // tslint:disable-next-line:no-for-in + for (var key in value) { + if (value.hasOwnProperty(key)) { + newValue[key] = toJson(value[key]); + } + } + value = newValue; + } + return value; + } + while (queue.length) { + var obj = queue.shift(); + var str = toJson(obj, obj); + json.push(str); + } + return json; + }; + this.fromJson = function (json) { + var refMap = {}; + function findDeserilizer(data, cls) { + if (!cls || !cls._deserialize) { + cls = CLASS_BY_TYPE_PROP[data.type]; + } + return cls && cls._deserialize; + } + /** + * Deserialize a data object. + */ + function deserialize(cls, data, ctx) { + var deserializer = findDeserilizer(data, cls); + if (!deserializer) { + return; + } + data = preDeserialize(data); + var obj = deserializer(data, ctx, restoreRef); + obj = postDeserialize(obj, data); + return obj; + } + /** + * Restore a ref object or deserialize a data object. + * + * This is passed as callback to class deserializers. + */ + function restoreRef(cls, ref, ctx) { + if (!ref.refIndex) { + return cls && cls._deserialize && deserialize(cls, ref, ctx); + } + cls = restoreTypes[ref.refType] || cls; + var index = ref.refIndex; + if (!refMap[index]) { + var data = json[index]; + var obj = deserialize(cls, data, ctx); + refMap[index] = obj; + } + return refMap[index]; + } + var root = rootClass._deserialize(json[0], null, restoreRef); + return root; + }; +} +var serializer = new Serializer(); +Serializer.toJson = serializer.toJson; +Serializer.fromJson = serializer.fromJson; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact); +function CircleCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + CollideCircles(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); +} +var CollideCircles = function (manifold, circleA, xfA, circleB, xfB) { + manifold.pointCount = 0; + var pA = Transform.mulVec2(xfA, circleA.m_p); + var pB = Transform.mulVec2(xfB, circleB.m_p); + var distSqr = Vec2.distanceSquared(pB, pA); + var rA = circleA.m_radius; + var rB = circleB.m_radius; + var radius = rA + rB; + if (distSqr > radius * radius) { + return; + } + manifold.type = exports.ManifoldType.e_circles; + manifold.localPoint.setVec2(circleA.m_p); + manifold.localNormal.setZero(); + manifold.pointCount = 1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = exports.ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(EdgeShape.TYPE, CircleShape.TYPE, EdgeCircleContact); +Contact.addType(ChainShape.TYPE, CircleShape.TYPE, ChainCircleContact); +function EdgeCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + var shapeA = fixtureA.getShape(); + var shapeB = fixtureB.getShape(); + CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB); +} +function ChainCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + var chain = fixtureA.getShape(); + var edge = new EdgeShape(); + chain.getChildEdge(edge, indexA); + var shapeA = edge; + var shapeB = fixtureB.getShape(); + CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB); +} +// Compute contact points for edge versus circle. +// This accounts for edge connectivity. +var CollideEdgeCircle = function (manifold, edgeA, xfA, circleB, xfB) { + manifold.pointCount = 0; + // Compute circle in frame of edge + var Q = Transform.mulTVec2(xfA, Transform.mulVec2(xfB, circleB.m_p)); + var A = edgeA.m_vertex1; + var B = edgeA.m_vertex2; + var e = Vec2.sub(B, A); + // Barycentric coordinates + var u = Vec2.dot(e, Vec2.sub(B, Q)); + var v = Vec2.dot(e, Vec2.sub(Q, A)); + var radius = edgeA.m_radius + circleB.m_radius; + // Region A + if (v <= 0.0) { + var P_1 = Vec2.clone(A); + var d_1 = Vec2.sub(Q, P_1); + var dd_1 = Vec2.dot(d_1, d_1); + if (dd_1 > radius * radius) { + return; + } + // Is there an edge connected to A? + if (edgeA.m_hasVertex0) { + var A1 = edgeA.m_vertex0; + var B1 = A; + var e1 = Vec2.sub(B1, A1); + var u1 = Vec2.dot(e1, Vec2.sub(B1, Q)); + // Is the circle in Region AB of the previous edge? + if (u1 > 0.0) { + return; + } + } + manifold.type = exports.ManifoldType.e_circles; + manifold.localNormal.setZero(); + manifold.localPoint.setVec2(P_1); + manifold.pointCount = 1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = exports.ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; + return; + } + // Region B + if (u <= 0.0) { + var P_2 = Vec2.clone(B); + var d_2 = Vec2.sub(Q, P_2); + var dd_2 = Vec2.dot(d_2, d_2); + if (dd_2 > radius * radius) { + return; + } + // Is there an edge connected to B? + if (edgeA.m_hasVertex3) { + var B2 = edgeA.m_vertex3; + var A2 = B; + var e2 = Vec2.sub(B2, A2); + var v2 = Vec2.dot(e2, Vec2.sub(Q, A2)); + // Is the circle in Region AB of the next edge? + if (v2 > 0.0) { + return; + } + } + manifold.type = exports.ManifoldType.e_circles; + manifold.localNormal.setZero(); + manifold.localPoint.setVec2(P_2); + manifold.pointCount = 1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 1; + manifold.points[0].id.cf.typeA = exports.ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; + return; + } + // Region AB + var den = Vec2.dot(e, e); + var P = Vec2.combine(u / den, A, v / den, B); + var d = Vec2.sub(Q, P); + var dd = Vec2.dot(d, d); + if (dd > radius * radius) { + return; + } + var n = Vec2.neo(-e.y, e.x); + if (Vec2.dot(n, Vec2.sub(Q, A)) < 0.0) { + n.setNum(-n.x, -n.y); + } + n.normalize(); + manifold.type = exports.ManifoldType.e_faceA; + manifold.localNormal = n; + manifold.localPoint.setVec2(A); + manifold.pointCount = 1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = exports.ContactFeatureType.e_face; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(PolygonShape.TYPE, PolygonShape.TYPE, PolygonContact); +function PolygonContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + CollidePolygons(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); +} +/** + * Find the max separation between poly1 and poly2 using edge normals from + * poly1. + */ +function findMaxSeparation(poly1, xf1, poly2, xf2, output) { + var count1 = poly1.m_count; + var count2 = poly2.m_count; + var n1s = poly1.m_normals; + var v1s = poly1.m_vertices; + var v2s = poly2.m_vertices; + var xf = Transform.mulTXf(xf2, xf1); + var bestIndex = 0; + var maxSeparation = -Infinity; + for (var i = 0; i < count1; ++i) { + // Get poly1 normal in frame2. + var n = Rot.mulVec2(xf.q, n1s[i]); + var v1 = Transform.mulVec2(xf, v1s[i]); + // Find deepest point for normal i. + var si = Infinity; + for (var j = 0; j < count2; ++j) { + var sij = Vec2.dot(n, v2s[j]) - Vec2.dot(n, v1); + if (sij < si) { + si = sij; + } + } + if (si > maxSeparation) { + maxSeparation = si; + bestIndex = i; + } + } + // used to keep last FindMaxSeparation call values + output.maxSeparation = maxSeparation; + output.bestIndex = bestIndex; +} +function findIncidentEdge(c, poly1, xf1, edge1, poly2, xf2) { + var normals1 = poly1.m_normals; + var count2 = poly2.m_count; + var vertices2 = poly2.m_vertices; + var normals2 = poly2.m_normals; + // Get the normal of the reference edge in poly2's frame. + var normal1 = Rot.mulTVec2(xf2.q, Rot.mulVec2(xf1.q, normals1[edge1])); + // Find the incident edge on poly2. + var index = 0; + var minDot = Infinity; + for (var i = 0; i < count2; ++i) { + var dot = Vec2.dot(normal1, normals2[i]); + if (dot < minDot) { + minDot = dot; + index = i; + } + } + // Build the clip vertices for the incident edge. + var i1 = index; + var i2 = i1 + 1 < count2 ? i1 + 1 : 0; + c[0].v = Transform.mulVec2(xf2, vertices2[i1]); + c[0].id.cf.indexA = edge1; + c[0].id.cf.indexB = i1; + c[0].id.cf.typeA = exports.ContactFeatureType.e_face; + c[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; + c[1].v = Transform.mulVec2(xf2, vertices2[i2]); + c[1].id.cf.indexA = edge1; + c[1].id.cf.indexB = i2; + c[1].id.cf.typeA = exports.ContactFeatureType.e_face; + c[1].id.cf.typeB = exports.ContactFeatureType.e_vertex; +} +var maxSeparation = { + maxSeparation: 0, + bestIndex: 0, +}; +/** + * + * Find edge normal of max separation on A - return if separating axis is found
+ * Find edge normal of max separation on B - return if separation axis is found
+ * Choose reference edge as min(minA, minB)
+ * Find incident edge
+ * Clip + * + * The normal points from 1 to 2 + */ +var CollidePolygons = function (manifold, polyA, xfA, polyB, xfB) { + manifold.pointCount = 0; + var totalRadius = polyA.m_radius + polyB.m_radius; + findMaxSeparation(polyA, xfA, polyB, xfB, maxSeparation); + var edgeA = maxSeparation.bestIndex; + var separationA = maxSeparation.maxSeparation; + if (separationA > totalRadius) + return; + findMaxSeparation(polyB, xfB, polyA, xfA, maxSeparation); + var edgeB = maxSeparation.bestIndex; + var separationB = maxSeparation.maxSeparation; + if (separationB > totalRadius) + return; + var poly1; // reference polygon + var poly2; // incident polygon + var xf1; + var xf2; + var edge1; // reference edge + var flip; + var k_tol = 0.1 * Settings.linearSlop; + if (separationB > separationA + k_tol) { + poly1 = polyB; + poly2 = polyA; + xf1 = xfB; + xf2 = xfA; + edge1 = edgeB; + manifold.type = exports.ManifoldType.e_faceB; + flip = 1; + } + else { + poly1 = polyA; + poly2 = polyB; + xf1 = xfA; + xf2 = xfB; + edge1 = edgeA; + manifold.type = exports.ManifoldType.e_faceA; + flip = 0; + } + var incidentEdge = [new ClipVertex(), new ClipVertex()]; + findIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2); + var count1 = poly1.m_count; + var vertices1 = poly1.m_vertices; + var iv1 = edge1; + var iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0; + var v11 = vertices1[iv1]; + var v12 = vertices1[iv2]; + var localTangent = Vec2.sub(v12, v11); + localTangent.normalize(); + var localNormal = Vec2.crossVec2Num(localTangent, 1.0); + var planePoint = Vec2.combine(0.5, v11, 0.5, v12); + var tangent = Rot.mulVec2(xf1.q, localTangent); + var normal = Vec2.crossVec2Num(tangent, 1.0); + v11 = Transform.mulVec2(xf1, v11); + v12 = Transform.mulVec2(xf1, v12); + // Face offset. + var frontOffset = Vec2.dot(normal, v11); + // Side offsets, extended by polytope skin thickness. + var sideOffset1 = -Vec2.dot(tangent, v11) + totalRadius; + var sideOffset2 = Vec2.dot(tangent, v12) + totalRadius; + // Clip incident edge against extruded edge1 side edges. + var clipPoints1 = [new ClipVertex(), new ClipVertex()]; + var clipPoints2 = [new ClipVertex(), new ClipVertex()]; + var np; + // Clip to box side 1 + np = clipSegmentToLine(clipPoints1, incidentEdge, Vec2.neg(tangent), sideOffset1, iv1); + if (np < 2) { + return; + } + // Clip to negative box side 1 + np = clipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2); + if (np < 2) { + return; + } + // Now clipPoints2 contains the clipped points. + manifold.localNormal = localNormal; + manifold.localPoint = planePoint; + var pointCount = 0; + for (var i = 0; i < clipPoints2.length /* maxManifoldPoints */; ++i) { + var separation = Vec2.dot(normal, clipPoints2[i].v) - frontOffset; + if (separation <= totalRadius) { + var cp = manifold.points[pointCount]; + cp.localPoint.setVec2(Transform.mulTVec2(xf2, clipPoints2[i].v)); + cp.id = clipPoints2[i].id; + if (flip) { + // Swap features + var cf = cp.id.cf; + var indexA = cf.indexA; + var indexB = cf.indexB; + var typeA = cf.typeA; + var typeB = cf.typeB; + cf.indexA = indexB; + cf.indexB = indexA; + cf.typeA = typeB; + cf.typeB = typeA; + } + ++pointCount; + } + } + manifold.pointCount = pointCount; +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(PolygonShape.TYPE, CircleShape.TYPE, PolygonCircleContact); +function PolygonCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + CollidePolygonCircle(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); +} +var CollidePolygonCircle = function (manifold, polygonA, xfA, circleB, xfB) { + manifold.pointCount = 0; + // Compute circle position in the frame of the polygon. + var c = Transform.mulVec2(xfB, circleB.m_p); + var cLocal = Transform.mulTVec2(xfA, c); + // Find the min separating edge. + var normalIndex = 0; + var separation = -Infinity; + var radius = polygonA.m_radius + circleB.m_radius; + var vertexCount = polygonA.m_count; + var vertices = polygonA.m_vertices; + var normals = polygonA.m_normals; + for (var i = 0; i < vertexCount; ++i) { + var s = Vec2.dot(normals[i], Vec2.sub(cLocal, vertices[i])); + if (s > radius) { + // Early out. + return; + } + if (s > separation) { + separation = s; + normalIndex = i; + } + } + // Vertices that subtend the incident face. + var vertIndex1 = normalIndex; + var vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0; + var v1 = vertices[vertIndex1]; + var v2 = vertices[vertIndex2]; + // If the center is inside the polygon ... + if (separation < math.EPSILON) { + manifold.pointCount = 1; + manifold.type = exports.ManifoldType.e_faceA; + manifold.localNormal.setVec2(normals[normalIndex]); + manifold.localPoint.setCombine(0.5, v1, 0.5, v2); + manifold.points[0].localPoint = circleB.m_p; + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = exports.ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; + return; + } + // Compute barycentric coordinates + var u1 = Vec2.dot(Vec2.sub(cLocal, v1), Vec2.sub(v2, v1)); + var u2 = Vec2.dot(Vec2.sub(cLocal, v2), Vec2.sub(v1, v2)); + if (u1 <= 0.0) { + if (Vec2.distanceSquared(cLocal, v1) > radius * radius) { + return; + } + manifold.pointCount = 1; + manifold.type = exports.ManifoldType.e_faceA; + manifold.localNormal.setCombine(1, cLocal, -1, v1); + manifold.localNormal.normalize(); + manifold.localPoint = v1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = exports.ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; + } + else if (u2 <= 0.0) { + if (Vec2.distanceSquared(cLocal, v2) > radius * radius) { + return; + } + manifold.pointCount = 1; + manifold.type = exports.ManifoldType.e_faceA; + manifold.localNormal.setCombine(1, cLocal, -1, v2); + manifold.localNormal.normalize(); + manifold.localPoint.setVec2(v2); + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = exports.ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; + } + else { + var faceCenter = Vec2.mid(v1, v2); + var separation_1 = Vec2.dot(cLocal, normals[vertIndex1]) - Vec2.dot(faceCenter, normals[vertIndex1]); + if (separation_1 > radius) { + return; + } + manifold.pointCount = 1; + manifold.type = exports.ManifoldType.e_faceA; + manifold.localNormal.setVec2(normals[vertIndex1]); + manifold.localPoint.setVec2(faceCenter); + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = exports.ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; + } +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(EdgeShape.TYPE, PolygonShape.TYPE, EdgePolygonContact); +Contact.addType(ChainShape.TYPE, PolygonShape.TYPE, ChainPolygonContact); +function EdgePolygonContact(manifold, xfA, fA, indexA, xfB, fB, indexB) { + CollideEdgePolygon(manifold, fA.getShape(), xfA, fB.getShape(), xfB); +} +function ChainPolygonContact(manifold, xfA, fA, indexA, xfB, fB, indexB) { + var chain = fA.getShape(); + var edge = new EdgeShape(); + chain.getChildEdge(edge, indexA); + CollideEdgePolygon(manifold, edge, xfA, fB.getShape(), xfB); +} +var EPAxisType; +(function (EPAxisType) { + EPAxisType[EPAxisType["e_unknown"] = -1] = "e_unknown"; + EPAxisType[EPAxisType["e_edgeA"] = 1] = "e_edgeA"; + EPAxisType[EPAxisType["e_edgeB"] = 2] = "e_edgeB"; +})(EPAxisType || (EPAxisType = {})); +// unused? +var VertexType; +(function (VertexType) { + VertexType[VertexType["e_isolated"] = 0] = "e_isolated"; + VertexType[VertexType["e_concave"] = 1] = "e_concave"; + VertexType[VertexType["e_convex"] = 2] = "e_convex"; +})(VertexType || (VertexType = {})); +/** + * This structure is used to keep track of the best separating axis. + */ +var EPAxis = /** @class */ (function () { + function EPAxis() { + } + return EPAxis; +}()); +/** + * This holds polygon B expressed in frame A. + */ +var TempPolygon = /** @class */ (function () { + function TempPolygon() { + this.vertices = []; // [Settings.maxPolygonVertices] + this.normals = []; // [Settings.maxPolygonVertices]; + this.count = 0; + } + return TempPolygon; +}()); +/** + * Reference face used for clipping + */ +var ReferenceFace = /** @class */ (function () { + function ReferenceFace() { + this.normal = Vec2.zero(); + this.sideNormal1 = Vec2.zero(); + this.sideNormal2 = Vec2.zero(); + } + return ReferenceFace; +}()); +// reused +var edgeAxis = new EPAxis(); +var polygonAxis = new EPAxis(); +var polygonBA = new TempPolygon(); +var rf = new ReferenceFace(); +/** + * This function collides and edge and a polygon, taking into account edge + * adjacency. + */ +var CollideEdgePolygon = function (manifold, edgeA, xfA, polygonB, xfB) { + // Algorithm: + // 1. Classify v1 and v2 + // 2. Classify polygon centroid as front or back + // 3. Flip normal if necessary + // 4. Initialize normal range to [-pi, pi] about face normal + // 5. Adjust normal range according to adjacent edges + // 6. Visit each separating axes, only accept axes within the range + // 7. Return if _any_ axis indicates separation + // 8. Clip + // let m_type1: VertexType; + // let m_type2: VertexType; + var xf = Transform.mulTXf(xfA, xfB); + var centroidB = Transform.mulVec2(xf, polygonB.m_centroid); + var v0 = edgeA.m_vertex0; + var v1 = edgeA.m_vertex1; + var v2 = edgeA.m_vertex2; + var v3 = edgeA.m_vertex3; + var hasVertex0 = edgeA.m_hasVertex0; + var hasVertex3 = edgeA.m_hasVertex3; + var edge1 = Vec2.sub(v2, v1); + edge1.normalize(); + var normal1 = Vec2.neo(edge1.y, -edge1.x); + var offset1 = Vec2.dot(normal1, Vec2.sub(centroidB, v1)); + var offset0 = 0.0; + var offset2 = 0.0; + var convex1 = false; + var convex2 = false; + var normal0; + var normal2; + // Is there a preceding edge? + if (hasVertex0) { + var edge0 = Vec2.sub(v1, v0); + edge0.normalize(); + normal0 = Vec2.neo(edge0.y, -edge0.x); + convex1 = Vec2.crossVec2Vec2(edge0, edge1) >= 0.0; + offset0 = Vec2.dot(normal0, centroidB) - Vec2.dot(normal0, v0); + } + // Is there a following edge? + if (hasVertex3) { + var edge2 = Vec2.sub(v3, v2); + edge2.normalize(); + normal2 = Vec2.neo(edge2.y, -edge2.x); + convex2 = Vec2.crossVec2Vec2(edge1, edge2) > 0.0; + offset2 = Vec2.dot(normal2, centroidB) - Vec2.dot(normal2, v2); + } + var front; + var normal = Vec2.zero(); + var lowerLimit = Vec2.zero(); + var upperLimit = Vec2.zero(); + // Determine front or back collision. Determine collision normal limits. + if (hasVertex0 && hasVertex3) { + if (convex1 && convex2) { + front = offset0 >= 0.0 || offset1 >= 0.0 || offset2 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal0); + upperLimit.setVec2(normal2); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setMul(-1, normal1); + } + } + else if (convex1) { + front = offset0 >= 0.0 || (offset1 >= 0.0 && offset2 >= 0.0); + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal0); + upperLimit.setVec2(normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal2); + upperLimit.setMul(-1, normal1); + } + } + else if (convex2) { + front = offset2 >= 0.0 || (offset0 >= 0.0 && offset1 >= 0.0); + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal1); + upperLimit.setVec2(normal2); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setMul(-1, normal0); + } + } + else { + front = offset0 >= 0.0 && offset1 >= 0.0 && offset2 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal1); + upperLimit.setVec2(normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal2); + upperLimit.setMul(-1, normal0); + } + } + } + else if (hasVertex0) { + if (convex1) { + front = offset0 >= 0.0 || offset1 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal0); + upperLimit.setMul(-1, normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setVec2(normal1); + upperLimit.setMul(-1, normal1); + } + } + else { + front = offset0 >= 0.0 && offset1 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal1); + upperLimit.setMul(-1, normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setVec2(normal1); + upperLimit.setMul(-1, normal0); + } + } + } + else if (hasVertex3) { + if (convex2) { + front = offset1 >= 0.0 || offset2 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setVec2(normal2); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setVec2(normal1); + } + } + else { + front = offset1 >= 0.0 && offset2 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setVec2(normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal2); + upperLimit.setVec2(normal1); + } + } + } + else { + front = offset1 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setMul(-1, normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setVec2(normal1); + upperLimit.setVec2(normal1); + } + } + // Get polygonB in frameA + polygonBA.count = polygonB.m_count; + for (var i = 0; i < polygonB.m_count; ++i) { + polygonBA.vertices[i] = Transform.mulVec2(xf, polygonB.m_vertices[i]); + polygonBA.normals[i] = Rot.mulVec2(xf.q, polygonB.m_normals[i]); + } + var radius = 2.0 * Settings.polygonRadius; + manifold.pointCount = 0; + { // ComputeEdgeSeparation + edgeAxis.type = EPAxisType.e_edgeA; + edgeAxis.index = front ? 0 : 1; + edgeAxis.separation = Infinity; + for (var i = 0; i < polygonBA.count; ++i) { + var s = Vec2.dot(normal, Vec2.sub(polygonBA.vertices[i], v1)); + if (s < edgeAxis.separation) { + edgeAxis.separation = s; + } + } + } + // If no valid normal can be found than this edge should not collide. + // @ts-ignore + if (edgeAxis.type == EPAxisType.e_unknown) { + return; + } + if (edgeAxis.separation > radius) { + return; + } + { // ComputePolygonSeparation + polygonAxis.type = EPAxisType.e_unknown; + polygonAxis.index = -1; + polygonAxis.separation = -Infinity; + var perp = Vec2.neo(-normal.y, normal.x); + for (var i = 0; i < polygonBA.count; ++i) { + var n = Vec2.neg(polygonBA.normals[i]); + var s1 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v1)); + var s2 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v2)); + var s = math.min(s1, s2); + if (s > radius) { + // No collision + polygonAxis.type = EPAxisType.e_edgeB; + polygonAxis.index = i; + polygonAxis.separation = s; + break; + } + // Adjacency + if (Vec2.dot(n, perp) >= 0.0) { + if (Vec2.dot(Vec2.sub(n, upperLimit), normal) < -Settings.angularSlop) { + continue; + } + } + else { + if (Vec2.dot(Vec2.sub(n, lowerLimit), normal) < -Settings.angularSlop) { + continue; + } + } + if (s > polygonAxis.separation) { + polygonAxis.type = EPAxisType.e_edgeB; + polygonAxis.index = i; + polygonAxis.separation = s; + } + } + } + if (polygonAxis.type != EPAxisType.e_unknown && polygonAxis.separation > radius) { + return; + } + // Use hysteresis for jitter reduction. + var k_relativeTol = 0.98; + var k_absoluteTol = 0.001; + var primaryAxis; + if (polygonAxis.type == EPAxisType.e_unknown) { + primaryAxis = edgeAxis; + } + else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) { + primaryAxis = polygonAxis; + } + else { + primaryAxis = edgeAxis; + } + var ie = [new ClipVertex(), new ClipVertex()]; + if (primaryAxis.type == EPAxisType.e_edgeA) { + manifold.type = exports.ManifoldType.e_faceA; + // Search for the polygon normal that is most anti-parallel to the edge + // normal. + var bestIndex = 0; + var bestValue = Vec2.dot(normal, polygonBA.normals[0]); + for (var i = 1; i < polygonBA.count; ++i) { + var value = Vec2.dot(normal, polygonBA.normals[i]); + if (value < bestValue) { + bestValue = value; + bestIndex = i; + } + } + var i1 = bestIndex; + var i2 = i1 + 1 < polygonBA.count ? i1 + 1 : 0; + ie[0].v = polygonBA.vertices[i1]; + ie[0].id.cf.indexA = 0; + ie[0].id.cf.indexB = i1; + ie[0].id.cf.typeA = exports.ContactFeatureType.e_face; + ie[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; + ie[1].v = polygonBA.vertices[i2]; + ie[1].id.cf.indexA = 0; + ie[1].id.cf.indexB = i2; + ie[1].id.cf.typeA = exports.ContactFeatureType.e_face; + ie[1].id.cf.typeB = exports.ContactFeatureType.e_vertex; + if (front) { + rf.i1 = 0; + rf.i2 = 1; + rf.v1 = v1; + rf.v2 = v2; + rf.normal.setVec2(normal1); + } + else { + rf.i1 = 1; + rf.i2 = 0; + rf.v1 = v2; + rf.v2 = v1; + rf.normal.setMul(-1, normal1); + } + } + else { + manifold.type = exports.ManifoldType.e_faceB; + ie[0].v = v1; + ie[0].id.cf.indexA = 0; + ie[0].id.cf.indexB = primaryAxis.index; + ie[0].id.cf.typeA = exports.ContactFeatureType.e_vertex; + ie[0].id.cf.typeB = exports.ContactFeatureType.e_face; + ie[1].v = v2; + ie[1].id.cf.indexA = 0; + ie[1].id.cf.indexB = primaryAxis.index; + ie[1].id.cf.typeA = exports.ContactFeatureType.e_vertex; + ie[1].id.cf.typeB = exports.ContactFeatureType.e_face; + rf.i1 = primaryAxis.index; + rf.i2 = rf.i1 + 1 < polygonBA.count ? rf.i1 + 1 : 0; + rf.v1 = polygonBA.vertices[rf.i1]; + rf.v2 = polygonBA.vertices[rf.i2]; + rf.normal.setVec2(polygonBA.normals[rf.i1]); + } + rf.sideNormal1.setNum(rf.normal.y, -rf.normal.x); + rf.sideNormal2.setMul(-1, rf.sideNormal1); + rf.sideOffset1 = Vec2.dot(rf.sideNormal1, rf.v1); + rf.sideOffset2 = Vec2.dot(rf.sideNormal2, rf.v2); + // Clip incident edge against extruded edge1 side edges. + var clipPoints1 = [new ClipVertex(), new ClipVertex()]; + var clipPoints2 = [new ClipVertex(), new ClipVertex()]; + var np; + // Clip to box side 1 + np = clipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1); + if (np < Settings.maxManifoldPoints) { + return; + } + // Clip to negative box side 1 + np = clipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2); + if (np < Settings.maxManifoldPoints) { + return; + } + // Now clipPoints2 contains the clipped points. + if (primaryAxis.type == EPAxisType.e_edgeA) { + manifold.localNormal = Vec2.clone(rf.normal); + manifold.localPoint = Vec2.clone(rf.v1); + } + else { + manifold.localNormal = Vec2.clone(polygonB.m_normals[rf.i1]); + manifold.localPoint = Vec2.clone(polygonB.m_vertices[rf.i1]); + } + var pointCount = 0; + for (var i = 0; i < Settings.maxManifoldPoints; ++i) { + var separation = Vec2.dot(rf.normal, Vec2.sub(clipPoints2[i].v, rf.v1)); + if (separation <= radius) { + var cp = manifold.points[pointCount]; // ManifoldPoint + if (primaryAxis.type == EPAxisType.e_edgeA) { + cp.localPoint = Transform.mulTVec2(xf, clipPoints2[i].v); + cp.id = clipPoints2[i].id; + } + else { + cp.localPoint = clipPoints2[i].v; + cp.id.cf.typeA = clipPoints2[i].id.cf.typeB; + cp.id.cf.typeB = clipPoints2[i].id.cf.typeA; + cp.id.cf.indexA = clipPoints2[i].id.cf.indexB; + cp.id.cf.indexB = clipPoints2[i].id.cf.indexA; + } + ++pointCount; + } + } + manifold.pointCount = pointCount; +}; + +/** @deprecated Merged with main namespace */ +var internal = { + CollidePolygons: CollidePolygons, + Settings: Settings, + Sweep: Sweep, + Manifold: Manifold, + Distance: Distance, + TimeOfImpact: TimeOfImpact, + DynamicTree: DynamicTree, + stats: stats +}; + +function testbed(opts, callback) { + if (typeof opts === 'function') { + callback = opts; + opts = null; + } + (function () { + var stage = Stage$1.mount(); + var canvas = stage.dom; + stage.on(Stage$1.Mouse.START, function () { + window.focus(); + // @ts-ignore + document.activeElement && document.activeElement.blur(); + canvas.focus(); + }); + stage.MAX_ELAPSE = 1000 / 30; + // @ts-ignore + var testbed = {}; + testbed.canvas = canvas; + var paused = false; + stage.on('resume', function () { + paused = false; + testbed._resume && testbed._resume(); + }); + stage.on('pause', function () { + paused = true; + testbed._pause && testbed._pause(); + }); + testbed.isPaused = function () { + return paused; + }; + testbed.togglePause = function () { + paused ? testbed.resume() : testbed.pause(); + }; + testbed.pause = function () { + // @ts-ignore + stage.pause(); + }; + testbed.resume = function () { + // @ts-ignore + stage.resume(); + testbed.focus(); + }; + testbed.focus = function () { + // @ts-ignore + document.activeElement && document.activeElement.blur(); + canvas.focus(); + }; + testbed.width = 80; + testbed.height = 60; + testbed.x = 0; + testbed.y = -10; + testbed.scaleY = -1; + testbed.ratio = 16; + testbed.hz = 60; + testbed.speed = 1; + testbed.activeKeys = {}; + testbed.background = '#222222'; + testbed.findOne = function () { + // todo: implement + return null; + }; + testbed.findAll = function () { + // todo: implement + return []; + }; + var statusText = ''; + var statusMap = {}; + function statusSet(name, value) { + if (typeof value !== 'function' && typeof value !== 'object') { + statusMap[name] = value; + } + } + function statusMerge(obj) { + // tslint:disable-next-line:no-for-in + for (var key in obj) { + statusSet(key, obj[key]); + } + } + testbed.status = function (a, b) { + if (typeof b !== 'undefined') { + statusSet(a, b); + } + else if (a && typeof a === 'object') { + statusMerge(a); + } + else if (typeof a === 'string') { + statusText = a; + } + testbed._status && testbed._status(statusText, statusMap); + }; + testbed.info = function (text) { + testbed._info && testbed._info(text); + }; + var lastDrawHash = ""; + var drawHash = ""; + (function () { + var drawingTexture = new Stage$1.Texture(); + stage.append(Stage$1.image(drawingTexture)); + var buffer = []; + stage.tick(function () { + buffer.length = 0; + }, true); + drawingTexture.draw = function (ctx) { + ctx.save(); + ctx.transform(1, 0, 0, testbed.scaleY, -testbed.x, -testbed.y); + ctx.lineWidth = 2 / testbed.ratio; + ctx.lineCap = 'round'; + for (var drawing = buffer.shift(); drawing; drawing = buffer.shift()) { + drawing(ctx, testbed.ratio); + } + ctx.restore(); + }; + testbed.drawPoint = function (p, r, color) { + buffer.push(function (ctx, ratio) { + ctx.beginPath(); + ctx.arc(p.x, p.y, 5 / ratio, 0, 2 * Math.PI); + ctx.strokeStyle = color; + ctx.stroke(); + }); + drawHash += "point" + p.x + ',' + p.y + ',' + r + ',' + color; + }; + testbed.drawCircle = function (p, r, color) { + buffer.push(function (ctx) { + ctx.beginPath(); + ctx.arc(p.x, p.y, r, 0, 2 * Math.PI); + ctx.strokeStyle = color; + ctx.stroke(); + }); + drawHash += "circle" + p.x + ',' + p.y + ',' + r + ',' + color; + }; + testbed.drawSegment = function (a, b, color) { + buffer.push(function (ctx) { + ctx.beginPath(); + ctx.moveTo(a.x, a.y); + ctx.lineTo(b.x, b.y); + ctx.strokeStyle = color; + ctx.stroke(); + }); + drawHash += "segment" + a.x + ',' + a.y + ',' + b.x + ',' + b.y + ',' + color; + }; + testbed.drawPolygon = function (points, color) { + if (!points || !points.length) { + return; + } + buffer.push(function (ctx) { + ctx.beginPath(); + ctx.moveTo(points[0].x, points[0].y); + for (var i = 1; i < points.length; i++) { + ctx.lineTo(points[i].x, points[i].y); + } + ctx.strokeStyle = color; + ctx.closePath(); + ctx.stroke(); + }); + drawHash += "segment"; + for (var i = 1; i < points.length; i++) { + drawHash += points[i].x + ',' + points[i].y + ','; + } + drawHash += color; + }; + testbed.drawAABB = function (aabb, color) { + buffer.push(function (ctx) { + ctx.beginPath(); + ctx.moveTo(aabb.lowerBound.x, aabb.lowerBound.y); + ctx.lineTo(aabb.upperBound.x, aabb.lowerBound.y); + ctx.lineTo(aabb.upperBound.x, aabb.upperBound.y); + ctx.lineTo(aabb.lowerBound.x, aabb.upperBound.y); + ctx.strokeStyle = color; + ctx.closePath(); + ctx.stroke(); + }); + drawHash += "aabb"; + drawHash += aabb.lowerBound.x + ',' + aabb.lowerBound.y + ','; + drawHash += aabb.upperBound.x + ',' + aabb.upperBound.y + ','; + drawHash += color; + }; + testbed.color = function (r, g, b) { + r = r * 256 | 0; + g = g * 256 | 0; + b = b * 256 | 0; + return 'rgb(' + r + ', ' + g + ', ' + b + ')'; + }; + })(); + var world = callback(testbed); + var viewer = new Viewer(world, testbed); + var lastX = 0; + var lastY = 0; + stage.tick(function (dt, t) { + // update camera position + if (lastX !== testbed.x || lastY !== testbed.y) { + viewer.offset(-testbed.x, -testbed.y); + lastX = testbed.x; + lastY = testbed.y; + } + }); + viewer.tick(function (dt, t) { + // call testbed step, if provided + if (typeof testbed.step === 'function') { + testbed.step(dt, t); + } + if (targetBody) { + testbed.drawSegment(targetBody.getPosition(), mouseMove, 'rgba(255,255,255,0.2)'); + } + if (lastDrawHash !== drawHash) { + lastDrawHash = drawHash; + stage.touch(); + } + drawHash = ""; + return true; + }); + // stage.empty(); + stage.background(testbed.background); + stage.viewbox(testbed.width, testbed.height); + stage.pin('alignX', -0.5); + stage.pin('alignY', -0.5); + stage.prepend(viewer); + function findBody(point) { + var body; + var aabb = new AABB(point, point); + world.queryAABB(aabb, function (fixture) { + if (body) { + return; + } + if (!fixture.getBody().isDynamic() || !fixture.testPoint(point)) { + return; + } + body = fixture.getBody(); + return true; + }); + return body; + } + var mouseGround = world.createBody(); + var mouseJoint; + var targetBody; + var mouseMove = { x: 0, y: 0 }; + viewer.attr('spy', true).on(Stage$1.Mouse.START, function (point) { + point = { x: point.x, y: testbed.scaleY * point.y }; + if (targetBody) { + return; + } + var body = findBody(point); + if (!body) { + return; + } + if (testbed.mouseForce) { + targetBody = body; + } + else { + mouseJoint = new MouseJoint({ maxForce: 1000 }, mouseGround, body, Vec2.clone(point)); + world.createJoint(mouseJoint); + } + }).on(Stage$1.Mouse.MOVE, function (point) { + point = { x: point.x, y: testbed.scaleY * point.y }; + if (mouseJoint) { + mouseJoint.setTarget(point); + } + mouseMove.x = point.x; + mouseMove.y = point.y; + }).on(Stage$1.Mouse.END, function (point) { + point = { x: point.x, y: testbed.scaleY * point.y }; + if (mouseJoint) { + world.destroyJoint(mouseJoint); + mouseJoint = null; + } + if (targetBody) { + var force = Vec2.sub(point, targetBody.getPosition()); + targetBody.applyForceToCenter(force.mul(testbed.mouseForce), true); + targetBody = null; + } + }).on(Stage$1.Mouse.CANCEL, function (point) { + point = { x: point.x, y: testbed.scaleY * point.y }; + if (mouseJoint) { + world.destroyJoint(mouseJoint); + mouseJoint = null; + } + if (targetBody) { + targetBody = null; + } + }); + window.addEventListener("keydown", function (e) { + switch (e.keyCode) { + case 'P'.charCodeAt(0): + testbed.togglePause(); + break; + } + }, false); + var downKeys = {}; + window.addEventListener("keydown", function (e) { + var keyCode = e.keyCode; + downKeys[keyCode] = true; + updateActiveKeys(keyCode, true); + testbed.keydown && testbed.keydown(keyCode, String.fromCharCode(keyCode)); + }); + window.addEventListener("keyup", function (e) { + var keyCode = e.keyCode; + downKeys[keyCode] = false; + updateActiveKeys(keyCode, false); + testbed.keyup && testbed.keyup(keyCode, String.fromCharCode(keyCode)); + }); + var activeKeys = testbed.activeKeys; + function updateActiveKeys(keyCode, down) { + var char = String.fromCharCode(keyCode); + if (/\w/.test(char)) { + activeKeys[char] = down; + } + activeKeys.right = downKeys[39] || activeKeys['D']; + activeKeys.left = downKeys[37] || activeKeys['A']; + activeKeys.up = downKeys[38] || activeKeys['W']; + activeKeys.down = downKeys[40] || activeKeys['S']; + activeKeys.fire = downKeys[32] || downKeys[13]; + } + })(); +} +Viewer._super = Stage$1.Node; +Viewer.prototype = Object.create(Viewer._super.prototype); +function Viewer(world, opts) { + var _this = this; + Viewer._super.call(this); + this.label('Planck'); + opts = opts || {}; + this._options = {}; + this._options.speed = opts.speed || 1; + this._options.hz = opts.hz || 60; + if (Math.abs(this._options.hz) < 1) { + this._options.hz = 1 / this._options.hz; + } + this._options.scaleY = opts.scaleY || -1; + this._options.ratio = opts.ratio || 16; + this._options.lineWidth = 2 / this._options.ratio; + this._world = world; + var timeStep = 1 / this._options.hz; + var elapsedTime = 0; + this.tick(function (dt) { + dt = dt * 0.001 * _this._options.speed; + elapsedTime += dt; + while (elapsedTime > timeStep) { + world.step(timeStep); + elapsedTime -= timeStep; + } + _this.renderWorld(); + return true; + }, true); + world.on('remove-fixture', function (obj) { + obj.ui && obj.ui.remove(); + }); + world.on('remove-joint', function (obj) { + obj.ui && obj.ui.remove(); + }); +} +Viewer.prototype.renderWorld = function () { + var world = this._world; + var options = this._options; + var viewer = this; + for (var b = world.getBodyList(); b; b = b.getNext()) { + for (var f = b.getFixtureList(); f; f = f.getNext()) { + if (!f.ui) { + if (f.render && f.render.stroke) { + options.strokeStyle = f.render.stroke; + } + else if (b.render && b.render.stroke) { + options.strokeStyle = b.render.stroke; + } + else if (b.isDynamic()) { + options.strokeStyle = 'rgba(255,255,255,0.9)'; + } + else if (b.isKinematic()) { + options.strokeStyle = 'rgba(255,255,255,0.7)'; + } + else if (b.isStatic()) { + options.strokeStyle = 'rgba(255,255,255,0.5)'; + } + if (f.render && f.render.fill) { + options.fillStyle = f.render.fill; + } + else if (b.render && b.render.fill) { + options.fillStyle = b.render.fill; + } + else { + options.fillStyle = ''; + } + var type = f.getType(); + var shape = f.getShape(); + if (type == 'circle') { + f.ui = viewer.drawCircle(shape, options); + } + if (type == 'edge') { + f.ui = viewer.drawEdge(shape, options); + } + if (type == 'polygon') { + f.ui = viewer.drawPolygon(shape, options); + } + if (type == 'chain') { + f.ui = viewer.drawChain(shape, options); + } + if (f.ui) { + f.ui.appendTo(viewer); + } + } + if (f.ui) { + var p = b.getPosition(); + var r = b.getAngle(); + if (f.ui.__lastX !== p.x || f.ui.__lastY !== p.y || f.ui.__lastR !== r) { + f.ui.__lastX = p.x; + f.ui.__lastY = p.y; + f.ui.__lastR = r; + f.ui.offset(p.x, options.scaleY * p.y); + f.ui.rotate(options.scaleY * r); + } + } + } + } + for (var j = world.getJointList(); j; j = j.getNext()) { + var type = j.getType(); + var a = j.getAnchorA(); + var b = j.getAnchorB(); + if (!j.ui) { + options.strokeStyle = 'rgba(255,255,255,0.2)'; + j.ui = viewer.drawJoint(j, options); + j.ui.pin('handle', 0.5); + if (j.ui) { + j.ui.appendTo(viewer); + } + } + if (j.ui) { + var cx = (a.x + b.x) * 0.5; + var cy = options.scaleY * (a.y + b.y) * 0.5; + var dx = a.x - b.x; + var dy = options.scaleY * (a.y - b.y); + var d = Math.sqrt(dx * dx + dy * dy); + j.ui.width(d); + j.ui.rotate(Math.atan2(dy, dx)); + j.ui.offset(cx, cy); + } + } +}; +Viewer.prototype.drawJoint = function (joint, options) { + var lw = options.lineWidth; + var ratio = options.ratio; + var length = 10; + var texture = Stage$1.canvas(function (ctx) { + this.size(length + 2 * lw, 2 * lw, ratio); + ctx.scale(ratio, ratio); + ctx.beginPath(); + ctx.moveTo(lw, lw); + ctx.lineTo(lw + length, lw); + ctx.lineCap = 'round'; + ctx.lineWidth = options.lineWidth; + ctx.strokeStyle = options.strokeStyle; + ctx.stroke(); + }); + var image = Stage$1.image(texture).stretch(); + return image; +}; +Viewer.prototype.drawCircle = function (shape, options) { + var lw = options.lineWidth; + var ratio = options.ratio; + var r = shape.m_radius; + var cx = r + lw; + var cy = r + lw; + var w = r * 2 + lw * 2; + var h = r * 2 + lw * 2; + var texture = Stage$1.canvas(function (ctx) { + this.size(w, h, ratio); + ctx.scale(ratio, ratio); + ctx.arc(cx, cy, r, 0, 2 * Math.PI); + if (options.fillStyle) { + ctx.fillStyle = options.fillStyle; + ctx.fill(); + } + ctx.lineTo(cx, cy); + ctx.lineWidth = options.lineWidth; + ctx.strokeStyle = options.strokeStyle; + ctx.stroke(); + }); + var image = Stage$1.image(texture) + .offset(shape.m_p.x - cx, options.scaleY * shape.m_p.y - cy); + var node = Stage$1.create().append(image); + return node; +}; +Viewer.prototype.drawEdge = function (edge, options) { + var lw = options.lineWidth; + var ratio = options.ratio; + var v1 = edge.m_vertex1; + var v2 = edge.m_vertex2; + var dx = v2.x - v1.x; + var dy = v2.y - v1.y; + var length = Math.sqrt(dx * dx + dy * dy); + var texture = Stage$1.canvas(function (ctx) { + this.size(length + 2 * lw, 2 * lw, ratio); + ctx.scale(ratio, ratio); + ctx.beginPath(); + ctx.moveTo(lw, lw); + ctx.lineTo(lw + length, lw); + ctx.lineCap = 'round'; + ctx.lineWidth = options.lineWidth; + ctx.strokeStyle = options.strokeStyle; + ctx.stroke(); + }); + var minX = Math.min(v1.x, v2.x); + var minY = Math.min(options.scaleY * v1.y, options.scaleY * v2.y); + var image = Stage$1.image(texture); + image.rotate(options.scaleY * Math.atan2(dy, dx)); + image.offset(minX - lw, minY - lw); + var node = Stage$1.create().append(image); + return node; +}; +Viewer.prototype.drawPolygon = function (shape, options) { + var lw = options.lineWidth; + var ratio = options.ratio; + var vertices = shape.m_vertices; + if (!vertices.length) { + return; + } + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + for (var i = 0; i < vertices.length; ++i) { + var v = vertices[i]; + minX = Math.min(minX, v.x); + maxX = Math.max(maxX, v.x); + minY = Math.min(minY, options.scaleY * v.y); + maxY = Math.max(maxY, options.scaleY * v.y); + } + var width = maxX - minX; + var height = maxY - minY; + var texture = Stage$1.canvas(function (ctx) { + this.size(width + 2 * lw, height + 2 * lw, ratio); + ctx.scale(ratio, ratio); + ctx.beginPath(); + for (var i = 0; i < vertices.length; ++i) { + var v = vertices[i]; + var x = v.x - minX + lw; + var y = options.scaleY * v.y - minY + lw; + if (i == 0) + ctx.moveTo(x, y); + else + ctx.lineTo(x, y); + } + if (vertices.length > 2) { + ctx.closePath(); + } + if (options.fillStyle) { + ctx.fillStyle = options.fillStyle; + ctx.fill(); + ctx.closePath(); + } + ctx.lineCap = 'round'; + ctx.lineWidth = options.lineWidth; + ctx.strokeStyle = options.strokeStyle; + ctx.stroke(); + }); + var image = Stage$1.image(texture); + image.offset(minX - lw, minY - lw); + var node = Stage$1.create().append(image); + return node; +}; +Viewer.prototype.drawChain = function (shape, options) { + var lw = options.lineWidth; + var ratio = options.ratio; + var vertices = shape.m_vertices; + if (!vertices.length) { + return; + } + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + for (var i = 0; i < vertices.length; ++i) { + var v = vertices[i]; + minX = Math.min(minX, v.x); + maxX = Math.max(maxX, v.x); + minY = Math.min(minY, options.scaleY * v.y); + maxY = Math.max(maxY, options.scaleY * v.y); + } + var width = maxX - minX; + var height = maxY - minY; + var texture = Stage$1.canvas(function (ctx) { + this.size(width + 2 * lw, height + 2 * lw, ratio); + ctx.scale(ratio, ratio); + ctx.beginPath(); + for (var i = 0; i < vertices.length; ++i) { + var v = vertices[i]; + var x = v.x - minX + lw; + var y = options.scaleY * v.y - minY + lw; + if (i == 0) + ctx.moveTo(x, y); + else + ctx.lineTo(x, y); + } + // TODO: if loop + if (vertices.length > 2) ; + if (options.fillStyle) { + ctx.fillStyle = options.fillStyle; + ctx.fill(); + ctx.closePath(); + } + ctx.lineCap = 'round'; + ctx.lineWidth = options.lineWidth; + ctx.strokeStyle = options.strokeStyle; + ctx.stroke(); + }); + var image = Stage$1.image(texture); + image.offset(minX - lw, minY - lw); + var node = Stage$1.create().append(image); + return node; +}; + +var planck = /*#__PURE__*/Object.freeze({ + __proto__: null, + testbed: testbed, + Serializer: Serializer, + math: math, + Vec2: Vec2, + Vec3: Vec3, + Mat22: Mat22, + Mat33: Mat33, + Transform: Transform, + Rot: Rot, + AABB: AABB, + Shape: Shape, + FixtureProxy: FixtureProxy, + Fixture: Fixture, + MassData: MassData, + Body: Body, + ContactEdge: ContactEdge, + mixFriction: mixFriction, + mixRestitution: mixRestitution, + VelocityConstraintPoint: VelocityConstraintPoint, + Contact: Contact, + JointEdge: JointEdge, + Joint: Joint, + World: World, + CircleShape: CircleShape, + Circle: Circle, + EdgeShape: EdgeShape, + Edge: Edge, + PolygonShape: PolygonShape, + Polygon: Polygon, + ChainShape: ChainShape, + Chain: Chain, + BoxShape: BoxShape, + Box: Box, + CollideCircles: CollideCircles, + CollideEdgeCircle: CollideEdgeCircle, + CollidePolygons: CollidePolygons, + CollidePolygonCircle: CollidePolygonCircle, + CollideEdgePolygon: CollideEdgePolygon, + DistanceJoint: DistanceJoint, + FrictionJoint: FrictionJoint, + GearJoint: GearJoint, + MotorJoint: MotorJoint, + MouseJoint: MouseJoint, + PrismaticJoint: PrismaticJoint, + PulleyJoint: PulleyJoint, + RevoluteJoint: RevoluteJoint, + RopeJoint: RopeJoint, + WeldJoint: WeldJoint, + WheelJoint: WheelJoint, + Settings: Settings, + Sweep: Sweep, + get ManifoldType () { return exports.ManifoldType; }, + get ContactFeatureType () { return exports.ContactFeatureType; }, + get PointState () { return exports.PointState; }, + ClipVertex: ClipVertex, + Manifold: Manifold, + ManifoldPoint: ManifoldPoint, + ContactID: ContactID, + ContactFeature: ContactFeature, + WorldManifold: WorldManifold, + getPointStates: getPointStates, + clipSegmentToLine: clipSegmentToLine, + DistanceInput: DistanceInput, + DistanceOutput: DistanceOutput, + SimplexCache: SimplexCache, + Distance: Distance, + DistanceProxy: DistanceProxy, + testOverlap: testOverlap, + TOIInput: TOIInput, + get TOIOutputState () { return exports.TOIOutputState; }, + TOIOutput: TOIOutput, + TimeOfImpact: TimeOfImpact, + TreeNode: TreeNode, + DynamicTree: DynamicTree, + stats: stats, + internal: internal +}); + +exports.AABB = AABB; +exports.Body = Body; +exports.Box = Box; +exports.BoxShape = BoxShape; +exports.Chain = Chain; +exports.ChainShape = ChainShape; +exports.Circle = Circle; +exports.CircleShape = CircleShape; +exports.ClipVertex = ClipVertex; +exports.CollideCircles = CollideCircles; +exports.CollideEdgeCircle = CollideEdgeCircle; +exports.CollideEdgePolygon = CollideEdgePolygon; +exports.CollidePolygonCircle = CollidePolygonCircle; +exports.CollidePolygons = CollidePolygons; +exports.Contact = Contact; +exports.ContactEdge = ContactEdge; +exports.ContactFeature = ContactFeature; +exports.ContactID = ContactID; +exports.Distance = Distance; +exports.DistanceInput = DistanceInput; +exports.DistanceJoint = DistanceJoint; +exports.DistanceOutput = DistanceOutput; +exports.DistanceProxy = DistanceProxy; +exports.DynamicTree = DynamicTree; +exports.Edge = Edge; +exports.EdgeShape = EdgeShape; +exports.Fixture = Fixture; +exports.FixtureProxy = FixtureProxy; +exports.FrictionJoint = FrictionJoint; +exports.GearJoint = GearJoint; +exports.Joint = Joint; +exports.JointEdge = JointEdge; +exports.Manifold = Manifold; +exports.ManifoldPoint = ManifoldPoint; +exports.MassData = MassData; +exports.Mat22 = Mat22; +exports.Mat33 = Mat33; +exports.MotorJoint = MotorJoint; +exports.MouseJoint = MouseJoint; +exports.Polygon = Polygon; +exports.PolygonShape = PolygonShape; +exports.PrismaticJoint = PrismaticJoint; +exports.PulleyJoint = PulleyJoint; +exports.RevoluteJoint = RevoluteJoint; +exports.RopeJoint = RopeJoint; +exports.Rot = Rot; +exports.Serializer = Serializer; +exports.Settings = Settings; +exports.Shape = Shape; +exports.SimplexCache = SimplexCache; +exports.Sweep = Sweep; +exports.TOIInput = TOIInput; +exports.TOIOutput = TOIOutput; +exports.TimeOfImpact = TimeOfImpact; +exports.Transform = Transform; +exports.TreeNode = TreeNode; +exports.Vec2 = Vec2; +exports.Vec3 = Vec3; +exports.VelocityConstraintPoint = VelocityConstraintPoint; +exports.WeldJoint = WeldJoint; +exports.WheelJoint = WheelJoint; +exports.World = World; +exports.WorldManifold = WorldManifold; +exports.clipSegmentToLine = clipSegmentToLine; +exports["default"] = planck; +exports.getPointStates = getPointStates; +exports.internal = internal; +exports.math = math; +exports.mixFriction = mixFriction; +exports.mixRestitution = mixRestitution; +exports.stats = stats; +exports.testOverlap = testOverlap; +exports.testbed = testbed; +//# sourceMappingURL=planck-with-testbed.cjs.map diff --git a/dist/planck-with-testbed.cjs.map b/dist/planck-with-testbed.cjs.map new file mode 100644 index 00000000..c7d17496 --- /dev/null +++ b/dist/planck-with-testbed.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"planck-with-testbed.cjs","sources":["../node_modules/stage-js/dist/stage.js","../node_modules/tslib/tslib.es6.js","../src/util/options.ts","../src/common/Math.ts","../src/common/Vec2.ts","../src/collision/AABB.ts","../src/Settings.ts","../src/util/Pool.ts","../src/collision/DynamicTree.ts","../src/collision/BroadPhase.ts","../src/common/Rot.ts","../src/common/Transform.ts","../src/common/Sweep.ts","../src/dynamics/Velocity.ts","../src/dynamics/Position.ts","../src/collision/Shape.ts","../src/dynamics/Fixture.ts","../src/dynamics/Body.ts","../src/dynamics/Joint.ts","../src/util/stats.ts","../src/util/Timer.ts","../src/collision/Distance.ts","../src/collision/TimeOfImpact.ts","../src/dynamics/Solver.ts","../src/common/Mat22.ts","../src/collision/Manifold.ts","../src/dynamics/Contact.ts","../src/dynamics/World.ts","../src/common/Vec3.ts","../src/collision/shape/EdgeShape.ts","../src/collision/shape/ChainShape.ts","../src/collision/shape/PolygonShape.ts","../src/collision/shape/BoxShape.ts","../src/collision/shape/CircleShape.ts","../src/dynamics/joint/DistanceJoint.ts","../src/dynamics/joint/FrictionJoint.ts","../src/common/Mat33.ts","../src/dynamics/joint/RevoluteJoint.ts","../src/dynamics/joint/PrismaticJoint.ts","../src/dynamics/joint/GearJoint.ts","../src/dynamics/joint/MotorJoint.ts","../src/dynamics/joint/MouseJoint.ts","../src/dynamics/joint/PulleyJoint.ts","../src/dynamics/joint/RopeJoint.ts","../src/dynamics/joint/WeldJoint.ts","../src/dynamics/joint/WheelJoint.ts","../src/serializer/index.ts","../src/collision/shape/CollideCircle.ts","../src/collision/shape/CollideEdgeCircle.ts","../src/collision/shape/CollidePolygon.ts","../src/collision/shape/CollideCirclePolygon.ts","../src/collision/shape/CollideEdgePolygon.ts","../src/index.ts","../testbed/index.ts"],"sourcesContent":["var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nconst stats = {\n create: 0,\n tick: 0,\n node: 0,\n draw: 0,\n fps: 0\n};\nclass Matrix {\n constructor(a, b, c, d, e, f) {\n this.reset(a, b, c, d, e, f);\n }\n toString() {\n return \"[\" + this.a + \", \" + this.b + \", \" + this.c + \", \" + this.d + \", \" + this.e + \", \" + this.f + \"]\";\n }\n clone() {\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n }\n reset(a, b, c, d, e, f) {\n this._dirty = true;\n if (typeof a === \"object\") {\n this.a = a.a, this.d = a.d;\n this.b = a.b, this.c = a.c;\n this.e = a.e, this.f = a.f;\n } else {\n this.a = a || 1, this.d = d || 1;\n this.b = b || 0, this.c = c || 0;\n this.e = e || 0, this.f = f || 0;\n }\n return this;\n }\n identity() {\n this._dirty = true;\n this.a = 1;\n this.b = 0;\n this.c = 0;\n this.d = 1;\n this.e = 0;\n this.f = 0;\n return this;\n }\n rotate(angle) {\n if (!angle) {\n return this;\n }\n this._dirty = true;\n var u = angle ? Math.cos(angle) : 1;\n var v = angle ? Math.sin(angle) : 0;\n var a = u * this.a - v * this.b;\n var b = u * this.b + v * this.a;\n var c = u * this.c - v * this.d;\n var d = u * this.d + v * this.c;\n var e = u * this.e - v * this.f;\n var f = u * this.f + v * this.e;\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n return this;\n }\n translate(x, y) {\n if (!x && !y) {\n return this;\n }\n this._dirty = true;\n this.e += x;\n this.f += y;\n return this;\n }\n scale(x, y) {\n if (!(x - 1) && !(y - 1)) {\n return this;\n }\n this._dirty = true;\n this.a *= x;\n this.b *= y;\n this.c *= x;\n this.d *= y;\n this.e *= x;\n this.f *= y;\n return this;\n }\n skew(x, y) {\n if (!x && !y) {\n return this;\n }\n this._dirty = true;\n var a = this.a + this.b * x;\n var b = this.b + this.a * y;\n var c = this.c + this.d * x;\n var d = this.d + this.c * y;\n var e = this.e + this.f * x;\n var f = this.f + this.e * y;\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n return this;\n }\n concat(m) {\n this._dirty = true;\n var n = this;\n var a = n.a * m.a + n.b * m.c;\n var b = n.b * m.d + n.a * m.b;\n var c = n.c * m.a + n.d * m.c;\n var d = n.d * m.d + n.c * m.b;\n var e = n.e * m.a + m.e + n.f * m.c;\n var f = n.f * m.d + m.f + n.e * m.b;\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n return this;\n }\n inverse() {\n if (this._dirty) {\n this._dirty = false;\n this.inverted = this.inverted || new Matrix();\n var z = this.a * this.d - this.b * this.c;\n this.inverted.a = this.d / z;\n this.inverted.b = -this.b / z;\n this.inverted.c = -this.c / z;\n this.inverted.d = this.a / z;\n this.inverted.e = (this.c * this.f - this.e * this.d) / z;\n this.inverted.f = (this.e * this.b - this.a * this.f) / z;\n }\n return this.inverted;\n }\n map(p, q) {\n q = q || {};\n q.x = this.a * p.x + this.c * p.y + this.e;\n q.y = this.b * p.x + this.d * p.y + this.f;\n return q;\n }\n mapX(x, y) {\n if (typeof x === \"object\")\n y = x.y, x = x.x;\n return this.a * x + this.c * y + this.e;\n }\n mapY(x, y) {\n if (typeof x === \"object\")\n y = x.y, x = x.x;\n return this.b * x + this.d * y + this.f;\n }\n}\nvar iid$1 = 0;\nfunction Pin(owner) {\n this._owner = owner;\n this._parent = null;\n this._relativeMatrix = new Matrix();\n this._absoluteMatrix = new Matrix();\n this.reset();\n}\nPin.prototype.reset = function() {\n this._textureAlpha = 1;\n this._alpha = 1;\n this._width = 0;\n this._height = 0;\n this._scaleX = 1;\n this._scaleY = 1;\n this._skewX = 0;\n this._skewY = 0;\n this._rotation = 0;\n this._pivoted = false;\n this._pivotX = null;\n this._pivotY = null;\n this._handled = false;\n this._handleX = 0;\n this._handleY = 0;\n this._aligned = false;\n this._alignX = 0;\n this._alignY = 0;\n this._offsetX = 0;\n this._offsetY = 0;\n this._boxX = 0;\n this._boxY = 0;\n this._boxWidth = this._width;\n this._boxHeight = this._height;\n this._ts_translate = ++iid$1;\n this._ts_transform = ++iid$1;\n this._ts_matrix = ++iid$1;\n};\nPin.prototype._update = function() {\n this._parent = this._owner._parent && this._owner._parent._pin;\n if (this._handled && this._mo_handle != this._ts_transform) {\n this._mo_handle = this._ts_transform;\n this._ts_translate = ++iid$1;\n }\n if (this._aligned && this._parent && this._mo_align != this._parent._ts_transform) {\n this._mo_align = this._parent._ts_transform;\n this._ts_translate = ++iid$1;\n }\n return this;\n};\nPin.prototype.toString = function() {\n return this._owner + \" (\" + (this._parent ? this._parent._owner : null) + \")\";\n};\nPin.prototype.absoluteMatrix = function() {\n this._update();\n var ts = Math.max(\n this._ts_transform,\n this._ts_translate,\n this._parent ? this._parent._ts_matrix : 0\n );\n if (this._mo_abs == ts) {\n return this._absoluteMatrix;\n }\n this._mo_abs = ts;\n var abs2 = this._absoluteMatrix;\n abs2.reset(this.relativeMatrix());\n this._parent && abs2.concat(this._parent._absoluteMatrix);\n this._ts_matrix = ++iid$1;\n return abs2;\n};\nPin.prototype.relativeMatrix = function() {\n this._update();\n var ts = Math.max(\n this._ts_transform,\n this._ts_translate,\n this._parent ? this._parent._ts_transform : 0\n );\n if (this._mo_rel == ts) {\n return this._relativeMatrix;\n }\n this._mo_rel = ts;\n var rel2 = this._relativeMatrix;\n rel2.identity();\n if (this._pivoted) {\n rel2.translate(-this._pivotX * this._width, -this._pivotY * this._height);\n }\n rel2.scale(this._scaleX, this._scaleY);\n rel2.skew(this._skewX, this._skewY);\n rel2.rotate(this._rotation);\n if (this._pivoted) {\n rel2.translate(this._pivotX * this._width, this._pivotY * this._height);\n }\n if (this._pivoted) {\n this._boxX = 0;\n this._boxY = 0;\n this._boxWidth = this._width;\n this._boxHeight = this._height;\n } else {\n var p, q;\n if (rel2.a > 0 && rel2.c > 0 || rel2.a < 0 && rel2.c < 0) {\n p = 0, q = rel2.a * this._width + rel2.c * this._height;\n } else {\n p = rel2.a * this._width, q = rel2.c * this._height;\n }\n if (p > q) {\n this._boxX = q;\n this._boxWidth = p - q;\n } else {\n this._boxX = p;\n this._boxWidth = q - p;\n }\n if (rel2.b > 0 && rel2.d > 0 || rel2.b < 0 && rel2.d < 0) {\n p = 0, q = rel2.b * this._width + rel2.d * this._height;\n } else {\n p = rel2.b * this._width, q = rel2.d * this._height;\n }\n if (p > q) {\n this._boxY = q;\n this._boxHeight = p - q;\n } else {\n this._boxY = p;\n this._boxHeight = q - p;\n }\n }\n this._x = this._offsetX;\n this._y = this._offsetY;\n this._x -= this._boxX + this._handleX * this._boxWidth;\n this._y -= this._boxY + this._handleY * this._boxHeight;\n if (this._aligned && this._parent) {\n this._parent.relativeMatrix();\n this._x += this._alignX * this._parent._width;\n this._y += this._alignY * this._parent._height;\n }\n rel2.translate(this._x, this._y);\n return this._relativeMatrix;\n};\nPin.prototype.get = function(key) {\n if (typeof getters[key] === \"function\") {\n return getters[key](this);\n }\n};\nPin.prototype.set = function(a, b) {\n if (typeof a === \"string\") {\n if (typeof setters[a] === \"function\" && typeof b !== \"undefined\") {\n setters[a](this, b);\n }\n } else if (typeof a === \"object\") {\n for (b in a) {\n if (typeof setters[b] === \"function\" && typeof a[b] !== \"undefined\") {\n setters[b](this, a[b], a);\n }\n }\n }\n if (this._owner) {\n this._owner._ts_pin = ++iid$1;\n this._owner.touch();\n }\n return this;\n};\nvar getters = {\n alpha: function(pin) {\n return pin._alpha;\n },\n textureAlpha: function(pin) {\n return pin._textureAlpha;\n },\n width: function(pin) {\n return pin._width;\n },\n height: function(pin) {\n return pin._height;\n },\n boxWidth: function(pin) {\n return pin._boxWidth;\n },\n boxHeight: function(pin) {\n return pin._boxHeight;\n },\n // scale : function(pin) {\n // },\n scaleX: function(pin) {\n return pin._scaleX;\n },\n scaleY: function(pin) {\n return pin._scaleY;\n },\n // skew : function(pin) {\n // },\n skewX: function(pin) {\n return pin._skewX;\n },\n skewY: function(pin) {\n return pin._skewY;\n },\n rotation: function(pin) {\n return pin._rotation;\n },\n // pivot : function(pin) {\n // },\n pivotX: function(pin) {\n return pin._pivotX;\n },\n pivotY: function(pin) {\n return pin._pivotY;\n },\n // offset : function(pin) {\n // },\n offsetX: function(pin) {\n return pin._offsetX;\n },\n offsetY: function(pin) {\n return pin._offsetY;\n },\n // align : function(pin) {\n // },\n alignX: function(pin) {\n return pin._alignX;\n },\n alignY: function(pin) {\n return pin._alignY;\n },\n // handle : function(pin) {\n // },\n handleX: function(pin) {\n return pin._handleX;\n },\n handleY: function(pin) {\n return pin._handleY;\n }\n};\nvar setters = {\n alpha: function(pin, value) {\n pin._alpha = value;\n },\n textureAlpha: function(pin, value) {\n pin._textureAlpha = value;\n },\n width: function(pin, value) {\n pin._width_ = value;\n pin._width = value;\n pin._ts_transform = ++iid$1;\n },\n height: function(pin, value) {\n pin._height_ = value;\n pin._height = value;\n pin._ts_transform = ++iid$1;\n },\n scale: function(pin, value) {\n pin._scaleX = value;\n pin._scaleY = value;\n pin._ts_transform = ++iid$1;\n },\n scaleX: function(pin, value) {\n pin._scaleX = value;\n pin._ts_transform = ++iid$1;\n },\n scaleY: function(pin, value) {\n pin._scaleY = value;\n pin._ts_transform = ++iid$1;\n },\n skew: function(pin, value) {\n pin._skewX = value;\n pin._skewY = value;\n pin._ts_transform = ++iid$1;\n },\n skewX: function(pin, value) {\n pin._skewX = value;\n pin._ts_transform = ++iid$1;\n },\n skewY: function(pin, value) {\n pin._skewY = value;\n pin._ts_transform = ++iid$1;\n },\n rotation: function(pin, value) {\n pin._rotation = value;\n pin._ts_transform = ++iid$1;\n },\n pivot: function(pin, value) {\n pin._pivotX = value;\n pin._pivotY = value;\n pin._pivoted = true;\n pin._ts_transform = ++iid$1;\n },\n pivotX: function(pin, value) {\n pin._pivotX = value;\n pin._pivoted = true;\n pin._ts_transform = ++iid$1;\n },\n pivotY: function(pin, value) {\n pin._pivotY = value;\n pin._pivoted = true;\n pin._ts_transform = ++iid$1;\n },\n offset: function(pin, value) {\n pin._offsetX = value;\n pin._offsetY = value;\n pin._ts_translate = ++iid$1;\n },\n offsetX: function(pin, value) {\n pin._offsetX = value;\n pin._ts_translate = ++iid$1;\n },\n offsetY: function(pin, value) {\n pin._offsetY = value;\n pin._ts_translate = ++iid$1;\n },\n align: function(pin, value) {\n this.alignX(pin, value);\n this.alignY(pin, value);\n },\n alignX: function(pin, value) {\n pin._alignX = value;\n pin._aligned = true;\n pin._ts_translate = ++iid$1;\n this.handleX(pin, value);\n },\n alignY: function(pin, value) {\n pin._alignY = value;\n pin._aligned = true;\n pin._ts_translate = ++iid$1;\n this.handleY(pin, value);\n },\n handle: function(pin, value) {\n this.handleX(pin, value);\n this.handleY(pin, value);\n },\n handleX: function(pin, value) {\n pin._handleX = value;\n pin._handled = true;\n pin._ts_translate = ++iid$1;\n },\n handleY: function(pin, value) {\n pin._handleY = value;\n pin._handled = true;\n pin._ts_translate = ++iid$1;\n },\n resizeMode: function(pin, value, all) {\n if (all) {\n if (value == \"in\") {\n value = \"in-pad\";\n } else if (value == \"out\") {\n value = \"out-crop\";\n }\n scaleTo(pin, all.resizeWidth, all.resizeHeight, value);\n }\n },\n resizeWidth: function(pin, value, all) {\n if (!all || !all.resizeMode) {\n scaleTo(pin, value, null);\n }\n },\n resizeHeight: function(pin, value, all) {\n if (!all || !all.resizeMode) {\n scaleTo(pin, null, value);\n }\n },\n scaleMode: function(pin, value, all) {\n if (all) {\n scaleTo(pin, all.scaleWidth, all.scaleHeight, value);\n }\n },\n scaleWidth: function(pin, value, all) {\n if (!all || !all.scaleMode) {\n scaleTo(pin, value, null);\n }\n },\n scaleHeight: function(pin, value, all) {\n if (!all || !all.scaleMode) {\n scaleTo(pin, null, value);\n }\n },\n matrix: function(pin, value) {\n this.scaleX(pin, value.a);\n this.skewX(pin, value.c / value.d);\n this.skewY(pin, value.b / value.a);\n this.scaleY(pin, value.d);\n this.offsetX(pin, value.e);\n this.offsetY(pin, value.f);\n this.rotation(pin, 0);\n }\n};\nPin.prototype.scaleTo = function(width, height, mode) {\n scaleTo(this, width, height, mode);\n};\nfunction scaleTo(pin, width, height, mode) {\n var w = typeof width === \"number\";\n var h = typeof height === \"number\";\n var m = typeof mode === \"string\";\n pin._ts_transform = ++iid$1;\n if (w) {\n pin._scaleX = width / pin._width_;\n pin._width = pin._width_;\n }\n if (h) {\n pin._scaleY = height / pin._height_;\n pin._height = pin._height_;\n }\n if (w && h && m) {\n if (mode == \"out\" || mode == \"out-crop\") {\n pin._scaleX = pin._scaleY = Math.max(pin._scaleX, pin._scaleY);\n } else if (mode == \"in\" || mode == \"in-pad\") {\n pin._scaleX = pin._scaleY = Math.min(pin._scaleX, pin._scaleY);\n }\n if (mode == \"out-crop\" || mode == \"in-pad\") {\n pin._width = width / pin._scaleX;\n pin._height = height / pin._scaleY;\n }\n }\n}\nPin._add_shortcuts = function(prototype) {\n prototype.size = function(w, h) {\n this.pin(\"width\", w);\n this.pin(\"height\", h);\n return this;\n };\n prototype.width = function(w) {\n if (typeof w === \"undefined\") {\n return this.pin(\"width\");\n }\n this.pin(\"width\", w);\n return this;\n };\n prototype.height = function(h) {\n if (typeof h === \"undefined\") {\n return this.pin(\"height\");\n }\n this.pin(\"height\", h);\n return this;\n };\n prototype.offset = function(a, b) {\n if (typeof a === \"object\")\n b = a.y, a = a.x;\n this.pin(\"offsetX\", a);\n this.pin(\"offsetY\", b);\n return this;\n };\n prototype.rotate = function(a) {\n this.pin(\"rotation\", a);\n return this;\n };\n prototype.skew = function(a, b) {\n if (typeof a === \"object\")\n b = a.y, a = a.x;\n else if (typeof b === \"undefined\")\n b = a;\n this.pin(\"skewX\", a);\n this.pin(\"skewY\", b);\n return this;\n };\n prototype.scale = function(a, b) {\n if (typeof a === \"object\")\n b = a.y, a = a.x;\n else if (typeof b === \"undefined\")\n b = a;\n this.pin(\"scaleX\", a);\n this.pin(\"scaleY\", b);\n return this;\n };\n prototype.alpha = function(a, ta) {\n this.pin(\"alpha\", a);\n if (typeof ta !== \"undefined\") {\n this.pin(\"textureAlpha\", ta);\n }\n return this;\n };\n};\nvar iid = 0;\nstats.create = 0;\nfunction assertType(obj) {\n if (obj && obj instanceof Node) {\n return obj;\n }\n throw \"Invalid node: \" + obj;\n}\nconst create = function() {\n return new Node();\n};\nfunction Node() {\n stats.create++;\n this._pin = new Pin(this);\n}\nNode.prototype.matrix = function(relative) {\n if (relative === true) {\n return this._pin.relativeMatrix();\n }\n return this._pin.absoluteMatrix();\n};\nNode.prototype.pin = function(a, b) {\n if (typeof a === \"object\") {\n this._pin.set(a);\n return this;\n } else if (typeof a === \"string\") {\n if (typeof b === \"undefined\") {\n return this._pin.get(a);\n } else {\n this._pin.set(a, b);\n return this;\n }\n } else if (typeof a === \"undefined\") {\n return this._pin;\n }\n};\nNode.prototype.scaleTo = function(a, b, c) {\n if (typeof a === \"object\")\n c = b, b = a.y, a = a.x;\n this._pin.scaleTo(a, b, c);\n return this;\n};\nPin._add_shortcuts(Node.prototype);\nNode.prototype._label = \"\";\nNode.prototype._visible = true;\nNode.prototype._parent = null;\nNode.prototype._next = null;\nNode.prototype._prev = null;\nNode.prototype._first = null;\nNode.prototype._last = null;\nNode.prototype._attrs = null;\nNode.prototype._flags = null;\nNode.prototype.toString = function() {\n return \"[\" + this._label + \"]\";\n};\nNode.prototype.id = function(id) {\n return this.label(id);\n};\nNode.prototype.label = function(label) {\n if (typeof label === \"undefined\") {\n return this._label;\n }\n this._label = label;\n return this;\n};\nNode.prototype.attr = function(name, value) {\n if (typeof value === \"undefined\") {\n return this._attrs !== null ? this._attrs[name] : void 0;\n }\n (this._attrs !== null ? this._attrs : this._attrs = {})[name] = value;\n return this;\n};\nNode.prototype.visible = function(visible) {\n if (typeof visible === \"undefined\") {\n return this._visible;\n }\n this._visible = visible;\n this._parent && (this._parent._ts_children = ++iid);\n this._ts_pin = ++iid;\n this.touch();\n return this;\n};\nNode.prototype.hide = function() {\n return this.visible(false);\n};\nNode.prototype.show = function() {\n return this.visible(true);\n};\nNode.prototype.parent = function() {\n return this._parent;\n};\nNode.prototype.next = function(visible) {\n var next = this._next;\n while (next && visible && !next._visible) {\n next = next._next;\n }\n return next;\n};\nNode.prototype.prev = function(visible) {\n var prev = this._prev;\n while (prev && visible && !prev._visible) {\n prev = prev._prev;\n }\n return prev;\n};\nNode.prototype.first = function(visible) {\n var next = this._first;\n while (next && visible && !next._visible) {\n next = next._next;\n }\n return next;\n};\nNode.prototype.last = function(visible) {\n var prev = this._last;\n while (prev && visible && !prev._visible) {\n prev = prev._prev;\n }\n return prev;\n};\nNode.prototype.visit = function(visitor, data) {\n var reverse = visitor.reverse;\n var visible = visitor.visible;\n if (visitor.start && visitor.start(this, data)) {\n return;\n }\n var child, next = reverse ? this.last(visible) : this.first(visible);\n while (child = next) {\n next = reverse ? child.prev(visible) : child.next(visible);\n if (child.visit(visitor, data)) {\n return true;\n }\n }\n return visitor.end && visitor.end(this, data);\n};\nNode.prototype.append = function(child, more) {\n if (Array.isArray(child))\n for (var i = 0; i < child.length; i++)\n append(this, child[i]);\n else if (typeof more !== \"undefined\")\n for (var i = 0; i < arguments.length; i++)\n append(this, arguments[i]);\n else if (typeof child !== \"undefined\")\n append(this, child);\n return this;\n};\nNode.prototype.prepend = function(child, more) {\n if (Array.isArray(child))\n for (var i = child.length - 1; i >= 0; i--)\n prepend(this, child[i]);\n else if (typeof more !== \"undefined\")\n for (var i = arguments.length - 1; i >= 0; i--)\n prepend(this, arguments[i]);\n else if (typeof child !== \"undefined\")\n prepend(this, child);\n return this;\n};\nNode.prototype.appendTo = function(parent) {\n append(parent, this);\n return this;\n};\nNode.prototype.prependTo = function(parent) {\n prepend(parent, this);\n return this;\n};\nNode.prototype.insertNext = function(sibling, more) {\n if (Array.isArray(sibling))\n for (var i = 0; i < sibling.length; i++)\n insertAfter(sibling[i], this);\n else if (typeof more !== \"undefined\")\n for (var i = 0; i < arguments.length; i++)\n insertAfter(arguments[i], this);\n else if (typeof sibling !== \"undefined\")\n insertAfter(sibling, this);\n return this;\n};\nNode.prototype.insertPrev = function(sibling, more) {\n if (Array.isArray(sibling))\n for (var i = sibling.length - 1; i >= 0; i--)\n insertBefore(sibling[i], this);\n else if (typeof more !== \"undefined\")\n for (var i = arguments.length - 1; i >= 0; i--)\n insertBefore(arguments[i], this);\n else if (typeof sibling !== \"undefined\")\n insertBefore(sibling, this);\n return this;\n};\nNode.prototype.insertAfter = function(prev) {\n insertAfter(this, prev);\n return this;\n};\nNode.prototype.insertBefore = function(next) {\n insertBefore(this, next);\n return this;\n};\nfunction append(parent, child) {\n assertType(child);\n assertType(parent);\n child.remove();\n if (parent._last) {\n parent._last._next = child;\n child._prev = parent._last;\n }\n child._parent = parent;\n parent._last = child;\n if (!parent._first) {\n parent._first = child;\n }\n child._parent._flag(child, true);\n child._ts_parent = ++iid;\n parent._ts_children = ++iid;\n parent.touch();\n}\nfunction prepend(parent, child) {\n assertType(child);\n assertType(parent);\n child.remove();\n if (parent._first) {\n parent._first._prev = child;\n child._next = parent._first;\n }\n child._parent = parent;\n parent._first = child;\n if (!parent._last) {\n parent._last = child;\n }\n child._parent._flag(child, true);\n child._ts_parent = ++iid;\n parent._ts_children = ++iid;\n parent.touch();\n}\nfunction insertBefore(self, next) {\n assertType(self);\n assertType(next);\n self.remove();\n var parent = next._parent;\n var prev = next._prev;\n next._prev = self;\n prev && (prev._next = self) || parent && (parent._first = self);\n self._parent = parent;\n self._prev = prev;\n self._next = next;\n self._parent._flag(self, true);\n self._ts_parent = ++iid;\n self.touch();\n}\nfunction insertAfter(self, prev) {\n assertType(self);\n assertType(prev);\n self.remove();\n var parent = prev._parent;\n var next = prev._next;\n prev._next = self;\n next && (next._prev = self) || parent && (parent._last = self);\n self._parent = parent;\n self._prev = prev;\n self._next = next;\n self._parent._flag(self, true);\n self._ts_parent = ++iid;\n self.touch();\n}\nNode.prototype.remove = function(child, more) {\n if (typeof child !== \"undefined\") {\n if (Array.isArray(child)) {\n for (var i = 0; i < child.length; i++)\n assertType(child[i]).remove();\n } else if (typeof more !== \"undefined\") {\n for (var i = 0; i < arguments.length; i++)\n assertType(arguments[i]).remove();\n } else {\n assertType(child).remove();\n }\n return this;\n }\n if (this._prev) {\n this._prev._next = this._next;\n }\n if (this._next) {\n this._next._prev = this._prev;\n }\n if (this._parent) {\n if (this._parent._first === this) {\n this._parent._first = this._next;\n }\n if (this._parent._last === this) {\n this._parent._last = this._prev;\n }\n this._parent._flag(this, false);\n this._parent._ts_children = ++iid;\n this._parent.touch();\n }\n this._prev = this._next = this._parent = null;\n this._ts_parent = ++iid;\n return this;\n};\nNode.prototype.empty = function() {\n var child, next = this._first;\n while (child = next) {\n next = child._next;\n child._prev = child._next = child._parent = null;\n this._flag(child, false);\n }\n this._first = this._last = null;\n this._ts_children = ++iid;\n this.touch();\n return this;\n};\nNode.prototype._ts_touch = null;\nNode.prototype.touch = function() {\n this._ts_touch = ++iid;\n this._parent && this._parent.touch();\n return this;\n};\nNode.prototype._flag = function(obj, name) {\n if (typeof name === \"undefined\") {\n return this._flags !== null && this._flags[obj] || 0;\n }\n if (typeof obj === \"string\") {\n if (name) {\n this._flags = this._flags || {};\n if (!this._flags[obj] && this._parent) {\n this._parent._flag(obj, true);\n }\n this._flags[obj] = (this._flags[obj] || 0) + 1;\n } else if (this._flags && this._flags[obj] > 0) {\n if (this._flags[obj] == 1 && this._parent) {\n this._parent._flag(obj, false);\n }\n this._flags[obj] = this._flags[obj] - 1;\n }\n }\n if (typeof obj === \"object\") {\n if (obj._flags) {\n for (var type in obj._flags) {\n if (obj._flags[type] > 0) {\n this._flag(type, name);\n }\n }\n }\n }\n return this;\n};\nNode.prototype.hitTest = function(hit) {\n var width = this._pin._width;\n var height = this._pin._height;\n return hit.x >= 0 && hit.x <= width && hit.y >= 0 && hit.y <= height;\n};\nNode.prototype._textures = null;\nNode.prototype._alpha = 1;\nNode.prototype.render = function(context) {\n if (!this._visible) {\n return;\n }\n stats.node++;\n var m = this.matrix();\n context.setTransform(m.a, m.b, m.c, m.d, m.e, m.f);\n this._alpha = this._pin._alpha * (this._parent ? this._parent._alpha : 1);\n var alpha = this._pin._textureAlpha * this._alpha;\n if (context.globalAlpha != alpha) {\n context.globalAlpha = alpha;\n }\n if (this._textures !== null) {\n for (var i = 0, n = this._textures.length; i < n; i++) {\n this._textures[i].draw(context);\n }\n }\n if (context.globalAlpha != this._alpha) {\n context.globalAlpha = this._alpha;\n }\n var child, next = this._first;\n while (child = next) {\n next = child._next;\n child.render(context);\n }\n};\nNode.prototype._tickBefore = null;\nNode.prototype._tickAfter = null;\nNode.prototype.MAX_ELAPSE = Infinity;\nNode.prototype._tick = function(elapsed, now, last) {\n if (!this._visible) {\n return;\n }\n if (elapsed > this.MAX_ELAPSE) {\n elapsed = this.MAX_ELAPSE;\n }\n var ticked = false;\n if (this._tickBefore !== null) {\n for (var i = 0; i < this._tickBefore.length; i++) {\n stats.tick++;\n var tickFn = this._tickBefore[i];\n ticked = tickFn.call(this, elapsed, now, last) === true || ticked;\n }\n }\n var child, next = this._first;\n while (child = next) {\n next = child._next;\n if (child._flag(\"_tick\")) {\n ticked = child._tick(elapsed, now, last) === true ? true : ticked;\n }\n }\n if (this._tickAfter !== null) {\n for (var i = 0; i < this._tickAfter.length; i++) {\n stats.tick++;\n var tickFn = this._tickAfter[i];\n ticked = tickFn.call(this, elapsed, now, last) === true || ticked;\n }\n }\n return ticked;\n};\nNode.prototype.tick = function(ticker, before) {\n if (typeof ticker !== \"function\") {\n return;\n }\n if (before) {\n if (this._tickBefore === null) {\n this._tickBefore = [];\n }\n this._tickBefore.push(ticker);\n } else {\n if (this._tickAfter === null) {\n this._tickAfter = [];\n }\n this._tickAfter.push(ticker);\n }\n this._flag(\"_tick\", this._tickAfter !== null && this._tickAfter.length > 0 || this._tickBefore !== null && this._tickBefore.length > 0);\n};\nNode.prototype.untick = function(ticker) {\n if (typeof ticker !== \"function\") {\n return;\n }\n var i;\n if (this._tickBefore !== null && (i = this._tickBefore.indexOf(ticker)) >= 0) {\n this._tickBefore.splice(i, 1);\n }\n if (this._tickAfter !== null && (i = this._tickAfter.indexOf(ticker)) >= 0) {\n this._tickAfter.splice(i, 1);\n }\n};\nNode.prototype.timeout = function(fn, time) {\n this.setTimeout(fn, time);\n};\nNode.prototype.setTimeout = function(fn, time) {\n function timer(t) {\n if ((time -= t) < 0) {\n this.untick(timer);\n fn.call(this);\n } else {\n return true;\n }\n }\n this.tick(timer);\n return timer;\n};\nNode.prototype.clearTimeout = function(timer) {\n this.untick(timer);\n};\nNode.prototype._listeners = null;\nNode.prototype._event_callback = function(name, on) {\n this._flag(name, on);\n};\nNode.prototype.on = function(types, listener) {\n if (!types || !types.length || typeof listener !== \"function\") {\n return this;\n }\n if (this._listeners === null) {\n this._listeners = {};\n }\n var isarray = typeof types !== \"string\" && typeof types.join === \"function\";\n if (types = (isarray ? types.join(\" \") : types).match(/\\S+/g)) {\n for (var i = 0; i < types.length; i++) {\n var type = types[i];\n this._listeners[type] = this._listeners[type] || [];\n this._listeners[type].push(listener);\n if (typeof this._event_callback === \"function\") {\n this._event_callback(type, true);\n }\n }\n }\n return this;\n};\nNode.prototype.off = function(types, listener) {\n if (!types || !types.length || typeof listener !== \"function\") {\n return this;\n }\n if (this._listeners === null) {\n return this;\n }\n var isarray = typeof types !== \"string\" && typeof types.join === \"function\";\n if (types = (isarray ? types.join(\" \") : types).match(/\\S+/g)) {\n for (var i = 0; i < types.length; i++) {\n var type = types[i], all = this._listeners[type], index;\n if (all && (index = all.indexOf(listener)) >= 0) {\n all.splice(index, 1);\n if (!all.length) {\n delete this._listeners[type];\n }\n if (typeof this._event_callback === \"function\") {\n this._event_callback(type, false);\n }\n }\n }\n }\n return this;\n};\nNode.prototype.listeners = function(type) {\n return this._listeners && this._listeners[type];\n};\nNode.prototype.publish = function(name, args) {\n var listeners = this.listeners(name);\n if (!listeners || !listeners.length) {\n return 0;\n }\n for (var l = 0; l < listeners.length; l++) {\n listeners[l].apply(this, args);\n }\n return listeners.length;\n};\nNode.prototype.trigger = function(name, args) {\n this.publish(name, args);\n return this;\n};\nvar native = Math;\nconst math = Object.create(Math);\nmath.random = function(min, max) {\n if (typeof min === \"undefined\") {\n max = 1, min = 0;\n } else if (typeof max === \"undefined\") {\n max = min, min = 0;\n }\n return min == max ? min : native.random() * (max - min) + min;\n};\nmath.wrap = function(num, min, max) {\n if (typeof min === \"undefined\") {\n max = 1, min = 0;\n } else if (typeof max === \"undefined\") {\n max = min, min = 0;\n }\n if (max > min) {\n num = (num - min) % (max - min);\n return num + (num < 0 ? max : min);\n } else {\n num = (num - max) % (min - max);\n return num + (num <= 0 ? min : max);\n }\n};\nmath.clamp = function(num, min, max) {\n if (num < min) {\n return min;\n } else if (num > max) {\n return max;\n } else {\n return num;\n }\n};\nmath.length = function(x, y) {\n return native.sqrt(x * x + y * y);\n};\nmath.rotate = math.wrap;\nmath.limit = math.clamp;\nconst isFn = function(value) {\n var str = Object.prototype.toString.call(value);\n return str === \"[object Function]\" || str === \"[object GeneratorFunction]\" || str === \"[object AsyncFunction]\";\n};\nconst isHash = function(value) {\n return Object.prototype.toString.call(value) === \"[object Object]\" && value.constructor === Object;\n};\nclass Texture {\n constructor(texture2, ratio) {\n if (typeof texture2 === \"object\") {\n this.src(texture2, ratio);\n }\n }\n pipe() {\n return new Texture(this);\n }\n /**\n * Signatures: (texture), (x, y, w, h), (w, h)\n */\n src(x, y, w, h) {\n if (typeof x === \"object\") {\n var drawable = x, ratio = y || 1;\n this._image = drawable;\n this._sx = this._dx = 0;\n this._sy = this._dy = 0;\n this._sw = this._dw = drawable.width / ratio;\n this._sh = this._dh = drawable.height / ratio;\n this.width = drawable.width / ratio;\n this.height = drawable.height / ratio;\n this.ratio = ratio;\n } else {\n if (typeof w === \"undefined\") {\n w = x, h = y;\n } else {\n this._sx = x, this._sy = y;\n }\n this._sw = this._dw = w;\n this._sh = this._dh = h;\n this.width = w;\n this.height = h;\n }\n return this;\n }\n /**\n * Signatures: (x, y, w, h), (x, y)\n */\n dest(x, y, w, h) {\n this._dx = x, this._dy = y;\n this._dx = x, this._dy = y;\n if (typeof w !== \"undefined\") {\n this._dw = w, this._dh = h;\n this.width = w, this.height = h;\n }\n return this;\n }\n draw(context, x1, y1, x2, y2, x3, y3, x4, y4) {\n var drawable = this._image;\n if (drawable === null || typeof drawable !== \"object\") {\n return;\n }\n var sx = this._sx, sy = this._sy;\n var sw = this._sw, sh = this._sh;\n var dx = this._dx, dy = this._dy;\n var dw = this._dw, dh = this._dh;\n if (typeof x3 !== \"undefined\") {\n x1 = math.clamp(x1, 0, this._sw), x2 = math.clamp(x2, 0, this._sw - x1);\n y1 = math.clamp(y1, 0, this._sh), y2 = math.clamp(y2, 0, this._sh - y1);\n sx += x1, sy += y1, sw = x2, sh = y2;\n dx = x3, dy = y3, dw = x4, dh = y4;\n } else if (typeof x2 !== \"undefined\") {\n dx = x1, dy = y1, dw = x2, dh = y2;\n } else if (typeof x1 !== \"undefined\") {\n dw = x1, dh = y1;\n }\n var ratio = this.ratio || 1;\n sx *= ratio, sy *= ratio, sw *= ratio, sh *= ratio;\n try {\n if (typeof drawable.draw === \"function\") {\n drawable.draw(context, sx, sy, sw, sh, dx, dy, dw, dh);\n } else {\n stats.draw++;\n context.drawImage(drawable, sx, sy, sw, sh, dx, dy, dw, dh);\n }\n } catch (ex) {\n if (!drawable._draw_failed) {\n console.log(\"Unable to draw: \", drawable);\n console.log(ex);\n drawable._draw_failed = true;\n }\n }\n }\n}\nvar NO_TEXTURE = new class extends Texture {\n constructor() {\n super();\n __publicField(this, \"pipe\", function() {\n return this;\n });\n __publicField(this, \"src\", function() {\n return this;\n });\n __publicField(this, \"dest\", function() {\n return this;\n });\n __publicField(this, \"draw\", function() {\n });\n this.x = this.y = this.width = this.height = 0;\n }\n}();\nvar NO_SELECTION = new Selection(NO_TEXTURE);\nfunction preloadImage(src) {\n console.log(\"Loading image: \" + src);\n return new Promise(function(resolve, reject) {\n const img = new Image();\n img.onload = function() {\n console.log(\"Image loaded: \" + src);\n resolve(img);\n };\n img.onerror = function(error) {\n console.log(\"Loading failed: \" + src);\n reject(error);\n };\n img.src = src;\n });\n}\nvar _atlases_map = {};\nvar _atlases_arr = [];\nconst atlas = async function(def) {\n var atlas2 = isFn(def.draw) ? def : new Atlas(def);\n if (def.name) {\n _atlases_map[def.name] = atlas2;\n }\n _atlases_arr.push(atlas2);\n deprecated(def, \"imagePath\");\n deprecated(def, \"imageRatio\");\n var url = def.imagePath;\n var ratio = def.imageRatio || 1;\n if (\"string\" === typeof def.image) {\n url = def.image;\n } else if (isHash(def.image)) {\n url = def.image.src || def.image.url;\n ratio = def.image.ratio || ratio;\n }\n if (url) {\n const image2 = await preloadImage(url);\n atlas2.src(image2, ratio);\n }\n return atlas2;\n};\nclass Atlas extends Texture {\n constructor(def) {\n super();\n var atlas2 = this;\n deprecated(def, \"filter\");\n deprecated(def, \"cutouts\");\n deprecated(def, \"sprites\");\n deprecated(def, \"factory\");\n var map = def.map || def.filter;\n var ppu = def.ppu || def.ratio || 1;\n var trim = def.trim || 0;\n var textures = def.textures;\n var factory = def.factory;\n var cutouts = def.cutouts || def.sprites;\n function make(def2) {\n if (!def2 || isFn(def2.draw)) {\n return def2;\n }\n def2 = Object.assign({}, def2);\n if (isFn(map)) {\n def2 = map(def2);\n }\n if (ppu != 1) {\n def2.x *= ppu, def2.y *= ppu;\n def2.width *= ppu, def2.height *= ppu;\n def2.top *= ppu, def2.bottom *= ppu;\n def2.left *= ppu, def2.right *= ppu;\n }\n if (trim != 0) {\n def2.x += trim, def2.y += trim;\n def2.width -= 2 * trim, def2.height -= 2 * trim;\n def2.top -= trim, def2.bottom -= trim;\n def2.left -= trim, def2.right -= trim;\n }\n var texture2 = atlas2.pipe();\n texture2.top = def2.top, texture2.bottom = def2.bottom;\n texture2.left = def2.left, texture2.right = def2.right;\n texture2.src(def2.x, def2.y, def2.width, def2.height);\n return texture2;\n }\n function find(query) {\n if (textures) {\n if (isFn(textures)) {\n return textures(query);\n } else if (isHash(textures)) {\n return textures[query];\n }\n }\n if (cutouts) {\n var result = null, n = 0;\n for (var i = 0; i < cutouts.length; i++) {\n if (string.startsWith(cutouts[i].name, query)) {\n if (n === 0) {\n result = cutouts[i];\n } else if (n === 1) {\n result = [result, cutouts[i]];\n } else {\n result.push(cutouts[i]);\n }\n n++;\n }\n }\n if (n === 0 && isFn(factory)) {\n result = function(subquery) {\n return factory(query + (subquery ? subquery : \"\"));\n };\n }\n return result;\n }\n }\n this.select = function(query) {\n if (!query) {\n return new Selection(this.pipe());\n }\n var found = find(query);\n if (found) {\n return new Selection(found, find, make);\n }\n };\n }\n}\nfunction Selection(result, find, make) {\n function link(result2, subquery) {\n if (!result2) {\n return NO_TEXTURE;\n } else if (isFn(result2.draw)) {\n return result2;\n } else if (isHash(result2) && \"number\" === typeof result2.width && \"number\" === typeof result2.height && isFn(make)) {\n return make(result2);\n } else if (isHash(result2) && \"undefined\" !== typeof subquery) {\n return link(result2[subquery]);\n } else if (isFn(result2)) {\n return link(result2(subquery));\n } else if (Array.isArray(result2)) {\n return link(result2[0]);\n } else if (\"string\" === typeof result2 && isFn(find)) {\n return link(find(result2));\n }\n }\n this.one = function(subquery) {\n return link(result, subquery);\n };\n this.array = function(arr) {\n var array = Array.isArray(arr) ? arr : [];\n if (Array.isArray(result)) {\n for (var i = 0; i < result.length; i++) {\n array[i] = link(result[i]);\n }\n } else {\n array[0] = link(result);\n }\n return array;\n };\n}\nconst texture = function(query) {\n if (!(\"string\" === typeof query)) {\n return new Selection(query);\n }\n var result = null, atlas2, i;\n if ((i = query.indexOf(\":\")) > 0 && query.length > i + 1) {\n atlas2 = _atlases_map[query.slice(0, i)];\n result = atlas2 && atlas2.select(query.slice(i + 1));\n }\n if (!result && (atlas2 = _atlases_map[query])) {\n result = atlas2.select();\n }\n for (i = 0; !result && i < _atlases_arr.length; i++) {\n result = _atlases_arr[i].select(query);\n }\n if (!result) {\n console.error(\"Texture not found: \" + query);\n result = NO_SELECTION;\n }\n return result;\n};\nfunction deprecated(hash, name, msg) {\n if (name in hash)\n console.log(msg ? msg.replace(\"%name\", name) : \"'\" + name + \"' field of texture atlas is deprecated.\");\n}\nconst canvas = function(type, attributes, plotter) {\n if (typeof type === \"string\") {\n if (typeof attributes === \"object\")\n ;\n else {\n if (typeof attributes === \"function\") {\n plotter = attributes;\n }\n attributes = {};\n }\n } else {\n if (typeof type === \"function\") {\n plotter = type;\n }\n attributes = {};\n type = \"2d\";\n }\n var canvas2 = document.createElement(\"canvas\");\n var context = canvas2.getContext(type, attributes);\n var texture2 = new Texture(canvas2);\n texture2.context = function() {\n return context;\n };\n texture2.size = function(width, height, ratio) {\n ratio = ratio || 1;\n canvas2.width = width * ratio;\n canvas2.height = height * ratio;\n this.src(canvas2, ratio);\n return this;\n };\n texture2.canvas = function(fn) {\n if (typeof fn === \"function\") {\n fn.call(this, context);\n } else if (typeof fn === \"undefined\" && typeof plotter === \"function\") {\n plotter.call(this, context);\n }\n return this;\n };\n if (typeof plotter === \"function\") {\n plotter.call(texture2, context);\n }\n return texture2;\n};\nconst PIXEL_RATIO = window.devicePixelRatio || 1;\nlet M;\nfunction memoizeDraw(callback, memoKey = () => null) {\n let lastRatio = 0;\n let lastSelection = void 0;\n let texture2 = Stage.canvas();\n let sprite2 = Stage.sprite();\n let first = true;\n sprite2.tick(function() {\n let m = this._parent.matrix();\n if (first) {\n first = false;\n if (!(m = M)) {\n return;\n }\n }\n M = m;\n let newRatio = Math.max(Math.abs(m.a), Math.abs(m.b));\n let rationChange = lastRatio / newRatio;\n if (lastRatio === 0 || rationChange > 1.25 || rationChange < 0.8) {\n const newSelection = memoKey();\n if (lastSelection !== newSelection) {\n lastRatio = newRatio;\n callback(2.5 * newRatio / PIXEL_RATIO, texture2, sprite2);\n sprite2.texture(texture2);\n sprite2.__timestamp = Date.now();\n }\n }\n }, false);\n return sprite2;\n}\nclass Mouse {\n constructor() {\n __publicField(this, \"x\", 0);\n __publicField(this, \"y\", 0);\n __publicField(this, \"ratio\", 1);\n __publicField(this, \"stage\");\n __publicField(this, \"elem\");\n __publicField(this, \"clicklist\", []);\n __publicField(this, \"cancellist\", []);\n __publicField(this, \"handleStart\", (event) => {\n event.preventDefault();\n this.locate(event);\n this.publish(event.type, event);\n this.lookup(\"click\", this.clicklist);\n this.lookup(\"mousecancel\", this.cancellist);\n });\n __publicField(this, \"handleMove\", (event) => {\n event.preventDefault();\n this.locate(event);\n this.publish(event.type, event);\n });\n __publicField(this, \"handleEnd\", (event) => {\n event.preventDefault();\n this.publish(event.type, event);\n if (this.clicklist.length) {\n this.publish(\"click\", event, this.clicklist);\n }\n this.cancellist.length = 0;\n });\n __publicField(this, \"handleCancel\", (event) => {\n if (this.cancellist.length) {\n this.publish(\"mousecancel\", event, this.cancellist);\n }\n this.clicklist.length = 0;\n });\n __publicField(this, \"toString\", function() {\n return (this.x | 0) + \"x\" + (this.y | 0);\n });\n __publicField(this, \"locate\", function(event) {\n const elem = this.elem;\n let x;\n let y;\n if (event.touches && event.touches.length) {\n x = event.touches[0].clientX;\n y = event.touches[0].clientY;\n } else {\n x = event.clientX;\n y = event.clientY;\n }\n var rect = elem.getBoundingClientRect();\n x -= rect.left;\n y -= rect.top;\n x -= elem.clientLeft | 0;\n y -= elem.clientTop | 0;\n this.x = x * this.ratio;\n this.y = y * this.ratio;\n });\n __publicField(this, \"lookup\", function(type, collect) {\n this.type = type;\n this.root = this.stage;\n this.event = null;\n collect.length = 0;\n this.collect = collect;\n this.root.visit({\n reverse: true,\n visible: true,\n start: this.visitStart,\n end: this.visitEnd\n }, this);\n });\n __publicField(this, \"publish\", function(type, event, targets) {\n this.type = type;\n this.root = this.stage;\n this.event = event;\n this.collect = false;\n this.timeStamp = Date.now();\n if (type !== \"mousemove\" && type !== \"touchmove\") {\n console.log(this.type + \" \" + this);\n }\n if (targets) {\n while (targets.length)\n if (this.visitEnd(targets.shift()))\n break;\n targets.length = 0;\n } else {\n this.root.visit({\n reverse: true,\n visible: true,\n start: this.visitStart,\n end: this.visitEnd\n }, this);\n }\n });\n __publicField(this, \"visitStart\", (node) => {\n return !node._flag(this.type);\n });\n __publicField(this, \"visitEnd\", (node) => {\n rel.raw = this.event;\n rel.type = this.type;\n rel.timeStamp = this.timeStamp;\n rel.abs.x = this.x;\n rel.abs.y = this.y;\n var listeners = node.listeners(this.type);\n if (!listeners) {\n return;\n }\n node.matrix().inverse().map(this, rel);\n if (!(node === this.root || node.attr(\"spy\") || node.hitTest(rel))) {\n return;\n }\n if (this.collect) {\n this.collect.push(node);\n }\n if (this.event) {\n var cancel = false;\n for (var l = 0; l < listeners.length; l++) {\n cancel = listeners[l].call(node, rel) ? true : cancel;\n }\n return cancel;\n }\n });\n }\n mount(stage, elem) {\n this.stage = stage;\n this.elem = elem;\n this.ratio = stage.viewport().ratio || 1;\n stage.on(\"viewport\", (size) => {\n this.ratio = size.ratio ?? this.ratio;\n });\n elem.addEventListener(\"touchstart\", this.handleStart);\n elem.addEventListener(\"touchend\", this.handleEnd);\n elem.addEventListener(\"touchmove\", this.handleMove);\n elem.addEventListener(\"touchcancel\", this.handleCancel);\n elem.addEventListener(\"mousedown\", this.handleStart);\n elem.addEventListener(\"mouseup\", this.handleEnd);\n elem.addEventListener(\"mousemove\", this.handleMove);\n document.addEventListener(\"mouseup\", this.handleCancel);\n window.addEventListener(\"blur\", this.handleCancel);\n return this;\n }\n unmount() {\n const elem = this.elem;\n elem.removeEventListener(\"touchstart\", this.handleStart);\n elem.removeEventListener(\"touchend\", this.handleEnd);\n elem.removeEventListener(\"touchmove\", this.handleMove);\n elem.removeEventListener(\"touchcancel\", this.handleCancel);\n elem.removeEventListener(\"mousedown\", this.handleStart);\n elem.removeEventListener(\"mouseup\", this.handleEnd);\n elem.removeEventListener(\"mousemove\", this.handleMove);\n document.removeEventListener(\"mouseup\", this.handleCancel);\n window.removeEventListener(\"blur\", this.handleCancel);\n return this;\n }\n}\n__publicField(Mouse, \"CLICK\", \"click\");\n__publicField(Mouse, \"START\", \"touchstart mousedown\");\n__publicField(Mouse, \"MOVE\", \"touchmove mousemove\");\n__publicField(Mouse, \"END\", \"touchend mouseup\");\n__publicField(Mouse, \"CANCEL\", \"touchcancel mousecancel\");\nvar rel = {}, abs = {};\ndefineValue(rel, \"clone\", function(obj) {\n obj = obj || {}, obj.x = this.x, obj.y = this.y;\n return obj;\n});\ndefineValue(rel, \"toString\", function() {\n return (this.x | 0) + \"x\" + (this.y | 0) + \" (\" + this.abs + \")\";\n});\ndefineValue(rel, \"abs\", abs);\ndefineValue(abs, \"clone\", function(obj) {\n obj = obj || {}, obj.x = this.x, obj.y = this.y;\n return obj;\n});\ndefineValue(abs, \"toString\", function() {\n return (this.x | 0) + \"x\" + (this.y | 0);\n});\nfunction defineValue(obj, name, value) {\n Object.defineProperty(obj, name, {\n value\n });\n}\nfunction IDENTITY(x) {\n return x;\n}\nvar _cache = {};\nvar _modes = {};\nvar _easings = {};\nclass Easing {\n static get(token, fallback = IDENTITY) {\n if (typeof token === \"function\") {\n return token;\n }\n if (typeof token !== \"string\") {\n return fallback;\n }\n var fn = _cache[token];\n if (fn) {\n return fn;\n }\n var match = /^(\\w+)(-(in|out|in-out|out-in))?(\\((.*)\\))?$/i.exec(token);\n if (!match || !match.length) {\n return fallback;\n }\n var easing = _easings[match[1]];\n var mode = _modes[match[3]];\n var params = match[5];\n if (easing && easing.fn) {\n fn = easing.fn;\n } else if (easing && easing.fc) {\n fn = easing.fc.apply(easing.fc, params && params.replace(/\\s+/, \"\").split(\",\"));\n } else {\n fn = fallback;\n }\n if (mode) {\n fn = mode.fn(fn);\n }\n _cache[token] = fn;\n return fn;\n }\n static add(data) {\n var names = (data.name || data.mode).split(/\\s+/);\n for (var i = 0; i < names.length; i++) {\n var name = names[i];\n if (name) {\n (data.name ? _easings : _modes)[name] = data;\n }\n }\n }\n}\nEasing.add({\n mode: \"in\",\n fn: function(f) {\n return f;\n }\n});\nEasing.add({\n mode: \"out\",\n fn: function(f) {\n return function(t) {\n return 1 - f(1 - t);\n };\n }\n});\nEasing.add({\n mode: \"in-out\",\n fn: function(f) {\n return function(t) {\n return t < 0.5 ? f(2 * t) / 2 : 1 - f(2 * (1 - t)) / 2;\n };\n }\n});\nEasing.add({\n mode: \"out-in\",\n fn: function(f) {\n return function(t) {\n return t < 0.5 ? 1 - f(2 * (1 - t)) / 2 : f(2 * t) / 2;\n };\n }\n});\nEasing.add({\n name: \"linear\",\n fn: function(t) {\n return t;\n }\n});\nEasing.add({\n name: \"quad\",\n fn: function(t) {\n return t * t;\n }\n});\nEasing.add({\n name: \"cubic\",\n fn: function(t) {\n return t * t * t;\n }\n});\nEasing.add({\n name: \"quart\",\n fn: function(t) {\n return t * t * t * t;\n }\n});\nEasing.add({\n name: \"quint\",\n fn: function(t) {\n return t * t * t * t * t;\n }\n});\nEasing.add({\n name: \"sin sine\",\n fn: function(t) {\n return 1 - Math.cos(t * Math.PI / 2);\n }\n});\nEasing.add({\n name: \"exp expo\",\n fn: function(t) {\n return t == 0 ? 0 : Math.pow(2, 10 * (t - 1));\n }\n});\nEasing.add({\n name: \"circle circ\",\n fn: function(t) {\n return 1 - Math.sqrt(1 - t * t);\n }\n});\nEasing.add({\n name: \"bounce\",\n fn: function(t) {\n return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + 0.75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375 : 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;\n }\n});\nEasing.add({\n name: \"poly\",\n fc: function(e) {\n return function(t) {\n return Math.pow(t, e);\n };\n }\n});\nEasing.add({\n name: \"elastic\",\n fc: function(a, p) {\n p = p || 0.45;\n a = a || 1;\n var s = p / (2 * Math.PI) * Math.asin(1 / a);\n return function(t) {\n return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p);\n };\n }\n});\nEasing.add({\n name: \"back\",\n fc: function(s) {\n s = typeof s !== \"undefined\" ? s : 1.70158;\n return function(t) {\n return t * t * ((s + 1) * t - s);\n };\n }\n});\nNode.prototype.tween = function(a, b, c) {\n let options;\n if (typeof a === \"object\" && a !== null) {\n options = a;\n } else if (typeof a === \"number\" && typeof b === \"number\") {\n options = {\n duration: a,\n delay: b,\n append: c\n };\n } else if (typeof a === \"number\") {\n options = {\n duration: a,\n delay: 0,\n append: b\n };\n } else {\n options = {\n duration: 400,\n delay: 0,\n append: a\n };\n }\n if (!this._tweens) {\n this._tweens = [];\n var ticktime = 0;\n this.tick(function(elapsed, now, last) {\n if (!this._tweens.length) {\n return false;\n }\n var ignore = ticktime != last;\n ticktime = now;\n if (ignore) {\n return true;\n }\n var head = this._tweens[0];\n var ended = head.tick(this, elapsed, now, last);\n if (ended) {\n if (head === this._tweens[0]) {\n this._tweens.shift();\n }\n var next = head.finish();\n if (next) {\n this._tweens.unshift(next);\n }\n }\n return true;\n }, true);\n }\n this.touch();\n if (!options.append) {\n this._tweens.length = 0;\n }\n var tween = new Tween(this, options);\n this._tweens.push(tween);\n return tween;\n};\nclass Tween {\n constructor(owner, options = {}) {\n __publicField(this, \"_ending\", []);\n this._end = {};\n this._duration = options.duration || 400;\n this._delay = options.delay || 0;\n this._owner = owner;\n this._time = 0;\n }\n // @internal\n tick(node, elapsed, now, last) {\n this._time += elapsed;\n if (this._time < this._delay) {\n return;\n }\n var time = this._time - this._delay;\n if (!this._start) {\n this._start = {};\n for (var key in this._end) {\n this._start[key] = this._owner.pin(key);\n }\n }\n var p = Math.min(time / this._duration, 1);\n var ended = p >= 1;\n if (typeof this._easing == \"function\") {\n p = this._easing(p);\n }\n var q = 1 - p;\n for (var key in this._end) {\n this._owner.pin(key, this._start[key] * q + this._end[key] * p);\n }\n return ended;\n }\n // @internal\n finish() {\n this._ending.forEach((callback) => {\n try {\n callback.call(this._owner);\n } catch (e) {\n console.error(e);\n }\n });\n return this._next;\n }\n tween(duration, delay) {\n return this._next = new Tween(this._owner, duration, delay);\n }\n duration(duration) {\n this._duration = duration;\n return this;\n }\n delay(delay) {\n this._delay = delay;\n return this;\n }\n ease(easing) {\n this._easing = Easing.get(easing);\n return this;\n }\n done(fn) {\n this._ending.push(fn);\n return this;\n }\n hide() {\n this._ending.push(function() {\n this.hide();\n });\n this._hide = true;\n return this;\n }\n remove() {\n this._ending.push(function() {\n this.remove();\n });\n this._remove = true;\n return this;\n }\n pin(a, b) {\n if (typeof a === \"object\") {\n for (var attr in a) {\n pinning(this._owner, this._end, attr, a[attr]);\n }\n } else if (typeof b !== \"undefined\") {\n pinning(this._owner, this._end, a, b);\n }\n return this;\n }\n /**\n * @deprecated Use .done(fn) instead.\n */\n then(fn) {\n this.done(fn);\n return this;\n }\n /**\n * @deprecated this doesn't do anything anymore, call tween on the node instead.\n */\n clear(forward) {\n return this;\n }\n}\nfunction pinning(node, map, key, value) {\n if (typeof node.pin(key) === \"number\") {\n map[key] = value;\n } else if (typeof node.pin(key + \"X\") === \"number\" && typeof node.pin(key + \"Y\") === \"number\") {\n map[key + \"X\"] = value;\n map[key + \"Y\"] = value;\n }\n}\nPin._add_shortcuts(Tween.prototype);\nconst _stages = [];\nconst pause = function() {\n for (let i = _stages.length - 1; i >= 0; i--) {\n _stages[i].pause();\n }\n};\nconst resume = function() {\n for (let i = _stages.length - 1; i >= 0; i--) {\n _stages[i].resume();\n }\n};\nconst mount = function(configs = {}) {\n let root = new Root();\n root.mount(configs);\n root.mouse = new Mouse().mount(root, root.dom);\n return root;\n};\nclass Root extends Node {\n constructor() {\n super();\n __publicField(this, \"canvas\", null);\n __publicField(this, \"dom\", null);\n __publicField(this, \"context\", null);\n __publicField(this, \"pixelWidth\", -1);\n __publicField(this, \"pixelHeight\", -1);\n __publicField(this, \"pixelRatio\", 1);\n __publicField(this, \"drawingWidth\", 0);\n __publicField(this, \"drawingHeight\", 0);\n __publicField(this, \"mounted\", false);\n __publicField(this, \"paused\", false);\n __publicField(this, \"sleep\", false);\n __publicField(this, \"mount\", (configs = {}) => {\n if (typeof configs.canvas === \"string\") {\n this.canvas = document.getElementById(configs.canvas);\n } else if (configs.canvas instanceof HTMLCanvasElement) {\n this.canvas = configs.canvas;\n } else if (configs.canvas)\n ;\n if (!this.canvas) {\n this.canvas = document.getElementById(\"cutjs\") || document.getElementById(\"stage\");\n }\n if (!this.canvas) {\n console.log(\"Creating Canvas...\");\n this.canvas = document.createElement(\"canvas\");\n Object.assign(this.canvas.style, {\n position: \"absolute\",\n display: \"block\",\n top: \"0\",\n left: \"0\",\n bottom: \"0\",\n right: \"0\",\n width: \"100%\",\n height: \"100%\"\n });\n let body = document.body;\n body.insertBefore(this.canvas, body.firstChild);\n }\n this.dom = this.canvas;\n this.context = this.canvas.getContext(\"2d\");\n this.devicePixelRatio = window.devicePixelRatio || 1;\n this.backingStoreRatio = this.context.webkitBackingStorePixelRatio || this.context.mozBackingStorePixelRatio || this.context.msBackingStorePixelRatio || this.context.oBackingStorePixelRatio || this.context.backingStorePixelRatio || 1;\n this.pixelRatio = this.devicePixelRatio / this.backingStoreRatio;\n this.mounted = true;\n _stages.push(this);\n this.requestFrame(this.onFrame);\n });\n __publicField(this, \"frameRequested\", false);\n __publicField(this, \"requestFrame\", () => {\n if (!this.frameRequested) {\n this.frameRequested = true;\n requestAnimationFrame(this.onFrame);\n }\n });\n __publicField(this, \"lastTime\", 0);\n __publicField(this, \"_mo_touch\", null);\n // monitor touch\n __publicField(this, \"onFrame\", (now) => {\n this.frameRequested = false;\n if (!this.mounted) {\n return;\n }\n this.requestFrame();\n const newPixelWidth = this.canvas.clientWidth;\n const newPixelHeight = this.canvas.clientHeight;\n if (this.pixelWidth !== newPixelWidth || this.pixelHeight !== newPixelHeight) {\n this.pixelWidth = newPixelWidth;\n this.pixelHeight = newPixelHeight;\n this.drawingWidth = newPixelWidth * this.pixelRatio;\n this.drawingHeight = newPixelHeight * this.pixelRatio;\n if (this.canvas.width !== this.drawingWidth || this.canvas.height !== this.drawingHeight) {\n this.canvas.width = this.drawingWidth;\n this.canvas.height = this.drawingHeight;\n console.log(\"Resize: [\" + this.drawingWidth + \", \" + this.drawingHeight + \"] = \" + this.pixelRatio + \" x [\" + this.pixelWidth + \", \" + this.pixelHeight + \"]\");\n this.viewport({\n width: this.drawingWidth,\n height: this.drawingHeight,\n ratio: this.pixelRatio\n });\n }\n }\n let last = this.lastTime || now;\n let elapsed = now - last;\n if (!this.mounted || this.paused || this.sleep) {\n return;\n }\n this.lastTime = now;\n let tickRequest = this._tick(elapsed, now, last);\n if (this._mo_touch != this._ts_touch) {\n this._mo_touch = this._ts_touch;\n this.sleep = false;\n if (this.drawingWidth > 0 && this.drawingHeight > 0) {\n this.context.setTransform(1, 0, 0, 1, 0, 0);\n this.context.clearRect(0, 0, this.drawingWidth, this.drawingHeight);\n this.render(this.context);\n }\n } else if (tickRequest) {\n this.sleep = false;\n } else {\n this.sleep = true;\n }\n stats.fps = elapsed ? 1e3 / elapsed : 0;\n });\n this.label(\"Root\");\n }\n resume() {\n if (this.sleep || this.paused) {\n this.requestFrame();\n }\n this.paused = false;\n this.sleep = false;\n this.publish(\"resume\");\n return this;\n }\n pause() {\n if (!this.paused) {\n this.publish(\"pause\");\n }\n this.paused = true;\n return this;\n }\n touch() {\n if (this.sleep || this.paused) {\n this.requestFrame();\n }\n this.sleep = false;\n return Node.prototype.touch();\n }\n unmount() {\n var _a;\n this.mounted = false;\n let index = _stages.indexOf(this);\n if (index >= 0) {\n _stages.splice(index, 1);\n }\n (_a = this.mouse) == null ? void 0 : _a.unmount();\n return this;\n }\n background(color) {\n this.dom.style.backgroundColor = color;\n return this;\n }\n /**\n * Set/Get viewport.\n * This is used along with viewbox to determine the scale and position of the viewbox within the viewport.\n * Viewport is the size of the container, for example size of the canvas element.\n * Viewbox is provided by the user, and is the ideal size of the content.\n */\n viewport(width, height, ratio) {\n if (typeof width === \"undefined\") {\n return Object.assign({}, this._viewport);\n }\n if (typeof width === \"object\") {\n const options = width;\n width = options.width;\n height = options.height;\n ratio = options.ratio;\n }\n this._viewport = {\n width,\n height,\n ratio: ratio || 1\n };\n this.viewbox();\n let data = Object.assign({}, this._viewport);\n this.visit({\n start: function(node) {\n if (!node._flag(\"viewport\")) {\n return true;\n }\n node.publish(\"viewport\", [data]);\n }\n });\n return this;\n }\n /**\n * Set viewbox.\n * \n * @param {mode} string - One of: 'in-pad' (like css object-fit: 'contain'), 'in', 'out-crop' (like css object-fit: 'cover'), 'out'\n */\n // TODO: static/fixed viewbox\n // TODO: use css object-fit values\n viewbox(width, height, mode) {\n if (typeof width === \"number\" && typeof height === \"number\") {\n this._viewbox = {\n width,\n height,\n mode\n };\n } else if (typeof width === \"object\" && width !== null) {\n this._viewbox = {\n ...width\n };\n }\n this.rescale();\n return this;\n }\n camera(matrix) {\n this._camera = matrix;\n this.rescale();\n return this;\n }\n rescale() {\n let viewbox = this._viewbox;\n let viewport = this._viewport;\n let camera = this._camera;\n if (viewport && viewbox) {\n const viewportWidth = viewport.width;\n const viewportHeight = viewport.height;\n const viewboxMode = /^(in|out|in-pad|out-crop)$/.test(viewbox.mode) ? viewbox.mode : \"in-pad\";\n const viewboxWidth = viewbox.width;\n const viewboxHeight = viewbox.height;\n this.pin({\n width: viewboxWidth,\n height: viewboxHeight\n });\n this.scaleTo(viewportWidth, viewportHeight, viewboxMode);\n const viewboxX = viewbox.x || 0;\n const viewboxY = viewbox.y || 0;\n const cameraZoom = (camera == null ? void 0 : camera.a) || 1;\n const cameraX = (camera == null ? void 0 : camera.e) || 0;\n const cameraY = (camera == null ? void 0 : camera.f) || 0;\n const scaleX = this.pin(\"scaleX\");\n const scaleY = this.pin(\"scaleY\");\n this.pin(\"scaleX\", scaleX * cameraZoom);\n this.pin(\"scaleY\", scaleY * cameraZoom);\n this.pin(\"offsetX\", cameraX - viewboxX * scaleX * cameraZoom);\n this.pin(\"offsetY\", cameraY - viewboxY * scaleY * cameraZoom);\n } else if (viewport) {\n this.pin({\n width: viewport.width,\n height: viewport.height\n });\n }\n return this;\n }\n}\nconst sprite = function(frame) {\n var sprite2 = new Sprite();\n frame && sprite2.texture(frame);\n return sprite2;\n};\nSprite._super = Node;\nSprite.prototype = Object.create(Sprite._super.prototype);\nfunction Sprite() {\n Sprite._super.call(this);\n this.label(\"Sprite\");\n this._textures = [];\n this._image = null;\n}\nSprite.prototype.texture = function(frame) {\n this._image = texture(frame).one();\n this.pin(\"width\", this._image ? this._image.width : 0);\n this.pin(\"height\", this._image ? this._image.height : 0);\n this._textures[0] = this._image.pipe();\n this._textures.length = 1;\n return this;\n};\nSprite.prototype.tile = function(inner) {\n this._repeat(false, inner);\n return this;\n};\nSprite.prototype.stretch = function(inner) {\n this._repeat(true, inner);\n return this;\n};\nSprite.prototype._repeat = function(stretch, inner) {\n var self = this;\n this.untick(this._repeatTicker);\n this.tick(this._repeatTicker = function() {\n if (this._mo_stretch == this._pin._ts_transform) {\n return;\n }\n this._mo_stretch = this._pin._ts_transform;\n var width = this.pin(\"width\");\n var height = this.pin(\"height\");\n this._textures.length = repeat(this._image, width, height, stretch, inner, insert);\n });\n function insert(i, sx, sy, sw, sh, dx, dy, dw, dh) {\n var repeat2 = self._textures.length > i ? self._textures[i] : self._textures[i] = self._image.pipe();\n repeat2.src(sx, sy, sw, sh);\n repeat2.dest(dx, dy, dw, dh);\n }\n};\nfunction repeat(img, owidth, oheight, stretch, inner, insert) {\n var width = img.width;\n var height = img.height;\n var left = img.left;\n var right = img.right;\n var top = img.top;\n var bottom = img.bottom;\n left = typeof left === \"number\" && left === left ? left : 0;\n right = typeof right === \"number\" && right === right ? right : 0;\n top = typeof top === \"number\" && top === top ? top : 0;\n bottom = typeof bottom === \"number\" && bottom === bottom ? bottom : 0;\n width = width - left - right;\n height = height - top - bottom;\n if (!inner) {\n owidth = Math.max(owidth - left - right, 0);\n oheight = Math.max(oheight - top - bottom, 0);\n }\n var i = 0;\n if (top > 0 && left > 0)\n insert(i++, 0, 0, left, top, 0, 0, left, top);\n if (bottom > 0 && left > 0)\n insert(i++, 0, height + top, left, bottom, 0, oheight + top, left, bottom);\n if (top > 0 && right > 0)\n insert(i++, width + left, 0, right, top, owidth + left, 0, right, top);\n if (bottom > 0 && right > 0)\n insert(\n i++,\n width + left,\n height + top,\n right,\n bottom,\n owidth + left,\n oheight + top,\n right,\n bottom\n );\n if (stretch) {\n if (top > 0)\n insert(i++, left, 0, width, top, left, 0, owidth, top);\n if (bottom > 0)\n insert(\n i++,\n left,\n height + top,\n width,\n bottom,\n left,\n oheight + top,\n owidth,\n bottom\n );\n if (left > 0)\n insert(i++, 0, top, left, height, 0, top, left, oheight);\n if (right > 0)\n insert(\n i++,\n width + left,\n top,\n right,\n height,\n owidth + left,\n top,\n right,\n oheight\n );\n insert(i++, left, top, width, height, left, top, owidth, oheight);\n } else {\n var l = left, r = owidth, w;\n while (r > 0) {\n w = Math.min(width, r), r -= width;\n var t = top, b = oheight, h;\n while (b > 0) {\n h = Math.min(height, b), b -= height;\n insert(i++, left, top, w, h, l, t, w, h);\n if (r <= 0) {\n if (left)\n insert(i++, 0, top, left, h, 0, t, left, h);\n if (right)\n insert(i++, width + left, top, right, h, l + w, t, right, h);\n }\n t += h;\n }\n if (top)\n insert(i++, left, 0, w, top, l, 0, w, top);\n if (bottom)\n insert(i++, left, height + top, w, bottom, l, t, w, bottom);\n l += w;\n }\n }\n return i;\n}\nSprite.prototype.image = Sprite.prototype.texture;\nconst image = sprite;\nconst Image$1 = Sprite;\nconst anim = function(frames, fps) {\n var anim2 = new Anim();\n anim2.frames(frames).gotoFrame(0);\n fps && anim2.fps(fps);\n return anim2;\n};\nAnim._super = Node;\nAnim.prototype = Object.create(Anim._super.prototype);\nconst FPS = 15;\nfunction Anim() {\n Anim._super.call(this);\n this.label(\"Anim\");\n this._textures = [];\n this._fps = FPS;\n this._ft = 1e3 / this._fps;\n this._time = -1;\n this._repeat = 0;\n this._index = 0;\n this._frames = [];\n var lastTime = 0;\n this.tick(function(t, now, last) {\n if (this._time < 0 || this._frames.length <= 1) {\n return;\n }\n var ignore = lastTime != last;\n lastTime = now;\n if (ignore) {\n return true;\n }\n this._time += t;\n if (this._time < this._ft) {\n return true;\n }\n var n = this._time / this._ft | 0;\n this._time -= n * this._ft;\n this.moveFrame(n);\n if (this._repeat > 0 && (this._repeat -= n) <= 0) {\n this.stop();\n this._callback && this._callback();\n return false;\n }\n return true;\n }, false);\n}\nAnim.prototype.fps = function(fps) {\n if (typeof fps === \"undefined\") {\n return this._fps;\n }\n this._fps = fps > 0 ? fps : FPS;\n this._ft = 1e3 / this._fps;\n return this;\n};\nAnim.prototype.setFrames = function(a, b, c) {\n return this.frames(a, b, c);\n};\nAnim.prototype.frames = function(frames) {\n this._index = 0;\n this._frames = texture(frames).array();\n this.touch();\n return this;\n};\nAnim.prototype.length = function() {\n return this._frames ? this._frames.length : 0;\n};\nAnim.prototype.gotoFrame = function(frame, resize) {\n this._index = math.wrap(frame, this._frames.length) | 0;\n resize = resize || !this._textures[0];\n this._textures[0] = this._frames[this._index];\n if (resize) {\n this.pin(\"width\", this._textures[0].width);\n this.pin(\"height\", this._textures[0].height);\n }\n this.touch();\n return this;\n};\nAnim.prototype.moveFrame = function(move) {\n return this.gotoFrame(this._index + move);\n};\nAnim.prototype.repeat = function(repeat2, callback) {\n this._repeat = repeat2 * this._frames.length - 1;\n this._callback = callback;\n this.play();\n return this;\n};\nAnim.prototype.play = function(frame) {\n if (typeof frame !== \"undefined\") {\n this.gotoFrame(frame);\n this._time = 0;\n } else if (this._time < 0) {\n this._time = 0;\n }\n this.touch();\n return this;\n};\nAnim.prototype.stop = function(frame) {\n this._time = -1;\n if (typeof frame !== \"undefined\") {\n this.gotoFrame(frame);\n }\n return this;\n};\nconst string$1 = function(frames) {\n return new Str().frames(frames);\n};\nStr._super = Node;\nStr.prototype = Object.create(Str._super.prototype);\nfunction Str() {\n Str._super.call(this);\n this.label(\"String\");\n this._textures = [];\n}\nStr.prototype.setFont = function(a, b, c) {\n return this.frames(a, b, c);\n};\nStr.prototype.frames = function(frames) {\n this._textures = [];\n if (typeof frames == \"string\") {\n frames = texture(frames);\n this._item = function(value) {\n return frames.one(value);\n };\n } else if (typeof frames === \"object\") {\n this._item = function(value) {\n return frames[value];\n };\n } else if (typeof frames === \"function\") {\n this._item = frames;\n }\n return this;\n};\nStr.prototype.setValue = function(a, b, c) {\n return this.value(a, b, c);\n};\nStr.prototype.value = function(value) {\n if (typeof value === \"undefined\") {\n return this._value;\n }\n if (this._value === value) {\n return this;\n }\n this._value = value;\n if (value === null) {\n value = \"\";\n } else if (typeof value !== \"string\" && !Array.isArray(value)) {\n value = value.toString();\n }\n this._spacing = this._spacing || 0;\n var width = 0, height = 0;\n for (var i = 0; i < value.length; i++) {\n var texture2 = this._textures[i] = this._item(value[i]);\n width += i > 0 ? this._spacing : 0;\n texture2.dest(width, 0);\n width = width + texture2.width;\n height = Math.max(height, texture2.height);\n }\n this.pin(\"width\", width);\n this.pin(\"height\", height);\n this._textures.length = value.length;\n return this;\n};\nconst row = function(align) {\n return create().row(align).label(\"Row\");\n};\nNode.prototype.row = function(align) {\n this.align(\"row\", align);\n return this;\n};\nconst column = function(align) {\n return create().column(align).label(\"Row\");\n};\nNode.prototype.column = function(align) {\n this.align(\"column\", align);\n return this;\n};\nNode.prototype.align = function(type, align) {\n this._padding = this._padding || 0;\n this._spacing = this._spacing || 0;\n this.untick(this._layoutTiker);\n this.tick(this._layoutTiker = function() {\n if (this._mo_seq == this._ts_touch) {\n return;\n }\n this._mo_seq = this._ts_touch;\n var alignChildren = this._mo_seqAlign != this._ts_children;\n this._mo_seqAlign = this._ts_children;\n var width = 0, height = 0;\n var child, next = this.first(true);\n var first = true;\n while (child = next) {\n next = child.next(true);\n child.matrix(true);\n var w = child.pin(\"boxWidth\");\n var h = child.pin(\"boxHeight\");\n if (type == \"column\") {\n !first && (height += this._spacing);\n child.pin(\"offsetY\") != height && child.pin(\"offsetY\", height);\n width = Math.max(width, w);\n height = height + h;\n alignChildren && child.pin(\"alignX\", align);\n } else if (type == \"row\") {\n !first && (width += this._spacing);\n child.pin(\"offsetX\") != width && child.pin(\"offsetX\", width);\n width = width + w;\n height = Math.max(height, h);\n alignChildren && child.pin(\"alignY\", align);\n }\n first = false;\n }\n width += 2 * this._padding;\n height += 2 * this._padding;\n this.pin(\"width\") != width && this.pin(\"width\", width);\n this.pin(\"height\") != height && this.pin(\"height\", height);\n });\n return this;\n};\nconst box = function() {\n return create().box().label(\"Box\");\n};\nNode.prototype.box = function() {\n this._padding = this._padding || 0;\n this.untick(this._layoutTiker);\n this.tick(this._layoutTiker = function() {\n if (this._mo_box == this._ts_touch) {\n return;\n }\n this._mo_box = this._ts_touch;\n var width = 0, height = 0;\n var child, next = this.first(true);\n while (child = next) {\n next = child.next(true);\n child.matrix(true);\n var w = child.pin(\"boxWidth\");\n var h = child.pin(\"boxHeight\");\n width = Math.max(width, w);\n height = Math.max(height, h);\n }\n width += 2 * this._padding;\n height += 2 * this._padding;\n this.pin(\"width\") != width && this.pin(\"width\", width);\n this.pin(\"height\") != height && this.pin(\"height\", height);\n });\n return this;\n};\nconst layer = function() {\n return create().layer().label(\"Layer\");\n};\nNode.prototype.layer = function() {\n this.untick(this._layoutTiker);\n this.tick(this._layoutTiker = function() {\n var parent = this.parent();\n if (parent) {\n var width = parent.pin(\"width\");\n if (this.pin(\"width\") != width) {\n this.pin(\"width\", width);\n }\n var height = parent.pin(\"height\");\n if (this.pin(\"height\") != height) {\n this.pin(\"height\", height);\n }\n }\n }, true);\n return this;\n};\nNode.prototype.padding = function(pad) {\n this._padding = pad;\n return this;\n};\nNode.prototype.spacing = function(space) {\n this._spacing = space;\n return this;\n};\nconst Stage$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n Anim,\n Atlas,\n Image: Image$1,\n Math: math,\n Matrix,\n Mouse,\n Node,\n Pin,\n Root,\n Sprite,\n Str,\n Texture,\n Tween,\n anim,\n atlas,\n box,\n canvas,\n column,\n create,\n image,\n layer,\n math,\n memoizeDraw,\n mount,\n pause,\n resume,\n row,\n sprite,\n string: string$1,\n texture\n}, Symbol.toStringTag, { value: \"Module\" }));\nexport {\n Anim,\n Atlas,\n Image$1 as Image,\n math as Math,\n Matrix,\n Mouse,\n Node,\n Pin,\n Root,\n Sprite,\n Str,\n Texture,\n Tween,\n anim,\n atlas,\n box,\n canvas,\n column,\n create,\n Stage$1 as default,\n image,\n layer,\n math,\n memoizeDraw,\n mount,\n pause,\n resume,\n row,\n sprite,\n string$1 as string,\n texture\n};\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","export const options = function(input: T, defaults: object): T {\n if (input === null || typeof input === 'undefined') {\n // tslint:disable-next-line:no-object-literal-type-assertion\n input = {} as T;\n }\n\n const output = {...input};\n\n // tslint:disable-next-line:no-for-in\n for (const key in defaults) {\n if (defaults.hasOwnProperty(key) && typeof input[key] === 'undefined') {\n output[key] = defaults[key];\n }\n }\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n const symbols = Object.getOwnPropertySymbols(defaults);\n for (let i = 0; i < symbols.length; i++) {\n const symbol = symbols[i];\n if (defaults.propertyIsEnumerable(symbol) && typeof input[symbol] === 'undefined') {\n output[symbol] = defaults[symbol];\n }\n }\n }\n\n return output;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\nexport const math = Object.assign(Object.create(Math) as typeof Math, {\n EPSILON: 1e-9, // TODO\n\n /**\n * This function is used to ensure that a floating point number is not a NaN or\n * infinity.\n */\n isFinite: function(x: unknown): boolean {\n return (typeof x === 'number') && isFinite(x) && !isNaN(x);\n },\n\n assert: function(x: any): void {\n _ASSERT && console.assert(!math.isFinite(x), 'Invalid Number!', x);\n },\n\n /**\n * Next Largest Power of 2 Given a binary integer value x, the next largest\n * power of 2 can be computed by a SWAR algorithm that recursively \"folds\" the\n * upper bits into the lower bits. This process yields a bit vector with the\n * same most significant 1 as x, but all 1's below it. Adding 1 to that value\n * yields the next largest power of 2. For a 32-bit value:\n */\n nextPowerOfTwo: function(x: number): number {\n // TODO\n x |= (x >> 1);\n x |= (x >> 2);\n x |= (x >> 4);\n x |= (x >> 8);\n x |= (x >> 16);\n return x + 1;\n },\n\n isPowerOfTwo: function(x: number): boolean {\n return x > 0 && (x & (x - 1)) === 0;\n },\n\n mod: function(num: number, min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n if (max > min) {\n num = (num - min) % (max - min);\n return num + (num < 0 ? max : min);\n } else {\n num = (num - max) % (min - max);\n return num + (num <= 0 ? min : max);\n }\n },\n /**\n * Returns a min if num is less than min, and max if more than max, otherwise returns num.\n */\n clamp: function(num: number, min: number, max: number): number {\n if (num < min) {\n return min;\n } else if (num > max) {\n return max;\n } else {\n return num;\n }\n },\n /**\n * Returns a random number between min and max when two arguments are provided.\n * If one arg is provided between 0 to max.\n * If one arg is passed between 0 to 1.\n */\n random: function(min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n return min === max ? min : Math.random() * (max - min) + min;\n }\n});\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport interface Vec2Value {\n x: number;\n y: number;\n}\n\nexport class Vec2 {\n x: number;\n y: number;\n\n constructor(x: number, y: number);\n constructor(obj: { x: number, y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Vec2)) {\n return new Vec2(x, y);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n } else {\n this.x = x;\n this.y = y;\n }\n _ASSERT && Vec2.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = data.x;\n obj.y = data.y;\n return obj;\n }\n\n static zero(): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = 0;\n obj.y = 0;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = x;\n obj.y = y;\n return obj;\n }\n\n static clone(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(v.x, v.y);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Vec2.isValid(o), 'Invalid Vec2!', o);\n }\n\n clone(): Vec2 {\n return Vec2.clone(this);\n }\n\n /**\n * Set this vector to all zeros.\n *\n * @returns this\n */\n setZero(): Vec2 {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n set(x: number, y: number): Vec2;\n set(value: Vec2Value): Vec2;\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n // tslint:disable-next-line:typedef\n set(x, y?) {\n if (typeof x === 'object') {\n _ASSERT && Vec2.assert(x);\n this.x = x.x;\n this.y = x.y;\n } else {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n }\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setNum(x: number, y: number) {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setVec2(value: Vec2Value) {\n _ASSERT && Vec2.assert(value);\n this.x = value.x;\n this.y = value.y;\n\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use setCombine or setMul\n */\n wSet(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.setCombine(a, v, b, w);\n } else {\n return this.setMul(a, v);\n }\n }\n\n /**\n * Set linear combination of v and w: `a * v + b * w`\n */\n setCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x = x;\n this.y = y;\n return this;\n }\n\n setMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Add a vector to this vector.\n *\n * @returns this\n */\n add(w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x += w.x;\n this.y += w.y;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use addCombine or addMul\n */\n wAdd(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.addCombine(a, v, b, w);\n } else {\n return this.addMul(a, v);\n }\n }\n\n /**\n * Add linear combination of v and w: `a * v + b * w`\n */\n addCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x += x;\n this.y += y;\n return this;\n }\n\n addMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x += x;\n this.y += y;\n return this;\n }\n\n /**\n * @deprecated Use subCombine or subMul\n */\n wSub(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.subCombine(a, v, b, w);\n } else {\n return this.subMul(a, v);\n }}\n\n /**\n * Subtract linear combination of v and w: `a * v + b * w`\n */\n subCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n subMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n /**\n * Subtract a vector from this vector\n *\n * @returns this\n */\n sub(w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x -= w.x;\n this.y -= w.y;\n return this;\n }\n\n /**\n * Multiply this vector by a scalar.\n *\n * @returns this\n */\n mul(m: number): Vec2 {\n _ASSERT && Math.assert(m);\n this.x *= m;\n this.y *= m;\n return this;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n length(): number {\n return Vec2.lengthOf(this);\n }\n\n /**\n * Get the length squared.\n */\n lengthSquared(): number {\n return Vec2.lengthSquared(this);\n }\n\n /**\n * Convert this vector into a unit vector.\n *\n * @returns old length\n */\n normalize(): number {\n const length = this.length();\n if (length < Math.EPSILON) {\n return 0.0;\n }\n const invLength = 1.0 / length;\n this.x *= invLength;\n this.y *= invLength;\n return length;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n static lengthOf(v: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n return Math.sqrt(v.x * v.x + v.y * v.y);\n }\n\n /**\n * Get the length squared.\n */\n static lengthSquared(v: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n return v.x * v.x + v.y * v.y;\n }\n\n static distance(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n static distanceSquared(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return dx * dx + dy * dy;\n }\n\n static areEqual(v: Vec2Value, w: Vec2Value): boolean {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v === w || typeof w === 'object' && w !== null && v.x === w.x && v.y === w.y;\n }\n\n /**\n * Get the skew vector such that dot(skew_vec, other) == cross(vec, other)\n */\n static skew(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.y, v.x);\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.x + v.y * w.y;\n }\n\n static cross(v: Vec2Value, w: Vec2Value): number;\n static cross(v: Vec2Value, w: number): Vec2;\n static cross(v: number, w: Vec2Value): Vec2;\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n *\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n // tslint:disable-next-line:typedef\n static cross(v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n\n } else {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static crossVec2Vec2(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossVec2Num(v: Vec2Value, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossNumVec2(v: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n }\n\n static addCross(a: Vec2Value, v: Vec2Value, w: number): Vec2;\n static addCross(a: Vec2Value, v: number, w: Vec2Value): Vec2;\n /**\n * Returns `a + (v x w)`\n */\n // tslint:disable-next-line:typedef\n static addCross(a, v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n _ASSERT && console.assert(false);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossVec2Num(a: Vec2Value, v: Vec2Value, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossNumVec2(a: Vec2Value, v: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n static add(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x + w.x, v.y + w.y);\n }\n\n /** @internal @deprecated */\n static wAdd(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return Vec2.combine(a, v, b, w);\n } else {\n return Vec2.mulNumVec2(a, v);\n }\n }\n\n static combine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n return Vec2.zero().setCombine(a, v, b, w);\n }\n\n static sub(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x - w.x, v.y - w.y);\n }\n\n static mul(a: Vec2Value, b: number): Vec2;\n static mul(a: number, b: Vec2Value): Vec2;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (typeof a === 'object') {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n\n } else if (typeof b === 'object') {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n }\n\n static mulVec2Num(a: Vec2Value, b: number): Vec2 {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n }\n\n static mulNumVec2(a: number, b: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n\n neg(): Vec2 {\n this.x = -this.x;\n this.y = -this.y;\n return this;\n }\n\n static neg(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.x, -v.y);\n }\n\n static abs(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Math.abs(v.x), Math.abs(v.y));\n }\n\n static mid(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo((v.x + w.x) * 0.5, (v.y + w.y) * 0.5);\n }\n\n static upper(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.max(v.x, w.x), Math.max(v.y, w.y));\n }\n\n static lower(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.min(v.x, w.x), Math.min(v.y, w.y));\n }\n\n clamp(max: number): Vec2 {\n const lengthSqr = this.x * this.x + this.y * this.y;\n if (lengthSqr > max * max) {\n const scale = max / Math.sqrt(lengthSqr);\n this.x *= scale;\n this.y *= scale;\n }\n return this;\n }\n\n static clamp(v: Vec2Value, max: number): Vec2 {\n const r = Vec2.neo(v.x, v.y);\n r.clamp(max);\n return r;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static scaleFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x * x, v.y * y);\n };\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static translateFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x + x, v.y + y);\n };\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../common/Math';\nimport { Vec2, Vec2Value } from '../common/Vec2';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n */\nexport interface RayCastInput {\n p1: Vec2;\n p2: Vec2;\n maxFraction: number;\n}\n\nexport type RayCastCallback = (subInput: RayCastInput, id: number) => number;\n\n/**\n * Ray-cast output data. The ray hits at `p1 + fraction * (p2 - p1)`,\n * where `p1` and `p2` come from RayCastInput.\n */\nexport interface RayCastOutput {\n normal: Vec2;\n fraction: number;\n}\n\nexport class AABB {\n lowerBound: Vec2;\n upperBound: Vec2;\n\n constructor(lower?: Vec2Value, upper?: Vec2Value) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof AABB)) {\n return new AABB(lower, upper);\n }\n\n this.lowerBound = Vec2.zero();\n this.upperBound = Vec2.zero();\n\n if (typeof lower === 'object') {\n this.lowerBound.setVec2(lower);\n }\n if (typeof upper === 'object') {\n this.upperBound.setVec2(upper);\n } else if (typeof lower === 'object') {\n this.upperBound.setVec2(lower);\n }\n }\n\n /**\n * Verify that the bounds are sorted.\n */\n isValid(): boolean {\n return AABB.isValid(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.lowerBound) && Vec2.isValid(obj.upperBound) && Vec2.sub(obj.upperBound, obj.lowerBound).lengthSquared() >= 0;\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!AABB.isValid(o), 'Invalid AABB!', o);\n }\n\n /**\n * Get the center of the AABB.\n */\n getCenter(): Vec2 {\n return Vec2.neo((this.lowerBound.x + this.upperBound.x) * 0.5, (this.lowerBound.y + this.upperBound.y) * 0.5);\n }\n\n /**\n * Get the extents of the AABB (half-widths).\n */\n getExtents(): Vec2 {\n return Vec2.neo((this.upperBound.x - this.lowerBound.x) * 0.5, (this.upperBound.y - this.lowerBound.y) * 0.5);\n }\n\n /**\n * Get the perimeter length.\n */\n getPerimeter(): number {\n return 2.0 * (this.upperBound.x - this.lowerBound.x + this.upperBound.y - this.lowerBound.y);\n }\n\n /**\n * Combine one or two AABB into this one.\n */\n combine(a: AABB, b?: AABB): void {\n b = b || this;\n\n const lowerA = a.lowerBound;\n const upperA = a.upperBound;\n const lowerB = b.lowerBound;\n const upperB = b.upperBound;\n\n const lowerX = Math.min(lowerA.x, lowerB.x);\n const lowerY = Math.min(lowerA.y, lowerB.y);\n const upperX = Math.max(upperB.x, upperA.x);\n const upperY = Math.max(upperB.y, upperA.y);\n\n this.lowerBound.setNum(lowerX, lowerY);\n this.upperBound.setNum(upperX, upperY);\n }\n\n combinePoints(a: Vec2Value, b: Vec2Value): void {\n this.lowerBound.setNum(Math.min(a.x, b.x), Math.min(a.y, b.y));\n this.upperBound.setNum(Math.max(a.x, b.x), Math.max(a.y, b.y));\n }\n\n set(aabb: AABB): void {\n this.lowerBound.setNum(aabb.lowerBound.x, aabb.lowerBound.y);\n this.upperBound.setNum(aabb.upperBound.x, aabb.upperBound.y);\n }\n\n contains(aabb: AABB): boolean {\n let result = true;\n result = result && this.lowerBound.x <= aabb.lowerBound.x;\n result = result && this.lowerBound.y <= aabb.lowerBound.y;\n result = result && aabb.upperBound.x <= this.upperBound.x;\n result = result && aabb.upperBound.y <= this.upperBound.y;\n return result;\n }\n\n extend(value: number): AABB {\n AABB.extend(this, value);\n return this;\n }\n\n static extend(aabb: AABB, value: number): void {\n aabb.lowerBound.x -= value;\n aabb.lowerBound.y -= value;\n aabb.upperBound.x += value;\n aabb.upperBound.y += value;\n }\n\n static testOverlap(a: AABB, b: AABB): boolean {\n const d1x = b.lowerBound.x - a.upperBound.x;\n const d2x = a.lowerBound.x - b.upperBound.x;\n\n const d1y = b.lowerBound.y - a.upperBound.y;\n const d2y = a.lowerBound.y - b.upperBound.y;\n\n if (d1x > 0 || d1y > 0 || d2x > 0 || d2y > 0) {\n return false;\n }\n return true;\n }\n\n static areEqual(a: AABB, b: AABB): boolean {\n return Vec2.areEqual(a.lowerBound, b.lowerBound) && Vec2.areEqual(a.upperBound, b.upperBound);\n }\n\n static diff(a: AABB, b: AABB): number {\n const wD = Math.max(0, Math.min(a.upperBound.x, b.upperBound.x) - Math.max(b.lowerBound.x, a.lowerBound.x));\n const hD = Math.max(0, Math.min(a.upperBound.y, b.upperBound.y) - Math.max(b.lowerBound.y, a.lowerBound.y));\n\n const wA = a.upperBound.x - a.lowerBound.x;\n const hA = a.upperBound.y - a.lowerBound.y;\n\n const wB = b.upperBound.x - b.lowerBound.x;\n const hB = b.upperBound.y - b.lowerBound.y;\n\n return wA * hA + wB * hB - wD * hD;\n }\n\n rayCast(output: RayCastOutput, input: RayCastInput): boolean {\n // From Real-time Collision Detection, p179.\n\n let tmin = -Infinity;\n let tmax = Infinity;\n\n const p = input.p1;\n const d = Vec2.sub(input.p2, input.p1);\n const absD = Vec2.abs(d);\n\n const normal = Vec2.zero();\n\n for (let f: 'x' | 'y' = 'x'; f !== null; f = (f === 'x' ? 'y' : null)) {\n if (absD.x < Math.EPSILON) {\n // Parallel.\n if (p[f] < this.lowerBound[f] || this.upperBound[f] < p[f]) {\n return false;\n }\n } else {\n const inv_d = 1.0 / d[f];\n let t1 = (this.lowerBound[f] - p[f]) * inv_d;\n let t2 = (this.upperBound[f] - p[f]) * inv_d;\n\n // Sign of the normal vector.\n let s = -1.0;\n\n if (t1 > t2) {\n const temp = t1;\n t1 = t2;\n t2 = temp;\n s = 1.0;\n }\n\n // Push the min up\n if (t1 > tmin) {\n normal.setZero();\n normal[f] = s;\n tmin = t1;\n }\n\n // Pull the max down\n tmax = Math.min(tmax, t2);\n\n if (tmin > tmax) {\n return false;\n }\n }\n }\n\n // Does the ray start inside the box?\n // Does the ray intersect beyond the max fraction?\n if (tmin < 0.0 || input.maxFraction < tmin) {\n return false;\n }\n\n // Intersection.\n output.fraction = tmin;\n output.normal = normal;\n return true;\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n// TODO merge with World options?\n\n/**\n * Tuning constants based on meters-kilograms-seconds (MKS) units.\n */\n// tslint:disable-next-line:no-unnecessary-class\nexport class Settings {\n // Collision\n /**\n * The maximum number of contact points between two convex shapes. Do not change\n * this value.\n */\n static maxManifoldPoints: number = 2;\n\n /**\n * The maximum number of vertices on a convex polygon. You cannot increase this\n * too much because BlockAllocator has a maximum object size.\n */\n static maxPolygonVertices: number = 12;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This allows proxies to move\n * by a small amount without triggering a tree adjustment. This is in meters.\n */\n static aabbExtension: number = 0.1;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This is used to predict the\n * future position based on the current displacement. This is a dimensionless\n * multiplier.\n */\n static aabbMultiplier: number = 2.0;\n\n /**\n * A small length used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static linearSlop: number = 0.005;\n static get linearSlopSquared(): number { return Settings.linearSlop * Settings.linearSlop; }\n\n /**\n * A small angle used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static angularSlop: number = (2.0 / 180.0 * Math.PI);\n\n /**\n * The radius of the polygon/edge shape skin. This should not be modified.\n * Making this smaller means polygons will have an insufficient buffer for\n * continuous collision. Making it larger may create artifacts for vertex\n * collision.\n */\n static get polygonRadius(): number { return 2.0 * Settings.linearSlop; }\n\n /**\n * Maximum number of sub-steps per contact in continuous physics simulation.\n */\n static maxSubSteps: number = 8;\n\n// Dynamics\n\n /**\n * Maximum number of contacts to be handled to solve a TOI impact.\n */\n static maxTOIContacts: number = 32;\n\n /**\n * Maximum iterations to solve a TOI.\n */\n static maxTOIIterations: number = 20;\n\n /**\n * Maximum iterations to find Distance.\n */\n static maxDistnceIterations: number = 20;\n\n /**\n * A velocity threshold for elastic collisions. Any collision with a relative\n * linear velocity below this threshold will be treated as inelastic.\n */\n static velocityThreshold: number = 1.0;\n\n /**\n * The maximum linear position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxLinearCorrection: number = 0.2;\n\n /**\n * The maximum angular position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxAngularCorrection: number = (8.0 / 180.0 * Math.PI);\n\n /**\n * The maximum linear velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxTranslation: number = 2.0;\n static get maxTranslationSquared(): number { return Settings.maxTranslation * Settings.maxTranslation; }\n\n /**\n * The maximum angular velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxRotation: number = (0.5 * Math.PI);\n static get maxRotationSquared(): number { return Settings.maxRotation * Settings.maxRotation; }\n\n /**\n * This scale factor controls how fast overlap is resolved. Ideally this would\n * be 1 so that overlap is removed in one time step. However using values close\n * to 1 often lead to overshoot.\n */\n static baumgarte: number = 0.2;\n static toiBaugarte: number = 0.75;\n\n // Sleep\n\n /**\n * The time that a body must be still before it will go to sleep.\n */\n static timeToSleep: number = 0.5;\n\n /**\n * A body cannot sleep if its linear velocity is above this tolerance.\n */\n static linearSleepTolerance: number = 0.01;\n static get linearSleepToleranceSqr(): number { return Math.pow(Settings.linearSleepTolerance, 2); }\n\n /**\n * A body cannot sleep if its angular velocity is above this tolerance.\n */\n static angularSleepTolerance: number = (2.0 / 180.0 * Math.PI);\n static get angularSleepToleranceSqr(): number { return Math.pow(Settings.angularSleepTolerance, 2); }\n\n}\n","/*\n * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js\n *\n * This software is provided 'as-is', without any express or implied\n * warranty. In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * 1. The origin of this software must not be misrepresented; you must not\n * claim that you wrote the original software. If you use this software\n * in a product, an acknowledgment in the product documentation would be\n * appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n * misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n */\n\nexport class Pool {\n _list: T[] = [];\n _max: number = Infinity;\n\n _createFn: () => T;\n _outFn: (item: T) => void;\n _inFn: (item: T) => void;\n _discardFn: (item: T) => T;\n\n _createCount: number = 0;\n _outCount: number = 0;\n _inCount: number = 0;\n _discardCount: number = 0;\n\n constructor(opts: {\n max?: number,\n create?: () => T,\n allocate?: (item: T) => void,\n release?: (item: T) => void,\n discard?: (item: T) => T,\n }) {\n this._list = [];\n this._max = opts.max || this._max;\n\n this._createFn = opts.create;\n this._outFn = opts.allocate;\n this._inFn = opts.release;\n this._discardFn = opts.discard;\n }\n\n max(n?: number): number | Pool {\n if (typeof n === 'number') {\n this._max = n;\n return this;\n }\n return this._max;\n }\n\n size(): number {\n return this._list.length;\n }\n\n allocate(): T {\n let item: T;\n if (this._list.length > 0) {\n item = this._list.shift();\n } else {\n this._createCount++;\n if (typeof this._createFn === 'function') {\n item = this._createFn();\n } else {\n // tslint:disable-next-line:no-object-literal-type-assertion\n item = {} as T;\n }\n }\n this._outCount++;\n if (typeof this._outFn === 'function') {\n this._outFn(item);\n }\n return item;\n }\n\n release(item: T): void {\n if (this._list.length < this._max) {\n this._inCount++;\n if (typeof this._inFn === 'function') {\n this._inFn(item);\n }\n this._list.push(item);\n } else {\n this._discardCount++;\n if (typeof this._discardFn === 'function') {\n item = this._discardFn(item);\n }\n }\n }\n\n /** @internal */\n toString(): string {\n return \" +\" + this._createCount + \" >\" + this._outCount + \" <\" + this._inCount + \" -\"\n + this._discardCount + \" =\" + this._list.length + \"/\" + this._max;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { Pool } from '../util/Pool';\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { AABB, RayCastCallback, RayCastInput } from './AABB';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport type DynamicTreeQueryCallback = (nodeId: number) => boolean;\n\n/**\n * A node in the dynamic tree. The client does not interact with this directly.\n */\nexport class TreeNode {\n id: number;\n /** Enlarged AABB */\n aabb: AABB = new AABB();\n userData: T = null;\n parent: TreeNode = null;\n child1: TreeNode = null;\n child2: TreeNode = null;\n /** 0: leaf, -1: free node */\n height: number = -1;\n\n constructor(id?: number) {\n this.id = id;\n }\n\n /** @internal */\n toString(): string {\n return this.id + \": \" + this.userData;\n }\n\n isLeaf(): boolean {\n return this.child1 == null;\n }\n}\n\n/**\n * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A\n * dynamic tree arranges data in a binary tree to accelerate queries such as\n * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we\n * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger\n * than the client object. This allows the client object to move by small\n * amounts without triggering a tree update.\n *\n * Nodes are pooled and relocatable, so we use node indices rather than\n * pointers.\n */\nexport class DynamicTree {\n m_root: TreeNode;\n m_lastProxyId: number;\n m_nodes: {\n [id: number]: TreeNode\n };\n m_pool: Pool>;\n\n constructor() {\n this.m_root = null;\n this.m_nodes = {};\n this.m_lastProxyId = 0;\n\n this.m_pool = new Pool>({\n create(): TreeNode {\n return new TreeNode();\n }\n });\n }\n\n /**\n * Get proxy user data.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getUserData(id: number): T {\n const node = this.m_nodes[id];\n _ASSERT && console.assert(!!node);\n return node.userData;\n }\n\n /**\n * Get the fat AABB for a node id.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getFatAABB(id: number): AABB {\n const node = this.m_nodes[id];\n _ASSERT && console.assert(!!node);\n return node.aabb;\n }\n\n allocateNode(): TreeNode {\n const node = this.m_pool.allocate();\n node.id = ++this.m_lastProxyId;\n node.userData = null;\n node.parent = null;\n node.child1 = null;\n node.child2 = null;\n node.height = -1;\n this.m_nodes[node.id] = node;\n return node;\n }\n\n freeNode(node: TreeNode): void {\n this.m_pool.release(node);\n node.height = -1;\n // tslint:disable-next-line:no-dynamic-delete\n delete this.m_nodes[node.id];\n }\n\n /**\n * Create a proxy in the tree as a leaf node. We return the index of the node\n * instead of a pointer so that we can grow the node pool.\n *\n * Create a proxy. Provide a tight fitting AABB and a userData pointer.\n */\n createProxy(aabb: AABB, userData: T): number {\n _ASSERT && console.assert(AABB.isValid(aabb));\n\n const node = this.allocateNode();\n\n node.aabb.set(aabb);\n\n // Fatten the aabb.\n AABB.extend(node.aabb, Settings.aabbExtension);\n\n node.userData = userData;\n node.height = 0;\n\n this.insertLeaf(node);\n\n return node.id;\n }\n\n /**\n * Destroy a proxy. This asserts if the id is invalid.\n */\n destroyProxy(id: number): void {\n const node = this.m_nodes[id];\n\n _ASSERT && console.assert(!!node);\n _ASSERT && console.assert(node.isLeaf());\n\n this.removeLeaf(node);\n this.freeNode(node);\n }\n\n /**\n * Move a proxy with a swepted AABB. If the proxy has moved outside of its\n * fattened AABB, then the proxy is removed from the tree and re-inserted.\n * Otherwise the function returns immediately.\n *\n * @param d Displacement\n *\n * @return true if the proxy was re-inserted.\n */\n moveProxy(id: number, aabb: AABB, d: Vec2): boolean {\n _ASSERT && console.assert(AABB.isValid(aabb));\n _ASSERT && console.assert(!d || Vec2.isValid(d));\n\n const node = this.m_nodes[id];\n\n _ASSERT && console.assert(!!node);\n _ASSERT && console.assert(node.isLeaf());\n\n if (node.aabb.contains(aabb)) {\n return false;\n }\n\n this.removeLeaf(node);\n\n node.aabb.set(aabb);\n\n // Extend AABB.\n aabb = node.aabb;\n AABB.extend(aabb, Settings.aabbExtension);\n\n // Predict AABB displacement.\n // const d = Vec2.mul(Settings.aabbMultiplier, displacement);\n\n if (d.x < 0.0) {\n aabb.lowerBound.x += d.x * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.x += d.x * Settings.aabbMultiplier;\n }\n\n if (d.y < 0.0) {\n aabb.lowerBound.y += d.y * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.y += d.y * Settings.aabbMultiplier;\n }\n\n this.insertLeaf(node);\n\n return true;\n }\n\n insertLeaf(leaf: TreeNode): void {\n _ASSERT && console.assert(AABB.isValid(leaf.aabb));\n\n if (this.m_root == null) {\n this.m_root = leaf;\n this.m_root.parent = null;\n return;\n }\n\n // Find the best sibling for this node\n const leafAABB = leaf.aabb;\n let index = this.m_root;\n while (!index.isLeaf()) {\n const child1 = index.child1;\n const child2 = index.child2;\n\n const area = index.aabb.getPerimeter();\n\n const combinedAABB = new AABB();\n combinedAABB.combine(index.aabb, leafAABB);\n const combinedArea = combinedAABB.getPerimeter();\n\n // Cost of creating a new parent for this node and the new leaf\n const cost = 2.0 * combinedArea;\n\n // Minimum cost of pushing the leaf further down the tree\n const inheritanceCost = 2.0 * (combinedArea - area);\n\n // Cost of descending into child1\n let cost1;\n if (child1.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n cost1 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n const oldArea = child1.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost1 = (newArea - oldArea) + inheritanceCost;\n }\n\n // Cost of descending into child2\n let cost2;\n if (child2.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n cost2 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n const oldArea = child2.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost2 = newArea - oldArea + inheritanceCost;\n }\n\n // Descend according to the minimum cost.\n if (cost < cost1 && cost < cost2) {\n break;\n }\n\n // Descend\n if (cost1 < cost2) {\n index = child1;\n } else {\n index = child2;\n }\n }\n\n const sibling = index;\n\n // Create a new parent.\n const oldParent = sibling.parent;\n const newParent = this.allocateNode();\n newParent.parent = oldParent;\n newParent.userData = null;\n newParent.aabb.combine(leafAABB, sibling.aabb);\n newParent.height = sibling.height + 1;\n\n if (oldParent != null) {\n // The sibling was not the root.\n if (oldParent.child1 === sibling) {\n oldParent.child1 = newParent;\n } else {\n oldParent.child2 = newParent;\n }\n\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n } else {\n // The sibling was the root.\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n this.m_root = newParent;\n }\n\n // Walk back up the tree fixing heights and AABBs\n index = leaf.parent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n _ASSERT && console.assert(child1 != null);\n _ASSERT && console.assert(child2 != null);\n\n index.height = 1 + Math.max(child1.height, child2.height);\n index.aabb.combine(child1.aabb, child2.aabb);\n\n index = index.parent;\n }\n\n // validate();\n }\n\n removeLeaf(leaf: TreeNode): void {\n if (leaf === this.m_root) {\n this.m_root = null;\n return;\n }\n\n const parent = leaf.parent;\n const grandParent = parent.parent;\n let sibling;\n if (parent.child1 === leaf) {\n sibling = parent.child2;\n } else {\n sibling = parent.child1;\n }\n\n if (grandParent != null) {\n // Destroy parent and connect sibling to grandParent.\n if (grandParent.child1 === parent) {\n grandParent.child1 = sibling;\n } else {\n grandParent.child2 = sibling;\n }\n sibling.parent = grandParent;\n this.freeNode(parent);\n\n // Adjust ancestor bounds.\n let index = grandParent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n index.aabb.combine(child1.aabb, child2.aabb);\n index.height = 1 + Math.max(child1.height, child2.height);\n\n index = index.parent;\n }\n } else {\n this.m_root = sibling;\n sibling.parent = null;\n this.freeNode(parent);\n }\n\n // validate();\n }\n\n /**\n * Perform a left or right rotation if node A is imbalanced. Returns the new\n * root index.\n */\n balance(iA: TreeNode): TreeNode {\n _ASSERT && console.assert(iA != null);\n\n const A = iA;\n if (A.isLeaf() || A.height < 2) {\n return iA;\n }\n\n const B = A.child1;\n const C = A.child2;\n\n const balance = C.height - B.height;\n\n // Rotate C up\n if (balance > 1) {\n const F = C.child1;\n const G = C.child2;\n\n // Swap A and C\n C.child1 = A;\n C.parent = A.parent;\n A.parent = C;\n\n // A's old parent should point to C\n if (C.parent != null) {\n if (C.parent.child1 === iA) {\n C.parent.child1 = C;\n } else {\n C.parent.child2 = C;\n }\n } else {\n this.m_root = C;\n }\n\n // Rotate\n if (F.height > G.height) {\n C.child2 = F;\n A.child2 = G;\n G.parent = A;\n A.aabb.combine(B.aabb, G.aabb);\n C.aabb.combine(A.aabb, F.aabb);\n\n A.height = 1 + Math.max(B.height, G.height);\n C.height = 1 + Math.max(A.height, F.height);\n } else {\n C.child2 = G;\n A.child2 = F;\n F.parent = A;\n A.aabb.combine(B.aabb, F.aabb);\n C.aabb.combine(A.aabb, G.aabb);\n\n A.height = 1 + Math.max(B.height, F.height);\n C.height = 1 + Math.max(A.height, G.height);\n }\n\n return C;\n }\n\n // Rotate B up\n if (balance < -1) {\n const D = B.child1;\n const E = B.child2;\n\n // Swap A and B\n B.child1 = A;\n B.parent = A.parent;\n A.parent = B;\n\n // A's old parent should point to B\n if (B.parent != null) {\n if (B.parent.child1 === A) {\n B.parent.child1 = B;\n } else {\n B.parent.child2 = B;\n }\n } else {\n this.m_root = B;\n }\n\n // Rotate\n if (D.height > E.height) {\n B.child2 = D;\n A.child1 = E;\n E.parent = A;\n A.aabb.combine(C.aabb, E.aabb);\n B.aabb.combine(A.aabb, D.aabb);\n\n A.height = 1 + Math.max(C.height, E.height);\n B.height = 1 + Math.max(A.height, D.height);\n } else {\n B.child2 = E;\n A.child1 = D;\n D.parent = A;\n A.aabb.combine(C.aabb, D.aabb);\n B.aabb.combine(A.aabb, E.aabb);\n\n A.height = 1 + Math.max(C.height, D.height);\n B.height = 1 + Math.max(A.height, E.height);\n }\n\n return B;\n }\n\n return A;\n }\n\n /**\n * Compute the height of the binary tree in O(N) time. Should not be called\n * often.\n */\n getHeight(): number {\n if (this.m_root == null) {\n return 0;\n }\n\n return this.m_root.height;\n }\n\n /**\n * Get the ratio of the sum of the node areas to the root area.\n */\n getAreaRatio(): number {\n if (this.m_root == null) {\n return 0.0;\n }\n\n const root = this.m_root;\n const rootArea = root.aabb.getPerimeter();\n\n let totalArea = 0.0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // Free node in pool\n continue;\n }\n\n totalArea += node.aabb.getPerimeter();\n }\n\n this.iteratorPool.release(it);\n\n return totalArea / rootArea;\n }\n\n /**\n * Compute the height of a sub-tree.\n */\n computeHeight(id?: number): number {\n let node;\n if (typeof id !== 'undefined') {\n node = this.m_nodes[id];\n } else {\n node = this.m_root;\n }\n\n // _ASSERT && console.assert(0 <= id && id < this.m_nodeCapacity);\n\n if (node.isLeaf()) {\n return 0;\n }\n\n const height1 = this.computeHeight(node.child1.id);\n const height2 = this.computeHeight(node.child2.id);\n return 1 + Math.max(height1, height2);\n }\n\n validateStructure(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n if (node === this.m_root) {\n _ASSERT && console.assert(node.parent == null);\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && console.assert(child1 == null);\n _ASSERT && console.assert(child2 == null);\n _ASSERT && console.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && console.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && console.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n _ASSERT && console.assert(child1.parent === node);\n _ASSERT && console.assert(child2.parent === node);\n\n this.validateStructure(child1);\n this.validateStructure(child2);\n }\n\n validateMetrics(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && console.assert(child1 == null);\n _ASSERT && console.assert(child2 == null);\n _ASSERT && console.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && console.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && console.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n const height1 = child1.height;\n const height2 = child2.height;\n const height = 1 + Math.max(height1, height2);\n _ASSERT && console.assert(node.height === height);\n\n const aabb = new AABB();\n aabb.combine(child1.aabb, child2.aabb);\n\n _ASSERT && console.assert(AABB.areEqual(aabb, node.aabb));\n\n this.validateMetrics(child1);\n this.validateMetrics(child2);\n }\n\n /**\n * Validate this tree. For testing.\n */\n validate(): void {\n this.validateStructure(this.m_root);\n this.validateMetrics(this.m_root);\n _ASSERT && console.assert(this.getHeight() === this.computeHeight());\n }\n\n /**\n * Get the maximum balance of an node in the tree. The balance is the difference\n * in height of the two children of a node.\n */\n getMaxBalance(): number {\n let maxBalance = 0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height <= 1) {\n continue;\n }\n\n _ASSERT && console.assert(!node.isLeaf());\n\n const balance = Math.abs(node.child2.height - node.child1.height);\n maxBalance = Math.max(maxBalance, balance);\n }\n this.iteratorPool.release(it);\n\n return maxBalance;\n }\n\n /**\n * Build an optimal tree. Very expensive. For testing.\n */\n rebuildBottomUp(): void {\n const nodes = [];\n let count = 0;\n\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // free node in pool\n continue;\n }\n\n if (node.isLeaf()) {\n node.parent = null;\n nodes[count] = node;\n ++count;\n } else {\n this.freeNode(node);\n }\n }\n this.iteratorPool.release(it);\n\n while (count > 1) {\n let minCost = Infinity;\n let iMin = -1;\n let jMin = -1;\n for (let i = 0; i < count; ++i) {\n const aabbi = nodes[i].aabb;\n for (let j = i + 1; j < count; ++j) {\n const aabbj = nodes[j].aabb;\n const b = new AABB();\n b.combine(aabbi, aabbj);\n const cost = b.getPerimeter();\n if (cost < minCost) {\n iMin = i;\n jMin = j;\n minCost = cost;\n }\n }\n }\n\n const child1 = nodes[iMin];\n const child2 = nodes[jMin];\n\n const parent = this.allocateNode();\n parent.child1 = child1;\n parent.child2 = child2;\n parent.height = 1 + Math.max(child1.height, child2.height);\n parent.aabb.combine(child1.aabb, child2.aabb);\n parent.parent = null;\n\n child1.parent = parent;\n child2.parent = parent;\n\n nodes[jMin] = nodes[count - 1];\n nodes[iMin] = parent;\n --count;\n }\n\n this.m_root = nodes[0];\n\n _ASSERT && this.validate();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n const aabb = node.aabb;\n aabb.lowerBound.x -= newOrigin.x;\n aabb.lowerBound.y -= newOrigin.y;\n aabb.upperBound.x -= newOrigin.x;\n aabb.upperBound.y -= newOrigin.y;\n }\n this.iteratorPool.release(it);\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query(aabb: AABB, queryCallback: DynamicTreeQueryCallback): void {\n _ASSERT && console.assert(typeof queryCallback === 'function');\n const stack = this.stackPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, aabb)) {\n if (node.isLeaf()) {\n const proceed = queryCallback(node.id);\n if (proceed === false) {\n return;\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n }\n\n this.stackPool.release(stack);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n // TODO: GC\n _ASSERT && console.assert(typeof rayCastCallback === 'function');\n const p1 = input.p1;\n const p2 = input.p2;\n const r = Vec2.sub(p2, p1);\n _ASSERT && console.assert(r.lengthSquared() > 0.0);\n r.normalize();\n\n // v is perpendicular to the segment.\n const v = Vec2.crossNumVec2(1.0, r);\n const abs_v = Vec2.abs(v);\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n\n let maxFraction = input.maxFraction;\n\n // Build a bounding box for the segment.\n const segmentAABB = new AABB();\n let t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n\n const stack = this.stackPool.allocate();\n const subInput = this.inputPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, segmentAABB) === false) {\n continue;\n }\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n const c = node.aabb.getCenter();\n const h = node.aabb.getExtents();\n const separation = Math.abs(Vec2.dot(v, Vec2.sub(p1, c))) - Vec2.dot(abs_v, h);\n if (separation > 0.0) {\n continue;\n }\n\n if (node.isLeaf()) {\n subInput.p1 = Vec2.clone(input.p1);\n subInput.p2 = Vec2.clone(input.p2);\n subInput.maxFraction = maxFraction;\n\n const value = rayCastCallback(subInput, node.id);\n\n if (value === 0.0) {\n // The client has terminated the ray cast.\n return;\n }\n\n if (value > 0.0) {\n // update segment bounding box.\n maxFraction = value;\n t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n this.stackPool.release(stack);\n this.inputPool.release(subInput);\n }\n\n private inputPool: Pool = new Pool({\n create(): RayCastInput {\n // tslint:disable-next-line:no-object-literal-type-assertion\n return {} as RayCastInput;\n },\n release(stack: RayCastInput): void {\n }\n });\n\n private stackPool: Pool>> = new Pool>>({\n create(): Array> {\n return [];\n },\n release(stack: Array>): void {\n stack.length = 0;\n }\n });\n\n private iteratorPool: Pool> = new Pool>({\n create(): Iterator {\n return new Iterator();\n },\n release(iterator: Iterator): void {\n iterator.close();\n }\n });\n\n}\n\nclass Iterator {\n parents: Array> = [];\n states: number[] = [];\n preorder(root: TreeNode): Iterator {\n this.parents.length = 0;\n this.parents.push(root);\n this.states.length = 0;\n this.states.push(0);\n return this;\n }\n next(): TreeNode {\n while (this.parents.length > 0) {\n const i = this.parents.length - 1;\n const node = this.parents[i];\n if (this.states[i] === 0) {\n this.states[i] = 1;\n return node;\n }\n if (this.states[i] === 1) {\n this.states[i] = 2;\n if (node.child1) {\n this.parents.push(node.child1);\n this.states.push(1);\n return node.child1;\n }\n }\n if (this.states[i] === 2) {\n this.states[i] = 3;\n if (node.child2) {\n this.parents.push(node.child2);\n this.states.push(1);\n return node.child2;\n }\n }\n this.parents.pop();\n this.states.pop();\n }\n }\n close(): void {\n this.parents.length = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { AABB, RayCastCallback, RayCastInput } from './AABB';\nimport { DynamicTree, DynamicTreeQueryCallback } from './DynamicTree';\nimport { FixtureProxy } from \"../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * The broad-phase wraps and extends a dynamic-tree to keep track of moved\n * objects and query them on update.\n */\nexport class BroadPhase {\n m_tree: DynamicTree = new DynamicTree();\n m_proxyCount: number = 0;\n m_moveBuffer: number[] = [];\n\n m_callback: (userDataA: any, userDataB: any) => void;\n m_queryProxyId: number;\n\n /**\n * Get user data from a proxy. Returns null if the id is invalid.\n */\n getUserData(proxyId: number): FixtureProxy {\n return this.m_tree.getUserData(proxyId);\n }\n\n /**\n * Test overlap of fat AABBs.\n */\n testOverlap(proxyIdA: number, proxyIdB: number): boolean {\n const aabbA = this.m_tree.getFatAABB(proxyIdA);\n const aabbB = this.m_tree.getFatAABB(proxyIdB);\n return AABB.testOverlap(aabbA, aabbB);\n }\n\n /**\n * Get the fat AABB for a proxy.\n */\n getFatAABB(proxyId: number): AABB {\n return this.m_tree.getFatAABB(proxyId);\n }\n\n /**\n * Get the number of proxies.\n */\n getProxyCount(): number {\n return this.m_proxyCount;\n }\n\n /**\n * Get the height of the embedded tree.\n */\n getTreeHeight(): number {\n return this.m_tree.getHeight();\n }\n\n /**\n * Get the balance (integer) of the embedded tree.\n */\n getTreeBalance(): number {\n return this.m_tree.getMaxBalance();\n }\n\n /**\n * Get the quality metric of the embedded tree.\n */\n getTreeQuality(): number {\n return this.m_tree.getAreaRatio();\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query = (aabb: AABB, queryCallback: DynamicTreeQueryCallback): void => {\n this.m_tree.query(aabb, queryCallback);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n this.m_tree.rayCast(input, rayCastCallback);\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_tree.shiftOrigin(newOrigin);\n }\n\n /**\n * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs\n * is called.\n */\n createProxy(aabb: AABB, userData: FixtureProxy): number {\n _ASSERT && console.assert(AABB.isValid(aabb));\n const proxyId = this.m_tree.createProxy(aabb, userData);\n this.m_proxyCount++;\n this.bufferMove(proxyId);\n return proxyId;\n }\n\n /**\n * Destroy a proxy. It is up to the client to remove any pairs.\n */\n destroyProxy(proxyId: number): void {\n this.unbufferMove(proxyId);\n this.m_proxyCount--;\n this.m_tree.destroyProxy(proxyId);\n }\n\n /**\n * Call moveProxy as many times as you like, then when you are done call\n * UpdatePairs to finalized the proxy pairs (for your time step).\n */\n moveProxy(proxyId: number, aabb: AABB, displacement: Vec2): void {\n _ASSERT && console.assert(AABB.isValid(aabb));\n const changed = this.m_tree.moveProxy(proxyId, aabb, displacement);\n if (changed) {\n this.bufferMove(proxyId);\n }\n }\n\n /**\n * Call to trigger a re-processing of it's pairs on the next call to\n * UpdatePairs.\n */\n touchProxy(proxyId: number): void {\n this.bufferMove(proxyId);\n }\n\n bufferMove(proxyId: number): void {\n this.m_moveBuffer.push(proxyId);\n }\n\n unbufferMove(proxyId: number): void {\n for (let i = 0; i < this.m_moveBuffer.length; ++i) {\n if (this.m_moveBuffer[i] === proxyId) {\n this.m_moveBuffer[i] = null;\n }\n }\n }\n\n /**\n * Update the pairs. This results in pair callbacks. This can only add pairs.\n */\n updatePairs(addPairCallback: (userDataA: FixtureProxy, userDataB: FixtureProxy) => void): void {\n _ASSERT && console.assert(typeof addPairCallback === 'function');\n this.m_callback = addPairCallback;\n\n // Perform tree queries for all moving proxies.\n while (this.m_moveBuffer.length > 0) {\n this.m_queryProxyId = this.m_moveBuffer.pop();\n if (this.m_queryProxyId === null) {\n continue;\n }\n\n // We have to query the tree with the fat AABB so that\n // we don't fail to create a pair that may touch later.\n const fatAABB = this.m_tree.getFatAABB(this.m_queryProxyId);\n\n // Query tree, create pairs and add them pair buffer.\n this.m_tree.query(fatAABB, this.queryCallback);\n }\n\n // Try to keep the tree balanced.\n // this.m_tree.rebalance(4);\n }\n\n queryCallback = (proxyId: number): boolean => {\n // A proxy cannot form a pair with itself.\n if (proxyId === this.m_queryProxyId) {\n return true;\n }\n\n const proxyIdA = Math.min(proxyId, this.m_queryProxyId);\n const proxyIdB = Math.max(proxyId, this.m_queryProxyId);\n\n // TODO: Skip any duplicate pairs.\n\n const userDataA = this.m_tree.getUserData(proxyIdA);\n const userDataB = this.m_tree.getUserData(proxyIdB);\n\n // Send the pairs back to the client.\n this.m_callback(userDataA, userDataB);\n\n return true;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2, Vec2Value } from './Vec2';\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class Rot {\n s: number;\n c: number;\n\n /** Initialize from an angle in radians. */\n constructor(angle?: number | Rot) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Rot)) {\n return new Rot(angle);\n }\n if (typeof angle === 'number') {\n this.setAngle(angle);\n } else if (typeof angle === 'object') {\n this.setRot(angle);\n } else {\n this.setIdentity();\n }\n }\n\n /** @internal */\n static neo(angle: number): Rot {\n const obj = Object.create(Rot.prototype);\n obj.setAngle(angle);\n return obj;\n }\n\n static clone(rot: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n const obj = Object.create(Rot.prototype);\n obj.s = rot.s;\n obj.c = rot.c;\n return obj;\n }\n\n static identity(): Rot {\n const obj = Object.create(Rot.prototype);\n obj.s = 0.0;\n obj.c = 1.0;\n return obj;\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.s) && Math.isFinite(obj.c);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Rot.isValid(o), 'Invalid Rot!', o);\n }\n\n /** Set to the identity rotation. */\n setIdentity(): void {\n this.s = 0.0;\n this.c = 1.0;\n }\n\n set(angle: number | Rot): void {\n if (typeof angle === 'object') {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n\n } else {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n }\n\n setRot(angle: Rot): void {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n }\n\n /** Set using an angle in radians. */\n setAngle(angle: number): void {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n\n /** Get the angle in radians. */\n getAngle(): number {\n return Math.atan2(this.s, this.c);\n }\n\n /** Get the x-axis. */\n getXAxis(): Vec2 {\n return Vec2.neo(this.c, this.s);\n }\n\n /** Get the u-axis. */\n getYAxis(): Vec2 {\n return Vec2.neo(-this.s, this.c);\n }\n\n /** Multiply two rotations: q * r */\n static mul(rot: Rot, m: Rot): Rot;\n /** Rotate a vector */\n static mul(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(rot, m) {\n _ASSERT && Rot.assert(rot);\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Multiply two rotations: q * r */\n static mulRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n }\n\n /** Rotate a vector */\n static mulVec2(rot: Rot, m: Vec2): Vec2 {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n\n static mulSub(rot: Rot, v: Vec2, w: Vec2): Vec2 {\n const x = rot.c * (v.x - w.x) - rot.s * (v.y - w.y);\n const y = rot.s * (v.x - w.x) + rot.c * (v.y - w.y);\n return Vec2.neo(x, y);\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulT(rot: Rot, m: Rot): Rot;\n /** Inverse rotate a vector */\n static mulT(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(rot, m) {\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulTRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n }\n\n /** Inverse rotate a vector */\n static mulTVec2(rot: Rot, m: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2, Vec2Value } from './Vec2';\nimport { Rot } from './Rot';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A transform contains translation and rotation. It is used to represent the\n * position and orientation of rigid frames. Initialize using a position vector\n * and a rotation.\n */\nexport class Transform {\n /** position */\n p: Vec2;\n\n /** rotation */\n q: Rot;\n\n constructor(position?: Vec2Value, rotation?: number) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Transform)) {\n return new Transform(position, rotation);\n }\n this.p = Vec2.zero();\n this.q = Rot.identity();\n if (typeof position !== 'undefined') {\n this.p.setVec2(position);\n }\n if (typeof rotation !== 'undefined') {\n this.q.setAngle(rotation);\n }\n }\n\n static clone(xf: Transform): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(xf.p);\n obj.q = Rot.clone(xf.q);\n return obj;\n }\n\n /** @internal */\n static neo(position: Vec2, rotation: Rot): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(position);\n obj.q = Rot.clone(rotation);\n return obj;\n }\n\n static identity(): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.zero();\n obj.q = Rot.identity();\n return obj;\n }\n\n /**\n * Set this to the identity transform.\n */\n setIdentity(): void {\n this.p.setZero();\n this.q.setIdentity();\n }\n\n set(position: Vec2, rotation: number): void;\n set(xf: Transform): void;\n /**\n * Set this based on the position and angle.\n */\n // tslint:disable-next-line:typedef\n set(a, b?) {\n if (typeof b === 'undefined') {\n this.p.set(a.p);\n this.q.set(a.q);\n } else {\n this.p.set(a);\n this.q.set(b);\n }\n }\n\n /**\n * Set this based on the position and angle.\n */\n setNum(position: Vec2, rotation: number) {\n this.p.setVec2(position);\n this.q.setAngle(rotation);\n }\n\n setTransform(xf: Transform): void {\n this.p.setVec2(xf.p);\n this.q.setRot(xf.q);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.p) && Rot.isValid(obj.q);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Transform.isValid(o), 'Invalid Transform!', o);\n }\n\n static mul(a: Transform, b: Vec2Value): Vec2;\n static mul(a: Transform, b: Transform): Transform;\n // static mul(a: Transform, b: Vec2Value[]): Vec2[];\n // static mul(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (Array.isArray(b)) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n\n } else if ('x' in b && 'y' in b) {\n return Transform.mulVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulXf(a, b);\n }\n }\n\n static mulAll(a: Transform, b: Vec2Value[]): Vec2[];\n static mulAll(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mulAll(a: Transform, b) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static mulFn(a: Transform) {\n _ASSERT && Transform.assert(a);\n return function(b: Vec2Value): Vec2 {\n return Transform.mul(a, b);\n };\n }\n\n static mulVec2(a: Transform, b: Vec2Value): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = (a.q.c * b.x - a.q.s * b.y) + a.p.x;\n const y = (a.q.s * b.x + a.q.c * b.y) + a.p.y;\n return Vec2.neo(x, y);\n }\n\n static mulXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p\n // = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p\n const xf = Transform.identity();\n xf.q = Rot.mulRot(a.q, b.q);\n xf.p = Vec2.add(Rot.mulVec2(a.q, b.p), a.p);\n return xf;\n }\n\n static mulT(a: Transform, b: Vec2Value): Vec2;\n static mulT(a: Transform, b: Transform): Transform;\n // tslint:disable-next-line:typedef\n static mulT(a, b) {\n if ('x' in b && 'y' in b) {\n return Transform.mulTVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulTXf(a, b);\n }\n }\n\n static mulTVec2(a: Transform, b: Vec2Value): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const px = b.x - a.p.x;\n const py = b.y - a.p.y;\n const x = (a.q.c * px + a.q.s * py);\n const y = (-a.q.s * px + a.q.c * py);\n return Vec2.neo(x, y);\n }\n\n static mulTXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q' * (B.q * v1 + B.p - A.p)\n // = A.q' * B.q * v1 + A.q' * (B.p - A.p)\n const xf = Transform.identity();\n xf.q.setRot(Rot.mulTRot(a.q, b.q));\n xf.p.setVec2(Rot.mulTVec2(a.q, Vec2.sub(b.p, a.p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\nimport { Vec2 } from './Vec2';\nimport { Rot } from './Rot';\nimport { Transform } from './Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * This describes the motion of a body/shape for TOI computation. Shapes are\n * defined with respect to the body origin, which may not coincide with the\n * center of mass. However, to support dynamics we must interpolate the center\n * of mass position.\n */\nexport class Sweep {\n /** Local center of mass position */\n localCenter: Vec2;\n\n /** World center position */\n c: Vec2;\n\n /** World angle */\n a: number;\n\n /** Fraction of the current time step in the range [0,1], c0 and a0 are c and a at alpha0. */\n alpha0: number;\n\n c0: Vec2;\n a0: number;\n\n constructor(c?: Vec2, a?: number) {\n _ASSERT && console.assert(typeof c === 'undefined');\n _ASSERT && console.assert(typeof a === 'undefined');\n this.localCenter = Vec2.zero();\n this.c = Vec2.zero();\n this.a = 0;\n this.alpha0 = 0;\n this.c0 = Vec2.zero();\n this.a0 = 0;\n }\n\n setTransform(xf: Transform): void {\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n\n this.a = xf.q.getAngle();\n this.a0 = xf.q.getAngle();\n }\n\n setLocalCenter(localCenter: Vec2, xf: Transform): void {\n this.localCenter.setVec2(localCenter);\n\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n }\n\n /**\n * Get the interpolated transform at a specific time.\n *\n * @param xf\n * @param beta A factor in [0,1], where 0 indicates alpha0\n */\n getTransform(xf: Transform, beta: number = 0): void {\n xf.q.setAngle((1.0 - beta) * this.a0 + beta * this.a);\n xf.p.setCombine((1.0 - beta), this.c0, beta, this.c);\n\n // shift to origin\n xf.p.sub(Rot.mulVec2(xf.q, this.localCenter));\n }\n\n /**\n * Advance the sweep forward, yielding a new initial state.\n *\n * @param alpha The new initial time\n */\n advance(alpha: number): void {\n _ASSERT && console.assert(this.alpha0 < 1.0);\n const beta = (alpha - this.alpha0) / (1.0 - this.alpha0);\n this.c0.setCombine(beta, this.c, 1 - beta, this.c0);\n this.a0 = beta * this.a + (1 - beta) * this.a0;\n this.alpha0 = alpha;\n }\n\n forward(): void {\n this.a0 = this.a;\n this.c0.setVec2(this.c);\n }\n\n /**\n * normalize the angles in radians to be between -pi and pi.\n */\n normalize(): void {\n const a0 = Math.mod(this.a0, -Math.PI, +Math.PI);\n this.a -= this.a0 - a0;\n this.a0 = a0;\n }\n\n clone(): Sweep {\n const clone = new Sweep();\n clone.localCenter.setVec2(this.localCenter);\n clone.alpha0 = this.alpha0;\n clone.a0 = this.a0;\n clone.a = this.a;\n clone.c0.setVec2(this.c0);\n clone.c.setVec2(this.c);\n return clone;\n }\n\n set(that: Sweep): void {\n this.localCenter.setVec2(that.localCenter);\n this.alpha0 = that.alpha0;\n this.a0 = that.a0;\n this.a = that.a;\n this.c0.setVec2(that.c0);\n this.c.setVec2(that.c);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\n\nexport class Velocity {\n /** linear */\n v: Vec2;\n\n /** angular */\n w: number;\n\n constructor() {\n this.v = Vec2.zero();\n this.w = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Transform } from '../common/Transform';\n\n\nexport class Position {\n /** location */\n c: Vec2;\n\n /** angle */\n a: number;\n\n constructor() {\n this.c = Vec2.zero();\n this.a = 0;\n }\n\n getTransform(xf: Transform, p: Vec2): Transform {\n xf.q.setAngle(this.a);\n xf.p.setVec2(Vec2.sub(this.c, Rot.mulVec2(xf.q, p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from './AABB';\nimport { DistanceProxy } from './Distance';\nimport type { Transform } from '../common/Transform';\nimport type { Vec2Value } from '../common/Vec2';\n\n// todo make shape an interface\n\n/**\n * A shape is used for collision detection. You can create a shape however you\n * like. Shapes used for simulation in World are created automatically when a\n * Fixture is created. Shapes may encapsulate one or more child shapes.\n */\nexport abstract class Shape {\n m_type: ShapeType;\n m_radius: number;\n\n /** @internal */\n abstract _reset(): void;\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return typeof obj.m_type === 'string' && typeof obj.m_radius === 'number';\n }\n\n abstract getRadius(): number;\n\n /**\n * Get the type of this shape. You can use this to down cast to the concrete\n * shape.\n *\n * @return the shape type.\n */\n abstract getType(): ShapeType;\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n abstract _clone(): Shape;\n\n /**\n * Get the number of child primitives.\n */\n abstract getChildCount(): number;\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n abstract testPoint(xf: Transform, p: Vec2Value): boolean;\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n abstract rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean;\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n abstract computeAABB(aabb: AABB, xf: Transform, childIndex: number): void;\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n abstract computeMass(massData: MassData, density?: number): void;\n\n abstract computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void;\n\n}\n\nexport type ShapeType = \"circle\" | \"edge\" | \"polygon\" | \"chain\";\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { math as Math } from '../common/Math';\nimport { Vec2, Vec2Value } from '../common/Vec2';\nimport { AABB, RayCastInput, RayCastOutput } from '../collision/AABB';\nimport { Shape, ShapeType } from '../collision/Shape';\nimport { Body, MassData } from \"./Body\";\nimport { BroadPhase } from \"../collision/BroadPhase\";\nimport { Transform } from \"../common/Transform\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A fixture definition is used to create a fixture. This class defines an\n * abstract fixture definition. You can reuse fixture definitions safely.\n */\nexport interface FixtureOpt {\n userData?: unknown;\n /**\n * The friction coefficient, usually in the range [0,1]\n */\n friction?: number;\n /**\n * The restitution (elasticity) usually in the range [0,1]\n */\n restitution?: number;\n /**\n * The density, usually in kg/m^2\n */\n density?: number;\n /**\n * A sensor shape collects contact information but never generates a collision response.\n */\n isSensor?: boolean;\n /**\n * Zero, positive or negative collision group.\n * Fixtures with same positive groupIndex always collide and fixtures with same negative groupIndex never collide.\n */\n filterGroupIndex?: number;\n /**\n * Collision category bit or bits that this fixture belongs to.\n * If groupIndex is zero or not matching, then at least one bit in this fixture categoryBits should match other fixture maskBits and vice versa.\n */\n filterCategoryBits?: number;\n /**\n * Collision category bit or bits that this fixture accept for collision.\n */\n filterMaskBits?: number;\n}\n\nexport interface FixtureDef extends FixtureOpt {\n shape: Shape;\n}\n\nconst FixtureDefDefault: FixtureOpt = {\n userData : null,\n friction : 0.2,\n restitution : 0.0,\n density : 0.0,\n isSensor : false,\n\n filterGroupIndex : 0,\n filterCategoryBits : 0x0001,\n filterMaskBits : 0xFFFF\n};\n\n/**\n * This proxy is used internally to connect shape children to the broad-phase.\n */\nexport class FixtureProxy {\n aabb: AABB;\n fixture: Fixture;\n childIndex: number;\n proxyId: number;\n constructor(fixture: Fixture, childIndex: number) {\n this.aabb = new AABB();\n this.fixture = fixture;\n this.childIndex = childIndex;\n this.proxyId;\n }\n}\n\n/**\n * A fixture is used to attach a shape to a body for collision detection. A\n * fixture inherits its transform from its parent. Fixtures hold additional\n * non-geometric data such as friction, collision filters, etc.\n *\n * To create a new Fixture use {@link Body.createFixture}.\n */\nexport class Fixture {\n /** @internal */ m_body: Body;\n /** @internal */ m_friction: number;\n /** @internal */ m_restitution: number;\n /** @internal */ m_density: number;\n /** @internal */ m_isSensor: boolean;\n /** @internal */ m_filterGroupIndex: number;\n /** @internal */ m_filterCategoryBits: number;\n /** @internal */ m_filterMaskBits: number;\n /** @internal */ m_shape: Shape;\n /** @internal */ m_next: Fixture | null;\n /** @internal */ m_proxies: FixtureProxy[];\n /** @internal */ m_proxyCount: number;\n /** @internal */ m_userData: unknown;\n\n constructor(body: Body, def: FixtureDef);\n constructor(body: Body, shape: Shape, def?: FixtureOpt);\n constructor(body: Body, shape: Shape, density?: number);\n // tslint:disable-next-line:typedef\n /** @internal */ constructor(body: Body, shape?, def?) {\n if (shape.shape) {\n def = shape;\n shape = shape.shape;\n\n } else if (typeof def === 'number') {\n def = {density : def};\n }\n\n def = options(def, FixtureDefDefault);\n\n this.m_body = body;\n\n this.m_friction = def.friction;\n this.m_restitution = def.restitution;\n this.m_density = def.density;\n this.m_isSensor = def.isSensor;\n\n this.m_filterGroupIndex = def.filterGroupIndex;\n this.m_filterCategoryBits = def.filterCategoryBits;\n this.m_filterMaskBits = def.filterMaskBits;\n\n // TODO validate shape\n this.m_shape = shape; // .clone();\n\n this.m_next = null;\n\n this.m_proxies = [];\n this.m_proxyCount = 0;\n\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n\n this.m_userData = def.userData;\n }\n\n /**\n * Re-setup fixture.\n * @internal\n */\n _reset(): void {\n const body = this.getBody();\n const broadPhase = body.m_world.m_broadPhase;\n this.destroyProxies(broadPhase);\n if (this.m_shape._reset) {\n this.m_shape._reset();\n }\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n this.createProxies(broadPhase, body.m_xf);\n body.resetMassData();\n }\n\n /** @internal */\n _serialize(): object {\n return {\n friction: this.m_friction,\n restitution: this.m_restitution,\n density: this.m_density,\n isSensor: this.m_isSensor,\n\n filterGroupIndex: this.m_filterGroupIndex,\n filterCategoryBits: this.m_filterCategoryBits,\n filterMaskBits: this.m_filterMaskBits,\n\n shape: this.m_shape,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, body: any, restore: any): Fixture {\n const shape = restore(Shape, data.shape);\n const fixture = shape && new Fixture(body, shape, data);\n return fixture;\n }\n\n /**\n * Get the type of the child shape. You can use this to down cast to the\n * concrete shape.\n */\n getType(): ShapeType {\n return this.m_shape.getType();\n }\n\n /**\n * Get the child shape. You can modify the child shape, however you should not\n * change the number of vertices because this will crash some collision caching\n * mechanisms. Manipulating the shape may lead to non-physical behavior.\n */\n getShape(): Shape {\n return this.m_shape;\n }\n\n /**\n * A sensor shape collects contact information but never generates a collision\n * response.\n */\n isSensor(): boolean {\n return this.m_isSensor;\n }\n\n /**\n * Set if this fixture is a sensor.\n */\n setSensor(sensor: boolean): void {\n if (sensor != this.m_isSensor) {\n this.m_body.setAwake(true);\n this.m_isSensor = sensor;\n }\n }\n\n // /**\n // * Get the contact filtering data.\n // */\n // getFilterData() {\n // return this.m_filter;\n // }\n\n /**\n * Get the user data that was assigned in the fixture definition. Use this to\n * store your application specific data.\n */\n getUserData(): unknown {\n return this.m_userData;\n }\n\n /**\n * Set the user data. Use this to store your application specific data.\n */\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get the parent body of this fixture. This is null if the fixture is not\n * attached.\n */\n getBody(): Body {\n return this.m_body;\n }\n\n /**\n * Get the next fixture in the parent body's fixture list.\n */\n getNext(): Fixture | null {\n return this.m_next;\n }\n\n /**\n * Get the density of this fixture.\n */\n getDensity(): number {\n return this.m_density;\n }\n\n /**\n * Set the density of this fixture. This will _not_ automatically adjust the\n * mass of the body. You must call Body.resetMassData to update the body's mass.\n */\n setDensity(density: number): void {\n _ASSERT && console.assert(Math.isFinite(density) && density >= 0.0);\n this.m_density = density;\n }\n\n /**\n * Get the coefficient of friction, usually in the range [0,1].\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Set the coefficient of friction. This will not change the friction of\n * existing contacts.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the coefficient of restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Set the coefficient of restitution. This will not change the restitution of\n * existing contacts.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Test a point in world coordinates for containment in this fixture.\n */\n testPoint(p: Vec2Value): boolean {\n return this.m_shape.testPoint(this.m_body.getTransform(), p);\n }\n\n /**\n * Cast a ray against this shape.\n */\n rayCast(output: RayCastOutput, input: RayCastInput, childIndex: number): boolean {\n return this.m_shape.rayCast(output, input, this.m_body.getTransform(), childIndex);\n }\n\n /**\n * Get the mass data for this fixture. The mass data is based on the density and\n * the shape. The rotational inertia is about the shape's origin. This operation\n * may be expensive.\n */\n getMassData(massData: MassData): void {\n this.m_shape.computeMass(massData, this.m_density);\n }\n\n /**\n * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a\n * more accurate AABB, compute it using the shape and the body transform.\n */\n getAABB(childIndex: number): AABB {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_proxies.length);\n return this.m_proxies[childIndex].aabb;\n }\n\n /**\n * These support body activation/deactivation.\n */\n createProxies(broadPhase: BroadPhase, xf: Transform): void {\n _ASSERT && console.assert(this.m_proxyCount == 0);\n\n // Create proxies in the broad-phase.\n this.m_proxyCount = this.m_shape.getChildCount();\n\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n this.m_shape.computeAABB(proxy.aabb, xf, i);\n proxy.proxyId = broadPhase.createProxy(proxy.aabb, proxy);\n }\n }\n\n destroyProxies(broadPhase: BroadPhase): void {\n // Destroy proxies in the broad-phase.\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n broadPhase.destroyProxy(proxy.proxyId);\n proxy.proxyId = null;\n }\n\n this.m_proxyCount = 0;\n }\n\n /**\n * Updates this fixture proxy in broad-phase (with combined AABB of current and\n * next transformation).\n */\n synchronize(broadPhase: BroadPhase, xf1: Transform, xf2: Transform): void {\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n // Compute an AABB that covers the swept shape (may miss some rotation\n // effect).\n const aabb1 = new AABB();\n const aabb2 = new AABB();\n this.m_shape.computeAABB(aabb1, xf1, proxy.childIndex);\n this.m_shape.computeAABB(aabb2, xf2, proxy.childIndex);\n\n proxy.aabb.combine(aabb1, aabb2);\n\n const displacement = Vec2.sub(xf2.p, xf1.p);\n\n broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement);\n }\n }\n\n /**\n * Set the contact filtering data. This will not update contacts until the next\n * time step when either parent body is active and awake. This automatically\n * calls refilter.\n */\n setFilterData(filter: { groupIndex: number, categoryBits: number, maskBits: number }): void {\n this.m_filterGroupIndex = filter.groupIndex;\n this.m_filterCategoryBits = filter.categoryBits;\n this.m_filterMaskBits = filter.maskBits;\n this.refilter();\n }\n\n getFilterGroupIndex(): number {\n return this.m_filterGroupIndex;\n }\n\n setFilterGroupIndex(groupIndex: number): void {\n this.m_filterGroupIndex = groupIndex;\n }\n\n getFilterCategoryBits(): number {\n return this.m_filterCategoryBits;\n }\n\n setFilterCategoryBits(categoryBits: number): void {\n this.m_filterCategoryBits = categoryBits;\n }\n\n getFilterMaskBits(): number {\n return this.m_filterMaskBits;\n }\n\n setFilterMaskBits(maskBits: number): void {\n this.m_filterMaskBits = maskBits;\n }\n\n /**\n * Call this if you want to establish collision that was previously disabled by\n * ContactFilter.\n */\n refilter(): void {\n if (this.m_body == null) {\n return;\n }\n\n // Flag associated contacts for filtering.\n let edge = this.m_body.getContactList();\n while (edge) {\n const contact = edge.contact;\n const fixtureA = contact.getFixtureA();\n const fixtureB = contact.getFixtureB();\n if (fixtureA == this || fixtureB == this) {\n contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n\n const world = this.m_body.getWorld();\n\n if (world == null) {\n return;\n }\n\n // Touch each proxy so that new pairs may be created\n const broadPhase = world.m_broadPhase;\n for (let i = 0; i < this.m_proxyCount; ++i) {\n broadPhase.touchProxy(this.m_proxies[i].proxyId);\n }\n }\n\n /**\n * Implement this method to provide collision filtering, if you want finer\n * control over contact creation.\n *\n * Return true if contact calculations should be performed between these two\n * fixtures.\n *\n * Warning: for performance reasons this is only called when the AABBs begin to\n * overlap.\n */\n shouldCollide(that: Fixture): boolean {\n\n if (that.m_filterGroupIndex === this.m_filterGroupIndex && that.m_filterGroupIndex !== 0) {\n return that.m_filterGroupIndex > 0;\n }\n\n const collideA = (that.m_filterMaskBits & this.m_filterCategoryBits) !== 0;\n const collideB = (that.m_filterCategoryBits & this.m_filterMaskBits) !== 0;\n const collide = collideA && collideB;\n return collide;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { Vec2, Vec2Value } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { math as Math } from '../common/Math';\nimport { Sweep } from '../common/Sweep';\nimport { Transform } from '../common/Transform';\nimport { Velocity } from './Velocity';\nimport { Position } from './Position';\nimport { Fixture, FixtureDef, FixtureOpt } from './Fixture';\nimport { Shape } from '../collision/Shape';\nimport { JointEdge } from \"./Joint\";\nimport { World } from \"./World\";\nimport { ContactEdge } from \"./Contact\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport type BodyType = 'static' | 'kinematic' | 'dynamic';\n\nconst STATIC = 'static';\nconst KINEMATIC = 'kinematic';\nconst DYNAMIC = 'dynamic';\n\nexport interface BodyDef {\n /**\n * Body types are static, kinematic, or dynamic. Note: if a dynamic\n * body would have zero mass, the mass is set to one.\n */\n type?: BodyType;\n /**\n * The world position of the body. Avoid creating bodies at the\n * origin since this can lead to many overlapping shapes.\n */\n position?: Vec2;\n /**\n * The world angle of the body in radians.\n */\n angle?: number;\n /**\n * The linear velocity of the body's origin in world co-ordinates.\n */\n linearVelocity?: Vec2;\n angularVelocity?: number;\n /**\n * Linear damping is use to reduce the linear velocity. The\n * damping parameter can be larger than 1.0 but the damping effect becomes\n * sensitive to the time step when the damping parameter is large.\n */\n linearDamping?: number;\n /**\n * Angular damping is use to reduce the angular velocity.\n * The damping parameter can be larger than 1.0 but the damping effect\n * becomes sensitive to the time step when the damping parameter is large.\n */\n angularDamping?: number;\n /**\n * Should this body be prevented from rotating? Useful for characters.\n */\n fixedRotation?: boolean;\n /**\n * Is this a fast moving body that should be prevented from\n * tunneling through other moving bodies? Note that all bodies are\n * prevented from tunneling through kinematic and static bodies. This\n * setting is only considered on dynamic bodies. Warning: You should use\n * this flag sparingly since it increases processing time.\n */\n bullet?: boolean;\n gravityScale?: number;\n /**\n * Set this flag to false if this body should never fall asleep. Note that this increases CPU usage.\n */\n allowSleep?: boolean;\n /**\n * Is this body initially awake or sleeping?\n */\n awake?: boolean;\n /**\n * Does this body start out active?\n */\n active?: boolean;\n userData?: any;\n}\n\nconst BodyDefDefault: BodyDef = {\n type : STATIC,\n position : Vec2.zero(),\n angle : 0.0,\n\n linearVelocity : Vec2.zero(),\n angularVelocity : 0.0,\n\n linearDamping : 0.0,\n angularDamping : 0.0,\n\n fixedRotation : false,\n bullet : false,\n gravityScale : 1.0,\n\n allowSleep : true,\n awake : true,\n active : true,\n\n userData : null\n};\n\n/**\n * MassData This holds the mass data computed for a shape.\n */\nexport class MassData {\n /** The mass of the shape, usually in kilograms. */\n mass: number = 0;\n /** The position of the shape's centroid relative to the shape's origin. */\n center: Vec2 = Vec2.zero();\n /** The rotational inertia of the shape about the local origin. */\n I: number = 0;\n}\n\n/**\n * A rigid body composed of one or more fixtures.\n *\n * To create a new Body use {@link World.createBody}.\n */\nexport class Body {\n /**\n * A static body does not move under simulation and behaves as if it has infinite mass.\n * Internally, zero is stored for the mass and the inverse mass.\n * Static bodies can be moved manually by the user.\n * A static body has zero velocity.\n * Static bodies do not collide with other static or kinematic bodies.\n */\n static readonly STATIC: BodyType = 'static';\n /**\n * A kinematic body moves under simulation according to its velocity.\n * Kinematic bodies do not respond to forces.\n * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity.\n * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass.\n * Kinematic bodies do not collide with other kinematic or static bodies.\n */\n static readonly KINEMATIC: BodyType = 'kinematic';\n\n /**\n * A dynamic body is fully simulated.\n * They can be moved manually by the user, but normally they move according to forces.\n * A dynamic body can collide with all body types.\n * A dynamic body always has finite, non-zero mass.\n * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate.\n */\n static readonly DYNAMIC: BodyType = 'dynamic';\n\n /** @internal */ m_world: World;\n /** @internal */ m_awakeFlag: boolean;\n /** @internal */ m_autoSleepFlag: boolean;\n /** @internal */ m_bulletFlag: boolean;\n /** @internal */ m_fixedRotationFlag: boolean;\n /** @internal */ m_activeFlag: boolean;\n /** @internal */ m_islandFlag: boolean;\n /** @internal */ m_toiFlag: boolean;\n /** @internal */ m_userData: unknown;\n /** @internal */ m_type: BodyType;\n /** @internal */ m_mass: number;\n /** @internal */ m_invMass: number;\n /** @internal Rotational inertia about the center of mass. */\n m_I: number;\n /** @internal */ m_invI: number;\n /** @internal the body origin transform */\n m_xf: Transform;\n /** @internal the swept motion for CCD */\n m_sweep: Sweep;\n // position and velocity correction\n /** @internal */ c_velocity: Velocity;\n /** @internal */ c_position: Position;\n /** @internal */ m_force: Vec2;\n /** @internal */ m_torque: number;\n /** @internal */ m_linearVelocity: Vec2;\n /** @internal */ m_angularVelocity: number;\n /** @internal */ m_linearDamping: number;\n /** @internal */ m_angularDamping: number;\n /** @internal */ m_gravityScale: number;\n /** @internal */ m_sleepTime: number;\n /** @internal */ m_jointList: JointEdge | null;\n /** @internal */ m_contactList: ContactEdge | null;\n /** @internal */ m_fixtureList: Fixture | null;\n /** @internal */ m_prev: Body | null;\n /** @internal */ m_next: Body | null;\n /** @internal */ m_destroyed: boolean;\n\n /** @internal */\n constructor(world: World, def: BodyDef) {\n def = options(def, BodyDefDefault);\n\n _ASSERT && console.assert(Vec2.isValid(def.position));\n _ASSERT && console.assert(Vec2.isValid(def.linearVelocity));\n _ASSERT && console.assert(Math.isFinite(def.angle));\n _ASSERT && console.assert(Math.isFinite(def.angularVelocity));\n _ASSERT && console.assert(Math.isFinite(def.angularDamping) && def.angularDamping >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.linearDamping) && def.linearDamping >= 0.0);\n\n this.m_world = world;\n\n this.m_awakeFlag = def.awake;\n this.m_autoSleepFlag = def.allowSleep;\n this.m_bulletFlag = def.bullet;\n this.m_fixedRotationFlag = def.fixedRotation;\n this.m_activeFlag = def.active;\n\n this.m_islandFlag = false;\n this.m_toiFlag = false;\n\n this.m_userData = def.userData;\n this.m_type = def.type;\n\n if (this.m_type == DYNAMIC) {\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n } else {\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n }\n\n // Rotational inertia about the center of mass.\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n // the body origin transform\n this.m_xf = Transform.identity();\n this.m_xf.p = Vec2.clone(def.position);\n this.m_xf.q.setAngle(def.angle);\n\n // the swept motion for CCD\n this.m_sweep = new Sweep();\n this.m_sweep.setTransform(this.m_xf);\n\n // position and velocity correction\n this.c_velocity = new Velocity();\n this.c_position = new Position();\n\n this.m_force = Vec2.zero();\n this.m_torque = 0.0;\n\n this.m_linearVelocity = Vec2.clone(def.linearVelocity);\n this.m_angularVelocity = def.angularVelocity;\n\n this.m_linearDamping = def.linearDamping;\n this.m_angularDamping = def.angularDamping;\n this.m_gravityScale = def.gravityScale;\n\n this.m_sleepTime = 0.0;\n\n this.m_jointList = null;\n this.m_contactList = null;\n this.m_fixtureList = null;\n\n this.m_prev = null;\n this.m_next = null;\n\n this.m_destroyed = false;\n }\n\n /** @internal */\n _serialize(): object {\n const fixtures = [];\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n fixtures.push(f);\n }\n return {\n type: this.m_type,\n bullet: this.m_bulletFlag,\n position: this.m_xf.p,\n angle: this.m_xf.q.getAngle(),\n linearVelocity: this.m_linearVelocity,\n angularVelocity: this.m_angularVelocity,\n fixtures,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): Body {\n const body = new Body(world, data);\n\n if (data.fixtures) {\n for (let i = data.fixtures.length - 1; i >= 0; i--) {\n const fixture = restore(Fixture, data.fixtures[i], body);\n body._addFixture(fixture);\n }\n }\n return body;\n }\n\n isWorldLocked(): boolean {\n return this.m_world && this.m_world.isLocked() ? true : false;\n }\n\n getWorld(): World {\n return this.m_world;\n }\n\n getNext(): Body | null {\n return this.m_next;\n }\n\n setUserData(data: any): void {\n this.m_userData = data;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n getFixtureList(): Fixture | null {\n return this.m_fixtureList;\n }\n\n getJointList(): JointEdge | null {\n return this.m_jointList;\n }\n\n /**\n * Warning: this list changes during the time step and you may miss some\n * collisions if you don't use ContactListener.\n */\n getContactList(): ContactEdge | null {\n return this.m_contactList;\n }\n\n isStatic(): boolean {\n return this.m_type == STATIC;\n }\n\n isDynamic(): boolean {\n return this.m_type == DYNAMIC;\n }\n\n isKinematic(): boolean {\n return this.m_type == KINEMATIC;\n }\n\n /**\n * This will alter the mass and velocity.\n */\n setStatic(): Body {\n this.setType(STATIC);\n return this;\n }\n\n setDynamic(): Body {\n this.setType(DYNAMIC);\n return this;\n }\n\n setKinematic(): Body {\n this.setType(KINEMATIC);\n return this;\n }\n\n /**\n * @internal\n */\n getType(): BodyType {\n return this.m_type;\n }\n\n /**\n * @internal\n */\n setType(type: BodyType): void {\n _ASSERT && console.assert(type === STATIC || type === KINEMATIC || type === DYNAMIC);\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type == type) {\n return;\n }\n\n this.m_type = type;\n\n this.resetMassData();\n\n if (this.m_type == STATIC) {\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_sweep.forward();\n this.synchronizeFixtures();\n }\n\n this.setAwake(true);\n\n this.m_force.setZero();\n this.m_torque = 0.0;\n\n // Delete the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n\n // Touch the proxies so that new contacts will be created (when appropriate)\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n const proxyCount = f.m_proxyCount;\n for (let i = 0; i < proxyCount; ++i) {\n broadPhase.touchProxy(f.m_proxies[i].proxyId);\n }\n }\n }\n\n isBullet(): boolean {\n return this.m_bulletFlag;\n }\n\n /**\n * Should this body be treated like a bullet for continuous collision detection?\n */\n setBullet(flag: boolean): void {\n this.m_bulletFlag = !!flag;\n }\n\n isSleepingAllowed(): boolean {\n return this.m_autoSleepFlag;\n }\n\n setSleepingAllowed(flag: boolean): void {\n this.m_autoSleepFlag = !!flag;\n if (this.m_autoSleepFlag == false) {\n this.setAwake(true);\n }\n }\n\n isAwake(): boolean {\n return this.m_awakeFlag;\n }\n\n /**\n * Set the sleep state of the body. A sleeping body has very low CPU cost.\n *\n * @param flag Set to true to wake the body, false to put it to sleep.\n */\n setAwake(flag: boolean): void {\n if (flag) {\n if (this.m_awakeFlag == false) {\n this.m_awakeFlag = true;\n this.m_sleepTime = 0.0;\n }\n } else {\n this.m_awakeFlag = false;\n this.m_sleepTime = 0.0;\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_force.setZero();\n this.m_torque = 0.0;\n }\n }\n\n isActive(): boolean {\n return this.m_activeFlag;\n }\n\n /**\n * Set the active state of the body. An inactive body is not simulated and\n * cannot be collided with or woken up. If you pass a flag of true, all fixtures\n * will be added to the broad-phase. If you pass a flag of false, all fixtures\n * will be removed from the broad-phase and all contacts will be destroyed.\n * Fixtures and joints are otherwise unaffected.\n *\n * You may continue to create/destroy fixtures and joints on inactive bodies.\n * Fixtures on an inactive body are implicitly inactive and will not participate\n * in collisions, ray-casts, or queries. Joints connected to an inactive body\n * are implicitly inactive. An inactive body is still owned by a World object\n * and remains\n */\n setActive(flag: boolean): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (flag == this.m_activeFlag) {\n return;\n }\n\n this.m_activeFlag = !!flag;\n\n if (this.m_activeFlag) {\n // Create all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.createProxies(broadPhase, this.m_xf);\n }\n // Contacts are created the next time step.\n\n } else {\n // Destroy all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.destroyProxies(broadPhase);\n }\n\n // Destroy the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n }\n }\n\n isFixedRotation(): boolean {\n return this.m_fixedRotationFlag;\n }\n\n /**\n * Set this body to have fixed rotation. This causes the mass to be reset.\n */\n setFixedRotation(flag: boolean): void {\n if (this.m_fixedRotationFlag == flag) {\n return;\n }\n\n this.m_fixedRotationFlag = !!flag;\n\n this.m_angularVelocity = 0.0;\n\n this.resetMassData();\n }\n\n /**\n * Get the world transform for the body's origin.\n */\n getTransform(): Transform {\n return this.m_xf;\n }\n\n /**\n * Set the position of the body's origin and rotation. Manipulating a body's\n * transform may cause non-physical behavior. Note: contacts are updated on the\n * next call to World.step.\n *\n * @param position The world position of the body's local origin.\n * @param angle The world rotation in radians.\n */\n setTransform(position: Vec2, angle: number): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n this.m_xf.setNum(position, angle);\n this.m_sweep.setTransform(this.m_xf);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, this.m_xf, this.m_xf);\n }\n }\n\n synchronizeTransform(): void {\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Update fixtures in broad-phase.\n */\n synchronizeFixtures(): void {\n const xf = Transform.identity();\n\n this.m_sweep.getTransform(xf, 0);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, xf, this.m_xf);\n }\n }\n\n /**\n * Used in TOI.\n */\n advance(alpha: number): void {\n // Advance to the new safe time. This doesn't sync the broad-phase.\n this.m_sweep.advance(alpha);\n this.m_sweep.c.setVec2(this.m_sweep.c0);\n this.m_sweep.a = this.m_sweep.a0;\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Get the world position for the body's origin.\n */\n getPosition(): Vec2 {\n return this.m_xf.p;\n }\n\n setPosition(p: Vec2): void {\n this.setTransform(p, this.m_sweep.a);\n }\n\n /**\n * Get the current world rotation angle in radians.\n */\n getAngle(): number {\n return this.m_sweep.a;\n }\n\n setAngle(angle: number): void {\n this.setTransform(this.m_xf.p, angle);\n }\n\n /**\n * Get the world position of the center of mass.\n */\n getWorldCenter(): Vec2 {\n return this.m_sweep.c;\n }\n\n /**\n * Get the local position of the center of mass.\n */\n getLocalCenter(): Vec2 {\n return this.m_sweep.localCenter;\n }\n\n /**\n * Get the linear velocity of the center of mass.\n *\n * @return the linear velocity of the center of mass.\n */\n getLinearVelocity(): Vec2 {\n return this.m_linearVelocity;\n }\n\n /**\n * Get the world linear velocity of a world point attached to this body.\n *\n * @param worldPoint A point in world coordinates.\n */\n getLinearVelocityFromWorldPoint(worldPoint: Vec2): Vec2 {\n const localCenter = Vec2.sub(worldPoint, this.m_sweep.c);\n return Vec2.add(this.m_linearVelocity, Vec2.crossNumVec2(this.m_angularVelocity,\n localCenter));\n }\n\n /**\n * Get the world velocity of a local point.\n *\n * @param localPoint A point in local coordinates.\n */\n getLinearVelocityFromLocalPoint(localPoint: Vec2): Vec2 {\n return this.getLinearVelocityFromWorldPoint(this.getWorldPoint(localPoint));\n }\n\n /**\n * Set the linear velocity of the center of mass.\n *\n * @param v The new linear velocity of the center of mass.\n */\n setLinearVelocity(v: Vec2): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (Vec2.dot(v, v) > 0.0) {\n this.setAwake(true);\n }\n this.m_linearVelocity.setVec2(v);\n }\n\n /**\n * Get the angular velocity.\n *\n * @returns the angular velocity in radians/second.\n */\n getAngularVelocity(): number {\n return this.m_angularVelocity;\n }\n\n /**\n * Set the angular velocity.\n *\n * @param omega The new angular velocity in radians/second.\n */\n setAngularVelocity(w: number): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (w * w > 0.0) {\n this.setAwake(true);\n }\n this.m_angularVelocity = w;\n }\n\n getLinearDamping(): number {\n return this.m_linearDamping;\n }\n\n setLinearDamping(linearDamping: number): void {\n this.m_linearDamping = linearDamping;\n }\n\n getAngularDamping(): number {\n return this.m_angularDamping;\n }\n\n setAngularDamping(angularDamping: number): void {\n this.m_angularDamping = angularDamping;\n }\n\n getGravityScale(): number {\n return this.m_gravityScale;\n }\n\n /**\n * Scale the gravity applied to this body.\n */\n setGravityScale(scale: number): void {\n this.m_gravityScale = scale;\n }\n\n /**\n * Get the total mass of the body.\n *\n * @returns The mass, usually in kilograms (kg).\n */\n getMass(): number {\n return this.m_mass;\n }\n\n /**\n * Get the rotational inertia of the body about the local origin.\n *\n * @return the rotational inertia, usually in kg-m^2.\n */\n getInertia(): number {\n return this.m_I + this.m_mass\n * Vec2.dot(this.m_sweep.localCenter, this.m_sweep.localCenter);\n }\n\n /**\n * Copy the mass data of the body to data.\n */\n getMassData(data: MassData): void {\n data.mass = this.m_mass;\n data.I = this.getInertia();\n data.center.setVec2(this.m_sweep.localCenter);\n }\n\n /**\n * This resets the mass properties to the sum of the mass properties of the\n * fixtures. This normally does not need to be called unless you called\n * SetMassData to override the mass and you later want to reset the mass.\n */\n resetMassData(): void {\n // Compute mass data from shapes. Each shape has its own density.\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n this.m_sweep.localCenter.setZero();\n\n // Static and kinematic bodies have zero mass.\n if (this.isStatic() || this.isKinematic()) {\n this.m_sweep.c0.setVec2(this.m_xf.p);\n this.m_sweep.c.setVec2(this.m_xf.p);\n this.m_sweep.a0 = this.m_sweep.a;\n return;\n }\n\n _ASSERT && console.assert(this.isDynamic());\n\n // Accumulate mass over all fixtures.\n const localCenter = Vec2.zero();\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n if (f.m_density == 0.0) {\n continue;\n }\n\n const massData = new MassData();\n f.getMassData(massData);\n this.m_mass += massData.mass;\n localCenter.addMul(massData.mass, massData.center);\n this.m_I += massData.I;\n }\n\n // Compute center of mass.\n if (this.m_mass > 0.0) {\n this.m_invMass = 1.0 / this.m_mass;\n localCenter.mul(this.m_invMass);\n\n } else {\n // Force all dynamic bodies to have a positive mass.\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n }\n\n if (this.m_I > 0.0 && this.m_fixedRotationFlag == false) {\n // Center the inertia about the center of mass.\n this.m_I -= this.m_mass * Vec2.dot(localCenter, localCenter);\n _ASSERT && console.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n\n } else {\n this.m_I = 0.0;\n this.m_invI = 0.0;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(localCenter, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Set the mass properties to override the mass properties of the fixtures. Note\n * that this changes the center of mass position. Note that creating or\n * destroying fixtures can also alter the mass. This function has no effect if\n * the body isn't dynamic.\n *\n * @param massData The mass properties.\n */\n setMassData(massData: MassData): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n this.m_mass = massData.mass;\n if (this.m_mass <= 0.0) {\n this.m_mass = 1.0;\n }\n\n this.m_invMass = 1.0 / this.m_mass;\n\n if (massData.I > 0.0 && this.m_fixedRotationFlag == false) {\n this.m_I = massData.I - this.m_mass\n * Vec2.dot(massData.center, massData.center);\n _ASSERT && console.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(massData.center, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Apply a force at a world point. If the force is not applied at the center of\n * mass, it will generate a torque and affect the angular velocity. This wakes\n * up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyForce(force: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping.\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n this.m_torque += Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), force);\n }\n }\n\n /**\n * Apply a force to the center of mass. This wakes up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param wake Also wake up the body\n */\n applyForceToCenter(force: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n }\n }\n\n /**\n * Apply a torque. This affects the angular velocity without affecting the\n * linear velocity of the center of mass. This wakes up the body.\n *\n * @param torque About the z-axis (out of the screen), usually in N-m.\n * @param wake Also wake up the body\n */\n applyTorque(torque: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_torque += torque;\n }\n }\n\n /**\n * Apply an impulse at a point. This immediately modifies the velocity. It also\n * modifies the angular velocity if the point of application is not at the\n * center of mass. This wakes up the body.\n *\n * @param impulse The world impulse vector, usually in N-seconds or kg-m/s.\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyLinearImpulse(impulse: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_linearVelocity.addMul(this.m_invMass, impulse);\n this.m_angularVelocity += this.m_invI * Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), impulse);\n }\n }\n\n /**\n * Apply an angular impulse.\n *\n * @param impulse The angular impulse in units of kg*m*m/s\n * @param wake Also wake up the body\n */\n applyAngularImpulse(impulse: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_angularVelocity += this.m_invI * impulse;\n }\n }\n\n /**\n * This is used to prevent connected bodies (by joints) from colliding,\n * depending on the joint's collideConnected flag.\n */\n shouldCollide(that: Body): boolean {\n // At least one body should be dynamic.\n if (this.m_type != DYNAMIC && that.m_type != DYNAMIC) {\n return false;\n }\n // Does a joint prevent collision?\n for (let jn = this.m_jointList; jn; jn = jn.next) {\n if (jn.other == that) {\n if (jn.joint.m_collideConnected == false) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addFixture(fixture: Fixture): Fixture {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.createProxies(broadPhase, this.m_xf);\n }\n\n fixture.m_next = this.m_fixtureList;\n this.m_fixtureList = fixture;\n\n // Adjust mass properties if needed.\n if (fixture.m_density > 0.0) {\n this.resetMassData();\n }\n\n // Let the world know we have a new fixture. This will cause new contacts\n // to be created at the beginning of the next time step.\n this.m_world.m_newFixture = true;\n\n return fixture;\n }\n\n /**\n * Creates a fixture and attach it to this body.\n *\n * If the density is non-zero, this function automatically updates the mass of\n * the body.\n *\n * Contacts are not created until the next time step.\n *\n * Warning: This function is locked during callbacks.\n */\n createFixture(def: FixtureDef): Fixture;\n createFixture(shape: Shape, opt?: FixtureOpt): Fixture;\n createFixture(shape: Shape, density?: number): Fixture;\n // tslint:disable-next-line:typedef\n createFixture(shape, fixdef?) {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n const fixture = new Fixture(this, shape, fixdef);\n this._addFixture(fixture);\n return fixture;\n }\n\n /**\n * Destroy a fixture. This removes the fixture from the broad-phase and destroys\n * all contacts associated with this fixture. This will automatically adjust the\n * mass of the body if the body is dynamic and the fixture has positive density.\n * All fixtures attached to a body are implicitly destroyed when the body is\n * destroyed.\n *\n * Warning: This function is locked during callbacks.\n *\n * @param fixture The fixture to be removed.\n */\n destroyFixture(fixture: Fixture): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n _ASSERT && console.assert(fixture.m_body == this);\n\n // Remove the fixture from this body's singly linked list.\n let found = false;\n if (this.m_fixtureList === fixture) {\n this.m_fixtureList = fixture.m_next;\n found = true;\n\n } else {\n let node = this.m_fixtureList;\n while (node != null) {\n if (node.m_next === fixture) {\n node.m_next = fixture.m_next;\n found = true;\n break;\n }\n node = node.m_next;\n }\n }\n\n // You tried to remove a shape that is not attached to this body.\n _ASSERT && console.assert(found);\n\n // Destroy any contacts associated with the fixture.\n let edge = this.m_contactList;\n while (edge) {\n const c = edge.contact;\n edge = edge.next;\n\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n\n if (fixture == fixtureA || fixture == fixtureB) {\n // This destroys the contact and removes it from\n // this body's contact list.\n this.m_world.destroyContact(c);\n }\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.destroyProxies(broadPhase);\n }\n\n fixture.m_body = null;\n fixture.m_next = null;\n\n this.m_world.publish('remove-fixture', fixture);\n\n // Reset the mass data.\n this.resetMassData();\n }\n\n /**\n * Get the corresponding world point of a local point.\n */\n getWorldPoint(localPoint: Vec2): Vec2 {\n return Transform.mulVec2(this.m_xf, localPoint);\n }\n\n /**\n * Get the corresponding world vector of a local vector.\n */\n getWorldVector(localVector: Vec2): Vec2 {\n return Rot.mulVec2(this.m_xf.q, localVector);\n }\n\n /**\n * Gets the corresponding local point of a world point.\n */\n getLocalPoint(worldPoint: Vec2Value): Vec2 {\n return Transform.mulTVec2(this.m_xf, worldPoint);\n }\n\n /**\n * Gets the corresponding local vector of a world vector.\n */\n getLocalVector(worldVector: Vec2Value): Vec2 {\n return Rot.mulTVec2(this.m_xf.q, worldVector);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { Vec2 } from '../common/Vec2';\nimport type { Body } from './Body';\nimport { TimeStep } from \"./Solver\";\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n/**\n * A joint edge is used to connect bodies and joints together in a joint graph\n * where each body is a node and each joint is an edge. A joint edge belongs to\n * a doubly linked list maintained in each attached body. Each joint has two\n * joint nodes, one for each attached body.\n */\nexport class JointEdge {\n /**\n * provides quick access to the other body attached.\n */\n other: Body | null = null;\n /**\n * the joint\n */\n joint: Joint | null = null;\n /**\n * prev the previous joint edge in the body's joint list\n */\n prev: JointEdge | null = null;\n /**\n * the next joint edge in the body's joint list\n */\n next: JointEdge | null = null;\n}\n\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointOpt {\n /**\n * Use this to attach application specific data to your joints.\n */\n userData?: any;\n /**\n * Set this flag to true if the attached bodies\n * should collide.\n */\n collideConnected?: boolean;\n}\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointDef extends JointOpt {\n /**\n * The first attached body.\n */\n bodyA: Body;\n /**\n * The second attached body.\n */\n bodyB: Body;\n}\n\nconst DEFAULTS = {\n userData : null,\n collideConnected : false\n};\n\n/**\n * The base joint class. Joints are used to constraint two bodies together in\n * various fashions. Some joints also feature limits and motors.\n */\nexport abstract class Joint {\n\n /** @internal */ m_type: string = 'unknown-joint';\n\n /** @internal */ m_bodyA: Body;\n /** @internal */ m_bodyB: Body;\n\n /** @internal */ m_collideConnected: boolean;\n\n /** @internal */ m_prev: Joint | null = null;\n /** @internal */ m_next: Joint | null = null;\n\n /** @internal */ m_edgeA: JointEdge = new JointEdge();\n /** @internal */ m_edgeB: JointEdge = new JointEdge();\n\n /** @internal */ m_islandFlag: boolean = false;\n /** @internal */ m_userData: unknown;\n\n constructor(def: JointDef);\n constructor(def: JointOpt, bodyA: Body, bodyB: Body);\n constructor(def: JointDef | JointOpt, bodyA?: Body, bodyB?: Body) {\n bodyA = 'bodyA' in def ? def.bodyA : bodyA;\n bodyB = 'bodyB' in def ? def.bodyB : bodyB;\n\n _ASSERT && console.assert(!!bodyA);\n _ASSERT && console.assert(!!bodyB);\n _ASSERT && console.assert(bodyA != bodyB);\n\n this.m_bodyA = bodyA!;\n this.m_bodyB = bodyB!;\n\n this.m_collideConnected = !!def.collideConnected;\n this.m_userData = def.userData;\n }\n\n /**\n * Short-cut function to determine if either body is inactive.\n */\n isActive(): boolean {\n return this.m_bodyA.isActive() && this.m_bodyB.isActive();\n }\n\n /**\n * Get the type of the concrete joint.\n */\n getType(): string {\n return this.m_type;\n }\n\n /**\n * Get the first body attached to this joint.\n */\n getBodyA(): Body {\n return this.m_bodyA;\n }\n\n /**\n * Get the second body attached to this joint.\n */\n getBodyB(): Body {\n return this.m_bodyB;\n }\n\n /**\n * Get the next joint the world joint list.\n */\n getNext(): Joint {\n return this.m_next;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get collide connected. Note: modifying the collide connect flag won't work\n * correctly because the flag is only checked when fixture AABBs begin to\n * overlap.\n */\n getCollideConnected(): boolean {\n return this.m_collideConnected;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n abstract getAnchorA(): Vec2;\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n abstract getAnchorB(): Vec2;\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n abstract getReactionForce(inv_dt: number): Vec2;\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n abstract getReactionTorque(inv_dt: number): number;\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2): void {}\n\n abstract initVelocityConstraints(step: TimeStep): void;\n\n abstract solveVelocityConstraints(step: TimeStep): void;\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n abstract solvePositionConstraints(step: TimeStep): boolean;\n\n}\n","export const stats = {\n gjkCalls: 0,\n gjkIters: 0,\n gjkMaxIters: 0,\n\n toiTime: 0,\n toiMaxTime: 0,\n toiCalls: 0,\n toiIters: 0,\n toiMaxIters: 0,\n toiRootIters: 0,\n toiMaxRootIters: 0,\n\n toString(newline?: string): string {\n newline = typeof newline === 'string' ? newline : '\\n';\n let string = \"\";\n // tslint:disable-next-line:no-for-in\n for (const name in this) {\n if (typeof this[name] !== 'function' && typeof this[name] !== 'object') {\n string += name + ': ' + this[name] + newline;\n }\n }\n return string;\n }\n};\n","export const now = function(): number {\n return Date.now();\n};\n\nexport const diff = function(time: number): number {\n return Date.now() - time;\n};\n\nexport default {\n now,\n diff,\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { stats } from '../util/stats';\nimport { Shape } from './Shape';\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Transform } from '../common/Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates.\n */\n\nstats.gjkCalls = 0;\nstats.gjkIters = 0;\nstats.gjkMaxIters = 0;\n\n/**\n * Input for Distance. You have to option to use the shape radii in the\n * computation. Even\n */\nexport class DistanceInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n transformA: Transform | null = null;\n transformB: Transform | null = null;\n useRadii: boolean = false;\n}\n\n/**\n * Output for Distance.\n *\n * @prop {Vec2} pointA closest point on shapeA\n * @prop {Vec2} pointB closest point on shapeB\n * @prop distance\n * @prop iterations number of GJK iterations used\n */\nexport class DistanceOutput {\n pointA: Vec2 = Vec2.zero();\n pointB: Vec2 = Vec2.zero();\n distance: number;\n iterations: number;\n}\n\n/**\n * Used to warm start Distance. Set count to zero on first call.\n *\n * @prop {number} metric length or area\n * @prop {array} indexA vertices on shape A\n * @prop {array} indexB vertices on shape B\n * @prop {number} count\n */\nexport class SimplexCache {\n metric: number = 0;\n indexA: number[] = [];\n indexB: number[] = [];\n count: number = 0;\n}\n\n/**\n * Compute the closest points between two shapes. Supports any combination of:\n * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On\n * the first call set SimplexCache.count to zero.\n */\nexport const Distance = function (output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void {\n ++stats.gjkCalls;\n\n const proxyA = input.proxyA;\n const proxyB = input.proxyB;\n const xfA = input.transformA;\n const xfB = input.transformB;\n\n // Initialize the simplex.\n const simplex = new Simplex();\n simplex.readCache(cache, proxyA, xfA, proxyB, xfB);\n\n // Get simplex vertices as an array.\n const vertices = simplex.m_v;\n const k_maxIters = Settings.maxDistnceIterations;\n\n // These store the vertices of the last simplex so that we\n // can check for duplicates and prevent cycling.\n const saveA = [];\n const saveB = []; // int[3]\n let saveCount = 0;\n\n let distanceSqr1 = Infinity;\n let distanceSqr2 = Infinity;\n\n // Main iteration loop.\n let iter = 0;\n while (iter < k_maxIters) {\n // Copy simplex so we can identify duplicates.\n saveCount = simplex.m_count;\n for (let i = 0; i < saveCount; ++i) {\n saveA[i] = vertices[i].indexA;\n saveB[i] = vertices[i].indexB;\n }\n\n simplex.solve();\n\n // If we have 3 points, then the origin is in the corresponding triangle.\n if (simplex.m_count === 3) {\n break;\n }\n\n // Compute closest point.\n const p = simplex.getClosestPoint();\n distanceSqr2 = p.lengthSquared();\n\n // Ensure progress\n if (distanceSqr2 >= distanceSqr1) {\n // break;\n }\n distanceSqr1 = distanceSqr2;\n\n // Get search direction.\n const d = simplex.getSearchDirection();\n\n // Ensure the search direction is numerically fit.\n if (d.lengthSquared() < Math.EPSILON * Math.EPSILON) {\n // The origin is probably contained by a line segment\n // or triangle. Thus the shapes are overlapped.\n\n // We can't return zero here even though there may be overlap.\n // In case the simplex is a point, segment, or triangle it is difficult\n // to determine if the origin is contained in the CSO or very close to it.\n break;\n }\n\n // Compute a tentative new simplex vertex using support points.\n const vertex = vertices[simplex.m_count]; // SimplexVertex\n\n vertex.indexA = proxyA.getSupport(Rot.mulTVec2(xfA.q, Vec2.neg(d)));\n vertex.wA = Transform.mulVec2(xfA, proxyA.getVertex(vertex.indexA));\n\n vertex.indexB = proxyB.getSupport(Rot.mulTVec2(xfB.q, d));\n vertex.wB = Transform.mulVec2(xfB, proxyB.getVertex(vertex.indexB));\n\n vertex.w = Vec2.sub(vertex.wB, vertex.wA);\n\n // Iteration count is equated to the number of support point calls.\n ++iter;\n ++stats.gjkIters;\n\n // Check for duplicate support points. This is the main termination\n // criteria.\n let duplicate = false;\n for (let i = 0; i < saveCount; ++i) {\n if (vertex.indexA === saveA[i] && vertex.indexB === saveB[i]) {\n duplicate = true;\n break;\n }\n }\n\n // If we found a duplicate support point we must exit to avoid cycling.\n if (duplicate) {\n break;\n }\n\n // New vertex is ok and needed.\n ++simplex.m_count;\n }\n\n stats.gjkMaxIters = Math.max(stats.gjkMaxIters, iter);\n\n // Prepare output.\n simplex.getWitnessPoints(output.pointA, output.pointB);\n output.distance = Vec2.distance(output.pointA, output.pointB);\n output.iterations = iter;\n\n // Cache the simplex.\n simplex.writeCache(cache);\n\n // Apply radii if requested.\n if (input.useRadii) {\n const rA = proxyA.m_radius;\n const rB = proxyB.m_radius;\n\n if (output.distance > rA + rB && output.distance > Math.EPSILON) {\n // Shapes are still no overlapped.\n // Move the witness points to the outer surface.\n output.distance -= rA + rB;\n const normal = Vec2.sub(output.pointB, output.pointA);\n normal.normalize();\n output.pointA.addMul(rA, normal);\n output.pointB.subMul(rB, normal);\n } else {\n // Shapes are overlapped when radii are considered.\n // Move the witness points to the middle.\n const p = Vec2.mid(output.pointA, output.pointB);\n output.pointA.setVec2(p);\n output.pointB.setVec2(p);\n output.distance = 0.0;\n }\n }\n}\n\n/**\n * A distance proxy is used by the GJK algorithm. It encapsulates any shape.\n */\nexport class DistanceProxy {\n /** internal */ m_buffer: Vec2[];\n /** internal */ m_vertices: Vec2[];\n /** internal */ m_count: number;\n /** internal */ m_radius: number;\n\n\n constructor() {\n this.m_buffer = []; // Vec2[2]\n this.m_vertices = []; // Vec2[]\n this.m_count = 0;\n this.m_radius = 0;\n }\n\n /**\n * Get the vertex count.\n */\n getVertexCount(): number {\n return this.m_count;\n }\n\n /**\n * Get a vertex by index. Used by Distance.\n */\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * Get the supporting vertex index in the given direction.\n */\n getSupport(d: Vec2): number {\n let bestIndex = 0;\n let bestValue = Vec2.dot(this.m_vertices[0], d);\n for (let i = 0; i < this.m_count; ++i) {\n const value = Vec2.dot(this.m_vertices[i], d);\n if (value > bestValue) {\n bestIndex = i;\n bestValue = value;\n }\n }\n return bestIndex;\n }\n\n /**\n * Get the supporting vertex in the given direction.\n */\n getSupportVertex(d: Vec2): Vec2 {\n return this.m_vertices[this.getSupport(d)];\n }\n\n /**\n * Initialize the proxy using the given shape. The shape must remain in scope\n * while the proxy is in use.\n */\n set(shape: Shape, index: number): void {\n // TODO remove, use shape instead\n _ASSERT && console.assert(typeof shape.computeDistanceProxy === 'function');\n shape.computeDistanceProxy(this, index);\n }\n}\n\nclass SimplexVertex {\n /** support point in proxyA */\n wA: Vec2 = Vec2.zero();\n /** wA index */\n indexA: number;\n\n /** support point in proxyB */\n wB: Vec2 = Vec2.zero();\n /** wB index */\n indexB: number;\n\n /** wB - wA; */\n w: Vec2 = Vec2.zero();\n /** barycentric coordinate for closest point */\n a: number;\n\n set(v: SimplexVertex): void {\n this.indexA = v.indexA;\n this.indexB = v.indexB;\n this.wA = Vec2.clone(v.wA);\n this.wB = Vec2.clone(v.wB);\n this.w = Vec2.clone(v.w);\n this.a = v.a;\n }\n}\n\nclass Simplex {\n m_v1: SimplexVertex;\n m_v2: SimplexVertex;\n m_v3: SimplexVertex;\n m_v: SimplexVertex[];\n m_count: number;\n\n constructor() {\n this.m_v1 = new SimplexVertex();\n this.m_v2 = new SimplexVertex();\n this.m_v3 = new SimplexVertex();\n this.m_v = [ this.m_v1, this.m_v2, this.m_v3 ];\n this.m_count;\n }\n\n /** @internal */\n toString(): string {\n if (this.m_count === 3) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y,\n this.m_v3.a, this.m_v3.wA.x, this.m_v3.wA.y, this.m_v3.wB.x, this.m_v3.wB.y\n ].toString();\n\n } else if (this.m_count === 2) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y\n ].toString();\n\n } else if (this.m_count === 1) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y\n ].toString();\n\n } else {\n return \"+\" + this.m_count;\n }\n }\n\n readCache(cache: SimplexCache, proxyA: DistanceProxy, transformA: Transform, proxyB: DistanceProxy, transformB: Transform): void {\n _ASSERT && console.assert(cache.count <= 3);\n\n // Copy data from cache.\n this.m_count = cache.count;\n for (let i = 0; i < this.m_count; ++i) {\n const v = this.m_v[i];\n v.indexA = cache.indexA[i];\n v.indexB = cache.indexB[i];\n const wALocal = proxyA.getVertex(v.indexA);\n const wBLocal = proxyB.getVertex(v.indexB);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 0.0;\n }\n\n // Compute the new simplex metric, if it is substantially different than\n // old metric then flush the simplex.\n if (this.m_count > 1) {\n const metric1 = cache.metric;\n const metric2 = this.getMetric();\n if (metric2 < 0.5 * metric1 || 2.0 * metric1 < metric2\n || metric2 < Math.EPSILON) {\n // Reset the simplex.\n this.m_count = 0;\n }\n }\n\n // If the cache is empty or invalid...\n if (this.m_count === 0) {\n const v = this.m_v[0];\n v.indexA = 0;\n v.indexB = 0;\n const wALocal = proxyA.getVertex(0);\n const wBLocal = proxyB.getVertex(0);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 1.0;\n this.m_count = 1;\n }\n }\n\n writeCache(cache: SimplexCache): void {\n cache.metric = this.getMetric();\n cache.count = this.m_count;\n for (let i = 0; i < this.m_count; ++i) {\n cache.indexA[i] = this.m_v[i].indexA;\n cache.indexB[i] = this.m_v[i].indexB;\n }\n }\n\n getSearchDirection(): Vec2 {\n switch (this.m_count) {\n case 1:\n return Vec2.neg(this.m_v1.w);\n\n case 2: {\n const e12 = Vec2.sub(this.m_v2.w, this.m_v1.w);\n const sgn = Vec2.crossVec2Vec2(e12, Vec2.neg(this.m_v1.w));\n if (sgn > 0.0) {\n // Origin is left of e12.\n return Vec2.crossNumVec2(1.0, e12);\n } else {\n // Origin is right of e12.\n return Vec2.crossVec2Num(e12, 1.0);\n }\n }\n\n default:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n }\n }\n\n getClosestPoint(): Vec2 {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n\n case 1:\n return Vec2.clone(this.m_v1.w);\n\n case 2:\n return Vec2.combine(this.m_v1.a, this.m_v1.w, this.m_v2.a, this.m_v2.w);\n\n case 3:\n return Vec2.zero();\n\n default:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n }\n }\n\n getWitnessPoints(pA: Vec2, pB: Vec2): void {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n break;\n\n case 1:\n pA.setVec2(this.m_v1.wA);\n pB.setVec2(this.m_v1.wB);\n break;\n\n case 2:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pB.setCombine(this.m_v1.a, this.m_v1.wB, this.m_v2.a, this.m_v2.wB);\n break;\n\n case 3:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pA.addMul(this.m_v3.a, this.m_v3.wA);\n pB.setVec2(pA);\n break;\n\n default:\n _ASSERT && console.assert(false);\n break;\n }\n }\n\n getMetric(): number {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n return 0.0;\n\n case 1:\n return 0.0;\n\n case 2:\n return Vec2.distance(this.m_v1.w, this.m_v2.w);\n\n case 3:\n return Vec2.crossVec2Vec2(Vec2.sub(this.m_v2.w, this.m_v1.w), Vec2.sub(this.m_v3.w,\n this.m_v1.w));\n\n default:\n _ASSERT && console.assert(false);\n return 0.0;\n }\n }\n\n solve(): void {\n switch (this.m_count) {\n case 1:\n break;\n\n case 2:\n this.solve2();\n break;\n\n case 3:\n this.solve3();\n break;\n\n default:\n _ASSERT && console.assert(false);\n }\n }\n\n// Solve a line segment using barycentric coordinates.\n//\n// p = a1 * w1 + a2 * w2\n// a1 + a2 = 1\n//\n// The vector from the origin to the closest point on the line is\n// perpendicular to the line.\n// e12 = w2 - w1\n// dot(p, e) = 0\n// a1 * dot(w1, e) + a2 * dot(w2, e) = 0\n//\n// 2-by-2 linear system\n// [1 1 ][a1] = [1]\n// [w1.e12 w2.e12][a2] = [0]\n//\n// Define\n// d12_1 = dot(w2, e12)\n// d12_2 = -dot(w1, e12)\n// d12 = d12_1 + d12_2\n//\n// Solution\n// a1 = d12_1 / d12\n// a2 = d12_2 / d12\n solve2(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const e12 = Vec2.sub(w2, w1);\n\n // w1 region\n const d12_2 = -Vec2.dot(w1, e12);\n if (d12_2 <= 0.0) {\n // a2 <= 0, so we clamp it to 0\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // w2 region\n const d12_1 = Vec2.dot(w2, e12);\n if (d12_1 <= 0.0) {\n // a1 <= 0, so we clamp it to 0\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // Must be in e12 region.\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n }\n\n// Possible regions:\n// - points[2]\n// - edge points[0]-points[2]\n// - edge points[1]-points[2]\n// - inside the triangle\n solve3(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const w3 = this.m_v3.w;\n\n // Edge12\n // [1 1 ][a1] = [1]\n // [w1.e12 w2.e12][a2] = [0]\n // a3 = 0\n const e12 = Vec2.sub(w2, w1);\n const w1e12 = Vec2.dot(w1, e12);\n const w2e12 = Vec2.dot(w2, e12);\n const d12_1 = w2e12;\n const d12_2 = -w1e12;\n\n // Edge13\n // [1 1 ][a1] = [1]\n // [w1.e13 w3.e13][a3] = [0]\n // a2 = 0\n const e13 = Vec2.sub(w3, w1);\n const w1e13 = Vec2.dot(w1, e13);\n const w3e13 = Vec2.dot(w3, e13);\n const d13_1 = w3e13;\n const d13_2 = -w1e13;\n\n // Edge23\n // [1 1 ][a2] = [1]\n // [w2.e23 w3.e23][a3] = [0]\n // a1 = 0\n const e23 = Vec2.sub(w3, w2);\n const w2e23 = Vec2.dot(w2, e23);\n const w3e23 = Vec2.dot(w3, e23);\n const d23_1 = w3e23;\n const d23_2 = -w2e23;\n\n // Triangle123\n const n123 = Vec2.crossVec2Vec2(e12, e13);\n\n const d123_1 = n123 * Vec2.crossVec2Vec2(w2, w3);\n const d123_2 = n123 * Vec2.crossVec2Vec2(w3, w1);\n const d123_3 = n123 * Vec2.crossVec2Vec2(w1, w2);\n\n // w1 region\n if (d12_2 <= 0.0 && d13_2 <= 0.0) {\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // e12\n if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) {\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n return;\n }\n\n // e13\n if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) {\n const inv_d13 = 1.0 / (d13_1 + d13_2);\n this.m_v1.a = d13_1 * inv_d13;\n this.m_v3.a = d13_2 * inv_d13;\n this.m_count = 2;\n this.m_v2.set(this.m_v3);\n return;\n }\n\n // w2 region\n if (d12_1 <= 0.0 && d23_2 <= 0.0) {\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // w3 region\n if (d13_1 <= 0.0 && d23_1 <= 0.0) {\n this.m_v3.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // e23\n if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) {\n const inv_d23 = 1.0 / (d23_1 + d23_2);\n this.m_v2.a = d23_1 * inv_d23;\n this.m_v3.a = d23_2 * inv_d23;\n this.m_count = 2;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // Must be in triangle123\n const inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3);\n this.m_v1.a = d123_1 * inv_d123;\n this.m_v2.a = d123_2 * inv_d123;\n this.m_v3.a = d123_3 * inv_d123;\n this.m_count = 3;\n }\n}\n\n/**\n * Determine if two generic shapes overlap.\n */\nexport const testOverlap = function (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform): boolean {\n const input = new DistanceInput();\n input.proxyA.set(shapeA, indexA);\n input.proxyB.set(shapeB, indexB);\n input.transformA = xfA;\n input.transformB = xfB;\n input.useRadii = true;\n\n const cache = new SimplexCache();\n const output = new DistanceOutput();\n\n Distance(output, cache, input);\n\n return output.distance < 10.0 * Math.EPSILON;\n}\n\n// legacy exports\nDistance.testOverlap = testOverlap;\nDistance.Input = DistanceInput;\nDistance.Output = DistanceOutput;\nDistance.Proxy = DistanceProxy;\nDistance.Cache = SimplexCache;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { stats } from '../util/stats';\nimport Timer from '../util/Timer';\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Sweep } from '../common/Sweep';\nimport { Transform } from '../common/Transform';\n\nimport { Distance, DistanceInput, DistanceOutput, DistanceProxy, SimplexCache } from './Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n/**\n * Input parameters for TimeOfImpact.\n */\nexport class TOIInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n sweepA: Sweep = new Sweep();\n sweepB: Sweep = new Sweep();\n /** defines sweep interval [0, tMax] */\n tMax: number | undefined;\n}\n\nexport enum TOIOutputState {\n e_unknown = 0,\n e_failed = 1,\n e_overlapped = 2,\n e_touching = 3,\n e_separated = 4,\n}\n\n/**\n * Output parameters for TimeOfImpact.\n */\nexport class TOIOutput {\n state: TOIOutputState | undefined;\n t: number | undefined;\n}\n\nstats.toiTime = 0;\nstats.toiMaxTime = 0;\nstats.toiCalls = 0;\nstats.toiIters = 0;\nstats.toiMaxIters = 0;\nstats.toiRootIters = 0;\nstats.toiMaxRootIters = 0;\n\n/**\n * Compute the upper bound on time before two shapes penetrate. Time is\n * represented as a fraction between [0,tMax]. This uses a swept separating axis\n * and may miss some intermediate, non-tunneling collision. If you change the\n * time interval, you should call this function again.\n *\n * Note: use Distance to compute the contact point and normal at the time of\n * impact.\n *\n * CCD via the local separating axis method. This seeks progression by computing\n * the largest time at which separation is maintained.\n */\nexport const TimeOfImpact = function (output: TOIOutput, input: TOIInput): void {\n const timer = Timer.now();\n\n ++stats.toiCalls;\n\n output.state = TOIOutputState.e_unknown;\n output.t = input.tMax;\n\n const proxyA = input.proxyA; // DistanceProxy\n const proxyB = input.proxyB; // DistanceProxy\n\n const sweepA = input.sweepA; // Sweep\n const sweepB = input.sweepB; // Sweep\n\n // Large rotations can make the root finder fail, so we normalize the\n // sweep angles.\n sweepA.normalize();\n sweepB.normalize();\n\n const tMax = input.tMax;\n\n const totalRadius = proxyA.m_radius + proxyB.m_radius;\n const target = Math.max(Settings.linearSlop, totalRadius - 3.0 * Settings.linearSlop);\n const tolerance = 0.25 * Settings.linearSlop;\n _ASSERT && console.assert(target > tolerance);\n\n let t1 = 0.0;\n const k_maxIterations = Settings.maxTOIIterations;\n let iter = 0;\n\n // Prepare input for distance query.\n const cache = new SimplexCache();\n\n const distanceInput = new DistanceInput();\n distanceInput.proxyA = input.proxyA;\n distanceInput.proxyB = input.proxyB;\n distanceInput.useRadii = false;\n\n // The outer loop progressively attempts to compute new separating axes.\n // This loop terminates when an axis is repeated (no progress is made).\n while (true) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n sweepA.getTransform(xfA, t1);\n sweepB.getTransform(xfB, t1);\n\n // Get the distance between shapes. We can also use the results\n // to get a separating axis.\n distanceInput.transformA = xfA;\n distanceInput.transformB = xfB;\n const distanceOutput = new DistanceOutput();\n Distance(distanceOutput, cache, distanceInput);\n\n // If the shapes are overlapped, we give up on continuous collision.\n if (distanceOutput.distance <= 0.0) {\n // Failure!\n output.state = TOIOutputState.e_overlapped;\n output.t = 0.0;\n break;\n }\n\n if (distanceOutput.distance < target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n break;\n }\n\n // Initialize the separating axis.\n const fcn = new SeparationFunction();\n fcn.initialize(cache, proxyA, sweepA, proxyB, sweepB, t1);\n\n // if (false) {\n // // Dump the curve seen by the root finder\n // const N = 100;\n // const dx = 1.0 / N;\n // const xs = []; // [ N + 1 ];\n // const fs = []; // [ N + 1 ];\n // const x = 0.0;\n // for (const i = 0; i <= N; ++i) {\n // sweepA.getTransform(xfA, x);\n // sweepB.getTransform(xfB, x);\n // const f = fcn.evaluate(xfA, xfB) - target;\n // printf(\"%g %g\\n\", x, f);\n // xs[i] = x;\n // fs[i] = f;\n // x += dx;\n // }\n // }\n\n // Compute the TOI on the separating axis. We do this by successively\n // resolving the deepest point. This loop is bounded by the number of\n // vertices.\n let done = false;\n let t2 = tMax;\n let pushBackIter = 0;\n while (true) {\n // Find the deepest point at t2. Store the witness point indices.\n let s2 = fcn.findMinSeparation(t2);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Is the final configuration separated?\n if (s2 > target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_separated;\n output.t = tMax;\n done = true;\n break;\n }\n\n // Has the separation reached tolerance?\n if (s2 > target - tolerance) {\n // Advance the sweeps\n t1 = t2;\n break;\n }\n\n // Compute the initial separation of the witness points.\n let s1 = fcn.evaluate(t1);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Check for initial overlap. This might happen if the root finder\n // runs out of iterations.\n if (s1 < target - tolerance) {\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n done = true;\n break;\n }\n\n // Check for touching\n if (s1 <= target + tolerance) {\n // Victory! t1 should hold the TOI (could be 0.0).\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n done = true;\n break;\n }\n\n // Compute 1D root of: f(x) - target = 0\n let rootIterCount = 0;\n let a1 = t1;\n let a2 = t2;\n while (true) {\n // Use a mix of the secant rule and bisection.\n let t;\n if (rootIterCount & 1) {\n // Secant rule to improve convergence.\n t = a1 + (target - s1) * (a2 - a1) / (s2 - s1);\n } else {\n // Bisection to guarantee progress.\n t = 0.5 * (a1 + a2);\n }\n\n ++rootIterCount;\n ++stats.toiRootIters;\n\n const s = fcn.evaluate(t);\n const indexA = fcn.indexA;\n const indexB = fcn.indexB;\n\n if (Math.abs(s - target) < tolerance) {\n // t2 holds a tentative value for t1\n t2 = t;\n break;\n }\n\n // Ensure we continue to bracket the root.\n if (s > target) {\n a1 = t;\n s1 = s;\n } else {\n a2 = t;\n s2 = s;\n }\n\n if (rootIterCount === 50) {\n break;\n }\n }\n\n stats.toiMaxRootIters = Math.max(stats.toiMaxRootIters, rootIterCount);\n\n ++pushBackIter;\n\n if (pushBackIter === Settings.maxPolygonVertices) {\n break;\n }\n }\n\n ++iter;\n ++stats.toiIters;\n\n if (done) {\n break;\n }\n\n if (iter === k_maxIterations) {\n // Root finder got stuck. Semi-victory.\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n break;\n }\n }\n\n stats.toiMaxIters = Math.max(stats.toiMaxIters, iter);\n\n const time = Timer.diff(timer);\n stats.toiMaxTime = Math.max(stats.toiMaxTime, time);\n stats.toiTime += time;\n}\n\nenum SeparationFunctionType {\n e_points = 1,\n e_faceA = 2,\n e_faceB = 3,\n}\n\nclass SeparationFunction {\n m_proxyA: DistanceProxy = new DistanceProxy();\n m_proxyB: DistanceProxy = new DistanceProxy();\n m_sweepA: Sweep;\n m_sweepB: Sweep;\n indexA: number;\n indexB: number;\n m_type: SeparationFunctionType;\n m_localPoint: Vec2 = Vec2.zero();\n m_axis: Vec2 = Vec2.zero();\n\n // TODO_ERIN might not need to return the separation\n\n initialize(cache: SimplexCache, proxyA: DistanceProxy, sweepA: Sweep, proxyB: DistanceProxy, sweepB: Sweep, t1: number): number {\n this.m_proxyA = proxyA;\n this.m_proxyB = proxyB;\n const count = cache.count;\n _ASSERT && console.assert(0 < count && count < 3);\n\n this.m_sweepA = sweepA;\n this.m_sweepB = sweepB;\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t1);\n this.m_sweepB.getTransform(xfB, t1);\n\n if (count === 1) {\n this.m_type = SeparationFunctionType.e_points;\n const localPointA = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n this.m_axis.setCombine(1, pointB, -1, pointA);\n const s = this.m_axis.normalize();\n return s;\n\n } else if (cache.indexA[0] === cache.indexA[1]) {\n // Two points on B and one on A.\n this.m_type = SeparationFunctionType.e_faceB;\n const localPointB1 = proxyB.getVertex(cache.indexB[0]);\n const localPointB2 = proxyB.getVertex(cache.indexB[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointB2, localPointB1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointB1, localPointB2);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n const localPointA = proxyA.getVertex(cache.indexA[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n let s = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n\n } else {\n // Two points on A and one or two points on B.\n this.m_type = SeparationFunctionType.e_faceA;\n const localPointA1 = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointA2 = this.m_proxyA.getVertex(cache.indexA[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointA2, localPointA1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointA1, localPointA2);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n let s = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n }\n }\n\n compute(find: boolean, t: number): number {\n // It was findMinSeparation and evaluate\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t);\n this.m_sweepB.getTransform(xfB, t);\n\n switch (this.m_type) {\n case SeparationFunctionType.e_points: {\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, this.m_axis);\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(this.m_axis));\n\n this.indexA = this.m_proxyA.getSupport(axisA);\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, this.m_axis) - Vec2.dot(pointA, this.m_axis);\n return sep;\n }\n\n case SeparationFunctionType.e_faceA: {\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n if (find) {\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(normal));\n\n this.indexA = -1;\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n return sep;\n }\n\n case SeparationFunctionType.e_faceB: {\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, Vec2.neg(normal));\n\n this.indexB = -1;\n this.indexA = this.m_proxyA.getSupport(axisA);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n const sep = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n return sep;\n }\n\n default:\n _ASSERT && console.assert(false);\n if (find) {\n this.indexA = -1;\n this.indexB = -1;\n }\n return 0.0;\n }\n }\n\n findMinSeparation(t: number): number {\n return this.compute(true, t);\n }\n\n evaluate(t: number): number {\n return this.compute(false, t);\n }\n}\n\nconst separationFunction_reuse = new SeparationFunction();\n\n// legacy exports\nTimeOfImpact.Input = TOIInput;\nTimeOfImpact.Output = TOIOutput;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { Body } from './Body';\nimport type { Contact } from './Contact';\nimport { Joint } from './Joint';\nimport { TimeOfImpact, TOIInput, TOIOutput, TOIOutputState } from '../collision/TimeOfImpact';\nimport { Distance, DistanceInput, DistanceOutput, SimplexCache } from '../collision/Distance';\nimport { World } from \"./World\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport class TimeStep {\n /** time step */\n dt: number = 0;\n /** inverse time step (0 if dt == 0) */\n inv_dt: number = 0;\n velocityIterations: number = 0;\n positionIterations: number = 0;\n warmStarting: boolean = false;\n blockSolve: boolean = true;\n\n /** timestep ratio for variable timestep */\n inv_dt0: number = 0.0;\n /** dt * inv_dt0 */\n dtRatio: number = 1;\n\n reset(dt: number): void {\n if (this.dt > 0.0) {\n this.inv_dt0 = this.inv_dt;\n }\n this.dt = dt;\n this.inv_dt = dt == 0 ? 0 : 1 / dt;\n this.dtRatio = dt * this.inv_dt0;\n }\n}\n\n// reuse\nconst s_subStep = new TimeStep();\n\n/**\n * Contact impulses for reporting. Impulses are used instead of forces because\n * sub-step forces may approach infinity for rigid body collisions. These match\n * up one-to-one with the contact points in Manifold.\n */\nexport class ContactImpulse {\n // TODO: merge with Contact class?\n\n private readonly contact: Contact;\n private readonly normals: number[];\n private readonly tangents: number[];\n\n constructor(contact: Contact) {\n this.contact = contact;\n this.normals = [];\n this.tangents = [];\n }\n\n get normalImpulses(): number[] {\n const contact = this.contact;\n const normals = this.normals;\n normals.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n normals.push(contact.v_points[p].normalImpulse);\n }\n return normals;\n }\n\n get tangentImpulses(): number[] {\n const contact = this.contact;\n const tangents = this.tangents;\n tangents.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n tangents.push(contact.v_points[p].tangentImpulse);\n }\n return tangents;\n }\n}\n\n/**\n * Finds and solves islands. An island is a connected subset of the world.\n */\nexport class Solver {\n m_world: World;\n m_stack: Body[];\n m_bodies: Body[];\n m_contacts: Contact[];\n m_joints: Joint[];\n\n constructor(world: World) {\n this.m_world = world;\n this.m_stack = [];\n this.m_bodies = [];\n this.m_contacts = [];\n this.m_joints = [];\n }\n\n clear(): void {\n this.m_stack.length = 0;\n this.m_bodies.length = 0;\n this.m_contacts.length = 0;\n this.m_joints.length = 0;\n }\n\n addBody(body: Body): void {\n _ASSERT && console.assert(body instanceof Body, 'Not a Body!', body);\n this.m_bodies.push(body);\n // why?\n // body.c_position.c.setZero();\n // body.c_position.a = 0;\n // body.c_velocity.v.setZero();\n // body.c_velocity.w = 0;\n }\n\n addContact(contact: Contact): void {\n // _ASSERT && console.assert(contact instanceof Contact, 'Not a Contact!', contact);\n this.m_contacts.push(contact);\n }\n\n addJoint(joint: Joint): void {\n _ASSERT && console.assert(joint instanceof Joint, 'Not a Joint!', joint);\n this.m_joints.push(joint);\n }\n\n solveWorld(step: TimeStep): void {\n const world = this.m_world;\n\n // Clear all the island flags.\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n }\n for (let c = world.m_contactList; c; c = c.m_next) {\n c.m_islandFlag = false;\n }\n for (let j = world.m_jointList; j; j = j.m_next) {\n j.m_islandFlag = false;\n }\n\n // Build and simulate all awake islands.\n const stack = this.m_stack;\n let loop = -1;\n for (let seed = world.m_bodyList; seed; seed = seed.m_next) {\n loop++;\n if (seed.m_islandFlag) {\n continue;\n }\n\n if (seed.isAwake() == false || seed.isActive() == false) {\n continue;\n }\n\n // The seed can be dynamic or kinematic.\n if (seed.isStatic()) {\n continue;\n }\n\n // Reset island and stack.\n this.clear();\n\n stack.push(seed);\n\n seed.m_islandFlag = true;\n\n // Perform a depth first search (DFS) on the constraint graph.\n while (stack.length > 0) {\n // Grab the next body off the stack and add it to the island.\n const b = stack.pop();\n _ASSERT && console.assert(b.isActive() == true);\n this.addBody(b);\n\n // Make sure the body is awake.\n b.setAwake(true);\n\n // To keep islands as small as possible, we don't\n // propagate islands across static bodies.\n if (b.isStatic()) {\n continue;\n }\n\n // Search all contacts connected to this body.\n for (let ce = b.m_contactList; ce; ce = ce.next) {\n const contact = ce.contact;\n\n // Has this contact already been added to an island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Is this contact solid and touching?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n this.addContact(contact);\n contact.m_islandFlag = true;\n\n const other = ce.other;\n\n // Was the other body already added to this island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && console.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n\n // Search all joints connect to this body.\n for (let je = b.m_jointList; je; je = je.next) {\n if (je.joint.m_islandFlag == true) {\n continue;\n }\n\n const other = je.other;\n\n // Don't simulate joints connected to inactive bodies.\n if (other.isActive() == false) {\n continue;\n }\n\n this.addJoint(je.joint);\n je.joint.m_islandFlag = true;\n\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && console.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n }\n\n this.solveIsland(step);\n\n // Post solve cleanup.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n // Allow static bodies to participate in other islands.\n // TODO: are they added at all?\n const b = this.m_bodies[i];\n if (b.isStatic()) {\n b.m_islandFlag = false;\n }\n }\n }\n }\n\n solveIsland(step: TimeStep): void {\n // B2: Island Solve\n const world = this.m_world;\n const gravity = world.m_gravity;\n const allowSleep = world.m_allowSleep;\n\n const h = step.dt;\n\n // Integrate velocities and apply damping. Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.m_sweep.c);\n const a = body.m_sweep.a;\n const v = Vec2.clone(body.m_linearVelocity);\n let w = body.m_angularVelocity;\n\n // Store positions for continuous collision.\n body.m_sweep.c0.setVec2(body.m_sweep.c);\n body.m_sweep.a0 = body.m_sweep.a;\n\n if (body.isDynamic()) {\n // Integrate velocities.\n v.addMul(h * body.m_gravityScale, gravity);\n v.addMul(h * body.m_invMass, body.m_force);\n w += h * body.m_invI * body.m_torque;\n /**\n *
\n         * Apply damping.\n         * ODE: dv/dt + c * v = 0\n         * Solution: v(t) = v0 * exp(-c * t)\n         * Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)\n         * v2 = exp(-c * dt) * v1\n         * Pade approximation:\n         * v2 = v1 * 1 / (1 + c * dt)\n         * 
\n */\n v.mul(1.0 / (1.0 + h * body.m_linearDamping));\n w *= 1.0 / (1.0 + h * body.m_angularDamping);\n }\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(step);\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(step);\n }\n\n if (step.warmStarting) {\n // Warm start.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.warmStartConstraint(step);\n }\n }\n\n for (let i = 0; i < this.m_joints.length; ++i) {\n const joint = this.m_joints[i];\n joint.initVelocityConstraints(step);\n }\n\n // Solve velocity constraints\n for (let i = 0; i < step.velocityIterations; ++i) {\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n joint.solveVelocityConstraints(step);\n }\n\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(step);\n }\n }\n\n // Store impulses for warm starting\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.storeConstraintImpulses(step);\n }\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.lengthSquared(translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c.setVec2(c);\n body.c_position.a = a;\n body.c_velocity.v.setVec2(v);\n body.c_velocity.w = w;\n }\n\n // Solve position constraints\n let positionSolved = false;\n for (let i = 0; i < step.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraint(step);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -3.0 * Settings.linearSlop;\n\n let jointsOkay = true;\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n const jointOkay = joint.solvePositionConstraints(step);\n jointsOkay = jointsOkay && jointOkay;\n }\n\n if (contactsOkay && jointsOkay) {\n // Exit early if the position errors are small.\n positionSolved = true;\n break;\n }\n }\n\n // Copy state buffers back to the bodies\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n body.m_sweep.c.setVec2(body.c_position.c);\n body.m_sweep.a = body.c_position.a;\n body.m_linearVelocity.setVec2(body.c_velocity.v);\n body.m_angularVelocity = body.c_velocity.w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n\n if (allowSleep) {\n let minSleepTime = Infinity;\n\n const linTolSqr = Settings.linearSleepToleranceSqr;\n const angTolSqr = Settings.angularSleepToleranceSqr;\n\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n if (body.isStatic()) {\n continue;\n }\n\n if ((body.m_autoSleepFlag == false)\n || (body.m_angularVelocity * body.m_angularVelocity > angTolSqr)\n || (Vec2.lengthSquared(body.m_linearVelocity) > linTolSqr)) {\n body.m_sleepTime = 0.0;\n minSleepTime = 0.0;\n } else {\n body.m_sleepTime += h;\n minSleepTime = Math.min(minSleepTime, body.m_sleepTime);\n }\n }\n\n if (minSleepTime >= Settings.timeToSleep && positionSolved) {\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.setAwake(false);\n }\n }\n }\n }\n\n /**\n * Find TOI contacts and solve them.\n */\n solveWorldTOI(step: TimeStep): void {\n const world = this.m_world;\n\n if (world.m_stepComplete) {\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n b.m_sweep.alpha0 = 0.0;\n }\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Invalidate TOI\n c.m_toiFlag = false;\n c.m_islandFlag = false;\n c.m_toiCount = 0;\n c.m_toi = 1.0;\n }\n }\n\n // Find TOI events and solve them.\n while (true) {\n // Find the first TOI.\n let minContact = null; // Contact\n let minAlpha = 1.0;\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Is this contact disabled?\n if (c.isEnabled() == false) {\n continue;\n }\n\n // Prevent excessive sub-stepping.\n if (c.m_toiCount > Settings.maxSubSteps) {\n continue;\n }\n\n let alpha = 1.0;\n if (c.m_toiFlag) {\n // This contact has a valid cached TOI.\n alpha = c.m_toi;\n } else {\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n // Is there a sensor?\n if (fA.isSensor() || fB.isSensor()) {\n continue;\n }\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n _ASSERT && console.assert(bA.isDynamic() || bB.isDynamic());\n\n const activeA = bA.isAwake() && !bA.isStatic();\n const activeB = bB.isAwake() && !bB.isStatic();\n\n // Is at least one body active (awake and dynamic or kinematic)?\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const collideA = bA.isBullet() || !bA.isDynamic();\n const collideB = bB.isBullet() || !bB.isDynamic();\n\n // Are these two non-bullet dynamic bodies?\n if (collideA == false && collideB == false) {\n continue;\n }\n\n // Compute the TOI for this contact.\n // Put the sweeps onto the same time interval.\n let alpha0 = bA.m_sweep.alpha0;\n\n if (bA.m_sweep.alpha0 < bB.m_sweep.alpha0) {\n alpha0 = bB.m_sweep.alpha0;\n bA.m_sweep.advance(alpha0);\n } else if (bB.m_sweep.alpha0 < bA.m_sweep.alpha0) {\n alpha0 = bA.m_sweep.alpha0;\n bB.m_sweep.advance(alpha0);\n }\n\n _ASSERT && console.assert(alpha0 < 1.0);\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const sweepA = bA.m_sweep;\n const sweepB = bB.m_sweep;\n\n // Compute the time of impact in interval [0, minTOI]\n const input = new TOIInput(); // TODO: reuse\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.sweepA.set(bA.m_sweep);\n input.sweepB.set(bB.m_sweep);\n input.tMax = 1.0;\n\n const output = new TOIOutput(); // TODO: reuse\n TimeOfImpact(output, input);\n\n // Beta is the fraction of the remaining portion of the [time?].\n const beta = output.t;\n if (output.state == TOIOutputState.e_touching) {\n alpha = Math.min(alpha0 + (1.0 - alpha0) * beta, 1.0);\n } else {\n alpha = 1.0;\n }\n\n c.m_toi = alpha;\n c.m_toiFlag = true;\n }\n\n if (alpha < minAlpha) {\n // This is the minimum TOI found so far.\n minContact = c;\n minAlpha = alpha;\n }\n }\n\n if (minContact == null || 1.0 - 10.0 * Math.EPSILON < minAlpha) {\n // No more TOI events. Done!\n world.m_stepComplete = true;\n break;\n }\n\n // Advance the bodies to the TOI.\n const fA = minContact.getFixtureA();\n const fB = minContact.getFixtureB();\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const backup1 = bA.m_sweep.clone();\n const backup2 = bB.m_sweep.clone();\n\n bA.advance(minAlpha);\n bB.advance(minAlpha);\n\n // The TOI contact likely has some new contact points.\n minContact.update(world);\n minContact.m_toiFlag = false;\n ++minContact.m_toiCount;\n\n // Is the contact solid?\n if (minContact.isEnabled() == false || minContact.isTouching() == false) {\n // Restore the sweeps.\n minContact.setEnabled(false);\n bA.m_sweep.set(backup1);\n bB.m_sweep.set(backup2);\n bA.synchronizeTransform();\n bB.synchronizeTransform();\n continue;\n }\n\n bA.setAwake(true);\n bB.setAwake(true);\n\n // Build the island\n this.clear();\n this.addBody(bA);\n this.addBody(bB);\n this.addContact(minContact);\n\n bA.m_islandFlag = true;\n bB.m_islandFlag = true;\n minContact.m_islandFlag = true;\n\n // Get contacts on bodyA and bodyB.\n const bodies = [ bA, bB ];\n for (let i = 0; i < bodies.length; ++i) {\n const body = bodies[i];\n if (body.isDynamic()) {\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n // if (this.m_bodyCount == this.m_bodyCapacity) { break; }\n // if (this.m_contactCount == this.m_contactCapacity) { break; }\n\n const contact = ce.contact;\n\n // Has this contact already been added to the island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Only add if either is static, kinematic or bullet.\n const other = ce.other;\n if (other.isDynamic() && !body.isBullet() && !other.isBullet()) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n // Tentatively advance the body to the TOI.\n const backup = other.m_sweep.clone();\n if (other.m_islandFlag == false) {\n other.advance(minAlpha);\n }\n\n // Update the contact points\n contact.update(world);\n\n // Was the contact disabled by the user?\n // Are there contact points?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n other.m_sweep.set(backup);\n other.synchronizeTransform();\n continue;\n }\n\n // Add the contact to the island\n contact.m_islandFlag = true;\n this.addContact(contact);\n\n // Has the other body already been added to the island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // Add the other body to the island.\n other.m_islandFlag = true;\n\n if (!other.isStatic()) {\n other.setAwake(true);\n }\n\n this.addBody(other);\n }\n }\n }\n\n s_subStep.reset((1.0 - minAlpha) * step.dt);\n s_subStep.dtRatio = 1.0;\n s_subStep.positionIterations = 20;\n s_subStep.velocityIterations = step.velocityIterations;\n s_subStep.warmStarting = false;\n\n this.solveIslandTOI(s_subStep, bA, bB);\n\n // Reset island flags and synchronize broad-phase proxies.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.m_islandFlag = false;\n\n if (!body.isDynamic()) {\n continue;\n }\n\n body.synchronizeFixtures();\n\n // Invalidate all contact TOIs on this displaced body.\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n ce.contact.m_toiFlag = false;\n ce.contact.m_islandFlag = false;\n }\n }\n\n // Commit fixture proxy movements to the broad-phase so that new contacts\n // are created.\n // Also, some contacts can be destroyed.\n world.findNewContacts();\n\n if (world.m_subStepping) {\n world.m_stepComplete = false;\n break;\n }\n }\n }\n\n solveIslandTOI(subStep: TimeStep, toiA: Body, toiB: Body): void {\n const world = this.m_world;\n\n // Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.c_position.c.setVec2(body.m_sweep.c);\n body.c_position.a = body.m_sweep.a;\n body.c_velocity.v.setVec2(body.m_linearVelocity);\n body.c_velocity.w = body.m_angularVelocity;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(subStep);\n }\n\n // Solve position constraints.\n for (let i = 0; i < subStep.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraintTOI(subStep, toiA, toiB);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -1.5 * Settings.linearSlop;\n if (contactsOkay) {\n break;\n }\n }\n\n if (false) {\n // Is the new position really safe?\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const c = this.m_contacts[i];\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const input = new DistanceInput();\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.transformA = bA.getTransform();\n input.transformB = bB.getTransform();\n input.useRadii = false;\n\n const output = new DistanceOutput();\n const cache = new SimplexCache();\n Distance(output, cache, input);\n\n if (output.distance == 0 || cache.count == 3) {\n cache.count += 0;\n }\n }\n }\n\n // Leap of faith to new safe state.\n toiA.m_sweep.c0.setVec2(toiA.c_position.c);\n toiA.m_sweep.a0 = toiA.c_position.a;\n toiB.m_sweep.c0.setVec2(toiB.c_position.c);\n toiB.m_sweep.a0 = toiB.c_position.a;\n\n // No warm starting is needed for TOI events because warm\n // starting impulses were applied in the discrete solver.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(subStep);\n }\n\n // Solve velocity constraints.\n for (let i = 0; i < subStep.velocityIterations; ++i) {\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(subStep);\n }\n }\n\n // Don't store the TOI contact forces for warm starting\n // because they can be quite large.\n\n const h = subStep.dt;\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.dot(translation, translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n\n // Sync bodies\n body.m_sweep.c = c;\n body.m_sweep.a = a;\n body.m_linearVelocity = v;\n body.m_angularVelocity = w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n }\n\n /** @internal */\n postSolveIsland(): void {\n for (let c = 0; c < this.m_contacts.length; ++c) {\n const contact = this.m_contacts[c];\n this.m_world.postSolve(contact, contact.m_impulse);\n }\n }\n}\n\n// @ts-ignore\nSolver.TimeStep = TimeStep;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from './Vec2';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 2-by-2 matrix. Stored in column-major order.\n */\nexport class Mat22 {\n ex: Vec2;\n ey: Vec2;\n\n constructor(a: number, b: number, c: number, d: number);\n constructor(a: { x: number; y: number }, b: { x: number; y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(a?, b?, c?, d?) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec2.clone(a);\n this.ey = Vec2.clone(b);\n } else if (typeof a === 'number') {\n this.ex = Vec2.neo(a, c);\n this.ey = Vec2.neo(b, d);\n } else {\n this.ex = Vec2.zero();\n this.ey = Vec2.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.ex) && Vec2.isValid(obj.ey);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Mat22.isValid(o), 'Invalid Mat22!', o);\n }\n\n set(a: Mat22): void;\n set(a: Vec2, b: Vec2): void;\n set(a: number, b: number, c: number, d: number): void;\n // tslint:disable-next-line:typedef\n set(a, b?, c?, d?): void {\n if (typeof a === 'number' && typeof b === 'number' && typeof c === 'number'\n && typeof d === 'number') {\n this.ex.setNum(a, c);\n this.ey.setNum(b, d);\n\n } else if (typeof a === 'object' && typeof b === 'object') {\n this.ex.setVec2(a);\n this.ey.setVec2(b);\n\n } else if (typeof a === 'object') {\n _ASSERT && Mat22.assert(a);\n this.ex.setVec2(a.ex);\n this.ey.setVec2(a.ey);\n\n } else {\n _ASSERT && console.assert(false);\n }\n }\n\n setIdentity(): void {\n this.ex.x = 1.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 1.0;\n }\n\n setZero(): void {\n this.ex.x = 0.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 0.0;\n }\n\n getInverse(): Mat22 {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const imx = new Mat22();\n imx.ex.x = det * d;\n imx.ey.x = -det * b;\n imx.ex.y = -det * c;\n imx.ey.y = det * a;\n return imx;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const w = Vec2.zero();\n w.x = det * (d * v.x - b * v.y);\n w.y = det * (a * v.y - c * v.x);\n return w;\n }\n\n /**\n * Multiply a matrix times a vector. If a rotation matrix is provided, then this\n * transforms the vector from one frame to another.\n */\n static mul(mx: Mat22, my: Mat22): Mat22;\n static mul(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(mx, v) {\n if (v && 'x' in v && 'y' in v) {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n }\n\n static mulMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n /**\n * Multiply a matrix transpose times a vector. If a rotation matrix is provided,\n * then this transforms the vector from one frame to another (inverse\n * transform).\n */\n static mulT(mx: Mat22, my: Mat22): Mat22;\n static mulT(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(mx, v) {\n if (v && 'x' in v && 'y' in v) { // Vec2\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulTVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n }\n\n static mulTMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n static abs(mx: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n return new Mat22(Vec2.abs(mx.ex), Vec2.abs(mx.ey));\n }\n\n static add(mx1: Mat22, mx2: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx1);\n _ASSERT && Mat22.assert(mx2);\n return new Mat22(Vec2.add(mx1.ex, mx2.ex), Vec2.add(mx1.ey, mx2.ey));\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { Transform } from '../common/Transform';\nimport { math as Math } from '../common/Math';\nimport { Rot } from '../common/Rot';\n\nexport enum ManifoldType {\n e_circles = 0,\n e_faceA = 1,\n e_faceB = 2\n}\n\nexport enum ContactFeatureType {\n e_vertex = 0,\n e_face = 1\n}\n\n/**\n * This is used for determining the state of contact points.\n */\n export enum PointState {\n /** Point does not exist */\n nullState = 0,\n /** Point was added in the update */\n addState = 1,\n /** Point persisted across the update */\n persistState = 2,\n /** Point was removed in the update */\n removeState = 3\n}\n\n/**\n * Used for computing contact manifolds.\n */\n export class ClipVertex {\n v: Vec2 = Vec2.zero();\n id: ContactID = new ContactID();\n\n set(o: ClipVertex): void {\n this.v.setVec2(o.v);\n this.id.set(o.id);\n }\n}\n\n/**\n * A manifold for two touching convex shapes. Manifolds are created in `evaluate`\n * method of Contact subclasses.\n *\n * Supported manifold types are e_faceA or e_faceB for clip point versus plane\n * with radius and e_circles point versus point with radius.\n *\n * We store contacts in this way so that position correction can account for\n * movement, which is critical for continuous physics. All contact scenarios\n * must be expressed in one of these types. This structure is stored across time\n * steps, so we keep it small.\n *\n * @prop type e_circle, e_faceA, e_faceB\n * @prop localPoint Usage depends on manifold type:
\n * e_circles: the local center of circleA
\n * e_faceA: the center of faceA
\n * e_faceB: the center of faceB\n * @prop localNormal Usage depends on manifold type:
\n * e_circles: not used
\n * e_faceA: the normal on polygonA
\n * e_faceB: the normal on polygonB\n * @prop points The points of contact {ManifoldPoint[]}\n * @prop pointCount The number of manifold points\n */\nexport class Manifold {\n type: ManifoldType;\n localNormal: Vec2 = Vec2.zero();\n localPoint: Vec2 = Vec2.zero();\n points: ManifoldPoint[] = [ new ManifoldPoint(), new ManifoldPoint() ];\n pointCount: number = 0;\n\n /**\n * Evaluate the manifold with supplied transforms. This assumes modest motion\n * from the original state. This does not change the point count, impulses, etc.\n * The radii must come from the shapes that generated the manifold.\n */\n getWorldManifold(wm: WorldManifold | undefined, xfA: Transform, radiusA: number, xfB: Transform, radiusB: number): WorldManifold {\n if (this.pointCount == 0) {\n return;\n }\n\n wm = wm || new WorldManifold();\n\n let normal = wm.normal;\n const points = wm.points;\n const separations = wm.separations;\n\n // TODO: improve\n switch (this.type) {\n case ManifoldType.e_circles: {\n normal = Vec2.neo(1.0, 0.0);\n const pointA = Transform.mulVec2(xfA, this.localPoint);\n const pointB = Transform.mulVec2(xfB, this.points[0].localPoint);\n const dist = Vec2.sub(pointB, pointA);\n if (Vec2.lengthSquared(dist) > Math.EPSILON * Math.EPSILON) {\n normal.setVec2(dist);\n normal.normalize();\n }\n const cA = pointA.clone().addMul(radiusA, normal);\n const cB = pointB.clone().addMul(-radiusB, normal);\n points[0] = Vec2.mid(cA, cB);\n separations[0] = Vec2.dot(Vec2.sub(cB, cA), normal);\n points.length = 1;\n separations.length = 1;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfA, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfB, this.points[i].localPoint);\n const cA = Vec2.clone(clipPoint).addMul(radiusA - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cB = Vec2.clone(clipPoint).subMul(radiusB, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cB, cA), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfB, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfA, this.points[i].localPoint);\n const cB = Vec2.combine(1, clipPoint, radiusB - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cA = Vec2.combine(1, clipPoint, -radiusA, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cA, cB), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n // Ensure normal points from A to B.\n normal.mul(-1);\n break;\n }\n }\n\n wm.normal = normal;\n wm.points = points;\n wm.separations = separations;\n return wm;\n }\n\n static clipSegmentToLine = clipSegmentToLine;\n static ClipVertex = ClipVertex;\n static getPointStates = getPointStates;\n static PointState = PointState;\n}\n\n/**\n * A manifold point is a contact point belonging to a contact manifold. It holds\n * details related to the geometry and dynamics of the contact points.\n *\n * This structure is stored across time steps, so we keep it small.\n *\n * Note: impulses are used for internal caching and may not provide reliable\n * contact forces, especially for high speed collisions.\n */\nexport class ManifoldPoint {\n /**\n * Usage depends on manifold type.\n * e_circles: the local center of circleB,\n * e_faceA: the local center of cirlceB or the clip point of polygonB,\n * e_faceB: the clip point of polygonA.\n */\n localPoint: Vec2 = Vec2.zero();\n /**\n * The non-penetration impulse\n */\n normalImpulse: number = 0;\n /**\n * The friction impulse\n */\n tangentImpulse: number = 0;\n /**\n * Uniquely identifies a contact point between two shapes to facilatate warm starting\n */\n id: ContactID = new ContactID();\n}\n\n/**\n * Contact ids to facilitate warm starting.\n */\nexport class ContactID {\n cf: ContactFeature = new ContactFeature();\n\n /**\n * Used to quickly compare contact ids.\n */\n get key(): number {\n return this.cf.indexA + this.cf.indexB * 4 + this.cf.typeA * 16 + this.cf.typeB * 64;\n }\n\n set(o: ContactID): void {\n // this.key = o.key;\n this.cf.set(o.cf);\n }\n}\n\n/**\n * The features that intersect to form the contact point.\n */\nexport class ContactFeature {\n /**\n * Feature index on shapeA\n */\n indexA: number;\n /**\n * Feature index on shapeB\n */\n indexB: number;\n /**\n * The feature type on shapeA\n */\n typeA: ContactFeatureType;\n /**\n * The feature type on shapeB\n */\n typeB: ContactFeatureType;\n set(o: ContactFeature): void {\n this.indexA = o.indexA;\n this.indexB = o.indexB;\n this.typeA = o.typeA;\n this.typeB = o.typeB;\n }\n}\n\n/**\n * This is used to compute the current state of a contact manifold.\n */\nexport class WorldManifold {\n /**\n * World vector pointing from A to B\n */\n normal: Vec2;\n /**\n * World contact point (point of intersection)\n */\n points: Vec2[] = []; // [maxManifoldPoints]\n /**\n * A negative value indicates overlap, in meters\n */\n separations: number[] = []; // [maxManifoldPoints]\n}\n\n/**\n * Compute the point states given two manifolds. The states pertain to the\n * transition from manifold1 to manifold2. So state1 is either persist or remove\n * while state2 is either add or persist.\n */\nexport function getPointStates(\n state1: PointState[],\n state2: PointState[],\n manifold1: Manifold,\n manifold2: Manifold\n): void {\n // state1, state2: PointState[Settings.maxManifoldPoints]\n\n // for (var i = 0; i < Settings.maxManifoldPoints; ++i) {\n // state1[i] = PointState.nullState;\n // state2[i] = PointState.nullState;\n // }\n\n // Detect persists and removes.\n for (let i = 0; i < manifold1.pointCount; ++i) {\n const id = manifold1.points[i].id;\n\n state1[i] = PointState.removeState;\n\n for (let j = 0; j < manifold2.pointCount; ++j) {\n if (manifold2.points[j].id.key == id.key) {\n state1[i] = PointState.persistState;\n break;\n }\n }\n }\n\n // Detect persists and adds.\n for (let i = 0; i < manifold2.pointCount; ++i) {\n const id = manifold2.points[i].id;\n\n state2[i] = PointState.addState;\n\n for (let j = 0; j < manifold1.pointCount; ++j) {\n if (manifold1.points[j].id.key == id.key) {\n state2[i] = PointState.persistState;\n break;\n }\n }\n }\n}\n\n/**\n * Clipping for contact manifolds. Sutherland-Hodgman clipping.\n */\nexport function clipSegmentToLine(\n vOut: ClipVertex[],\n vIn: ClipVertex[],\n normal: Vec2,\n offset: number,\n vertexIndexA: number\n): number {\n // Start with no output points\n let numOut = 0;\n\n // Calculate the distance of end points to the line\n const distance0 = Vec2.dot(normal, vIn[0].v) - offset;\n const distance1 = Vec2.dot(normal, vIn[1].v) - offset;\n\n // If the points are behind the plane\n if (distance0 <= 0.0)\n vOut[numOut++].set(vIn[0]);\n if (distance1 <= 0.0)\n vOut[numOut++].set(vIn[1]);\n\n // If the points are on different sides of the plane\n if (distance0 * distance1 < 0.0) {\n // Find intersection point of edge and plane\n const interp = distance0 / (distance0 - distance1);\n vOut[numOut].v.setCombine(1 - interp, vIn[0].v, interp, vIn[1].v);\n\n // VertexA is hitting edgeB.\n vOut[numOut].id.cf.indexA = vertexIndexA;\n vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB;\n vOut[numOut].id.cf.typeA = ContactFeatureType.e_vertex;\n vOut[numOut].id.cf.typeB = ContactFeatureType.e_face;\n ++numOut;\n }\n\n return numOut;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { ShapeType } from \"../collision/Shape\";\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Transform } from '../common/Transform';\nimport { Mat22 } from '../common/Mat22';\nimport { Rot } from '../common/Rot';\nimport { Settings } from '../Settings';\nimport { Manifold, ManifoldType, WorldManifold } from '../collision/Manifold';\nimport { testOverlap } from '../collision/Distance';\nimport { Fixture } from \"./Fixture\";\nimport { Body } from \"./Body\";\nimport { ContactImpulse, TimeStep } from \"./Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst DEBUG_SOLVER = false;\n\n/**\n * A contact edge is used to connect bodies and contacts together in a contact\n * graph where each body is a node and each contact is an edge. A contact edge\n * belongs to a doubly linked list maintained in each attached body. Each\n * contact has two contact nodes, one for each attached body.\n *\n * @prop {Contact} contact The contact\n * @prop {ContactEdge} prev The previous contact edge in the body's contact list\n * @prop {ContactEdge} next The next contact edge in the body's contact list\n * @prop {Body} other Provides quick access to the other body attached.\n */\nexport class ContactEdge {\n contact: Contact;\n prev: ContactEdge | undefined;\n next: ContactEdge | undefined;\n other: Body | undefined;\n constructor(contact: Contact) {\n this.contact = contact;\n }\n}\n\nexport type EvaluateFunction = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void;\n\nexport type ContactCallback = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void /* & { destroyFcn?: (contact: Contact) => void }*/;\n\n\n/**\n * Friction mixing law. The idea is to allow either fixture to drive the\n * restitution to zero. For example, anything slides on ice.\n */\nexport function mixFriction(friction1: number, friction2: number): number {\n return Math.sqrt(friction1 * friction2);\n}\n\n/**\n * Restitution mixing law. The idea is allow for anything to bounce off an\n * inelastic surface. For example, a superball bounces on anything.\n */\nexport function mixRestitution(restitution1: number, restitution2: number): number {\n return restitution1 > restitution2 ? restitution1 : restitution2;\n}\n\n// TODO: move this to Settings?\nconst s_registers = [];\n\n// TODO: merge with ManifoldPoint?\nexport class VelocityConstraintPoint {\n rA: Vec2 = Vec2.zero();\n rB: Vec2 = Vec2.zero();\n normalImpulse: number = 0;\n tangentImpulse: number = 0;\n normalMass: number = 0;\n tangentMass: number = 0;\n velocityBias: number = 0;\n}\n\n/**\n * The class manages contact between two shapes. A contact exists for each\n * overlapping AABB in the broad-phase (except if filtered). Therefore a contact\n * object may exist that has no contact points.\n */\nexport class Contact {\n /** @internal */\n m_nodeA: ContactEdge;\n /** @internal */\n m_nodeB: ContactEdge;\n /** @internal */\n m_fixtureA: Fixture;\n /** @internal */\n m_fixtureB: Fixture;\n /** @internal */\n m_indexA: number;\n /** @internal */\n m_indexB: number;\n /** @internal */\n m_evaluateFcn: EvaluateFunction;\n /** @internal */\n m_manifold: Manifold = new Manifold();\n /** @internal */\n m_prev: Contact | null = null;\n /** @internal */\n m_next: Contact | null = null;\n /** @internal */\n m_toi: number = 1.0;\n /** @internal */\n m_toiCount: number = 0;\n /** @internal This contact has a valid TOI in m_toi */\n m_toiFlag: boolean = false;\n /** @internal */\n m_friction: number;\n /** @internal */\n m_restitution: number;\n /** @internal */\n m_tangentSpeed: number = 0.0;\n /** @internal This contact can be disabled (by user) */\n m_enabledFlag: boolean = true;\n /** @internal Used when crawling contact graph when forming islands. */\n m_islandFlag: boolean = false;\n /** @internal Set when the shapes are touching. */\n m_touchingFlag: boolean = false;\n /** @internal This contact needs filtering because a fixture filter was changed. */\n m_filterFlag: boolean = false;\n /** @internal This bullet contact had a TOI event */\n m_bulletHitFlag: boolean = false;\n\n /** @internal Contact reporting impulse object cache */\n m_impulse: ContactImpulse = new ContactImpulse(this);\n\n // VelocityConstraint\n /** @internal */ v_points: VelocityConstraintPoint[] = []; // [maxManifoldPoints];\n /** @internal */ v_normal: Vec2 = Vec2.zero();\n /** @internal */ v_normalMass: Mat22 = new Mat22();\n /** @internal */ v_K: Mat22 = new Mat22();\n /** @internal */ v_pointCount: number;\n /** @internal */ v_tangentSpeed: number | undefined;\n /** @internal */ v_friction: number | undefined;\n /** @internal */ v_restitution: number | undefined;\n /** @internal */ v_invMassA: number | undefined;\n /** @internal */ v_invMassB: number | undefined;\n /** @internal */ v_invIA: number | undefined;\n /** @internal */ v_invIB: number | undefined;\n\n // PositionConstraint\n /** @internal */ p_localPoints: Vec2[] = []; // [maxManifoldPoints];\n /** @internal */ p_localNormal: Vec2 = Vec2.zero();\n /** @internal */ p_localPoint: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterA: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterB: Vec2 = Vec2.zero();\n /** @internal */ p_type: ManifoldType | undefined;\n /** @internal */ p_radiusA: number | undefined;\n /** @internal */ p_radiusB: number | undefined;\n /** @internal */ p_pointCount: number | undefined;\n /** @internal */ p_invMassA: number | undefined;\n /** @internal */ p_invMassB: number | undefined;\n /** @internal */ p_invIA: number | undefined;\n /** @internal */ p_invIB: number | undefined;\n\n constructor(fA: Fixture, indexA: number, fB: Fixture, indexB: number, evaluateFcn: EvaluateFunction) {\n // Nodes for connecting bodies.\n this.m_nodeA = new ContactEdge(this);\n this.m_nodeB = new ContactEdge(this);\n\n this.m_fixtureA = fA;\n this.m_fixtureB = fB;\n\n this.m_indexA = indexA;\n this.m_indexB = indexB;\n\n this.m_evaluateFcn = evaluateFcn;\n\n this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction);\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution);\n }\n\n initConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const shapeA = fixtureA.getShape();\n const shapeB = fixtureB.getShape();\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const manifold = this.getManifold();\n\n const pointCount = manifold.pointCount;\n _ASSERT && console.assert(pointCount > 0);\n\n this.v_invMassA = bodyA.m_invMass;\n this.v_invMassB = bodyB.m_invMass;\n this.v_invIA = bodyA.m_invI;\n this.v_invIB = bodyB.m_invI;\n\n this.v_friction = this.m_friction;\n this.v_restitution = this.m_restitution;\n this.v_tangentSpeed = this.m_tangentSpeed;\n\n this.v_pointCount = pointCount;\n\n this.v_K.setZero();\n this.v_normalMass.setZero();\n\n this.p_invMassA = bodyA.m_invMass;\n this.p_invMassB = bodyB.m_invMass;\n this.p_invIA = bodyA.m_invI;\n this.p_invIB = bodyB.m_invI;\n this.p_localCenterA = Vec2.clone(bodyA.m_sweep.localCenter);\n this.p_localCenterB = Vec2.clone(bodyB.m_sweep.localCenter);\n\n this.p_radiusA = shapeA.m_radius;\n this.p_radiusB = shapeB.m_radius;\n\n this.p_type = manifold.type;\n this.p_localNormal = Vec2.clone(manifold.localNormal);\n this.p_localPoint = Vec2.clone(manifold.localPoint);\n this.p_pointCount = pointCount;\n\n for (let j = 0; j < pointCount; ++j) {\n const cp = manifold.points[j];\n const vcp = this.v_points[j] = new VelocityConstraintPoint();\n\n if (step.warmStarting) {\n vcp.normalImpulse = step.dtRatio * cp.normalImpulse;\n vcp.tangentImpulse = step.dtRatio * cp.tangentImpulse;\n\n } else {\n vcp.normalImpulse = 0.0;\n vcp.tangentImpulse = 0.0;\n }\n\n vcp.rA.setZero();\n vcp.rB.setZero();\n vcp.normalMass = 0.0;\n vcp.tangentMass = 0.0;\n vcp.velocityBias = 0.0;\n\n this.p_localPoints[j] = Vec2.clone(cp.localPoint);\n\n }\n }\n\n /**\n * Get the contact manifold. Do not modify the manifold unless you understand\n * the internals of the library.\n */\n getManifold(): Manifold {\n return this.m_manifold;\n }\n\n /**\n * Get the world manifold.\n */\n getWorldManifold(worldManifold: WorldManifold | null | undefined): WorldManifold | undefined {\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n\n return this.m_manifold.getWorldManifold(worldManifold, bodyA.getTransform(),\n shapeA.m_radius, bodyB.getTransform(), shapeB.m_radius);\n }\n\n /**\n * Enable/disable this contact. This can be used inside the pre-solve contact\n * listener. The contact is only disabled for the current time step (or sub-step\n * in continuous collisions).\n */\n setEnabled(flag: boolean): void {\n this.m_enabledFlag = !!flag;\n }\n\n /**\n * Has this contact been disabled?\n */\n isEnabled(): boolean {\n return this.m_enabledFlag;\n }\n\n /**\n * Is this contact touching?\n */\n isTouching(): boolean {\n return this.m_touchingFlag;\n }\n\n /**\n * Get the next contact in the world's contact list.\n */\n getNext(): Contact | null {\n return this.m_next;\n }\n\n /**\n * Get fixture A in this contact.\n */\n getFixtureA(): Fixture {\n return this.m_fixtureA;\n }\n\n /**\n * Get fixture B in this contact.\n */\n getFixtureB(): Fixture {\n return this.m_fixtureB;\n }\n\n /**\n * Get the child primitive index for fixture A.\n */\n getChildIndexA(): number {\n return this.m_indexA;\n }\n\n /**\n * Get the child primitive index for fixture B.\n */\n getChildIndexB(): number {\n return this.m_indexB;\n }\n\n /**\n * Flag this contact for filtering. Filtering will occur the next time step.\n */\n flagForFiltering(): void {\n this.m_filterFlag = true;\n }\n\n /**\n * Override the default friction mixture. You can call this in\n * ContactListener.preSolve. This value persists until set or reset.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the friction.\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Reset the friction mixture to the default value.\n */\n resetFriction(): void {\n this.m_friction = mixFriction(this.m_fixtureA.m_friction,\n this.m_fixtureB.m_friction);\n }\n\n /**\n * Override the default restitution mixture. You can call this in\n * ContactListener.preSolve. The value persists until you set or reset.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Get the restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Reset the restitution to the default value.\n */\n resetRestitution(): void {\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution,\n this.m_fixtureB.m_restitution);\n }\n\n /**\n * Set the desired tangent speed for a conveyor belt behavior. In meters per\n * second.\n */\n setTangentSpeed(speed: number): void {\n this.m_tangentSpeed = speed;\n }\n\n /**\n * Get the desired tangent speed. In meters per second.\n */\n getTangentSpeed(): number {\n return this.m_tangentSpeed;\n }\n\n /**\n * Called by Update method, and implemented by subclasses.\n */\n evaluate(manifold: Manifold, xfA: Transform, xfB: Transform): void {\n this.m_evaluateFcn(manifold, xfA, this.m_fixtureA, this.m_indexA, xfB,\n this.m_fixtureB, this.m_indexB);\n }\n\n /**\n * Updates the contact manifold and touching status.\n *\n * Note: do not assume the fixture AABBs are overlapping or are valid.\n *\n * @param listener.beginContact\n * @param listener.endContact\n * @param listener.preSolve\n */\n update(listener?: {\n beginContact(contact: Contact): void,\n endContact(contact: Contact): void,\n preSolve(contact: Contact, oldManifold: Manifold): void\n }): void {\n\n // Re-enable this contact.\n this.m_enabledFlag = true;\n\n let touching = false;\n const wasTouching = this.m_touchingFlag;\n\n const sensorA = this.m_fixtureA.isSensor();\n const sensorB = this.m_fixtureB.isSensor();\n const sensor = sensorA || sensorB;\n\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const xfA = bodyA.getTransform();\n const xfB = bodyB.getTransform();\n\n let oldManifold;\n\n // Is this contact a sensor?\n if (sensor) {\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n touching = testOverlap(shapeA, this.m_indexA, shapeB, this.m_indexB, xfA, xfB);\n\n // Sensors don't generate manifolds.\n this.m_manifold.pointCount = 0;\n } else {\n\n // TODO reuse manifold\n oldManifold = this.m_manifold;\n this.m_manifold = new Manifold();\n\n this.evaluate(this.m_manifold, xfA, xfB);\n touching = this.m_manifold.pointCount > 0;\n\n // Match old contact ids to new contact ids and copy the\n // stored impulses to warm start the solver.\n for (let i = 0; i < this.m_manifold.pointCount; ++i) {\n const nmp = this.m_manifold.points[i];\n nmp.normalImpulse = 0.0;\n nmp.tangentImpulse = 0.0;\n\n for (let j = 0; j < oldManifold.pointCount; ++j) {\n const omp = oldManifold.points[j];\n if (omp.id.key == nmp.id.key) {\n nmp.normalImpulse = omp.normalImpulse;\n nmp.tangentImpulse = omp.tangentImpulse;\n break;\n }\n }\n }\n\n if (touching != wasTouching) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n }\n\n this.m_touchingFlag = touching;\n\n if (!wasTouching && touching && listener) {\n listener.beginContact(this);\n }\n\n if (wasTouching && !touching && listener) {\n listener.endContact(this);\n }\n\n if (!sensor && touching && listener) {\n listener.preSolve(this, oldManifold);\n }\n }\n\n solvePositionConstraint(step: TimeStep): number {\n return this._solvePositionConstraint(step);\n }\n\n solvePositionConstraintTOI(step: TimeStep, toiA: Body, toiB: Body): number {\n return this._solvePositionConstraint(step, toiA, toiB);\n }\n\n private _solvePositionConstraint(step: TimeStep, toiA?: Body, toiB?: Body): number {\n const toi: boolean = !!toiA && !!toiB;\n\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n let mA = 0.0;\n let iA = 0.0;\n if (!toi || (bodyA == toiA || bodyA == toiB)) {\n mA = this.p_invMassA;\n iA = this.p_invIA;\n }\n\n let mB = 0.0;\n let iB = 0.0;\n if (!toi || (bodyB == toiA || bodyB == toiB)) {\n mB = this.p_invMassB;\n iB = this.p_invIB;\n }\n\n const cA = Vec2.clone(positionA.c);\n let aA = positionA.a;\n\n const cB = Vec2.clone(positionB.c);\n let aB = positionB.a;\n\n let minSeparation = 0.0;\n\n // Solve normal constraints\n for (let j = 0; j < this.p_pointCount; ++j) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p = Vec2.sub(cA, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p = Vec2.sub(cB, Rot.mulVec2(xfB.q, localCenterB));\n\n // PositionSolverManifold\n let normal;\n let point;\n let separation;\n switch (this.p_type) {\n case ManifoldType.e_circles: {\n const pointA = Transform.mulVec2(xfA, this.p_localPoint);\n const pointB = Transform.mulVec2(xfB, this.p_localPoints[0]);\n normal = Vec2.sub(pointB, pointA);\n normal.normalize();\n point = Vec2.combine(0.5, pointA, 0.5, pointB);\n separation = Vec2.dot(Vec2.sub(pointB, pointA), normal) - this.p_radiusA - this.p_radiusB;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfA, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfB, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfB, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfA, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n\n // Ensure normal points from A to B\n normal.mul(-1);\n break;\n }\n }\n\n const rA = Vec2.sub(point, cA);\n const rB = Vec2.sub(point, cB);\n\n // Track max constraint error.\n minSeparation = Math.min(minSeparation, separation);\n\n const baumgarte = toi ? Settings.toiBaugarte : Settings.baumgarte;\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n // Prevent large corrections and allow slop.\n const C = Math.clamp(baumgarte * (separation + linearSlop), -maxLinearCorrection, 0.0);\n\n // Compute the effective mass.\n const rnA = Vec2.crossVec2Vec2(rA, normal);\n const rnB = Vec2.crossVec2Vec2(rB, normal);\n const K = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n // Compute normal impulse\n const impulse = K > 0.0 ? -C / K : 0.0;\n\n const P = Vec2.mulNumVec2(impulse, normal);\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n\n return minSeparation;\n }\n\n initVelocityConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const radiusA = this.p_radiusA;\n const radiusB = this.p_radiusB;\n const manifold = this.getManifold();\n\n const mA = this.v_invMassA;\n const mB = this.v_invMassB;\n const iA = this.v_invIA;\n const iB = this.v_invIB;\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n const cA = Vec2.clone(positionA.c);\n const aA = positionA.a;\n const vA = Vec2.clone(velocityA.v);\n const wA = velocityA.w;\n\n const cB = Vec2.clone(positionB.c);\n const aB = positionB.a;\n const vB = Vec2.clone(velocityB.v);\n const wB = velocityB.w;\n\n _ASSERT && console.assert(manifold.pointCount > 0);\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p.setCombine(1, cA, -1, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p.setCombine(1, cB, -1, Rot.mulVec2(xfB.q, localCenterB));\n\n const worldManifold = manifold.getWorldManifold(null, xfA, radiusA, xfB, radiusB);\n\n this.v_normal.setVec2(worldManifold.normal);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n vcp.rA.setVec2(Vec2.sub(worldManifold.points[j], cA));\n vcp.rB.setVec2(Vec2.sub(worldManifold.points[j], cB));\n\n const rnA = Vec2.crossVec2Vec2(vcp.rA, this.v_normal);\n const rnB = Vec2.crossVec2Vec2(vcp.rB, this.v_normal);\n\n const kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n vcp.normalMass = kNormal > 0.0 ? 1.0 / kNormal : 0.0;\n\n const tangent = Vec2.crossVec2Num(this.v_normal, 1.0);\n\n const rtA = Vec2.crossVec2Vec2(vcp.rA, tangent);\n const rtB = Vec2.crossVec2Vec2(vcp.rB, tangent);\n\n const kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB;\n\n vcp.tangentMass = kTangent > 0.0 ? 1.0 / kTangent : 0.0;\n\n // Setup a velocity bias for restitution.\n vcp.velocityBias = 0.0;\n const vRel = Vec2.dot(this.v_normal, vB)\n + Vec2.dot(this.v_normal, Vec2.crossNumVec2(wB, vcp.rB))\n - Vec2.dot(this.v_normal, vA)\n - Vec2.dot(this.v_normal, Vec2.crossNumVec2(wA, vcp.rA));\n if (vRel < -Settings.velocityThreshold) {\n vcp.velocityBias = -this.v_restitution * vRel;\n }\n }\n\n // If we have two points, then prepare the block solver.\n if (this.v_pointCount == 2 && step.blockSolve) {\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const rn1A = Vec2.crossVec2Vec2(vcp1.rA, this.v_normal);\n const rn1B = Vec2.crossVec2Vec2(vcp1.rB, this.v_normal);\n const rn2A = Vec2.crossVec2Vec2(vcp2.rA, this.v_normal);\n const rn2B = Vec2.crossVec2Vec2(vcp2.rB, this.v_normal);\n\n const k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B;\n const k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B;\n const k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B;\n\n // Ensure a reasonable condition number.\n const k_maxConditionNumber = 1000.0;\n if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) {\n // K is safe to invert.\n this.v_K.ex.setNum(k11, k12);\n this.v_K.ey.setNum(k12, k22);\n this.v_normalMass.set(this.v_K.getInverse());\n } else {\n // The constraints are redundant, just use one.\n // TODO_ERIN use deepest?\n this.v_pointCount = 1;\n }\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n warmStartConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n const P = Vec2.combine(vcp.normalImpulse, normal, vcp.tangentImpulse, tangent);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n vA.subMul(mA, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n vB.addMul(mB, P);\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n storeConstraintImpulses(step: TimeStep): void {\n const manifold = this.m_manifold;\n for (let j = 0; j < this.v_pointCount; ++j) {\n manifold.points[j].normalImpulse = this.v_points[j].normalImpulse;\n manifold.points[j].tangentImpulse = this.v_points[j].tangentImpulse;\n }\n }\n\n solveVelocityConstraint(step: TimeStep): void {\n const bodyA = this.m_fixtureA.m_body;\n const bodyB = this.m_fixtureB.m_body;\n\n const velocityA = bodyA.c_velocity;\n const positionA = bodyA.c_position;\n\n const velocityB = bodyB.c_velocity;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n const friction = this.v_friction;\n\n _ASSERT && console.assert(this.v_pointCount == 1 || this.v_pointCount == 2);\n\n // Solve tangent constraints first because non-penetration is more important\n // than friction.\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute tangent force\n const vt = Vec2.dot(dv, tangent) - this.v_tangentSpeed;\n let lambda = vcp.tangentMass * (-vt);\n\n // Clamp the accumulated force\n const maxFriction = friction * vcp.normalImpulse;\n const newImpulse = Math.clamp(vcp.tangentImpulse + lambda, -maxFriction, maxFriction);\n lambda = newImpulse - vcp.tangentImpulse;\n vcp.tangentImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, tangent);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n\n // Solve normal constraints\n if (this.v_pointCount == 1 || step.blockSolve == false) {\n for (let i = 0; i < this.v_pointCount; ++i) {\n const vcp = this.v_points[i]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute normal impulse\n const vn = Vec2.dot(dv, normal);\n let lambda = -vcp.normalMass * (vn - vcp.velocityBias);\n\n // Clamp the accumulated impulse\n const newImpulse = Math.max(vcp.normalImpulse + lambda, 0.0);\n lambda = newImpulse - vcp.normalImpulse;\n vcp.normalImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, normal);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n } else {\n // Block solver developed in collaboration with Dirk Gregorius (back in\n // 01/07 on Box2D_Lite).\n // Build the mini LCP for this contact patch\n //\n // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i =\n // 1..2\n //\n // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n )\n // b = vn0 - velocityBias\n //\n // The system is solved using the \"Total enumeration method\" (s. Murty).\n // The complementary constraint vn_i * x_i\n // implies that we must have in any solution either vn_i = 0 or x_i = 0.\n // So for the 2D contact problem the cases\n // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and\n // vn1 = 0 need to be tested. The first valid\n // solution that satisfies the problem is chosen.\n //\n // In order to account of the accumulated impulse 'a' (because of the\n // iterative nature of the solver which only requires\n // that the accumulated impulse is clamped and not the incremental\n // impulse) we change the impulse variable (x_i).\n //\n // Substitute:\n //\n // x = a + d\n //\n // a := old total impulse\n // x := new total impulse\n // d := incremental impulse\n //\n // For the current iteration we extend the formula for the incremental\n // impulse\n // to compute the new total impulse:\n //\n // vn = A * d + b\n // = A * (x - a) + b\n // = A * x + b - A * a\n // = A * x + b'\n // b' = b - A * a;\n\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const a = Vec2.neo(vcp1.normalImpulse, vcp2.normalImpulse);\n _ASSERT && console.assert(a.x >= 0.0 && a.y >= 0.0);\n\n // Relative velocity at contact\n let dv1 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp1.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp1.rA));\n let dv2 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp2.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp2.rA));\n\n // Compute normal velocity\n let vn1 = Vec2.dot(dv1, normal);\n let vn2 = Vec2.dot(dv2, normal);\n\n const b = Vec2.neo(vn1 - vcp1.velocityBias, vn2 - vcp2.velocityBias);\n\n // Compute b'\n b.sub(Mat22.mulVec2(this.v_K, a));\n\n const k_errorTol = 1e-3;\n // NOT_USED(k_errorTol);\n\n while (true) {\n //\n // Case 1: vn = 0\n //\n // 0 = A * x + b'\n //\n // Solve for x:\n //\n // x = - inv(A) * b'\n //\n const x = Mat22.mulVec2(this.v_normalMass, b).neg();\n\n if (x.x >= 0.0 && x.y >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n dv1 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA)));\n dv2 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA)));\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && console.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n _ASSERT && console.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 2: vn1 = 0 and x2 = 0\n //\n // 0 = a11 * x1 + a12 * 0 + b1'\n // vn2 = a21 * x1 + a22 * 0 + b2'\n //\n x.x = -vcp1.normalMass * b.x;\n x.y = 0.0;\n vn1 = 0.0;\n vn2 = this.v_K.ex.y * x.x + b.y;\n\n if (x.x >= 0.0 && vn2 >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv1B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB));\n const dv1A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA));\n const dv1 = Vec2.sub(dv1B, dv1A);\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n\n _ASSERT && console.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 3: vn2 = 0 and x1 = 0\n //\n // vn1 = a11 * 0 + a12 * x2 + b1'\n // 0 = a21 * 0 + a22 * x2 + b2'\n //\n x.x = 0.0;\n x.y = -vcp2.normalMass * b.y;\n vn1 = this.v_K.ey.x * x.y + b.x;\n vn2 = 0.0;\n\n if (x.y >= 0.0 && vn1 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv2B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB));\n const dv2A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA));\n const dv1 = Vec2.sub(dv2B, dv2A);\n\n // Compute normal velocity\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && console.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 4: x1 = 0 and x2 = 0\n //\n // vn1 = b1\n // vn2 = b2;\n //\n x.x = 0.0;\n x.y = 0.0;\n vn1 = b.x;\n vn2 = b.y;\n\n if (vn1 >= 0.0 && vn2 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n break;\n }\n\n // No solution, give up. This is hit sometimes, but it doesn't seem to\n // matter.\n break;\n }\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n /**\n * @internal\n */\n static addType(type1: ShapeType, type2: ShapeType, callback: ContactCallback): void {\n s_registers[type1] = s_registers[type1] || {};\n s_registers[type1][type2] = callback;\n }\n\n /**\n * @internal\n */\n static create(fixtureA: Fixture, indexA: number, fixtureB: Fixture, indexB: number): Contact | null {\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // TODO: pool contacts\n let contact;\n let evaluateFcn;\n if (evaluateFcn = s_registers[typeA] && s_registers[typeA][typeB]) {\n contact = new Contact(fixtureA, indexA, fixtureB, indexB, evaluateFcn);\n } else if (evaluateFcn = s_registers[typeB] && s_registers[typeB][typeA]) {\n contact = new Contact(fixtureB, indexB, fixtureA, indexA, evaluateFcn);\n } else {\n return null;\n }\n\n // Contact creation may swap fixtures.\n fixtureA = contact.getFixtureA();\n fixtureB = contact.getFixtureB();\n indexA = contact.getChildIndexA();\n indexB = contact.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Connect to body A\n contact.m_nodeA.contact = contact;\n contact.m_nodeA.other = bodyB;\n\n contact.m_nodeA.prev = null;\n contact.m_nodeA.next = bodyA.m_contactList;\n if (bodyA.m_contactList != null) {\n bodyA.m_contactList.prev = contact.m_nodeA;\n }\n bodyA.m_contactList = contact.m_nodeA;\n\n // Connect to body B\n contact.m_nodeB.contact = contact;\n contact.m_nodeB.other = bodyA;\n\n contact.m_nodeB.prev = null;\n contact.m_nodeB.next = bodyB.m_contactList;\n if (bodyB.m_contactList != null) {\n bodyB.m_contactList.prev = contact.m_nodeB;\n }\n bodyB.m_contactList = contact.m_nodeB;\n\n // Wake up the bodies\n if (fixtureA.isSensor() == false && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n return contact;\n }\n\n /**\n * @internal\n */\n static destroy(contact: Contact, listener: { endContact: (contact: Contact) => void }): void {\n const fixtureA = contact.m_fixtureA;\n const fixtureB = contact.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n if (contact.isTouching()) {\n listener.endContact(contact);\n }\n\n // Remove from body 1\n if (contact.m_nodeA.prev) {\n contact.m_nodeA.prev.next = contact.m_nodeA.next;\n }\n\n if (contact.m_nodeA.next) {\n contact.m_nodeA.next.prev = contact.m_nodeA.prev;\n }\n\n if (contact.m_nodeA == bodyA.m_contactList) {\n bodyA.m_contactList = contact.m_nodeA.next;\n }\n\n // Remove from body 2\n if (contact.m_nodeB.prev) {\n contact.m_nodeB.prev.next = contact.m_nodeB.next;\n }\n\n if (contact.m_nodeB.next) {\n contact.m_nodeB.next.prev = contact.m_nodeB.prev;\n }\n\n if (contact.m_nodeB == bodyB.m_contactList) {\n bodyB.m_contactList = contact.m_nodeB.next;\n }\n\n if (contact.m_manifold.pointCount > 0 && fixtureA.isSensor() == false\n && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // const destroyFcn = s_registers[typeA][typeB].destroyFcn;\n // if (typeof destroyFcn === 'function') {\n // destroyFcn(contact);\n // }\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { Vec2 } from '../common/Vec2';\nimport { BroadPhase } from '../collision/BroadPhase';\nimport { Solver, ContactImpulse, TimeStep } from './Solver';\nimport { Body, BodyDef } from './Body';\nimport { Joint } from './Joint';\nimport { Contact } from './Contact';\nimport { AABB, RayCastInput, RayCastOutput } from \"../collision/AABB\";\nimport { Fixture, FixtureProxy } from \"./Fixture\";\nimport { Manifold } from \"../collision/Manifold\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * @prop gravity [{ x : 0, y : 0}]\n * @prop allowSleep [true]\n * @prop warmStarting [true]\n * @prop continuousPhysics [true]\n * @prop subStepping [false]\n * @prop blockSolve [true]\n * @prop velocityIterations [8] For the velocity constraint solver.\n * @prop positionIterations [3] For the position constraint solver.\n */\nexport interface WorldDef {\n gravity?: Vec2;\n allowSleep?: boolean;\n warmStarting?: boolean;\n continuousPhysics?: boolean;\n subStepping?: boolean;\n blockSolve?: boolean;\n velocityIterations?: number;\n positionIterations?: number;\n}\n\nconst WorldDefDefault: WorldDef = {\n gravity : Vec2.zero(),\n allowSleep : true,\n warmStarting : true,\n continuousPhysics : true,\n subStepping : false,\n blockSolve : true,\n velocityIterations : 8,\n positionIterations : 3\n};\n\n/**\n * Callback function for ray casts, see {@link World.rayCast}.\n *\n * Called for each fixture found in the query. You control how the ray cast\n * proceeds by returning a float: return -1: ignore this fixture and continue\n * return 0: terminate the ray cast return fraction: clip the ray to this point\n * return 1: don't clip the ray and continue\n *\n * @param fixture The fixture hit by the ray\n * @param point The point of initial intersection\n * @param normal The normal vector at the point of intersection\n * @param fraction\n *\n * @return -1 to filter, 0 to terminate, fraction to clip the ray for closest hit, 1 to continue\n */\nexport type WorldRayCastCallback = (fixture: Fixture, point: Vec2, normal: Vec2, fraction: number) => number;\n\n/**\n * Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\nexport type WorldAABBQueryCallback = (fixture: Fixture) => boolean;\n\nexport class World {\n /** @internal */ m_solver: Solver;\n /** @internal */ m_broadPhase: BroadPhase;\n /** @internal */ m_contactList: Contact | null;\n /** @internal */ m_contactCount: number;\n /** @internal */ m_bodyList: Body | null;\n /** @internal */ m_bodyCount: number;\n /** @internal */ m_jointList: Joint | null;\n /** @internal */ m_jointCount: number;\n /** @internal */ m_stepComplete: boolean;\n /** @internal */ m_allowSleep: boolean;\n /** @internal */ m_gravity: Vec2;\n /** @internal */ m_clearForces: boolean;\n /** @internal */ m_newFixture: boolean;\n /** @internal */ m_locked: boolean;\n /** @internal */ m_warmStarting: boolean;\n /** @internal */ m_continuousPhysics: boolean;\n /** @internal */ m_subStepping: boolean;\n /** @internal */ m_blockSolve: boolean;\n /** @internal */ m_velocityIterations: number;\n /** @internal */ m_positionIterations: number;\n /** @internal */ m_t: number;\n\n // TODO\n /** @internal */ _listeners: {\n [key: string]: any[]\n };\n\n /**\n * @param def World definition or gravity vector.\n */\n constructor(def?: WorldDef | Vec2 | null) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof World)) {\n return new World(def);\n }\n\n this.s_step = new TimeStep();\n\n\n if (def && Vec2.isValid(def)) {\n def = { gravity: def as Vec2 };\n }\n\n def = options(def, WorldDefDefault) as WorldDef;\n\n this.m_solver = new Solver(this);\n\n this.m_broadPhase = new BroadPhase();\n\n this.m_contactList = null;\n this.m_contactCount = 0;\n\n this.m_bodyList = null;\n this.m_bodyCount = 0;\n\n this.m_jointList = null;\n this.m_jointCount = 0;\n\n this.m_stepComplete = true;\n\n this.m_allowSleep = def.allowSleep;\n this.m_gravity = Vec2.clone(def.gravity);\n\n this.m_clearForces = true;\n this.m_newFixture = false;\n this.m_locked = false;\n\n // These are for debugging the solver.\n this.m_warmStarting = def.warmStarting;\n this.m_continuousPhysics = def.continuousPhysics;\n this.m_subStepping = def.subStepping;\n\n this.m_blockSolve = def.blockSolve;\n this.m_velocityIterations = def.velocityIterations;\n this.m_positionIterations = def.positionIterations;\n\n this.m_t = 0;\n }\n\n /** @internal */\n _serialize(): object {\n const bodies = [];\n const joints = [];\n\n for (let b = this.getBodyList(); b; b = b.getNext()) {\n bodies.push(b);\n }\n\n for (let j = this.getJointList(); j; j = j.getNext()) {\n // @ts-ignore\n if (typeof j._serialize === 'function') {\n joints.push(j);\n }\n }\n\n return {\n gravity: this.m_gravity,\n bodies,\n joints,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, context: any, restore: any): World {\n if (!data) {\n return new World();\n }\n\n const world = new World(data.gravity);\n\n if (data.bodies) {\n for (let i = data.bodies.length - 1; i >= 0; i -= 1) {\n world._addBody(restore(Body, data.bodies[i], world));\n }\n }\n\n if (data.joints) {\n for (let i = data.joints.length - 1; i >= 0; i--) {\n world.createJoint(restore(Joint, data.joints[i], world));\n }\n }\n\n return world;\n }\n\n /**\n * Get the world body list. With the returned body, use Body.getNext to get the\n * next body in the world list. A null body indicates the end of the list.\n *\n * @return the head of the world body list.\n */\n getBodyList(): Body | null {\n return this.m_bodyList;\n }\n\n /**\n * Get the world joint list. With the returned joint, use Joint.getNext to get\n * the next joint in the world list. A null joint indicates the end of the list.\n *\n * @return the head of the world joint list.\n */\n getJointList(): Joint | null {\n return this.m_jointList;\n }\n\n /**\n * Get the world contact list. With the returned contact, use Contact.getNext to\n * get the next contact in the world list. A null contact indicates the end of\n * the list.\n *\n * Warning: contacts are created and destroyed in the middle of a time step.\n * Use ContactListener to avoid missing contacts.\n *\n * @return the head of the world contact list.\n */\n getContactList(): Contact | null {\n return this.m_contactList;\n }\n\n getBodyCount(): number {\n return this.m_bodyCount;\n }\n\n getJointCount(): number {\n return this.m_jointCount;\n }\n\n /**\n * Get the number of contacts (each may have 0 or more contact points).\n */\n getContactCount(): number {\n return this.m_contactCount;\n }\n\n /**\n * Change the global gravity vector.\n */\n setGravity(gravity: Vec2): void {\n this.m_gravity = gravity;\n }\n\n /**\n * Get the global gravity vector.\n */\n getGravity(): Vec2 {\n return this.m_gravity;\n }\n\n /**\n * Is the world locked (in the middle of a time step).\n */\n isLocked(): boolean {\n return this.m_locked;\n }\n\n /**\n * Enable/disable sleep.\n */\n setAllowSleeping(flag: boolean): void {\n if (flag == this.m_allowSleep) {\n return;\n }\n\n this.m_allowSleep = flag;\n if (this.m_allowSleep == false) {\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.setAwake(true);\n }\n }\n }\n\n getAllowSleeping(): boolean {\n return this.m_allowSleep;\n }\n\n /**\n * Enable/disable warm starting. For testing.\n */\n setWarmStarting(flag: boolean): void {\n this.m_warmStarting = flag;\n }\n\n getWarmStarting(): boolean {\n return this.m_warmStarting;\n }\n\n /**\n * Enable/disable continuous physics. For testing.\n */\n setContinuousPhysics(flag: boolean): void {\n this.m_continuousPhysics = flag;\n }\n\n getContinuousPhysics(): boolean {\n return this.m_continuousPhysics;\n }\n\n /**\n * Enable/disable single stepped continuous physics. For testing.\n */\n setSubStepping(flag: boolean): void {\n this.m_subStepping = flag;\n }\n\n getSubStepping(): boolean {\n return this.m_subStepping;\n }\n\n /**\n * Set flag to control automatic clearing of forces after each time step.\n */\n setAutoClearForces(flag: boolean): void {\n this.m_clearForces = flag;\n }\n\n /**\n * Get the flag that controls automatic clearing of forces after each time step.\n */\n getAutoClearForces(): boolean {\n return this.m_clearForces;\n }\n\n /**\n * Manually clear the force buffer on all bodies. By default, forces are cleared\n * automatically after each call to step. The default behavior is modified by\n * calling setAutoClearForces. The purpose of this function is to support\n * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step\n * under a variable frame-rate. When you perform sub-stepping you will disable\n * auto clearing of forces and instead call clearForces after all sub-steps are\n * complete in one pass of your game loop.\n *\n * See {@link World.setAutoClearForces}\n */\n clearForces(): void {\n for (let body = this.m_bodyList; body; body = body.getNext()) {\n body.m_force.setZero();\n body.m_torque = 0.0;\n }\n }\n\n /**\n * Query the world for all fixtures that potentially overlap the provided AABB.\n *\n * @param aabb The query box.\n * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\n queryAABB(aabb: AABB, callback: WorldAABBQueryCallback): void {\n _ASSERT && console.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n this.m_broadPhase.query(aabb, function(proxyId: number): boolean { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n return callback(proxy.fixture);\n });\n }\n\n /**\n * Ray-cast the world for all fixtures in the path of the ray. Your callback\n * controls whether you get the closest point, any point, or n-points. The\n * ray-cast ignores shapes that contain the starting point.\n *\n * @param point1 The ray starting point\n * @param point2 The ray ending point\n * @param callback A user implemented callback function.\n */\n rayCast(point1: Vec2, point2: Vec2, callback: WorldRayCastCallback): void {\n _ASSERT && console.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n\n this.m_broadPhase.rayCast({\n maxFraction : 1.0,\n p1 : point1,\n p2 : point2\n }, function(input: RayCastInput, proxyId: number): number { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n const fixture = proxy.fixture;\n const index = proxy.childIndex;\n // @ts-ignore\n const output: RayCastOutput = {}; // TODO GC\n const hit = fixture.rayCast(output, input, index);\n if (hit) {\n const fraction = output.fraction;\n const point = Vec2.add(Vec2.mulNumVec2((1.0 - fraction), input.p1), Vec2.mulNumVec2(fraction, input.p2));\n return callback(fixture, point, output.normal, fraction);\n }\n return input.maxFraction;\n });\n }\n\n /**\n * Get the number of broad-phase proxies.\n */\n getProxyCount(): number {\n return this.m_broadPhase.getProxyCount();\n }\n\n /**\n * Get the height of broad-phase dynamic tree.\n */\n getTreeHeight(): number {\n return this.m_broadPhase.getTreeHeight();\n }\n\n /**\n * Get the balance of broad-phase dynamic tree.\n */\n getTreeBalance(): number {\n return this.m_broadPhase.getTreeBalance();\n }\n\n /**\n * Get the quality metric of broad-phase dynamic tree. The smaller the better.\n * The minimum is 1.\n */\n getTreeQuality(): number {\n return this.m_broadPhase.getTreeQuality();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The body shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n _ASSERT && console.assert(this.m_locked == false);\n if (this.m_locked) {\n return;\n }\n\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.m_xf.p.sub(newOrigin);\n b.m_sweep.c0.sub(newOrigin);\n b.m_sweep.c.sub(newOrigin);\n }\n\n for (let j = this.m_jointList; j; j = j.m_next) {\n j.shiftOrigin(newOrigin);\n }\n\n this.m_broadPhase.shiftOrigin(newOrigin);\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addBody(body: Body): void {\n _ASSERT && console.assert(this.isLocked() === false);\n if (this.isLocked()) {\n return;\n }\n\n // Add to world doubly linked list.\n body.m_prev = null;\n body.m_next = this.m_bodyList;\n if (this.m_bodyList) {\n this.m_bodyList.m_prev = body;\n }\n this.m_bodyList = body;\n ++this.m_bodyCount;\n }\n\n /**\n * Create a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This function is locked during callbacks.\n */\n createBody(def?: BodyDef): Body;\n createBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createBody(arg1?, arg2?) {\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n\n const body = new Body(this, def);\n this._addBody(body);\n return body;\n }\n\n createDynamicBody(def?: BodyDef): Body;\n createDynamicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createDynamicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'dynamic';\n return this.createBody(def);\n }\n\n createKinematicBody(def?: BodyDef): Body;\n createKinematicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createKinematicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'kinematic';\n return this.createBody(def);\n }\n\n /**\n * Destroy a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This automatically deletes all associated shapes and joints.\n *\n * Warning: This function is locked during callbacks.\n */\n destroyBody(b: Body): boolean {\n _ASSERT && console.assert(this.m_bodyCount > 0);\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n if (b.m_destroyed) {\n return false;\n }\n\n // Delete the attached joints.\n let je = b.m_jointList;\n while (je) {\n const je0 = je;\n je = je.next;\n\n this.publish('remove-joint', je0.joint);\n this.destroyJoint(je0.joint);\n\n b.m_jointList = je;\n }\n b.m_jointList = null;\n\n // Delete the attached contacts.\n let ce = b.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n\n this.destroyContact(ce0.contact);\n\n b.m_contactList = ce;\n }\n b.m_contactList = null;\n\n // Delete the attached fixtures. This destroys broad-phase proxies.\n let f = b.m_fixtureList;\n while (f) {\n const f0 = f;\n f = f.m_next;\n\n this.publish('remove-fixture', f0);\n f0.destroyProxies(this.m_broadPhase);\n\n b.m_fixtureList = f;\n }\n b.m_fixtureList = null;\n\n // Remove world body list.\n if (b.m_prev) {\n b.m_prev.m_next = b.m_next;\n }\n\n if (b.m_next) {\n b.m_next.m_prev = b.m_prev;\n }\n\n if (b == this.m_bodyList) {\n this.m_bodyList = b.m_next;\n }\n\n b.m_destroyed = true;\n\n --this.m_bodyCount;\n\n this.publish('remove-body', b);\n\n return true;\n }\n\n /**\n * Create a joint to constrain bodies together. No reference to the definition\n * is retained. This may cause the connected bodies to cease colliding.\n *\n * Warning: This function is locked during callbacks.\n */\n createJoint(joint: T): T | null {\n _ASSERT && console.assert(!!joint.m_bodyA);\n _ASSERT && console.assert(!!joint.m_bodyB);\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n // Connect to the world list.\n joint.m_prev = null;\n joint.m_next = this.m_jointList;\n if (this.m_jointList) {\n this.m_jointList.m_prev = joint;\n }\n this.m_jointList = joint;\n ++this.m_jointCount;\n\n // Connect to the bodies' doubly linked lists.\n joint.m_edgeA.joint = joint;\n joint.m_edgeA.other = joint.m_bodyB;\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = joint.m_bodyA.m_jointList;\n if (joint.m_bodyA.m_jointList)\n joint.m_bodyA.m_jointList.prev = joint.m_edgeA;\n joint.m_bodyA.m_jointList = joint.m_edgeA;\n\n joint.m_edgeB.joint = joint;\n joint.m_edgeB.other = joint.m_bodyA;\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = joint.m_bodyB.m_jointList;\n if (joint.m_bodyB.m_jointList)\n joint.m_bodyB.m_jointList.prev = joint.m_edgeB;\n joint.m_bodyB.m_jointList = joint.m_edgeB;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n for (let edge = joint.m_bodyB.getContactList(); edge; edge = edge.next) {\n if (edge.other == joint.m_bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n }\n }\n\n // Note: creating a joint doesn't wake the bodies.\n\n return joint;\n }\n\n /**\n * Destroy a joint. This may cause the connected bodies to begin colliding.\n * Warning: This function is locked during callbacks.\n */\n destroyJoint(joint: Joint): void {\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n // Remove from the doubly linked list.\n if (joint.m_prev) {\n joint.m_prev.m_next = joint.m_next;\n }\n\n if (joint.m_next) {\n joint.m_next.m_prev = joint.m_prev;\n }\n\n if (joint == this.m_jointList) {\n this.m_jointList = joint.m_next;\n }\n\n // Disconnect from bodies.\n const bodyA = joint.m_bodyA;\n const bodyB = joint.m_bodyB;\n\n // Wake up connected bodies.\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n\n // Remove from body 1.\n if (joint.m_edgeA.prev) {\n joint.m_edgeA.prev.next = joint.m_edgeA.next;\n }\n\n if (joint.m_edgeA.next) {\n joint.m_edgeA.next.prev = joint.m_edgeA.prev;\n }\n\n if (joint.m_edgeA == bodyA.m_jointList) {\n bodyA.m_jointList = joint.m_edgeA.next;\n }\n\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = null;\n\n // Remove from body 2\n if (joint.m_edgeB.prev) {\n joint.m_edgeB.prev.next = joint.m_edgeB.next;\n }\n\n if (joint.m_edgeB.next) {\n joint.m_edgeB.next.prev = joint.m_edgeB.prev;\n }\n\n if (joint.m_edgeB == bodyB.m_jointList) {\n bodyB.m_jointList = joint.m_edgeB.next;\n }\n\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = null;\n\n _ASSERT && console.assert(this.m_jointCount > 0);\n --this.m_jointCount;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n let edge = bodyB.getContactList();\n while (edge) {\n if (edge.other == bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n }\n\n this.publish('remove-joint', joint);\n }\n\n /** @internal */\n s_step: TimeStep; // reuse\n\n /**\n * Take a time step. This performs collision detection, integration, and\n * constraint solution.\n *\n * Broad-phase, narrow-phase, solve and solve time of impacts.\n *\n * @param timeStep Time step, this should not vary.\n */\n step(timeStep: number, velocityIterations?: number, positionIterations?: number): void {\n this.publish('pre-step', timeStep);\n\n if ((velocityIterations | 0) !== velocityIterations) {\n // TODO: remove this in future\n velocityIterations = 0;\n }\n\n velocityIterations = velocityIterations || this.m_velocityIterations;\n positionIterations = positionIterations || this.m_positionIterations;\n\n // If new fixtures were added, we need to find the new contacts.\n if (this.m_newFixture) {\n this.findNewContacts();\n this.m_newFixture = false;\n }\n\n this.m_locked = true;\n\n this.s_step.reset(timeStep);\n this.s_step.velocityIterations = velocityIterations;\n this.s_step.positionIterations = positionIterations;\n this.s_step.warmStarting = this.m_warmStarting;\n this.s_step.blockSolve = this.m_blockSolve;\n\n // Update contacts. This is where some contacts are destroyed.\n this.updateContacts();\n\n // Integrate velocities, solve velocity constraints, and integrate positions.\n if (this.m_stepComplete && timeStep > 0.0) {\n this.m_solver.solveWorld(this.s_step);\n\n // Synchronize fixtures, check for out of range bodies.\n for (let b = this.m_bodyList; b; b = b.getNext()) {\n // If a body was not in an island then it did not move.\n if (b.m_islandFlag == false) {\n continue;\n }\n\n if (b.isStatic()) {\n continue;\n }\n\n // Update fixtures (for broad-phase).\n b.synchronizeFixtures();\n }\n // Look for new contacts.\n this.findNewContacts();\n }\n\n // Handle TOI events.\n if (this.m_continuousPhysics && timeStep > 0.0) {\n this.m_solver.solveWorldTOI(this.s_step);\n }\n\n if (this.m_clearForces) {\n this.clearForces();\n }\n\n this.m_locked = false;\n\n this.publish('post-step', timeStep);\n }\n\n /**\n * @internal\n * Call this method to find new contacts.\n */\n findNewContacts(): void {\n this.m_broadPhase.updatePairs(\n (proxyA: FixtureProxy, proxyB: FixtureProxy) => this.createContact(proxyA, proxyB)\n );\n }\n\n /**\n * @internal\n * Callback for broad-phase.\n */\n createContact(proxyA: FixtureProxy, proxyB: FixtureProxy): void {\n const fixtureA = proxyA.fixture;\n const fixtureB = proxyB.fixture;\n\n const indexA = proxyA.childIndex;\n const indexB = proxyB.childIndex;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Are the fixtures on the same body?\n if (bodyA == bodyB) {\n return;\n }\n\n // TODO_ERIN use a hash table to remove a potential bottleneck when both\n // bodies have a lot of contacts.\n // Does a contact already exist?\n let edge = bodyB.getContactList(); // ContactEdge\n while (edge) {\n if (edge.other == bodyA) {\n const fA = edge.contact.getFixtureA();\n const fB = edge.contact.getFixtureB();\n const iA = edge.contact.getChildIndexA();\n const iB = edge.contact.getChildIndexB();\n\n if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) {\n // A contact already exists.\n return;\n }\n\n if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) {\n // A contact already exists.\n return;\n }\n }\n\n edge = edge.next;\n }\n\n if (bodyB.shouldCollide(bodyA) == false) {\n return;\n }\n if (fixtureB.shouldCollide(fixtureA) == false) {\n return;\n }\n\n // Call the factory.\n const contact = Contact.create(fixtureA, indexA, fixtureB, indexB);\n if (contact == null) {\n return;\n }\n\n // Insert into the world.\n contact.m_prev = null;\n if (this.m_contactList != null) {\n contact.m_next = this.m_contactList;\n this.m_contactList.m_prev = contact;\n }\n this.m_contactList = contact;\n\n ++this.m_contactCount;\n }\n\n /**\n * @internal\n * Removes old non-overlapping contacts, applies filters and updates contacts.\n */\n updateContacts(): void {\n // Update awake contacts.\n let c;\n let next_c = this.m_contactList;\n while (c = next_c) {\n next_c = c.getNext();\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Is this contact flagged for filtering?\n if (c.m_filterFlag) {\n if (bodyB.shouldCollide(bodyA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n if (fixtureB.shouldCollide(fixtureA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n // Clear the filtering flag.\n c.m_filterFlag = false;\n }\n\n const activeA = bodyA.isAwake() && !bodyA.isStatic();\n const activeB = bodyB.isAwake() && !bodyB.isStatic();\n\n // At least one body must be awake and it must be dynamic or kinematic.\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const proxyIdA = fixtureA.m_proxies[indexA].proxyId;\n const proxyIdB = fixtureB.m_proxies[indexB].proxyId;\n const overlap = this.m_broadPhase.testOverlap(proxyIdA, proxyIdB);\n\n // Here we destroy contacts that cease to overlap in the broad-phase.\n if (overlap == false) {\n this.destroyContact(c);\n continue;\n }\n\n // The contact persists.\n c.update(this);\n }\n }\n\n /**\n * @internal\n */\n destroyContact(contact: Contact): void {\n Contact.destroy(contact, this);\n\n // Remove from the world.\n if (contact.m_prev) {\n contact.m_prev.m_next = contact.m_next;\n }\n if (contact.m_next) {\n contact.m_next.m_prev = contact.m_prev;\n }\n if (contact == this.m_contactList) {\n this.m_contactList = contact.m_next;\n }\n\n --this.m_contactCount;\n }\n\n\n /**\n * Called when two fixtures begin to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'begin-contact', listener: (contact: Contact) => void): World;\n /**\n * Called when two fixtures cease to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'end-contact', listener: (contact: Contact) => void): World;\n /**\n * This is called after a contact is updated. This allows you to inspect a\n * contact before it goes to the solver. If you are careful, you can modify the\n * contact manifold (e.g. disable contact). A copy of the old manifold is\n * provided so that you can detect changes. Note: this is called only for awake\n * bodies. Note: this is called even when the number of contact points is zero.\n * Note: this is not called for sensors. Note: if you set the number of contact\n * points to zero, you will not get an endContact callback. However, you may get\n * a beginContact callback the next step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n /**\n * This lets you inspect a contact after the solver is finished. This is useful\n * for inspecting impulses. Note: the contact manifold does not include time of\n * impact impulses, which can be arbitrarily large if the sub-step is small.\n * Hence the impulse is provided explicitly in a separate data structure. Note:\n * this is only called for contacts that are touching, solid, and awake.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n /** Listener is called whenever a body is removed. */\n on(name: 'remove-body', listener: (body: Body) => void): World;\n /** Listener is called whenever a joint is removed implicitly or explicitly. */\n on(name: 'remove-joint', listener: (joint: Joint) => void): World;\n /** Listener is called whenever a fixture is removed implicitly or explicitly. */\n on(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Register an event listener.\n */\n // tslint:disable-next-line:typedef\n on(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n if (!this._listeners) {\n this._listeners = {};\n }\n if (!this._listeners[name]) {\n this._listeners[name] = [];\n }\n this._listeners[name].push(listener);\n return this;\n }\n\n off(name: 'begin-contact', listener: (contact: Contact) => void): World;\n off(name: 'end-contact', listener: (contact: Contact) => void): World;\n off(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n off(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n off(name: 'remove-body', listener: (body: Body) => void): World;\n off(name: 'remove-joint', listener: (joint: Joint) => void): World;\n off(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Remove an event listener.\n */\n // tslint:disable-next-line:typedef\n off(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return this;\n }\n const index = listeners.indexOf(listener);\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n publish(name: string, arg1?: any, arg2?: any, arg3?: any): number {\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return 0;\n }\n for (let l = 0; l < listeners.length; l++) {\n listeners[l].call(this, arg1, arg2, arg3);\n }\n return listeners.length;\n }\n\n /**\n * @internal\n */\n beginContact(contact: Contact): void {\n this.publish('begin-contact', contact);\n }\n\n /**\n * @internal\n */\n endContact(contact: Contact): void {\n this.publish('end-contact', contact);\n }\n\n /**\n * @internal\n */\n preSolve(contact: Contact, oldManifold: Manifold): void {\n this.publish('pre-solve', contact, oldManifold);\n }\n\n /**\n * @internal\n */\n postSolve(contact: Contact, impulse: ContactImpulse): void {\n this.publish('post-solve', contact, impulse);\n }\n\n /**\n * Joints and fixtures are destroyed when their associated body is destroyed.\n * Register a destruction listener so that you may nullify references to these\n * joints and shapes.\n *\n * `function(object)` is called when any joint or fixture is about to\n * be destroyed due to the destruction of one of its attached or parent bodies.\n */\n\n /**\n * Register a contact filter to provide specific control over collision.\n * Otherwise the default filter is used (defaultFilter). The listener is owned\n * by you and must remain in scope.\n *\n * Moved to Fixture.\n */\n}","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class Vec3 {\n x: number;\n y: number;\n z: number;\n\n constructor(x: number, y: number, z: number);\n constructor(obj: { x: number, y: number, z: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?, z?) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Vec3)) {\n return new Vec3(x, y, z);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n this.z = x.z;\n } else {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n _ASSERT && Vec3.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y,\n z: this.z\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = data.x;\n obj.y = data.y;\n obj.z = data.z;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number, z: number): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = x;\n obj.y = y;\n obj.z = z;\n return obj;\n }\n\n static zero(): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = 0;\n obj.y = 0;\n obj.z = 0;\n return obj;\n }\n\n static clone(v: Vec3): Vec3 {\n _ASSERT && Vec3.assert(v);\n return Vec3.neo(v.x, v.y, v.z);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y) && Math.isFinite(obj.z);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Vec3.isValid(o), 'Invalid Vec3!', o);\n }\n\n setZero(): Vec3 {\n this.x = 0.0;\n this.y = 0.0;\n this.z = 0.0;\n return this;\n }\n\n set(x: number, y: number, z: number): Vec3 {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n\n add(w: Vec3): Vec3 {\n this.x += w.x;\n this.y += w.y;\n this.z += w.z;\n return this;\n }\n\n sub(w: Vec3): Vec3 {\n this.x -= w.x;\n this.y -= w.y;\n this.z -= w.z;\n return this;\n }\n\n mul(m: number): Vec3 {\n this.x *= m;\n this.y *= m;\n this.z *= m;\n return this;\n }\n\n static areEqual(v: Vec3, w: Vec3): boolean {\n _ASSERT && Vec3.assert(v);\n _ASSERT && Vec3.assert(w);\n return v === w ||\n typeof v === 'object' && v !== null &&\n typeof w === 'object' && w !== null &&\n v.x === w.x && v.y === w.y && v.z === w.z;\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec3, w: Vec3): number {\n return v.x * w.x + v.y * w.y + v.z * w.z;\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static cross(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(\n v.y * w.z - v.z * w.y,\n v.z * w.x - v.x * w.z,\n v.x * w.y - v.y * w.x\n );\n }\n\n static add(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x + w.x, v.y + w.y, v.z + w.z);\n }\n\n static sub(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x - w.x, v.y - w.y, v.z - w.z);\n }\n\n static mul(v: Vec3, m: number): Vec3 {\n return new Vec3(m * v.x, m * v.y, m * v.z);\n }\n\n neg(): Vec3 {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n }\n\n static neg(v: Vec3): Vec3 {\n return new Vec3(-v.x, -v.y, -v.z);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { AABB, RayCastInput, RayCastOutput } from '../AABB';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A line segment (edge) shape. These can be connected in chains or loops to\n * other edge shapes. The connectivity information is used to ensure correct\n * contact normals.\n */\nexport class EdgeShape extends Shape {\n static TYPE = 'edge' as const;\n m_type: 'edge';\n\n m_radius: number;\n\n // These are the edge vertices\n m_vertex1: Vec2;\n m_vertex2: Vec2;\n\n // Optional adjacent vertices. These are used for smooth collision.\n // Used by chain shape.\n m_vertex0: Vec2;\n m_vertex3: Vec2;\n m_hasVertex0: boolean;\n m_hasVertex3: boolean;\n\n constructor(v1?: Vec2Value, v2?: Vec2Value) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof EdgeShape)) {\n return new EdgeShape(v1, v2);\n }\n\n super();\n\n this.m_type = EdgeShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n\n this.m_vertex1 = v1 ? Vec2.clone(v1) : Vec2.zero();\n this.m_vertex2 = v2 ? Vec2.clone(v2) : Vec2.zero();\n\n this.m_vertex0 = Vec2.zero();\n this.m_vertex3 = Vec2.zero();\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertex1: this.m_vertex1,\n vertex2: this.m_vertex2,\n\n vertex0: this.m_vertex0,\n vertex3: this.m_vertex3,\n hasVertex0: this.m_hasVertex0,\n hasVertex3: this.m_hasVertex3,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): EdgeShape {\n const shape = new EdgeShape(data.vertex1, data.vertex2);\n if (shape.m_hasVertex0) {\n shape.setPrevVertex(data.vertex0);\n }\n if (shape.m_hasVertex3) {\n shape.setNextVertex(data.vertex3);\n }\n return shape;\n }\n\n /** @internal */\n _reset(): void {\n // noop\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getType(): 'edge' {\n return this.m_type;\n }\n\n /** @internal @deprecated */\n setNext(v?: Vec2): EdgeShape {\n return this.setNextVertex(v);\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n setNextVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex3.setVec2(v);\n this.m_hasVertex3 = true;\n } else {\n this.m_vertex3.setZero();\n this.m_hasVertex3 = false;\n }\n return this;\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n getNextVertex(): Vec2 {\n return this.m_vertex3;\n }\n\n /** @internal @deprecated */\n setPrev(v?: Vec2): EdgeShape {\n return this.setPrevVertex(v);\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n setPrevVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex0.setVec2(v);\n this.m_hasVertex0 = true;\n } else {\n this.m_vertex0.setZero();\n this.m_hasVertex0 = false;\n }\n return this;\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n getPrevVertex(): Vec2 {\n return this.m_vertex0;\n }\n\n /**\n * Set this as an isolated edge.\n */\n _set(v1: Vec2, v2: Vec2): EdgeShape {\n this.m_vertex1.setVec2(v1);\n this.m_vertex2.setVec2(v2);\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): EdgeShape {\n const clone = new EdgeShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_vertex1.setVec2(this.m_vertex1);\n clone.m_vertex2.setVec2(this.m_vertex2);\n clone.m_vertex0.setVec2(this.m_vertex0);\n clone.m_vertex3.setVec2(this.m_vertex3);\n clone.m_hasVertex0 = this.m_hasVertex0;\n clone.m_hasVertex3 = this.m_hasVertex3;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // p = p1 + t * d\n // v = v1 + s * e\n // p1 + t * d = v1 + s * e\n // s * e - t * d = p1 - v1\n\n // NOT_USED(childIndex);\n\n // Put the ray into the edge's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n const v1 = this.m_vertex1;\n const v2 = this.m_vertex2;\n const e = Vec2.sub(v2, v1);\n const normal = Vec2.neo(e.y, -e.x);\n normal.normalize();\n\n // q = p1 + t * d\n // dot(normal, q - v1) = 0\n // dot(normal, p1 - v1) + t * dot(normal, d) = 0\n const numerator = Vec2.dot(normal, Vec2.sub(v1, p1));\n const denominator = Vec2.dot(normal, d);\n\n if (denominator == 0.0) {\n return false;\n }\n\n const t = numerator / denominator;\n if (t < 0.0 || input.maxFraction < t) {\n return false;\n }\n\n const q = Vec2.add(p1, Vec2.mulNumVec2(t, d));\n\n // q = v1 + s * r\n // s = dot(q - v1, r) / dot(r, r)\n const r = Vec2.sub(v2, v1);\n const rr = Vec2.dot(r, r);\n if (rr == 0.0) {\n return false;\n }\n\n const s = Vec2.dot(Vec2.sub(q, v1), r) / rr;\n if (s < 0.0 || 1.0 < s) {\n return false;\n }\n\n output.fraction = t;\n if (numerator > 0.0) {\n output.normal = Rot.mulVec2(xf.q, normal).neg();\n } else {\n output.normal = Rot.mulVec2(xf.q, normal);\n }\n return true;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const v1 = Transform.mulVec2(xf, this.m_vertex1);\n const v2 = Transform.mulVec2(xf, this.m_vertex2);\n\n aabb.combinePoints(v1, v2);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center.setCombine(0.5, this.m_vertex1, 0.5, this.m_vertex2);\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_vertex1);\n proxy.m_vertices.push(this.m_vertex2);\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n}\n\nexport const Edge = EdgeShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport { Transform } from '../../common/Transform';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\nimport { EdgeShape } from './EdgeShape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A chain shape is a free form sequence of line segments. The chain has\n * two-sided collision, so you can use inside and outside collision. Therefore,\n * you may use any winding order. Connectivity information is used to create\n * smooth collisions.\n *\n * WARNING: The chain will not collide properly if there are self-intersections.\n */\nexport class ChainShape extends Shape {\n static TYPE = 'chain' as const;\n m_type: 'chain';\n\n m_radius: number;\n\n m_vertices: Vec2[];\n m_count: number;\n m_prevVertex: Vec2 | null;\n m_nextVertex: Vec2 | null;\n m_hasPrevVertex: boolean;\n m_hasNextVertex: boolean;\n\n m_isLoop: boolean;\n\n constructor(vertices?: Vec2Value[], loop?: boolean) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof ChainShape)) {\n return new ChainShape(vertices, loop);\n }\n\n super();\n\n this.m_type = ChainShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_vertices = [];\n this.m_count = 0;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n\n this.m_isLoop = !!loop;\n\n if (vertices && vertices.length) {\n if (loop) {\n this._createLoop(vertices);\n } else {\n this._createChain(vertices);\n }\n }\n }\n\n /** @internal */\n _serialize(): object {\n const data = {\n type: this.m_type,\n vertices: this.m_vertices,\n isLoop: this.m_isLoop,\n hasPrevVertex: this.m_hasPrevVertex,\n hasNextVertex: this.m_hasNextVertex,\n prevVertex: null as Vec2 | null,\n nextVertex: null as Vec2 | null,\n };\n if (this.m_prevVertex) {\n data.prevVertex = this.m_prevVertex;\n }\n if (this.m_nextVertex) {\n data.nextVertex = this.m_nextVertex;\n }\n return data;\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): ChainShape {\n const vertices: Vec2[] = [];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n const shape = new ChainShape(vertices, data.isLoop);\n if (data.prevVertex) {\n shape.setPrevVertex(data.prevVertex);\n }\n if (data.nextVertex) {\n shape.setNextVertex(data.nextVertex);\n }\n return shape;\n }\n\n // clear() {\n // this.m_vertices.length = 0;\n // this.m_count = 0;\n // }\n\n getType(): 'chain' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n /**\n * @internal\n * Create a loop. This automatically adjusts connectivity.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createLoop(vertices: Vec2Value[]): ChainShape {\n _ASSERT && console.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && console.assert(vertices.length >= 3);\n for (let i = 1; i < vertices.length; ++i) {\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n // If the code crashes here, it means your vertices are too close together.\n _ASSERT && console.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_vertices = [];\n this.m_count = vertices.length + 1;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n this.m_vertices[vertices.length] = Vec2.clone(vertices[0]);\n\n this.m_prevVertex = this.m_vertices[this.m_count - 2];\n this.m_nextVertex = this.m_vertices[1];\n this.m_hasPrevVertex = true;\n this.m_hasNextVertex = true;\n return this;\n }\n\n /**\n * @internal\n * Create a chain with isolated end vertices.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createChain(vertices: Vec2Value[]): ChainShape {\n _ASSERT && console.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && console.assert(vertices.length >= 2);\n for (let i = 1; i < vertices.length; ++i) {\n // If the code crashes here, it means your vertices are too close together.\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n _ASSERT && console.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_count = vertices.length;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n return this;\n }\n\n /** @internal */\n _reset(): void {\n if (this.m_isLoop) {\n this._createLoop(this.m_vertices);\n } else {\n this._createChain(this.m_vertices);\n }\n }\n\n /**\n * Establish connectivity to a vertex that precedes the first vertex. Don't call\n * this for loops.\n */\n setPrevVertex(prevVertex: Vec2): void {\n this.m_prevVertex = prevVertex;\n this.m_hasPrevVertex = true;\n }\n\n getPrevVertex(): Vec2 {\n return this.m_prevVertex;\n }\n\n /**\n * Establish connectivity to a vertex that follows the last vertex. Don't call\n * this for loops.\n */\n setNextVertex(nextVertex: Vec2): void {\n this.m_nextVertex = nextVertex;\n this.m_hasNextVertex = true;\n }\n\n getNextVertex(): Vec2 {\n return this.m_nextVertex;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): ChainShape {\n const clone = new ChainShape();\n clone._createChain(this.m_vertices);\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_prevVertex = this.m_prevVertex;\n clone.m_nextVertex = this.m_nextVertex;\n clone.m_hasPrevVertex = this.m_hasPrevVertex;\n clone.m_hasNextVertex = this.m_hasNextVertex;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): number {\n // edge count = vertex count - 1\n return this.m_count - 1;\n }\n\n // Get a child edge.\n getChildEdge(edge: EdgeShape, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count - 1);\n edge.m_type = EdgeShape.TYPE;\n edge.m_radius = this.m_radius;\n\n edge.m_vertex1 = this.m_vertices[childIndex];\n edge.m_vertex2 = this.m_vertices[childIndex + 1];\n\n if (childIndex > 0) {\n edge.m_vertex0 = this.m_vertices[childIndex - 1];\n edge.m_hasVertex0 = true;\n } else {\n edge.m_vertex0 = this.m_prevVertex;\n edge.m_hasVertex0 = this.m_hasPrevVertex;\n }\n\n if (childIndex < this.m_count - 2) {\n edge.m_vertex3 = this.m_vertices[childIndex + 2];\n edge.m_hasVertex3 = true;\n } else {\n edge.m_vertex3 = this.m_nextVertex;\n edge.m_hasVertex3 = this.m_hasNextVertex;\n }\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index <= this.m_count);\n if (index < this.m_count) {\n return this.m_vertices[index];\n } else {\n return this.m_vertices[0];\n }\n }\n\n isLoop(): boolean {\n return this.m_isLoop;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * This always return false.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n\n const edgeShape = new EdgeShape(this.getVertex(childIndex), this.getVertex(childIndex + 1));\n return edgeShape.rayCast(output, input, xf, 0);\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n\n const v1 = Transform.mulVec2(xf, this.getVertex(childIndex));\n const v2 = Transform.mulVec2(xf, this.getVertex(childIndex + 1));\n\n aabb.combinePoints(v1, v2);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * Chains have zero mass.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center = Vec2.zero();\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n proxy.m_buffer[0] = this.getVertex(childIndex);\n proxy.m_buffer[1] = this.getVertex(childIndex + 1);\n proxy.m_vertices = proxy.m_buffer;\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n}\n\nexport const Chain = ChainShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A convex polygon. It is assumed that the interior of the polygon is to the\n * left of each edge. Polygons have a maximum number of vertices equal to\n * Settings.maxPolygonVertices. In most cases you should not need many vertices\n * for a convex polygon. extends Shape\n */\nexport class PolygonShape extends Shape {\n static TYPE = 'polygon' as const;\n m_type: 'polygon';\n\n m_centroid: Vec2;\n m_vertices: Vec2[]; // [Settings.maxPolygonVertices]\n m_normals: Vec2[]; // [Settings.maxPolygonVertices]\n m_count: number;\n m_radius: number;\n\n // @ts-ignore\n constructor(vertices?: Vec2Value[]) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PolygonShape)) {\n return new PolygonShape(vertices);\n }\n\n super();\n\n this.m_type = PolygonShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_centroid = Vec2.zero();\n this.m_vertices = [];\n this.m_normals = [];\n this.m_count = 0;\n\n if (vertices && vertices.length) {\n this._set(vertices);\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertices: this.m_vertices,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): PolygonShape {\n const vertices: Vec2[] = [];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n\n const shape = new PolygonShape(vertices);\n return shape;\n }\n\n getType(): 'polygon' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): PolygonShape {\n const clone = new PolygonShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_count = this.m_count;\n clone.m_centroid.setVec2(this.m_centroid);\n for (let i = 0; i < this.m_count; i++) {\n clone.m_vertices.push(this.m_vertices[i].clone());\n }\n for (let i = 0; i < this.m_normals.length; i++) {\n clone.m_normals.push(this.m_normals[i].clone());\n }\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /** @internal */\n _reset(): void {\n this._set(this.m_vertices);\n }\n\n /**\n * @internal\n *\n * Create a convex hull from the given array of local points. The count must be\n * in the range [3, Settings.maxPolygonVertices].\n *\n * Warning: the points may be re-ordered, even if they form a convex polygon\n * Warning: collinear points are handled but not removed. Collinear points may\n * lead to poor stacking behavior.\n */\n _set(vertices: Vec2Value[]): void {\n _ASSERT && console.assert(3 <= vertices.length && vertices.length <= Settings.maxPolygonVertices);\n if (vertices.length < 3) {\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n let n = Math.min(vertices.length, Settings.maxPolygonVertices);\n\n // Perform welding and copy vertices into local buffer.\n const ps: Vec2[] = []; // [Settings.maxPolygonVertices];\n for (let i = 0; i < n; ++i) {\n const v = vertices[i];\n\n let unique = true;\n for (let j = 0; j < ps.length; ++j) {\n if (Vec2.distanceSquared(v, ps[j]) < 0.25 * Settings.linearSlopSquared) {\n unique = false;\n break;\n }\n }\n\n if (unique) {\n ps.push(Vec2.clone(v));\n }\n }\n\n n = ps.length;\n if (n < 3) {\n // Polygon is degenerate.\n _ASSERT && console.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n // Create the convex hull using the Gift wrapping algorithm\n // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm\n\n // Find the right most point on the hull (in case of multiple points bottom most is used)\n let i0 = 0;\n let x0 = ps[0].x;\n for (let i = 1; i < n; ++i) {\n const x = ps[i].x;\n if (x > x0 || (x === x0 && ps[i].y < ps[i0].y)) {\n i0 = i;\n x0 = x;\n }\n }\n\n const hull = [] as number[]; // [Settings.maxPolygonVertices];\n let m = 0;\n let ih = i0;\n\n while (true) {\n hull[m] = ih;\n\n let ie = 0;\n for (let j = 1; j < n; ++j) {\n if (ie === ih) {\n ie = j;\n continue;\n }\n\n const r = Vec2.sub(ps[ie], ps[hull[m]]);\n const v = Vec2.sub(ps[j], ps[hull[m]]);\n const c = Vec2.crossVec2Vec2(r, v);\n // c < 0 means counter-clockwise wrapping, c > 0 means clockwise wrapping\n if (c < 0.0) {\n ie = j;\n }\n\n // Collinearity check\n if (c === 0.0 && v.lengthSquared() > r.lengthSquared()) {\n ie = j;\n }\n }\n\n ++m;\n ih = ie;\n\n if (ie === i0) {\n break;\n }\n }\n\n if (m < 3) {\n // Polygon is degenerate.\n _ASSERT && console.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n this.m_count = m;\n\n // Copy vertices.\n this.m_vertices = [];\n for (let i = 0; i < m; ++i) {\n this.m_vertices[i] = ps[hull[i]];\n }\n\n // Compute normals. Ensure the edges have non-zero length.\n for (let i = 0; i < m; ++i) {\n const i1 = i;\n const i2 = i + 1 < m ? i + 1 : 0;\n const edge = Vec2.sub(this.m_vertices[i2], this.m_vertices[i1]);\n _ASSERT && console.assert(edge.lengthSquared() > Math.EPSILON * Math.EPSILON);\n this.m_normals[i] = Vec2.crossVec2Num(edge, 1.0);\n this.m_normals[i].normalize();\n }\n\n // Compute the polygon centroid.\n this.m_centroid = ComputeCentroid(this.m_vertices, m);\n }\n\n /** @internal */\n _setAsBox(hx: number, hy: number, center?: Vec2Value, angle?: number): void {\n // start with right-bottom, counter-clockwise, as in Gift wrapping algorithm in PolygonShape._set()\n this.m_vertices[0] = Vec2.neo(hx, -hy);\n this.m_vertices[1] = Vec2.neo(hx, hy);\n this.m_vertices[2] = Vec2.neo(-hx, hy);\n this.m_vertices[3] = Vec2.neo(-hx, -hy);\n\n this.m_normals[0] = Vec2.neo(1.0, 0.0);\n this.m_normals[1] = Vec2.neo(0.0, 1.0);\n this.m_normals[2] = Vec2.neo(-1.0, 0.0);\n this.m_normals[3] = Vec2.neo(0.0, -1.0);\n\n this.m_count = 4;\n\n if (Vec2.isValid(center)) {\n angle = angle || 0;\n\n this.m_centroid.setVec2(center);\n\n const xf = Transform.identity();\n xf.p.setVec2(center);\n xf.q.setAngle(angle);\n\n // Transform vertices and normals.\n for (let i = 0; i < this.m_count; ++i) {\n this.m_vertices[i] = Transform.mulVec2(xf, this.m_vertices[i]);\n this.m_normals[i] = Rot.mulVec2(xf.q, this.m_normals[i]);\n }\n }\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): boolean {\n const pLocal = Rot.mulTVec2(xf.q, Vec2.sub(p, xf.p));\n\n for (let i = 0; i < this.m_count; ++i) {\n const dot = Vec2.dot(this.m_normals[i], Vec2.sub(pLocal, this.m_vertices[i]));\n if (dot > 0.0) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n\n // Put the ray into the polygon's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n let lower = 0.0;\n let upper = input.maxFraction;\n\n let index = -1;\n\n for (let i = 0; i < this.m_count; ++i) {\n // p = p1 + a * d\n // dot(normal, p - v) = 0\n // dot(normal, p1 - v) + a * dot(normal, d) = 0\n const numerator = Vec2.dot(this.m_normals[i], Vec2.sub(this.m_vertices[i], p1));\n const denominator = Vec2.dot(this.m_normals[i], d);\n\n if (denominator == 0.0) {\n if (numerator < 0.0) {\n return false;\n }\n } else {\n // Note: we want this predicate without division:\n // lower < numerator / denominator, where denominator < 0\n // Since denominator < 0, we have to flip the inequality:\n // lower < numerator / denominator <==> denominator * lower > numerator.\n if (denominator < 0.0 && numerator < lower * denominator) {\n // Increase lower.\n // The segment enters this half-space.\n lower = numerator / denominator;\n index = i;\n } else if (denominator > 0.0 && numerator < upper * denominator) {\n // Decrease upper.\n // The segment exits this half-space.\n upper = numerator / denominator;\n }\n }\n\n // The use of epsilon here causes the assert on lower to trip\n // in some cases. Apparently the use of epsilon was to make edge\n // shapes work, but now those are handled separately.\n // if (upper < lower - Math.EPSILON)\n if (upper < lower) {\n return false;\n }\n }\n\n _ASSERT && console.assert(0.0 <= lower && lower <= input.maxFraction);\n\n if (index >= 0) {\n output.fraction = lower;\n output.normal = Rot.mulVec2(xf.q, this.m_normals[index]);\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < this.m_count; ++i) {\n const v = Transform.mulVec2(xf, this.m_vertices[i]);\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, v.y);\n maxY = Math.max(maxY, v.y);\n }\n\n aabb.lowerBound.setNum(minX, minY);\n aabb.upperBound.setNum(maxX, maxY);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n // Polygon mass, centroid, and inertia.\n // Let rho be the polygon density in mass per unit area.\n // Then:\n // mass = rho * int(dA)\n // centroid.x = (1/mass) * rho * int(x * dA)\n // centroid.y = (1/mass) * rho * int(y * dA)\n // I = rho * int((x*x + y*y) * dA)\n //\n // We can compute these integrals by summing all the integrals\n // for each triangle of the polygon. To evaluate the integral\n // for a single triangle, we make a change of variables to\n // the (u,v) coordinates of the triangle:\n // x = x0 + e1x * u + e2x * v\n // y = y0 + e1y * u + e2y * v\n // where 0 <= u && 0 <= v && u + v <= 1.\n //\n // We integrate u from [0,1-v] and then v from [0,1].\n // We also need to use the Jacobian of the transformation:\n // D = cross(e1, e2)\n //\n // Simplification: triangle centroid = (1/3) * (p1 + p2 + p3)\n //\n // The rest of the derivation is handled by computer algebra.\n\n _ASSERT && console.assert(this.m_count >= 3);\n\n const center = Vec2.zero();\n let area = 0.0;\n let I = 0.0;\n\n // s is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const s = Vec2.zero();\n\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < this.m_count; ++i) {\n s.add(this.m_vertices[i]);\n }\n s.mul(1.0 / this.m_count);\n\n const k_inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < this.m_count; ++i) {\n // Triangle vertices.\n const e1 = Vec2.sub(this.m_vertices[i], s);\n const e2 = i + 1 < this.m_count ? Vec2.sub(this.m_vertices[i + 1], s) : Vec2 .sub(this.m_vertices[0], s);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n center.addCombine(triangleArea * k_inv3, e1, triangleArea * k_inv3, e2);\n\n const ex1 = e1.x;\n const ey1 = e1.y;\n const ex2 = e2.x;\n const ey2 = e2.y;\n\n const intx2 = ex1 * ex1 + ex2 * ex1 + ex2 * ex2;\n const inty2 = ey1 * ey1 + ey2 * ey1 + ey2 * ey2;\n\n I += (0.25 * k_inv3 * D) * (intx2 + inty2);\n }\n\n // Total mass\n massData.mass = density * area;\n\n // Center of mass\n _ASSERT && console.assert(area > Math.EPSILON);\n center.mul(1.0 / area);\n massData.center.setCombine(1, center, 1, s);\n\n // Inertia tensor relative to the local origin (point s).\n massData.I = density * I;\n\n // Shift to center of mass then to original body origin.\n massData.I += massData.mass * (Vec2.dot(massData.center, massData.center) - Vec2.dot(center, center));\n }\n\n /**\n * Validate convexity. This is a very time consuming operation.\n * @returns true if valid\n */\n validate(): boolean {\n for (let i = 0; i < this.m_count; ++i) {\n const i1 = i;\n const i2 = i < this.m_count - 1 ? i1 + 1 : 0;\n const p = this.m_vertices[i1];\n const e = Vec2.sub(this.m_vertices[i2], p);\n\n for (let j = 0; j < this.m_count; ++j) {\n if (j == i1 || j == i2) {\n continue;\n }\n\n const v = Vec2.sub(this.m_vertices[j], p);\n const c = Vec2.crossVec2Vec2(e, v);\n if (c < 0.0) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices = this.m_vertices;\n proxy.m_count = this.m_count;\n proxy.m_radius = this.m_radius;\n }\n}\n\nfunction ComputeCentroid(vs: Vec2[], count: number): Vec2 {\n _ASSERT && console.assert(count >= 3);\n\n const c = Vec2.zero();\n let area = 0.0;\n\n // pRef is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const pRef = Vec2.zero();\n if (false) {\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < count; ++i) {\n pRef.add(vs[i]);\n }\n pRef.mul(1.0 / count);\n }\n\n const inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < count; ++i) {\n // Triangle vertices.\n const p1 = pRef;\n const p2 = vs[i];\n const p3 = i + 1 < count ? vs[i + 1] : vs[0];\n\n const e1 = Vec2.sub(p2, p1);\n const e2 = Vec2.sub(p3, p1);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n c.addMul(triangleArea * inv3, p1);\n c.addMul(triangleArea * inv3, p2);\n c.addMul(triangleArea * inv3, p3);\n }\n\n // Centroid\n _ASSERT && console.assert(area > Math.EPSILON);\n c.mul(1.0 / area);\n return c;\n}\n\nexport const Polygon = PolygonShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { Vec2Value } from '../../common/Vec2';\nimport { PolygonShape } from './PolygonShape';\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A rectangle polygon which extend PolygonShape.\n */\nexport class BoxShape extends PolygonShape {\n static TYPE = 'polygon' as const;\n\n constructor(hx: number, hy: number, center?: Vec2Value, angle?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof BoxShape)) {\n return new BoxShape(hx, hy, center, angle);\n }\n\n super();\n\n this._setAsBox(hx, hy, center, angle);\n }\n}\n\nexport const Box = BoxShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Shape } from '../Shape';\nimport { AABB, RayCastInput, RayCastOutput } from '../AABB';\nimport { Transform } from '../../common/Transform';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class CircleShape extends Shape {\n static TYPE = 'circle' as const;\n m_type: 'circle';\n\n m_p: Vec2;\n m_radius: number;\n\n constructor(position: Vec2Value, radius?: number);\n constructor(radius?: number);\n // tslint:disable-next-line:typedef\n constructor(a, b?) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof CircleShape)) {\n return new CircleShape(a, b);\n }\n\n super();\n\n this.m_type = CircleShape.TYPE;\n this.m_p = Vec2.zero();\n this.m_radius = 1;\n\n if (typeof a === 'object' && Vec2.isValid(a)) {\n this.m_p.setVec2(a);\n\n if (typeof b === 'number') {\n this.m_radius = b;\n }\n\n } else if (typeof a === 'number') {\n this.m_radius = a;\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n p: this.m_p,\n radius: this.m_radius,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): CircleShape {\n return new CircleShape(data.p, data.radius);\n }\n\n /** @internal */\n _reset(): void {\n // noop\n }\n\n getType(): 'circle' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getCenter(): Vec2 {\n return this.m_p;\n }\n\n getVertex(index: 0): Vec2 {\n _ASSERT && console.assert(index == 0);\n return this.m_p;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): CircleShape {\n const clone = new CircleShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_p = this.m_p.clone();\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): boolean {\n const center = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const d = Vec2.sub(p, center);\n return Vec2.dot(d, d) <= this.m_radius * this.m_radius;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // Collision Detection in Interactive 3D Environments by Gino van den Bergen\n // From Section 3.1.2\n // x = s + a * r\n // norm(x) = radius\n\n const position = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const s = Vec2.sub(input.p1, position);\n const b = Vec2.dot(s, s) - this.m_radius * this.m_radius;\n\n // Solve quadratic equation.\n const r = Vec2.sub(input.p2, input.p1);\n const c = Vec2.dot(s, r);\n const rr = Vec2.dot(r, r);\n const sigma = c * c - rr * b;\n\n // Check for negative discriminant and short segment.\n if (sigma < 0.0 || rr < Math.EPSILON) {\n return false;\n }\n\n // Find the point of intersection of the line with the circle.\n let a = -(c + Math.sqrt(sigma));\n\n // Is the intersection point on the segment?\n if (0.0 <= a && a <= input.maxFraction * rr) {\n a /= rr;\n output.fraction = a;\n output.normal = Vec2.add(s, Vec2.mulNumVec2(a, r));\n output.normal.normalize();\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const p = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n aabb.lowerBound.setNum(p.x - this.m_radius, p.y - this.m_radius);\n aabb.upperBound.setNum(p.x + this.m_radius, p.y + this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n massData.mass = density * Math.PI * this.m_radius * this.m_radius;\n massData.center = this.m_p;\n // inertia about the local origin\n massData.I = massData.mass\n * (0.5 * this.m_radius * this.m_radius + Vec2.dot(this.m_p, this.m_p));\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_p);\n proxy.m_count = 1;\n proxy.m_radius = this.m_radius;\n }\n\n}\n\nexport const Circle = CircleShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. A value of 0 disables softness.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * Distance length.\n */\n length?: number;\n}\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointDef extends JointDef, DistanceJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0\n};\n\n/**\n * A distance joint constrains two points on two bodies to remain at a fixed\n * distance from each other. You can view this as a massless, rigid rod.\n *\n * @param anchorA Anchor A in global coordination.\n * @param anchorB Anchor B in global coordination.\n */\nexport class DistanceJoint extends Joint {\n static TYPE = 'distance-joint' as const;\n\n // Solver shared\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_length: number;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_gamma: number;\n /** @internal */ m_bias: number;\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: DistanceJointDef);\n constructor(def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2);\n constructor(def: DistanceJointDef, bodyA?: Body, bodyB?: Body, anchorA?: Vec2, anchorB?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof DistanceJoint)) {\n return new DistanceJoint(def, bodyA, bodyB, anchorA, anchorB);\n }\n\n // order of constructor arguments is changed in v0.2\n if (bodyB && anchorA && ('m_type' in anchorA) && ('x' in bodyB) && ('y' in bodyB)) {\n const temp = bodyB;\n bodyB = anchorA as any as Body;\n anchorA = temp as any as Vec2;\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = DistanceJoint.TYPE;\n\n // Solver shared\n this.m_localAnchorA = Vec2.clone(anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.zero());\n this.m_length = Math.isFinite(def.length) ? def.length :\n Vec2.distance(bodyA.getWorldPoint(this.m_localAnchorA), bodyB.getWorldPoint(this.m_localAnchorB));\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n this.m_impulse = 0.0;\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n\n // 1-D constrained system\n // m (v2 - v1) = lambda\n // v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass.\n // x2 = x1 + h * v2\n\n // 1-D mass-damper-spring system\n // m (v2 - v1) + h * d * v2 + h * k *\n\n // C = norm(p2 - p1) - L\n // u = (p2 - p1) / norm(p2 - p1)\n // Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1))\n // J = [-u -cross(r1, u) u cross(r2, u)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n length: this.m_length,\n\n impulse: this.m_impulse,\n gamma: this.m_gamma,\n bias: this.m_bias,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): DistanceJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new DistanceJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n length?: number,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.length > 0) {\n this.m_length = +def.length;\n } else if (def.length < 0) { // don't change length\n } else if (def.anchorA || def.anchorA || def.anchorA || def.anchorA) {\n this.m_length = Vec2.distance(\n this.m_bodyA.getWorldPoint(this.m_localAnchorA),\n this.m_bodyB.getWorldPoint(this.m_localAnchorB)\n );\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the natural length. Manipulating the length can lead to non-physical\n * behavior when the frequency is zero.\n */\n setLength(length: number): void {\n this.m_length = length;\n }\n\n /**\n * Get the natural length.\n */\n getLength(): number {\n return this.m_length;\n }\n\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n this.m_u = Vec2.sub(Vec2.add(cB, this.m_rB), Vec2.add(cA, this.m_rA));\n\n // Handle singularity.\n const length = this.m_u.length();\n if (length > Settings.linearSlop) {\n this.m_u.mul(1.0 / length);\n } else {\n this.m_u.setNum(0.0, 0.0);\n }\n\n const crAu = Vec2.crossVec2Vec2(this.m_rA, this.m_u);\n const crBu = Vec2.crossVec2Vec2(this.m_rB, this.m_u);\n let invMass = this.m_invMassA + this.m_invIA * crAu * crAu + this.m_invMassB\n + this.m_invIB * crBu * crBu;\n\n // Compute the effective mass matrix.\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (this.m_frequencyHz > 0.0) {\n const C = length - this.m_length;\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * this.m_mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = this.m_mass * omega * omega;\n\n // magic formulas\n const h = step.dt;\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invMass += this.m_gamma;\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n } else {\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n const Cdot = Vec2.dot(this.m_u, vpB) - Vec2.dot(this.m_u, vpA);\n\n const impulse = -this.m_mass\n * (Cdot + this.m_bias + this.m_gamma * this.m_impulse);\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u);\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n if (this.m_frequencyHz > 0.0) {\n // There is no position correction for soft distance constraints.\n return true;\n }\n\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA));\n\n const length = u.normalize();\n let C = length - this.m_length;\n C = Math\n .clamp(C, -Settings.maxLinearCorrection, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C;\n const P = Vec2.mulNumVec2(impulse, u);\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointOpt extends JointOpt {\n /**\n * The maximum friction force in N.\n */\n maxForce?: number;\n /**\n * The maximum friction torque in N-m.\n */\n maxTorque?: number;\n}\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointDef extends JointDef, FrictionJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n maxTorque : 0.0,\n};\n\n/**\n * Friction joint. This is used for top-down friction. It provides 2D\n * translational friction and angular friction.\n *\n * @param anchor Anchor in global coordination.\n */\nexport class FrictionJoint extends Joint {\n static TYPE = 'friction-joint' as const;\n\n /** @internal */ m_type: 'friction-joint';\n\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n // Solver shared\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: FrictionJointDef);\n constructor(def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: FrictionJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof FrictionJoint)) {\n return new FrictionJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = FrictionJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n\n // Solver shared\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): FrictionJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new FrictionJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && console.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && console.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y\n * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x\n * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt; // float\n\n // Solve angular friction\n {\n const Cdot = wB - wA; // float\n let impulse = -this.m_angularMass * Cdot; // float\n\n const oldImpulse = this.m_angularImpulse; // float\n const maxImpulse = h * this.m_maxTorque; // float\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)), Vec2.add(vA,\n Vec2.crossNumVec2(wA, this.m_rA))); // Vec2\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); // Vec2\n const oldImpulse = this.m_linearImpulse; // Vec2\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce; // float\n\n if (this.m_linearImpulse.lengthSquared() > maxImpulse * maxImpulse) {\n this.m_linearImpulse.normalize();\n this.m_linearImpulse.mul(maxImpulse);\n }\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from './Vec2';\nimport { Vec3 } from './Vec3';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 3-by-3 matrix. Stored in column-major order.\n */\nexport class Mat33 {\n ex: Vec3;\n ey: Vec3;\n ez: Vec3;\n\n constructor(a: Vec3, b: Vec3, c: Vec3);\n constructor();\n constructor(a?: Vec3, b?: Vec3, c?: Vec3) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec3.clone(a);\n this.ey = Vec3.clone(b);\n this.ez = Vec3.clone(c);\n } else {\n this.ex = Vec3.zero();\n this.ey = Vec3.zero();\n this.ez = Vec3.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec3.isValid(obj.ex) && Vec3.isValid(obj.ey) && Vec3.isValid(obj.ez);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Mat33.isValid(o), 'Invalid Mat33!', o);\n }\n\n /**\n * Set this matrix to all zeros.\n */\n setZero(): Mat33 {\n this.ex.setZero();\n this.ey.setZero();\n this.ez.setZero();\n return this;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve33(v: Vec3): Vec3 {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = new Vec3();\n r.x = det * Vec3.dot(v, Vec3.cross(this.ey, this.ez));\n r.y = det * Vec3.dot(this.ex, Vec3.cross(v, this.ez));\n r.z = det * Vec3.dot(this.ex, Vec3.cross(this.ey, v));\n return r;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix\n * equation.\n */\n solve22(v: Vec2): Vec2 {\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a21 = this.ex.y;\n const a22 = this.ey.y;\n let det = a11 * a22 - a12 * a21;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = Vec2.zero();\n r.x = det * (a22 * v.x - a12 * v.y);\n r.y = det * (a11 * v.y - a21 * v.x);\n return r;\n }\n\n /**\n * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if\n * singular.\n */\n getInverse22(M: Mat33): void {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n M.ex.x = det * d;\n M.ey.x = -det * b;\n M.ex.z = 0.0;\n M.ex.y = -det * c;\n M.ey.y = det * a;\n M.ey.z = 0.0;\n M.ez.x = 0.0;\n M.ez.y = 0.0;\n M.ez.z = 0.0;\n }\n\n /**\n * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix\n * if singular.\n */\n getSymInverse33(M: Mat33): void {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a13 = this.ez.x;\n const a22 = this.ey.y;\n const a23 = this.ez.y;\n const a33 = this.ez.z;\n\n M.ex.x = det * (a22 * a33 - a23 * a23);\n M.ex.y = det * (a13 * a23 - a12 * a33);\n M.ex.z = det * (a12 * a23 - a13 * a22);\n\n M.ey.x = M.ex.y;\n M.ey.y = det * (a11 * a33 - a13 * a13);\n M.ey.z = det * (a13 * a12 - a11 * a23);\n\n M.ez.x = M.ex.z;\n M.ez.y = M.ey.z;\n M.ez.z = det * (a11 * a22 - a12 * a12);\n }\n\n /**\n * Multiply a matrix times a vector.\n */\n static mul(a: Mat33, b: Vec2): Vec2;\n static mul(a: Mat33, b: Vec3): Vec3;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n _ASSERT && Mat33.assert(a);\n if (b && 'z' in b && 'y' in b && 'x' in b) {\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n\n } else if (b && 'y' in b && 'x' in b) {\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulVec3(a: Mat33, b: Vec3): Vec3 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n }\n\n static mulVec2(a: Mat33, b: Vec2): Vec2 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n static add(a: Mat33, b: Mat33): Mat33 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Mat33.assert(b);\n return new Mat33(\n Vec3.add(a.ex, b.ex),\n Vec3.add(a.ey, b.ey),\n Vec3.add(a.ez, b.ez)\n );\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat22 } from '../../common/Mat22';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointOpt extends JointOpt {\n /**\n * The lower angle for the joint limit (radians).\n */\n lowerAngle?: number;\n /**\n * The upper angle for the joint limit (radians).\n */\n upperAngle?: number;\n /**\n * The maximum motor torque used to achieve the desired motor speed. Usually\n * in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed. Usually in radians per second.\n */\n motorSpeed?: number;\n /**\n * A flag to enable joint limits.\n */\n enableLimit?: boolean;\n /**\n * A flag to enable the joint motor.\n */\n enableMotor?: boolean;\n}\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointDef extends JointDef, RevoluteJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n lowerAngle : 0.0,\n upperAngle : 0.0,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n enableLimit : false,\n enableMotor : false\n};\n\n/**\n * A revolute joint constrains two bodies to share a common point while they are\n * free to rotate about the point. The relative rotation about the shared point\n * is the joint angle. You can limit the relative rotation with a joint limit\n * that specifies a lower and upper angle. You can use a motor to drive the\n * relative rotation about the shared point. A maximum motor torque is provided\n * so that infinite forces are not generated.\n */\nexport class RevoluteJoint extends Joint {\n static TYPE = 'revolute-joint' as const;\n\n /** @internal */ m_type: 'revolute-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerAngle: number;\n /** @internal */ m_upperAngle: number;\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n // effective mass for point-to-point constraint.\n /** @internal */ m_mass: Mat33 = new Mat33();\n // effective mass for motor/limit angular constraint.\n /** @internal */ m_motorMass: number;\n /** @internal */ m_limitState: number = inactiveLimit; // TODO enum\n\n constructor(def: RevoluteJointDef);\n constructor(def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n // @ts-ignore\n constructor(def: RevoluteJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof RevoluteJoint)) {\n return new RevoluteJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RevoluteJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorImpulse = 0.0;\n\n this.m_lowerAngle = def.lowerAngle;\n this.m_upperAngle = def.upperAngle;\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Motor constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerAngle: this.m_lowerAngle,\n upperAngle: this.m_upperAngle,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any):RevoluteJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RevoluteJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle in radians.\n */\n getJointAngle(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle speed in radians per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_angularVelocity - bA.m_angularVelocity;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Get the current motor torque given the inverse time step. Unit is N*m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set the motor speed in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set the maximum motor torque, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit in radians.\n */\n getLowerLimit(): number {\n return this.m_lowerAngle;\n }\n\n /**\n * Get the upper joint limit in radians.\n */\n getUpperLimit(): number {\n return this.m_upperAngle;\n }\n\n /**\n * Set the joint limits in radians.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && console.assert(lower <= upper);\n\n if (lower != this.m_lowerAngle || upper != this.m_upperAngle) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_impulse.z = 0.0;\n this.m_lowerAngle = lower;\n this.m_upperAngle = upper;\n }\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force given the inverse time step. Unit is N.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque due to the joint limit given the inverse time step.\n * Unit is N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n this.m_mass.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y\n * this.m_rB.y * iB;\n this.m_mass.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y\n * this.m_rB.x * iB;\n this.m_mass.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n this.m_mass.ex.y = this.m_mass.ey.x;\n this.m_mass.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x\n * this.m_rB.x * iB;\n this.m_mass.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n this.m_mass.ex.z = this.m_mass.ez.x;\n this.m_mass.ey.z = this.m_mass.ez.y;\n this.m_mass.ez.z = iA + iB;\n\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n\n if (this.m_enableMotor == false || fixedRotation) {\n this.m_motorImpulse = 0.0;\n }\n\n if (this.m_enableLimit && fixedRotation == false) {\n const jointAngle = aB - aA - this.m_referenceAngle; // float\n\n if (Math.abs(this.m_upperAngle - this.m_lowerAngle) < 2.0 * Settings.angularSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointAngle <= this.m_lowerAngle) {\n if (this.m_limitState != atLowerLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atLowerLimit;\n\n } else if (jointAngle >= this.m_upperAngle) {\n if (this.m_limitState != atUpperLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atUpperLimit;\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_motorImpulse + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_motorImpulse + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n // Solve motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits\n && fixedRotation == false) {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const impulse = Vec3.neg(this.m_mass.solve33(Cdot)); // Vec3\n\n if (this.m_limitState == equalLimits) {\n this.m_impulse.add(impulse);\n\n } else if (this.m_limitState == atLowerLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse < 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n\n } else if (this.m_limitState == atUpperLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse > 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n\n } else {\n // Solve point-to-point constraint\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const impulse = this.m_mass.solve22(Vec2.neg(Cdot)); // Vec2\n\n this.m_impulse.x += impulse.x;\n this.m_impulse.y += impulse.y;\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n let angularError = 0.0; // float\n let positionError = 0.0; // float\n\n const fixedRotation = (this.m_invIA + this.m_invIB == 0.0); // bool\n\n // Solve angular limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const angle = aB - aA - this.m_referenceAngle; // float\n let limitImpulse = 0.0; // float\n\n if (this.m_limitState == equalLimits) {\n // Prevent large angular corrections\n const C = Math.clamp(angle - this.m_lowerAngle,\n -Settings.maxAngularCorrection, Settings.maxAngularCorrection); // float\n limitImpulse = -this.m_motorMass * C;\n angularError = Math.abs(C);\n\n } else if (this.m_limitState == atLowerLimit) {\n let C = angle - this.m_lowerAngle; // float\n angularError = -C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C + Settings.angularSlop, -Settings.maxAngularCorrection,\n 0.0);\n limitImpulse = -this.m_motorMass * C;\n\n } else if (this.m_limitState == atUpperLimit) {\n let C = angle - this.m_upperAngle; // float\n angularError = C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C - Settings.angularSlop, 0.0,\n Settings.maxAngularCorrection);\n limitImpulse = -this.m_motorMass * C;\n }\n\n aA -= this.m_invIA * limitImpulse;\n aB += this.m_invIB * limitImpulse;\n }\n\n // Solve point-to-point constraint.\n {\n qA.setAngle(aA);\n qB.setAngle(aB);\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n\n const C = Vec2.zero();\n C.addCombine(1, cB, 1, rB);\n C.subCombine(1, cA, 1, rA);\n positionError = C.length();\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y;\n K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x;\n\n const impulse = Vec2.neg(K.solve(C)); // Vec2\n\n cA.subMul(mA, impulse);\n aA -= iA * Vec2.crossVec2Vec2(rA, impulse);\n\n cB.addMul(mB, impulse);\n aB += iB * Vec2.crossVec2Vec2(rB, impulse);\n }\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat22 } from '../../common/Mat22';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointOpt extends JointOpt {\n /**\n * Enable/disable the joint limit.\n */\n enableLimit?: boolean;\n /**\n * The lower translation limit, usually in meters.\n */\n lowerTranslation?: number;\n /**\n * The upper translation limit, usually in meters.\n */\n upperTranslation?: number;\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorForce?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n}\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointDef extends JointDef, PrismaticJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation unit axis in bodyA.\n */\n localAxisA: Vec2;\n /**\n * referenceAngle The constrained angle between the bodies:\n * bodyB_angle - bodyA_angle.\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n enableLimit : false,\n lowerTranslation : 0.0,\n upperTranslation : 0.0,\n enableMotor : false,\n maxMotorForce : 0.0,\n motorSpeed : 0.0\n};\n\n/**\n * A prismatic joint. This joint provides one degree of freedom: translation\n * along an axis fixed in bodyA. Relative rotation is prevented. You can use a\n * joint limit to restrict the range of motion and a joint motor to drive the\n * motion or to model joint friction.\n */\nexport class PrismaticJoint extends Joint {\n static TYPE = 'prismatic-joint' as const;\n\n /** @internal */ m_type: 'prismatic-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerTranslation: number;\n /** @internal */ m_upperTranslation: number;\n /** @internal */ m_maxMotorForce: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n /** @internal */ m_limitState: number; // TODO enum\n /** @internal */ m_axis: Vec2;\n /** @internal */ m_perp: Vec2;\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_s1: number;\n /** @internal */ m_s2: number;\n /** @internal */ m_a1: number;\n /** @internal */ m_a2: number;\n /** @internal */ m_K: Mat33;\n\n constructor(def: PrismaticJointDef);\n constructor(def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n constructor(def: PrismaticJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PrismaticJoint)) {\n return new PrismaticJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PrismaticJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || Vec2.neo(1.0, 0.0));\n this.m_localXAxisA.normalize();\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n\n this.m_lowerTranslation = def.lowerTranslation;\n this.m_upperTranslation = def.upperTranslation;\n this.m_maxMotorForce = def.maxMotorForce;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n this.m_limitState = inactiveLimit;\n\n this.m_axis = Vec2.zero();\n this.m_perp = Vec2.zero();\n\n this.m_K = new Mat33();\n\n // Linear constraint (point-to-line)\n // d = p2 - p1 = x2 + r2 - x1 - r1\n // C = dot(perp, d)\n // Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 -\n // cross(w1, r1))\n // = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) +\n // dot(cross(r2, perp), v2)\n // J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)]\n //\n // Angular constraint\n // C = a2 - a1 + a_initial\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n //\n // K = J * invM * JT\n //\n // J = [-a -s1 a s2]\n // [0 -1 0 1]\n // a = perp\n // s1 = cross(d + r1, a) = cross(p2 - x1, a)\n // s2 = cross(r2, a) = cross(p2 - x2, a)\n\n // Motor/Limit linear constraint\n // C = dot(ax1, d)\n // Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) +\n // dot(cross(r2, ax1), v2)\n // J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)]\n\n // Block Solver\n // We develop a block solver that includes the joint limit. This makes the\n // limit stiff (inelastic) even\n // when the mass has poor distribution (leading to large torques about the\n // joint anchor points).\n //\n // The Jacobian has 3 rows:\n // J = [-uT -s1 uT s2] // linear\n // [0 -1 0 1] // angular\n // [-vT -a1 vT a2] // limit\n //\n // u = perp\n // v = axis\n // s1 = cross(d + r1, u), s2 = cross(r2, u)\n // a1 = cross(d + r1, v), a2 = cross(r2, v)\n\n // M * (v2 - v1) = JT * df\n // J * v2 = bias\n //\n // v2 = v1 + invM * JT * df\n // J * (v1 + invM * JT * df) = bias\n // K * df = bias - J * v1 = -Cdot\n // K = J * invM * JT\n // Cdot = J * v1 - bias\n //\n // Now solve for f2.\n // df = f2 - f1\n // K * (f2 - f1) = -Cdot\n // f2 = invK * (-Cdot) + f1\n //\n // Clamp accumulated limit impulse.\n // lower: f2(3) = max(f2(3), 0)\n // upper: f2(3) = min(f2(3), 0)\n //\n // Solve for correct f2(1:2)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1\n // = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) +\n // K(1:2,1:2) * f1(1:2)\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n //\n // Now compute impulse to be applied:\n // df = f2 - f1\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerTranslation: this.m_lowerTranslation,\n upperTranslation: this.m_upperTranslation,\n maxMotorForce: this.m_maxMotorForce,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PrismaticJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.localAxisA = Vec2.clone(data.localAxisA);\n const joint = new PrismaticJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const pA = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const pB = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const d = Vec2.sub(pB, pA);\n const axis = this.m_bodyA.getWorldVector(this.m_localXAxisA);\n\n const translation = Vec2.dot(d, axis);\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const rA = Rot.mulVec2(bA.m_xf.q, Vec2.sub(this.m_localAnchorA, bA.m_sweep.localCenter)); // Vec2\n const rB = Rot.mulVec2(bB.m_xf.q, Vec2.sub(this.m_localAnchorB, bB.m_sweep.localCenter)); // Vec2\n const p1 = Vec2.add(bA.m_sweep.c, rA); // Vec2\n const p2 = Vec2.add(bB.m_sweep.c, rB); // Vec2\n const d = Vec2.sub(p2, p1); // Vec2\n const axis = Rot.mulVec2(bA.m_xf.q, this.m_localXAxisA); // Vec2\n\n const vA = bA.m_linearVelocity; // Vec2\n const vB = bB.m_linearVelocity; // Vec2\n const wA = bA.m_angularVelocity; // float\n const wB = bB.m_angularVelocity; // float\n\n const speed = Vec2.dot(d, Vec2.crossNumVec2(wA, axis))\n + Vec2.dot(axis, Vec2.sub(Vec2.addCrossNumVec2(vB, wB, rB), Vec2.addCrossNumVec2(vA, wA, rA))); // float\n return speed;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit, usually in meters.\n */\n getLowerLimit(): number {\n return this.m_lowerTranslation;\n }\n\n /**\n * Get the upper joint limit, usually in meters.\n */\n getUpperLimit(): number {\n return this.m_upperTranslation;\n }\n\n /**\n * Set the joint limits, usually in meters.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && console.assert(lower <= upper);\n if (lower != this.m_lowerTranslation || upper != this.m_upperTranslation) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_lowerTranslation = lower;\n this.m_upperTranslation = upper;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in meters per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Set the maximum motor force, usually in N.\n */\n setMaxMotorForce(force: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorForce = force;\n }\n\n getMaxMotorForce(): number {\n return this.m_maxMotorForce;\n }\n\n /**\n * Get the motor speed, usually in meters per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Get the current motor force given the inverse time step, usually in N.\n */\n getMotorForce(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + this.m_impulse.z, this.m_axis).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.y;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute motor Jacobian and effective mass.\n {\n this.m_axis = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_axis);\n this.m_a2 = Vec2.crossVec2Vec2(rB, this.m_axis);\n\n this.m_motorMass = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2\n * this.m_a2;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n }\n\n // Prismatic constraint.\n {\n this.m_perp = Rot.mulVec2(qA, this.m_localYAxisA);\n\n this.m_s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_perp);\n this.m_s2 = Vec2.crossVec2Vec2(rB, this.m_perp);\n\n const s1test = Vec2.crossVec2Vec2(rA, this.m_perp);\n\n const k11 = mA + mB + iA * this.m_s1 * this.m_s1 + iB * this.m_s2 * this.m_s2;\n const k12 = iA * this.m_s1 + iB * this.m_s2;\n const k13 = iA * this.m_s1 * this.m_a1 + iB * this.m_s2 * this.m_a2;\n let k22 = iA + iB;\n if (k22 == 0.0) {\n // For bodies with fixed rotation.\n k22 = 1.0;\n }\n const k23 = iA * this.m_a1 + iB * this.m_a2;\n const k33 = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 * this.m_a2;\n\n this.m_K.ex.set(k11, k12, k13);\n this.m_K.ey.set(k12, k22, k23);\n this.m_K.ez.set(k13, k23, k33);\n }\n\n // Compute motor and limit terms.\n if (this.m_enableLimit) {\n\n const jointTranslation = Vec2.dot(this.m_axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * Settings.linearSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointTranslation <= this.m_lowerTranslation) {\n if (this.m_limitState != atLowerLimit) {\n this.m_limitState = atLowerLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else if (jointTranslation >= this.m_upperTranslation) {\n if (this.m_limitState != atUpperLimit) {\n this.m_limitState = atUpperLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n if (this.m_enableMotor == false) {\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse\n + this.m_impulse.z, this.m_axis);\n const LA = this.m_impulse.x * this.m_s1 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1;\n const LB = this.m_impulse.x * this.m_s2 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Solve linear motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits) {\n const Cdot = Vec2.dot(this.m_axis, Vec2.sub(vB, vA)) + this.m_a2 * wB\n - this.m_a1 * wA;\n let impulse = this.m_motorMass * (this.m_motorSpeed - Cdot);\n const oldImpulse = this.m_motorImpulse;\n const maxImpulse = step.dt * this.m_maxMotorForce;\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_axis);\n const LA = impulse * this.m_a1;\n const LB = impulse * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n const Cdot1 = Vec2.zero();\n Cdot1.x += Vec2.dot(this.m_perp, vB) + this.m_s2 * wB;\n Cdot1.x -= Vec2.dot(this.m_perp, vA) + this.m_s1 * wA;\n Cdot1.y = wB - wA;\n\n if (this.m_enableLimit && this.m_limitState != inactiveLimit) {\n // Solve prismatic and limit constraint in block form.\n let Cdot2 = 0;\n Cdot2 += Vec2.dot(this.m_axis, vB) + this.m_a2 * wB;\n Cdot2 -= Vec2.dot(this.m_axis, vA) + this.m_a1 * wA;\n\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const f1 = Vec3.clone(this.m_impulse);\n let df = this.m_K.solve33(Vec3.neg(Cdot)); // Vec3\n this.m_impulse.add(df);\n\n if (this.m_limitState == atLowerLimit) {\n this.m_impulse.z = Math.max(this.m_impulse.z, 0.0);\n } else if (this.m_limitState == atUpperLimit) {\n this.m_impulse.z = Math.min(this.m_impulse.z, 0.0);\n }\n\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n const b = Vec2.combine(-1, Cdot1, -(this.m_impulse.z - f1.z), Vec2.neo(this.m_K.ez.x, this.m_K.ez.y)); // Vec2\n const f2r = Vec2.add(this.m_K.solve22(b), Vec2.neo(f1.x, f1.y)); // Vec2\n this.m_impulse.x = f2r.x;\n this.m_impulse.y = f2r.y;\n\n df = Vec3.sub(this.m_impulse, f1);\n\n const P = Vec2.combine(df.x, this.m_perp, df.z, this.m_axis); // Vec2\n const LA = df.x * this.m_s1 + df.y + df.z * this.m_a1; // float\n const LB = df.x * this.m_s2 + df.y + df.z * this.m_a2; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n // Limit is inactive, just solve the prismatic constraint in block form.\n const df = this.m_K.solve22(Vec2.neg(Cdot1)); // Vec2\n this.m_impulse.x += df.x;\n this.m_impulse.y += df.y;\n\n const P = Vec2.mulNumVec2(df.x, this.m_perp); // Vec2\n const LA = df.x * this.m_s1 + df.y; // float\n const LB = df.x * this.m_s2 + df.y; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute fresh Jacobians\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n const d = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); // Vec2\n\n const axis = Rot.mulVec2(qA, this.m_localXAxisA); // Vec2\n const a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), axis); // float\n const a2 = Vec2.crossVec2Vec2(rB, axis); // float\n const perp = Rot.mulVec2(qA, this.m_localYAxisA); // Vec2\n\n const s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), perp); // float\n const s2 = Vec2.crossVec2Vec2(rB, perp); // float\n\n let impulse = new Vec3();\n const C1 = Vec2.zero(); // Vec2\n C1.x = Vec2.dot(perp, d);\n C1.y = aB - aA - this.m_referenceAngle;\n\n let linearError = Math.abs(C1.x); // float\n const angularError = Math.abs(C1.y); // float\n\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n let active = false; // bool\n let C2 = 0.0; // float\n if (this.m_enableLimit) {\n\n const translation = Vec2.dot(axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * linearSlop) {\n // Prevent large angular corrections\n C2 = Math.clamp(translation, -maxLinearCorrection, maxLinearCorrection);\n linearError = Math.max(linearError, Math.abs(translation));\n active = true;\n\n } else if (translation <= this.m_lowerTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_lowerTranslation + linearSlop,\n -maxLinearCorrection, 0.0);\n linearError = Math\n .max(linearError, this.m_lowerTranslation - translation);\n active = true;\n\n } else if (translation >= this.m_upperTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_upperTranslation - linearSlop, 0.0,\n maxLinearCorrection);\n linearError = Math\n .max(linearError, translation - this.m_upperTranslation);\n active = true;\n }\n }\n\n if (active) {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n const k13 = iA * s1 * a1 + iB * s2 * a2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n // For fixed rotation\n k22 = 1.0;\n }\n const k23 = iA * a1 + iB * a2; // float\n const k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; // float\n\n const K = new Mat33();\n K.ex.set(k11, k12, k13);\n K.ey.set(k12, k22, k23);\n K.ez.set(k13, k23, k33);\n\n const C = new Vec3();\n C.x = C1.x;\n C.y = C1.y;\n C.z = C2;\n\n impulse = K.solve33(Vec3.neg(C));\n } else {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n k22 = 1.0;\n }\n\n const K = new Mat22();\n K.ex.setNum(k11, k12);\n K.ey.setNum(k12, k22);\n\n const impulse1 = K.solve(Vec2.neg(C1)); // Vec2\n impulse.x = impulse1.x;\n impulse.y = impulse1.y;\n impulse.z = 0.0;\n }\n\n const P = Vec2.combine(impulse.x, perp, impulse.z, axis); // Vec2\n const LA = impulse.x * s1 + impulse.y + impulse.z * a1; // float\n const LB = impulse.x * s2 + impulse.y + impulse.z * a2; // float\n\n cA.subMul(mA, P);\n aA -= iA * LA;\n cB.addMul(mB, P);\n aB += iB * LB;\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { RevoluteJoint } from './RevoluteJoint';\nimport { PrismaticJoint } from './PrismaticJoint';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Gear joint definition.\n */\nexport interface GearJointOpt extends JointOpt {\n /**\n * The gear ratio. See {@link GearJoint} for explanation.\n */\n ratio?: number;\n}\n/**\n * Gear joint definition.\n */\nexport interface GearJointDef extends JointDef, GearJointOpt {\n /**\n * The first revolute/prismatic joint attached to the gear joint.\n */\n joint1: RevoluteJoint | PrismaticJoint;\n /**\n * The second prismatic/revolute joint attached to the gear joint.\n */\n joint2: RevoluteJoint | PrismaticJoint;\n}\n\nconst DEFAULTS = {\n ratio : 1.0\n};\n\n/**\n * A gear joint is used to connect two joints together. Either joint can be a\n * revolute or prismatic joint. You specify a gear ratio to bind the motions\n * together: coordinate1 + ratio * coordinate2 = constant\n *\n * The ratio can be negative or positive. If one joint is a revolute joint and\n * the other joint is a prismatic joint, then the ratio will have units of\n * length or units of 1/length. Warning: You have to manually destroy the gear\n * joint if joint1 or joint2 is destroyed.\n *\n * This definition requires two existing revolute or prismatic joints (any\n * combination will work).\n */\nexport class GearJoint extends Joint {\n static TYPE = 'gear-joint' as const;\n\n /** @internal */ m_type: 'gear-joint';\n /** @internal */ m_joint1: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_joint2: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_type1: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_type2: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_bodyC: Body;\n /** @internal */ m_localAnchorC: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_referenceAngleA: number;\n /** @internal */ m_localAxisC: Vec2;\n /** @internal */ m_bodyD: Body;\n /** @internal */ m_localAnchorD: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngleB: number;\n /** @internal */ m_localAxisD: Vec2;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_lcA: Vec2;\n /** @internal */ m_lcB: Vec2;\n /** @internal */ m_lcC: Vec2;\n /** @internal */ m_lcD: Vec2;\n /** @internal */ m_mA: number;\n /** @internal */ m_mB: number;\n /** @internal */ m_mC: number;\n /** @internal */ m_mD: number;\n /** @internal */ m_iA: number;\n /** @internal */ m_iB: number;\n /** @internal */ m_iC: number;\n /** @internal */ m_iD: number;\n /** @internal */ m_JvAC: Vec2;\n /** @internal */ m_JvBD: Vec2;\n /** @internal */ m_JwA: number;\n /** @internal */ m_JwB: number;\n /** @internal */ m_JwC: number;\n /** @internal */ m_JwD: number;\n /** @internal */ m_mass: number;\n\n constructor(def: GearJointDef);\n constructor(def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number);\n constructor(def: GearJointDef, bodyA?: Body, bodyB?: Body, joint1?: RevoluteJoint | PrismaticJoint, joint2?: RevoluteJoint | PrismaticJoint, ratio?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof GearJoint)) {\n return new GearJoint(def, bodyA, bodyB, joint1, joint2, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = GearJoint.TYPE;\n\n _ASSERT && console.assert(joint1.m_type === RevoluteJoint.TYPE\n || joint1.m_type === PrismaticJoint.TYPE);\n _ASSERT && console.assert(joint2.m_type === RevoluteJoint.TYPE\n || joint2.m_type === PrismaticJoint.TYPE);\n\n this.m_joint1 = joint1 ? joint1 : def.joint1;\n this.m_joint2 = joint2 ? joint2 : def.joint2;\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n this.m_type1 = this.m_joint1.getType() as 'revolute-joint' | 'prismatic-joint';\n this.m_type2 = this.m_joint2.getType() as 'revolute-joint' | 'prismatic-joint';\n\n // joint1 connects body A to body C\n // joint2 connects body B to body D\n\n let coordinateA: number;\n let coordinateB: number;\n\n // TODO_ERIN there might be some problem with the joint edges in Joint.\n\n this.m_bodyC = this.m_joint1.getBodyA();\n this.m_bodyA = this.m_joint1.getBodyB();\n\n // Get geometry of joint1\n const xfA = this.m_bodyA.m_xf;\n const aA = this.m_bodyA.m_sweep.a;\n const xfC = this.m_bodyC.m_xf;\n const aC = this.m_bodyC.m_sweep.a;\n\n if (this.m_type1 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint1 as RevoluteJoint;\n this.m_localAnchorC = revolute.m_localAnchorA;\n this.m_localAnchorA = revolute.m_localAnchorB;\n this.m_referenceAngleA = revolute.m_referenceAngle;\n this.m_localAxisC = Vec2.zero();\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const prismatic = this.m_joint1 as PrismaticJoint;\n this.m_localAnchorC = prismatic.m_localAnchorA;\n this.m_localAnchorA = prismatic.m_localAnchorB;\n this.m_referenceAngleA = prismatic.m_referenceAngle;\n this.m_localAxisC = prismatic.m_localXAxisA;\n\n const pC = this.m_localAnchorC;\n const pA = Rot.mulTVec2(xfC.q, Vec2.add(Rot.mulVec2(xfA.q, this.m_localAnchorA), Vec2.sub(xfA.p, xfC.p)));\n coordinateA = Vec2.dot(pA, this.m_localAxisC) - Vec2.dot(pC, this.m_localAxisC);\n }\n\n this.m_bodyD = this.m_joint2.getBodyA();\n this.m_bodyB = this.m_joint2.getBodyB();\n\n // Get geometry of joint2\n const xfB = this.m_bodyB.m_xf;\n const aB = this.m_bodyB.m_sweep.a;\n const xfD = this.m_bodyD.m_xf;\n const aD = this.m_bodyD.m_sweep.a;\n\n if (this.m_type2 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint2 as RevoluteJoint;\n this.m_localAnchorD = revolute.m_localAnchorA;\n this.m_localAnchorB = revolute.m_localAnchorB;\n this.m_referenceAngleB = revolute.m_referenceAngle;\n this.m_localAxisD = Vec2.zero();\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const prismatic = this.m_joint2 as PrismaticJoint;\n this.m_localAnchorD = prismatic.m_localAnchorA;\n this.m_localAnchorB = prismatic.m_localAnchorB;\n this.m_referenceAngleB = prismatic.m_referenceAngle;\n this.m_localAxisD = prismatic.m_localXAxisA;\n\n const pD = this.m_localAnchorD;\n const pB = Rot.mulTVec2(xfD.q, Vec2.add(Rot.mulVec2(xfB.q, this.m_localAnchorB), Vec2.sub(xfB.p, xfD.p)));\n coordinateB = Vec2.dot(pB, this.m_localAxisD) - Vec2.dot(pD, this.m_localAxisD);\n }\n\n this.m_constant = coordinateA + this.m_ratio * coordinateB;\n\n this.m_impulse = 0.0;\n\n // Gear Joint:\n // C0 = (coordinate1 + ratio * coordinate2)_initial\n // C = (coordinate1 + ratio * coordinate2) - C0 = 0\n // J = [J1 ratio * J2]\n // K = J * invM * JT\n // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T\n //\n // Revolute:\n // coordinate = rotation\n // Cdot = angularVelocity\n // J = [0 0 1]\n // K = J * invM * JT = invI\n //\n // Prismatic:\n // coordinate = dot(p - pg, ug)\n // Cdot = dot(v + cross(w, r), ug)\n // J = [ug cross(r, ug)]\n // K = J * invM * JT = invMass + invI * cross(r, ug)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n joint1: this.m_joint1,\n joint2: this.m_joint2,\n ratio: this.m_ratio,\n\n // _constant: this.m_constant,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): GearJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.joint1 = restore(Joint, data.joint1, world);\n data.joint2 = restore(Joint, data.joint2, world);\n const joint = new GearJoint(data);\n // if (data._constant) joint.m_constant = data._constant;\n return joint;\n }\n\n /**\n * Get the first joint.\n */\n getJoint1(): Joint {\n return this.m_joint1;\n }\n\n /**\n * Get the second joint.\n */\n getJoint2(): Joint {\n return this.m_joint2;\n }\n\n /**\n * Set the gear ratio.\n */\n setRatio(ratio: number): void {\n _ASSERT && console.assert(Math.isFinite(ratio));\n this.m_ratio = ratio;\n }\n\n /**\n * Get the gear ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_JvAC).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n const L = this.m_impulse * this.m_JwA; // float\n return inv_dt * L;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_lcA = this.m_bodyA.m_sweep.localCenter;\n this.m_lcB = this.m_bodyB.m_sweep.localCenter;\n this.m_lcC = this.m_bodyC.m_sweep.localCenter;\n this.m_lcD = this.m_bodyD.m_sweep.localCenter;\n this.m_mA = this.m_bodyA.m_invMass;\n this.m_mB = this.m_bodyB.m_invMass;\n this.m_mC = this.m_bodyC.m_invMass;\n this.m_mD = this.m_bodyD.m_invMass;\n this.m_iA = this.m_bodyA.m_invI;\n this.m_iB = this.m_bodyB.m_invI;\n this.m_iC = this.m_bodyC.m_invI;\n this.m_iD = this.m_bodyD.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const aC = this.m_bodyC.c_position.a;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n\n const aD = this.m_bodyD.c_position.a;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n this.m_mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n this.m_JvAC = Vec2.zero();\n this.m_JwA = 1.0;\n this.m_JwC = 1.0;\n this.m_mass += this.m_iA + this.m_iC;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n this.m_JvAC = u;\n this.m_JwC = Vec2.crossVec2Vec2(rC, u);\n this.m_JwA = Vec2.crossVec2Vec2(rA, u);\n this.m_mass += this.m_mC + this.m_mA + this.m_iC * this.m_JwC * this.m_JwC + this.m_iA * this.m_JwA * this.m_JwA;\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n this.m_JvBD = Vec2.zero();\n this.m_JwB = this.m_ratio;\n this.m_JwD = this.m_ratio;\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD); // Vec2\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); // Vec2\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); // Vec2\n this.m_JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n this.m_JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n this.m_JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD * this.m_JwD * this.m_JwD + this.m_iB * this.m_JwB * this.m_JwB;\n }\n\n // Compute effective mass.\n this.m_mass = this.m_mass > 0.0 ? 1.0 / this.m_mass : 0.0;\n\n if (step.warmStarting) {\n vA.addMul(this.m_mA * this.m_impulse, this.m_JvAC);\n wA += this.m_iA * this.m_impulse * this.m_JwA;\n\n vB.addMul(this.m_mB * this.m_impulse, this.m_JvBD);\n wB += this.m_iB * this.m_impulse * this.m_JwB;\n\n vC.subMul(this.m_mC * this.m_impulse, this.m_JvAC);\n wC -= this.m_iC * this.m_impulse * this.m_JwC;\n\n vD.subMul(this.m_mD * this.m_impulse, this.m_JvBD);\n wD -= this.m_iD * this.m_impulse * this.m_JwD;\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n let Cdot = Vec2.dot(this.m_JvAC, vA) - Vec2.dot(this.m_JvAC, vC)\n + Vec2.dot(this.m_JvBD, vB) - Vec2.dot(this.m_JvBD, vD); // float\n Cdot += (this.m_JwA * wA - this.m_JwC * wC)\n + (this.m_JwB * wB - this.m_JwD * wD);\n\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n vA.addMul(this.m_mA * impulse, this.m_JvAC);\n wA += this.m_iA * impulse * this.m_JwA;\n vB.addMul(this.m_mB * impulse, this.m_JvBD);\n wB += this.m_iB * impulse * this.m_JwB;\n vC.subMul(this.m_mC * impulse, this.m_JvAC);\n wC -= this.m_iC * impulse * this.m_JwC;\n vD.subMul(this.m_mD * impulse, this.m_JvBD);\n wD -= this.m_iD * impulse * this.m_JwD;\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n const cC = this.m_bodyC.c_position.c;\n let aC = this.m_bodyC.c_position.a;\n const cD = this.m_bodyD.c_position.c;\n let aD = this.m_bodyD.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n const linearError = 0.0;\n\n let coordinateA: number;\n let coordinateB: number;\n\n let JvAC: Vec2;\n let JvBD: Vec2;\n let JwA: number;\n let JwB: number;\n let JwC: number;\n let JwD: number;\n let mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n JvAC = Vec2.zero();\n JwA = 1.0;\n JwC = 1.0;\n mass += this.m_iA + this.m_iC;\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n JvAC = u;\n JwC = Vec2.crossVec2Vec2(rC, u);\n JwA = Vec2.crossVec2Vec2(rA, u);\n mass += this.m_mC + this.m_mA + this.m_iC * JwC * JwC + this.m_iA * JwA * JwA;\n\n const pC = Vec2.sub(this.m_localAnchorC, this.m_lcC); // Vec2\n const pA = Rot.mulTVec2(qC, Vec2.add(rA, Vec2.sub(cA, cC))); // Vec2\n coordinateA = Vec2.dot(Vec2.sub(pA, pC), this.m_localAxisC);\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n JvBD = Vec2.zero();\n JwB = this.m_ratio;\n JwD = this.m_ratio;\n mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD);\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB);\n JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD\n * JwD * JwD + this.m_iB * JwB * JwB;\n\n const pD = Vec2.sub(this.m_localAnchorD, this.m_lcD); // Vec2\n const pB = Rot.mulTVec2(qD, Vec2.add(rB, Vec2.sub(cB, cD))); // Vec2\n coordinateB = Vec2.dot(pB, this.m_localAxisD)\n - Vec2.dot(pD, this.m_localAxisD);\n }\n\n const C = (coordinateA + this.m_ratio * coordinateB) - this.m_constant; // float\n\n let impulse = 0.0; // float\n if (mass > 0.0) {\n impulse = -C / mass;\n }\n\n cA.addMul(this.m_mA * impulse, JvAC);\n aA += this.m_iA * impulse * JwA;\n cB.addMul(this.m_mB * impulse, JvBD);\n aB += this.m_iB * impulse * JwB;\n cC.subMul(this.m_mC * impulse, JvAC);\n aC -= this.m_iC * impulse * JwC;\n cD.subMul(this.m_mD * impulse, JvBD);\n aD -= this.m_iD * impulse * JwD;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n this.m_bodyC.c_position.c.setVec2(cC);\n this.m_bodyC.c_position.a = aC;\n this.m_bodyD.c_position.c.setVec2(cD);\n this.m_bodyD.c_position.a = aD;\n\n // TODO_ERIN not implemented\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Motor joint definition.\n */\nexport interface MotorJointOpt extends JointOpt {\n /**\n * The bodyB angle minus bodyA angle in radians.\n */\n angularOffset?: number;\n /**\n * The maximum motor force in N.\n */\n maxForce?: number;\n /**\n * The maximum motor torque in N-m.\n */\n maxTorque?: number;\n /**\n * Position correction factor in the range [0,1].\n */\n correctionFactor?: number;\n /**\n * Position of bodyB minus the position of bodyA, in bodyA's frame, in meters.\n */\n linearOffset?: Vec2;\n}\n/**\n * Motor joint definition.\n */\nexport interface MotorJointDef extends JointDef, MotorJointOpt {\n}\n\nconst DEFAULTS = {\n maxForce : 1.0,\n maxTorque : 1.0,\n correctionFactor : 0.3\n};\n\n/**\n * A motor joint is used to control the relative motion between two bodies. A\n * typical usage is to control the movement of a dynamic body with respect to\n * the ground.\n */\nexport class MotorJoint extends Joint {\n static TYPE = 'motor-joint' as const;\n\n /** @internal */ m_type: 'motor-joint';\n /** @internal */ m_linearOffset: Vec2;\n /** @internal */ m_angularOffset: number;\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n /** @internal */ m_correctionFactor: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_linearError: Vec2;\n /** @internal */ m_angularError: number;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: MotorJointDef);\n constructor(def: MotorJointOpt, bodyA: Body, bodyB: Body);\n constructor(def: MotorJointDef | MotorJointOpt, bodyA?: Body, bodyB?: Body) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof MotorJoint)) {\n return new MotorJoint(def, bodyA, bodyB);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MotorJoint.TYPE;\n\n this.m_linearOffset = Math.isFinite(def.linearOffset) ? def.linearOffset : bodyA.getLocalPoint(bodyB.getPosition());\n this.m_angularOffset = Math.isFinite(def.angularOffset) ? def.angularOffset : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n this.m_correctionFactor = def.correctionFactor;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n correctionFactor: this.m_correctionFactor,\n\n linearOffset: this.m_linearOffset,\n angularOffset: this.m_angularOffset,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MotorJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new MotorJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {}): void {\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && console.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && console.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Set the position correction factor in the range [0,1].\n */\n setCorrectionFactor(factor: number): void {\n _ASSERT && console.assert(Math.isFinite(factor) && 0.0 <= factor && factor <= 1.0);\n this.m_correctionFactor = factor;\n }\n\n /**\n * Get the position correction factor in the range [0,1].\n */\n getCorrectionFactor(): number {\n return this.m_correctionFactor;\n }\n\n /**\n * Set/get the target linear offset, in frame A, in meters.\n */\n setLinearOffset(linearOffset: Vec2): void {\n if (linearOffset.x != this.m_linearOffset.x\n || linearOffset.y != this.m_linearOffset.y) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_linearOffset = linearOffset;\n }\n }\n\n getLinearOffset(): Vec2 {\n return this.m_linearOffset;\n }\n\n /**\n * Set/get the target angular offset, in radians.\n */\n setAngularOffset(angularOffset: number): void {\n if (angularOffset != this.m_angularOffset) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_angularOffset = angularOffset;\n }\n }\n\n getAngularOffset(): number {\n return this.m_angularOffset;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getPosition();\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getPosition();\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.neg(this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.neg(this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n this.m_linearError = Vec2.zero();\n this.m_linearError.addCombine(1, cB, 1, this.m_rB);\n this.m_linearError.subCombine(1, cA, 1, this.m_rA);\n this.m_linearError.sub(Rot.mulVec2(qA, this.m_linearOffset));\n\n this.m_angularError = aB - aA - this.m_angularOffset;\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt;\n const inv_h = step.inv_dt;\n\n // Solve angular friction\n {\n const Cdot = wB - wA + inv_h * this.m_correctionFactor * this.m_angularError;\n let impulse = -this.m_angularMass * Cdot;\n\n const oldImpulse = this.m_angularImpulse;\n const maxImpulse = h * this.m_maxTorque;\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n Cdot.addMul(inv_h * this.m_correctionFactor, this.m_linearError);\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot));\n const oldImpulse = Vec2.clone(this.m_linearImpulse);\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce;\n\n this.m_linearImpulse.clamp(maxImpulse);\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Transform } from '../../common/Transform';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointOpt extends JointOpt {\n /**\n * [maxForce = 0.0] The maximum constraint force that can be exerted to move\n * the candidate body. Usually you will express as some multiple of the\n * weight (multiplier * mass * gravity).\n */\n maxForce?: number;\n /**\n * [frequencyHz = 5.0] The response speed.\n */\n frequencyHz?: number;\n /**\n * [dampingRatio = 0.7] The damping ratio. 0 = no damping, 1 = critical\n * damping.\n */\n dampingRatio?: number;\n}\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointDef extends JointDef, MouseJointOpt {\n /**\n * The initial world target point. This is assumed to coincide with the body\n * anchor initially.\n */\n target: Vec2Value;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n frequencyHz : 5.0,\n dampingRatio : 0.7\n};\n\n/**\n * A mouse joint is used to make a point on a body track a specified world\n * point. This a soft constraint with a maximum force. This allows the\n * constraint to stretch and without applying huge forces.\n *\n * NOTE: this joint is not documented in the manual because it was developed to\n * be used in the testbed. If you want to learn how to use the mouse joint, look\n * at the testbed.\n */\nexport class MouseJoint extends Joint {\n static TYPE = 'mouse-joint' as const;\n\n /** @internal */ m_type: 'mouse-joint';\n /** @internal */ m_targetA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_impulse: Vec2;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_beta: number;\n /** @internal */ m_gamma: number;\n // Solver temp\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat22;\n /** @internal */ m_C: Vec2;\n\n constructor(def: MouseJointDef);\n constructor(def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2);\n constructor(def: MouseJointDef, bodyA?: Body, bodyB?: Body, target?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof MouseJoint)) {\n return new MouseJoint(def, bodyA, bodyB, target);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MouseJoint.TYPE;\n\n _ASSERT && console.assert(Math.isFinite(def.maxForce) && def.maxForce >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.frequencyHz) && def.frequencyHz >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.dampingRatio) && def.dampingRatio >= 0.0);\n\n if (Vec2.isValid(target)) {\n this.m_targetA = Vec2.clone(target);\n } else if (Vec2.isValid(def.target)) {\n this.m_targetA = Vec2.clone(def.target);\n } else {\n this.m_targetA = Vec2.zero();\n }\n\n this.m_localAnchorB = Transform.mulTVec2(bodyB.getTransform(), this.m_targetA);\n\n this.m_maxForce = def.maxForce;\n this.m_impulse = Vec2.zero();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_beta = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rB = Vec2.zero();\n this.m_localCenterB = Vec2.zero();\n this.m_invMassB = 0.0;\n this.m_invIB = 0.0;\n this.m_mass = new Mat22();\n this.m_C = Vec2.zero();\n\n // p = attached point, m = mouse point\n // C = p - m\n // Cdot = v\n // = v + cross(w, r)\n // J = [I r_skew]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n target: this.m_targetA,\n maxForce: this.m_maxForce,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n _localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MouseJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.target = Vec2.clone(data.target);\n const joint = new MouseJoint(data);\n if (data._localAnchorB) {\n joint.m_localAnchorB = data._localAnchorB;\n }\n return joint;\n }\n\n /**\n * Use this to update the target point.\n */\n setTarget(target: Vec2Value): void {\n if (this.m_bodyB.isAwake() == false) {\n this.m_bodyB.setAwake(true);\n }\n this.m_targetA = Vec2.clone(target);\n }\n\n getTarget(): Vec2 {\n return this.m_targetA;\n }\n\n /**\n * Set the maximum force in Newtons.\n */\n setMaxForce(force: number): void {\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum force in Newtons.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the frequency in Hertz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get the frequency in Hertz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set the damping ratio (dimensionless).\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get the damping ratio (dimensionless).\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return Vec2.clone(this.m_targetA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_impulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * 0.0;\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2Value): void {\n this.m_targetA.sub(newOrigin);\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const position = this.m_bodyB.c_position;\n const velocity = this.m_bodyB.c_velocity;\n\n const cB = position.c;\n const aB = position.a;\n const vB = velocity.v;\n let wB = velocity.w;\n\n const qB = Rot.neo(aB);\n\n const mass = this.m_bodyB.getMass();\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = mass * (omega * omega);\n\n // magic formulas\n // gamma has units of inverse mass.\n // beta has units of inverse time.\n const h = step.dt;\n _ASSERT && console.assert(d + h * k > Math.EPSILON);\n this.m_gamma = h * (d + h * k);\n if (this.m_gamma != 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n this.m_beta = h * k * this.m_gamma;\n\n // Compute the effective mass matrix.\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) *\n // invI2 * skew(r2)]\n // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y\n // -r1.x*r1.y]\n // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x]\n const K = new Mat22();\n K.ex.x = this.m_invMassB + this.m_invIB * this.m_rB.y * this.m_rB.y\n + this.m_gamma;\n K.ex.y = -this.m_invIB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = this.m_invMassB + this.m_invIB * this.m_rB.x * this.m_rB.x\n + this.m_gamma;\n\n this.m_mass = K.getInverse();\n\n this.m_C.setVec2(cB);\n this.m_C.addCombine(1, this.m_rB, -1, this.m_targetA);\n this.m_C.mul(this.m_beta);\n\n // Cheat with some damping\n wB *= 0.98;\n\n if (step.warmStarting) {\n this.m_impulse.mul(step.dtRatio);\n vB.addMul(this.m_invMassB, this.m_impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, this.m_impulse);\n\n } else {\n this.m_impulse.setZero();\n }\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const velocity = this.m_bodyB.c_velocity;\n const vB = Vec2.clone(velocity.v);\n let wB = velocity.w;\n\n // Cdot = v + cross(w, r)\n\n const Cdot = Vec2.crossNumVec2(wB, this.m_rB);\n Cdot.add(vB);\n\n Cdot.addCombine(1, this.m_C, this.m_gamma, this.m_impulse);\n Cdot.neg();\n\n let impulse = Mat22.mulVec2(this.m_mass, Cdot);\n\n const oldImpulse = Vec2.clone(this.m_impulse);\n this.m_impulse.add(impulse);\n const maxImpulse = step.dt * this.m_maxForce;\n this.m_impulse.clamp(maxImpulse);\n impulse = Vec2.sub(this.m_impulse, oldImpulse);\n\n vB.addMul(this.m_invMassB, impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\n// tslint:disable-next-line:no-empty-interface\nexport interface PulleyJointOpt extends JointOpt {\n}\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\nexport interface PulleyJointDef extends JointDef, PulleyJointOpt {\n /**\n * The first ground anchor in world coordinates. This point never moves.\n */\n groundAnchorA: Vec2;\n /**\n * The second ground anchor in world coordinates. This point never moves.\n */\n groundAnchorB: Vec2;\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The reference length for the segment attached to bodyA.\n */\n lengthA: number;\n /**\n * The reference length for the segment attached to bodyB.\n */\n lengthB: number;\n /**\n * The pulley ratio, used to simulate a block-and-tackle.\n */\n ratio: number;\n}\n\nconst DEFAULTS = {\n collideConnected : true\n};\n\n/**\n * The pulley joint is connected to two bodies and two fixed ground points. The\n * pulley supports a ratio such that: length1 + ratio * length2 <= constant\n *\n * Yes, the force transmitted is scaled by the ratio.\n *\n * Warning: the pulley joint can get a bit squirrelly by itself. They often work\n * better when combined with prismatic joints. You should also cover the the\n * anchor points with static shapes to prevent one side from going to zero\n * length.\n */\nexport class PulleyJoint extends Joint {\n static TYPE = 'pulley-joint' as const;\n // static MIN_PULLEY_LENGTH: number = 2.0; // TODO where this is used?\n\n /** @internal */ m_type: 'pulley-joint';\n /** @internal */ m_groundAnchorA: Vec2;\n /** @internal */ m_groundAnchorB: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_lengthA: number;\n /** @internal */ m_lengthB: number;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_uA: Vec2;\n /** @internal */ m_uB: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: PulleyJointDef);\n constructor(def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number);\n constructor(def: PulleyJointDef, bodyA?: Body, bodyB?: Body, groundA?: Vec2, groundB?: Vec2, anchorA?: Vec2, anchorB?: Vec2, ratio?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PulleyJoint)) {\n return new PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PulleyJoint.TYPE;\n this.m_groundAnchorA = groundA ? groundA : def.groundAnchorA || Vec2.neo(-1.0, 1.0);\n this.m_groundAnchorB = groundB ? groundB : def.groundAnchorB || Vec2.neo(1.0, 1.0);\n this.m_localAnchorA = anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n this.m_lengthA = Math.isFinite(def.lengthA) ? def.lengthA : Vec2.distance(anchorA, groundA);\n this.m_lengthB = Math.isFinite(def.lengthB) ? def.lengthB : Vec2.distance(anchorB, groundB);\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n _ASSERT && console.assert(ratio > Math.EPSILON);\n\n this.m_constant = this.m_lengthA + this.m_ratio * this.m_lengthB;\n\n this.m_impulse = 0.0;\n\n // Pulley:\n // length1 = norm(p1 - s1)\n // length2 = norm(p2 - s2)\n // C0 = (length1 + ratio * length2)_initial\n // C = C0 - (length1 + ratio * length2)\n // u1 = (p1 - s1) / norm(p1 - s1)\n // u2 = (p2 - s2) / norm(p2 - s2)\n // Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2))\n // J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 *\n // cross(r2, u2)^2)\n }\n\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n groundAnchorA: this.m_groundAnchorA,\n groundAnchorB: this.m_groundAnchorB,\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n lengthA: this.m_lengthA,\n lengthB: this.m_lengthB,\n ratio: this.m_ratio,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PulleyJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new PulleyJoint(data);\n return joint;\n }\n\n /**\n * Get the first ground anchor.\n */\n getGroundAnchorA(): Vec2 {\n return this.m_groundAnchorA;\n }\n\n /**\n * Get the second ground anchor.\n */\n getGroundAnchorB(): Vec2 {\n return this.m_groundAnchorB;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getLengthA(): number {\n return this.m_lengthA;\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getLengthB(): number {\n return this.m_lengthB;\n }\n\n /**\n * Get the pulley ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getCurrentLengthA(): number {\n const p = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const s = this.m_groundAnchorA;\n return Vec2.distance(p, s);\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getCurrentLengthB(): number {\n const p = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const s = this.m_groundAnchorB;\n return Vec2.distance(p, s);\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n *\n * @param newOrigin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_groundAnchorA.sub(newOrigin);\n this.m_groundAnchorB.sub(newOrigin);\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_uB).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n this.m_uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n this.m_uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = this.m_uA.length();\n const lengthB = this.m_uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n this.m_uA.mul(1.0 / lengthA);\n } else {\n this.m_uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n this.m_uB.mul(1.0 / lengthB);\n } else {\n this.m_uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(this.m_rA, this.m_uA); // float\n const ruB = Vec2.crossVec2Vec2(this.m_rB, this.m_uB); // float\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n this.m_mass = mA + this.m_ratio * this.m_ratio * mB;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support variable time steps.\n this.m_impulse *= step.dtRatio;\n\n // Warm starting.\n const PA = Vec2.mulNumVec2(-this.m_impulse, this.m_uA);\n const PB = Vec2.mulNumVec2(-this.m_ratio * this.m_impulse, this.m_uB);\n\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n\n const Cdot = -Vec2.dot(this.m_uA, vpA) - this.m_ratio\n * Vec2.dot(this.m_uB, vpB); // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const PA = Vec2.mulNumVec2(-impulse, this.m_uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, this.m_uB); // Vec2\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n const uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n const uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = uA.length();\n const lengthB = uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n uA.mul(1.0 / lengthA);\n } else {\n uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n uB.mul(1.0 / lengthB);\n } else {\n uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(rA, uA);\n const ruB = Vec2.crossVec2Vec2(rB, uB);\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n let mass = mA + this.m_ratio * this.m_ratio * mB; // float\n\n if (mass > 0.0) {\n mass = 1.0 / mass;\n }\n\n const C = this.m_constant - lengthA - this.m_ratio * lengthB; // float\n const linearError = Math.abs(C); // float\n\n const impulse = -mass * C; // float\n\n const PA = Vec2.mulNumVec2(-impulse, uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, uB); // Vec2\n\n cA.addMul(this.m_invMassA, PA);\n aA += this.m_invIA * Vec2.crossVec2Vec2(rA, PA);\n cB.addMul(this.m_invMassB, PB);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, PB);\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointOpt extends JointOpt {\n /**\n * The maximum length of the rope.\n * Warning: this must be larger than linearSlop or the joint will have no effect.\n */\n maxLength?: number;\n}\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointDef extends JointDef, RopeJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxLength : 0.0,\n};\n\n/**\n * A rope joint enforces a maximum distance between two points on two bodies. It\n * has no other effect.\n *\n * Warning: if you attempt to change the maximum length during the simulation\n * you will get some non-physical behavior.\n *\n * A model that would allow you to dynamically modify the length would have some\n * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you\n * want to dynamically control length.\n */\nexport class RopeJoint extends Joint {\n static TYPE = 'rope-joint' as const;\n\n /** @internal */ m_type: 'rope-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n /** @internal */ m_maxLength: number;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_length: number;\n /** @internal */ m_state: number; // TODO enum\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n constructor(def: RopeJointDef);\n constructor(def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: RopeJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof RopeJoint)) {\n return new RopeJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RopeJoint.TYPE;\n this.m_localAnchorA = anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n\n this.m_maxLength = def.maxLength;\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_length = 0.0;\n this.m_state = inactiveLimit;\n\n // Limit:\n // C = norm(pB - pA) - L\n // u = (pB - pA) / norm(pB - pA)\n // Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA))\n // J = [-u -cross(rA, u) u cross(rB, u)]\n // K = J * invM * JT\n // = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n maxLength: this.m_maxLength,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): RopeJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RopeJoint(data);\n return joint;\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum length of the rope.\n */\n setMaxLength(length: number): void {\n this.m_maxLength = length;\n }\n\n /**\n * Get the maximum length of the rope.\n */\n getMaxLength(): number {\n return this.m_maxLength;\n }\n\n getLimitState(): number {\n // TODO LimitState\n return this.m_state;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n this.m_rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n this.m_u = Vec2.zero();\n this.m_u.addCombine(1, cB, 1, this.m_rB);\n this.m_u.subCombine(1, cA, 1, this.m_rA); // Vec2\n\n this.m_length = this.m_u.length();\n\n const C = this.m_length - this.m_maxLength; // float\n if (C > 0.0) {\n this.m_state = atUpperLimit;\n } else {\n this.m_state = inactiveLimit;\n }\n\n if (this.m_length > Settings.linearSlop) {\n this.m_u.mul(1.0 / this.m_length);\n } else {\n this.m_u.setZero();\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n return;\n }\n\n // Compute effective mass.\n const crA = Vec2.crossVec2Vec2(this.m_rA, this.m_u); // float\n const crB = Vec2.crossVec2Vec2(this.m_rB, this.m_u); // float\n const invMass = this.m_invMassA + this.m_invIA * crA * crA + this.m_invMassB\n + this.m_invIB * crB * crB; // float\n\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.addCrossNumVec2(vA, wA, this.m_rA); // Vec2\n const vpB = Vec2.addCrossNumVec2(vB, wB, this.m_rB); // Vec2\n const C = this.m_length - this.m_maxLength; // float\n let Cdot = Vec2.dot(this.m_u, Vec2.sub(vpB, vpA)); // float\n\n // Predictive constraint.\n if (C < 0.0) {\n Cdot += step.inv_dt * C;\n }\n\n let impulse = -this.m_mass * Cdot; // float\n const oldImpulse = this.m_impulse; // float\n this.m_impulse = Math.min(0.0, this.m_impulse + impulse);\n impulse = this.m_impulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u); // Vec2\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c; // Vec2\n let aA = this.m_bodyA.c_position.a; // float\n const cB = this.m_bodyB.c_position.c; // Vec2\n let aB = this.m_bodyB.c_position.a; // float\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.zero();\n u.addCombine(1, cB, 1, rB);\n u.subCombine(1, cA, 1, rA); // Vec2\n\n const length = u.normalize(); // float\n let C = length - this.m_maxLength; // float\n\n C = Math.clamp(C, 0.0, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C; // float\n const P = Vec2.mulNumVec2(impulse, u); // Vec2\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return length - this.m_maxLength < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n *\n * @prop {float} frequencyHz\n * @prop {float} dampingRatio\n *\n * @prop {Vec2} localAnchorA\n * @prop {Vec2} localAnchorB\n * @prop {float} referenceAngle\n */\nexport interface WeldJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. Rotation only. Disable softness\n * with a value of 0.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle?: number;\n}\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n */\nexport interface WeldJointDef extends JointDef, WeldJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0,\n};\n\n/**\n * A weld joint essentially glues two bodies together. A weld joint may distort\n * somewhat because the island constraint solver is approximate.\n */\nexport class WeldJoint extends Joint {\n static TYPE = 'weld-joint' as const\n\n /** @internal */ m_type: 'weld-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_impulse: Vec3;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat33;\n\n constructor(def: WeldJointDef);\n constructor(def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: WeldJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof WeldJoint)) {\n return new WeldJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WeldJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_impulse = new Vec3();\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rA; // Vec2\n this.m_rB; // Vec2\n this.m_localCenterA; // Vec2\n this.m_localCenterB; // Vec2\n this.m_invMassA; // float\n this.m_invMassB; // float\n this.m_invIA; // float\n this.m_invIB; // float\n this.m_mass = new Mat33();\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // / = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // C = angle2 - angle1 - referenceAngle\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WeldJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WeldJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Set frequency in Hz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get frequency in Hz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set damping ratio.\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get damping ratio.\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat33();\n K.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y * this.m_rB.y\n * iB;\n K.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y * this.m_rB.x * iB;\n K.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x * this.m_rB.x\n * iB;\n K.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n K.getInverse22(this.m_mass);\n\n let invM = iA + iB; // float\n const m = invM > 0.0 ? 1.0 / invM : 0.0; // float\n\n const C = aB - aA - this.m_referenceAngle; // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const d = 2.0 * m * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = m * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invM += this.m_gamma;\n this.m_mass.ez.z = invM != 0.0 ? 1.0 / invM : 0.0;\n } else if (K.ez.z == 0.0) {\n K.getInverse22(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n } else {\n K.getSymInverse33(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n if (this.m_frequencyHz > 0.0) {\n const Cdot2 = wB - wA; // float\n\n const impulse2 = -this.m_mass.ez.z\n * (Cdot2 + this.m_bias + this.m_gamma * this.m_impulse.z); // float\n this.m_impulse.z += impulse2;\n\n wA -= iA * impulse2;\n wB += iB * impulse2;\n\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n\n const impulse1 = Vec2.neg(Mat33.mulVec2(this.m_mass, Cdot1)); // Vec2\n this.m_impulse.x += impulse1.x;\n this.m_impulse.y += impulse1.y;\n\n const P = Vec2.clone(impulse1); // Vec2\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, P);\n } else {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); // Vec3\n\n const impulse = Vec3.neg(Mat33.mulVec3(this.m_mass, Cdot)); // Vec3\n this.m_impulse.add(impulse);\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n let positionError: number;\n let angularError: number;\n\n const K = new Mat33();\n K.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB;\n K.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB;\n K.ez.x = -rA.y * iA - rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB;\n K.ez.y = rA.x * iA + rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA); // Vec2\n\n positionError = C1.length();\n angularError = 0.0;\n\n const P = Vec2.neg(K.solve22(C1)); // Vec2\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n } else {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA);\n\n const C2 = aB - aA - this.m_referenceAngle; // float\n\n positionError = C1.length();\n angularError = Math.abs(C2);\n\n const C = new Vec3(C1.x, C1.y, C2);\n\n let impulse = new Vec3();\n if (K.ez.z > 0.0) {\n impulse = Vec3.neg(K.solve33(C));\n } else {\n const impulse2 = Vec2.neg(K.solve22(C1));\n impulse.set(impulse2.x, impulse2.y, 0.0);\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n cA.subMul(mA, P);\n aA -= iA * (Vec2.crossVec2Vec2(rA, P) + impulse.z);\n\n cB.addMul(mB, P);\n aB += iB * (Vec2.crossVec2Vec2(rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointOpt extends JointOpt {\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n /**\n * Suspension frequency, zero indicates no suspension.\n */\n frequencyHz?: number;\n /**\n * Suspension damping ratio, one indicates critical damping.\n */\n dampingRatio?: number;\n}\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointDef extends JointDef, WheelJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation axis in bodyA.\n */\n localAxisA: Vec2;\n}\n\nconst DEFAULTS = {\n enableMotor : false,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n frequencyHz : 2.0,\n dampingRatio : 0.7,\n};\n\n/**\n * A wheel joint. This joint provides two degrees of freedom: translation along\n * an axis fixed in bodyA and rotation in the plane. In other words, it is a\n * point to line constraint with a rotational motor and a linear spring/damper.\n * This joint is designed for vehicle suspensions.\n */\nexport class WheelJoint extends Joint {\n static TYPE = 'wheel-joint' as const;\n\n /** @internal */ m_type: 'wheel-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_springMass: number;\n /** @internal */ m_springImpulse: number;\n\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableMotor: boolean;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n /** @internal */ m_ax: Vec2 = Vec2.zero();\n /** @internal */ m_ay: Vec2 = Vec2.zero();\n /** @internal */ m_sAx: number;\n /** @internal */ m_sBx: number;\n /** @internal */ m_sAy: number;\n /** @internal */ m_sBy: number;\n\n constructor(def: WheelJointDef);\n constructor(def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n // @ts-ignore\n constructor(def: WheelJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof WheelJoint)) {\n return new WheelJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WheelJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n // @ts-ignore localAxis\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || def.localAxis || Vec2.neo(1.0, 0.0));\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n this.m_springMass = 0.0;\n this.m_springImpulse = 0.0;\n\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableMotor = def.enableMotor;\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Linear constraint (point-to-line)\n // d = pB - pA = xB + rB - xA - rA\n // C = dot(ay, d)\n // Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA,\n // rA))\n // = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB,\n // ay), vB)\n // J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)]\n\n // Spring linear constraint\n // C = dot(ax, d)\n // Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) +\n // dot(cross(rB, ax), vB)\n // J = [-ax -cross(d+rA, ax) ax cross(rB, ax)]\n\n // Motor rotational constraint\n // Cdot = wB - wA\n // J = [0 0 -1 0 0 1]\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n enableMotor: this.m_enableMotor,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WheelJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WheelJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const pA = bA.getWorldPoint(this.m_localAnchorA); // Vec2\n const pB = bB.getWorldPoint(this.m_localAnchorB); // Vec2\n const d = Vec2.sub(pB, pA); // Vec2\n const axis = bA.getWorldVector(this.m_localXAxisA); // Vec2\n\n const translation = Vec2.dot(d, axis); // float\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const wA = this.m_bodyA.m_angularVelocity;\n const wB = this.m_bodyB.m_angularVelocity;\n return wB - wA;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed, usually in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set/Get the maximum motor force, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Get the current motor torque given the inverse time step, usually in N-m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set/Get the spring frequency in hertz. Setting the frequency to zero disables\n * the spring.\n */\n setSpringFrequencyHz(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getSpringFrequencyHz(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set/Get the spring damping ratio\n */\n setSpringDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getSpringDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA); // Vec2\n\n // Point to line constraint\n {\n this.m_ay = Rot.mulVec2(qA, this.m_localYAxisA);\n this.m_sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ay);\n this.m_sBy = Vec2.crossVec2Vec2(rB, this.m_ay);\n\n this.m_mass = mA + mB + iA * this.m_sAy * this.m_sAy + iB * this.m_sBy\n * this.m_sBy;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n }\n\n // Spring constraint\n this.m_springMass = 0.0;\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n if (this.m_frequencyHz > 0.0) {\n this.m_ax = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_sAx = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ax);\n this.m_sBx = Vec2.crossVec2Vec2(rB, this.m_ax);\n\n const invMass = mA + mB + iA * this.m_sAx * this.m_sAx + iB * this.m_sBx\n * this.m_sBx; // float\n\n if (invMass > 0.0) {\n this.m_springMass = 1.0 / invMass;\n\n const C = Vec2.dot(d, this.m_ax); // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const damp = 2.0 * this.m_springMass * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = this.m_springMass * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (damp + h * k);\n if (this.m_gamma > 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n\n this.m_bias = C * h * k * this.m_gamma;\n\n this.m_springMass = invMass + this.m_gamma;\n if (this.m_springMass > 0.0) {\n this.m_springMass = 1.0 / this.m_springMass;\n }\n }\n } else {\n this.m_springImpulse = 0.0;\n }\n\n // Rotational motor\n if (this.m_enableMotor) {\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n } else {\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse *= step.dtRatio;\n this.m_springImpulse *= step.dtRatio;\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax);\n const LA = this.m_impulse * this.m_sAy + this.m_springImpulse * this.m_sAx + this.m_motorImpulse;\n const LB = this.m_impulse * this.m_sBy + this.m_springImpulse * this.m_sBx + this.m_motorImpulse;\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * LA;\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * LB;\n\n } else {\n this.m_impulse = 0.0;\n this.m_springImpulse = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Solve spring constraint\n {\n const Cdot = Vec2.dot(this.m_ax, vB) - Vec2.dot(this.m_ax, vA) + this.m_sBx\n * wB - this.m_sAx * wA; // float\n const impulse = -this.m_springMass\n * (Cdot + this.m_bias + this.m_gamma * this.m_springImpulse); // float\n this.m_springImpulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ax); // Vec2\n const LA = impulse * this.m_sAx; // float\n const LB = impulse * this.m_sBx; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n // Solve rotational motor constraint\n {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve point to line constraint\n {\n const Cdot = Vec2.dot(this.m_ay, vB) - Vec2.dot(this.m_ay, vA) + this.m_sBy\n * wB - this.m_sAy * wA; // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ay); // Vec2\n const LA = impulse * this.m_sAy; // float\n const LB = impulse * this.m_sBy; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const ay = Rot.mulVec2(qA, this.m_localYAxisA);\n\n const sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), ay); // float\n const sBy = Vec2.crossVec2Vec2(rB, ay); // float\n\n const C = Vec2.dot(d, ay); // float\n\n const k = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_sAy\n * this.m_sAy + this.m_invIB * this.m_sBy * this.m_sBy; // float\n\n let impulse; // float\n if (k != 0.0) {\n impulse = -C / k;\n } else {\n impulse = 0.0;\n }\n\n const P = Vec2.mulNumVec2(impulse, ay); // Vec2\n const LA = impulse * sAy; // float\n const LB = impulse * sBy; // float\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * LA;\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * LB;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) <= Settings.linearSlop;\n }\n\n}\n","// tslint:disable:typedef\nimport { World } from '../dynamics/World';\nimport { Body } from '../dynamics/Body';\nimport { Joint } from '../dynamics/Joint';\nimport { Fixture } from '../dynamics/Fixture';\nimport { Shape } from '../collision/Shape';\nimport { Vec2 } from '../common/Vec2';\nimport { Vec3 } from '../common/Vec3';\nimport { ChainShape } from \"../collision/shape/ChainShape\";\nimport { BoxShape } from \"../collision/shape/BoxShape\";\nimport { EdgeShape } from \"../collision/shape/EdgeShape\";\nimport { PolygonShape } from \"../collision/shape/PolygonShape\";\nimport { CircleShape } from \"../collision/shape/CircleShape\";\nimport { DistanceJoint } from \"../dynamics/joint/DistanceJoint\";\nimport { FrictionJoint } from \"../dynamics/joint/FrictionJoint\";\nimport { GearJoint } from \"../dynamics/joint/GearJoint\";\nimport { MotorJoint } from \"../dynamics/joint/MotorJoint\";\nimport { MouseJoint } from \"../dynamics/joint/MouseJoint\";\nimport { PrismaticJoint } from \"../dynamics/joint/PrismaticJoint\";\nimport { PulleyJoint } from \"../dynamics/joint/PulleyJoint\";\nimport { RevoluteJoint } from \"../dynamics/joint/RevoluteJoint\";\nimport { RopeJoint } from \"../dynamics/joint/RopeJoint\";\nimport { WeldJoint } from \"../dynamics/joint/WeldJoint\";\nimport { WheelJoint } from \"../dynamics/joint/WheelJoint\";\n\nlet SID = 0;\n\nexport function Serializer(opts?) {\n opts = opts || {};\n\n const rootClass = opts.rootClass || World;\n\n const preSerialize = opts.preSerialize || function(obj) { return obj; };\n const postSerialize = opts.postSerialize || function(data, obj) { return data; };\n\n const preDeserialize = opts.preDeserialize || function(data) { return data; };\n const postDeserialize = opts.postDeserialize || function(obj, data) { return obj; };\n\n // This is used to create ref objects during serialize\n const refTypes = {\n World,\n Body,\n Joint,\n Fixture,\n Shape,\n };\n\n // This is used by restore to deserialize objects and refs\n const restoreTypes = {\n Vec2,\n Vec3,\n ...refTypes\n };\n\n const CLASS_BY_TYPE_PROP = {\n [Body.STATIC]: Body,\n [Body.DYNAMIC]: Body,\n [Body.KINEMATIC]: Body,\n [ChainShape.TYPE]: ChainShape,\n [BoxShape.TYPE]: BoxShape,\n [EdgeShape.TYPE]: EdgeShape,\n [PolygonShape.TYPE]: PolygonShape,\n [CircleShape.TYPE]: CircleShape,\n [DistanceJoint.TYPE]: DistanceJoint,\n [FrictionJoint.TYPE]: FrictionJoint,\n [GearJoint.TYPE]: GearJoint,\n [MotorJoint.TYPE]: MotorJoint,\n [MouseJoint.TYPE]: MouseJoint,\n [PrismaticJoint.TYPE]: PrismaticJoint,\n [PulleyJoint.TYPE]: PulleyJoint,\n [RevoluteJoint.TYPE]: RevoluteJoint,\n [RopeJoint.TYPE]: RopeJoint,\n [WeldJoint.TYPE]: WeldJoint,\n [WheelJoint.TYPE]: WheelJoint,\n }\n\n this.toJson = function(root) {\n const json = [];\n\n const queue = [root];\n const refMap = {};\n\n function storeRef(value, typeName) {\n value.__sid = value.__sid || ++SID;\n if (!refMap[value.__sid]) {\n queue.push(value);\n const index = json.length + queue.length;\n const ref = {\n refIndex: index,\n refType: typeName\n };\n refMap[value.__sid] = ref;\n }\n return refMap[value.__sid];\n }\n\n function serialize(obj) {\n obj = preSerialize(obj);\n let data = obj._serialize();\n data = postSerialize(data, obj);\n return data;\n }\n\n function toJson(value, top?) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (typeof value._serialize === 'function') {\n if (value !== top) {\n // tslint:disable-next-line:no-for-in\n for (const typeName in refTypes) {\n if (value instanceof refTypes[typeName]) {\n return storeRef(value, typeName);\n }\n }\n }\n value = serialize(value);\n }\n if (Array.isArray(value)) {\n const newValue = [];\n for (let key = 0; key < value.length; key++) {\n newValue[key] = toJson(value[key]);\n }\n value = newValue;\n\n } else {\n const newValue = {};\n // tslint:disable-next-line:no-for-in\n for (const key in value) {\n if (value.hasOwnProperty(key)) {\n newValue[key] = toJson(value[key]);\n }\n }\n value = newValue;\n }\n return value;\n }\n\n while (queue.length) {\n const obj = queue.shift();\n const str = toJson(obj, obj);\n json.push(str);\n }\n\n return json;\n };\n\n this.fromJson = function(json: object) {\n const refMap = {};\n\n function findDeserilizer(data, cls) {\n if (!cls || !cls._deserialize) {\n cls = CLASS_BY_TYPE_PROP[data.type]\n }\n return cls && cls._deserialize;\n }\n\n /**\n * Deserialize a data object.\n */\n function deserialize(cls, data, ctx) {\n const deserializer = findDeserilizer(data, cls);\n if (!deserializer) {\n return;\n }\n data = preDeserialize(data);\n let obj = deserializer(data, ctx, restoreRef);\n obj = postDeserialize(obj, data);\n return obj;\n }\n\n /**\n * Restore a ref object or deserialize a data object.\n *\n * This is passed as callback to class deserializers.\n */\n function restoreRef(cls, ref, ctx) {\n if (!ref.refIndex) {\n return cls && cls._deserialize && deserialize(cls, ref, ctx);\n }\n cls = restoreTypes[ref.refType] || cls;\n const index = ref.refIndex;\n if (!refMap[index]) {\n const data = json[index];\n const obj = deserialize(cls, data, ctx);\n refMap[index] = obj;\n }\n return refMap[index];\n }\n\n const root = rootClass._deserialize(json[0], null, restoreRef);\n\n return root;\n };\n}\n\nconst serializer = new Serializer();\n\nSerializer.toJson = serializer.toJson;\nSerializer.fromJson = serializer.fromJson;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { CircleShape } from './CircleShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact);\n\nfunction CircleCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == CircleShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n CollideCircles(manifold, fixtureA.getShape() as CircleShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport const CollideCircles = function (manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n const pA = Transform.mulVec2(xfA, circleA.m_p);\n const pB = Transform.mulVec2(xfB, circleB.m_p);\n\n const distSqr = Vec2.distanceSquared(pB, pA);\n const rA = circleA.m_radius;\n const rB = circleB.m_radius;\n const radius = rA + rB;\n if (distSqr > radius * radius) {\n return;\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localPoint.setVec2(circleA.m_p);\n manifold.localNormal.setZero();\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { EdgeShape } from './EdgeShape';\nimport { ChainShape } from './ChainShape';\nimport { CircleShape } from './CircleShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, CircleShape.TYPE, EdgeCircleContact);\nContact.addType(ChainShape.TYPE, CircleShape.TYPE, ChainCircleContact);\n\nfunction EdgeCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == EdgeShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const shapeA = fixtureA.getShape() as EdgeShape;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\nfunction ChainCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == ChainShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const chain = fixtureA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n const shapeA = edge;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\n// Compute contact points for edge versus circle.\n// This accounts for edge connectivity.\nexport const CollideEdgeCircle = function (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle in frame of edge\n const Q = Transform.mulTVec2(xfA, Transform.mulVec2(xfB, circleB.m_p));\n\n const A = edgeA.m_vertex1;\n const B = edgeA.m_vertex2;\n const e = Vec2.sub(B, A);\n\n // Barycentric coordinates\n const u = Vec2.dot(e, Vec2.sub(B, Q));\n const v = Vec2.dot(e, Vec2.sub(Q, A));\n\n const radius = edgeA.m_radius + circleB.m_radius;\n\n // Region A\n if (v <= 0.0) {\n const P = Vec2.clone(A);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to A?\n if (edgeA.m_hasVertex0) {\n const A1 = edgeA.m_vertex0;\n const B1 = A;\n const e1 = Vec2.sub(B1, A1);\n const u1 = Vec2.dot(e1, Vec2.sub(B1, Q));\n\n // Is the circle in Region AB of the previous edge?\n if (u1 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region B\n if (u <= 0.0) {\n const P = Vec2.clone(B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to B?\n if (edgeA.m_hasVertex3) {\n const B2 = edgeA.m_vertex3;\n const A2 = B;\n const e2 = Vec2.sub(B2, A2);\n const v2 = Vec2.dot(e2, Vec2.sub(Q, A2));\n\n // Is the circle in Region AB of the next edge?\n if (v2 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 1;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region AB\n const den = Vec2.dot(e, e);\n _ASSERT && console.assert(den > 0.0);\n const P = Vec2.combine(u / den, A, v / den, B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n const n = Vec2.neo(-e.y, e.x);\n if (Vec2.dot(n, Vec2.sub(Q, A)) < 0.0) {\n n.setNum(-n.x, -n.y);\n }\n n.normalize();\n\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal = n;\n manifold.localPoint.setVec2(A);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_face;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2 } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Manifold, clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport { Contact } from '../../dynamics/Contact';\nimport { PolygonShape } from './PolygonShape';\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, PolygonShape.TYPE, PolygonContact);\n\nfunction PolygonContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == PolygonShape.TYPE);\n CollidePolygons(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as PolygonShape, xfB);\n}\n\ninterface MaxSeparation {\n maxSeparation: number;\n bestIndex: number;\n}\n\n/**\n * Find the max separation between poly1 and poly2 using edge normals from\n * poly1.\n */\nfunction findMaxSeparation(poly1: PolygonShape, xf1: Transform, poly2: PolygonShape, xf2: Transform, output: MaxSeparation): void {\n const count1 = poly1.m_count;\n const count2 = poly2.m_count;\n const n1s = poly1.m_normals;\n const v1s = poly1.m_vertices;\n const v2s = poly2.m_vertices;\n const xf = Transform.mulTXf(xf2, xf1);\n\n let bestIndex = 0;\n let maxSeparation = -Infinity;\n for (let i = 0; i < count1; ++i) {\n // Get poly1 normal in frame2.\n const n = Rot.mulVec2(xf.q, n1s[i]);\n const v1 = Transform.mulVec2(xf, v1s[i]);\n\n // Find deepest point for normal i.\n let si = Infinity;\n for (let j = 0; j < count2; ++j) {\n const sij = Vec2.dot(n, v2s[j]) - Vec2.dot(n, v1);\n if (sij < si) {\n si = sij;\n }\n }\n\n if (si > maxSeparation) {\n maxSeparation = si;\n bestIndex = i;\n }\n }\n\n // used to keep last FindMaxSeparation call values\n output.maxSeparation = maxSeparation;\n output.bestIndex = bestIndex;\n}\n\nfunction findIncidentEdge(c: ClipVertex[], poly1: PolygonShape, xf1: Transform, edge1: number, poly2: PolygonShape, xf2: Transform): void {\n const normals1 = poly1.m_normals;\n\n const count2 = poly2.m_count;\n const vertices2 = poly2.m_vertices;\n const normals2 = poly2.m_normals;\n\n _ASSERT && console.assert(0 <= edge1 && edge1 < poly1.m_count);\n\n // Get the normal of the reference edge in poly2's frame.\n const normal1 = Rot.mulTVec2(xf2.q, Rot.mulVec2(xf1.q, normals1[edge1]));\n\n // Find the incident edge on poly2.\n let index = 0;\n let minDot = Infinity;\n for (let i = 0; i < count2; ++i) {\n const dot = Vec2.dot(normal1, normals2[i]);\n if (dot < minDot) {\n minDot = dot;\n index = i;\n }\n }\n\n // Build the clip vertices for the incident edge.\n const i1 = index;\n const i2 = i1 + 1 < count2 ? i1 + 1 : 0;\n\n c[0].v = Transform.mulVec2(xf2, vertices2[i1]);\n c[0].id.cf.indexA = edge1;\n c[0].id.cf.indexB = i1;\n c[0].id.cf.typeA = ContactFeatureType.e_face;\n c[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n c[1].v = Transform.mulVec2(xf2, vertices2[i2]);\n c[1].id.cf.indexA = edge1;\n c[1].id.cf.indexB = i2;\n c[1].id.cf.typeA = ContactFeatureType.e_face;\n c[1].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n\nconst maxSeparation = {\n maxSeparation: 0,\n bestIndex: 0,\n};\n\n/**\n *\n * Find edge normal of max separation on A - return if separating axis is found
\n * Find edge normal of max separation on B - return if separation axis is found
\n * Choose reference edge as min(minA, minB)
\n * Find incident edge
\n * Clip\n *\n * The normal points from 1 to 2\n */\nexport const CollidePolygons = function (manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform): void {\n manifold.pointCount = 0;\n const totalRadius = polyA.m_radius + polyB.m_radius;\n\n findMaxSeparation(polyA, xfA, polyB, xfB, maxSeparation);\n const edgeA = maxSeparation.bestIndex;\n const separationA = maxSeparation.maxSeparation;\n if (separationA > totalRadius)\n return;\n\n findMaxSeparation(polyB, xfB, polyA, xfA, maxSeparation);\n const edgeB = maxSeparation.bestIndex;\n const separationB = maxSeparation.maxSeparation;\n if (separationB > totalRadius)\n return;\n\n let poly1; // reference polygon\n let poly2; // incident polygon\n let xf1;\n let xf2;\n let edge1; // reference edge\n let flip;\n const k_tol = 0.1 * Settings.linearSlop;\n\n if (separationB > separationA + k_tol) {\n poly1 = polyB;\n poly2 = polyA;\n xf1 = xfB;\n xf2 = xfA;\n edge1 = edgeB;\n manifold.type = ManifoldType.e_faceB;\n flip = 1;\n } else {\n poly1 = polyA;\n poly2 = polyB;\n xf1 = xfA;\n xf2 = xfB;\n edge1 = edgeA;\n manifold.type = ManifoldType.e_faceA;\n flip = 0;\n }\n\n const incidentEdge = [ new ClipVertex(), new ClipVertex() ];\n findIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);\n\n const count1 = poly1.m_count;\n const vertices1 = poly1.m_vertices;\n\n const iv1 = edge1;\n const iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0;\n\n let v11 = vertices1[iv1];\n let v12 = vertices1[iv2];\n\n const localTangent = Vec2.sub(v12, v11);\n localTangent.normalize();\n\n const localNormal = Vec2.crossVec2Num(localTangent, 1.0);\n const planePoint = Vec2.combine(0.5, v11, 0.5, v12);\n\n const tangent = Rot.mulVec2(xf1.q, localTangent);\n const normal = Vec2.crossVec2Num(tangent, 1.0);\n\n v11 = Transform.mulVec2(xf1, v11);\n v12 = Transform.mulVec2(xf1, v12);\n\n // Face offset.\n const frontOffset = Vec2.dot(normal, v11);\n\n // Side offsets, extended by polytope skin thickness.\n const sideOffset1 = -Vec2.dot(tangent, v11) + totalRadius;\n const sideOffset2 = Vec2.dot(tangent, v12) + totalRadius;\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, incidentEdge, Vec2.neg(tangent), sideOffset1, iv1);\n\n if (np < 2) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2);\n\n if (np < 2) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n manifold.localNormal = localNormal;\n manifold.localPoint = planePoint;\n\n let pointCount = 0;\n for (let i = 0; i < clipPoints2.length/* maxManifoldPoints */; ++i) {\n const separation = Vec2.dot(normal, clipPoints2[i].v) - frontOffset;\n\n if (separation <= totalRadius) {\n const cp = manifold.points[pointCount];\n cp.localPoint.setVec2(Transform.mulTVec2(xf2, clipPoints2[i].v));\n cp.id = clipPoints2[i].id;\n if (flip) {\n // Swap features\n const cf = cp.id.cf;\n const indexA = cf.indexA;\n const indexB = cf.indexB;\n const typeA = cf.typeA;\n const typeB = cf.typeB;\n cf.indexA = indexB;\n cf.indexB = indexA;\n cf.typeA = typeB;\n cf.typeB = typeA;\n }\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { CircleShape } from './CircleShape';\nimport { PolygonShape } from './PolygonShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, CircleShape.TYPE, PolygonCircleContact);\n\nfunction PolygonCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n CollidePolygonCircle(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport const CollidePolygonCircle = function (manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle position in the frame of the polygon.\n const c = Transform.mulVec2(xfB, circleB.m_p);\n const cLocal = Transform.mulTVec2(xfA, c);\n\n // Find the min separating edge.\n let normalIndex = 0;\n let separation = -Infinity;\n const radius = polygonA.m_radius + circleB.m_radius;\n const vertexCount = polygonA.m_count;\n const vertices = polygonA.m_vertices;\n const normals = polygonA.m_normals;\n\n for (let i = 0; i < vertexCount; ++i) {\n const s = Vec2.dot(normals[i], Vec2.sub(cLocal, vertices[i]));\n\n if (s > radius) {\n // Early out.\n return;\n }\n\n if (s > separation) {\n separation = s;\n normalIndex = i;\n }\n }\n\n // Vertices that subtend the incident face.\n const vertIndex1 = normalIndex;\n const vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0;\n const v1 = vertices[vertIndex1];\n const v2 = vertices[vertIndex2];\n\n // If the center is inside the polygon ...\n if (separation < Math.EPSILON) {\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[normalIndex]);\n manifold.localPoint.setCombine(0.5, v1, 0.5, v2);\n manifold.points[0].localPoint = circleB.m_p;\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Compute barycentric coordinates\n const u1 = Vec2.dot(Vec2.sub(cLocal, v1), Vec2.sub(v2, v1));\n const u2 = Vec2.dot(Vec2.sub(cLocal, v2), Vec2.sub(v1, v2));\n if (u1 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v1) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v1);\n manifold.localNormal.normalize();\n manifold.localPoint = v1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else if (u2 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v2) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v2);\n manifold.localNormal.normalize();\n manifold.localPoint.setVec2(v2);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else {\n const faceCenter = Vec2.mid(v1, v2);\n const separation = Vec2.dot(cLocal, normals[vertIndex1]) - Vec2.dot(faceCenter, normals[vertIndex1]);\n if (separation > radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[vertIndex1]);\n manifold.localPoint.setVec2(faceCenter);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Settings } from '../../Settings';\nimport { Contact } from '../../dynamics/Contact';\nimport { Manifold, clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport { EdgeShape } from './EdgeShape';\nimport { ChainShape } from './ChainShape';\nimport { PolygonShape } from './PolygonShape';\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, PolygonShape.TYPE, EdgePolygonContact);\nContact.addType(ChainShape.TYPE, PolygonShape.TYPE, ChainPolygonContact);\n\nfunction EdgePolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fA.getType() == EdgeShape.TYPE);\n _ASSERT && console.assert(fB.getType() == PolygonShape.TYPE);\n\n CollideEdgePolygon(manifold, fA.getShape() as EdgeShape, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nfunction ChainPolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fA.getType() == ChainShape.TYPE);\n _ASSERT && console.assert(fB.getType() == PolygonShape.TYPE);\n\n const chain = fA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n CollideEdgePolygon(manifold, edge, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nenum EPAxisType {\n e_unknown = -1,\n e_edgeA = 1,\n e_edgeB = 2,\n}\n\n// unused?\nenum VertexType {\n e_isolated = 0,\n e_concave = 1,\n e_convex = 2,\n}\n\n/**\n * This structure is used to keep track of the best separating axis.\n */\nclass EPAxis {\n type: EPAxisType;\n index: number;\n separation: number;\n}\n\n/**\n * This holds polygon B expressed in frame A.\n */\nclass TempPolygon {\n vertices: Vec2[] = []; // [Settings.maxPolygonVertices]\n normals: Vec2[] = []; // [Settings.maxPolygonVertices];\n count: number = 0;\n}\n\n/**\n * Reference face used for clipping\n */\nclass ReferenceFace {\n i1: number;\n i2: number;\n v1: Vec2;\n v2: Vec2;\n normal: Vec2 = Vec2.zero();\n sideNormal1: Vec2 = Vec2.zero();\n sideOffset1: number;\n sideNormal2: Vec2 = Vec2.zero();\n sideOffset2: number;\n}\n\n// reused\nconst edgeAxis = new EPAxis();\nconst polygonAxis = new EPAxis();\nconst polygonBA = new TempPolygon();\nconst rf = new ReferenceFace();\n\n/**\n * This function collides and edge and a polygon, taking into account edge\n * adjacency.\n */\nexport const CollideEdgePolygon = function (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform): void {\n // Algorithm:\n // 1. Classify v1 and v2\n // 2. Classify polygon centroid as front or back\n // 3. Flip normal if necessary\n // 4. Initialize normal range to [-pi, pi] about face normal\n // 5. Adjust normal range according to adjacent edges\n // 6. Visit each separating axes, only accept axes within the range\n // 7. Return if _any_ axis indicates separation\n // 8. Clip\n\n // let m_type1: VertexType;\n // let m_type2: VertexType;\n\n const xf = Transform.mulTXf(xfA, xfB);\n\n const centroidB = Transform.mulVec2(xf, polygonB.m_centroid);\n\n const v0 = edgeA.m_vertex0;\n const v1 = edgeA.m_vertex1;\n const v2 = edgeA.m_vertex2;\n const v3 = edgeA.m_vertex3;\n\n const hasVertex0 = edgeA.m_hasVertex0;\n const hasVertex3 = edgeA.m_hasVertex3;\n\n const edge1 = Vec2.sub(v2, v1);\n edge1.normalize();\n const normal1 = Vec2.neo(edge1.y, -edge1.x);\n const offset1 = Vec2.dot(normal1, Vec2.sub(centroidB, v1));\n let offset0 = 0.0;\n let offset2 = 0.0;\n let convex1 = false;\n let convex2 = false;\n\n let normal0;\n let normal2;\n\n // Is there a preceding edge?\n if (hasVertex0) {\n const edge0 = Vec2.sub(v1, v0);\n edge0.normalize();\n normal0 = Vec2.neo(edge0.y, -edge0.x);\n convex1 = Vec2.crossVec2Vec2(edge0, edge1) >= 0.0;\n offset0 = Vec2.dot(normal0, centroidB) - Vec2.dot(normal0, v0);\n }\n\n // Is there a following edge?\n if (hasVertex3) {\n const edge2 = Vec2.sub(v3, v2);\n edge2.normalize();\n normal2 = Vec2.neo(edge2.y, -edge2.x);\n convex2 = Vec2.crossVec2Vec2(edge1, edge2) > 0.0;\n offset2 = Vec2.dot(normal2, centroidB) - Vec2.dot(normal2, v2);\n }\n\n let front;\n const normal = Vec2.zero();\n const lowerLimit = Vec2.zero();\n const upperLimit = Vec2.zero();\n\n // Determine front or back collision. Determine collision normal limits.\n if (hasVertex0 && hasVertex3) {\n if (convex1 && convex2) {\n front = offset0 >= 0.0 || offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex1) {\n front = offset0 >= 0.0 || (offset1 >= 0.0 && offset2 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex2) {\n front = offset2 >= 0.0 || (offset0 >= 0.0 && offset1 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal0);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex0) {\n if (convex1) {\n front = offset0 >= 0.0 || offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex3) {\n if (convex2) {\n front = offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n }\n } else {\n front = offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setVec2(normal1);\n }\n }\n } else {\n front = offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n }\n }\n\n // Get polygonB in frameA\n polygonBA.count = polygonB.m_count;\n for (let i = 0; i < polygonB.m_count; ++i) {\n polygonBA.vertices[i] = Transform.mulVec2(xf, polygonB.m_vertices[i]);\n polygonBA.normals[i] = Rot.mulVec2(xf.q, polygonB.m_normals[i]);\n }\n\n const radius = 2.0 * Settings.polygonRadius;\n\n manifold.pointCount = 0;\n\n { // ComputeEdgeSeparation\n edgeAxis.type = EPAxisType.e_edgeA;\n edgeAxis.index = front ? 0 : 1;\n edgeAxis.separation = Infinity;\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const s = Vec2.dot(normal, Vec2.sub(polygonBA.vertices[i], v1));\n if (s < edgeAxis.separation) {\n edgeAxis.separation = s;\n }\n }\n }\n\n // If no valid normal can be found than this edge should not collide.\n // @ts-ignore\n if (edgeAxis.type == EPAxisType.e_unknown) {\n return;\n }\n\n if (edgeAxis.separation > radius) {\n return;\n }\n\n { // ComputePolygonSeparation\n polygonAxis.type = EPAxisType.e_unknown;\n polygonAxis.index = -1;\n polygonAxis.separation = -Infinity;\n\n const perp = Vec2.neo(-normal.y, normal.x);\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const n = Vec2.neg(polygonBA.normals[i]);\n\n const s1 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v1));\n const s2 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v2));\n const s = Math.min(s1, s2);\n\n if (s > radius) {\n // No collision\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n break;\n }\n\n // Adjacency\n if (Vec2.dot(n, perp) >= 0.0) {\n if (Vec2.dot(Vec2.sub(n, upperLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n } else {\n if (Vec2.dot(Vec2.sub(n, lowerLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n }\n\n if (s > polygonAxis.separation) {\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n }\n }\n }\n\n if (polygonAxis.type != EPAxisType.e_unknown && polygonAxis.separation > radius) {\n return;\n }\n\n // Use hysteresis for jitter reduction.\n const k_relativeTol = 0.98;\n const k_absoluteTol = 0.001;\n\n let primaryAxis;\n if (polygonAxis.type == EPAxisType.e_unknown) {\n primaryAxis = edgeAxis;\n } else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) {\n primaryAxis = polygonAxis;\n } else {\n primaryAxis = edgeAxis;\n }\n\n const ie = [ new ClipVertex(), new ClipVertex() ];\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.type = ManifoldType.e_faceA;\n\n // Search for the polygon normal that is most anti-parallel to the edge\n // normal.\n let bestIndex = 0;\n let bestValue = Vec2.dot(normal, polygonBA.normals[0]);\n for (let i = 1; i < polygonBA.count; ++i) {\n const value = Vec2.dot(normal, polygonBA.normals[i]);\n if (value < bestValue) {\n bestValue = value;\n bestIndex = i;\n }\n }\n\n const i1 = bestIndex;\n const i2 = i1 + 1 < polygonBA.count ? i1 + 1 : 0;\n\n ie[0].v = polygonBA.vertices[i1];\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = i1;\n ie[0].id.cf.typeA = ContactFeatureType.e_face;\n ie[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n ie[1].v = polygonBA.vertices[i2];\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = i2;\n ie[1].id.cf.typeA = ContactFeatureType.e_face;\n ie[1].id.cf.typeB = ContactFeatureType.e_vertex;\n\n if (front) {\n rf.i1 = 0;\n rf.i2 = 1;\n rf.v1 = v1;\n rf.v2 = v2;\n rf.normal.setVec2(normal1);\n } else {\n rf.i1 = 1;\n rf.i2 = 0;\n rf.v1 = v2;\n rf.v2 = v1;\n rf.normal.setMul(-1, normal1);\n }\n } else {\n manifold.type = ManifoldType.e_faceB;\n\n ie[0].v = v1;\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = primaryAxis.index;\n ie[0].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[0].id.cf.typeB = ContactFeatureType.e_face;\n\n ie[1].v = v2;\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = primaryAxis.index;\n ie[1].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[1].id.cf.typeB = ContactFeatureType.e_face;\n\n rf.i1 = primaryAxis.index;\n rf.i2 = rf.i1 + 1 < polygonBA.count ? rf.i1 + 1 : 0;\n rf.v1 = polygonBA.vertices[rf.i1];\n rf.v2 = polygonBA.vertices[rf.i2];\n rf.normal.setVec2(polygonBA.normals[rf.i1]);\n }\n\n rf.sideNormal1.setNum(rf.normal.y, -rf.normal.x);\n rf.sideNormal2.setMul(-1, rf.sideNormal1);\n rf.sideOffset1 = Vec2.dot(rf.sideNormal1, rf.v1);\n rf.sideOffset2 = Vec2.dot(rf.sideNormal2, rf.v2);\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.localNormal = Vec2.clone(rf.normal);\n manifold.localPoint = Vec2.clone(rf.v1);\n } else {\n manifold.localNormal = Vec2.clone(polygonB.m_normals[rf.i1]);\n manifold.localPoint = Vec2.clone(polygonB.m_vertices[rf.i1]);\n }\n\n let pointCount = 0;\n for (let i = 0; i < Settings.maxManifoldPoints; ++i) {\n const separation = Vec2.dot(rf.normal, Vec2.sub(clipPoints2[i].v, rf.v1));\n\n if (separation <= radius) {\n const cp = manifold.points[pointCount]; // ManifoldPoint\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n cp.localPoint = Transform.mulTVec2(xf, clipPoints2[i].v);\n cp.id = clipPoints2[i].id;\n } else {\n cp.localPoint = clipPoints2[i].v;\n cp.id.cf.typeA = clipPoints2[i].id.cf.typeB;\n cp.id.cf.typeB = clipPoints2[i].id.cf.typeA;\n cp.id.cf.indexA = clipPoints2[i].id.cf.indexB;\n cp.id.cf.indexB = clipPoints2[i].id.cf.indexA;\n }\n\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","export * from './serializer/index';\n\nexport * from './common/Math';\n\nexport * from './common/Vec2';\nexport * from './common/Vec3';\nexport * from './common/Mat22';\nexport * from './common/Mat33';\nexport * from './common/Transform';\nexport * from './common/Rot';\n\nexport * from './collision/AABB';\n\nexport * from './collision/Shape';\nexport * from './dynamics/Fixture';\nexport * from './dynamics/Body';\nexport * from './dynamics/Contact';\nexport * from './dynamics/Joint';\nexport * from './dynamics/World';\n\nexport * from './collision/shape/CircleShape';\nexport * from './collision/shape/EdgeShape';\nexport * from './collision/shape/PolygonShape';\nexport * from './collision/shape/ChainShape';\nexport * from './collision/shape/BoxShape';\n\nexport * from './collision/shape/CollideCircle';\nexport * from './collision/shape/CollideEdgeCircle';\nexport * from './collision/shape/CollidePolygon';\nexport * from './collision/shape/CollideCirclePolygon';\nexport * from './collision/shape/CollideEdgePolygon';\n\nexport * from './dynamics/joint/DistanceJoint';\nexport * from './dynamics/joint/FrictionJoint';\nexport * from './dynamics/joint/GearJoint';\nexport * from './dynamics/joint/MotorJoint';\nexport * from './dynamics/joint/MouseJoint';\nexport * from './dynamics/joint/PrismaticJoint';\nexport * from './dynamics/joint/PulleyJoint';\nexport * from './dynamics/joint/RevoluteJoint';\nexport * from './dynamics/joint/RopeJoint';\nexport * from './dynamics/joint/WeldJoint';\nexport * from './dynamics/joint/WheelJoint';\n\nexport * from './Settings';\n\nexport * from './common/Sweep';\nexport * from './collision/Manifold';\nexport * from './collision/Distance';\nexport * from './collision/TimeOfImpact';\nexport * from './collision/DynamicTree';\nexport * from './util/stats';\n\nimport { CollidePolygons } from './collision/shape/CollidePolygon';\nimport { Settings } from './Settings';\nimport { Sweep } from './common/Sweep';\nimport { DynamicTree } from './collision/DynamicTree';\nimport { Manifold } from './collision/Manifold';\nimport { Distance } from './collision/Distance';\nimport { TimeOfImpact } from './collision/TimeOfImpact';\nimport { stats } from './util/stats';\n\n/** @deprecated Merged with main namespace */\nexport const internal = {\n CollidePolygons,\n Settings,\n Sweep,\n Manifold,\n Distance,\n TimeOfImpact,\n DynamicTree,\n stats\n};\n","import Stage from 'stage-js';\n\nexport * from '../src/index';\n\nimport {\n AABB,\n Body,\n Fixture,\n Joint,\n MouseJoint,\n Vec2,\n World\n} from '../src/index';\n\nexport interface ActiveKeys {\n 0?: boolean;\n 1?: boolean;\n 2?: boolean;\n 3?: boolean;\n 4?: boolean;\n 5?: boolean;\n 6?: boolean;\n 7?: boolean;\n 8?: boolean;\n 9?: boolean;\n A?: boolean;\n B?: boolean;\n C?: boolean;\n D?: boolean;\n E?: boolean;\n F?: boolean;\n G?: boolean;\n H?: boolean;\n I?: boolean;\n J?: boolean;\n K?: boolean;\n L?: boolean;\n M?: boolean;\n N?: boolean;\n O?: boolean;\n P?: boolean;\n Q?: boolean;\n R?: boolean;\n S?: boolean;\n T?: boolean;\n U?: boolean;\n V?: boolean;\n W?: boolean;\n X?: boolean;\n Y?: boolean;\n Z?: boolean;\n right?: boolean;\n left?: boolean;\n up?: boolean;\n down?: boolean;\n fire?: boolean;\n}\n\nexport interface Testbed {\n /** @private @internal */ _pause: any;\n /** @private @internal */ _resume: any;\n /** @private @internal */ _status: any;\n /** @private @internal */ _info: any;\n\n /** @private @internal */ resume: any;\n /** @private @internal */ pause: any;\n /** @private @internal */ isPaused: any;\n /** @private @internal */ togglePause: any;\n /** @private @internal */ canvas: any;\n /** @private @internal */ focus: () => void;\n\n // camera position\n /** World viewbox width. */\n width: number;\n /** World viewbox height. */\n height: number;\n /** World viewbox center vertical offset. */\n x: number;\n /** World viewbox center horizontal offset. */\n y: number;\n\n scaleY: number;\n ratio: number;\n\n /** World simulation step frequency */\n hz: number;\n /** World simulation speed, default is 1 */\n speed: number;\n\n activeKeys: ActiveKeys;\n background: string;\n\n mouseForce?: number;\n\n status(name: string, value: any): void;\n status(value: object | string): void;\n info(text: string): void;\n\n drawPoint(p: {x: number, y: number}, r: any, color: string): void;\n drawCircle(p: {x: number, y: number}, r: number, color: string): void;\n drawSegment(a: {x: number, y: number}, b: {x: number, y: number}, color: string): void;\n drawPolygon(points: Array<{x: number, y: number}>, color: string): void;\n drawAABB(aabb: AABB, color: string): void;\n color(r: number, g: number, b: number): string;\n\n // callbacks\n step?: (dt: number, t: number) => void;\n keydown?: (keyCode: number, label: string) => void;\n keyup?: (keyCode: number, label: string) => void;\n\n findOne: (query: string) => Body | Joint | Fixture | null;\n findAll: (query: string) => Body[] | Joint[] | Fixture[];\n}\n\nexport function testbed(opts: object, callback: (testbed: Testbed) => World);\nexport function testbed(callback: (testbed: Testbed) => World);\nexport function testbed(opts, callback?) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = null;\n }\n\n (function() {\n const stage = Stage.mount();\n const canvas = stage.dom;\n stage.on(Stage.Mouse.START, function() {\n window.focus();\n // @ts-ignore\n document.activeElement && document.activeElement.blur();\n canvas.focus();\n });\n\n (stage as any).MAX_ELAPSE = 1000 / 30;\n\n // @ts-ignore\n const testbed: Testbed = {};\n testbed.canvas = canvas;\n\n let paused = false;\n stage.on('resume', function() {\n paused = false;\n testbed._resume && testbed._resume();\n });\n stage.on('pause', function() {\n paused = true;\n testbed._pause && testbed._pause();\n });\n testbed.isPaused = function() {\n return paused;\n };\n testbed.togglePause = function() {\n paused ? testbed.resume() : testbed.pause();\n };\n testbed.pause = function() {\n // @ts-ignore\n stage.pause();\n };\n testbed.resume = function() {\n // @ts-ignore\n stage.resume();\n testbed.focus();\n };\n testbed.focus = function() {\n // @ts-ignore\n document.activeElement && document.activeElement.blur();\n canvas.focus();\n };\n\n testbed.width = 80;\n testbed.height = 60;\n testbed.x = 0;\n testbed.y = -10;\n testbed.scaleY = -1;\n testbed.ratio = 16;\n testbed.hz = 60;\n testbed.speed = 1;\n testbed.activeKeys = {};\n testbed.background = '#222222';\n\n testbed.findOne = function() {\n // todo: implement\n return null;\n };\n\n testbed.findAll = function() {\n // todo: implement\n return [];\n };\n\n let statusText = '';\n const statusMap = {};\n\n function statusSet(name, value) {\n if (typeof value !== 'function' && typeof value !== 'object') {\n statusMap[name] = value;\n }\n }\n\n function statusMerge(obj) {\n // tslint:disable-next-line:no-for-in\n for (const key in obj) {\n statusSet(key, obj[key]);\n }\n }\n\n testbed.status = function(a, b?) {\n if (typeof b !== 'undefined') {\n statusSet(a, b);\n } else if (a && typeof a === 'object') {\n statusMerge(a);\n } else if (typeof a === 'string') {\n statusText = a;\n }\n\n testbed._status && testbed._status(statusText, statusMap);\n };\n\n testbed.info = function(text) {\n testbed._info && testbed._info(text);\n };\n\n let lastDrawHash = \"\";\n let drawHash = \"\";\n\n (function() {\n const drawingTexture = new Stage.Texture();\n stage.append(Stage.image(drawingTexture));\n\n const buffer = [];\n stage.tick(function() {\n buffer.length = 0;\n }, true);\n\n drawingTexture.draw = function(ctx) {\n ctx.save();\n ctx.transform(1, 0, 0, testbed.scaleY, -testbed.x, -testbed.y);\n ctx.lineWidth = 2 / testbed.ratio;\n ctx.lineCap = 'round';\n for (let drawing = buffer.shift(); drawing; drawing = buffer.shift()) {\n drawing(ctx, testbed.ratio);\n }\n ctx.restore();\n };\n\n testbed.drawPoint = function(p, r, color) {\n buffer.push(function(ctx, ratio) {\n ctx.beginPath();\n ctx.arc(p.x, p.y, 5 / ratio, 0, 2 * Math.PI);\n ctx.strokeStyle = color;\n ctx.stroke();\n });\n drawHash += \"point\" + p.x + ',' + p.y + ',' + r + ',' + color;\n };\n\n testbed.drawCircle = function(p, r, color) {\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.arc(p.x, p.y, r, 0, 2 * Math.PI);\n ctx.strokeStyle = color;\n ctx.stroke();\n });\n drawHash += \"circle\" + p.x + ',' + p.y + ',' + r + ',' + color;\n };\n\n testbed.drawSegment = function(a, b, color) {\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(b.x, b.y);\n ctx.strokeStyle = color;\n ctx.stroke();\n });\n drawHash += \"segment\" + a.x + ',' + a.y + ',' + b.x + ',' + b.y + ',' + color;\n };\n\n testbed.drawPolygon = function(points, color) {\n if (!points || !points.length) {\n return;\n }\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y);\n }\n ctx.strokeStyle = color;\n ctx.closePath();\n ctx.stroke();\n });\n drawHash += \"segment\";\n for (let i = 1; i < points.length; i++) {\n drawHash += points[i].x + ',' + points[i].y + ',';\n }\n drawHash += color;\n };\n\n testbed.drawAABB = function(aabb, color) {\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.moveTo(aabb.lowerBound.x, aabb.lowerBound.y);\n ctx.lineTo(aabb.upperBound.x, aabb.lowerBound.y);\n ctx.lineTo(aabb.upperBound.x, aabb.upperBound.y);\n ctx.lineTo(aabb.lowerBound.x, aabb.upperBound.y);\n ctx.strokeStyle = color;\n ctx.closePath();\n ctx.stroke();\n });\n drawHash += \"aabb\";\n drawHash += aabb.lowerBound.x + ',' + aabb.lowerBound.y + ',';\n drawHash += aabb.upperBound.x + ',' + aabb.upperBound.y + ',';\n drawHash += color;\n };\n\n testbed.color = function(r, g, b) {\n r = r * 256 | 0;\n g = g * 256 | 0;\n b = b * 256 | 0;\n return 'rgb(' + r + ', ' + g + ', ' + b + ')';\n };\n\n })();\n\n const world = callback(testbed);\n\n const viewer = new Viewer(world, testbed);\n\n let lastX = 0;\n let lastY = 0;\n stage.tick(function(dt, t) {\n // update camera position\n if (lastX !== testbed.x || lastY !== testbed.y) {\n viewer.offset(-testbed.x, -testbed.y);\n lastX = testbed.x;\n lastY = testbed.y;\n }\n });\n\n viewer.tick(function(dt, t) {\n // call testbed step, if provided\n if (typeof testbed.step === 'function') {\n testbed.step(dt, t);\n }\n\n if (targetBody) {\n testbed.drawSegment(targetBody.getPosition(), mouseMove, 'rgba(255,255,255,0.2)');\n }\n\n if (lastDrawHash !== drawHash) {\n lastDrawHash = drawHash;\n stage.touch();\n }\n drawHash = \"\";\n\n return true;\n });\n\n // stage.empty();\n stage.background(testbed.background);\n stage.viewbox(testbed.width, testbed.height);\n stage.pin('alignX', -0.5);\n stage.pin('alignY', -0.5);\n stage.prepend(viewer);\n\n function findBody(point) {\n let body;\n const aabb = new AABB(point, point);\n world.queryAABB(aabb, function(fixture) {\n if (body) {\n return;\n }\n if (!fixture.getBody().isDynamic() || !fixture.testPoint(point)) {\n return;\n }\n body = fixture.getBody();\n return true;\n });\n return body;\n }\n\n const mouseGround = world.createBody();\n let mouseJoint;\n\n let targetBody;\n const mouseMove = {x: 0, y: 0};\n\n viewer.attr('spy', true).on(Stage.Mouse.START, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (targetBody) {\n return;\n }\n\n const body = findBody(point);\n if (!body) {\n return;\n }\n\n if (testbed.mouseForce) {\n targetBody = body;\n\n } else {\n mouseJoint = new MouseJoint({maxForce: 1000}, mouseGround, body, Vec2.clone(point));\n world.createJoint(mouseJoint);\n }\n\n }).on(Stage.Mouse.MOVE, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (mouseJoint) {\n mouseJoint.setTarget(point);\n }\n\n mouseMove.x = point.x;\n mouseMove.y = point.y;\n }).on(Stage.Mouse.END, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (mouseJoint) {\n world.destroyJoint(mouseJoint);\n mouseJoint = null;\n }\n if (targetBody) {\n const force = Vec2.sub(point, targetBody.getPosition());\n targetBody.applyForceToCenter(force.mul(testbed.mouseForce), true);\n targetBody = null;\n }\n\n }).on(Stage.Mouse.CANCEL, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (mouseJoint) {\n world.destroyJoint(mouseJoint);\n mouseJoint = null;\n }\n if (targetBody) {\n targetBody = null;\n }\n });\n\n window.addEventListener(\"keydown\", function(e) {\n switch (e.keyCode) {\n case 'P'.charCodeAt(0):\n testbed.togglePause();\n break;\n }\n }, false);\n\n const downKeys = {};\n window.addEventListener(\"keydown\", function(e) {\n const keyCode = e.keyCode;\n downKeys[keyCode] = true;\n updateActiveKeys(keyCode, true);\n testbed.keydown && testbed.keydown(keyCode, String.fromCharCode(keyCode));\n });\n window.addEventListener(\"keyup\", function(e) {\n const keyCode = e.keyCode;\n downKeys[keyCode] = false;\n updateActiveKeys(keyCode, false);\n testbed.keyup && testbed.keyup(keyCode, String.fromCharCode(keyCode));\n });\n\n const activeKeys = testbed.activeKeys;\n function updateActiveKeys(keyCode, down) {\n const char = String.fromCharCode(keyCode);\n if (/\\w/.test(char)) {\n activeKeys[char] = down;\n }\n activeKeys.right = downKeys[39] || activeKeys['D'];\n activeKeys.left = downKeys[37] || activeKeys['A'];\n activeKeys.up = downKeys[38] || activeKeys['W'];\n activeKeys.down = downKeys[40] || activeKeys['S'];\n activeKeys.fire = downKeys[32] || downKeys[13] ;\n }\n })();\n}\n\nViewer._super = Stage.Node;\nViewer.prototype = Object.create(Viewer._super.prototype);\n\nfunction Viewer(world, opts) {\n Viewer._super.call(this);\n this.label('Planck');\n\n opts = opts || {};\n\n this._options = {};\n this._options.speed = opts.speed || 1;\n this._options.hz = opts.hz || 60;\n if (Math.abs(this._options.hz) < 1) {\n this._options.hz = 1 / this._options.hz;\n }\n this._options.scaleY = opts.scaleY || -1;\n this._options.ratio = opts.ratio || 16;\n this._options.lineWidth = 2 / this._options.ratio;\n\n this._world = world;\n\n const timeStep = 1 / this._options.hz;\n let elapsedTime = 0;\n this.tick((dt) => {\n dt = dt * 0.001 * this._options.speed;\n elapsedTime += dt;\n while (elapsedTime > timeStep) {\n world.step(timeStep);\n elapsedTime -= timeStep;\n }\n this.renderWorld();\n return true;\n }, true);\n\n world.on('remove-fixture', function(obj) {\n obj.ui && obj.ui.remove();\n });\n\n world.on('remove-joint', function(obj) {\n obj.ui && obj.ui.remove();\n });\n}\n\nViewer.prototype.renderWorld = function() {\n const world = this._world;\n const options = this._options;\n const viewer = this;\n\n for (let b = world.getBodyList(); b; b = b.getNext()) {\n for (let f = b.getFixtureList(); f; f = f.getNext()) {\n\n if (!f.ui) {\n if (f.render && f.render.stroke) {\n options.strokeStyle = f.render.stroke;\n } else if (b.render && b.render.stroke) {\n options.strokeStyle = b.render.stroke;\n } else if (b.isDynamic()) {\n options.strokeStyle = 'rgba(255,255,255,0.9)';\n } else if (b.isKinematic()) {\n options.strokeStyle = 'rgba(255,255,255,0.7)';\n } else if (b.isStatic()) {\n options.strokeStyle = 'rgba(255,255,255,0.5)';\n }\n\n if (f.render && f.render.fill) {\n options.fillStyle = f.render.fill;\n } else if (b.render && b.render.fill) {\n options.fillStyle = b.render.fill;\n } else {\n options.fillStyle = '';\n }\n\n const type = f.getType();\n const shape = f.getShape();\n if (type == 'circle') {\n f.ui = viewer.drawCircle(shape, options);\n }\n if (type == 'edge') {\n f.ui = viewer.drawEdge(shape, options);\n }\n if (type == 'polygon') {\n f.ui = viewer.drawPolygon(shape, options);\n }\n if (type == 'chain') {\n f.ui = viewer.drawChain(shape, options);\n }\n\n if (f.ui) {\n f.ui.appendTo(viewer);\n }\n }\n\n if (f.ui) {\n const p = b.getPosition();\n const r = b.getAngle();\n if (f.ui.__lastX !== p.x || f.ui.__lastY !== p.y || f.ui.__lastR !== r) {\n f.ui.__lastX = p.x;\n f.ui.__lastY = p.y;\n f.ui.__lastR = r;\n f.ui.offset(p.x, options.scaleY * p.y);\n f.ui.rotate(options.scaleY * r);\n }\n }\n\n }\n }\n\n for (let j = world.getJointList(); j; j = j.getNext()) {\n const type = j.getType();\n const a = j.getAnchorA();\n const b = j.getAnchorB();\n\n if (!j.ui) {\n options.strokeStyle = 'rgba(255,255,255,0.2)';\n\n j.ui = viewer.drawJoint(j, options);\n j.ui.pin('handle', 0.5);\n if (j.ui) {\n j.ui.appendTo(viewer);\n }\n }\n\n if (j.ui) {\n const cx = (a.x + b.x) * 0.5;\n const cy = options.scaleY * (a.y + b.y) * 0.5;\n const dx = a.x - b.x;\n const dy = options.scaleY * (a.y - b.y);\n const d = Math.sqrt(dx * dx + dy * dy);\n j.ui.width(d);\n j.ui.rotate(Math.atan2(dy, dx));\n j.ui.offset(cx, cy);\n }\n }\n\n};\n\nViewer.prototype.drawJoint = function(joint, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const length = 10;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(length + 2 * lw, 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n ctx.moveTo(lw, lw);\n ctx.lineTo(lw + length, lw);\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const image = Stage.image(texture).stretch();\n return image;\n};\n\nViewer.prototype.drawCircle = function(shape, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const r = shape.m_radius;\n const cx = r + lw;\n const cy = r + lw;\n const w = r * 2 + lw * 2;\n const h = r * 2 + lw * 2;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(w, h, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.arc(cx, cy, r, 0, 2 * Math.PI);\n if (options.fillStyle) {\n ctx.fillStyle = options.fillStyle;\n ctx.fill();\n }\n ctx.lineTo(cx, cy);\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n const image = Stage.image(texture)\n .offset(shape.m_p.x - cx, options.scaleY * shape.m_p.y - cy);\n const node = Stage.create().append(image);\n return node;\n};\n\nViewer.prototype.drawEdge = function(edge, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const v1 = edge.m_vertex1;\n const v2 = edge.m_vertex2;\n\n const dx = v2.x - v1.x;\n const dy = v2.y - v1.y;\n\n const length = Math.sqrt(dx * dx + dy * dy);\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(length + 2 * lw, 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n ctx.moveTo(lw, lw);\n ctx.lineTo(lw + length, lw);\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const minX = Math.min(v1.x, v2.x);\n const minY = Math.min(options.scaleY * v1.y, options.scaleY * v2.y);\n\n const image = Stage.image(texture);\n image.rotate(options.scaleY * Math.atan2(dy, dx));\n image.offset(minX - lw, minY - lw);\n const node = Stage.create().append(image);\n return node;\n};\n\nViewer.prototype.drawPolygon = function(shape, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const vertices = shape.m_vertices;\n\n if (!vertices.length) {\n return;\n }\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, options.scaleY * v.y);\n maxY = Math.max(maxY, options.scaleY * v.y);\n }\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(width + 2 * lw, height + 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n const x = v.x - minX + lw;\n const y = options.scaleY * v.y - minY + lw;\n if (i == 0)\n ctx.moveTo(x, y);\n else\n ctx.lineTo(x, y);\n }\n\n if (vertices.length > 2) {\n ctx.closePath();\n }\n\n if (options.fillStyle) {\n ctx.fillStyle = options.fillStyle;\n ctx.fill();\n ctx.closePath();\n }\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const image = Stage.image(texture);\n image.offset(minX - lw, minY - lw);\n const node = Stage.create().append(image);\n return node;\n};\n\nViewer.prototype.drawChain = function(shape, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const vertices = shape.m_vertices;\n\n if (!vertices.length) {\n return;\n }\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, options.scaleY * v.y);\n maxY = Math.max(maxY, options.scaleY * v.y);\n }\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(width + 2 * lw, height + 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n const x = v.x - minX + lw;\n const y = options.scaleY * v.y - minY + lw;\n if (i == 0)\n ctx.moveTo(x, y);\n else\n ctx.lineTo(x, y);\n }\n\n // TODO: if loop\n if (vertices.length > 2) {\n // ctx.closePath();\n }\n\n if (options.fillStyle) {\n ctx.fillStyle = options.fillStyle;\n ctx.fill();\n ctx.closePath();\n }\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const image = Stage.image(texture);\n image.offset(minX - lw, minY - lw);\n const node = Stage.create().append(image);\n return node;\n};\n"],"names":["stats","math","Math","TOIOutputState","ManifoldType","ContactFeatureType","PointState","DEFAULTS","inactiveLimit","atLowerLimit","atUpperLimit","equalLimits","Stage"],"mappings":"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AAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACxC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;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lC,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAClC,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAClC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACxC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACxC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACf,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACf,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACf,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACf,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACf,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACf,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA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,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA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AA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAA;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,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AAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;CAGtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,C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"} \ No newline at end of file diff --git a/dist/planck-with-testbed.d.ts b/dist/planck-with-testbed.d.ts index 6837fea7..f6f55b99 100644 --- a/dist/planck-with-testbed.d.ts +++ b/dist/planck-with-testbed.d.ts @@ -4,38 +4,19 @@ declare namespace Serializer { var fromJson: any; } declare const math: Math & { - readonly EPSILON: number; - /** - * This function is used to ensure that a floating point number is not a NaN or - * infinity. - */ - isFinite(x: any): boolean; - assert(x: any): void; - /** - * This is a approximate yet fast inverse square-root (todo). - */ - invSqrt(x: number): number; - /** - * Next Largest Power of 2 Given a binary integer value x, the next largest - * power of 2 can be computed by a SWAR algorithm that recursively "folds" the - * upper bits into the lower bits. This process yields a bit vector with the - * same most significant 1 as x, but all 1's below it. Adding 1 to that value - * yields the next largest power of 2. For a 32-bit value: - */ - nextPowerOfTwo(x: number): number; - isPowerOfTwo(x: number): boolean; - mod(num: number, min?: number, max?: number): number; - /** - * Returns a min if num is less than min, and max if more than max, otherwise returns num. - */ - clamp(num: number, min: number, max: number): number; - /** - * Returns a random number between min and max when two arguments are provided. - * If one arg is provided between 0 to max. - * If one arg is passed between 0 to 1. - */ - random(min?: number, max?: number): number; + EPSILON: number; + isFinite: (x: unknown) => boolean; + assert: (x: any) => void; + nextPowerOfTwo: (x: number) => number; + isPowerOfTwo: (x: number) => boolean; + mod: (num: number, min?: number, max?: number) => number; + clamp: (num: number, min: number, max: number) => number; + random: (min?: number, max?: number) => number; }; +interface Vec2Value { + x: number; + y: number; +} declare function Vec2(x: number, y: number): Vec2; declare function Vec2(obj: { x: number; @@ -52,7 +33,7 @@ declare class Vec2 { }); constructor(); static zero(): Vec2; - static clone(v: Vec2): Vec2; + static clone(v: Vec2Value): Vec2; /** * Does this vector contain finite coordinates? */ @@ -66,7 +47,7 @@ declare class Vec2 { */ setZero(): Vec2; set(x: number, y: number): Vec2; - set(value: Vec2): Vec2; + set(value: Vec2Value): Vec2; /** * Set this vector to some specified coordinates. * @@ -78,38 +59,38 @@ declare class Vec2 { * * @returns this */ - setVec2(value: Vec2): this; + setVec2(value: Vec2Value): this; /** * Set linear combination of v and w: `a * v + b * w` */ - setCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2; - setMul(a: number, v: Vec2): Vec2; + setCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2; + setMul(a: number, v: Vec2Value): Vec2; /** * Add a vector to this vector. * * @returns this */ - add(w: Vec2): Vec2; + add(w: Vec2Value): Vec2; /** * Add linear combination of v and w: `a * v + b * w` */ - addCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2; - addMul(a: number, v: Vec2): Vec2; + addCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2; + addMul(a: number, v: Vec2Value): Vec2; /** * @deprecated Use subCombine or subMul */ - wSub(a: number, v: Vec2, b?: number, w?: Vec2): Vec2; + wSub(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2; /** * Subtract linear combination of v and w: `a * v + b * w` */ - subCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2; - subMul(a: number, v: Vec2): Vec2; + subCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2; + subMul(a: number, v: Vec2Value): Vec2; /** * Subtract a vector from this vector * * @returns this */ - sub(w: Vec2): Vec2; + sub(w: Vec2Value): Vec2; /** * Multiply this vector by a scalar. * @@ -137,64 +118,64 @@ declare class Vec2 { * * For performance, use this instead of lengthSquared (if possible). */ - static lengthOf(v: Vec2): number; + static lengthOf(v: Vec2Value): number; /** * Get the length squared. */ - static lengthSquared(v: Vec2): number; - static distance(v: Vec2, w: Vec2): number; - static distanceSquared(v: Vec2, w: Vec2): number; - static areEqual(v: Vec2, w: Vec2): boolean; + static lengthSquared(v: Vec2Value): number; + static distance(v: Vec2Value, w: Vec2Value): number; + static distanceSquared(v: Vec2Value, w: Vec2Value): number; + static areEqual(v: Vec2Value, w: Vec2Value): boolean; /** * Get the skew vector such that dot(skew_vec, other) == cross(vec, other) */ - static skew(v: Vec2): Vec2; + static skew(v: Vec2Value): Vec2; /** * Perform the dot product on two vectors. */ - static dot(v: Vec2, w: Vec2): number; - static cross(v: Vec2, w: Vec2): number; - static cross(v: Vec2, w: number): Vec2; - static cross(v: number, w: Vec2): Vec2; + static dot(v: Vec2Value, w: Vec2Value): number; + static cross(v: Vec2Value, w: Vec2Value): number; + static cross(v: Vec2Value, w: number): Vec2; + static cross(v: number, w: Vec2Value): Vec2; /** * Perform the cross product on two vectors. In 2D this produces a scalar. */ - static crossVec2Vec2(v: Vec2, w: Vec2): number; + static crossVec2Vec2(v: Vec2Value, w: Vec2Value): number; /** * Perform the cross product on a vector and a scalar. In 2D this produces a * vector. */ - static crossVec2Num(v: Vec2, w: number): Vec2; + static crossVec2Num(v: Vec2Value, w: number): Vec2; /** * Perform the cross product on a vector and a scalar. In 2D this produces a * vector. */ - static crossNumVec2(v: number, w: Vec2): Vec2; - static addCross(a: Vec2, v: Vec2, w: number): Vec2; - static addCross(a: Vec2, v: number, w: Vec2): Vec2; + static crossNumVec2(v: number, w: Vec2Value): Vec2; + static addCross(a: Vec2Value, v: Vec2Value, w: number): Vec2; + static addCross(a: Vec2Value, v: number, w: Vec2Value): Vec2; /** * Returns `a + (v x w)` */ - static addCrossVec2Num(a: Vec2, v: Vec2, w: number): Vec2; + static addCrossVec2Num(a: Vec2Value, v: Vec2Value, w: number): Vec2; /** * Returns `a + (v x w)` */ - static addCrossNumVec2(a: Vec2, v: number, w: Vec2): Vec2; - static add(v: Vec2, w: Vec2): Vec2; + static addCrossNumVec2(a: Vec2Value, v: number, w: Vec2Value): Vec2; + static add(v: Vec2Value, w: Vec2Value): Vec2; static combine(a: number, v: Vec2, b: number, w: Vec2): Vec2; - static sub(v: Vec2, w: Vec2): Vec2; - static mul(a: Vec2, b: number): Vec2; - static mul(a: number, b: Vec2): Vec2; - static mulVec2Num(a: Vec2, b: number): Vec2; - static mulNumVec2(a: number, b: Vec2): Vec2; + static sub(v: Vec2Value, w: Vec2Value): Vec2; + static mul(a: Vec2Value, b: number): Vec2; + static mul(a: number, b: Vec2Value): Vec2; + static mulVec2Num(a: Vec2Value, b: number): Vec2; + static mulNumVec2(a: number, b: Vec2Value): Vec2; neg(): Vec2; - static neg(v: Vec2): Vec2; - static abs(v: Vec2): Vec2; - static mid(v: Vec2, w: Vec2): Vec2; - static upper(v: Vec2, w: Vec2): Vec2; - static lower(v: Vec2, w: Vec2): Vec2; + static neg(v: Vec2Value): Vec2; + static abs(v: Vec2Value): Vec2; + static mid(v: Vec2Value, w: Vec2Value): Vec2; + static upper(v: Vec2Value, w: Vec2Value): Vec2; + static lower(v: Vec2Value, w: Vec2Value): Vec2; clamp(max: number): Vec2; - static clamp(v: Vec2, max: number): Vec2; + static clamp(v: Vec2Value, max: number): Vec2; } declare function Vec3(x: number, y: number, z: number): Vec3; declare function Vec3(obj: { @@ -372,14 +353,14 @@ declare class Rot { /** Transpose multiply two rotations: qT * r */ static mulTRot(rot: Rot, m: Rot): Rot; /** Inverse rotate a vector */ - static mulTVec2(rot: Rot, m: Vec2): Vec2; + static mulTVec2(rot: Rot, m: Vec2Value): Vec2; } /** * A transform contains translation and rotation. It is used to represent the * position and orientation of rigid frames. Initialize using a position vector * and a rotation. */ -declare function Transform(position?: Vec2, rotation?: number): Transform; +declare function Transform(position?: Vec2Value, rotation?: number): Transform; /** * A transform contains translation and rotation. It is used to represent the * position and orientation of rigid frames. Initialize using a position vector @@ -390,7 +371,7 @@ declare class Transform { p: Vec2; /** rotation */ q: Rot; - constructor(position?: Vec2, rotation?: number); + constructor(position?: Vec2Value, rotation?: number); static clone(xf: Transform): Transform; static identity(): Transform; /** @@ -406,15 +387,15 @@ declare class Transform { setTransform(xf: Transform): void; static isValid(obj: any): boolean; static assert(o: any): void; - static mul(a: Transform, b: Vec2): Vec2; + static mul(a: Transform, b: Vec2Value): Vec2; static mul(a: Transform, b: Transform): Transform; - static mulAll(a: Transform, b: Vec2[]): Vec2[]; + static mulAll(a: Transform, b: Vec2Value[]): Vec2[]; static mulAll(a: Transform, b: Transform[]): Transform[]; - static mulVec2(a: Transform, b: Vec2): Vec2; + static mulVec2(a: Transform, b: Vec2Value): Vec2; static mulXf(a: Transform, b: Transform): Transform; - static mulT(a: Transform, b: Vec2): Vec2; + static mulT(a: Transform, b: Vec2Value): Vec2; static mulT(a: Transform, b: Transform): Transform; - static mulTVec2(a: Transform, b: Vec2): Vec2; + static mulTVec2(a: Transform, b: Vec2Value): Vec2; static mulTXf(a: Transform, b: Transform): Transform; } /** @@ -434,11 +415,11 @@ interface RayCastOutput { normal: Vec2; fraction: number; } -declare function AABB(lower?: Vec2, upper?: Vec2): AABB; +declare function AABB(lower?: Vec2Value, upper?: Vec2Value): AABB; declare class AABB { lowerBound: Vec2; upperBound: Vec2; - constructor(lower?: Vec2, upper?: Vec2); + constructor(lower?: Vec2Value, upper?: Vec2Value); /** * Verify that the bounds are sorted. */ @@ -461,7 +442,7 @@ declare class AABB { * Combine one or two AABB into this one. */ combine(a: AABB, b?: AABB): void; - combinePoints(a: Vec2, b: Vec2): void; + combinePoints(a: Vec2Value, b: Vec2Value): void; set(aabb: AABB): void; contains(aabb: AABB): boolean; extend(value: number): AABB; @@ -867,7 +848,7 @@ declare class Fixture { /** * Test a point in world coordinates for containment in this fixture. */ - testPoint(p: Vec2): boolean; + testPoint(p: Vec2Value): boolean; /** * Cast a ray against this shape. */ @@ -1106,6 +1087,27 @@ declare class ContactEdge { constructor(contact: Contact); } type EvaluateFunction = (manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number) => void; +type ContactCallback = (manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number) => void /* & { destroyFcn?: (contact: Contact) => void }*/; +/** + * Friction mixing law. The idea is to allow either fixture to drive the + * restitution to zero. For example, anything slides on ice. + */ +declare function mixFriction(friction1: number, friction2: number): number; +/** + * Restitution mixing law. The idea is allow for anything to bounce off an + * inelastic surface. For example, a superball bounces on anything. + */ +declare function mixRestitution(restitution1: number, restitution2: number): number; +// TODO: merge with ManifoldPoint? +declare class VelocityConstraintPoint { + rA: Vec2; + rB: Vec2; + normalImpulse: number; + tangentImpulse: number; + normalMass: number; + tangentMass: number; + velocityBias: number; +} /** * The class manages contact between two shapes. A contact exists for each * overlapping AABB in the broad-phase (except if filtered). Therefore a contact @@ -1997,11 +1999,11 @@ declare class Body { /** * Gets the corresponding local point of a world point. */ - getLocalPoint(worldPoint: Vec2): Vec2; + getLocalPoint(worldPoint: Vec2Value): Vec2; /** * Gets the corresponding local vector of a world vector. */ - getLocalVector(worldVector: Vec2): Vec2; + getLocalVector(worldVector: Vec2Value): Vec2; } /** * Input for Distance. You have to option to use the shape radii in the @@ -2047,7 +2049,14 @@ declare class SimplexCache { * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On * the first call set SimplexCache.count to zero. */ -declare function Distance(output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void; +declare const Distance: { + (output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void; + testOverlap: (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform) => boolean; + Input: typeof DistanceInput; + Output: typeof DistanceOutput; + Proxy: typeof DistanceProxy; + Cache: typeof SimplexCache; +}; /** * A distance proxy is used by the GJK algorithm. It encapsulates any shape. */ @@ -2079,6 +2088,11 @@ declare class DistanceProxy { */ set(shape: Shape, index: number): void; } +/** + * Determine if two generic shapes overlap. + */ +declare const testOverlap: (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform) => boolean; +// todo make shape an interface /** * A shape is used for collision detection. You can create a shape however you * like. Shapes used for simulation in World are created automatically when a @@ -2088,14 +2102,14 @@ declare abstract class Shape { m_type: ShapeType; m_radius: number; static isValid(obj: any): boolean; - getRadius(): number; + abstract getRadius(): number; /** * Get the type of this shape. You can use this to down cast to the concrete * shape. * * @return the shape type. */ - getType(): ShapeType; + abstract getType(): ShapeType; /** * Get the number of child primitives. */ @@ -2107,7 +2121,7 @@ declare abstract class Shape { * @param xf The shape world transform. * @param p A point in world coordinates. */ - abstract testPoint(xf: Transform, p: Vec2): boolean; + abstract testPoint(xf: Transform, p: Vec2Value): boolean; /** * Cast a ray against a child shape. * @@ -2137,16 +2151,16 @@ declare abstract class Shape { abstract computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void; } type ShapeType = "circle" | "edge" | "polygon" | "chain"; -declare const CircleShape: { - new (position: Vec2, radius?: number): CircleShape; - (position: Vec2, radius?: number): CircleShape; - new (radius?: number): CircleShape; - (radius?: number): CircleShape; - TYPE: "circle"; -}; -declare interface CircleShape extends Shape { +declare function CircleShape(position: Vec2Value, radius?: number): CircleShape; +declare function CircleShape(radius?: number): CircleShape; +declare class CircleShape extends Shape { + static TYPE: "circle"; + m_type: "circle"; m_p: Vec2; - // TODO: already defined in Shape + m_radius: number; + constructor(position: Vec2Value, radius?: number); + constructor(radius?: number); + getType(): "circle"; getRadius(): number; getCenter(): Vec2; getVertex(index: 0): Vec2; @@ -2161,7 +2175,7 @@ declare interface CircleShape extends Shape { * @param xf The shape world transform. * @param p A point in world coordinates. */ - testPoint(xf: Transform, p: Vec2): boolean; + testPoint(xf: Transform, p: Vec2Value): boolean; /** * Cast a ray against a child shape. * @@ -2190,17 +2204,22 @@ declare interface CircleShape extends Shape { computeMass(massData: MassData, density: number): void; computeDistanceProxy(proxy: DistanceProxy): void; } -declare const EdgeShape: { - new (v1?: Vec2, v2?: Vec2): EdgeShape; - (v1?: Vec2, v2?: Vec2): EdgeShape; - TYPE: "edge"; -}; +declare const Circle: typeof CircleShape; /** * A line segment (edge) shape. These can be connected in chains or loops to * other edge shapes. The connectivity information is used to ensure correct * contact normals. */ -declare interface EdgeShape extends Shape { +declare function EdgeShape(v1?: Vec2Value, v2?: Vec2Value): EdgeShape; +/** + * A line segment (edge) shape. These can be connected in chains or loops to + * other edge shapes. The connectivity information is used to ensure correct + * contact normals. + */ +declare class EdgeShape extends Shape { + static TYPE: "edge"; + m_type: "edge"; + m_radius: number; // These are the edge vertices m_vertex1: Vec2; m_vertex2: Vec2; @@ -2210,6 +2229,9 @@ declare interface EdgeShape extends Shape { m_vertex3: Vec2; m_hasVertex0: boolean; m_hasVertex3: boolean; + constructor(v1?: Vec2Value, v2?: Vec2Value); + getRadius(): number; + getType(): "edge"; /** * Optional next vertex, used for smooth collision. */ @@ -2241,7 +2263,7 @@ declare interface EdgeShape extends Shape { * @param xf The shape world transform. * @param p A point in world coordinates. */ - testPoint(xf: Transform, p: Vec2): false; + testPoint(xf: Transform, p: Vec2Value): false; /** * Cast a ray against a child shape. * @@ -2270,24 +2292,32 @@ declare interface EdgeShape extends Shape { computeMass(massData: MassData, density?: number): void; computeDistanceProxy(proxy: DistanceProxy): void; } -declare const PolygonShape: { - // @ts-ignore - new (vertices?: Vec2[]): PolygonShape; - // @ts-ignore - (vertices?: Vec2[]): PolygonShape; - TYPE: "polygon"; -}; +declare const Edge: typeof EdgeShape; /** * A convex polygon. It is assumed that the interior of the polygon is to the * left of each edge. Polygons have a maximum number of vertices equal to * Settings.maxPolygonVertices. In most cases you should not need many vertices * for a convex polygon. extends Shape */ -declare interface PolygonShape extends Shape { +declare function PolygonShape(vertices?: Vec2Value[]): PolygonShape; +/** + * A convex polygon. It is assumed that the interior of the polygon is to the + * left of each edge. Polygons have a maximum number of vertices equal to + * Settings.maxPolygonVertices. In most cases you should not need many vertices + * for a convex polygon. extends Shape + */ +declare class PolygonShape extends Shape { + static TYPE: "polygon"; + m_type: "polygon"; m_centroid: Vec2; m_vertices: Vec2[]; // [Settings.maxPolygonVertices] m_normals: Vec2[]; // [Settings.maxPolygonVertices] m_count: number; + m_radius: number; + // @ts-ignore + constructor(vertices?: Vec2Value[]); + getType(): "polygon"; + getRadius(): number; getVertex(index: number): Vec2; /** * Get the number of child primitives. @@ -2334,11 +2364,7 @@ declare interface PolygonShape extends Shape { validate(): boolean; computeDistanceProxy(proxy: DistanceProxy): void; } -declare const ChainShape: { - new (vertices?: Vec2[], loop?: boolean): ChainShape; - (vertices?: Vec2[], loop?: boolean): ChainShape; - TYPE: "chain"; -}; +declare const Polygon: typeof PolygonShape; /** * A chain shape is a free form sequence of line segments. The chain has * two-sided collision, so you can use inside and outside collision. Therefore, @@ -2347,7 +2373,19 @@ declare const ChainShape: { * * WARNING: The chain will not collide properly if there are self-intersections. */ -declare interface ChainShape extends Shape { +declare function ChainShape(vertices?: Vec2Value[], loop?: boolean): ChainShape; +/** + * A chain shape is a free form sequence of line segments. The chain has + * two-sided collision, so you can use inside and outside collision. Therefore, + * you may use any winding order. Connectivity information is used to create + * smooth collisions. + * + * WARNING: The chain will not collide properly if there are self-intersections. + */ +declare class ChainShape extends Shape { + static TYPE: "chain"; + m_type: "chain"; + m_radius: number; m_vertices: Vec2[]; m_count: number; m_prevVertex: Vec2 | null; @@ -2355,6 +2393,13 @@ declare interface ChainShape extends Shape { m_hasPrevVertex: boolean; m_hasNextVertex: boolean; m_isLoop: boolean; + constructor(vertices?: Vec2Value[], loop?: boolean); + // clear() { + // this.m_vertices.length = 0; + // this.m_count = 0; + // } + getType(): "chain"; + getRadius(): number; /** * Establish connectivity to a vertex that precedes the first vertex. Don't call * this for loops. @@ -2384,7 +2429,7 @@ declare interface ChainShape extends Shape { * @param xf The shape world transform. * @param p A point in world coordinates. */ - testPoint(xf: Transform, p: Vec2): false; + testPoint(xf: Transform, p: Vec2Value): false; /** * Cast a ray against a child shape. * @@ -2415,20 +2460,23 @@ declare interface ChainShape extends Shape { computeMass(massData: MassData, density?: number): void; computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void; } -declare const BoxShape: { - new (hx: number, hy: number, center?: Vec2, angle?: number): BoxShape; - (hx: number, hy: number, center?: Vec2, angle?: number): BoxShape; - TYPE: "polygon"; -}; +declare const Chain: typeof ChainShape; +/** + * A rectangle polygon which extend PolygonShape. + */ +declare function BoxShape(hx: number, hy: number, center?: Vec2Value, angle?: number): BoxShape; /** * A rectangle polygon which extend PolygonShape. */ -declare interface BoxShape extends PolygonShape { +declare class BoxShape extends PolygonShape { + static TYPE: "polygon"; + constructor(hx: number, hy: number, center?: Vec2Value, angle?: number); } -declare function CollideCircles(manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void; +declare const Box: typeof BoxShape; +declare const CollideCircles: (manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform) => void; // Compute contact points for edge versus circle. // This accounts for edge connectivity. -declare function CollideEdgeCircle(manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void; +declare const CollideEdgeCircle: (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform) => void; /** * * Find edge normal of max separation on A - return if separating axis is found
@@ -2439,13 +2487,13 @@ declare function CollideEdgeCircle(manifold: Manifold, edgeA: EdgeShape, xfA: Tr * * The normal points from 1 to 2 */ -declare function CollidePolygons(manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform): void; -declare function CollidePolygonCircle(manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void; +declare const CollidePolygons: (manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform) => void; +declare const CollidePolygonCircle: (manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform) => void; /** * This function collides and edge and a polygon, taking into account edge * adjacency. */ -declare function CollideEdgePolygon(manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform): void; +declare const CollideEdgePolygon: (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform) => void; /** * Distance joint definition. This requires defining an anchor point on both * bodies and the non-zero length of the distance joint. The definition uses @@ -2484,13 +2532,6 @@ interface DistanceJointDef extends JointDef, DistanceJointOpt { */ localAnchorB: Vec2; } -declare const DistanceJoint: { - new (def: DistanceJointDef): DistanceJoint; - (def: DistanceJointDef): DistanceJoint; - new (def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2): DistanceJoint; - (def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2): DistanceJoint; - TYPE: "distance-joint"; -}; /** * A distance joint constrains two points on two bodies to remain at a fixed * distance from each other. You can view this as a massless, rigid rod. @@ -2498,7 +2539,26 @@ declare const DistanceJoint: { * @param anchorA Anchor A in global coordination. * @param anchorB Anchor B in global coordination. */ -declare interface DistanceJoint extends Joint { +declare function DistanceJoint(def: DistanceJointDef): DistanceJoint; +/** + * A distance joint constrains two points on two bodies to remain at a fixed + * distance from each other. You can view this as a massless, rigid rod. + * + * @param anchorA Anchor A in global coordination. + * @param anchorB Anchor B in global coordination. + */ +declare function DistanceJoint(def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2): DistanceJoint; +/** + * A distance joint constrains two points on two bodies to remain at a fixed + * distance from each other. You can view this as a massless, rigid rod. + * + * @param anchorA Anchor A in global coordination. + * @param anchorB Anchor B in global coordination. + */ +declare class DistanceJoint extends Joint { + static TYPE: "distance-joint"; + constructor(def: DistanceJointDef); + constructor(def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2); /** * The local anchor point relative to bodyA's origin. */ @@ -2569,20 +2629,30 @@ interface FrictionJointDef extends JointDef, FrictionJointOpt { */ localAnchorB: Vec2; } -declare const FrictionJoint: { - new (def: FrictionJointDef): FrictionJoint; - (def: FrictionJointDef): FrictionJoint; - new (def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): FrictionJoint; - (def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): FrictionJoint; - TYPE: "friction-joint"; -}; /** * Friction joint. This is used for top-down friction. It provides 2D * translational friction and angular friction. * * @param anchor Anchor in global coordination. */ -declare interface FrictionJoint extends Joint { +declare function FrictionJoint(def: FrictionJointDef): FrictionJoint; +/** + * Friction joint. This is used for top-down friction. It provides 2D + * translational friction and angular friction. + * + * @param anchor Anchor in global coordination. + */ +declare function FrictionJoint(def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): FrictionJoint; +/** + * Friction joint. This is used for top-down friction. It provides 2D + * translational friction and angular friction. + * + * @param anchor Anchor in global coordination. + */ +declare class FrictionJoint extends Joint { + static TYPE: "friction-joint"; + constructor(def: FrictionJointDef); + constructor(def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); /** * The local anchor point relative to bodyA's origin. */ @@ -2695,15 +2765,6 @@ interface RevoluteJointDef extends JointDef, RevoluteJointOpt { */ referenceAngle: number; } -declare const RevoluteJoint: { - // TODO enum - new (def: RevoluteJointDef): RevoluteJoint; - // TODO enum - (def: RevoluteJointDef): RevoluteJoint; - new (def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): RevoluteJoint; - (def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): RevoluteJoint; - TYPE: "revolute-joint"; -}; /** * A revolute joint constrains two bodies to share a common point while they are * free to rotate about the point. The relative rotation about the shared point @@ -2712,7 +2773,29 @@ declare const RevoluteJoint: { * relative rotation about the shared point. A maximum motor torque is provided * so that infinite forces are not generated. */ -declare interface RevoluteJoint extends Joint { +declare function RevoluteJoint(def: RevoluteJointDef): RevoluteJoint; +/** + * A revolute joint constrains two bodies to share a common point while they are + * free to rotate about the point. The relative rotation about the shared point + * is the joint angle. You can limit the relative rotation with a joint limit + * that specifies a lower and upper angle. You can use a motor to drive the + * relative rotation about the shared point. A maximum motor torque is provided + * so that infinite forces are not generated. + */ +declare function RevoluteJoint(def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): RevoluteJoint; +/** + * A revolute joint constrains two bodies to share a common point while they are + * free to rotate about the point. The relative rotation about the shared point + * is the joint angle. You can limit the relative rotation with a joint limit + * that specifies a lower and upper angle. You can use a motor to drive the + * relative rotation about the shared point. A maximum motor torque is provided + * so that infinite forces are not generated. + */ +declare class RevoluteJoint extends Joint { + static TYPE: "revolute-joint"; + // TODO enum + constructor(def: RevoluteJointDef); + constructor(def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); /** * The local anchor point relative to bodyA's origin. */ @@ -2863,20 +2946,30 @@ interface PrismaticJointDef extends JointDef, PrismaticJointOpt { */ referenceAngle: number; } -declare const PrismaticJoint: { - new (def: PrismaticJointDef): PrismaticJoint; - (def: PrismaticJointDef): PrismaticJoint; - new (def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2): PrismaticJoint; - (def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2): PrismaticJoint; - TYPE: "prismatic-joint"; -}; /** * A prismatic joint. This joint provides one degree of freedom: translation * along an axis fixed in bodyA. Relative rotation is prevented. You can use a * joint limit to restrict the range of motion and a joint motor to drive the * motion or to model joint friction. */ -declare interface PrismaticJoint extends Joint { +declare function PrismaticJoint(def: PrismaticJointDef): PrismaticJoint; +/** + * A prismatic joint. This joint provides one degree of freedom: translation + * along an axis fixed in bodyA. Relative rotation is prevented. You can use a + * joint limit to restrict the range of motion and a joint motor to drive the + * motion or to model joint friction. + */ +declare function PrismaticJoint(def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2): PrismaticJoint; +/** + * A prismatic joint. This joint provides one degree of freedom: translation + * along an axis fixed in bodyA. Relative rotation is prevented. You can use a + * joint limit to restrict the range of motion and a joint motor to drive the + * motion or to model joint friction. + */ +declare class PrismaticJoint extends Joint { + static TYPE: "prismatic-joint"; + constructor(def: PrismaticJointDef); + constructor(def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2); /** * The local anchor point relative to bodyA's origin. */ @@ -2991,13 +3084,6 @@ interface GearJointDef extends JointDef, GearJointOpt { */ joint2: RevoluteJoint | PrismaticJoint; } -declare const GearJoint: { - new (def: GearJointDef): GearJoint; - (def: GearJointDef): GearJoint; - new (def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number): GearJoint; - (def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number): GearJoint; - TYPE: "gear-joint"; -}; /** * A gear joint is used to connect two joints together. Either joint can be a * revolute or prismatic joint. You specify a gear ratio to bind the motions @@ -3011,7 +3097,38 @@ declare const GearJoint: { * This definition requires two existing revolute or prismatic joints (any * combination will work). */ -declare interface GearJoint extends Joint { +declare function GearJoint(def: GearJointDef): GearJoint; +/** + * A gear joint is used to connect two joints together. Either joint can be a + * revolute or prismatic joint. You specify a gear ratio to bind the motions + * together: coordinate1 + ratio * coordinate2 = constant + * + * The ratio can be negative or positive. If one joint is a revolute joint and + * the other joint is a prismatic joint, then the ratio will have units of + * length or units of 1/length. Warning: You have to manually destroy the gear + * joint if joint1 or joint2 is destroyed. + * + * This definition requires two existing revolute or prismatic joints (any + * combination will work). + */ +declare function GearJoint(def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number): GearJoint; +/** + * A gear joint is used to connect two joints together. Either joint can be a + * revolute or prismatic joint. You specify a gear ratio to bind the motions + * together: coordinate1 + ratio * coordinate2 = constant + * + * The ratio can be negative or positive. If one joint is a revolute joint and + * the other joint is a prismatic joint, then the ratio will have units of + * length or units of 1/length. Warning: You have to manually destroy the gear + * joint if joint1 or joint2 is destroyed. + * + * This definition requires two existing revolute or prismatic joints (any + * combination will work). + */ +declare class GearJoint extends Joint { + static TYPE: "gear-joint"; + constructor(def: GearJointDef); + constructor(def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number); /** * Get the first joint. */ @@ -3081,19 +3198,27 @@ interface MotorJointOpt extends JointOpt { */ interface MotorJointDef extends JointDef, MotorJointOpt { } -declare const MotorJoint: { - new (def: MotorJointDef): MotorJoint; - (def: MotorJointDef): MotorJoint; - new (def: MotorJointOpt, bodyA: Body, bodyB: Body): MotorJoint; - (def: MotorJointOpt, bodyA: Body, bodyB: Body): MotorJoint; - TYPE: "motor-joint"; -}; /** * A motor joint is used to control the relative motion between two bodies. A * typical usage is to control the movement of a dynamic body with respect to * the ground. */ -declare interface MotorJoint extends Joint { +declare function MotorJoint(def: MotorJointDef): MotorJoint; +/** + * A motor joint is used to control the relative motion between two bodies. A + * typical usage is to control the movement of a dynamic body with respect to + * the ground. + */ +declare function MotorJoint(def: MotorJointOpt, bodyA: Body, bodyB: Body): MotorJoint; +/** + * A motor joint is used to control the relative motion between two bodies. A + * typical usage is to control the movement of a dynamic body with respect to + * the ground. + */ +declare class MotorJoint extends Joint { + static TYPE: "motor-joint"; + constructor(def: MotorJointDef); + constructor(def: MotorJointOpt, bodyA: Body, bodyB: Body); /** * Set the maximum friction force in N. */ @@ -3181,15 +3306,8 @@ interface MouseJointDef extends JointDef, MouseJointOpt { * The initial world target point. This is assumed to coincide with the body * anchor initially. */ - target: Vec2; + target: Vec2Value; } -declare const MouseJoint: { - new (def: MouseJointDef): MouseJoint; - (def: MouseJointDef): MouseJoint; - new (def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2): MouseJoint; - (def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2): MouseJoint; - TYPE: "mouse-joint"; -}; /** * A mouse joint is used to make a point on a body track a specified world * point. This a soft constraint with a maximum force. This allows the @@ -3199,11 +3317,34 @@ declare const MouseJoint: { * be used in the testbed. If you want to learn how to use the mouse joint, look * at the testbed. */ -declare interface MouseJoint extends Joint { +declare function MouseJoint(def: MouseJointDef): MouseJoint; +/** + * A mouse joint is used to make a point on a body track a specified world + * point. This a soft constraint with a maximum force. This allows the + * constraint to stretch and without applying huge forces. + * + * NOTE: this joint is not documented in the manual because it was developed to + * be used in the testbed. If you want to learn how to use the mouse joint, look + * at the testbed. + */ +declare function MouseJoint(def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2): MouseJoint; +/** + * A mouse joint is used to make a point on a body track a specified world + * point. This a soft constraint with a maximum force. This allows the + * constraint to stretch and without applying huge forces. + * + * NOTE: this joint is not documented in the manual because it was developed to + * be used in the testbed. If you want to learn how to use the mouse joint, look + * at the testbed. + */ +declare class MouseJoint extends Joint { + static TYPE: "mouse-joint"; + constructor(def: MouseJointDef); + constructor(def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2); /** * Use this to update the target point. */ - setTarget(target: Vec2): void; + setTarget(target: Vec2Value): void; getTarget(): Vec2; /** * Set the maximum force in Newtons. @@ -3248,7 +3389,7 @@ declare interface MouseJoint extends Joint { /** * Shift the origin for any points stored in world coordinates. */ - shiftOrigin(newOrigin: Vec2): void; + shiftOrigin(newOrigin: Vec2Value): void; initVelocityConstraints(step: TimeStep): void; solveVelocityConstraints(step: TimeStep): void; /** @@ -3297,13 +3438,6 @@ interface PulleyJointDef extends JointDef, PulleyJointOpt { */ ratio: number; } -declare const PulleyJoint: { - new (def: PulleyJointDef): PulleyJoint; - (def: PulleyJointDef): PulleyJoint; - new (def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number): PulleyJoint; - (def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number): PulleyJoint; - TYPE: "pulley-joint"; -}; /** * The pulley joint is connected to two bodies and two fixed ground points. The * pulley supports a ratio such that: length1 + ratio * length2 <= constant @@ -3315,7 +3449,34 @@ declare const PulleyJoint: { * anchor points with static shapes to prevent one side from going to zero * length. */ -declare interface PulleyJoint extends Joint { +declare function PulleyJoint(def: PulleyJointDef): PulleyJoint; +/** + * The pulley joint is connected to two bodies and two fixed ground points. The + * pulley supports a ratio such that: length1 + ratio * length2 <= constant + * + * Yes, the force transmitted is scaled by the ratio. + * + * Warning: the pulley joint can get a bit squirrelly by itself. They often work + * better when combined with prismatic joints. You should also cover the the + * anchor points with static shapes to prevent one side from going to zero + * length. + */ +declare function PulleyJoint(def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number): PulleyJoint; +/** + * The pulley joint is connected to two bodies and two fixed ground points. The + * pulley supports a ratio such that: length1 + ratio * length2 <= constant + * + * Yes, the force transmitted is scaled by the ratio. + * + * Warning: the pulley joint can get a bit squirrelly by itself. They often work + * better when combined with prismatic joints. You should also cover the the + * anchor points with static shapes to prevent one side from going to zero + * length. + */ +declare class PulleyJoint extends Joint { + static TYPE: "pulley-joint"; + constructor(def: PulleyJointDef); + constructor(def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number); _serialize(): object; /** * Get the first ground anchor. @@ -3401,13 +3562,6 @@ interface RopeJointDef extends JointDef, RopeJointOpt { */ localAnchorB: Vec2; } -declare const RopeJoint: { - new (def: RopeJointDef): RopeJoint; - (def: RopeJointDef): RopeJoint; - new (def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): RopeJoint; - (def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): RopeJoint; - TYPE: "rope-joint"; -}; /** * A rope joint enforces a maximum distance between two points on two bodies. It * has no other effect. @@ -3419,7 +3573,34 @@ declare const RopeJoint: { * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you * want to dynamically control length. */ -declare interface RopeJoint extends Joint { +declare function RopeJoint(def: RopeJointDef): RopeJoint; +/** + * A rope joint enforces a maximum distance between two points on two bodies. It + * has no other effect. + * + * Warning: if you attempt to change the maximum length during the simulation + * you will get some non-physical behavior. + * + * A model that would allow you to dynamically modify the length would have some + * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you + * want to dynamically control length. + */ +declare function RopeJoint(def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): RopeJoint; +/** + * A rope joint enforces a maximum distance between two points on two bodies. It + * has no other effect. + * + * Warning: if you attempt to change the maximum length during the simulation + * you will get some non-physical behavior. + * + * A model that would allow you to dynamically modify the length would have some + * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you + * want to dynamically control length. + */ +declare class RopeJoint extends Joint { + static TYPE: "rope-joint"; + constructor(def: RopeJointDef); + constructor(def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); /** * The local anchor point relative to bodyA's origin. */ @@ -3502,18 +3683,24 @@ interface WeldJointDef extends JointDef, WeldJointOpt { */ localAnchorB: Vec2; } -declare const WeldJoint: { - new (def: WeldJointDef): WeldJoint; - (def: WeldJointDef): WeldJoint; - new (def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): WeldJoint; - (def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): WeldJoint; - TYPE: "weld-joint"; -}; /** * A weld joint essentially glues two bodies together. A weld joint may distort * somewhat because the island constraint solver is approximate. */ -declare interface WeldJoint extends Joint { +declare function WeldJoint(def: WeldJointDef): WeldJoint; +/** + * A weld joint essentially glues two bodies together. A weld joint may distort + * somewhat because the island constraint solver is approximate. + */ +declare function WeldJoint(def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): WeldJoint; +/** + * A weld joint essentially glues two bodies together. A weld joint may distort + * somewhat because the island constraint solver is approximate. + */ +declare class WeldJoint extends Joint { + static TYPE: "weld-joint"; + constructor(def: WeldJointDef); + constructor(def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); /** * The local anchor point relative to bodyA's origin. */ @@ -3617,20 +3804,30 @@ interface WheelJointDef extends JointDef, WheelJointOpt { */ localAxisA: Vec2; } -declare const WheelJoint: { - new (def: WheelJointDef): WheelJoint; - (def: WheelJointDef): WheelJoint; - new (def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2): WheelJoint; - (def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2): WheelJoint; - TYPE: "wheel-joint"; -}; /** * A wheel joint. This joint provides two degrees of freedom: translation along * an axis fixed in bodyA and rotation in the plane. In other words, it is a * point to line constraint with a rotational motor and a linear spring/damper. * This joint is designed for vehicle suspensions. */ -declare interface WheelJoint extends Joint { +declare function WheelJoint(def: WheelJointDef): WheelJoint; +/** + * A wheel joint. This joint provides two degrees of freedom: translation along + * an axis fixed in bodyA and rotation in the plane. In other words, it is a + * point to line constraint with a rotational motor and a linear spring/damper. + * This joint is designed for vehicle suspensions. + */ +declare function WheelJoint(def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2): WheelJoint; +/** + * A wheel joint. This joint provides two degrees of freedom: translation along + * an axis fixed in bodyA and rotation in the plane. In other words, it is a + * point to line constraint with a rotational motor and a linear spring/damper. + * This joint is designed for vehicle suspensions. + */ +declare class WheelJoint extends Joint { + static TYPE: "wheel-joint"; + constructor(def: WheelJointDef); + constructor(def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2); /** * The local anchor point relative to bodyA's origin. */ @@ -3924,7 +4121,58 @@ declare class TOIOutput { * CCD via the local separating axis method. This seeks progression by computing * the largest time at which separation is maintained. */ -declare function TimeOfImpact(output: TOIOutput, input: TOIInput): void; +declare const TimeOfImpact: { + (output: TOIOutput, input: TOIInput): void; + Input: typeof TOIInput; + Output: typeof TOIOutput; +}; +declare const stats: { + gjkCalls: number; + gjkIters: number; + gjkMaxIters: number; + toiTime: number; + toiMaxTime: number; + toiCalls: number; + toiIters: number; + toiMaxIters: number; + toiRootIters: number; + toiMaxRootIters: number; + toString(newline?: string): string; +}; +/** @deprecated Merged with main namespace */ +declare const internal: { + CollidePolygons: (manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform) => void; + Settings: typeof Settings; + Sweep: typeof Sweep; + Manifold: typeof Manifold; + Distance: { + (output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void; + testOverlap: (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform) => boolean; + Input: typeof DistanceInput; + Output: typeof DistanceOutput; + Proxy: typeof DistanceProxy; + Cache: typeof SimplexCache; + }; + TimeOfImpact: { + (output: TOIOutput, input: TOIInput): void; + Input: typeof TOIInput; + Output: typeof TOIOutput; + }; + DynamicTree: typeof DynamicTree; + stats: { + gjkCalls: number; + gjkIters: number; + gjkMaxIters: number; + toiTime: number; + toiMaxTime: number; + toiCalls: number; + toiIters: number; + toiMaxIters: number; + toiRootIters: number; + toiMaxRootIters: number; + toString(newline?: string): string; + }; +}; interface ActiveKeys { 0?: boolean; 1?: boolean; @@ -3969,6 +4217,7 @@ interface ActiveKeys { fire?: boolean; } interface Testbed { + // camera position /** World viewbox width. */ width: number; /** World viewbox height. */ @@ -4010,6 +4259,7 @@ interface Testbed { }>, color: string): void; drawAABB(aabb: AABB, color: string): void; color(r: number, g: number, b: number): string; + // callbacks step?: (dt: number, t: number) => void; keydown?: (keyCode: number, label: string) => void; keyup?: (keyCode: number, label: string) => void; @@ -4018,7 +4268,4055 @@ interface Testbed { } declare function testbed(opts: object, callback: (testbed: Testbed) => World): any; declare function testbed(callback: (testbed: Testbed) => World): any; -type _ContactImpulse$0 = InstanceType; -/** @deprecated Merged with main namespace */ -declare const internal$0: {}; -export { ActiveKeys, Testbed, testbed, Serializer, math as Math, Vec2, Vec3, Mat22, Mat33, Transform, Rot, AABB, Shape, Fixture, Body, Contact, Joint, World, CircleShape as Circle, EdgeShape as Edge, PolygonShape as Polygon, ChainShape as Chain, BoxShape as Box, CollideCircles, CollideEdgeCircle, CollidePolygons, CollidePolygonCircle, CollideEdgePolygon, DistanceJoint, FrictionJoint, GearJoint, MotorJoint, MouseJoint, PrismaticJoint, PulleyJoint, RevoluteJoint, RopeJoint, WeldJoint, WheelJoint, Settings, Sweep, Manifold, Distance, TimeOfImpact, DynamicTree, _ContactImpulse$0 as ContactImpulse, internal$0 as internal }; +declare namespace planck { + function Serializer(opts?: any): void; + namespace Serializer { + var toJson: any; + var fromJson: any; + } + const math: Math & { + EPSILON: number; + isFinite: (x: unknown) => boolean; + assert: (x: any) => void; + nextPowerOfTwo: (x: number) => number; + isPowerOfTwo: (x: number) => boolean; + mod: (num: number, min?: number, max?: number) => number; + clamp: (num: number, min: number, max: number) => number; + random: (min?: number, max?: number) => number; + }; + interface Vec2Value { + x: number; + y: number; + } + class Vec2 { + x: number; + y: number; + constructor(x: number, y: number); + constructor(obj: { + x: number; + y: number; + }); + constructor(); + static zero(): Vec2; + static clone(v: Vec2Value): Vec2; + /** + * Does this vector contain finite coordinates? + */ + static isValid(obj: any): boolean; + static assert(o: any): void; + clone(): Vec2; + /** + * Set this vector to all zeros. + * + * @returns this + */ + setZero(): Vec2; + set(x: number, y: number): Vec2; + set(value: Vec2Value): Vec2; + /** + * Set this vector to some specified coordinates. + * + * @returns this + */ + setNum(x: number, y: number): this; + /** + * Set this vector to some specified coordinates. + * + * @returns this + */ + setVec2(value: Vec2Value): this; + /** + * Set linear combination of v and w: `a * v + b * w` + */ + setCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2; + setMul(a: number, v: Vec2Value): Vec2; + /** + * Add a vector to this vector. + * + * @returns this + */ + add(w: Vec2Value): Vec2; + /** + * Add linear combination of v and w: `a * v + b * w` + */ + addCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2; + addMul(a: number, v: Vec2Value): Vec2; + /** + * @deprecated Use subCombine or subMul + */ + wSub(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2; + /** + * Subtract linear combination of v and w: `a * v + b * w` + */ + subCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2; + subMul(a: number, v: Vec2Value): Vec2; + /** + * Subtract a vector from this vector + * + * @returns this + */ + sub(w: Vec2Value): Vec2; + /** + * Multiply this vector by a scalar. + * + * @returns this + */ + mul(m: number): Vec2; + /** + * Get the length of this vector (the norm). + * + * For performance, use this instead of lengthSquared (if possible). + */ + length(): number; + /** + * Get the length squared. + */ + lengthSquared(): number; + /** + * Convert this vector into a unit vector. + * + * @returns old length + */ + normalize(): number; + /** + * Get the length of this vector (the norm). + * + * For performance, use this instead of lengthSquared (if possible). + */ + static lengthOf(v: Vec2Value): number; + /** + * Get the length squared. + */ + static lengthSquared(v: Vec2Value): number; + static distance(v: Vec2Value, w: Vec2Value): number; + static distanceSquared(v: Vec2Value, w: Vec2Value): number; + static areEqual(v: Vec2Value, w: Vec2Value): boolean; + /** + * Get the skew vector such that dot(skew_vec, other) == cross(vec, other) + */ + static skew(v: Vec2Value): Vec2; + /** + * Perform the dot product on two vectors. + */ + static dot(v: Vec2Value, w: Vec2Value): number; + static cross(v: Vec2Value, w: Vec2Value): number; + static cross(v: Vec2Value, w: number): Vec2; + static cross(v: number, w: Vec2Value): Vec2; + /** + * Perform the cross product on two vectors. In 2D this produces a scalar. + */ + static crossVec2Vec2(v: Vec2Value, w: Vec2Value): number; + /** + * Perform the cross product on a vector and a scalar. In 2D this produces a + * vector. + */ + static crossVec2Num(v: Vec2Value, w: number): Vec2; + /** + * Perform the cross product on a vector and a scalar. In 2D this produces a + * vector. + */ + static crossNumVec2(v: number, w: Vec2Value): Vec2; + static addCross(a: Vec2Value, v: Vec2Value, w: number): Vec2; + static addCross(a: Vec2Value, v: number, w: Vec2Value): Vec2; + /** + * Returns `a + (v x w)` + */ + static addCrossVec2Num(a: Vec2Value, v: Vec2Value, w: number): Vec2; + /** + * Returns `a + (v x w)` + */ + static addCrossNumVec2(a: Vec2Value, v: number, w: Vec2Value): Vec2; + static add(v: Vec2Value, w: Vec2Value): Vec2; + static combine(a: number, v: Vec2, b: number, w: Vec2): Vec2; + static sub(v: Vec2Value, w: Vec2Value): Vec2; + static mul(a: Vec2Value, b: number): Vec2; + static mul(a: number, b: Vec2Value): Vec2; + static mulVec2Num(a: Vec2Value, b: number): Vec2; + static mulNumVec2(a: number, b: Vec2Value): Vec2; + neg(): Vec2; + static neg(v: Vec2Value): Vec2; + static abs(v: Vec2Value): Vec2; + static mid(v: Vec2Value, w: Vec2Value): Vec2; + static upper(v: Vec2Value, w: Vec2Value): Vec2; + static lower(v: Vec2Value, w: Vec2Value): Vec2; + clamp(max: number): Vec2; + static clamp(v: Vec2Value, max: number): Vec2; + } + class Vec3 { + x: number; + y: number; + z: number; + constructor(x: number, y: number, z: number); + constructor(obj: { + x: number; + y: number; + z: number; + }); + constructor(); + static zero(): Vec3; + static clone(v: Vec3): Vec3; + /** + * Does this vector contain finite coordinates? + */ + static isValid(obj: any): boolean; + static assert(o: any): void; + setZero(): Vec3; + set(x: number, y: number, z: number): Vec3; + add(w: Vec3): Vec3; + sub(w: Vec3): Vec3; + mul(m: number): Vec3; + static areEqual(v: Vec3, w: Vec3): boolean; + /** + * Perform the dot product on two vectors. + */ + static dot(v: Vec3, w: Vec3): number; + /** + * Perform the cross product on two vectors. In 2D this produces a scalar. + */ + static cross(v: Vec3, w: Vec3): Vec3; + static add(v: Vec3, w: Vec3): Vec3; + static sub(v: Vec3, w: Vec3): Vec3; + static mul(v: Vec3, m: number): Vec3; + neg(): Vec3; + static neg(v: Vec3): Vec3; + } + /** + * A 2-by-2 matrix. Stored in column-major order. + */ + class Mat22 { + ex: Vec2; + ey: Vec2; + constructor(a: number, b: number, c: number, d: number); + constructor(a: { + x: number; + y: number; + }, b: { + x: number; + y: number; + }); + constructor(); + static isValid(obj: any): boolean; + static assert(o: any): void; + set(a: Mat22): void; + set(a: Vec2, b: Vec2): void; + set(a: number, b: number, c: number, d: number): void; + setIdentity(): void; + setZero(): void; + getInverse(): Mat22; + /** + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. + */ + solve(v: Vec2): Vec2; + /** + * Multiply a matrix times a vector. If a rotation matrix is provided, then this + * transforms the vector from one frame to another. + */ + static mul(mx: Mat22, my: Mat22): Mat22; + static mul(mx: Mat22, v: Vec2): Vec2; + static mulVec2(mx: Mat22, v: Vec2): Vec2; + static mulMat22(mx: Mat22, v: Mat22): Mat22; + /** + * Multiply a matrix transpose times a vector. If a rotation matrix is provided, + * then this transforms the vector from one frame to another (inverse + * transform). + */ + static mulT(mx: Mat22, my: Mat22): Mat22; + static mulT(mx: Mat22, v: Vec2): Vec2; + static mulTVec2(mx: Mat22, v: Vec2): Vec2; + static mulTMat22(mx: Mat22, v: Mat22): Mat22; + static abs(mx: Mat22): Mat22; + static add(mx1: Mat22, mx2: Mat22): Mat22; + } + /** + * A 3-by-3 matrix. Stored in column-major order. + */ + class Mat33 { + ex: Vec3; + ey: Vec3; + ez: Vec3; + constructor(a: Vec3, b: Vec3, c: Vec3); + constructor(); + static isValid(obj: any): boolean; + static assert(o: any): void; + /** + * Set this matrix to all zeros. + */ + setZero(): Mat33; + /** + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. + */ + solve33(v: Vec3): Vec3; + /** + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix + * equation. + */ + solve22(v: Vec2): Vec2; + /** + * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if + * singular. + */ + getInverse22(M: Mat33): void; + /** + * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix + * if singular. + */ + getSymInverse33(M: Mat33): void; + /** + * Multiply a matrix times a vector. + */ + static mul(a: Mat33, b: Vec2): Vec2; + static mul(a: Mat33, b: Vec3): Vec3; + static mulVec3(a: Mat33, b: Vec3): Vec3; + static mulVec2(a: Mat33, b: Vec2): Vec2; + static add(a: Mat33, b: Mat33): Mat33; + } + class Rot { + s: number; + c: number; + /** Initialize from an angle in radians. */ + constructor(angle?: number | Rot); + static clone(rot: Rot): Rot; + static identity(): Rot; + static isValid(obj: any): boolean; + static assert(o: any): void; + /** Set to the identity rotation. */ + setIdentity(): void; + set(angle: number | Rot): void; + setRot(angle: Rot): void; + /** Set using an angle in radians. */ + setAngle(angle: number): void; + /** Get the angle in radians. */ + getAngle(): number; + /** Get the x-axis. */ + getXAxis(): Vec2; + /** Get the u-axis. */ + getYAxis(): Vec2; + /** Multiply two rotations: q * r */ + static mul(rot: Rot, m: Rot): Rot; + /** Rotate a vector */ + static mul(rot: Rot, m: Vec2): Vec2; + /** Multiply two rotations: q * r */ + static mulRot(rot: Rot, m: Rot): Rot; + /** Rotate a vector */ + static mulVec2(rot: Rot, m: Vec2): Vec2; + static mulSub(rot: Rot, v: Vec2, w: Vec2): Vec2; + /** Transpose multiply two rotations: qT * r */ + static mulT(rot: Rot, m: Rot): Rot; + /** Inverse rotate a vector */ + static mulT(rot: Rot, m: Vec2): Vec2; + /** Transpose multiply two rotations: qT * r */ + static mulTRot(rot: Rot, m: Rot): Rot; + /** Inverse rotate a vector */ + static mulTVec2(rot: Rot, m: Vec2Value): Vec2; + } + /** + * A transform contains translation and rotation. It is used to represent the + * position and orientation of rigid frames. Initialize using a position vector + * and a rotation. + */ + class Transform { + /** position */ + p: Vec2; + /** rotation */ + q: Rot; + constructor(position?: Vec2Value, rotation?: number); + static clone(xf: Transform): Transform; + static identity(): Transform; + /** + * Set this to the identity transform. + */ + setIdentity(): void; + set(position: Vec2, rotation: number): void; + set(xf: Transform): void; + /** + * Set this based on the position and angle. + */ + setNum(position: Vec2, rotation: number): void; + setTransform(xf: Transform): void; + static isValid(obj: any): boolean; + static assert(o: any): void; + static mul(a: Transform, b: Vec2Value): Vec2; + static mul(a: Transform, b: Transform): Transform; + static mulAll(a: Transform, b: Vec2Value[]): Vec2[]; + static mulAll(a: Transform, b: Transform[]): Transform[]; + static mulVec2(a: Transform, b: Vec2Value): Vec2; + static mulXf(a: Transform, b: Transform): Transform; + static mulT(a: Transform, b: Vec2Value): Vec2; + static mulT(a: Transform, b: Transform): Transform; + static mulTVec2(a: Transform, b: Vec2Value): Vec2; + static mulTXf(a: Transform, b: Transform): Transform; + } + /** + * Ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. + */ + interface RayCastInput { + p1: Vec2; + p2: Vec2; + maxFraction: number; + } + type RayCastCallback = (subInput: RayCastInput, id: number) => number; + /** + * Ray-cast output data. The ray hits at `p1 + fraction * (p2 - p1)`, + * where `p1` and `p2` come from RayCastInput. + */ + interface RayCastOutput { + normal: Vec2; + fraction: number; + } + class AABB { + lowerBound: Vec2; + upperBound: Vec2; + constructor(lower?: Vec2Value, upper?: Vec2Value); + /** + * Verify that the bounds are sorted. + */ + isValid(): boolean; + static isValid(obj: any): boolean; + static assert(o: any): void; + /** + * Get the center of the AABB. + */ + getCenter(): Vec2; + /** + * Get the extents of the AABB (half-widths). + */ + getExtents(): Vec2; + /** + * Get the perimeter length. + */ + getPerimeter(): number; + /** + * Combine one or two AABB into this one. + */ + combine(a: AABB, b?: AABB): void; + combinePoints(a: Vec2Value, b: Vec2Value): void; + set(aabb: AABB): void; + contains(aabb: AABB): boolean; + extend(value: number): AABB; + static extend(aabb: AABB, value: number): void; + static testOverlap(a: AABB, b: AABB): boolean; + static areEqual(a: AABB, b: AABB): boolean; + static diff(a: AABB, b: AABB): number; + rayCast(output: RayCastOutput, input: RayCastInput): boolean; + } + /* + * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + */ + class Pool { + _list: T[]; + _max: number; + _createFn: () => T; + _outFn: (item: T) => void; + _inFn: (item: T) => void; + _discardFn: (item: T) => T; + _createCount: number; + _outCount: number; + _inCount: number; + _discardCount: number; + constructor(opts: { + max?: number; + create?: () => T; + allocate?: (item: T) => void; + release?: (item: T) => void; + discard?: (item: T) => T; + }); + max(n?: number): number | Pool; + size(): number; + allocate(): T; + release(item: T): void; + } + type DynamicTreeQueryCallback = (nodeId: number) => boolean; + /** + * A node in the dynamic tree. The client does not interact with this directly. + */ + class TreeNode { + id: number; + /** Enlarged AABB */ + aabb: AABB; + userData: T; + parent: TreeNode; + child1: TreeNode; + child2: TreeNode; + /** 0: leaf, -1: free node */ + height: number; + constructor(id?: number); + isLeaf(): boolean; + } + /** + * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A + * dynamic tree arranges data in a binary tree to accelerate queries such as + * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we + * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger + * than the client object. This allows the client object to move by small + * amounts without triggering a tree update. + * + * Nodes are pooled and relocatable, so we use node indices rather than + * pointers. + */ + class DynamicTree { + m_root: TreeNode; + m_lastProxyId: number; + m_nodes: { + [id: number]: TreeNode; + }; + m_pool: Pool>; + constructor(); + /** + * Get proxy user data. + * + * @return the proxy user data or 0 if the id is invalid. + */ + getUserData(id: number): T; + /** + * Get the fat AABB for a node id. + * + * @return the proxy user data or 0 if the id is invalid. + */ + getFatAABB(id: number): AABB; + allocateNode(): TreeNode; + freeNode(node: TreeNode): void; + /** + * Create a proxy in the tree as a leaf node. We return the index of the node + * instead of a pointer so that we can grow the node pool. + * + * Create a proxy. Provide a tight fitting AABB and a userData pointer. + */ + createProxy(aabb: AABB, userData: T): number; + /** + * Destroy a proxy. This asserts if the id is invalid. + */ + destroyProxy(id: number): void; + /** + * Move a proxy with a swepted AABB. If the proxy has moved outside of its + * fattened AABB, then the proxy is removed from the tree and re-inserted. + * Otherwise the function returns immediately. + * + * @param d Displacement + * + * @return true if the proxy was re-inserted. + */ + moveProxy(id: number, aabb: AABB, d: Vec2): boolean; + insertLeaf(leaf: TreeNode): void; + removeLeaf(leaf: TreeNode): void; + /** + * Perform a left or right rotation if node A is imbalanced. Returns the new + * root index. + */ + balance(iA: TreeNode): TreeNode; + /** + * Compute the height of the binary tree in O(N) time. Should not be called + * often. + */ + getHeight(): number; + /** + * Get the ratio of the sum of the node areas to the root area. + */ + getAreaRatio(): number; + /** + * Compute the height of a sub-tree. + */ + computeHeight(id?: number): number; + validateStructure(node: TreeNode): void; + validateMetrics(node: TreeNode): void; + /** + * Validate this tree. For testing. + */ + validate(): void; + /** + * Get the maximum balance of an node in the tree. The balance is the difference + * in height of the two children of a node. + */ + getMaxBalance(): number; + /** + * Build an optimal tree. Very expensive. For testing. + */ + rebuildBottomUp(): void; + /** + * Shift the world origin. Useful for large worlds. The shift formula is: + * position -= newOrigin + * + * @param newOrigin The new origin with respect to the old origin + */ + shiftOrigin(newOrigin: Vec2): void; + /** + * Query an AABB for overlapping proxies. The callback class is called for each + * proxy that overlaps the supplied AABB. + */ + query(aabb: AABB, queryCallback: DynamicTreeQueryCallback): void; + /** + * Ray-cast against the proxies in the tree. This relies on the callback to + * perform a exact ray-cast in the case were the proxy contains a shape. The + * callback also performs the any collision filtering. This has performance + * roughly equal to k * log(n), where k is the number of collisions and n is the + * number of proxies in the tree. + * + * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. + * @param rayCastCallback A function that is called for each proxy that is hit by the ray. + */ + rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void; + private inputPool; + private stackPool; + private iteratorPool; + } + /** + * The broad-phase wraps and extends a dynamic-tree to keep track of moved + * objects and query them on update. + */ + class BroadPhase { + m_tree: DynamicTree; + m_proxyCount: number; + m_moveBuffer: number[]; + m_callback: (userDataA: any, userDataB: any) => void; + m_queryProxyId: number; + /** + * Get user data from a proxy. Returns null if the id is invalid. + */ + getUserData(proxyId: number): FixtureProxy; + /** + * Test overlap of fat AABBs. + */ + testOverlap(proxyIdA: number, proxyIdB: number): boolean; + /** + * Get the fat AABB for a proxy. + */ + getFatAABB(proxyId: number): AABB; + /** + * Get the number of proxies. + */ + getProxyCount(): number; + /** + * Get the height of the embedded tree. + */ + getTreeHeight(): number; + /** + * Get the balance (integer) of the embedded tree. + */ + getTreeBalance(): number; + /** + * Get the quality metric of the embedded tree. + */ + getTreeQuality(): number; + /** + * Query an AABB for overlapping proxies. The callback class is called for each + * proxy that overlaps the supplied AABB. + */ + query: (aabb: AABB, queryCallback: DynamicTreeQueryCallback) => void; + /** + * Ray-cast against the proxies in the tree. This relies on the callback to + * perform a exact ray-cast in the case were the proxy contains a shape. The + * callback also performs the any collision filtering. This has performance + * roughly equal to k * log(n), where k is the number of collisions and n is the + * number of proxies in the tree. + * + * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. + * @param rayCastCallback A function that is called for each proxy that is hit by the ray. + */ + rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void; + /** + * Shift the world origin. Useful for large worlds. The shift formula is: + * position -= newOrigin + * + * @param newOrigin The new origin with respect to the old origin + */ + shiftOrigin(newOrigin: Vec2): void; + /** + * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs + * is called. + */ + createProxy(aabb: AABB, userData: FixtureProxy): number; + /** + * Destroy a proxy. It is up to the client to remove any pairs. + */ + destroyProxy(proxyId: number): void; + /** + * Call moveProxy as many times as you like, then when you are done call + * UpdatePairs to finalized the proxy pairs (for your time step). + */ + moveProxy(proxyId: number, aabb: AABB, displacement: Vec2): void; + /** + * Call to trigger a re-processing of it's pairs on the next call to + * UpdatePairs. + */ + touchProxy(proxyId: number): void; + bufferMove(proxyId: number): void; + unbufferMove(proxyId: number): void; + /** + * Update the pairs. This results in pair callbacks. This can only add pairs. + */ + updatePairs(addPairCallback: (userDataA: FixtureProxy, userDataB: FixtureProxy) => void): void; + queryCallback: (proxyId: number) => boolean; + } + /** + * A fixture definition is used to create a fixture. This class defines an + * abstract fixture definition. You can reuse fixture definitions safely. + */ + interface FixtureOpt { + userData?: unknown; + /** + * The friction coefficient, usually in the range [0,1] + */ + friction?: number; + /** + * The restitution (elasticity) usually in the range [0,1] + */ + restitution?: number; + /** + * The density, usually in kg/m^2 + */ + density?: number; + /** + * A sensor shape collects contact information but never generates a collision response. + */ + isSensor?: boolean; + /** + * Zero, positive or negative collision group. + * Fixtures with same positive groupIndex always collide and fixtures with same negative groupIndex never collide. + */ + filterGroupIndex?: number; + /** + * Collision category bit or bits that this fixture belongs to. + * If groupIndex is zero or not matching, then at least one bit in this fixture categoryBits should match other fixture maskBits and vice versa. + */ + filterCategoryBits?: number; + /** + * Collision category bit or bits that this fixture accept for collision. + */ + filterMaskBits?: number; + } + interface FixtureDef extends FixtureOpt { + shape: Shape; + } + /** + * This proxy is used internally to connect shape children to the broad-phase. + */ + class FixtureProxy { + aabb: AABB; + fixture: Fixture; + childIndex: number; + proxyId: number; + constructor(fixture: Fixture, childIndex: number); + } + /** + * A fixture is used to attach a shape to a body for collision detection. A + * fixture inherits its transform from its parent. Fixtures hold additional + * non-geometric data such as friction, collision filters, etc. + * + * To create a new Fixture use {@link Body.createFixture}. + */ + class Fixture { + constructor(body: Body, def: FixtureDef); + constructor(body: Body, shape: Shape, def?: FixtureOpt); + constructor(body: Body, shape: Shape, density?: number); + /** + * Get the type of the child shape. You can use this to down cast to the + * concrete shape. + */ + getType(): ShapeType; + /** + * Get the child shape. You can modify the child shape, however you should not + * change the number of vertices because this will crash some collision caching + * mechanisms. Manipulating the shape may lead to non-physical behavior. + */ + getShape(): Shape; + /** + * A sensor shape collects contact information but never generates a collision + * response. + */ + isSensor(): boolean; + /** + * Set if this fixture is a sensor. + */ + setSensor(sensor: boolean): void; + // /** + // * Get the contact filtering data. + // */ + // getFilterData() { + // return this.m_filter; + // } + /** + * Get the user data that was assigned in the fixture definition. Use this to + * store your application specific data. + */ + getUserData(): unknown; + /** + * Set the user data. Use this to store your application specific data. + */ + setUserData(data: unknown): void; + /** + * Get the parent body of this fixture. This is null if the fixture is not + * attached. + */ + getBody(): Body; + /** + * Get the next fixture in the parent body's fixture list. + */ + getNext(): Fixture | null; + /** + * Get the density of this fixture. + */ + getDensity(): number; + /** + * Set the density of this fixture. This will _not_ automatically adjust the + * mass of the body. You must call Body.resetMassData to update the body's mass. + */ + setDensity(density: number): void; + /** + * Get the coefficient of friction, usually in the range [0,1]. + */ + getFriction(): number; + /** + * Set the coefficient of friction. This will not change the friction of + * existing contacts. + */ + setFriction(friction: number): void; + /** + * Get the coefficient of restitution. + */ + getRestitution(): number; + /** + * Set the coefficient of restitution. This will not change the restitution of + * existing contacts. + */ + setRestitution(restitution: number): void; + /** + * Test a point in world coordinates for containment in this fixture. + */ + testPoint(p: Vec2Value): boolean; + /** + * Cast a ray against this shape. + */ + rayCast(output: RayCastOutput, input: RayCastInput, childIndex: number): boolean; + /** + * Get the mass data for this fixture. The mass data is based on the density and + * the shape. The rotational inertia is about the shape's origin. This operation + * may be expensive. + */ + getMassData(massData: MassData): void; + /** + * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a + * more accurate AABB, compute it using the shape and the body transform. + */ + getAABB(childIndex: number): AABB; + /** + * These support body activation/deactivation. + */ + createProxies(broadPhase: BroadPhase, xf: Transform): void; + destroyProxies(broadPhase: BroadPhase): void; + /** + * Updates this fixture proxy in broad-phase (with combined AABB of current and + * next transformation). + */ + synchronize(broadPhase: BroadPhase, xf1: Transform, xf2: Transform): void; + /** + * Set the contact filtering data. This will not update contacts until the next + * time step when either parent body is active and awake. This automatically + * calls refilter. + */ + setFilterData(filter: { + groupIndex: number; + categoryBits: number; + maskBits: number; + }): void; + getFilterGroupIndex(): number; + setFilterGroupIndex(groupIndex: number): void; + getFilterCategoryBits(): number; + setFilterCategoryBits(categoryBits: number): void; + getFilterMaskBits(): number; + setFilterMaskBits(maskBits: number): void; + /** + * Call this if you want to establish collision that was previously disabled by + * ContactFilter. + */ + refilter(): void; + /** + * Implement this method to provide collision filtering, if you want finer + * control over contact creation. + * + * Return true if contact calculations should be performed between these two + * fixtures. + * + * Warning: for performance reasons this is only called when the AABBs begin to + * overlap. + */ + shouldCollide(that: Fixture): boolean; + } + enum ManifoldType { + e_circles = 0, + e_faceA = 1, + e_faceB = 2 + } + enum ContactFeatureType { + e_vertex = 0, + e_face = 1 + } + /** + * This is used for determining the state of contact points. + */ + enum PointState { + /** Point does not exist */ + nullState = 0, + /** Point was added in the update */ + addState = 1, + /** Point persisted across the update */ + persistState = 2, + /** Point was removed in the update */ + removeState = 3 + } + /** + * Used for computing contact manifolds. + */ + class ClipVertex { + v: Vec2; + id: ContactID; + set(o: ClipVertex): void; + } + /** + * A manifold for two touching convex shapes. Manifolds are created in `evaluate` + * method of Contact subclasses. + * + * Supported manifold types are e_faceA or e_faceB for clip point versus plane + * with radius and e_circles point versus point with radius. + * + * We store contacts in this way so that position correction can account for + * movement, which is critical for continuous physics. All contact scenarios + * must be expressed in one of these types. This structure is stored across time + * steps, so we keep it small. + * + * @prop type e_circle, e_faceA, e_faceB + * @prop localPoint Usage depends on manifold type:
+ * e_circles: the local center of circleA
+ * e_faceA: the center of faceA
+ * e_faceB: the center of faceB + * @prop localNormal Usage depends on manifold type:
+ * e_circles: not used
+ * e_faceA: the normal on polygonA
+ * e_faceB: the normal on polygonB + * @prop points The points of contact {ManifoldPoint[]} + * @prop pointCount The number of manifold points + */ + class Manifold { + type: ManifoldType; + localNormal: Vec2; + localPoint: Vec2; + points: ManifoldPoint[]; + pointCount: number; + /** + * Evaluate the manifold with supplied transforms. This assumes modest motion + * from the original state. This does not change the point count, impulses, etc. + * The radii must come from the shapes that generated the manifold. + */ + getWorldManifold(wm: WorldManifold | undefined, xfA: Transform, radiusA: number, xfB: Transform, radiusB: number): WorldManifold; + static clipSegmentToLine: typeof clipSegmentToLine; + static ClipVertex: typeof ClipVertex; + static getPointStates: typeof getPointStates; + static PointState: typeof PointState; + } + /** + * A manifold point is a contact point belonging to a contact manifold. It holds + * details related to the geometry and dynamics of the contact points. + * + * This structure is stored across time steps, so we keep it small. + * + * Note: impulses are used for internal caching and may not provide reliable + * contact forces, especially for high speed collisions. + */ + class ManifoldPoint { + /** + * Usage depends on manifold type. + * e_circles: the local center of circleB, + * e_faceA: the local center of cirlceB or the clip point of polygonB, + * e_faceB: the clip point of polygonA. + */ + localPoint: Vec2; + /** + * The non-penetration impulse + */ + normalImpulse: number; + /** + * The friction impulse + */ + tangentImpulse: number; + /** + * Uniquely identifies a contact point between two shapes to facilatate warm starting + */ + id: ContactID; + } + /** + * Contact ids to facilitate warm starting. + */ + class ContactID { + cf: ContactFeature; + /** + * Used to quickly compare contact ids. + */ + get key(): number; + set(o: ContactID): void; + } + /** + * The features that intersect to form the contact point. + */ + class ContactFeature { + /** + * Feature index on shapeA + */ + indexA: number; + /** + * Feature index on shapeB + */ + indexB: number; + /** + * The feature type on shapeA + */ + typeA: ContactFeatureType; + /** + * The feature type on shapeB + */ + typeB: ContactFeatureType; + set(o: ContactFeature): void; + } + /** + * This is used to compute the current state of a contact manifold. + */ + class WorldManifold { + /** + * World vector pointing from A to B + */ + normal: Vec2; + /** + * World contact point (point of intersection) + */ + points: Vec2[]; // [maxManifoldPoints] + /** + * A negative value indicates overlap, in meters + */ + separations: number[]; // [maxManifoldPoints] + } + /** + * Compute the point states given two manifolds. The states pertain to the + * transition from manifold1 to manifold2. So state1 is either persist or remove + * while state2 is either add or persist. + */ + function getPointStates(state1: PointState[], state2: PointState[], manifold1: Manifold, manifold2: Manifold): void; + /** + * Clipping for contact manifolds. Sutherland-Hodgman clipping. + */ + function clipSegmentToLine(vOut: ClipVertex[], vIn: ClipVertex[], normal: Vec2, offset: number, vertexIndexA: number): number; + /** + * A contact edge is used to connect bodies and contacts together in a contact + * graph where each body is a node and each contact is an edge. A contact edge + * belongs to a doubly linked list maintained in each attached body. Each + * contact has two contact nodes, one for each attached body. + * + * @prop {Contact} contact The contact + * @prop {ContactEdge} prev The previous contact edge in the body's contact list + * @prop {ContactEdge} next The next contact edge in the body's contact list + * @prop {Body} other Provides quick access to the other body attached. + */ + class ContactEdge { + contact: Contact; + prev: ContactEdge | undefined; + next: ContactEdge | undefined; + other: Body | undefined; + constructor(contact: Contact); + } + type EvaluateFunction = (manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number) => void; + type ContactCallback = (manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number) => void /* & { destroyFcn?: (contact: Contact) => void }*/; + /** + * Friction mixing law. The idea is to allow either fixture to drive the + * restitution to zero. For example, anything slides on ice. + */ + function mixFriction(friction1: number, friction2: number): number; + /** + * Restitution mixing law. The idea is allow for anything to bounce off an + * inelastic surface. For example, a superball bounces on anything. + */ + function mixRestitution(restitution1: number, restitution2: number): number; + // TODO: merge with ManifoldPoint? + class VelocityConstraintPoint { + rA: Vec2; + rB: Vec2; + normalImpulse: number; + tangentImpulse: number; + normalMass: number; + tangentMass: number; + velocityBias: number; + } + /** + * The class manages contact between two shapes. A contact exists for each + * overlapping AABB in the broad-phase (except if filtered). Therefore a contact + * object may exist that has no contact points. + */ + class Contact { + constructor(fA: Fixture, indexA: number, fB: Fixture, indexB: number, evaluateFcn: EvaluateFunction); + initConstraint(step: TimeStep): void; + /** + * Get the contact manifold. Do not modify the manifold unless you understand + * the internals of the library. + */ + getManifold(): Manifold; + /** + * Get the world manifold. + */ + getWorldManifold(worldManifold: WorldManifold | null | undefined): WorldManifold | undefined; + /** + * Enable/disable this contact. This can be used inside the pre-solve contact + * listener. The contact is only disabled for the current time step (or sub-step + * in continuous collisions). + */ + setEnabled(flag: boolean): void; + /** + * Has this contact been disabled? + */ + isEnabled(): boolean; + /** + * Is this contact touching? + */ + isTouching(): boolean; + /** + * Get the next contact in the world's contact list. + */ + getNext(): Contact | null; + /** + * Get fixture A in this contact. + */ + getFixtureA(): Fixture; + /** + * Get fixture B in this contact. + */ + getFixtureB(): Fixture; + /** + * Get the child primitive index for fixture A. + */ + getChildIndexA(): number; + /** + * Get the child primitive index for fixture B. + */ + getChildIndexB(): number; + /** + * Flag this contact for filtering. Filtering will occur the next time step. + */ + flagForFiltering(): void; + /** + * Override the default friction mixture. You can call this in + * ContactListener.preSolve. This value persists until set or reset. + */ + setFriction(friction: number): void; + /** + * Get the friction. + */ + getFriction(): number; + /** + * Reset the friction mixture to the default value. + */ + resetFriction(): void; + /** + * Override the default restitution mixture. You can call this in + * ContactListener.preSolve. The value persists until you set or reset. + */ + setRestitution(restitution: number): void; + /** + * Get the restitution. + */ + getRestitution(): number; + /** + * Reset the restitution to the default value. + */ + resetRestitution(): void; + /** + * Set the desired tangent speed for a conveyor belt behavior. In meters per + * second. + */ + setTangentSpeed(speed: number): void; + /** + * Get the desired tangent speed. In meters per second. + */ + getTangentSpeed(): number; + /** + * Called by Update method, and implemented by subclasses. + */ + evaluate(manifold: Manifold, xfA: Transform, xfB: Transform): void; + /** + * Updates the contact manifold and touching status. + * + * Note: do not assume the fixture AABBs are overlapping or are valid. + * + * @param listener.beginContact + * @param listener.endContact + * @param listener.preSolve + */ + update(listener?: { + beginContact(contact: Contact): void; + endContact(contact: Contact): void; + preSolve(contact: Contact, oldManifold: Manifold): void; + }): void; + solvePositionConstraint(step: TimeStep): number; + solvePositionConstraintTOI(step: TimeStep, toiA: Body, toiB: Body): number; + private _solvePositionConstraint; + initVelocityConstraint(step: TimeStep): void; + warmStartConstraint(step: TimeStep): void; + storeConstraintImpulses(step: TimeStep): void; + solveVelocityConstraint(step: TimeStep): void; + } + /** + * @prop gravity [{ x : 0, y : 0}] + * @prop allowSleep [true] + * @prop warmStarting [true] + * @prop continuousPhysics [true] + * @prop subStepping [false] + * @prop blockSolve [true] + * @prop velocityIterations [8] For the velocity constraint solver. + * @prop positionIterations [3] For the position constraint solver. + */ + interface WorldDef { + gravity?: Vec2; + allowSleep?: boolean; + warmStarting?: boolean; + continuousPhysics?: boolean; + subStepping?: boolean; + blockSolve?: boolean; + velocityIterations?: number; + positionIterations?: number; + } + /** + * Callback function for ray casts, see {@link World.rayCast}. + * + * Called for each fixture found in the query. You control how the ray cast + * proceeds by returning a float: return -1: ignore this fixture and continue + * return 0: terminate the ray cast return fraction: clip the ray to this point + * return 1: don't clip the ray and continue + * + * @param fixture The fixture hit by the ray + * @param point The point of initial intersection + * @param normal The normal vector at the point of intersection + * @param fraction + * + * @return -1 to filter, 0 to terminate, fraction to clip the ray for closest hit, 1 to continue + */ + type WorldRayCastCallback = (fixture: Fixture, point: Vec2, normal: Vec2, fraction: number) => number; + /** + * Called for each fixture found in the query AABB. It may return `false` to terminate the query. + */ + type WorldAABBQueryCallback = (fixture: Fixture) => boolean; + class World { + /** + * @param def World definition or gravity vector. + */ + constructor(def?: WorldDef | Vec2 | null); + /** + * Get the world body list. With the returned body, use Body.getNext to get the + * next body in the world list. A null body indicates the end of the list. + * + * @return the head of the world body list. + */ + getBodyList(): Body | null; + /** + * Get the world joint list. With the returned joint, use Joint.getNext to get + * the next joint in the world list. A null joint indicates the end of the list. + * + * @return the head of the world joint list. + */ + getJointList(): Joint | null; + /** + * Get the world contact list. With the returned contact, use Contact.getNext to + * get the next contact in the world list. A null contact indicates the end of + * the list. + * + * Warning: contacts are created and destroyed in the middle of a time step. + * Use ContactListener to avoid missing contacts. + * + * @return the head of the world contact list. + */ + getContactList(): Contact | null; + getBodyCount(): number; + getJointCount(): number; + /** + * Get the number of contacts (each may have 0 or more contact points). + */ + getContactCount(): number; + /** + * Change the global gravity vector. + */ + setGravity(gravity: Vec2): void; + /** + * Get the global gravity vector. + */ + getGravity(): Vec2; + /** + * Is the world locked (in the middle of a time step). + */ + isLocked(): boolean; + /** + * Enable/disable sleep. + */ + setAllowSleeping(flag: boolean): void; + getAllowSleeping(): boolean; + /** + * Enable/disable warm starting. For testing. + */ + setWarmStarting(flag: boolean): void; + getWarmStarting(): boolean; + /** + * Enable/disable continuous physics. For testing. + */ + setContinuousPhysics(flag: boolean): void; + getContinuousPhysics(): boolean; + /** + * Enable/disable single stepped continuous physics. For testing. + */ + setSubStepping(flag: boolean): void; + getSubStepping(): boolean; + /** + * Set flag to control automatic clearing of forces after each time step. + */ + setAutoClearForces(flag: boolean): void; + /** + * Get the flag that controls automatic clearing of forces after each time step. + */ + getAutoClearForces(): boolean; + /** + * Manually clear the force buffer on all bodies. By default, forces are cleared + * automatically after each call to step. The default behavior is modified by + * calling setAutoClearForces. The purpose of this function is to support + * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step + * under a variable frame-rate. When you perform sub-stepping you will disable + * auto clearing of forces and instead call clearForces after all sub-steps are + * complete in one pass of your game loop. + * + * See {@link World.setAutoClearForces} + */ + clearForces(): void; + /** + * Query the world for all fixtures that potentially overlap the provided AABB. + * + * @param aabb The query box. + * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query. + */ + queryAABB(aabb: AABB, callback: WorldAABBQueryCallback): void; + /** + * Ray-cast the world for all fixtures in the path of the ray. Your callback + * controls whether you get the closest point, any point, or n-points. The + * ray-cast ignores shapes that contain the starting point. + * + * @param point1 The ray starting point + * @param point2 The ray ending point + * @param callback A user implemented callback function. + */ + rayCast(point1: Vec2, point2: Vec2, callback: WorldRayCastCallback): void; + /** + * Get the number of broad-phase proxies. + */ + getProxyCount(): number; + /** + * Get the height of broad-phase dynamic tree. + */ + getTreeHeight(): number; + /** + * Get the balance of broad-phase dynamic tree. + */ + getTreeBalance(): number; + /** + * Get the quality metric of broad-phase dynamic tree. The smaller the better. + * The minimum is 1. + */ + getTreeQuality(): number; + /** + * Shift the world origin. Useful for large worlds. The body shift formula is: + * position -= newOrigin + * + * @param newOrigin The new origin with respect to the old origin + */ + shiftOrigin(newOrigin: Vec2): void; + /** + * Create a rigid body given a definition. No reference to the definition is + * retained. + * + * Warning: This function is locked during callbacks. + */ + createBody(def?: BodyDef): Body; + createBody(position: Vec2, angle?: number): Body; + createDynamicBody(def?: BodyDef): Body; + createDynamicBody(position: Vec2, angle?: number): Body; + createKinematicBody(def?: BodyDef): Body; + createKinematicBody(position: Vec2, angle?: number): Body; + /** + * Destroy a rigid body given a definition. No reference to the definition is + * retained. + * + * Warning: This automatically deletes all associated shapes and joints. + * + * Warning: This function is locked during callbacks. + */ + destroyBody(b: Body): boolean; + /** + * Create a joint to constrain bodies together. No reference to the definition + * is retained. This may cause the connected bodies to cease colliding. + * + * Warning: This function is locked during callbacks. + */ + createJoint(joint: T): T | null; + /** + * Destroy a joint. This may cause the connected bodies to begin colliding. + * Warning: This function is locked during callbacks. + */ + destroyJoint(joint: Joint): void; + /** + * Take a time step. This performs collision detection, integration, and + * constraint solution. + * + * Broad-phase, narrow-phase, solve and solve time of impacts. + * + * @param timeStep Time step, this should not vary. + */ + step(timeStep: number, velocityIterations?: number, positionIterations?: number): void; + /** + * Called when two fixtures begin to touch. + * + * Implement contact callbacks to get contact information. You can use these + * results for things like sounds and game logic. You can also get contact + * results by traversing the contact lists after the time step. However, you + * might miss some contacts because continuous physics leads to sub-stepping. + * Additionally you may receive multiple callbacks for the same contact in a + * single time step. You should strive to make your callbacks efficient because + * there may be many callbacks per time step. + * + * Warning: You cannot create/destroy world entities inside these callbacks. + */ + on(name: "begin-contact", listener: (contact: Contact) => void): World; + /** + * Called when two fixtures cease to touch. + * + * Implement contact callbacks to get contact information. You can use these + * results for things like sounds and game logic. You can also get contact + * results by traversing the contact lists after the time step. However, you + * might miss some contacts because continuous physics leads to sub-stepping. + * Additionally you may receive multiple callbacks for the same contact in a + * single time step. You should strive to make your callbacks efficient because + * there may be many callbacks per time step. + * + * Warning: You cannot create/destroy world entities inside these callbacks. + */ + on(name: "end-contact", listener: (contact: Contact) => void): World; + /** + * This is called after a contact is updated. This allows you to inspect a + * contact before it goes to the solver. If you are careful, you can modify the + * contact manifold (e.g. disable contact). A copy of the old manifold is + * provided so that you can detect changes. Note: this is called only for awake + * bodies. Note: this is called even when the number of contact points is zero. + * Note: this is not called for sensors. Note: if you set the number of contact + * points to zero, you will not get an endContact callback. However, you may get + * a beginContact callback the next step. + * + * Warning: You cannot create/destroy world entities inside these callbacks. + */ + on(name: "pre-solve", listener: (contact: Contact, oldManifold: Manifold) => void): World; + /** + * This lets you inspect a contact after the solver is finished. This is useful + * for inspecting impulses. Note: the contact manifold does not include time of + * impact impulses, which can be arbitrarily large if the sub-step is small. + * Hence the impulse is provided explicitly in a separate data structure. Note: + * this is only called for contacts that are touching, solid, and awake. + * + * Warning: You cannot create/destroy world entities inside these callbacks. + */ + on(name: "post-solve", listener: (contact: Contact, impulse: ContactImpulse) => void): World; + /** Listener is called whenever a body is removed. */ + on(name: "remove-body", listener: (body: Body) => void): World; + /** Listener is called whenever a joint is removed implicitly or explicitly. */ + on(name: "remove-joint", listener: (joint: Joint) => void): World; + /** Listener is called whenever a fixture is removed implicitly or explicitly. */ + on(name: "remove-fixture", listener: (fixture: Fixture) => void): World; + off(name: "begin-contact", listener: (contact: Contact) => void): World; + off(name: "end-contact", listener: (contact: Contact) => void): World; + off(name: "pre-solve", listener: (contact: Contact, oldManifold: Manifold) => void): World; + off(name: "post-solve", listener: (contact: Contact, impulse: ContactImpulse) => void): World; + off(name: "remove-body", listener: (body: Body) => void): World; + off(name: "remove-joint", listener: (joint: Joint) => void): World; + off(name: "remove-fixture", listener: (fixture: Fixture) => void): World; + publish(name: string, arg1?: any, arg2?: any, arg3?: any): number; + } + class TimeStep { + /** time step */ + dt: number; + /** inverse time step (0 if dt == 0) */ + inv_dt: number; + velocityIterations: number; + positionIterations: number; + warmStarting: boolean; + blockSolve: boolean; + /** timestep ratio for variable timestep */ + inv_dt0: number; + /** dt * inv_dt0 */ + dtRatio: number; + reset(dt: number): void; + } + /** + * Contact impulses for reporting. Impulses are used instead of forces because + * sub-step forces may approach infinity for rigid body collisions. These match + * up one-to-one with the contact points in Manifold. + */ + class ContactImpulse { + // TODO: merge with Contact class? + private readonly contact; + private readonly normals; + private readonly tangents; + constructor(contact: Contact); + get normalImpulses(): number[]; + get tangentImpulses(): number[]; + } + /** + * Finds and solves islands. An island is a connected subset of the world. + */ + class Solver { + m_world: World; + m_stack: Body[]; + m_bodies: Body[]; + m_contacts: Contact[]; + m_joints: Joint[]; + constructor(world: World); + clear(): void; + addBody(body: Body): void; + addContact(contact: Contact): void; + addJoint(joint: Joint): void; + solveWorld(step: TimeStep): void; + solveIsland(step: TimeStep): void; + /** + * Find TOI contacts and solve them. + */ + solveWorldTOI(step: TimeStep): void; + solveIslandTOI(subStep: TimeStep, toiA: Body, toiB: Body): void; + } + /** + * A joint edge is used to connect bodies and joints together in a joint graph + * where each body is a node and each joint is an edge. A joint edge belongs to + * a doubly linked list maintained in each attached body. Each joint has two + * joint nodes, one for each attached body. + */ + class JointEdge { + /** + * provides quick access to the other body attached. + */ + other: Body | null; + /** + * the joint + */ + joint: Joint | null; + /** + * prev the previous joint edge in the body's joint list + */ + prev: JointEdge | null; + /** + * the next joint edge in the body's joint list + */ + next: JointEdge | null; + } + /** + * Joint definitions are used to construct joints. + */ + interface JointOpt { + /** + * Use this to attach application specific data to your joints. + */ + userData?: any; + /** + * Set this flag to true if the attached bodies + * should collide. + */ + collideConnected?: boolean; + } + /** + * Joint definitions are used to construct joints. + */ + interface JointDef extends JointOpt { + /** + * The first attached body. + */ + bodyA: Body; + /** + * The second attached body. + */ + bodyB: Body; + } + /** + * The base joint class. Joints are used to constraint two bodies together in + * various fashions. Some joints also feature limits and motors. + */ + abstract class Joint { + constructor(def: JointDef); + constructor(def: JointOpt, bodyA: Body, bodyB: Body); + /** + * Short-cut function to determine if either body is inactive. + */ + isActive(): boolean; + /** + * Get the type of the concrete joint. + */ + getType(): string; + /** + * Get the first body attached to this joint. + */ + getBodyA(): Body; + /** + * Get the second body attached to this joint. + */ + getBodyB(): Body; + /** + * Get the next joint the world joint list. + */ + getNext(): Joint; + getUserData(): unknown; + setUserData(data: unknown): void; + /** + * Get collide connected. Note: modifying the collide connect flag won't work + * correctly because the flag is only checked when fixture AABBs begin to + * overlap. + */ + getCollideConnected(): boolean; + /** + * Get the anchor point on bodyA in world coordinates. + */ + abstract getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + abstract getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + abstract getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + abstract getReactionTorque(inv_dt: number): number; + /** + * Shift the origin for any points stored in world coordinates. + */ + shiftOrigin(newOrigin: Vec2): void; + abstract initVelocityConstraints(step: TimeStep): void; + abstract solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + abstract solvePositionConstraints(step: TimeStep): boolean; + } + type BodyType = "static" | "kinematic" | "dynamic"; + interface BodyDef { + /** + * Body types are static, kinematic, or dynamic. Note: if a dynamic + * body would have zero mass, the mass is set to one. + */ + type?: BodyType; + /** + * The world position of the body. Avoid creating bodies at the + * origin since this can lead to many overlapping shapes. + */ + position?: Vec2; + /** + * The world angle of the body in radians. + */ + angle?: number; + /** + * The linear velocity of the body's origin in world co-ordinates. + */ + linearVelocity?: Vec2; + angularVelocity?: number; + /** + * Linear damping is use to reduce the linear velocity. The + * damping parameter can be larger than 1.0 but the damping effect becomes + * sensitive to the time step when the damping parameter is large. + */ + linearDamping?: number; + /** + * Angular damping is use to reduce the angular velocity. + * The damping parameter can be larger than 1.0 but the damping effect + * becomes sensitive to the time step when the damping parameter is large. + */ + angularDamping?: number; + /** + * Should this body be prevented from rotating? Useful for characters. + */ + fixedRotation?: boolean; + /** + * Is this a fast moving body that should be prevented from + * tunneling through other moving bodies? Note that all bodies are + * prevented from tunneling through kinematic and static bodies. This + * setting is only considered on dynamic bodies. Warning: You should use + * this flag sparingly since it increases processing time. + */ + bullet?: boolean; + gravityScale?: number; + /** + * Set this flag to false if this body should never fall asleep. Note that this increases CPU usage. + */ + allowSleep?: boolean; + /** + * Is this body initially awake or sleeping? + */ + awake?: boolean; + /** + * Does this body start out active? + */ + active?: boolean; + userData?: any; + } + /** + * MassData This holds the mass data computed for a shape. + */ + class MassData { + /** The mass of the shape, usually in kilograms. */ + mass: number; + /** The position of the shape's centroid relative to the shape's origin. */ + center: Vec2; + /** The rotational inertia of the shape about the local origin. */ + I: number; + } + /** + * A rigid body composed of one or more fixtures. + * + * To create a new Body use {@link World.createBody}. + */ + class Body { + /** + * A static body does not move under simulation and behaves as if it has infinite mass. + * Internally, zero is stored for the mass and the inverse mass. + * Static bodies can be moved manually by the user. + * A static body has zero velocity. + * Static bodies do not collide with other static or kinematic bodies. + */ + static readonly STATIC: BodyType; + /** + * A kinematic body moves under simulation according to its velocity. + * Kinematic bodies do not respond to forces. + * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity. + * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass. + * Kinematic bodies do not collide with other kinematic or static bodies. + */ + static readonly KINEMATIC: BodyType; + /** + * A dynamic body is fully simulated. + * They can be moved manually by the user, but normally they move according to forces. + * A dynamic body can collide with all body types. + * A dynamic body always has finite, non-zero mass. + * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate. + */ + static readonly DYNAMIC: BodyType; + isWorldLocked(): boolean; + getWorld(): World; + getNext(): Body | null; + setUserData(data: any): void; + getUserData(): unknown; + getFixtureList(): Fixture | null; + getJointList(): JointEdge | null; + /** + * Warning: this list changes during the time step and you may miss some + * collisions if you don't use ContactListener. + */ + getContactList(): ContactEdge | null; + isStatic(): boolean; + isDynamic(): boolean; + isKinematic(): boolean; + /** + * This will alter the mass and velocity. + */ + setStatic(): Body; + setDynamic(): Body; + setKinematic(): Body; + isBullet(): boolean; + /** + * Should this body be treated like a bullet for continuous collision detection? + */ + setBullet(flag: boolean): void; + isSleepingAllowed(): boolean; + setSleepingAllowed(flag: boolean): void; + isAwake(): boolean; + /** + * Set the sleep state of the body. A sleeping body has very low CPU cost. + * + * @param flag Set to true to wake the body, false to put it to sleep. + */ + setAwake(flag: boolean): void; + isActive(): boolean; + /** + * Set the active state of the body. An inactive body is not simulated and + * cannot be collided with or woken up. If you pass a flag of true, all fixtures + * will be added to the broad-phase. If you pass a flag of false, all fixtures + * will be removed from the broad-phase and all contacts will be destroyed. + * Fixtures and joints are otherwise unaffected. + * + * You may continue to create/destroy fixtures and joints on inactive bodies. + * Fixtures on an inactive body are implicitly inactive and will not participate + * in collisions, ray-casts, or queries. Joints connected to an inactive body + * are implicitly inactive. An inactive body is still owned by a World object + * and remains + */ + setActive(flag: boolean): void; + isFixedRotation(): boolean; + /** + * Set this body to have fixed rotation. This causes the mass to be reset. + */ + setFixedRotation(flag: boolean): void; + /** + * Get the world transform for the body's origin. + */ + getTransform(): Transform; + /** + * Set the position of the body's origin and rotation. Manipulating a body's + * transform may cause non-physical behavior. Note: contacts are updated on the + * next call to World.step. + * + * @param position The world position of the body's local origin. + * @param angle The world rotation in radians. + */ + setTransform(position: Vec2, angle: number): void; + synchronizeTransform(): void; + /** + * Update fixtures in broad-phase. + */ + synchronizeFixtures(): void; + /** + * Used in TOI. + */ + advance(alpha: number): void; + /** + * Get the world position for the body's origin. + */ + getPosition(): Vec2; + setPosition(p: Vec2): void; + /** + * Get the current world rotation angle in radians. + */ + getAngle(): number; + setAngle(angle: number): void; + /** + * Get the world position of the center of mass. + */ + getWorldCenter(): Vec2; + /** + * Get the local position of the center of mass. + */ + getLocalCenter(): Vec2; + /** + * Get the linear velocity of the center of mass. + * + * @return the linear velocity of the center of mass. + */ + getLinearVelocity(): Vec2; + /** + * Get the world linear velocity of a world point attached to this body. + * + * @param worldPoint A point in world coordinates. + */ + getLinearVelocityFromWorldPoint(worldPoint: Vec2): Vec2; + /** + * Get the world velocity of a local point. + * + * @param localPoint A point in local coordinates. + */ + getLinearVelocityFromLocalPoint(localPoint: Vec2): Vec2; + /** + * Set the linear velocity of the center of mass. + * + * @param v The new linear velocity of the center of mass. + */ + setLinearVelocity(v: Vec2): void; + /** + * Get the angular velocity. + * + * @returns the angular velocity in radians/second. + */ + getAngularVelocity(): number; + /** + * Set the angular velocity. + * + * @param omega The new angular velocity in radians/second. + */ + setAngularVelocity(w: number): void; + getLinearDamping(): number; + setLinearDamping(linearDamping: number): void; + getAngularDamping(): number; + setAngularDamping(angularDamping: number): void; + getGravityScale(): number; + /** + * Scale the gravity applied to this body. + */ + setGravityScale(scale: number): void; + /** + * Get the total mass of the body. + * + * @returns The mass, usually in kilograms (kg). + */ + getMass(): number; + /** + * Get the rotational inertia of the body about the local origin. + * + * @return the rotational inertia, usually in kg-m^2. + */ + getInertia(): number; + /** + * Copy the mass data of the body to data. + */ + getMassData(data: MassData): void; + /** + * This resets the mass properties to the sum of the mass properties of the + * fixtures. This normally does not need to be called unless you called + * SetMassData to override the mass and you later want to reset the mass. + */ + resetMassData(): void; + /** + * Set the mass properties to override the mass properties of the fixtures. Note + * that this changes the center of mass position. Note that creating or + * destroying fixtures can also alter the mass. This function has no effect if + * the body isn't dynamic. + * + * @param massData The mass properties. + */ + setMassData(massData: MassData): void; + /** + * Apply a force at a world point. If the force is not applied at the center of + * mass, it will generate a torque and affect the angular velocity. This wakes + * up the body. + * + * @param force The world force vector, usually in Newtons (N). + * @param point The world position of the point of application. + * @param wake Also wake up the body + */ + applyForce(force: Vec2, point: Vec2, wake?: boolean): void; + /** + * Apply a force to the center of mass. This wakes up the body. + * + * @param force The world force vector, usually in Newtons (N). + * @param wake Also wake up the body + */ + applyForceToCenter(force: Vec2, wake?: boolean): void; + /** + * Apply a torque. This affects the angular velocity without affecting the + * linear velocity of the center of mass. This wakes up the body. + * + * @param torque About the z-axis (out of the screen), usually in N-m. + * @param wake Also wake up the body + */ + applyTorque(torque: number, wake?: boolean): void; + /** + * Apply an impulse at a point. This immediately modifies the velocity. It also + * modifies the angular velocity if the point of application is not at the + * center of mass. This wakes up the body. + * + * @param impulse The world impulse vector, usually in N-seconds or kg-m/s. + * @param point The world position of the point of application. + * @param wake Also wake up the body + */ + applyLinearImpulse(impulse: Vec2, point: Vec2, wake?: boolean): void; + /** + * Apply an angular impulse. + * + * @param impulse The angular impulse in units of kg*m*m/s + * @param wake Also wake up the body + */ + applyAngularImpulse(impulse: number, wake?: boolean): void; + /** + * This is used to prevent connected bodies (by joints) from colliding, + * depending on the joint's collideConnected flag. + */ + shouldCollide(that: Body): boolean; + /** + * Creates a fixture and attach it to this body. + * + * If the density is non-zero, this function automatically updates the mass of + * the body. + * + * Contacts are not created until the next time step. + * + * Warning: This function is locked during callbacks. + */ + createFixture(def: FixtureDef): Fixture; + createFixture(shape: Shape, opt?: FixtureOpt): Fixture; + createFixture(shape: Shape, density?: number): Fixture; + /** + * Destroy a fixture. This removes the fixture from the broad-phase and destroys + * all contacts associated with this fixture. This will automatically adjust the + * mass of the body if the body is dynamic and the fixture has positive density. + * All fixtures attached to a body are implicitly destroyed when the body is + * destroyed. + * + * Warning: This function is locked during callbacks. + * + * @param fixture The fixture to be removed. + */ + destroyFixture(fixture: Fixture): void; + /** + * Get the corresponding world point of a local point. + */ + getWorldPoint(localPoint: Vec2): Vec2; + /** + * Get the corresponding world vector of a local vector. + */ + getWorldVector(localVector: Vec2): Vec2; + /** + * Gets the corresponding local point of a world point. + */ + getLocalPoint(worldPoint: Vec2Value): Vec2; + /** + * Gets the corresponding local vector of a world vector. + */ + getLocalVector(worldVector: Vec2Value): Vec2; + } + /** + * Input for Distance. You have to option to use the shape radii in the + * computation. Even + */ + class DistanceInput { + proxyA: DistanceProxy; + proxyB: DistanceProxy; + transformA: Transform | null; + transformB: Transform | null; + useRadii: boolean; + } + /** + * Output for Distance. + * + * @prop {Vec2} pointA closest point on shapeA + * @prop {Vec2} pointB closest point on shapeB + * @prop distance + * @prop iterations number of GJK iterations used + */ + class DistanceOutput { + pointA: Vec2; + pointB: Vec2; + distance: number; + iterations: number; + } + /** + * Used to warm start Distance. Set count to zero on first call. + * + * @prop {number} metric length or area + * @prop {array} indexA vertices on shape A + * @prop {array} indexB vertices on shape B + * @prop {number} count + */ + class SimplexCache { + metric: number; + indexA: number[]; + indexB: number[]; + count: number; + } + /** + * Compute the closest points between two shapes. Supports any combination of: + * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On + * the first call set SimplexCache.count to zero. + */ + const Distance: { + (output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void; + testOverlap: (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform) => boolean; + Input: typeof DistanceInput; + Output: typeof DistanceOutput; + Proxy: typeof DistanceProxy; + Cache: typeof SimplexCache; + }; + /** + * A distance proxy is used by the GJK algorithm. It encapsulates any shape. + */ + class DistanceProxy { + /** internal */ m_buffer: Vec2[]; + /** internal */ m_vertices: Vec2[]; + /** internal */ m_count: number; + /** internal */ m_radius: number; + constructor(); + /** + * Get the vertex count. + */ + getVertexCount(): number; + /** + * Get a vertex by index. Used by Distance. + */ + getVertex(index: number): Vec2; + /** + * Get the supporting vertex index in the given direction. + */ + getSupport(d: Vec2): number; + /** + * Get the supporting vertex in the given direction. + */ + getSupportVertex(d: Vec2): Vec2; + /** + * Initialize the proxy using the given shape. The shape must remain in scope + * while the proxy is in use. + */ + set(shape: Shape, index: number): void; + } + /** + * Determine if two generic shapes overlap. + */ + const testOverlap: (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform) => boolean; + // todo make shape an interface + /** + * A shape is used for collision detection. You can create a shape however you + * like. Shapes used for simulation in World are created automatically when a + * Fixture is created. Shapes may encapsulate one or more child shapes. + */ + abstract class Shape { + m_type: ShapeType; + m_radius: number; + static isValid(obj: any): boolean; + abstract getRadius(): number; + /** + * Get the type of this shape. You can use this to down cast to the concrete + * shape. + * + * @return the shape type. + */ + abstract getType(): ShapeType; + /** + * Get the number of child primitives. + */ + abstract getChildCount(): number; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + abstract testPoint(xf: Transform, p: Vec2Value): boolean; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + abstract rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + abstract computeAABB(aabb: AABB, xf: Transform, childIndex: number): void; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + abstract computeMass(massData: MassData, density?: number): void; + abstract computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void; + } + type ShapeType = "circle" | "edge" | "polygon" | "chain"; + class CircleShape extends Shape { + static TYPE: "circle"; + m_type: "circle"; + m_p: Vec2; + m_radius: number; + constructor(position: Vec2Value, radius?: number); + constructor(radius?: number); + getType(): "circle"; + getRadius(): number; + getCenter(): Vec2; + getVertex(index: 0): Vec2; + /** + * Get the number of child primitives. + */ + getChildCount(): 1; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + testPoint(xf: Transform, p: Vec2Value): boolean; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + computeAABB(aabb: AABB, xf: Transform, childIndex: number): void; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + computeMass(massData: MassData, density: number): void; + computeDistanceProxy(proxy: DistanceProxy): void; + } + const Circle: typeof CircleShape; + /** + * A line segment (edge) shape. These can be connected in chains or loops to + * other edge shapes. The connectivity information is used to ensure correct + * contact normals. + */ + class EdgeShape extends Shape { + static TYPE: "edge"; + m_type: "edge"; + m_radius: number; + // These are the edge vertices + m_vertex1: Vec2; + m_vertex2: Vec2; + // Optional adjacent vertices. These are used for smooth collision. + // Used by chain shape. + m_vertex0: Vec2; + m_vertex3: Vec2; + m_hasVertex0: boolean; + m_hasVertex3: boolean; + constructor(v1?: Vec2Value, v2?: Vec2Value); + getRadius(): number; + getType(): "edge"; + /** + * Optional next vertex, used for smooth collision. + */ + setNextVertex(v?: Vec2): EdgeShape; + /** + * Optional next vertex, used for smooth collision. + */ + getNextVertex(): Vec2; + /** + * Optional prev vertex, used for smooth collision. + */ + setPrevVertex(v?: Vec2): EdgeShape; + /** + * Optional prev vertex, used for smooth collision. + */ + getPrevVertex(): Vec2; + /** + * Set this as an isolated edge. + */ + _set(v1: Vec2, v2: Vec2): EdgeShape; + /** + * Get the number of child primitives. + */ + getChildCount(): 1; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + testPoint(xf: Transform, p: Vec2Value): false; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + computeAABB(aabb: AABB, xf: Transform, childIndex: number): void; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + computeMass(massData: MassData, density?: number): void; + computeDistanceProxy(proxy: DistanceProxy): void; + } + const Edge: typeof EdgeShape; + /** + * A convex polygon. It is assumed that the interior of the polygon is to the + * left of each edge. Polygons have a maximum number of vertices equal to + * Settings.maxPolygonVertices. In most cases you should not need many vertices + * for a convex polygon. extends Shape + */ + class PolygonShape extends Shape { + static TYPE: "polygon"; + m_type: "polygon"; + m_centroid: Vec2; + m_vertices: Vec2[]; // [Settings.maxPolygonVertices] + m_normals: Vec2[]; // [Settings.maxPolygonVertices] + m_count: number; + m_radius: number; + // @ts-ignore + constructor(vertices?: Vec2Value[]); + getType(): "polygon"; + getRadius(): number; + getVertex(index: number): Vec2; + /** + * Get the number of child primitives. + */ + getChildCount(): 1; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + testPoint(xf: Transform, p: Vec2): boolean; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + computeAABB(aabb: AABB, xf: Transform, childIndex: number): void; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + computeMass(massData: MassData, density: number): void; + /** + * Validate convexity. This is a very time consuming operation. + * @returns true if valid + */ + validate(): boolean; + computeDistanceProxy(proxy: DistanceProxy): void; + } + const Polygon: typeof PolygonShape; + /** + * A chain shape is a free form sequence of line segments. The chain has + * two-sided collision, so you can use inside and outside collision. Therefore, + * you may use any winding order. Connectivity information is used to create + * smooth collisions. + * + * WARNING: The chain will not collide properly if there are self-intersections. + */ + class ChainShape extends Shape { + static TYPE: "chain"; + m_type: "chain"; + m_radius: number; + m_vertices: Vec2[]; + m_count: number; + m_prevVertex: Vec2 | null; + m_nextVertex: Vec2 | null; + m_hasPrevVertex: boolean; + m_hasNextVertex: boolean; + m_isLoop: boolean; + constructor(vertices?: Vec2Value[], loop?: boolean); + // clear() { + // this.m_vertices.length = 0; + // this.m_count = 0; + // } + getType(): "chain"; + getRadius(): number; + /** + * Establish connectivity to a vertex that precedes the first vertex. Don't call + * this for loops. + */ + setPrevVertex(prevVertex: Vec2): void; + getPrevVertex(): Vec2; + /** + * Establish connectivity to a vertex that follows the last vertex. Don't call + * this for loops. + */ + setNextVertex(nextVertex: Vec2): void; + getNextVertex(): Vec2; + /** + * Get the number of child primitives. + */ + getChildCount(): number; + // Get a child edge. + getChildEdge(edge: EdgeShape, childIndex: number): void; + getVertex(index: number): Vec2; + isLoop(): boolean; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * This always return false. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + testPoint(xf: Transform, p: Vec2Value): false; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + computeAABB(aabb: AABB, xf: Transform, childIndex: number): void; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * Chains have zero mass. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + computeMass(massData: MassData, density?: number): void; + computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void; + } + const Chain: typeof ChainShape; + /** + * A rectangle polygon which extend PolygonShape. + */ + class BoxShape extends PolygonShape { + static TYPE: "polygon"; + constructor(hx: number, hy: number, center?: Vec2Value, angle?: number); + } + const Box: typeof BoxShape; + const CollideCircles: (manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform) => void; + // Compute contact points for edge versus circle. + // This accounts for edge connectivity. + const CollideEdgeCircle: (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform) => void; + /** + * + * Find edge normal of max separation on A - return if separating axis is found
+ * Find edge normal of max separation on B - return if separation axis is found
+ * Choose reference edge as min(minA, minB)
+ * Find incident edge
+ * Clip + * + * The normal points from 1 to 2 + */ + const CollidePolygons: (manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform) => void; + const CollidePolygonCircle: (manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform) => void; + /** + * This function collides and edge and a polygon, taking into account edge + * adjacency. + */ + const CollideEdgePolygon: (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform) => void; + /** + * Distance joint definition. This requires defining an anchor point on both + * bodies and the non-zero length of the distance joint. The definition uses + * local anchor points so that the initial configuration can violate the + * constraint slightly. This helps when saving and loading a game. Warning: Do + * not use a zero or short length. + */ + interface DistanceJointOpt extends JointOpt { + /** + * The mass-spring-damper frequency in Hertz. A value of 0 disables softness. + */ + frequencyHz?: number; + /** + * The damping ratio. 0 = no damping, 1 = critical damping. + */ + dampingRatio?: number; + /** + * Distance length. + */ + length?: number; + } + /** + * Distance joint definition. This requires defining an anchor point on both + * bodies and the non-zero length of the distance joint. The definition uses + * local anchor points so that the initial configuration can violate the + * constraint slightly. This helps when saving and loading a game. Warning: Do + * not use a zero or short length. + */ + interface DistanceJointDef extends JointDef, DistanceJointOpt { + /** + * The local anchor point relative to bodyA's origin. + */ + localAnchorA: Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + localAnchorB: Vec2; + } + /** + * A distance joint constrains two points on two bodies to remain at a fixed + * distance from each other. You can view this as a massless, rigid rod. + * + * @param anchorA Anchor A in global coordination. + * @param anchorB Anchor B in global coordination. + */ + class DistanceJoint extends Joint { + static TYPE: "distance-joint"; + constructor(def: DistanceJointDef); + constructor(def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2); + /** + * The local anchor point relative to bodyA's origin. + */ + getLocalAnchorA(): Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + getLocalAnchorB(): Vec2; + /** + * Set the natural length. Manipulating the length can lead to non-physical + * behavior when the frequency is zero. + */ + setLength(length: number): void; + /** + * Get the natural length. + */ + getLength(): number; + setFrequency(hz: number): void; + getFrequency(): number; + setDampingRatio(ratio: number): void; + getDampingRatio(): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Friction joint definition. + */ + interface FrictionJointOpt extends JointOpt { + /** + * The maximum friction force in N. + */ + maxForce?: number; + /** + * The maximum friction torque in N-m. + */ + maxTorque?: number; + } + /** + * Friction joint definition. + */ + interface FrictionJointDef extends JointDef, FrictionJointOpt { + /** + * The local anchor point relative to bodyA's origin. + */ + localAnchorA: Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + localAnchorB: Vec2; + } + /** + * Friction joint. This is used for top-down friction. It provides 2D + * translational friction and angular friction. + * + * @param anchor Anchor in global coordination. + */ + class FrictionJoint extends Joint { + static TYPE: "friction-joint"; + constructor(def: FrictionJointDef); + constructor(def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); + /** + * The local anchor point relative to bodyA's origin. + */ + getLocalAnchorA(): Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + getLocalAnchorB(): Vec2; + /** + * Set the maximum friction force in N. + */ + setMaxForce(force: number): void; + /** + * Get the maximum friction force in N. + */ + getMaxForce(): number; + /** + * Set the maximum friction torque in N*m. + */ + setMaxTorque(torque: number): void; + /** + * Get the maximum friction torque in N*m. + */ + getMaxTorque(): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Revolute joint definition. This requires defining an anchor point where the + * bodies are joined. The definition uses local anchor points so that the + * initial configuration can violate the constraint slightly. You also need to + * specify the initial relative angle for joint limits. This helps when saving + * and loading a game. + * + * The local anchor points are measured from the body's origin rather than the + * center of mass because: 1. you might not know where the center of mass will + * be. 2. if you add/remove shapes from a body and recompute the mass, the + * joints will be broken. + */ + interface RevoluteJointOpt extends JointOpt { + /** + * The lower angle for the joint limit (radians). + */ + lowerAngle?: number; + /** + * The upper angle for the joint limit (radians). + */ + upperAngle?: number; + /** + * The maximum motor torque used to achieve the desired motor speed. Usually + * in N-m. + */ + maxMotorTorque?: number; + /** + * The desired motor speed. Usually in radians per second. + */ + motorSpeed?: number; + /** + * A flag to enable joint limits. + */ + enableLimit?: boolean; + /** + * A flag to enable the joint motor. + */ + enableMotor?: boolean; + } + /** + * Revolute joint definition. This requires defining an anchor point where the + * bodies are joined. The definition uses local anchor points so that the + * initial configuration can violate the constraint slightly. You also need to + * specify the initial relative angle for joint limits. This helps when saving + * and loading a game. + * + * The local anchor points are measured from the body's origin rather than the + * center of mass because: 1. you might not know where the center of mass will + * be. 2. if you add/remove shapes from a body and recompute the mass, the + * joints will be broken. + */ + interface RevoluteJointDef extends JointDef, RevoluteJointOpt { + /** + * The local anchor point relative to bodyA's origin. + */ + localAnchorA: Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + localAnchorB: Vec2; + /** + * The bodyB angle minus bodyA angle in the reference state (radians). + */ + referenceAngle: number; + } + /** + * A revolute joint constrains two bodies to share a common point while they are + * free to rotate about the point. The relative rotation about the shared point + * is the joint angle. You can limit the relative rotation with a joint limit + * that specifies a lower and upper angle. You can use a motor to drive the + * relative rotation about the shared point. A maximum motor torque is provided + * so that infinite forces are not generated. + */ + class RevoluteJoint extends Joint { + static TYPE: "revolute-joint"; + // TODO enum + constructor(def: RevoluteJointDef); + constructor(def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); + /** + * The local anchor point relative to bodyA's origin. + */ + getLocalAnchorA(): Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + getLocalAnchorB(): Vec2; + /** + * Get the reference angle. + */ + getReferenceAngle(): number; + /** + * Get the current joint angle in radians. + */ + getJointAngle(): number; + /** + * Get the current joint angle speed in radians per second. + */ + getJointSpeed(): number; + /** + * Is the joint motor enabled? + */ + isMotorEnabled(): boolean; + /** + * Enable/disable the joint motor. + */ + enableMotor(flag: boolean): void; + /** + * Get the current motor torque given the inverse time step. Unit is N*m. + */ + getMotorTorque(inv_dt: number): number; + /** + * Set the motor speed in radians per second. + */ + setMotorSpeed(speed: number): void; + /** + * Get the motor speed in radians per second. + */ + getMotorSpeed(): number; + /** + * Set the maximum motor torque, usually in N-m. + */ + setMaxMotorTorque(torque: number): void; + getMaxMotorTorque(): number; + /** + * Is the joint limit enabled? + */ + isLimitEnabled(): boolean; + /** + * Enable/disable the joint limit. + */ + enableLimit(flag: boolean): void; + /** + * Get the lower joint limit in radians. + */ + getLowerLimit(): number; + /** + * Get the upper joint limit in radians. + */ + getUpperLimit(): number; + /** + * Set the joint limits in radians. + */ + setLimits(lower: number, upper: number): void; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force given the inverse time step. Unit is N. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque due to the joint limit given the inverse time step. + * Unit is N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Prismatic joint definition. This requires defining a line of motion using an + * axis and an anchor point. The definition uses local anchor points and a local + * axis so that the initial configuration can violate the constraint slightly. + * The joint translation is zero when the local anchor points coincide in world + * space. Using local anchors and a local axis helps when saving and loading a + * game. + */ + interface PrismaticJointOpt extends JointOpt { + /** + * Enable/disable the joint limit. + */ + enableLimit?: boolean; + /** + * The lower translation limit, usually in meters. + */ + lowerTranslation?: number; + /** + * The upper translation limit, usually in meters. + */ + upperTranslation?: number; + /** + * Enable/disable the joint motor. + */ + enableMotor?: boolean; + /** + * The maximum motor torque, usually in N-m. + */ + maxMotorForce?: number; + /** + * The desired motor speed in radians per second. + */ + motorSpeed?: number; + } + /** + * Prismatic joint definition. This requires defining a line of motion using an + * axis and an anchor point. The definition uses local anchor points and a local + * axis so that the initial configuration can violate the constraint slightly. + * The joint translation is zero when the local anchor points coincide in world + * space. Using local anchors and a local axis helps when saving and loading a + * game. + */ + interface PrismaticJointDef extends JointDef, PrismaticJointOpt { + /** + * The local anchor point relative to bodyA's origin. + */ + localAnchorA: Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + localAnchorB: Vec2; + /** + * The local translation unit axis in bodyA. + */ + localAxisA: Vec2; + /** + * referenceAngle The constrained angle between the bodies: + * bodyB_angle - bodyA_angle. + */ + referenceAngle: number; + } + /** + * A prismatic joint. This joint provides one degree of freedom: translation + * along an axis fixed in bodyA. Relative rotation is prevented. You can use a + * joint limit to restrict the range of motion and a joint motor to drive the + * motion or to model joint friction. + */ + class PrismaticJoint extends Joint { + static TYPE: "prismatic-joint"; + constructor(def: PrismaticJointDef); + constructor(def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2); + /** + * The local anchor point relative to bodyA's origin. + */ + getLocalAnchorA(): Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + getLocalAnchorB(): Vec2; + /** + * The local joint axis relative to bodyA. + */ + getLocalAxisA(): Vec2; + /** + * Get the reference angle. + */ + getReferenceAngle(): number; + /** + * Get the current joint translation, usually in meters. + */ + getJointTranslation(): number; + /** + * Get the current joint translation speed, usually in meters per second. + */ + getJointSpeed(): number; + /** + * Is the joint limit enabled? + */ + isLimitEnabled(): boolean; + /** + * Enable/disable the joint limit. + */ + enableLimit(flag: boolean): void; + /** + * Get the lower joint limit, usually in meters. + */ + getLowerLimit(): number; + /** + * Get the upper joint limit, usually in meters. + */ + getUpperLimit(): number; + /** + * Set the joint limits, usually in meters. + */ + setLimits(lower: number, upper: number): void; + /** + * Is the joint motor enabled? + */ + isMotorEnabled(): boolean; + /** + * Enable/disable the joint motor. + */ + enableMotor(flag: boolean): void; + /** + * Set the motor speed, usually in meters per second. + */ + setMotorSpeed(speed: number): void; + /** + * Set the maximum motor force, usually in N. + */ + setMaxMotorForce(force: number): void; + getMaxMotorForce(): number; + /** + * Get the motor speed, usually in meters per second. + */ + getMotorSpeed(): number; + /** + * Get the current motor force given the inverse time step, usually in N. + */ + getMotorForce(inv_dt: number): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Gear joint definition. + */ + interface GearJointOpt extends JointOpt { + /** + * The gear ratio. See {@link GearJoint} for explanation. + */ + ratio?: number; + } + /** + * Gear joint definition. + */ + interface GearJointDef extends JointDef, GearJointOpt { + /** + * The first revolute/prismatic joint attached to the gear joint. + */ + joint1: RevoluteJoint | PrismaticJoint; + /** + * The second prismatic/revolute joint attached to the gear joint. + */ + joint2: RevoluteJoint | PrismaticJoint; + } + /** + * A gear joint is used to connect two joints together. Either joint can be a + * revolute or prismatic joint. You specify a gear ratio to bind the motions + * together: coordinate1 + ratio * coordinate2 = constant + * + * The ratio can be negative or positive. If one joint is a revolute joint and + * the other joint is a prismatic joint, then the ratio will have units of + * length or units of 1/length. Warning: You have to manually destroy the gear + * joint if joint1 or joint2 is destroyed. + * + * This definition requires two existing revolute or prismatic joints (any + * combination will work). + */ + class GearJoint extends Joint { + static TYPE: "gear-joint"; + constructor(def: GearJointDef); + constructor(def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number); + /** + * Get the first joint. + */ + getJoint1(): Joint; + /** + * Get the second joint. + */ + getJoint2(): Joint; + /** + * Set the gear ratio. + */ + setRatio(ratio: number): void; + /** + * Get the gear ratio. + */ + getRatio(): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Motor joint definition. + */ + interface MotorJointOpt extends JointOpt { + /** + * The bodyB angle minus bodyA angle in radians. + */ + angularOffset?: number; + /** + * The maximum motor force in N. + */ + maxForce?: number; + /** + * The maximum motor torque in N-m. + */ + maxTorque?: number; + /** + * Position correction factor in the range [0,1]. + */ + correctionFactor?: number; + /** + * Position of bodyB minus the position of bodyA, in bodyA's frame, in meters. + */ + linearOffset?: Vec2; + } + /** + * Motor joint definition. + */ + interface MotorJointDef extends JointDef, MotorJointOpt { + } + /** + * A motor joint is used to control the relative motion between two bodies. A + * typical usage is to control the movement of a dynamic body with respect to + * the ground. + */ + class MotorJoint extends Joint { + static TYPE: "motor-joint"; + constructor(def: MotorJointDef); + constructor(def: MotorJointOpt, bodyA: Body, bodyB: Body); + /** + * Set the maximum friction force in N. + */ + setMaxForce(force: number): void; + /** + * Get the maximum friction force in N. + */ + getMaxForce(): number; + /** + * Set the maximum friction torque in N*m. + */ + setMaxTorque(torque: number): void; + /** + * Get the maximum friction torque in N*m. + */ + getMaxTorque(): number; + /** + * Set the position correction factor in the range [0,1]. + */ + setCorrectionFactor(factor: number): void; + /** + * Get the position correction factor in the range [0,1]. + */ + getCorrectionFactor(): number; + /** + * Set/get the target linear offset, in frame A, in meters. + */ + setLinearOffset(linearOffset: Vec2): void; + getLinearOffset(): Vec2; + /** + * Set/get the target angular offset, in radians. + */ + setAngularOffset(angularOffset: number): void; + getAngularOffset(): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Mouse joint definition. This requires a world target point, tuning + * parameters, and the time step. + */ + interface MouseJointOpt extends JointOpt { + /** + * [maxForce = 0.0] The maximum constraint force that can be exerted to move + * the candidate body. Usually you will express as some multiple of the + * weight (multiplier * mass * gravity). + */ + maxForce?: number; + /** + * [frequencyHz = 5.0] The response speed. + */ + frequencyHz?: number; + /** + * [dampingRatio = 0.7] The damping ratio. 0 = no damping, 1 = critical + * damping. + */ + dampingRatio?: number; + } + /** + * Mouse joint definition. This requires a world target point, tuning + * parameters, and the time step. + */ + interface MouseJointDef extends JointDef, MouseJointOpt { + /** + * The initial world target point. This is assumed to coincide with the body + * anchor initially. + */ + target: Vec2Value; + } + /** + * A mouse joint is used to make a point on a body track a specified world + * point. This a soft constraint with a maximum force. This allows the + * constraint to stretch and without applying huge forces. + * + * NOTE: this joint is not documented in the manual because it was developed to + * be used in the testbed. If you want to learn how to use the mouse joint, look + * at the testbed. + */ + class MouseJoint extends Joint { + static TYPE: "mouse-joint"; + constructor(def: MouseJointDef); + constructor(def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2); + /** + * Use this to update the target point. + */ + setTarget(target: Vec2Value): void; + getTarget(): Vec2; + /** + * Set the maximum force in Newtons. + */ + setMaxForce(force: number): void; + /** + * Get the maximum force in Newtons. + */ + getMaxForce(): number; + /** + * Set the frequency in Hertz. + */ + setFrequency(hz: number): void; + /** + * Get the frequency in Hertz. + */ + getFrequency(): number; + /** + * Set the damping ratio (dimensionless). + */ + setDampingRatio(ratio: number): void; + /** + * Get the damping ratio (dimensionless). + */ + getDampingRatio(): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + /** + * Shift the origin for any points stored in world coordinates. + */ + shiftOrigin(newOrigin: Vec2Value): void; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Pulley joint definition. This requires two ground anchors, two dynamic body + * anchor points, and a pulley ratio. + */ + // tslint:disable-next-line:no-empty-interface + interface PulleyJointOpt extends JointOpt { + } + /** + * Pulley joint definition. This requires two ground anchors, two dynamic body + * anchor points, and a pulley ratio. + */ + interface PulleyJointDef extends JointDef, PulleyJointOpt { + /** + * The first ground anchor in world coordinates. This point never moves. + */ + groundAnchorA: Vec2; + /** + * The second ground anchor in world coordinates. This point never moves. + */ + groundAnchorB: Vec2; + /** + * The local anchor point relative to bodyA's origin. + */ + localAnchorA: Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + localAnchorB: Vec2; + /** + * The reference length for the segment attached to bodyA. + */ + lengthA: number; + /** + * The reference length for the segment attached to bodyB. + */ + lengthB: number; + /** + * The pulley ratio, used to simulate a block-and-tackle. + */ + ratio: number; + } + /** + * The pulley joint is connected to two bodies and two fixed ground points. The + * pulley supports a ratio such that: length1 + ratio * length2 <= constant + * + * Yes, the force transmitted is scaled by the ratio. + * + * Warning: the pulley joint can get a bit squirrelly by itself. They often work + * better when combined with prismatic joints. You should also cover the the + * anchor points with static shapes to prevent one side from going to zero + * length. + */ + class PulleyJoint extends Joint { + static TYPE: "pulley-joint"; + constructor(def: PulleyJointDef); + constructor(def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number); + _serialize(): object; + /** + * Get the first ground anchor. + */ + getGroundAnchorA(): Vec2; + /** + * Get the second ground anchor. + */ + getGroundAnchorB(): Vec2; + /** + * Get the current length of the segment attached to bodyA. + */ + getLengthA(): number; + /** + * Get the current length of the segment attached to bodyB. + */ + getLengthB(): number; + /** + * Get the pulley ratio. + */ + getRatio(): number; + /** + * Get the current length of the segment attached to bodyA. + */ + getCurrentLengthA(): number; + /** + * Get the current length of the segment attached to bodyB. + */ + getCurrentLengthB(): number; + /** + * Shift the origin for any points stored in world coordinates. + * + * @param newOrigin + */ + shiftOrigin(newOrigin: Vec2): void; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Rope joint definition. This requires two body anchor points and a maximum + * lengths. Note: by default the connected objects will not collide. see + * collideConnected in JointDef. + */ + interface RopeJointOpt extends JointOpt { + /** + * The maximum length of the rope. + * Warning: this must be larger than linearSlop or the joint will have no effect. + */ + maxLength?: number; + } + /** + * Rope joint definition. This requires two body anchor points and a maximum + * lengths. Note: by default the connected objects will not collide. see + * collideConnected in JointDef. + */ + interface RopeJointDef extends JointDef, RopeJointOpt { + /** + * The local anchor point relative to bodyA's origin. + */ + localAnchorA: Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + localAnchorB: Vec2; + } + /** + * A rope joint enforces a maximum distance between two points on two bodies. It + * has no other effect. + * + * Warning: if you attempt to change the maximum length during the simulation + * you will get some non-physical behavior. + * + * A model that would allow you to dynamically modify the length would have some + * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you + * want to dynamically control length. + */ + class RopeJoint extends Joint { + static TYPE: "rope-joint"; + constructor(def: RopeJointDef); + constructor(def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); + /** + * The local anchor point relative to bodyA's origin. + */ + getLocalAnchorA(): Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + getLocalAnchorB(): Vec2; + /** + * Set the maximum length of the rope. + */ + setMaxLength(length: number): void; + /** + * Get the maximum length of the rope. + */ + getMaxLength(): number; + getLimitState(): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Weld joint definition. You need to specify local anchor points where they are + * attached and the relative body angle. The position of the anchor points is + * important for computing the reaction torque. + * + * @prop {float} frequencyHz + * @prop {float} dampingRatio + * + * @prop {Vec2} localAnchorA + * @prop {Vec2} localAnchorB + * @prop {float} referenceAngle + */ + interface WeldJointOpt extends JointOpt { + /** + * The mass-spring-damper frequency in Hertz. Rotation only. Disable softness + * with a value of 0. + */ + frequencyHz?: number; + /** + * The damping ratio. 0 = no damping, 1 = critical damping. + */ + dampingRatio?: number; + /** + * The bodyB angle minus bodyA angle in the reference state (radians). + */ + referenceAngle?: number; + } + /** + * Weld joint definition. You need to specify local anchor points where they are + * attached and the relative body angle. The position of the anchor points is + * important for computing the reaction torque. + */ + interface WeldJointDef extends JointDef, WeldJointOpt { + /** + * The local anchor point relative to bodyA's origin. + */ + localAnchorA: Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + localAnchorB: Vec2; + } + /** + * A weld joint essentially glues two bodies together. A weld joint may distort + * somewhat because the island constraint solver is approximate. + */ + class WeldJoint extends Joint { + static TYPE: "weld-joint"; + constructor(def: WeldJointDef); + constructor(def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); + /** + * The local anchor point relative to bodyA's origin. + */ + getLocalAnchorA(): Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + getLocalAnchorB(): Vec2; + /** + * Get the reference angle. + */ + getReferenceAngle(): number; + /** + * Set frequency in Hz. + */ + setFrequency(hz: number): void; + /** + * Get frequency in Hz. + */ + getFrequency(): number; + /** + * Set damping ratio. + */ + setDampingRatio(ratio: number): void; + /** + * Get damping ratio. + */ + getDampingRatio(): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Wheel joint definition. This requires defining a line of motion using an axis + * and an anchor point. The definition uses local anchor points and a local axis + * so that the initial configuration can violate the constraint slightly. The + * joint translation is zero when the local anchor points coincide in world + * space. Using local anchors and a local axis helps when saving and loading a + * game. + */ + interface WheelJointOpt extends JointOpt { + /** + * Enable/disable the joint motor. + */ + enableMotor?: boolean; + /** + * The maximum motor torque, usually in N-m. + */ + maxMotorTorque?: number; + /** + * The desired motor speed in radians per second. + */ + motorSpeed?: number; + /** + * Suspension frequency, zero indicates no suspension. + */ + frequencyHz?: number; + /** + * Suspension damping ratio, one indicates critical damping. + */ + dampingRatio?: number; + } + /** + * Wheel joint definition. This requires defining a line of motion using an axis + * and an anchor point. The definition uses local anchor points and a local axis + * so that the initial configuration can violate the constraint slightly. The + * joint translation is zero when the local anchor points coincide in world + * space. Using local anchors and a local axis helps when saving and loading a + * game. + */ + interface WheelJointDef extends JointDef, WheelJointOpt { + /** + * The local anchor point relative to bodyA's origin. + */ + localAnchorA: Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + localAnchorB: Vec2; + /** + * The local translation axis in bodyA. + */ + localAxisA: Vec2; + } + /** + * A wheel joint. This joint provides two degrees of freedom: translation along + * an axis fixed in bodyA and rotation in the plane. In other words, it is a + * point to line constraint with a rotational motor and a linear spring/damper. + * This joint is designed for vehicle suspensions. + */ + class WheelJoint extends Joint { + static TYPE: "wheel-joint"; + constructor(def: WheelJointDef); + constructor(def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2); + /** + * The local anchor point relative to bodyA's origin. + */ + getLocalAnchorA(): Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + getLocalAnchorB(): Vec2; + /** + * The local joint axis relative to bodyA. + */ + getLocalAxisA(): Vec2; + /** + * Get the current joint translation, usually in meters. + */ + getJointTranslation(): number; + /** + * Get the current joint translation speed, usually in meters per second. + */ + getJointSpeed(): number; + /** + * Is the joint motor enabled? + */ + isMotorEnabled(): boolean; + /** + * Enable/disable the joint motor. + */ + enableMotor(flag: boolean): void; + /** + * Set the motor speed, usually in radians per second. + */ + setMotorSpeed(speed: number): void; + /** + * Get the motor speed, usually in radians per second. + */ + getMotorSpeed(): number; + /** + * Set/Get the maximum motor force, usually in N-m. + */ + setMaxMotorTorque(torque: number): void; + getMaxMotorTorque(): number; + /** + * Get the current motor torque given the inverse time step, usually in N-m. + */ + getMotorTorque(inv_dt: number): number; + /** + * Set/Get the spring frequency in hertz. Setting the frequency to zero disables + * the spring. + */ + setSpringFrequencyHz(hz: number): void; + getSpringFrequencyHz(): number; + /** + * Set/Get the spring damping ratio + */ + setSpringDampingRatio(ratio: number): void; + getSpringDampingRatio(): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + // TODO merge with World options? + /** + * Tuning constants based on meters-kilograms-seconds (MKS) units. + */ + // tslint:disable-next-line:no-unnecessary-class + class Settings { + // Collision + /** + * The maximum number of contact points between two convex shapes. Do not change + * this value. + */ + static maxManifoldPoints: number; + /** + * The maximum number of vertices on a convex polygon. You cannot increase this + * too much because BlockAllocator has a maximum object size. + */ + static maxPolygonVertices: number; + /** + * This is used to fatten AABBs in the dynamic tree. This allows proxies to move + * by a small amount without triggering a tree adjustment. This is in meters. + */ + static aabbExtension: number; + /** + * This is used to fatten AABBs in the dynamic tree. This is used to predict the + * future position based on the current displacement. This is a dimensionless + * multiplier. + */ + static aabbMultiplier: number; + /** + * A small length used as a collision and constraint tolerance. Usually it is + * chosen to be numerically significant, but visually insignificant. + */ + static linearSlop: number; + static get linearSlopSquared(): number; + /** + * A small angle used as a collision and constraint tolerance. Usually it is + * chosen to be numerically significant, but visually insignificant. + */ + static angularSlop: number; + /** + * The radius of the polygon/edge shape skin. This should not be modified. + * Making this smaller means polygons will have an insufficient buffer for + * continuous collision. Making it larger may create artifacts for vertex + * collision. + */ + static get polygonRadius(): number; + /** + * Maximum number of sub-steps per contact in continuous physics simulation. + */ + static maxSubSteps: number; + // Dynamics + /** + * Maximum number of contacts to be handled to solve a TOI impact. + */ + static maxTOIContacts: number; + /** + * Maximum iterations to solve a TOI. + */ + static maxTOIIterations: number; + /** + * Maximum iterations to find Distance. + */ + static maxDistnceIterations: number; + /** + * A velocity threshold for elastic collisions. Any collision with a relative + * linear velocity below this threshold will be treated as inelastic. + */ + static velocityThreshold: number; + /** + * The maximum linear position correction used when solving constraints. This + * helps to prevent overshoot. + */ + static maxLinearCorrection: number; + /** + * The maximum angular position correction used when solving constraints. This + * helps to prevent overshoot. + */ + static maxAngularCorrection: number; + /** + * The maximum linear velocity of a body. This limit is very large and is used + * to prevent numerical problems. You shouldn't need to adjust Settings. + */ + static maxTranslation: number; + static get maxTranslationSquared(): number; + /** + * The maximum angular velocity of a body. This limit is very large and is used + * to prevent numerical problems. You shouldn't need to adjust Settings. + */ + static maxRotation: number; + static get maxRotationSquared(): number; + /** + * This scale factor controls how fast overlap is resolved. Ideally this would + * be 1 so that overlap is removed in one time step. However using values close + * to 1 often lead to overshoot. + */ + static baumgarte: number; + static toiBaugarte: number; + // Sleep + /** + * The time that a body must be still before it will go to sleep. + */ + static timeToSleep: number; + /** + * A body cannot sleep if its linear velocity is above this tolerance. + */ + static linearSleepTolerance: number; + static get linearSleepToleranceSqr(): number; + /** + * A body cannot sleep if its angular velocity is above this tolerance. + */ + static angularSleepTolerance: number; + static get angularSleepToleranceSqr(): number; + } + /** + * This describes the motion of a body/shape for TOI computation. Shapes are + * defined with respect to the body origin, which may not coincide with the + * center of mass. However, to support dynamics we must interpolate the center + * of mass position. + */ + class Sweep { + /** Local center of mass position */ + localCenter: Vec2; + /** World center position */ + c: Vec2; + /** World angle */ + a: number; + /** Fraction of the current time step in the range [0,1], c0 and a0 are c and a at alpha0. */ + alpha0: number; + c0: Vec2; + a0: number; + constructor(c?: Vec2, a?: number); + setTransform(xf: Transform): void; + setLocalCenter(localCenter: Vec2, xf: Transform): void; + /** + * Get the interpolated transform at a specific time. + * + * @param xf + * @param beta A factor in [0,1], where 0 indicates alpha0 + */ + getTransform(xf: Transform, beta?: number): void; + /** + * Advance the sweep forward, yielding a new initial state. + * + * @param alpha The new initial time + */ + advance(alpha: number): void; + forward(): void; + /** + * normalize the angles in radians to be between -pi and pi. + */ + normalize(): void; + clone(): Sweep; + set(that: Sweep): void; + } + /** + * Input parameters for TimeOfImpact. + */ + class TOIInput { + proxyA: DistanceProxy; + proxyB: DistanceProxy; + sweepA: Sweep; + sweepB: Sweep; + /** defines sweep interval [0, tMax] */ + tMax: number | undefined; + } + enum TOIOutputState { + e_unknown = 0, + e_failed = 1, + e_overlapped = 2, + e_touching = 3, + e_separated = 4 + } + /** + * Output parameters for TimeOfImpact. + */ + class TOIOutput { + state: TOIOutputState | undefined; + t: number | undefined; + } + /** + * Compute the upper bound on time before two shapes penetrate. Time is + * represented as a fraction between [0,tMax]. This uses a swept separating axis + * and may miss some intermediate, non-tunneling collision. If you change the + * time interval, you should call this function again. + * + * Note: use Distance to compute the contact point and normal at the time of + * impact. + * + * CCD via the local separating axis method. This seeks progression by computing + * the largest time at which separation is maintained. + */ + const TimeOfImpact: { + (output: TOIOutput, input: TOIInput): void; + Input: typeof TOIInput; + Output: typeof TOIOutput; + }; + const stats: { + gjkCalls: number; + gjkIters: number; + gjkMaxIters: number; + toiTime: number; + toiMaxTime: number; + toiCalls: number; + toiIters: number; + toiMaxIters: number; + toiRootIters: number; + toiMaxRootIters: number; + toString(newline?: string): string; + }; + /** @deprecated Merged with main namespace */ + const internal: { + CollidePolygons: (manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform) => void; + Settings: typeof Settings; + Sweep: typeof Sweep; + Manifold: typeof Manifold; + Distance: { + (output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void; + testOverlap: (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform) => boolean; + Input: typeof DistanceInput; + Output: typeof DistanceOutput; + Proxy: typeof DistanceProxy; + Cache: typeof SimplexCache; + }; + TimeOfImpact: { + (output: TOIOutput, input: TOIInput): void; + Input: typeof TOIInput; + Output: typeof TOIOutput; + }; + DynamicTree: typeof DynamicTree; + stats: { + gjkCalls: number; + gjkIters: number; + gjkMaxIters: number; + toiTime: number; + toiMaxTime: number; + toiCalls: number; + toiIters: number; + toiMaxIters: number; + toiRootIters: number; + toiMaxRootIters: number; + toString(newline?: string): string; + }; + }; + interface ActiveKeys { + 0?: boolean; + 1?: boolean; + 2?: boolean; + 3?: boolean; + 4?: boolean; + 5?: boolean; + 6?: boolean; + 7?: boolean; + 8?: boolean; + 9?: boolean; + A?: boolean; + B?: boolean; + C?: boolean; + D?: boolean; + E?: boolean; + F?: boolean; + G?: boolean; + H?: boolean; + I?: boolean; + J?: boolean; + K?: boolean; + L?: boolean; + M?: boolean; + N?: boolean; + O?: boolean; + P?: boolean; + Q?: boolean; + R?: boolean; + S?: boolean; + T?: boolean; + U?: boolean; + V?: boolean; + W?: boolean; + X?: boolean; + Y?: boolean; + Z?: boolean; + right?: boolean; + left?: boolean; + up?: boolean; + down?: boolean; + fire?: boolean; + } + interface Testbed { + // camera position + /** World viewbox width. */ + width: number; + /** World viewbox height. */ + height: number; + /** World viewbox center vertical offset. */ + x: number; + /** World viewbox center horizontal offset. */ + y: number; + scaleY: number; + ratio: number; + /** World simulation step frequency */ + hz: number; + /** World simulation speed, default is 1 */ + speed: number; + activeKeys: ActiveKeys; + background: string; + mouseForce?: number; + status(name: string, value: any): void; + status(value: object | string): void; + info(text: string): void; + drawPoint(p: { + x: number; + y: number; + }, r: any, color: string): void; + drawCircle(p: { + x: number; + y: number; + }, r: number, color: string): void; + drawSegment(a: { + x: number; + y: number; + }, b: { + x: number; + y: number; + }, color: string): void; + drawPolygon(points: Array<{ + x: number; + y: number; + }>, color: string): void; + drawAABB(aabb: AABB, color: string): void; + color(r: number, g: number, b: number): string; + // callbacks + step?: (dt: number, t: number) => void; + keydown?: (keyCode: number, label: string) => void; + keyup?: (keyCode: number, label: string) => void; + findOne: (query: string) => Body | Joint | Fixture | null; + findAll: (query: string) => Body[] | Joint[] | Fixture[]; + } + function testbed(opts: object, callback: (testbed: Testbed) => World): any; + function testbed(callback: (testbed: Testbed) => World): any; +} +export { planck as default, Serializer, math, Vec2Value, Vec2, Vec3, Mat22, Mat33, Transform, Rot, RayCastInput, RayCastCallback, RayCastOutput, AABB, Shape, ShapeType, FixtureOpt, FixtureDef, FixtureProxy, Fixture, BodyType, BodyDef, MassData, Body, ContactEdge, EvaluateFunction, ContactCallback, mixFriction, mixRestitution, VelocityConstraintPoint, Contact, JointEdge, JointOpt, JointDef, Joint, WorldDef, WorldRayCastCallback, WorldAABBQueryCallback, World, CircleShape, Circle, EdgeShape, Edge, PolygonShape, Polygon, ChainShape, Chain, BoxShape, Box, CollideCircles, CollideEdgeCircle, CollidePolygons, CollidePolygonCircle, CollideEdgePolygon, DistanceJointOpt, DistanceJointDef, DistanceJoint, FrictionJointOpt, FrictionJointDef, FrictionJoint, GearJointOpt, GearJointDef, GearJoint, MotorJointOpt, MotorJointDef, MotorJoint, MouseJointOpt, MouseJointDef, MouseJoint, PrismaticJointOpt, PrismaticJointDef, PrismaticJoint, PulleyJointOpt, PulleyJointDef, PulleyJoint, RevoluteJointOpt, RevoluteJointDef, RevoluteJoint, RopeJointOpt, RopeJointDef, RopeJoint, WeldJointOpt, WeldJointDef, WeldJoint, WheelJointOpt, WheelJointDef, WheelJoint, Settings, Sweep, ManifoldType, ContactFeatureType, PointState, ClipVertex, Manifold, ManifoldPoint, ContactID, ContactFeature, WorldManifold, getPointStates, clipSegmentToLine, DistanceInput, DistanceOutput, SimplexCache, Distance, DistanceProxy, testOverlap, TOIInput, TOIOutputState, TOIOutput, TimeOfImpact, DynamicTreeQueryCallback, TreeNode, DynamicTree, stats, internal, ActiveKeys, Testbed, testbed }; +//# sourceMappingURL=planck-with-testbed.d.ts.map \ No newline at end of file diff --git a/dist/planck-with-testbed.d.ts.map b/dist/planck-with-testbed.d.ts.map new file mode 100644 index 00000000..20b25804 --- /dev/null +++ b/dist/planck-with-testbed.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"planck-with-testbed.d.ts","sourceRoot":"","sources":["../testbed/main.ts","../src/util/options.ts","../src/common/Math.ts","../src/common/Vec2.ts","../src/collision/AABB.ts","../src/Settings.ts","../src/util/Pool.ts","../src/collision/DynamicTree.ts","../src/common/Rot.ts","../src/common/Transform.ts","../src/common/Sweep.ts","../src/dynamics/Velocity.ts","../src/dynamics/Position.ts","../src/common/Mat22.ts","../src/collision/Manifold.ts","../src/util/stats.ts","../src/collision/Distance.ts","../src/dynamics/Contact.ts","../src/util/Timer.ts","../src/collision/TimeOfImpact.ts","../src/dynamics/Solver.ts","../src/dynamics/Joint.ts","../src/dynamics/Body.ts","../src/collision/Shape.ts","../src/dynamics/Fixture.ts","../src/collision/BroadPhase.ts","../src/dynamics/World.ts","../src/common/Vec3.ts","../src/collision/shape/EdgeShape.ts","../src/collision/shape/ChainShape.ts","../src/collision/shape/PolygonShape.ts","../src/collision/shape/BoxShape.ts","../src/collision/shape/CircleShape.ts","../src/dynamics/joint/DistanceJoint.ts","../src/dynamics/joint/FrictionJoint.ts","../src/common/Mat33.ts","../src/dynamics/joint/RevoluteJoint.ts","../src/dynamics/joint/PrismaticJoint.ts","../src/dynamics/joint/GearJoint.ts","../src/dynamics/joint/MotorJoint.ts","../src/dynamics/joint/MouseJoint.ts","../src/dynamics/joint/PulleyJoint.ts","../src/dynamics/joint/RopeJoint.ts","../src/dynamics/joint/WeldJoint.ts","../src/dynamics/joint/WheelJoint.ts","../src/serializer/index.ts","../src/collision/shape/CollideCircle.ts","../src/collision/shape/CollideEdgeCircle.ts","../src/collision/shape/CollidePolygon.ts","../src/collision/shape/CollideCirclePolygon.ts","../src/collision/shape/CollideEdgePolygon.ts","../src/index.ts","../testbed/index.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yCAAvsJ,SAAU;;;;;;;;;;;gBAA1L,IAAK;eAAiD,IAAK;;;;2BAAqH,SAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uCAAc,SAAU;;;;;;;;;;;;;gBAAvM,IAAK;;;;;;;2BAAwL,SAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAA8J,IAAK,KAAI,KAAM,KAAI,OAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAA/K,IAAK;;;;;;;+BAAwL,SAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAA8J,IAAK,KAAI,KAAM,KAAI,OAAQ"} \ No newline at end of file diff --git a/dist/planck-with-testbed.js b/dist/planck-with-testbed.js index f3bd3ebb..5d9eb833 100644 --- a/dist/planck-with-testbed.js +++ b/dist/planck-with-testbed.js @@ -1,5 +1,5 @@ /** - * Planck.js v1.0.0-alpha.4 + * Planck.js v1.0.0-beta.0 * @license The MIT license * @copyright Copyright (c) 2021 Erin Catto, Ali Shakiba * @@ -22,2165 +22,4888 @@ * SOFTWARE. */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.planck = {})); -}(this, (function (exports) { 'use strict'; - - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ - /* global Reflect, Promise */ - - var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - - function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +var __defProp = Object.defineProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +const stats$1 = { + create: 0, + tick: 0, + node: 0, + draw: 0, + fps: 0 +}; +class Matrix { + constructor(a, b, c, d, e, f) { + this.reset(a, b, c, d, e, f); + } + toString() { + return "[" + this.a + ", " + this.b + ", " + this.c + ", " + this.d + ", " + this.e + ", " + this.f + "]"; + } + clone() { + return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f); + } + reset(a, b, c, d, e, f) { + this._dirty = true; + if (typeof a === "object") { + this.a = a.a, this.d = a.d; + this.b = a.b, this.c = a.c; + this.e = a.e, this.f = a.f; + } else { + this.a = a || 1, this.d = d || 1; + this.b = b || 0, this.c = c || 0; + this.e = e || 0, this.f = f || 0; } - - var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - - function options (input, defaults) { - if (input === null || typeof input === 'undefined') { - // tslint:disable-next-line:no-object-literal-type-assertion - input = {}; + return this; + } + identity() { + this._dirty = true; + this.a = 1; + this.b = 0; + this.c = 0; + this.d = 1; + this.e = 0; + this.f = 0; + return this; + } + rotate(angle) { + if (!angle) { + return this; + } + this._dirty = true; + var u = angle ? Math.cos(angle) : 1; + var v = angle ? Math.sin(angle) : 0; + var a = u * this.a - v * this.b; + var b = u * this.b + v * this.a; + var c = u * this.c - v * this.d; + var d = u * this.d + v * this.c; + var e = u * this.e - v * this.f; + var f = u * this.f + v * this.e; + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.e = e; + this.f = f; + return this; + } + translate(x, y) { + if (!x && !y) { + return this; + } + this._dirty = true; + this.e += x; + this.f += y; + return this; + } + scale(x, y) { + if (!(x - 1) && !(y - 1)) { + return this; + } + this._dirty = true; + this.a *= x; + this.b *= y; + this.c *= x; + this.d *= y; + this.e *= x; + this.f *= y; + return this; + } + skew(x, y) { + if (!x && !y) { + return this; + } + this._dirty = true; + var a = this.a + this.b * x; + var b = this.b + this.a * y; + var c = this.c + this.d * x; + var d = this.d + this.c * y; + var e = this.e + this.f * x; + var f = this.f + this.e * y; + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.e = e; + this.f = f; + return this; + } + concat(m) { + this._dirty = true; + var n = this; + var a = n.a * m.a + n.b * m.c; + var b = n.b * m.d + n.a * m.b; + var c = n.c * m.a + n.d * m.c; + var d = n.d * m.d + n.c * m.b; + var e = n.e * m.a + m.e + n.f * m.c; + var f = n.f * m.d + m.f + n.e * m.b; + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.e = e; + this.f = f; + return this; + } + inverse() { + if (this._dirty) { + this._dirty = false; + this.inverted = this.inverted || new Matrix(); + var z = this.a * this.d - this.b * this.c; + this.inverted.a = this.d / z; + this.inverted.b = -this.b / z; + this.inverted.c = -this.c / z; + this.inverted.d = this.a / z; + this.inverted.e = (this.c * this.f - this.e * this.d) / z; + this.inverted.f = (this.e * this.b - this.a * this.f) / z; + } + return this.inverted; + } + map(p, q) { + q = q || {}; + q.x = this.a * p.x + this.c * p.y + this.e; + q.y = this.b * p.x + this.d * p.y + this.f; + return q; + } + mapX(x, y) { + if (typeof x === "object") + y = x.y, x = x.x; + return this.a * x + this.c * y + this.e; + } + mapY(x, y) { + if (typeof x === "object") + y = x.y, x = x.x; + return this.b * x + this.d * y + this.f; + } +} +var iid$1 = 0; +function Pin(owner) { + this._owner = owner; + this._parent = null; + this._relativeMatrix = new Matrix(); + this._absoluteMatrix = new Matrix(); + this.reset(); +} +Pin.prototype.reset = function() { + this._textureAlpha = 1; + this._alpha = 1; + this._width = 0; + this._height = 0; + this._scaleX = 1; + this._scaleY = 1; + this._skewX = 0; + this._skewY = 0; + this._rotation = 0; + this._pivoted = false; + this._pivotX = null; + this._pivotY = null; + this._handled = false; + this._handleX = 0; + this._handleY = 0; + this._aligned = false; + this._alignX = 0; + this._alignY = 0; + this._offsetX = 0; + this._offsetY = 0; + this._boxX = 0; + this._boxY = 0; + this._boxWidth = this._width; + this._boxHeight = this._height; + this._ts_translate = ++iid$1; + this._ts_transform = ++iid$1; + this._ts_matrix = ++iid$1; +}; +Pin.prototype._update = function() { + this._parent = this._owner._parent && this._owner._parent._pin; + if (this._handled && this._mo_handle != this._ts_transform) { + this._mo_handle = this._ts_transform; + this._ts_translate = ++iid$1; + } + if (this._aligned && this._parent && this._mo_align != this._parent._ts_transform) { + this._mo_align = this._parent._ts_transform; + this._ts_translate = ++iid$1; + } + return this; +}; +Pin.prototype.toString = function() { + return this._owner + " (" + (this._parent ? this._parent._owner : null) + ")"; +}; +Pin.prototype.absoluteMatrix = function() { + this._update(); + var ts = Math.max( + this._ts_transform, + this._ts_translate, + this._parent ? this._parent._ts_matrix : 0 + ); + if (this._mo_abs == ts) { + return this._absoluteMatrix; + } + this._mo_abs = ts; + var abs2 = this._absoluteMatrix; + abs2.reset(this.relativeMatrix()); + this._parent && abs2.concat(this._parent._absoluteMatrix); + this._ts_matrix = ++iid$1; + return abs2; +}; +Pin.prototype.relativeMatrix = function() { + this._update(); + var ts = Math.max( + this._ts_transform, + this._ts_translate, + this._parent ? this._parent._ts_transform : 0 + ); + if (this._mo_rel == ts) { + return this._relativeMatrix; + } + this._mo_rel = ts; + var rel2 = this._relativeMatrix; + rel2.identity(); + if (this._pivoted) { + rel2.translate(-this._pivotX * this._width, -this._pivotY * this._height); + } + rel2.scale(this._scaleX, this._scaleY); + rel2.skew(this._skewX, this._skewY); + rel2.rotate(this._rotation); + if (this._pivoted) { + rel2.translate(this._pivotX * this._width, this._pivotY * this._height); + } + if (this._pivoted) { + this._boxX = 0; + this._boxY = 0; + this._boxWidth = this._width; + this._boxHeight = this._height; + } else { + var p, q; + if (rel2.a > 0 && rel2.c > 0 || rel2.a < 0 && rel2.c < 0) { + p = 0, q = rel2.a * this._width + rel2.c * this._height; + } else { + p = rel2.a * this._width, q = rel2.c * this._height; + } + if (p > q) { + this._boxX = q; + this._boxWidth = p - q; + } else { + this._boxX = p; + this._boxWidth = q - p; + } + if (rel2.b > 0 && rel2.d > 0 || rel2.b < 0 && rel2.d < 0) { + p = 0, q = rel2.b * this._width + rel2.d * this._height; + } else { + p = rel2.b * this._width, q = rel2.d * this._height; + } + if (p > q) { + this._boxY = q; + this._boxHeight = p - q; + } else { + this._boxY = p; + this._boxHeight = q - p; + } + } + this._x = this._offsetX; + this._y = this._offsetY; + this._x -= this._boxX + this._handleX * this._boxWidth; + this._y -= this._boxY + this._handleY * this._boxHeight; + if (this._aligned && this._parent) { + this._parent.relativeMatrix(); + this._x += this._alignX * this._parent._width; + this._y += this._alignY * this._parent._height; + } + rel2.translate(this._x, this._y); + return this._relativeMatrix; +}; +Pin.prototype.get = function(key) { + if (typeof getters[key] === "function") { + return getters[key](this); + } +}; +Pin.prototype.set = function(a, b) { + if (typeof a === "string") { + if (typeof setters[a] === "function" && typeof b !== "undefined") { + setters[a](this, b); + } + } else if (typeof a === "object") { + for (b in a) { + if (typeof setters[b] === "function" && typeof a[b] !== "undefined") { + setters[b](this, a[b], a); + } + } + } + if (this._owner) { + this._owner._ts_pin = ++iid$1; + this._owner.touch(); + } + return this; +}; +var getters = { + alpha: function(pin) { + return pin._alpha; + }, + textureAlpha: function(pin) { + return pin._textureAlpha; + }, + width: function(pin) { + return pin._width; + }, + height: function(pin) { + return pin._height; + }, + boxWidth: function(pin) { + return pin._boxWidth; + }, + boxHeight: function(pin) { + return pin._boxHeight; + }, + // scale : function(pin) { + // }, + scaleX: function(pin) { + return pin._scaleX; + }, + scaleY: function(pin) { + return pin._scaleY; + }, + // skew : function(pin) { + // }, + skewX: function(pin) { + return pin._skewX; + }, + skewY: function(pin) { + return pin._skewY; + }, + rotation: function(pin) { + return pin._rotation; + }, + // pivot : function(pin) { + // }, + pivotX: function(pin) { + return pin._pivotX; + }, + pivotY: function(pin) { + return pin._pivotY; + }, + // offset : function(pin) { + // }, + offsetX: function(pin) { + return pin._offsetX; + }, + offsetY: function(pin) { + return pin._offsetY; + }, + // align : function(pin) { + // }, + alignX: function(pin) { + return pin._alignX; + }, + alignY: function(pin) { + return pin._alignY; + }, + // handle : function(pin) { + // }, + handleX: function(pin) { + return pin._handleX; + }, + handleY: function(pin) { + return pin._handleY; + } +}; +var setters = { + alpha: function(pin, value) { + pin._alpha = value; + }, + textureAlpha: function(pin, value) { + pin._textureAlpha = value; + }, + width: function(pin, value) { + pin._width_ = value; + pin._width = value; + pin._ts_transform = ++iid$1; + }, + height: function(pin, value) { + pin._height_ = value; + pin._height = value; + pin._ts_transform = ++iid$1; + }, + scale: function(pin, value) { + pin._scaleX = value; + pin._scaleY = value; + pin._ts_transform = ++iid$1; + }, + scaleX: function(pin, value) { + pin._scaleX = value; + pin._ts_transform = ++iid$1; + }, + scaleY: function(pin, value) { + pin._scaleY = value; + pin._ts_transform = ++iid$1; + }, + skew: function(pin, value) { + pin._skewX = value; + pin._skewY = value; + pin._ts_transform = ++iid$1; + }, + skewX: function(pin, value) { + pin._skewX = value; + pin._ts_transform = ++iid$1; + }, + skewY: function(pin, value) { + pin._skewY = value; + pin._ts_transform = ++iid$1; + }, + rotation: function(pin, value) { + pin._rotation = value; + pin._ts_transform = ++iid$1; + }, + pivot: function(pin, value) { + pin._pivotX = value; + pin._pivotY = value; + pin._pivoted = true; + pin._ts_transform = ++iid$1; + }, + pivotX: function(pin, value) { + pin._pivotX = value; + pin._pivoted = true; + pin._ts_transform = ++iid$1; + }, + pivotY: function(pin, value) { + pin._pivotY = value; + pin._pivoted = true; + pin._ts_transform = ++iid$1; + }, + offset: function(pin, value) { + pin._offsetX = value; + pin._offsetY = value; + pin._ts_translate = ++iid$1; + }, + offsetX: function(pin, value) { + pin._offsetX = value; + pin._ts_translate = ++iid$1; + }, + offsetY: function(pin, value) { + pin._offsetY = value; + pin._ts_translate = ++iid$1; + }, + align: function(pin, value) { + this.alignX(pin, value); + this.alignY(pin, value); + }, + alignX: function(pin, value) { + pin._alignX = value; + pin._aligned = true; + pin._ts_translate = ++iid$1; + this.handleX(pin, value); + }, + alignY: function(pin, value) { + pin._alignY = value; + pin._aligned = true; + pin._ts_translate = ++iid$1; + this.handleY(pin, value); + }, + handle: function(pin, value) { + this.handleX(pin, value); + this.handleY(pin, value); + }, + handleX: function(pin, value) { + pin._handleX = value; + pin._handled = true; + pin._ts_translate = ++iid$1; + }, + handleY: function(pin, value) { + pin._handleY = value; + pin._handled = true; + pin._ts_translate = ++iid$1; + }, + resizeMode: function(pin, value, all) { + if (all) { + if (value == "in") { + value = "in-pad"; + } else if (value == "out") { + value = "out-crop"; + } + scaleTo(pin, all.resizeWidth, all.resizeHeight, value); + } + }, + resizeWidth: function(pin, value, all) { + if (!all || !all.resizeMode) { + scaleTo(pin, value, null); + } + }, + resizeHeight: function(pin, value, all) { + if (!all || !all.resizeMode) { + scaleTo(pin, null, value); + } + }, + scaleMode: function(pin, value, all) { + if (all) { + scaleTo(pin, all.scaleWidth, all.scaleHeight, value); + } + }, + scaleWidth: function(pin, value, all) { + if (!all || !all.scaleMode) { + scaleTo(pin, value, null); + } + }, + scaleHeight: function(pin, value, all) { + if (!all || !all.scaleMode) { + scaleTo(pin, null, value); + } + }, + matrix: function(pin, value) { + this.scaleX(pin, value.a); + this.skewX(pin, value.c / value.d); + this.skewY(pin, value.b / value.a); + this.scaleY(pin, value.d); + this.offsetX(pin, value.e); + this.offsetY(pin, value.f); + this.rotation(pin, 0); + } +}; +Pin.prototype.scaleTo = function(width, height, mode) { + scaleTo(this, width, height, mode); +}; +function scaleTo(pin, width, height, mode) { + var w = typeof width === "number"; + var h = typeof height === "number"; + var m = typeof mode === "string"; + pin._ts_transform = ++iid$1; + if (w) { + pin._scaleX = width / pin._width_; + pin._width = pin._width_; + } + if (h) { + pin._scaleY = height / pin._height_; + pin._height = pin._height_; + } + if (w && h && m) { + if (mode == "out" || mode == "out-crop") { + pin._scaleX = pin._scaleY = Math.max(pin._scaleX, pin._scaleY); + } else if (mode == "in" || mode == "in-pad") { + pin._scaleX = pin._scaleY = Math.min(pin._scaleX, pin._scaleY); + } + if (mode == "out-crop" || mode == "in-pad") { + pin._width = width / pin._scaleX; + pin._height = height / pin._scaleY; + } + } +} +Pin._add_shortcuts = function(prototype) { + prototype.size = function(w, h) { + this.pin("width", w); + this.pin("height", h); + return this; + }; + prototype.width = function(w) { + if (typeof w === "undefined") { + return this.pin("width"); + } + this.pin("width", w); + return this; + }; + prototype.height = function(h) { + if (typeof h === "undefined") { + return this.pin("height"); + } + this.pin("height", h); + return this; + }; + prototype.offset = function(a, b) { + if (typeof a === "object") + b = a.y, a = a.x; + this.pin("offsetX", a); + this.pin("offsetY", b); + return this; + }; + prototype.rotate = function(a) { + this.pin("rotation", a); + return this; + }; + prototype.skew = function(a, b) { + if (typeof a === "object") + b = a.y, a = a.x; + else if (typeof b === "undefined") + b = a; + this.pin("skewX", a); + this.pin("skewY", b); + return this; + }; + prototype.scale = function(a, b) { + if (typeof a === "object") + b = a.y, a = a.x; + else if (typeof b === "undefined") + b = a; + this.pin("scaleX", a); + this.pin("scaleY", b); + return this; + }; + prototype.alpha = function(a, ta) { + this.pin("alpha", a); + if (typeof ta !== "undefined") { + this.pin("textureAlpha", ta); + } + return this; + }; +}; +var iid = 0; +stats$1.create = 0; +function assertType(obj) { + if (obj && obj instanceof Node) { + return obj; + } + throw "Invalid node: " + obj; +} +const create = function() { + return new Node(); +}; +function Node() { + stats$1.create++; + this._pin = new Pin(this); +} +Node.prototype.matrix = function(relative) { + if (relative === true) { + return this._pin.relativeMatrix(); + } + return this._pin.absoluteMatrix(); +}; +Node.prototype.pin = function(a, b) { + if (typeof a === "object") { + this._pin.set(a); + return this; + } else if (typeof a === "string") { + if (typeof b === "undefined") { + return this._pin.get(a); + } else { + this._pin.set(a, b); + return this; + } + } else if (typeof a === "undefined") { + return this._pin; + } +}; +Node.prototype.scaleTo = function(a, b, c) { + if (typeof a === "object") + c = b, b = a.y, a = a.x; + this._pin.scaleTo(a, b, c); + return this; +}; +Pin._add_shortcuts(Node.prototype); +Node.prototype._label = ""; +Node.prototype._visible = true; +Node.prototype._parent = null; +Node.prototype._next = null; +Node.prototype._prev = null; +Node.prototype._first = null; +Node.prototype._last = null; +Node.prototype._attrs = null; +Node.prototype._flags = null; +Node.prototype.toString = function() { + return "[" + this._label + "]"; +}; +Node.prototype.id = function(id) { + return this.label(id); +}; +Node.prototype.label = function(label) { + if (typeof label === "undefined") { + return this._label; + } + this._label = label; + return this; +}; +Node.prototype.attr = function(name, value) { + if (typeof value === "undefined") { + return this._attrs !== null ? this._attrs[name] : void 0; + } + (this._attrs !== null ? this._attrs : this._attrs = {})[name] = value; + return this; +}; +Node.prototype.visible = function(visible) { + if (typeof visible === "undefined") { + return this._visible; + } + this._visible = visible; + this._parent && (this._parent._ts_children = ++iid); + this._ts_pin = ++iid; + this.touch(); + return this; +}; +Node.prototype.hide = function() { + return this.visible(false); +}; +Node.prototype.show = function() { + return this.visible(true); +}; +Node.prototype.parent = function() { + return this._parent; +}; +Node.prototype.next = function(visible) { + var next = this._next; + while (next && visible && !next._visible) { + next = next._next; + } + return next; +}; +Node.prototype.prev = function(visible) { + var prev = this._prev; + while (prev && visible && !prev._visible) { + prev = prev._prev; + } + return prev; +}; +Node.prototype.first = function(visible) { + var next = this._first; + while (next && visible && !next._visible) { + next = next._next; + } + return next; +}; +Node.prototype.last = function(visible) { + var prev = this._last; + while (prev && visible && !prev._visible) { + prev = prev._prev; + } + return prev; +}; +Node.prototype.visit = function(visitor, data) { + var reverse = visitor.reverse; + var visible = visitor.visible; + if (visitor.start && visitor.start(this, data)) { + return; + } + var child, next = reverse ? this.last(visible) : this.first(visible); + while (child = next) { + next = reverse ? child.prev(visible) : child.next(visible); + if (child.visit(visitor, data)) { + return true; + } + } + return visitor.end && visitor.end(this, data); +}; +Node.prototype.append = function(child, more) { + if (Array.isArray(child)) + for (var i = 0; i < child.length; i++) + append(this, child[i]); + else if (typeof more !== "undefined") + for (var i = 0; i < arguments.length; i++) + append(this, arguments[i]); + else if (typeof child !== "undefined") + append(this, child); + return this; +}; +Node.prototype.prepend = function(child, more) { + if (Array.isArray(child)) + for (var i = child.length - 1; i >= 0; i--) + prepend(this, child[i]); + else if (typeof more !== "undefined") + for (var i = arguments.length - 1; i >= 0; i--) + prepend(this, arguments[i]); + else if (typeof child !== "undefined") + prepend(this, child); + return this; +}; +Node.prototype.appendTo = function(parent) { + append(parent, this); + return this; +}; +Node.prototype.prependTo = function(parent) { + prepend(parent, this); + return this; +}; +Node.prototype.insertNext = function(sibling, more) { + if (Array.isArray(sibling)) + for (var i = 0; i < sibling.length; i++) + insertAfter(sibling[i], this); + else if (typeof more !== "undefined") + for (var i = 0; i < arguments.length; i++) + insertAfter(arguments[i], this); + else if (typeof sibling !== "undefined") + insertAfter(sibling, this); + return this; +}; +Node.prototype.insertPrev = function(sibling, more) { + if (Array.isArray(sibling)) + for (var i = sibling.length - 1; i >= 0; i--) + insertBefore(sibling[i], this); + else if (typeof more !== "undefined") + for (var i = arguments.length - 1; i >= 0; i--) + insertBefore(arguments[i], this); + else if (typeof sibling !== "undefined") + insertBefore(sibling, this); + return this; +}; +Node.prototype.insertAfter = function(prev) { + insertAfter(this, prev); + return this; +}; +Node.prototype.insertBefore = function(next) { + insertBefore(this, next); + return this; +}; +function append(parent, child) { + assertType(child); + assertType(parent); + child.remove(); + if (parent._last) { + parent._last._next = child; + child._prev = parent._last; + } + child._parent = parent; + parent._last = child; + if (!parent._first) { + parent._first = child; + } + child._parent._flag(child, true); + child._ts_parent = ++iid; + parent._ts_children = ++iid; + parent.touch(); +} +function prepend(parent, child) { + assertType(child); + assertType(parent); + child.remove(); + if (parent._first) { + parent._first._prev = child; + child._next = parent._first; + } + child._parent = parent; + parent._first = child; + if (!parent._last) { + parent._last = child; + } + child._parent._flag(child, true); + child._ts_parent = ++iid; + parent._ts_children = ++iid; + parent.touch(); +} +function insertBefore(self, next) { + assertType(self); + assertType(next); + self.remove(); + var parent = next._parent; + var prev = next._prev; + next._prev = self; + prev && (prev._next = self) || parent && (parent._first = self); + self._parent = parent; + self._prev = prev; + self._next = next; + self._parent._flag(self, true); + self._ts_parent = ++iid; + self.touch(); +} +function insertAfter(self, prev) { + assertType(self); + assertType(prev); + self.remove(); + var parent = prev._parent; + var next = prev._next; + prev._next = self; + next && (next._prev = self) || parent && (parent._last = self); + self._parent = parent; + self._prev = prev; + self._next = next; + self._parent._flag(self, true); + self._ts_parent = ++iid; + self.touch(); +} +Node.prototype.remove = function(child, more) { + if (typeof child !== "undefined") { + if (Array.isArray(child)) { + for (var i = 0; i < child.length; i++) + assertType(child[i]).remove(); + } else if (typeof more !== "undefined") { + for (var i = 0; i < arguments.length; i++) + assertType(arguments[i]).remove(); + } else { + assertType(child).remove(); + } + return this; + } + if (this._prev) { + this._prev._next = this._next; + } + if (this._next) { + this._next._prev = this._prev; + } + if (this._parent) { + if (this._parent._first === this) { + this._parent._first = this._next; + } + if (this._parent._last === this) { + this._parent._last = this._prev; + } + this._parent._flag(this, false); + this._parent._ts_children = ++iid; + this._parent.touch(); + } + this._prev = this._next = this._parent = null; + this._ts_parent = ++iid; + return this; +}; +Node.prototype.empty = function() { + var child, next = this._first; + while (child = next) { + next = child._next; + child._prev = child._next = child._parent = null; + this._flag(child, false); + } + this._first = this._last = null; + this._ts_children = ++iid; + this.touch(); + return this; +}; +Node.prototype._ts_touch = null; +Node.prototype.touch = function() { + this._ts_touch = ++iid; + this._parent && this._parent.touch(); + return this; +}; +Node.prototype._flag = function(obj, name) { + if (typeof name === "undefined") { + return this._flags !== null && this._flags[obj] || 0; + } + if (typeof obj === "string") { + if (name) { + this._flags = this._flags || {}; + if (!this._flags[obj] && this._parent) { + this._parent._flag(obj, true); + } + this._flags[obj] = (this._flags[obj] || 0) + 1; + } else if (this._flags && this._flags[obj] > 0) { + if (this._flags[obj] == 1 && this._parent) { + this._parent._flag(obj, false); + } + this._flags[obj] = this._flags[obj] - 1; + } + } + if (typeof obj === "object") { + if (obj._flags) { + for (var type in obj._flags) { + if (obj._flags[type] > 0) { + this._flag(type, name); } - var output = __assign({}, input); - // tslint:disable-next-line:no-for-in - for (var key in defaults) { - if (defaults.hasOwnProperty(key) && typeof input[key] === 'undefined') { - output[key] = defaults[key]; - } + } + } + } + return this; +}; +Node.prototype.hitTest = function(hit) { + var width = this._pin._width; + var height = this._pin._height; + return hit.x >= 0 && hit.x <= width && hit.y >= 0 && hit.y <= height; +}; +Node.prototype._textures = null; +Node.prototype._alpha = 1; +Node.prototype.render = function(context) { + if (!this._visible) { + return; + } + stats$1.node++; + var m = this.matrix(); + context.setTransform(m.a, m.b, m.c, m.d, m.e, m.f); + this._alpha = this._pin._alpha * (this._parent ? this._parent._alpha : 1); + var alpha = this._pin._textureAlpha * this._alpha; + if (context.globalAlpha != alpha) { + context.globalAlpha = alpha; + } + if (this._textures !== null) { + for (var i = 0, n = this._textures.length; i < n; i++) { + this._textures[i].draw(context); + } + } + if (context.globalAlpha != this._alpha) { + context.globalAlpha = this._alpha; + } + var child, next = this._first; + while (child = next) { + next = child._next; + child.render(context); + } +}; +Node.prototype._tickBefore = null; +Node.prototype._tickAfter = null; +Node.prototype.MAX_ELAPSE = Infinity; +Node.prototype._tick = function(elapsed, now, last) { + if (!this._visible) { + return; + } + if (elapsed > this.MAX_ELAPSE) { + elapsed = this.MAX_ELAPSE; + } + var ticked = false; + if (this._tickBefore !== null) { + for (var i = 0; i < this._tickBefore.length; i++) { + stats$1.tick++; + var tickFn = this._tickBefore[i]; + ticked = tickFn.call(this, elapsed, now, last) === true || ticked; + } + } + var child, next = this._first; + while (child = next) { + next = child._next; + if (child._flag("_tick")) { + ticked = child._tick(elapsed, now, last) === true ? true : ticked; + } + } + if (this._tickAfter !== null) { + for (var i = 0; i < this._tickAfter.length; i++) { + stats$1.tick++; + var tickFn = this._tickAfter[i]; + ticked = tickFn.call(this, elapsed, now, last) === true || ticked; + } + } + return ticked; +}; +Node.prototype.tick = function(ticker, before) { + if (typeof ticker !== "function") { + return; + } + if (before) { + if (this._tickBefore === null) { + this._tickBefore = []; + } + this._tickBefore.push(ticker); + } else { + if (this._tickAfter === null) { + this._tickAfter = []; + } + this._tickAfter.push(ticker); + } + this._flag("_tick", this._tickAfter !== null && this._tickAfter.length > 0 || this._tickBefore !== null && this._tickBefore.length > 0); +}; +Node.prototype.untick = function(ticker) { + if (typeof ticker !== "function") { + return; + } + var i; + if (this._tickBefore !== null && (i = this._tickBefore.indexOf(ticker)) >= 0) { + this._tickBefore.splice(i, 1); + } + if (this._tickAfter !== null && (i = this._tickAfter.indexOf(ticker)) >= 0) { + this._tickAfter.splice(i, 1); + } +}; +Node.prototype.timeout = function(fn, time) { + this.setTimeout(fn, time); +}; +Node.prototype.setTimeout = function(fn, time) { + function timer(t) { + if ((time -= t) < 0) { + this.untick(timer); + fn.call(this); + } else { + return true; + } + } + this.tick(timer); + return timer; +}; +Node.prototype.clearTimeout = function(timer) { + this.untick(timer); +}; +Node.prototype._listeners = null; +Node.prototype._event_callback = function(name, on) { + this._flag(name, on); +}; +Node.prototype.on = function(types, listener) { + if (!types || !types.length || typeof listener !== "function") { + return this; + } + if (this._listeners === null) { + this._listeners = {}; + } + var isarray = typeof types !== "string" && typeof types.join === "function"; + if (types = (isarray ? types.join(" ") : types).match(/\S+/g)) { + for (var i = 0; i < types.length; i++) { + var type = types[i]; + this._listeners[type] = this._listeners[type] || []; + this._listeners[type].push(listener); + if (typeof this._event_callback === "function") { + this._event_callback(type, true); + } + } + } + return this; +}; +Node.prototype.off = function(types, listener) { + if (!types || !types.length || typeof listener !== "function") { + return this; + } + if (this._listeners === null) { + return this; + } + var isarray = typeof types !== "string" && typeof types.join === "function"; + if (types = (isarray ? types.join(" ") : types).match(/\S+/g)) { + for (var i = 0; i < types.length; i++) { + var type = types[i], all = this._listeners[type], index; + if (all && (index = all.indexOf(listener)) >= 0) { + all.splice(index, 1); + if (!all.length) { + delete this._listeners[type]; } - if (typeof Object.getOwnPropertySymbols === 'function') { - var symbols = Object.getOwnPropertySymbols(defaults); - for (var i = 0; i < symbols.length; i++) { - var symbol = symbols[i]; - if (defaults.propertyIsEnumerable(symbol) && typeof input[symbol] === 'undefined') { - output[symbol] = defaults[symbol]; - } - } + if (typeof this._event_callback === "function") { + this._event_callback(type, false); } - return output; + } } - - var debug = function () { - var rest = []; - for (var _i = 0; _i < arguments.length; _i++) { - rest[_i] = arguments[_i]; + } + return this; +}; +Node.prototype.listeners = function(type) { + return this._listeners && this._listeners[type]; +}; +Node.prototype.publish = function(name, args) { + var listeners = this.listeners(name); + if (!listeners || !listeners.length) { + return 0; + } + for (var l = 0; l < listeners.length; l++) { + listeners[l].apply(this, args); + } + return listeners.length; +}; +Node.prototype.trigger = function(name, args) { + this.publish(name, args); + return this; +}; +var native = Math; +const math$1 = Object.create(Math); +math$1.random = function(min, max) { + if (typeof min === "undefined") { + max = 1, min = 0; + } else if (typeof max === "undefined") { + max = min, min = 0; + } + return min == max ? min : native.random() * (max - min) + min; +}; +math$1.wrap = function(num, min, max) { + if (typeof min === "undefined") { + max = 1, min = 0; + } else if (typeof max === "undefined") { + max = min, min = 0; + } + if (max > min) { + num = (num - min) % (max - min); + return num + (num < 0 ? max : min); + } else { + num = (num - max) % (min - max); + return num + (num <= 0 ? min : max); + } +}; +math$1.clamp = function(num, min, max) { + if (num < min) { + return min; + } else if (num > max) { + return max; + } else { + return num; + } +}; +math$1.length = function(x, y) { + return native.sqrt(x * x + y * y); +}; +math$1.rotate = math$1.wrap; +math$1.limit = math$1.clamp; +const isFn = function(value) { + var str = Object.prototype.toString.call(value); + return str === "[object Function]" || str === "[object GeneratorFunction]" || str === "[object AsyncFunction]"; +}; +const isHash = function(value) { + return Object.prototype.toString.call(value) === "[object Object]" && value.constructor === Object; +}; +class Texture { + constructor(texture2, ratio) { + if (typeof texture2 === "object") { + this.src(texture2, ratio); + } + } + pipe() { + return new Texture(this); + } + /** + * Signatures: (texture), (x, y, w, h), (w, h) + */ + src(x, y, w, h) { + if (typeof x === "object") { + var drawable = x, ratio = y || 1; + this._image = drawable; + this._sx = this._dx = 0; + this._sy = this._dy = 0; + this._sw = this._dw = drawable.width / ratio; + this._sh = this._dh = drawable.height / ratio; + this.width = drawable.width / ratio; + this.height = drawable.height / ratio; + this.ratio = ratio; + } else { + if (typeof w === "undefined") { + w = x, h = y; + } else { + this._sx = x, this._sy = y; + } + this._sw = this._dw = w; + this._sh = this._dh = h; + this.width = w; + this.height = h; + } + return this; + } + /** + * Signatures: (x, y, w, h), (x, y) + */ + dest(x, y, w, h) { + this._dx = x, this._dy = y; + this._dx = x, this._dy = y; + if (typeof w !== "undefined") { + this._dw = w, this._dh = h; + this.width = w, this.height = h; + } + return this; + } + draw(context, x1, y1, x2, y2, x3, y3, x4, y4) { + var drawable = this._image; + if (drawable === null || typeof drawable !== "object") { + return; + } + var sx = this._sx, sy = this._sy; + var sw = this._sw, sh = this._sh; + var dx = this._dx, dy = this._dy; + var dw = this._dw, dh = this._dh; + if (typeof x3 !== "undefined") { + x1 = math$1.clamp(x1, 0, this._sw), x2 = math$1.clamp(x2, 0, this._sw - x1); + y1 = math$1.clamp(y1, 0, this._sh), y2 = math$1.clamp(y2, 0, this._sh - y1); + sx += x1, sy += y1, sw = x2, sh = y2; + dx = x3, dy = y3, dw = x4, dh = y4; + } else if (typeof x2 !== "undefined") { + dx = x1, dy = y1, dw = x2, dh = y2; + } else if (typeof x1 !== "undefined") { + dw = x1, dh = y1; + } + var ratio = this.ratio || 1; + sx *= ratio, sy *= ratio, sw *= ratio, sh *= ratio; + try { + if (typeof drawable.draw === "function") { + drawable.draw(context, sx, sy, sw, sh, dx, dy, dw, dh); + } else { + stats$1.draw++; + context.drawImage(drawable, sx, sy, sw, sh, dx, dy, dw, dh); + } + } catch (ex) { + if (!drawable._draw_failed) { + console.log("Unable to draw: ", drawable); + console.log(ex); + drawable._draw_failed = true; + } + } + } +} +var NO_TEXTURE = new class extends Texture { + constructor() { + super(); + __publicField(this, "pipe", function() { + return this; + }); + __publicField(this, "src", function() { + return this; + }); + __publicField(this, "dest", function() { + return this; + }); + __publicField(this, "draw", function() { + }); + this.x = this.y = this.width = this.height = 0; + } +}(); +var NO_SELECTION = new Selection(NO_TEXTURE); +function preloadImage(src) { + console.log("Loading image: " + src); + return new Promise(function(resolve, reject) { + const img = new Image(); + img.onload = function() { + console.log("Image loaded: " + src); + resolve(img); + }; + img.onerror = function(error) { + console.log("Loading failed: " + src); + reject(error); + }; + img.src = src; + }); +} +var _atlases_map = {}; +var _atlases_arr = []; +const atlas = async function(def) { + var atlas2 = isFn(def.draw) ? def : new Atlas(def); + if (def.name) { + _atlases_map[def.name] = atlas2; + } + _atlases_arr.push(atlas2); + deprecated(def, "imagePath"); + deprecated(def, "imageRatio"); + var url = def.imagePath; + var ratio = def.imageRatio || 1; + if ("string" === typeof def.image) { + url = def.image; + } else if (isHash(def.image)) { + url = def.image.src || def.image.url; + ratio = def.image.ratio || ratio; + } + if (url) { + const image2 = await preloadImage(url); + atlas2.src(image2, ratio); + } + return atlas2; +}; +class Atlas extends Texture { + constructor(def) { + super(); + var atlas2 = this; + deprecated(def, "filter"); + deprecated(def, "cutouts"); + deprecated(def, "sprites"); + deprecated(def, "factory"); + var map = def.map || def.filter; + var ppu = def.ppu || def.ratio || 1; + var trim = def.trim || 0; + var textures = def.textures; + var factory = def.factory; + var cutouts = def.cutouts || def.sprites; + function make(def2) { + if (!def2 || isFn(def2.draw)) { + return def2; + } + def2 = Object.assign({}, def2); + if (isFn(map)) { + def2 = map(def2); + } + if (ppu != 1) { + def2.x *= ppu, def2.y *= ppu; + def2.width *= ppu, def2.height *= ppu; + def2.top *= ppu, def2.bottom *= ppu; + def2.left *= ppu, def2.right *= ppu; + } + if (trim != 0) { + def2.x += trim, def2.y += trim; + def2.width -= 2 * trim, def2.height -= 2 * trim; + def2.top -= trim, def2.bottom -= trim; + def2.left -= trim, def2.right -= trim; + } + var texture2 = atlas2.pipe(); + texture2.top = def2.top, texture2.bottom = def2.bottom; + texture2.left = def2.left, texture2.right = def2.right; + texture2.src(def2.x, def2.y, def2.width, def2.height); + return texture2; + } + function find(query) { + if (textures) { + if (isFn(textures)) { + return textures(query); + } else if (isHash(textures)) { + return textures[query]; } - return; + } + if (cutouts) { + var result = null, n = 0; + for (var i = 0; i < cutouts.length; i++) { + if (string.startsWith(cutouts[i].name, query)) { + if (n === 0) { + result = cutouts[i]; + } else if (n === 1) { + result = [result, cutouts[i]]; + } else { + result.push(cutouts[i]); + } + n++; + } + } + if (n === 0 && isFn(factory)) { + result = function(subquery) { + return factory(query + (subquery ? subquery : "")); + }; + } + return result; + } + } + this.select = function(query) { + if (!query) { + return new Selection(this.pipe()); + } + var found = find(query); + if (found) { + return new Selection(found, find, make); + } }; - var assert = function (statement, err, log) { + } +} +function Selection(result, find, make) { + function link(result2, subquery) { + if (!result2) { + return NO_TEXTURE; + } else if (isFn(result2.draw)) { + return result2; + } else if (isHash(result2) && "number" === typeof result2.width && "number" === typeof result2.height && isFn(make)) { + return make(result2); + } else if (isHash(result2) && "undefined" !== typeof subquery) { + return link(result2[subquery]); + } else if (isFn(result2)) { + return link(result2(subquery)); + } else if (Array.isArray(result2)) { + return link(result2[0]); + } else if ("string" === typeof result2 && isFn(find)) { + return link(find(result2)); + } + } + this.one = function(subquery) { + return link(result, subquery); + }; + this.array = function(arr) { + var array = Array.isArray(arr) ? arr : []; + if (Array.isArray(result)) { + for (var i = 0; i < result.length; i++) { + array[i] = link(result[i]); + } + } else { + array[0] = link(result); + } + return array; + }; +} +const texture = function(query) { + if (!("string" === typeof query)) { + return new Selection(query); + } + var result = null, atlas2, i; + if ((i = query.indexOf(":")) > 0 && query.length > i + 1) { + atlas2 = _atlases_map[query.slice(0, i)]; + result = atlas2 && atlas2.select(query.slice(i + 1)); + } + if (!result && (atlas2 = _atlases_map[query])) { + result = atlas2.select(); + } + for (i = 0; !result && i < _atlases_arr.length; i++) { + result = _atlases_arr[i].select(query); + } + if (!result) { + console.error("Texture not found: " + query); + result = NO_SELECTION; + } + return result; +}; +function deprecated(hash, name, msg) { + if (name in hash) + console.log(msg ? msg.replace("%name", name) : "'" + name + "' field of texture atlas is deprecated."); +} +const canvas = function(type, attributes, plotter) { + if (typeof type === "string") { + if (typeof attributes === "object") + ; + else { + if (typeof attributes === "function") { + plotter = attributes; + } + attributes = {}; + } + } else { + if (typeof type === "function") { + plotter = type; + } + attributes = {}; + type = "2d"; + } + var canvas2 = document.createElement("canvas"); + var context = canvas2.getContext(type, attributes); + var texture2 = new Texture(canvas2); + texture2.context = function() { + return context; + }; + texture2.size = function(width, height, ratio) { + ratio = ratio || 1; + canvas2.width = width * ratio; + canvas2.height = height * ratio; + this.src(canvas2, ratio); + return this; + }; + texture2.canvas = function(fn) { + if (typeof fn === "function") { + fn.call(this, context); + } else if (typeof fn === "undefined" && typeof plotter === "function") { + plotter.call(this, context); + } + return this; + }; + if (typeof plotter === "function") { + plotter.call(texture2, context); + } + return texture2; +}; +const PIXEL_RATIO = window.devicePixelRatio || 1; +let M; +function memoizeDraw(callback, memoKey = () => null) { + let lastRatio = 0; + let lastSelection = void 0; + let texture2 = Stage.canvas(); + let sprite2 = Stage.sprite(); + let first = true; + sprite2.tick(function() { + let m = this._parent.matrix(); + if (first) { + first = false; + if (!(m = M)) { + return; + } + } + M = m; + let newRatio = Math.max(Math.abs(m.a), Math.abs(m.b)); + let rationChange = lastRatio / newRatio; + if (lastRatio === 0 || rationChange > 1.25 || rationChange < 0.8) { + const newSelection = memoKey(); + if (lastSelection !== newSelection) { + lastRatio = newRatio; + callback(2.5 * newRatio / PIXEL_RATIO, texture2, sprite2); + sprite2.texture(texture2); + sprite2.__timestamp = Date.now(); + } + } + }, false); + return sprite2; +} +class Mouse { + constructor() { + __publicField(this, "x", 0); + __publicField(this, "y", 0); + __publicField(this, "ratio", 1); + __publicField(this, "stage"); + __publicField(this, "elem"); + __publicField(this, "clicklist", []); + __publicField(this, "cancellist", []); + __publicField(this, "handleStart", (event) => { + event.preventDefault(); + this.locate(event); + this.publish(event.type, event); + this.lookup("click", this.clicklist); + this.lookup("mousecancel", this.cancellist); + }); + __publicField(this, "handleMove", (event) => { + event.preventDefault(); + this.locate(event); + this.publish(event.type, event); + }); + __publicField(this, "handleEnd", (event) => { + event.preventDefault(); + this.publish(event.type, event); + if (this.clicklist.length) { + this.publish("click", event, this.clicklist); + } + this.cancellist.length = 0; + }); + __publicField(this, "handleCancel", (event) => { + if (this.cancellist.length) { + this.publish("mousecancel", event, this.cancellist); + } + this.clicklist.length = 0; + }); + __publicField(this, "toString", function() { + return (this.x | 0) + "x" + (this.y | 0); + }); + __publicField(this, "locate", function(event) { + const elem = this.elem; + let x; + let y; + if (event.touches && event.touches.length) { + x = event.touches[0].clientX; + y = event.touches[0].clientY; + } else { + x = event.clientX; + y = event.clientY; + } + var rect = elem.getBoundingClientRect(); + x -= rect.left; + y -= rect.top; + x -= elem.clientLeft | 0; + y -= elem.clientTop | 0; + this.x = x * this.ratio; + this.y = y * this.ratio; + }); + __publicField(this, "lookup", function(type, collect) { + this.type = type; + this.root = this.stage; + this.event = null; + collect.length = 0; + this.collect = collect; + this.root.visit({ + reverse: true, + visible: true, + start: this.visitStart, + end: this.visitEnd + }, this); + }); + __publicField(this, "publish", function(type, event, targets) { + this.type = type; + this.root = this.stage; + this.event = event; + this.collect = false; + this.timeStamp = Date.now(); + if (type !== "mousemove" && type !== "touchmove") { + console.log(this.type + " " + this); + } + if (targets) { + while (targets.length) + if (this.visitEnd(targets.shift())) + break; + targets.length = 0; + } else { + this.root.visit({ + reverse: true, + visible: true, + start: this.visitStart, + end: this.visitEnd + }, this); + } + }); + __publicField(this, "visitStart", (node) => { + return !node._flag(this.type); + }); + __publicField(this, "visitEnd", (node) => { + rel.raw = this.event; + rel.type = this.type; + rel.timeStamp = this.timeStamp; + rel.abs.x = this.x; + rel.abs.y = this.y; + var listeners = node.listeners(this.type); + if (!listeners) { + return; + } + node.matrix().inverse().map(this, rel); + if (!(node === this.root || node.attr("spy") || node.hitTest(rel))) { return; + } + if (this.collect) { + this.collect.push(node); + } + if (this.event) { + var cancel = false; + for (var l = 0; l < listeners.length; l++) { + cancel = listeners[l].call(node, rel) ? true : cancel; + } + return cancel; + } + }); + } + mount(stage, elem) { + this.stage = stage; + this.elem = elem; + this.ratio = stage.viewport().ratio || 1; + stage.on("viewport", (size) => { + this.ratio = size.ratio ?? this.ratio; + }); + elem.addEventListener("touchstart", this.handleStart); + elem.addEventListener("touchend", this.handleEnd); + elem.addEventListener("touchmove", this.handleMove); + elem.addEventListener("touchcancel", this.handleCancel); + elem.addEventListener("mousedown", this.handleStart); + elem.addEventListener("mouseup", this.handleEnd); + elem.addEventListener("mousemove", this.handleMove); + document.addEventListener("mouseup", this.handleCancel); + window.addEventListener("blur", this.handleCancel); + return this; + } + unmount() { + const elem = this.elem; + elem.removeEventListener("touchstart", this.handleStart); + elem.removeEventListener("touchend", this.handleEnd); + elem.removeEventListener("touchmove", this.handleMove); + elem.removeEventListener("touchcancel", this.handleCancel); + elem.removeEventListener("mousedown", this.handleStart); + elem.removeEventListener("mouseup", this.handleEnd); + elem.removeEventListener("mousemove", this.handleMove); + document.removeEventListener("mouseup", this.handleCancel); + window.removeEventListener("blur", this.handleCancel); + return this; + } +} +__publicField(Mouse, "CLICK", "click"); +__publicField(Mouse, "START", "touchstart mousedown"); +__publicField(Mouse, "MOVE", "touchmove mousemove"); +__publicField(Mouse, "END", "touchend mouseup"); +__publicField(Mouse, "CANCEL", "touchcancel mousecancel"); +var rel = {}, abs = {}; +defineValue(rel, "clone", function(obj) { + obj = obj || {}, obj.x = this.x, obj.y = this.y; + return obj; +}); +defineValue(rel, "toString", function() { + return (this.x | 0) + "x" + (this.y | 0) + " (" + this.abs + ")"; +}); +defineValue(rel, "abs", abs); +defineValue(abs, "clone", function(obj) { + obj = obj || {}, obj.x = this.x, obj.y = this.y; + return obj; +}); +defineValue(abs, "toString", function() { + return (this.x | 0) + "x" + (this.y | 0); +}); +function defineValue(obj, name, value) { + Object.defineProperty(obj, name, { + value + }); +} +function IDENTITY(x) { + return x; +} +var _cache = {}; +var _modes = {}; +var _easings = {}; +class Easing { + static get(token, fallback = IDENTITY) { + if (typeof token === "function") { + return token; + } + if (typeof token !== "string") { + return fallback; + } + var fn = _cache[token]; + if (fn) { + return fn; + } + var match = /^(\w+)(-(in|out|in-out|out-in))?(\((.*)\))?$/i.exec(token); + if (!match || !match.length) { + return fallback; + } + var easing = _easings[match[1]]; + var mode = _modes[match[3]]; + var params = match[5]; + if (easing && easing.fn) { + fn = easing.fn; + } else if (easing && easing.fc) { + fn = easing.fc.apply(easing.fc, params && params.replace(/\s+/, "").split(",")); + } else { + fn = fallback; + } + if (mode) { + fn = mode.fn(fn); + } + _cache[token] = fn; + return fn; + } + static add(data) { + var names = (data.name || data.mode).split(/\s+/); + for (var i = 0; i < names.length; i++) { + var name = names[i]; + if (name) { + (data.name ? _easings : _modes)[name] = data; + } + } + } +} +Easing.add({ + mode: "in", + fn: function(f) { + return f; + } +}); +Easing.add({ + mode: "out", + fn: function(f) { + return function(t) { + return 1 - f(1 - t); }; - var common = { - assert: assert, - debug: debug, + } +}); +Easing.add({ + mode: "in-out", + fn: function(f) { + return function(t) { + return t < 0.5 ? f(2 * t) / 2 : 1 - f(2 * (1 - t)) / 2; }; - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var math$1 = Object.create(Math); - // @ts-ignore - // noinspection JSConstantReassignment - math$1.EPSILON = 1e-9; // TODO - math$1.isFinite = function (x) { - return (typeof x === 'number') && isFinite(x) && !isNaN(x); + } +}); +Easing.add({ + mode: "out-in", + fn: function(f) { + return function(t) { + return t < 0.5 ? 1 - f(2 * (1 - t)) / 2 : f(2 * t) / 2; }; - math$1.assert = function (x) { - return; + } +}); +Easing.add({ + name: "linear", + fn: function(t) { + return t; + } +}); +Easing.add({ + name: "quad", + fn: function(t) { + return t * t; + } +}); +Easing.add({ + name: "cubic", + fn: function(t) { + return t * t * t; + } +}); +Easing.add({ + name: "quart", + fn: function(t) { + return t * t * t * t; + } +}); +Easing.add({ + name: "quint", + fn: function(t) { + return t * t * t * t * t; + } +}); +Easing.add({ + name: "sin sine", + fn: function(t) { + return 1 - Math.cos(t * Math.PI / 2); + } +}); +Easing.add({ + name: "exp expo", + fn: function(t) { + return t == 0 ? 0 : Math.pow(2, 10 * (t - 1)); + } +}); +Easing.add({ + name: "circle circ", + fn: function(t) { + return 1 - Math.sqrt(1 - t * t); + } +}); +Easing.add({ + name: "bounce", + fn: function(t) { + return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + 0.75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375 : 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375; + } +}); +Easing.add({ + name: "poly", + fc: function(e) { + return function(t) { + return Math.pow(t, e); }; - math$1.invSqrt = function (x) { - // TODO: - return 1 / Math.sqrt(x); + } +}); +Easing.add({ + name: "elastic", + fc: function(a, p) { + p = p || 0.45; + a = a || 1; + var s = p / (2 * Math.PI) * Math.asin(1 / a); + return function(t) { + return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p); }; - math$1.nextPowerOfTwo = function (x) { - // TODO - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - return x + 1; + } +}); +Easing.add({ + name: "back", + fc: function(s) { + s = typeof s !== "undefined" ? s : 1.70158; + return function(t) { + return t * t * ((s + 1) * t - s); }; - math$1.isPowerOfTwo = function (x) { - return x > 0 && (x & (x - 1)) === 0; + } +}); +Node.prototype.tween = function(a, b, c) { + let options; + if (typeof a === "object" && a !== null) { + options = a; + } else if (typeof a === "number" && typeof b === "number") { + options = { + duration: a, + delay: b, + append: c }; - math$1.mod = function (num, min, max) { - if (typeof min === 'undefined') { - max = 1; - min = 0; + } else if (typeof a === "number") { + options = { + duration: a, + delay: 0, + append: b + }; + } else { + options = { + duration: 400, + delay: 0, + append: a + }; + } + if (!this._tweens) { + this._tweens = []; + var ticktime = 0; + this.tick(function(elapsed, now, last) { + if (!this._tweens.length) { + return false; + } + var ignore = ticktime != last; + ticktime = now; + if (ignore) { + return true; + } + var head = this._tweens[0]; + var ended = head.tick(this, elapsed, now, last); + if (ended) { + if (head === this._tweens[0]) { + this._tweens.shift(); } - else if (typeof max === 'undefined') { - max = min; - min = 0; + var next = head.finish(); + if (next) { + this._tweens.unshift(next); } - if (max > min) { - num = (num - min) % (max - min); - return num + (num < 0 ? max : min); + } + return true; + }, true); + } + this.touch(); + if (!options.append) { + this._tweens.length = 0; + } + var tween = new Tween(this, options); + this._tweens.push(tween); + return tween; +}; +class Tween { + constructor(owner, options = {}) { + __publicField(this, "_ending", []); + this._end = {}; + this._duration = options.duration || 400; + this._delay = options.delay || 0; + this._owner = owner; + this._time = 0; + } + // @internal + tick(node, elapsed, now, last) { + this._time += elapsed; + if (this._time < this._delay) { + return; + } + var time = this._time - this._delay; + if (!this._start) { + this._start = {}; + for (var key in this._end) { + this._start[key] = this._owner.pin(key); + } + } + var p = Math.min(time / this._duration, 1); + var ended = p >= 1; + if (typeof this._easing == "function") { + p = this._easing(p); + } + var q = 1 - p; + for (var key in this._end) { + this._owner.pin(key, this._start[key] * q + this._end[key] * p); + } + return ended; + } + // @internal + finish() { + this._ending.forEach((callback) => { + try { + callback.call(this._owner); + } catch (e) { + console.error(e); + } + }); + return this._next; + } + tween(duration, delay) { + return this._next = new Tween(this._owner, duration, delay); + } + duration(duration) { + this._duration = duration; + return this; + } + delay(delay) { + this._delay = delay; + return this; + } + ease(easing) { + this._easing = Easing.get(easing); + return this; + } + done(fn) { + this._ending.push(fn); + return this; + } + hide() { + this._ending.push(function() { + this.hide(); + }); + this._hide = true; + return this; + } + remove() { + this._ending.push(function() { + this.remove(); + }); + this._remove = true; + return this; + } + pin(a, b) { + if (typeof a === "object") { + for (var attr in a) { + pinning(this._owner, this._end, attr, a[attr]); + } + } else if (typeof b !== "undefined") { + pinning(this._owner, this._end, a, b); + } + return this; + } + /** + * @deprecated Use .done(fn) instead. + */ + then(fn) { + this.done(fn); + return this; + } + /** + * @deprecated this doesn't do anything anymore, call tween on the node instead. + */ + clear(forward) { + return this; + } +} +function pinning(node, map, key, value) { + if (typeof node.pin(key) === "number") { + map[key] = value; + } else if (typeof node.pin(key + "X") === "number" && typeof node.pin(key + "Y") === "number") { + map[key + "X"] = value; + map[key + "Y"] = value; + } +} +Pin._add_shortcuts(Tween.prototype); +const _stages = []; +const pause = function() { + for (let i = _stages.length - 1; i >= 0; i--) { + _stages[i].pause(); + } +}; +const resume = function() { + for (let i = _stages.length - 1; i >= 0; i--) { + _stages[i].resume(); + } +}; +const mount = function(configs = {}) { + let root = new Root(); + root.mount(configs); + root.mouse = new Mouse().mount(root, root.dom); + return root; +}; +class Root extends Node { + constructor() { + super(); + __publicField(this, "canvas", null); + __publicField(this, "dom", null); + __publicField(this, "context", null); + __publicField(this, "pixelWidth", -1); + __publicField(this, "pixelHeight", -1); + __publicField(this, "pixelRatio", 1); + __publicField(this, "drawingWidth", 0); + __publicField(this, "drawingHeight", 0); + __publicField(this, "mounted", false); + __publicField(this, "paused", false); + __publicField(this, "sleep", false); + __publicField(this, "mount", (configs = {}) => { + if (typeof configs.canvas === "string") { + this.canvas = document.getElementById(configs.canvas); + } else if (configs.canvas instanceof HTMLCanvasElement) { + this.canvas = configs.canvas; + } else if (configs.canvas) + ; + if (!this.canvas) { + this.canvas = document.getElementById("cutjs") || document.getElementById("stage"); + } + if (!this.canvas) { + console.log("Creating Canvas..."); + this.canvas = document.createElement("canvas"); + Object.assign(this.canvas.style, { + position: "absolute", + display: "block", + top: "0", + left: "0", + bottom: "0", + right: "0", + width: "100%", + height: "100%" + }); + let body = document.body; + body.insertBefore(this.canvas, body.firstChild); + } + this.dom = this.canvas; + this.context = this.canvas.getContext("2d"); + this.devicePixelRatio = window.devicePixelRatio || 1; + this.backingStoreRatio = this.context.webkitBackingStorePixelRatio || this.context.mozBackingStorePixelRatio || this.context.msBackingStorePixelRatio || this.context.oBackingStorePixelRatio || this.context.backingStorePixelRatio || 1; + this.pixelRatio = this.devicePixelRatio / this.backingStoreRatio; + this.mounted = true; + _stages.push(this); + this.requestFrame(this.onFrame); + }); + __publicField(this, "frameRequested", false); + __publicField(this, "requestFrame", () => { + if (!this.frameRequested) { + this.frameRequested = true; + requestAnimationFrame(this.onFrame); + } + }); + __publicField(this, "lastTime", 0); + __publicField(this, "_mo_touch", null); + // monitor touch + __publicField(this, "onFrame", (now) => { + this.frameRequested = false; + if (!this.mounted) { + return; + } + this.requestFrame(); + const newPixelWidth = this.canvas.clientWidth; + const newPixelHeight = this.canvas.clientHeight; + if (this.pixelWidth !== newPixelWidth || this.pixelHeight !== newPixelHeight) { + this.pixelWidth = newPixelWidth; + this.pixelHeight = newPixelHeight; + this.drawingWidth = newPixelWidth * this.pixelRatio; + this.drawingHeight = newPixelHeight * this.pixelRatio; + if (this.canvas.width !== this.drawingWidth || this.canvas.height !== this.drawingHeight) { + this.canvas.width = this.drawingWidth; + this.canvas.height = this.drawingHeight; + console.log("Resize: [" + this.drawingWidth + ", " + this.drawingHeight + "] = " + this.pixelRatio + " x [" + this.pixelWidth + ", " + this.pixelHeight + "]"); + this.viewport({ + width: this.drawingWidth, + height: this.drawingHeight, + ratio: this.pixelRatio + }); } - else { - num = (num - max) % (min - max); - return num + (num <= 0 ? min : max); + } + let last = this.lastTime || now; + let elapsed = now - last; + if (!this.mounted || this.paused || this.sleep) { + return; + } + this.lastTime = now; + let tickRequest = this._tick(elapsed, now, last); + if (this._mo_touch != this._ts_touch) { + this._mo_touch = this._ts_touch; + this.sleep = false; + if (this.drawingWidth > 0 && this.drawingHeight > 0) { + this.context.setTransform(1, 0, 0, 1, 0, 0); + this.context.clearRect(0, 0, this.drawingWidth, this.drawingHeight); + this.render(this.context); } + } else if (tickRequest) { + this.sleep = false; + } else { + this.sleep = true; + } + stats$1.fps = elapsed ? 1e3 / elapsed : 0; + }); + this.label("Root"); + } + resume() { + if (this.sleep || this.paused) { + this.requestFrame(); + } + this.paused = false; + this.sleep = false; + this.publish("resume"); + return this; + } + pause() { + if (!this.paused) { + this.publish("pause"); + } + this.paused = true; + return this; + } + touch() { + if (this.sleep || this.paused) { + this.requestFrame(); + } + this.sleep = false; + return Node.prototype.touch(); + } + unmount() { + var _a; + this.mounted = false; + let index = _stages.indexOf(this); + if (index >= 0) { + _stages.splice(index, 1); + } + (_a = this.mouse) == null ? void 0 : _a.unmount(); + return this; + } + background(color) { + this.dom.style.backgroundColor = color; + return this; + } + /** + * Set/Get viewport. + * This is used along with viewbox to determine the scale and position of the viewbox within the viewport. + * Viewport is the size of the container, for example size of the canvas element. + * Viewbox is provided by the user, and is the ideal size of the content. + */ + viewport(width, height, ratio) { + if (typeof width === "undefined") { + return Object.assign({}, this._viewport); + } + if (typeof width === "object") { + const options = width; + width = options.width; + height = options.height; + ratio = options.ratio; + } + this._viewport = { + width, + height, + ratio: ratio || 1 }; - math$1.clamp = function (num, min, max) { - if (num < min) { - return min; - } - else if (num > max) { - return max; + this.viewbox(); + let data = Object.assign({}, this._viewport); + this.visit({ + start: function(node) { + if (!node._flag("viewport")) { + return true; } - else { - return num; + node.publish("viewport", [data]); + } + }); + return this; + } + /** + * Set viewbox. + * + * @param {mode} string - One of: 'in-pad' (like css object-fit: 'contain'), 'in', 'out-crop' (like css object-fit: 'cover'), 'out' + */ + // TODO: static/fixed viewbox + // TODO: use css object-fit values + viewbox(width, height, mode) { + if (typeof width === "number" && typeof height === "number") { + this._viewbox = { + width, + height, + mode + }; + } else if (typeof width === "object" && width !== null) { + this._viewbox = { + ...width + }; + } + this.rescale(); + return this; + } + camera(matrix) { + this._camera = matrix; + this.rescale(); + return this; + } + rescale() { + let viewbox = this._viewbox; + let viewport = this._viewport; + let camera = this._camera; + if (viewport && viewbox) { + const viewportWidth = viewport.width; + const viewportHeight = viewport.height; + const viewboxMode = /^(in|out|in-pad|out-crop)$/.test(viewbox.mode) ? viewbox.mode : "in-pad"; + const viewboxWidth = viewbox.width; + const viewboxHeight = viewbox.height; + this.pin({ + width: viewboxWidth, + height: viewboxHeight + }); + this.scaleTo(viewportWidth, viewportHeight, viewboxMode); + const viewboxX = viewbox.x || 0; + const viewboxY = viewbox.y || 0; + const cameraZoom = (camera == null ? void 0 : camera.a) || 1; + const cameraX = (camera == null ? void 0 : camera.e) || 0; + const cameraY = (camera == null ? void 0 : camera.f) || 0; + const scaleX = this.pin("scaleX"); + const scaleY = this.pin("scaleY"); + this.pin("scaleX", scaleX * cameraZoom); + this.pin("scaleY", scaleY * cameraZoom); + this.pin("offsetX", cameraX - viewboxX * scaleX * cameraZoom); + this.pin("offsetY", cameraY - viewboxY * scaleY * cameraZoom); + } else if (viewport) { + this.pin({ + width: viewport.width, + height: viewport.height + }); + } + return this; + } +} +const sprite = function(frame) { + var sprite2 = new Sprite(); + frame && sprite2.texture(frame); + return sprite2; +}; +Sprite._super = Node; +Sprite.prototype = Object.create(Sprite._super.prototype); +function Sprite() { + Sprite._super.call(this); + this.label("Sprite"); + this._textures = []; + this._image = null; +} +Sprite.prototype.texture = function(frame) { + this._image = texture(frame).one(); + this.pin("width", this._image ? this._image.width : 0); + this.pin("height", this._image ? this._image.height : 0); + this._textures[0] = this._image.pipe(); + this._textures.length = 1; + return this; +}; +Sprite.prototype.tile = function(inner) { + this._repeat(false, inner); + return this; +}; +Sprite.prototype.stretch = function(inner) { + this._repeat(true, inner); + return this; +}; +Sprite.prototype._repeat = function(stretch, inner) { + var self = this; + this.untick(this._repeatTicker); + this.tick(this._repeatTicker = function() { + if (this._mo_stretch == this._pin._ts_transform) { + return; + } + this._mo_stretch = this._pin._ts_transform; + var width = this.pin("width"); + var height = this.pin("height"); + this._textures.length = repeat(this._image, width, height, stretch, inner, insert); + }); + function insert(i, sx, sy, sw, sh, dx, dy, dw, dh) { + var repeat2 = self._textures.length > i ? self._textures[i] : self._textures[i] = self._image.pipe(); + repeat2.src(sx, sy, sw, sh); + repeat2.dest(dx, dy, dw, dh); + } +}; +function repeat(img, owidth, oheight, stretch, inner, insert) { + var width = img.width; + var height = img.height; + var left = img.left; + var right = img.right; + var top = img.top; + var bottom = img.bottom; + left = typeof left === "number" && left === left ? left : 0; + right = typeof right === "number" && right === right ? right : 0; + top = typeof top === "number" && top === top ? top : 0; + bottom = typeof bottom === "number" && bottom === bottom ? bottom : 0; + width = width - left - right; + height = height - top - bottom; + if (!inner) { + owidth = Math.max(owidth - left - right, 0); + oheight = Math.max(oheight - top - bottom, 0); + } + var i = 0; + if (top > 0 && left > 0) + insert(i++, 0, 0, left, top, 0, 0, left, top); + if (bottom > 0 && left > 0) + insert(i++, 0, height + top, left, bottom, 0, oheight + top, left, bottom); + if (top > 0 && right > 0) + insert(i++, width + left, 0, right, top, owidth + left, 0, right, top); + if (bottom > 0 && right > 0) + insert( + i++, + width + left, + height + top, + right, + bottom, + owidth + left, + oheight + top, + right, + bottom + ); + if (stretch) { + if (top > 0) + insert(i++, left, 0, width, top, left, 0, owidth, top); + if (bottom > 0) + insert( + i++, + left, + height + top, + width, + bottom, + left, + oheight + top, + owidth, + bottom + ); + if (left > 0) + insert(i++, 0, top, left, height, 0, top, left, oheight); + if (right > 0) + insert( + i++, + width + left, + top, + right, + height, + owidth + left, + top, + right, + oheight + ); + insert(i++, left, top, width, height, left, top, owidth, oheight); + } else { + var l = left, r = owidth, w; + while (r > 0) { + w = Math.min(width, r), r -= width; + var t = top, b = oheight, h; + while (b > 0) { + h = Math.min(height, b), b -= height; + insert(i++, left, top, w, h, l, t, w, h); + if (r <= 0) { + if (left) + insert(i++, 0, top, left, h, 0, t, left, h); + if (right) + insert(i++, width + left, top, right, h, l + w, t, right, h); } + t += h; + } + if (top) + insert(i++, left, 0, w, top, l, 0, w, top); + if (bottom) + insert(i++, left, height + top, w, bottom, l, t, w, bottom); + l += w; + } + } + return i; +} +Sprite.prototype.image = Sprite.prototype.texture; +const image = sprite; +const Image$1 = Sprite; +const anim = function(frames, fps) { + var anim2 = new Anim(); + anim2.frames(frames).gotoFrame(0); + fps && anim2.fps(fps); + return anim2; +}; +Anim._super = Node; +Anim.prototype = Object.create(Anim._super.prototype); +const FPS = 15; +function Anim() { + Anim._super.call(this); + this.label("Anim"); + this._textures = []; + this._fps = FPS; + this._ft = 1e3 / this._fps; + this._time = -1; + this._repeat = 0; + this._index = 0; + this._frames = []; + var lastTime = 0; + this.tick(function(t, now, last) { + if (this._time < 0 || this._frames.length <= 1) { + return; + } + var ignore = lastTime != last; + lastTime = now; + if (ignore) { + return true; + } + this._time += t; + if (this._time < this._ft) { + return true; + } + var n = this._time / this._ft | 0; + this._time -= n * this._ft; + this.moveFrame(n); + if (this._repeat > 0 && (this._repeat -= n) <= 0) { + this.stop(); + this._callback && this._callback(); + return false; + } + return true; + }, false); +} +Anim.prototype.fps = function(fps) { + if (typeof fps === "undefined") { + return this._fps; + } + this._fps = fps > 0 ? fps : FPS; + this._ft = 1e3 / this._fps; + return this; +}; +Anim.prototype.setFrames = function(a, b, c) { + return this.frames(a, b, c); +}; +Anim.prototype.frames = function(frames) { + this._index = 0; + this._frames = texture(frames).array(); + this.touch(); + return this; +}; +Anim.prototype.length = function() { + return this._frames ? this._frames.length : 0; +}; +Anim.prototype.gotoFrame = function(frame, resize) { + this._index = math$1.wrap(frame, this._frames.length) | 0; + resize = resize || !this._textures[0]; + this._textures[0] = this._frames[this._index]; + if (resize) { + this.pin("width", this._textures[0].width); + this.pin("height", this._textures[0].height); + } + this.touch(); + return this; +}; +Anim.prototype.moveFrame = function(move) { + return this.gotoFrame(this._index + move); +}; +Anim.prototype.repeat = function(repeat2, callback) { + this._repeat = repeat2 * this._frames.length - 1; + this._callback = callback; + this.play(); + return this; +}; +Anim.prototype.play = function(frame) { + if (typeof frame !== "undefined") { + this.gotoFrame(frame); + this._time = 0; + } else if (this._time < 0) { + this._time = 0; + } + this.touch(); + return this; +}; +Anim.prototype.stop = function(frame) { + this._time = -1; + if (typeof frame !== "undefined") { + this.gotoFrame(frame); + } + return this; +}; +const string$1 = function(frames) { + return new Str().frames(frames); +}; +Str._super = Node; +Str.prototype = Object.create(Str._super.prototype); +function Str() { + Str._super.call(this); + this.label("String"); + this._textures = []; +} +Str.prototype.setFont = function(a, b, c) { + return this.frames(a, b, c); +}; +Str.prototype.frames = function(frames) { + this._textures = []; + if (typeof frames == "string") { + frames = texture(frames); + this._item = function(value) { + return frames.one(value); }; - math$1.random = function (min, max) { - if (typeof min === 'undefined') { - max = 1; - min = 0; - } - else if (typeof max === 'undefined') { - max = min; - min = 0; + } else if (typeof frames === "object") { + this._item = function(value) { + return frames[value]; + }; + } else if (typeof frames === "function") { + this._item = frames; + } + return this; +}; +Str.prototype.setValue = function(a, b, c) { + return this.value(a, b, c); +}; +Str.prototype.value = function(value) { + if (typeof value === "undefined") { + return this._value; + } + if (this._value === value) { + return this; + } + this._value = value; + if (value === null) { + value = ""; + } else if (typeof value !== "string" && !Array.isArray(value)) { + value = value.toString(); + } + this._spacing = this._spacing || 0; + var width = 0, height = 0; + for (var i = 0; i < value.length; i++) { + var texture2 = this._textures[i] = this._item(value[i]); + width += i > 0 ? this._spacing : 0; + texture2.dest(width, 0); + width = width + texture2.width; + height = Math.max(height, texture2.height); + } + this.pin("width", width); + this.pin("height", height); + this._textures.length = value.length; + return this; +}; +const row = function(align) { + return create().row(align).label("Row"); +}; +Node.prototype.row = function(align) { + this.align("row", align); + return this; +}; +const column = function(align) { + return create().column(align).label("Row"); +}; +Node.prototype.column = function(align) { + this.align("column", align); + return this; +}; +Node.prototype.align = function(type, align) { + this._padding = this._padding || 0; + this._spacing = this._spacing || 0; + this.untick(this._layoutTiker); + this.tick(this._layoutTiker = function() { + if (this._mo_seq == this._ts_touch) { + return; + } + this._mo_seq = this._ts_touch; + var alignChildren = this._mo_seqAlign != this._ts_children; + this._mo_seqAlign = this._ts_children; + var width = 0, height = 0; + var child, next = this.first(true); + var first = true; + while (child = next) { + next = child.next(true); + child.matrix(true); + var w = child.pin("boxWidth"); + var h = child.pin("boxHeight"); + if (type == "column") { + !first && (height += this._spacing); + child.pin("offsetY") != height && child.pin("offsetY", height); + width = Math.max(width, w); + height = height + h; + alignChildren && child.pin("alignX", align); + } else if (type == "row") { + !first && (width += this._spacing); + child.pin("offsetX") != width && child.pin("offsetX", width); + width = width + w; + height = Math.max(height, h); + alignChildren && child.pin("alignY", align); + } + first = false; + } + width += 2 * this._padding; + height += 2 * this._padding; + this.pin("width") != width && this.pin("width", width); + this.pin("height") != height && this.pin("height", height); + }); + return this; +}; +const box = function() { + return create().box().label("Box"); +}; +Node.prototype.box = function() { + this._padding = this._padding || 0; + this.untick(this._layoutTiker); + this.tick(this._layoutTiker = function() { + if (this._mo_box == this._ts_touch) { + return; + } + this._mo_box = this._ts_touch; + var width = 0, height = 0; + var child, next = this.first(true); + while (child = next) { + next = child.next(true); + child.matrix(true); + var w = child.pin("boxWidth"); + var h = child.pin("boxHeight"); + width = Math.max(width, w); + height = Math.max(height, h); + } + width += 2 * this._padding; + height += 2 * this._padding; + this.pin("width") != width && this.pin("width", width); + this.pin("height") != height && this.pin("height", height); + }); + return this; +}; +const layer = function() { + return create().layer().label("Layer"); +}; +Node.prototype.layer = function() { + this.untick(this._layoutTiker); + this.tick(this._layoutTiker = function() { + var parent = this.parent(); + if (parent) { + var width = parent.pin("width"); + if (this.pin("width") != width) { + this.pin("width", width); + } + var height = parent.pin("height"); + if (this.pin("height") != height) { + this.pin("height", height); + } + } + }, true); + return this; +}; +Node.prototype.padding = function(pad) { + this._padding = pad; + return this; +}; +Node.prototype.spacing = function(space) { + this._spacing = space; + return this; +}; +const Stage$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + Anim, + Atlas, + Image: Image$1, + Math: math$1, + Matrix, + Mouse, + Node, + Pin, + Root, + Sprite, + Str, + Texture, + Tween, + anim, + atlas, + box, + canvas, + column, + create, + image, + layer, + math: math$1, + memoizeDraw, + mount, + pause, + resume, + row, + sprite, + string: string$1, + texture +}, Symbol.toStringTag, { value: "Module" })); + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } - return min === max ? min : Math.random() * (max - min) + min; + return t; }; + return __assign.apply(this, arguments); +}; - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var Vec2 = /** @class */ (function () { - // tslint:disable-next-line:typedef - function Vec2(x, y) { - if (!(this instanceof Vec2)) { - return new Vec2(x, y); - } - if (typeof x === 'undefined') { - this.x = 0; - this.y = 0; - } - else if (typeof x === 'object') { - this.x = x.x; - this.y = x.y; - } - else { - this.x = x; - this.y = y; - } +var options = function (input, defaults) { + if (input === null || typeof input === 'undefined') { + // tslint:disable-next-line:no-object-literal-type-assertion + input = {}; + } + var output = __assign({}, input); + // tslint:disable-next-line:no-for-in + for (var key in defaults) { + if (defaults.hasOwnProperty(key) && typeof input[key] === 'undefined') { + output[key] = defaults[key]; } - /** @internal */ - Vec2.prototype._serialize = function () { - return { - x: this.x, - y: this.y - }; - }; - /** @internal */ - Vec2._deserialize = function (data) { - var obj = Object.create(Vec2.prototype); - obj.x = data.x; - obj.y = data.y; - return obj; - }; - Vec2.zero = function () { - var obj = Object.create(Vec2.prototype); - obj.x = 0; - obj.y = 0; - return obj; - }; - /** @internal */ - Vec2.neo = function (x, y) { - var obj = Object.create(Vec2.prototype); - obj.x = x; - obj.y = y; - return obj; - }; - Vec2.clone = function (v) { - return Vec2.neo(v.x, v.y); - }; - /** @internal */ - Vec2.prototype.toString = function () { - return JSON.stringify(this); - }; - /** - * Does this vector contain finite coordinates? - */ - Vec2.isValid = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - return math$1.isFinite(obj.x) && math$1.isFinite(obj.y); - }; - Vec2.assert = function (o) { - return; - }; - Vec2.prototype.clone = function () { - return Vec2.clone(this); - }; - /** - * Set this vector to all zeros. - * - * @returns this - */ - Vec2.prototype.setZero = function () { - this.x = 0.0; - this.y = 0.0; - return this; - }; - /** - * Set this vector to some specified coordinates. - * - * @returns this - */ - // tslint:disable-next-line:typedef - Vec2.prototype.set = function (x, y) { - if (typeof x === 'object') { - this.x = x.x; - this.y = x.y; - } - else { - this.x = x; - this.y = y; - } - return this; - }; - /** - * Set this vector to some specified coordinates. - * - * @returns this - */ - Vec2.prototype.setNum = function (x, y) { - this.x = x; - this.y = y; - return this; - }; - /** - * Set this vector to some specified coordinates. - * - * @returns this - */ - Vec2.prototype.setVec2 = function (value) { - this.x = value.x; - this.y = value.y; - return this; - }; - /** - * @internal - * @deprecated Use setCombine or setMul - */ - Vec2.prototype.wSet = function (a, v, b, w) { - if (typeof b !== 'undefined' || typeof w !== 'undefined') { - return this.setCombine(a, v, b, w); - } - else { - return this.setMul(a, v); + } + if (typeof Object.getOwnPropertySymbols === 'function') { + var symbols = Object.getOwnPropertySymbols(defaults); + for (var i = 0; i < symbols.length; i++) { + var symbol = symbols[i]; + if (defaults.propertyIsEnumerable(symbol) && typeof input[symbol] === 'undefined') { + output[symbol] = defaults[symbol]; } - }; - /** - * Set linear combination of v and w: `a * v + b * w` - */ - Vec2.prototype.setCombine = function (a, v, b, w) { - var x = a * v.x + b * w.x; - var y = a * v.y + b * w.y; - // `this` may be `w` + } + } + return output; +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var math = Object.assign(Object.create(Math), { + EPSILON: 1e-9, + /** + * This function is used to ensure that a floating point number is not a NaN or + * infinity. + */ + isFinite: function (x) { + return (typeof x === 'number') && isFinite(x) && !isNaN(x); + }, + assert: function (x) { + }, + /** + * Next Largest Power of 2 Given a binary integer value x, the next largest + * power of 2 can be computed by a SWAR algorithm that recursively "folds" the + * upper bits into the lower bits. This process yields a bit vector with the + * same most significant 1 as x, but all 1's below it. Adding 1 to that value + * yields the next largest power of 2. For a 32-bit value: + */ + nextPowerOfTwo: function (x) { + // TODO + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + return x + 1; + }, + isPowerOfTwo: function (x) { + return x > 0 && (x & (x - 1)) === 0; + }, + mod: function (num, min, max) { + if (typeof min === 'undefined') { + max = 1; + min = 0; + } + else if (typeof max === 'undefined') { + max = min; + min = 0; + } + if (max > min) { + num = (num - min) % (max - min); + return num + (num < 0 ? max : min); + } + else { + num = (num - max) % (min - max); + return num + (num <= 0 ? min : max); + } + }, + /** + * Returns a min if num is less than min, and max if more than max, otherwise returns num. + */ + clamp: function (num, min, max) { + if (num < min) { + return min; + } + else if (num > max) { + return max; + } + else { + return num; + } + }, + /** + * Returns a random number between min and max when two arguments are provided. + * If one arg is provided between 0 to max. + * If one arg is passed between 0 to 1. + */ + random: function (min, max) { + if (typeof min === 'undefined') { + max = 1; + min = 0; + } + else if (typeof max === 'undefined') { + max = min; + min = 0; + } + return min === max ? min : Math.random() * (max - min) + min; + } +}); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Vec2 = /** @class */ (function () { + // tslint:disable-next-line:typedef + function Vec2(x, y) { + if (!(this instanceof Vec2)) { + return new Vec2(x, y); + } + if (typeof x === 'undefined') { + this.x = 0; + this.y = 0; + } + else if (typeof x === 'object') { + this.x = x.x; + this.y = x.y; + } + else { this.x = x; this.y = y; - return this; + } + } + /** @internal */ + Vec2.prototype._serialize = function () { + return { + x: this.x, + y: this.y }; - Vec2.prototype.setMul = function (a, v) { - var x = a * v.x; - var y = a * v.y; + }; + /** @internal */ + Vec2._deserialize = function (data) { + var obj = Object.create(Vec2.prototype); + obj.x = data.x; + obj.y = data.y; + return obj; + }; + Vec2.zero = function () { + var obj = Object.create(Vec2.prototype); + obj.x = 0; + obj.y = 0; + return obj; + }; + /** @internal */ + Vec2.neo = function (x, y) { + var obj = Object.create(Vec2.prototype); + obj.x = x; + obj.y = y; + return obj; + }; + Vec2.clone = function (v) { + return Vec2.neo(v.x, v.y); + }; + /** @internal */ + Vec2.prototype.toString = function () { + return JSON.stringify(this); + }; + /** + * Does this vector contain finite coordinates? + */ + Vec2.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return math.isFinite(obj.x) && math.isFinite(obj.y); + }; + Vec2.assert = function (o) { + }; + Vec2.prototype.clone = function () { + return Vec2.clone(this); + }; + /** + * Set this vector to all zeros. + * + * @returns this + */ + Vec2.prototype.setZero = function () { + this.x = 0.0; + this.y = 0.0; + return this; + }; + /** + * Set this vector to some specified coordinates. + * + * @returns this + */ + // tslint:disable-next-line:typedef + Vec2.prototype.set = function (x, y) { + if (typeof x === 'object') { + this.x = x.x; + this.y = x.y; + } + else { this.x = x; this.y = y; - return this; - }; - /** - * Add a vector to this vector. - * - * @returns this - */ - Vec2.prototype.add = function (w) { - this.x += w.x; - this.y += w.y; - return this; - }; - /** - * @internal - * @deprecated Use addCombine or addMul - */ - Vec2.prototype.wAdd = function (a, v, b, w) { - if (typeof b !== 'undefined' || typeof w !== 'undefined') { - return this.addCombine(a, v, b, w); - } - else { - return this.addMul(a, v); - } - }; - /** - * Add linear combination of v and w: `a * v + b * w` - */ - Vec2.prototype.addCombine = function (a, v, b, w) { - var x = a * v.x + b * w.x; - var y = a * v.y + b * w.y; - // `this` may be `w` - this.x += x; - this.y += y; - return this; - }; - Vec2.prototype.addMul = function (a, v) { - var x = a * v.x; - var y = a * v.y; - this.x += x; - this.y += y; - return this; - }; - /** - * @deprecated Use subCombine or subMul - */ - Vec2.prototype.wSub = function (a, v, b, w) { - if (typeof b !== 'undefined' || typeof w !== 'undefined') { - return this.subCombine(a, v, b, w); - } - else { - return this.subMul(a, v); - } - }; - /** - * Subtract linear combination of v and w: `a * v + b * w` - */ - Vec2.prototype.subCombine = function (a, v, b, w) { - var x = a * v.x + b * w.x; - var y = a * v.y + b * w.y; - // `this` may be `w` - this.x -= x; - this.y -= y; - return this; - }; - Vec2.prototype.subMul = function (a, v) { - var x = a * v.x; - var y = a * v.y; - this.x -= x; - this.y -= y; - return this; - }; - /** - * Subtract a vector from this vector - * - * @returns this - */ - Vec2.prototype.sub = function (w) { - this.x -= w.x; - this.y -= w.y; - return this; - }; - /** - * Multiply this vector by a scalar. - * - * @returns this - */ - Vec2.prototype.mul = function (m) { - this.x *= m; - this.y *= m; - return this; - }; - /** - * Get the length of this vector (the norm). - * - * For performance, use this instead of lengthSquared (if possible). - */ - Vec2.prototype.length = function () { - return Vec2.lengthOf(this); - }; - /** - * Get the length squared. - */ - Vec2.prototype.lengthSquared = function () { - return Vec2.lengthSquared(this); - }; - /** - * Convert this vector into a unit vector. - * - * @returns old length - */ - Vec2.prototype.normalize = function () { - var length = this.length(); - if (length < math$1.EPSILON) { - return 0.0; - } - var invLength = 1.0 / length; - this.x *= invLength; - this.y *= invLength; - return length; - }; - /** - * Get the length of this vector (the norm). - * - * For performance, use this instead of lengthSquared (if possible). - */ - Vec2.lengthOf = function (v) { - return math$1.sqrt(v.x * v.x + v.y * v.y); - }; - /** - * Get the length squared. - */ - Vec2.lengthSquared = function (v) { - return v.x * v.x + v.y * v.y; - }; - Vec2.distance = function (v, w) { - var dx = v.x - w.x; - var dy = v.y - w.y; - return math$1.sqrt(dx * dx + dy * dy); - }; - Vec2.distanceSquared = function (v, w) { - var dx = v.x - w.x; - var dy = v.y - w.y; - return dx * dx + dy * dy; - }; - Vec2.areEqual = function (v, w) { - return v === w || typeof w === 'object' && w !== null && v.x === w.x && v.y === w.y; - }; - /** - * Get the skew vector such that dot(skew_vec, other) == cross(vec, other) - */ - Vec2.skew = function (v) { - return Vec2.neo(-v.y, v.x); - }; - /** - * Perform the dot product on two vectors. - */ - Vec2.dot = function (v, w) { - return v.x * w.x + v.y * w.y; - }; - /** - * Perform the cross product on two vectors. In 2D this produces a scalar. - * - * Perform the cross product on a vector and a scalar. In 2D this produces a - * vector. - */ - // tslint:disable-next-line:typedef - Vec2.cross = function (v, w) { - if (typeof w === 'number') { - return Vec2.neo(w * v.y, -w * v.x); - } - else if (typeof v === 'number') { - return Vec2.neo(-v * w.y, v * w.x); - } - else { - return v.x * w.y - v.y * w.x; - } - }; - /** - * Perform the cross product on two vectors. In 2D this produces a scalar. - */ - Vec2.crossVec2Vec2 = function (v, w) { - return v.x * w.y - v.y * w.x; - }; - /** - * Perform the cross product on a vector and a scalar. In 2D this produces a - * vector. - */ - Vec2.crossVec2Num = function (v, w) { + } + return this; + }; + /** + * Set this vector to some specified coordinates. + * + * @returns this + */ + Vec2.prototype.setNum = function (x, y) { + this.x = x; + this.y = y; + return this; + }; + /** + * Set this vector to some specified coordinates. + * + * @returns this + */ + Vec2.prototype.setVec2 = function (value) { + this.x = value.x; + this.y = value.y; + return this; + }; + /** + * @internal + * @deprecated Use setCombine or setMul + */ + Vec2.prototype.wSet = function (a, v, b, w) { + if (typeof b !== 'undefined' || typeof w !== 'undefined') { + return this.setCombine(a, v, b, w); + } + else { + return this.setMul(a, v); + } + }; + /** + * Set linear combination of v and w: `a * v + b * w` + */ + Vec2.prototype.setCombine = function (a, v, b, w) { + var x = a * v.x + b * w.x; + var y = a * v.y + b * w.y; + // `this` may be `w` + this.x = x; + this.y = y; + return this; + }; + Vec2.prototype.setMul = function (a, v) { + var x = a * v.x; + var y = a * v.y; + this.x = x; + this.y = y; + return this; + }; + /** + * Add a vector to this vector. + * + * @returns this + */ + Vec2.prototype.add = function (w) { + this.x += w.x; + this.y += w.y; + return this; + }; + /** + * @internal + * @deprecated Use addCombine or addMul + */ + Vec2.prototype.wAdd = function (a, v, b, w) { + if (typeof b !== 'undefined' || typeof w !== 'undefined') { + return this.addCombine(a, v, b, w); + } + else { + return this.addMul(a, v); + } + }; + /** + * Add linear combination of v and w: `a * v + b * w` + */ + Vec2.prototype.addCombine = function (a, v, b, w) { + var x = a * v.x + b * w.x; + var y = a * v.y + b * w.y; + // `this` may be `w` + this.x += x; + this.y += y; + return this; + }; + Vec2.prototype.addMul = function (a, v) { + var x = a * v.x; + var y = a * v.y; + this.x += x; + this.y += y; + return this; + }; + /** + * @deprecated Use subCombine or subMul + */ + Vec2.prototype.wSub = function (a, v, b, w) { + if (typeof b !== 'undefined' || typeof w !== 'undefined') { + return this.subCombine(a, v, b, w); + } + else { + return this.subMul(a, v); + } + }; + /** + * Subtract linear combination of v and w: `a * v + b * w` + */ + Vec2.prototype.subCombine = function (a, v, b, w) { + var x = a * v.x + b * w.x; + var y = a * v.y + b * w.y; + // `this` may be `w` + this.x -= x; + this.y -= y; + return this; + }; + Vec2.prototype.subMul = function (a, v) { + var x = a * v.x; + var y = a * v.y; + this.x -= x; + this.y -= y; + return this; + }; + /** + * Subtract a vector from this vector + * + * @returns this + */ + Vec2.prototype.sub = function (w) { + this.x -= w.x; + this.y -= w.y; + return this; + }; + /** + * Multiply this vector by a scalar. + * + * @returns this + */ + Vec2.prototype.mul = function (m) { + this.x *= m; + this.y *= m; + return this; + }; + /** + * Get the length of this vector (the norm). + * + * For performance, use this instead of lengthSquared (if possible). + */ + Vec2.prototype.length = function () { + return Vec2.lengthOf(this); + }; + /** + * Get the length squared. + */ + Vec2.prototype.lengthSquared = function () { + return Vec2.lengthSquared(this); + }; + /** + * Convert this vector into a unit vector. + * + * @returns old length + */ + Vec2.prototype.normalize = function () { + var length = this.length(); + if (length < math.EPSILON) { + return 0.0; + } + var invLength = 1.0 / length; + this.x *= invLength; + this.y *= invLength; + return length; + }; + /** + * Get the length of this vector (the norm). + * + * For performance, use this instead of lengthSquared (if possible). + */ + Vec2.lengthOf = function (v) { + return math.sqrt(v.x * v.x + v.y * v.y); + }; + /** + * Get the length squared. + */ + Vec2.lengthSquared = function (v) { + return v.x * v.x + v.y * v.y; + }; + Vec2.distance = function (v, w) { + var dx = v.x - w.x; + var dy = v.y - w.y; + return math.sqrt(dx * dx + dy * dy); + }; + Vec2.distanceSquared = function (v, w) { + var dx = v.x - w.x; + var dy = v.y - w.y; + return dx * dx + dy * dy; + }; + Vec2.areEqual = function (v, w) { + return v === w || typeof w === 'object' && w !== null && v.x === w.x && v.y === w.y; + }; + /** + * Get the skew vector such that dot(skew_vec, other) == cross(vec, other) + */ + Vec2.skew = function (v) { + return Vec2.neo(-v.y, v.x); + }; + /** + * Perform the dot product on two vectors. + */ + Vec2.dot = function (v, w) { + return v.x * w.x + v.y * w.y; + }; + /** + * Perform the cross product on two vectors. In 2D this produces a scalar. + * + * Perform the cross product on a vector and a scalar. In 2D this produces a + * vector. + */ + // tslint:disable-next-line:typedef + Vec2.cross = function (v, w) { + if (typeof w === 'number') { return Vec2.neo(w * v.y, -w * v.x); - }; - /** - * Perform the cross product on a vector and a scalar. In 2D this produces a - * vector. - */ - Vec2.crossNumVec2 = function (v, w) { + } + else if (typeof v === 'number') { return Vec2.neo(-v * w.y, v * w.x); - }; - /** - * Returns `a + (v x w)` - */ - // tslint:disable-next-line:typedef - Vec2.addCross = function (a, v, w) { - if (typeof w === 'number') { - return Vec2.neo(w * v.y + a.x, -w * v.x + a.y); - } - else if (typeof v === 'number') { - return Vec2.neo(-v * w.y + a.x, v * w.x + a.y); - } - }; - /** - * Returns `a + (v x w)` - */ - Vec2.addCrossVec2Num = function (a, v, w) { + } + else { + return v.x * w.y - v.y * w.x; + } + }; + /** + * Perform the cross product on two vectors. In 2D this produces a scalar. + */ + Vec2.crossVec2Vec2 = function (v, w) { + return v.x * w.y - v.y * w.x; + }; + /** + * Perform the cross product on a vector and a scalar. In 2D this produces a + * vector. + */ + Vec2.crossVec2Num = function (v, w) { + return Vec2.neo(w * v.y, -w * v.x); + }; + /** + * Perform the cross product on a vector and a scalar. In 2D this produces a + * vector. + */ + Vec2.crossNumVec2 = function (v, w) { + return Vec2.neo(-v * w.y, v * w.x); + }; + /** + * Returns `a + (v x w)` + */ + // tslint:disable-next-line:typedef + Vec2.addCross = function (a, v, w) { + if (typeof w === 'number') { return Vec2.neo(w * v.y + a.x, -w * v.x + a.y); - }; - /** - * Returns `a + (v x w)` - */ - Vec2.addCrossNumVec2 = function (a, v, w) { + } + else if (typeof v === 'number') { return Vec2.neo(-v * w.y + a.x, v * w.x + a.y); - }; - Vec2.add = function (v, w) { - return Vec2.neo(v.x + w.x, v.y + w.y); - }; - /** @internal @deprecated */ - Vec2.wAdd = function (a, v, b, w) { - if (typeof b !== 'undefined' || typeof w !== 'undefined') { - return Vec2.combine(a, v, b, w); - } - else { - return Vec2.mulNumVec2(a, v); - } - }; - Vec2.combine = function (a, v, b, w) { - return Vec2.zero().setCombine(a, v, b, w); - }; - Vec2.sub = function (v, w) { - return Vec2.neo(v.x - w.x, v.y - w.y); - }; - // tslint:disable-next-line:typedef - Vec2.mul = function (a, b) { - if (typeof a === 'object') { - return Vec2.neo(a.x * b, a.y * b); - } - else if (typeof b === 'object') { - return Vec2.neo(a * b.x, a * b.y); - } - }; - Vec2.mulVec2Num = function (a, b) { + } + }; + /** + * Returns `a + (v x w)` + */ + Vec2.addCrossVec2Num = function (a, v, w) { + return Vec2.neo(w * v.y + a.x, -w * v.x + a.y); + }; + /** + * Returns `a + (v x w)` + */ + Vec2.addCrossNumVec2 = function (a, v, w) { + return Vec2.neo(-v * w.y + a.x, v * w.x + a.y); + }; + Vec2.add = function (v, w) { + return Vec2.neo(v.x + w.x, v.y + w.y); + }; + /** @internal @deprecated */ + Vec2.wAdd = function (a, v, b, w) { + if (typeof b !== 'undefined' || typeof w !== 'undefined') { + return Vec2.combine(a, v, b, w); + } + else { + return Vec2.mulNumVec2(a, v); + } + }; + Vec2.combine = function (a, v, b, w) { + return Vec2.zero().setCombine(a, v, b, w); + }; + Vec2.sub = function (v, w) { + return Vec2.neo(v.x - w.x, v.y - w.y); + }; + // tslint:disable-next-line:typedef + Vec2.mul = function (a, b) { + if (typeof a === 'object') { return Vec2.neo(a.x * b, a.y * b); - }; - Vec2.mulNumVec2 = function (a, b) { + } + else if (typeof b === 'object') { return Vec2.neo(a * b.x, a * b.y); + } + }; + Vec2.mulVec2Num = function (a, b) { + return Vec2.neo(a.x * b, a.y * b); + }; + Vec2.mulNumVec2 = function (a, b) { + return Vec2.neo(a * b.x, a * b.y); + }; + Vec2.prototype.neg = function () { + this.x = -this.x; + this.y = -this.y; + return this; + }; + Vec2.neg = function (v) { + return Vec2.neo(-v.x, -v.y); + }; + Vec2.abs = function (v) { + return Vec2.neo(math.abs(v.x), math.abs(v.y)); + }; + Vec2.mid = function (v, w) { + return Vec2.neo((v.x + w.x) * 0.5, (v.y + w.y) * 0.5); + }; + Vec2.upper = function (v, w) { + return Vec2.neo(math.max(v.x, w.x), math.max(v.y, w.y)); + }; + Vec2.lower = function (v, w) { + return Vec2.neo(math.min(v.x, w.x), math.min(v.y, w.y)); + }; + Vec2.prototype.clamp = function (max) { + var lengthSqr = this.x * this.x + this.y * this.y; + if (lengthSqr > max * max) { + var scale = max / math.sqrt(lengthSqr); + this.x *= scale; + this.y *= scale; + } + return this; + }; + Vec2.clamp = function (v, max) { + var r = Vec2.neo(v.x, v.y); + r.clamp(max); + return r; + }; + /** @internal @deprecated */ + // tslint:disable-next-line:typedef + Vec2.scaleFn = function (x, y) { + return function (v) { + return Vec2.neo(v.x * x, v.y * y); }; - Vec2.prototype.neg = function () { - this.x = -this.x; - this.y = -this.y; - return this; - }; - Vec2.neg = function (v) { - return Vec2.neo(-v.x, -v.y); - }; - Vec2.abs = function (v) { - return Vec2.neo(math$1.abs(v.x), math$1.abs(v.y)); - }; - Vec2.mid = function (v, w) { - return Vec2.neo((v.x + w.x) * 0.5, (v.y + w.y) * 0.5); - }; - Vec2.upper = function (v, w) { - return Vec2.neo(math$1.max(v.x, w.x), math$1.max(v.y, w.y)); - }; - Vec2.lower = function (v, w) { - return Vec2.neo(math$1.min(v.x, w.x), math$1.min(v.y, w.y)); - }; - Vec2.prototype.clamp = function (max) { - var lengthSqr = this.x * this.x + this.y * this.y; - if (lengthSqr > max * max) { - var invLength = math$1.invSqrt(lengthSqr); - this.x *= invLength * max; - this.y *= invLength * max; - } - return this; - }; - Vec2.clamp = function (v, max) { - v = Vec2.neo(v.x, v.y); - v.clamp(max); - return v; - }; - /** @internal @deprecated */ - // tslint:disable-next-line:typedef - Vec2.scaleFn = function (x, y) { - return function (v) { - return Vec2.neo(v.x * x, v.y * y); - }; - }; - /** @internal @deprecated */ - // tslint:disable-next-line:typedef - Vec2.translateFn = function (x, y) { - return function (v) { - return Vec2.neo(v.x + x, v.y + y); - }; + }; + /** @internal @deprecated */ + // tslint:disable-next-line:typedef + Vec2.translateFn = function (x, y) { + return function (v) { + return Vec2.neo(v.x + x, v.y + y); }; - return Vec2; - }()); + }; + return Vec2; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var AABB = /** @class */ (function () { - function AABB(lower, upper) { - if (!(this instanceof AABB)) { - return new AABB(lower, upper); - } - this.lowerBound = Vec2.zero(); - this.upperBound = Vec2.zero(); - if (typeof lower === 'object') { - this.lowerBound.setVec2(lower); - } - if (typeof upper === 'object') { - this.upperBound.setVec2(upper); - } - else if (typeof lower === 'object') { - this.upperBound.setVec2(lower); - } +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var AABB = /** @class */ (function () { + function AABB(lower, upper) { + if (!(this instanceof AABB)) { + return new AABB(lower, upper); } - /** - * Verify that the bounds are sorted. - */ - AABB.prototype.isValid = function () { - return AABB.isValid(this); - }; - AABB.isValid = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - return Vec2.isValid(obj.lowerBound) && Vec2.isValid(obj.upperBound) && Vec2.sub(obj.upperBound, obj.lowerBound).lengthSquared() >= 0; - }; - AABB.assert = function (o) { - return; - }; - /** - * Get the center of the AABB. - */ - AABB.prototype.getCenter = function () { - return Vec2.neo((this.lowerBound.x + this.upperBound.x) * 0.5, (this.lowerBound.y + this.upperBound.y) * 0.5); - }; - /** - * Get the extents of the AABB (half-widths). - */ - AABB.prototype.getExtents = function () { - return Vec2.neo((this.upperBound.x - this.lowerBound.x) * 0.5, (this.upperBound.y - this.lowerBound.y) * 0.5); - }; - /** - * Get the perimeter length. - */ - AABB.prototype.getPerimeter = function () { - return 2.0 * (this.upperBound.x - this.lowerBound.x + this.upperBound.y - this.lowerBound.y); - }; - /** - * Combine one or two AABB into this one. - */ - AABB.prototype.combine = function (a, b) { - b = b || this; - var lowerA = a.lowerBound; - var upperA = a.upperBound; - var lowerB = b.lowerBound; - var upperB = b.upperBound; - var lowerX = math$1.min(lowerA.x, lowerB.x); - var lowerY = math$1.min(lowerA.y, lowerB.y); - var upperX = math$1.max(upperB.x, upperA.x); - var upperY = math$1.max(upperB.y, upperA.y); - this.lowerBound.setNum(lowerX, lowerY); - this.upperBound.setNum(upperX, upperY); - }; - AABB.prototype.combinePoints = function (a, b) { - this.lowerBound.setNum(math$1.min(a.x, b.x), math$1.min(a.y, b.y)); - this.upperBound.setNum(math$1.max(a.x, b.x), math$1.max(a.y, b.y)); - }; - AABB.prototype.set = function (aabb) { - this.lowerBound.setNum(aabb.lowerBound.x, aabb.lowerBound.y); - this.upperBound.setNum(aabb.upperBound.x, aabb.upperBound.y); - }; - AABB.prototype.contains = function (aabb) { - var result = true; - result = result && this.lowerBound.x <= aabb.lowerBound.x; - result = result && this.lowerBound.y <= aabb.lowerBound.y; - result = result && aabb.upperBound.x <= this.upperBound.x; - result = result && aabb.upperBound.y <= this.upperBound.y; - return result; - }; - AABB.prototype.extend = function (value) { - AABB.extend(this, value); - return this; - }; - AABB.extend = function (aabb, value) { - aabb.lowerBound.x -= value; - aabb.lowerBound.y -= value; - aabb.upperBound.x += value; - aabb.upperBound.y += value; - }; - AABB.testOverlap = function (a, b) { - var d1x = b.lowerBound.x - a.upperBound.x; - var d2x = a.lowerBound.x - b.upperBound.x; - var d1y = b.lowerBound.y - a.upperBound.y; - var d2y = a.lowerBound.y - b.upperBound.y; - if (d1x > 0 || d1y > 0 || d2x > 0 || d2y > 0) { - return false; - } - return true; - }; - AABB.areEqual = function (a, b) { - return Vec2.areEqual(a.lowerBound, b.lowerBound) && Vec2.areEqual(a.upperBound, b.upperBound); - }; - AABB.diff = function (a, b) { - var wD = math$1.max(0, math$1.min(a.upperBound.x, b.upperBound.x) - math$1.max(b.lowerBound.x, a.lowerBound.x)); - var hD = math$1.max(0, math$1.min(a.upperBound.y, b.upperBound.y) - math$1.max(b.lowerBound.y, a.lowerBound.y)); - var wA = a.upperBound.x - a.lowerBound.x; - var hA = a.upperBound.y - a.lowerBound.y; - var wB = b.upperBound.x - b.lowerBound.x; - var hB = b.upperBound.y - b.lowerBound.y; - return wA * hA + wB * hB - wD * hD; - }; - AABB.prototype.rayCast = function (output, input) { - // From Real-time Collision Detection, p179. - var tmin = -Infinity; - var tmax = Infinity; - var p = input.p1; - var d = Vec2.sub(input.p2, input.p1); - var absD = Vec2.abs(d); - var normal = Vec2.zero(); - for (var f = 'x'; f !== null; f = (f === 'x' ? 'y' : null)) { - if (absD.x < math$1.EPSILON) { - // Parallel. - if (p[f] < this.lowerBound[f] || this.upperBound[f] < p[f]) { - return false; - } - } - else { - var inv_d = 1.0 / d[f]; - var t1 = (this.lowerBound[f] - p[f]) * inv_d; - var t2 = (this.upperBound[f] - p[f]) * inv_d; - // Sign of the normal vector. - var s = -1.0; - if (t1 > t2) { - var temp = t1; - t1 = t2; - t2 = temp; - s = 1.0; - } - // Push the min up - if (t1 > tmin) { - normal.setZero(); - normal[f] = s; - tmin = t1; - } - // Pull the max down - tmax = math$1.min(tmax, t2); - if (tmin > tmax) { - return false; - } + this.lowerBound = Vec2.zero(); + this.upperBound = Vec2.zero(); + if (typeof lower === 'object') { + this.lowerBound.setVec2(lower); + } + if (typeof upper === 'object') { + this.upperBound.setVec2(upper); + } + else if (typeof lower === 'object') { + this.upperBound.setVec2(lower); + } + } + /** + * Verify that the bounds are sorted. + */ + AABB.prototype.isValid = function () { + return AABB.isValid(this); + }; + AABB.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return Vec2.isValid(obj.lowerBound) && Vec2.isValid(obj.upperBound) && Vec2.sub(obj.upperBound, obj.lowerBound).lengthSquared() >= 0; + }; + AABB.assert = function (o) { + }; + /** + * Get the center of the AABB. + */ + AABB.prototype.getCenter = function () { + return Vec2.neo((this.lowerBound.x + this.upperBound.x) * 0.5, (this.lowerBound.y + this.upperBound.y) * 0.5); + }; + /** + * Get the extents of the AABB (half-widths). + */ + AABB.prototype.getExtents = function () { + return Vec2.neo((this.upperBound.x - this.lowerBound.x) * 0.5, (this.upperBound.y - this.lowerBound.y) * 0.5); + }; + /** + * Get the perimeter length. + */ + AABB.prototype.getPerimeter = function () { + return 2.0 * (this.upperBound.x - this.lowerBound.x + this.upperBound.y - this.lowerBound.y); + }; + /** + * Combine one or two AABB into this one. + */ + AABB.prototype.combine = function (a, b) { + b = b || this; + var lowerA = a.lowerBound; + var upperA = a.upperBound; + var lowerB = b.lowerBound; + var upperB = b.upperBound; + var lowerX = math.min(lowerA.x, lowerB.x); + var lowerY = math.min(lowerA.y, lowerB.y); + var upperX = math.max(upperB.x, upperA.x); + var upperY = math.max(upperB.y, upperA.y); + this.lowerBound.setNum(lowerX, lowerY); + this.upperBound.setNum(upperX, upperY); + }; + AABB.prototype.combinePoints = function (a, b) { + this.lowerBound.setNum(math.min(a.x, b.x), math.min(a.y, b.y)); + this.upperBound.setNum(math.max(a.x, b.x), math.max(a.y, b.y)); + }; + AABB.prototype.set = function (aabb) { + this.lowerBound.setNum(aabb.lowerBound.x, aabb.lowerBound.y); + this.upperBound.setNum(aabb.upperBound.x, aabb.upperBound.y); + }; + AABB.prototype.contains = function (aabb) { + var result = true; + result = result && this.lowerBound.x <= aabb.lowerBound.x; + result = result && this.lowerBound.y <= aabb.lowerBound.y; + result = result && aabb.upperBound.x <= this.upperBound.x; + result = result && aabb.upperBound.y <= this.upperBound.y; + return result; + }; + AABB.prototype.extend = function (value) { + AABB.extend(this, value); + return this; + }; + AABB.extend = function (aabb, value) { + aabb.lowerBound.x -= value; + aabb.lowerBound.y -= value; + aabb.upperBound.x += value; + aabb.upperBound.y += value; + }; + AABB.testOverlap = function (a, b) { + var d1x = b.lowerBound.x - a.upperBound.x; + var d2x = a.lowerBound.x - b.upperBound.x; + var d1y = b.lowerBound.y - a.upperBound.y; + var d2y = a.lowerBound.y - b.upperBound.y; + if (d1x > 0 || d1y > 0 || d2x > 0 || d2y > 0) { + return false; + } + return true; + }; + AABB.areEqual = function (a, b) { + return Vec2.areEqual(a.lowerBound, b.lowerBound) && Vec2.areEqual(a.upperBound, b.upperBound); + }; + AABB.diff = function (a, b) { + var wD = math.max(0, math.min(a.upperBound.x, b.upperBound.x) - math.max(b.lowerBound.x, a.lowerBound.x)); + var hD = math.max(0, math.min(a.upperBound.y, b.upperBound.y) - math.max(b.lowerBound.y, a.lowerBound.y)); + var wA = a.upperBound.x - a.lowerBound.x; + var hA = a.upperBound.y - a.lowerBound.y; + var wB = b.upperBound.x - b.lowerBound.x; + var hB = b.upperBound.y - b.lowerBound.y; + return wA * hA + wB * hB - wD * hD; + }; + AABB.prototype.rayCast = function (output, input) { + // From Real-time Collision Detection, p179. + var tmin = -Infinity; + var tmax = Infinity; + var p = input.p1; + var d = Vec2.sub(input.p2, input.p1); + var absD = Vec2.abs(d); + var normal = Vec2.zero(); + for (var f = 'x'; f !== null; f = (f === 'x' ? 'y' : null)) { + if (absD.x < math.EPSILON) { + // Parallel. + if (p[f] < this.lowerBound[f] || this.upperBound[f] < p[f]) { + return false; } } - // Does the ray start inside the box? - // Does the ray intersect beyond the max fraction? - if (tmin < 0.0 || input.maxFraction < tmin) { - return false; - } - // Intersection. - output.fraction = tmin; - output.normal = normal; - return true; - }; - /** @internal */ - AABB.prototype.toString = function () { - return JSON.stringify(this); - }; - return AABB; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - // TODO merge with World options? - /** - * Tuning constants based on meters-kilograms-seconds (MKS) units. - */ - // tslint:disable-next-line:no-unnecessary-class - var Settings = /** @class */ (function () { - function Settings() { - } - Object.defineProperty(Settings, "linearSlopSquared", { - get: function () { return Settings.linearSlop * Settings.linearSlop; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Settings, "polygonRadius", { - /** - * The radius of the polygon/edge shape skin. This should not be modified. - * Making this smaller means polygons will have an insufficient buffer for - * continuous collision. Making it larger may create artifacts for vertex - * collision. - */ - get: function () { return 2.0 * Settings.linearSlop; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Settings, "maxTranslationSquared", { - get: function () { return Settings.maxTranslation * Settings.maxTranslation; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Settings, "maxRotationSquared", { - get: function () { return Settings.maxRotation * Settings.maxRotation; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Settings, "linearSleepToleranceSqr", { - get: function () { return Math.pow(Settings.linearSleepTolerance, 2); }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Settings, "angularSleepToleranceSqr", { - get: function () { return Math.pow(Settings.angularSleepTolerance, 2); }, - enumerable: false, - configurable: true - }); - // Collision - /** - * The maximum number of contact points between two convex shapes. Do not change - * this value. - */ - Settings.maxManifoldPoints = 2; - /** - * The maximum number of vertices on a convex polygon. You cannot increase this - * too much because BlockAllocator has a maximum object size. - */ - Settings.maxPolygonVertices = 12; - /** - * This is used to fatten AABBs in the dynamic tree. This allows proxies to move - * by a small amount without triggering a tree adjustment. This is in meters. - */ - Settings.aabbExtension = 0.1; - /** - * This is used to fatten AABBs in the dynamic tree. This is used to predict the - * future position based on the current displacement. This is a dimensionless - * multiplier. - */ - Settings.aabbMultiplier = 2.0; - /** - * A small length used as a collision and constraint tolerance. Usually it is - * chosen to be numerically significant, but visually insignificant. - */ - Settings.linearSlop = 0.005; - /** - * A small angle used as a collision and constraint tolerance. Usually it is - * chosen to be numerically significant, but visually insignificant. - */ - Settings.angularSlop = (2.0 / 180.0 * Math.PI); - /** - * Maximum number of sub-steps per contact in continuous physics simulation. - */ - Settings.maxSubSteps = 8; - // Dynamics - /** - * Maximum number of contacts to be handled to solve a TOI impact. - */ - Settings.maxTOIContacts = 32; - /** - * Maximum iterations to solve a TOI. - */ - Settings.maxTOIIterations = 20; - /** - * Maximum iterations to find Distance. - */ - Settings.maxDistnceIterations = 20; - /** - * A velocity threshold for elastic collisions. Any collision with a relative - * linear velocity below this threshold will be treated as inelastic. - */ - Settings.velocityThreshold = 1.0; - /** - * The maximum linear position correction used when solving constraints. This - * helps to prevent overshoot. - */ - Settings.maxLinearCorrection = 0.2; - /** - * The maximum angular position correction used when solving constraints. This - * helps to prevent overshoot. - */ - Settings.maxAngularCorrection = (8.0 / 180.0 * Math.PI); - /** - * The maximum linear velocity of a body. This limit is very large and is used - * to prevent numerical problems. You shouldn't need to adjust Settings. - */ - Settings.maxTranslation = 2.0; - /** - * The maximum angular velocity of a body. This limit is very large and is used - * to prevent numerical problems. You shouldn't need to adjust Settings. - */ - Settings.maxRotation = (0.5 * Math.PI); - /** - * This scale factor controls how fast overlap is resolved. Ideally this would - * be 1 so that overlap is removed in one time step. However using values close - * to 1 often lead to overshoot. - */ - Settings.baumgarte = 0.2; - Settings.toiBaugarte = 0.75; - // Sleep - /** - * The time that a body must be still before it will go to sleep. - */ - Settings.timeToSleep = 0.5; - /** - * A body cannot sleep if its linear velocity is above this tolerance. - */ - Settings.linearSleepTolerance = 0.01; - /** - * A body cannot sleep if its angular velocity is above this tolerance. - */ - Settings.angularSleepTolerance = (2.0 / 180.0 * Math.PI); - return Settings; - }()); - - /* - * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - */ - var Pool = /** @class */ (function () { - function Pool(opts) { - this._list = []; - this._max = Infinity; - this._createCount = 0; - this._outCount = 0; - this._inCount = 0; - this._discardCount = 0; - this._list = []; - this._max = opts.max || this._max; - this._createFn = opts.create; - this._outFn = opts.allocate; - this._inFn = opts.release; - this._discardFn = opts.discard; - } - Pool.prototype.max = function (n) { - if (typeof n === 'number') { - this._max = n; - return this; - } - return this._max; - }; - Pool.prototype.size = function () { - return this._list.length; - }; - Pool.prototype.allocate = function () { - var item; - if (this._list.length > 0) { - item = this._list.shift(); - } else { - this._createCount++; - if (typeof this._createFn === 'function') { - item = this._createFn(); - } - else { - // tslint:disable-next-line:no-object-literal-type-assertion - item = {}; + var inv_d = 1.0 / d[f]; + var t1 = (this.lowerBound[f] - p[f]) * inv_d; + var t2 = (this.upperBound[f] - p[f]) * inv_d; + // Sign of the normal vector. + var s = -1.0; + if (t1 > t2) { + var temp = t1; + t1 = t2; + t2 = temp; + s = 1.0; } - } - this._outCount++; - if (typeof this._outFn === 'function') { - this._outFn(item); - } - return item; - }; - Pool.prototype.release = function (item) { - if (this._list.length < this._max) { - this._inCount++; - if (typeof this._inFn === 'function') { - this._inFn(item); + // Push the min up + if (t1 > tmin) { + normal.setZero(); + normal[f] = s; + tmin = t1; } - this._list.push(item); - } - else { - this._discardCount++; - if (typeof this._discardFn === 'function') { - item = this._discardFn(item); + // Pull the max down + tmax = math.min(tmax, t2); + if (tmin > tmax) { + return false; } } - }; - /** @internal */ - Pool.prototype.toString = function () { - return " +" + this._createCount + " >" + this._outCount + " <" + this._inCount + " -" - + this._discardCount + " =" + this._list.length + "/" + this._max; - }; - return Pool; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * A node in the dynamic tree. The client does not interact with this directly. - */ - var TreeNode = /** @class */ (function () { - function TreeNode(id) { - /** Enlarged AABB */ - this.aabb = new AABB(); - this.userData = null; - this.parent = null; - this.child1 = null; - this.child2 = null; - /** 0: leaf, -1: free node */ - this.height = -1; - this.id = id; } - /** @internal */ - TreeNode.prototype.toString = function () { - return this.id + ": " + this.userData; - }; - TreeNode.prototype.isLeaf = function () { - return this.child1 == null; - }; - return TreeNode; - }()); - /** - * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A - * dynamic tree arranges data in a binary tree to accelerate queries such as - * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we - * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger - * than the client object. This allows the client object to move by small - * amounts without triggering a tree update. - * - * Nodes are pooled and relocatable, so we use node indices rather than - * pointers. - */ - var DynamicTree = /** @class */ (function () { - function DynamicTree() { - this.inputPool = new Pool({ - create: function () { - // tslint:disable-next-line:no-object-literal-type-assertion - return {}; - }, - release: function (stack) { - } - }); - this.stackPool = new Pool({ - create: function () { - return []; - }, - release: function (stack) { - stack.length = 0; - } - }); - this.iteratorPool = new Pool({ - create: function () { - return new Iterator(); - }, - release: function (iterator) { - iterator.close(); - } - }); - this.m_root = null; - this.m_nodes = {}; - this.m_lastProxyId = 0; - this.m_pool = new Pool({ - create: function () { - return new TreeNode(); - } - }); + // Does the ray start inside the box? + // Does the ray intersect beyond the max fraction? + if (tmin < 0.0 || input.maxFraction < tmin) { + return false; } + // Intersection. + output.fraction = tmin; + output.normal = normal; + return true; + }; + /** @internal */ + AABB.prototype.toString = function () { + return JSON.stringify(this); + }; + return AABB; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +// TODO merge with World options? +/** + * Tuning constants based on meters-kilograms-seconds (MKS) units. + */ +// tslint:disable-next-line:no-unnecessary-class +var Settings = /** @class */ (function () { + function Settings() { + } + Object.defineProperty(Settings, "linearSlopSquared", { + get: function () { return Settings.linearSlop * Settings.linearSlop; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "polygonRadius", { /** - * Get proxy user data. - * - * @return the proxy user data or 0 if the id is invalid. - */ - DynamicTree.prototype.getUserData = function (id) { - var node = this.m_nodes[id]; - return node.userData; - }; - /** - * Get the fat AABB for a node id. - * - * @return the proxy user data or 0 if the id is invalid. - */ - DynamicTree.prototype.getFatAABB = function (id) { - var node = this.m_nodes[id]; - return node.aabb; - }; - DynamicTree.prototype.allocateNode = function () { - var node = this.m_pool.allocate(); - node.id = ++this.m_lastProxyId; - node.userData = null; - node.parent = null; - node.child1 = null; - node.child2 = null; - node.height = -1; - this.m_nodes[node.id] = node; - return node; - }; - DynamicTree.prototype.freeNode = function (node) { - this.m_pool.release(node); - node.height = -1; - // tslint:disable-next-line:no-dynamic-delete - delete this.m_nodes[node.id]; - }; - /** - * Create a proxy in the tree as a leaf node. We return the index of the node - * instead of a pointer so that we can grow the node pool. - * - * Create a proxy. Provide a tight fitting AABB and a userData pointer. - */ - DynamicTree.prototype.createProxy = function (aabb, userData) { - var node = this.allocateNode(); - node.aabb.set(aabb); - // Fatten the aabb. - AABB.extend(node.aabb, Settings.aabbExtension); - node.userData = userData; - node.height = 0; - this.insertLeaf(node); - return node.id; - }; - /** - * Destroy a proxy. This asserts if the id is invalid. - */ - DynamicTree.prototype.destroyProxy = function (id) { - var node = this.m_nodes[id]; - this.removeLeaf(node); - this.freeNode(node); - }; - /** - * Move a proxy with a swepted AABB. If the proxy has moved outside of its - * fattened AABB, then the proxy is removed from the tree and re-inserted. - * Otherwise the function returns immediately. - * - * @param d Displacement - * - * @return true if the proxy was re-inserted. + * The radius of the polygon/edge shape skin. This should not be modified. + * Making this smaller means polygons will have an insufficient buffer for + * continuous collision. Making it larger may create artifacts for vertex + * collision. */ - DynamicTree.prototype.moveProxy = function (id, aabb, d) { - var node = this.m_nodes[id]; - if (node.aabb.contains(aabb)) { - return false; - } - this.removeLeaf(node); - node.aabb.set(aabb); - // Extend AABB. - aabb = node.aabb; - AABB.extend(aabb, Settings.aabbExtension); - // Predict AABB displacement. - // const d = Vec2.mul(Settings.aabbMultiplier, displacement); - if (d.x < 0.0) { - aabb.lowerBound.x += d.x * Settings.aabbMultiplier; + get: function () { return 2.0 * Settings.linearSlop; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "maxTranslationSquared", { + get: function () { return Settings.maxTranslation * Settings.maxTranslation; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "maxRotationSquared", { + get: function () { return Settings.maxRotation * Settings.maxRotation; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "linearSleepToleranceSqr", { + get: function () { return Math.pow(Settings.linearSleepTolerance, 2); }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "angularSleepToleranceSqr", { + get: function () { return Math.pow(Settings.angularSleepTolerance, 2); }, + enumerable: false, + configurable: true + }); + // Collision + /** + * The maximum number of contact points between two convex shapes. Do not change + * this value. + */ + Settings.maxManifoldPoints = 2; + /** + * The maximum number of vertices on a convex polygon. You cannot increase this + * too much because BlockAllocator has a maximum object size. + */ + Settings.maxPolygonVertices = 12; + /** + * This is used to fatten AABBs in the dynamic tree. This allows proxies to move + * by a small amount without triggering a tree adjustment. This is in meters. + */ + Settings.aabbExtension = 0.1; + /** + * This is used to fatten AABBs in the dynamic tree. This is used to predict the + * future position based on the current displacement. This is a dimensionless + * multiplier. + */ + Settings.aabbMultiplier = 2.0; + /** + * A small length used as a collision and constraint tolerance. Usually it is + * chosen to be numerically significant, but visually insignificant. + */ + Settings.linearSlop = 0.005; + /** + * A small angle used as a collision and constraint tolerance. Usually it is + * chosen to be numerically significant, but visually insignificant. + */ + Settings.angularSlop = (2.0 / 180.0 * Math.PI); + /** + * Maximum number of sub-steps per contact in continuous physics simulation. + */ + Settings.maxSubSteps = 8; + // Dynamics + /** + * Maximum number of contacts to be handled to solve a TOI impact. + */ + Settings.maxTOIContacts = 32; + /** + * Maximum iterations to solve a TOI. + */ + Settings.maxTOIIterations = 20; + /** + * Maximum iterations to find Distance. + */ + Settings.maxDistnceIterations = 20; + /** + * A velocity threshold for elastic collisions. Any collision with a relative + * linear velocity below this threshold will be treated as inelastic. + */ + Settings.velocityThreshold = 1.0; + /** + * The maximum linear position correction used when solving constraints. This + * helps to prevent overshoot. + */ + Settings.maxLinearCorrection = 0.2; + /** + * The maximum angular position correction used when solving constraints. This + * helps to prevent overshoot. + */ + Settings.maxAngularCorrection = (8.0 / 180.0 * Math.PI); + /** + * The maximum linear velocity of a body. This limit is very large and is used + * to prevent numerical problems. You shouldn't need to adjust Settings. + */ + Settings.maxTranslation = 2.0; + /** + * The maximum angular velocity of a body. This limit is very large and is used + * to prevent numerical problems. You shouldn't need to adjust Settings. + */ + Settings.maxRotation = (0.5 * Math.PI); + /** + * This scale factor controls how fast overlap is resolved. Ideally this would + * be 1 so that overlap is removed in one time step. However using values close + * to 1 often lead to overshoot. + */ + Settings.baumgarte = 0.2; + Settings.toiBaugarte = 0.75; + // Sleep + /** + * The time that a body must be still before it will go to sleep. + */ + Settings.timeToSleep = 0.5; + /** + * A body cannot sleep if its linear velocity is above this tolerance. + */ + Settings.linearSleepTolerance = 0.01; + /** + * A body cannot sleep if its angular velocity is above this tolerance. + */ + Settings.angularSleepTolerance = (2.0 / 180.0 * Math.PI); + return Settings; +}()); + +/* + * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + */ +var Pool = /** @class */ (function () { + function Pool(opts) { + this._list = []; + this._max = Infinity; + this._createCount = 0; + this._outCount = 0; + this._inCount = 0; + this._discardCount = 0; + this._list = []; + this._max = opts.max || this._max; + this._createFn = opts.create; + this._outFn = opts.allocate; + this._inFn = opts.release; + this._discardFn = opts.discard; + } + Pool.prototype.max = function (n) { + if (typeof n === 'number') { + this._max = n; + return this; + } + return this._max; + }; + Pool.prototype.size = function () { + return this._list.length; + }; + Pool.prototype.allocate = function () { + var item; + if (this._list.length > 0) { + item = this._list.shift(); + } + else { + this._createCount++; + if (typeof this._createFn === 'function') { + item = this._createFn(); } else { - aabb.upperBound.x += d.x * Settings.aabbMultiplier; + // tslint:disable-next-line:no-object-literal-type-assertion + item = {}; } - if (d.y < 0.0) { - aabb.lowerBound.y += d.y * Settings.aabbMultiplier; - } - else { - aabb.upperBound.y += d.y * Settings.aabbMultiplier; + } + this._outCount++; + if (typeof this._outFn === 'function') { + this._outFn(item); + } + return item; + }; + Pool.prototype.release = function (item) { + if (this._list.length < this._max) { + this._inCount++; + if (typeof this._inFn === 'function') { + this._inFn(item); } - this.insertLeaf(node); - return true; - }; - DynamicTree.prototype.insertLeaf = function (leaf) { - if (this.m_root == null) { - this.m_root = leaf; - this.m_root.parent = null; - return; + this._list.push(item); + } + else { + this._discardCount++; + if (typeof this._discardFn === 'function') { + item = this._discardFn(item); } - // Find the best sibling for this node - var leafAABB = leaf.aabb; - var index = this.m_root; - while (!index.isLeaf()) { - var child1 = index.child1; - var child2 = index.child2; - var area = index.aabb.getPerimeter(); - var combinedAABB = new AABB(); - combinedAABB.combine(index.aabb, leafAABB); - var combinedArea = combinedAABB.getPerimeter(); - // Cost of creating a new parent for this node and the new leaf - var cost = 2.0 * combinedArea; - // Minimum cost of pushing the leaf further down the tree - var inheritanceCost = 2.0 * (combinedArea - area); - // Cost of descending into child1 - var cost1 = void 0; - if (child1.isLeaf()) { - var aabb = new AABB(); - aabb.combine(leafAABB, child1.aabb); - cost1 = aabb.getPerimeter() + inheritanceCost; - } - else { - var aabb = new AABB(); - aabb.combine(leafAABB, child1.aabb); - var oldArea = child1.aabb.getPerimeter(); - var newArea = aabb.getPerimeter(); - cost1 = (newArea - oldArea) + inheritanceCost; - } - // Cost of descending into child2 - var cost2 = void 0; - if (child2.isLeaf()) { - var aabb = new AABB(); - aabb.combine(leafAABB, child2.aabb); - cost2 = aabb.getPerimeter() + inheritanceCost; - } - else { - var aabb = new AABB(); - aabb.combine(leafAABB, child2.aabb); - var oldArea = child2.aabb.getPerimeter(); - var newArea = aabb.getPerimeter(); - cost2 = newArea - oldArea + inheritanceCost; - } - // Descend according to the minimum cost. - if (cost < cost1 && cost < cost2) { - break; - } - // Descend - if (cost1 < cost2) { - index = child1; - } - else { - index = child2; - } + } + }; + /** @internal */ + Pool.prototype.toString = function () { + return " +" + this._createCount + " >" + this._outCount + " <" + this._inCount + " -" + + this._discardCount + " =" + this._list.length + "/" + this._max; + }; + return Pool; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A node in the dynamic tree. The client does not interact with this directly. + */ +var TreeNode = /** @class */ (function () { + function TreeNode(id) { + /** Enlarged AABB */ + this.aabb = new AABB(); + this.userData = null; + this.parent = null; + this.child1 = null; + this.child2 = null; + /** 0: leaf, -1: free node */ + this.height = -1; + this.id = id; + } + /** @internal */ + TreeNode.prototype.toString = function () { + return this.id + ": " + this.userData; + }; + TreeNode.prototype.isLeaf = function () { + return this.child1 == null; + }; + return TreeNode; +}()); +/** + * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A + * dynamic tree arranges data in a binary tree to accelerate queries such as + * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we + * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger + * than the client object. This allows the client object to move by small + * amounts without triggering a tree update. + * + * Nodes are pooled and relocatable, so we use node indices rather than + * pointers. + */ +var DynamicTree = /** @class */ (function () { + function DynamicTree() { + this.inputPool = new Pool({ + create: function () { + // tslint:disable-next-line:no-object-literal-type-assertion + return {}; + }, + release: function (stack) { } - var sibling = index; - // Create a new parent. - var oldParent = sibling.parent; - var newParent = this.allocateNode(); - newParent.parent = oldParent; - newParent.userData = null; - newParent.aabb.combine(leafAABB, sibling.aabb); - newParent.height = sibling.height + 1; - if (oldParent != null) { - // The sibling was not the root. - if (oldParent.child1 === sibling) { - oldParent.child1 = newParent; - } - else { - oldParent.child2 = newParent; - } - newParent.child1 = sibling; - newParent.child2 = leaf; - sibling.parent = newParent; - leaf.parent = newParent; + }); + this.stackPool = new Pool({ + create: function () { + return []; + }, + release: function (stack) { + stack.length = 0; + } + }); + this.iteratorPool = new Pool({ + create: function () { + return new Iterator(); + }, + release: function (iterator) { + iterator.close(); + } + }); + this.m_root = null; + this.m_nodes = {}; + this.m_lastProxyId = 0; + this.m_pool = new Pool({ + create: function () { + return new TreeNode(); + } + }); + } + /** + * Get proxy user data. + * + * @return the proxy user data or 0 if the id is invalid. + */ + DynamicTree.prototype.getUserData = function (id) { + var node = this.m_nodes[id]; + return node.userData; + }; + /** + * Get the fat AABB for a node id. + * + * @return the proxy user data or 0 if the id is invalid. + */ + DynamicTree.prototype.getFatAABB = function (id) { + var node = this.m_nodes[id]; + return node.aabb; + }; + DynamicTree.prototype.allocateNode = function () { + var node = this.m_pool.allocate(); + node.id = ++this.m_lastProxyId; + node.userData = null; + node.parent = null; + node.child1 = null; + node.child2 = null; + node.height = -1; + this.m_nodes[node.id] = node; + return node; + }; + DynamicTree.prototype.freeNode = function (node) { + this.m_pool.release(node); + node.height = -1; + // tslint:disable-next-line:no-dynamic-delete + delete this.m_nodes[node.id]; + }; + /** + * Create a proxy in the tree as a leaf node. We return the index of the node + * instead of a pointer so that we can grow the node pool. + * + * Create a proxy. Provide a tight fitting AABB and a userData pointer. + */ + DynamicTree.prototype.createProxy = function (aabb, userData) { + var node = this.allocateNode(); + node.aabb.set(aabb); + // Fatten the aabb. + AABB.extend(node.aabb, Settings.aabbExtension); + node.userData = userData; + node.height = 0; + this.insertLeaf(node); + return node.id; + }; + /** + * Destroy a proxy. This asserts if the id is invalid. + */ + DynamicTree.prototype.destroyProxy = function (id) { + var node = this.m_nodes[id]; + this.removeLeaf(node); + this.freeNode(node); + }; + /** + * Move a proxy with a swepted AABB. If the proxy has moved outside of its + * fattened AABB, then the proxy is removed from the tree and re-inserted. + * Otherwise the function returns immediately. + * + * @param d Displacement + * + * @return true if the proxy was re-inserted. + */ + DynamicTree.prototype.moveProxy = function (id, aabb, d) { + var node = this.m_nodes[id]; + if (node.aabb.contains(aabb)) { + return false; + } + this.removeLeaf(node); + node.aabb.set(aabb); + // Extend AABB. + aabb = node.aabb; + AABB.extend(aabb, Settings.aabbExtension); + // Predict AABB displacement. + // const d = Vec2.mul(Settings.aabbMultiplier, displacement); + if (d.x < 0.0) { + aabb.lowerBound.x += d.x * Settings.aabbMultiplier; + } + else { + aabb.upperBound.x += d.x * Settings.aabbMultiplier; + } + if (d.y < 0.0) { + aabb.lowerBound.y += d.y * Settings.aabbMultiplier; + } + else { + aabb.upperBound.y += d.y * Settings.aabbMultiplier; + } + this.insertLeaf(node); + return true; + }; + DynamicTree.prototype.insertLeaf = function (leaf) { + if (this.m_root == null) { + this.m_root = leaf; + this.m_root.parent = null; + return; + } + // Find the best sibling for this node + var leafAABB = leaf.aabb; + var index = this.m_root; + while (!index.isLeaf()) { + var child1 = index.child1; + var child2 = index.child2; + var area = index.aabb.getPerimeter(); + var combinedAABB = new AABB(); + combinedAABB.combine(index.aabb, leafAABB); + var combinedArea = combinedAABB.getPerimeter(); + // Cost of creating a new parent for this node and the new leaf + var cost = 2.0 * combinedArea; + // Minimum cost of pushing the leaf further down the tree + var inheritanceCost = 2.0 * (combinedArea - area); + // Cost of descending into child1 + var cost1 = void 0; + if (child1.isLeaf()) { + var aabb = new AABB(); + aabb.combine(leafAABB, child1.aabb); + cost1 = aabb.getPerimeter() + inheritanceCost; + } + else { + var aabb = new AABB(); + aabb.combine(leafAABB, child1.aabb); + var oldArea = child1.aabb.getPerimeter(); + var newArea = aabb.getPerimeter(); + cost1 = (newArea - oldArea) + inheritanceCost; + } + // Cost of descending into child2 + var cost2 = void 0; + if (child2.isLeaf()) { + var aabb = new AABB(); + aabb.combine(leafAABB, child2.aabb); + cost2 = aabb.getPerimeter() + inheritanceCost; + } + else { + var aabb = new AABB(); + aabb.combine(leafAABB, child2.aabb); + var oldArea = child2.aabb.getPerimeter(); + var newArea = aabb.getPerimeter(); + cost2 = newArea - oldArea + inheritanceCost; + } + // Descend according to the minimum cost. + if (cost < cost1 && cost < cost2) { + break; + } + // Descend + if (cost1 < cost2) { + index = child1; + } + else { + index = child2; + } + } + var sibling = index; + // Create a new parent. + var oldParent = sibling.parent; + var newParent = this.allocateNode(); + newParent.parent = oldParent; + newParent.userData = null; + newParent.aabb.combine(leafAABB, sibling.aabb); + newParent.height = sibling.height + 1; + if (oldParent != null) { + // The sibling was not the root. + if (oldParent.child1 === sibling) { + oldParent.child1 = newParent; + } + else { + oldParent.child2 = newParent; + } + newParent.child1 = sibling; + newParent.child2 = leaf; + sibling.parent = newParent; + leaf.parent = newParent; + } + else { + // The sibling was the root. + newParent.child1 = sibling; + newParent.child2 = leaf; + sibling.parent = newParent; + leaf.parent = newParent; + this.m_root = newParent; + } + // Walk back up the tree fixing heights and AABBs + index = leaf.parent; + while (index != null) { + index = this.balance(index); + var child1 = index.child1; + var child2 = index.child2; + index.height = 1 + math.max(child1.height, child2.height); + index.aabb.combine(child1.aabb, child2.aabb); + index = index.parent; + } + // validate(); + }; + DynamicTree.prototype.removeLeaf = function (leaf) { + if (leaf === this.m_root) { + this.m_root = null; + return; + } + var parent = leaf.parent; + var grandParent = parent.parent; + var sibling; + if (parent.child1 === leaf) { + sibling = parent.child2; + } + else { + sibling = parent.child1; + } + if (grandParent != null) { + // Destroy parent and connect sibling to grandParent. + if (grandParent.child1 === parent) { + grandParent.child1 = sibling; } else { - // The sibling was the root. - newParent.child1 = sibling; - newParent.child2 = leaf; - sibling.parent = newParent; - leaf.parent = newParent; - this.m_root = newParent; + grandParent.child2 = sibling; } - // Walk back up the tree fixing heights and AABBs - index = leaf.parent; + sibling.parent = grandParent; + this.freeNode(parent); + // Adjust ancestor bounds. + var index = grandParent; while (index != null) { index = this.balance(index); var child1 = index.child1; var child2 = index.child2; - index.height = 1 + math$1.max(child1.height, child2.height); index.aabb.combine(child1.aabb, child2.aabb); + index.height = 1 + math.max(child1.height, child2.height); index = index.parent; } - // validate(); - }; - DynamicTree.prototype.removeLeaf = function (leaf) { - if (leaf === this.m_root) { - this.m_root = null; - return; - } - var parent = leaf.parent; - var grandParent = parent.parent; - var sibling; - if (parent.child1 === leaf) { - sibling = parent.child2; + } + else { + this.m_root = sibling; + sibling.parent = null; + this.freeNode(parent); + } + // validate(); + }; + /** + * Perform a left or right rotation if node A is imbalanced. Returns the new + * root index. + */ + DynamicTree.prototype.balance = function (iA) { + var A = iA; + if (A.isLeaf() || A.height < 2) { + return iA; + } + var B = A.child1; + var C = A.child2; + var balance = C.height - B.height; + // Rotate C up + if (balance > 1) { + var F = C.child1; + var G = C.child2; + // Swap A and C + C.child1 = A; + C.parent = A.parent; + A.parent = C; + // A's old parent should point to C + if (C.parent != null) { + if (C.parent.child1 === iA) { + C.parent.child1 = C; + } + else { + C.parent.child2 = C; + } } else { - sibling = parent.child1; + this.m_root = C; + } + // Rotate + if (F.height > G.height) { + C.child2 = F; + A.child2 = G; + G.parent = A; + A.aabb.combine(B.aabb, G.aabb); + C.aabb.combine(A.aabb, F.aabb); + A.height = 1 + math.max(B.height, G.height); + C.height = 1 + math.max(A.height, F.height); } - if (grandParent != null) { - // Destroy parent and connect sibling to grandParent. - if (grandParent.child1 === parent) { - grandParent.child1 = sibling; + else { + C.child2 = G; + A.child2 = F; + F.parent = A; + A.aabb.combine(B.aabb, F.aabb); + C.aabb.combine(A.aabb, G.aabb); + A.height = 1 + math.max(B.height, F.height); + C.height = 1 + math.max(A.height, G.height); + } + return C; + } + // Rotate B up + if (balance < -1) { + var D = B.child1; + var E = B.child2; + // Swap A and B + B.child1 = A; + B.parent = A.parent; + A.parent = B; + // A's old parent should point to B + if (B.parent != null) { + if (B.parent.child1 === A) { + B.parent.child1 = B; } else { - grandParent.child2 = sibling; - } - sibling.parent = grandParent; - this.freeNode(parent); - // Adjust ancestor bounds. - var index = grandParent; - while (index != null) { - index = this.balance(index); - var child1 = index.child1; - var child2 = index.child2; - index.aabb.combine(child1.aabb, child2.aabb); - index.height = 1 + math$1.max(child1.height, child2.height); - index = index.parent; + B.parent.child2 = B; } } else { - this.m_root = sibling; - sibling.parent = null; - this.freeNode(parent); + this.m_root = B; + } + // Rotate + if (D.height > E.height) { + B.child2 = D; + A.child1 = E; + E.parent = A; + A.aabb.combine(C.aabb, E.aabb); + B.aabb.combine(A.aabb, D.aabb); + A.height = 1 + math.max(C.height, E.height); + B.height = 1 + math.max(A.height, D.height); } - // validate(); - }; - /** - * Perform a left or right rotation if node A is imbalanced. Returns the new - * root index. - */ - DynamicTree.prototype.balance = function (iA) { - var A = iA; - if (A.isLeaf() || A.height < 2) { - return iA; + else { + B.child2 = E; + A.child1 = D; + D.parent = A; + A.aabb.combine(C.aabb, D.aabb); + B.aabb.combine(A.aabb, E.aabb); + A.height = 1 + math.max(C.height, D.height); + B.height = 1 + math.max(A.height, E.height); + } + return B; + } + return A; + }; + /** + * Compute the height of the binary tree in O(N) time. Should not be called + * often. + */ + DynamicTree.prototype.getHeight = function () { + if (this.m_root == null) { + return 0; + } + return this.m_root.height; + }; + /** + * Get the ratio of the sum of the node areas to the root area. + */ + DynamicTree.prototype.getAreaRatio = function () { + if (this.m_root == null) { + return 0.0; + } + var root = this.m_root; + var rootArea = root.aabb.getPerimeter(); + var totalArea = 0.0; + var node; + var it = this.iteratorPool.allocate().preorder(this.m_root); + while (node = it.next()) { + if (node.height < 0) { + // Free node in pool + continue; + } + totalArea += node.aabb.getPerimeter(); + } + this.iteratorPool.release(it); + return totalArea / rootArea; + }; + /** + * Compute the height of a sub-tree. + */ + DynamicTree.prototype.computeHeight = function (id) { + var node; + if (typeof id !== 'undefined') { + node = this.m_nodes[id]; + } + else { + node = this.m_root; + } + // false && console.assert(0 <= id && id < this.m_nodeCapacity); + if (node.isLeaf()) { + return 0; + } + var height1 = this.computeHeight(node.child1.id); + var height2 = this.computeHeight(node.child2.id); + return 1 + math.max(height1, height2); + }; + DynamicTree.prototype.validateStructure = function (node) { + if (node == null) { + return; + } + if (node === this.m_root) ; + var child1 = node.child1; + var child2 = node.child2; + if (node.isLeaf()) { + return; + } + this.validateStructure(child1); + this.validateStructure(child2); + }; + DynamicTree.prototype.validateMetrics = function (node) { + if (node == null) { + return; + } + var child1 = node.child1; + var child2 = node.child2; + if (node.isLeaf()) { + return; + } + // false && console.assert(0 <= child1 && child1 < this.m_nodeCapacity); + // false && console.assert(0 <= child2 && child2 < this.m_nodeCapacity); + var height1 = child1.height; + var height2 = child2.height; + 1 + math.max(height1, height2); + var aabb = new AABB(); + aabb.combine(child1.aabb, child2.aabb); + this.validateMetrics(child1); + this.validateMetrics(child2); + }; + /** + * Validate this tree. For testing. + */ + DynamicTree.prototype.validate = function () { + this.validateStructure(this.m_root); + this.validateMetrics(this.m_root); + }; + /** + * Get the maximum balance of an node in the tree. The balance is the difference + * in height of the two children of a node. + */ + DynamicTree.prototype.getMaxBalance = function () { + var maxBalance = 0; + var node; + var it = this.iteratorPool.allocate().preorder(this.m_root); + while (node = it.next()) { + if (node.height <= 1) { + continue; + } + var balance = math.abs(node.child2.height - node.child1.height); + maxBalance = math.max(maxBalance, balance); + } + this.iteratorPool.release(it); + return maxBalance; + }; + /** + * Build an optimal tree. Very expensive. For testing. + */ + DynamicTree.prototype.rebuildBottomUp = function () { + var nodes = []; + var count = 0; + // Build array of leaves. Free the rest. + var node; + var it = this.iteratorPool.allocate().preorder(this.m_root); + while (node = it.next()) { + if (node.height < 0) { + // free node in pool + continue; } - var B = A.child1; - var C = A.child2; - var balance = C.height - B.height; - // Rotate C up - if (balance > 1) { - var F = C.child1; - var G = C.child2; - // Swap A and C - C.child1 = A; - C.parent = A.parent; - A.parent = C; - // A's old parent should point to C - if (C.parent != null) { - if (C.parent.child1 === iA) { - C.parent.child1 = C; - } - else { - C.parent.child2 = C; + if (node.isLeaf()) { + node.parent = null; + nodes[count] = node; + ++count; + } + else { + this.freeNode(node); + } + } + this.iteratorPool.release(it); + while (count > 1) { + var minCost = Infinity; + var iMin = -1; + var jMin = -1; + for (var i = 0; i < count; ++i) { + var aabbi = nodes[i].aabb; + for (var j = i + 1; j < count; ++j) { + var aabbj = nodes[j].aabb; + var b = new AABB(); + b.combine(aabbi, aabbj); + var cost = b.getPerimeter(); + if (cost < minCost) { + iMin = i; + jMin = j; + minCost = cost; } } - else { - this.m_root = C; - } - // Rotate - if (F.height > G.height) { - C.child2 = F; - A.child2 = G; - G.parent = A; - A.aabb.combine(B.aabb, G.aabb); - C.aabb.combine(A.aabb, F.aabb); - A.height = 1 + math$1.max(B.height, G.height); - C.height = 1 + math$1.max(A.height, F.height); - } - else { - C.child2 = G; - A.child2 = F; - F.parent = A; - A.aabb.combine(B.aabb, F.aabb); - C.aabb.combine(A.aabb, G.aabb); - A.height = 1 + math$1.max(B.height, F.height); - C.height = 1 + math$1.max(A.height, G.height); - } - return C; } - // Rotate B up - if (balance < -1) { - var D = B.child1; - var E = B.child2; - // Swap A and B - B.child1 = A; - B.parent = A.parent; - A.parent = B; - // A's old parent should point to B - if (B.parent != null) { - if (B.parent.child1 === A) { - B.parent.child1 = B; - } - else { - B.parent.child2 = B; + var child1 = nodes[iMin]; + var child2 = nodes[jMin]; + var parent_1 = this.allocateNode(); + parent_1.child1 = child1; + parent_1.child2 = child2; + parent_1.height = 1 + math.max(child1.height, child2.height); + parent_1.aabb.combine(child1.aabb, child2.aabb); + parent_1.parent = null; + child1.parent = parent_1; + child2.parent = parent_1; + nodes[jMin] = nodes[count - 1]; + nodes[iMin] = parent_1; + --count; + } + this.m_root = nodes[0]; + }; + /** + * Shift the world origin. Useful for large worlds. The shift formula is: + * position -= newOrigin + * + * @param newOrigin The new origin with respect to the old origin + */ + DynamicTree.prototype.shiftOrigin = function (newOrigin) { + // Build array of leaves. Free the rest. + var node; + var it = this.iteratorPool.allocate().preorder(this.m_root); + while (node = it.next()) { + var aabb = node.aabb; + aabb.lowerBound.x -= newOrigin.x; + aabb.lowerBound.y -= newOrigin.y; + aabb.upperBound.x -= newOrigin.x; + aabb.upperBound.y -= newOrigin.y; + } + this.iteratorPool.release(it); + }; + /** + * Query an AABB for overlapping proxies. The callback class is called for each + * proxy that overlaps the supplied AABB. + */ + DynamicTree.prototype.query = function (aabb, queryCallback) { + var stack = this.stackPool.allocate(); + stack.push(this.m_root); + while (stack.length > 0) { + var node = stack.pop(); + if (node == null) { + continue; + } + if (AABB.testOverlap(node.aabb, aabb)) { + if (node.isLeaf()) { + var proceed = queryCallback(node.id); + if (proceed === false) { + return; } } else { - this.m_root = B; - } - // Rotate - if (D.height > E.height) { - B.child2 = D; - A.child1 = E; - E.parent = A; - A.aabb.combine(C.aabb, E.aabb); - B.aabb.combine(A.aabb, D.aabb); - A.height = 1 + math$1.max(C.height, E.height); - B.height = 1 + math$1.max(A.height, D.height); - } - else { - B.child2 = E; - A.child1 = D; - D.parent = A; - A.aabb.combine(C.aabb, D.aabb); - B.aabb.combine(A.aabb, E.aabb); - A.height = 1 + math$1.max(C.height, D.height); - B.height = 1 + math$1.max(A.height, E.height); + stack.push(node.child1); + stack.push(node.child2); } - return B; } - return A; - }; - /** - * Compute the height of the binary tree in O(N) time. Should not be called - * often. - */ - DynamicTree.prototype.getHeight = function () { - if (this.m_root == null) { - return 0; + } + this.stackPool.release(stack); + }; + /** + * Ray-cast against the proxies in the tree. This relies on the callback to + * perform a exact ray-cast in the case were the proxy contains a shape. The + * callback also performs the any collision filtering. This has performance + * roughly equal to k * log(n), where k is the number of collisions and n is the + * number of proxies in the tree. + * + * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. + * @param rayCastCallback A function that is called for each proxy that is hit by the ray. + */ + DynamicTree.prototype.rayCast = function (input, rayCastCallback) { + var p1 = input.p1; + var p2 = input.p2; + var r = Vec2.sub(p2, p1); + r.normalize(); + // v is perpendicular to the segment. + var v = Vec2.crossNumVec2(1.0, r); + var abs_v = Vec2.abs(v); + // Separating axis for segment (Gino, p80). + // |dot(v, p1 - c)| > dot(|v|, h) + var maxFraction = input.maxFraction; + // Build a bounding box for the segment. + var segmentAABB = new AABB(); + var t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2); + segmentAABB.combinePoints(p1, t); + var stack = this.stackPool.allocate(); + var subInput = this.inputPool.allocate(); + stack.push(this.m_root); + while (stack.length > 0) { + var node = stack.pop(); + if (node == null) { + continue; } - return this.m_root.height; - }; - /** - * Get the ratio of the sum of the node areas to the root area. - */ - DynamicTree.prototype.getAreaRatio = function () { - if (this.m_root == null) { - return 0.0; + if (AABB.testOverlap(node.aabb, segmentAABB) === false) { + continue; } - var root = this.m_root; - var rootArea = root.aabb.getPerimeter(); - var totalArea = 0.0; - var node; - var it = this.iteratorPool.allocate().preorder(this.m_root); - while (node = it.next()) { - if (node.height < 0) { - // Free node in pool - continue; - } - totalArea += node.aabb.getPerimeter(); + // Separating axis for segment (Gino, p80). + // |dot(v, p1 - c)| > dot(|v|, h) + var c = node.aabb.getCenter(); + var h = node.aabb.getExtents(); + var separation = math.abs(Vec2.dot(v, Vec2.sub(p1, c))) - Vec2.dot(abs_v, h); + if (separation > 0.0) { + continue; } - this.iteratorPool.release(it); - return totalArea / rootArea; - }; - /** - * Compute the height of a sub-tree. - */ - DynamicTree.prototype.computeHeight = function (id) { - var node; - if (typeof id !== 'undefined') { - node = this.m_nodes[id]; + if (node.isLeaf()) { + subInput.p1 = Vec2.clone(input.p1); + subInput.p2 = Vec2.clone(input.p2); + subInput.maxFraction = maxFraction; + var value = rayCastCallback(subInput, node.id); + if (value === 0.0) { + // The client has terminated the ray cast. + return; + } + if (value > 0.0) { + // update segment bounding box. + maxFraction = value; + t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2); + segmentAABB.combinePoints(p1, t); + } } else { - node = this.m_root; - } - // _ASSERT && common.assert(0 <= id && id < this.m_nodeCapacity); - if (node.isLeaf()) { - return 0; + stack.push(node.child1); + stack.push(node.child2); } - var height1 = this.computeHeight(node.child1.id); - var height2 = this.computeHeight(node.child2.id); - return 1 + math$1.max(height1, height2); - }; - DynamicTree.prototype.validateStructure = function (node) { - if (node == null) { - return; + } + this.stackPool.release(stack); + this.inputPool.release(subInput); + }; + return DynamicTree; +}()); +var Iterator = /** @class */ (function () { + function Iterator() { + this.parents = []; + this.states = []; + } + Iterator.prototype.preorder = function (root) { + this.parents.length = 0; + this.parents.push(root); + this.states.length = 0; + this.states.push(0); + return this; + }; + Iterator.prototype.next = function () { + while (this.parents.length > 0) { + var i = this.parents.length - 1; + var node = this.parents[i]; + if (this.states[i] === 0) { + this.states[i] = 1; + return node; + } + if (this.states[i] === 1) { + this.states[i] = 2; + if (node.child1) { + this.parents.push(node.child1); + this.states.push(1); + return node.child1; + } } - if (node === this.m_root) ; - var child1 = node.child1; - var child2 = node.child2; - if (node.isLeaf()) { - return; + if (this.states[i] === 2) { + this.states[i] = 3; + if (node.child2) { + this.parents.push(node.child2); + this.states.push(1); + return node.child2; + } } - this.validateStructure(child1); - this.validateStructure(child2); - }; - DynamicTree.prototype.validateMetrics = function (node) { - if (node == null) { - return; - } - var child1 = node.child1; - var child2 = node.child2; - if (node.isLeaf()) { - return; - } - // _ASSERT && common.assert(0 <= child1 && child1 < this.m_nodeCapacity); - // _ASSERT && common.assert(0 <= child2 && child2 < this.m_nodeCapacity); - var height1 = child1.height; - var height2 = child2.height; - 1 + math$1.max(height1, height2); - var aabb = new AABB(); - aabb.combine(child1.aabb, child2.aabb); - this.validateMetrics(child1); - this.validateMetrics(child2); - }; - /** - * Validate this tree. For testing. - */ - DynamicTree.prototype.validate = function () { - this.validateStructure(this.m_root); - this.validateMetrics(this.m_root); - }; - /** - * Get the maximum balance of an node in the tree. The balance is the difference - * in height of the two children of a node. - */ - DynamicTree.prototype.getMaxBalance = function () { - var maxBalance = 0; - var node; - var it = this.iteratorPool.allocate().preorder(this.m_root); - while (node = it.next()) { - if (node.height <= 1) { - continue; - } - var balance = math$1.abs(node.child2.height - node.child1.height); - maxBalance = math$1.max(maxBalance, balance); - } - this.iteratorPool.release(it); - return maxBalance; - }; - /** - * Build an optimal tree. Very expensive. For testing. - */ - DynamicTree.prototype.rebuildBottomUp = function () { - var nodes = []; - var count = 0; - // Build array of leaves. Free the rest. - var node; - var it = this.iteratorPool.allocate().preorder(this.m_root); - while (node = it.next()) { - if (node.height < 0) { - // free node in pool - continue; - } - if (node.isLeaf()) { - node.parent = null; - nodes[count] = node; - ++count; - } - else { - this.freeNode(node); - } - } - this.iteratorPool.release(it); - while (count > 1) { - var minCost = Infinity; - var iMin = -1; - var jMin = -1; - for (var i = 0; i < count; ++i) { - var aabbi = nodes[i].aabb; - for (var j = i + 1; j < count; ++j) { - var aabbj = nodes[j].aabb; - var b = new AABB(); - b.combine(aabbi, aabbj); - var cost = b.getPerimeter(); - if (cost < minCost) { - iMin = i; - jMin = j; - minCost = cost; - } - } - } - var child1 = nodes[iMin]; - var child2 = nodes[jMin]; - var parent_1 = this.allocateNode(); - parent_1.child1 = child1; - parent_1.child2 = child2; - parent_1.height = 1 + math$1.max(child1.height, child2.height); - parent_1.aabb.combine(child1.aabb, child2.aabb); - parent_1.parent = null; - child1.parent = parent_1; - child2.parent = parent_1; - nodes[jMin] = nodes[count - 1]; - nodes[iMin] = parent_1; - --count; - } - this.m_root = nodes[0]; - this.validate(); - }; - /** - * Shift the world origin. Useful for large worlds. The shift formula is: - * position -= newOrigin - * - * @param newOrigin The new origin with respect to the old origin - */ - DynamicTree.prototype.shiftOrigin = function (newOrigin) { - // Build array of leaves. Free the rest. - var node; - var it = this.iteratorPool.allocate().preorder(this.m_root); - while (node = it.next()) { - var aabb = node.aabb; - aabb.lowerBound.x -= newOrigin.x; - aabb.lowerBound.y -= newOrigin.y; - aabb.upperBound.x -= newOrigin.x; - aabb.upperBound.y -= newOrigin.y; - } - this.iteratorPool.release(it); - }; + this.parents.pop(); + this.states.pop(); + } + }; + Iterator.prototype.close = function () { + this.parents.length = 0; + }; + return Iterator; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * The broad-phase wraps and extends a dynamic-tree to keep track of moved + * objects and query them on update. + */ +var BroadPhase = /** @class */ (function () { + function BroadPhase() { + var _this = this; + this.m_tree = new DynamicTree(); + this.m_proxyCount = 0; + this.m_moveBuffer = []; /** * Query an AABB for overlapping proxies. The callback class is called for each * proxy that overlaps the supplied AABB. */ - DynamicTree.prototype.query = function (aabb, queryCallback) { - var stack = this.stackPool.allocate(); - stack.push(this.m_root); - while (stack.length > 0) { - var node = stack.pop(); - if (node == null) { - continue; - } - if (AABB.testOverlap(node.aabb, aabb)) { - if (node.isLeaf()) { - var proceed = queryCallback(node.id); - if (proceed === false) { - return; - } - } - else { - stack.push(node.child1); - stack.push(node.child2); - } - } - } - this.stackPool.release(stack); - }; - /** - * Ray-cast against the proxies in the tree. This relies on the callback to - * perform a exact ray-cast in the case were the proxy contains a shape. The - * callback also performs the any collision filtering. This has performance - * roughly equal to k * log(n), where k is the number of collisions and n is the - * number of proxies in the tree. - * - * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. - * @param rayCastCallback A function that is called for each proxy that is hit by the ray. - */ - DynamicTree.prototype.rayCast = function (input, rayCastCallback) { - var p1 = input.p1; - var p2 = input.p2; - var r = Vec2.sub(p2, p1); - r.normalize(); - // v is perpendicular to the segment. - var v = Vec2.crossNumVec2(1.0, r); - var abs_v = Vec2.abs(v); - // Separating axis for segment (Gino, p80). - // |dot(v, p1 - c)| > dot(|v|, h) - var maxFraction = input.maxFraction; - // Build a bounding box for the segment. - var segmentAABB = new AABB(); - var t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2); - segmentAABB.combinePoints(p1, t); - var stack = this.stackPool.allocate(); - var subInput = this.inputPool.allocate(); - stack.push(this.m_root); - while (stack.length > 0) { - var node = stack.pop(); - if (node == null) { - continue; - } - if (AABB.testOverlap(node.aabb, segmentAABB) === false) { - continue; - } - // Separating axis for segment (Gino, p80). - // |dot(v, p1 - c)| > dot(|v|, h) - var c = node.aabb.getCenter(); - var h = node.aabb.getExtents(); - var separation = math$1.abs(Vec2.dot(v, Vec2.sub(p1, c))) - Vec2.dot(abs_v, h); - if (separation > 0.0) { - continue; - } - if (node.isLeaf()) { - subInput.p1 = Vec2.clone(input.p1); - subInput.p2 = Vec2.clone(input.p2); - subInput.maxFraction = maxFraction; - var value = rayCastCallback(subInput, node.id); - if (value === 0.0) { - // The client has terminated the ray cast. - return; - } - if (value > 0.0) { - // update segment bounding box. - maxFraction = value; - t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2); - segmentAABB.combinePoints(p1, t); - } - } - else { - stack.push(node.child1); - stack.push(node.child2); - } - } - this.stackPool.release(stack); - this.inputPool.release(subInput); - }; - return DynamicTree; - }()); - var Iterator = /** @class */ (function () { - function Iterator() { - this.parents = []; - this.states = []; - } - Iterator.prototype.preorder = function (root) { - this.parents.length = 0; - this.parents.push(root); - this.states.length = 0; - this.states.push(0); - return this; + this.query = function (aabb, queryCallback) { + _this.m_tree.query(aabb, queryCallback); }; - Iterator.prototype.next = function () { - while (this.parents.length > 0) { - var i = this.parents.length - 1; - var node = this.parents[i]; - if (this.states[i] === 0) { - this.states[i] = 1; - return node; - } - if (this.states[i] === 1) { - this.states[i] = 2; - if (node.child1) { - this.parents.push(node.child1); - this.states.push(1); - return node.child1; - } - } - if (this.states[i] === 2) { - this.states[i] = 3; - if (node.child2) { - this.parents.push(node.child2); - this.states.push(1); - return node.child2; - } - } - this.parents.pop(); - this.states.pop(); + this.queryCallback = function (proxyId) { + // A proxy cannot form a pair with itself. + if (proxyId === _this.m_queryProxyId) { + return true; } + var proxyIdA = math.min(proxyId, _this.m_queryProxyId); + var proxyIdB = math.max(proxyId, _this.m_queryProxyId); + // TODO: Skip any duplicate pairs. + var userDataA = _this.m_tree.getUserData(proxyIdA); + var userDataB = _this.m_tree.getUserData(proxyIdB); + // Send the pairs back to the client. + _this.m_callback(userDataA, userDataB); + return true; }; - Iterator.prototype.close = function () { - this.parents.length = 0; - }; - return Iterator; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + } + /** + * Get user data from a proxy. Returns null if the id is invalid. + */ + BroadPhase.prototype.getUserData = function (proxyId) { + return this.m_tree.getUserData(proxyId); + }; + /** + * Test overlap of fat AABBs. + */ + BroadPhase.prototype.testOverlap = function (proxyIdA, proxyIdB) { + var aabbA = this.m_tree.getFatAABB(proxyIdA); + var aabbB = this.m_tree.getFatAABB(proxyIdB); + return AABB.testOverlap(aabbA, aabbB); + }; + /** + * Get the fat AABB for a proxy. + */ + BroadPhase.prototype.getFatAABB = function (proxyId) { + return this.m_tree.getFatAABB(proxyId); + }; + /** + * Get the number of proxies. + */ + BroadPhase.prototype.getProxyCount = function () { + return this.m_proxyCount; + }; + /** + * Get the height of the embedded tree. + */ + BroadPhase.prototype.getTreeHeight = function () { + return this.m_tree.getHeight(); + }; + /** + * Get the balance (integer) of the embedded tree. + */ + BroadPhase.prototype.getTreeBalance = function () { + return this.m_tree.getMaxBalance(); + }; + /** + * Get the quality metric of the embedded tree. + */ + BroadPhase.prototype.getTreeQuality = function () { + return this.m_tree.getAreaRatio(); + }; + /** + * Ray-cast against the proxies in the tree. This relies on the callback to + * perform a exact ray-cast in the case were the proxy contains a shape. The + * callback also performs the any collision filtering. This has performance + * roughly equal to k * log(n), where k is the number of collisions and n is the + * number of proxies in the tree. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. + * @param rayCastCallback A function that is called for each proxy that is hit by the ray. + */ + BroadPhase.prototype.rayCast = function (input, rayCastCallback) { + this.m_tree.rayCast(input, rayCastCallback); + }; + /** + * Shift the world origin. Useful for large worlds. The shift formula is: + * position -= newOrigin * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * The broad-phase wraps and extends a dynamic-tree to keep track of moved - * objects and query them on update. - */ - var BroadPhase = /** @class */ (function () { - function BroadPhase() { - var _this = this; - this.m_tree = new DynamicTree(); - this.m_proxyCount = 0; - this.m_moveBuffer = []; - /** - * Query an AABB for overlapping proxies. The callback class is called for each - * proxy that overlaps the supplied AABB. - */ - this.query = function (aabb, queryCallback) { - _this.m_tree.query(aabb, queryCallback); - }; - this.queryCallback = function (proxyId) { - // A proxy cannot form a pair with itself. - if (proxyId === _this.m_queryProxyId) { - return true; - } - var proxyIdA = math$1.min(proxyId, _this.m_queryProxyId); - var proxyIdB = math$1.max(proxyId, _this.m_queryProxyId); - // TODO: Skip any duplicate pairs. - var userDataA = _this.m_tree.getUserData(proxyIdA); - var userDataB = _this.m_tree.getUserData(proxyIdB); - // Send the pairs back to the client. - _this.m_callback(userDataA, userDataB); - return true; - }; - } - /** - * Get user data from a proxy. Returns null if the id is invalid. - */ - BroadPhase.prototype.getUserData = function (proxyId) { - return this.m_tree.getUserData(proxyId); - }; - /** - * Test overlap of fat AABBs. - */ - BroadPhase.prototype.testOverlap = function (proxyIdA, proxyIdB) { - var aabbA = this.m_tree.getFatAABB(proxyIdA); - var aabbB = this.m_tree.getFatAABB(proxyIdB); - return AABB.testOverlap(aabbA, aabbB); - }; - /** - * Get the fat AABB for a proxy. - */ - BroadPhase.prototype.getFatAABB = function (proxyId) { - return this.m_tree.getFatAABB(proxyId); - }; - /** - * Get the number of proxies. - */ - BroadPhase.prototype.getProxyCount = function () { - return this.m_proxyCount; - }; - /** - * Get the height of the embedded tree. - */ - BroadPhase.prototype.getTreeHeight = function () { - return this.m_tree.getHeight(); - }; - /** - * Get the balance (integer) of the embedded tree. - */ - BroadPhase.prototype.getTreeBalance = function () { - return this.m_tree.getMaxBalance(); - }; - /** - * Get the quality metric of the embedded tree. - */ - BroadPhase.prototype.getTreeQuality = function () { - return this.m_tree.getAreaRatio(); - }; - /** - * Ray-cast against the proxies in the tree. This relies on the callback to - * perform a exact ray-cast in the case were the proxy contains a shape. The - * callback also performs the any collision filtering. This has performance - * roughly equal to k * log(n), where k is the number of collisions and n is the - * number of proxies in the tree. - * - * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. - * @param rayCastCallback A function that is called for each proxy that is hit by the ray. - */ - BroadPhase.prototype.rayCast = function (input, rayCastCallback) { - this.m_tree.rayCast(input, rayCastCallback); - }; - /** - * Shift the world origin. Useful for large worlds. The shift formula is: - * position -= newOrigin - * - * @param newOrigin The new origin with respect to the old origin - */ - BroadPhase.prototype.shiftOrigin = function (newOrigin) { - this.m_tree.shiftOrigin(newOrigin); - }; - /** - * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs - * is called. - */ - BroadPhase.prototype.createProxy = function (aabb, userData) { - var proxyId = this.m_tree.createProxy(aabb, userData); - this.m_proxyCount++; - this.bufferMove(proxyId); - return proxyId; - }; - /** - * Destroy a proxy. It is up to the client to remove any pairs. - */ - BroadPhase.prototype.destroyProxy = function (proxyId) { - this.unbufferMove(proxyId); - this.m_proxyCount--; - this.m_tree.destroyProxy(proxyId); - }; - /** - * Call moveProxy as many times as you like, then when you are done call - * UpdatePairs to finalized the proxy pairs (for your time step). - */ - BroadPhase.prototype.moveProxy = function (proxyId, aabb, displacement) { - var changed = this.m_tree.moveProxy(proxyId, aabb, displacement); - if (changed) { - this.bufferMove(proxyId); - } - }; - /** - * Call to trigger a re-processing of it's pairs on the next call to - * UpdatePairs. - */ - BroadPhase.prototype.touchProxy = function (proxyId) { + * @param newOrigin The new origin with respect to the old origin + */ + BroadPhase.prototype.shiftOrigin = function (newOrigin) { + this.m_tree.shiftOrigin(newOrigin); + }; + /** + * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs + * is called. + */ + BroadPhase.prototype.createProxy = function (aabb, userData) { + var proxyId = this.m_tree.createProxy(aabb, userData); + this.m_proxyCount++; + this.bufferMove(proxyId); + return proxyId; + }; + /** + * Destroy a proxy. It is up to the client to remove any pairs. + */ + BroadPhase.prototype.destroyProxy = function (proxyId) { + this.unbufferMove(proxyId); + this.m_proxyCount--; + this.m_tree.destroyProxy(proxyId); + }; + /** + * Call moveProxy as many times as you like, then when you are done call + * UpdatePairs to finalized the proxy pairs (for your time step). + */ + BroadPhase.prototype.moveProxy = function (proxyId, aabb, displacement) { + var changed = this.m_tree.moveProxy(proxyId, aabb, displacement); + if (changed) { this.bufferMove(proxyId); - }; - BroadPhase.prototype.bufferMove = function (proxyId) { - this.m_moveBuffer.push(proxyId); - }; - BroadPhase.prototype.unbufferMove = function (proxyId) { - for (var i = 0; i < this.m_moveBuffer.length; ++i) { - if (this.m_moveBuffer[i] === proxyId) { - this.m_moveBuffer[i] = null; - } - } - }; - /** - * Update the pairs. This results in pair callbacks. This can only add pairs. - */ - BroadPhase.prototype.updatePairs = function (addPairCallback) { - this.m_callback = addPairCallback; - // Perform tree queries for all moving proxies. - while (this.m_moveBuffer.length > 0) { - this.m_queryProxyId = this.m_moveBuffer.pop(); - if (this.m_queryProxyId === null) { - continue; - } - // We have to query the tree with the fat AABB so that - // we don't fail to create a pair that may touch later. - var fatAABB = this.m_tree.getFatAABB(this.m_queryProxyId); - // Query tree, create pairs and add them pair buffer. - this.m_tree.query(fatAABB, this.queryCallback); + } + }; + /** + * Call to trigger a re-processing of it's pairs on the next call to + * UpdatePairs. + */ + BroadPhase.prototype.touchProxy = function (proxyId) { + this.bufferMove(proxyId); + }; + BroadPhase.prototype.bufferMove = function (proxyId) { + this.m_moveBuffer.push(proxyId); + }; + BroadPhase.prototype.unbufferMove = function (proxyId) { + for (var i = 0; i < this.m_moveBuffer.length; ++i) { + if (this.m_moveBuffer[i] === proxyId) { + this.m_moveBuffer[i] = null; } - // Try to keep the tree balanced. - // this.m_tree.rebalance(4); - }; - return BroadPhase; - }()); + } + }; + /** + * Update the pairs. This results in pair callbacks. This can only add pairs. + */ + BroadPhase.prototype.updatePairs = function (addPairCallback) { + this.m_callback = addPairCallback; + // Perform tree queries for all moving proxies. + while (this.m_moveBuffer.length > 0) { + this.m_queryProxyId = this.m_moveBuffer.pop(); + if (this.m_queryProxyId === null) { + continue; + } + // We have to query the tree with the fat AABB so that + // we don't fail to create a pair that may touch later. + var fatAABB = this.m_tree.getFatAABB(this.m_queryProxyId); + // Query tree, create pairs and add them pair buffer. + this.m_tree.query(fatAABB, this.queryCallback); + } + // Try to keep the tree balanced. + // this.m_tree.rebalance(4); + }; + return BroadPhase; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var Rot = /** @class */ (function () { - /** Initialize from an angle in radians. */ - function Rot(angle) { - if (!(this instanceof Rot)) { - return new Rot(angle); - } - if (typeof angle === 'number') { - this.setAngle(angle); - } - else if (typeof angle === 'object') { - this.setRot(angle); - } - else { - this.setIdentity(); - } +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Rot = /** @class */ (function () { + /** Initialize from an angle in radians. */ + function Rot(angle) { + if (!(this instanceof Rot)) { + return new Rot(angle); } - /** @internal */ - Rot.neo = function (angle) { - var obj = Object.create(Rot.prototype); - obj.setAngle(angle); - return obj; - }; - Rot.clone = function (rot) { - var obj = Object.create(Rot.prototype); - obj.s = rot.s; - obj.c = rot.c; - return obj; - }; - Rot.identity = function () { - var obj = Object.create(Rot.prototype); - obj.s = 0.0; - obj.c = 1.0; - return obj; - }; - Rot.isValid = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - return math$1.isFinite(obj.s) && math$1.isFinite(obj.c); - }; - Rot.assert = function (o) { - return; - }; - /** Set to the identity rotation. */ - Rot.prototype.setIdentity = function () { - this.s = 0.0; - this.c = 1.0; - }; - Rot.prototype.set = function (angle) { - if (typeof angle === 'object') { - this.s = angle.s; - this.c = angle.c; - } - else { - // TODO_ERIN optimize - this.s = math$1.sin(angle); - this.c = math$1.cos(angle); - } - }; - Rot.prototype.setRot = function (angle) { - this.s = angle.s; - this.c = angle.c; - }; - /** Set using an angle in radians. */ - Rot.prototype.setAngle = function (angle) { - // TODO_ERIN optimize - this.s = math$1.sin(angle); - this.c = math$1.cos(angle); - }; - /** Get the angle in radians. */ - Rot.prototype.getAngle = function () { - return math$1.atan2(this.s, this.c); - }; - /** Get the x-axis. */ - Rot.prototype.getXAxis = function () { - return Vec2.neo(this.c, this.s); - }; - /** Get the u-axis. */ - Rot.prototype.getYAxis = function () { - return Vec2.neo(-this.s, this.c); - }; - // tslint:disable-next-line:typedef - Rot.mul = function (rot, m) { - if ('c' in m && 's' in m) { - // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc] - // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc] - // s = qs * rc + qc * rs - // c = qc * rc - qs * rs - var qr = Rot.identity(); - qr.s = rot.s * m.c + rot.c * m.s; - qr.c = rot.c * m.c - rot.s * m.s; - return qr; - } - else if ('x' in m && 'y' in m) { - return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y); - } - }; - /** Multiply two rotations: q * r */ - Rot.mulRot = function (rot, m) { + if (typeof angle === 'number') { + this.setAngle(angle); + } + else if (typeof angle === 'object') { + this.setRot(angle); + } + else { + this.setIdentity(); + } + } + /** @internal */ + Rot.neo = function (angle) { + var obj = Object.create(Rot.prototype); + obj.setAngle(angle); + return obj; + }; + Rot.clone = function (rot) { + var obj = Object.create(Rot.prototype); + obj.s = rot.s; + obj.c = rot.c; + return obj; + }; + Rot.identity = function () { + var obj = Object.create(Rot.prototype); + obj.s = 0.0; + obj.c = 1.0; + return obj; + }; + Rot.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return math.isFinite(obj.s) && math.isFinite(obj.c); + }; + Rot.assert = function (o) { + }; + /** Set to the identity rotation. */ + Rot.prototype.setIdentity = function () { + this.s = 0.0; + this.c = 1.0; + }; + Rot.prototype.set = function (angle) { + if (typeof angle === 'object') { + this.s = angle.s; + this.c = angle.c; + } + else { + // TODO_ERIN optimize + this.s = math.sin(angle); + this.c = math.cos(angle); + } + }; + Rot.prototype.setRot = function (angle) { + this.s = angle.s; + this.c = angle.c; + }; + /** Set using an angle in radians. */ + Rot.prototype.setAngle = function (angle) { + // TODO_ERIN optimize + this.s = math.sin(angle); + this.c = math.cos(angle); + }; + /** Get the angle in radians. */ + Rot.prototype.getAngle = function () { + return math.atan2(this.s, this.c); + }; + /** Get the x-axis. */ + Rot.prototype.getXAxis = function () { + return Vec2.neo(this.c, this.s); + }; + /** Get the u-axis. */ + Rot.prototype.getYAxis = function () { + return Vec2.neo(-this.s, this.c); + }; + // tslint:disable-next-line:typedef + Rot.mul = function (rot, m) { + if ('c' in m && 's' in m) { // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc] // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc] // s = qs * rc + qc * rs @@ -2189,34 +4912,34 @@ qr.s = rot.s * m.c + rot.c * m.s; qr.c = rot.c * m.c - rot.s * m.s; return qr; - }; - /** Rotate a vector */ - Rot.mulVec2 = function (rot, m) { + } + else if ('x' in m && 'y' in m) { return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y); - }; - Rot.mulSub = function (rot, v, w) { - var x = rot.c * (v.x - w.x) - rot.s * (v.y - w.y); - var y = rot.s * (v.x - w.x) + rot.c * (v.y - w.y); - return Vec2.neo(x, y); - }; - // tslint:disable-next-line:typedef - Rot.mulT = function (rot, m) { - if ('c' in m && 's' in m) { - // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc] - // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc] - // s = qc * rs - qs * rc - // c = qc * rc + qs * rs - var qr = Rot.identity(); - qr.s = rot.c * m.s - rot.s * m.c; - qr.c = rot.c * m.c + rot.s * m.s; - return qr; - } - else if ('x' in m && 'y' in m) { - return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y); - } - }; - /** Transpose multiply two rotations: qT * r */ - Rot.mulTRot = function (rot, m) { + } + }; + /** Multiply two rotations: q * r */ + Rot.mulRot = function (rot, m) { + // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc] + // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc] + // s = qs * rc + qc * rs + // c = qc * rc - qs * rs + var qr = Rot.identity(); + qr.s = rot.s * m.c + rot.c * m.s; + qr.c = rot.c * m.c - rot.s * m.s; + return qr; + }; + /** Rotate a vector */ + Rot.mulVec2 = function (rot, m) { + return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y); + }; + Rot.mulSub = function (rot, v, w) { + var x = rot.c * (v.x - w.x) - rot.s * (v.y - w.y); + var y = rot.s * (v.x - w.x) + rot.c * (v.y - w.y); + return Vec2.neo(x, y); + }; + // tslint:disable-next-line:typedef + Rot.mulT = function (rot, m) { + if ('c' in m && 's' in m) { // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc] // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc] // s = qc * rs - qs * rc @@ -2225,16847 +4948,13287 @@ qr.s = rot.c * m.s - rot.s * m.c; qr.c = rot.c * m.c + rot.s * m.s; return qr; - }; - /** Inverse rotate a vector */ - Rot.mulTVec2 = function (rot, m) { + } + else if ('x' in m && 'y' in m) { return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y); - }; - return Rot; - }()); + } + }; + /** Transpose multiply two rotations: qT * r */ + Rot.mulTRot = function (rot, m) { + // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc] + // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc] + // s = qc * rs - qs * rc + // c = qc * rc + qs * rs + var qr = Rot.identity(); + qr.s = rot.c * m.s - rot.s * m.c; + qr.c = rot.c * m.c + rot.s * m.s; + return qr; + }; + /** Inverse rotate a vector */ + Rot.mulTVec2 = function (rot, m) { + return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y); + }; + return Rot; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * A transform contains translation and rotation. It is used to represent the - * position and orientation of rigid frames. Initialize using a position vector - * and a rotation. - */ - var Transform = /** @class */ (function () { - function Transform(position, rotation) { - if (!(this instanceof Transform)) { - return new Transform(position, rotation); - } - this.p = Vec2.zero(); - this.q = Rot.identity(); - if (typeof position !== 'undefined') { - this.p.setVec2(position); - } - if (typeof rotation !== 'undefined') { - this.q.setAngle(rotation); - } +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A transform contains translation and rotation. It is used to represent the + * position and orientation of rigid frames. Initialize using a position vector + * and a rotation. + */ +var Transform = /** @class */ (function () { + function Transform(position, rotation) { + if (!(this instanceof Transform)) { + return new Transform(position, rotation); } - Transform.clone = function (xf) { - var obj = Object.create(Transform.prototype); - obj.p = Vec2.clone(xf.p); - obj.q = Rot.clone(xf.q); - return obj; - }; - /** @internal */ - Transform.neo = function (position, rotation) { - var obj = Object.create(Transform.prototype); - obj.p = Vec2.clone(position); - obj.q = Rot.clone(rotation); - return obj; - }; - Transform.identity = function () { - var obj = Object.create(Transform.prototype); - obj.p = Vec2.zero(); - obj.q = Rot.identity(); - return obj; - }; - /** - * Set this to the identity transform. - */ - Transform.prototype.setIdentity = function () { - this.p.setZero(); - this.q.setIdentity(); - }; - /** - * Set this based on the position and angle. - */ - // tslint:disable-next-line:typedef - Transform.prototype.set = function (a, b) { - if (typeof b === 'undefined') { - this.p.set(a.p); - this.q.set(a.q); - } - else { - this.p.set(a); - this.q.set(b); - } - }; - /** - * Set this based on the position and angle. - */ - Transform.prototype.setNum = function (position, rotation) { + this.p = Vec2.zero(); + this.q = Rot.identity(); + if (typeof position !== 'undefined') { this.p.setVec2(position); + } + if (typeof rotation !== 'undefined') { this.q.setAngle(rotation); - }; - Transform.prototype.setTransform = function (xf) { - this.p.setVec2(xf.p); - this.q.setRot(xf.q); - }; - Transform.isValid = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - return Vec2.isValid(obj.p) && Rot.isValid(obj.q); - }; - Transform.assert = function (o) { - return; - }; - // static mul(a: Transform, b: Vec2[]): Vec2[]; - // static mul(a: Transform, b: Transform[]): Transform[]; - // tslint:disable-next-line:typedef - Transform.mul = function (a, b) { - if (Array.isArray(b)) { - var arr = []; - for (var i = 0; i < b.length; i++) { - arr[i] = Transform.mul(a, b[i]); - } - return arr; - } - else if ('x' in b && 'y' in b) { - return Transform.mulVec2(a, b); - } - else if ('p' in b && 'q' in b) { - return Transform.mulXf(a, b); - } - }; - // tslint:disable-next-line:typedef - Transform.mulAll = function (a, b) { + } + } + Transform.clone = function (xf) { + var obj = Object.create(Transform.prototype); + obj.p = Vec2.clone(xf.p); + obj.q = Rot.clone(xf.q); + return obj; + }; + /** @internal */ + Transform.neo = function (position, rotation) { + var obj = Object.create(Transform.prototype); + obj.p = Vec2.clone(position); + obj.q = Rot.clone(rotation); + return obj; + }; + Transform.identity = function () { + var obj = Object.create(Transform.prototype); + obj.p = Vec2.zero(); + obj.q = Rot.identity(); + return obj; + }; + /** + * Set this to the identity transform. + */ + Transform.prototype.setIdentity = function () { + this.p.setZero(); + this.q.setIdentity(); + }; + /** + * Set this based on the position and angle. + */ + // tslint:disable-next-line:typedef + Transform.prototype.set = function (a, b) { + if (typeof b === 'undefined') { + this.p.set(a.p); + this.q.set(a.q); + } + else { + this.p.set(a); + this.q.set(b); + } + }; + /** + * Set this based on the position and angle. + */ + Transform.prototype.setNum = function (position, rotation) { + this.p.setVec2(position); + this.q.setAngle(rotation); + }; + Transform.prototype.setTransform = function (xf) { + this.p.setVec2(xf.p); + this.q.setRot(xf.q); + }; + Transform.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return Vec2.isValid(obj.p) && Rot.isValid(obj.q); + }; + Transform.assert = function (o) { + }; + // static mul(a: Transform, b: Vec2Value[]): Vec2[]; + // static mul(a: Transform, b: Transform[]): Transform[]; + // tslint:disable-next-line:typedef + Transform.mul = function (a, b) { + if (Array.isArray(b)) { var arr = []; for (var i = 0; i < b.length; i++) { arr[i] = Transform.mul(a, b[i]); } return arr; + } + else if ('x' in b && 'y' in b) { + return Transform.mulVec2(a, b); + } + else if ('p' in b && 'q' in b) { + return Transform.mulXf(a, b); + } + }; + // tslint:disable-next-line:typedef + Transform.mulAll = function (a, b) { + var arr = []; + for (var i = 0; i < b.length; i++) { + arr[i] = Transform.mul(a, b[i]); + } + return arr; + }; + /** @internal @deprecated */ + // tslint:disable-next-line:typedef + Transform.mulFn = function (a) { + return function (b) { + return Transform.mul(a, b); }; - /** @internal @deprecated */ - // tslint:disable-next-line:typedef - Transform.mulFn = function (a) { - return function (b) { - return Transform.mul(a, b); - }; - }; - Transform.mulVec2 = function (a, b) { - var x = (a.q.c * b.x - a.q.s * b.y) + a.p.x; - var y = (a.q.s * b.x + a.q.c * b.y) + a.p.y; - return Vec2.neo(x, y); - }; - Transform.mulXf = function (a, b) { - // v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p - // = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p - var xf = Transform.identity(); - xf.q = Rot.mulRot(a.q, b.q); - xf.p = Vec2.add(Rot.mulVec2(a.q, b.p), a.p); - return xf; - }; - // tslint:disable-next-line:typedef - Transform.mulT = function (a, b) { - if ('x' in b && 'y' in b) { - return Transform.mulTVec2(a, b); - } - else if ('p' in b && 'q' in b) { - return Transform.mulTXf(a, b); - } - }; - Transform.mulTVec2 = function (a, b) { - var px = b.x - a.p.x; - var py = b.y - a.p.y; - var x = (a.q.c * px + a.q.s * py); - var y = (-a.q.s * px + a.q.c * py); - return Vec2.neo(x, y); - }; - Transform.mulTXf = function (a, b) { - // v2 = A.q' * (B.q * v1 + B.p - A.p) - // = A.q' * B.q * v1 + A.q' * (B.p - A.p) - var xf = Transform.identity(); - xf.q.setRot(Rot.mulTRot(a.q, b.q)); - xf.p.setVec2(Rot.mulTVec2(a.q, Vec2.sub(b.p, a.p))); - return xf; - }; - return Transform; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * This describes the motion of a body/shape for TOI computation. Shapes are - * defined with respect to the body origin, which may not coincide with the - * center of mass. However, to support dynamics we must interpolate the center - * of mass position. - */ - var Sweep = /** @class */ (function () { - function Sweep(c, a) { - this.localCenter = Vec2.zero(); - this.c = Vec2.zero(); - this.a = 0; - this.alpha0 = 0; - this.c0 = Vec2.zero(); - this.a0 = 0; - } - Sweep.prototype.setTransform = function (xf) { - var c = Transform.mulVec2(xf, this.localCenter); - this.c.setVec2(c); - this.c0.setVec2(c); - this.a = xf.q.getAngle(); - this.a0 = xf.q.getAngle(); - }; - Sweep.prototype.setLocalCenter = function (localCenter, xf) { - this.localCenter.setVec2(localCenter); - var c = Transform.mulVec2(xf, this.localCenter); - this.c.setVec2(c); - this.c0.setVec2(c); - }; - /** - * Get the interpolated transform at a specific time. - * - * @param xf - * @param beta A factor in [0,1], where 0 indicates alpha0 - */ - Sweep.prototype.getTransform = function (xf, beta) { - if (beta === void 0) { beta = 0; } - xf.q.setAngle((1.0 - beta) * this.a0 + beta * this.a); - xf.p.setCombine((1.0 - beta), this.c0, beta, this.c); - // shift to origin - xf.p.sub(Rot.mulVec2(xf.q, this.localCenter)); - }; - /** - * Advance the sweep forward, yielding a new initial state. - * - * @param alpha The new initial time - */ - Sweep.prototype.advance = function (alpha) { - var beta = (alpha - this.alpha0) / (1.0 - this.alpha0); - this.c0.setCombine(beta, this.c, 1 - beta, this.c0); - this.a0 = beta * this.a + (1 - beta) * this.a0; - this.alpha0 = alpha; - }; - Sweep.prototype.forward = function () { - this.a0 = this.a; - this.c0.setVec2(this.c); - }; - /** - * normalize the angles in radians to be between -pi and pi. - */ - Sweep.prototype.normalize = function () { - var a0 = math$1.mod(this.a0, -math$1.PI, +math$1.PI); - this.a -= this.a0 - a0; - this.a0 = a0; - }; - Sweep.prototype.clone = function () { - var clone = new Sweep(); - clone.localCenter.setVec2(this.localCenter); - clone.alpha0 = this.alpha0; - clone.a0 = this.a0; - clone.a = this.a; - clone.c0.setVec2(this.c0); - clone.c.setVec2(this.c); - return clone; - }; - Sweep.prototype.set = function (that) { - this.localCenter.setVec2(that.localCenter); - this.alpha0 = that.alpha0; - this.a0 = that.a0; - this.a = that.a; - this.c0.setVec2(that.c0); - this.c.setVec2(that.c); - }; - return Sweep; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var Velocity = /** @class */ (function () { - function Velocity() { - this.v = Vec2.zero(); - this.w = 0; - } - return Velocity; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var Position = /** @class */ (function () { - function Position() { - this.c = Vec2.zero(); - this.a = 0; - } - Position.prototype.getTransform = function (xf, p) { - xf.q.setAngle(this.a); - xf.p.setVec2(Vec2.sub(this.c, Rot.mulVec2(xf.q, p))); - return xf; - }; - return Position; - }()); + }; + Transform.mulVec2 = function (a, b) { + var x = (a.q.c * b.x - a.q.s * b.y) + a.p.x; + var y = (a.q.s * b.x + a.q.c * b.y) + a.p.y; + return Vec2.neo(x, y); + }; + Transform.mulXf = function (a, b) { + // v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p + // = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p + var xf = Transform.identity(); + xf.q = Rot.mulRot(a.q, b.q); + xf.p = Vec2.add(Rot.mulVec2(a.q, b.p), a.p); + return xf; + }; + // tslint:disable-next-line:typedef + Transform.mulT = function (a, b) { + if ('x' in b && 'y' in b) { + return Transform.mulTVec2(a, b); + } + else if ('p' in b && 'q' in b) { + return Transform.mulTXf(a, b); + } + }; + Transform.mulTVec2 = function (a, b) { + var px = b.x - a.p.x; + var py = b.y - a.p.y; + var x = (a.q.c * px + a.q.s * py); + var y = (-a.q.s * px + a.q.c * py); + return Vec2.neo(x, y); + }; + Transform.mulTXf = function (a, b) { + // v2 = A.q' * (B.q * v1 + B.p - A.p) + // = A.q' * B.q * v1 + A.q' * (B.p - A.p) + var xf = Transform.identity(); + xf.q.setRot(Rot.mulTRot(a.q, b.q)); + xf.p.setVec2(Rot.mulTVec2(a.q, Vec2.sub(b.p, a.p))); + return xf; + }; + return Transform; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * This describes the motion of a body/shape for TOI computation. Shapes are + * defined with respect to the body origin, which may not coincide with the + * center of mass. However, to support dynamics we must interpolate the center + * of mass position. + */ +var Sweep = /** @class */ (function () { + function Sweep(c, a) { + this.localCenter = Vec2.zero(); + this.c = Vec2.zero(); + this.a = 0; + this.alpha0 = 0; + this.c0 = Vec2.zero(); + this.a0 = 0; + } + Sweep.prototype.setTransform = function (xf) { + var c = Transform.mulVec2(xf, this.localCenter); + this.c.setVec2(c); + this.c0.setVec2(c); + this.a = xf.q.getAngle(); + this.a0 = xf.q.getAngle(); + }; + Sweep.prototype.setLocalCenter = function (localCenter, xf) { + this.localCenter.setVec2(localCenter); + var c = Transform.mulVec2(xf, this.localCenter); + this.c.setVec2(c); + this.c0.setVec2(c); + }; + /** + * Get the interpolated transform at a specific time. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * @param xf + * @param beta A factor in [0,1], where 0 indicates alpha0 + */ + Sweep.prototype.getTransform = function (xf, beta) { + if (beta === void 0) { beta = 0; } + xf.q.setAngle((1.0 - beta) * this.a0 + beta * this.a); + xf.p.setCombine((1.0 - beta), this.c0, beta, this.c); + // shift to origin + xf.p.sub(Rot.mulVec2(xf.q, this.localCenter)); + }; + /** + * Advance the sweep forward, yielding a new initial state. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * @param alpha The new initial time */ + Sweep.prototype.advance = function (alpha) { + var beta = (alpha - this.alpha0) / (1.0 - this.alpha0); + this.c0.setCombine(beta, this.c, 1 - beta, this.c0); + this.a0 = beta * this.a + (1 - beta) * this.a0; + this.alpha0 = alpha; + }; + Sweep.prototype.forward = function () { + this.a0 = this.a; + this.c0.setVec2(this.c); + }; /** - * A shape is used for collision detection. You can create a shape however you - * like. Shapes used for simulation in World are created automatically when a - * Fixture is created. Shapes may encapsulate one or more child shapes. + * normalize the angles in radians to be between -pi and pi. */ - var Shape = /** @class */ (function () { - function Shape() { - } - /** @internal */ - Shape.prototype._reset = function () { - }; - Shape.isValid = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - return typeof obj.m_type === 'string' && typeof obj.m_radius === 'number'; - }; - Shape.prototype.getRadius = function () { - return this.m_radius; - }; - /** - * Get the type of this shape. You can use this to down cast to the concrete - * shape. - * - * @return the shape type. - */ - Shape.prototype.getType = function () { - return this.m_type; - }; - return Shape; - }()); + Sweep.prototype.normalize = function () { + var a0 = math.mod(this.a0, -math.PI, +math.PI); + this.a -= this.a0 - a0; + this.a0 = a0; + }; + Sweep.prototype.clone = function () { + var clone = new Sweep(); + clone.localCenter.setVec2(this.localCenter); + clone.alpha0 = this.alpha0; + clone.a0 = this.a0; + clone.a = this.a; + clone.c0.setVec2(this.c0); + clone.c.setVec2(this.c); + return clone; + }; + Sweep.prototype.set = function (that) { + this.localCenter.setVec2(that.localCenter); + this.alpha0 = that.alpha0; + this.a0 = that.a0; + this.a = that.a; + this.c0.setVec2(that.c0); + this.c.setVec2(that.c); + }; + return Sweep; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var FixtureDefDefault = { - userData: null, - friction: 0.2, - restitution: 0.0, - density: 0.0, - isSensor: false, - filterGroupIndex: 0, - filterCategoryBits: 0x0001, - filterMaskBits: 0xFFFF - }; - /** - * This proxy is used internally to connect shape children to the broad-phase. - */ - var FixtureProxy = /** @class */ (function () { - function FixtureProxy(fixture, childIndex) { - this.aabb = new AABB(); - this.fixture = fixture; - this.childIndex = childIndex; - this.proxyId; - } - return FixtureProxy; - }()); - /** - * A fixture is used to attach a shape to a body for collision detection. A - * fixture inherits its transform from its parent. Fixtures hold additional - * non-geometric data such as friction, collision filters, etc. - * - * To create a new Fixture use {@link Body.createFixture}. - */ - var Fixture = /** @class */ (function () { - // tslint:disable-next-line:typedef - /** @internal */ function Fixture(body, shape, def) { - if (shape.shape) { - def = shape; - shape = shape.shape; - } - else if (typeof def === 'number') { - def = { density: def }; - } - def = options(def, FixtureDefDefault); - this.m_body = body; - this.m_friction = def.friction; - this.m_restitution = def.restitution; - this.m_density = def.density; - this.m_isSensor = def.isSensor; - this.m_filterGroupIndex = def.filterGroupIndex; - this.m_filterCategoryBits = def.filterCategoryBits; - this.m_filterMaskBits = def.filterMaskBits; - // TODO validate shape - this.m_shape = shape; // .clone(); - this.m_next = null; - this.m_proxies = []; - this.m_proxyCount = 0; - var childCount = this.m_shape.getChildCount(); - for (var i = 0; i < childCount; ++i) { - this.m_proxies[i] = new FixtureProxy(this, i); - } - this.m_userData = def.userData; - } - /** - * Re-setup fixture. - * @internal - */ - Fixture.prototype._reset = function () { - var body = this.getBody(); - var broadPhase = body.m_world.m_broadPhase; - this.destroyProxies(broadPhase); - if (this.m_shape._reset) { - this.m_shape._reset(); - } - var childCount = this.m_shape.getChildCount(); - for (var i = 0; i < childCount; ++i) { - this.m_proxies[i] = new FixtureProxy(this, i); - } - this.createProxies(broadPhase, body.m_xf); - body.resetMassData(); - }; - /** @internal */ - Fixture.prototype._serialize = function () { - return { - friction: this.m_friction, - restitution: this.m_restitution, - density: this.m_density, - isSensor: this.m_isSensor, - filterGroupIndex: this.m_filterGroupIndex, - filterCategoryBits: this.m_filterCategoryBits, - filterMaskBits: this.m_filterMaskBits, - shape: this.m_shape, - }; - }; - /** @internal */ - Fixture._deserialize = function (data, body, restore) { - var shape = restore(Shape, data.shape); - var fixture = shape && new Fixture(body, shape, data); - return fixture; - }; - /** - * Get the type of the child shape. You can use this to down cast to the - * concrete shape. - */ - Fixture.prototype.getType = function () { - return this.m_shape.getType(); - }; - /** - * Get the child shape. You can modify the child shape, however you should not - * change the number of vertices because this will crash some collision caching - * mechanisms. Manipulating the shape may lead to non-physical behavior. - */ - Fixture.prototype.getShape = function () { - return this.m_shape; - }; - /** - * A sensor shape collects contact information but never generates a collision - * response. - */ - Fixture.prototype.isSensor = function () { - return this.m_isSensor; - }; - /** - * Set if this fixture is a sensor. - */ - Fixture.prototype.setSensor = function (sensor) { - if (sensor != this.m_isSensor) { - this.m_body.setAwake(true); - this.m_isSensor = sensor; - } - }; - // /** - // * Get the contact filtering data. - // */ - // getFilterData() { - // return this.m_filter; - // } - /** - * Get the user data that was assigned in the fixture definition. Use this to - * store your application specific data. - */ - Fixture.prototype.getUserData = function () { - return this.m_userData; - }; - /** - * Set the user data. Use this to store your application specific data. - */ - Fixture.prototype.setUserData = function (data) { - this.m_userData = data; - }; - /** - * Get the parent body of this fixture. This is null if the fixture is not - * attached. - */ - Fixture.prototype.getBody = function () { - return this.m_body; - }; - /** - * Get the next fixture in the parent body's fixture list. - */ - Fixture.prototype.getNext = function () { - return this.m_next; - }; - /** - * Get the density of this fixture. - */ - Fixture.prototype.getDensity = function () { - return this.m_density; - }; - /** - * Set the density of this fixture. This will _not_ automatically adjust the - * mass of the body. You must call Body.resetMassData to update the body's mass. - */ - Fixture.prototype.setDensity = function (density) { - this.m_density = density; - }; - /** - * Get the coefficient of friction, usually in the range [0,1]. - */ - Fixture.prototype.getFriction = function () { - return this.m_friction; - }; - /** - * Set the coefficient of friction. This will not change the friction of - * existing contacts. - */ - Fixture.prototype.setFriction = function (friction) { - this.m_friction = friction; - }; - /** - * Get the coefficient of restitution. - */ - Fixture.prototype.getRestitution = function () { - return this.m_restitution; - }; - /** - * Set the coefficient of restitution. This will not change the restitution of - * existing contacts. - */ - Fixture.prototype.setRestitution = function (restitution) { - this.m_restitution = restitution; - }; - /** - * Test a point in world coordinates for containment in this fixture. - */ - Fixture.prototype.testPoint = function (p) { - return this.m_shape.testPoint(this.m_body.getTransform(), p); - }; - /** - * Cast a ray against this shape. - */ - Fixture.prototype.rayCast = function (output, input, childIndex) { - return this.m_shape.rayCast(output, input, this.m_body.getTransform(), childIndex); - }; - /** - * Get the mass data for this fixture. The mass data is based on the density and - * the shape. The rotational inertia is about the shape's origin. This operation - * may be expensive. - */ - Fixture.prototype.getMassData = function (massData) { - this.m_shape.computeMass(massData, this.m_density); - }; - /** - * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a - * more accurate AABB, compute it using the shape and the body transform. - */ - Fixture.prototype.getAABB = function (childIndex) { - return this.m_proxies[childIndex].aabb; - }; - /** - * These support body activation/deactivation. - */ - Fixture.prototype.createProxies = function (broadPhase, xf) { - // Create proxies in the broad-phase. - this.m_proxyCount = this.m_shape.getChildCount(); - for (var i = 0; i < this.m_proxyCount; ++i) { - var proxy = this.m_proxies[i]; - this.m_shape.computeAABB(proxy.aabb, xf, i); - proxy.proxyId = broadPhase.createProxy(proxy.aabb, proxy); - } - }; - Fixture.prototype.destroyProxies = function (broadPhase) { - // Destroy proxies in the broad-phase. - for (var i = 0; i < this.m_proxyCount; ++i) { - var proxy = this.m_proxies[i]; - broadPhase.destroyProxy(proxy.proxyId); - proxy.proxyId = null; - } - this.m_proxyCount = 0; - }; - /** - * Updates this fixture proxy in broad-phase (with combined AABB of current and - * next transformation). - */ - Fixture.prototype.synchronize = function (broadPhase, xf1, xf2) { - for (var i = 0; i < this.m_proxyCount; ++i) { - var proxy = this.m_proxies[i]; - // Compute an AABB that covers the swept shape (may miss some rotation - // effect). - var aabb1 = new AABB(); - var aabb2 = new AABB(); - this.m_shape.computeAABB(aabb1, xf1, proxy.childIndex); - this.m_shape.computeAABB(aabb2, xf2, proxy.childIndex); - proxy.aabb.combine(aabb1, aabb2); - var displacement = Vec2.sub(xf2.p, xf1.p); - broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement); - } - }; - /** - * Set the contact filtering data. This will not update contacts until the next - * time step when either parent body is active and awake. This automatically - * calls refilter. - */ - Fixture.prototype.setFilterData = function (filter) { - this.m_filterGroupIndex = filter.groupIndex; - this.m_filterCategoryBits = filter.categoryBits; - this.m_filterMaskBits = filter.maskBits; - this.refilter(); - }; - Fixture.prototype.getFilterGroupIndex = function () { - return this.m_filterGroupIndex; - }; - Fixture.prototype.setFilterGroupIndex = function (groupIndex) { - this.m_filterGroupIndex = groupIndex; - }; - Fixture.prototype.getFilterCategoryBits = function () { - return this.m_filterCategoryBits; - }; - Fixture.prototype.setFilterCategoryBits = function (categoryBits) { - this.m_filterCategoryBits = categoryBits; - }; - Fixture.prototype.getFilterMaskBits = function () { - return this.m_filterMaskBits; - }; - Fixture.prototype.setFilterMaskBits = function (maskBits) { - this.m_filterMaskBits = maskBits; - }; - /** - * Call this if you want to establish collision that was previously disabled by - * ContactFilter. - */ - Fixture.prototype.refilter = function () { - if (this.m_body == null) { - return; - } - // Flag associated contacts for filtering. - var edge = this.m_body.getContactList(); - while (edge) { - var contact = edge.contact; - var fixtureA = contact.getFixtureA(); - var fixtureB = contact.getFixtureB(); - if (fixtureA == this || fixtureB == this) { - contact.flagForFiltering(); - } - edge = edge.next; - } - var world = this.m_body.getWorld(); - if (world == null) { - return; - } - // Touch each proxy so that new pairs may be created - var broadPhase = world.m_broadPhase; - for (var i = 0; i < this.m_proxyCount; ++i) { - broadPhase.touchProxy(this.m_proxies[i].proxyId); - } - }; - /** - * Implement this method to provide collision filtering, if you want finer - * control over contact creation. - * - * Return true if contact calculations should be performed between these two - * fixtures. - * - * Warning: for performance reasons this is only called when the AABBs begin to - * overlap. - */ - Fixture.prototype.shouldCollide = function (that) { - if (that.m_filterGroupIndex === this.m_filterGroupIndex && that.m_filterGroupIndex !== 0) { - return that.m_filterGroupIndex > 0; - } - var collideA = (that.m_filterMaskBits & this.m_filterCategoryBits) !== 0; - var collideB = (that.m_filterCategoryBits & this.m_filterMaskBits) !== 0; - var collide = collideA && collideB; - return collide; - }; - return Fixture; - }()); +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Velocity = /** @class */ (function () { + function Velocity() { + this.v = Vec2.zero(); + this.w = 0; + } + return Velocity; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var STATIC = 'static'; - var KINEMATIC = 'kinematic'; - var DYNAMIC = 'dynamic'; - var BodyDefDefault = { - type: STATIC, - position: Vec2.zero(), - angle: 0.0, - linearVelocity: Vec2.zero(), - angularVelocity: 0.0, - linearDamping: 0.0, - angularDamping: 0.0, - fixedRotation: false, - bullet: false, - gravityScale: 1.0, - allowSleep: true, - awake: true, - active: true, - userData: null - }; - /** - * MassData This holds the mass data computed for a shape. - */ - var MassData = /** @class */ (function () { - function MassData() { - /** The mass of the shape, usually in kilograms. */ - this.mass = 0; - /** The position of the shape's centroid relative to the shape's origin. */ - this.center = Vec2.zero(); - /** The rotational inertia of the shape about the local origin. */ - this.I = 0; - } - return MassData; - }()); - /** - * A rigid body composed of one or more fixtures. - * - * To create a new Body use {@link World.createBody}. +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Position = /** @class */ (function () { + function Position() { + this.c = Vec2.zero(); + this.a = 0; + } + Position.prototype.getTransform = function (xf, p) { + xf.q.setAngle(this.a); + xf.p.setVec2(Vec2.sub(this.c, Rot.mulVec2(xf.q, p))); + return xf; + }; + return Position; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +// todo make shape an interface +/** + * A shape is used for collision detection. You can create a shape however you + * like. Shapes used for simulation in World are created automatically when a + * Fixture is created. Shapes may encapsulate one or more child shapes. + */ +var Shape = /** @class */ (function () { + function Shape() { + } + Shape.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return typeof obj.m_type === 'string' && typeof obj.m_radius === 'number'; + }; + return Shape; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var FixtureDefDefault = { + userData: null, + friction: 0.2, + restitution: 0.0, + density: 0.0, + isSensor: false, + filterGroupIndex: 0, + filterCategoryBits: 0x0001, + filterMaskBits: 0xFFFF +}; +/** + * This proxy is used internally to connect shape children to the broad-phase. + */ +var FixtureProxy = /** @class */ (function () { + function FixtureProxy(fixture, childIndex) { + this.aabb = new AABB(); + this.fixture = fixture; + this.childIndex = childIndex; + this.proxyId; + } + return FixtureProxy; +}()); +/** + * A fixture is used to attach a shape to a body for collision detection. A + * fixture inherits its transform from its parent. Fixtures hold additional + * non-geometric data such as friction, collision filters, etc. + * + * To create a new Fixture use {@link Body.createFixture}. + */ +var Fixture = /** @class */ (function () { + // tslint:disable-next-line:typedef + /** @internal */ function Fixture(body, shape, def) { + if (shape.shape) { + def = shape; + shape = shape.shape; + } + else if (typeof def === 'number') { + def = { density: def }; + } + def = options(def, FixtureDefDefault); + this.m_body = body; + this.m_friction = def.friction; + this.m_restitution = def.restitution; + this.m_density = def.density; + this.m_isSensor = def.isSensor; + this.m_filterGroupIndex = def.filterGroupIndex; + this.m_filterCategoryBits = def.filterCategoryBits; + this.m_filterMaskBits = def.filterMaskBits; + // TODO validate shape + this.m_shape = shape; // .clone(); + this.m_next = null; + this.m_proxies = []; + this.m_proxyCount = 0; + var childCount = this.m_shape.getChildCount(); + for (var i = 0; i < childCount; ++i) { + this.m_proxies[i] = new FixtureProxy(this, i); + } + this.m_userData = def.userData; + } + /** + * Re-setup fixture. + * @internal */ - var Body = /** @class */ (function () { - /** @internal */ - function Body(world, def) { - def = options(def, BodyDefDefault); - this.m_world = world; - this.m_awakeFlag = def.awake; - this.m_autoSleepFlag = def.allowSleep; - this.m_bulletFlag = def.bullet; - this.m_fixedRotationFlag = def.fixedRotation; - this.m_activeFlag = def.active; - this.m_islandFlag = false; - this.m_toiFlag = false; - this.m_userData = def.userData; - this.m_type = def.type; - if (this.m_type == DYNAMIC) { - this.m_mass = 1.0; - this.m_invMass = 1.0; - } - else { - this.m_mass = 0.0; - this.m_invMass = 0.0; - } - // Rotational inertia about the center of mass. - this.m_I = 0.0; - this.m_invI = 0.0; - // the body origin transform - this.m_xf = Transform.identity(); - this.m_xf.p = Vec2.clone(def.position); - this.m_xf.q.setAngle(def.angle); - // the swept motion for CCD - this.m_sweep = new Sweep(); - this.m_sweep.setTransform(this.m_xf); - // position and velocity correction - this.c_velocity = new Velocity(); - this.c_position = new Position(); - this.m_force = Vec2.zero(); - this.m_torque = 0.0; - this.m_linearVelocity = Vec2.clone(def.linearVelocity); - this.m_angularVelocity = def.angularVelocity; - this.m_linearDamping = def.linearDamping; - this.m_angularDamping = def.angularDamping; - this.m_gravityScale = def.gravityScale; - this.m_sleepTime = 0.0; - this.m_jointList = null; - this.m_contactList = null; - this.m_fixtureList = null; - this.m_prev = null; - this.m_next = null; - this.m_destroyed = false; + Fixture.prototype._reset = function () { + var body = this.getBody(); + var broadPhase = body.m_world.m_broadPhase; + this.destroyProxies(broadPhase); + if (this.m_shape._reset) { + this.m_shape._reset(); } - /** @internal */ - Body.prototype._serialize = function () { - var fixtures = []; - for (var f = this.m_fixtureList; f; f = f.m_next) { - fixtures.push(f); - } - return { - type: this.m_type, - bullet: this.m_bulletFlag, - position: this.m_xf.p, - angle: this.m_xf.q.getAngle(), - linearVelocity: this.m_linearVelocity, - angularVelocity: this.m_angularVelocity, - fixtures: fixtures, - }; - }; - /** @internal */ - Body._deserialize = function (data, world, restore) { - var body = new Body(world, data); - if (data.fixtures) { - for (var i = data.fixtures.length - 1; i >= 0; i--) { - var fixture = restore(Fixture, data.fixtures[i], body); - body._addFixture(fixture); - } - } - return body; - }; - Body.prototype.isWorldLocked = function () { - return this.m_world && this.m_world.isLocked() ? true : false; - }; - Body.prototype.getWorld = function () { - return this.m_world; - }; - Body.prototype.getNext = function () { - return this.m_next; - }; - Body.prototype.setUserData = function (data) { - this.m_userData = data; - }; - Body.prototype.getUserData = function () { - return this.m_userData; - }; - Body.prototype.getFixtureList = function () { - return this.m_fixtureList; - }; - Body.prototype.getJointList = function () { - return this.m_jointList; - }; - /** - * Warning: this list changes during the time step and you may miss some - * collisions if you don't use ContactListener. - */ - Body.prototype.getContactList = function () { - return this.m_contactList; - }; - Body.prototype.isStatic = function () { - return this.m_type == STATIC; - }; - Body.prototype.isDynamic = function () { - return this.m_type == DYNAMIC; - }; - Body.prototype.isKinematic = function () { - return this.m_type == KINEMATIC; - }; - /** - * This will alter the mass and velocity. - */ - Body.prototype.setStatic = function () { - this.setType(STATIC); - return this; - }; - Body.prototype.setDynamic = function () { - this.setType(DYNAMIC); - return this; - }; - Body.prototype.setKinematic = function () { - this.setType(KINEMATIC); - return this; - }; - /** - * @internal - */ - Body.prototype.getType = function () { - return this.m_type; + var childCount = this.m_shape.getChildCount(); + for (var i = 0; i < childCount; ++i) { + this.m_proxies[i] = new FixtureProxy(this, i); + } + this.createProxies(broadPhase, body.m_xf); + body.resetMassData(); + }; + /** @internal */ + Fixture.prototype._serialize = function () { + return { + friction: this.m_friction, + restitution: this.m_restitution, + density: this.m_density, + isSensor: this.m_isSensor, + filterGroupIndex: this.m_filterGroupIndex, + filterCategoryBits: this.m_filterCategoryBits, + filterMaskBits: this.m_filterMaskBits, + shape: this.m_shape, }; - /** - * @internal - */ - Body.prototype.setType = function (type) { - if (this.isWorldLocked() == true) { - return; - } - if (this.m_type == type) { - return; - } - this.m_type = type; - this.resetMassData(); - if (this.m_type == STATIC) { - this.m_linearVelocity.setZero(); - this.m_angularVelocity = 0.0; - this.m_sweep.forward(); - this.synchronizeFixtures(); - } - this.setAwake(true); - this.m_force.setZero(); - this.m_torque = 0.0; - // Delete the attached contacts. - var ce = this.m_contactList; - while (ce) { - var ce0 = ce; - ce = ce.next; - this.m_world.destroyContact(ce0.contact); - } - this.m_contactList = null; - // Touch the proxies so that new contacts will be created (when appropriate) - var broadPhase = this.m_world.m_broadPhase; - for (var f = this.m_fixtureList; f; f = f.m_next) { - var proxyCount = f.m_proxyCount; - for (var i = 0; i < proxyCount; ++i) { - broadPhase.touchProxy(f.m_proxies[i].proxyId); - } - } - }; - Body.prototype.isBullet = function () { - return this.m_bulletFlag; - }; - /** - * Should this body be treated like a bullet for continuous collision detection? - */ - Body.prototype.setBullet = function (flag) { - this.m_bulletFlag = !!flag; - }; - Body.prototype.isSleepingAllowed = function () { - return this.m_autoSleepFlag; - }; - Body.prototype.setSleepingAllowed = function (flag) { - this.m_autoSleepFlag = !!flag; - if (this.m_autoSleepFlag == false) { - this.setAwake(true); - } - }; - Body.prototype.isAwake = function () { - return this.m_awakeFlag; - }; - /** - * Set the sleep state of the body. A sleeping body has very low CPU cost. - * - * @param flag Set to true to wake the body, false to put it to sleep. - */ - Body.prototype.setAwake = function (flag) { - if (flag) { - if (this.m_awakeFlag == false) { - this.m_awakeFlag = true; - this.m_sleepTime = 0.0; - } - } - else { - this.m_awakeFlag = false; - this.m_sleepTime = 0.0; - this.m_linearVelocity.setZero(); - this.m_angularVelocity = 0.0; - this.m_force.setZero(); - this.m_torque = 0.0; - } - }; - Body.prototype.isActive = function () { - return this.m_activeFlag; - }; - /** - * Set the active state of the body. An inactive body is not simulated and - * cannot be collided with or woken up. If you pass a flag of true, all fixtures - * will be added to the broad-phase. If you pass a flag of false, all fixtures - * will be removed from the broad-phase and all contacts will be destroyed. - * Fixtures and joints are otherwise unaffected. - * - * You may continue to create/destroy fixtures and joints on inactive bodies. - * Fixtures on an inactive body are implicitly inactive and will not participate - * in collisions, ray-casts, or queries. Joints connected to an inactive body - * are implicitly inactive. An inactive body is still owned by a World object - * and remains - */ - Body.prototype.setActive = function (flag) { - if (flag == this.m_activeFlag) { - return; - } - this.m_activeFlag = !!flag; - if (this.m_activeFlag) { - // Create all proxies. - var broadPhase = this.m_world.m_broadPhase; - for (var f = this.m_fixtureList; f; f = f.m_next) { - f.createProxies(broadPhase, this.m_xf); - } - // Contacts are created the next time step. - } - else { - // Destroy all proxies. - var broadPhase = this.m_world.m_broadPhase; - for (var f = this.m_fixtureList; f; f = f.m_next) { - f.destroyProxies(broadPhase); - } - // Destroy the attached contacts. - var ce = this.m_contactList; - while (ce) { - var ce0 = ce; - ce = ce.next; - this.m_world.destroyContact(ce0.contact); - } - this.m_contactList = null; - } - }; - Body.prototype.isFixedRotation = function () { - return this.m_fixedRotationFlag; - }; - /** - * Set this body to have fixed rotation. This causes the mass to be reset. - */ - Body.prototype.setFixedRotation = function (flag) { - if (this.m_fixedRotationFlag == flag) { - return; - } - this.m_fixedRotationFlag = !!flag; - this.m_angularVelocity = 0.0; - this.resetMassData(); - }; - /** - * Get the world transform for the body's origin. - */ - Body.prototype.getTransform = function () { - return this.m_xf; - }; - /** - * Set the position of the body's origin and rotation. Manipulating a body's - * transform may cause non-physical behavior. Note: contacts are updated on the - * next call to World.step. - * - * @param position The world position of the body's local origin. - * @param angle The world rotation in radians. - */ - Body.prototype.setTransform = function (position, angle) { - if (this.isWorldLocked() == true) { - return; - } - this.m_xf.setNum(position, angle); - this.m_sweep.setTransform(this.m_xf); - var broadPhase = this.m_world.m_broadPhase; - for (var f = this.m_fixtureList; f; f = f.m_next) { - f.synchronize(broadPhase, this.m_xf, this.m_xf); - } - }; - Body.prototype.synchronizeTransform = function () { - this.m_sweep.getTransform(this.m_xf, 1); - }; - /** - * Update fixtures in broad-phase. - */ - Body.prototype.synchronizeFixtures = function () { - var xf = Transform.identity(); - this.m_sweep.getTransform(xf, 0); - var broadPhase = this.m_world.m_broadPhase; - for (var f = this.m_fixtureList; f; f = f.m_next) { - f.synchronize(broadPhase, xf, this.m_xf); - } - }; - /** - * Used in TOI. - */ - Body.prototype.advance = function (alpha) { - // Advance to the new safe time. This doesn't sync the broad-phase. - this.m_sweep.advance(alpha); - this.m_sweep.c.setVec2(this.m_sweep.c0); - this.m_sweep.a = this.m_sweep.a0; - this.m_sweep.getTransform(this.m_xf, 1); - }; - /** - * Get the world position for the body's origin. - */ - Body.prototype.getPosition = function () { - return this.m_xf.p; - }; - Body.prototype.setPosition = function (p) { - this.setTransform(p, this.m_sweep.a); - }; - /** - * Get the current world rotation angle in radians. - */ - Body.prototype.getAngle = function () { - return this.m_sweep.a; - }; - Body.prototype.setAngle = function (angle) { - this.setTransform(this.m_xf.p, angle); - }; - /** - * Get the world position of the center of mass. - */ - Body.prototype.getWorldCenter = function () { - return this.m_sweep.c; - }; - /** - * Get the local position of the center of mass. - */ - Body.prototype.getLocalCenter = function () { - return this.m_sweep.localCenter; - }; - /** - * Get the linear velocity of the center of mass. - * - * @return the linear velocity of the center of mass. - */ - Body.prototype.getLinearVelocity = function () { - return this.m_linearVelocity; - }; - /** - * Get the world linear velocity of a world point attached to this body. - * - * @param worldPoint A point in world coordinates. - */ - Body.prototype.getLinearVelocityFromWorldPoint = function (worldPoint) { - var localCenter = Vec2.sub(worldPoint, this.m_sweep.c); - return Vec2.add(this.m_linearVelocity, Vec2.crossNumVec2(this.m_angularVelocity, localCenter)); - }; - /** - * Get the world velocity of a local point. - * - * @param localPoint A point in local coordinates. - */ - Body.prototype.getLinearVelocityFromLocalPoint = function (localPoint) { - return this.getLinearVelocityFromWorldPoint(this.getWorldPoint(localPoint)); - }; - /** - * Set the linear velocity of the center of mass. - * - * @param v The new linear velocity of the center of mass. - */ - Body.prototype.setLinearVelocity = function (v) { - if (this.m_type == STATIC) { - return; - } - if (Vec2.dot(v, v) > 0.0) { - this.setAwake(true); - } - this.m_linearVelocity.setVec2(v); - }; - /** - * Get the angular velocity. - * - * @returns the angular velocity in radians/second. - */ - Body.prototype.getAngularVelocity = function () { - return this.m_angularVelocity; - }; - /** - * Set the angular velocity. - * - * @param omega The new angular velocity in radians/second. - */ - Body.prototype.setAngularVelocity = function (w) { - if (this.m_type == STATIC) { - return; - } - if (w * w > 0.0) { - this.setAwake(true); - } - this.m_angularVelocity = w; - }; - Body.prototype.getLinearDamping = function () { - return this.m_linearDamping; - }; - Body.prototype.setLinearDamping = function (linearDamping) { - this.m_linearDamping = linearDamping; - }; - Body.prototype.getAngularDamping = function () { - return this.m_angularDamping; - }; - Body.prototype.setAngularDamping = function (angularDamping) { - this.m_angularDamping = angularDamping; - }; - Body.prototype.getGravityScale = function () { - return this.m_gravityScale; - }; - /** - * Scale the gravity applied to this body. - */ - Body.prototype.setGravityScale = function (scale) { - this.m_gravityScale = scale; - }; - /** - * Get the total mass of the body. - * - * @returns The mass, usually in kilograms (kg). - */ - Body.prototype.getMass = function () { - return this.m_mass; - }; - /** - * Get the rotational inertia of the body about the local origin. - * - * @return the rotational inertia, usually in kg-m^2. - */ - Body.prototype.getInertia = function () { - return this.m_I + this.m_mass - * Vec2.dot(this.m_sweep.localCenter, this.m_sweep.localCenter); - }; - /** - * Copy the mass data of the body to data. - */ - Body.prototype.getMassData = function (data) { - data.mass = this.m_mass; - data.I = this.getInertia(); - data.center.setVec2(this.m_sweep.localCenter); - }; - /** - * This resets the mass properties to the sum of the mass properties of the - * fixtures. This normally does not need to be called unless you called - * SetMassData to override the mass and you later want to reset the mass. - */ - Body.prototype.resetMassData = function () { - // Compute mass data from shapes. Each shape has its own density. - this.m_mass = 0.0; - this.m_invMass = 0.0; - this.m_I = 0.0; - this.m_invI = 0.0; - this.m_sweep.localCenter.setZero(); - // Static and kinematic bodies have zero mass. - if (this.isStatic() || this.isKinematic()) { - this.m_sweep.c0.setVec2(this.m_xf.p); - this.m_sweep.c.setVec2(this.m_xf.p); - this.m_sweep.a0 = this.m_sweep.a; - return; - } - // Accumulate mass over all fixtures. - var localCenter = Vec2.zero(); - for (var f = this.m_fixtureList; f; f = f.m_next) { - if (f.m_density == 0.0) { - continue; - } - var massData = new MassData(); - f.getMassData(massData); - this.m_mass += massData.mass; - localCenter.addMul(massData.mass, massData.center); - this.m_I += massData.I; - } - // Compute center of mass. - if (this.m_mass > 0.0) { - this.m_invMass = 1.0 / this.m_mass; - localCenter.mul(this.m_invMass); - } - else { - // Force all dynamic bodies to have a positive mass. - this.m_mass = 1.0; - this.m_invMass = 1.0; - } - if (this.m_I > 0.0 && this.m_fixedRotationFlag == false) { - // Center the inertia about the center of mass. - this.m_I -= this.m_mass * Vec2.dot(localCenter, localCenter); - this.m_invI = 1.0 / this.m_I; - } - else { - this.m_I = 0.0; - this.m_invI = 0.0; - } - // Move center of mass. - var oldCenter = Vec2.clone(this.m_sweep.c); - this.m_sweep.setLocalCenter(localCenter, this.m_xf); - // Update center of mass velocity. - this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(this.m_sweep.c, oldCenter))); - }; - /** - * Set the mass properties to override the mass properties of the fixtures. Note - * that this changes the center of mass position. Note that creating or - * destroying fixtures can also alter the mass. This function has no effect if - * the body isn't dynamic. - * - * @param massData The mass properties. - */ - Body.prototype.setMassData = function (massData) { - if (this.isWorldLocked() == true) { - return; - } - if (this.m_type != DYNAMIC) { - return; - } - this.m_invMass = 0.0; - this.m_I = 0.0; - this.m_invI = 0.0; - this.m_mass = massData.mass; - if (this.m_mass <= 0.0) { - this.m_mass = 1.0; - } - this.m_invMass = 1.0 / this.m_mass; - if (massData.I > 0.0 && this.m_fixedRotationFlag == false) { - this.m_I = massData.I - this.m_mass - * Vec2.dot(massData.center, massData.center); - this.m_invI = 1.0 / this.m_I; - } - // Move center of mass. - var oldCenter = Vec2.clone(this.m_sweep.c); - this.m_sweep.setLocalCenter(massData.center, this.m_xf); - // Update center of mass velocity. - this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(this.m_sweep.c, oldCenter))); - }; - /** - * Apply a force at a world point. If the force is not applied at the center of - * mass, it will generate a torque and affect the angular velocity. This wakes - * up the body. - * - * @param force The world force vector, usually in Newtons (N). - * @param point The world position of the point of application. - * @param wake Also wake up the body - */ - Body.prototype.applyForce = function (force, point, wake) { - if (wake === void 0) { wake = true; } - if (this.m_type != DYNAMIC) { - return; - } - if (wake && this.m_awakeFlag == false) { - this.setAwake(true); - } - // Don't accumulate a force if the body is sleeping. - if (this.m_awakeFlag) { - this.m_force.add(force); - this.m_torque += Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), force); - } - }; - /** - * Apply a force to the center of mass. This wakes up the body. - * - * @param force The world force vector, usually in Newtons (N). - * @param wake Also wake up the body - */ - Body.prototype.applyForceToCenter = function (force, wake) { - if (wake === void 0) { wake = true; } - if (this.m_type != DYNAMIC) { - return; - } - if (wake && this.m_awakeFlag == false) { - this.setAwake(true); - } - // Don't accumulate a force if the body is sleeping - if (this.m_awakeFlag) { - this.m_force.add(force); - } - }; - /** - * Apply a torque. This affects the angular velocity without affecting the - * linear velocity of the center of mass. This wakes up the body. - * - * @param torque About the z-axis (out of the screen), usually in N-m. - * @param wake Also wake up the body - */ - Body.prototype.applyTorque = function (torque, wake) { - if (wake === void 0) { wake = true; } - if (this.m_type != DYNAMIC) { - return; - } - if (wake && this.m_awakeFlag == false) { - this.setAwake(true); - } - // Don't accumulate a force if the body is sleeping - if (this.m_awakeFlag) { - this.m_torque += torque; - } - }; - /** - * Apply an impulse at a point. This immediately modifies the velocity. It also - * modifies the angular velocity if the point of application is not at the - * center of mass. This wakes up the body. - * - * @param impulse The world impulse vector, usually in N-seconds or kg-m/s. - * @param point The world position of the point of application. - * @param wake Also wake up the body - */ - Body.prototype.applyLinearImpulse = function (impulse, point, wake) { - if (wake === void 0) { wake = true; } - if (this.m_type != DYNAMIC) { - return; - } - if (wake && this.m_awakeFlag == false) { - this.setAwake(true); - } - // Don't accumulate velocity if the body is sleeping - if (this.m_awakeFlag) { - this.m_linearVelocity.addMul(this.m_invMass, impulse); - this.m_angularVelocity += this.m_invI * Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), impulse); - } - }; - /** - * Apply an angular impulse. - * - * @param impulse The angular impulse in units of kg*m*m/s - * @param wake Also wake up the body - */ - Body.prototype.applyAngularImpulse = function (impulse, wake) { - if (wake === void 0) { wake = true; } - if (this.m_type != DYNAMIC) { - return; - } - if (wake && this.m_awakeFlag == false) { - this.setAwake(true); - } - // Don't accumulate velocity if the body is sleeping - if (this.m_awakeFlag) { - this.m_angularVelocity += this.m_invI * impulse; - } - }; - /** - * This is used to prevent connected bodies (by joints) from colliding, - * depending on the joint's collideConnected flag. - */ - Body.prototype.shouldCollide = function (that) { - // At least one body should be dynamic. - if (this.m_type != DYNAMIC && that.m_type != DYNAMIC) { - return false; - } - // Does a joint prevent collision? - for (var jn = this.m_jointList; jn; jn = jn.next) { - if (jn.other == that) { - if (jn.joint.m_collideConnected == false) { - return false; - } - } - } - return true; - }; - /** - * @internal Used for deserialize. - */ - Body.prototype._addFixture = function (fixture) { - if (this.isWorldLocked() == true) { - return null; - } - if (this.m_activeFlag) { - var broadPhase = this.m_world.m_broadPhase; - fixture.createProxies(broadPhase, this.m_xf); - } - fixture.m_next = this.m_fixtureList; - this.m_fixtureList = fixture; - // Adjust mass properties if needed. - if (fixture.m_density > 0.0) { - this.resetMassData(); - } - // Let the world know we have a new fixture. This will cause new contacts - // to be created at the beginning of the next time step. - this.m_world.m_newFixture = true; - return fixture; - }; - // tslint:disable-next-line:typedef - Body.prototype.createFixture = function (shape, fixdef) { - if (this.isWorldLocked() == true) { - return null; - } - var fixture = new Fixture(this, shape, fixdef); - this._addFixture(fixture); - return fixture; - }; - /** - * Destroy a fixture. This removes the fixture from the broad-phase and destroys - * all contacts associated with this fixture. This will automatically adjust the - * mass of the body if the body is dynamic and the fixture has positive density. - * All fixtures attached to a body are implicitly destroyed when the body is - * destroyed. - * - * Warning: This function is locked during callbacks. - * - * @param fixture The fixture to be removed. - */ - Body.prototype.destroyFixture = function (fixture) { - if (this.isWorldLocked() == true) { - return; - } - if (this.m_fixtureList === fixture) { - this.m_fixtureList = fixture.m_next; - } - else { - var node = this.m_fixtureList; - while (node != null) { - if (node.m_next === fixture) { - node.m_next = fixture.m_next; - break; - } - node = node.m_next; - } - } - // Destroy any contacts associated with the fixture. - var edge = this.m_contactList; - while (edge) { - var c = edge.contact; - edge = edge.next; - var fixtureA = c.getFixtureA(); - var fixtureB = c.getFixtureB(); - if (fixture == fixtureA || fixture == fixtureB) { - // This destroys the contact and removes it from - // this body's contact list. - this.m_world.destroyContact(c); - } - } - if (this.m_activeFlag) { - var broadPhase = this.m_world.m_broadPhase; - fixture.destroyProxies(broadPhase); - } - fixture.m_body = null; - fixture.m_next = null; - this.m_world.publish('remove-fixture', fixture); - // Reset the mass data. - this.resetMassData(); - }; - /** - * Get the corresponding world point of a local point. - */ - Body.prototype.getWorldPoint = function (localPoint) { - return Transform.mulVec2(this.m_xf, localPoint); - }; - /** - * Get the corresponding world vector of a local vector. - */ - Body.prototype.getWorldVector = function (localVector) { - return Rot.mulVec2(this.m_xf.q, localVector); - }; - /** - * Gets the corresponding local point of a world point. - */ - Body.prototype.getLocalPoint = function (worldPoint) { - return Transform.mulTVec2(this.m_xf, worldPoint); - }; - /** - * Gets the corresponding local vector of a world vector. - */ - Body.prototype.getLocalVector = function (worldVector) { - return Rot.mulTVec2(this.m_xf.q, worldVector); - }; - /** - * A static body does not move under simulation and behaves as if it has infinite mass. - * Internally, zero is stored for the mass and the inverse mass. - * Static bodies can be moved manually by the user. - * A static body has zero velocity. - * Static bodies do not collide with other static or kinematic bodies. - */ - Body.STATIC = 'static'; - /** - * A kinematic body moves under simulation according to its velocity. - * Kinematic bodies do not respond to forces. - * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity. - * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass. - * Kinematic bodies do not collide with other kinematic or static bodies. - */ - Body.KINEMATIC = 'kinematic'; - /** - * A dynamic body is fully simulated. - * They can be moved manually by the user, but normally they move according to forces. - * A dynamic body can collide with all body types. - * A dynamic body always has finite, non-zero mass. - * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate. - */ - Body.DYNAMIC = 'dynamic'; - return Body; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * A 2-by-2 matrix. Stored in column-major order. - */ - var Mat22 = /** @class */ (function () { - // tslint:disable-next-line:typedef - function Mat22(a, b, c, d) { - if (typeof a === 'object' && a !== null) { - this.ex = Vec2.clone(a); - this.ey = Vec2.clone(b); - } - else if (typeof a === 'number') { - this.ex = Vec2.neo(a, c); - this.ey = Vec2.neo(b, d); - } - else { - this.ex = Vec2.zero(); - this.ey = Vec2.zero(); - } - } - /** @internal */ - Mat22.prototype.toString = function () { - return JSON.stringify(this); - }; - Mat22.isValid = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - return Vec2.isValid(obj.ex) && Vec2.isValid(obj.ey); - }; - Mat22.assert = function (o) { - return; - }; - // tslint:disable-next-line:typedef - Mat22.prototype.set = function (a, b, c, d) { - if (typeof a === 'number' && typeof b === 'number' && typeof c === 'number' - && typeof d === 'number') { - this.ex.setNum(a, c); - this.ey.setNum(b, d); - } - else if (typeof a === 'object' && typeof b === 'object') { - this.ex.setVec2(a); - this.ey.setVec2(b); - } - else if (typeof a === 'object') { - this.ex.setVec2(a.ex); - this.ey.setVec2(a.ey); - } - else ; - }; - Mat22.prototype.setIdentity = function () { - this.ex.x = 1.0; - this.ey.x = 0.0; - this.ex.y = 0.0; - this.ey.y = 1.0; - }; - Mat22.prototype.setZero = function () { - this.ex.x = 0.0; - this.ey.x = 0.0; - this.ex.y = 0.0; - this.ey.y = 0.0; - }; - Mat22.prototype.getInverse = function () { - var a = this.ex.x; - var b = this.ey.x; - var c = this.ex.y; - var d = this.ey.y; - var det = a * d - b * c; - if (det !== 0.0) { - det = 1.0 / det; - } - var imx = new Mat22(); - imx.ex.x = det * d; - imx.ey.x = -det * b; - imx.ex.y = -det * c; - imx.ey.y = det * a; - return imx; - }; - /** - * Solve A * x = b, where b is a column vector. This is more efficient than - * computing the inverse in one-shot cases. - */ - Mat22.prototype.solve = function (v) { - var a = this.ex.x; - var b = this.ey.x; - var c = this.ex.y; - var d = this.ey.y; - var det = a * d - b * c; - if (det !== 0.0) { - det = 1.0 / det; - } - var w = Vec2.zero(); - w.x = det * (d * v.x - b * v.y); - w.y = det * (a * v.y - c * v.x); - return w; - }; - // tslint:disable-next-line:typedef - Mat22.mul = function (mx, v) { - if (v && 'x' in v && 'y' in v) { - var x = mx.ex.x * v.x + mx.ey.x * v.y; - var y = mx.ex.y * v.x + mx.ey.y * v.y; - return Vec2.neo(x, y); - } - else if (v && 'ex' in v && 'ey' in v) { // Mat22 - // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey)); - var a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y; - var b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y; - var c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y; - var d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y; - return new Mat22(a, b, c, d); - } - }; - Mat22.mulVec2 = function (mx, v) { - var x = mx.ex.x * v.x + mx.ey.x * v.y; - var y = mx.ex.y * v.x + mx.ey.y * v.y; - return Vec2.neo(x, y); - }; - Mat22.mulMat22 = function (mx, v) { - // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey)); - var a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y; - var b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y; - var c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y; - var d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y; - return new Mat22(a, b, c, d); - }; - // tslint:disable-next-line:typedef - Mat22.mulT = function (mx, v) { - if (v && 'x' in v && 'y' in v) { // Vec2 - return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey)); - } - else if (v && 'ex' in v && 'ey' in v) { // Mat22 - var c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex)); - var c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey)); - return new Mat22(c1, c2); - } - }; - Mat22.mulTVec2 = function (mx, v) { - return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey)); - }; - Mat22.mulTMat22 = function (mx, v) { - var c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex)); - var c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey)); - return new Mat22(c1, c2); - }; - Mat22.abs = function (mx) { - return new Mat22(Vec2.abs(mx.ex), Vec2.abs(mx.ey)); - }; - Mat22.add = function (mx1, mx2) { - return new Mat22(Vec2.add(mx1.ex, mx2.ex), Vec2.add(mx1.ey, mx2.ey)); - }; - return Mat22; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var ManifoldType; - (function (ManifoldType) { - ManifoldType[ManifoldType["e_circles"] = 0] = "e_circles"; - ManifoldType[ManifoldType["e_faceA"] = 1] = "e_faceA"; - ManifoldType[ManifoldType["e_faceB"] = 2] = "e_faceB"; - })(ManifoldType || (ManifoldType = {})); - var ContactFeatureType; - (function (ContactFeatureType) { - ContactFeatureType[ContactFeatureType["e_vertex"] = 0] = "e_vertex"; - ContactFeatureType[ContactFeatureType["e_face"] = 1] = "e_face"; - })(ContactFeatureType || (ContactFeatureType = {})); - /** - * This is used for determining the state of contact points. - */ - var PointState; - (function (PointState) { - /** Point does not exist */ - PointState[PointState["nullState"] = 0] = "nullState"; - /** Point was added in the update */ - PointState[PointState["addState"] = 1] = "addState"; - /** Point persisted across the update */ - PointState[PointState["persistState"] = 2] = "persistState"; - /** Point was removed in the update */ - PointState[PointState["removeState"] = 3] = "removeState"; - })(PointState || (PointState = {})); - /** - * Used for computing contact manifolds. - */ - var ClipVertex = /** @class */ (function () { - function ClipVertex() { - this.v = Vec2.zero(); - this.id = new ContactID(); - } - ClipVertex.prototype.set = function (o) { - this.v.setVec2(o.v); - this.id.set(o.id); - }; - return ClipVertex; - }()); - /** - * A manifold for two touching convex shapes. Manifolds are created in `evaluate` - * method of Contact subclasses. - * - * Supported manifold types are e_faceA or e_faceB for clip point versus plane - * with radius and e_circles point versus point with radius. - * - * We store contacts in this way so that position correction can account for - * movement, which is critical for continuous physics. All contact scenarios - * must be expressed in one of these types. This structure is stored across time - * steps, so we keep it small. - * - * @prop type e_circle, e_faceA, e_faceB - * @prop localPoint Usage depends on manifold type:
- * e_circles: the local center of circleA
- * e_faceA: the center of faceA
- * e_faceB: the center of faceB - * @prop localNormal Usage depends on manifold type:
- * e_circles: not used
- * e_faceA: the normal on polygonA
- * e_faceB: the normal on polygonB - * @prop points The points of contact {ManifoldPoint[]} - * @prop pointCount The number of manifold points - */ - var Manifold = /** @class */ (function () { - function Manifold() { - this.localNormal = Vec2.zero(); - this.localPoint = Vec2.zero(); - this.points = [new ManifoldPoint(), new ManifoldPoint()]; - this.pointCount = 0; - } - /** - * Evaluate the manifold with supplied transforms. This assumes modest motion - * from the original state. This does not change the point count, impulses, etc. - * The radii must come from the shapes that generated the manifold. - */ - Manifold.prototype.getWorldManifold = function (wm, xfA, radiusA, xfB, radiusB) { - if (this.pointCount == 0) { - return; - } - wm = wm || new WorldManifold(); - var normal = wm.normal; - var points = wm.points; - var separations = wm.separations; - // TODO: improve - switch (this.type) { - case ManifoldType.e_circles: { - normal = Vec2.neo(1.0, 0.0); - var pointA = Transform.mulVec2(xfA, this.localPoint); - var pointB = Transform.mulVec2(xfB, this.points[0].localPoint); - var dist = Vec2.sub(pointB, pointA); - if (Vec2.lengthSquared(dist) > math$1.EPSILON * math$1.EPSILON) { - normal.setVec2(dist); - normal.normalize(); - } - var cA = pointA.clone().addMul(radiusA, normal); - var cB = pointB.clone().addMul(-radiusB, normal); - points[0] = Vec2.mid(cA, cB); - separations[0] = Vec2.dot(Vec2.sub(cB, cA), normal); - points.length = 1; - separations.length = 1; - break; - } - case ManifoldType.e_faceA: { - normal = Rot.mulVec2(xfA.q, this.localNormal); - var planePoint = Transform.mulVec2(xfA, this.localPoint); - for (var i = 0; i < this.pointCount; ++i) { - var clipPoint = Transform.mulVec2(xfB, this.points[i].localPoint); - var cA = Vec2.clone(clipPoint).addMul(radiusA - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal); - var cB = Vec2.clone(clipPoint).subMul(radiusB, normal); - points[i] = Vec2.mid(cA, cB); - separations[i] = Vec2.dot(Vec2.sub(cB, cA), normal); - } - points.length = this.pointCount; - separations.length = this.pointCount; - break; - } - case ManifoldType.e_faceB: { - normal = Rot.mulVec2(xfB.q, this.localNormal); - var planePoint = Transform.mulVec2(xfB, this.localPoint); - for (var i = 0; i < this.pointCount; ++i) { - var clipPoint = Transform.mulVec2(xfA, this.points[i].localPoint); - var cB = Vec2.combine(1, clipPoint, radiusB - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal); - var cA = Vec2.combine(1, clipPoint, -radiusA, normal); - points[i] = Vec2.mid(cA, cB); - separations[i] = Vec2.dot(Vec2.sub(cA, cB), normal); - } - points.length = this.pointCount; - separations.length = this.pointCount; - // Ensure normal points from A to B. - normal.mul(-1); - break; - } - } - wm.normal = normal; - wm.points = points; - wm.separations = separations; - return wm; - }; - Manifold.clipSegmentToLine = clipSegmentToLine; - Manifold.ClipVertex = ClipVertex; - Manifold.getPointStates = getPointStates; - Manifold.PointState = PointState; - return Manifold; - }()); - /** - * A manifold point is a contact point belonging to a contact manifold. It holds - * details related to the geometry and dynamics of the contact points. - * - * This structure is stored across time steps, so we keep it small. - * - * Note: impulses are used for internal caching and may not provide reliable - * contact forces, especially for high speed collisions. - */ - var ManifoldPoint = /** @class */ (function () { - function ManifoldPoint() { - /** - * Usage depends on manifold type. - * e_circles: the local center of circleB, - * e_faceA: the local center of cirlceB or the clip point of polygonB, - * e_faceB: the clip point of polygonA. - */ - this.localPoint = Vec2.zero(); - /** - * The non-penetration impulse - */ - this.normalImpulse = 0; - /** - * The friction impulse - */ - this.tangentImpulse = 0; - /** - * Uniquely identifies a contact point between two shapes to facilatate warm starting - */ - this.id = new ContactID(); - } - return ManifoldPoint; - }()); - /** - * Contact ids to facilitate warm starting. - */ - var ContactID = /** @class */ (function () { - function ContactID() { - this.cf = new ContactFeature(); - } - Object.defineProperty(ContactID.prototype, "key", { - /** - * Used to quickly compare contact ids. - */ - get: function () { - return this.cf.indexA + this.cf.indexB * 4 + this.cf.typeA * 16 + this.cf.typeB * 64; - }, - enumerable: false, - configurable: true - }); - ContactID.prototype.set = function (o) { - // this.key = o.key; - this.cf.set(o.cf); - }; - return ContactID; - }()); - /** - * The features that intersect to form the contact point. - */ - var ContactFeature = /** @class */ (function () { - function ContactFeature() { - } - ContactFeature.prototype.set = function (o) { - this.indexA = o.indexA; - this.indexB = o.indexB; - this.typeA = o.typeA; - this.typeB = o.typeB; - }; - return ContactFeature; - }()); - /** - * This is used to compute the current state of a contact manifold. - */ - var WorldManifold = /** @class */ (function () { - function WorldManifold() { - /** - * World contact point (point of intersection) - */ - this.points = []; // [maxManifoldPoints] - /** - * A negative value indicates overlap, in meters - */ - this.separations = []; // [maxManifoldPoints] - } - return WorldManifold; - }()); - /** - * Compute the point states given two manifolds. The states pertain to the - * transition from manifold1 to manifold2. So state1 is either persist or remove - * while state2 is either add or persist. - */ - function getPointStates(state1, state2, manifold1, manifold2) { - // state1, state2: PointState[Settings.maxManifoldPoints] - // for (var i = 0; i < Settings.maxManifoldPoints; ++i) { - // state1[i] = PointState.nullState; - // state2[i] = PointState.nullState; - // } - // Detect persists and removes. - for (var i = 0; i < manifold1.pointCount; ++i) { - var id = manifold1.points[i].id; - state1[i] = PointState.removeState; - for (var j = 0; j < manifold2.pointCount; ++j) { - if (manifold2.points[j].id.key == id.key) { - state1[i] = PointState.persistState; - break; - } - } - } - // Detect persists and adds. - for (var i = 0; i < manifold2.pointCount; ++i) { - var id = manifold2.points[i].id; - state2[i] = PointState.addState; - for (var j = 0; j < manifold1.pointCount; ++j) { - if (manifold1.points[j].id.key == id.key) { - state2[i] = PointState.persistState; - break; - } - } - } - } - /** - * Clipping for contact manifolds. Sutherland-Hodgman clipping. - */ - function clipSegmentToLine(vOut, vIn, normal, offset, vertexIndexA) { - // Start with no output points - var numOut = 0; - // Calculate the distance of end points to the line - var distance0 = Vec2.dot(normal, vIn[0].v) - offset; - var distance1 = Vec2.dot(normal, vIn[1].v) - offset; - // If the points are behind the plane - if (distance0 <= 0.0) - vOut[numOut++].set(vIn[0]); - if (distance1 <= 0.0) - vOut[numOut++].set(vIn[1]); - // If the points are on different sides of the plane - if (distance0 * distance1 < 0.0) { - // Find intersection point of edge and plane - var interp = distance0 / (distance0 - distance1); - vOut[numOut].v.setCombine(1 - interp, vIn[0].v, interp, vIn[1].v); - // VertexA is hitting edgeB. - vOut[numOut].id.cf.indexA = vertexIndexA; - vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB; - vOut[numOut].id.cf.typeA = ContactFeatureType.e_vertex; - vOut[numOut].id.cf.typeB = ContactFeatureType.e_face; - ++numOut; - } - return numOut; - } - - var stats$1 = { - gjkCalls: 0, - gjkIters: 0, - gjkMaxIters: 0, - toiTime: 0, - toiMaxTime: 0, - toiCalls: 0, - toiIters: 0, - toiMaxIters: 0, - toiRootIters: 0, - toiMaxRootIters: 0, - toString: function (newline) { - newline = typeof newline === 'string' ? newline : '\n'; - var string = ""; - // tslint:disable-next-line:no-for-in - for (var name_1 in this) { - if (typeof this[name_1] !== 'function' && typeof this[name_1] !== 'object') { - string += name_1 + ': ' + this[name_1] + newline; - } - } - return string; - } - }; - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates. - */ - stats$1.gjkCalls = 0; - stats$1.gjkIters = 0; - stats$1.gjkMaxIters = 0; - /** - * Input for Distance. You have to option to use the shape radii in the - * computation. Even - */ - var DistanceInput = /** @class */ (function () { - function DistanceInput() { - this.proxyA = new DistanceProxy(); - this.proxyB = new DistanceProxy(); - this.transformA = null; - this.transformB = null; - this.useRadii = false; - } - return DistanceInput; - }()); - /** - * Output for Distance. - * - * @prop {Vec2} pointA closest point on shapeA - * @prop {Vec2} pointB closest point on shapeB - * @prop distance - * @prop iterations number of GJK iterations used - */ - var DistanceOutput = /** @class */ (function () { - function DistanceOutput() { - this.pointA = Vec2.zero(); - this.pointB = Vec2.zero(); - } - return DistanceOutput; - }()); - /** - * Used to warm start Distance. Set count to zero on first call. - * - * @prop {number} metric length or area - * @prop {array} indexA vertices on shape A - * @prop {array} indexB vertices on shape B - * @prop {number} count - */ - var SimplexCache = /** @class */ (function () { - function SimplexCache() { - this.metric = 0; - this.indexA = []; - this.indexB = []; - this.count = 0; - } - return SimplexCache; - }()); - /** - * Compute the closest points between two shapes. Supports any combination of: - * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On - * the first call set SimplexCache.count to zero. - */ - function Distance(output, cache, input) { - ++stats$1.gjkCalls; - var proxyA = input.proxyA; - var proxyB = input.proxyB; - var xfA = input.transformA; - var xfB = input.transformB; - // Initialize the simplex. - var simplex = new Simplex(); - simplex.readCache(cache, proxyA, xfA, proxyB, xfB); - // Get simplex vertices as an array. - var vertices = simplex.m_v; - var k_maxIters = Settings.maxDistnceIterations; - // These store the vertices of the last simplex so that we - // can check for duplicates and prevent cycling. - var saveA = []; - var saveB = []; // int[3] - var saveCount = 0; - // Main iteration loop. - var iter = 0; - while (iter < k_maxIters) { - // Copy simplex so we can identify duplicates. - saveCount = simplex.m_count; - for (var i = 0; i < saveCount; ++i) { - saveA[i] = vertices[i].indexA; - saveB[i] = vertices[i].indexB; - } - simplex.solve(); - // If we have 3 points, then the origin is in the corresponding triangle. - if (simplex.m_count === 3) { - break; - } - // Compute closest point. - var p = simplex.getClosestPoint(); - p.lengthSquared(); - // Get search direction. - var d = simplex.getSearchDirection(); - // Ensure the search direction is numerically fit. - if (d.lengthSquared() < math$1.EPSILON * math$1.EPSILON) { - // The origin is probably contained by a line segment - // or triangle. Thus the shapes are overlapped. - // We can't return zero here even though there may be overlap. - // In case the simplex is a point, segment, or triangle it is difficult - // to determine if the origin is contained in the CSO or very close to it. - break; - } - // Compute a tentative new simplex vertex using support points. - var vertex = vertices[simplex.m_count]; // SimplexVertex - vertex.indexA = proxyA.getSupport(Rot.mulTVec2(xfA.q, Vec2.neg(d))); - vertex.wA = Transform.mulVec2(xfA, proxyA.getVertex(vertex.indexA)); - vertex.indexB = proxyB.getSupport(Rot.mulTVec2(xfB.q, d)); - vertex.wB = Transform.mulVec2(xfB, proxyB.getVertex(vertex.indexB)); - vertex.w = Vec2.sub(vertex.wB, vertex.wA); - // Iteration count is equated to the number of support point calls. - ++iter; - ++stats$1.gjkIters; - // Check for duplicate support points. This is the main termination - // criteria. - var duplicate = false; - for (var i = 0; i < saveCount; ++i) { - if (vertex.indexA === saveA[i] && vertex.indexB === saveB[i]) { - duplicate = true; - break; - } - } - // If we found a duplicate support point we must exit to avoid cycling. - if (duplicate) { - break; - } - // New vertex is ok and needed. - ++simplex.m_count; - } - stats$1.gjkMaxIters = math$1.max(stats$1.gjkMaxIters, iter); - // Prepare output. - simplex.getWitnessPoints(output.pointA, output.pointB); - output.distance = Vec2.distance(output.pointA, output.pointB); - output.iterations = iter; - // Cache the simplex. - simplex.writeCache(cache); - // Apply radii if requested. - if (input.useRadii) { - var rA = proxyA.m_radius; - var rB = proxyB.m_radius; - if (output.distance > rA + rB && output.distance > math$1.EPSILON) { - // Shapes are still no overlapped. - // Move the witness points to the outer surface. - output.distance -= rA + rB; - var normal = Vec2.sub(output.pointB, output.pointA); - normal.normalize(); - output.pointA.addMul(rA, normal); - output.pointB.subMul(rB, normal); - } - else { - // Shapes are overlapped when radii are considered. - // Move the witness points to the middle. - var p = Vec2.mid(output.pointA, output.pointB); - output.pointA.setVec2(p); - output.pointB.setVec2(p); - output.distance = 0.0; - } - } - } - /** - * A distance proxy is used by the GJK algorithm. It encapsulates any shape. - */ - var DistanceProxy = /** @class */ (function () { - function DistanceProxy() { - this.m_buffer = []; // Vec2[2] - this.m_vertices = []; // Vec2[] - this.m_count = 0; - this.m_radius = 0; - } - /** - * Get the vertex count. - */ - DistanceProxy.prototype.getVertexCount = function () { - return this.m_count; - }; - /** - * Get a vertex by index. Used by Distance. - */ - DistanceProxy.prototype.getVertex = function (index) { - return this.m_vertices[index]; - }; - /** - * Get the supporting vertex index in the given direction. - */ - DistanceProxy.prototype.getSupport = function (d) { - var bestIndex = 0; - var bestValue = Vec2.dot(this.m_vertices[0], d); - for (var i = 0; i < this.m_count; ++i) { - var value = Vec2.dot(this.m_vertices[i], d); - if (value > bestValue) { - bestIndex = i; - bestValue = value; - } - } - return bestIndex; - }; - /** - * Get the supporting vertex in the given direction. - */ - DistanceProxy.prototype.getSupportVertex = function (d) { - return this.m_vertices[this.getSupport(d)]; - }; - /** - * Initialize the proxy using the given shape. The shape must remain in scope - * while the proxy is in use. - */ - DistanceProxy.prototype.set = function (shape, index) { - shape.computeDistanceProxy(this, index); - }; - return DistanceProxy; - }()); - var SimplexVertex = /** @class */ (function () { - function SimplexVertex() { - /** support point in proxyA */ - this.wA = Vec2.zero(); - /** support point in proxyB */ - this.wB = Vec2.zero(); - /** wB - wA; */ - this.w = Vec2.zero(); - } - SimplexVertex.prototype.set = function (v) { - this.indexA = v.indexA; - this.indexB = v.indexB; - this.wA = Vec2.clone(v.wA); - this.wB = Vec2.clone(v.wB); - this.w = Vec2.clone(v.w); - this.a = v.a; - }; - return SimplexVertex; - }()); - var Simplex = /** @class */ (function () { - function Simplex() { - this.m_v1 = new SimplexVertex(); - this.m_v2 = new SimplexVertex(); - this.m_v3 = new SimplexVertex(); - this.m_v = [this.m_v1, this.m_v2, this.m_v3]; - this.m_count; - } - /** @internal */ - Simplex.prototype.toString = function () { - if (this.m_count === 3) { - return ["+" + this.m_count, - this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y, - this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y, - this.m_v3.a, this.m_v3.wA.x, this.m_v3.wA.y, this.m_v3.wB.x, this.m_v3.wB.y - ].toString(); - } - else if (this.m_count === 2) { - return ["+" + this.m_count, - this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y, - this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y - ].toString(); - } - else if (this.m_count === 1) { - return ["+" + this.m_count, - this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y - ].toString(); - } - else { - return "+" + this.m_count; - } - }; - Simplex.prototype.readCache = function (cache, proxyA, transformA, proxyB, transformB) { - // Copy data from cache. - this.m_count = cache.count; - for (var i = 0; i < this.m_count; ++i) { - var v = this.m_v[i]; - v.indexA = cache.indexA[i]; - v.indexB = cache.indexB[i]; - var wALocal = proxyA.getVertex(v.indexA); - var wBLocal = proxyB.getVertex(v.indexB); - v.wA = Transform.mulVec2(transformA, wALocal); - v.wB = Transform.mulVec2(transformB, wBLocal); - v.w = Vec2.sub(v.wB, v.wA); - v.a = 0.0; - } - // Compute the new simplex metric, if it is substantially different than - // old metric then flush the simplex. - if (this.m_count > 1) { - var metric1 = cache.metric; - var metric2 = this.getMetric(); - if (metric2 < 0.5 * metric1 || 2.0 * metric1 < metric2 - || metric2 < math$1.EPSILON) { - // Reset the simplex. - this.m_count = 0; - } - } - // If the cache is empty or invalid... - if (this.m_count === 0) { - var v = this.m_v[0]; - v.indexA = 0; - v.indexB = 0; - var wALocal = proxyA.getVertex(0); - var wBLocal = proxyB.getVertex(0); - v.wA = Transform.mulVec2(transformA, wALocal); - v.wB = Transform.mulVec2(transformB, wBLocal); - v.w = Vec2.sub(v.wB, v.wA); - v.a = 1.0; - this.m_count = 1; - } - }; - Simplex.prototype.writeCache = function (cache) { - cache.metric = this.getMetric(); - cache.count = this.m_count; - for (var i = 0; i < this.m_count; ++i) { - cache.indexA[i] = this.m_v[i].indexA; - cache.indexB[i] = this.m_v[i].indexB; - } - }; - Simplex.prototype.getSearchDirection = function () { - switch (this.m_count) { - case 1: - return Vec2.neg(this.m_v1.w); - case 2: { - var e12 = Vec2.sub(this.m_v2.w, this.m_v1.w); - var sgn = Vec2.crossVec2Vec2(e12, Vec2.neg(this.m_v1.w)); - if (sgn > 0.0) { - // Origin is left of e12. - return Vec2.crossNumVec2(1.0, e12); - } - else { - // Origin is right of e12. - return Vec2.crossVec2Num(e12, 1.0); - } - } - default: - return Vec2.zero(); - } - }; - Simplex.prototype.getClosestPoint = function () { - switch (this.m_count) { - case 0: - return Vec2.zero(); - case 1: - return Vec2.clone(this.m_v1.w); - case 2: - return Vec2.combine(this.m_v1.a, this.m_v1.w, this.m_v2.a, this.m_v2.w); - case 3: - return Vec2.zero(); - default: - return Vec2.zero(); - } - }; - Simplex.prototype.getWitnessPoints = function (pA, pB) { - switch (this.m_count) { - case 0: - break; - case 1: - pA.setVec2(this.m_v1.wA); - pB.setVec2(this.m_v1.wB); - break; - case 2: - pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA); - pB.setCombine(this.m_v1.a, this.m_v1.wB, this.m_v2.a, this.m_v2.wB); - break; - case 3: - pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA); - pA.addMul(this.m_v3.a, this.m_v3.wA); - pB.setVec2(pA); - break; - } - }; - Simplex.prototype.getMetric = function () { - switch (this.m_count) { - case 0: - return 0.0; - case 1: - return 0.0; - case 2: - return Vec2.distance(this.m_v1.w, this.m_v2.w); - case 3: - return Vec2.crossVec2Vec2(Vec2.sub(this.m_v2.w, this.m_v1.w), Vec2.sub(this.m_v3.w, this.m_v1.w)); - default: - return 0.0; - } - }; - Simplex.prototype.solve = function () { - switch (this.m_count) { - case 1: - break; - case 2: - this.solve2(); - break; - case 3: - this.solve3(); - break; - } - }; - // Solve a line segment using barycentric coordinates. - // - // p = a1 * w1 + a2 * w2 - // a1 + a2 = 1 - // - // The vector from the origin to the closest point on the line is - // perpendicular to the line. - // e12 = w2 - w1 - // dot(p, e) = 0 - // a1 * dot(w1, e) + a2 * dot(w2, e) = 0 - // - // 2-by-2 linear system - // [1 1 ][a1] = [1] - // [w1.e12 w2.e12][a2] = [0] - // - // Define - // d12_1 = dot(w2, e12) - // d12_2 = -dot(w1, e12) - // d12 = d12_1 + d12_2 - // - // Solution - // a1 = d12_1 / d12 - // a2 = d12_2 / d12 - Simplex.prototype.solve2 = function () { - var w1 = this.m_v1.w; - var w2 = this.m_v2.w; - var e12 = Vec2.sub(w2, w1); - // w1 region - var d12_2 = -Vec2.dot(w1, e12); - if (d12_2 <= 0.0) { - // a2 <= 0, so we clamp it to 0 - this.m_v1.a = 1.0; - this.m_count = 1; - return; - } - // w2 region - var d12_1 = Vec2.dot(w2, e12); - if (d12_1 <= 0.0) { - // a1 <= 0, so we clamp it to 0 - this.m_v2.a = 1.0; - this.m_count = 1; - this.m_v1.set(this.m_v2); - return; - } - // Must be in e12 region. - var inv_d12 = 1.0 / (d12_1 + d12_2); - this.m_v1.a = d12_1 * inv_d12; - this.m_v2.a = d12_2 * inv_d12; - this.m_count = 2; - }; - // Possible regions: - // - points[2] - // - edge points[0]-points[2] - // - edge points[1]-points[2] - // - inside the triangle - Simplex.prototype.solve3 = function () { - var w1 = this.m_v1.w; - var w2 = this.m_v2.w; - var w3 = this.m_v3.w; - // Edge12 - // [1 1 ][a1] = [1] - // [w1.e12 w2.e12][a2] = [0] - // a3 = 0 - var e12 = Vec2.sub(w2, w1); - var w1e12 = Vec2.dot(w1, e12); - var w2e12 = Vec2.dot(w2, e12); - var d12_1 = w2e12; - var d12_2 = -w1e12; - // Edge13 - // [1 1 ][a1] = [1] - // [w1.e13 w3.e13][a3] = [0] - // a2 = 0 - var e13 = Vec2.sub(w3, w1); - var w1e13 = Vec2.dot(w1, e13); - var w3e13 = Vec2.dot(w3, e13); - var d13_1 = w3e13; - var d13_2 = -w1e13; - // Edge23 - // [1 1 ][a2] = [1] - // [w2.e23 w3.e23][a3] = [0] - // a1 = 0 - var e23 = Vec2.sub(w3, w2); - var w2e23 = Vec2.dot(w2, e23); - var w3e23 = Vec2.dot(w3, e23); - var d23_1 = w3e23; - var d23_2 = -w2e23; - // Triangle123 - var n123 = Vec2.crossVec2Vec2(e12, e13); - var d123_1 = n123 * Vec2.crossVec2Vec2(w2, w3); - var d123_2 = n123 * Vec2.crossVec2Vec2(w3, w1); - var d123_3 = n123 * Vec2.crossVec2Vec2(w1, w2); - // w1 region - if (d12_2 <= 0.0 && d13_2 <= 0.0) { - this.m_v1.a = 1.0; - this.m_count = 1; - return; - } - // e12 - if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) { - var inv_d12 = 1.0 / (d12_1 + d12_2); - this.m_v1.a = d12_1 * inv_d12; - this.m_v2.a = d12_2 * inv_d12; - this.m_count = 2; - return; - } - // e13 - if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) { - var inv_d13 = 1.0 / (d13_1 + d13_2); - this.m_v1.a = d13_1 * inv_d13; - this.m_v3.a = d13_2 * inv_d13; - this.m_count = 2; - this.m_v2.set(this.m_v3); - return; - } - // w2 region - if (d12_1 <= 0.0 && d23_2 <= 0.0) { - this.m_v2.a = 1.0; - this.m_count = 1; - this.m_v1.set(this.m_v2); - return; - } - // w3 region - if (d13_1 <= 0.0 && d23_1 <= 0.0) { - this.m_v3.a = 1.0; - this.m_count = 1; - this.m_v1.set(this.m_v3); - return; - } - // e23 - if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) { - var inv_d23 = 1.0 / (d23_1 + d23_2); - this.m_v2.a = d23_1 * inv_d23; - this.m_v3.a = d23_2 * inv_d23; - this.m_count = 2; - this.m_v1.set(this.m_v3); - return; - } - // Must be in triangle123 - var inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3); - this.m_v1.a = d123_1 * inv_d123; - this.m_v2.a = d123_2 * inv_d123; - this.m_v3.a = d123_3 * inv_d123; - this.m_count = 3; - }; - return Simplex; - }()); - /** - * Determine if two generic shapes overlap. - */ - function testOverlap(shapeA, indexA, shapeB, indexB, xfA, xfB) { - var input = new DistanceInput(); - input.proxyA.set(shapeA, indexA); - input.proxyB.set(shapeB, indexB); - input.transformA = xfA; - input.transformB = xfB; - input.useRadii = true; - var cache = new SimplexCache(); - var output = new DistanceOutput(); - Distance(output, cache, input); - return output.distance < 10.0 * math$1.EPSILON; - } - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * A contact edge is used to connect bodies and contacts together in a contact - * graph where each body is a node and each contact is an edge. A contact edge - * belongs to a doubly linked list maintained in each attached body. Each - * contact has two contact nodes, one for each attached body. - * - * @prop {Contact} contact The contact - * @prop {ContactEdge} prev The previous contact edge in the body's contact list - * @prop {ContactEdge} next The next contact edge in the body's contact list - * @prop {Body} other Provides quick access to the other body attached. - */ - var ContactEdge = /** @class */ (function () { - function ContactEdge(contact) { - this.contact = contact; - } - return ContactEdge; - }()); - /** - * Friction mixing law. The idea is to allow either fixture to drive the - * restitution to zero. For example, anything slides on ice. - */ - function mixFriction(friction1, friction2) { - return math$1.sqrt(friction1 * friction2); - } - /** - * Restitution mixing law. The idea is allow for anything to bounce off an - * inelastic surface. For example, a superball bounces on anything. - */ - function mixRestitution(restitution1, restitution2) { - return restitution1 > restitution2 ? restitution1 : restitution2; - } - // TODO: move this to Settings? - var s_registers = []; - // TODO: merge with ManifoldPoint? - var VelocityConstraintPoint = /** @class */ (function () { - function VelocityConstraintPoint() { - this.rA = Vec2.zero(); - this.rB = Vec2.zero(); - this.normalImpulse = 0; - this.tangentImpulse = 0; - this.normalMass = 0; - this.tangentMass = 0; - this.velocityBias = 0; - } - return VelocityConstraintPoint; - }()); - /** - * The class manages contact between two shapes. A contact exists for each - * overlapping AABB in the broad-phase (except if filtered). Therefore a contact - * object may exist that has no contact points. - */ - var Contact = /** @class */ (function () { - function Contact(fA, indexA, fB, indexB, evaluateFcn) { - /** @internal */ - this.m_manifold = new Manifold(); - /** @internal */ - this.m_prev = null; - /** @internal */ - this.m_next = null; - /** @internal */ - this.m_toi = 1.0; - /** @internal */ - this.m_toiCount = 0; - /** @internal This contact has a valid TOI in m_toi */ - this.m_toiFlag = false; - /** @internal */ - this.m_tangentSpeed = 0.0; - /** @internal This contact can be disabled (by user) */ - this.m_enabledFlag = true; - /** @internal Used when crawling contact graph when forming islands. */ - this.m_islandFlag = false; - /** @internal Set when the shapes are touching. */ - this.m_touchingFlag = false; - /** @internal This contact needs filtering because a fixture filter was changed. */ - this.m_filterFlag = false; - /** @internal This bullet contact had a TOI event */ - this.m_bulletHitFlag = false; - /** @internal Contact reporting impulse object cache */ - this.m_impulse = new ContactImpulse(this); - // VelocityConstraint - /** @internal */ this.v_points = []; // [maxManifoldPoints]; - /** @internal */ this.v_normal = Vec2.zero(); - /** @internal */ this.v_normalMass = new Mat22(); - /** @internal */ this.v_K = new Mat22(); - // PositionConstraint - /** @internal */ this.p_localPoints = []; // [maxManifoldPoints]; - /** @internal */ this.p_localNormal = Vec2.zero(); - /** @internal */ this.p_localPoint = Vec2.zero(); - /** @internal */ this.p_localCenterA = Vec2.zero(); - /** @internal */ this.p_localCenterB = Vec2.zero(); - // Nodes for connecting bodies. - this.m_nodeA = new ContactEdge(this); - this.m_nodeB = new ContactEdge(this); - this.m_fixtureA = fA; - this.m_fixtureB = fB; - this.m_indexA = indexA; - this.m_indexB = indexB; - this.m_evaluateFcn = evaluateFcn; - this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction); - this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution); - } - Contact.prototype.initConstraint = function (step) { - var fixtureA = this.m_fixtureA; - var fixtureB = this.m_fixtureB; - var shapeA = fixtureA.getShape(); - var shapeB = fixtureB.getShape(); - var bodyA = fixtureA.getBody(); - var bodyB = fixtureB.getBody(); - var manifold = this.getManifold(); - var pointCount = manifold.pointCount; - this.v_invMassA = bodyA.m_invMass; - this.v_invMassB = bodyB.m_invMass; - this.v_invIA = bodyA.m_invI; - this.v_invIB = bodyB.m_invI; - this.v_friction = this.m_friction; - this.v_restitution = this.m_restitution; - this.v_tangentSpeed = this.m_tangentSpeed; - this.v_pointCount = pointCount; - this.v_K.setZero(); - this.v_normalMass.setZero(); - this.p_invMassA = bodyA.m_invMass; - this.p_invMassB = bodyB.m_invMass; - this.p_invIA = bodyA.m_invI; - this.p_invIB = bodyB.m_invI; - this.p_localCenterA = Vec2.clone(bodyA.m_sweep.localCenter); - this.p_localCenterB = Vec2.clone(bodyB.m_sweep.localCenter); - this.p_radiusA = shapeA.m_radius; - this.p_radiusB = shapeB.m_radius; - this.p_type = manifold.type; - this.p_localNormal = Vec2.clone(manifold.localNormal); - this.p_localPoint = Vec2.clone(manifold.localPoint); - this.p_pointCount = pointCount; - for (var j = 0; j < pointCount; ++j) { - var cp = manifold.points[j]; - var vcp = this.v_points[j] = new VelocityConstraintPoint(); - if (step.warmStarting) { - vcp.normalImpulse = step.dtRatio * cp.normalImpulse; - vcp.tangentImpulse = step.dtRatio * cp.tangentImpulse; - } - else { - vcp.normalImpulse = 0.0; - vcp.tangentImpulse = 0.0; - } - vcp.rA.setZero(); - vcp.rB.setZero(); - vcp.normalMass = 0.0; - vcp.tangentMass = 0.0; - vcp.velocityBias = 0.0; - this.p_localPoints[j] = Vec2.clone(cp.localPoint); - } - }; - /** - * Get the contact manifold. Do not modify the manifold unless you understand - * the internals of the library. - */ - Contact.prototype.getManifold = function () { - return this.m_manifold; - }; - /** - * Get the world manifold. - */ - Contact.prototype.getWorldManifold = function (worldManifold) { - var bodyA = this.m_fixtureA.getBody(); - var bodyB = this.m_fixtureB.getBody(); - var shapeA = this.m_fixtureA.getShape(); - var shapeB = this.m_fixtureB.getShape(); - return this.m_manifold.getWorldManifold(worldManifold, bodyA.getTransform(), shapeA.m_radius, bodyB.getTransform(), shapeB.m_radius); - }; - /** - * Enable/disable this contact. This can be used inside the pre-solve contact - * listener. The contact is only disabled for the current time step (or sub-step - * in continuous collisions). - */ - Contact.prototype.setEnabled = function (flag) { - this.m_enabledFlag = !!flag; - }; - /** - * Has this contact been disabled? - */ - Contact.prototype.isEnabled = function () { - return this.m_enabledFlag; - }; - /** - * Is this contact touching? - */ - Contact.prototype.isTouching = function () { - return this.m_touchingFlag; - }; - /** - * Get the next contact in the world's contact list. - */ - Contact.prototype.getNext = function () { - return this.m_next; - }; - /** - * Get fixture A in this contact. - */ - Contact.prototype.getFixtureA = function () { - return this.m_fixtureA; - }; - /** - * Get fixture B in this contact. - */ - Contact.prototype.getFixtureB = function () { - return this.m_fixtureB; - }; - /** - * Get the child primitive index for fixture A. - */ - Contact.prototype.getChildIndexA = function () { - return this.m_indexA; - }; - /** - * Get the child primitive index for fixture B. - */ - Contact.prototype.getChildIndexB = function () { - return this.m_indexB; - }; - /** - * Flag this contact for filtering. Filtering will occur the next time step. - */ - Contact.prototype.flagForFiltering = function () { - this.m_filterFlag = true; - }; - /** - * Override the default friction mixture. You can call this in - * ContactListener.preSolve. This value persists until set or reset. - */ - Contact.prototype.setFriction = function (friction) { - this.m_friction = friction; - }; - /** - * Get the friction. - */ - Contact.prototype.getFriction = function () { - return this.m_friction; - }; - /** - * Reset the friction mixture to the default value. - */ - Contact.prototype.resetFriction = function () { - this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction); - }; - /** - * Override the default restitution mixture. You can call this in - * ContactListener.preSolve. The value persists until you set or reset. - */ - Contact.prototype.setRestitution = function (restitution) { - this.m_restitution = restitution; - }; - /** - * Get the restitution. - */ - Contact.prototype.getRestitution = function () { - return this.m_restitution; - }; - /** - * Reset the restitution to the default value. - */ - Contact.prototype.resetRestitution = function () { - this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution); - }; - /** - * Set the desired tangent speed for a conveyor belt behavior. In meters per - * second. - */ - Contact.prototype.setTangentSpeed = function (speed) { - this.m_tangentSpeed = speed; - }; - /** - * Get the desired tangent speed. In meters per second. - */ - Contact.prototype.getTangentSpeed = function () { - return this.m_tangentSpeed; - }; - /** - * Called by Update method, and implemented by subclasses. - */ - Contact.prototype.evaluate = function (manifold, xfA, xfB) { - this.m_evaluateFcn(manifold, xfA, this.m_fixtureA, this.m_indexA, xfB, this.m_fixtureB, this.m_indexB); - }; - /** - * Updates the contact manifold and touching status. - * - * Note: do not assume the fixture AABBs are overlapping or are valid. - * - * @param listener.beginContact - * @param listener.endContact - * @param listener.preSolve - */ - Contact.prototype.update = function (listener) { - // Re-enable this contact. - this.m_enabledFlag = true; - var touching = false; - var wasTouching = this.m_touchingFlag; - var sensorA = this.m_fixtureA.isSensor(); - var sensorB = this.m_fixtureB.isSensor(); - var sensor = sensorA || sensorB; - var bodyA = this.m_fixtureA.getBody(); - var bodyB = this.m_fixtureB.getBody(); - var xfA = bodyA.getTransform(); - var xfB = bodyB.getTransform(); - var oldManifold; - // Is this contact a sensor? - if (sensor) { - var shapeA = this.m_fixtureA.getShape(); - var shapeB = this.m_fixtureB.getShape(); - touching = testOverlap(shapeA, this.m_indexA, shapeB, this.m_indexB, xfA, xfB); - // Sensors don't generate manifolds. - this.m_manifold.pointCount = 0; - } - else { - // TODO reuse manifold - oldManifold = this.m_manifold; - this.m_manifold = new Manifold(); - this.evaluate(this.m_manifold, xfA, xfB); - touching = this.m_manifold.pointCount > 0; - // Match old contact ids to new contact ids and copy the - // stored impulses to warm start the solver. - for (var i = 0; i < this.m_manifold.pointCount; ++i) { - var nmp = this.m_manifold.points[i]; - nmp.normalImpulse = 0.0; - nmp.tangentImpulse = 0.0; - for (var j = 0; j < oldManifold.pointCount; ++j) { - var omp = oldManifold.points[j]; - if (omp.id.key == nmp.id.key) { - nmp.normalImpulse = omp.normalImpulse; - nmp.tangentImpulse = omp.tangentImpulse; - break; - } - } - } - if (touching != wasTouching) { - bodyA.setAwake(true); - bodyB.setAwake(true); - } - } - this.m_touchingFlag = touching; - if (!wasTouching && touching && listener) { - listener.beginContact(this); - } - if (wasTouching && !touching && listener) { - listener.endContact(this); - } - if (!sensor && touching && listener) { - listener.preSolve(this, oldManifold); - } - }; - Contact.prototype.solvePositionConstraint = function (step) { - return this._solvePositionConstraint(step); - }; - Contact.prototype.solvePositionConstraintTOI = function (step, toiA, toiB) { - return this._solvePositionConstraint(step, toiA, toiB); - }; - Contact.prototype._solvePositionConstraint = function (step, toiA, toiB) { - var toi = !!toiA && !!toiB; - var fixtureA = this.m_fixtureA; - var fixtureB = this.m_fixtureB; - var bodyA = fixtureA.getBody(); - var bodyB = fixtureB.getBody(); - bodyA.c_velocity; - bodyB.c_velocity; - var positionA = bodyA.c_position; - var positionB = bodyB.c_position; - var localCenterA = Vec2.clone(this.p_localCenterA); - var localCenterB = Vec2.clone(this.p_localCenterB); - var mA = 0.0; - var iA = 0.0; - if (!toi || (bodyA == toiA || bodyA == toiB)) { - mA = this.p_invMassA; - iA = this.p_invIA; - } - var mB = 0.0; - var iB = 0.0; - if (!toi || (bodyB == toiA || bodyB == toiB)) { - mB = this.p_invMassB; - iB = this.p_invIB; - } - var cA = Vec2.clone(positionA.c); - var aA = positionA.a; - var cB = Vec2.clone(positionB.c); - var aB = positionB.a; - var minSeparation = 0.0; - // Solve normal constraints - for (var j = 0; j < this.p_pointCount; ++j) { - var xfA = Transform.identity(); - var xfB = Transform.identity(); - xfA.q.setAngle(aA); - xfB.q.setAngle(aB); - xfA.p = Vec2.sub(cA, Rot.mulVec2(xfA.q, localCenterA)); - xfB.p = Vec2.sub(cB, Rot.mulVec2(xfB.q, localCenterB)); - // PositionSolverManifold - var normal = void 0; - var point = void 0; - var separation = void 0; - switch (this.p_type) { - case ManifoldType.e_circles: { - var pointA = Transform.mulVec2(xfA, this.p_localPoint); - var pointB = Transform.mulVec2(xfB, this.p_localPoints[0]); - normal = Vec2.sub(pointB, pointA); - normal.normalize(); - point = Vec2.combine(0.5, pointA, 0.5, pointB); - separation = Vec2.dot(Vec2.sub(pointB, pointA), normal) - this.p_radiusA - this.p_radiusB; - break; - } - case ManifoldType.e_faceA: { - normal = Rot.mulVec2(xfA.q, this.p_localNormal); - var planePoint = Transform.mulVec2(xfA, this.p_localPoint); - var clipPoint = Transform.mulVec2(xfB, this.p_localPoints[j]); - separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB; - point = clipPoint; - break; - } - case ManifoldType.e_faceB: { - normal = Rot.mulVec2(xfB.q, this.p_localNormal); - var planePoint = Transform.mulVec2(xfB, this.p_localPoint); - var clipPoint = Transform.mulVec2(xfA, this.p_localPoints[j]); - separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB; - point = clipPoint; - // Ensure normal points from A to B - normal.mul(-1); - break; - } - } - var rA = Vec2.sub(point, cA); - var rB = Vec2.sub(point, cB); - // Track max constraint error. - minSeparation = math$1.min(minSeparation, separation); - var baumgarte = toi ? Settings.toiBaugarte : Settings.baumgarte; - var linearSlop = Settings.linearSlop; - var maxLinearCorrection = Settings.maxLinearCorrection; - // Prevent large corrections and allow slop. - var C = math$1.clamp(baumgarte * (separation + linearSlop), -maxLinearCorrection, 0.0); - // Compute the effective mass. - var rnA = Vec2.crossVec2Vec2(rA, normal); - var rnB = Vec2.crossVec2Vec2(rB, normal); - var K = mA + mB + iA * rnA * rnA + iB * rnB * rnB; - // Compute normal impulse - var impulse = K > 0.0 ? -C / K : 0.0; - var P = Vec2.mulNumVec2(impulse, normal); - cA.subMul(mA, P); - aA -= iA * Vec2.crossVec2Vec2(rA, P); - cB.addMul(mB, P); - aB += iB * Vec2.crossVec2Vec2(rB, P); - } - positionA.c.setVec2(cA); - positionA.a = aA; - positionB.c.setVec2(cB); - positionB.a = aB; - return minSeparation; - }; - Contact.prototype.initVelocityConstraint = function (step) { - var fixtureA = this.m_fixtureA; - var fixtureB = this.m_fixtureB; - var bodyA = fixtureA.getBody(); - var bodyB = fixtureB.getBody(); - var velocityA = bodyA.c_velocity; - var velocityB = bodyB.c_velocity; - var positionA = bodyA.c_position; - var positionB = bodyB.c_position; - var radiusA = this.p_radiusA; - var radiusB = this.p_radiusB; - var manifold = this.getManifold(); - var mA = this.v_invMassA; - var mB = this.v_invMassB; - var iA = this.v_invIA; - var iB = this.v_invIB; - var localCenterA = Vec2.clone(this.p_localCenterA); - var localCenterB = Vec2.clone(this.p_localCenterB); - var cA = Vec2.clone(positionA.c); - var aA = positionA.a; - var vA = Vec2.clone(velocityA.v); - var wA = velocityA.w; - var cB = Vec2.clone(positionB.c); - var aB = positionB.a; - var vB = Vec2.clone(velocityB.v); - var wB = velocityB.w; - var xfA = Transform.identity(); - var xfB = Transform.identity(); - xfA.q.setAngle(aA); - xfB.q.setAngle(aB); - xfA.p.setCombine(1, cA, -1, Rot.mulVec2(xfA.q, localCenterA)); - xfB.p.setCombine(1, cB, -1, Rot.mulVec2(xfB.q, localCenterB)); - var worldManifold = manifold.getWorldManifold(null, xfA, radiusA, xfB, radiusB); - this.v_normal.setVec2(worldManifold.normal); - for (var j = 0; j < this.v_pointCount; ++j) { - var vcp = this.v_points[j]; // VelocityConstraintPoint - vcp.rA.setVec2(Vec2.sub(worldManifold.points[j], cA)); - vcp.rB.setVec2(Vec2.sub(worldManifold.points[j], cB)); - var rnA = Vec2.crossVec2Vec2(vcp.rA, this.v_normal); - var rnB = Vec2.crossVec2Vec2(vcp.rB, this.v_normal); - var kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB; - vcp.normalMass = kNormal > 0.0 ? 1.0 / kNormal : 0.0; - var tangent = Vec2.crossVec2Num(this.v_normal, 1.0); - var rtA = Vec2.crossVec2Vec2(vcp.rA, tangent); - var rtB = Vec2.crossVec2Vec2(vcp.rB, tangent); - var kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB; - vcp.tangentMass = kTangent > 0.0 ? 1.0 / kTangent : 0.0; - // Setup a velocity bias for restitution. - vcp.velocityBias = 0.0; - var vRel = Vec2.dot(this.v_normal, vB) - + Vec2.dot(this.v_normal, Vec2.crossNumVec2(wB, vcp.rB)) - - Vec2.dot(this.v_normal, vA) - - Vec2.dot(this.v_normal, Vec2.crossNumVec2(wA, vcp.rA)); - if (vRel < -Settings.velocityThreshold) { - vcp.velocityBias = -this.v_restitution * vRel; - } - } - // If we have two points, then prepare the block solver. - if (this.v_pointCount == 2 && step.blockSolve) { - var vcp1 = this.v_points[0]; // VelocityConstraintPoint - var vcp2 = this.v_points[1]; // VelocityConstraintPoint - var rn1A = Vec2.crossVec2Vec2(vcp1.rA, this.v_normal); - var rn1B = Vec2.crossVec2Vec2(vcp1.rB, this.v_normal); - var rn2A = Vec2.crossVec2Vec2(vcp2.rA, this.v_normal); - var rn2B = Vec2.crossVec2Vec2(vcp2.rB, this.v_normal); - var k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B; - var k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B; - var k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B; - // Ensure a reasonable condition number. - var k_maxConditionNumber = 1000.0; - if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) { - // K is safe to invert. - this.v_K.ex.setNum(k11, k12); - this.v_K.ey.setNum(k12, k22); - this.v_normalMass.set(this.v_K.getInverse()); - } - else { - // The constraints are redundant, just use one. - // TODO_ERIN use deepest? - this.v_pointCount = 1; - } - } - positionA.c.setVec2(cA); - positionA.a = aA; - velocityA.v.setVec2(vA); - velocityA.w = wA; - positionB.c.setVec2(cB); - positionB.a = aB; - velocityB.v.setVec2(vB); - velocityB.w = wB; - }; - Contact.prototype.warmStartConstraint = function (step) { - var fixtureA = this.m_fixtureA; - var fixtureB = this.m_fixtureB; - var bodyA = fixtureA.getBody(); - var bodyB = fixtureB.getBody(); - var velocityA = bodyA.c_velocity; - var velocityB = bodyB.c_velocity; - bodyA.c_position; - bodyB.c_position; - var mA = this.v_invMassA; - var iA = this.v_invIA; - var mB = this.v_invMassB; - var iB = this.v_invIB; - var vA = Vec2.clone(velocityA.v); - var wA = velocityA.w; - var vB = Vec2.clone(velocityB.v); - var wB = velocityB.w; - var normal = this.v_normal; - var tangent = Vec2.crossVec2Num(normal, 1.0); - for (var j = 0; j < this.v_pointCount; ++j) { - var vcp = this.v_points[j]; // VelocityConstraintPoint - var P = Vec2.combine(vcp.normalImpulse, normal, vcp.tangentImpulse, tangent); - wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); - vA.subMul(mA, P); - wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); - vB.addMul(mB, P); - } - velocityA.v.setVec2(vA); - velocityA.w = wA; - velocityB.v.setVec2(vB); - velocityB.w = wB; - }; - Contact.prototype.storeConstraintImpulses = function (step) { - var manifold = this.m_manifold; - for (var j = 0; j < this.v_pointCount; ++j) { - manifold.points[j].normalImpulse = this.v_points[j].normalImpulse; - manifold.points[j].tangentImpulse = this.v_points[j].tangentImpulse; - } - }; - Contact.prototype.solveVelocityConstraint = function (step) { - var bodyA = this.m_fixtureA.m_body; - var bodyB = this.m_fixtureB.m_body; - var velocityA = bodyA.c_velocity; - bodyA.c_position; - var velocityB = bodyB.c_velocity; - bodyB.c_position; - var mA = this.v_invMassA; - var iA = this.v_invIA; - var mB = this.v_invMassB; - var iB = this.v_invIB; - var vA = Vec2.clone(velocityA.v); - var wA = velocityA.w; - var vB = Vec2.clone(velocityB.v); - var wB = velocityB.w; - var normal = this.v_normal; - var tangent = Vec2.crossVec2Num(normal, 1.0); - var friction = this.v_friction; - // Solve tangent constraints first because non-penetration is more important - // than friction. - for (var j = 0; j < this.v_pointCount; ++j) { - var vcp = this.v_points[j]; // VelocityConstraintPoint - // Relative velocity at contact - var dv = Vec2.zero(); - dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB)); - dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA)); - // Compute tangent force - var vt = Vec2.dot(dv, tangent) - this.v_tangentSpeed; - var lambda = vcp.tangentMass * (-vt); - // Clamp the accumulated force - var maxFriction = friction * vcp.normalImpulse; - var newImpulse = math$1.clamp(vcp.tangentImpulse + lambda, -maxFriction, maxFriction); - lambda = newImpulse - vcp.tangentImpulse; - vcp.tangentImpulse = newImpulse; - // Apply contact impulse - var P = Vec2.mulNumVec2(lambda, tangent); - vA.subMul(mA, P); - wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); - vB.addMul(mB, P); - wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); - } - // Solve normal constraints - if (this.v_pointCount == 1 || step.blockSolve == false) { - for (var i = 0; i < this.v_pointCount; ++i) { - var vcp = this.v_points[i]; // VelocityConstraintPoint - // Relative velocity at contact - var dv = Vec2.zero(); - dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB)); - dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA)); - // Compute normal impulse - var vn = Vec2.dot(dv, normal); - var lambda = -vcp.normalMass * (vn - vcp.velocityBias); - // Clamp the accumulated impulse - var newImpulse = math$1.max(vcp.normalImpulse + lambda, 0.0); - lambda = newImpulse - vcp.normalImpulse; - vcp.normalImpulse = newImpulse; - // Apply contact impulse - var P = Vec2.mulNumVec2(lambda, normal); - vA.subMul(mA, P); - wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); - vB.addMul(mB, P); - wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); - } - } - else { - // Block solver developed in collaboration with Dirk Gregorius (back in - // 01/07 on Box2D_Lite). - // Build the mini LCP for this contact patch - // - // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i = - // 1..2 - // - // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n ) - // b = vn0 - velocityBias - // - // The system is solved using the "Total enumeration method" (s. Murty). - // The complementary constraint vn_i * x_i - // implies that we must have in any solution either vn_i = 0 or x_i = 0. - // So for the 2D contact problem the cases - // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and - // vn1 = 0 need to be tested. The first valid - // solution that satisfies the problem is chosen. - // - // In order to account of the accumulated impulse 'a' (because of the - // iterative nature of the solver which only requires - // that the accumulated impulse is clamped and not the incremental - // impulse) we change the impulse variable (x_i). - // - // Substitute: - // - // x = a + d - // - // a := old total impulse - // x := new total impulse - // d := incremental impulse - // - // For the current iteration we extend the formula for the incremental - // impulse - // to compute the new total impulse: - // - // vn = A * d + b - // = A * (x - a) + b - // = A * x + b - A * a - // = A * x + b' - // b' = b - A * a; - var vcp1 = this.v_points[0]; // VelocityConstraintPoint - var vcp2 = this.v_points[1]; // VelocityConstraintPoint - var a = Vec2.neo(vcp1.normalImpulse, vcp2.normalImpulse); - // Relative velocity at contact - var dv1 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp1.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp1.rA)); - var dv2 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp2.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp2.rA)); - // Compute normal velocity - var vn1 = Vec2.dot(dv1, normal); - var vn2 = Vec2.dot(dv2, normal); - var b = Vec2.neo(vn1 - vcp1.velocityBias, vn2 - vcp2.velocityBias); - // Compute b' - b.sub(Mat22.mulVec2(this.v_K, a)); - // NOT_USED(k_errorTol); - while (true) { - // - // Case 1: vn = 0 - // - // 0 = A * x + b' - // - // Solve for x: - // - // x = - inv(A) * b' - // - var x = Mat22.mulVec2(this.v_normalMass, b).neg(); - if (x.x >= 0.0 && x.y >= 0.0) { - // Get the incremental impulse - var d = Vec2.sub(x, a); - // Apply incremental impulse - var P1 = Vec2.mulNumVec2(d.x, normal); - var P2 = Vec2.mulNumVec2(d.y, normal); - vA.subCombine(mA, P1, mA, P2); - wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); - vB.addCombine(mB, P1, mB, P2); - wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); - // Accumulate - vcp1.normalImpulse = x.x; - vcp2.normalImpulse = x.y; - break; - } - // - // Case 2: vn1 = 0 and x2 = 0 - // - // 0 = a11 * x1 + a12 * 0 + b1' - // vn2 = a21 * x1 + a22 * 0 + b2' - // - x.x = -vcp1.normalMass * b.x; - x.y = 0.0; - vn1 = 0.0; - vn2 = this.v_K.ex.y * x.x + b.y; - if (x.x >= 0.0 && vn2 >= 0.0) { - // Get the incremental impulse - var d = Vec2.sub(x, a); - // Apply incremental impulse - var P1 = Vec2.mulNumVec2(d.x, normal); - var P2 = Vec2.mulNumVec2(d.y, normal); - vA.subCombine(mA, P1, mA, P2); - wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); - vB.addCombine(mB, P1, mB, P2); - wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); - // Accumulate - vcp1.normalImpulse = x.x; - vcp2.normalImpulse = x.y; - break; - } - // - // Case 3: vn2 = 0 and x1 = 0 - // - // vn1 = a11 * 0 + a12 * x2 + b1' - // 0 = a21 * 0 + a22 * x2 + b2' - // - x.x = 0.0; - x.y = -vcp2.normalMass * b.y; - vn1 = this.v_K.ey.x * x.y + b.x; - vn2 = 0.0; - if (x.y >= 0.0 && vn1 >= 0.0) { - // Resubstitute for the incremental impulse - var d = Vec2.sub(x, a); - // Apply incremental impulse - var P1 = Vec2.mulNumVec2(d.x, normal); - var P2 = Vec2.mulNumVec2(d.y, normal); - vA.subCombine(mA, P1, mA, P2); - wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); - vB.addCombine(mB, P1, mB, P2); - wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); - // Accumulate - vcp1.normalImpulse = x.x; - vcp2.normalImpulse = x.y; - break; - } - // - // Case 4: x1 = 0 and x2 = 0 - // - // vn1 = b1 - // vn2 = b2; - // - x.x = 0.0; - x.y = 0.0; - vn1 = b.x; - vn2 = b.y; - if (vn1 >= 0.0 && vn2 >= 0.0) { - // Resubstitute for the incremental impulse - var d = Vec2.sub(x, a); - // Apply incremental impulse - var P1 = Vec2.mulNumVec2(d.x, normal); - var P2 = Vec2.mulNumVec2(d.y, normal); - vA.subCombine(mA, P1, mA, P2); - wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); - vB.addCombine(mB, P1, mB, P2); - wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); - // Accumulate - vcp1.normalImpulse = x.x; - vcp2.normalImpulse = x.y; - break; - } - // No solution, give up. This is hit sometimes, but it doesn't seem to - // matter. - break; - } - } - velocityA.v.setVec2(vA); - velocityA.w = wA; - velocityB.v.setVec2(vB); - velocityB.w = wB; - }; - /** - * @internal - */ - Contact.addType = function (type1, type2, callback) { - s_registers[type1] = s_registers[type1] || {}; - s_registers[type1][type2] = callback; - }; - /** - * @internal - */ - Contact.create = function (fixtureA, indexA, fixtureB, indexB) { - var typeA = fixtureA.getType(); - var typeB = fixtureB.getType(); - // TODO: pool contacts - var contact; - var evaluateFcn; - if (evaluateFcn = s_registers[typeA] && s_registers[typeA][typeB]) { - contact = new Contact(fixtureA, indexA, fixtureB, indexB, evaluateFcn); - } - else if (evaluateFcn = s_registers[typeB] && s_registers[typeB][typeA]) { - contact = new Contact(fixtureB, indexB, fixtureA, indexA, evaluateFcn); - } - else { - return null; - } - // Contact creation may swap fixtures. - fixtureA = contact.getFixtureA(); - fixtureB = contact.getFixtureB(); - indexA = contact.getChildIndexA(); - indexB = contact.getChildIndexB(); - var bodyA = fixtureA.getBody(); - var bodyB = fixtureB.getBody(); - // Connect to body A - contact.m_nodeA.contact = contact; - contact.m_nodeA.other = bodyB; - contact.m_nodeA.prev = null; - contact.m_nodeA.next = bodyA.m_contactList; - if (bodyA.m_contactList != null) { - bodyA.m_contactList.prev = contact.m_nodeA; - } - bodyA.m_contactList = contact.m_nodeA; - // Connect to body B - contact.m_nodeB.contact = contact; - contact.m_nodeB.other = bodyA; - contact.m_nodeB.prev = null; - contact.m_nodeB.next = bodyB.m_contactList; - if (bodyB.m_contactList != null) { - bodyB.m_contactList.prev = contact.m_nodeB; - } - bodyB.m_contactList = contact.m_nodeB; - // Wake up the bodies - if (fixtureA.isSensor() == false && fixtureB.isSensor() == false) { - bodyA.setAwake(true); - bodyB.setAwake(true); - } - return contact; - }; - /** - * @internal - */ - Contact.destroy = function (contact, listener) { - var fixtureA = contact.m_fixtureA; - var fixtureB = contact.m_fixtureB; - var bodyA = fixtureA.getBody(); - var bodyB = fixtureB.getBody(); - if (contact.isTouching()) { - listener.endContact(contact); - } - // Remove from body 1 - if (contact.m_nodeA.prev) { - contact.m_nodeA.prev.next = contact.m_nodeA.next; - } - if (contact.m_nodeA.next) { - contact.m_nodeA.next.prev = contact.m_nodeA.prev; - } - if (contact.m_nodeA == bodyA.m_contactList) { - bodyA.m_contactList = contact.m_nodeA.next; - } - // Remove from body 2 - if (contact.m_nodeB.prev) { - contact.m_nodeB.prev.next = contact.m_nodeB.next; - } - if (contact.m_nodeB.next) { - contact.m_nodeB.next.prev = contact.m_nodeB.prev; - } - if (contact.m_nodeB == bodyB.m_contactList) { - bodyB.m_contactList = contact.m_nodeB.next; - } - if (contact.m_manifold.pointCount > 0 && fixtureA.isSensor() == false - && fixtureB.isSensor() == false) { - bodyA.setAwake(true); - bodyB.setAwake(true); - } - fixtureA.getType(); - fixtureB.getType(); - // const destroyFcn = s_registers[typeA][typeB].destroyFcn; - // if (typeof destroyFcn === 'function') { - // destroyFcn(contact); - // } - }; - return Contact; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * A joint edge is used to connect bodies and joints together in a joint graph - * where each body is a node and each joint is an edge. A joint edge belongs to - * a doubly linked list maintained in each attached body. Each joint has two - * joint nodes, one for each attached body. - */ - var JointEdge = /** @class */ (function () { - function JointEdge() { - /** - * provides quick access to the other body attached. - */ - this.other = null; - /** - * the joint - */ - this.joint = null; - /** - * prev the previous joint edge in the body's joint list - */ - this.prev = null; - /** - * the next joint edge in the body's joint list - */ - this.next = null; - } - return JointEdge; - }()); - /** - * The base joint class. Joints are used to constraint two bodies together in - * various fashions. Some joints also feature limits and motors. - */ - var Joint = /** @class */ (function () { - function Joint(def, bodyA, bodyB) { - /** @internal */ this.m_type = 'unknown-joint'; - /** @internal */ this.m_prev = null; - /** @internal */ this.m_next = null; - /** @internal */ this.m_edgeA = new JointEdge(); - /** @internal */ this.m_edgeB = new JointEdge(); - /** @internal */ this.m_islandFlag = false; - bodyA = 'bodyA' in def ? def.bodyA : bodyA; - bodyB = 'bodyB' in def ? def.bodyB : bodyB; - this.m_bodyA = bodyA; - this.m_bodyB = bodyB; - this.m_collideConnected = !!def.collideConnected; - this.m_userData = def.userData; + }; + /** @internal */ + Fixture._deserialize = function (data, body, restore) { + var shape = restore(Shape, data.shape); + var fixture = shape && new Fixture(body, shape, data); + return fixture; + }; + /** + * Get the type of the child shape. You can use this to down cast to the + * concrete shape. + */ + Fixture.prototype.getType = function () { + return this.m_shape.getType(); + }; + /** + * Get the child shape. You can modify the child shape, however you should not + * change the number of vertices because this will crash some collision caching + * mechanisms. Manipulating the shape may lead to non-physical behavior. + */ + Fixture.prototype.getShape = function () { + return this.m_shape; + }; + /** + * A sensor shape collects contact information but never generates a collision + * response. + */ + Fixture.prototype.isSensor = function () { + return this.m_isSensor; + }; + /** + * Set if this fixture is a sensor. + */ + Fixture.prototype.setSensor = function (sensor) { + if (sensor != this.m_isSensor) { + this.m_body.setAwake(true); + this.m_isSensor = sensor; } - /** - * Short-cut function to determine if either body is inactive. - */ - Joint.prototype.isActive = function () { - return this.m_bodyA.isActive() && this.m_bodyB.isActive(); - }; - /** - * Get the type of the concrete joint. - */ - Joint.prototype.getType = function () { - return this.m_type; - }; - /** - * Get the first body attached to this joint. - */ - Joint.prototype.getBodyA = function () { - return this.m_bodyA; - }; - /** - * Get the second body attached to this joint. - */ - Joint.prototype.getBodyB = function () { - return this.m_bodyB; - }; - /** - * Get the next joint the world joint list. - */ - Joint.prototype.getNext = function () { - return this.m_next; - }; - Joint.prototype.getUserData = function () { - return this.m_userData; - }; - Joint.prototype.setUserData = function (data) { - this.m_userData = data; - }; - /** - * Get collide connected. Note: modifying the collide connect flag won't work - * correctly because the flag is only checked when fixture AABBs begin to - * overlap. - */ - Joint.prototype.getCollideConnected = function () { - return this.m_collideConnected; - }; - /** - * Shift the origin for any points stored in world coordinates. - */ - Joint.prototype.shiftOrigin = function (newOrigin) { }; - return Joint; - }()); - - var now = function () { - return Date.now(); }; - var diff = function (time) { - return Date.now() - time; + // /** + // * Get the contact filtering data. + // */ + // getFilterData() { + // return this.m_filter; + // } + /** + * Get the user data that was assigned in the fixture definition. Use this to + * store your application specific data. + */ + Fixture.prototype.getUserData = function () { + return this.m_userData; }; - var Timer = { - now: now, - diff: diff, + /** + * Set the user data. Use this to store your application specific data. + */ + Fixture.prototype.setUserData = function (data) { + this.m_userData = data; }; - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * Input parameters for TimeOfImpact. - */ - var TOIInput = /** @class */ (function () { - function TOIInput() { - this.proxyA = new DistanceProxy(); - this.proxyB = new DistanceProxy(); - this.sweepA = new Sweep(); - this.sweepB = new Sweep(); - } - return TOIInput; - }()); - var TOIOutputState; - (function (TOIOutputState) { - TOIOutputState[TOIOutputState["e_unknown"] = 0] = "e_unknown"; - TOIOutputState[TOIOutputState["e_failed"] = 1] = "e_failed"; - TOIOutputState[TOIOutputState["e_overlapped"] = 2] = "e_overlapped"; - TOIOutputState[TOIOutputState["e_touching"] = 3] = "e_touching"; - TOIOutputState[TOIOutputState["e_separated"] = 4] = "e_separated"; - })(TOIOutputState || (TOIOutputState = {})); - /** - * Output parameters for TimeOfImpact. - */ - var TOIOutput = /** @class */ (function () { - function TOIOutput() { - } - return TOIOutput; - }()); - stats$1.toiTime = 0; - stats$1.toiMaxTime = 0; - stats$1.toiCalls = 0; - stats$1.toiIters = 0; - stats$1.toiMaxIters = 0; - stats$1.toiRootIters = 0; - stats$1.toiMaxRootIters = 0; - /** - * Compute the upper bound on time before two shapes penetrate. Time is - * represented as a fraction between [0,tMax]. This uses a swept separating axis - * and may miss some intermediate, non-tunneling collision. If you change the - * time interval, you should call this function again. - * - * Note: use Distance to compute the contact point and normal at the time of - * impact. - * - * CCD via the local separating axis method. This seeks progression by computing - * the largest time at which separation is maintained. - */ - function TimeOfImpact(output, input) { - var timer = Timer.now(); - ++stats$1.toiCalls; - output.state = TOIOutputState.e_unknown; - output.t = input.tMax; - var proxyA = input.proxyA; // DistanceProxy - var proxyB = input.proxyB; // DistanceProxy - var sweepA = input.sweepA; // Sweep - var sweepB = input.sweepB; // Sweep - // Large rotations can make the root finder fail, so we normalize the - // sweep angles. - sweepA.normalize(); - sweepB.normalize(); - var tMax = input.tMax; - var totalRadius = proxyA.m_radius + proxyB.m_radius; - var target = math$1.max(Settings.linearSlop, totalRadius - 3.0 * Settings.linearSlop); - var tolerance = 0.25 * Settings.linearSlop; - var t1 = 0.0; - var k_maxIterations = Settings.maxTOIIterations; - var iter = 0; - // Prepare input for distance query. - var cache = new SimplexCache(); - var distanceInput = new DistanceInput(); - distanceInput.proxyA = input.proxyA; - distanceInput.proxyB = input.proxyB; - distanceInput.useRadii = false; - // The outer loop progressively attempts to compute new separating axes. - // This loop terminates when an axis is repeated (no progress is made). - while (true) { - var xfA = Transform.identity(); - var xfB = Transform.identity(); - sweepA.getTransform(xfA, t1); - sweepB.getTransform(xfB, t1); - // Get the distance between shapes. We can also use the results - // to get a separating axis. - distanceInput.transformA = xfA; - distanceInput.transformB = xfB; - var distanceOutput = new DistanceOutput(); - Distance(distanceOutput, cache, distanceInput); - // If the shapes are overlapped, we give up on continuous collision. - if (distanceOutput.distance <= 0.0) { - // Failure! - output.state = TOIOutputState.e_overlapped; - output.t = 0.0; - break; - } - if (distanceOutput.distance < target + tolerance) { - // Victory! - output.state = TOIOutputState.e_touching; - output.t = t1; - break; - } - // Initialize the separating axis. - var fcn = new SeparationFunction(); - fcn.initialize(cache, proxyA, sweepA, proxyB, sweepB, t1); - // if (false) { - // // Dump the curve seen by the root finder - // const N = 100; - // const dx = 1.0 / N; - // const xs = []; // [ N + 1 ]; - // const fs = []; // [ N + 1 ]; - // const x = 0.0; - // for (const i = 0; i <= N; ++i) { - // sweepA.getTransform(xfA, x); - // sweepB.getTransform(xfB, x); - // const f = fcn.evaluate(xfA, xfB) - target; - // printf("%g %g\n", x, f); - // xs[i] = x; - // fs[i] = f; - // x += dx; - // } - // } - // Compute the TOI on the separating axis. We do this by successively - // resolving the deepest point. This loop is bounded by the number of - // vertices. - var done = false; - var t2 = tMax; - var pushBackIter = 0; - while (true) { - // Find the deepest point at t2. Store the witness point indices. - var s2 = fcn.findMinSeparation(t2); - // const indexA = fcn.indexA; - // const indexB = fcn.indexB; - // Is the final configuration separated? - if (s2 > target + tolerance) { - // Victory! - output.state = TOIOutputState.e_separated; - output.t = tMax; - done = true; - break; - } - // Has the separation reached tolerance? - if (s2 > target - tolerance) { - // Advance the sweeps - t1 = t2; - break; - } - // Compute the initial separation of the witness points. - var s1 = fcn.evaluate(t1); - // const indexA = fcn.indexA; - // const indexB = fcn.indexB; - // Check for initial overlap. This might happen if the root finder - // runs out of iterations. - if (s1 < target - tolerance) { - output.state = TOIOutputState.e_failed; - output.t = t1; - done = true; - break; - } - // Check for touching - if (s1 <= target + tolerance) { - // Victory! t1 should hold the TOI (could be 0.0). - output.state = TOIOutputState.e_touching; - output.t = t1; - done = true; - break; - } - // Compute 1D root of: f(x) - target = 0 - var rootIterCount = 0; - var a1 = t1; - var a2 = t2; - while (true) { - // Use a mix of the secant rule and bisection. - var t = void 0; - if (rootIterCount & 1) { - // Secant rule to improve convergence. - t = a1 + (target - s1) * (a2 - a1) / (s2 - s1); - } - else { - // Bisection to guarantee progress. - t = 0.5 * (a1 + a2); - } - ++rootIterCount; - ++stats$1.toiRootIters; - var s = fcn.evaluate(t); - fcn.indexA; - fcn.indexB; - if (math$1.abs(s - target) < tolerance) { - // t2 holds a tentative value for t1 - t2 = t; - break; - } - // Ensure we continue to bracket the root. - if (s > target) { - a1 = t; - s1 = s; - } - else { - a2 = t; - s2 = s; - } - if (rootIterCount === 50) { - break; - } - } - stats$1.toiMaxRootIters = math$1.max(stats$1.toiMaxRootIters, rootIterCount); - ++pushBackIter; - if (pushBackIter === Settings.maxPolygonVertices) { - break; - } - } - ++iter; - ++stats$1.toiIters; - if (done) { - break; - } - if (iter === k_maxIterations) { - // Root finder got stuck. Semi-victory. - output.state = TOIOutputState.e_failed; - output.t = t1; - break; - } + /** + * Get the parent body of this fixture. This is null if the fixture is not + * attached. + */ + Fixture.prototype.getBody = function () { + return this.m_body; + }; + /** + * Get the next fixture in the parent body's fixture list. + */ + Fixture.prototype.getNext = function () { + return this.m_next; + }; + /** + * Get the density of this fixture. + */ + Fixture.prototype.getDensity = function () { + return this.m_density; + }; + /** + * Set the density of this fixture. This will _not_ automatically adjust the + * mass of the body. You must call Body.resetMassData to update the body's mass. + */ + Fixture.prototype.setDensity = function (density) { + this.m_density = density; + }; + /** + * Get the coefficient of friction, usually in the range [0,1]. + */ + Fixture.prototype.getFriction = function () { + return this.m_friction; + }; + /** + * Set the coefficient of friction. This will not change the friction of + * existing contacts. + */ + Fixture.prototype.setFriction = function (friction) { + this.m_friction = friction; + }; + /** + * Get the coefficient of restitution. + */ + Fixture.prototype.getRestitution = function () { + return this.m_restitution; + }; + /** + * Set the coefficient of restitution. This will not change the restitution of + * existing contacts. + */ + Fixture.prototype.setRestitution = function (restitution) { + this.m_restitution = restitution; + }; + /** + * Test a point in world coordinates for containment in this fixture. + */ + Fixture.prototype.testPoint = function (p) { + return this.m_shape.testPoint(this.m_body.getTransform(), p); + }; + /** + * Cast a ray against this shape. + */ + Fixture.prototype.rayCast = function (output, input, childIndex) { + return this.m_shape.rayCast(output, input, this.m_body.getTransform(), childIndex); + }; + /** + * Get the mass data for this fixture. The mass data is based on the density and + * the shape. The rotational inertia is about the shape's origin. This operation + * may be expensive. + */ + Fixture.prototype.getMassData = function (massData) { + this.m_shape.computeMass(massData, this.m_density); + }; + /** + * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a + * more accurate AABB, compute it using the shape and the body transform. + */ + Fixture.prototype.getAABB = function (childIndex) { + return this.m_proxies[childIndex].aabb; + }; + /** + * These support body activation/deactivation. + */ + Fixture.prototype.createProxies = function (broadPhase, xf) { + // Create proxies in the broad-phase. + this.m_proxyCount = this.m_shape.getChildCount(); + for (var i = 0; i < this.m_proxyCount; ++i) { + var proxy = this.m_proxies[i]; + this.m_shape.computeAABB(proxy.aabb, xf, i); + proxy.proxyId = broadPhase.createProxy(proxy.aabb, proxy); + } + }; + Fixture.prototype.destroyProxies = function (broadPhase) { + // Destroy proxies in the broad-phase. + for (var i = 0; i < this.m_proxyCount; ++i) { + var proxy = this.m_proxies[i]; + broadPhase.destroyProxy(proxy.proxyId); + proxy.proxyId = null; + } + this.m_proxyCount = 0; + }; + /** + * Updates this fixture proxy in broad-phase (with combined AABB of current and + * next transformation). + */ + Fixture.prototype.synchronize = function (broadPhase, xf1, xf2) { + for (var i = 0; i < this.m_proxyCount; ++i) { + var proxy = this.m_proxies[i]; + // Compute an AABB that covers the swept shape (may miss some rotation + // effect). + var aabb1 = new AABB(); + var aabb2 = new AABB(); + this.m_shape.computeAABB(aabb1, xf1, proxy.childIndex); + this.m_shape.computeAABB(aabb2, xf2, proxy.childIndex); + proxy.aabb.combine(aabb1, aabb2); + var displacement = Vec2.sub(xf2.p, xf1.p); + broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement); + } + }; + /** + * Set the contact filtering data. This will not update contacts until the next + * time step when either parent body is active and awake. This automatically + * calls refilter. + */ + Fixture.prototype.setFilterData = function (filter) { + this.m_filterGroupIndex = filter.groupIndex; + this.m_filterCategoryBits = filter.categoryBits; + this.m_filterMaskBits = filter.maskBits; + this.refilter(); + }; + Fixture.prototype.getFilterGroupIndex = function () { + return this.m_filterGroupIndex; + }; + Fixture.prototype.setFilterGroupIndex = function (groupIndex) { + this.m_filterGroupIndex = groupIndex; + }; + Fixture.prototype.getFilterCategoryBits = function () { + return this.m_filterCategoryBits; + }; + Fixture.prototype.setFilterCategoryBits = function (categoryBits) { + this.m_filterCategoryBits = categoryBits; + }; + Fixture.prototype.getFilterMaskBits = function () { + return this.m_filterMaskBits; + }; + Fixture.prototype.setFilterMaskBits = function (maskBits) { + this.m_filterMaskBits = maskBits; + }; + /** + * Call this if you want to establish collision that was previously disabled by + * ContactFilter. + */ + Fixture.prototype.refilter = function () { + if (this.m_body == null) { + return; } - stats$1.toiMaxIters = math$1.max(stats$1.toiMaxIters, iter); - var time = Timer.diff(timer); - stats$1.toiMaxTime = math$1.max(stats$1.toiMaxTime, time); - stats$1.toiTime += time; - } - var SeparationFunctionType; - (function (SeparationFunctionType) { - SeparationFunctionType[SeparationFunctionType["e_points"] = 1] = "e_points"; - SeparationFunctionType[SeparationFunctionType["e_faceA"] = 2] = "e_faceA"; - SeparationFunctionType[SeparationFunctionType["e_faceB"] = 3] = "e_faceB"; - })(SeparationFunctionType || (SeparationFunctionType = {})); - var SeparationFunction = /** @class */ (function () { - function SeparationFunction() { - this.m_proxyA = new DistanceProxy(); - this.m_proxyB = new DistanceProxy(); - this.m_localPoint = Vec2.zero(); - this.m_axis = Vec2.zero(); - } - // TODO_ERIN might not need to return the separation - SeparationFunction.prototype.initialize = function (cache, proxyA, sweepA, proxyB, sweepB, t1) { - this.m_proxyA = proxyA; - this.m_proxyB = proxyB; - var count = cache.count; - this.m_sweepA = sweepA; - this.m_sweepB = sweepB; - var xfA = Transform.identity(); - var xfB = Transform.identity(); - this.m_sweepA.getTransform(xfA, t1); - this.m_sweepB.getTransform(xfB, t1); - if (count === 1) { - this.m_type = SeparationFunctionType.e_points; - var localPointA = this.m_proxyA.getVertex(cache.indexA[0]); - var localPointB = this.m_proxyB.getVertex(cache.indexB[0]); - var pointA = Transform.mulVec2(xfA, localPointA); - var pointB = Transform.mulVec2(xfB, localPointB); - this.m_axis.setCombine(1, pointB, -1, pointA); - var s = this.m_axis.normalize(); - return s; - } - else if (cache.indexA[0] === cache.indexA[1]) { - // Two points on B and one on A. - this.m_type = SeparationFunctionType.e_faceB; - var localPointB1 = proxyB.getVertex(cache.indexB[0]); - var localPointB2 = proxyB.getVertex(cache.indexB[1]); - this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointB2, localPointB1), 1.0); - this.m_axis.normalize(); - var normal = Rot.mulVec2(xfB.q, this.m_axis); - this.m_localPoint = Vec2.mid(localPointB1, localPointB2); - var pointB = Transform.mulVec2(xfB, this.m_localPoint); - var localPointA = proxyA.getVertex(cache.indexA[0]); - var pointA = Transform.mulVec2(xfA, localPointA); - var s = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal); - if (s < 0.0) { - this.m_axis = Vec2.neg(this.m_axis); - s = -s; - } - return s; - } - else { - // Two points on A and one or two points on B. - this.m_type = SeparationFunctionType.e_faceA; - var localPointA1 = this.m_proxyA.getVertex(cache.indexA[0]); - var localPointA2 = this.m_proxyA.getVertex(cache.indexA[1]); - this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointA2, localPointA1), 1.0); - this.m_axis.normalize(); - var normal = Rot.mulVec2(xfA.q, this.m_axis); - this.m_localPoint = Vec2.mid(localPointA1, localPointA2); - var pointA = Transform.mulVec2(xfA, this.m_localPoint); - var localPointB = this.m_proxyB.getVertex(cache.indexB[0]); - var pointB = Transform.mulVec2(xfB, localPointB); - var s = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal); - if (s < 0.0) { - this.m_axis = Vec2.neg(this.m_axis); - s = -s; - } - return s; - } - }; - SeparationFunction.prototype.compute = function (find, t) { - // It was findMinSeparation and evaluate - var xfA = Transform.identity(); - var xfB = Transform.identity(); - this.m_sweepA.getTransform(xfA, t); - this.m_sweepB.getTransform(xfB, t); - switch (this.m_type) { - case SeparationFunctionType.e_points: { - if (find) { - var axisA = Rot.mulTVec2(xfA.q, this.m_axis); - var axisB = Rot.mulTVec2(xfB.q, Vec2.neg(this.m_axis)); - this.indexA = this.m_proxyA.getSupport(axisA); - this.indexB = this.m_proxyB.getSupport(axisB); - } - var localPointA = this.m_proxyA.getVertex(this.indexA); - var localPointB = this.m_proxyB.getVertex(this.indexB); - var pointA = Transform.mulVec2(xfA, localPointA); - var pointB = Transform.mulVec2(xfB, localPointB); - var sep = Vec2.dot(pointB, this.m_axis) - Vec2.dot(pointA, this.m_axis); - return sep; - } - case SeparationFunctionType.e_faceA: { - var normal = Rot.mulVec2(xfA.q, this.m_axis); - var pointA = Transform.mulVec2(xfA, this.m_localPoint); - if (find) { - var axisB = Rot.mulTVec2(xfB.q, Vec2.neg(normal)); - this.indexA = -1; - this.indexB = this.m_proxyB.getSupport(axisB); - } - var localPointB = this.m_proxyB.getVertex(this.indexB); - var pointB = Transform.mulVec2(xfB, localPointB); - var sep = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal); - return sep; - } - case SeparationFunctionType.e_faceB: { - var normal = Rot.mulVec2(xfB.q, this.m_axis); - var pointB = Transform.mulVec2(xfB, this.m_localPoint); - if (find) { - var axisA = Rot.mulTVec2(xfA.q, Vec2.neg(normal)); - this.indexB = -1; - this.indexA = this.m_proxyA.getSupport(axisA); - } - var localPointA = this.m_proxyA.getVertex(this.indexA); - var pointA = Transform.mulVec2(xfA, localPointA); - var sep = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal); - return sep; - } - default: - if (find) { - this.indexA = -1; - this.indexB = -1; - } - return 0.0; - } - }; - SeparationFunction.prototype.findMinSeparation = function (t) { - return this.compute(true, t); - }; - SeparationFunction.prototype.evaluate = function (t) { - return this.compute(false, t); - }; - return SeparationFunction; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + // Flag associated contacts for filtering. + var edge = this.m_body.getContactList(); + while (edge) { + var contact = edge.contact; + var fixtureA = contact.getFixtureA(); + var fixtureB = contact.getFixtureB(); + if (fixtureA == this || fixtureB == this) { + contact.flagForFiltering(); + } + edge = edge.next; + } + var world = this.m_body.getWorld(); + if (world == null) { + return; + } + // Touch each proxy so that new pairs may be created + var broadPhase = world.m_broadPhase; + for (var i = 0; i < this.m_proxyCount; ++i) { + broadPhase.touchProxy(this.m_proxies[i].proxyId); + } + }; + /** + * Implement this method to provide collision filtering, if you want finer + * control over contact creation. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * Return true if contact calculations should be performed between these two + * fixtures. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var TimeStep = /** @class */ (function () { - function TimeStep() { - /** time step */ - this.dt = 0; - /** inverse time step (0 if dt == 0) */ - this.inv_dt = 0; - this.velocityIterations = 0; - this.positionIterations = 0; - this.warmStarting = false; - this.blockSolve = true; - /** timestep ratio for variable timestep */ - this.inv_dt0 = 0.0; - /** dt * inv_dt0 */ - this.dtRatio = 1; - } - TimeStep.prototype.reset = function (dt) { - if (this.dt > 0.0) { - this.inv_dt0 = this.inv_dt; - } - this.dt = dt; - this.inv_dt = dt == 0 ? 0 : 1 / dt; - this.dtRatio = dt * this.inv_dt0; - }; - return TimeStep; - }()); - // reuse - var s_subStep = new TimeStep(); - /** - * Contact impulses for reporting. Impulses are used instead of forces because - * sub-step forces may approach infinity for rigid body collisions. These match - * up one-to-one with the contact points in Manifold. - */ - var ContactImpulse = /** @class */ (function () { - function ContactImpulse(contact) { - this.contact = contact; - this.normals = []; - this.tangents = []; - } - Object.defineProperty(ContactImpulse.prototype, "normalImpulses", { - get: function () { - var contact = this.contact; - var normals = this.normals; - normals.length = 0; - for (var p = 0; p < contact.v_points.length; ++p) { - normals.push(contact.v_points[p].normalImpulse); - } - return normals; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(ContactImpulse.prototype, "tangentImpulses", { - get: function () { - var contact = this.contact; - var tangents = this.tangents; - tangents.length = 0; - for (var p = 0; p < contact.v_points.length; ++p) { - tangents.push(contact.v_points[p].tangentImpulse); - } - return tangents; - }, - enumerable: false, - configurable: true - }); - return ContactImpulse; - }()); - /** - * Finds and solves islands. An island is a connected subset of the world. - */ - var Solver = /** @class */ (function () { - function Solver(world) { - this.m_world = world; - this.m_stack = []; - this.m_bodies = []; - this.m_contacts = []; - this.m_joints = []; - } - Solver.prototype.clear = function () { - this.m_stack.length = 0; - this.m_bodies.length = 0; - this.m_contacts.length = 0; - this.m_joints.length = 0; - }; - Solver.prototype.addBody = function (body) { - this.m_bodies.push(body); - // why? - // body.c_position.c.setZero(); - // body.c_position.a = 0; - // body.c_velocity.v.setZero(); - // body.c_velocity.w = 0; - }; - Solver.prototype.addContact = function (contact) { - this.m_contacts.push(contact); - }; - Solver.prototype.addJoint = function (joint) { - this.m_joints.push(joint); - }; - Solver.prototype.solveWorld = function (step) { - var world = this.m_world; - // Clear all the island flags. - for (var b = world.m_bodyList; b; b = b.m_next) { - b.m_islandFlag = false; - } - for (var c = world.m_contactList; c; c = c.m_next) { - c.m_islandFlag = false; - } - for (var j = world.m_jointList; j; j = j.m_next) { - j.m_islandFlag = false; - } - // Build and simulate all awake islands. - var stack = this.m_stack; - for (var seed = world.m_bodyList; seed; seed = seed.m_next) { - if (seed.m_islandFlag) { - continue; - } - if (seed.isAwake() == false || seed.isActive() == false) { - continue; - } - // The seed can be dynamic or kinematic. - if (seed.isStatic()) { - continue; - } - // Reset island and stack. - this.clear(); - stack.push(seed); - seed.m_islandFlag = true; - // Perform a depth first search (DFS) on the constraint graph. - while (stack.length > 0) { - // Grab the next body off the stack and add it to the island. - var b = stack.pop(); - this.addBody(b); - // Make sure the body is awake. - b.setAwake(true); - // To keep islands as small as possible, we don't - // propagate islands across static bodies. - if (b.isStatic()) { - continue; - } - // Search all contacts connected to this body. - for (var ce = b.m_contactList; ce; ce = ce.next) { - var contact = ce.contact; - // Has this contact already been added to an island? - if (contact.m_islandFlag) { - continue; - } - // Is this contact solid and touching? - if (contact.isEnabled() == false || contact.isTouching() == false) { - continue; - } - // Skip sensors. - var sensorA = contact.m_fixtureA.m_isSensor; - var sensorB = contact.m_fixtureB.m_isSensor; - if (sensorA || sensorB) { - continue; - } - this.addContact(contact); - contact.m_islandFlag = true; - var other = ce.other; - // Was the other body already added to this island? - if (other.m_islandFlag) { - continue; - } - // _ASSERT && common.assert(stack.length < world.m_bodyCount); - stack.push(other); - other.m_islandFlag = true; - } - // Search all joints connect to this body. - for (var je = b.m_jointList; je; je = je.next) { - if (je.joint.m_islandFlag == true) { - continue; - } - var other = je.other; - // Don't simulate joints connected to inactive bodies. - if (other.isActive() == false) { - continue; - } - this.addJoint(je.joint); - je.joint.m_islandFlag = true; - if (other.m_islandFlag) { - continue; - } - // _ASSERT && common.assert(stack.length < world.m_bodyCount); - stack.push(other); - other.m_islandFlag = true; - } - } - this.solveIsland(step); - // Post solve cleanup. - for (var i = 0; i < this.m_bodies.length; ++i) { - // Allow static bodies to participate in other islands. - // TODO: are they added at all? - var b = this.m_bodies[i]; - if (b.isStatic()) { - b.m_islandFlag = false; - } - } - } - }; - Solver.prototype.solveIsland = function (step) { - // B2: Island Solve - var world = this.m_world; - var gravity = world.m_gravity; - var allowSleep = world.m_allowSleep; - var h = step.dt; - // Integrate velocities and apply damping. Initialize the body state. - for (var i = 0; i < this.m_bodies.length; ++i) { - var body = this.m_bodies[i]; - var c = Vec2.clone(body.m_sweep.c); - var a = body.m_sweep.a; - var v = Vec2.clone(body.m_linearVelocity); - var w = body.m_angularVelocity; - // Store positions for continuous collision. - body.m_sweep.c0.setVec2(body.m_sweep.c); - body.m_sweep.a0 = body.m_sweep.a; - if (body.isDynamic()) { - // Integrate velocities. - v.addMul(h * body.m_gravityScale, gravity); - v.addMul(h * body.m_invMass, body.m_force); - w += h * body.m_invI * body.m_torque; - /** - *
-                     * Apply damping.
-                     * ODE: dv/dt + c * v = 0
-                     * Solution: v(t) = v0 * exp(-c * t)
-                     * Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)
-                     * v2 = exp(-c * dt) * v1
-                     * Pade approximation:
-                     * v2 = v1 * 1 / (1 + c * dt)
-                     * 
- */ - v.mul(1.0 / (1.0 + h * body.m_linearDamping)); - w *= 1.0 / (1.0 + h * body.m_angularDamping); - } - body.c_position.c = c; - body.c_position.a = a; - body.c_velocity.v = v; - body.c_velocity.w = w; - } - for (var i = 0; i < this.m_contacts.length; ++i) { - var contact = this.m_contacts[i]; - contact.initConstraint(step); - } - for (var i = 0; i < this.m_contacts.length; ++i) { - var contact = this.m_contacts[i]; - contact.initVelocityConstraint(step); - } - if (step.warmStarting) { - // Warm start. - for (var i = 0; i < this.m_contacts.length; ++i) { - var contact = this.m_contacts[i]; - contact.warmStartConstraint(step); - } - } - for (var i = 0; i < this.m_joints.length; ++i) { - var joint = this.m_joints[i]; - joint.initVelocityConstraints(step); - } - // Solve velocity constraints - for (var i = 0; i < step.velocityIterations; ++i) { - for (var j = 0; j < this.m_joints.length; ++j) { - var joint = this.m_joints[j]; - joint.solveVelocityConstraints(step); - } - for (var j = 0; j < this.m_contacts.length; ++j) { - var contact = this.m_contacts[j]; - contact.solveVelocityConstraint(step); - } - } - // Store impulses for warm starting - for (var i = 0; i < this.m_contacts.length; ++i) { - var contact = this.m_contacts[i]; - contact.storeConstraintImpulses(step); - } - // Integrate positions - for (var i = 0; i < this.m_bodies.length; ++i) { - var body = this.m_bodies[i]; - var c = Vec2.clone(body.c_position.c); - var a = body.c_position.a; - var v = Vec2.clone(body.c_velocity.v); - var w = body.c_velocity.w; - // Check for large velocities - var translation = Vec2.mulNumVec2(h, v); - if (Vec2.lengthSquared(translation) > Settings.maxTranslationSquared) { - var ratio = Settings.maxTranslation / translation.length(); - v.mul(ratio); - } - var rotation = h * w; - if (rotation * rotation > Settings.maxRotationSquared) { - var ratio = Settings.maxRotation / math$1.abs(rotation); - w *= ratio; - } - // Integrate - c.addMul(h, v); - a += h * w; - body.c_position.c.setVec2(c); - body.c_position.a = a; - body.c_velocity.v.setVec2(v); - body.c_velocity.w = w; - } - // Solve position constraints - var positionSolved = false; - for (var i = 0; i < step.positionIterations; ++i) { - var minSeparation = 0.0; - for (var j = 0; j < this.m_contacts.length; ++j) { - var contact = this.m_contacts[j]; - var separation = contact.solvePositionConstraint(step); - minSeparation = math$1.min(minSeparation, separation); - } - // We can't expect minSpeparation >= -Settings.linearSlop because we don't - // push the separation above -Settings.linearSlop. - var contactsOkay = minSeparation >= -3.0 * Settings.linearSlop; - var jointsOkay = true; - for (var j = 0; j < this.m_joints.length; ++j) { - var joint = this.m_joints[j]; - var jointOkay = joint.solvePositionConstraints(step); - jointsOkay = jointsOkay && jointOkay; - } - if (contactsOkay && jointsOkay) { - // Exit early if the position errors are small. - positionSolved = true; - break; - } - } - // Copy state buffers back to the bodies - for (var i = 0; i < this.m_bodies.length; ++i) { - var body = this.m_bodies[i]; - body.m_sweep.c.setVec2(body.c_position.c); - body.m_sweep.a = body.c_position.a; - body.m_linearVelocity.setVec2(body.c_velocity.v); - body.m_angularVelocity = body.c_velocity.w; - body.synchronizeTransform(); - } - this.postSolveIsland(); - if (allowSleep) { - var minSleepTime = Infinity; - var linTolSqr = Settings.linearSleepToleranceSqr; - var angTolSqr = Settings.angularSleepToleranceSqr; - for (var i = 0; i < this.m_bodies.length; ++i) { - var body = this.m_bodies[i]; - if (body.isStatic()) { - continue; - } - if ((body.m_autoSleepFlag == false) - || (body.m_angularVelocity * body.m_angularVelocity > angTolSqr) - || (Vec2.lengthSquared(body.m_linearVelocity) > linTolSqr)) { - body.m_sleepTime = 0.0; - minSleepTime = 0.0; - } - else { - body.m_sleepTime += h; - minSleepTime = math$1.min(minSleepTime, body.m_sleepTime); - } - } - if (minSleepTime >= Settings.timeToSleep && positionSolved) { - for (var i = 0; i < this.m_bodies.length; ++i) { - var body = this.m_bodies[i]; - body.setAwake(false); - } - } - } - }; - /** @internal */ - Solver.prototype.printBodies = function (tag) { - for (var i = 0; i < this.m_bodies.length; ++i) { - var b = this.m_bodies[i]; - common.debug(tag, b.c_position.a, b.c_position.c.x, b.c_position.c.y, b.c_velocity.w, b.c_velocity.v.x, b.c_velocity.v.y); - } - }; - /** - * Find TOI contacts and solve them. - */ - Solver.prototype.solveWorldTOI = function (step) { - var world = this.m_world; - if (world.m_stepComplete) { - for (var b = world.m_bodyList; b; b = b.m_next) { - b.m_islandFlag = false; - b.m_sweep.alpha0 = 0.0; - } - for (var c = world.m_contactList; c; c = c.m_next) { - // Invalidate TOI - c.m_toiFlag = false; - c.m_islandFlag = false; - c.m_toiCount = 0; - c.m_toi = 1.0; - } - } - // Find TOI events and solve them. - while (true) { - // Find the first TOI. - var minContact = null; // Contact - var minAlpha = 1.0; - for (var c = world.m_contactList; c; c = c.m_next) { - // Is this contact disabled? - if (c.isEnabled() == false) { - continue; - } - // Prevent excessive sub-stepping. - if (c.m_toiCount > Settings.maxSubSteps) { - continue; - } - var alpha = 1.0; - if (c.m_toiFlag) { - // This contact has a valid cached TOI. - alpha = c.m_toi; - } - else { - var fA_1 = c.getFixtureA(); - var fB_1 = c.getFixtureB(); - // Is there a sensor? - if (fA_1.isSensor() || fB_1.isSensor()) { - continue; - } - var bA_1 = fA_1.getBody(); - var bB_1 = fB_1.getBody(); - var activeA = bA_1.isAwake() && !bA_1.isStatic(); - var activeB = bB_1.isAwake() && !bB_1.isStatic(); - // Is at least one body active (awake and dynamic or kinematic)? - if (activeA == false && activeB == false) { - continue; - } - var collideA = bA_1.isBullet() || !bA_1.isDynamic(); - var collideB = bB_1.isBullet() || !bB_1.isDynamic(); - // Are these two non-bullet dynamic bodies? - if (collideA == false && collideB == false) { - continue; - } - // Compute the TOI for this contact. - // Put the sweeps onto the same time interval. - var alpha0 = bA_1.m_sweep.alpha0; - if (bA_1.m_sweep.alpha0 < bB_1.m_sweep.alpha0) { - alpha0 = bB_1.m_sweep.alpha0; - bA_1.m_sweep.advance(alpha0); - } - else if (bB_1.m_sweep.alpha0 < bA_1.m_sweep.alpha0) { - alpha0 = bA_1.m_sweep.alpha0; - bB_1.m_sweep.advance(alpha0); - } - var indexA = c.getChildIndexA(); - var indexB = c.getChildIndexB(); - bA_1.m_sweep; - bB_1.m_sweep; - // Compute the time of impact in interval [0, minTOI] - var input = new TOIInput(); // TODO: reuse - input.proxyA.set(fA_1.getShape(), indexA); - input.proxyB.set(fB_1.getShape(), indexB); - input.sweepA.set(bA_1.m_sweep); - input.sweepB.set(bB_1.m_sweep); - input.tMax = 1.0; - var output = new TOIOutput(); // TODO: reuse - TimeOfImpact(output, input); - // Beta is the fraction of the remaining portion of the [time?]. - var beta = output.t; - if (output.state == TOIOutputState.e_touching) { - alpha = math$1.min(alpha0 + (1.0 - alpha0) * beta, 1.0); - } - else { - alpha = 1.0; - } - c.m_toi = alpha; - c.m_toiFlag = true; - } - if (alpha < minAlpha) { - // This is the minimum TOI found so far. - minContact = c; - minAlpha = alpha; - } - } - if (minContact == null || 1.0 - 10.0 * math$1.EPSILON < minAlpha) { - // No more TOI events. Done! - world.m_stepComplete = true; - break; - } - // Advance the bodies to the TOI. - var fA = minContact.getFixtureA(); - var fB = minContact.getFixtureB(); - var bA = fA.getBody(); - var bB = fB.getBody(); - var backup1 = bA.m_sweep.clone(); - var backup2 = bB.m_sweep.clone(); - bA.advance(minAlpha); - bB.advance(minAlpha); - // The TOI contact likely has some new contact points. - minContact.update(world); - minContact.m_toiFlag = false; - ++minContact.m_toiCount; - // Is the contact solid? - if (minContact.isEnabled() == false || minContact.isTouching() == false) { - // Restore the sweeps. - minContact.setEnabled(false); - bA.m_sweep.set(backup1); - bB.m_sweep.set(backup2); - bA.synchronizeTransform(); - bB.synchronizeTransform(); - continue; - } - bA.setAwake(true); - bB.setAwake(true); - // Build the island - this.clear(); - this.addBody(bA); - this.addBody(bB); - this.addContact(minContact); - bA.m_islandFlag = true; - bB.m_islandFlag = true; - minContact.m_islandFlag = true; - // Get contacts on bodyA and bodyB. - var bodies = [bA, bB]; - for (var i = 0; i < bodies.length; ++i) { - var body = bodies[i]; - if (body.isDynamic()) { - for (var ce = body.m_contactList; ce; ce = ce.next) { - // if (this.m_bodyCount == this.m_bodyCapacity) { break; } - // if (this.m_contactCount == this.m_contactCapacity) { break; } - var contact = ce.contact; - // Has this contact already been added to the island? - if (contact.m_islandFlag) { - continue; - } - // Only add if either is static, kinematic or bullet. - var other = ce.other; - if (other.isDynamic() && !body.isBullet() && !other.isBullet()) { - continue; - } - // Skip sensors. - var sensorA = contact.m_fixtureA.m_isSensor; - var sensorB = contact.m_fixtureB.m_isSensor; - if (sensorA || sensorB) { - continue; - } - // Tentatively advance the body to the TOI. - var backup = other.m_sweep.clone(); - if (other.m_islandFlag == false) { - other.advance(minAlpha); - } - // Update the contact points - contact.update(world); - // Was the contact disabled by the user? - // Are there contact points? - if (contact.isEnabled() == false || contact.isTouching() == false) { - other.m_sweep.set(backup); - other.synchronizeTransform(); - continue; - } - // Add the contact to the island - contact.m_islandFlag = true; - this.addContact(contact); - // Has the other body already been added to the island? - if (other.m_islandFlag) { - continue; - } - // Add the other body to the island. - other.m_islandFlag = true; - if (!other.isStatic()) { - other.setAwake(true); - } - this.addBody(other); - } - } - } - s_subStep.reset((1.0 - minAlpha) * step.dt); - s_subStep.dtRatio = 1.0; - s_subStep.positionIterations = 20; - s_subStep.velocityIterations = step.velocityIterations; - s_subStep.warmStarting = false; - this.solveIslandTOI(s_subStep, bA, bB); - // Reset island flags and synchronize broad-phase proxies. - for (var i = 0; i < this.m_bodies.length; ++i) { - var body = this.m_bodies[i]; - body.m_islandFlag = false; - if (!body.isDynamic()) { - continue; - } - body.synchronizeFixtures(); - // Invalidate all contact TOIs on this displaced body. - for (var ce = body.m_contactList; ce; ce = ce.next) { - ce.contact.m_toiFlag = false; - ce.contact.m_islandFlag = false; - } - } - // Commit fixture proxy movements to the broad-phase so that new contacts - // are created. - // Also, some contacts can be destroyed. - world.findNewContacts(); - if (world.m_subStepping) { - world.m_stepComplete = false; - break; - } - } - var b, c; - }; - Solver.prototype.solveIslandTOI = function (subStep, toiA, toiB) { - this.m_world; - // Initialize the body state. - for (var i = 0; i < this.m_bodies.length; ++i) { - var body = this.m_bodies[i]; - body.c_position.c.setVec2(body.m_sweep.c); - body.c_position.a = body.m_sweep.a; - body.c_velocity.v.setVec2(body.m_linearVelocity); - body.c_velocity.w = body.m_angularVelocity; - } - for (var i = 0; i < this.m_contacts.length; ++i) { - var contact = this.m_contacts[i]; - contact.initConstraint(subStep); - } - // Solve position constraints. - for (var i = 0; i < subStep.positionIterations; ++i) { - var minSeparation = 0.0; - for (var j = 0; j < this.m_contacts.length; ++j) { - var contact = this.m_contacts[j]; - var separation = contact.solvePositionConstraintTOI(subStep, toiA, toiB); - minSeparation = math$1.min(minSeparation, separation); - } - // We can't expect minSpeparation >= -Settings.linearSlop because we don't - // push the separation above -Settings.linearSlop. - var contactsOkay = minSeparation >= -1.5 * Settings.linearSlop; - if (contactsOkay) { - break; - } - } - var i, c; - // Leap of faith to new safe state. - toiA.m_sweep.c0.setVec2(toiA.c_position.c); - toiA.m_sweep.a0 = toiA.c_position.a; - toiB.m_sweep.c0.setVec2(toiB.c_position.c); - toiB.m_sweep.a0 = toiB.c_position.a; - // No warm starting is needed for TOI events because warm - // starting impulses were applied in the discrete solver. - for (var i = 0; i < this.m_contacts.length; ++i) { - var contact = this.m_contacts[i]; - contact.initVelocityConstraint(subStep); - } - // Solve velocity constraints. - for (var i = 0; i < subStep.velocityIterations; ++i) { - for (var j = 0; j < this.m_contacts.length; ++j) { - var contact = this.m_contacts[j]; - contact.solveVelocityConstraint(subStep); - } - } - // Don't store the TOI contact forces for warm starting - // because they can be quite large. - var h = subStep.dt; - // Integrate positions - for (var i = 0; i < this.m_bodies.length; ++i) { - var body = this.m_bodies[i]; - var c = Vec2.clone(body.c_position.c); - var a = body.c_position.a; - var v = Vec2.clone(body.c_velocity.v); - var w = body.c_velocity.w; - // Check for large velocities - var translation = Vec2.mulNumVec2(h, v); - if (Vec2.dot(translation, translation) > Settings.maxTranslationSquared) { - var ratio = Settings.maxTranslation / translation.length(); - v.mul(ratio); - } - var rotation = h * w; - if (rotation * rotation > Settings.maxRotationSquared) { - var ratio = Settings.maxRotation / math$1.abs(rotation); - w *= ratio; - } - // Integrate - c.addMul(h, v); - a += h * w; - body.c_position.c = c; - body.c_position.a = a; - body.c_velocity.v = v; - body.c_velocity.w = w; - // Sync bodies - body.m_sweep.c = c; - body.m_sweep.a = a; - body.m_linearVelocity = v; - body.m_angularVelocity = w; - body.synchronizeTransform(); - } - this.postSolveIsland(); - }; - /** @internal */ - Solver.prototype.postSolveIsland = function () { - for (var c = 0; c < this.m_contacts.length; ++c) { - var contact = this.m_contacts[c]; - this.m_world.postSolve(contact, contact.m_impulse); - } - }; - return Solver; - }()); + * Warning: for performance reasons this is only called when the AABBs begin to + * overlap. + */ + Fixture.prototype.shouldCollide = function (that) { + if (that.m_filterGroupIndex === this.m_filterGroupIndex && that.m_filterGroupIndex !== 0) { + return that.m_filterGroupIndex > 0; + } + var collideA = (that.m_filterMaskBits & this.m_filterCategoryBits) !== 0; + var collideB = (that.m_filterCategoryBits & this.m_filterMaskBits) !== 0; + var collide = collideA && collideB; + return collide; + }; + return Fixture; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var WorldDefDefault = { - gravity: Vec2.zero(), - allowSleep: true, - warmStarting: true, - continuousPhysics: true, - subStepping: false, - blockSolve: true, - velocityIterations: 8, - positionIterations: 3 - }; - var World = /** @class */ (function () { - /** - * @param def World definition or gravity vector. - */ - function World(def) { - var _this = this; - /** @internal */ - this.s_step = new TimeStep(); // reuse - /** - * @internal - * Callback for broad-phase. - */ - this.createContact = function (proxyA, proxyB) { - var fixtureA = proxyA.fixture; - var fixtureB = proxyB.fixture; - var indexA = proxyA.childIndex; - var indexB = proxyB.childIndex; - var bodyA = fixtureA.getBody(); - var bodyB = fixtureB.getBody(); - // Are the fixtures on the same body? - if (bodyA == bodyB) { - return; - } - // TODO_ERIN use a hash table to remove a potential bottleneck when both - // bodies have a lot of contacts. - // Does a contact already exist? - var edge = bodyB.getContactList(); // ContactEdge - while (edge) { - if (edge.other == bodyA) { - var fA = edge.contact.getFixtureA(); - var fB = edge.contact.getFixtureB(); - var iA = edge.contact.getChildIndexA(); - var iB = edge.contact.getChildIndexB(); - if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) { - // A contact already exists. - return; - } - if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) { - // A contact already exists. - return; - } - } - edge = edge.next; - } - if (bodyB.shouldCollide(bodyA) == false) { - return; - } - if (fixtureB.shouldCollide(fixtureA) == false) { - return; - } - // Call the factory. - var contact = Contact.create(fixtureA, indexA, fixtureB, indexB); - if (contact == null) { - return; - } - // Insert into the world. - contact.m_prev = null; - if (_this.m_contactList != null) { - contact.m_next = _this.m_contactList; - _this.m_contactList.m_prev = contact; - } - _this.m_contactList = contact; - ++_this.m_contactCount; - }; - if (!(this instanceof World)) { - return new World(def); - } - if (def && Vec2.isValid(def)) { - def = { gravity: def }; - } - def = options(def, WorldDefDefault); - this.m_solver = new Solver(this); - this.m_broadPhase = new BroadPhase(); - this.m_contactList = null; - this.m_contactCount = 0; - this.m_bodyList = null; - this.m_bodyCount = 0; - this.m_jointList = null; - this.m_jointCount = 0; - this.m_stepComplete = true; - this.m_allowSleep = def.allowSleep; - this.m_gravity = Vec2.clone(def.gravity); - this.m_clearForces = true; - this.m_newFixture = false; - this.m_locked = false; - // These are for debugging the solver. - this.m_warmStarting = def.warmStarting; - this.m_continuousPhysics = def.continuousPhysics; - this.m_subStepping = def.subStepping; - this.m_blockSolve = def.blockSolve; - this.m_velocityIterations = def.velocityIterations; - this.m_positionIterations = def.positionIterations; - this.m_t = 0; +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var STATIC = 'static'; +var KINEMATIC = 'kinematic'; +var DYNAMIC = 'dynamic'; +var BodyDefDefault = { + type: STATIC, + position: Vec2.zero(), + angle: 0.0, + linearVelocity: Vec2.zero(), + angularVelocity: 0.0, + linearDamping: 0.0, + angularDamping: 0.0, + fixedRotation: false, + bullet: false, + gravityScale: 1.0, + allowSleep: true, + awake: true, + active: true, + userData: null +}; +/** + * MassData This holds the mass data computed for a shape. + */ +var MassData = /** @class */ (function () { + function MassData() { + /** The mass of the shape, usually in kilograms. */ + this.mass = 0; + /** The position of the shape's centroid relative to the shape's origin. */ + this.center = Vec2.zero(); + /** The rotational inertia of the shape about the local origin. */ + this.I = 0; + } + return MassData; +}()); +/** + * A rigid body composed of one or more fixtures. + * + * To create a new Body use {@link World.createBody}. + */ +var Body = /** @class */ (function () { + /** @internal */ + function Body(world, def) { + def = options(def, BodyDefDefault); + this.m_world = world; + this.m_awakeFlag = def.awake; + this.m_autoSleepFlag = def.allowSleep; + this.m_bulletFlag = def.bullet; + this.m_fixedRotationFlag = def.fixedRotation; + this.m_activeFlag = def.active; + this.m_islandFlag = false; + this.m_toiFlag = false; + this.m_userData = def.userData; + this.m_type = def.type; + if (this.m_type == DYNAMIC) { + this.m_mass = 1.0; + this.m_invMass = 1.0; } - /** @internal */ - World.prototype._serialize = function () { - var bodies = []; - var joints = []; - for (var b = this.getBodyList(); b; b = b.getNext()) { - bodies.push(b); - } - for (var j = this.getJointList(); j; j = j.getNext()) { - // @ts-ignore - if (typeof j._serialize === 'function') { - joints.push(j); - } - } - return { - gravity: this.m_gravity, - bodies: bodies, - joints: joints, - }; - }; - /** @internal */ - World._deserialize = function (data, context, restore) { - if (!data) { - return new World(); - } - var world = new World(data.gravity); - if (data.bodies) { - for (var i = data.bodies.length - 1; i >= 0; i -= 1) { - world._addBody(restore(Body, data.bodies[i], world)); - } - } - if (data.joints) { - for (var i = data.joints.length - 1; i >= 0; i--) { - world.createJoint(restore(Joint, data.joints[i], world)); - } - } - return world; - }; - /** - * Get the world body list. With the returned body, use Body.getNext to get the - * next body in the world list. A null body indicates the end of the list. - * - * @return the head of the world body list. - */ - World.prototype.getBodyList = function () { - return this.m_bodyList; - }; - /** - * Get the world joint list. With the returned joint, use Joint.getNext to get - * the next joint in the world list. A null joint indicates the end of the list. - * - * @return the head of the world joint list. - */ - World.prototype.getJointList = function () { - return this.m_jointList; - }; - /** - * Get the world contact list. With the returned contact, use Contact.getNext to - * get the next contact in the world list. A null contact indicates the end of - * the list. - * - * Warning: contacts are created and destroyed in the middle of a time step. - * Use ContactListener to avoid missing contacts. - * - * @return the head of the world contact list. - */ - World.prototype.getContactList = function () { - return this.m_contactList; - }; - World.prototype.getBodyCount = function () { - return this.m_bodyCount; - }; - World.prototype.getJointCount = function () { - return this.m_jointCount; - }; - /** - * Get the number of contacts (each may have 0 or more contact points). - */ - World.prototype.getContactCount = function () { - return this.m_contactCount; - }; - /** - * Change the global gravity vector. - */ - World.prototype.setGravity = function (gravity) { - this.m_gravity = gravity; - }; - /** - * Get the global gravity vector. - */ - World.prototype.getGravity = function () { - return this.m_gravity; - }; - /** - * Is the world locked (in the middle of a time step). - */ - World.prototype.isLocked = function () { - return this.m_locked; - }; - /** - * Enable/disable sleep. - */ - World.prototype.setAllowSleeping = function (flag) { - if (flag == this.m_allowSleep) { - return; - } - this.m_allowSleep = flag; - if (this.m_allowSleep == false) { - for (var b = this.m_bodyList; b; b = b.m_next) { - b.setAwake(true); - } - } - }; - World.prototype.getAllowSleeping = function () { - return this.m_allowSleep; - }; - /** - * Enable/disable warm starting. For testing. - */ - World.prototype.setWarmStarting = function (flag) { - this.m_warmStarting = flag; - }; - World.prototype.getWarmStarting = function () { - return this.m_warmStarting; - }; - /** - * Enable/disable continuous physics. For testing. - */ - World.prototype.setContinuousPhysics = function (flag) { - this.m_continuousPhysics = flag; - }; - World.prototype.getContinuousPhysics = function () { - return this.m_continuousPhysics; - }; - /** - * Enable/disable single stepped continuous physics. For testing. - */ - World.prototype.setSubStepping = function (flag) { - this.m_subStepping = flag; - }; - World.prototype.getSubStepping = function () { - return this.m_subStepping; - }; - /** - * Set flag to control automatic clearing of forces after each time step. - */ - World.prototype.setAutoClearForces = function (flag) { - this.m_clearForces = flag; - }; - /** - * Get the flag that controls automatic clearing of forces after each time step. - */ - World.prototype.getAutoClearForces = function () { - return this.m_clearForces; - }; - /** - * Manually clear the force buffer on all bodies. By default, forces are cleared - * automatically after each call to step. The default behavior is modified by - * calling setAutoClearForces. The purpose of this function is to support - * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step - * under a variable frame-rate. When you perform sub-stepping you will disable - * auto clearing of forces and instead call clearForces after all sub-steps are - * complete in one pass of your game loop. - * - * See {@link World.setAutoClearForces} - */ - World.prototype.clearForces = function () { - for (var body = this.m_bodyList; body; body = body.getNext()) { - body.m_force.setZero(); - body.m_torque = 0.0; - } - }; - /** - * Query the world for all fixtures that potentially overlap the provided AABB. - * - * @param aabb The query box. - * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query. - */ - World.prototype.queryAABB = function (aabb, callback) { - var broadPhase = this.m_broadPhase; - this.m_broadPhase.query(aabb, function (proxyId) { - var proxy = broadPhase.getUserData(proxyId); - return callback(proxy.fixture); - }); - }; - /** - * Ray-cast the world for all fixtures in the path of the ray. Your callback - * controls whether you get the closest point, any point, or n-points. The - * ray-cast ignores shapes that contain the starting point. - * - * @param point1 The ray starting point - * @param point2 The ray ending point - * @param callback A user implemented callback function. - */ - World.prototype.rayCast = function (point1, point2, callback) { - var broadPhase = this.m_broadPhase; - this.m_broadPhase.rayCast({ - maxFraction: 1.0, - p1: point1, - p2: point2 - }, function (input, proxyId) { - var proxy = broadPhase.getUserData(proxyId); - var fixture = proxy.fixture; - var index = proxy.childIndex; - // @ts-ignore - var output = {}; // TODO GC - var hit = fixture.rayCast(output, input, index); - if (hit) { - var fraction = output.fraction; - var point = Vec2.add(Vec2.mulNumVec2((1.0 - fraction), input.p1), Vec2.mulNumVec2(fraction, input.p2)); - return callback(fixture, point, output.normal, fraction); - } - return input.maxFraction; - }); - }; - /** - * Get the number of broad-phase proxies. - */ - World.prototype.getProxyCount = function () { - return this.m_broadPhase.getProxyCount(); - }; - /** - * Get the height of broad-phase dynamic tree. - */ - World.prototype.getTreeHeight = function () { - return this.m_broadPhase.getTreeHeight(); - }; - /** - * Get the balance of broad-phase dynamic tree. - */ - World.prototype.getTreeBalance = function () { - return this.m_broadPhase.getTreeBalance(); - }; - /** - * Get the quality metric of broad-phase dynamic tree. The smaller the better. - * The minimum is 1. - */ - World.prototype.getTreeQuality = function () { - return this.m_broadPhase.getTreeQuality(); - }; - /** - * Shift the world origin. Useful for large worlds. The body shift formula is: - * position -= newOrigin - * - * @param newOrigin The new origin with respect to the old origin - */ - World.prototype.shiftOrigin = function (newOrigin) { - if (this.m_locked) { - return; - } - for (var b = this.m_bodyList; b; b = b.m_next) { - b.m_xf.p.sub(newOrigin); - b.m_sweep.c0.sub(newOrigin); - b.m_sweep.c.sub(newOrigin); - } - for (var j = this.m_jointList; j; j = j.m_next) { - j.shiftOrigin(newOrigin); - } - this.m_broadPhase.shiftOrigin(newOrigin); - }; - /** - * @internal Used for deserialize. - */ - World.prototype._addBody = function (body) { - if (this.isLocked()) { - return; - } - // Add to world doubly linked list. - body.m_prev = null; - body.m_next = this.m_bodyList; - if (this.m_bodyList) { - this.m_bodyList.m_prev = body; - } - this.m_bodyList = body; - ++this.m_bodyCount; - }; - // tslint:disable-next-line:typedef - World.prototype.createBody = function (arg1, arg2) { - if (this.isLocked()) { - return null; - } - var def = {}; - if (!arg1) ; - else if (Vec2.isValid(arg1)) { - def = { position: arg1, angle: arg2 }; - } - else if (typeof arg1 === 'object') { - def = arg1; - } - var body = new Body(this, def); - this._addBody(body); - return body; - }; - // tslint:disable-next-line:typedef - World.prototype.createDynamicBody = function (arg1, arg2) { - var def = {}; - if (!arg1) ; - else if (Vec2.isValid(arg1)) { - def = { position: arg1, angle: arg2 }; - } - else if (typeof arg1 === 'object') { - def = arg1; - } - def.type = 'dynamic'; - return this.createBody(def); - }; - // tslint:disable-next-line:typedef - World.prototype.createKinematicBody = function (arg1, arg2) { - var def = {}; - if (!arg1) ; - else if (Vec2.isValid(arg1)) { - def = { position: arg1, angle: arg2 }; - } - else if (typeof arg1 === 'object') { - def = arg1; - } - def.type = 'kinematic'; - return this.createBody(def); - }; - /** - * Destroy a rigid body given a definition. No reference to the definition is - * retained. - * - * Warning: This automatically deletes all associated shapes and joints. - * - * Warning: This function is locked during callbacks. - */ - World.prototype.destroyBody = function (b) { - if (this.isLocked()) { - return; - } - if (b.m_destroyed) { - return false; - } - // Delete the attached joints. - var je = b.m_jointList; - while (je) { - var je0 = je; - je = je.next; - this.publish('remove-joint', je0.joint); - this.destroyJoint(je0.joint); - b.m_jointList = je; - } - b.m_jointList = null; - // Delete the attached contacts. - var ce = b.m_contactList; - while (ce) { - var ce0 = ce; - ce = ce.next; - this.destroyContact(ce0.contact); - b.m_contactList = ce; - } - b.m_contactList = null; - // Delete the attached fixtures. This destroys broad-phase proxies. - var f = b.m_fixtureList; - while (f) { - var f0 = f; - f = f.m_next; - this.publish('remove-fixture', f0); - f0.destroyProxies(this.m_broadPhase); - b.m_fixtureList = f; - } - b.m_fixtureList = null; - // Remove world body list. - if (b.m_prev) { - b.m_prev.m_next = b.m_next; - } - if (b.m_next) { - b.m_next.m_prev = b.m_prev; - } - if (b == this.m_bodyList) { - this.m_bodyList = b.m_next; - } - b.m_destroyed = true; - --this.m_bodyCount; - this.publish('remove-body', b); - return true; - }; - /** - * Create a joint to constrain bodies together. No reference to the definition - * is retained. This may cause the connected bodies to cease colliding. - * - * Warning: This function is locked during callbacks. - */ - World.prototype.createJoint = function (joint) { - if (this.isLocked()) { - return null; - } - // Connect to the world list. - joint.m_prev = null; - joint.m_next = this.m_jointList; - if (this.m_jointList) { - this.m_jointList.m_prev = joint; - } - this.m_jointList = joint; - ++this.m_jointCount; - // Connect to the bodies' doubly linked lists. - joint.m_edgeA.joint = joint; - joint.m_edgeA.other = joint.m_bodyB; - joint.m_edgeA.prev = null; - joint.m_edgeA.next = joint.m_bodyA.m_jointList; - if (joint.m_bodyA.m_jointList) - joint.m_bodyA.m_jointList.prev = joint.m_edgeA; - joint.m_bodyA.m_jointList = joint.m_edgeA; - joint.m_edgeB.joint = joint; - joint.m_edgeB.other = joint.m_bodyA; - joint.m_edgeB.prev = null; - joint.m_edgeB.next = joint.m_bodyB.m_jointList; - if (joint.m_bodyB.m_jointList) - joint.m_bodyB.m_jointList.prev = joint.m_edgeB; - joint.m_bodyB.m_jointList = joint.m_edgeB; - // If the joint prevents collisions, then flag any contacts for filtering. - if (joint.m_collideConnected == false) { - for (var edge = joint.m_bodyB.getContactList(); edge; edge = edge.next) { - if (edge.other == joint.m_bodyA) { - // Flag the contact for filtering at the next time step (where either - // body is awake). - edge.contact.flagForFiltering(); - } - } - } - // Note: creating a joint doesn't wake the bodies. - return joint; - }; - /** - * Destroy a joint. This may cause the connected bodies to begin colliding. - * Warning: This function is locked during callbacks. - */ - World.prototype.destroyJoint = function (joint) { - if (this.isLocked()) { - return; - } - // Remove from the doubly linked list. - if (joint.m_prev) { - joint.m_prev.m_next = joint.m_next; - } - if (joint.m_next) { - joint.m_next.m_prev = joint.m_prev; - } - if (joint == this.m_jointList) { - this.m_jointList = joint.m_next; - } - // Disconnect from bodies. - var bodyA = joint.m_bodyA; - var bodyB = joint.m_bodyB; - // Wake up connected bodies. - bodyA.setAwake(true); - bodyB.setAwake(true); - // Remove from body 1. - if (joint.m_edgeA.prev) { - joint.m_edgeA.prev.next = joint.m_edgeA.next; - } - if (joint.m_edgeA.next) { - joint.m_edgeA.next.prev = joint.m_edgeA.prev; - } - if (joint.m_edgeA == bodyA.m_jointList) { - bodyA.m_jointList = joint.m_edgeA.next; - } - joint.m_edgeA.prev = null; - joint.m_edgeA.next = null; - // Remove from body 2 - if (joint.m_edgeB.prev) { - joint.m_edgeB.prev.next = joint.m_edgeB.next; - } - if (joint.m_edgeB.next) { - joint.m_edgeB.next.prev = joint.m_edgeB.prev; - } - if (joint.m_edgeB == bodyB.m_jointList) { - bodyB.m_jointList = joint.m_edgeB.next; - } - joint.m_edgeB.prev = null; - joint.m_edgeB.next = null; - --this.m_jointCount; - // If the joint prevents collisions, then flag any contacts for filtering. - if (joint.m_collideConnected == false) { - var edge = bodyB.getContactList(); - while (edge) { - if (edge.other == bodyA) { - // Flag the contact for filtering at the next time step (where either - // body is awake). - edge.contact.flagForFiltering(); - } - edge = edge.next; - } - } - this.publish('remove-joint', joint); - }; - /** - * Take a time step. This performs collision detection, integration, and - * constraint solution. - * - * Broad-phase, narrow-phase, solve and solve time of impacts. - * - * @param timeStep Time step, this should not vary. - */ - World.prototype.step = function (timeStep, velocityIterations, positionIterations) { - this.publish('pre-step', timeStep); - if ((velocityIterations | 0) !== velocityIterations) { - // TODO: remove this in future - velocityIterations = 0; - } - velocityIterations = velocityIterations || this.m_velocityIterations; - positionIterations = positionIterations || this.m_positionIterations; - // If new fixtures were added, we need to find the new contacts. - if (this.m_newFixture) { - this.findNewContacts(); - this.m_newFixture = false; - } - this.m_locked = true; - this.s_step.reset(timeStep); - this.s_step.velocityIterations = velocityIterations; - this.s_step.positionIterations = positionIterations; - this.s_step.warmStarting = this.m_warmStarting; - this.s_step.blockSolve = this.m_blockSolve; - // Update contacts. This is where some contacts are destroyed. - this.updateContacts(); - // Integrate velocities, solve velocity constraints, and integrate positions. - if (this.m_stepComplete && timeStep > 0.0) { - this.m_solver.solveWorld(this.s_step); - // Synchronize fixtures, check for out of range bodies. - for (var b = this.m_bodyList; b; b = b.getNext()) { - // If a body was not in an island then it did not move. - if (b.m_islandFlag == false) { - continue; - } - if (b.isStatic()) { - continue; - } - // Update fixtures (for broad-phase). - b.synchronizeFixtures(); - } - // Look for new contacts. - this.findNewContacts(); - } - // Handle TOI events. - if (this.m_continuousPhysics && timeStep > 0.0) { - this.m_solver.solveWorldTOI(this.s_step); - } - if (this.m_clearForces) { - this.clearForces(); - } - this.m_locked = false; - this.publish('post-step', timeStep); - }; - /** - * @internal - * Call this method to find new contacts. - */ - World.prototype.findNewContacts = function () { - this.m_broadPhase.updatePairs(this.createContact); - }; - /** - * @internal - * Removes old non-overlapping contacts, applies filters and updates contacts. - */ - World.prototype.updateContacts = function () { - // Update awake contacts. - var c; - var next_c = this.m_contactList; - while (c = next_c) { - next_c = c.getNext(); - var fixtureA = c.getFixtureA(); - var fixtureB = c.getFixtureB(); - var indexA = c.getChildIndexA(); - var indexB = c.getChildIndexB(); - var bodyA = fixtureA.getBody(); - var bodyB = fixtureB.getBody(); - // Is this contact flagged for filtering? - if (c.m_filterFlag) { - if (bodyB.shouldCollide(bodyA) == false) { - this.destroyContact(c); - continue; - } - if (fixtureB.shouldCollide(fixtureA) == false) { - this.destroyContact(c); - continue; - } - // Clear the filtering flag. - c.m_filterFlag = false; - } - var activeA = bodyA.isAwake() && !bodyA.isStatic(); - var activeB = bodyB.isAwake() && !bodyB.isStatic(); - // At least one body must be awake and it must be dynamic or kinematic. - if (activeA == false && activeB == false) { - continue; - } - var proxyIdA = fixtureA.m_proxies[indexA].proxyId; - var proxyIdB = fixtureB.m_proxies[indexB].proxyId; - var overlap = this.m_broadPhase.testOverlap(proxyIdA, proxyIdB); - // Here we destroy contacts that cease to overlap in the broad-phase. - if (overlap == false) { - this.destroyContact(c); - continue; - } - // The contact persists. - c.update(this); - } - }; - /** - * @internal - */ - World.prototype.destroyContact = function (contact) { - Contact.destroy(contact, this); - // Remove from the world. - if (contact.m_prev) { - contact.m_prev.m_next = contact.m_next; - } - if (contact.m_next) { - contact.m_next.m_prev = contact.m_prev; - } - if (contact == this.m_contactList) { - this.m_contactList = contact.m_next; - } - --this.m_contactCount; - }; - /** - * Register an event listener. - */ - // tslint:disable-next-line:typedef - World.prototype.on = function (name, listener) { - if (typeof name !== 'string' || typeof listener !== 'function') { - return this; - } - if (!this._listeners) { - this._listeners = {}; - } - if (!this._listeners[name]) { - this._listeners[name] = []; - } - this._listeners[name].push(listener); - return this; - }; - /** - * Remove an event listener. - */ - // tslint:disable-next-line:typedef - World.prototype.off = function (name, listener) { - if (typeof name !== 'string' || typeof listener !== 'function') { - return this; - } - var listeners = this._listeners && this._listeners[name]; - if (!listeners || !listeners.length) { - return this; - } - var index = listeners.indexOf(listener); - if (index >= 0) { - listeners.splice(index, 1); - } - return this; + else { + this.m_mass = 0.0; + this.m_invMass = 0.0; + } + // Rotational inertia about the center of mass. + this.m_I = 0.0; + this.m_invI = 0.0; + // the body origin transform + this.m_xf = Transform.identity(); + this.m_xf.p = Vec2.clone(def.position); + this.m_xf.q.setAngle(def.angle); + // the swept motion for CCD + this.m_sweep = new Sweep(); + this.m_sweep.setTransform(this.m_xf); + // position and velocity correction + this.c_velocity = new Velocity(); + this.c_position = new Position(); + this.m_force = Vec2.zero(); + this.m_torque = 0.0; + this.m_linearVelocity = Vec2.clone(def.linearVelocity); + this.m_angularVelocity = def.angularVelocity; + this.m_linearDamping = def.linearDamping; + this.m_angularDamping = def.angularDamping; + this.m_gravityScale = def.gravityScale; + this.m_sleepTime = 0.0; + this.m_jointList = null; + this.m_contactList = null; + this.m_fixtureList = null; + this.m_prev = null; + this.m_next = null; + this.m_destroyed = false; + } + /** @internal */ + Body.prototype._serialize = function () { + var fixtures = []; + for (var f = this.m_fixtureList; f; f = f.m_next) { + fixtures.push(f); + } + return { + type: this.m_type, + bullet: this.m_bulletFlag, + position: this.m_xf.p, + angle: this.m_xf.q.getAngle(), + linearVelocity: this.m_linearVelocity, + angularVelocity: this.m_angularVelocity, + fixtures: fixtures, }; - World.prototype.publish = function (name, arg1, arg2, arg3) { - var listeners = this._listeners && this._listeners[name]; - if (!listeners || !listeners.length) { - return 0; + }; + /** @internal */ + Body._deserialize = function (data, world, restore) { + var body = new Body(world, data); + if (data.fixtures) { + for (var i = data.fixtures.length - 1; i >= 0; i--) { + var fixture = restore(Fixture, data.fixtures[i], body); + body._addFixture(fixture); } - for (var l = 0; l < listeners.length; l++) { - listeners[l].call(this, arg1, arg2, arg3); + } + return body; + }; + Body.prototype.isWorldLocked = function () { + return this.m_world && this.m_world.isLocked() ? true : false; + }; + Body.prototype.getWorld = function () { + return this.m_world; + }; + Body.prototype.getNext = function () { + return this.m_next; + }; + Body.prototype.setUserData = function (data) { + this.m_userData = data; + }; + Body.prototype.getUserData = function () { + return this.m_userData; + }; + Body.prototype.getFixtureList = function () { + return this.m_fixtureList; + }; + Body.prototype.getJointList = function () { + return this.m_jointList; + }; + /** + * Warning: this list changes during the time step and you may miss some + * collisions if you don't use ContactListener. + */ + Body.prototype.getContactList = function () { + return this.m_contactList; + }; + Body.prototype.isStatic = function () { + return this.m_type == STATIC; + }; + Body.prototype.isDynamic = function () { + return this.m_type == DYNAMIC; + }; + Body.prototype.isKinematic = function () { + return this.m_type == KINEMATIC; + }; + /** + * This will alter the mass and velocity. + */ + Body.prototype.setStatic = function () { + this.setType(STATIC); + return this; + }; + Body.prototype.setDynamic = function () { + this.setType(DYNAMIC); + return this; + }; + Body.prototype.setKinematic = function () { + this.setType(KINEMATIC); + return this; + }; + /** + * @internal + */ + Body.prototype.getType = function () { + return this.m_type; + }; + /** + * @internal + */ + Body.prototype.setType = function (type) { + if (this.isWorldLocked() == true) { + return; + } + if (this.m_type == type) { + return; + } + this.m_type = type; + this.resetMassData(); + if (this.m_type == STATIC) { + this.m_linearVelocity.setZero(); + this.m_angularVelocity = 0.0; + this.m_sweep.forward(); + this.synchronizeFixtures(); + } + this.setAwake(true); + this.m_force.setZero(); + this.m_torque = 0.0; + // Delete the attached contacts. + var ce = this.m_contactList; + while (ce) { + var ce0 = ce; + ce = ce.next; + this.m_world.destroyContact(ce0.contact); + } + this.m_contactList = null; + // Touch the proxies so that new contacts will be created (when appropriate) + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + var proxyCount = f.m_proxyCount; + for (var i = 0; i < proxyCount; ++i) { + broadPhase.touchProxy(f.m_proxies[i].proxyId); } - return listeners.length; - }; - /** - * @internal - */ - World.prototype.beginContact = function (contact) { - this.publish('begin-contact', contact); - }; - /** - * @internal - */ - World.prototype.endContact = function (contact) { - this.publish('end-contact', contact); - }; - /** - * @internal - */ - World.prototype.preSolve = function (contact, oldManifold) { - this.publish('pre-solve', contact, oldManifold); - }; - /** - * @internal - */ - World.prototype.postSolve = function (contact, impulse) { - this.publish('post-solve', contact, impulse); - }; - return World; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + } + }; + Body.prototype.isBullet = function () { + return this.m_bulletFlag; + }; + /** + * Should this body be treated like a bullet for continuous collision detection? + */ + Body.prototype.setBullet = function (flag) { + this.m_bulletFlag = !!flag; + }; + Body.prototype.isSleepingAllowed = function () { + return this.m_autoSleepFlag; + }; + Body.prototype.setSleepingAllowed = function (flag) { + this.m_autoSleepFlag = !!flag; + if (this.m_autoSleepFlag == false) { + this.setAwake(true); + } + }; + Body.prototype.isAwake = function () { + return this.m_awakeFlag; + }; + /** + * Set the sleep state of the body. A sleeping body has very low CPU cost. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var Vec3 = /** @class */ (function () { - // tslint:disable-next-line:typedef - function Vec3(x, y, z) { - if (!(this instanceof Vec3)) { - return new Vec3(x, y, z); + * @param flag Set to true to wake the body, false to put it to sleep. + */ + Body.prototype.setAwake = function (flag) { + if (flag) { + if (this.m_awakeFlag == false) { + this.m_awakeFlag = true; + this.m_sleepTime = 0.0; } - if (typeof x === 'undefined') { - this.x = 0; - this.y = 0; - this.z = 0; + } + else { + this.m_awakeFlag = false; + this.m_sleepTime = 0.0; + this.m_linearVelocity.setZero(); + this.m_angularVelocity = 0.0; + this.m_force.setZero(); + this.m_torque = 0.0; + } + }; + Body.prototype.isActive = function () { + return this.m_activeFlag; + }; + /** + * Set the active state of the body. An inactive body is not simulated and + * cannot be collided with or woken up. If you pass a flag of true, all fixtures + * will be added to the broad-phase. If you pass a flag of false, all fixtures + * will be removed from the broad-phase and all contacts will be destroyed. + * Fixtures and joints are otherwise unaffected. + * + * You may continue to create/destroy fixtures and joints on inactive bodies. + * Fixtures on an inactive body are implicitly inactive and will not participate + * in collisions, ray-casts, or queries. Joints connected to an inactive body + * are implicitly inactive. An inactive body is still owned by a World object + * and remains + */ + Body.prototype.setActive = function (flag) { + if (flag == this.m_activeFlag) { + return; + } + this.m_activeFlag = !!flag; + if (this.m_activeFlag) { + // Create all proxies. + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + f.createProxies(broadPhase, this.m_xf); } - else if (typeof x === 'object') { - this.x = x.x; - this.y = x.y; - this.z = x.z; + // Contacts are created the next time step. + } + else { + // Destroy all proxies. + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + f.destroyProxies(broadPhase); } - else { - this.x = x; - this.y = y; - this.z = z; + // Destroy the attached contacts. + var ce = this.m_contactList; + while (ce) { + var ce0 = ce; + ce = ce.next; + this.m_world.destroyContact(ce0.contact); } + this.m_contactList = null; } - /** @internal */ - Vec3.prototype._serialize = function () { - return { - x: this.x, - y: this.y, - z: this.z - }; - }; - /** @internal */ - Vec3._deserialize = function (data) { - var obj = Object.create(Vec3.prototype); - obj.x = data.x; - obj.y = data.y; - obj.z = data.z; - return obj; - }; - /** @internal */ - Vec3.neo = function (x, y, z) { - var obj = Object.create(Vec3.prototype); - obj.x = x; - obj.y = y; - obj.z = z; - return obj; - }; - Vec3.zero = function () { - var obj = Object.create(Vec3.prototype); - obj.x = 0; - obj.y = 0; - obj.z = 0; - return obj; - }; - Vec3.clone = function (v) { - return Vec3.neo(v.x, v.y, v.z); - }; - /** @internal */ - Vec3.prototype.toString = function () { - return JSON.stringify(this); - }; - /** - * Does this vector contain finite coordinates? - */ - Vec3.isValid = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - return math$1.isFinite(obj.x) && math$1.isFinite(obj.y) && math$1.isFinite(obj.z); - }; - Vec3.assert = function (o) { + }; + Body.prototype.isFixedRotation = function () { + return this.m_fixedRotationFlag; + }; + /** + * Set this body to have fixed rotation. This causes the mass to be reset. + */ + Body.prototype.setFixedRotation = function (flag) { + if (this.m_fixedRotationFlag == flag) { return; - }; - Vec3.prototype.setZero = function () { - this.x = 0.0; - this.y = 0.0; - this.z = 0.0; - return this; - }; - Vec3.prototype.set = function (x, y, z) { - this.x = x; - this.y = y; - this.z = z; - return this; - }; - Vec3.prototype.add = function (w) { - this.x += w.x; - this.y += w.y; - this.z += w.z; - return this; - }; - Vec3.prototype.sub = function (w) { - this.x -= w.x; - this.y -= w.y; - this.z -= w.z; - return this; - }; - Vec3.prototype.mul = function (m) { - this.x *= m; - this.y *= m; - this.z *= m; - return this; - }; - Vec3.areEqual = function (v, w) { - return v === w || - typeof v === 'object' && v !== null && - typeof w === 'object' && w !== null && - v.x === w.x && v.y === w.y && v.z === w.z; - }; - /** - * Perform the dot product on two vectors. - */ - Vec3.dot = function (v, w) { - return v.x * w.x + v.y * w.y + v.z * w.z; - }; - /** - * Perform the cross product on two vectors. In 2D this produces a scalar. - */ - Vec3.cross = function (v, w) { - return new Vec3(v.y * w.z - v.z * w.y, v.z * w.x - v.x * w.z, v.x * w.y - v.y * w.x); - }; - Vec3.add = function (v, w) { - return new Vec3(v.x + w.x, v.y + w.y, v.z + w.z); - }; - Vec3.sub = function (v, w) { - return new Vec3(v.x - w.x, v.y - w.y, v.z - w.z); - }; - Vec3.mul = function (v, m) { - return new Vec3(m * v.x, m * v.y, m * v.z); - }; - Vec3.prototype.neg = function () { - this.x = -this.x; - this.y = -this.y; - this.z = -this.z; - return this; - }; - Vec3.neg = function (v) { - return new Vec3(-v.x, -v.y, -v.z); - }; - return Vec3; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba + } + this.m_fixedRotationFlag = !!flag; + this.m_angularVelocity = 0.0; + this.resetMassData(); + }; + /** + * Get the world transform for the body's origin. + */ + Body.prototype.getTransform = function () { + return this.m_xf; + }; + /** + * Set the position of the body's origin and rotation. Manipulating a body's + * transform may cause non-physical behavior. Note: contacts are updated on the + * next call to World.step. + * + * @param position The world position of the body's local origin. + * @param angle The world rotation in radians. + */ + Body.prototype.setTransform = function (position, angle) { + if (this.isWorldLocked() == true) { + return; + } + this.m_xf.setNum(position, angle); + this.m_sweep.setTransform(this.m_xf); + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + f.synchronize(broadPhase, this.m_xf, this.m_xf); + } + }; + Body.prototype.synchronizeTransform = function () { + this.m_sweep.getTransform(this.m_xf, 1); + }; + /** + * Update fixtures in broad-phase. + */ + Body.prototype.synchronizeFixtures = function () { + var xf = Transform.identity(); + this.m_sweep.getTransform(xf, 0); + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + f.synchronize(broadPhase, xf, this.m_xf); + } + }; + /** + * Used in TOI. + */ + Body.prototype.advance = function (alpha) { + // Advance to the new safe time. This doesn't sync the broad-phase. + this.m_sweep.advance(alpha); + this.m_sweep.c.setVec2(this.m_sweep.c0); + this.m_sweep.a = this.m_sweep.a0; + this.m_sweep.getTransform(this.m_xf, 1); + }; + /** + * Get the world position for the body's origin. + */ + Body.prototype.getPosition = function () { + return this.m_xf.p; + }; + Body.prototype.setPosition = function (p) { + this.setTransform(p, this.m_sweep.a); + }; + /** + * Get the current world rotation angle in radians. + */ + Body.prototype.getAngle = function () { + return this.m_sweep.a; + }; + Body.prototype.setAngle = function (angle) { + this.setTransform(this.m_xf.p, angle); + }; + /** + * Get the world position of the center of mass. + */ + Body.prototype.getWorldCenter = function () { + return this.m_sweep.c; + }; + /** + * Get the local position of the center of mass. + */ + Body.prototype.getLocalCenter = function () { + return this.m_sweep.localCenter; + }; + /** + * Get the linear velocity of the center of mass. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * @return the linear velocity of the center of mass. + */ + Body.prototype.getLinearVelocity = function () { + return this.m_linearVelocity; + }; + /** + * Get the world linear velocity of a world point attached to this body. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * @param worldPoint A point in world coordinates. + */ + Body.prototype.getLinearVelocityFromWorldPoint = function (worldPoint) { + var localCenter = Vec2.sub(worldPoint, this.m_sweep.c); + return Vec2.add(this.m_linearVelocity, Vec2.crossNumVec2(this.m_angularVelocity, localCenter)); + }; + /** + * Get the world velocity of a local point. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * A line segment (edge) shape. These can be connected in chains or loops to - * other edge shapes. The connectivity information is used to ensure correct - * contact normals. - */ - var EdgeShape = /** @class */ (function (_super) { - __extends(EdgeShape, _super); - function EdgeShape(v1, v2) { - var _this = this; - // @ts-ignore - if (!(_this instanceof EdgeShape)) { - return new EdgeShape(v1, v2); - } - _this = _super.call(this) || this; - _this.m_type = EdgeShape.TYPE; - _this.m_radius = Settings.polygonRadius; - _this.m_vertex1 = v1 ? Vec2.clone(v1) : Vec2.zero(); - _this.m_vertex2 = v2 ? Vec2.clone(v2) : Vec2.zero(); - _this.m_vertex0 = Vec2.zero(); - _this.m_vertex3 = Vec2.zero(); - _this.m_hasVertex0 = false; - _this.m_hasVertex3 = false; - return _this; + * @param localPoint A point in local coordinates. + */ + Body.prototype.getLinearVelocityFromLocalPoint = function (localPoint) { + return this.getLinearVelocityFromWorldPoint(this.getWorldPoint(localPoint)); + }; + /** + * Set the linear velocity of the center of mass. + * + * @param v The new linear velocity of the center of mass. + */ + Body.prototype.setLinearVelocity = function (v) { + if (this.m_type == STATIC) { + return; } - /** @internal */ - EdgeShape.prototype._serialize = function () { - return { - type: this.m_type, - vertex1: this.m_vertex1, - vertex2: this.m_vertex2, - vertex0: this.m_vertex0, - vertex3: this.m_vertex3, - hasVertex0: this.m_hasVertex0, - hasVertex3: this.m_hasVertex3, - }; - }; - /** @internal */ - EdgeShape._deserialize = function (data) { - var shape = new EdgeShape(data.vertex1, data.vertex2); - if (shape.m_hasVertex0) { - shape.setPrevVertex(data.vertex0); - } - if (shape.m_hasVertex3) { - shape.setNextVertex(data.vertex3); - } - return shape; - }; - /** @internal @deprecated */ - EdgeShape.prototype.setNext = function (v) { - return this.setNextVertex(v); - }; - /** - * Optional next vertex, used for smooth collision. - */ - EdgeShape.prototype.setNextVertex = function (v) { - if (v) { - this.m_vertex3.setVec2(v); - this.m_hasVertex3 = true; - } - else { - this.m_vertex3.setZero(); - this.m_hasVertex3 = false; - } - return this; - }; - /** - * Optional next vertex, used for smooth collision. - */ - EdgeShape.prototype.getNextVertex = function () { - return this.m_vertex3; - }; - /** @internal @deprecated */ - EdgeShape.prototype.setPrev = function (v) { - return this.setPrevVertex(v); - }; - /** - * Optional prev vertex, used for smooth collision. - */ - EdgeShape.prototype.setPrevVertex = function (v) { - if (v) { - this.m_vertex0.setVec2(v); - this.m_hasVertex0 = true; - } - else { - this.m_vertex0.setZero(); - this.m_hasVertex0 = false; - } - return this; - }; - /** - * Optional prev vertex, used for smooth collision. - */ - EdgeShape.prototype.getPrevVertex = function () { - return this.m_vertex0; - }; - /** - * Set this as an isolated edge. - */ - EdgeShape.prototype._set = function (v1, v2) { - this.m_vertex1.setVec2(v1); - this.m_vertex2.setVec2(v2); - this.m_hasVertex0 = false; - this.m_hasVertex3 = false; - return this; - }; - /** - * @internal - * @deprecated Shapes should be treated as immutable. - * - * clone the concrete shape. - */ - EdgeShape.prototype._clone = function () { - var clone = new EdgeShape(); - clone.m_type = this.m_type; - clone.m_radius = this.m_radius; - clone.m_vertex1.setVec2(this.m_vertex1); - clone.m_vertex2.setVec2(this.m_vertex2); - clone.m_vertex0.setVec2(this.m_vertex0); - clone.m_vertex3.setVec2(this.m_vertex3); - clone.m_hasVertex0 = this.m_hasVertex0; - clone.m_hasVertex3 = this.m_hasVertex3; - return clone; - }; - /** - * Get the number of child primitives. - */ - EdgeShape.prototype.getChildCount = function () { - return 1; - }; - /** - * Test a point for containment in this shape. This only works for convex - * shapes. - * - * @param xf The shape world transform. - * @param p A point in world coordinates. - */ - EdgeShape.prototype.testPoint = function (xf, p) { - return false; - }; - /** - * Cast a ray against a child shape. - * - * @param output The ray-cast results. - * @param input The ray-cast input parameters. - * @param xf The transform to be applied to the shape. - * @param childIndex The child shape index - */ - EdgeShape.prototype.rayCast = function (output, input, xf, childIndex) { - // p = p1 + t * d - // v = v1 + s * e - // p1 + t * d = v1 + s * e - // s * e - t * d = p1 - v1 - // NOT_USED(childIndex); - // Put the ray into the edge's frame of reference. - var p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p)); - var p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p)); - var d = Vec2.sub(p2, p1); - var v1 = this.m_vertex1; - var v2 = this.m_vertex2; - var e = Vec2.sub(v2, v1); - var normal = Vec2.neo(e.y, -e.x); - normal.normalize(); - // q = p1 + t * d - // dot(normal, q - v1) = 0 - // dot(normal, p1 - v1) + t * dot(normal, d) = 0 - var numerator = Vec2.dot(normal, Vec2.sub(v1, p1)); - var denominator = Vec2.dot(normal, d); - if (denominator == 0.0) { - return false; - } - var t = numerator / denominator; - if (t < 0.0 || input.maxFraction < t) { - return false; - } - var q = Vec2.add(p1, Vec2.mulNumVec2(t, d)); - // q = v1 + s * r - // s = dot(q - v1, r) / dot(r, r) - var r = Vec2.sub(v2, v1); - var rr = Vec2.dot(r, r); - if (rr == 0.0) { - return false; - } - var s = Vec2.dot(Vec2.sub(q, v1), r) / rr; - if (s < 0.0 || 1.0 < s) { - return false; - } - output.fraction = t; - if (numerator > 0.0) { - output.normal = Rot.mulVec2(xf.q, normal).neg(); - } - else { - output.normal = Rot.mulVec2(xf.q, normal); - } - return true; - }; - /** - * Given a transform, compute the associated axis aligned bounding box for a - * child shape. - * - * @param aabb Returns the axis aligned box. - * @param xf The world transform of the shape. - * @param childIndex The child shape - */ - EdgeShape.prototype.computeAABB = function (aabb, xf, childIndex) { - var v1 = Transform.mulVec2(xf, this.m_vertex1); - var v2 = Transform.mulVec2(xf, this.m_vertex2); - aabb.combinePoints(v1, v2); - aabb.extend(this.m_radius); - }; - /** - * Compute the mass properties of this shape using its dimensions and density. - * The inertia tensor is computed about the local origin. - * - * @param massData Returns the mass data for this shape. - * @param density The density in kilograms per meter squared. - */ - EdgeShape.prototype.computeMass = function (massData, density) { - massData.mass = 0.0; - massData.center.setCombine(0.5, this.m_vertex1, 0.5, this.m_vertex2); - massData.I = 0.0; - }; - EdgeShape.prototype.computeDistanceProxy = function (proxy) { - proxy.m_vertices.push(this.m_vertex1); - proxy.m_vertices.push(this.m_vertex2); - proxy.m_count = 2; - proxy.m_radius = this.m_radius; - }; - EdgeShape.TYPE = 'edge'; - return EdgeShape; - }(Shape)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba + if (Vec2.dot(v, v) > 0.0) { + this.setAwake(true); + } + this.m_linearVelocity.setVec2(v); + }; + /** + * Get the angular velocity. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * @returns the angular velocity in radians/second. + */ + Body.prototype.getAngularVelocity = function () { + return this.m_angularVelocity; + }; + /** + * Set the angular velocity. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * @param omega The new angular velocity in radians/second. + */ + Body.prototype.setAngularVelocity = function (w) { + if (this.m_type == STATIC) { + return; + } + if (w * w > 0.0) { + this.setAwake(true); + } + this.m_angularVelocity = w; + }; + Body.prototype.getLinearDamping = function () { + return this.m_linearDamping; + }; + Body.prototype.setLinearDamping = function (linearDamping) { + this.m_linearDamping = linearDamping; + }; + Body.prototype.getAngularDamping = function () { + return this.m_angularDamping; + }; + Body.prototype.setAngularDamping = function (angularDamping) { + this.m_angularDamping = angularDamping; + }; + Body.prototype.getGravityScale = function () { + return this.m_gravityScale; + }; + /** + * Scale the gravity applied to this body. + */ + Body.prototype.setGravityScale = function (scale) { + this.m_gravityScale = scale; + }; + /** + * Get the total mass of the body. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * A chain shape is a free form sequence of line segments. The chain has - * two-sided collision, so you can use inside and outside collision. Therefore, - * you may use any winding order. Connectivity information is used to create - * smooth collisions. + * @returns The mass, usually in kilograms (kg). + */ + Body.prototype.getMass = function () { + return this.m_mass; + }; + /** + * Get the rotational inertia of the body about the local origin. * - * WARNING: The chain will not collide properly if there are self-intersections. + * @return the rotational inertia, usually in kg-m^2. */ - var ChainShape = /** @class */ (function (_super) { - __extends(ChainShape, _super); - function ChainShape(vertices, loop) { - var _this = this; - // @ts-ignore - if (!(_this instanceof ChainShape)) { - return new ChainShape(vertices, loop); - } - _this = _super.call(this) || this; - _this.m_type = ChainShape.TYPE; - _this.m_radius = Settings.polygonRadius; - _this.m_vertices = []; - _this.m_count = 0; - _this.m_prevVertex = null; - _this.m_nextVertex = null; - _this.m_hasPrevVertex = false; - _this.m_hasNextVertex = false; - _this.m_isLoop = !!loop; - if (vertices && vertices.length) { - if (loop) { - _this._createLoop(vertices); - } - else { - _this._createChain(vertices); - } - } - return _this; + Body.prototype.getInertia = function () { + return this.m_I + this.m_mass + * Vec2.dot(this.m_sweep.localCenter, this.m_sweep.localCenter); + }; + /** + * Copy the mass data of the body to data. + */ + Body.prototype.getMassData = function (data) { + data.mass = this.m_mass; + data.I = this.getInertia(); + data.center.setVec2(this.m_sweep.localCenter); + }; + /** + * This resets the mass properties to the sum of the mass properties of the + * fixtures. This normally does not need to be called unless you called + * SetMassData to override the mass and you later want to reset the mass. + */ + Body.prototype.resetMassData = function () { + // Compute mass data from shapes. Each shape has its own density. + this.m_mass = 0.0; + this.m_invMass = 0.0; + this.m_I = 0.0; + this.m_invI = 0.0; + this.m_sweep.localCenter.setZero(); + // Static and kinematic bodies have zero mass. + if (this.isStatic() || this.isKinematic()) { + this.m_sweep.c0.setVec2(this.m_xf.p); + this.m_sweep.c.setVec2(this.m_xf.p); + this.m_sweep.a0 = this.m_sweep.a; + return; } - /** @internal */ - ChainShape.prototype._serialize = function () { - var data = { - type: this.m_type, - vertices: this.m_vertices, - isLoop: this.m_isLoop, - hasPrevVertex: this.m_hasPrevVertex, - hasNextVertex: this.m_hasNextVertex, - prevVertex: null, - nextVertex: null, - }; - if (this.m_prevVertex) { - data.prevVertex = this.m_prevVertex; - } - if (this.m_nextVertex) { - data.nextVertex = this.m_nextVertex; - } - return data; - }; - /** @internal */ - ChainShape._deserialize = function (data, fixture, restore) { - var vertices = []; - if (data.vertices) { - for (var i = 0; i < data.vertices.length; i++) { - vertices.push(restore(Vec2, data.vertices[i])); - } - } - var shape = new ChainShape(vertices, data.isLoop); - if (data.prevVertex) { - shape.setPrevVertex(data.prevVertex); - } - if (data.nextVertex) { - shape.setNextVertex(data.nextVertex); - } - return shape; - }; - // clear() { - // this.m_vertices.length = 0; - // this.m_count = 0; - // } - /** - * @internal - * Create a loop. This automatically adjusts connectivity. - * - * @param vertices an array of vertices, these are copied - * @param count the vertex count - */ - ChainShape.prototype._createLoop = function (vertices) { - for (var i = 1; i < vertices.length; ++i) { - vertices[i - 1]; - vertices[i]; - } - this.m_vertices = []; - this.m_count = vertices.length + 1; - for (var i = 0; i < vertices.length; ++i) { - this.m_vertices[i] = Vec2.clone(vertices[i]); - } - this.m_vertices[vertices.length] = Vec2.clone(vertices[0]); - this.m_prevVertex = this.m_vertices[this.m_count - 2]; - this.m_nextVertex = this.m_vertices[1]; - this.m_hasPrevVertex = true; - this.m_hasNextVertex = true; - return this; - }; - /** - * @internal - * Create a chain with isolated end vertices. - * - * @param vertices an array of vertices, these are copied - * @param count the vertex count - */ - ChainShape.prototype._createChain = function (vertices) { - for (var i = 1; i < vertices.length; ++i) { - // If the code crashes here, it means your vertices are too close together. - vertices[i - 1]; - vertices[i]; - } - this.m_count = vertices.length; - for (var i = 0; i < vertices.length; ++i) { - this.m_vertices[i] = Vec2.clone(vertices[i]); - } - this.m_hasPrevVertex = false; - this.m_hasNextVertex = false; - this.m_prevVertex = null; - this.m_nextVertex = null; - return this; - }; - /** @internal */ - ChainShape.prototype._reset = function () { - if (this.m_isLoop) { - this._createLoop(this.m_vertices); - } - else { - this._createChain(this.m_vertices); - } - }; - /** - * Establish connectivity to a vertex that precedes the first vertex. Don't call - * this for loops. - */ - ChainShape.prototype.setPrevVertex = function (prevVertex) { - this.m_prevVertex = prevVertex; - this.m_hasPrevVertex = true; - }; - ChainShape.prototype.getPrevVertex = function () { - return this.m_prevVertex; - }; - /** - * Establish connectivity to a vertex that follows the last vertex. Don't call - * this for loops. - */ - ChainShape.prototype.setNextVertex = function (nextVertex) { - this.m_nextVertex = nextVertex; - this.m_hasNextVertex = true; - }; - ChainShape.prototype.getNextVertex = function () { - return this.m_nextVertex; - }; - /** - * @internal - * @deprecated Shapes should be treated as immutable. - * - * clone the concrete shape. - */ - ChainShape.prototype._clone = function () { - var clone = new ChainShape(); - clone._createChain(this.m_vertices); - clone.m_type = this.m_type; - clone.m_radius = this.m_radius; - clone.m_prevVertex = this.m_prevVertex; - clone.m_nextVertex = this.m_nextVertex; - clone.m_hasPrevVertex = this.m_hasPrevVertex; - clone.m_hasNextVertex = this.m_hasNextVertex; - return clone; - }; - /** - * Get the number of child primitives. - */ - ChainShape.prototype.getChildCount = function () { - // edge count = vertex count - 1 - return this.m_count - 1; - }; - // Get a child edge. - ChainShape.prototype.getChildEdge = function (edge, childIndex) { - edge.m_type = EdgeShape.TYPE; - edge.m_radius = this.m_radius; - edge.m_vertex1 = this.m_vertices[childIndex]; - edge.m_vertex2 = this.m_vertices[childIndex + 1]; - if (childIndex > 0) { - edge.m_vertex0 = this.m_vertices[childIndex - 1]; - edge.m_hasVertex0 = true; - } - else { - edge.m_vertex0 = this.m_prevVertex; - edge.m_hasVertex0 = this.m_hasPrevVertex; - } - if (childIndex < this.m_count - 2) { - edge.m_vertex3 = this.m_vertices[childIndex + 2]; - edge.m_hasVertex3 = true; - } - else { - edge.m_vertex3 = this.m_nextVertex; - edge.m_hasVertex3 = this.m_hasNextVertex; - } - }; - ChainShape.prototype.getVertex = function (index) { - if (index < this.m_count) { - return this.m_vertices[index]; - } - else { - return this.m_vertices[0]; - } - }; - ChainShape.prototype.isLoop = function () { - return this.m_isLoop; - }; - /** - * Test a point for containment in this shape. This only works for convex - * shapes. - * - * This always return false. - * - * @param xf The shape world transform. - * @param p A point in world coordinates. - */ - ChainShape.prototype.testPoint = function (xf, p) { - return false; - }; - /** - * Cast a ray against a child shape. - * - * @param output The ray-cast results. - * @param input The ray-cast input parameters. - * @param xf The transform to be applied to the shape. - * @param childIndex The child shape index - */ - ChainShape.prototype.rayCast = function (output, input, xf, childIndex) { - var edgeShape = new EdgeShape(this.getVertex(childIndex), this.getVertex(childIndex + 1)); - return edgeShape.rayCast(output, input, xf, 0); - }; - /** - * Given a transform, compute the associated axis aligned bounding box for a - * child shape. - * - * @param aabb Returns the axis aligned box. - * @param xf The world transform of the shape. - * @param childIndex The child shape - */ - ChainShape.prototype.computeAABB = function (aabb, xf, childIndex) { - var v1 = Transform.mulVec2(xf, this.getVertex(childIndex)); - var v2 = Transform.mulVec2(xf, this.getVertex(childIndex + 1)); - aabb.combinePoints(v1, v2); - }; - /** - * Compute the mass properties of this shape using its dimensions and density. - * The inertia tensor is computed about the local origin. - * - * Chains have zero mass. - * - * @param massData Returns the mass data for this shape. - * @param density The density in kilograms per meter squared. - */ - ChainShape.prototype.computeMass = function (massData, density) { - massData.mass = 0.0; - massData.center = Vec2.zero(); - massData.I = 0.0; - }; - ChainShape.prototype.computeDistanceProxy = function (proxy, childIndex) { - proxy.m_buffer[0] = this.getVertex(childIndex); - proxy.m_buffer[1] = this.getVertex(childIndex + 1); - proxy.m_vertices = proxy.m_buffer; - proxy.m_count = 2; - proxy.m_radius = this.m_radius; - }; - ChainShape.TYPE = 'chain'; - return ChainShape; - }(Shape)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba + // Accumulate mass over all fixtures. + var localCenter = Vec2.zero(); + for (var f = this.m_fixtureList; f; f = f.m_next) { + if (f.m_density == 0.0) { + continue; + } + var massData = new MassData(); + f.getMassData(massData); + this.m_mass += massData.mass; + localCenter.addMul(massData.mass, massData.center); + this.m_I += massData.I; + } + // Compute center of mass. + if (this.m_mass > 0.0) { + this.m_invMass = 1.0 / this.m_mass; + localCenter.mul(this.m_invMass); + } + else { + // Force all dynamic bodies to have a positive mass. + this.m_mass = 1.0; + this.m_invMass = 1.0; + } + if (this.m_I > 0.0 && this.m_fixedRotationFlag == false) { + // Center the inertia about the center of mass. + this.m_I -= this.m_mass * Vec2.dot(localCenter, localCenter); + this.m_invI = 1.0 / this.m_I; + } + else { + this.m_I = 0.0; + this.m_invI = 0.0; + } + // Move center of mass. + var oldCenter = Vec2.clone(this.m_sweep.c); + this.m_sweep.setLocalCenter(localCenter, this.m_xf); + // Update center of mass velocity. + this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(this.m_sweep.c, oldCenter))); + }; + /** + * Set the mass properties to override the mass properties of the fixtures. Note + * that this changes the center of mass position. Note that creating or + * destroying fixtures can also alter the mass. This function has no effect if + * the body isn't dynamic. + * + * @param massData The mass properties. + */ + Body.prototype.setMassData = function (massData) { + if (this.isWorldLocked() == true) { + return; + } + if (this.m_type != DYNAMIC) { + return; + } + this.m_invMass = 0.0; + this.m_I = 0.0; + this.m_invI = 0.0; + this.m_mass = massData.mass; + if (this.m_mass <= 0.0) { + this.m_mass = 1.0; + } + this.m_invMass = 1.0 / this.m_mass; + if (massData.I > 0.0 && this.m_fixedRotationFlag == false) { + this.m_I = massData.I - this.m_mass + * Vec2.dot(massData.center, massData.center); + this.m_invI = 1.0 / this.m_I; + } + // Move center of mass. + var oldCenter = Vec2.clone(this.m_sweep.c); + this.m_sweep.setLocalCenter(massData.center, this.m_xf); + // Update center of mass velocity. + this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(this.m_sweep.c, oldCenter))); + }; + /** + * Apply a force at a world point. If the force is not applied at the center of + * mass, it will generate a torque and affect the angular velocity. This wakes + * up the body. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * @param force The world force vector, usually in Newtons (N). + * @param point The world position of the point of application. + * @param wake Also wake up the body + */ + Body.prototype.applyForce = function (force, point, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate a force if the body is sleeping. + if (this.m_awakeFlag) { + this.m_force.add(force); + this.m_torque += Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), force); + } + }; + /** + * Apply a force to the center of mass. This wakes up the body. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * @param force The world force vector, usually in Newtons (N). + * @param wake Also wake up the body + */ + Body.prototype.applyForceToCenter = function (force, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate a force if the body is sleeping + if (this.m_awakeFlag) { + this.m_force.add(force); + } + }; + /** + * Apply a torque. This affects the angular velocity without affecting the + * linear velocity of the center of mass. This wakes up the body. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * A convex polygon. It is assumed that the interior of the polygon is to the - * left of each edge. Polygons have a maximum number of vertices equal to - * Settings.maxPolygonVertices. In most cases you should not need many vertices - * for a convex polygon. extends Shape - */ - var PolygonShape = /** @class */ (function (_super) { - __extends(PolygonShape, _super); - // @ts-ignore - function PolygonShape(vertices) { - var _this = this; - // @ts-ignore - if (!(_this instanceof PolygonShape)) { - return new PolygonShape(vertices); - } - _this = _super.call(this) || this; - _this.m_type = PolygonShape.TYPE; - _this.m_radius = Settings.polygonRadius; - _this.m_centroid = Vec2.zero(); - _this.m_vertices = []; - _this.m_normals = []; - _this.m_count = 0; - if (vertices && vertices.length) { - _this._set(vertices); + * @param torque About the z-axis (out of the screen), usually in N-m. + * @param wake Also wake up the body + */ + Body.prototype.applyTorque = function (torque, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate a force if the body is sleeping + if (this.m_awakeFlag) { + this.m_torque += torque; + } + }; + /** + * Apply an impulse at a point. This immediately modifies the velocity. It also + * modifies the angular velocity if the point of application is not at the + * center of mass. This wakes up the body. + * + * @param impulse The world impulse vector, usually in N-seconds or kg-m/s. + * @param point The world position of the point of application. + * @param wake Also wake up the body + */ + Body.prototype.applyLinearImpulse = function (impulse, point, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate velocity if the body is sleeping + if (this.m_awakeFlag) { + this.m_linearVelocity.addMul(this.m_invMass, impulse); + this.m_angularVelocity += this.m_invI * Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), impulse); + } + }; + /** + * Apply an angular impulse. + * + * @param impulse The angular impulse in units of kg*m*m/s + * @param wake Also wake up the body + */ + Body.prototype.applyAngularImpulse = function (impulse, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate velocity if the body is sleeping + if (this.m_awakeFlag) { + this.m_angularVelocity += this.m_invI * impulse; + } + }; + /** + * This is used to prevent connected bodies (by joints) from colliding, + * depending on the joint's collideConnected flag. + */ + Body.prototype.shouldCollide = function (that) { + // At least one body should be dynamic. + if (this.m_type != DYNAMIC && that.m_type != DYNAMIC) { + return false; + } + // Does a joint prevent collision? + for (var jn = this.m_jointList; jn; jn = jn.next) { + if (jn.other == that) { + if (jn.joint.m_collideConnected == false) { + return false; + } } - return _this; } - /** @internal */ - PolygonShape.prototype._serialize = function () { - return { - type: this.m_type, - vertices: this.m_vertices, - }; - }; - /** @internal */ - PolygonShape._deserialize = function (data, fixture, restore) { - var vertices = []; - if (data.vertices) { - for (var i = 0; i < data.vertices.length; i++) { - vertices.push(restore(Vec2, data.vertices[i])); + return true; + }; + /** + * @internal Used for deserialize. + */ + Body.prototype._addFixture = function (fixture) { + if (this.isWorldLocked() == true) { + return null; + } + if (this.m_activeFlag) { + var broadPhase = this.m_world.m_broadPhase; + fixture.createProxies(broadPhase, this.m_xf); + } + fixture.m_next = this.m_fixtureList; + this.m_fixtureList = fixture; + // Adjust mass properties if needed. + if (fixture.m_density > 0.0) { + this.resetMassData(); + } + // Let the world know we have a new fixture. This will cause new contacts + // to be created at the beginning of the next time step. + this.m_world.m_newFixture = true; + return fixture; + }; + // tslint:disable-next-line:typedef + Body.prototype.createFixture = function (shape, fixdef) { + if (this.isWorldLocked() == true) { + return null; + } + var fixture = new Fixture(this, shape, fixdef); + this._addFixture(fixture); + return fixture; + }; + /** + * Destroy a fixture. This removes the fixture from the broad-phase and destroys + * all contacts associated with this fixture. This will automatically adjust the + * mass of the body if the body is dynamic and the fixture has positive density. + * All fixtures attached to a body are implicitly destroyed when the body is + * destroyed. + * + * Warning: This function is locked during callbacks. + * + * @param fixture The fixture to be removed. + */ + Body.prototype.destroyFixture = function (fixture) { + if (this.isWorldLocked() == true) { + return; + } + if (this.m_fixtureList === fixture) { + this.m_fixtureList = fixture.m_next; + } + else { + var node = this.m_fixtureList; + while (node != null) { + if (node.m_next === fixture) { + node.m_next = fixture.m_next; + break; } + node = node.m_next; } - var shape = new PolygonShape(vertices); - return shape; - }; - PolygonShape.prototype.getVertex = function (index) { - return this.m_vertices[index]; - }; + } + // Destroy any contacts associated with the fixture. + var edge = this.m_contactList; + while (edge) { + var c = edge.contact; + edge = edge.next; + var fixtureA = c.getFixtureA(); + var fixtureB = c.getFixtureB(); + if (fixture == fixtureA || fixture == fixtureB) { + // This destroys the contact and removes it from + // this body's contact list. + this.m_world.destroyContact(c); + } + } + if (this.m_activeFlag) { + var broadPhase = this.m_world.m_broadPhase; + fixture.destroyProxies(broadPhase); + } + fixture.m_body = null; + fixture.m_next = null; + this.m_world.publish('remove-fixture', fixture); + // Reset the mass data. + this.resetMassData(); + }; + /** + * Get the corresponding world point of a local point. + */ + Body.prototype.getWorldPoint = function (localPoint) { + return Transform.mulVec2(this.m_xf, localPoint); + }; + /** + * Get the corresponding world vector of a local vector. + */ + Body.prototype.getWorldVector = function (localVector) { + return Rot.mulVec2(this.m_xf.q, localVector); + }; + /** + * Gets the corresponding local point of a world point. + */ + Body.prototype.getLocalPoint = function (worldPoint) { + return Transform.mulTVec2(this.m_xf, worldPoint); + }; + /** + * Gets the corresponding local vector of a world vector. + */ + Body.prototype.getLocalVector = function (worldVector) { + return Rot.mulTVec2(this.m_xf.q, worldVector); + }; + /** + * A static body does not move under simulation and behaves as if it has infinite mass. + * Internally, zero is stored for the mass and the inverse mass. + * Static bodies can be moved manually by the user. + * A static body has zero velocity. + * Static bodies do not collide with other static or kinematic bodies. + */ + Body.STATIC = 'static'; + /** + * A kinematic body moves under simulation according to its velocity. + * Kinematic bodies do not respond to forces. + * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity. + * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass. + * Kinematic bodies do not collide with other kinematic or static bodies. + */ + Body.KINEMATIC = 'kinematic'; + /** + * A dynamic body is fully simulated. + * They can be moved manually by the user, but normally they move according to forces. + * A dynamic body can collide with all body types. + * A dynamic body always has finite, non-zero mass. + * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate. + */ + Body.DYNAMIC = 'dynamic'; + return Body; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A joint edge is used to connect bodies and joints together in a joint graph + * where each body is a node and each joint is an edge. A joint edge belongs to + * a doubly linked list maintained in each attached body. Each joint has two + * joint nodes, one for each attached body. + */ +var JointEdge = /** @class */ (function () { + function JointEdge() { /** - * @internal - * @deprecated Shapes should be treated as immutable. - * - * clone the concrete shape. + * provides quick access to the other body attached. */ - PolygonShape.prototype._clone = function () { - var clone = new PolygonShape(); - clone.m_type = this.m_type; - clone.m_radius = this.m_radius; - clone.m_count = this.m_count; - clone.m_centroid.setVec2(this.m_centroid); - for (var i = 0; i < this.m_count; i++) { - clone.m_vertices.push(this.m_vertices[i].clone()); - } - for (var i = 0; i < this.m_normals.length; i++) { - clone.m_normals.push(this.m_normals[i].clone()); - } - return clone; - }; + this.other = null; /** - * Get the number of child primitives. + * the joint */ - PolygonShape.prototype.getChildCount = function () { - return 1; - }; - /** @internal */ - PolygonShape.prototype._reset = function () { - this._set(this.m_vertices); - }; + this.joint = null; /** - * @internal - * - * Create a convex hull from the given array of local points. The count must be - * in the range [3, Settings.maxPolygonVertices]. - * - * Warning: the points may be re-ordered, even if they form a convex polygon - * Warning: collinear points are handled but not removed. Collinear points may - * lead to poor stacking behavior. + * prev the previous joint edge in the body's joint list */ - PolygonShape.prototype._set = function (vertices) { - if (vertices.length < 3) { - this._setAsBox(1.0, 1.0); - return; + this.prev = null; + /** + * the next joint edge in the body's joint list + */ + this.next = null; + } + return JointEdge; +}()); +/** + * The base joint class. Joints are used to constraint two bodies together in + * various fashions. Some joints also feature limits and motors. + */ +var Joint = /** @class */ (function () { + function Joint(def, bodyA, bodyB) { + /** @internal */ this.m_type = 'unknown-joint'; + /** @internal */ this.m_prev = null; + /** @internal */ this.m_next = null; + /** @internal */ this.m_edgeA = new JointEdge(); + /** @internal */ this.m_edgeB = new JointEdge(); + /** @internal */ this.m_islandFlag = false; + bodyA = 'bodyA' in def ? def.bodyA : bodyA; + bodyB = 'bodyB' in def ? def.bodyB : bodyB; + this.m_bodyA = bodyA; + this.m_bodyB = bodyB; + this.m_collideConnected = !!def.collideConnected; + this.m_userData = def.userData; + } + /** + * Short-cut function to determine if either body is inactive. + */ + Joint.prototype.isActive = function () { + return this.m_bodyA.isActive() && this.m_bodyB.isActive(); + }; + /** + * Get the type of the concrete joint. + */ + Joint.prototype.getType = function () { + return this.m_type; + }; + /** + * Get the first body attached to this joint. + */ + Joint.prototype.getBodyA = function () { + return this.m_bodyA; + }; + /** + * Get the second body attached to this joint. + */ + Joint.prototype.getBodyB = function () { + return this.m_bodyB; + }; + /** + * Get the next joint the world joint list. + */ + Joint.prototype.getNext = function () { + return this.m_next; + }; + Joint.prototype.getUserData = function () { + return this.m_userData; + }; + Joint.prototype.setUserData = function (data) { + this.m_userData = data; + }; + /** + * Get collide connected. Note: modifying the collide connect flag won't work + * correctly because the flag is only checked when fixture AABBs begin to + * overlap. + */ + Joint.prototype.getCollideConnected = function () { + return this.m_collideConnected; + }; + /** + * Shift the origin for any points stored in world coordinates. + */ + Joint.prototype.shiftOrigin = function (newOrigin) { }; + return Joint; +}()); + +var stats = { + gjkCalls: 0, + gjkIters: 0, + gjkMaxIters: 0, + toiTime: 0, + toiMaxTime: 0, + toiCalls: 0, + toiIters: 0, + toiMaxIters: 0, + toiRootIters: 0, + toiMaxRootIters: 0, + toString: function (newline) { + newline = typeof newline === 'string' ? newline : '\n'; + var string = ""; + // tslint:disable-next-line:no-for-in + for (var name_1 in this) { + if (typeof this[name_1] !== 'function' && typeof this[name_1] !== 'object') { + string += name_1 + ': ' + this[name_1] + newline; } - var n = math$1.min(vertices.length, Settings.maxPolygonVertices); - // Perform welding and copy vertices into local buffer. - var ps = []; // [Settings.maxPolygonVertices]; - for (var i = 0; i < n; ++i) { - var v = vertices[i]; - var unique = true; - for (var j = 0; j < ps.length; ++j) { - if (Vec2.distanceSquared(v, ps[j]) < 0.25 * Settings.linearSlopSquared) { - unique = false; - break; - } - } - if (unique) { - ps.push(v); - } + } + return string; + } +}; + +var now = function () { + return Date.now(); +}; +var diff = function (time) { + return Date.now() - time; +}; +var Timer = { + now: now, + diff: diff, +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates. + */ +stats.gjkCalls = 0; +stats.gjkIters = 0; +stats.gjkMaxIters = 0; +/** + * Input for Distance. You have to option to use the shape radii in the + * computation. Even + */ +var DistanceInput = /** @class */ (function () { + function DistanceInput() { + this.proxyA = new DistanceProxy(); + this.proxyB = new DistanceProxy(); + this.transformA = null; + this.transformB = null; + this.useRadii = false; + } + return DistanceInput; +}()); +/** + * Output for Distance. + * + * @prop {Vec2} pointA closest point on shapeA + * @prop {Vec2} pointB closest point on shapeB + * @prop distance + * @prop iterations number of GJK iterations used + */ +var DistanceOutput = /** @class */ (function () { + function DistanceOutput() { + this.pointA = Vec2.zero(); + this.pointB = Vec2.zero(); + } + return DistanceOutput; +}()); +/** + * Used to warm start Distance. Set count to zero on first call. + * + * @prop {number} metric length or area + * @prop {array} indexA vertices on shape A + * @prop {array} indexB vertices on shape B + * @prop {number} count + */ +var SimplexCache = /** @class */ (function () { + function SimplexCache() { + this.metric = 0; + this.indexA = []; + this.indexB = []; + this.count = 0; + } + return SimplexCache; +}()); +/** + * Compute the closest points between two shapes. Supports any combination of: + * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On + * the first call set SimplexCache.count to zero. + */ +var Distance = function (output, cache, input) { + ++stats.gjkCalls; + var proxyA = input.proxyA; + var proxyB = input.proxyB; + var xfA = input.transformA; + var xfB = input.transformB; + // Initialize the simplex. + var simplex = new Simplex(); + simplex.readCache(cache, proxyA, xfA, proxyB, xfB); + // Get simplex vertices as an array. + var vertices = simplex.m_v; + var k_maxIters = Settings.maxDistnceIterations; + // These store the vertices of the last simplex so that we + // can check for duplicates and prevent cycling. + var saveA = []; + var saveB = []; // int[3] + var saveCount = 0; + // Main iteration loop. + var iter = 0; + while (iter < k_maxIters) { + // Copy simplex so we can identify duplicates. + saveCount = simplex.m_count; + for (var i = 0; i < saveCount; ++i) { + saveA[i] = vertices[i].indexA; + saveB[i] = vertices[i].indexB; + } + simplex.solve(); + // If we have 3 points, then the origin is in the corresponding triangle. + if (simplex.m_count === 3) { + break; + } + // Compute closest point. + var p = simplex.getClosestPoint(); + p.lengthSquared(); + // Get search direction. + var d = simplex.getSearchDirection(); + // Ensure the search direction is numerically fit. + if (d.lengthSquared() < math.EPSILON * math.EPSILON) { + // The origin is probably contained by a line segment + // or triangle. Thus the shapes are overlapped. + // We can't return zero here even though there may be overlap. + // In case the simplex is a point, segment, or triangle it is difficult + // to determine if the origin is contained in the CSO or very close to it. + break; + } + // Compute a tentative new simplex vertex using support points. + var vertex = vertices[simplex.m_count]; // SimplexVertex + vertex.indexA = proxyA.getSupport(Rot.mulTVec2(xfA.q, Vec2.neg(d))); + vertex.wA = Transform.mulVec2(xfA, proxyA.getVertex(vertex.indexA)); + vertex.indexB = proxyB.getSupport(Rot.mulTVec2(xfB.q, d)); + vertex.wB = Transform.mulVec2(xfB, proxyB.getVertex(vertex.indexB)); + vertex.w = Vec2.sub(vertex.wB, vertex.wA); + // Iteration count is equated to the number of support point calls. + ++iter; + ++stats.gjkIters; + // Check for duplicate support points. This is the main termination + // criteria. + var duplicate = false; + for (var i = 0; i < saveCount; ++i) { + if (vertex.indexA === saveA[i] && vertex.indexB === saveB[i]) { + duplicate = true; + break; } - n = ps.length; - if (n < 3) { - this._setAsBox(1.0, 1.0); - return; + } + // If we found a duplicate support point we must exit to avoid cycling. + if (duplicate) { + break; + } + // New vertex is ok and needed. + ++simplex.m_count; + } + stats.gjkMaxIters = math.max(stats.gjkMaxIters, iter); + // Prepare output. + simplex.getWitnessPoints(output.pointA, output.pointB); + output.distance = Vec2.distance(output.pointA, output.pointB); + output.iterations = iter; + // Cache the simplex. + simplex.writeCache(cache); + // Apply radii if requested. + if (input.useRadii) { + var rA = proxyA.m_radius; + var rB = proxyB.m_radius; + if (output.distance > rA + rB && output.distance > math.EPSILON) { + // Shapes are still no overlapped. + // Move the witness points to the outer surface. + output.distance -= rA + rB; + var normal = Vec2.sub(output.pointB, output.pointA); + normal.normalize(); + output.pointA.addMul(rA, normal); + output.pointB.subMul(rB, normal); + } + else { + // Shapes are overlapped when radii are considered. + // Move the witness points to the middle. + var p = Vec2.mid(output.pointA, output.pointB); + output.pointA.setVec2(p); + output.pointB.setVec2(p); + output.distance = 0.0; + } + } +}; +/** + * A distance proxy is used by the GJK algorithm. It encapsulates any shape. + */ +var DistanceProxy = /** @class */ (function () { + function DistanceProxy() { + this.m_buffer = []; // Vec2[2] + this.m_vertices = []; // Vec2[] + this.m_count = 0; + this.m_radius = 0; + } + /** + * Get the vertex count. + */ + DistanceProxy.prototype.getVertexCount = function () { + return this.m_count; + }; + /** + * Get a vertex by index. Used by Distance. + */ + DistanceProxy.prototype.getVertex = function (index) { + return this.m_vertices[index]; + }; + /** + * Get the supporting vertex index in the given direction. + */ + DistanceProxy.prototype.getSupport = function (d) { + var bestIndex = 0; + var bestValue = Vec2.dot(this.m_vertices[0], d); + for (var i = 0; i < this.m_count; ++i) { + var value = Vec2.dot(this.m_vertices[i], d); + if (value > bestValue) { + bestIndex = i; + bestValue = value; } - // Create the convex hull using the Gift wrapping algorithm - // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm - // Find the right most point on the hull (in case of multiple points bottom most is used) - var i0 = 0; - var x0 = ps[0].x; - for (var i = 1; i < n; ++i) { - var x = ps[i].x; - if (x > x0 || (x === x0 && ps[i].y < ps[i0].y)) { - i0 = i; - x0 = x; - } + } + return bestIndex; + }; + /** + * Get the supporting vertex in the given direction. + */ + DistanceProxy.prototype.getSupportVertex = function (d) { + return this.m_vertices[this.getSupport(d)]; + }; + /** + * Initialize the proxy using the given shape. The shape must remain in scope + * while the proxy is in use. + */ + DistanceProxy.prototype.set = function (shape, index) { + shape.computeDistanceProxy(this, index); + }; + return DistanceProxy; +}()); +var SimplexVertex = /** @class */ (function () { + function SimplexVertex() { + /** support point in proxyA */ + this.wA = Vec2.zero(); + /** support point in proxyB */ + this.wB = Vec2.zero(); + /** wB - wA; */ + this.w = Vec2.zero(); + } + SimplexVertex.prototype.set = function (v) { + this.indexA = v.indexA; + this.indexB = v.indexB; + this.wA = Vec2.clone(v.wA); + this.wB = Vec2.clone(v.wB); + this.w = Vec2.clone(v.w); + this.a = v.a; + }; + return SimplexVertex; +}()); +var Simplex = /** @class */ (function () { + function Simplex() { + this.m_v1 = new SimplexVertex(); + this.m_v2 = new SimplexVertex(); + this.m_v3 = new SimplexVertex(); + this.m_v = [this.m_v1, this.m_v2, this.m_v3]; + this.m_count; + } + /** @internal */ + Simplex.prototype.toString = function () { + if (this.m_count === 3) { + return ["+" + this.m_count, + this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y, + this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y, + this.m_v3.a, this.m_v3.wA.x, this.m_v3.wA.y, this.m_v3.wB.x, this.m_v3.wB.y + ].toString(); + } + else if (this.m_count === 2) { + return ["+" + this.m_count, + this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y, + this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y + ].toString(); + } + else if (this.m_count === 1) { + return ["+" + this.m_count, + this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y + ].toString(); + } + else { + return "+" + this.m_count; + } + }; + Simplex.prototype.readCache = function (cache, proxyA, transformA, proxyB, transformB) { + // Copy data from cache. + this.m_count = cache.count; + for (var i = 0; i < this.m_count; ++i) { + var v = this.m_v[i]; + v.indexA = cache.indexA[i]; + v.indexB = cache.indexB[i]; + var wALocal = proxyA.getVertex(v.indexA); + var wBLocal = proxyB.getVertex(v.indexB); + v.wA = Transform.mulVec2(transformA, wALocal); + v.wB = Transform.mulVec2(transformB, wBLocal); + v.w = Vec2.sub(v.wB, v.wA); + v.a = 0.0; + } + // Compute the new simplex metric, if it is substantially different than + // old metric then flush the simplex. + if (this.m_count > 1) { + var metric1 = cache.metric; + var metric2 = this.getMetric(); + if (metric2 < 0.5 * metric1 || 2.0 * metric1 < metric2 + || metric2 < math.EPSILON) { + // Reset the simplex. + this.m_count = 0; } - var hull = []; // [Settings.maxPolygonVertices]; - var m = 0; - var ih = i0; - while (true) { - hull[m] = ih; - var ie = 0; - for (var j = 1; j < n; ++j) { - if (ie === ih) { - ie = j; - continue; - } - var r = Vec2.sub(ps[ie], ps[hull[m]]); - var v = Vec2.sub(ps[j], ps[hull[m]]); - var c = Vec2.crossVec2Vec2(r, v); - // c < 0 means counter-clockwise wrapping, c > 0 means clockwise wrapping - if (c < 0.0) { - ie = j; - } - // Collinearity check - if (c === 0.0 && v.lengthSquared() > r.lengthSquared()) { - ie = j; - } + } + // If the cache is empty or invalid... + if (this.m_count === 0) { + var v = this.m_v[0]; + v.indexA = 0; + v.indexB = 0; + var wALocal = proxyA.getVertex(0); + var wBLocal = proxyB.getVertex(0); + v.wA = Transform.mulVec2(transformA, wALocal); + v.wB = Transform.mulVec2(transformB, wBLocal); + v.w = Vec2.sub(v.wB, v.wA); + v.a = 1.0; + this.m_count = 1; + } + }; + Simplex.prototype.writeCache = function (cache) { + cache.metric = this.getMetric(); + cache.count = this.m_count; + for (var i = 0; i < this.m_count; ++i) { + cache.indexA[i] = this.m_v[i].indexA; + cache.indexB[i] = this.m_v[i].indexB; + } + }; + Simplex.prototype.getSearchDirection = function () { + switch (this.m_count) { + case 1: + return Vec2.neg(this.m_v1.w); + case 2: { + var e12 = Vec2.sub(this.m_v2.w, this.m_v1.w); + var sgn = Vec2.crossVec2Vec2(e12, Vec2.neg(this.m_v1.w)); + if (sgn > 0.0) { + // Origin is left of e12. + return Vec2.crossNumVec2(1.0, e12); } - ++m; - ih = ie; - if (ie === i0) { - break; + else { + // Origin is right of e12. + return Vec2.crossVec2Num(e12, 1.0); } } - if (m < 3) { - this._setAsBox(1.0, 1.0); - return; + default: + return Vec2.zero(); + } + }; + Simplex.prototype.getClosestPoint = function () { + switch (this.m_count) { + case 0: + return Vec2.zero(); + case 1: + return Vec2.clone(this.m_v1.w); + case 2: + return Vec2.combine(this.m_v1.a, this.m_v1.w, this.m_v2.a, this.m_v2.w); + case 3: + return Vec2.zero(); + default: + return Vec2.zero(); + } + }; + Simplex.prototype.getWitnessPoints = function (pA, pB) { + switch (this.m_count) { + case 0: + break; + case 1: + pA.setVec2(this.m_v1.wA); + pB.setVec2(this.m_v1.wB); + break; + case 2: + pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA); + pB.setCombine(this.m_v1.a, this.m_v1.wB, this.m_v2.a, this.m_v2.wB); + break; + case 3: + pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA); + pA.addMul(this.m_v3.a, this.m_v3.wA); + pB.setVec2(pA); + break; + } + }; + Simplex.prototype.getMetric = function () { + switch (this.m_count) { + case 0: + return 0.0; + case 1: + return 0.0; + case 2: + return Vec2.distance(this.m_v1.w, this.m_v2.w); + case 3: + return Vec2.crossVec2Vec2(Vec2.sub(this.m_v2.w, this.m_v1.w), Vec2.sub(this.m_v3.w, this.m_v1.w)); + default: + return 0.0; + } + }; + Simplex.prototype.solve = function () { + switch (this.m_count) { + case 1: + break; + case 2: + this.solve2(); + break; + case 3: + this.solve3(); + break; + } + }; + // Solve a line segment using barycentric coordinates. + // + // p = a1 * w1 + a2 * w2 + // a1 + a2 = 1 + // + // The vector from the origin to the closest point on the line is + // perpendicular to the line. + // e12 = w2 - w1 + // dot(p, e) = 0 + // a1 * dot(w1, e) + a2 * dot(w2, e) = 0 + // + // 2-by-2 linear system + // [1 1 ][a1] = [1] + // [w1.e12 w2.e12][a2] = [0] + // + // Define + // d12_1 = dot(w2, e12) + // d12_2 = -dot(w1, e12) + // d12 = d12_1 + d12_2 + // + // Solution + // a1 = d12_1 / d12 + // a2 = d12_2 / d12 + Simplex.prototype.solve2 = function () { + var w1 = this.m_v1.w; + var w2 = this.m_v2.w; + var e12 = Vec2.sub(w2, w1); + // w1 region + var d12_2 = -Vec2.dot(w1, e12); + if (d12_2 <= 0.0) { + // a2 <= 0, so we clamp it to 0 + this.m_v1.a = 1.0; + this.m_count = 1; + return; + } + // w2 region + var d12_1 = Vec2.dot(w2, e12); + if (d12_1 <= 0.0) { + // a1 <= 0, so we clamp it to 0 + this.m_v2.a = 1.0; + this.m_count = 1; + this.m_v1.set(this.m_v2); + return; + } + // Must be in e12 region. + var inv_d12 = 1.0 / (d12_1 + d12_2); + this.m_v1.a = d12_1 * inv_d12; + this.m_v2.a = d12_2 * inv_d12; + this.m_count = 2; + }; + // Possible regions: + // - points[2] + // - edge points[0]-points[2] + // - edge points[1]-points[2] + // - inside the triangle + Simplex.prototype.solve3 = function () { + var w1 = this.m_v1.w; + var w2 = this.m_v2.w; + var w3 = this.m_v3.w; + // Edge12 + // [1 1 ][a1] = [1] + // [w1.e12 w2.e12][a2] = [0] + // a3 = 0 + var e12 = Vec2.sub(w2, w1); + var w1e12 = Vec2.dot(w1, e12); + var w2e12 = Vec2.dot(w2, e12); + var d12_1 = w2e12; + var d12_2 = -w1e12; + // Edge13 + // [1 1 ][a1] = [1] + // [w1.e13 w3.e13][a3] = [0] + // a2 = 0 + var e13 = Vec2.sub(w3, w1); + var w1e13 = Vec2.dot(w1, e13); + var w3e13 = Vec2.dot(w3, e13); + var d13_1 = w3e13; + var d13_2 = -w1e13; + // Edge23 + // [1 1 ][a2] = [1] + // [w2.e23 w3.e23][a3] = [0] + // a1 = 0 + var e23 = Vec2.sub(w3, w2); + var w2e23 = Vec2.dot(w2, e23); + var w3e23 = Vec2.dot(w3, e23); + var d23_1 = w3e23; + var d23_2 = -w2e23; + // Triangle123 + var n123 = Vec2.crossVec2Vec2(e12, e13); + var d123_1 = n123 * Vec2.crossVec2Vec2(w2, w3); + var d123_2 = n123 * Vec2.crossVec2Vec2(w3, w1); + var d123_3 = n123 * Vec2.crossVec2Vec2(w1, w2); + // w1 region + if (d12_2 <= 0.0 && d13_2 <= 0.0) { + this.m_v1.a = 1.0; + this.m_count = 1; + return; + } + // e12 + if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) { + var inv_d12 = 1.0 / (d12_1 + d12_2); + this.m_v1.a = d12_1 * inv_d12; + this.m_v2.a = d12_2 * inv_d12; + this.m_count = 2; + return; + } + // e13 + if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) { + var inv_d13 = 1.0 / (d13_1 + d13_2); + this.m_v1.a = d13_1 * inv_d13; + this.m_v3.a = d13_2 * inv_d13; + this.m_count = 2; + this.m_v2.set(this.m_v3); + return; + } + // w2 region + if (d12_1 <= 0.0 && d23_2 <= 0.0) { + this.m_v2.a = 1.0; + this.m_count = 1; + this.m_v1.set(this.m_v2); + return; + } + // w3 region + if (d13_1 <= 0.0 && d23_1 <= 0.0) { + this.m_v3.a = 1.0; + this.m_count = 1; + this.m_v1.set(this.m_v3); + return; + } + // e23 + if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) { + var inv_d23 = 1.0 / (d23_1 + d23_2); + this.m_v2.a = d23_1 * inv_d23; + this.m_v3.a = d23_2 * inv_d23; + this.m_count = 2; + this.m_v1.set(this.m_v3); + return; + } + // Must be in triangle123 + var inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3); + this.m_v1.a = d123_1 * inv_d123; + this.m_v2.a = d123_2 * inv_d123; + this.m_v3.a = d123_3 * inv_d123; + this.m_count = 3; + }; + return Simplex; +}()); +/** + * Determine if two generic shapes overlap. + */ +var testOverlap = function (shapeA, indexA, shapeB, indexB, xfA, xfB) { + var input = new DistanceInput(); + input.proxyA.set(shapeA, indexA); + input.proxyB.set(shapeB, indexB); + input.transformA = xfA; + input.transformB = xfB; + input.useRadii = true; + var cache = new SimplexCache(); + var output = new DistanceOutput(); + Distance(output, cache, input); + return output.distance < 10.0 * math.EPSILON; +}; +// legacy exports +Distance.testOverlap = testOverlap; +Distance.Input = DistanceInput; +Distance.Output = DistanceOutput; +Distance.Proxy = DistanceProxy; +Distance.Cache = SimplexCache; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * Input parameters for TimeOfImpact. + */ +var TOIInput = /** @class */ (function () { + function TOIInput() { + this.proxyA = new DistanceProxy(); + this.proxyB = new DistanceProxy(); + this.sweepA = new Sweep(); + this.sweepB = new Sweep(); + } + return TOIInput; +}()); +var TOIOutputState; +(function (TOIOutputState) { + TOIOutputState[TOIOutputState["e_unknown"] = 0] = "e_unknown"; + TOIOutputState[TOIOutputState["e_failed"] = 1] = "e_failed"; + TOIOutputState[TOIOutputState["e_overlapped"] = 2] = "e_overlapped"; + TOIOutputState[TOIOutputState["e_touching"] = 3] = "e_touching"; + TOIOutputState[TOIOutputState["e_separated"] = 4] = "e_separated"; +})(TOIOutputState || (TOIOutputState = {})); +/** + * Output parameters for TimeOfImpact. + */ +var TOIOutput = /** @class */ (function () { + function TOIOutput() { + } + return TOIOutput; +}()); +stats.toiTime = 0; +stats.toiMaxTime = 0; +stats.toiCalls = 0; +stats.toiIters = 0; +stats.toiMaxIters = 0; +stats.toiRootIters = 0; +stats.toiMaxRootIters = 0; +/** + * Compute the upper bound on time before two shapes penetrate. Time is + * represented as a fraction between [0,tMax]. This uses a swept separating axis + * and may miss some intermediate, non-tunneling collision. If you change the + * time interval, you should call this function again. + * + * Note: use Distance to compute the contact point and normal at the time of + * impact. + * + * CCD via the local separating axis method. This seeks progression by computing + * the largest time at which separation is maintained. + */ +var TimeOfImpact = function (output, input) { + var timer = Timer.now(); + ++stats.toiCalls; + output.state = TOIOutputState.e_unknown; + output.t = input.tMax; + var proxyA = input.proxyA; // DistanceProxy + var proxyB = input.proxyB; // DistanceProxy + var sweepA = input.sweepA; // Sweep + var sweepB = input.sweepB; // Sweep + // Large rotations can make the root finder fail, so we normalize the + // sweep angles. + sweepA.normalize(); + sweepB.normalize(); + var tMax = input.tMax; + var totalRadius = proxyA.m_radius + proxyB.m_radius; + var target = math.max(Settings.linearSlop, totalRadius - 3.0 * Settings.linearSlop); + var tolerance = 0.25 * Settings.linearSlop; + var t1 = 0.0; + var k_maxIterations = Settings.maxTOIIterations; + var iter = 0; + // Prepare input for distance query. + var cache = new SimplexCache(); + var distanceInput = new DistanceInput(); + distanceInput.proxyA = input.proxyA; + distanceInput.proxyB = input.proxyB; + distanceInput.useRadii = false; + // The outer loop progressively attempts to compute new separating axes. + // This loop terminates when an axis is repeated (no progress is made). + while (true) { + var xfA = Transform.identity(); + var xfB = Transform.identity(); + sweepA.getTransform(xfA, t1); + sweepB.getTransform(xfB, t1); + // Get the distance between shapes. We can also use the results + // to get a separating axis. + distanceInput.transformA = xfA; + distanceInput.transformB = xfB; + var distanceOutput = new DistanceOutput(); + Distance(distanceOutput, cache, distanceInput); + // If the shapes are overlapped, we give up on continuous collision. + if (distanceOutput.distance <= 0.0) { + // Failure! + output.state = TOIOutputState.e_overlapped; + output.t = 0.0; + break; + } + if (distanceOutput.distance < target + tolerance) { + // Victory! + output.state = TOIOutputState.e_touching; + output.t = t1; + break; + } + // Initialize the separating axis. + var fcn = new SeparationFunction(); + fcn.initialize(cache, proxyA, sweepA, proxyB, sweepB, t1); + // if (false) { + // // Dump the curve seen by the root finder + // const N = 100; + // const dx = 1.0 / N; + // const xs = []; // [ N + 1 ]; + // const fs = []; // [ N + 1 ]; + // const x = 0.0; + // for (const i = 0; i <= N; ++i) { + // sweepA.getTransform(xfA, x); + // sweepB.getTransform(xfB, x); + // const f = fcn.evaluate(xfA, xfB) - target; + // printf("%g %g\n", x, f); + // xs[i] = x; + // fs[i] = f; + // x += dx; + // } + // } + // Compute the TOI on the separating axis. We do this by successively + // resolving the deepest point. This loop is bounded by the number of + // vertices. + var done = false; + var t2 = tMax; + var pushBackIter = 0; + while (true) { + // Find the deepest point at t2. Store the witness point indices. + var s2 = fcn.findMinSeparation(t2); + // const indexA = fcn.indexA; + // const indexB = fcn.indexB; + // Is the final configuration separated? + if (s2 > target + tolerance) { + // Victory! + output.state = TOIOutputState.e_separated; + output.t = tMax; + done = true; + break; } - this.m_count = m; - // Copy vertices. - this.m_vertices = []; - for (var i = 0; i < m; ++i) { - this.m_vertices[i] = ps[hull[i]]; + // Has the separation reached tolerance? + if (s2 > target - tolerance) { + // Advance the sweeps + t1 = t2; + break; } - // Compute normals. Ensure the edges have non-zero length. - for (var i = 0; i < m; ++i) { - var i1 = i; - var i2 = i + 1 < m ? i + 1 : 0; - var edge = Vec2.sub(this.m_vertices[i2], this.m_vertices[i1]); - this.m_normals[i] = Vec2.crossVec2Num(edge, 1.0); - this.m_normals[i].normalize(); + // Compute the initial separation of the witness points. + var s1 = fcn.evaluate(t1); + // const indexA = fcn.indexA; + // const indexB = fcn.indexB; + // Check for initial overlap. This might happen if the root finder + // runs out of iterations. + if (s1 < target - tolerance) { + output.state = TOIOutputState.e_failed; + output.t = t1; + done = true; + break; } - // Compute the polygon centroid. - this.m_centroid = ComputeCentroid(this.m_vertices, m); - }; - /** @internal */ - PolygonShape.prototype._setAsBox = function (hx, hy, center, angle) { - // start with right-bottom, counter-clockwise, as in Gift wrapping algorithm in PolygonShape._set() - this.m_vertices[0] = Vec2.neo(hx, -hy); - this.m_vertices[1] = Vec2.neo(hx, hy); - this.m_vertices[2] = Vec2.neo(-hx, hy); - this.m_vertices[3] = Vec2.neo(-hx, -hy); - this.m_normals[0] = Vec2.neo(1.0, 0.0); - this.m_normals[1] = Vec2.neo(0.0, 1.0); - this.m_normals[2] = Vec2.neo(-1.0, 0.0); - this.m_normals[3] = Vec2.neo(0.0, -1.0); - this.m_count = 4; - if (Vec2.isValid(center)) { - angle = angle || 0; - this.m_centroid.setVec2(center); - var xf = Transform.identity(); - xf.p.setVec2(center); - xf.q.setAngle(angle); - // Transform vertices and normals. - for (var i = 0; i < this.m_count; ++i) { - this.m_vertices[i] = Transform.mulVec2(xf, this.m_vertices[i]); - this.m_normals[i] = Rot.mulVec2(xf.q, this.m_normals[i]); - } + // Check for touching + if (s1 <= target + tolerance) { + // Victory! t1 should hold the TOI (could be 0.0). + output.state = TOIOutputState.e_touching; + output.t = t1; + done = true; + break; } - }; - /** - * Test a point for containment in this shape. This only works for convex - * shapes. - * - * @param xf The shape world transform. - * @param p A point in world coordinates. - */ - PolygonShape.prototype.testPoint = function (xf, p) { - var pLocal = Rot.mulTVec2(xf.q, Vec2.sub(p, xf.p)); - for (var i = 0; i < this.m_count; ++i) { - var dot = Vec2.dot(this.m_normals[i], Vec2.sub(pLocal, this.m_vertices[i])); - if (dot > 0.0) { - return false; + // Compute 1D root of: f(x) - target = 0 + var rootIterCount = 0; + var a1 = t1; + var a2 = t2; + while (true) { + // Use a mix of the secant rule and bisection. + var t = void 0; + if (rootIterCount & 1) { + // Secant rule to improve convergence. + t = a1 + (target - s1) * (a2 - a1) / (s2 - s1); } - } - return true; - }; - /** - * Cast a ray against a child shape. - * - * @param output The ray-cast results. - * @param input The ray-cast input parameters. - * @param xf The transform to be applied to the shape. - * @param childIndex The child shape index - */ - PolygonShape.prototype.rayCast = function (output, input, xf, childIndex) { - // Put the ray into the polygon's frame of reference. - var p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p)); - var p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p)); - var d = Vec2.sub(p2, p1); - var lower = 0.0; - var upper = input.maxFraction; - var index = -1; - for (var i = 0; i < this.m_count; ++i) { - // p = p1 + a * d - // dot(normal, p - v) = 0 - // dot(normal, p1 - v) + a * dot(normal, d) = 0 - var numerator = Vec2.dot(this.m_normals[i], Vec2.sub(this.m_vertices[i], p1)); - var denominator = Vec2.dot(this.m_normals[i], d); - if (denominator == 0.0) { - if (numerator < 0.0) { - return false; - } + else { + // Bisection to guarantee progress. + t = 0.5 * (a1 + a2); + } + ++rootIterCount; + ++stats.toiRootIters; + var s = fcn.evaluate(t); + fcn.indexA; + fcn.indexB; + if (math.abs(s - target) < tolerance) { + // t2 holds a tentative value for t1 + t2 = t; + break; + } + // Ensure we continue to bracket the root. + if (s > target) { + a1 = t; + s1 = s; } else { - // Note: we want this predicate without division: - // lower < numerator / denominator, where denominator < 0 - // Since denominator < 0, we have to flip the inequality: - // lower < numerator / denominator <==> denominator * lower > numerator. - if (denominator < 0.0 && numerator < lower * denominator) { - // Increase lower. - // The segment enters this half-space. - lower = numerator / denominator; - index = i; - } - else if (denominator > 0.0 && numerator < upper * denominator) { - // Decrease upper. - // The segment exits this half-space. - upper = numerator / denominator; - } + a2 = t; + s2 = s; } - // The use of epsilon here causes the assert on lower to trip - // in some cases. Apparently the use of epsilon was to make edge - // shapes work, but now those are handled separately. - // if (upper < lower - Math.EPSILON) - if (upper < lower) { - return false; + if (rootIterCount === 50) { + break; } } - if (index >= 0) { - output.fraction = lower; - output.normal = Rot.mulVec2(xf.q, this.m_normals[index]); - return true; - } - return false; - }; - /** - * Given a transform, compute the associated axis aligned bounding box for a - * child shape. - * - * @param aabb Returns the axis aligned box. - * @param xf The world transform of the shape. - * @param childIndex The child shape - */ - PolygonShape.prototype.computeAABB = function (aabb, xf, childIndex) { - var minX = Infinity; - var minY = Infinity; - var maxX = -Infinity; - var maxY = -Infinity; - for (var i = 0; i < this.m_count; ++i) { - var v = Transform.mulVec2(xf, this.m_vertices[i]); - minX = math$1.min(minX, v.x); - maxX = math$1.max(maxX, v.x); - minY = math$1.min(minY, v.y); - maxY = math$1.max(maxY, v.y); - } - aabb.lowerBound.setNum(minX, minY); - aabb.upperBound.setNum(maxX, maxY); - aabb.extend(this.m_radius); - }; - /** - * Compute the mass properties of this shape using its dimensions and density. - * The inertia tensor is computed about the local origin. - * - * @param massData Returns the mass data for this shape. - * @param density The density in kilograms per meter squared. - */ - PolygonShape.prototype.computeMass = function (massData, density) { - var center = Vec2.zero(); - var area = 0.0; - var I = 0.0; - // s is the reference point for forming triangles. - // It's location doesn't change the result (except for rounding error). - var s = Vec2.zero(); - // This code would put the reference point inside the polygon. - for (var i = 0; i < this.m_count; ++i) { - s.add(this.m_vertices[i]); - } - s.mul(1.0 / this.m_count); - var k_inv3 = 1.0 / 3.0; - for (var i = 0; i < this.m_count; ++i) { - // Triangle vertices. - var e1 = Vec2.sub(this.m_vertices[i], s); - var e2 = i + 1 < this.m_count ? Vec2.sub(this.m_vertices[i + 1], s) : Vec2.sub(this.m_vertices[0], s); - var D = Vec2.crossVec2Vec2(e1, e2); - var triangleArea = 0.5 * D; - area += triangleArea; - // Area weighted centroid - center.addCombine(triangleArea * k_inv3, e1, triangleArea * k_inv3, e2); - var ex1 = e1.x; - var ey1 = e1.y; - var ex2 = e2.x; - var ey2 = e2.y; - var intx2 = ex1 * ex1 + ex2 * ex1 + ex2 * ex2; - var inty2 = ey1 * ey1 + ey2 * ey1 + ey2 * ey2; - I += (0.25 * k_inv3 * D) * (intx2 + inty2); - } - // Total mass - massData.mass = density * area; - center.mul(1.0 / area); - massData.center.setCombine(1, center, 1, s); - // Inertia tensor relative to the local origin (point s). - massData.I = density * I; - // Shift to center of mass then to original body origin. - massData.I += massData.mass * (Vec2.dot(massData.center, massData.center) - Vec2.dot(center, center)); - }; - /** - * Validate convexity. This is a very time consuming operation. - * @returns true if valid - */ - PolygonShape.prototype.validate = function () { - for (var i = 0; i < this.m_count; ++i) { - var i1 = i; - var i2 = i < this.m_count - 1 ? i1 + 1 : 0; - var p = this.m_vertices[i1]; - var e = Vec2.sub(this.m_vertices[i2], p); - for (var j = 0; j < this.m_count; ++j) { - if (j == i1 || j == i2) { - continue; - } - var v = Vec2.sub(this.m_vertices[j], p); - var c = Vec2.crossVec2Vec2(e, v); - if (c < 0.0) { - return false; - } - } + stats.toiMaxRootIters = math.max(stats.toiMaxRootIters, rootIterCount); + ++pushBackIter; + if (pushBackIter === Settings.maxPolygonVertices) { + break; } - return true; - }; - PolygonShape.prototype.computeDistanceProxy = function (proxy) { - proxy.m_vertices = this.m_vertices; - proxy.m_count = this.m_count; - proxy.m_radius = this.m_radius; - }; - PolygonShape.TYPE = 'polygon'; - return PolygonShape; - }(Shape)); - function ComputeCentroid(vs, count) { - var c = Vec2.zero(); - var area = 0.0; - // pRef is the reference point for forming triangles. - // It's location doesn't change the result (except for rounding error). - var pRef = Vec2.zero(); - var i; - var inv3 = 1.0 / 3.0; - for (var i = 0; i < count; ++i) { - // Triangle vertices. - var p1 = pRef; - var p2 = vs[i]; - var p3 = i + 1 < count ? vs[i + 1] : vs[0]; - var e1 = Vec2.sub(p2, p1); - var e2 = Vec2.sub(p3, p1); - var D = Vec2.crossVec2Vec2(e1, e2); - var triangleArea = 0.5 * D; - area += triangleArea; - // Area weighted centroid - c.addMul(triangleArea * inv3, p1); - c.addMul(triangleArea * inv3, p2); - c.addMul(triangleArea * inv3, p3); } - c.mul(1.0 / area); - return c; + ++iter; + ++stats.toiIters; + if (done) { + break; + } + if (iter === k_maxIterations) { + // Root finder got stuck. Semi-victory. + output.state = TOIOutputState.e_failed; + output.t = t1; + break; + } } - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * A rectangle polygon which extend PolygonShape. - */ - var BoxShape = /** @class */ (function (_super) { - __extends(BoxShape, _super); - function BoxShape(hx, hy, center, angle) { - var _this = this; - // @ts-ignore - if (!(_this instanceof BoxShape)) { - return new BoxShape(hx, hy, center, angle); - } - _this = _super.call(this) || this; - _this._setAsBox(hx, hy, center, angle); - return _this; + stats.toiMaxIters = math.max(stats.toiMaxIters, iter); + var time = Timer.diff(timer); + stats.toiMaxTime = math.max(stats.toiMaxTime, time); + stats.toiTime += time; +}; +var SeparationFunctionType; +(function (SeparationFunctionType) { + SeparationFunctionType[SeparationFunctionType["e_points"] = 1] = "e_points"; + SeparationFunctionType[SeparationFunctionType["e_faceA"] = 2] = "e_faceA"; + SeparationFunctionType[SeparationFunctionType["e_faceB"] = 3] = "e_faceB"; +})(SeparationFunctionType || (SeparationFunctionType = {})); +var SeparationFunction = /** @class */ (function () { + function SeparationFunction() { + this.m_proxyA = new DistanceProxy(); + this.m_proxyB = new DistanceProxy(); + this.m_localPoint = Vec2.zero(); + this.m_axis = Vec2.zero(); + } + // TODO_ERIN might not need to return the separation + SeparationFunction.prototype.initialize = function (cache, proxyA, sweepA, proxyB, sweepB, t1) { + this.m_proxyA = proxyA; + this.m_proxyB = proxyB; + var count = cache.count; + this.m_sweepA = sweepA; + this.m_sweepB = sweepB; + var xfA = Transform.identity(); + var xfB = Transform.identity(); + this.m_sweepA.getTransform(xfA, t1); + this.m_sweepB.getTransform(xfB, t1); + if (count === 1) { + this.m_type = SeparationFunctionType.e_points; + var localPointA = this.m_proxyA.getVertex(cache.indexA[0]); + var localPointB = this.m_proxyB.getVertex(cache.indexB[0]); + var pointA = Transform.mulVec2(xfA, localPointA); + var pointB = Transform.mulVec2(xfB, localPointB); + this.m_axis.setCombine(1, pointB, -1, pointA); + var s = this.m_axis.normalize(); + return s; } - BoxShape.TYPE = 'polygon'; - return BoxShape; - }(PolygonShape)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var CircleShape = /** @class */ (function (_super) { - __extends(CircleShape, _super); - // tslint:disable-next-line:typedef - function CircleShape(a, b) { - var _this = this; - // @ts-ignore - if (!(_this instanceof CircleShape)) { - return new CircleShape(a, b); + else if (cache.indexA[0] === cache.indexA[1]) { + // Two points on B and one on A. + this.m_type = SeparationFunctionType.e_faceB; + var localPointB1 = proxyB.getVertex(cache.indexB[0]); + var localPointB2 = proxyB.getVertex(cache.indexB[1]); + this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointB2, localPointB1), 1.0); + this.m_axis.normalize(); + var normal = Rot.mulVec2(xfB.q, this.m_axis); + this.m_localPoint = Vec2.mid(localPointB1, localPointB2); + var pointB = Transform.mulVec2(xfB, this.m_localPoint); + var localPointA = proxyA.getVertex(cache.indexA[0]); + var pointA = Transform.mulVec2(xfA, localPointA); + var s = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal); + if (s < 0.0) { + this.m_axis = Vec2.neg(this.m_axis); + s = -s; + } + return s; + } + else { + // Two points on A and one or two points on B. + this.m_type = SeparationFunctionType.e_faceA; + var localPointA1 = this.m_proxyA.getVertex(cache.indexA[0]); + var localPointA2 = this.m_proxyA.getVertex(cache.indexA[1]); + this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointA2, localPointA1), 1.0); + this.m_axis.normalize(); + var normal = Rot.mulVec2(xfA.q, this.m_axis); + this.m_localPoint = Vec2.mid(localPointA1, localPointA2); + var pointA = Transform.mulVec2(xfA, this.m_localPoint); + var localPointB = this.m_proxyB.getVertex(cache.indexB[0]); + var pointB = Transform.mulVec2(xfB, localPointB); + var s = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal); + if (s < 0.0) { + this.m_axis = Vec2.neg(this.m_axis); + s = -s; + } + return s; + } + }; + SeparationFunction.prototype.compute = function (find, t) { + // It was findMinSeparation and evaluate + var xfA = Transform.identity(); + var xfB = Transform.identity(); + this.m_sweepA.getTransform(xfA, t); + this.m_sweepB.getTransform(xfB, t); + switch (this.m_type) { + case SeparationFunctionType.e_points: { + if (find) { + var axisA = Rot.mulTVec2(xfA.q, this.m_axis); + var axisB = Rot.mulTVec2(xfB.q, Vec2.neg(this.m_axis)); + this.indexA = this.m_proxyA.getSupport(axisA); + this.indexB = this.m_proxyB.getSupport(axisB); + } + var localPointA = this.m_proxyA.getVertex(this.indexA); + var localPointB = this.m_proxyB.getVertex(this.indexB); + var pointA = Transform.mulVec2(xfA, localPointA); + var pointB = Transform.mulVec2(xfB, localPointB); + var sep = Vec2.dot(pointB, this.m_axis) - Vec2.dot(pointA, this.m_axis); + return sep; } - _this = _super.call(this) || this; - _this.m_type = CircleShape.TYPE; - _this.m_p = Vec2.zero(); - _this.m_radius = 1; - if (typeof a === 'object' && Vec2.isValid(a)) { - _this.m_p.setVec2(a); - if (typeof b === 'number') { - _this.m_radius = b; + case SeparationFunctionType.e_faceA: { + var normal = Rot.mulVec2(xfA.q, this.m_axis); + var pointA = Transform.mulVec2(xfA, this.m_localPoint); + if (find) { + var axisB = Rot.mulTVec2(xfB.q, Vec2.neg(normal)); + this.indexA = -1; + this.indexB = this.m_proxyB.getSupport(axisB); } + var localPointB = this.m_proxyB.getVertex(this.indexB); + var pointB = Transform.mulVec2(xfB, localPointB); + var sep = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal); + return sep; } - else if (typeof a === 'number') { - _this.m_radius = a; + case SeparationFunctionType.e_faceB: { + var normal = Rot.mulVec2(xfB.q, this.m_axis); + var pointB = Transform.mulVec2(xfB, this.m_localPoint); + if (find) { + var axisA = Rot.mulTVec2(xfA.q, Vec2.neg(normal)); + this.indexB = -1; + this.indexA = this.m_proxyA.getSupport(axisA); + } + var localPointA = this.m_proxyA.getVertex(this.indexA); + var pointA = Transform.mulVec2(xfA, localPointA); + var sep = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal); + return sep; } - return _this; + default: + if (find) { + this.indexA = -1; + this.indexB = -1; + } + return 0.0; } - /** @internal */ - CircleShape.prototype._serialize = function () { - return { - type: this.m_type, - p: this.m_p, - radius: this.m_radius, - }; - }; - /** @internal */ - CircleShape._deserialize = function (data) { - return new CircleShape(data.p, data.radius); - }; - // TODO: already defined in Shape - CircleShape.prototype.getRadius = function () { - return this.m_radius; - }; - CircleShape.prototype.getCenter = function () { - return this.m_p; - }; - CircleShape.prototype.getVertex = function (index) { - return this.m_p; - }; - /** - * @internal - * @deprecated Shapes should be treated as immutable. - * - * clone the concrete shape. - */ - CircleShape.prototype._clone = function () { - var clone = new CircleShape(); - clone.m_type = this.m_type; - clone.m_radius = this.m_radius; - clone.m_p = this.m_p.clone(); - return clone; - }; - /** - * Get the number of child primitives. - */ - CircleShape.prototype.getChildCount = function () { - return 1; - }; - /** - * Test a point for containment in this shape. This only works for convex - * shapes. - * - * @param xf The shape world transform. - * @param p A point in world coordinates. - */ - CircleShape.prototype.testPoint = function (xf, p) { - var center = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); - var d = Vec2.sub(p, center); - return Vec2.dot(d, d) <= this.m_radius * this.m_radius; - }; - /** - * Cast a ray against a child shape. - * - * @param output The ray-cast results. - * @param input The ray-cast input parameters. - * @param xf The transform to be applied to the shape. - * @param childIndex The child shape index - */ - CircleShape.prototype.rayCast = function (output, input, xf, childIndex) { - // Collision Detection in Interactive 3D Environments by Gino van den Bergen - // From Section 3.1.2 - // x = s + a * r - // norm(x) = radius - var position = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); - var s = Vec2.sub(input.p1, position); - var b = Vec2.dot(s, s) - this.m_radius * this.m_radius; - // Solve quadratic equation. - var r = Vec2.sub(input.p2, input.p1); - var c = Vec2.dot(s, r); - var rr = Vec2.dot(r, r); - var sigma = c * c - rr * b; - // Check for negative discriminant and short segment. - if (sigma < 0.0 || rr < math$1.EPSILON) { - return false; - } - // Find the point of intersection of the line with the circle. - var a = -(c + math$1.sqrt(sigma)); - // Is the intersection point on the segment? - if (0.0 <= a && a <= input.maxFraction * rr) { - a /= rr; - output.fraction = a; - output.normal = Vec2.add(s, Vec2.mulNumVec2(a, r)); - output.normal.normalize(); - return true; - } - return false; - }; - /** - * Given a transform, compute the associated axis aligned bounding box for a - * child shape. - * - * @param aabb Returns the axis aligned box. - * @param xf The world transform of the shape. - * @param childIndex The child shape - */ - CircleShape.prototype.computeAABB = function (aabb, xf, childIndex) { - var p = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); - aabb.lowerBound.setNum(p.x - this.m_radius, p.y - this.m_radius); - aabb.upperBound.setNum(p.x + this.m_radius, p.y + this.m_radius); - }; - /** - * Compute the mass properties of this shape using its dimensions and density. - * The inertia tensor is computed about the local origin. - * - * @param massData Returns the mass data for this shape. - * @param density The density in kilograms per meter squared. - */ - CircleShape.prototype.computeMass = function (massData, density) { - massData.mass = density * math$1.PI * this.m_radius * this.m_radius; - massData.center = this.m_p; - // inertia about the local origin - massData.I = massData.mass - * (0.5 * this.m_radius * this.m_radius + Vec2.dot(this.m_p, this.m_p)); - }; - CircleShape.prototype.computeDistanceProxy = function (proxy) { - proxy.m_vertices.push(this.m_p); - proxy.m_count = 1; - proxy.m_radius = this.m_radius; - }; - CircleShape.TYPE = 'circle'; - return CircleShape; - }(Shape)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var DEFAULTS$a = { - frequencyHz: 0.0, - dampingRatio: 0.0 }; - /** - * A distance joint constrains two points on two bodies to remain at a fixed - * distance from each other. You can view this as a massless, rigid rod. - * - * @param anchorA Anchor A in global coordination. - * @param anchorB Anchor B in global coordination. - */ - var DistanceJoint = /** @class */ (function (_super) { - __extends(DistanceJoint, _super); - function DistanceJoint(def, bodyA, bodyB, anchorA, anchorB) { - var _this = this; - // @ts-ignore - if (!(_this instanceof DistanceJoint)) { - return new DistanceJoint(def, bodyA, bodyB, anchorA, anchorB); - } - // order of constructor arguments is changed in v0.2 - if (bodyB && anchorA && ('m_type' in anchorA) && ('x' in bodyB) && ('y' in bodyB)) { - var temp = bodyB; - bodyB = anchorA; - anchorA = temp; - } - def = options(def, DEFAULTS$a); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = DistanceJoint.TYPE; - // Solver shared - _this.m_localAnchorA = Vec2.clone(anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.zero()); - _this.m_localAnchorB = Vec2.clone(anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.zero()); - _this.m_length = math$1.isFinite(def.length) ? def.length : - Vec2.distance(bodyA.getWorldPoint(_this.m_localAnchorA), bodyB.getWorldPoint(_this.m_localAnchorB)); - _this.m_frequencyHz = def.frequencyHz; - _this.m_dampingRatio = def.dampingRatio; - _this.m_impulse = 0.0; - _this.m_gamma = 0.0; - _this.m_bias = 0.0; - return _this; - // 1-D constrained system - // m (v2 - v1) = lambda - // v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass. - // x2 = x1 + h * v2 - // 1-D mass-damper-spring system - // m (v2 - v1) + h * d * v2 + h * k * - // C = norm(p2 - p1) - L - // u = (p2 - p1) / norm(p2 - p1) - // Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1)) - // J = [-u -cross(r1, u) u cross(r2, u)] - // K = J * invM * JT - // = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2 + SeparationFunction.prototype.findMinSeparation = function (t) { + return this.compute(true, t); + }; + SeparationFunction.prototype.evaluate = function (t) { + return this.compute(false, t); + }; + return SeparationFunction; +}()); +new SeparationFunction(); +// legacy exports +TimeOfImpact.Input = TOIInput; +TimeOfImpact.Output = TOIOutput; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var TimeStep = /** @class */ (function () { + function TimeStep() { + /** time step */ + this.dt = 0; + /** inverse time step (0 if dt == 0) */ + this.inv_dt = 0; + this.velocityIterations = 0; + this.positionIterations = 0; + this.warmStarting = false; + this.blockSolve = true; + /** timestep ratio for variable timestep */ + this.inv_dt0 = 0.0; + /** dt * inv_dt0 */ + this.dtRatio = 1; + } + TimeStep.prototype.reset = function (dt) { + if (this.dt > 0.0) { + this.inv_dt0 = this.inv_dt; } - /** @internal */ - DistanceJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - frequencyHz: this.m_frequencyHz, - dampingRatio: this.m_dampingRatio, - localAnchorA: this.m_localAnchorA, - localAnchorB: this.m_localAnchorB, - length: this.m_length, - impulse: this.m_impulse, - gamma: this.m_gamma, - bias: this.m_bias, - }; - }; - /** @internal */ - DistanceJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - var joint = new DistanceJoint(data); - return joint; - }; - /** @internal */ - DistanceJoint.prototype._setAnchors = function (def) { - if (def.anchorA) { - this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); - } - else if (def.localAnchorA) { - this.m_localAnchorA.setVec2(def.localAnchorA); - } - if (def.anchorB) { - this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); - } - else if (def.localAnchorB) { - this.m_localAnchorB.setVec2(def.localAnchorB); - } - if (def.length > 0) { - this.m_length = +def.length; - } - else if (def.length < 0) ; - else if (def.anchorA || def.anchorA || def.anchorA || def.anchorA) { - this.m_length = Vec2.distance(this.m_bodyA.getWorldPoint(this.m_localAnchorA), this.m_bodyB.getWorldPoint(this.m_localAnchorB)); - } - }; - /** - * The local anchor point relative to bodyA's origin. - */ - DistanceJoint.prototype.getLocalAnchorA = function () { - return this.m_localAnchorA; - }; - /** - * The local anchor point relative to bodyB's origin. - */ - DistanceJoint.prototype.getLocalAnchorB = function () { - return this.m_localAnchorB; - }; - /** - * Set the natural length. Manipulating the length can lead to non-physical - * behavior when the frequency is zero. - */ - DistanceJoint.prototype.setLength = function (length) { - this.m_length = length; - }; - /** - * Get the natural length. - */ - DistanceJoint.prototype.getLength = function () { - return this.m_length; - }; - DistanceJoint.prototype.setFrequency = function (hz) { - this.m_frequencyHz = hz; - }; - DistanceJoint.prototype.getFrequency = function () { - return this.m_frequencyHz; - }; - DistanceJoint.prototype.setDampingRatio = function (ratio) { - this.m_dampingRatio = ratio; - }; - DistanceJoint.prototype.getDampingRatio = function () { - return this.m_dampingRatio; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - DistanceJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - DistanceJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - DistanceJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - DistanceJoint.prototype.getReactionTorque = function (inv_dt) { - return 0.0; - }; - DistanceJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - this.m_u = Vec2.sub(Vec2.add(cB, this.m_rB), Vec2.add(cA, this.m_rA)); - // Handle singularity. - var length = this.m_u.length(); - if (length > Settings.linearSlop) { - this.m_u.mul(1.0 / length); - } - else { - this.m_u.setNum(0.0, 0.0); - } - var crAu = Vec2.crossVec2Vec2(this.m_rA, this.m_u); - var crBu = Vec2.crossVec2Vec2(this.m_rB, this.m_u); - var invMass = this.m_invMassA + this.m_invIA * crAu * crAu + this.m_invMassB - + this.m_invIB * crBu * crBu; - // Compute the effective mass matrix. - this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0; - if (this.m_frequencyHz > 0.0) { - var C = length - this.m_length; - // Frequency - var omega = 2.0 * math$1.PI * this.m_frequencyHz; - // Damping coefficient - var d = 2.0 * this.m_mass * this.m_dampingRatio * omega; - // Spring stiffness - var k = this.m_mass * omega * omega; - // magic formulas - var h = step.dt; - this.m_gamma = h * (d + h * k); - this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0; - this.m_bias = C * h * k * this.m_gamma; - invMass += this.m_gamma; - this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0; - } - else { - this.m_gamma = 0.0; - this.m_bias = 0.0; - } - if (step.warmStarting) { - // Scale the impulse to support a variable time step. - this.m_impulse *= step.dtRatio; - var P = Vec2.mulNumVec2(this.m_impulse, this.m_u); - vA.subMul(this.m_invMassA, P); - wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); - vB.addMul(this.m_invMassB, P); - wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); - } - else { - this.m_impulse = 0.0; - } - this.m_bodyA.c_velocity.v.setVec2(vA); - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v.setVec2(vB); - this.m_bodyB.c_velocity.w = wB; - }; - DistanceJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - // Cdot = dot(u, v + cross(w, r)) - var vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA)); - var vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)); - var Cdot = Vec2.dot(this.m_u, vpB) - Vec2.dot(this.m_u, vpA); - var impulse = -this.m_mass - * (Cdot + this.m_bias + this.m_gamma * this.m_impulse); - this.m_impulse += impulse; - var P = Vec2.mulNumVec2(impulse, this.m_u); - vA.subMul(this.m_invMassA, P); - wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); - vB.addMul(this.m_invMassB, P); - wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); - this.m_bodyA.c_velocity.v.setVec2(vA); - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v.setVec2(vB); - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - DistanceJoint.prototype.solvePositionConstraints = function (step) { - if (this.m_frequencyHz > 0.0) { - // There is no position correction for soft distance constraints. - return true; - } - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); - var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); - var u = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); - var length = u.normalize(); - var C = length - this.m_length; - C = math$1 - .clamp(C, -Settings.maxLinearCorrection, Settings.maxLinearCorrection); - var impulse = -this.m_mass * C; - var P = Vec2.mulNumVec2(impulse, u); - cA.subMul(this.m_invMassA, P); - aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P); - cB.addMul(this.m_invMassB, P); - aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P); - this.m_bodyA.c_position.c.setVec2(cA); - this.m_bodyA.c_position.a = aA; - this.m_bodyB.c_position.c.setVec2(cB); - this.m_bodyB.c_position.a = aB; - return math$1.abs(C) < Settings.linearSlop; - }; - DistanceJoint.TYPE = 'distance-joint'; - return DistanceJoint; - }(Joint)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var DEFAULTS$9 = { - maxForce: 0.0, - maxTorque: 0.0, + this.dt = dt; + this.inv_dt = dt == 0 ? 0 : 1 / dt; + this.dtRatio = dt * this.inv_dt0; }; - /** - * Friction joint. This is used for top-down friction. It provides 2D - * translational friction and angular friction. - * - * @param anchor Anchor in global coordination. - */ - var FrictionJoint = /** @class */ (function (_super) { - __extends(FrictionJoint, _super); - function FrictionJoint(def, bodyA, bodyB, anchor) { - var _this = this; - // @ts-ignore - if (!(_this instanceof FrictionJoint)) { - return new FrictionJoint(def, bodyA, bodyB, anchor); - } - def = options(def, DEFAULTS$9); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = FrictionJoint.TYPE; - _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); - _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); - // Solver shared - _this.m_linearImpulse = Vec2.zero(); - _this.m_angularImpulse = 0.0; - _this.m_maxForce = def.maxForce; - _this.m_maxTorque = def.maxTorque; - return _this; - // Point-to-point constraint - // Cdot = v2 - v1 - // = v2 + cross(w2, r2) - v1 - cross(w1, r1) - // J = [-I -r1_skew I r2_skew ] - // Identity used: - // w k % (rx i + ry j) = w * (-ry i + rx j) - // Angle constraint - // Cdot = w2 - w1 - // J = [0 0 -1 0 0 1] - // K = invI1 + invI2 + return TimeStep; +}()); +// reuse +var s_subStep = new TimeStep(); +/** + * Contact impulses for reporting. Impulses are used instead of forces because + * sub-step forces may approach infinity for rigid body collisions. These match + * up one-to-one with the contact points in Manifold. + */ +var ContactImpulse = /** @class */ (function () { + function ContactImpulse(contact) { + this.contact = contact; + this.normals = []; + this.tangents = []; + } + Object.defineProperty(ContactImpulse.prototype, "normalImpulses", { + get: function () { + var contact = this.contact; + var normals = this.normals; + normals.length = 0; + for (var p = 0; p < contact.v_points.length; ++p) { + normals.push(contact.v_points[p].normalImpulse); + } + return normals; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContactImpulse.prototype, "tangentImpulses", { + get: function () { + var contact = this.contact; + var tangents = this.tangents; + tangents.length = 0; + for (var p = 0; p < contact.v_points.length; ++p) { + tangents.push(contact.v_points[p].tangentImpulse); + } + return tangents; + }, + enumerable: false, + configurable: true + }); + return ContactImpulse; +}()); +/** + * Finds and solves islands. An island is a connected subset of the world. + */ +var Solver = /** @class */ (function () { + function Solver(world) { + this.m_world = world; + this.m_stack = []; + this.m_bodies = []; + this.m_contacts = []; + this.m_joints = []; + } + Solver.prototype.clear = function () { + this.m_stack.length = 0; + this.m_bodies.length = 0; + this.m_contacts.length = 0; + this.m_joints.length = 0; + }; + Solver.prototype.addBody = function (body) { + this.m_bodies.push(body); + // why? + // body.c_position.c.setZero(); + // body.c_position.a = 0; + // body.c_velocity.v.setZero(); + // body.c_velocity.w = 0; + }; + Solver.prototype.addContact = function (contact) { + // false && console.assert(contact instanceof Contact, 'Not a Contact!', contact); + this.m_contacts.push(contact); + }; + Solver.prototype.addJoint = function (joint) { + this.m_joints.push(joint); + }; + Solver.prototype.solveWorld = function (step) { + var world = this.m_world; + // Clear all the island flags. + for (var b = world.m_bodyList; b; b = b.m_next) { + b.m_islandFlag = false; } - /** @internal */ - FrictionJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - maxForce: this.m_maxForce, - maxTorque: this.m_maxTorque, - localAnchorA: this.m_localAnchorA, - localAnchorB: this.m_localAnchorB, - }; - }; - /** @internal */ - FrictionJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - var joint = new FrictionJoint(data); - return joint; - }; - /** @internal */ - FrictionJoint.prototype._setAnchors = function (def) { - if (def.anchorA) { - this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); - } - else if (def.localAnchorA) { - this.m_localAnchorA.setVec2(def.localAnchorA); + for (var c = world.m_contactList; c; c = c.m_next) { + c.m_islandFlag = false; + } + for (var j = world.m_jointList; j; j = j.m_next) { + j.m_islandFlag = false; + } + // Build and simulate all awake islands. + var stack = this.m_stack; + for (var seed = world.m_bodyList; seed; seed = seed.m_next) { + if (seed.m_islandFlag) { + continue; + } + if (seed.isAwake() == false || seed.isActive() == false) { + continue; + } + // The seed can be dynamic or kinematic. + if (seed.isStatic()) { + continue; + } + // Reset island and stack. + this.clear(); + stack.push(seed); + seed.m_islandFlag = true; + // Perform a depth first search (DFS) on the constraint graph. + while (stack.length > 0) { + // Grab the next body off the stack and add it to the island. + var b = stack.pop(); + this.addBody(b); + // Make sure the body is awake. + b.setAwake(true); + // To keep islands as small as possible, we don't + // propagate islands across static bodies. + if (b.isStatic()) { + continue; + } + // Search all contacts connected to this body. + for (var ce = b.m_contactList; ce; ce = ce.next) { + var contact = ce.contact; + // Has this contact already been added to an island? + if (contact.m_islandFlag) { + continue; + } + // Is this contact solid and touching? + if (contact.isEnabled() == false || contact.isTouching() == false) { + continue; + } + // Skip sensors. + var sensorA = contact.m_fixtureA.m_isSensor; + var sensorB = contact.m_fixtureB.m_isSensor; + if (sensorA || sensorB) { + continue; + } + this.addContact(contact); + contact.m_islandFlag = true; + var other = ce.other; + // Was the other body already added to this island? + if (other.m_islandFlag) { + continue; + } + // false && console.assert(stack.length < world.m_bodyCount); + stack.push(other); + other.m_islandFlag = true; + } + // Search all joints connect to this body. + for (var je = b.m_jointList; je; je = je.next) { + if (je.joint.m_islandFlag == true) { + continue; + } + var other = je.other; + // Don't simulate joints connected to inactive bodies. + if (other.isActive() == false) { + continue; + } + this.addJoint(je.joint); + je.joint.m_islandFlag = true; + if (other.m_islandFlag) { + continue; + } + // false && console.assert(stack.length < world.m_bodyCount); + stack.push(other); + other.m_islandFlag = true; + } } - if (def.anchorB) { - this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + this.solveIsland(step); + // Post solve cleanup. + for (var i = 0; i < this.m_bodies.length; ++i) { + // Allow static bodies to participate in other islands. + // TODO: are they added at all? + var b = this.m_bodies[i]; + if (b.isStatic()) { + b.m_islandFlag = false; + } } - else if (def.localAnchorB) { - this.m_localAnchorB.setVec2(def.localAnchorB); + } + }; + Solver.prototype.solveIsland = function (step) { + // B2: Island Solve + var world = this.m_world; + var gravity = world.m_gravity; + var allowSleep = world.m_allowSleep; + var h = step.dt; + // Integrate velocities and apply damping. Initialize the body state. + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + var c = Vec2.clone(body.m_sweep.c); + var a = body.m_sweep.a; + var v = Vec2.clone(body.m_linearVelocity); + var w = body.m_angularVelocity; + // Store positions for continuous collision. + body.m_sweep.c0.setVec2(body.m_sweep.c); + body.m_sweep.a0 = body.m_sweep.a; + if (body.isDynamic()) { + // Integrate velocities. + v.addMul(h * body.m_gravityScale, gravity); + v.addMul(h * body.m_invMass, body.m_force); + w += h * body.m_invI * body.m_torque; + /** + *
+                 * Apply damping.
+                 * ODE: dv/dt + c * v = 0
+                 * Solution: v(t) = v0 * exp(-c * t)
+                 * Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)
+                 * v2 = exp(-c * dt) * v1
+                 * Pade approximation:
+                 * v2 = v1 * 1 / (1 + c * dt)
+                 * 
+ */ + v.mul(1.0 / (1.0 + h * body.m_linearDamping)); + w *= 1.0 / (1.0 + h * body.m_angularDamping); + } + body.c_position.c = c; + body.c_position.a = a; + body.c_velocity.v = v; + body.c_velocity.w = w; + } + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.initConstraint(step); + } + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.initVelocityConstraint(step); + } + if (step.warmStarting) { + // Warm start. + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.warmStartConstraint(step); } - }; - /** - * The local anchor point relative to bodyA's origin. - */ - FrictionJoint.prototype.getLocalAnchorA = function () { - return this.m_localAnchorA; - }; - /** - * The local anchor point relative to bodyB's origin. - */ - FrictionJoint.prototype.getLocalAnchorB = function () { - return this.m_localAnchorB; - }; - /** - * Set the maximum friction force in N. - */ - FrictionJoint.prototype.setMaxForce = function (force) { - this.m_maxForce = force; - }; - /** - * Get the maximum friction force in N. - */ - FrictionJoint.prototype.getMaxForce = function () { - return this.m_maxForce; - }; - /** - * Set the maximum friction torque in N*m. - */ - FrictionJoint.prototype.setMaxTorque = function (torque) { - this.m_maxTorque = torque; - }; - /** - * Get the maximum friction torque in N*m. - */ - FrictionJoint.prototype.getMaxTorque = function () { - return this.m_maxTorque; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - FrictionJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - FrictionJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - FrictionJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - FrictionJoint.prototype.getReactionTorque = function (inv_dt) { - return inv_dt * this.m_angularImpulse; - }; - FrictionJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - // Compute the effective mass matrix. - this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - // J = [-I -r1_skew I r2_skew] - // [ 0 -1 0 1] - // r_skew = [-ry; rx] - // Matlab - // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] - // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] - // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - var K = new Mat22(); - K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y - * this.m_rB.y; - K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y; - K.ey.x = K.ex.y; - K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x - * this.m_rB.x; - this.m_linearMass = K.getInverse(); - this.m_angularMass = iA + iB; - if (this.m_angularMass > 0.0) { - this.m_angularMass = 1.0 / this.m_angularMass; + } + for (var i = 0; i < this.m_joints.length; ++i) { + var joint = this.m_joints[i]; + joint.initVelocityConstraints(step); + } + // Solve velocity constraints + for (var i = 0; i < step.velocityIterations; ++i) { + for (var j = 0; j < this.m_joints.length; ++j) { + var joint = this.m_joints[j]; + joint.solveVelocityConstraints(step); } - if (step.warmStarting) { - // Scale impulses to support a variable time step. - this.m_linearImpulse.mul(step.dtRatio); - this.m_angularImpulse *= step.dtRatio; - var P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y); - vA.subMul(mA, P); - wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse); - vB.addMul(mB, P); - wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse); + for (var j = 0; j < this.m_contacts.length; ++j) { + var contact = this.m_contacts[j]; + contact.solveVelocityConstraint(step); } - else { - this.m_linearImpulse.setZero(); - this.m_angularImpulse = 0.0; + } + // Store impulses for warm starting + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.storeConstraintImpulses(step); + } + // Integrate positions + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + var c = Vec2.clone(body.c_position.c); + var a = body.c_position.a; + var v = Vec2.clone(body.c_velocity.v); + var w = body.c_velocity.w; + // Check for large velocities + var translation = Vec2.mulNumVec2(h, v); + if (Vec2.lengthSquared(translation) > Settings.maxTranslationSquared) { + var ratio = Settings.maxTranslation / translation.length(); + v.mul(ratio); + } + var rotation = h * w; + if (rotation * rotation > Settings.maxRotationSquared) { + var ratio = Settings.maxRotation / math.abs(rotation); + w *= ratio; + } + // Integrate + c.addMul(h, v); + a += h * w; + body.c_position.c.setVec2(c); + body.c_position.a = a; + body.c_velocity.v.setVec2(v); + body.c_velocity.w = w; + } + // Solve position constraints + var positionSolved = false; + for (var i = 0; i < step.positionIterations; ++i) { + var minSeparation = 0.0; + for (var j = 0; j < this.m_contacts.length; ++j) { + var contact = this.m_contacts[j]; + var separation = contact.solvePositionConstraint(step); + minSeparation = math.min(minSeparation, separation); + } + // We can't expect minSpeparation >= -Settings.linearSlop because we don't + // push the separation above -Settings.linearSlop. + var contactsOkay = minSeparation >= -3.0 * Settings.linearSlop; + var jointsOkay = true; + for (var j = 0; j < this.m_joints.length; ++j) { + var joint = this.m_joints[j]; + var jointOkay = joint.solvePositionConstraints(step); + jointsOkay = jointsOkay && jointOkay; + } + if (contactsOkay && jointsOkay) { + // Exit early if the position errors are small. + positionSolved = true; + break; } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - FrictionJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - var h = step.dt; // float - // Solve angular friction - { - var Cdot = wB - wA; // float - var impulse = -this.m_angularMass * Cdot; // float - var oldImpulse = this.m_angularImpulse; // float - var maxImpulse = h * this.m_maxTorque; // float - this.m_angularImpulse = math$1.clamp(this.m_angularImpulse + impulse, -maxImpulse, maxImpulse); - impulse = this.m_angularImpulse - oldImpulse; - wA -= iA * impulse; - wB += iB * impulse; + } + // Copy state buffers back to the bodies + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + body.m_sweep.c.setVec2(body.c_position.c); + body.m_sweep.a = body.c_position.a; + body.m_linearVelocity.setVec2(body.c_velocity.v); + body.m_angularVelocity = body.c_velocity.w; + body.synchronizeTransform(); + } + this.postSolveIsland(); + if (allowSleep) { + var minSleepTime = Infinity; + var linTolSqr = Settings.linearSleepToleranceSqr; + var angTolSqr = Settings.angularSleepToleranceSqr; + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + if (body.isStatic()) { + continue; + } + if ((body.m_autoSleepFlag == false) + || (body.m_angularVelocity * body.m_angularVelocity > angTolSqr) + || (Vec2.lengthSquared(body.m_linearVelocity) > linTolSqr)) { + body.m_sleepTime = 0.0; + minSleepTime = 0.0; + } + else { + body.m_sleepTime += h; + minSleepTime = math.min(minSleepTime, body.m_sleepTime); + } } - // Solve linear friction - { - var Cdot = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA))); // Vec2 - var impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); // Vec2 - var oldImpulse = this.m_linearImpulse; // Vec2 - this.m_linearImpulse.add(impulse); - var maxImpulse = h * this.m_maxForce; // float - if (this.m_linearImpulse.lengthSquared() > maxImpulse * maxImpulse) { - this.m_linearImpulse.normalize(); - this.m_linearImpulse.mul(maxImpulse); + if (minSleepTime >= Settings.timeToSleep && positionSolved) { + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + body.setAwake(false); } - impulse = Vec2.sub(this.m_linearImpulse, oldImpulse); - vA.subMul(mA, impulse); - wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); - vB.addMul(mB, impulse); - wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - FrictionJoint.prototype.solvePositionConstraints = function (step) { - return true; - }; - FrictionJoint.TYPE = 'friction-joint'; - return FrictionJoint; - }(Joint)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * A 3-by-3 matrix. Stored in column-major order. - */ - var Mat33 = /** @class */ (function () { - function Mat33(a, b, c) { - if (typeof a === 'object' && a !== null) { - this.ex = Vec3.clone(a); - this.ey = Vec3.clone(b); - this.ez = Vec3.clone(c); + } + }; + /** + * Find TOI contacts and solve them. + */ + Solver.prototype.solveWorldTOI = function (step) { + var world = this.m_world; + if (world.m_stepComplete) { + for (var b = world.m_bodyList; b; b = b.m_next) { + b.m_islandFlag = false; + b.m_sweep.alpha0 = 0.0; } - else { - this.ex = Vec3.zero(); - this.ey = Vec3.zero(); - this.ez = Vec3.zero(); + for (var c = world.m_contactList; c; c = c.m_next) { + // Invalidate TOI + c.m_toiFlag = false; + c.m_islandFlag = false; + c.m_toiCount = 0; + c.m_toi = 1.0; } } - /** @internal */ - Mat33.prototype.toString = function () { - return JSON.stringify(this); - }; - Mat33.isValid = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; + // Find TOI events and solve them. + while (true) { + // Find the first TOI. + var minContact = null; // Contact + var minAlpha = 1.0; + for (var c = world.m_contactList; c; c = c.m_next) { + // Is this contact disabled? + if (c.isEnabled() == false) { + continue; + } + // Prevent excessive sub-stepping. + if (c.m_toiCount > Settings.maxSubSteps) { + continue; + } + var alpha = 1.0; + if (c.m_toiFlag) { + // This contact has a valid cached TOI. + alpha = c.m_toi; + } + else { + var fA_1 = c.getFixtureA(); + var fB_1 = c.getFixtureB(); + // Is there a sensor? + if (fA_1.isSensor() || fB_1.isSensor()) { + continue; + } + var bA_1 = fA_1.getBody(); + var bB_1 = fB_1.getBody(); + var activeA = bA_1.isAwake() && !bA_1.isStatic(); + var activeB = bB_1.isAwake() && !bB_1.isStatic(); + // Is at least one body active (awake and dynamic or kinematic)? + if (activeA == false && activeB == false) { + continue; + } + var collideA = bA_1.isBullet() || !bA_1.isDynamic(); + var collideB = bB_1.isBullet() || !bB_1.isDynamic(); + // Are these two non-bullet dynamic bodies? + if (collideA == false && collideB == false) { + continue; + } + // Compute the TOI for this contact. + // Put the sweeps onto the same time interval. + var alpha0 = bA_1.m_sweep.alpha0; + if (bA_1.m_sweep.alpha0 < bB_1.m_sweep.alpha0) { + alpha0 = bB_1.m_sweep.alpha0; + bA_1.m_sweep.advance(alpha0); + } + else if (bB_1.m_sweep.alpha0 < bA_1.m_sweep.alpha0) { + alpha0 = bA_1.m_sweep.alpha0; + bB_1.m_sweep.advance(alpha0); + } + var indexA = c.getChildIndexA(); + var indexB = c.getChildIndexB(); + bA_1.m_sweep; + bB_1.m_sweep; + // Compute the time of impact in interval [0, minTOI] + var input = new TOIInput(); // TODO: reuse + input.proxyA.set(fA_1.getShape(), indexA); + input.proxyB.set(fB_1.getShape(), indexB); + input.sweepA.set(bA_1.m_sweep); + input.sweepB.set(bB_1.m_sweep); + input.tMax = 1.0; + var output = new TOIOutput(); // TODO: reuse + TimeOfImpact(output, input); + // Beta is the fraction of the remaining portion of the [time?]. + var beta = output.t; + if (output.state == TOIOutputState.e_touching) { + alpha = math.min(alpha0 + (1.0 - alpha0) * beta, 1.0); + } + else { + alpha = 1.0; + } + c.m_toi = alpha; + c.m_toiFlag = true; + } + if (alpha < minAlpha) { + // This is the minimum TOI found so far. + minContact = c; + minAlpha = alpha; + } } - return Vec3.isValid(obj.ex) && Vec3.isValid(obj.ey) && Vec3.isValid(obj.ez); - }; - Mat33.assert = function (o) { - return; - }; - /** - * Set this matrix to all zeros. - */ - Mat33.prototype.setZero = function () { - this.ex.setZero(); - this.ey.setZero(); - this.ez.setZero(); - return this; - }; - /** - * Solve A * x = b, where b is a column vector. This is more efficient than - * computing the inverse in one-shot cases. - */ - Mat33.prototype.solve33 = function (v) { - var det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez)); - if (det !== 0.0) { - det = 1.0 / det; + if (minContact == null || 1.0 - 10.0 * math.EPSILON < minAlpha) { + // No more TOI events. Done! + world.m_stepComplete = true; + break; } - var r = new Vec3(); - r.x = det * Vec3.dot(v, Vec3.cross(this.ey, this.ez)); - r.y = det * Vec3.dot(this.ex, Vec3.cross(v, this.ez)); - r.z = det * Vec3.dot(this.ex, Vec3.cross(this.ey, v)); - return r; - }; - /** - * Solve A * x = b, where b is a column vector. This is more efficient than - * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix - * equation. - */ - Mat33.prototype.solve22 = function (v) { - var a11 = this.ex.x; - var a12 = this.ey.x; - var a21 = this.ex.y; - var a22 = this.ey.y; - var det = a11 * a22 - a12 * a21; - if (det !== 0.0) { - det = 1.0 / det; + // Advance the bodies to the TOI. + var fA = minContact.getFixtureA(); + var fB = minContact.getFixtureB(); + var bA = fA.getBody(); + var bB = fB.getBody(); + var backup1 = bA.m_sweep.clone(); + var backup2 = bB.m_sweep.clone(); + bA.advance(minAlpha); + bB.advance(minAlpha); + // The TOI contact likely has some new contact points. + minContact.update(world); + minContact.m_toiFlag = false; + ++minContact.m_toiCount; + // Is the contact solid? + if (minContact.isEnabled() == false || minContact.isTouching() == false) { + // Restore the sweeps. + minContact.setEnabled(false); + bA.m_sweep.set(backup1); + bB.m_sweep.set(backup2); + bA.synchronizeTransform(); + bB.synchronizeTransform(); + continue; + } + bA.setAwake(true); + bB.setAwake(true); + // Build the island + this.clear(); + this.addBody(bA); + this.addBody(bB); + this.addContact(minContact); + bA.m_islandFlag = true; + bB.m_islandFlag = true; + minContact.m_islandFlag = true; + // Get contacts on bodyA and bodyB. + var bodies = [bA, bB]; + for (var i = 0; i < bodies.length; ++i) { + var body = bodies[i]; + if (body.isDynamic()) { + for (var ce = body.m_contactList; ce; ce = ce.next) { + // if (this.m_bodyCount == this.m_bodyCapacity) { break; } + // if (this.m_contactCount == this.m_contactCapacity) { break; } + var contact = ce.contact; + // Has this contact already been added to the island? + if (contact.m_islandFlag) { + continue; + } + // Only add if either is static, kinematic or bullet. + var other = ce.other; + if (other.isDynamic() && !body.isBullet() && !other.isBullet()) { + continue; + } + // Skip sensors. + var sensorA = contact.m_fixtureA.m_isSensor; + var sensorB = contact.m_fixtureB.m_isSensor; + if (sensorA || sensorB) { + continue; + } + // Tentatively advance the body to the TOI. + var backup = other.m_sweep.clone(); + if (other.m_islandFlag == false) { + other.advance(minAlpha); + } + // Update the contact points + contact.update(world); + // Was the contact disabled by the user? + // Are there contact points? + if (contact.isEnabled() == false || contact.isTouching() == false) { + other.m_sweep.set(backup); + other.synchronizeTransform(); + continue; + } + // Add the contact to the island + contact.m_islandFlag = true; + this.addContact(contact); + // Has the other body already been added to the island? + if (other.m_islandFlag) { + continue; + } + // Add the other body to the island. + other.m_islandFlag = true; + if (!other.isStatic()) { + other.setAwake(true); + } + this.addBody(other); + } + } } - var r = Vec2.zero(); - r.x = det * (a22 * v.x - a12 * v.y); - r.y = det * (a11 * v.y - a21 * v.x); - return r; - }; - /** - * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if - * singular. - */ - Mat33.prototype.getInverse22 = function (M) { - var a = this.ex.x; - var b = this.ey.x; - var c = this.ex.y; - var d = this.ey.y; - var det = a * d - b * c; - if (det !== 0.0) { - det = 1.0 / det; + s_subStep.reset((1.0 - minAlpha) * step.dt); + s_subStep.dtRatio = 1.0; + s_subStep.positionIterations = 20; + s_subStep.velocityIterations = step.velocityIterations; + s_subStep.warmStarting = false; + this.solveIslandTOI(s_subStep, bA, bB); + // Reset island flags and synchronize broad-phase proxies. + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + body.m_islandFlag = false; + if (!body.isDynamic()) { + continue; + } + body.synchronizeFixtures(); + // Invalidate all contact TOIs on this displaced body. + for (var ce = body.m_contactList; ce; ce = ce.next) { + ce.contact.m_toiFlag = false; + ce.contact.m_islandFlag = false; + } } - M.ex.x = det * d; - M.ey.x = -det * b; - M.ex.z = 0.0; - M.ex.y = -det * c; - M.ey.y = det * a; - M.ey.z = 0.0; - M.ez.x = 0.0; - M.ez.y = 0.0; - M.ez.z = 0.0; - }; - /** - * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix - * if singular. - */ - Mat33.prototype.getSymInverse33 = function (M) { - var det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez)); - if (det !== 0.0) { - det = 1.0 / det; + // Commit fixture proxy movements to the broad-phase so that new contacts + // are created. + // Also, some contacts can be destroyed. + world.findNewContacts(); + if (world.m_subStepping) { + world.m_stepComplete = false; + break; } - var a11 = this.ex.x; - var a12 = this.ey.x; - var a13 = this.ez.x; - var a22 = this.ey.y; - var a23 = this.ez.y; - var a33 = this.ez.z; - M.ex.x = det * (a22 * a33 - a23 * a23); - M.ex.y = det * (a13 * a23 - a12 * a33); - M.ex.z = det * (a12 * a23 - a13 * a22); - M.ey.x = M.ex.y; - M.ey.y = det * (a11 * a33 - a13 * a13); - M.ey.z = det * (a13 * a12 - a11 * a23); - M.ez.x = M.ex.z; - M.ez.y = M.ey.z; - M.ez.z = det * (a11 * a22 - a12 * a12); - }; - // tslint:disable-next-line:typedef - Mat33.mul = function (a, b) { - if (b && 'z' in b && 'y' in b && 'x' in b) { - var x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z; - var y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z; - var z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z; - return new Vec3(x, y, z); + } + }; + Solver.prototype.solveIslandTOI = function (subStep, toiA, toiB) { + this.m_world; + // Initialize the body state. + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + body.c_position.c.setVec2(body.m_sweep.c); + body.c_position.a = body.m_sweep.a; + body.c_velocity.v.setVec2(body.m_linearVelocity); + body.c_velocity.w = body.m_angularVelocity; + } + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.initConstraint(subStep); + } + // Solve position constraints. + for (var i = 0; i < subStep.positionIterations; ++i) { + var minSeparation = 0.0; + for (var j = 0; j < this.m_contacts.length; ++j) { + var contact = this.m_contacts[j]; + var separation = contact.solvePositionConstraintTOI(subStep, toiA, toiB); + minSeparation = math.min(minSeparation, separation); + } + // We can't expect minSpeparation >= -Settings.linearSlop because we don't + // push the separation above -Settings.linearSlop. + var contactsOkay = minSeparation >= -1.5 * Settings.linearSlop; + if (contactsOkay) { + break; } - else if (b && 'y' in b && 'x' in b) { - var x = a.ex.x * b.x + a.ey.x * b.y; - var y = a.ex.y * b.x + a.ey.y * b.y; - return Vec2.neo(x, y); + } + var i, c; + // Leap of faith to new safe state. + toiA.m_sweep.c0.setVec2(toiA.c_position.c); + toiA.m_sweep.a0 = toiA.c_position.a; + toiB.m_sweep.c0.setVec2(toiB.c_position.c); + toiB.m_sweep.a0 = toiB.c_position.a; + // No warm starting is needed for TOI events because warm + // starting impulses were applied in the discrete solver. + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.initVelocityConstraint(subStep); + } + // Solve velocity constraints. + for (var i = 0; i < subStep.velocityIterations; ++i) { + for (var j = 0; j < this.m_contacts.length; ++j) { + var contact = this.m_contacts[j]; + contact.solveVelocityConstraint(subStep); } - }; - Mat33.mulVec3 = function (a, b) { - var x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z; - var y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z; - var z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z; - return new Vec3(x, y, z); - }; - Mat33.mulVec2 = function (a, b) { - var x = a.ex.x * b.x + a.ey.x * b.y; - var y = a.ex.y * b.x + a.ey.y * b.y; + } + // Don't store the TOI contact forces for warm starting + // because they can be quite large. + var h = subStep.dt; + // Integrate positions + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + var c = Vec2.clone(body.c_position.c); + var a = body.c_position.a; + var v = Vec2.clone(body.c_velocity.v); + var w = body.c_velocity.w; + // Check for large velocities + var translation = Vec2.mulNumVec2(h, v); + if (Vec2.dot(translation, translation) > Settings.maxTranslationSquared) { + var ratio = Settings.maxTranslation / translation.length(); + v.mul(ratio); + } + var rotation = h * w; + if (rotation * rotation > Settings.maxRotationSquared) { + var ratio = Settings.maxRotation / math.abs(rotation); + w *= ratio; + } + // Integrate + c.addMul(h, v); + a += h * w; + body.c_position.c = c; + body.c_position.a = a; + body.c_velocity.v = v; + body.c_velocity.w = w; + // Sync bodies + body.m_sweep.c = c; + body.m_sweep.a = a; + body.m_linearVelocity = v; + body.m_angularVelocity = w; + body.synchronizeTransform(); + } + this.postSolveIsland(); + }; + /** @internal */ + Solver.prototype.postSolveIsland = function () { + for (var c = 0; c < this.m_contacts.length; ++c) { + var contact = this.m_contacts[c]; + this.m_world.postSolve(contact, contact.m_impulse); + } + }; + return Solver; +}()); +// @ts-ignore +Solver.TimeStep = TimeStep; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A 2-by-2 matrix. Stored in column-major order. + */ +var Mat22 = /** @class */ (function () { + // tslint:disable-next-line:typedef + function Mat22(a, b, c, d) { + if (typeof a === 'object' && a !== null) { + this.ex = Vec2.clone(a); + this.ey = Vec2.clone(b); + } + else if (typeof a === 'number') { + this.ex = Vec2.neo(a, c); + this.ey = Vec2.neo(b, d); + } + else { + this.ex = Vec2.zero(); + this.ey = Vec2.zero(); + } + } + /** @internal */ + Mat22.prototype.toString = function () { + return JSON.stringify(this); + }; + Mat22.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return Vec2.isValid(obj.ex) && Vec2.isValid(obj.ey); + }; + Mat22.assert = function (o) { + }; + // tslint:disable-next-line:typedef + Mat22.prototype.set = function (a, b, c, d) { + if (typeof a === 'number' && typeof b === 'number' && typeof c === 'number' + && typeof d === 'number') { + this.ex.setNum(a, c); + this.ey.setNum(b, d); + } + else if (typeof a === 'object' && typeof b === 'object') { + this.ex.setVec2(a); + this.ey.setVec2(b); + } + else if (typeof a === 'object') { + this.ex.setVec2(a.ex); + this.ey.setVec2(a.ey); + } + else ; + }; + Mat22.prototype.setIdentity = function () { + this.ex.x = 1.0; + this.ey.x = 0.0; + this.ex.y = 0.0; + this.ey.y = 1.0; + }; + Mat22.prototype.setZero = function () { + this.ex.x = 0.0; + this.ey.x = 0.0; + this.ex.y = 0.0; + this.ey.y = 0.0; + }; + Mat22.prototype.getInverse = function () { + var a = this.ex.x; + var b = this.ey.x; + var c = this.ex.y; + var d = this.ey.y; + var det = a * d - b * c; + if (det !== 0.0) { + det = 1.0 / det; + } + var imx = new Mat22(); + imx.ex.x = det * d; + imx.ey.x = -det * b; + imx.ex.y = -det * c; + imx.ey.y = det * a; + return imx; + }; + /** + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. + */ + Mat22.prototype.solve = function (v) { + var a = this.ex.x; + var b = this.ey.x; + var c = this.ex.y; + var d = this.ey.y; + var det = a * d - b * c; + if (det !== 0.0) { + det = 1.0 / det; + } + var w = Vec2.zero(); + w.x = det * (d * v.x - b * v.y); + w.y = det * (a * v.y - c * v.x); + return w; + }; + // tslint:disable-next-line:typedef + Mat22.mul = function (mx, v) { + if (v && 'x' in v && 'y' in v) { + var x = mx.ex.x * v.x + mx.ey.x * v.y; + var y = mx.ex.y * v.x + mx.ey.y * v.y; return Vec2.neo(x, y); - }; - Mat33.add = function (a, b) { - return new Mat33(Vec3.add(a.ex, b.ex), Vec3.add(a.ey, b.ey), Vec3.add(a.ez, b.ez)); - }; - return Mat33; - }()); + } + else if (v && 'ex' in v && 'ey' in v) { // Mat22 + // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey)); + var a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y; + var b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y; + var c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y; + var d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y; + return new Mat22(a, b, c, d); + } + }; + Mat22.mulVec2 = function (mx, v) { + var x = mx.ex.x * v.x + mx.ey.x * v.y; + var y = mx.ex.y * v.x + mx.ey.y * v.y; + return Vec2.neo(x, y); + }; + Mat22.mulMat22 = function (mx, v) { + // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey)); + var a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y; + var b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y; + var c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y; + var d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y; + return new Mat22(a, b, c, d); + }; + // tslint:disable-next-line:typedef + Mat22.mulT = function (mx, v) { + if (v && 'x' in v && 'y' in v) { // Vec2 + return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey)); + } + else if (v && 'ex' in v && 'ey' in v) { // Mat22 + var c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex)); + var c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey)); + return new Mat22(c1, c2); + } + }; + Mat22.mulTVec2 = function (mx, v) { + return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey)); + }; + Mat22.mulTMat22 = function (mx, v) { + var c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex)); + var c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey)); + return new Mat22(c1, c2); + }; + Mat22.abs = function (mx) { + return new Mat22(Vec2.abs(mx.ex), Vec2.abs(mx.ey)); + }; + Mat22.add = function (mx1, mx2) { + return new Mat22(Vec2.add(mx1.ex, mx2.ex), Vec2.add(mx1.ey, mx2.ey)); + }; + return Mat22; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var inactiveLimit$2 = 0; - var atLowerLimit$1 = 1; - var atUpperLimit$2 = 2; - var equalLimits$1 = 3; - var DEFAULTS$8 = { - lowerAngle: 0.0, - upperAngle: 0.0, - maxMotorTorque: 0.0, - motorSpeed: 0.0, - enableLimit: false, - enableMotor: false - }; - /** - * A revolute joint constrains two bodies to share a common point while they are - * free to rotate about the point. The relative rotation about the shared point - * is the joint angle. You can limit the relative rotation with a joint limit - * that specifies a lower and upper angle. You can use a motor to drive the - * relative rotation about the shared point. A maximum motor torque is provided - * so that infinite forces are not generated. - */ - var RevoluteJoint = /** @class */ (function (_super) { - __extends(RevoluteJoint, _super); - // @ts-ignore - function RevoluteJoint(def, bodyA, bodyB, anchor) { - var _this = this; - // @ts-ignore - if (!(_this instanceof RevoluteJoint)) { - return new RevoluteJoint(def, bodyA, bodyB, anchor); - } - def = options(def, DEFAULTS$8); - _this = _super.call(this, def, bodyA, bodyB) || this; - // effective mass for point-to-point constraint. - /** @internal */ _this.m_mass = new Mat33(); - /** @internal */ _this.m_limitState = inactiveLimit$2; // TODO enum - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = RevoluteJoint.TYPE; - _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); - _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); - _this.m_referenceAngle = math$1.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); - _this.m_impulse = new Vec3(); - _this.m_motorImpulse = 0.0; - _this.m_lowerAngle = def.lowerAngle; - _this.m_upperAngle = def.upperAngle; - _this.m_maxMotorTorque = def.maxMotorTorque; - _this.m_motorSpeed = def.motorSpeed; - _this.m_enableLimit = def.enableLimit; - _this.m_enableMotor = def.enableMotor; - return _this; - // Point-to-point constraint - // C = p2 - p1 - // Cdot = v2 - v1 - // = v2 + cross(w2, r2) - v1 - cross(w1, r1) - // J = [-I -r1_skew I r2_skew ] - // Identity used: - // w k % (rx i + ry j) = w * (-ry i + rx j) - // Motor constraint - // Cdot = w2 - w1 - // J = [0 0 -1 0 0 1] - // K = invI1 + invI2 +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var ManifoldType; +(function (ManifoldType) { + ManifoldType[ManifoldType["e_circles"] = 0] = "e_circles"; + ManifoldType[ManifoldType["e_faceA"] = 1] = "e_faceA"; + ManifoldType[ManifoldType["e_faceB"] = 2] = "e_faceB"; +})(ManifoldType || (ManifoldType = {})); +var ContactFeatureType; +(function (ContactFeatureType) { + ContactFeatureType[ContactFeatureType["e_vertex"] = 0] = "e_vertex"; + ContactFeatureType[ContactFeatureType["e_face"] = 1] = "e_face"; +})(ContactFeatureType || (ContactFeatureType = {})); +/** + * This is used for determining the state of contact points. + */ +var PointState; +(function (PointState) { + /** Point does not exist */ + PointState[PointState["nullState"] = 0] = "nullState"; + /** Point was added in the update */ + PointState[PointState["addState"] = 1] = "addState"; + /** Point persisted across the update */ + PointState[PointState["persistState"] = 2] = "persistState"; + /** Point was removed in the update */ + PointState[PointState["removeState"] = 3] = "removeState"; +})(PointState || (PointState = {})); +/** + * Used for computing contact manifolds. + */ +var ClipVertex = /** @class */ (function () { + function ClipVertex() { + this.v = Vec2.zero(); + this.id = new ContactID(); + } + ClipVertex.prototype.set = function (o) { + this.v.setVec2(o.v); + this.id.set(o.id); + }; + return ClipVertex; +}()); +/** + * A manifold for two touching convex shapes. Manifolds are created in `evaluate` + * method of Contact subclasses. + * + * Supported manifold types are e_faceA or e_faceB for clip point versus plane + * with radius and e_circles point versus point with radius. + * + * We store contacts in this way so that position correction can account for + * movement, which is critical for continuous physics. All contact scenarios + * must be expressed in one of these types. This structure is stored across time + * steps, so we keep it small. + * + * @prop type e_circle, e_faceA, e_faceB + * @prop localPoint Usage depends on manifold type:
+ * e_circles: the local center of circleA
+ * e_faceA: the center of faceA
+ * e_faceB: the center of faceB + * @prop localNormal Usage depends on manifold type:
+ * e_circles: not used
+ * e_faceA: the normal on polygonA
+ * e_faceB: the normal on polygonB + * @prop points The points of contact {ManifoldPoint[]} + * @prop pointCount The number of manifold points + */ +var Manifold = /** @class */ (function () { + function Manifold() { + this.localNormal = Vec2.zero(); + this.localPoint = Vec2.zero(); + this.points = [new ManifoldPoint(), new ManifoldPoint()]; + this.pointCount = 0; + } + /** + * Evaluate the manifold with supplied transforms. This assumes modest motion + * from the original state. This does not change the point count, impulses, etc. + * The radii must come from the shapes that generated the manifold. + */ + Manifold.prototype.getWorldManifold = function (wm, xfA, radiusA, xfB, radiusB) { + if (this.pointCount == 0) { + return; } - /** @internal */ - RevoluteJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - lowerAngle: this.m_lowerAngle, - upperAngle: this.m_upperAngle, - maxMotorTorque: this.m_maxMotorTorque, - motorSpeed: this.m_motorSpeed, - enableLimit: this.m_enableLimit, - enableMotor: this.m_enableMotor, - localAnchorA: this.m_localAnchorA, - localAnchorB: this.m_localAnchorB, - referenceAngle: this.m_referenceAngle, - }; - }; - /** @internal */ - RevoluteJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - var joint = new RevoluteJoint(data); - return joint; - }; - /** @internal */ - RevoluteJoint.prototype._setAnchors = function (def) { - if (def.anchorA) { - this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); - } - else if (def.localAnchorA) { - this.m_localAnchorA.setVec2(def.localAnchorA); + wm = wm || new WorldManifold(); + var normal = wm.normal; + var points = wm.points; + var separations = wm.separations; + // TODO: improve + switch (this.type) { + case ManifoldType.e_circles: { + normal = Vec2.neo(1.0, 0.0); + var pointA = Transform.mulVec2(xfA, this.localPoint); + var pointB = Transform.mulVec2(xfB, this.points[0].localPoint); + var dist = Vec2.sub(pointB, pointA); + if (Vec2.lengthSquared(dist) > math.EPSILON * math.EPSILON) { + normal.setVec2(dist); + normal.normalize(); + } + var cA = pointA.clone().addMul(radiusA, normal); + var cB = pointB.clone().addMul(-radiusB, normal); + points[0] = Vec2.mid(cA, cB); + separations[0] = Vec2.dot(Vec2.sub(cB, cA), normal); + points.length = 1; + separations.length = 1; + break; } - if (def.anchorB) { - this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + case ManifoldType.e_faceA: { + normal = Rot.mulVec2(xfA.q, this.localNormal); + var planePoint = Transform.mulVec2(xfA, this.localPoint); + for (var i = 0; i < this.pointCount; ++i) { + var clipPoint = Transform.mulVec2(xfB, this.points[i].localPoint); + var cA = Vec2.clone(clipPoint).addMul(radiusA - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal); + var cB = Vec2.clone(clipPoint).subMul(radiusB, normal); + points[i] = Vec2.mid(cA, cB); + separations[i] = Vec2.dot(Vec2.sub(cB, cA), normal); + } + points.length = this.pointCount; + separations.length = this.pointCount; + break; } - else if (def.localAnchorB) { - this.m_localAnchorB.setVec2(def.localAnchorB); + case ManifoldType.e_faceB: { + normal = Rot.mulVec2(xfB.q, this.localNormal); + var planePoint = Transform.mulVec2(xfB, this.localPoint); + for (var i = 0; i < this.pointCount; ++i) { + var clipPoint = Transform.mulVec2(xfA, this.points[i].localPoint); + var cB = Vec2.combine(1, clipPoint, radiusB - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal); + var cA = Vec2.combine(1, clipPoint, -radiusA, normal); + points[i] = Vec2.mid(cA, cB); + separations[i] = Vec2.dot(Vec2.sub(cA, cB), normal); + } + points.length = this.pointCount; + separations.length = this.pointCount; + // Ensure normal points from A to B. + normal.mul(-1); + break; } - }; - /** - * The local anchor point relative to bodyA's origin. - */ - RevoluteJoint.prototype.getLocalAnchorA = function () { - return this.m_localAnchorA; - }; - /** - * The local anchor point relative to bodyB's origin. - */ - RevoluteJoint.prototype.getLocalAnchorB = function () { - return this.m_localAnchorB; - }; - /** - * Get the reference angle. - */ - RevoluteJoint.prototype.getReferenceAngle = function () { - return this.m_referenceAngle; - }; - /** - * Get the current joint angle in radians. - */ - RevoluteJoint.prototype.getJointAngle = function () { - var bA = this.m_bodyA; - var bB = this.m_bodyB; - return bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle; - }; - /** - * Get the current joint angle speed in radians per second. - */ - RevoluteJoint.prototype.getJointSpeed = function () { - var bA = this.m_bodyA; - var bB = this.m_bodyB; - return bB.m_angularVelocity - bA.m_angularVelocity; - }; - /** - * Is the joint motor enabled? - */ - RevoluteJoint.prototype.isMotorEnabled = function () { - return this.m_enableMotor; - }; + } + wm.normal = normal; + wm.points = points; + wm.separations = separations; + return wm; + }; + Manifold.clipSegmentToLine = clipSegmentToLine; + Manifold.ClipVertex = ClipVertex; + Manifold.getPointStates = getPointStates; + Manifold.PointState = PointState; + return Manifold; +}()); +/** + * A manifold point is a contact point belonging to a contact manifold. It holds + * details related to the geometry and dynamics of the contact points. + * + * This structure is stored across time steps, so we keep it small. + * + * Note: impulses are used for internal caching and may not provide reliable + * contact forces, especially for high speed collisions. + */ +var ManifoldPoint = /** @class */ (function () { + function ManifoldPoint() { /** - * Enable/disable the joint motor. + * Usage depends on manifold type. + * e_circles: the local center of circleB, + * e_faceA: the local center of cirlceB or the clip point of polygonB, + * e_faceB: the clip point of polygonA. */ - RevoluteJoint.prototype.enableMotor = function (flag) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_enableMotor = flag; - }; + this.localPoint = Vec2.zero(); /** - * Get the current motor torque given the inverse time step. Unit is N*m. + * The non-penetration impulse */ - RevoluteJoint.prototype.getMotorTorque = function (inv_dt) { - return inv_dt * this.m_motorImpulse; - }; + this.normalImpulse = 0; /** - * Set the motor speed in radians per second. + * The friction impulse */ - RevoluteJoint.prototype.setMotorSpeed = function (speed) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_motorSpeed = speed; - }; + this.tangentImpulse = 0; /** - * Get the motor speed in radians per second. + * Uniquely identifies a contact point between two shapes to facilatate warm starting */ - RevoluteJoint.prototype.getMotorSpeed = function () { - return this.m_motorSpeed; - }; + this.id = new ContactID(); + } + return ManifoldPoint; +}()); +/** + * Contact ids to facilitate warm starting. + */ +var ContactID = /** @class */ (function () { + function ContactID() { + this.cf = new ContactFeature(); + } + Object.defineProperty(ContactID.prototype, "key", { /** - * Set the maximum motor torque, usually in N-m. + * Used to quickly compare contact ids. */ - RevoluteJoint.prototype.setMaxMotorTorque = function (torque) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_maxMotorTorque = torque; - }; - RevoluteJoint.prototype.getMaxMotorTorque = function () { - return this.m_maxMotorTorque; - }; + get: function () { + return this.cf.indexA + this.cf.indexB * 4 + this.cf.typeA * 16 + this.cf.typeB * 64; + }, + enumerable: false, + configurable: true + }); + ContactID.prototype.set = function (o) { + // this.key = o.key; + this.cf.set(o.cf); + }; + return ContactID; +}()); +/** + * The features that intersect to form the contact point. + */ +var ContactFeature = /** @class */ (function () { + function ContactFeature() { + } + ContactFeature.prototype.set = function (o) { + this.indexA = o.indexA; + this.indexB = o.indexB; + this.typeA = o.typeA; + this.typeB = o.typeB; + }; + return ContactFeature; +}()); +/** + * This is used to compute the current state of a contact manifold. + */ +var WorldManifold = /** @class */ (function () { + function WorldManifold() { /** - * Is the joint limit enabled? + * World contact point (point of intersection) */ - RevoluteJoint.prototype.isLimitEnabled = function () { - return this.m_enableLimit; - }; + this.points = []; // [maxManifoldPoints] /** - * Enable/disable the joint limit. + * A negative value indicates overlap, in meters */ - RevoluteJoint.prototype.enableLimit = function (flag) { - if (flag != this.m_enableLimit) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_enableLimit = flag; - this.m_impulse.z = 0.0; + this.separations = []; // [maxManifoldPoints] + } + return WorldManifold; +}()); +/** + * Compute the point states given two manifolds. The states pertain to the + * transition from manifold1 to manifold2. So state1 is either persist or remove + * while state2 is either add or persist. + */ +function getPointStates(state1, state2, manifold1, manifold2) { + // state1, state2: PointState[Settings.maxManifoldPoints] + // for (var i = 0; i < Settings.maxManifoldPoints; ++i) { + // state1[i] = PointState.nullState; + // state2[i] = PointState.nullState; + // } + // Detect persists and removes. + for (var i = 0; i < manifold1.pointCount; ++i) { + var id = manifold1.points[i].id; + state1[i] = PointState.removeState; + for (var j = 0; j < manifold2.pointCount; ++j) { + if (manifold2.points[j].id.key == id.key) { + state1[i] = PointState.persistState; + break; } - }; - /** - * Get the lower joint limit in radians. - */ - RevoluteJoint.prototype.getLowerLimit = function () { - return this.m_lowerAngle; - }; - /** - * Get the upper joint limit in radians. - */ - RevoluteJoint.prototype.getUpperLimit = function () { - return this.m_upperAngle; - }; - /** - * Set the joint limits in radians. - */ - RevoluteJoint.prototype.setLimits = function (lower, upper) { - if (lower != this.m_lowerAngle || upper != this.m_upperAngle) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_impulse.z = 0.0; - this.m_lowerAngle = lower; - this.m_upperAngle = upper; + } + } + // Detect persists and adds. + for (var i = 0; i < manifold2.pointCount; ++i) { + var id = manifold2.points[i].id; + state2[i] = PointState.addState; + for (var j = 0; j < manifold1.pointCount; ++j) { + if (manifold1.points[j].id.key == id.key) { + state2[i] = PointState.persistState; + break; } - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - RevoluteJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - RevoluteJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force given the inverse time step. Unit is N. - */ - RevoluteJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt); - }; - /** - * Get the reaction torque due to the joint limit given the inverse time step. - * Unit is N*m. - */ - RevoluteJoint.prototype.getReactionTorque = function (inv_dt) { - return inv_dt * this.m_impulse.z; - }; - RevoluteJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - // J = [-I -r1_skew I r2_skew] - // [ 0 -1 0 1] - // r_skew = [-ry; rx] - // Matlab - // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] - // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] - // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] - var mA = this.m_invMassA; - var mB = this.m_invMassB; // float - var iA = this.m_invIA; - var iB = this.m_invIB; // float - var fixedRotation = (iA + iB === 0.0); // bool - this.m_mass.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y - * this.m_rB.y * iB; - this.m_mass.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y - * this.m_rB.x * iB; - this.m_mass.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB; - this.m_mass.ex.y = this.m_mass.ey.x; - this.m_mass.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x - * this.m_rB.x * iB; - this.m_mass.ez.y = this.m_rA.x * iA + this.m_rB.x * iB; - this.m_mass.ex.z = this.m_mass.ez.x; - this.m_mass.ey.z = this.m_mass.ez.y; - this.m_mass.ez.z = iA + iB; - this.m_motorMass = iA + iB; - if (this.m_motorMass > 0.0) { - this.m_motorMass = 1.0 / this.m_motorMass; + } + } +} +/** + * Clipping for contact manifolds. Sutherland-Hodgman clipping. + */ +function clipSegmentToLine(vOut, vIn, normal, offset, vertexIndexA) { + // Start with no output points + var numOut = 0; + // Calculate the distance of end points to the line + var distance0 = Vec2.dot(normal, vIn[0].v) - offset; + var distance1 = Vec2.dot(normal, vIn[1].v) - offset; + // If the points are behind the plane + if (distance0 <= 0.0) + vOut[numOut++].set(vIn[0]); + if (distance1 <= 0.0) + vOut[numOut++].set(vIn[1]); + // If the points are on different sides of the plane + if (distance0 * distance1 < 0.0) { + // Find intersection point of edge and plane + var interp = distance0 / (distance0 - distance1); + vOut[numOut].v.setCombine(1 - interp, vIn[0].v, interp, vIn[1].v); + // VertexA is hitting edgeB. + vOut[numOut].id.cf.indexA = vertexIndexA; + vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB; + vOut[numOut].id.cf.typeA = ContactFeatureType.e_vertex; + vOut[numOut].id.cf.typeB = ContactFeatureType.e_face; + ++numOut; + } + return numOut; +} + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A contact edge is used to connect bodies and contacts together in a contact + * graph where each body is a node and each contact is an edge. A contact edge + * belongs to a doubly linked list maintained in each attached body. Each + * contact has two contact nodes, one for each attached body. + * + * @prop {Contact} contact The contact + * @prop {ContactEdge} prev The previous contact edge in the body's contact list + * @prop {ContactEdge} next The next contact edge in the body's contact list + * @prop {Body} other Provides quick access to the other body attached. + */ +var ContactEdge = /** @class */ (function () { + function ContactEdge(contact) { + this.contact = contact; + } + return ContactEdge; +}()); +/** + * Friction mixing law. The idea is to allow either fixture to drive the + * restitution to zero. For example, anything slides on ice. + */ +function mixFriction(friction1, friction2) { + return math.sqrt(friction1 * friction2); +} +/** + * Restitution mixing law. The idea is allow for anything to bounce off an + * inelastic surface. For example, a superball bounces on anything. + */ +function mixRestitution(restitution1, restitution2) { + return restitution1 > restitution2 ? restitution1 : restitution2; +} +// TODO: move this to Settings? +var s_registers = []; +// TODO: merge with ManifoldPoint? +var VelocityConstraintPoint = /** @class */ (function () { + function VelocityConstraintPoint() { + this.rA = Vec2.zero(); + this.rB = Vec2.zero(); + this.normalImpulse = 0; + this.tangentImpulse = 0; + this.normalMass = 0; + this.tangentMass = 0; + this.velocityBias = 0; + } + return VelocityConstraintPoint; +}()); +/** + * The class manages contact between two shapes. A contact exists for each + * overlapping AABB in the broad-phase (except if filtered). Therefore a contact + * object may exist that has no contact points. + */ +var Contact = /** @class */ (function () { + function Contact(fA, indexA, fB, indexB, evaluateFcn) { + /** @internal */ + this.m_manifold = new Manifold(); + /** @internal */ + this.m_prev = null; + /** @internal */ + this.m_next = null; + /** @internal */ + this.m_toi = 1.0; + /** @internal */ + this.m_toiCount = 0; + /** @internal This contact has a valid TOI in m_toi */ + this.m_toiFlag = false; + /** @internal */ + this.m_tangentSpeed = 0.0; + /** @internal This contact can be disabled (by user) */ + this.m_enabledFlag = true; + /** @internal Used when crawling contact graph when forming islands. */ + this.m_islandFlag = false; + /** @internal Set when the shapes are touching. */ + this.m_touchingFlag = false; + /** @internal This contact needs filtering because a fixture filter was changed. */ + this.m_filterFlag = false; + /** @internal This bullet contact had a TOI event */ + this.m_bulletHitFlag = false; + /** @internal Contact reporting impulse object cache */ + this.m_impulse = new ContactImpulse(this); + // VelocityConstraint + /** @internal */ this.v_points = []; // [maxManifoldPoints]; + /** @internal */ this.v_normal = Vec2.zero(); + /** @internal */ this.v_normalMass = new Mat22(); + /** @internal */ this.v_K = new Mat22(); + // PositionConstraint + /** @internal */ this.p_localPoints = []; // [maxManifoldPoints]; + /** @internal */ this.p_localNormal = Vec2.zero(); + /** @internal */ this.p_localPoint = Vec2.zero(); + /** @internal */ this.p_localCenterA = Vec2.zero(); + /** @internal */ this.p_localCenterB = Vec2.zero(); + // Nodes for connecting bodies. + this.m_nodeA = new ContactEdge(this); + this.m_nodeB = new ContactEdge(this); + this.m_fixtureA = fA; + this.m_fixtureB = fB; + this.m_indexA = indexA; + this.m_indexB = indexB; + this.m_evaluateFcn = evaluateFcn; + this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction); + this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution); + } + Contact.prototype.initConstraint = function (step) { + var fixtureA = this.m_fixtureA; + var fixtureB = this.m_fixtureB; + var shapeA = fixtureA.getShape(); + var shapeB = fixtureB.getShape(); + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + var manifold = this.getManifold(); + var pointCount = manifold.pointCount; + this.v_invMassA = bodyA.m_invMass; + this.v_invMassB = bodyB.m_invMass; + this.v_invIA = bodyA.m_invI; + this.v_invIB = bodyB.m_invI; + this.v_friction = this.m_friction; + this.v_restitution = this.m_restitution; + this.v_tangentSpeed = this.m_tangentSpeed; + this.v_pointCount = pointCount; + this.v_K.setZero(); + this.v_normalMass.setZero(); + this.p_invMassA = bodyA.m_invMass; + this.p_invMassB = bodyB.m_invMass; + this.p_invIA = bodyA.m_invI; + this.p_invIB = bodyB.m_invI; + this.p_localCenterA = Vec2.clone(bodyA.m_sweep.localCenter); + this.p_localCenterB = Vec2.clone(bodyB.m_sweep.localCenter); + this.p_radiusA = shapeA.m_radius; + this.p_radiusB = shapeB.m_radius; + this.p_type = manifold.type; + this.p_localNormal = Vec2.clone(manifold.localNormal); + this.p_localPoint = Vec2.clone(manifold.localPoint); + this.p_pointCount = pointCount; + for (var j = 0; j < pointCount; ++j) { + var cp = manifold.points[j]; + var vcp = this.v_points[j] = new VelocityConstraintPoint(); + if (step.warmStarting) { + vcp.normalImpulse = step.dtRatio * cp.normalImpulse; + vcp.tangentImpulse = step.dtRatio * cp.tangentImpulse; + } + else { + vcp.normalImpulse = 0.0; + vcp.tangentImpulse = 0.0; + } + vcp.rA.setZero(); + vcp.rB.setZero(); + vcp.normalMass = 0.0; + vcp.tangentMass = 0.0; + vcp.velocityBias = 0.0; + this.p_localPoints[j] = Vec2.clone(cp.localPoint); + } + }; + /** + * Get the contact manifold. Do not modify the manifold unless you understand + * the internals of the library. + */ + Contact.prototype.getManifold = function () { + return this.m_manifold; + }; + /** + * Get the world manifold. + */ + Contact.prototype.getWorldManifold = function (worldManifold) { + var bodyA = this.m_fixtureA.getBody(); + var bodyB = this.m_fixtureB.getBody(); + var shapeA = this.m_fixtureA.getShape(); + var shapeB = this.m_fixtureB.getShape(); + return this.m_manifold.getWorldManifold(worldManifold, bodyA.getTransform(), shapeA.m_radius, bodyB.getTransform(), shapeB.m_radius); + }; + /** + * Enable/disable this contact. This can be used inside the pre-solve contact + * listener. The contact is only disabled for the current time step (or sub-step + * in continuous collisions). + */ + Contact.prototype.setEnabled = function (flag) { + this.m_enabledFlag = !!flag; + }; + /** + * Has this contact been disabled? + */ + Contact.prototype.isEnabled = function () { + return this.m_enabledFlag; + }; + /** + * Is this contact touching? + */ + Contact.prototype.isTouching = function () { + return this.m_touchingFlag; + }; + /** + * Get the next contact in the world's contact list. + */ + Contact.prototype.getNext = function () { + return this.m_next; + }; + /** + * Get fixture A in this contact. + */ + Contact.prototype.getFixtureA = function () { + return this.m_fixtureA; + }; + /** + * Get fixture B in this contact. + */ + Contact.prototype.getFixtureB = function () { + return this.m_fixtureB; + }; + /** + * Get the child primitive index for fixture A. + */ + Contact.prototype.getChildIndexA = function () { + return this.m_indexA; + }; + /** + * Get the child primitive index for fixture B. + */ + Contact.prototype.getChildIndexB = function () { + return this.m_indexB; + }; + /** + * Flag this contact for filtering. Filtering will occur the next time step. + */ + Contact.prototype.flagForFiltering = function () { + this.m_filterFlag = true; + }; + /** + * Override the default friction mixture. You can call this in + * ContactListener.preSolve. This value persists until set or reset. + */ + Contact.prototype.setFriction = function (friction) { + this.m_friction = friction; + }; + /** + * Get the friction. + */ + Contact.prototype.getFriction = function () { + return this.m_friction; + }; + /** + * Reset the friction mixture to the default value. + */ + Contact.prototype.resetFriction = function () { + this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction); + }; + /** + * Override the default restitution mixture. You can call this in + * ContactListener.preSolve. The value persists until you set or reset. + */ + Contact.prototype.setRestitution = function (restitution) { + this.m_restitution = restitution; + }; + /** + * Get the restitution. + */ + Contact.prototype.getRestitution = function () { + return this.m_restitution; + }; + /** + * Reset the restitution to the default value. + */ + Contact.prototype.resetRestitution = function () { + this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution); + }; + /** + * Set the desired tangent speed for a conveyor belt behavior. In meters per + * second. + */ + Contact.prototype.setTangentSpeed = function (speed) { + this.m_tangentSpeed = speed; + }; + /** + * Get the desired tangent speed. In meters per second. + */ + Contact.prototype.getTangentSpeed = function () { + return this.m_tangentSpeed; + }; + /** + * Called by Update method, and implemented by subclasses. + */ + Contact.prototype.evaluate = function (manifold, xfA, xfB) { + this.m_evaluateFcn(manifold, xfA, this.m_fixtureA, this.m_indexA, xfB, this.m_fixtureB, this.m_indexB); + }; + /** + * Updates the contact manifold and touching status. + * + * Note: do not assume the fixture AABBs are overlapping or are valid. + * + * @param listener.beginContact + * @param listener.endContact + * @param listener.preSolve + */ + Contact.prototype.update = function (listener) { + // Re-enable this contact. + this.m_enabledFlag = true; + var touching = false; + var wasTouching = this.m_touchingFlag; + var sensorA = this.m_fixtureA.isSensor(); + var sensorB = this.m_fixtureB.isSensor(); + var sensor = sensorA || sensorB; + var bodyA = this.m_fixtureA.getBody(); + var bodyB = this.m_fixtureB.getBody(); + var xfA = bodyA.getTransform(); + var xfB = bodyB.getTransform(); + var oldManifold; + // Is this contact a sensor? + if (sensor) { + var shapeA = this.m_fixtureA.getShape(); + var shapeB = this.m_fixtureB.getShape(); + touching = testOverlap(shapeA, this.m_indexA, shapeB, this.m_indexB, xfA, xfB); + // Sensors don't generate manifolds. + this.m_manifold.pointCount = 0; + } + else { + // TODO reuse manifold + oldManifold = this.m_manifold; + this.m_manifold = new Manifold(); + this.evaluate(this.m_manifold, xfA, xfB); + touching = this.m_manifold.pointCount > 0; + // Match old contact ids to new contact ids and copy the + // stored impulses to warm start the solver. + for (var i = 0; i < this.m_manifold.pointCount; ++i) { + var nmp = this.m_manifold.points[i]; + nmp.normalImpulse = 0.0; + nmp.tangentImpulse = 0.0; + for (var j = 0; j < oldManifold.pointCount; ++j) { + var omp = oldManifold.points[j]; + if (omp.id.key == nmp.id.key) { + nmp.normalImpulse = omp.normalImpulse; + nmp.tangentImpulse = omp.tangentImpulse; + break; + } + } } - if (this.m_enableMotor == false || fixedRotation) { - this.m_motorImpulse = 0.0; + if (touching != wasTouching) { + bodyA.setAwake(true); + bodyB.setAwake(true); } - if (this.m_enableLimit && fixedRotation == false) { - var jointAngle = aB - aA - this.m_referenceAngle; // float - if (math$1.abs(this.m_upperAngle - this.m_lowerAngle) < 2.0 * Settings.angularSlop) { - this.m_limitState = equalLimits$1; - } - else if (jointAngle <= this.m_lowerAngle) { - if (this.m_limitState != atLowerLimit$1) { - this.m_impulse.z = 0.0; - } - this.m_limitState = atLowerLimit$1; + } + this.m_touchingFlag = touching; + if (!wasTouching && touching && listener) { + listener.beginContact(this); + } + if (wasTouching && !touching && listener) { + listener.endContact(this); + } + if (!sensor && touching && listener) { + listener.preSolve(this, oldManifold); + } + }; + Contact.prototype.solvePositionConstraint = function (step) { + return this._solvePositionConstraint(step); + }; + Contact.prototype.solvePositionConstraintTOI = function (step, toiA, toiB) { + return this._solvePositionConstraint(step, toiA, toiB); + }; + Contact.prototype._solvePositionConstraint = function (step, toiA, toiB) { + var toi = !!toiA && !!toiB; + var fixtureA = this.m_fixtureA; + var fixtureB = this.m_fixtureB; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + bodyA.c_velocity; + bodyB.c_velocity; + var positionA = bodyA.c_position; + var positionB = bodyB.c_position; + var localCenterA = Vec2.clone(this.p_localCenterA); + var localCenterB = Vec2.clone(this.p_localCenterB); + var mA = 0.0; + var iA = 0.0; + if (!toi || (bodyA == toiA || bodyA == toiB)) { + mA = this.p_invMassA; + iA = this.p_invIA; + } + var mB = 0.0; + var iB = 0.0; + if (!toi || (bodyB == toiA || bodyB == toiB)) { + mB = this.p_invMassB; + iB = this.p_invIB; + } + var cA = Vec2.clone(positionA.c); + var aA = positionA.a; + var cB = Vec2.clone(positionB.c); + var aB = positionB.a; + var minSeparation = 0.0; + // Solve normal constraints + for (var j = 0; j < this.p_pointCount; ++j) { + var xfA = Transform.identity(); + var xfB = Transform.identity(); + xfA.q.setAngle(aA); + xfB.q.setAngle(aB); + xfA.p = Vec2.sub(cA, Rot.mulVec2(xfA.q, localCenterA)); + xfB.p = Vec2.sub(cB, Rot.mulVec2(xfB.q, localCenterB)); + // PositionSolverManifold + var normal = void 0; + var point = void 0; + var separation = void 0; + switch (this.p_type) { + case ManifoldType.e_circles: { + var pointA = Transform.mulVec2(xfA, this.p_localPoint); + var pointB = Transform.mulVec2(xfB, this.p_localPoints[0]); + normal = Vec2.sub(pointB, pointA); + normal.normalize(); + point = Vec2.combine(0.5, pointA, 0.5, pointB); + separation = Vec2.dot(Vec2.sub(pointB, pointA), normal) - this.p_radiusA - this.p_radiusB; + break; } - else if (jointAngle >= this.m_upperAngle) { - if (this.m_limitState != atUpperLimit$2) { - this.m_impulse.z = 0.0; - } - this.m_limitState = atUpperLimit$2; + case ManifoldType.e_faceA: { + normal = Rot.mulVec2(xfA.q, this.p_localNormal); + var planePoint = Transform.mulVec2(xfA, this.p_localPoint); + var clipPoint = Transform.mulVec2(xfB, this.p_localPoints[j]); + separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB; + point = clipPoint; + break; } - else { - this.m_limitState = inactiveLimit$2; - this.m_impulse.z = 0.0; + case ManifoldType.e_faceB: { + normal = Rot.mulVec2(xfB.q, this.p_localNormal); + var planePoint = Transform.mulVec2(xfB, this.p_localPoint); + var clipPoint = Transform.mulVec2(xfA, this.p_localPoints[j]); + separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB; + point = clipPoint; + // Ensure normal points from A to B + normal.mul(-1); + break; } } - else { - this.m_limitState = inactiveLimit$2; + var rA = Vec2.sub(point, cA); + var rB = Vec2.sub(point, cB); + // Track max constraint error. + minSeparation = math.min(minSeparation, separation); + var baumgarte = toi ? Settings.toiBaugarte : Settings.baumgarte; + var linearSlop = Settings.linearSlop; + var maxLinearCorrection = Settings.maxLinearCorrection; + // Prevent large corrections and allow slop. + var C = math.clamp(baumgarte * (separation + linearSlop), -maxLinearCorrection, 0.0); + // Compute the effective mass. + var rnA = Vec2.crossVec2Vec2(rA, normal); + var rnB = Vec2.crossVec2Vec2(rB, normal); + var K = mA + mB + iA * rnA * rnA + iB * rnB * rnB; + // Compute normal impulse + var impulse = K > 0.0 ? -C / K : 0.0; + var P = Vec2.mulNumVec2(impulse, normal); + cA.subMul(mA, P); + aA -= iA * Vec2.crossVec2Vec2(rA, P); + cB.addMul(mB, P); + aB += iB * Vec2.crossVec2Vec2(rB, P); + } + positionA.c.setVec2(cA); + positionA.a = aA; + positionB.c.setVec2(cB); + positionB.a = aB; + return minSeparation; + }; + Contact.prototype.initVelocityConstraint = function (step) { + var fixtureA = this.m_fixtureA; + var fixtureB = this.m_fixtureB; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + var velocityA = bodyA.c_velocity; + var velocityB = bodyB.c_velocity; + var positionA = bodyA.c_position; + var positionB = bodyB.c_position; + var radiusA = this.p_radiusA; + var radiusB = this.p_radiusB; + var manifold = this.getManifold(); + var mA = this.v_invMassA; + var mB = this.v_invMassB; + var iA = this.v_invIA; + var iB = this.v_invIB; + var localCenterA = Vec2.clone(this.p_localCenterA); + var localCenterB = Vec2.clone(this.p_localCenterB); + var cA = Vec2.clone(positionA.c); + var aA = positionA.a; + var vA = Vec2.clone(velocityA.v); + var wA = velocityA.w; + var cB = Vec2.clone(positionB.c); + var aB = positionB.a; + var vB = Vec2.clone(velocityB.v); + var wB = velocityB.w; + var xfA = Transform.identity(); + var xfB = Transform.identity(); + xfA.q.setAngle(aA); + xfB.q.setAngle(aB); + xfA.p.setCombine(1, cA, -1, Rot.mulVec2(xfA.q, localCenterA)); + xfB.p.setCombine(1, cB, -1, Rot.mulVec2(xfB.q, localCenterB)); + var worldManifold = manifold.getWorldManifold(null, xfA, radiusA, xfB, radiusB); + this.v_normal.setVec2(worldManifold.normal); + for (var j = 0; j < this.v_pointCount; ++j) { + var vcp = this.v_points[j]; // VelocityConstraintPoint + vcp.rA.setVec2(Vec2.sub(worldManifold.points[j], cA)); + vcp.rB.setVec2(Vec2.sub(worldManifold.points[j], cB)); + var rnA = Vec2.crossVec2Vec2(vcp.rA, this.v_normal); + var rnB = Vec2.crossVec2Vec2(vcp.rB, this.v_normal); + var kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB; + vcp.normalMass = kNormal > 0.0 ? 1.0 / kNormal : 0.0; + var tangent = Vec2.crossVec2Num(this.v_normal, 1.0); + var rtA = Vec2.crossVec2Vec2(vcp.rA, tangent); + var rtB = Vec2.crossVec2Vec2(vcp.rB, tangent); + var kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB; + vcp.tangentMass = kTangent > 0.0 ? 1.0 / kTangent : 0.0; + // Setup a velocity bias for restitution. + vcp.velocityBias = 0.0; + var vRel = Vec2.dot(this.v_normal, vB) + + Vec2.dot(this.v_normal, Vec2.crossNumVec2(wB, vcp.rB)) + - Vec2.dot(this.v_normal, vA) + - Vec2.dot(this.v_normal, Vec2.crossNumVec2(wA, vcp.rA)); + if (vRel < -Settings.velocityThreshold) { + vcp.velocityBias = -this.v_restitution * vRel; } - if (step.warmStarting) { - // Scale impulses to support a variable time step. - this.m_impulse.mul(step.dtRatio); - this.m_motorImpulse *= step.dtRatio; - var P = Vec2.neo(this.m_impulse.x, this.m_impulse.y); - vA.subMul(mA, P); - wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_motorImpulse + this.m_impulse.z); - vB.addMul(mB, P); - wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_motorImpulse + this.m_impulse.z); + } + // If we have two points, then prepare the block solver. + if (this.v_pointCount == 2 && step.blockSolve) { + var vcp1 = this.v_points[0]; // VelocityConstraintPoint + var vcp2 = this.v_points[1]; // VelocityConstraintPoint + var rn1A = Vec2.crossVec2Vec2(vcp1.rA, this.v_normal); + var rn1B = Vec2.crossVec2Vec2(vcp1.rB, this.v_normal); + var rn2A = Vec2.crossVec2Vec2(vcp2.rA, this.v_normal); + var rn2B = Vec2.crossVec2Vec2(vcp2.rB, this.v_normal); + var k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B; + var k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B; + var k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B; + // Ensure a reasonable condition number. + var k_maxConditionNumber = 1000.0; + if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) { + // K is safe to invert. + this.v_K.ex.setNum(k11, k12); + this.v_K.ey.setNum(k12, k22); + this.v_normalMass.set(this.v_K.getInverse()); } else { - this.m_impulse.setZero(); - this.m_motorImpulse = 0.0; - } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - RevoluteJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var mA = this.m_invMassA; - var mB = this.m_invMassB; // float - var iA = this.m_invIA; - var iB = this.m_invIB; // float - var fixedRotation = (iA + iB === 0.0); // bool - // Solve motor constraint. - if (this.m_enableMotor && this.m_limitState != equalLimits$1 - && fixedRotation == false) { - var Cdot = wB - wA - this.m_motorSpeed; // float - var impulse = -this.m_motorMass * Cdot; // float - var oldImpulse = this.m_motorImpulse; // float - var maxImpulse = step.dt * this.m_maxMotorTorque; // float - this.m_motorImpulse = math$1.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); - impulse = this.m_motorImpulse - oldImpulse; - wA -= iA * impulse; - wB += iB * impulse; + // The constraints are redundant, just use one. + // TODO_ERIN use deepest? + this.v_pointCount = 1; } - // Solve limit constraint. - if (this.m_enableLimit && this.m_limitState != inactiveLimit$2 - && fixedRotation == false) { - var Cdot1 = Vec2.zero(); - Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); - Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); - var Cdot2 = wB - wA; // float - var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); - var impulse = Vec3.neg(this.m_mass.solve33(Cdot)); // Vec3 - if (this.m_limitState == equalLimits$1) { - this.m_impulse.add(impulse); - } - else if (this.m_limitState == atLowerLimit$1) { - var newImpulse = this.m_impulse.z + impulse.z; // float - if (newImpulse < 0.0) { - var rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2 - var reduced = this.m_mass.solve22(rhs); // Vec2 - impulse.x = reduced.x; - impulse.y = reduced.y; - impulse.z = -this.m_impulse.z; - this.m_impulse.x += reduced.x; - this.m_impulse.y += reduced.y; - this.m_impulse.z = 0.0; - } - else { - this.m_impulse.add(impulse); - } - } - else if (this.m_limitState == atUpperLimit$2) { - var newImpulse = this.m_impulse.z + impulse.z; // float - if (newImpulse > 0.0) { - var rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2 - var reduced = this.m_mass.solve22(rhs); // Vec2 - impulse.x = reduced.x; - impulse.y = reduced.y; - impulse.z = -this.m_impulse.z; - this.m_impulse.x += reduced.x; - this.m_impulse.y += reduced.y; - this.m_impulse.z = 0.0; - } - else { - this.m_impulse.add(impulse); - } - } - var P = Vec2.neo(impulse.x, impulse.y); + } + positionA.c.setVec2(cA); + positionA.a = aA; + velocityA.v.setVec2(vA); + velocityA.w = wA; + positionB.c.setVec2(cB); + positionB.a = aB; + velocityB.v.setVec2(vB); + velocityB.w = wB; + }; + Contact.prototype.warmStartConstraint = function (step) { + var fixtureA = this.m_fixtureA; + var fixtureB = this.m_fixtureB; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + var velocityA = bodyA.c_velocity; + var velocityB = bodyB.c_velocity; + bodyA.c_position; + bodyB.c_position; + var mA = this.v_invMassA; + var iA = this.v_invIA; + var mB = this.v_invMassB; + var iB = this.v_invIB; + var vA = Vec2.clone(velocityA.v); + var wA = velocityA.w; + var vB = Vec2.clone(velocityB.v); + var wB = velocityB.w; + var normal = this.v_normal; + var tangent = Vec2.crossVec2Num(normal, 1.0); + for (var j = 0; j < this.v_pointCount; ++j) { + var vcp = this.v_points[j]; // VelocityConstraintPoint + var P = Vec2.combine(vcp.normalImpulse, normal, vcp.tangentImpulse, tangent); + wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); + vA.subMul(mA, P); + wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); + vB.addMul(mB, P); + } + velocityA.v.setVec2(vA); + velocityA.w = wA; + velocityB.v.setVec2(vB); + velocityB.w = wB; + }; + Contact.prototype.storeConstraintImpulses = function (step) { + var manifold = this.m_manifold; + for (var j = 0; j < this.v_pointCount; ++j) { + manifold.points[j].normalImpulse = this.v_points[j].normalImpulse; + manifold.points[j].tangentImpulse = this.v_points[j].tangentImpulse; + } + }; + Contact.prototype.solveVelocityConstraint = function (step) { + var bodyA = this.m_fixtureA.m_body; + var bodyB = this.m_fixtureB.m_body; + var velocityA = bodyA.c_velocity; + bodyA.c_position; + var velocityB = bodyB.c_velocity; + bodyB.c_position; + var mA = this.v_invMassA; + var iA = this.v_invIA; + var mB = this.v_invMassB; + var iB = this.v_invIB; + var vA = Vec2.clone(velocityA.v); + var wA = velocityA.w; + var vB = Vec2.clone(velocityB.v); + var wB = velocityB.w; + var normal = this.v_normal; + var tangent = Vec2.crossVec2Num(normal, 1.0); + var friction = this.v_friction; + // Solve tangent constraints first because non-penetration is more important + // than friction. + for (var j = 0; j < this.v_pointCount; ++j) { + var vcp = this.v_points[j]; // VelocityConstraintPoint + // Relative velocity at contact + var dv = Vec2.zero(); + dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB)); + dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA)); + // Compute tangent force + var vt = Vec2.dot(dv, tangent) - this.v_tangentSpeed; + var lambda = vcp.tangentMass * (-vt); + // Clamp the accumulated force + var maxFriction = friction * vcp.normalImpulse; + var newImpulse = math.clamp(vcp.tangentImpulse + lambda, -maxFriction, maxFriction); + lambda = newImpulse - vcp.tangentImpulse; + vcp.tangentImpulse = newImpulse; + // Apply contact impulse + var P = Vec2.mulNumVec2(lambda, tangent); + vA.subMul(mA, P); + wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); + vB.addMul(mB, P); + wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); + } + // Solve normal constraints + if (this.v_pointCount == 1 || step.blockSolve == false) { + for (var i = 0; i < this.v_pointCount; ++i) { + var vcp = this.v_points[i]; // VelocityConstraintPoint + // Relative velocity at contact + var dv = Vec2.zero(); + dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB)); + dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA)); + // Compute normal impulse + var vn = Vec2.dot(dv, normal); + var lambda = -vcp.normalMass * (vn - vcp.velocityBias); + // Clamp the accumulated impulse + var newImpulse = math.max(vcp.normalImpulse + lambda, 0.0); + lambda = newImpulse - vcp.normalImpulse; + vcp.normalImpulse = newImpulse; + // Apply contact impulse + var P = Vec2.mulNumVec2(lambda, normal); vA.subMul(mA, P); - wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z); + wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); vB.addMul(mB, P); - wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z); - } - else { - // Solve point-to-point constraint - var Cdot = Vec2.zero(); - Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); - Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); - var impulse = this.m_mass.solve22(Vec2.neg(Cdot)); // Vec2 - this.m_impulse.x += impulse.x; - this.m_impulse.y += impulse.y; - vA.subMul(mA, impulse); - wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); - vB.addMul(mB, impulse); - wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); + wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - RevoluteJoint.prototype.solvePositionConstraints = function (step) { - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var angularError = 0.0; // float - var positionError = 0.0; // float - var fixedRotation = (this.m_invIA + this.m_invIB == 0.0); // bool - // Solve angular limit constraint. - if (this.m_enableLimit && this.m_limitState != inactiveLimit$2 - && fixedRotation == false) { - var angle = aB - aA - this.m_referenceAngle; // float - var limitImpulse = 0.0; // float - if (this.m_limitState == equalLimits$1) { - // Prevent large angular corrections - var C = math$1.clamp(angle - this.m_lowerAngle, -Settings.maxAngularCorrection, Settings.maxAngularCorrection); // float - limitImpulse = -this.m_motorMass * C; - angularError = math$1.abs(C); + } + else { + // Block solver developed in collaboration with Dirk Gregorius (back in + // 01/07 on Box2D_Lite). + // Build the mini LCP for this contact patch + // + // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i = + // 1..2 + // + // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n ) + // b = vn0 - velocityBias + // + // The system is solved using the "Total enumeration method" (s. Murty). + // The complementary constraint vn_i * x_i + // implies that we must have in any solution either vn_i = 0 or x_i = 0. + // So for the 2D contact problem the cases + // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and + // vn1 = 0 need to be tested. The first valid + // solution that satisfies the problem is chosen. + // + // In order to account of the accumulated impulse 'a' (because of the + // iterative nature of the solver which only requires + // that the accumulated impulse is clamped and not the incremental + // impulse) we change the impulse variable (x_i). + // + // Substitute: + // + // x = a + d + // + // a := old total impulse + // x := new total impulse + // d := incremental impulse + // + // For the current iteration we extend the formula for the incremental + // impulse + // to compute the new total impulse: + // + // vn = A * d + b + // = A * (x - a) + b + // = A * x + b - A * a + // = A * x + b' + // b' = b - A * a; + var vcp1 = this.v_points[0]; // VelocityConstraintPoint + var vcp2 = this.v_points[1]; // VelocityConstraintPoint + var a = Vec2.neo(vcp1.normalImpulse, vcp2.normalImpulse); + // Relative velocity at contact + var dv1 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp1.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp1.rA)); + var dv2 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp2.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp2.rA)); + // Compute normal velocity + var vn1 = Vec2.dot(dv1, normal); + var vn2 = Vec2.dot(dv2, normal); + var b = Vec2.neo(vn1 - vcp1.velocityBias, vn2 - vcp2.velocityBias); + // Compute b' + b.sub(Mat22.mulVec2(this.v_K, a)); + // NOT_USED(k_errorTol); + while (true) { + // + // Case 1: vn = 0 + // + // 0 = A * x + b' + // + // Solve for x: + // + // x = - inv(A) * b' + // + var x = Mat22.mulVec2(this.v_normalMass, b).neg(); + if (x.x >= 0.0 && x.y >= 0.0) { + // Get the incremental impulse + var d = Vec2.sub(x, a); + // Apply incremental impulse + var P1 = Vec2.mulNumVec2(d.x, normal); + var P2 = Vec2.mulNumVec2(d.y, normal); + vA.subCombine(mA, P1, mA, P2); + wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); + vB.addCombine(mB, P1, mB, P2); + wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); + // Accumulate + vcp1.normalImpulse = x.x; + vcp2.normalImpulse = x.y; + break; + } + // + // Case 2: vn1 = 0 and x2 = 0 + // + // 0 = a11 * x1 + a12 * 0 + b1' + // vn2 = a21 * x1 + a22 * 0 + b2' + // + x.x = -vcp1.normalMass * b.x; + x.y = 0.0; + vn1 = 0.0; + vn2 = this.v_K.ex.y * x.x + b.y; + if (x.x >= 0.0 && vn2 >= 0.0) { + // Get the incremental impulse + var d = Vec2.sub(x, a); + // Apply incremental impulse + var P1 = Vec2.mulNumVec2(d.x, normal); + var P2 = Vec2.mulNumVec2(d.y, normal); + vA.subCombine(mA, P1, mA, P2); + wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); + vB.addCombine(mB, P1, mB, P2); + wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); + // Accumulate + vcp1.normalImpulse = x.x; + vcp2.normalImpulse = x.y; + break; } - else if (this.m_limitState == atLowerLimit$1) { - var C = angle - this.m_lowerAngle; // float - angularError = -C; - // Prevent large angular corrections and allow some slop. - C = math$1.clamp(C + Settings.angularSlop, -Settings.maxAngularCorrection, 0.0); - limitImpulse = -this.m_motorMass * C; + // + // Case 3: vn2 = 0 and x1 = 0 + // + // vn1 = a11 * 0 + a12 * x2 + b1' + // 0 = a21 * 0 + a22 * x2 + b2' + // + x.x = 0.0; + x.y = -vcp2.normalMass * b.y; + vn1 = this.v_K.ey.x * x.y + b.x; + vn2 = 0.0; + if (x.y >= 0.0 && vn1 >= 0.0) { + // Resubstitute for the incremental impulse + var d = Vec2.sub(x, a); + // Apply incremental impulse + var P1 = Vec2.mulNumVec2(d.x, normal); + var P2 = Vec2.mulNumVec2(d.y, normal); + vA.subCombine(mA, P1, mA, P2); + wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); + vB.addCombine(mB, P1, mB, P2); + wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); + // Accumulate + vcp1.normalImpulse = x.x; + vcp2.normalImpulse = x.y; + break; } - else if (this.m_limitState == atUpperLimit$2) { - var C = angle - this.m_upperAngle; // float - angularError = C; - // Prevent large angular corrections and allow some slop. - C = math$1.clamp(C - Settings.angularSlop, 0.0, Settings.maxAngularCorrection); - limitImpulse = -this.m_motorMass * C; + // + // Case 4: x1 = 0 and x2 = 0 + // + // vn1 = b1 + // vn2 = b2; + // + x.x = 0.0; + x.y = 0.0; + vn1 = b.x; + vn2 = b.y; + if (vn1 >= 0.0 && vn2 >= 0.0) { + // Resubstitute for the incremental impulse + var d = Vec2.sub(x, a); + // Apply incremental impulse + var P1 = Vec2.mulNumVec2(d.x, normal); + var P2 = Vec2.mulNumVec2(d.y, normal); + vA.subCombine(mA, P1, mA, P2); + wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); + vB.addCombine(mB, P1, mB, P2); + wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); + // Accumulate + vcp1.normalImpulse = x.x; + vcp2.normalImpulse = x.y; + break; } - aA -= this.m_invIA * limitImpulse; - aB += this.m_invIB * limitImpulse; + // No solution, give up. This is hit sometimes, but it doesn't seem to + // matter. + break; } - // Solve point-to-point constraint. - { - qA.setAngle(aA); - qB.setAngle(aB); - var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2 - var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2 - var C = Vec2.zero(); - C.addCombine(1, cB, 1, rB); - C.subCombine(1, cA, 1, rA); - positionError = C.length(); - var mA = this.m_invMassA; - var mB = this.m_invMassB; // float - var iA = this.m_invIA; - var iB = this.m_invIB; // float - var K = new Mat22(); - K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y; - K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y; - K.ey.x = K.ex.y; - K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x; - var impulse = Vec2.neg(K.solve(C)); // Vec2 - cA.subMul(mA, impulse); - aA -= iA * Vec2.crossVec2Vec2(rA, impulse); - cB.addMul(mB, impulse); - aB += iB * Vec2.crossVec2Vec2(rB, impulse); + } + velocityA.v.setVec2(vA); + velocityA.w = wA; + velocityB.v.setVec2(vB); + velocityB.w = wB; + }; + /** + * @internal + */ + Contact.addType = function (type1, type2, callback) { + s_registers[type1] = s_registers[type1] || {}; + s_registers[type1][type2] = callback; + }; + /** + * @internal + */ + Contact.create = function (fixtureA, indexA, fixtureB, indexB) { + var typeA = fixtureA.getType(); + var typeB = fixtureB.getType(); + // TODO: pool contacts + var contact; + var evaluateFcn; + if (evaluateFcn = s_registers[typeA] && s_registers[typeA][typeB]) { + contact = new Contact(fixtureA, indexA, fixtureB, indexB, evaluateFcn); + } + else if (evaluateFcn = s_registers[typeB] && s_registers[typeB][typeA]) { + contact = new Contact(fixtureB, indexB, fixtureA, indexA, evaluateFcn); + } + else { + return null; + } + // Contact creation may swap fixtures. + fixtureA = contact.getFixtureA(); + fixtureB = contact.getFixtureB(); + indexA = contact.getChildIndexA(); + indexB = contact.getChildIndexB(); + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + // Connect to body A + contact.m_nodeA.contact = contact; + contact.m_nodeA.other = bodyB; + contact.m_nodeA.prev = null; + contact.m_nodeA.next = bodyA.m_contactList; + if (bodyA.m_contactList != null) { + bodyA.m_contactList.prev = contact.m_nodeA; + } + bodyA.m_contactList = contact.m_nodeA; + // Connect to body B + contact.m_nodeB.contact = contact; + contact.m_nodeB.other = bodyA; + contact.m_nodeB.prev = null; + contact.m_nodeB.next = bodyB.m_contactList; + if (bodyB.m_contactList != null) { + bodyB.m_contactList.prev = contact.m_nodeB; + } + bodyB.m_contactList = contact.m_nodeB; + // Wake up the bodies + if (fixtureA.isSensor() == false && fixtureB.isSensor() == false) { + bodyA.setAwake(true); + bodyB.setAwake(true); + } + return contact; + }; + /** + * @internal + */ + Contact.destroy = function (contact, listener) { + var fixtureA = contact.m_fixtureA; + var fixtureB = contact.m_fixtureB; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + if (contact.isTouching()) { + listener.endContact(contact); + } + // Remove from body 1 + if (contact.m_nodeA.prev) { + contact.m_nodeA.prev.next = contact.m_nodeA.next; + } + if (contact.m_nodeA.next) { + contact.m_nodeA.next.prev = contact.m_nodeA.prev; + } + if (contact.m_nodeA == bodyA.m_contactList) { + bodyA.m_contactList = contact.m_nodeA.next; + } + // Remove from body 2 + if (contact.m_nodeB.prev) { + contact.m_nodeB.prev.next = contact.m_nodeB.next; + } + if (contact.m_nodeB.next) { + contact.m_nodeB.next.prev = contact.m_nodeB.prev; + } + if (contact.m_nodeB == bodyB.m_contactList) { + bodyB.m_contactList = contact.m_nodeB.next; + } + if (contact.m_manifold.pointCount > 0 && fixtureA.isSensor() == false + && fixtureB.isSensor() == false) { + bodyA.setAwake(true); + bodyB.setAwake(true); + } + fixtureA.getType(); + fixtureB.getType(); + // const destroyFcn = s_registers[typeA][typeB].destroyFcn; + // if (typeof destroyFcn === 'function') { + // destroyFcn(contact); + // } + }; + return Contact; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var WorldDefDefault = { + gravity: Vec2.zero(), + allowSleep: true, + warmStarting: true, + continuousPhysics: true, + subStepping: false, + blockSolve: true, + velocityIterations: 8, + positionIterations: 3 +}; +var World = /** @class */ (function () { + /** + * @param def World definition or gravity vector. + */ + function World(def) { + if (!(this instanceof World)) { + return new World(def); + } + this.s_step = new TimeStep(); + if (def && Vec2.isValid(def)) { + def = { gravity: def }; + } + def = options(def, WorldDefDefault); + this.m_solver = new Solver(this); + this.m_broadPhase = new BroadPhase(); + this.m_contactList = null; + this.m_contactCount = 0; + this.m_bodyList = null; + this.m_bodyCount = 0; + this.m_jointList = null; + this.m_jointCount = 0; + this.m_stepComplete = true; + this.m_allowSleep = def.allowSleep; + this.m_gravity = Vec2.clone(def.gravity); + this.m_clearForces = true; + this.m_newFixture = false; + this.m_locked = false; + // These are for debugging the solver. + this.m_warmStarting = def.warmStarting; + this.m_continuousPhysics = def.continuousPhysics; + this.m_subStepping = def.subStepping; + this.m_blockSolve = def.blockSolve; + this.m_velocityIterations = def.velocityIterations; + this.m_positionIterations = def.positionIterations; + this.m_t = 0; + } + /** @internal */ + World.prototype._serialize = function () { + var bodies = []; + var joints = []; + for (var b = this.getBodyList(); b; b = b.getNext()) { + bodies.push(b); + } + for (var j = this.getJointList(); j; j = j.getNext()) { + // @ts-ignore + if (typeof j._serialize === 'function') { + joints.push(j); } - this.m_bodyA.c_position.c.setVec2(cA); - this.m_bodyA.c_position.a = aA; - this.m_bodyB.c_position.c.setVec2(cB); - this.m_bodyB.c_position.a = aB; - return positionError <= Settings.linearSlop - && angularError <= Settings.angularSlop; + } + return { + gravity: this.m_gravity, + bodies: bodies, + joints: joints, }; - RevoluteJoint.TYPE = 'revolute-joint'; - return RevoluteJoint; - }(Joint)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba + }; + /** @internal */ + World._deserialize = function (data, context, restore) { + if (!data) { + return new World(); + } + var world = new World(data.gravity); + if (data.bodies) { + for (var i = data.bodies.length - 1; i >= 0; i -= 1) { + world._addBody(restore(Body, data.bodies[i], world)); + } + } + if (data.joints) { + for (var i = data.joints.length - 1; i >= 0; i--) { + world.createJoint(restore(Joint, data.joints[i], world)); + } + } + return world; + }; + /** + * Get the world body list. With the returned body, use Body.getNext to get the + * next body in the world list. A null body indicates the end of the list. + * + * @return the head of the world body list. + */ + World.prototype.getBodyList = function () { + return this.m_bodyList; + }; + /** + * Get the world joint list. With the returned joint, use Joint.getNext to get + * the next joint in the world list. A null joint indicates the end of the list. + * + * @return the head of the world joint list. + */ + World.prototype.getJointList = function () { + return this.m_jointList; + }; + /** + * Get the world contact list. With the returned contact, use Contact.getNext to + * get the next contact in the world list. A null contact indicates the end of + * the list. + * + * Warning: contacts are created and destroyed in the middle of a time step. + * Use ContactListener to avoid missing contacts. + * + * @return the head of the world contact list. + */ + World.prototype.getContactList = function () { + return this.m_contactList; + }; + World.prototype.getBodyCount = function () { + return this.m_bodyCount; + }; + World.prototype.getJointCount = function () { + return this.m_jointCount; + }; + /** + * Get the number of contacts (each may have 0 or more contact points). + */ + World.prototype.getContactCount = function () { + return this.m_contactCount; + }; + /** + * Change the global gravity vector. + */ + World.prototype.setGravity = function (gravity) { + this.m_gravity = gravity; + }; + /** + * Get the global gravity vector. + */ + World.prototype.getGravity = function () { + return this.m_gravity; + }; + /** + * Is the world locked (in the middle of a time step). + */ + World.prototype.isLocked = function () { + return this.m_locked; + }; + /** + * Enable/disable sleep. + */ + World.prototype.setAllowSleeping = function (flag) { + if (flag == this.m_allowSleep) { + return; + } + this.m_allowSleep = flag; + if (this.m_allowSleep == false) { + for (var b = this.m_bodyList; b; b = b.m_next) { + b.setAwake(true); + } + } + }; + World.prototype.getAllowSleeping = function () { + return this.m_allowSleep; + }; + /** + * Enable/disable warm starting. For testing. + */ + World.prototype.setWarmStarting = function (flag) { + this.m_warmStarting = flag; + }; + World.prototype.getWarmStarting = function () { + return this.m_warmStarting; + }; + /** + * Enable/disable continuous physics. For testing. + */ + World.prototype.setContinuousPhysics = function (flag) { + this.m_continuousPhysics = flag; + }; + World.prototype.getContinuousPhysics = function () { + return this.m_continuousPhysics; + }; + /** + * Enable/disable single stepped continuous physics. For testing. + */ + World.prototype.setSubStepping = function (flag) { + this.m_subStepping = flag; + }; + World.prototype.getSubStepping = function () { + return this.m_subStepping; + }; + /** + * Set flag to control automatic clearing of forces after each time step. + */ + World.prototype.setAutoClearForces = function (flag) { + this.m_clearForces = flag; + }; + /** + * Get the flag that controls automatic clearing of forces after each time step. + */ + World.prototype.getAutoClearForces = function () { + return this.m_clearForces; + }; + /** + * Manually clear the force buffer on all bodies. By default, forces are cleared + * automatically after each call to step. The default behavior is modified by + * calling setAutoClearForces. The purpose of this function is to support + * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step + * under a variable frame-rate. When you perform sub-stepping you will disable + * auto clearing of forces and instead call clearForces after all sub-steps are + * complete in one pass of your game loop. + * + * See {@link World.setAutoClearForces} + */ + World.prototype.clearForces = function () { + for (var body = this.m_bodyList; body; body = body.getNext()) { + body.m_force.setZero(); + body.m_torque = 0.0; + } + }; + /** + * Query the world for all fixtures that potentially overlap the provided AABB. + * + * @param aabb The query box. + * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query. + */ + World.prototype.queryAABB = function (aabb, callback) { + var broadPhase = this.m_broadPhase; + this.m_broadPhase.query(aabb, function (proxyId) { + var proxy = broadPhase.getUserData(proxyId); + return callback(proxy.fixture); + }); + }; + /** + * Ray-cast the world for all fixtures in the path of the ray. Your callback + * controls whether you get the closest point, any point, or n-points. The + * ray-cast ignores shapes that contain the starting point. + * + * @param point1 The ray starting point + * @param point2 The ray ending point + * @param callback A user implemented callback function. + */ + World.prototype.rayCast = function (point1, point2, callback) { + var broadPhase = this.m_broadPhase; + this.m_broadPhase.rayCast({ + maxFraction: 1.0, + p1: point1, + p2: point2 + }, function (input, proxyId) { + var proxy = broadPhase.getUserData(proxyId); + var fixture = proxy.fixture; + var index = proxy.childIndex; + // @ts-ignore + var output = {}; // TODO GC + var hit = fixture.rayCast(output, input, index); + if (hit) { + var fraction = output.fraction; + var point = Vec2.add(Vec2.mulNumVec2((1.0 - fraction), input.p1), Vec2.mulNumVec2(fraction, input.p2)); + return callback(fixture, point, output.normal, fraction); + } + return input.maxFraction; + }); + }; + /** + * Get the number of broad-phase proxies. + */ + World.prototype.getProxyCount = function () { + return this.m_broadPhase.getProxyCount(); + }; + /** + * Get the height of broad-phase dynamic tree. + */ + World.prototype.getTreeHeight = function () { + return this.m_broadPhase.getTreeHeight(); + }; + /** + * Get the balance of broad-phase dynamic tree. + */ + World.prototype.getTreeBalance = function () { + return this.m_broadPhase.getTreeBalance(); + }; + /** + * Get the quality metric of broad-phase dynamic tree. The smaller the better. + * The minimum is 1. + */ + World.prototype.getTreeQuality = function () { + return this.m_broadPhase.getTreeQuality(); + }; + /** + * Shift the world origin. Useful for large worlds. The body shift formula is: + * position -= newOrigin * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * @param newOrigin The new origin with respect to the old origin + */ + World.prototype.shiftOrigin = function (newOrigin) { + if (this.m_locked) { + return; + } + for (var b = this.m_bodyList; b; b = b.m_next) { + b.m_xf.p.sub(newOrigin); + b.m_sweep.c0.sub(newOrigin); + b.m_sweep.c.sub(newOrigin); + } + for (var j = this.m_jointList; j; j = j.m_next) { + j.shiftOrigin(newOrigin); + } + this.m_broadPhase.shiftOrigin(newOrigin); + }; + /** + * @internal Used for deserialize. + */ + World.prototype._addBody = function (body) { + if (this.isLocked()) { + return; + } + // Add to world doubly linked list. + body.m_prev = null; + body.m_next = this.m_bodyList; + if (this.m_bodyList) { + this.m_bodyList.m_prev = body; + } + this.m_bodyList = body; + ++this.m_bodyCount; + }; + // tslint:disable-next-line:typedef + World.prototype.createBody = function (arg1, arg2) { + if (this.isLocked()) { + return null; + } + var def = {}; + if (!arg1) ; + else if (Vec2.isValid(arg1)) { + def = { position: arg1, angle: arg2 }; + } + else if (typeof arg1 === 'object') { + def = arg1; + } + var body = new Body(this, def); + this._addBody(body); + return body; + }; + // tslint:disable-next-line:typedef + World.prototype.createDynamicBody = function (arg1, arg2) { + var def = {}; + if (!arg1) ; + else if (Vec2.isValid(arg1)) { + def = { position: arg1, angle: arg2 }; + } + else if (typeof arg1 === 'object') { + def = arg1; + } + def.type = 'dynamic'; + return this.createBody(def); + }; + // tslint:disable-next-line:typedef + World.prototype.createKinematicBody = function (arg1, arg2) { + var def = {}; + if (!arg1) ; + else if (Vec2.isValid(arg1)) { + def = { position: arg1, angle: arg2 }; + } + else if (typeof arg1 === 'object') { + def = arg1; + } + def.type = 'kinematic'; + return this.createBody(def); + }; + /** + * Destroy a rigid body given a definition. No reference to the definition is + * retained. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * Warning: This automatically deletes all associated shapes and joints. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var inactiveLimit$1 = 0; - var atLowerLimit = 1; - var atUpperLimit$1 = 2; - var equalLimits = 3; - var DEFAULTS$7 = { - enableLimit: false, - lowerTranslation: 0.0, - upperTranslation: 0.0, - enableMotor: false, - maxMotorForce: 0.0, - motorSpeed: 0.0 - }; - /** - * A prismatic joint. This joint provides one degree of freedom: translation - * along an axis fixed in bodyA. Relative rotation is prevented. You can use a - * joint limit to restrict the range of motion and a joint motor to drive the - * motion or to model joint friction. - */ - var PrismaticJoint = /** @class */ (function (_super) { - __extends(PrismaticJoint, _super); - function PrismaticJoint(def, bodyA, bodyB, anchor, axis) { - var _this = this; - // @ts-ignore - if (!(_this instanceof PrismaticJoint)) { - return new PrismaticJoint(def, bodyA, bodyB, anchor, axis); - } - def = options(def, DEFAULTS$7); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = PrismaticJoint.TYPE; - _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); - _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); - _this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || Vec2.neo(1.0, 0.0)); - _this.m_localXAxisA.normalize(); - _this.m_localYAxisA = Vec2.crossNumVec2(1.0, _this.m_localXAxisA); - _this.m_referenceAngle = math$1.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); - _this.m_impulse = new Vec3(); - _this.m_motorMass = 0.0; - _this.m_motorImpulse = 0.0; - _this.m_lowerTranslation = def.lowerTranslation; - _this.m_upperTranslation = def.upperTranslation; - _this.m_maxMotorForce = def.maxMotorForce; - _this.m_motorSpeed = def.motorSpeed; - _this.m_enableLimit = def.enableLimit; - _this.m_enableMotor = def.enableMotor; - _this.m_limitState = inactiveLimit$1; - _this.m_axis = Vec2.zero(); - _this.m_perp = Vec2.zero(); - _this.m_K = new Mat33(); - return _this; - // Linear constraint (point-to-line) - // d = p2 - p1 = x2 + r2 - x1 - r1 - // C = dot(perp, d) - // Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 - - // cross(w1, r1)) - // = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) + - // dot(cross(r2, perp), v2) - // J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)] - // - // Angular constraint - // C = a2 - a1 + a_initial - // Cdot = w2 - w1 - // J = [0 0 -1 0 0 1] - // - // K = J * invM * JT - // - // J = [-a -s1 a s2] - // [0 -1 0 1] - // a = perp - // s1 = cross(d + r1, a) = cross(p2 - x1, a) - // s2 = cross(r2, a) = cross(p2 - x2, a) - // Motor/Limit linear constraint - // C = dot(ax1, d) - // Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) + - // dot(cross(r2, ax1), v2) - // J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)] - // Block Solver - // We develop a block solver that includes the joint limit. This makes the - // limit stiff (inelastic) even - // when the mass has poor distribution (leading to large torques about the - // joint anchor points). - // - // The Jacobian has 3 rows: - // J = [-uT -s1 uT s2] // linear - // [0 -1 0 1] // angular - // [-vT -a1 vT a2] // limit - // - // u = perp - // v = axis - // s1 = cross(d + r1, u), s2 = cross(r2, u) - // a1 = cross(d + r1, v), a2 = cross(r2, v) - // M * (v2 - v1) = JT * df - // J * v2 = bias - // - // v2 = v1 + invM * JT * df - // J * (v1 + invM * JT * df) = bias - // K * df = bias - J * v1 = -Cdot - // K = J * invM * JT - // Cdot = J * v1 - bias - // - // Now solve for f2. - // df = f2 - f1 - // K * (f2 - f1) = -Cdot - // f2 = invK * (-Cdot) + f1 - // - // Clamp accumulated limit impulse. - // lower: f2(3) = max(f2(3), 0) - // upper: f2(3) = min(f2(3), 0) - // - // Solve for correct f2(1:2) - // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1 - // = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3) - // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) + - // K(1:2,1:2) * f1(1:2) - // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + - // f1(1:2) - // - // Now compute impulse to be applied: - // df = f2 - f1 + * Warning: This function is locked during callbacks. + */ + World.prototype.destroyBody = function (b) { + if (this.isLocked()) { + return; } - /** @internal */ - PrismaticJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - lowerTranslation: this.m_lowerTranslation, - upperTranslation: this.m_upperTranslation, - maxMotorForce: this.m_maxMotorForce, - motorSpeed: this.m_motorSpeed, - enableLimit: this.m_enableLimit, - enableMotor: this.m_enableMotor, - localAnchorA: this.m_localAnchorA, - localAnchorB: this.m_localAnchorB, - localAxisA: this.m_localXAxisA, - referenceAngle: this.m_referenceAngle, - }; - }; - /** @internal */ - PrismaticJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - data.localAxisA = Vec2.clone(data.localAxisA); - var joint = new PrismaticJoint(data); - return joint; - }; - /** @internal */ - PrismaticJoint.prototype._setAnchors = function (def) { - if (def.anchorA) { - this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); - } - else if (def.localAnchorA) { - this.m_localAnchorA.setVec2(def.localAnchorA); - } - if (def.anchorB) { - this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); - } - else if (def.localAnchorB) { - this.m_localAnchorB.setVec2(def.localAnchorB); - } - if (def.localAxisA) { - this.m_localXAxisA.setVec2(def.localAxisA); - this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA)); - } - }; - /** - * The local anchor point relative to bodyA's origin. - */ - PrismaticJoint.prototype.getLocalAnchorA = function () { - return this.m_localAnchorA; - }; - /** - * The local anchor point relative to bodyB's origin. - */ - PrismaticJoint.prototype.getLocalAnchorB = function () { - return this.m_localAnchorB; - }; - /** - * The local joint axis relative to bodyA. - */ - PrismaticJoint.prototype.getLocalAxisA = function () { - return this.m_localXAxisA; - }; - /** - * Get the reference angle. - */ - PrismaticJoint.prototype.getReferenceAngle = function () { - return this.m_referenceAngle; - }; - /** - * Get the current joint translation, usually in meters. - */ - PrismaticJoint.prototype.getJointTranslation = function () { - var pA = this.m_bodyA.getWorldPoint(this.m_localAnchorA); - var pB = this.m_bodyB.getWorldPoint(this.m_localAnchorB); - var d = Vec2.sub(pB, pA); - var axis = this.m_bodyA.getWorldVector(this.m_localXAxisA); - var translation = Vec2.dot(d, axis); - return translation; - }; - /** - * Get the current joint translation speed, usually in meters per second. - */ - PrismaticJoint.prototype.getJointSpeed = function () { - var bA = this.m_bodyA; - var bB = this.m_bodyB; - var rA = Rot.mulVec2(bA.m_xf.q, Vec2.sub(this.m_localAnchorA, bA.m_sweep.localCenter)); // Vec2 - var rB = Rot.mulVec2(bB.m_xf.q, Vec2.sub(this.m_localAnchorB, bB.m_sweep.localCenter)); // Vec2 - var p1 = Vec2.add(bA.m_sweep.c, rA); // Vec2 - var p2 = Vec2.add(bB.m_sweep.c, rB); // Vec2 - var d = Vec2.sub(p2, p1); // Vec2 - var axis = Rot.mulVec2(bA.m_xf.q, this.m_localXAxisA); // Vec2 - var vA = bA.m_linearVelocity; // Vec2 - var vB = bB.m_linearVelocity; // Vec2 - var wA = bA.m_angularVelocity; // float - var wB = bB.m_angularVelocity; // float - var speed = Vec2.dot(d, Vec2.crossNumVec2(wA, axis)) - + Vec2.dot(axis, Vec2.sub(Vec2.addCrossNumVec2(vB, wB, rB), Vec2.addCrossNumVec2(vA, wA, rA))); // float - return speed; - }; - /** - * Is the joint limit enabled? - */ - PrismaticJoint.prototype.isLimitEnabled = function () { - return this.m_enableLimit; - }; - /** - * Enable/disable the joint limit. - */ - PrismaticJoint.prototype.enableLimit = function (flag) { - if (flag != this.m_enableLimit) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_enableLimit = flag; - this.m_impulse.z = 0.0; - } - }; - /** - * Get the lower joint limit, usually in meters. - */ - PrismaticJoint.prototype.getLowerLimit = function () { - return this.m_lowerTranslation; - }; - /** - * Get the upper joint limit, usually in meters. - */ - PrismaticJoint.prototype.getUpperLimit = function () { - return this.m_upperTranslation; - }; - /** - * Set the joint limits, usually in meters. - */ - PrismaticJoint.prototype.setLimits = function (lower, upper) { - if (lower != this.m_lowerTranslation || upper != this.m_upperTranslation) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_lowerTranslation = lower; - this.m_upperTranslation = upper; - this.m_impulse.z = 0.0; - } - }; - /** - * Is the joint motor enabled? - */ - PrismaticJoint.prototype.isMotorEnabled = function () { - return this.m_enableMotor; - }; - /** - * Enable/disable the joint motor. - */ - PrismaticJoint.prototype.enableMotor = function (flag) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_enableMotor = flag; - }; - /** - * Set the motor speed, usually in meters per second. - */ - PrismaticJoint.prototype.setMotorSpeed = function (speed) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_motorSpeed = speed; - }; - /** - * Set the maximum motor force, usually in N. - */ - PrismaticJoint.prototype.setMaxMotorForce = function (force) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_maxMotorForce = force; - }; - PrismaticJoint.prototype.getMaxMotorForce = function () { - return this.m_maxMotorForce; - }; - /** - * Get the motor speed, usually in meters per second. - */ - PrismaticJoint.prototype.getMotorSpeed = function () { - return this.m_motorSpeed; - }; - /** - * Get the current motor force given the inverse time step, usually in N. - */ - PrismaticJoint.prototype.getMotorForce = function (inv_dt) { - return inv_dt * this.m_motorImpulse; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - PrismaticJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - PrismaticJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - PrismaticJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + this.m_impulse.z, this.m_axis).mul(inv_dt); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - PrismaticJoint.prototype.getReactionTorque = function (inv_dt) { - return inv_dt * this.m_impulse.y; - }; - PrismaticJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - // Compute the effective masses. - var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - var d = Vec2.zero(); - d.addCombine(1, cB, 1, rB); - d.subCombine(1, cA, 1, rA); - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - // Compute motor Jacobian and effective mass. - { - this.m_axis = Rot.mulVec2(qA, this.m_localXAxisA); - this.m_a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_axis); - this.m_a2 = Vec2.crossVec2Vec2(rB, this.m_axis); - this.m_motorMass = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 - * this.m_a2; - if (this.m_motorMass > 0.0) { - this.m_motorMass = 1.0 / this.m_motorMass; - } - } - // Prismatic constraint. - { - this.m_perp = Rot.mulVec2(qA, this.m_localYAxisA); - this.m_s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_perp); - this.m_s2 = Vec2.crossVec2Vec2(rB, this.m_perp); - Vec2.crossVec2Vec2(rA, this.m_perp); - var k11 = mA + mB + iA * this.m_s1 * this.m_s1 + iB * this.m_s2 * this.m_s2; - var k12 = iA * this.m_s1 + iB * this.m_s2; - var k13 = iA * this.m_s1 * this.m_a1 + iB * this.m_s2 * this.m_a2; - var k22 = iA + iB; - if (k22 == 0.0) { - // For bodies with fixed rotation. - k22 = 1.0; + if (b.m_destroyed) { + return false; + } + // Delete the attached joints. + var je = b.m_jointList; + while (je) { + var je0 = je; + je = je.next; + this.publish('remove-joint', je0.joint); + this.destroyJoint(je0.joint); + b.m_jointList = je; + } + b.m_jointList = null; + // Delete the attached contacts. + var ce = b.m_contactList; + while (ce) { + var ce0 = ce; + ce = ce.next; + this.destroyContact(ce0.contact); + b.m_contactList = ce; + } + b.m_contactList = null; + // Delete the attached fixtures. This destroys broad-phase proxies. + var f = b.m_fixtureList; + while (f) { + var f0 = f; + f = f.m_next; + this.publish('remove-fixture', f0); + f0.destroyProxies(this.m_broadPhase); + b.m_fixtureList = f; + } + b.m_fixtureList = null; + // Remove world body list. + if (b.m_prev) { + b.m_prev.m_next = b.m_next; + } + if (b.m_next) { + b.m_next.m_prev = b.m_prev; + } + if (b == this.m_bodyList) { + this.m_bodyList = b.m_next; + } + b.m_destroyed = true; + --this.m_bodyCount; + this.publish('remove-body', b); + return true; + }; + /** + * Create a joint to constrain bodies together. No reference to the definition + * is retained. This may cause the connected bodies to cease colliding. + * + * Warning: This function is locked during callbacks. + */ + World.prototype.createJoint = function (joint) { + if (this.isLocked()) { + return null; + } + // Connect to the world list. + joint.m_prev = null; + joint.m_next = this.m_jointList; + if (this.m_jointList) { + this.m_jointList.m_prev = joint; + } + this.m_jointList = joint; + ++this.m_jointCount; + // Connect to the bodies' doubly linked lists. + joint.m_edgeA.joint = joint; + joint.m_edgeA.other = joint.m_bodyB; + joint.m_edgeA.prev = null; + joint.m_edgeA.next = joint.m_bodyA.m_jointList; + if (joint.m_bodyA.m_jointList) + joint.m_bodyA.m_jointList.prev = joint.m_edgeA; + joint.m_bodyA.m_jointList = joint.m_edgeA; + joint.m_edgeB.joint = joint; + joint.m_edgeB.other = joint.m_bodyA; + joint.m_edgeB.prev = null; + joint.m_edgeB.next = joint.m_bodyB.m_jointList; + if (joint.m_bodyB.m_jointList) + joint.m_bodyB.m_jointList.prev = joint.m_edgeB; + joint.m_bodyB.m_jointList = joint.m_edgeB; + // If the joint prevents collisions, then flag any contacts for filtering. + if (joint.m_collideConnected == false) { + for (var edge = joint.m_bodyB.getContactList(); edge; edge = edge.next) { + if (edge.other == joint.m_bodyA) { + // Flag the contact for filtering at the next time step (where either + // body is awake). + edge.contact.flagForFiltering(); } - var k23 = iA * this.m_a1 + iB * this.m_a2; - var k33 = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 * this.m_a2; - this.m_K.ex.set(k11, k12, k13); - this.m_K.ey.set(k12, k22, k23); - this.m_K.ez.set(k13, k23, k33); } - // Compute motor and limit terms. - if (this.m_enableLimit) { - var jointTranslation = Vec2.dot(this.m_axis, d); // float - if (math$1.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * Settings.linearSlop) { - this.m_limitState = equalLimits; - } - else if (jointTranslation <= this.m_lowerTranslation) { - if (this.m_limitState != atLowerLimit) { - this.m_limitState = atLowerLimit; - this.m_impulse.z = 0.0; - } - } - else if (jointTranslation >= this.m_upperTranslation) { - if (this.m_limitState != atUpperLimit$1) { - this.m_limitState = atUpperLimit$1; - this.m_impulse.z = 0.0; - } - } - else { - this.m_limitState = inactiveLimit$1; - this.m_impulse.z = 0.0; + } + // Note: creating a joint doesn't wake the bodies. + return joint; + }; + /** + * Destroy a joint. This may cause the connected bodies to begin colliding. + * Warning: This function is locked during callbacks. + */ + World.prototype.destroyJoint = function (joint) { + if (this.isLocked()) { + return; + } + // Remove from the doubly linked list. + if (joint.m_prev) { + joint.m_prev.m_next = joint.m_next; + } + if (joint.m_next) { + joint.m_next.m_prev = joint.m_prev; + } + if (joint == this.m_jointList) { + this.m_jointList = joint.m_next; + } + // Disconnect from bodies. + var bodyA = joint.m_bodyA; + var bodyB = joint.m_bodyB; + // Wake up connected bodies. + bodyA.setAwake(true); + bodyB.setAwake(true); + // Remove from body 1. + if (joint.m_edgeA.prev) { + joint.m_edgeA.prev.next = joint.m_edgeA.next; + } + if (joint.m_edgeA.next) { + joint.m_edgeA.next.prev = joint.m_edgeA.prev; + } + if (joint.m_edgeA == bodyA.m_jointList) { + bodyA.m_jointList = joint.m_edgeA.next; + } + joint.m_edgeA.prev = null; + joint.m_edgeA.next = null; + // Remove from body 2 + if (joint.m_edgeB.prev) { + joint.m_edgeB.prev.next = joint.m_edgeB.next; + } + if (joint.m_edgeB.next) { + joint.m_edgeB.next.prev = joint.m_edgeB.prev; + } + if (joint.m_edgeB == bodyB.m_jointList) { + bodyB.m_jointList = joint.m_edgeB.next; + } + joint.m_edgeB.prev = null; + joint.m_edgeB.next = null; + --this.m_jointCount; + // If the joint prevents collisions, then flag any contacts for filtering. + if (joint.m_collideConnected == false) { + var edge = bodyB.getContactList(); + while (edge) { + if (edge.other == bodyA) { + // Flag the contact for filtering at the next time step (where either + // body is awake). + edge.contact.flagForFiltering(); } + edge = edge.next; } - else { - this.m_limitState = inactiveLimit$1; - this.m_impulse.z = 0.0; - } - if (this.m_enableMotor == false) { - this.m_motorImpulse = 0.0; - } - if (step.warmStarting) { - // Account for variable time step. - this.m_impulse.mul(step.dtRatio); - this.m_motorImpulse *= step.dtRatio; - var P = Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse - + this.m_impulse.z, this.m_axis); - var LA = this.m_impulse.x * this.m_s1 + this.m_impulse.y - + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1; - var LB = this.m_impulse.x * this.m_s2 + this.m_impulse.y - + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2; - vA.subMul(mA, P); - wA -= iA * LA; - vB.addMul(mB, P); - wB += iB * LB; - } - else { - this.m_impulse.setZero(); - this.m_motorImpulse = 0.0; - } - this.m_bodyA.c_velocity.v.setVec2(vA); - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v.setVec2(vB); - this.m_bodyB.c_velocity.w = wB; - }; - PrismaticJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - // Solve linear motor constraint. - if (this.m_enableMotor && this.m_limitState != equalLimits) { - var Cdot = Vec2.dot(this.m_axis, Vec2.sub(vB, vA)) + this.m_a2 * wB - - this.m_a1 * wA; - var impulse = this.m_motorMass * (this.m_motorSpeed - Cdot); - var oldImpulse = this.m_motorImpulse; - var maxImpulse = step.dt * this.m_maxMotorForce; - this.m_motorImpulse = math$1.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); - impulse = this.m_motorImpulse - oldImpulse; - var P = Vec2.mulNumVec2(impulse, this.m_axis); - var LA = impulse * this.m_a1; - var LB = impulse * this.m_a2; - vA.subMul(mA, P); - wA -= iA * LA; - vB.addMul(mB, P); - wB += iB * LB; - } - var Cdot1 = Vec2.zero(); - Cdot1.x += Vec2.dot(this.m_perp, vB) + this.m_s2 * wB; - Cdot1.x -= Vec2.dot(this.m_perp, vA) + this.m_s1 * wA; - Cdot1.y = wB - wA; - if (this.m_enableLimit && this.m_limitState != inactiveLimit$1) { - // Solve prismatic and limit constraint in block form. - var Cdot2 = 0; - Cdot2 += Vec2.dot(this.m_axis, vB) + this.m_a2 * wB; - Cdot2 -= Vec2.dot(this.m_axis, vA) + this.m_a1 * wA; - var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); - var f1 = Vec3.clone(this.m_impulse); - var df = this.m_K.solve33(Vec3.neg(Cdot)); // Vec3 - this.m_impulse.add(df); - if (this.m_limitState == atLowerLimit) { - this.m_impulse.z = math$1.max(this.m_impulse.z, 0.0); + } + this.publish('remove-joint', joint); + }; + /** + * Take a time step. This performs collision detection, integration, and + * constraint solution. + * + * Broad-phase, narrow-phase, solve and solve time of impacts. + * + * @param timeStep Time step, this should not vary. + */ + World.prototype.step = function (timeStep, velocityIterations, positionIterations) { + this.publish('pre-step', timeStep); + if ((velocityIterations | 0) !== velocityIterations) { + // TODO: remove this in future + velocityIterations = 0; + } + velocityIterations = velocityIterations || this.m_velocityIterations; + positionIterations = positionIterations || this.m_positionIterations; + // If new fixtures were added, we need to find the new contacts. + if (this.m_newFixture) { + this.findNewContacts(); + this.m_newFixture = false; + } + this.m_locked = true; + this.s_step.reset(timeStep); + this.s_step.velocityIterations = velocityIterations; + this.s_step.positionIterations = positionIterations; + this.s_step.warmStarting = this.m_warmStarting; + this.s_step.blockSolve = this.m_blockSolve; + // Update contacts. This is where some contacts are destroyed. + this.updateContacts(); + // Integrate velocities, solve velocity constraints, and integrate positions. + if (this.m_stepComplete && timeStep > 0.0) { + this.m_solver.solveWorld(this.s_step); + // Synchronize fixtures, check for out of range bodies. + for (var b = this.m_bodyList; b; b = b.getNext()) { + // If a body was not in an island then it did not move. + if (b.m_islandFlag == false) { + continue; } - else if (this.m_limitState == atUpperLimit$1) { - this.m_impulse.z = math$1.min(this.m_impulse.z, 0.0); + if (b.isStatic()) { + continue; } - // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + - // f1(1:2) - var b = Vec2.combine(-1, Cdot1, -(this.m_impulse.z - f1.z), Vec2.neo(this.m_K.ez.x, this.m_K.ez.y)); // Vec2 - var f2r = Vec2.add(this.m_K.solve22(b), Vec2.neo(f1.x, f1.y)); // Vec2 - this.m_impulse.x = f2r.x; - this.m_impulse.y = f2r.y; - df = Vec3.sub(this.m_impulse, f1); - var P = Vec2.combine(df.x, this.m_perp, df.z, this.m_axis); // Vec2 - var LA = df.x * this.m_s1 + df.y + df.z * this.m_a1; // float - var LB = df.x * this.m_s2 + df.y + df.z * this.m_a2; // float - vA.subMul(mA, P); - wA -= iA * LA; - vB.addMul(mB, P); - wB += iB * LB; - } - else { - // Limit is inactive, just solve the prismatic constraint in block form. - var df = this.m_K.solve22(Vec2.neg(Cdot1)); // Vec2 - this.m_impulse.x += df.x; - this.m_impulse.y += df.y; - var P = Vec2.mulNumVec2(df.x, this.m_perp); // Vec2 - var LA = df.x * this.m_s1 + df.y; // float - var LB = df.x * this.m_s2 + df.y; // float - vA.subMul(mA, P); - wA -= iA * LA; - vB.addMul(mB, P); - wB += iB * LB; + // Update fixtures (for broad-phase). + b.synchronizeFixtures(); } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - PrismaticJoint.prototype.solvePositionConstraints = function (step) { - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - // Compute fresh Jacobians - var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2 - var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2 - var d = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); // Vec2 - var axis = Rot.mulVec2(qA, this.m_localXAxisA); // Vec2 - var a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), axis); // float - var a2 = Vec2.crossVec2Vec2(rB, axis); // float - var perp = Rot.mulVec2(qA, this.m_localYAxisA); // Vec2 - var s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), perp); // float - var s2 = Vec2.crossVec2Vec2(rB, perp); // float - var impulse = new Vec3(); - var C1 = Vec2.zero(); // Vec2 - C1.x = Vec2.dot(perp, d); - C1.y = aB - aA - this.m_referenceAngle; - var linearError = math$1.abs(C1.x); // float - var angularError = math$1.abs(C1.y); // float - var linearSlop = Settings.linearSlop; - var maxLinearCorrection = Settings.maxLinearCorrection; - var active = false; // bool - var C2 = 0.0; // float - if (this.m_enableLimit) { - var translation = Vec2.dot(axis, d); // float - if (math$1.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * linearSlop) { - // Prevent large angular corrections - C2 = math$1.clamp(translation, -maxLinearCorrection, maxLinearCorrection); - linearError = math$1.max(linearError, math$1.abs(translation)); - active = true; - } - else if (translation <= this.m_lowerTranslation) { - // Prevent large linear corrections and allow some slop. - C2 = math$1.clamp(translation - this.m_lowerTranslation + linearSlop, -maxLinearCorrection, 0.0); - linearError = math$1 - .max(linearError, this.m_lowerTranslation - translation); - active = true; + // Look for new contacts. + this.findNewContacts(); + } + // Handle TOI events. + if (this.m_continuousPhysics && timeStep > 0.0) { + this.m_solver.solveWorldTOI(this.s_step); + } + if (this.m_clearForces) { + this.clearForces(); + } + this.m_locked = false; + this.publish('post-step', timeStep); + }; + /** + * @internal + * Call this method to find new contacts. + */ + World.prototype.findNewContacts = function () { + var _this = this; + this.m_broadPhase.updatePairs(function (proxyA, proxyB) { return _this.createContact(proxyA, proxyB); }); + }; + /** + * @internal + * Callback for broad-phase. + */ + World.prototype.createContact = function (proxyA, proxyB) { + var fixtureA = proxyA.fixture; + var fixtureB = proxyB.fixture; + var indexA = proxyA.childIndex; + var indexB = proxyB.childIndex; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + // Are the fixtures on the same body? + if (bodyA == bodyB) { + return; + } + // TODO_ERIN use a hash table to remove a potential bottleneck when both + // bodies have a lot of contacts. + // Does a contact already exist? + var edge = bodyB.getContactList(); // ContactEdge + while (edge) { + if (edge.other == bodyA) { + var fA = edge.contact.getFixtureA(); + var fB = edge.contact.getFixtureB(); + var iA = edge.contact.getChildIndexA(); + var iB = edge.contact.getChildIndexB(); + if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) { + // A contact already exists. + return; } - else if (translation >= this.m_upperTranslation) { - // Prevent large linear corrections and allow some slop. - C2 = math$1.clamp(translation - this.m_upperTranslation - linearSlop, 0.0, maxLinearCorrection); - linearError = math$1 - .max(linearError, translation - this.m_upperTranslation); - active = true; + if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) { + // A contact already exists. + return; } } - if (active) { - var k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float - var k12 = iA * s1 + iB * s2; // float - var k13 = iA * s1 * a1 + iB * s2 * a2; // float - var k22 = iA + iB; // float - if (k22 == 0.0) { - // For fixed rotation - k22 = 1.0; + edge = edge.next; + } + if (bodyB.shouldCollide(bodyA) == false) { + return; + } + if (fixtureB.shouldCollide(fixtureA) == false) { + return; + } + // Call the factory. + var contact = Contact.create(fixtureA, indexA, fixtureB, indexB); + if (contact == null) { + return; + } + // Insert into the world. + contact.m_prev = null; + if (this.m_contactList != null) { + contact.m_next = this.m_contactList; + this.m_contactList.m_prev = contact; + } + this.m_contactList = contact; + ++this.m_contactCount; + }; + /** + * @internal + * Removes old non-overlapping contacts, applies filters and updates contacts. + */ + World.prototype.updateContacts = function () { + // Update awake contacts. + var c; + var next_c = this.m_contactList; + while (c = next_c) { + next_c = c.getNext(); + var fixtureA = c.getFixtureA(); + var fixtureB = c.getFixtureB(); + var indexA = c.getChildIndexA(); + var indexB = c.getChildIndexB(); + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + // Is this contact flagged for filtering? + if (c.m_filterFlag) { + if (bodyB.shouldCollide(bodyA) == false) { + this.destroyContact(c); + continue; } - var k23 = iA * a1 + iB * a2; // float - var k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; // float - var K = new Mat33(); - K.ex.set(k11, k12, k13); - K.ey.set(k12, k22, k23); - K.ez.set(k13, k23, k33); - var C = new Vec3(); - C.x = C1.x; - C.y = C1.y; - C.z = C2; - impulse = K.solve33(Vec3.neg(C)); - } - else { - var k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float - var k12 = iA * s1 + iB * s2; // float - var k22 = iA + iB; // float - if (k22 == 0.0) { - k22 = 1.0; + if (fixtureB.shouldCollide(fixtureA) == false) { + this.destroyContact(c); + continue; } - var K = new Mat22(); - K.ex.setNum(k11, k12); - K.ey.setNum(k12, k22); - var impulse1 = K.solve(Vec2.neg(C1)); // Vec2 - impulse.x = impulse1.x; - impulse.y = impulse1.y; - impulse.z = 0.0; - } - var P = Vec2.combine(impulse.x, perp, impulse.z, axis); // Vec2 - var LA = impulse.x * s1 + impulse.y + impulse.z * a1; // float - var LB = impulse.x * s2 + impulse.y + impulse.z * a2; // float - cA.subMul(mA, P); - aA -= iA * LA; - cB.addMul(mB, P); - aB += iB * LB; - this.m_bodyA.c_position.c = cA; - this.m_bodyA.c_position.a = aA; - this.m_bodyB.c_position.c = cB; - this.m_bodyB.c_position.a = aB; - return linearError <= Settings.linearSlop - && angularError <= Settings.angularSlop; - }; - PrismaticJoint.TYPE = 'prismatic-joint'; - return PrismaticJoint; - }(Joint)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + // Clear the filtering flag. + c.m_filterFlag = false; + } + var activeA = bodyA.isAwake() && !bodyA.isStatic(); + var activeB = bodyB.isAwake() && !bodyB.isStatic(); + // At least one body must be awake and it must be dynamic or kinematic. + if (activeA == false && activeB == false) { + continue; + } + var proxyIdA = fixtureA.m_proxies[indexA].proxyId; + var proxyIdB = fixtureB.m_proxies[indexB].proxyId; + var overlap = this.m_broadPhase.testOverlap(proxyIdA, proxyIdB); + // Here we destroy contacts that cease to overlap in the broad-phase. + if (overlap == false) { + this.destroyContact(c); + continue; + } + // The contact persists. + c.update(this); + } + }; + /** + * @internal */ - var DEFAULTS$6 = { - ratio: 1.0 + World.prototype.destroyContact = function (contact) { + Contact.destroy(contact, this); + // Remove from the world. + if (contact.m_prev) { + contact.m_prev.m_next = contact.m_next; + } + if (contact.m_next) { + contact.m_next.m_prev = contact.m_prev; + } + if (contact == this.m_contactList) { + this.m_contactList = contact.m_next; + } + --this.m_contactCount; }; /** - * A gear joint is used to connect two joints together. Either joint can be a - * revolute or prismatic joint. You specify a gear ratio to bind the motions - * together: coordinate1 + ratio * coordinate2 = constant - * - * The ratio can be negative or positive. If one joint is a revolute joint and - * the other joint is a prismatic joint, then the ratio will have units of - * length or units of 1/length. Warning: You have to manually destroy the gear - * joint if joint1 or joint2 is destroyed. - * - * This definition requires two existing revolute or prismatic joints (any - * combination will work). + * Register an event listener. */ - var GearJoint = /** @class */ (function (_super) { - __extends(GearJoint, _super); - function GearJoint(def, bodyA, bodyB, joint1, joint2, ratio) { - var _this = this; - // @ts-ignore - if (!(_this instanceof GearJoint)) { - return new GearJoint(def, bodyA, bodyB, joint1, joint2, ratio); - } - def = options(def, DEFAULTS$6); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = GearJoint.TYPE; - _this.m_joint1 = joint1 ? joint1 : def.joint1; - _this.m_joint2 = joint2 ? joint2 : def.joint2; - _this.m_ratio = math$1.isFinite(ratio) ? ratio : def.ratio; - _this.m_type1 = _this.m_joint1.getType(); - _this.m_type2 = _this.m_joint2.getType(); - // joint1 connects body A to body C - // joint2 connects body B to body D - var coordinateA; - var coordinateB; - // TODO_ERIN there might be some problem with the joint edges in Joint. - _this.m_bodyC = _this.m_joint1.getBodyA(); - _this.m_bodyA = _this.m_joint1.getBodyB(); - // Get geometry of joint1 - var xfA = _this.m_bodyA.m_xf; - var aA = _this.m_bodyA.m_sweep.a; - var xfC = _this.m_bodyC.m_xf; - var aC = _this.m_bodyC.m_sweep.a; - if (_this.m_type1 === RevoluteJoint.TYPE) { - var revolute = _this.m_joint1; - _this.m_localAnchorC = revolute.m_localAnchorA; - _this.m_localAnchorA = revolute.m_localAnchorB; - _this.m_referenceAngleA = revolute.m_referenceAngle; - _this.m_localAxisC = Vec2.zero(); - coordinateA = aA - aC - _this.m_referenceAngleA; - } - else { - var prismatic = _this.m_joint1; - _this.m_localAnchorC = prismatic.m_localAnchorA; - _this.m_localAnchorA = prismatic.m_localAnchorB; - _this.m_referenceAngleA = prismatic.m_referenceAngle; - _this.m_localAxisC = prismatic.m_localXAxisA; - var pC = _this.m_localAnchorC; - var pA = Rot.mulTVec2(xfC.q, Vec2.add(Rot.mulVec2(xfA.q, _this.m_localAnchorA), Vec2.sub(xfA.p, xfC.p))); - coordinateA = Vec2.dot(pA, _this.m_localAxisC) - Vec2.dot(pC, _this.m_localAxisC); - } - _this.m_bodyD = _this.m_joint2.getBodyA(); - _this.m_bodyB = _this.m_joint2.getBodyB(); - // Get geometry of joint2 - var xfB = _this.m_bodyB.m_xf; - var aB = _this.m_bodyB.m_sweep.a; - var xfD = _this.m_bodyD.m_xf; - var aD = _this.m_bodyD.m_sweep.a; - if (_this.m_type2 === RevoluteJoint.TYPE) { - var revolute = _this.m_joint2; - _this.m_localAnchorD = revolute.m_localAnchorA; - _this.m_localAnchorB = revolute.m_localAnchorB; - _this.m_referenceAngleB = revolute.m_referenceAngle; - _this.m_localAxisD = Vec2.zero(); - coordinateB = aB - aD - _this.m_referenceAngleB; - } - else { - var prismatic = _this.m_joint2; - _this.m_localAnchorD = prismatic.m_localAnchorA; - _this.m_localAnchorB = prismatic.m_localAnchorB; - _this.m_referenceAngleB = prismatic.m_referenceAngle; - _this.m_localAxisD = prismatic.m_localXAxisA; - var pD = _this.m_localAnchorD; - var pB = Rot.mulTVec2(xfD.q, Vec2.add(Rot.mulVec2(xfB.q, _this.m_localAnchorB), Vec2.sub(xfB.p, xfD.p))); - coordinateB = Vec2.dot(pB, _this.m_localAxisD) - Vec2.dot(pD, _this.m_localAxisD); - } - _this.m_constant = coordinateA + _this.m_ratio * coordinateB; - _this.m_impulse = 0.0; - return _this; - // Gear Joint: - // C0 = (coordinate1 + ratio * coordinate2)_initial - // C = (coordinate1 + ratio * coordinate2) - C0 = 0 - // J = [J1 ratio * J2] - // K = J * invM * JT - // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T - // - // Revolute: - // coordinate = rotation - // Cdot = angularVelocity - // J = [0 0 1] - // K = J * invM * JT = invI - // - // Prismatic: - // coordinate = dot(p - pg, ug) - // Cdot = dot(v + cross(w, r), ug) - // J = [ug cross(r, ug)] - // K = J * invM * JT = invMass + invI * cross(r, ug)^2 + // tslint:disable-next-line:typedef + World.prototype.on = function (name, listener) { + if (typeof name !== 'string' || typeof listener !== 'function') { + return this; } - /** @internal */ - GearJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - joint1: this.m_joint1, - joint2: this.m_joint2, - ratio: this.m_ratio, - // _constant: this.m_constant, - }; - }; - /** @internal */ - GearJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - data.joint1 = restore(Joint, data.joint1, world); - data.joint2 = restore(Joint, data.joint2, world); - var joint = new GearJoint(data); - // if (data._constant) joint.m_constant = data._constant; - return joint; - }; - /** - * Get the first joint. - */ - GearJoint.prototype.getJoint1 = function () { - return this.m_joint1; - }; - /** - * Get the second joint. - */ - GearJoint.prototype.getJoint2 = function () { - return this.m_joint2; - }; - /** - * Set the gear ratio. - */ - GearJoint.prototype.setRatio = function (ratio) { - this.m_ratio = ratio; - }; - /** - * Get the gear ratio. - */ - GearJoint.prototype.getRatio = function () { - return this.m_ratio; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - GearJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - GearJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - GearJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.mulNumVec2(this.m_impulse, this.m_JvAC).mul(inv_dt); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - GearJoint.prototype.getReactionTorque = function (inv_dt) { - var L = this.m_impulse * this.m_JwA; // float - return inv_dt * L; - }; - GearJoint.prototype.initVelocityConstraints = function (step) { - this.m_lcA = this.m_bodyA.m_sweep.localCenter; - this.m_lcB = this.m_bodyB.m_sweep.localCenter; - this.m_lcC = this.m_bodyC.m_sweep.localCenter; - this.m_lcD = this.m_bodyD.m_sweep.localCenter; - this.m_mA = this.m_bodyA.m_invMass; - this.m_mB = this.m_bodyB.m_invMass; - this.m_mC = this.m_bodyC.m_invMass; - this.m_mD = this.m_bodyD.m_invMass; - this.m_iA = this.m_bodyA.m_invI; - this.m_iB = this.m_bodyB.m_invI; - this.m_iC = this.m_bodyC.m_invI; - this.m_iD = this.m_bodyD.m_invI; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var aC = this.m_bodyC.c_position.a; - var vC = this.m_bodyC.c_velocity.v; - var wC = this.m_bodyC.c_velocity.w; - var aD = this.m_bodyD.c_position.a; - var vD = this.m_bodyD.c_velocity.v; - var wD = this.m_bodyD.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var qC = Rot.neo(aC); - var qD = Rot.neo(aD); - this.m_mass = 0.0; - if (this.m_type1 == RevoluteJoint.TYPE) { - this.m_JvAC = Vec2.zero(); - this.m_JwA = 1.0; - this.m_JwC = 1.0; - this.m_mass += this.m_iA + this.m_iC; - } - else { - var u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2 - var rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2 - var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2 - this.m_JvAC = u; - this.m_JwC = Vec2.crossVec2Vec2(rC, u); - this.m_JwA = Vec2.crossVec2Vec2(rA, u); - this.m_mass += this.m_mC + this.m_mA + this.m_iC * this.m_JwC * this.m_JwC + this.m_iA * this.m_JwA * this.m_JwA; - } - if (this.m_type2 == RevoluteJoint.TYPE) { - this.m_JvBD = Vec2.zero(); - this.m_JwB = this.m_ratio; - this.m_JwD = this.m_ratio; - this.m_mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD); - } - else { - var u = Rot.mulVec2(qD, this.m_localAxisD); // Vec2 - var rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); // Vec2 - var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); // Vec2 - this.m_JvBD = Vec2.mulNumVec2(this.m_ratio, u); - this.m_JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u); - this.m_JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u); - this.m_mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD * this.m_JwD * this.m_JwD + this.m_iB * this.m_JwB * this.m_JwB; - } - // Compute effective mass. - this.m_mass = this.m_mass > 0.0 ? 1.0 / this.m_mass : 0.0; - if (step.warmStarting) { - vA.addMul(this.m_mA * this.m_impulse, this.m_JvAC); - wA += this.m_iA * this.m_impulse * this.m_JwA; - vB.addMul(this.m_mB * this.m_impulse, this.m_JvBD); - wB += this.m_iB * this.m_impulse * this.m_JwB; - vC.subMul(this.m_mC * this.m_impulse, this.m_JvAC); - wC -= this.m_iC * this.m_impulse * this.m_JwC; - vD.subMul(this.m_mD * this.m_impulse, this.m_JvBD); - wD -= this.m_iD * this.m_impulse * this.m_JwD; - } - else { - this.m_impulse = 0.0; - } - this.m_bodyA.c_velocity.v.setVec2(vA); - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v.setVec2(vB); - this.m_bodyB.c_velocity.w = wB; - this.m_bodyC.c_velocity.v.setVec2(vC); - this.m_bodyC.c_velocity.w = wC; - this.m_bodyD.c_velocity.v.setVec2(vD); - this.m_bodyD.c_velocity.w = wD; - }; - GearJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var vC = this.m_bodyC.c_velocity.v; - var wC = this.m_bodyC.c_velocity.w; - var vD = this.m_bodyD.c_velocity.v; - var wD = this.m_bodyD.c_velocity.w; - var Cdot = Vec2.dot(this.m_JvAC, vA) - Vec2.dot(this.m_JvAC, vC) - + Vec2.dot(this.m_JvBD, vB) - Vec2.dot(this.m_JvBD, vD); // float - Cdot += (this.m_JwA * wA - this.m_JwC * wC) - + (this.m_JwB * wB - this.m_JwD * wD); - var impulse = -this.m_mass * Cdot; // float - this.m_impulse += impulse; - vA.addMul(this.m_mA * impulse, this.m_JvAC); - wA += this.m_iA * impulse * this.m_JwA; - vB.addMul(this.m_mB * impulse, this.m_JvBD); - wB += this.m_iB * impulse * this.m_JwB; - vC.subMul(this.m_mC * impulse, this.m_JvAC); - wC -= this.m_iC * impulse * this.m_JwC; - vD.subMul(this.m_mD * impulse, this.m_JvBD); - wD -= this.m_iD * impulse * this.m_JwD; - this.m_bodyA.c_velocity.v.setVec2(vA); - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v.setVec2(vB); - this.m_bodyB.c_velocity.w = wB; - this.m_bodyC.c_velocity.v.setVec2(vC); - this.m_bodyC.c_velocity.w = wC; - this.m_bodyD.c_velocity.v.setVec2(vD); - this.m_bodyD.c_velocity.w = wD; - }; - /** - * This returns true if the position errors are within tolerance. - */ - GearJoint.prototype.solvePositionConstraints = function (step) { - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var cC = this.m_bodyC.c_position.c; - var aC = this.m_bodyC.c_position.a; - var cD = this.m_bodyD.c_position.c; - var aD = this.m_bodyD.c_position.a; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var qC = Rot.neo(aC); - var qD = Rot.neo(aD); - var linearError = 0.0; - var coordinateA; - var coordinateB; - var JvAC; - var JvBD; - var JwA; - var JwB; - var JwC; - var JwD; - var mass = 0.0; - if (this.m_type1 == RevoluteJoint.TYPE) { - JvAC = Vec2.zero(); - JwA = 1.0; - JwC = 1.0; - mass += this.m_iA + this.m_iC; - coordinateA = aA - aC - this.m_referenceAngleA; - } - else { - var u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2 - var rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2 - var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2 - JvAC = u; - JwC = Vec2.crossVec2Vec2(rC, u); - JwA = Vec2.crossVec2Vec2(rA, u); - mass += this.m_mC + this.m_mA + this.m_iC * JwC * JwC + this.m_iA * JwA * JwA; - var pC = Vec2.sub(this.m_localAnchorC, this.m_lcC); // Vec2 - var pA = Rot.mulTVec2(qC, Vec2.add(rA, Vec2.sub(cA, cC))); // Vec2 - coordinateA = Vec2.dot(Vec2.sub(pA, pC), this.m_localAxisC); - } - if (this.m_type2 == RevoluteJoint.TYPE) { - JvBD = Vec2.zero(); - JwB = this.m_ratio; - JwD = this.m_ratio; - mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD); - coordinateB = aB - aD - this.m_referenceAngleB; - } - else { - var u = Rot.mulVec2(qD, this.m_localAxisD); - var rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); - var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); - JvBD = Vec2.mulNumVec2(this.m_ratio, u); - JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u); - JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u); - mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD - * JwD * JwD + this.m_iB * JwB * JwB; - var pD = Vec2.sub(this.m_localAnchorD, this.m_lcD); // Vec2 - var pB = Rot.mulTVec2(qD, Vec2.add(rB, Vec2.sub(cB, cD))); // Vec2 - coordinateB = Vec2.dot(pB, this.m_localAxisD) - - Vec2.dot(pD, this.m_localAxisD); - } - var C = (coordinateA + this.m_ratio * coordinateB) - this.m_constant; // float - var impulse = 0.0; // float - if (mass > 0.0) { - impulse = -C / mass; - } - cA.addMul(this.m_mA * impulse, JvAC); - aA += this.m_iA * impulse * JwA; - cB.addMul(this.m_mB * impulse, JvBD); - aB += this.m_iB * impulse * JwB; - cC.subMul(this.m_mC * impulse, JvAC); - aC -= this.m_iC * impulse * JwC; - cD.subMul(this.m_mD * impulse, JvBD); - aD -= this.m_iD * impulse * JwD; - this.m_bodyA.c_position.c.setVec2(cA); - this.m_bodyA.c_position.a = aA; - this.m_bodyB.c_position.c.setVec2(cB); - this.m_bodyB.c_position.a = aB; - this.m_bodyC.c_position.c.setVec2(cC); - this.m_bodyC.c_position.a = aC; - this.m_bodyD.c_position.c.setVec2(cD); - this.m_bodyD.c_position.a = aD; - // TODO_ERIN not implemented - return linearError < Settings.linearSlop; - }; - GearJoint.TYPE = 'gear-joint'; - return GearJoint; - }(Joint)); + if (!this._listeners) { + this._listeners = {}; + } + if (!this._listeners[name]) { + this._listeners[name] = []; + } + this._listeners[name].push(listener); + return this; + }; + /** + * Remove an event listener. + */ + // tslint:disable-next-line:typedef + World.prototype.off = function (name, listener) { + if (typeof name !== 'string' || typeof listener !== 'function') { + return this; + } + var listeners = this._listeners && this._listeners[name]; + if (!listeners || !listeners.length) { + return this; + } + var index = listeners.indexOf(listener); + if (index >= 0) { + listeners.splice(index, 1); + } + return this; + }; + World.prototype.publish = function (name, arg1, arg2, arg3) { + var listeners = this._listeners && this._listeners[name]; + if (!listeners || !listeners.length) { + return 0; + } + for (var l = 0; l < listeners.length; l++) { + listeners[l].call(this, arg1, arg2, arg3); + } + return listeners.length; + }; + /** + * @internal + */ + World.prototype.beginContact = function (contact) { + this.publish('begin-contact', contact); + }; + /** + * @internal + */ + World.prototype.endContact = function (contact) { + this.publish('end-contact', contact); + }; + /** + * @internal + */ + World.prototype.preSolve = function (contact, oldManifold) { + this.publish('pre-solve', contact, oldManifold); + }; + /** + * @internal + */ + World.prototype.postSolve = function (contact, impulse) { + this.publish('post-solve', contact, impulse); + }; + return World; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var DEFAULTS$5 = { - maxForce: 1.0, - maxTorque: 1.0, - correctionFactor: 0.3 - }; - /** - * A motor joint is used to control the relative motion between two bodies. A - * typical usage is to control the movement of a dynamic body with respect to - * the ground. - */ - var MotorJoint = /** @class */ (function (_super) { - __extends(MotorJoint, _super); - function MotorJoint(def, bodyA, bodyB) { - var _this = this; - // @ts-ignore - if (!(_this instanceof MotorJoint)) { - return new MotorJoint(def, bodyA, bodyB); - } - def = options(def, DEFAULTS$5); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = MotorJoint.TYPE; - _this.m_linearOffset = math$1.isFinite(def.linearOffset) ? def.linearOffset : bodyA.getLocalPoint(bodyB.getPosition()); - _this.m_angularOffset = math$1.isFinite(def.angularOffset) ? def.angularOffset : bodyB.getAngle() - bodyA.getAngle(); - _this.m_linearImpulse = Vec2.zero(); - _this.m_angularImpulse = 0.0; - _this.m_maxForce = def.maxForce; - _this.m_maxTorque = def.maxTorque; - _this.m_correctionFactor = def.correctionFactor; - return _this; - // Point-to-point constraint - // Cdot = v2 - v1 - // = v2 + cross(w2, r2) - v1 - cross(w1, r1) - // J = [-I -r1_skew I r2_skew ] - // Identity used: - // w k % (rx i + ry j) = w * (-ry i + rx j) - // Angle constraint - // Cdot = w2 - w1 - // J = [0 0 -1 0 0 1] - // K = invI1 + invI2 +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Vec3 = /** @class */ (function () { + // tslint:disable-next-line:typedef + function Vec3(x, y, z) { + if (!(this instanceof Vec3)) { + return new Vec3(x, y, z); } - /** @internal */ - MotorJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - maxForce: this.m_maxForce, - maxTorque: this.m_maxTorque, - correctionFactor: this.m_correctionFactor, - linearOffset: this.m_linearOffset, - angularOffset: this.m_angularOffset, - }; - }; - /** @internal */ - MotorJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - var joint = new MotorJoint(data); - return joint; - }; - /** @internal */ - MotorJoint.prototype._setAnchors = function (def) { - }; - /** - * Set the maximum friction force in N. - */ - MotorJoint.prototype.setMaxForce = function (force) { - this.m_maxForce = force; - }; - /** - * Get the maximum friction force in N. - */ - MotorJoint.prototype.getMaxForce = function () { - return this.m_maxForce; - }; - /** - * Set the maximum friction torque in N*m. - */ - MotorJoint.prototype.setMaxTorque = function (torque) { - this.m_maxTorque = torque; - }; - /** - * Get the maximum friction torque in N*m. - */ - MotorJoint.prototype.getMaxTorque = function () { - return this.m_maxTorque; - }; - /** - * Set the position correction factor in the range [0,1]. - */ - MotorJoint.prototype.setCorrectionFactor = function (factor) { - this.m_correctionFactor = factor; - }; - /** - * Get the position correction factor in the range [0,1]. - */ - MotorJoint.prototype.getCorrectionFactor = function () { - return this.m_correctionFactor; - }; - /** - * Set/get the target linear offset, in frame A, in meters. - */ - MotorJoint.prototype.setLinearOffset = function (linearOffset) { - if (linearOffset.x != this.m_linearOffset.x - || linearOffset.y != this.m_linearOffset.y) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_linearOffset = linearOffset; - } - }; - MotorJoint.prototype.getLinearOffset = function () { - return this.m_linearOffset; - }; - /** - * Set/get the target angular offset, in radians. - */ - MotorJoint.prototype.setAngularOffset = function (angularOffset) { - if (angularOffset != this.m_angularOffset) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_angularOffset = angularOffset; - } - }; - MotorJoint.prototype.getAngularOffset = function () { - return this.m_angularOffset; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - MotorJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getPosition(); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - MotorJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getPosition(); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - MotorJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - MotorJoint.prototype.getReactionTorque = function (inv_dt) { - return inv_dt * this.m_angularImpulse; - }; - MotorJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - // Compute the effective mass matrix. - this.m_rA = Rot.mulVec2(qA, Vec2.neg(this.m_localCenterA)); - this.m_rB = Rot.mulVec2(qB, Vec2.neg(this.m_localCenterB)); - // J = [-I -r1_skew I r2_skew] - // [ 0 -1 0 1] - // r_skew = [-ry; rx] - // Matlab - // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] - // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] - // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - var K = new Mat22(); - K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y * this.m_rB.y; - K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y; - K.ey.x = K.ex.y; - K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x * this.m_rB.x; - this.m_linearMass = K.getInverse(); - this.m_angularMass = iA + iB; - if (this.m_angularMass > 0.0) { - this.m_angularMass = 1.0 / this.m_angularMass; - } - this.m_linearError = Vec2.zero(); - this.m_linearError.addCombine(1, cB, 1, this.m_rB); - this.m_linearError.subCombine(1, cA, 1, this.m_rA); - this.m_linearError.sub(Rot.mulVec2(qA, this.m_linearOffset)); - this.m_angularError = aB - aA - this.m_angularOffset; - if (step.warmStarting) { - // Scale impulses to support a variable time step. - this.m_linearImpulse.mul(step.dtRatio); - this.m_angularImpulse *= step.dtRatio; - var P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y); - vA.subMul(mA, P); - wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse); - vB.addMul(mB, P); - wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse); - } - else { - this.m_linearImpulse.setZero(); - this.m_angularImpulse = 0.0; - } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - MotorJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - var h = step.dt; - var inv_h = step.inv_dt; - // Solve angular friction - { - var Cdot = wB - wA + inv_h * this.m_correctionFactor * this.m_angularError; - var impulse = -this.m_angularMass * Cdot; - var oldImpulse = this.m_angularImpulse; - var maxImpulse = h * this.m_maxTorque; - this.m_angularImpulse = math$1.clamp(this.m_angularImpulse + impulse, -maxImpulse, maxImpulse); - impulse = this.m_angularImpulse - oldImpulse; - wA -= iA * impulse; - wB += iB * impulse; - } - // Solve linear friction - { - var Cdot = Vec2.zero(); - Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); - Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); - Cdot.addMul(inv_h * this.m_correctionFactor, this.m_linearError); - var impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); - var oldImpulse = Vec2.clone(this.m_linearImpulse); - this.m_linearImpulse.add(impulse); - var maxImpulse = h * this.m_maxForce; - this.m_linearImpulse.clamp(maxImpulse); - impulse = Vec2.sub(this.m_linearImpulse, oldImpulse); - vA.subMul(mA, impulse); - wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); - vB.addMul(mB, impulse); - wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); - } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - MotorJoint.prototype.solvePositionConstraints = function (step) { - return true; + if (typeof x === 'undefined') { + this.x = 0; + this.y = 0; + this.z = 0; + } + else if (typeof x === 'object') { + this.x = x.x; + this.y = x.y; + this.z = x.z; + } + else { + this.x = x; + this.y = y; + this.z = z; + } + } + /** @internal */ + Vec3.prototype._serialize = function () { + return { + x: this.x, + y: this.y, + z: this.z }; - MotorJoint.TYPE = 'motor-joint'; - return MotorJoint; - }(Joint)); + }; + /** @internal */ + Vec3._deserialize = function (data) { + var obj = Object.create(Vec3.prototype); + obj.x = data.x; + obj.y = data.y; + obj.z = data.z; + return obj; + }; + /** @internal */ + Vec3.neo = function (x, y, z) { + var obj = Object.create(Vec3.prototype); + obj.x = x; + obj.y = y; + obj.z = z; + return obj; + }; + Vec3.zero = function () { + var obj = Object.create(Vec3.prototype); + obj.x = 0; + obj.y = 0; + obj.z = 0; + return obj; + }; + Vec3.clone = function (v) { + return Vec3.neo(v.x, v.y, v.z); + }; + /** @internal */ + Vec3.prototype.toString = function () { + return JSON.stringify(this); + }; + /** + * Does this vector contain finite coordinates? + */ + Vec3.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return math.isFinite(obj.x) && math.isFinite(obj.y) && math.isFinite(obj.z); + }; + Vec3.assert = function (o) { + }; + Vec3.prototype.setZero = function () { + this.x = 0.0; + this.y = 0.0; + this.z = 0.0; + return this; + }; + Vec3.prototype.set = function (x, y, z) { + this.x = x; + this.y = y; + this.z = z; + return this; + }; + Vec3.prototype.add = function (w) { + this.x += w.x; + this.y += w.y; + this.z += w.z; + return this; + }; + Vec3.prototype.sub = function (w) { + this.x -= w.x; + this.y -= w.y; + this.z -= w.z; + return this; + }; + Vec3.prototype.mul = function (m) { + this.x *= m; + this.y *= m; + this.z *= m; + return this; + }; + Vec3.areEqual = function (v, w) { + return v === w || + typeof v === 'object' && v !== null && + typeof w === 'object' && w !== null && + v.x === w.x && v.y === w.y && v.z === w.z; + }; + /** + * Perform the dot product on two vectors. + */ + Vec3.dot = function (v, w) { + return v.x * w.x + v.y * w.y + v.z * w.z; + }; + /** + * Perform the cross product on two vectors. In 2D this produces a scalar. + */ + Vec3.cross = function (v, w) { + return new Vec3(v.y * w.z - v.z * w.y, v.z * w.x - v.x * w.z, v.x * w.y - v.y * w.x); + }; + Vec3.add = function (v, w) { + return new Vec3(v.x + w.x, v.y + w.y, v.z + w.z); + }; + Vec3.sub = function (v, w) { + return new Vec3(v.x - w.x, v.y - w.y, v.z - w.z); + }; + Vec3.mul = function (v, m) { + return new Vec3(m * v.x, m * v.y, m * v.z); + }; + Vec3.prototype.neg = function () { + this.x = -this.x; + this.y = -this.y; + this.z = -this.z; + return this; + }; + Vec3.neg = function (v) { + return new Vec3(-v.x, -v.y, -v.z); + }; + return Vec3; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var DEFAULTS$4 = { - maxForce: 0.0, - frequencyHz: 5.0, - dampingRatio: 0.7 - }; - /** - * A mouse joint is used to make a point on a body track a specified world - * point. This a soft constraint with a maximum force. This allows the - * constraint to stretch and without applying huge forces. - * - * NOTE: this joint is not documented in the manual because it was developed to - * be used in the testbed. If you want to learn how to use the mouse joint, look - * at the testbed. - */ - var MouseJoint = /** @class */ (function (_super) { - __extends(MouseJoint, _super); - function MouseJoint(def, bodyA, bodyB, target) { - var _this = this; - // @ts-ignore - if (!(_this instanceof MouseJoint)) { - return new MouseJoint(def, bodyA, bodyB, target); - } - def = options(def, DEFAULTS$4); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = MouseJoint.TYPE; - _this.m_targetA = target ? Vec2.clone(target) : def.target || Vec2.zero(); - _this.m_localAnchorB = Transform.mulTVec2(bodyB.getTransform(), _this.m_targetA); - _this.m_maxForce = def.maxForce; - _this.m_impulse = Vec2.zero(); - _this.m_frequencyHz = def.frequencyHz; - _this.m_dampingRatio = def.dampingRatio; - _this.m_beta = 0.0; - _this.m_gamma = 0.0; - // Solver temp - _this.m_rB = Vec2.zero(); - _this.m_localCenterB = Vec2.zero(); - _this.m_invMassB = 0.0; - _this.m_invIB = 0.0; - _this.m_mass = new Mat22(); - _this.m_C = Vec2.zero(); - return _this; - // p = attached point, m = mouse point - // C = p - m - // Cdot = v - // = v + cross(w, r) - // J = [I r_skew] - // Identity used: - // w k % (rx i + ry j) = w * (-ry i + rx j) +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A line segment (edge) shape. These can be connected in chains or loops to + * other edge shapes. The connectivity information is used to ensure correct + * contact normals. + */ +var EdgeShape = /** @class */ (function (_super) { + __extends(EdgeShape, _super); + function EdgeShape(v1, v2) { + var _this = this; + // @ts-ignore + if (!(_this instanceof EdgeShape)) { + return new EdgeShape(v1, v2); } - /** @internal */ - MouseJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - target: this.m_targetA, - maxForce: this.m_maxForce, - frequencyHz: this.m_frequencyHz, - dampingRatio: this.m_dampingRatio, - _localAnchorB: this.m_localAnchorB, - }; - }; - /** @internal */ - MouseJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - data.target = Vec2.clone(data.target); - var joint = new MouseJoint(data); - if (data._localAnchorB) { - joint.m_localAnchorB = data._localAnchorB; - } - return joint; - }; - /** - * Use this to update the target point. - */ - MouseJoint.prototype.setTarget = function (target) { - if (this.m_bodyB.isAwake() == false) { - this.m_bodyB.setAwake(true); - } - this.m_targetA = Vec2.clone(target); - }; - MouseJoint.prototype.getTarget = function () { - return this.m_targetA; - }; - /** - * Set the maximum force in Newtons. - */ - MouseJoint.prototype.setMaxForce = function (force) { - this.m_maxForce = force; - }; - /** - * Get the maximum force in Newtons. - */ - MouseJoint.prototype.getMaxForce = function () { - return this.m_maxForce; - }; - /** - * Set the frequency in Hertz. - */ - MouseJoint.prototype.setFrequency = function (hz) { - this.m_frequencyHz = hz; - }; - /** - * Get the frequency in Hertz. - */ - MouseJoint.prototype.getFrequency = function () { - return this.m_frequencyHz; - }; - /** - * Set the damping ratio (dimensionless). - */ - MouseJoint.prototype.setDampingRatio = function (ratio) { - this.m_dampingRatio = ratio; - }; - /** - * Get the damping ratio (dimensionless). - */ - MouseJoint.prototype.getDampingRatio = function () { - return this.m_dampingRatio; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - MouseJoint.prototype.getAnchorA = function () { - return Vec2.clone(this.m_targetA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - MouseJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - MouseJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.mulNumVec2(inv_dt, this.m_impulse); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - MouseJoint.prototype.getReactionTorque = function (inv_dt) { - return inv_dt * 0.0; - }; - /** - * Shift the origin for any points stored in world coordinates. - */ - MouseJoint.prototype.shiftOrigin = function (newOrigin) { - this.m_targetA.sub(newOrigin); - }; - MouseJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIB = this.m_bodyB.m_invI; - var position = this.m_bodyB.c_position; - var velocity = this.m_bodyB.c_velocity; - var cB = position.c; - var aB = position.a; - var vB = velocity.v; - var wB = velocity.w; - var qB = Rot.neo(aB); - var mass = this.m_bodyB.getMass(); - // Frequency - var omega = 2.0 * math$1.PI * this.m_frequencyHz; - // Damping coefficient - var d = 2.0 * mass * this.m_dampingRatio * omega; - // Spring stiffness - var k = mass * (omega * omega); - // magic formulas - // gamma has units of inverse mass. - // beta has units of inverse time. - var h = step.dt; - this.m_gamma = h * (d + h * k); - if (this.m_gamma != 0.0) { - this.m_gamma = 1.0 / this.m_gamma; - } - this.m_beta = h * k * this.m_gamma; - // Compute the effective mass matrix. - this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) * - // invI2 * skew(r2)] - // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y - // -r1.x*r1.y] - // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x] - var K = new Mat22(); - K.ex.x = this.m_invMassB + this.m_invIB * this.m_rB.y * this.m_rB.y - + this.m_gamma; - K.ex.y = -this.m_invIB * this.m_rB.x * this.m_rB.y; - K.ey.x = K.ex.y; - K.ey.y = this.m_invMassB + this.m_invIB * this.m_rB.x * this.m_rB.x - + this.m_gamma; - this.m_mass = K.getInverse(); - this.m_C.setVec2(cB); - this.m_C.addCombine(1, this.m_rB, -1, this.m_targetA); - this.m_C.mul(this.m_beta); - // Cheat with some damping - wB *= 0.98; - if (step.warmStarting) { - this.m_impulse.mul(step.dtRatio); - vB.addMul(this.m_invMassB, this.m_impulse); - wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, this.m_impulse); - } - else { - this.m_impulse.setZero(); - } - velocity.v.setVec2(vB); - velocity.w = wB; - }; - MouseJoint.prototype.solveVelocityConstraints = function (step) { - var velocity = this.m_bodyB.c_velocity; - var vB = Vec2.clone(velocity.v); - var wB = velocity.w; - // Cdot = v + cross(w, r) - var Cdot = Vec2.crossNumVec2(wB, this.m_rB); - Cdot.add(vB); - Cdot.addCombine(1, this.m_C, this.m_gamma, this.m_impulse); - Cdot.neg(); - var impulse = Mat22.mulVec2(this.m_mass, Cdot); - var oldImpulse = Vec2.clone(this.m_impulse); - this.m_impulse.add(impulse); - var maxImpulse = step.dt * this.m_maxForce; - this.m_impulse.clamp(maxImpulse); - impulse = Vec2.sub(this.m_impulse, oldImpulse); - vB.addMul(this.m_invMassB, impulse); - wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, impulse); - velocity.v.setVec2(vB); - velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - MouseJoint.prototype.solvePositionConstraints = function (step) { - return true; + _this = _super.call(this) || this; + _this.m_type = EdgeShape.TYPE; + _this.m_radius = Settings.polygonRadius; + _this.m_vertex1 = v1 ? Vec2.clone(v1) : Vec2.zero(); + _this.m_vertex2 = v2 ? Vec2.clone(v2) : Vec2.zero(); + _this.m_vertex0 = Vec2.zero(); + _this.m_vertex3 = Vec2.zero(); + _this.m_hasVertex0 = false; + _this.m_hasVertex3 = false; + return _this; + } + /** @internal */ + EdgeShape.prototype._serialize = function () { + return { + type: this.m_type, + vertex1: this.m_vertex1, + vertex2: this.m_vertex2, + vertex0: this.m_vertex0, + vertex3: this.m_vertex3, + hasVertex0: this.m_hasVertex0, + hasVertex3: this.m_hasVertex3, }; - MouseJoint.TYPE = 'mouse-joint'; - return MouseJoint; - }(Joint)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba + }; + /** @internal */ + EdgeShape._deserialize = function (data) { + var shape = new EdgeShape(data.vertex1, data.vertex2); + if (shape.m_hasVertex0) { + shape.setPrevVertex(data.vertex0); + } + if (shape.m_hasVertex3) { + shape.setNextVertex(data.vertex3); + } + return shape; + }; + /** @internal */ + EdgeShape.prototype._reset = function () { + // noop + }; + EdgeShape.prototype.getRadius = function () { + return this.m_radius; + }; + EdgeShape.prototype.getType = function () { + return this.m_type; + }; + /** @internal @deprecated */ + EdgeShape.prototype.setNext = function (v) { + return this.setNextVertex(v); + }; + /** + * Optional next vertex, used for smooth collision. + */ + EdgeShape.prototype.setNextVertex = function (v) { + if (v) { + this.m_vertex3.setVec2(v); + this.m_hasVertex3 = true; + } + else { + this.m_vertex3.setZero(); + this.m_hasVertex3 = false; + } + return this; + }; + /** + * Optional next vertex, used for smooth collision. + */ + EdgeShape.prototype.getNextVertex = function () { + return this.m_vertex3; + }; + /** @internal @deprecated */ + EdgeShape.prototype.setPrev = function (v) { + return this.setPrevVertex(v); + }; + /** + * Optional prev vertex, used for smooth collision. + */ + EdgeShape.prototype.setPrevVertex = function (v) { + if (v) { + this.m_vertex0.setVec2(v); + this.m_hasVertex0 = true; + } + else { + this.m_vertex0.setZero(); + this.m_hasVertex0 = false; + } + return this; + }; + /** + * Optional prev vertex, used for smooth collision. + */ + EdgeShape.prototype.getPrevVertex = function () { + return this.m_vertex0; + }; + /** + * Set this as an isolated edge. + */ + EdgeShape.prototype._set = function (v1, v2) { + this.m_vertex1.setVec2(v1); + this.m_vertex2.setVec2(v2); + this.m_hasVertex0 = false; + this.m_hasVertex3 = false; + return this; + }; + /** + * @internal + * @deprecated Shapes should be treated as immutable. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * clone the concrete shape. + */ + EdgeShape.prototype._clone = function () { + var clone = new EdgeShape(); + clone.m_type = this.m_type; + clone.m_radius = this.m_radius; + clone.m_vertex1.setVec2(this.m_vertex1); + clone.m_vertex2.setVec2(this.m_vertex2); + clone.m_vertex0.setVec2(this.m_vertex0); + clone.m_vertex3.setVec2(this.m_vertex3); + clone.m_hasVertex0 = this.m_hasVertex0; + clone.m_hasVertex3 = this.m_hasVertex3; + return clone; + }; + /** + * Get the number of child primitives. + */ + EdgeShape.prototype.getChildCount = function () { + return 1; + }; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + EdgeShape.prototype.testPoint = function (xf, p) { + return false; + }; + /** + * Cast a ray against a child shape. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index */ - var DEFAULTS$3 = { - collideConnected: true + EdgeShape.prototype.rayCast = function (output, input, xf, childIndex) { + // p = p1 + t * d + // v = v1 + s * e + // p1 + t * d = v1 + s * e + // s * e - t * d = p1 - v1 + // NOT_USED(childIndex); + // Put the ray into the edge's frame of reference. + var p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p)); + var p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p)); + var d = Vec2.sub(p2, p1); + var v1 = this.m_vertex1; + var v2 = this.m_vertex2; + var e = Vec2.sub(v2, v1); + var normal = Vec2.neo(e.y, -e.x); + normal.normalize(); + // q = p1 + t * d + // dot(normal, q - v1) = 0 + // dot(normal, p1 - v1) + t * dot(normal, d) = 0 + var numerator = Vec2.dot(normal, Vec2.sub(v1, p1)); + var denominator = Vec2.dot(normal, d); + if (denominator == 0.0) { + return false; + } + var t = numerator / denominator; + if (t < 0.0 || input.maxFraction < t) { + return false; + } + var q = Vec2.add(p1, Vec2.mulNumVec2(t, d)); + // q = v1 + s * r + // s = dot(q - v1, r) / dot(r, r) + var r = Vec2.sub(v2, v1); + var rr = Vec2.dot(r, r); + if (rr == 0.0) { + return false; + } + var s = Vec2.dot(Vec2.sub(q, v1), r) / rr; + if (s < 0.0 || 1.0 < s) { + return false; + } + output.fraction = t; + if (numerator > 0.0) { + output.normal = Rot.mulVec2(xf.q, normal).neg(); + } + else { + output.normal = Rot.mulVec2(xf.q, normal); + } + return true; }; /** - * The pulley joint is connected to two bodies and two fixed ground points. The - * pulley supports a ratio such that: length1 + ratio * length2 <= constant + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. * - * Yes, the force transmitted is scaled by the ratio. + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + EdgeShape.prototype.computeAABB = function (aabb, xf, childIndex) { + var v1 = Transform.mulVec2(xf, this.m_vertex1); + var v2 = Transform.mulVec2(xf, this.m_vertex2); + aabb.combinePoints(v1, v2); + aabb.extend(this.m_radius); + }; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. * - * Warning: the pulley joint can get a bit squirrelly by itself. They often work - * better when combined with prismatic joints. You should also cover the the - * anchor points with static shapes to prevent one side from going to zero - * length. - */ - var PulleyJoint = /** @class */ (function (_super) { - __extends(PulleyJoint, _super); - function PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio) { - var _this = this; - // @ts-ignore - if (!(_this instanceof PulleyJoint)) { - return new PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio); - } - def = options(def, DEFAULTS$3); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = PulleyJoint.TYPE; - _this.m_groundAnchorA = groundA ? groundA : def.groundAnchorA || Vec2.neo(-1.0, 1.0); - _this.m_groundAnchorB = groundB ? groundB : def.groundAnchorB || Vec2.neo(1.0, 1.0); - _this.m_localAnchorA = anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.neo(-1.0, 0.0); - _this.m_localAnchorB = anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.neo(1.0, 0.0); - _this.m_lengthA = math$1.isFinite(def.lengthA) ? def.lengthA : Vec2.distance(anchorA, groundA); - _this.m_lengthB = math$1.isFinite(def.lengthB) ? def.lengthB : Vec2.distance(anchorB, groundB); - _this.m_ratio = math$1.isFinite(ratio) ? ratio : def.ratio; - _this.m_constant = _this.m_lengthA + _this.m_ratio * _this.m_lengthB; - _this.m_impulse = 0.0; - return _this; - // Pulley: - // length1 = norm(p1 - s1) - // length2 = norm(p2 - s2) - // C0 = (length1 + ratio * length2)_initial - // C = C0 - (length1 + ratio * length2) - // u1 = (p1 - s1) / norm(p1 - s1) - // u2 = (p2 - s2) / norm(p2 - s2) - // Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2)) - // J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)] - // K = J * invM * JT - // = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 * - // cross(r2, u2)^2) - } - PulleyJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - groundAnchorA: this.m_groundAnchorA, - groundAnchorB: this.m_groundAnchorB, - localAnchorA: this.m_localAnchorA, - localAnchorB: this.m_localAnchorB, - lengthA: this.m_lengthA, - lengthB: this.m_lengthB, - ratio: this.m_ratio, - }; - }; - /** @internal */ - PulleyJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - var joint = new PulleyJoint(data); - return joint; - }; - /** - * Get the first ground anchor. - */ - PulleyJoint.prototype.getGroundAnchorA = function () { - return this.m_groundAnchorA; - }; - /** - * Get the second ground anchor. - */ - PulleyJoint.prototype.getGroundAnchorB = function () { - return this.m_groundAnchorB; - }; - /** - * Get the current length of the segment attached to bodyA. - */ - PulleyJoint.prototype.getLengthA = function () { - return this.m_lengthA; - }; - /** - * Get the current length of the segment attached to bodyB. - */ - PulleyJoint.prototype.getLengthB = function () { - return this.m_lengthB; - }; - /** - * Get the pulley ratio. - */ - PulleyJoint.prototype.getRatio = function () { - return this.m_ratio; - }; - /** - * Get the current length of the segment attached to bodyA. - */ - PulleyJoint.prototype.getCurrentLengthA = function () { - var p = this.m_bodyA.getWorldPoint(this.m_localAnchorA); - var s = this.m_groundAnchorA; - return Vec2.distance(p, s); - }; - /** - * Get the current length of the segment attached to bodyB. - */ - PulleyJoint.prototype.getCurrentLengthB = function () { - var p = this.m_bodyB.getWorldPoint(this.m_localAnchorB); - var s = this.m_groundAnchorB; - return Vec2.distance(p, s); - }; - /** - * Shift the origin for any points stored in world coordinates. - * - * @param newOrigin - */ - PulleyJoint.prototype.shiftOrigin = function (newOrigin) { - this.m_groundAnchorA.sub(newOrigin); - this.m_groundAnchorB.sub(newOrigin); - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - PulleyJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - PulleyJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - PulleyJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.mulNumVec2(this.m_impulse, this.m_uB).mul(inv_dt); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - PulleyJoint.prototype.getReactionTorque = function (inv_dt) { - return 0.0; - }; - PulleyJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - // Get the pulley axes. - this.m_uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA); - this.m_uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB); - var lengthA = this.m_uA.length(); - var lengthB = this.m_uB.length(); - if (lengthA > 10.0 * Settings.linearSlop) { - this.m_uA.mul(1.0 / lengthA); - } - else { - this.m_uA.setZero(); - } - if (lengthB > 10.0 * Settings.linearSlop) { - this.m_uB.mul(1.0 / lengthB); - } - else { - this.m_uB.setZero(); - } - // Compute effective mass. - var ruA = Vec2.crossVec2Vec2(this.m_rA, this.m_uA); // float - var ruB = Vec2.crossVec2Vec2(this.m_rB, this.m_uB); // float - var mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float - var mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float - this.m_mass = mA + this.m_ratio * this.m_ratio * mB; - if (this.m_mass > 0.0) { - this.m_mass = 1.0 / this.m_mass; - } - if (step.warmStarting) { - // Scale impulses to support variable time steps. - this.m_impulse *= step.dtRatio; - // Warm starting. - var PA = Vec2.mulNumVec2(-this.m_impulse, this.m_uA); - var PB = Vec2.mulNumVec2(-this.m_ratio * this.m_impulse, this.m_uB); - vA.addMul(this.m_invMassA, PA); - wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA); - vB.addMul(this.m_invMassB, PB); - wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB); - } - else { - this.m_impulse = 0.0; - } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - PulleyJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA)); - var vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)); - var Cdot = -Vec2.dot(this.m_uA, vpA) - this.m_ratio - * Vec2.dot(this.m_uB, vpB); // float - var impulse = -this.m_mass * Cdot; // float - this.m_impulse += impulse; - var PA = Vec2.mulNumVec2(-impulse, this.m_uA); // Vec2 - var PB = Vec2.mulNumVec2(-this.m_ratio * impulse, this.m_uB); // Vec2 - vA.addMul(this.m_invMassA, PA); - wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA); - vB.addMul(this.m_invMassB, PB); - wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB); - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - PulleyJoint.prototype.solvePositionConstraints = function (step) { - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - // Get the pulley axes. - var uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA); - var uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB); - var lengthA = uA.length(); - var lengthB = uB.length(); - if (lengthA > 10.0 * Settings.linearSlop) { - uA.mul(1.0 / lengthA); - } - else { - uA.setZero(); - } - if (lengthB > 10.0 * Settings.linearSlop) { - uB.mul(1.0 / lengthB); + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + EdgeShape.prototype.computeMass = function (massData, density) { + massData.mass = 0.0; + massData.center.setCombine(0.5, this.m_vertex1, 0.5, this.m_vertex2); + massData.I = 0.0; + }; + EdgeShape.prototype.computeDistanceProxy = function (proxy) { + proxy.m_vertices.push(this.m_vertex1); + proxy.m_vertices.push(this.m_vertex2); + proxy.m_count = 2; + proxy.m_radius = this.m_radius; + }; + EdgeShape.TYPE = 'edge'; + return EdgeShape; +}(Shape)); +var Edge = EdgeShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A chain shape is a free form sequence of line segments. The chain has + * two-sided collision, so you can use inside and outside collision. Therefore, + * you may use any winding order. Connectivity information is used to create + * smooth collisions. + * + * WARNING: The chain will not collide properly if there are self-intersections. + */ +var ChainShape = /** @class */ (function (_super) { + __extends(ChainShape, _super); + function ChainShape(vertices, loop) { + var _this = this; + // @ts-ignore + if (!(_this instanceof ChainShape)) { + return new ChainShape(vertices, loop); + } + _this = _super.call(this) || this; + _this.m_type = ChainShape.TYPE; + _this.m_radius = Settings.polygonRadius; + _this.m_vertices = []; + _this.m_count = 0; + _this.m_prevVertex = null; + _this.m_nextVertex = null; + _this.m_hasPrevVertex = false; + _this.m_hasNextVertex = false; + _this.m_isLoop = !!loop; + if (vertices && vertices.length) { + if (loop) { + _this._createLoop(vertices); } else { - uB.setZero(); + _this._createChain(vertices); } - // Compute effective mass. - var ruA = Vec2.crossVec2Vec2(rA, uA); - var ruB = Vec2.crossVec2Vec2(rB, uB); - var mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float - var mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float - var mass = mA + this.m_ratio * this.m_ratio * mB; // float - if (mass > 0.0) { - mass = 1.0 / mass; + } + return _this; + } + /** @internal */ + ChainShape.prototype._serialize = function () { + var data = { + type: this.m_type, + vertices: this.m_vertices, + isLoop: this.m_isLoop, + hasPrevVertex: this.m_hasPrevVertex, + hasNextVertex: this.m_hasNextVertex, + prevVertex: null, + nextVertex: null, + }; + if (this.m_prevVertex) { + data.prevVertex = this.m_prevVertex; + } + if (this.m_nextVertex) { + data.nextVertex = this.m_nextVertex; + } + return data; + }; + /** @internal */ + ChainShape._deserialize = function (data, fixture, restore) { + var vertices = []; + if (data.vertices) { + for (var i = 0; i < data.vertices.length; i++) { + vertices.push(restore(Vec2, data.vertices[i])); } - var C = this.m_constant - lengthA - this.m_ratio * lengthB; // float - var linearError = math$1.abs(C); // float - var impulse = -mass * C; // float - var PA = Vec2.mulNumVec2(-impulse, uA); // Vec2 - var PB = Vec2.mulNumVec2(-this.m_ratio * impulse, uB); // Vec2 - cA.addMul(this.m_invMassA, PA); - aA += this.m_invIA * Vec2.crossVec2Vec2(rA, PA); - cB.addMul(this.m_invMassB, PB); - aB += this.m_invIB * Vec2.crossVec2Vec2(rB, PB); - this.m_bodyA.c_position.c = cA; - this.m_bodyA.c_position.a = aA; - this.m_bodyB.c_position.c = cB; - this.m_bodyB.c_position.a = aB; - return linearError < Settings.linearSlop; - }; - PulleyJoint.TYPE = 'pulley-joint'; - return PulleyJoint; - }(Joint)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba + } + var shape = new ChainShape(vertices, data.isLoop); + if (data.prevVertex) { + shape.setPrevVertex(data.prevVertex); + } + if (data.nextVertex) { + shape.setNextVertex(data.nextVertex); + } + return shape; + }; + // clear() { + // this.m_vertices.length = 0; + // this.m_count = 0; + // } + ChainShape.prototype.getType = function () { + return this.m_type; + }; + ChainShape.prototype.getRadius = function () { + return this.m_radius; + }; + /** + * @internal + * Create a loop. This automatically adjusts connectivity. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * @param vertices an array of vertices, these are copied + * @param count the vertex count + */ + ChainShape.prototype._createLoop = function (vertices) { + for (var i = 1; i < vertices.length; ++i) { + vertices[i - 1]; + vertices[i]; + } + this.m_vertices = []; + this.m_count = vertices.length + 1; + for (var i = 0; i < vertices.length; ++i) { + this.m_vertices[i] = Vec2.clone(vertices[i]); + } + this.m_vertices[vertices.length] = Vec2.clone(vertices[0]); + this.m_prevVertex = this.m_vertices[this.m_count - 2]; + this.m_nextVertex = this.m_vertices[1]; + this.m_hasPrevVertex = true; + this.m_hasNextVertex = true; + return this; + }; + /** + * @internal + * Create a chain with isolated end vertices. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * @param vertices an array of vertices, these are copied + * @param count the vertex count + */ + ChainShape.prototype._createChain = function (vertices) { + for (var i = 1; i < vertices.length; ++i) { + // If the code crashes here, it means your vertices are too close together. + vertices[i - 1]; + vertices[i]; + } + this.m_count = vertices.length; + for (var i = 0; i < vertices.length; ++i) { + this.m_vertices[i] = Vec2.clone(vertices[i]); + } + this.m_hasPrevVertex = false; + this.m_hasNextVertex = false; + this.m_prevVertex = null; + this.m_nextVertex = null; + return this; + }; + /** @internal */ + ChainShape.prototype._reset = function () { + if (this.m_isLoop) { + this._createLoop(this.m_vertices); + } + else { + this._createChain(this.m_vertices); + } + }; + /** + * Establish connectivity to a vertex that precedes the first vertex. Don't call + * this for loops. + */ + ChainShape.prototype.setPrevVertex = function (prevVertex) { + this.m_prevVertex = prevVertex; + this.m_hasPrevVertex = true; + }; + ChainShape.prototype.getPrevVertex = function () { + return this.m_prevVertex; + }; + /** + * Establish connectivity to a vertex that follows the last vertex. Don't call + * this for loops. + */ + ChainShape.prototype.setNextVertex = function (nextVertex) { + this.m_nextVertex = nextVertex; + this.m_hasNextVertex = true; + }; + ChainShape.prototype.getNextVertex = function () { + return this.m_nextVertex; + }; + /** + * @internal + * @deprecated Shapes should be treated as immutable. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var inactiveLimit = 0; - var atUpperLimit = 2; - var DEFAULTS$2 = { - maxLength: 0.0, - }; - /** - * A rope joint enforces a maximum distance between two points on two bodies. It - * has no other effect. + * clone the concrete shape. + */ + ChainShape.prototype._clone = function () { + var clone = new ChainShape(); + clone._createChain(this.m_vertices); + clone.m_type = this.m_type; + clone.m_radius = this.m_radius; + clone.m_prevVertex = this.m_prevVertex; + clone.m_nextVertex = this.m_nextVertex; + clone.m_hasPrevVertex = this.m_hasPrevVertex; + clone.m_hasNextVertex = this.m_hasNextVertex; + return clone; + }; + /** + * Get the number of child primitives. + */ + ChainShape.prototype.getChildCount = function () { + // edge count = vertex count - 1 + return this.m_count - 1; + }; + // Get a child edge. + ChainShape.prototype.getChildEdge = function (edge, childIndex) { + edge.m_type = EdgeShape.TYPE; + edge.m_radius = this.m_radius; + edge.m_vertex1 = this.m_vertices[childIndex]; + edge.m_vertex2 = this.m_vertices[childIndex + 1]; + if (childIndex > 0) { + edge.m_vertex0 = this.m_vertices[childIndex - 1]; + edge.m_hasVertex0 = true; + } + else { + edge.m_vertex0 = this.m_prevVertex; + edge.m_hasVertex0 = this.m_hasPrevVertex; + } + if (childIndex < this.m_count - 2) { + edge.m_vertex3 = this.m_vertices[childIndex + 2]; + edge.m_hasVertex3 = true; + } + else { + edge.m_vertex3 = this.m_nextVertex; + edge.m_hasVertex3 = this.m_hasNextVertex; + } + }; + ChainShape.prototype.getVertex = function (index) { + if (index < this.m_count) { + return this.m_vertices[index]; + } + else { + return this.m_vertices[0]; + } + }; + ChainShape.prototype.isLoop = function () { + return this.m_isLoop; + }; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. * - * Warning: if you attempt to change the maximum length during the simulation - * you will get some non-physical behavior. + * This always return false. * - * A model that would allow you to dynamically modify the length would have some - * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you - * want to dynamically control length. - */ - var RopeJoint = /** @class */ (function (_super) { - __extends(RopeJoint, _super); - function RopeJoint(def, bodyA, bodyB, anchor) { - var _this = this; - // @ts-ignore - if (!(_this instanceof RopeJoint)) { - return new RopeJoint(def, bodyA, bodyB, anchor); - } - def = options(def, DEFAULTS$2); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = RopeJoint.TYPE; - _this.m_localAnchorA = anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.neo(-1.0, 0.0); - _this.m_localAnchorB = anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.neo(1.0, 0.0); - _this.m_maxLength = def.maxLength; - _this.m_mass = 0.0; - _this.m_impulse = 0.0; - _this.m_length = 0.0; - _this.m_state = inactiveLimit; - return _this; - // Limit: - // C = norm(pB - pA) - L - // u = (pB - pA) / norm(pB - pA) - // Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA)) - // J = [-u -cross(rA, u) u cross(rB, u)] - // K = J * invM * JT - // = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2 - } - /** @internal */ - RopeJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - localAnchorA: this.m_localAnchorA, - localAnchorB: this.m_localAnchorB, - maxLength: this.m_maxLength, - }; - }; - /** @internal */ - RopeJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - var joint = new RopeJoint(data); - return joint; - }; - /** - * The local anchor point relative to bodyA's origin. - */ - RopeJoint.prototype.getLocalAnchorA = function () { - return this.m_localAnchorA; - }; - /** - * The local anchor point relative to bodyB's origin. - */ - RopeJoint.prototype.getLocalAnchorB = function () { - return this.m_localAnchorB; - }; - /** - * Set the maximum length of the rope. - */ - RopeJoint.prototype.setMaxLength = function (length) { - this.m_maxLength = length; - }; - /** - * Get the maximum length of the rope. - */ - RopeJoint.prototype.getMaxLength = function () { - return this.m_maxLength; - }; - RopeJoint.prototype.getLimitState = function () { - // TODO LimitState - return this.m_state; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - RopeJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - RopeJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - RopeJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - RopeJoint.prototype.getReactionTorque = function (inv_dt) { - return 0.0; - }; - RopeJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - this.m_rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); - this.m_rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); - this.m_u = Vec2.zero(); - this.m_u.addCombine(1, cB, 1, this.m_rB); - this.m_u.subCombine(1, cA, 1, this.m_rA); // Vec2 - this.m_length = this.m_u.length(); - var C = this.m_length - this.m_maxLength; // float - if (C > 0.0) { - this.m_state = atUpperLimit; - } - else { - this.m_state = inactiveLimit; - } - if (this.m_length > Settings.linearSlop) { - this.m_u.mul(1.0 / this.m_length); - } - else { - this.m_u.setZero(); - this.m_mass = 0.0; - this.m_impulse = 0.0; - return; - } - // Compute effective mass. - var crA = Vec2.crossVec2Vec2(this.m_rA, this.m_u); // float - var crB = Vec2.crossVec2Vec2(this.m_rB, this.m_u); // float - var invMass = this.m_invMassA + this.m_invIA * crA * crA + this.m_invMassB - + this.m_invIB * crB * crB; // float - this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0; - if (step.warmStarting) { - // Scale the impulse to support a variable time step. - this.m_impulse *= step.dtRatio; - var P = Vec2.mulNumVec2(this.m_impulse, this.m_u); - vA.subMul(this.m_invMassA, P); - wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); - vB.addMul(this.m_invMassB, P); - wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); - } - else { - this.m_impulse = 0.0; - } - this.m_bodyA.c_velocity.v.setVec2(vA); - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v.setVec2(vB); - this.m_bodyB.c_velocity.w = wB; - }; - RopeJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - // Cdot = dot(u, v + cross(w, r)) - var vpA = Vec2.addCrossNumVec2(vA, wA, this.m_rA); // Vec2 - var vpB = Vec2.addCrossNumVec2(vB, wB, this.m_rB); // Vec2 - var C = this.m_length - this.m_maxLength; // float - var Cdot = Vec2.dot(this.m_u, Vec2.sub(vpB, vpA)); // float - // Predictive constraint. - if (C < 0.0) { - Cdot += step.inv_dt * C; - } - var impulse = -this.m_mass * Cdot; // float - var oldImpulse = this.m_impulse; // float - this.m_impulse = math$1.min(0.0, this.m_impulse + impulse); - impulse = this.m_impulse - oldImpulse; - var P = Vec2.mulNumVec2(impulse, this.m_u); // Vec2 - vA.subMul(this.m_invMassA, P); - wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); - vB.addMul(this.m_invMassB, P); - wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - RopeJoint.prototype.solvePositionConstraints = function (step) { - var cA = this.m_bodyA.c_position.c; // Vec2 - var aA = this.m_bodyA.c_position.a; // float - var cB = this.m_bodyB.c_position.c; // Vec2 - var aB = this.m_bodyB.c_position.a; // float - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); - var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); - var u = Vec2.zero(); - u.addCombine(1, cB, 1, rB); - u.subCombine(1, cA, 1, rA); // Vec2 - var length = u.normalize(); // float - var C = length - this.m_maxLength; // float - C = math$1.clamp(C, 0.0, Settings.maxLinearCorrection); - var impulse = -this.m_mass * C; // float - var P = Vec2.mulNumVec2(impulse, u); // Vec2 - cA.subMul(this.m_invMassA, P); - aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P); - cB.addMul(this.m_invMassB, P); - aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P); - this.m_bodyA.c_position.c.setVec2(cA); - this.m_bodyA.c_position.a = aA; - this.m_bodyB.c_position.c.setVec2(cB); - this.m_bodyB.c_position.a = aB; - return length - this.m_maxLength < Settings.linearSlop; - }; - RopeJoint.TYPE = 'rope-joint'; - return RopeJoint; - }(Joint)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + ChainShape.prototype.testPoint = function (xf, p) { + return false; + }; + /** + * Cast a ray against a child shape. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + ChainShape.prototype.rayCast = function (output, input, xf, childIndex) { + var edgeShape = new EdgeShape(this.getVertex(childIndex), this.getVertex(childIndex + 1)); + return edgeShape.rayCast(output, input, xf, 0); + }; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + ChainShape.prototype.computeAABB = function (aabb, xf, childIndex) { + var v1 = Transform.mulVec2(xf, this.getVertex(childIndex)); + var v2 = Transform.mulVec2(xf, this.getVertex(childIndex + 1)); + aabb.combinePoints(v1, v2); + }; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var DEFAULTS$1 = { - frequencyHz: 0.0, - dampingRatio: 0.0, - }; - /** - * A weld joint essentially glues two bodies together. A weld joint may distort - * somewhat because the island constraint solver is approximate. - */ - var WeldJoint = /** @class */ (function (_super) { - __extends(WeldJoint, _super); - function WeldJoint(def, bodyA, bodyB, anchor) { - var _this = this; - // @ts-ignore - if (!(_this instanceof WeldJoint)) { - return new WeldJoint(def, bodyA, bodyB, anchor); - } - def = options(def, DEFAULTS$1); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = WeldJoint.TYPE; - _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); - _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); - _this.m_referenceAngle = math$1.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); - _this.m_frequencyHz = def.frequencyHz; - _this.m_dampingRatio = def.dampingRatio; - _this.m_impulse = new Vec3(); - _this.m_bias = 0.0; - _this.m_gamma = 0.0; - // Solver temp - _this.m_rA; // Vec2 - _this.m_rB; // Vec2 - _this.m_localCenterA; // Vec2 - _this.m_localCenterB; // Vec2 - _this.m_invMassA; // float - _this.m_invMassB; // float - _this.m_invIA; // float - _this.m_invIB; // float - _this.m_mass = new Mat33(); - return _this; - // Point-to-point constraint - // C = p2 - p1 - // Cdot = v2 - v1 - // / = v2 + cross(w2, r2) - v1 - cross(w1, r1) - // J = [-I -r1_skew I r2_skew ] - // Identity used: - // w k % (rx i + ry j) = w * (-ry i + rx j) - // Angle constraint - // C = angle2 - angle1 - referenceAngle - // Cdot = w2 - w1 - // J = [0 0 -1 0 0 1] - // K = invI1 + invI2 + * Chains have zero mass. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + ChainShape.prototype.computeMass = function (massData, density) { + massData.mass = 0.0; + massData.center = Vec2.zero(); + massData.I = 0.0; + }; + ChainShape.prototype.computeDistanceProxy = function (proxy, childIndex) { + proxy.m_buffer[0] = this.getVertex(childIndex); + proxy.m_buffer[1] = this.getVertex(childIndex + 1); + proxy.m_vertices = proxy.m_buffer; + proxy.m_count = 2; + proxy.m_radius = this.m_radius; + }; + ChainShape.TYPE = 'chain'; + return ChainShape; +}(Shape)); +var Chain = ChainShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A convex polygon. It is assumed that the interior of the polygon is to the + * left of each edge. Polygons have a maximum number of vertices equal to + * Settings.maxPolygonVertices. In most cases you should not need many vertices + * for a convex polygon. extends Shape + */ +var PolygonShape = /** @class */ (function (_super) { + __extends(PolygonShape, _super); + // @ts-ignore + function PolygonShape(vertices) { + var _this = this; + // @ts-ignore + if (!(_this instanceof PolygonShape)) { + return new PolygonShape(vertices); } - /** @internal */ - WeldJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - frequencyHz: this.m_frequencyHz, - dampingRatio: this.m_dampingRatio, - localAnchorA: this.m_localAnchorA, - localAnchorB: this.m_localAnchorB, - referenceAngle: this.m_referenceAngle, - }; - }; - /** @internal */ - WeldJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - var joint = new WeldJoint(data); - return joint; - }; - /** @internal */ - WeldJoint.prototype._setAnchors = function (def) { - if (def.anchorA) { - this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); - } - else if (def.localAnchorA) { - this.m_localAnchorA.setVec2(def.localAnchorA); - } - if (def.anchorB) { - this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); - } - else if (def.localAnchorB) { - this.m_localAnchorB.setVec2(def.localAnchorB); - } - }; - /** - * The local anchor point relative to bodyA's origin. - */ - WeldJoint.prototype.getLocalAnchorA = function () { - return this.m_localAnchorA; - }; - /** - * The local anchor point relative to bodyB's origin. - */ - WeldJoint.prototype.getLocalAnchorB = function () { - return this.m_localAnchorB; - }; - /** - * Get the reference angle. - */ - WeldJoint.prototype.getReferenceAngle = function () { - return this.m_referenceAngle; - }; - /** - * Set frequency in Hz. - */ - WeldJoint.prototype.setFrequency = function (hz) { - this.m_frequencyHz = hz; - }; - /** - * Get frequency in Hz. - */ - WeldJoint.prototype.getFrequency = function () { - return this.m_frequencyHz; - }; - /** - * Set damping ratio. - */ - WeldJoint.prototype.setDampingRatio = function (ratio) { - this.m_dampingRatio = ratio; - }; - /** - * Get damping ratio. - */ - WeldJoint.prototype.getDampingRatio = function () { - return this.m_dampingRatio; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - WeldJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - WeldJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - WeldJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - WeldJoint.prototype.getReactionTorque = function (inv_dt) { - return inv_dt * this.m_impulse.z; - }; - WeldJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - // J = [-I -r1_skew I r2_skew] - // [ 0 -1 0 1] - // r_skew = [-ry; rx] - // Matlab - // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] - // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] - // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - var K = new Mat33(); - K.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y * this.m_rB.y - * iB; - K.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y * this.m_rB.x * iB; - K.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB; - K.ex.y = K.ey.x; - K.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x * this.m_rB.x - * iB; - K.ez.y = this.m_rA.x * iA + this.m_rB.x * iB; - K.ex.z = K.ez.x; - K.ey.z = K.ez.y; - K.ez.z = iA + iB; - if (this.m_frequencyHz > 0.0) { - K.getInverse22(this.m_mass); - var invM = iA + iB; // float - var m = invM > 0.0 ? 1.0 / invM : 0.0; // float - var C = aB - aA - this.m_referenceAngle; // float - // Frequency - var omega = 2.0 * math$1.PI * this.m_frequencyHz; // float - // Damping coefficient - var d = 2.0 * m * this.m_dampingRatio * omega; // float - // Spring stiffness - var k = m * omega * omega; // float - // magic formulas - var h = step.dt; // float - this.m_gamma = h * (d + h * k); - this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0; - this.m_bias = C * h * k * this.m_gamma; - invM += this.m_gamma; - this.m_mass.ez.z = invM != 0.0 ? 1.0 / invM : 0.0; - } - else if (K.ez.z == 0.0) { - K.getInverse22(this.m_mass); - this.m_gamma = 0.0; - this.m_bias = 0.0; - } - else { - K.getSymInverse33(this.m_mass); - this.m_gamma = 0.0; - this.m_bias = 0.0; - } - if (step.warmStarting) { - // Scale impulses to support a variable time step. - this.m_impulse.mul(step.dtRatio); - var P = Vec2.neo(this.m_impulse.x, this.m_impulse.y); - vA.subMul(mA, P); - wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_impulse.z); - vB.addMul(mB, P); - wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_impulse.z); - } - else { - this.m_impulse.setZero(); - } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - WeldJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var mA = this.m_invMassA; - var mB = this.m_invMassB; // float - var iA = this.m_invIA; - var iB = this.m_invIB; // float - if (this.m_frequencyHz > 0.0) { - var Cdot2 = wB - wA; // float - var impulse2 = -this.m_mass.ez.z - * (Cdot2 + this.m_bias + this.m_gamma * this.m_impulse.z); // float - this.m_impulse.z += impulse2; - wA -= iA * impulse2; - wB += iB * impulse2; - var Cdot1 = Vec2.zero(); - Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); - Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2 - var impulse1 = Vec2.neg(Mat33.mulVec2(this.m_mass, Cdot1)); // Vec2 - this.m_impulse.x += impulse1.x; - this.m_impulse.y += impulse1.y; - var P = Vec2.clone(impulse1); // Vec2 - vA.subMul(mA, P); - wA -= iA * Vec2.crossVec2Vec2(this.m_rA, P); - vB.addMul(mB, P); - wB += iB * Vec2.crossVec2Vec2(this.m_rB, P); - } - else { - var Cdot1 = Vec2.zero(); - Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); - Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2 - var Cdot2 = wB - wA; // float - var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); // Vec3 - var impulse = Vec3.neg(Mat33.mulVec3(this.m_mass, Cdot)); // Vec3 - this.m_impulse.add(impulse); - var P = Vec2.neo(impulse.x, impulse.y); - vA.subMul(mA, P); - wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z); - vB.addMul(mB, P); - wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z); - } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - WeldJoint.prototype.solvePositionConstraints = function (step) { - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - var positionError; - var angularError; - var K = new Mat33(); - K.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB; - K.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB; - K.ez.x = -rA.y * iA - rB.y * iB; - K.ex.y = K.ey.x; - K.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB; - K.ez.y = rA.x * iA + rB.x * iB; - K.ex.z = K.ez.x; - K.ey.z = K.ez.y; - K.ez.z = iA + iB; - if (this.m_frequencyHz > 0.0) { - var C1 = Vec2.zero(); - C1.addCombine(1, cB, 1, rB); - C1.subCombine(1, cA, 1, rA); // Vec2 - positionError = C1.length(); - angularError = 0.0; - var P = Vec2.neg(K.solve22(C1)); // Vec2 - cA.subMul(mA, P); - aA -= iA * Vec2.crossVec2Vec2(rA, P); - cB.addMul(mB, P); - aB += iB * Vec2.crossVec2Vec2(rB, P); - } - else { - var C1 = Vec2.zero(); - C1.addCombine(1, cB, 1, rB); - C1.subCombine(1, cA, 1, rA); - var C2 = aB - aA - this.m_referenceAngle; // float - positionError = C1.length(); - angularError = math$1.abs(C2); - var C = new Vec3(C1.x, C1.y, C2); - var impulse = new Vec3(); - if (K.ez.z > 0.0) { - impulse = Vec3.neg(K.solve33(C)); - } - else { - var impulse2 = Vec2.neg(K.solve22(C1)); - impulse.set(impulse2.x, impulse2.y, 0.0); - } - var P = Vec2.neo(impulse.x, impulse.y); - cA.subMul(mA, P); - aA -= iA * (Vec2.crossVec2Vec2(rA, P) + impulse.z); - cB.addMul(mB, P); - aB += iB * (Vec2.crossVec2Vec2(rB, P) + impulse.z); - } - this.m_bodyA.c_position.c = cA; - this.m_bodyA.c_position.a = aA; - this.m_bodyB.c_position.c = cB; - this.m_bodyB.c_position.a = aB; - return positionError <= Settings.linearSlop && angularError <= Settings.angularSlop; + _this = _super.call(this) || this; + _this.m_type = PolygonShape.TYPE; + _this.m_radius = Settings.polygonRadius; + _this.m_centroid = Vec2.zero(); + _this.m_vertices = []; + _this.m_normals = []; + _this.m_count = 0; + if (vertices && vertices.length) { + _this._set(vertices); + } + return _this; + } + /** @internal */ + PolygonShape.prototype._serialize = function () { + return { + type: this.m_type, + vertices: this.m_vertices, }; - WeldJoint.TYPE = 'weld-joint'; - return WeldJoint; - }(Joint)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba + }; + /** @internal */ + PolygonShape._deserialize = function (data, fixture, restore) { + var vertices = []; + if (data.vertices) { + for (var i = 0; i < data.vertices.length; i++) { + vertices.push(restore(Vec2, data.vertices[i])); + } + } + var shape = new PolygonShape(vertices); + return shape; + }; + PolygonShape.prototype.getType = function () { + return this.m_type; + }; + PolygonShape.prototype.getRadius = function () { + return this.m_radius; + }; + PolygonShape.prototype.getVertex = function (index) { + return this.m_vertices[index]; + }; + /** + * @internal + * @deprecated Shapes should be treated as immutable. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * clone the concrete shape. + */ + PolygonShape.prototype._clone = function () { + var clone = new PolygonShape(); + clone.m_type = this.m_type; + clone.m_radius = this.m_radius; + clone.m_count = this.m_count; + clone.m_centroid.setVec2(this.m_centroid); + for (var i = 0; i < this.m_count; i++) { + clone.m_vertices.push(this.m_vertices[i].clone()); + } + for (var i = 0; i < this.m_normals.length; i++) { + clone.m_normals.push(this.m_normals[i].clone()); + } + return clone; + }; + /** + * Get the number of child primitives. + */ + PolygonShape.prototype.getChildCount = function () { + return 1; + }; + /** @internal */ + PolygonShape.prototype._reset = function () { + this._set(this.m_vertices); + }; + /** + * @internal * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * Create a convex hull from the given array of local points. The count must be + * in the range [3, Settings.maxPolygonVertices]. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var DEFAULTS = { - enableMotor: false, - maxMotorTorque: 0.0, - motorSpeed: 0.0, - frequencyHz: 2.0, - dampingRatio: 0.7, - }; - /** - * A wheel joint. This joint provides two degrees of freedom: translation along - * an axis fixed in bodyA and rotation in the plane. In other words, it is a - * point to line constraint with a rotational motor and a linear spring/damper. - * This joint is designed for vehicle suspensions. - */ - var WheelJoint = /** @class */ (function (_super) { - __extends(WheelJoint, _super); - // @ts-ignore - function WheelJoint(def, bodyA, bodyB, anchor, axis) { - var _this = this; - // @ts-ignore - if (!(_this instanceof WheelJoint)) { - return new WheelJoint(def, bodyA, bodyB, anchor, axis); - } - def = options(def, DEFAULTS); - _this = _super.call(this, def, bodyA, bodyB) || this; - /** @internal */ _this.m_ax = Vec2.zero(); - /** @internal */ _this.m_ay = Vec2.zero(); - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = WheelJoint.TYPE; - _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); - _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); - // @ts-ignore localAxis - _this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || def.localAxis || Vec2.neo(1.0, 0.0)); - _this.m_localYAxisA = Vec2.crossNumVec2(1.0, _this.m_localXAxisA); - _this.m_mass = 0.0; - _this.m_impulse = 0.0; - _this.m_motorMass = 0.0; - _this.m_motorImpulse = 0.0; - _this.m_springMass = 0.0; - _this.m_springImpulse = 0.0; - _this.m_maxMotorTorque = def.maxMotorTorque; - _this.m_motorSpeed = def.motorSpeed; - _this.m_enableMotor = def.enableMotor; - _this.m_frequencyHz = def.frequencyHz; - _this.m_dampingRatio = def.dampingRatio; - _this.m_bias = 0.0; - _this.m_gamma = 0.0; - return _this; - // Linear constraint (point-to-line) - // d = pB - pA = xB + rB - xA - rA - // C = dot(ay, d) - // Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA, - // rA)) - // = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB, - // ay), vB) - // J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)] - // Spring linear constraint - // C = dot(ax, d) - // Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) + - // dot(cross(rB, ax), vB) - // J = [-ax -cross(d+rA, ax) ax cross(rB, ax)] - // Motor rotational constraint - // Cdot = wB - wA - // J = [0 0 -1 0 0 1] + * Warning: the points may be re-ordered, even if they form a convex polygon + * Warning: collinear points are handled but not removed. Collinear points may + * lead to poor stacking behavior. + */ + PolygonShape.prototype._set = function (vertices) { + if (vertices.length < 3) { + this._setAsBox(1.0, 1.0); + return; } - /** @internal */ - WheelJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - enableMotor: this.m_enableMotor, - maxMotorTorque: this.m_maxMotorTorque, - motorSpeed: this.m_motorSpeed, - frequencyHz: this.m_frequencyHz, - dampingRatio: this.m_dampingRatio, - localAnchorA: this.m_localAnchorA, - localAnchorB: this.m_localAnchorB, - localAxisA: this.m_localXAxisA, - }; - }; - /** @internal */ - WheelJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - var joint = new WheelJoint(data); - return joint; - }; - /** @internal */ - WheelJoint.prototype._setAnchors = function (def) { - if (def.anchorA) { - this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); - } - else if (def.localAnchorA) { - this.m_localAnchorA.setVec2(def.localAnchorA); - } - if (def.anchorB) { - this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + var n = math.min(vertices.length, Settings.maxPolygonVertices); + // Perform welding and copy vertices into local buffer. + var ps = []; // [Settings.maxPolygonVertices]; + for (var i = 0; i < n; ++i) { + var v = vertices[i]; + var unique = true; + for (var j = 0; j < ps.length; ++j) { + if (Vec2.distanceSquared(v, ps[j]) < 0.25 * Settings.linearSlopSquared) { + unique = false; + break; + } } - else if (def.localAnchorB) { - this.m_localAnchorB.setVec2(def.localAnchorB); + if (unique) { + ps.push(Vec2.clone(v)); } - if (def.localAxisA) { - this.m_localXAxisA.setVec2(def.localAxisA); - this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA)); + } + n = ps.length; + if (n < 3) { + this._setAsBox(1.0, 1.0); + return; + } + // Create the convex hull using the Gift wrapping algorithm + // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm + // Find the right most point on the hull (in case of multiple points bottom most is used) + var i0 = 0; + var x0 = ps[0].x; + for (var i = 1; i < n; ++i) { + var x = ps[i].x; + if (x > x0 || (x === x0 && ps[i].y < ps[i0].y)) { + i0 = i; + x0 = x; } - }; - /** - * The local anchor point relative to bodyA's origin. - */ - WheelJoint.prototype.getLocalAnchorA = function () { - return this.m_localAnchorA; - }; - /** - * The local anchor point relative to bodyB's origin. - */ - WheelJoint.prototype.getLocalAnchorB = function () { - return this.m_localAnchorB; - }; - /** - * The local joint axis relative to bodyA. - */ - WheelJoint.prototype.getLocalAxisA = function () { - return this.m_localXAxisA; - }; - /** - * Get the current joint translation, usually in meters. - */ - WheelJoint.prototype.getJointTranslation = function () { - var bA = this.m_bodyA; - var bB = this.m_bodyB; - var pA = bA.getWorldPoint(this.m_localAnchorA); // Vec2 - var pB = bB.getWorldPoint(this.m_localAnchorB); // Vec2 - var d = Vec2.sub(pB, pA); // Vec2 - var axis = bA.getWorldVector(this.m_localXAxisA); // Vec2 - var translation = Vec2.dot(d, axis); // float - return translation; - }; - /** - * Get the current joint translation speed, usually in meters per second. - */ - WheelJoint.prototype.getJointSpeed = function () { - var wA = this.m_bodyA.m_angularVelocity; - var wB = this.m_bodyB.m_angularVelocity; - return wB - wA; - }; - /** - * Is the joint motor enabled? - */ - WheelJoint.prototype.isMotorEnabled = function () { - return this.m_enableMotor; - }; - /** - * Enable/disable the joint motor. - */ - WheelJoint.prototype.enableMotor = function (flag) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_enableMotor = flag; - }; - /** - * Set the motor speed, usually in radians per second. - */ - WheelJoint.prototype.setMotorSpeed = function (speed) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_motorSpeed = speed; - }; - /** - * Get the motor speed, usually in radians per second. - */ - WheelJoint.prototype.getMotorSpeed = function () { - return this.m_motorSpeed; - }; - /** - * Set/Get the maximum motor force, usually in N-m. - */ - WheelJoint.prototype.setMaxMotorTorque = function (torque) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_maxMotorTorque = torque; - }; - WheelJoint.prototype.getMaxMotorTorque = function () { - return this.m_maxMotorTorque; - }; - /** - * Get the current motor torque given the inverse time step, usually in N-m. - */ - WheelJoint.prototype.getMotorTorque = function (inv_dt) { - return inv_dt * this.m_motorImpulse; - }; - /** - * Set/Get the spring frequency in hertz. Setting the frequency to zero disables - * the spring. - */ - WheelJoint.prototype.setSpringFrequencyHz = function (hz) { - this.m_frequencyHz = hz; - }; - WheelJoint.prototype.getSpringFrequencyHz = function () { - return this.m_frequencyHz; - }; - /** - * Set/Get the spring damping ratio - */ - WheelJoint.prototype.setSpringDampingRatio = function (ratio) { - this.m_dampingRatio = ratio; - }; - WheelJoint.prototype.getSpringDampingRatio = function () { - return this.m_dampingRatio; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - WheelJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - WheelJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - WheelJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax).mul(inv_dt); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - WheelJoint.prototype.getReactionTorque = function (inv_dt) { - return inv_dt * this.m_motorImpulse; - }; - WheelJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var mA = this.m_invMassA; - var mB = this.m_invMassB; // float - var iA = this.m_invIA; - var iB = this.m_invIB; // float - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - // Compute the effective masses. - var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - var d = Vec2.zero(); - d.addCombine(1, cB, 1, rB); - d.subCombine(1, cA, 1, rA); // Vec2 - // Point to line constraint - { - this.m_ay = Rot.mulVec2(qA, this.m_localYAxisA); - this.m_sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ay); - this.m_sBy = Vec2.crossVec2Vec2(rB, this.m_ay); - this.m_mass = mA + mB + iA * this.m_sAy * this.m_sAy + iB * this.m_sBy - * this.m_sBy; - if (this.m_mass > 0.0) { - this.m_mass = 1.0 / this.m_mass; + } + var hull = []; // [Settings.maxPolygonVertices]; + var m = 0; + var ih = i0; + while (true) { + hull[m] = ih; + var ie = 0; + for (var j = 1; j < n; ++j) { + if (ie === ih) { + ie = j; + continue; } - } - // Spring constraint - this.m_springMass = 0.0; - this.m_bias = 0.0; - this.m_gamma = 0.0; - if (this.m_frequencyHz > 0.0) { - this.m_ax = Rot.mulVec2(qA, this.m_localXAxisA); - this.m_sAx = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ax); - this.m_sBx = Vec2.crossVec2Vec2(rB, this.m_ax); - var invMass = mA + mB + iA * this.m_sAx * this.m_sAx + iB * this.m_sBx - * this.m_sBx; // float - if (invMass > 0.0) { - this.m_springMass = 1.0 / invMass; - var C = Vec2.dot(d, this.m_ax); // float - // Frequency - var omega = 2.0 * math$1.PI * this.m_frequencyHz; // float - // Damping coefficient - var damp = 2.0 * this.m_springMass * this.m_dampingRatio * omega; // float - // Spring stiffness - var k = this.m_springMass * omega * omega; // float - // magic formulas - var h = step.dt; // float - this.m_gamma = h * (damp + h * k); - if (this.m_gamma > 0.0) { - this.m_gamma = 1.0 / this.m_gamma; - } - this.m_bias = C * h * k * this.m_gamma; - this.m_springMass = invMass + this.m_gamma; - if (this.m_springMass > 0.0) { - this.m_springMass = 1.0 / this.m_springMass; - } + var r = Vec2.sub(ps[ie], ps[hull[m]]); + var v = Vec2.sub(ps[j], ps[hull[m]]); + var c = Vec2.crossVec2Vec2(r, v); + // c < 0 means counter-clockwise wrapping, c > 0 means clockwise wrapping + if (c < 0.0) { + ie = j; } - } - else { - this.m_springImpulse = 0.0; - } - // Rotational motor - if (this.m_enableMotor) { - this.m_motorMass = iA + iB; - if (this.m_motorMass > 0.0) { - this.m_motorMass = 1.0 / this.m_motorMass; + // Collinearity check + if (c === 0.0 && v.lengthSquared() > r.lengthSquared()) { + ie = j; } } - else { - this.m_motorMass = 0.0; - this.m_motorImpulse = 0.0; - } - if (step.warmStarting) { - // Account for variable time step. - this.m_impulse *= step.dtRatio; - this.m_springImpulse *= step.dtRatio; - this.m_motorImpulse *= step.dtRatio; - var P = Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax); - var LA = this.m_impulse * this.m_sAy + this.m_springImpulse * this.m_sAx + this.m_motorImpulse; - var LB = this.m_impulse * this.m_sBy + this.m_springImpulse * this.m_sBx + this.m_motorImpulse; - vA.subMul(this.m_invMassA, P); - wA -= this.m_invIA * LA; - vB.addMul(this.m_invMassB, P); - wB += this.m_invIB * LB; - } - else { - this.m_impulse = 0.0; - this.m_springImpulse = 0.0; - this.m_motorImpulse = 0.0; - } - this.m_bodyA.c_velocity.v.setVec2(vA); - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v.setVec2(vB); - this.m_bodyB.c_velocity.w = wB; - }; - WheelJoint.prototype.solveVelocityConstraints = function (step) { - var mA = this.m_invMassA; - var mB = this.m_invMassB; // float - var iA = this.m_invIA; - var iB = this.m_invIB; // float - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - // Solve spring constraint - { - var Cdot = Vec2.dot(this.m_ax, vB) - Vec2.dot(this.m_ax, vA) + this.m_sBx - * wB - this.m_sAx * wA; // float - var impulse = -this.m_springMass - * (Cdot + this.m_bias + this.m_gamma * this.m_springImpulse); // float - this.m_springImpulse += impulse; - var P = Vec2.mulNumVec2(impulse, this.m_ax); // Vec2 - var LA = impulse * this.m_sAx; // float - var LB = impulse * this.m_sBx; // float - vA.subMul(mA, P); - wA -= iA * LA; - vB.addMul(mB, P); - wB += iB * LB; - } - // Solve rotational motor constraint - { - var Cdot = wB - wA - this.m_motorSpeed; // float - var impulse = -this.m_motorMass * Cdot; // float - var oldImpulse = this.m_motorImpulse; // float - var maxImpulse = step.dt * this.m_maxMotorTorque; // float - this.m_motorImpulse = math$1.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); - impulse = this.m_motorImpulse - oldImpulse; - wA -= iA * impulse; - wB += iB * impulse; - } - // Solve point to line constraint - { - var Cdot = Vec2.dot(this.m_ay, vB) - Vec2.dot(this.m_ay, vA) + this.m_sBy - * wB - this.m_sAy * wA; // float - var impulse = -this.m_mass * Cdot; // float - this.m_impulse += impulse; - var P = Vec2.mulNumVec2(impulse, this.m_ay); // Vec2 - var LA = impulse * this.m_sAy; // float - var LB = impulse * this.m_sBy; // float - vA.subMul(mA, P); - wA -= iA * LA; - vB.addMul(mB, P); - wB += iB * LB; + ++m; + ih = ie; + if (ie === i0) { + break; } - this.m_bodyA.c_velocity.v.setVec2(vA); - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v.setVec2(vB); - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - WheelJoint.prototype.solvePositionConstraints = function (step) { - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - var d = Vec2.zero(); - d.addCombine(1, cB, 1, rB); - d.subCombine(1, cA, 1, rA); - var ay = Rot.mulVec2(qA, this.m_localYAxisA); - var sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), ay); // float - var sBy = Vec2.crossVec2Vec2(rB, ay); // float - var C = Vec2.dot(d, ay); // float - var k = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_sAy - * this.m_sAy + this.m_invIB * this.m_sBy * this.m_sBy; // float - var impulse; // float - if (k != 0.0) { - impulse = -C / k; + } + if (m < 3) { + this._setAsBox(1.0, 1.0); + return; + } + this.m_count = m; + // Copy vertices. + this.m_vertices = []; + for (var i = 0; i < m; ++i) { + this.m_vertices[i] = ps[hull[i]]; + } + // Compute normals. Ensure the edges have non-zero length. + for (var i = 0; i < m; ++i) { + var i1 = i; + var i2 = i + 1 < m ? i + 1 : 0; + var edge = Vec2.sub(this.m_vertices[i2], this.m_vertices[i1]); + this.m_normals[i] = Vec2.crossVec2Num(edge, 1.0); + this.m_normals[i].normalize(); + } + // Compute the polygon centroid. + this.m_centroid = ComputeCentroid(this.m_vertices, m); + }; + /** @internal */ + PolygonShape.prototype._setAsBox = function (hx, hy, center, angle) { + // start with right-bottom, counter-clockwise, as in Gift wrapping algorithm in PolygonShape._set() + this.m_vertices[0] = Vec2.neo(hx, -hy); + this.m_vertices[1] = Vec2.neo(hx, hy); + this.m_vertices[2] = Vec2.neo(-hx, hy); + this.m_vertices[3] = Vec2.neo(-hx, -hy); + this.m_normals[0] = Vec2.neo(1.0, 0.0); + this.m_normals[1] = Vec2.neo(0.0, 1.0); + this.m_normals[2] = Vec2.neo(-1.0, 0.0); + this.m_normals[3] = Vec2.neo(0.0, -1.0); + this.m_count = 4; + if (Vec2.isValid(center)) { + angle = angle || 0; + this.m_centroid.setVec2(center); + var xf = Transform.identity(); + xf.p.setVec2(center); + xf.q.setAngle(angle); + // Transform vertices and normals. + for (var i = 0; i < this.m_count; ++i) { + this.m_vertices[i] = Transform.mulVec2(xf, this.m_vertices[i]); + this.m_normals[i] = Rot.mulVec2(xf.q, this.m_normals[i]); } - else { - impulse = 0.0; + } + }; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + PolygonShape.prototype.testPoint = function (xf, p) { + var pLocal = Rot.mulTVec2(xf.q, Vec2.sub(p, xf.p)); + for (var i = 0; i < this.m_count; ++i) { + var dot = Vec2.dot(this.m_normals[i], Vec2.sub(pLocal, this.m_vertices[i])); + if (dot > 0.0) { + return false; } - var P = Vec2.mulNumVec2(impulse, ay); // Vec2 - var LA = impulse * sAy; // float - var LB = impulse * sBy; // float - cA.subMul(this.m_invMassA, P); - aA -= this.m_invIA * LA; - cB.addMul(this.m_invMassB, P); - aB += this.m_invIB * LB; - this.m_bodyA.c_position.c.setVec2(cA); - this.m_bodyA.c_position.a = aA; - this.m_bodyB.c_position.c.setVec2(cB); - this.m_bodyB.c_position.a = aB; - return math$1.abs(C) <= Settings.linearSlop; - }; - WheelJoint.TYPE = 'wheel-joint'; - return WheelJoint; - }(Joint)); - - var SID = 0; - function Serializer(opts) { - var _a; - opts = opts || {}; - var rootClass = opts.rootClass || World; - var preSerialize = opts.preSerialize || function (obj) { return obj; }; - var postSerialize = opts.postSerialize || function (data, obj) { return data; }; - var preDeserialize = opts.preDeserialize || function (data) { return data; }; - var postDeserialize = opts.postDeserialize || function (obj, data) { return obj; }; - // This is used to create ref objects during serialize - var refTypes = { - World: World, - Body: Body, - Joint: Joint, - Fixture: Fixture, - Shape: Shape, - }; - // This is used by restore to deserialize objects and refs - var restoreTypes = __assign({ Vec2: Vec2, - Vec3: Vec3 }, refTypes); - var CLASS_BY_TYPE_PROP = (_a = {}, - _a[Body.STATIC] = Body, - _a[Body.DYNAMIC] = Body, - _a[Body.KINEMATIC] = Body, - _a[ChainShape.TYPE] = ChainShape, - _a[BoxShape.TYPE] = BoxShape, - _a[EdgeShape.TYPE] = EdgeShape, - _a[PolygonShape.TYPE] = PolygonShape, - _a[CircleShape.TYPE] = CircleShape, - _a[DistanceJoint.TYPE] = DistanceJoint, - _a[FrictionJoint.TYPE] = FrictionJoint, - _a[GearJoint.TYPE] = GearJoint, - _a[MotorJoint.TYPE] = MotorJoint, - _a[MouseJoint.TYPE] = MouseJoint, - _a[PrismaticJoint.TYPE] = PrismaticJoint, - _a[PulleyJoint.TYPE] = PulleyJoint, - _a[RevoluteJoint.TYPE] = RevoluteJoint, - _a[RopeJoint.TYPE] = RopeJoint, - _a[WeldJoint.TYPE] = WeldJoint, - _a[WheelJoint.TYPE] = WheelJoint, - _a); - this.toJson = function (root) { - var json = []; - var queue = [root]; - var refMap = {}; - function storeRef(value, typeName) { - value.__sid = value.__sid || ++SID; - if (!refMap[value.__sid]) { - queue.push(value); - var index = json.length + queue.length; - var ref = { - refIndex: index, - refType: typeName - }; - refMap[value.__sid] = ref; + } + return true; + }; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + PolygonShape.prototype.rayCast = function (output, input, xf, childIndex) { + // Put the ray into the polygon's frame of reference. + var p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p)); + var p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p)); + var d = Vec2.sub(p2, p1); + var lower = 0.0; + var upper = input.maxFraction; + var index = -1; + for (var i = 0; i < this.m_count; ++i) { + // p = p1 + a * d + // dot(normal, p - v) = 0 + // dot(normal, p1 - v) + a * dot(normal, d) = 0 + var numerator = Vec2.dot(this.m_normals[i], Vec2.sub(this.m_vertices[i], p1)); + var denominator = Vec2.dot(this.m_normals[i], d); + if (denominator == 0.0) { + if (numerator < 0.0) { + return false; } - return refMap[value.__sid]; } - function serialize(obj) { - obj = preSerialize(obj); - var data = obj._serialize(); - data = postSerialize(data, obj); - return data; - } - function toJson(value, top) { - if (typeof value !== 'object' || value === null) { - return value; - } - if (typeof value._serialize === 'function') { - if (value !== top) { - // tslint:disable-next-line:no-for-in - for (var typeName in refTypes) { - if (value instanceof refTypes[typeName]) { - return storeRef(value, typeName); - } - } - } - value = serialize(value); - } - if (Array.isArray(value)) { - var newValue = []; - for (var key = 0; key < value.length; key++) { - newValue[key] = toJson(value[key]); - } - value = newValue; - } - else { - var newValue = {}; - // tslint:disable-next-line:no-for-in - for (var key in value) { - if (value.hasOwnProperty(key)) { - newValue[key] = toJson(value[key]); - } - } - value = newValue; + else { + // Note: we want this predicate without division: + // lower < numerator / denominator, where denominator < 0 + // Since denominator < 0, we have to flip the inequality: + // lower < numerator / denominator <==> denominator * lower > numerator. + if (denominator < 0.0 && numerator < lower * denominator) { + // Increase lower. + // The segment enters this half-space. + lower = numerator / denominator; + index = i; } - return value; - } - while (queue.length) { - var obj = queue.shift(); - var str = toJson(obj, obj); - json.push(str); - } - return json; - }; - this.fromJson = function (json) { - var refMap = {}; - function findDeserilizer(data, cls) { - if (!cls || !cls._deserialize) { - cls = CLASS_BY_TYPE_PROP[data.type]; + else if (denominator > 0.0 && numerator < upper * denominator) { + // Decrease upper. + // The segment exits this half-space. + upper = numerator / denominator; } - return cls && cls._deserialize; } - /** - * Deserialize a data object. - */ - function deserialize(cls, data, ctx) { - var deserializer = findDeserilizer(data, cls); - if (!deserializer) { - return; - } - data = preDeserialize(data); - var obj = deserializer(data, ctx, restoreRef); - obj = postDeserialize(obj, data); - return obj; + // The use of epsilon here causes the assert on lower to trip + // in some cases. Apparently the use of epsilon was to make edge + // shapes work, but now those are handled separately. + // if (upper < lower - Math.EPSILON) + if (upper < lower) { + return false; } - /** - * Restore a ref object or deserialize a data object. - * - * This is passed as callback to class deserializers. - */ - function restoreRef(cls, ref, ctx) { - if (!ref.refIndex) { - return cls && cls._deserialize && deserialize(cls, ref, ctx); + } + if (index >= 0) { + output.fraction = lower; + output.normal = Rot.mulVec2(xf.q, this.m_normals[index]); + return true; + } + return false; + }; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + PolygonShape.prototype.computeAABB = function (aabb, xf, childIndex) { + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + for (var i = 0; i < this.m_count; ++i) { + var v = Transform.mulVec2(xf, this.m_vertices[i]); + minX = math.min(minX, v.x); + maxX = math.max(maxX, v.x); + minY = math.min(minY, v.y); + maxY = math.max(maxY, v.y); + } + aabb.lowerBound.setNum(minX, minY); + aabb.upperBound.setNum(maxX, maxY); + aabb.extend(this.m_radius); + }; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + PolygonShape.prototype.computeMass = function (massData, density) { + var center = Vec2.zero(); + var area = 0.0; + var I = 0.0; + // s is the reference point for forming triangles. + // It's location doesn't change the result (except for rounding error). + var s = Vec2.zero(); + // This code would put the reference point inside the polygon. + for (var i = 0; i < this.m_count; ++i) { + s.add(this.m_vertices[i]); + } + s.mul(1.0 / this.m_count); + var k_inv3 = 1.0 / 3.0; + for (var i = 0; i < this.m_count; ++i) { + // Triangle vertices. + var e1 = Vec2.sub(this.m_vertices[i], s); + var e2 = i + 1 < this.m_count ? Vec2.sub(this.m_vertices[i + 1], s) : Vec2.sub(this.m_vertices[0], s); + var D = Vec2.crossVec2Vec2(e1, e2); + var triangleArea = 0.5 * D; + area += triangleArea; + // Area weighted centroid + center.addCombine(triangleArea * k_inv3, e1, triangleArea * k_inv3, e2); + var ex1 = e1.x; + var ey1 = e1.y; + var ex2 = e2.x; + var ey2 = e2.y; + var intx2 = ex1 * ex1 + ex2 * ex1 + ex2 * ex2; + var inty2 = ey1 * ey1 + ey2 * ey1 + ey2 * ey2; + I += (0.25 * k_inv3 * D) * (intx2 + inty2); + } + // Total mass + massData.mass = density * area; + center.mul(1.0 / area); + massData.center.setCombine(1, center, 1, s); + // Inertia tensor relative to the local origin (point s). + massData.I = density * I; + // Shift to center of mass then to original body origin. + massData.I += massData.mass * (Vec2.dot(massData.center, massData.center) - Vec2.dot(center, center)); + }; + /** + * Validate convexity. This is a very time consuming operation. + * @returns true if valid + */ + PolygonShape.prototype.validate = function () { + for (var i = 0; i < this.m_count; ++i) { + var i1 = i; + var i2 = i < this.m_count - 1 ? i1 + 1 : 0; + var p = this.m_vertices[i1]; + var e = Vec2.sub(this.m_vertices[i2], p); + for (var j = 0; j < this.m_count; ++j) { + if (j == i1 || j == i2) { + continue; } - cls = restoreTypes[ref.refType] || cls; - var index = ref.refIndex; - if (!refMap[index]) { - var data = json[index]; - var obj = deserialize(cls, data, ctx); - refMap[index] = obj; + var v = Vec2.sub(this.m_vertices[j], p); + var c = Vec2.crossVec2Vec2(e, v); + if (c < 0.0) { + return false; } - return refMap[index]; } - var root = rootClass._deserialize(json[0], null, restoreRef); - return root; - }; - } - var serializer = new Serializer(); - Serializer.toJson = serializer.toJson; - Serializer.fromJson = serializer.fromJson; - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - Contact.addType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact); - function CircleCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { - CollideCircles(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); - } - function CollideCircles(manifold, circleA, xfA, circleB, xfB) { - manifold.pointCount = 0; - var pA = Transform.mulVec2(xfA, circleA.m_p); - var pB = Transform.mulVec2(xfB, circleB.m_p); - var distSqr = Vec2.distanceSquared(pB, pA); - var rA = circleA.m_radius; - var rB = circleB.m_radius; - var radius = rA + rB; - if (distSqr > radius * radius) { - return; } - manifold.type = ManifoldType.e_circles; - manifold.localPoint.setVec2(circleA.m_p); - manifold.localNormal.setZero(); - manifold.pointCount = 1; - manifold.points[0].localPoint.setVec2(circleB.m_p); - // manifold.points[0].id.key = 0; - manifold.points[0].id.cf.indexA = 0; - manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; - manifold.points[0].id.cf.indexB = 0; - manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; - } - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - Contact.addType(EdgeShape.TYPE, CircleShape.TYPE, EdgeCircleContact); - Contact.addType(ChainShape.TYPE, CircleShape.TYPE, ChainCircleContact); - function EdgeCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { - var shapeA = fixtureA.getShape(); - var shapeB = fixtureB.getShape(); - CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB); + return true; + }; + PolygonShape.prototype.computeDistanceProxy = function (proxy) { + proxy.m_vertices = this.m_vertices; + proxy.m_count = this.m_count; + proxy.m_radius = this.m_radius; + }; + PolygonShape.TYPE = 'polygon'; + return PolygonShape; +}(Shape)); +function ComputeCentroid(vs, count) { + var c = Vec2.zero(); + var area = 0.0; + // pRef is the reference point for forming triangles. + // It's location doesn't change the result (except for rounding error). + var pRef = Vec2.zero(); + var i; + var inv3 = 1.0 / 3.0; + for (var i = 0; i < count; ++i) { + // Triangle vertices. + var p1 = pRef; + var p2 = vs[i]; + var p3 = i + 1 < count ? vs[i + 1] : vs[0]; + var e1 = Vec2.sub(p2, p1); + var e2 = Vec2.sub(p3, p1); + var D = Vec2.crossVec2Vec2(e1, e2); + var triangleArea = 0.5 * D; + area += triangleArea; + // Area weighted centroid + c.addMul(triangleArea * inv3, p1); + c.addMul(triangleArea * inv3, p2); + c.addMul(triangleArea * inv3, p3); } - function ChainCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { - var chain = fixtureA.getShape(); - var edge = new EdgeShape(); - chain.getChildEdge(edge, indexA); - var shapeA = edge; - var shapeB = fixtureB.getShape(); - CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB); + c.mul(1.0 / area); + return c; +} +var Polygon = PolygonShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A rectangle polygon which extend PolygonShape. + */ +var BoxShape = /** @class */ (function (_super) { + __extends(BoxShape, _super); + function BoxShape(hx, hy, center, angle) { + var _this = this; + // @ts-ignore + if (!(_this instanceof BoxShape)) { + return new BoxShape(hx, hy, center, angle); + } + _this = _super.call(this) || this; + _this._setAsBox(hx, hy, center, angle); + return _this; } - // Compute contact points for edge versus circle. - // This accounts for edge connectivity. - function CollideEdgeCircle(manifold, edgeA, xfA, circleB, xfB) { - manifold.pointCount = 0; - // Compute circle in frame of edge - var Q = Transform.mulTVec2(xfA, Transform.mulVec2(xfB, circleB.m_p)); - var A = edgeA.m_vertex1; - var B = edgeA.m_vertex2; - var e = Vec2.sub(B, A); - // Barycentric coordinates - var u = Vec2.dot(e, Vec2.sub(B, Q)); - var v = Vec2.dot(e, Vec2.sub(Q, A)); - var radius = edgeA.m_radius + circleB.m_radius; - // Region A - if (v <= 0.0) { - var P_1 = Vec2.clone(A); - var d_1 = Vec2.sub(Q, P_1); - var dd_1 = Vec2.dot(d_1, d_1); - if (dd_1 > radius * radius) { - return; - } - // Is there an edge connected to A? - if (edgeA.m_hasVertex0) { - var A1 = edgeA.m_vertex0; - var B1 = A; - var e1 = Vec2.sub(B1, A1); - var u1 = Vec2.dot(e1, Vec2.sub(B1, Q)); - // Is the circle in Region AB of the previous edge? - if (u1 > 0.0) { - return; - } - } - manifold.type = ManifoldType.e_circles; - manifold.localNormal.setZero(); - manifold.localPoint.setVec2(P_1); - manifold.pointCount = 1; - manifold.points[0].localPoint.setVec2(circleB.m_p); - // manifold.points[0].id.key = 0; - manifold.points[0].id.cf.indexA = 0; - manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; - manifold.points[0].id.cf.indexB = 0; - manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; - return; + BoxShape.TYPE = 'polygon'; + return BoxShape; +}(PolygonShape)); +var Box = BoxShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var CircleShape = /** @class */ (function (_super) { + __extends(CircleShape, _super); + // tslint:disable-next-line:typedef + function CircleShape(a, b) { + var _this = this; + // @ts-ignore + if (!(_this instanceof CircleShape)) { + return new CircleShape(a, b); } - // Region B - if (u <= 0.0) { - var P_2 = Vec2.clone(B); - var d_2 = Vec2.sub(Q, P_2); - var dd_2 = Vec2.dot(d_2, d_2); - if (dd_2 > radius * radius) { - return; - } - // Is there an edge connected to B? - if (edgeA.m_hasVertex3) { - var B2 = edgeA.m_vertex3; - var A2 = B; - var e2 = Vec2.sub(B2, A2); - var v2 = Vec2.dot(e2, Vec2.sub(Q, A2)); - // Is the circle in Region AB of the next edge? - if (v2 > 0.0) { - return; - } + _this = _super.call(this) || this; + _this.m_type = CircleShape.TYPE; + _this.m_p = Vec2.zero(); + _this.m_radius = 1; + if (typeof a === 'object' && Vec2.isValid(a)) { + _this.m_p.setVec2(a); + if (typeof b === 'number') { + _this.m_radius = b; } - manifold.type = ManifoldType.e_circles; - manifold.localNormal.setZero(); - manifold.localPoint.setVec2(P_2); - manifold.pointCount = 1; - manifold.points[0].localPoint.setVec2(circleB.m_p); - // manifold.points[0].id.key = 0; - manifold.points[0].id.cf.indexA = 1; - manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; - manifold.points[0].id.cf.indexB = 0; - manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; - return; - } - // Region AB - var den = Vec2.dot(e, e); - var P = Vec2.combine(u / den, A, v / den, B); - var d = Vec2.sub(Q, P); - var dd = Vec2.dot(d, d); - if (dd > radius * radius) { - return; } - var n = Vec2.neo(-e.y, e.x); - if (Vec2.dot(n, Vec2.sub(Q, A)) < 0.0) { - n.setNum(-n.x, -n.y); + else if (typeof a === 'number') { + _this.m_radius = a; } - n.normalize(); - manifold.type = ManifoldType.e_faceA; - manifold.localNormal = n; - manifold.localPoint.setVec2(A); - manifold.pointCount = 1; - manifold.points[0].localPoint.setVec2(circleB.m_p); - // manifold.points[0].id.key = 0; - manifold.points[0].id.cf.indexA = 0; - manifold.points[0].id.cf.typeA = ContactFeatureType.e_face; - manifold.points[0].id.cf.indexB = 0; - manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; + return _this; } - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + /** @internal */ + CircleShape.prototype._serialize = function () { + return { + type: this.m_type, + p: this.m_p, + radius: this.m_radius, + }; + }; + /** @internal */ + CircleShape._deserialize = function (data) { + return new CircleShape(data.p, data.radius); + }; + /** @internal */ + CircleShape.prototype._reset = function () { + // noop + }; + CircleShape.prototype.getType = function () { + return this.m_type; + }; + CircleShape.prototype.getRadius = function () { + return this.m_radius; + }; + CircleShape.prototype.getCenter = function () { + return this.m_p; + }; + CircleShape.prototype.getVertex = function (index) { + return this.m_p; + }; + /** + * @internal + * @deprecated Shapes should be treated as immutable. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * clone the concrete shape. + */ + CircleShape.prototype._clone = function () { + var clone = new CircleShape(); + clone.m_type = this.m_type; + clone.m_radius = this.m_radius; + clone.m_p = this.m_p.clone(); + return clone; + }; + /** + * Get the number of child primitives. + */ + CircleShape.prototype.getChildCount = function () { + return 1; + }; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - Contact.addType(PolygonShape.TYPE, PolygonShape.TYPE, PolygonContact); - function PolygonContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { - CollidePolygons(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); - } + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + CircleShape.prototype.testPoint = function (xf, p) { + var center = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); + var d = Vec2.sub(p, center); + return Vec2.dot(d, d) <= this.m_radius * this.m_radius; + }; /** - * Find the max separation between poly1 and poly2 using edge normals from - * poly1. + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index */ - function findMaxSeparation(poly1, xf1, poly2, xf2, output) { - var count1 = poly1.m_count; - var count2 = poly2.m_count; - var n1s = poly1.m_normals; - var v1s = poly1.m_vertices; - var v2s = poly2.m_vertices; - var xf = Transform.mulTXf(xf2, xf1); - var bestIndex = 0; - var maxSeparation = -Infinity; - for (var i = 0; i < count1; ++i) { - // Get poly1 normal in frame2. - var n = Rot.mulVec2(xf.q, n1s[i]); - var v1 = Transform.mulVec2(xf, v1s[i]); - // Find deepest point for normal i. - var si = Infinity; - for (var j = 0; j < count2; ++j) { - var sij = Vec2.dot(n, v2s[j]) - Vec2.dot(n, v1); - if (sij < si) { - si = sij; - } - } - if (si > maxSeparation) { - maxSeparation = si; - bestIndex = i; - } + CircleShape.prototype.rayCast = function (output, input, xf, childIndex) { + // Collision Detection in Interactive 3D Environments by Gino van den Bergen + // From Section 3.1.2 + // x = s + a * r + // norm(x) = radius + var position = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); + var s = Vec2.sub(input.p1, position); + var b = Vec2.dot(s, s) - this.m_radius * this.m_radius; + // Solve quadratic equation. + var r = Vec2.sub(input.p2, input.p1); + var c = Vec2.dot(s, r); + var rr = Vec2.dot(r, r); + var sigma = c * c - rr * b; + // Check for negative discriminant and short segment. + if (sigma < 0.0 || rr < math.EPSILON) { + return false; } - // used to keep last FindMaxSeparation call values - output.maxSeparation = maxSeparation; - output.bestIndex = bestIndex; - } - function findIncidentEdge(c, poly1, xf1, edge1, poly2, xf2) { - var normals1 = poly1.m_normals; - var count2 = poly2.m_count; - var vertices2 = poly2.m_vertices; - var normals2 = poly2.m_normals; - // Get the normal of the reference edge in poly2's frame. - var normal1 = Rot.mulTVec2(xf2.q, Rot.mulVec2(xf1.q, normals1[edge1])); - // Find the incident edge on poly2. - var index = 0; - var minDot = Infinity; - for (var i = 0; i < count2; ++i) { - var dot = Vec2.dot(normal1, normals2[i]); - if (dot < minDot) { - minDot = dot; - index = i; - } + // Find the point of intersection of the line with the circle. + var a = -(c + math.sqrt(sigma)); + // Is the intersection point on the segment? + if (0.0 <= a && a <= input.maxFraction * rr) { + a /= rr; + output.fraction = a; + output.normal = Vec2.add(s, Vec2.mulNumVec2(a, r)); + output.normal.normalize(); + return true; } - // Build the clip vertices for the incident edge. - var i1 = index; - var i2 = i1 + 1 < count2 ? i1 + 1 : 0; - c[0].v = Transform.mulVec2(xf2, vertices2[i1]); - c[0].id.cf.indexA = edge1; - c[0].id.cf.indexB = i1; - c[0].id.cf.typeA = ContactFeatureType.e_face; - c[0].id.cf.typeB = ContactFeatureType.e_vertex; - c[1].v = Transform.mulVec2(xf2, vertices2[i2]); - c[1].id.cf.indexA = edge1; - c[1].id.cf.indexB = i2; - c[1].id.cf.typeA = ContactFeatureType.e_face; - c[1].id.cf.typeB = ContactFeatureType.e_vertex; - } - var maxSeparation = { - maxSeparation: 0, - bestIndex: 0, + return false; }; /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. * - * Find edge normal of max separation on A - return if separating axis is found
- * Find edge normal of max separation on B - return if separation axis is found
- * Choose reference edge as min(minA, minB)
- * Find incident edge
- * Clip + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + CircleShape.prototype.computeAABB = function (aabb, xf, childIndex) { + var p = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); + aabb.lowerBound.setNum(p.x - this.m_radius, p.y - this.m_radius); + aabb.upperBound.setNum(p.x + this.m_radius, p.y + this.m_radius); + }; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. * - * The normal points from 1 to 2 - */ - function CollidePolygons(manifold, polyA, xfA, polyB, xfB) { - manifold.pointCount = 0; - var totalRadius = polyA.m_radius + polyB.m_radius; - findMaxSeparation(polyA, xfA, polyB, xfB, maxSeparation); - var edgeA = maxSeparation.bestIndex; - var separationA = maxSeparation.maxSeparation; - if (separationA > totalRadius) - return; - findMaxSeparation(polyB, xfB, polyA, xfA, maxSeparation); - var edgeB = maxSeparation.bestIndex; - var separationB = maxSeparation.maxSeparation; - if (separationB > totalRadius) - return; - var poly1; // reference polygon - var poly2; // incident polygon - var xf1; - var xf2; - var edge1; // reference edge - var flip; - var k_tol = 0.1 * Settings.linearSlop; - if (separationB > separationA + k_tol) { - poly1 = polyB; - poly2 = polyA; - xf1 = xfB; - xf2 = xfA; - edge1 = edgeB; - manifold.type = ManifoldType.e_faceB; - flip = 1; + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + CircleShape.prototype.computeMass = function (massData, density) { + massData.mass = density * math.PI * this.m_radius * this.m_radius; + massData.center = this.m_p; + // inertia about the local origin + massData.I = massData.mass + * (0.5 * this.m_radius * this.m_radius + Vec2.dot(this.m_p, this.m_p)); + }; + CircleShape.prototype.computeDistanceProxy = function (proxy) { + proxy.m_vertices.push(this.m_p); + proxy.m_count = 1; + proxy.m_radius = this.m_radius; + }; + CircleShape.TYPE = 'circle'; + return CircleShape; +}(Shape)); +var Circle = CircleShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$a = { + frequencyHz: 0.0, + dampingRatio: 0.0 +}; +/** + * A distance joint constrains two points on two bodies to remain at a fixed + * distance from each other. You can view this as a massless, rigid rod. + * + * @param anchorA Anchor A in global coordination. + * @param anchorB Anchor B in global coordination. + */ +var DistanceJoint = /** @class */ (function (_super) { + __extends(DistanceJoint, _super); + function DistanceJoint(def, bodyA, bodyB, anchorA, anchorB) { + var _this = this; + // @ts-ignore + if (!(_this instanceof DistanceJoint)) { + return new DistanceJoint(def, bodyA, bodyB, anchorA, anchorB); } - else { - poly1 = polyA; - poly2 = polyB; - xf1 = xfA; - xf2 = xfB; - edge1 = edgeA; - manifold.type = ManifoldType.e_faceA; - flip = 0; - } - var incidentEdge = [new ClipVertex(), new ClipVertex()]; - findIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2); - var count1 = poly1.m_count; - var vertices1 = poly1.m_vertices; - var iv1 = edge1; - var iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0; - var v11 = vertices1[iv1]; - var v12 = vertices1[iv2]; - var localTangent = Vec2.sub(v12, v11); - localTangent.normalize(); - var localNormal = Vec2.crossVec2Num(localTangent, 1.0); - var planePoint = Vec2.combine(0.5, v11, 0.5, v12); - var tangent = Rot.mulVec2(xf1.q, localTangent); - var normal = Vec2.crossVec2Num(tangent, 1.0); - v11 = Transform.mulVec2(xf1, v11); - v12 = Transform.mulVec2(xf1, v12); - // Face offset. - var frontOffset = Vec2.dot(normal, v11); - // Side offsets, extended by polytope skin thickness. - var sideOffset1 = -Vec2.dot(tangent, v11) + totalRadius; - var sideOffset2 = Vec2.dot(tangent, v12) + totalRadius; - // Clip incident edge against extruded edge1 side edges. - var clipPoints1 = [new ClipVertex(), new ClipVertex()]; - var clipPoints2 = [new ClipVertex(), new ClipVertex()]; - var np; - // Clip to box side 1 - np = clipSegmentToLine(clipPoints1, incidentEdge, Vec2.neg(tangent), sideOffset1, iv1); - if (np < 2) { - return; + // order of constructor arguments is changed in v0.2 + if (bodyB && anchorA && ('m_type' in anchorA) && ('x' in bodyB) && ('y' in bodyB)) { + var temp = bodyB; + bodyB = anchorA; + anchorA = temp; } - // Clip to negative box side 1 - np = clipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2); - if (np < 2) { - return; + def = options(def, DEFAULTS$a); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = DistanceJoint.TYPE; + // Solver shared + _this.m_localAnchorA = Vec2.clone(anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.zero()); + _this.m_length = math.isFinite(def.length) ? def.length : + Vec2.distance(bodyA.getWorldPoint(_this.m_localAnchorA), bodyB.getWorldPoint(_this.m_localAnchorB)); + _this.m_frequencyHz = def.frequencyHz; + _this.m_dampingRatio = def.dampingRatio; + _this.m_impulse = 0.0; + _this.m_gamma = 0.0; + _this.m_bias = 0.0; + return _this; + // 1-D constrained system + // m (v2 - v1) = lambda + // v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass. + // x2 = x1 + h * v2 + // 1-D mass-damper-spring system + // m (v2 - v1) + h * d * v2 + h * k * + // C = norm(p2 - p1) - L + // u = (p2 - p1) / norm(p2 - p1) + // Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1)) + // J = [-u -cross(r1, u) u cross(r2, u)] + // K = J * invM * JT + // = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2 + } + /** @internal */ + DistanceJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + frequencyHz: this.m_frequencyHz, + dampingRatio: this.m_dampingRatio, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + length: this.m_length, + impulse: this.m_impulse, + gamma: this.m_gamma, + bias: this.m_bias, + }; + }; + /** @internal */ + DistanceJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new DistanceJoint(data); + return joint; + }; + /** @internal */ + DistanceJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); } - // Now clipPoints2 contains the clipped points. - manifold.localNormal = localNormal; - manifold.localPoint = planePoint; - var pointCount = 0; - for (var i = 0; i < clipPoints2.length /* maxManifoldPoints */; ++i) { - var separation = Vec2.dot(normal, clipPoints2[i].v) - frontOffset; - if (separation <= totalRadius) { - var cp = manifold.points[pointCount]; - cp.localPoint.setVec2(Transform.mulTVec2(xf2, clipPoints2[i].v)); - cp.id = clipPoints2[i].id; - if (flip) { - // Swap features - var cf = cp.id.cf; - var indexA = cf.indexA; - var indexB = cf.indexB; - var typeA = cf.typeA; - var typeB = cf.typeB; - cf.indexA = indexB; - cf.indexB = indexA; - cf.typeA = typeB; - cf.typeB = typeA; - } - ++pointCount; - } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); } - manifold.pointCount = pointCount; - } - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - Contact.addType(PolygonShape.TYPE, CircleShape.TYPE, PolygonCircleContact); - function PolygonCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { - CollidePolygonCircle(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); - } - function CollidePolygonCircle(manifold, polygonA, xfA, circleB, xfB) { - manifold.pointCount = 0; - // Compute circle position in the frame of the polygon. - var c = Transform.mulVec2(xfB, circleB.m_p); - var cLocal = Transform.mulTVec2(xfA, c); - // Find the min separating edge. - var normalIndex = 0; - var separation = -Infinity; - var radius = polygonA.m_radius + circleB.m_radius; - var vertexCount = polygonA.m_count; - var vertices = polygonA.m_vertices; - var normals = polygonA.m_normals; - for (var i = 0; i < vertexCount; ++i) { - var s = Vec2.dot(normals[i], Vec2.sub(cLocal, vertices[i])); - if (s > radius) { - // Early out. - return; - } - if (s > separation) { - separation = s; - normalIndex = i; - } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); } - // Vertices that subtend the incident face. - var vertIndex1 = normalIndex; - var vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0; - var v1 = vertices[vertIndex1]; - var v2 = vertices[vertIndex2]; - // If the center is inside the polygon ... - if (separation < math$1.EPSILON) { - manifold.pointCount = 1; - manifold.type = ManifoldType.e_faceA; - manifold.localNormal.setVec2(normals[normalIndex]); - manifold.localPoint.setCombine(0.5, v1, 0.5, v2); - manifold.points[0].localPoint = circleB.m_p; - // manifold.points[0].id.key = 0; - manifold.points[0].id.cf.indexA = 0; - manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; - manifold.points[0].id.cf.indexB = 0; - manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; - return; + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); } - // Compute barycentric coordinates - var u1 = Vec2.dot(Vec2.sub(cLocal, v1), Vec2.sub(v2, v1)); - var u2 = Vec2.dot(Vec2.sub(cLocal, v2), Vec2.sub(v1, v2)); - if (u1 <= 0.0) { - if (Vec2.distanceSquared(cLocal, v1) > radius * radius) { - return; - } - manifold.pointCount = 1; - manifold.type = ManifoldType.e_faceA; - manifold.localNormal.setCombine(1, cLocal, -1, v1); - manifold.localNormal.normalize(); - manifold.localPoint = v1; - manifold.points[0].localPoint.setVec2(circleB.m_p); - // manifold.points[0].id.key = 0; - manifold.points[0].id.cf.indexA = 0; - manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; - manifold.points[0].id.cf.indexB = 0; - manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; - } - else if (u2 <= 0.0) { - if (Vec2.distanceSquared(cLocal, v2) > radius * radius) { - return; - } - manifold.pointCount = 1; - manifold.type = ManifoldType.e_faceA; - manifold.localNormal.setCombine(1, cLocal, -1, v2); - manifold.localNormal.normalize(); - manifold.localPoint.setVec2(v2); - manifold.points[0].localPoint.setVec2(circleB.m_p); - // manifold.points[0].id.key = 0; - manifold.points[0].id.cf.indexA = 0; - manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; - manifold.points[0].id.cf.indexB = 0; - manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; + if (def.length > 0) { + this.m_length = +def.length; + } + else if (def.length < 0) ; + else if (def.anchorA || def.anchorA || def.anchorA || def.anchorA) { + this.m_length = Vec2.distance(this.m_bodyA.getWorldPoint(this.m_localAnchorA), this.m_bodyB.getWorldPoint(this.m_localAnchorB)); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + DistanceJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + DistanceJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * Set the natural length. Manipulating the length can lead to non-physical + * behavior when the frequency is zero. + */ + DistanceJoint.prototype.setLength = function (length) { + this.m_length = length; + }; + /** + * Get the natural length. + */ + DistanceJoint.prototype.getLength = function () { + return this.m_length; + }; + DistanceJoint.prototype.setFrequency = function (hz) { + this.m_frequencyHz = hz; + }; + DistanceJoint.prototype.getFrequency = function () { + return this.m_frequencyHz; + }; + DistanceJoint.prototype.setDampingRatio = function (ratio) { + this.m_dampingRatio = ratio; + }; + DistanceJoint.prototype.getDampingRatio = function () { + return this.m_dampingRatio; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + DistanceJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + DistanceJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + DistanceJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + DistanceJoint.prototype.getReactionTorque = function (inv_dt) { + return 0.0; + }; + DistanceJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + this.m_u = Vec2.sub(Vec2.add(cB, this.m_rB), Vec2.add(cA, this.m_rA)); + // Handle singularity. + var length = this.m_u.length(); + if (length > Settings.linearSlop) { + this.m_u.mul(1.0 / length); } else { - var faceCenter = Vec2.mid(v1, v2); - var separation_1 = Vec2.dot(cLocal, normals[vertIndex1]) - Vec2.dot(faceCenter, normals[vertIndex1]); - if (separation_1 > radius) { - return; - } - manifold.pointCount = 1; - manifold.type = ManifoldType.e_faceA; - manifold.localNormal.setVec2(normals[vertIndex1]); - manifold.localPoint.setVec2(faceCenter); - manifold.points[0].localPoint.setVec2(circleB.m_p); - // manifold.points[0].id.key = 0; - manifold.points[0].id.cf.indexA = 0; - manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; - manifold.points[0].id.cf.indexB = 0; - manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; + this.m_u.setNum(0.0, 0.0); } - } - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - Contact.addType(EdgeShape.TYPE, PolygonShape.TYPE, EdgePolygonContact); - Contact.addType(ChainShape.TYPE, PolygonShape.TYPE, ChainPolygonContact); - function EdgePolygonContact(manifold, xfA, fA, indexA, xfB, fB, indexB) { - CollideEdgePolygon(manifold, fA.getShape(), xfA, fB.getShape(), xfB); - } - function ChainPolygonContact(manifold, xfA, fA, indexA, xfB, fB, indexB) { - var chain = fA.getShape(); - var edge = new EdgeShape(); - chain.getChildEdge(edge, indexA); - CollideEdgePolygon(manifold, edge, xfA, fB.getShape(), xfB); - } - var EPAxisType; - (function (EPAxisType) { - EPAxisType[EPAxisType["e_unknown"] = -1] = "e_unknown"; - EPAxisType[EPAxisType["e_edgeA"] = 1] = "e_edgeA"; - EPAxisType[EPAxisType["e_edgeB"] = 2] = "e_edgeB"; - })(EPAxisType || (EPAxisType = {})); - // unused? - var VertexType; - (function (VertexType) { - VertexType[VertexType["e_isolated"] = 0] = "e_isolated"; - VertexType[VertexType["e_concave"] = 1] = "e_concave"; - VertexType[VertexType["e_convex"] = 2] = "e_convex"; - })(VertexType || (VertexType = {})); - /** - * This structure is used to keep track of the best separating axis. - */ - var EPAxis = /** @class */ (function () { - function EPAxis() { - } - return EPAxis; - }()); - /** - * This holds polygon B expressed in frame A. - */ - var TempPolygon = /** @class */ (function () { - function TempPolygon() { - this.vertices = []; // [Settings.maxPolygonVertices] - this.normals = []; // [Settings.maxPolygonVertices]; - this.count = 0; - } - return TempPolygon; - }()); - /** - * Reference face used for clipping - */ - var ReferenceFace = /** @class */ (function () { - function ReferenceFace() { - this.normal = Vec2.zero(); - this.sideNormal1 = Vec2.zero(); - this.sideNormal2 = Vec2.zero(); - } - return ReferenceFace; - }()); - // reused - var edgeAxis = new EPAxis(); - var polygonAxis = new EPAxis(); - var polygonBA = new TempPolygon(); - var rf = new ReferenceFace(); - /** - * This function collides and edge and a polygon, taking into account edge - * adjacency. - */ - function CollideEdgePolygon(manifold, edgeA, xfA, polygonB, xfB) { - // Algorithm: - // 1. Classify v1 and v2 - // 2. Classify polygon centroid as front or back - // 3. Flip normal if necessary - // 4. Initialize normal range to [-pi, pi] about face normal - // 5. Adjust normal range according to adjacent edges - // 6. Visit each separating axes, only accept axes within the range - // 7. Return if _any_ axis indicates separation - // 8. Clip - // let m_type1: VertexType; - // let m_type2: VertexType; - var xf = Transform.mulTXf(xfA, xfB); - var centroidB = Transform.mulVec2(xf, polygonB.m_centroid); - var v0 = edgeA.m_vertex0; - var v1 = edgeA.m_vertex1; - var v2 = edgeA.m_vertex2; - var v3 = edgeA.m_vertex3; - var hasVertex0 = edgeA.m_hasVertex0; - var hasVertex3 = edgeA.m_hasVertex3; - var edge1 = Vec2.sub(v2, v1); - edge1.normalize(); - var normal1 = Vec2.neo(edge1.y, -edge1.x); - var offset1 = Vec2.dot(normal1, Vec2.sub(centroidB, v1)); - var offset0 = 0.0; - var offset2 = 0.0; - var convex1 = false; - var convex2 = false; - var normal0; - var normal2; - // Is there a preceding edge? - if (hasVertex0) { - var edge0 = Vec2.sub(v1, v0); - edge0.normalize(); - normal0 = Vec2.neo(edge0.y, -edge0.x); - convex1 = Vec2.crossVec2Vec2(edge0, edge1) >= 0.0; - offset0 = Vec2.dot(normal0, centroidB) - Vec2.dot(normal0, v0); - } - // Is there a following edge? - if (hasVertex3) { - var edge2 = Vec2.sub(v3, v2); - edge2.normalize(); - normal2 = Vec2.neo(edge2.y, -edge2.x); - convex2 = Vec2.crossVec2Vec2(edge1, edge2) > 0.0; - offset2 = Vec2.dot(normal2, centroidB) - Vec2.dot(normal2, v2); - } - var front; - var normal = Vec2.zero(); - var lowerLimit = Vec2.zero(); - var upperLimit = Vec2.zero(); - // Determine front or back collision. Determine collision normal limits. - if (hasVertex0 && hasVertex3) { - if (convex1 && convex2) { - front = offset0 >= 0.0 || offset1 >= 0.0 || offset2 >= 0.0; - if (front) { - normal.setVec2(normal1); - lowerLimit.setVec2(normal0); - upperLimit.setVec2(normal2); - } - else { - normal.setMul(-1, normal1); - lowerLimit.setMul(-1, normal1); - upperLimit.setMul(-1, normal1); - } - } - else if (convex1) { - front = offset0 >= 0.0 || (offset1 >= 0.0 && offset2 >= 0.0); - if (front) { - normal.setVec2(normal1); - lowerLimit.setVec2(normal0); - upperLimit.setVec2(normal1); - } - else { - normal.setMul(-1, normal1); - lowerLimit.setMul(-1, normal2); - upperLimit.setMul(-1, normal1); - } - } - else if (convex2) { - front = offset2 >= 0.0 || (offset0 >= 0.0 && offset1 >= 0.0); - if (front) { - normal.setVec2(normal1); - lowerLimit.setVec2(normal1); - upperLimit.setVec2(normal2); - } - else { - normal.setMul(-1, normal1); - lowerLimit.setMul(-1, normal1); - upperLimit.setMul(-1, normal0); - } - } - else { - front = offset0 >= 0.0 && offset1 >= 0.0 && offset2 >= 0.0; - if (front) { - normal.setVec2(normal1); - lowerLimit.setVec2(normal1); - upperLimit.setVec2(normal1); - } - else { - normal.setMul(-1, normal1); - lowerLimit.setMul(-1, normal2); - upperLimit.setMul(-1, normal0); - } - } + var crAu = Vec2.crossVec2Vec2(this.m_rA, this.m_u); + var crBu = Vec2.crossVec2Vec2(this.m_rB, this.m_u); + var invMass = this.m_invMassA + this.m_invIA * crAu * crAu + this.m_invMassB + + this.m_invIB * crBu * crBu; + // Compute the effective mass matrix. + this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0; + if (this.m_frequencyHz > 0.0) { + var C = length - this.m_length; + // Frequency + var omega = 2.0 * math.PI * this.m_frequencyHz; + // Damping coefficient + var d = 2.0 * this.m_mass * this.m_dampingRatio * omega; + // Spring stiffness + var k = this.m_mass * omega * omega; + // magic formulas + var h = step.dt; + this.m_gamma = h * (d + h * k); + this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0; + this.m_bias = C * h * k * this.m_gamma; + invMass += this.m_gamma; + this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0; } - else if (hasVertex0) { - if (convex1) { - front = offset0 >= 0.0 || offset1 >= 0.0; - if (front) { - normal.setVec2(normal1); - lowerLimit.setVec2(normal0); - upperLimit.setMul(-1, normal1); - } - else { - normal.setMul(-1, normal1); - lowerLimit.setVec2(normal1); - upperLimit.setMul(-1, normal1); - } - } - else { - front = offset0 >= 0.0 && offset1 >= 0.0; - if (front) { - normal.setVec2(normal1); - lowerLimit.setVec2(normal1); - upperLimit.setMul(-1, normal1); - } - else { - normal.setMul(-1, normal1); - lowerLimit.setVec2(normal1); - upperLimit.setMul(-1, normal0); - } - } + else { + this.m_gamma = 0.0; + this.m_bias = 0.0; } - else if (hasVertex3) { - if (convex2) { - front = offset1 >= 0.0 || offset2 >= 0.0; - if (front) { - normal.setVec2(normal1); - lowerLimit.setMul(-1, normal1); - upperLimit.setVec2(normal2); - } - else { - normal.setMul(-1, normal1); - lowerLimit.setMul(-1, normal1); - upperLimit.setVec2(normal1); - } - } - else { - front = offset1 >= 0.0 && offset2 >= 0.0; - if (front) { - normal.setVec2(normal1); - lowerLimit.setMul(-1, normal1); - upperLimit.setVec2(normal1); - } - else { - normal.setMul(-1, normal1); - lowerLimit.setMul(-1, normal2); - upperLimit.setVec2(normal1); - } - } + if (step.warmStarting) { + // Scale the impulse to support a variable time step. + this.m_impulse *= step.dtRatio; + var P = Vec2.mulNumVec2(this.m_impulse, this.m_u); + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); } else { - front = offset1 >= 0.0; - if (front) { - normal.setVec2(normal1); - lowerLimit.setMul(-1, normal1); - upperLimit.setMul(-1, normal1); - } - else { - normal.setMul(-1, normal1); - lowerLimit.setVec2(normal1); - upperLimit.setVec2(normal1); - } + this.m_impulse = 0.0; } - // Get polygonB in frameA - polygonBA.count = polygonB.m_count; - for (var i = 0; i < polygonB.m_count; ++i) { - polygonBA.vertices[i] = Transform.mulVec2(xf, polygonB.m_vertices[i]); - polygonBA.normals[i] = Rot.mulVec2(xf.q, polygonB.m_normals[i]); - } - var radius = 2.0 * Settings.polygonRadius; - manifold.pointCount = 0; - { // ComputeEdgeSeparation - edgeAxis.type = EPAxisType.e_edgeA; - edgeAxis.index = front ? 0 : 1; - edgeAxis.separation = Infinity; - for (var i = 0; i < polygonBA.count; ++i) { - var s = Vec2.dot(normal, Vec2.sub(polygonBA.vertices[i], v1)); - if (s < edgeAxis.separation) { - edgeAxis.separation = s; - } - } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + DistanceJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + // Cdot = dot(u, v + cross(w, r)) + var vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA)); + var vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)); + var Cdot = Vec2.dot(this.m_u, vpB) - Vec2.dot(this.m_u, vpA); + var impulse = -this.m_mass + * (Cdot + this.m_bias + this.m_gamma * this.m_impulse); + this.m_impulse += impulse; + var P = Vec2.mulNumVec2(impulse, this.m_u); + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + DistanceJoint.prototype.solvePositionConstraints = function (step) { + if (this.m_frequencyHz > 0.0) { + // There is no position correction for soft distance constraints. + return true; } - // If no valid normal can be found than this edge should not collide. + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); + var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); + var u = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); + var length = u.normalize(); + var C = length - this.m_length; + C = math + .clamp(C, -Settings.maxLinearCorrection, Settings.maxLinearCorrection); + var impulse = -this.m_mass * C; + var P = Vec2.mulNumVec2(impulse, u); + cA.subMul(this.m_invMassA, P); + aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P); + cB.addMul(this.m_invMassB, P); + aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P); + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + return math.abs(C) < Settings.linearSlop; + }; + DistanceJoint.TYPE = 'distance-joint'; + return DistanceJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$9 = { + maxForce: 0.0, + maxTorque: 0.0, +}; +/** + * Friction joint. This is used for top-down friction. It provides 2D + * translational friction and angular friction. + * + * @param anchor Anchor in global coordination. + */ +var FrictionJoint = /** @class */ (function (_super) { + __extends(FrictionJoint, _super); + function FrictionJoint(def, bodyA, bodyB, anchor) { + var _this = this; // @ts-ignore - if (edgeAxis.type == EPAxisType.e_unknown) { - return; + if (!(_this instanceof FrictionJoint)) { + return new FrictionJoint(def, bodyA, bodyB, anchor); } - if (edgeAxis.separation > radius) { - return; + def = options(def, DEFAULTS$9); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = FrictionJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + // Solver shared + _this.m_linearImpulse = Vec2.zero(); + _this.m_angularImpulse = 0.0; + _this.m_maxForce = def.maxForce; + _this.m_maxTorque = def.maxTorque; + return _this; + // Point-to-point constraint + // Cdot = v2 - v1 + // = v2 + cross(w2, r2) - v1 - cross(w1, r1) + // J = [-I -r1_skew I r2_skew ] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + // Angle constraint + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // K = invI1 + invI2 + } + /** @internal */ + FrictionJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + maxForce: this.m_maxForce, + maxTorque: this.m_maxTorque, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + }; + }; + /** @internal */ + FrictionJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new FrictionJoint(data); + return joint; + }; + /** @internal */ + FrictionJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); } - { // ComputePolygonSeparation - polygonAxis.type = EPAxisType.e_unknown; - polygonAxis.index = -1; - polygonAxis.separation = -Infinity; - var perp = Vec2.neo(-normal.y, normal.x); - for (var i = 0; i < polygonBA.count; ++i) { - var n = Vec2.neg(polygonBA.normals[i]); - var s1 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v1)); - var s2 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v2)); - var s = math$1.min(s1, s2); - if (s > radius) { - // No collision - polygonAxis.type = EPAxisType.e_edgeB; - polygonAxis.index = i; - polygonAxis.separation = s; - break; - } - // Adjacency - if (Vec2.dot(n, perp) >= 0.0) { - if (Vec2.dot(Vec2.sub(n, upperLimit), normal) < -Settings.angularSlop) { - continue; - } - } - else { - if (Vec2.dot(Vec2.sub(n, lowerLimit), normal) < -Settings.angularSlop) { - continue; - } - } - if (s > polygonAxis.separation) { - polygonAxis.type = EPAxisType.e_edgeB; - polygonAxis.index = i; - polygonAxis.separation = s; - } - } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); } - if (polygonAxis.type != EPAxisType.e_unknown && polygonAxis.separation > radius) { - return; + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); } - // Use hysteresis for jitter reduction. - var k_relativeTol = 0.98; - var k_absoluteTol = 0.001; - var primaryAxis; - if (polygonAxis.type == EPAxisType.e_unknown) { - primaryAxis = edgeAxis; + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); } - else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) { - primaryAxis = polygonAxis; + }; + /** + * The local anchor point relative to bodyA's origin. + */ + FrictionJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + FrictionJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * Set the maximum friction force in N. + */ + FrictionJoint.prototype.setMaxForce = function (force) { + this.m_maxForce = force; + }; + /** + * Get the maximum friction force in N. + */ + FrictionJoint.prototype.getMaxForce = function () { + return this.m_maxForce; + }; + /** + * Set the maximum friction torque in N*m. + */ + FrictionJoint.prototype.setMaxTorque = function (torque) { + this.m_maxTorque = torque; + }; + /** + * Get the maximum friction torque in N*m. + */ + FrictionJoint.prototype.getMaxTorque = function () { + return this.m_maxTorque; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + FrictionJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + FrictionJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + FrictionJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + FrictionJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_angularImpulse; + }; + FrictionJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + // Compute the effective mass matrix. + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var K = new Mat22(); + K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y + * this.m_rB.y; + K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y; + K.ey.x = K.ex.y; + K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x + * this.m_rB.x; + this.m_linearMass = K.getInverse(); + this.m_angularMass = iA + iB; + if (this.m_angularMass > 0.0) { + this.m_angularMass = 1.0 / this.m_angularMass; } - else { - primaryAxis = edgeAxis; - } - var ie = [new ClipVertex(), new ClipVertex()]; - if (primaryAxis.type == EPAxisType.e_edgeA) { - manifold.type = ManifoldType.e_faceA; - // Search for the polygon normal that is most anti-parallel to the edge - // normal. - var bestIndex = 0; - var bestValue = Vec2.dot(normal, polygonBA.normals[0]); - for (var i = 1; i < polygonBA.count; ++i) { - var value = Vec2.dot(normal, polygonBA.normals[i]); - if (value < bestValue) { - bestValue = value; - bestIndex = i; - } - } - var i1 = bestIndex; - var i2 = i1 + 1 < polygonBA.count ? i1 + 1 : 0; - ie[0].v = polygonBA.vertices[i1]; - ie[0].id.cf.indexA = 0; - ie[0].id.cf.indexB = i1; - ie[0].id.cf.typeA = ContactFeatureType.e_face; - ie[0].id.cf.typeB = ContactFeatureType.e_vertex; - ie[1].v = polygonBA.vertices[i2]; - ie[1].id.cf.indexA = 0; - ie[1].id.cf.indexB = i2; - ie[1].id.cf.typeA = ContactFeatureType.e_face; - ie[1].id.cf.typeB = ContactFeatureType.e_vertex; - if (front) { - rf.i1 = 0; - rf.i2 = 1; - rf.v1 = v1; - rf.v2 = v2; - rf.normal.setVec2(normal1); - } - else { - rf.i1 = 1; - rf.i2 = 0; - rf.v1 = v2; - rf.v2 = v1; - rf.normal.setMul(-1, normal1); - } + if (step.warmStarting) { + // Scale impulses to support a variable time step. + this.m_linearImpulse.mul(step.dtRatio); + this.m_angularImpulse *= step.dtRatio; + var P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse); } else { - manifold.type = ManifoldType.e_faceB; - ie[0].v = v1; - ie[0].id.cf.indexA = 0; - ie[0].id.cf.indexB = primaryAxis.index; - ie[0].id.cf.typeA = ContactFeatureType.e_vertex; - ie[0].id.cf.typeB = ContactFeatureType.e_face; - ie[1].v = v2; - ie[1].id.cf.indexA = 0; - ie[1].id.cf.indexB = primaryAxis.index; - ie[1].id.cf.typeA = ContactFeatureType.e_vertex; - ie[1].id.cf.typeB = ContactFeatureType.e_face; - rf.i1 = primaryAxis.index; - rf.i2 = rf.i1 + 1 < polygonBA.count ? rf.i1 + 1 : 0; - rf.v1 = polygonBA.vertices[rf.i1]; - rf.v2 = polygonBA.vertices[rf.i2]; - rf.normal.setVec2(polygonBA.normals[rf.i1]); - } - rf.sideNormal1.setNum(rf.normal.y, -rf.normal.x); - rf.sideNormal2.setMul(-1, rf.sideNormal1); - rf.sideOffset1 = Vec2.dot(rf.sideNormal1, rf.v1); - rf.sideOffset2 = Vec2.dot(rf.sideNormal2, rf.v2); - // Clip incident edge against extruded edge1 side edges. - var clipPoints1 = [new ClipVertex(), new ClipVertex()]; - var clipPoints2 = [new ClipVertex(), new ClipVertex()]; - var np; - // Clip to box side 1 - np = clipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1); - if (np < Settings.maxManifoldPoints) { - return; + this.m_linearImpulse.setZero(); + this.m_angularImpulse = 0.0; } - // Clip to negative box side 1 - np = clipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2); - if (np < Settings.maxManifoldPoints) { - return; + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + FrictionJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var h = step.dt; // float + // Solve angular friction + { + var Cdot = wB - wA; // float + var impulse = -this.m_angularMass * Cdot; // float + var oldImpulse = this.m_angularImpulse; // float + var maxImpulse = h * this.m_maxTorque; // float + this.m_angularImpulse = math.clamp(this.m_angularImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_angularImpulse - oldImpulse; + wA -= iA * impulse; + wB += iB * impulse; } - // Now clipPoints2 contains the clipped points. - if (primaryAxis.type == EPAxisType.e_edgeA) { - manifold.localNormal = Vec2.clone(rf.normal); - manifold.localPoint = Vec2.clone(rf.v1); + // Solve linear friction + { + var Cdot = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA))); // Vec2 + var impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); // Vec2 + var oldImpulse = this.m_linearImpulse; // Vec2 + this.m_linearImpulse.add(impulse); + var maxImpulse = h * this.m_maxForce; // float + if (this.m_linearImpulse.lengthSquared() > maxImpulse * maxImpulse) { + this.m_linearImpulse.normalize(); + this.m_linearImpulse.mul(maxImpulse); + } + impulse = Vec2.sub(this.m_linearImpulse, oldImpulse); + vA.subMul(mA, impulse); + wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); + vB.addMul(mB, impulse); + wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + FrictionJoint.prototype.solvePositionConstraints = function (step) { + return true; + }; + FrictionJoint.TYPE = 'friction-joint'; + return FrictionJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A 3-by-3 matrix. Stored in column-major order. + */ +var Mat33 = /** @class */ (function () { + function Mat33(a, b, c) { + if (typeof a === 'object' && a !== null) { + this.ex = Vec3.clone(a); + this.ey = Vec3.clone(b); + this.ez = Vec3.clone(c); } else { - manifold.localNormal = Vec2.clone(polygonB.m_normals[rf.i1]); - manifold.localPoint = Vec2.clone(polygonB.m_vertices[rf.i1]); - } - var pointCount = 0; - for (var i = 0; i < Settings.maxManifoldPoints; ++i) { - var separation = Vec2.dot(rf.normal, Vec2.sub(clipPoints2[i].v, rf.v1)); - if (separation <= radius) { - var cp = manifold.points[pointCount]; // ManifoldPoint - if (primaryAxis.type == EPAxisType.e_edgeA) { - cp.localPoint = Transform.mulTVec2(xf, clipPoints2[i].v); - cp.id = clipPoints2[i].id; - } - else { - cp.localPoint = clipPoints2[i].v; - cp.id.cf.typeA = clipPoints2[i].id.cf.typeB; - cp.id.cf.typeB = clipPoints2[i].id.cf.typeA; - cp.id.cf.indexA = clipPoints2[i].id.cf.indexB; - cp.id.cf.indexB = clipPoints2[i].id.cf.indexA; - } - ++pointCount; - } + this.ex = Vec3.zero(); + this.ey = Vec3.zero(); + this.ez = Vec3.zero(); } - manifold.pointCount = pointCount; - } - - // @ts-ignore - Solver.TimeStep = TimeStep; - // @ts-ignore - Distance.testOverlap = testOverlap; - // @ts-ignore - Distance.Input = DistanceInput; - // @ts-ignore - Distance.Output = DistanceOutput; - // @ts-ignore - Distance.Proxy = DistanceProxy; - // @ts-ignore - Distance.Cache = SimplexCache; - // @ts-ignore - TimeOfImpact.Input = TOIInput; - // @ts-ignore - TimeOfImpact.Output = TOIOutput; - - function createCommonjsModule(fn) { - var module = { exports: {} }; - return fn(module, module.exports), module.exports; } - - var stats = {}; - - var extend = function(base) { - for (var i = 1; i < arguments.length; i++) { - var obj = arguments[i]; - for ( var key in obj) { - if (obj.hasOwnProperty(key)) { - base[key] = obj[key]; - } + /** @internal */ + Mat33.prototype.toString = function () { + return JSON.stringify(this); + }; + Mat33.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; } - } - return base; + return Vec3.isValid(obj.ex) && Vec3.isValid(obj.ey) && Vec3.isValid(obj.ez); + }; + Mat33.assert = function (o) { }; - /** - * ! is the definitive JavaScript type testing library - * - * @copyright 2013-2014 Enrico Marino / Jordan Harband - * @license MIT + * Set this matrix to all zeros. */ - - var is_1 = createCommonjsModule(function (module) { - var objProto = Object.prototype; - var owns = objProto.hasOwnProperty; - var toStr = objProto.toString; - - var hexRegex = /^[A-Fa-f0-9]+$/; - - var is = module.exports = {}; - - is.a = is.an = is.type = function(value, type) { - return typeof value === type; + Mat33.prototype.setZero = function () { + this.ex.setZero(); + this.ey.setZero(); + this.ez.setZero(); + return this; }; - - is.defined = function(value) { - return typeof value !== 'undefined'; + /** + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. + */ + Mat33.prototype.solve33 = function (v) { + var det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez)); + if (det !== 0.0) { + det = 1.0 / det; + } + var r = new Vec3(); + r.x = det * Vec3.dot(v, Vec3.cross(this.ey, this.ez)); + r.y = det * Vec3.dot(this.ex, Vec3.cross(v, this.ez)); + r.z = det * Vec3.dot(this.ex, Vec3.cross(this.ey, v)); + return r; }; - - is.empty = function(value) { - var type = toStr.call(value); - var key; - - if ('[object Array]' === type || '[object Arguments]' === type - || '[object String]' === type) { - return value.length === 0; - } - - if ('[object Object]' === type) { - for (key in value) { - if (owns.call(value, key)) { - return false; - } + /** + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix + * equation. + */ + Mat33.prototype.solve22 = function (v) { + var a11 = this.ex.x; + var a12 = this.ey.x; + var a21 = this.ex.y; + var a22 = this.ey.y; + var det = a11 * a22 - a12 * a21; + if (det !== 0.0) { + det = 1.0 / det; } - return true; - } - - return !value; + var r = Vec2.zero(); + r.x = det * (a22 * v.x - a12 * v.y); + r.y = det * (a11 * v.y - a21 * v.x); + return r; }; - - is.equal = function(value, other) { - if (value === other) { - return true; - } - - var type = toStr.call(value); - var key; - - if (type !== toStr.call(other)) { - return false; - } - - if ('[object Object]' === type) { - for (key in value) { - if (!is.equal(value[key], other[key]) || !(key in other)) { - return false; - } + /** + * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if + * singular. + */ + Mat33.prototype.getInverse22 = function (M) { + var a = this.ex.x; + var b = this.ey.x; + var c = this.ex.y; + var d = this.ey.y; + var det = a * d - b * c; + if (det !== 0.0) { + det = 1.0 / det; } - for (key in other) { - if (!is.equal(value[key], other[key]) || !(key in value)) { - return false; - } + M.ex.x = det * d; + M.ey.x = -det * b; + M.ex.z = 0.0; + M.ex.y = -det * c; + M.ey.y = det * a; + M.ey.z = 0.0; + M.ez.x = 0.0; + M.ez.y = 0.0; + M.ez.z = 0.0; + }; + /** + * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix + * if singular. + */ + Mat33.prototype.getSymInverse33 = function (M) { + var det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez)); + if (det !== 0.0) { + det = 1.0 / det; } - return true; - } - - if ('[object Array]' === type) { - key = value.length; - if (key !== other.length) { - return false; + var a11 = this.ex.x; + var a12 = this.ey.x; + var a13 = this.ez.x; + var a22 = this.ey.y; + var a23 = this.ez.y; + var a33 = this.ez.z; + M.ex.x = det * (a22 * a33 - a23 * a23); + M.ex.y = det * (a13 * a23 - a12 * a33); + M.ex.z = det * (a12 * a23 - a13 * a22); + M.ey.x = M.ex.y; + M.ey.y = det * (a11 * a33 - a13 * a13); + M.ey.z = det * (a13 * a12 - a11 * a23); + M.ez.x = M.ex.z; + M.ez.y = M.ey.z; + M.ez.z = det * (a11 * a22 - a12 * a12); + }; + // tslint:disable-next-line:typedef + Mat33.mul = function (a, b) { + if (b && 'z' in b && 'y' in b && 'x' in b) { + var x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z; + var y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z; + var z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z; + return new Vec3(x, y, z); } - while (--key) { - if (!is.equal(value[key], other[key])) { - return false; - } + else if (b && 'y' in b && 'x' in b) { + var x = a.ex.x * b.x + a.ey.x * b.y; + var y = a.ex.y * b.x + a.ey.y * b.y; + return Vec2.neo(x, y); } - return true; - } - - if ('[object Function]' === type) { - return value.prototype === other.prototype; - } - - if ('[object Date]' === type) { - return value.getTime() === other.getTime(); - } - - return false; }; - - is.instance = function(value, constructor) { - return value instanceof constructor; + Mat33.mulVec3 = function (a, b) { + var x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z; + var y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z; + var z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z; + return new Vec3(x, y, z); }; - - is.nil = function(value) { - return value === null; + Mat33.mulVec2 = function (a, b) { + var x = a.ex.x * b.x + a.ey.x * b.y; + var y = a.ex.y * b.x + a.ey.y * b.y; + return Vec2.neo(x, y); }; - - is.undef = function(value) { - return typeof value === 'undefined'; + Mat33.add = function (a, b) { + return new Mat33(Vec3.add(a.ex, b.ex), Vec3.add(a.ey, b.ey), Vec3.add(a.ez, b.ez)); }; + return Mat33; +}()); - is.array = function(value) { - return '[object Array]' === toStr.call(value); +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var inactiveLimit$2 = 0; +var atLowerLimit$1 = 1; +var atUpperLimit$2 = 2; +var equalLimits$1 = 3; +var DEFAULTS$8 = { + lowerAngle: 0.0, + upperAngle: 0.0, + maxMotorTorque: 0.0, + motorSpeed: 0.0, + enableLimit: false, + enableMotor: false +}; +/** + * A revolute joint constrains two bodies to share a common point while they are + * free to rotate about the point. The relative rotation about the shared point + * is the joint angle. You can limit the relative rotation with a joint limit + * that specifies a lower and upper angle. You can use a motor to drive the + * relative rotation about the shared point. A maximum motor torque is provided + * so that infinite forces are not generated. + */ +var RevoluteJoint = /** @class */ (function (_super) { + __extends(RevoluteJoint, _super); + // @ts-ignore + function RevoluteJoint(def, bodyA, bodyB, anchor) { + var _this = this; + // @ts-ignore + if (!(_this instanceof RevoluteJoint)) { + return new RevoluteJoint(def, bodyA, bodyB, anchor); + } + def = options(def, DEFAULTS$8); + _this = _super.call(this, def, bodyA, bodyB) || this; + // effective mass for point-to-point constraint. + /** @internal */ _this.m_mass = new Mat33(); + /** @internal */ _this.m_limitState = inactiveLimit$2; // TODO enum + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = RevoluteJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + _this.m_referenceAngle = math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); + _this.m_impulse = new Vec3(); + _this.m_motorImpulse = 0.0; + _this.m_lowerAngle = def.lowerAngle; + _this.m_upperAngle = def.upperAngle; + _this.m_maxMotorTorque = def.maxMotorTorque; + _this.m_motorSpeed = def.motorSpeed; + _this.m_enableLimit = def.enableLimit; + _this.m_enableMotor = def.enableMotor; + return _this; + // Point-to-point constraint + // C = p2 - p1 + // Cdot = v2 - v1 + // = v2 + cross(w2, r2) - v1 - cross(w1, r1) + // J = [-I -r1_skew I r2_skew ] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + // Motor constraint + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // K = invI1 + invI2 + } + /** @internal */ + RevoluteJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + lowerAngle: this.m_lowerAngle, + upperAngle: this.m_upperAngle, + maxMotorTorque: this.m_maxMotorTorque, + motorSpeed: this.m_motorSpeed, + enableLimit: this.m_enableLimit, + enableMotor: this.m_enableMotor, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + referenceAngle: this.m_referenceAngle, + }; }; - - is.emptyarray = function(value) { - return is.array(value) && value.length === 0; + /** @internal */ + RevoluteJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new RevoluteJoint(data); + return joint; }; - - is.arraylike = function(value) { - return !!value && !is.boolean(value) && owns.call(value, 'length') - && isFinite(value.length) && is.number(value.length) && value.length >= 0; + /** @internal */ + RevoluteJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } }; - - is.boolean = function(value) { - return '[object Boolean]' === toStr.call(value); + /** + * The local anchor point relative to bodyA's origin. + */ + RevoluteJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; }; - - is.element = function(value) { - return value !== undefined && typeof HTMLElement !== 'undefined' - && value instanceof HTMLElement && value.nodeType === 1; + /** + * The local anchor point relative to bodyB's origin. + */ + RevoluteJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; }; - - is.fn = function(value) { - return '[object Function]' === toStr.call(value); + /** + * Get the reference angle. + */ + RevoluteJoint.prototype.getReferenceAngle = function () { + return this.m_referenceAngle; + }; + /** + * Get the current joint angle in radians. + */ + RevoluteJoint.prototype.getJointAngle = function () { + var bA = this.m_bodyA; + var bB = this.m_bodyB; + return bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle; + }; + /** + * Get the current joint angle speed in radians per second. + */ + RevoluteJoint.prototype.getJointSpeed = function () { + var bA = this.m_bodyA; + var bB = this.m_bodyB; + return bB.m_angularVelocity - bA.m_angularVelocity; + }; + /** + * Is the joint motor enabled? + */ + RevoluteJoint.prototype.isMotorEnabled = function () { + return this.m_enableMotor; + }; + /** + * Enable/disable the joint motor. + */ + RevoluteJoint.prototype.enableMotor = function (flag) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableMotor = flag; + }; + /** + * Get the current motor torque given the inverse time step. Unit is N*m. + */ + RevoluteJoint.prototype.getMotorTorque = function (inv_dt) { + return inv_dt * this.m_motorImpulse; + }; + /** + * Set the motor speed in radians per second. + */ + RevoluteJoint.prototype.setMotorSpeed = function (speed) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_motorSpeed = speed; + }; + /** + * Get the motor speed in radians per second. + */ + RevoluteJoint.prototype.getMotorSpeed = function () { + return this.m_motorSpeed; + }; + /** + * Set the maximum motor torque, usually in N-m. + */ + RevoluteJoint.prototype.setMaxMotorTorque = function (torque) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_maxMotorTorque = torque; + }; + RevoluteJoint.prototype.getMaxMotorTorque = function () { + return this.m_maxMotorTorque; + }; + /** + * Is the joint limit enabled? + */ + RevoluteJoint.prototype.isLimitEnabled = function () { + return this.m_enableLimit; + }; + /** + * Enable/disable the joint limit. + */ + RevoluteJoint.prototype.enableLimit = function (flag) { + if (flag != this.m_enableLimit) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableLimit = flag; + this.m_impulse.z = 0.0; + } }; - - is.number = function(value) { - return '[object Number]' === toStr.call(value); + /** + * Get the lower joint limit in radians. + */ + RevoluteJoint.prototype.getLowerLimit = function () { + return this.m_lowerAngle; }; - - is.nan = function(value) { - return !is.number(value) || value !== value; + /** + * Get the upper joint limit in radians. + */ + RevoluteJoint.prototype.getUpperLimit = function () { + return this.m_upperAngle; }; - - is.object = function(value) { - return '[object Object]' === toStr.call(value); + /** + * Set the joint limits in radians. + */ + RevoluteJoint.prototype.setLimits = function (lower, upper) { + if (lower != this.m_lowerAngle || upper != this.m_upperAngle) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_impulse.z = 0.0; + this.m_lowerAngle = lower; + this.m_upperAngle = upper; + } }; - - is.hash = function(value) { - return is.object(value) && value.constructor === Object && !value.nodeType - && !value.setInterval; + /** + * Get the anchor point on bodyA in world coordinates. + */ + RevoluteJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); }; - - is.regexp = function(value) { - return '[object RegExp]' === toStr.call(value); + /** + * Get the anchor point on bodyB in world coordinates. + */ + RevoluteJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); }; - - is.string = function(value) { - return '[object String]' === toStr.call(value); + /** + * Get the reaction force given the inverse time step. Unit is N. + */ + RevoluteJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt); }; - - is.hex = function(value) { - return is.string(value) && (!value.length || hexRegex.test(value)); + /** + * Get the reaction torque due to the joint limit given the inverse time step. + * Unit is N*m. + */ + RevoluteJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_impulse.z; }; - }); - - var _await = function() { - var count = 0; - function fork(fn, n) { - count += n = (typeof n === 'number' && n >= 1 ? n : 1); - return function() { - fn && fn.apply(this, arguments); - if (n > 0) { - n--, count--, call(); - } - }; - } - var then = []; - function call() { - if (count === 0) { - while (then.length) { - setTimeout(then.shift(), 0); - } + RevoluteJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var fixedRotation = (iA + iB === 0.0); // bool + this.m_mass.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y + * this.m_rB.y * iB; + this.m_mass.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y + * this.m_rB.x * iB; + this.m_mass.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB; + this.m_mass.ex.y = this.m_mass.ey.x; + this.m_mass.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x + * this.m_rB.x * iB; + this.m_mass.ez.y = this.m_rA.x * iA + this.m_rB.x * iB; + this.m_mass.ex.z = this.m_mass.ez.x; + this.m_mass.ey.z = this.m_mass.ez.y; + this.m_mass.ez.z = iA + iB; + this.m_motorMass = iA + iB; + if (this.m_motorMass > 0.0) { + this.m_motorMass = 1.0 / this.m_motorMass; } - } - fork.then = function(fn) { - if (count === 0) { - setTimeout(fn, 0); - } else { - then.push(fn); + if (this.m_enableMotor == false || fixedRotation) { + this.m_motorImpulse = 0.0; } - }; - return fork; - }; - - stats.create = 0; - - function Class(arg) { - if (!(this instanceof Class)) { - if (is_1.fn(arg)) { - return Class.app.apply(Class, arguments); - } else if (is_1.object(arg)) { - return Class.atlas.apply(Class, arguments); - } else { - return arg; + if (this.m_enableLimit && fixedRotation == false) { + var jointAngle = aB - aA - this.m_referenceAngle; // float + if (math.abs(this.m_upperAngle - this.m_lowerAngle) < 2.0 * Settings.angularSlop) { + this.m_limitState = equalLimits$1; + } + else if (jointAngle <= this.m_lowerAngle) { + if (this.m_limitState != atLowerLimit$1) { + this.m_impulse.z = 0.0; + } + this.m_limitState = atLowerLimit$1; + } + else if (jointAngle >= this.m_upperAngle) { + if (this.m_limitState != atUpperLimit$2) { + this.m_impulse.z = 0.0; + } + this.m_limitState = atUpperLimit$2; + } + else { + this.m_limitState = inactiveLimit$2; + this.m_impulse.z = 0.0; + } } - } - - stats.create++; - - for (var i = 0; i < _init.length; i++) { - _init[i].call(this); - } - } - - var _init = []; - - Class._init = function(fn) { - _init.push(fn); - }; - - var _load = []; - - Class._load = function(fn) { - _load.push(fn); - }; - - var _config = {}; - - Class.config = function() { - if (arguments.length === 1 && is_1.string(arguments[0])) { - return _config[arguments[0]]; - } - if (arguments.length === 1 && is_1.object(arguments[0])) { - extend(_config, arguments[0]); - } - if (arguments.length === 2 && is_1.string(arguments[0])) ; - }; - - var _app_queue = []; - var _stages = []; - var _loaded = false; - var _paused = false; - - Class.app = function(app, opts) { - if (!_loaded) { - _app_queue.push(arguments); - return; - } - var loader = Class.config('app-loader'); - loader(function(stage, canvas) { - for (var i = 0; i < _load.length; i++) { - _load[i].call(this, stage, canvas); + else { + this.m_limitState = inactiveLimit$2; } - app(stage, canvas); - _stages.push(stage); - stage.start(); - }, opts); - }; - - var loading = _await(); - - Class.preload = function(load) { - if (typeof load === 'string') { - var url = Class.resolve(load); - if (/\.js($|\?|\#)/.test(url)) { - load = function(callback) { - loadScript(url, callback); - }; + if (step.warmStarting) { + // Scale impulses to support a variable time step. + this.m_impulse.mul(step.dtRatio); + this.m_motorImpulse *= step.dtRatio; + var P = Vec2.neo(this.m_impulse.x, this.m_impulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_motorImpulse + this.m_impulse.z); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_motorImpulse + this.m_impulse.z); } - } - if (typeof load !== 'function') { - return; - } - // if (!_started) { - // _preload_queue.push(load); - // return; - // } - load(loading()); - }; - - Class.start = function(config) { - - Class.config(config); - - // false && console.log('Preloading...'); - // _started = true; - // while (_preload_queue.length) { - // var load = _preload_queue.shift(); - // load(loading()); - // } - - loading.then(function() { - _loaded = true; - while (_app_queue.length) { - var args = _app_queue.shift(); - Class.app.apply(Class, args); + else { + this.m_impulse.setZero(); + this.m_motorImpulse = 0.0; } - }); + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; }; - - Class.pause = function() { - if (!_paused) { - _paused = true; - for (var i = _stages.length - 1; i >= 0; i--) { - _stages[i].pause(); + RevoluteJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var fixedRotation = (iA + iB === 0.0); // bool + // Solve motor constraint. + if (this.m_enableMotor && this.m_limitState != equalLimits$1 + && fixedRotation == false) { + var Cdot = wB - wA - this.m_motorSpeed; // float + var impulse = -this.m_motorMass * Cdot; // float + var oldImpulse = this.m_motorImpulse; // float + var maxImpulse = step.dt * this.m_maxMotorTorque; // float + this.m_motorImpulse = math.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_motorImpulse - oldImpulse; + wA -= iA * impulse; + wB += iB * impulse; } - } - }; - - Class.resume = function() { - if (_paused) { - _paused = false; - for (var i = _stages.length - 1; i >= 0; i--) { - _stages[i].resume(); + // Solve limit constraint. + if (this.m_enableLimit && this.m_limitState != inactiveLimit$2 + && fixedRotation == false) { + var Cdot1 = Vec2.zero(); + Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); + var Cdot2 = wB - wA; // float + var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); + var impulse = Vec3.neg(this.m_mass.solve33(Cdot)); // Vec3 + if (this.m_limitState == equalLimits$1) { + this.m_impulse.add(impulse); + } + else if (this.m_limitState == atLowerLimit$1) { + var newImpulse = this.m_impulse.z + impulse.z; // float + if (newImpulse < 0.0) { + var rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2 + var reduced = this.m_mass.solve22(rhs); // Vec2 + impulse.x = reduced.x; + impulse.y = reduced.y; + impulse.z = -this.m_impulse.z; + this.m_impulse.x += reduced.x; + this.m_impulse.y += reduced.y; + this.m_impulse.z = 0.0; + } + else { + this.m_impulse.add(impulse); + } + } + else if (this.m_limitState == atUpperLimit$2) { + var newImpulse = this.m_impulse.z + impulse.z; // float + if (newImpulse > 0.0) { + var rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2 + var reduced = this.m_mass.solve22(rhs); // Vec2 + impulse.x = reduced.x; + impulse.y = reduced.y; + impulse.z = -this.m_impulse.z; + this.m_impulse.x += reduced.x; + this.m_impulse.y += reduced.y; + this.m_impulse.z = 0.0; + } + else { + this.m_impulse.add(impulse); + } + } + var P = Vec2.neo(impulse.x, impulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z); } - } - }; - - Class.create = function() { - return new Class(); + else { + // Solve point-to-point constraint + var Cdot = Vec2.zero(); + Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); + var impulse = this.m_mass.solve22(Vec2.neg(Cdot)); // Vec2 + this.m_impulse.x += impulse.x; + this.m_impulse.y += impulse.y; + vA.subMul(mA, impulse); + wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); + vB.addMul(mB, impulse); + wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; }; - - Class.resolve = (function() { - - if (typeof window === 'undefined' || typeof document === 'undefined') { - return function(url) { - return url; - }; - } - - var scripts = document.getElementsByTagName('script'); - - function getScriptSrc() { - // HTML5 - if (document.currentScript) { - return document.currentScript.src; + /** + * This returns true if the position errors are within tolerance. + */ + RevoluteJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var angularError = 0.0; // float + var positionError = 0.0; // float + var fixedRotation = (this.m_invIA + this.m_invIB == 0.0); // bool + // Solve angular limit constraint. + if (this.m_enableLimit && this.m_limitState != inactiveLimit$2 + && fixedRotation == false) { + var angle = aB - aA - this.m_referenceAngle; // float + var limitImpulse = 0.0; // float + if (this.m_limitState == equalLimits$1) { + // Prevent large angular corrections + var C = math.clamp(angle - this.m_lowerAngle, -Settings.maxAngularCorrection, Settings.maxAngularCorrection); // float + limitImpulse = -this.m_motorMass * C; + angularError = math.abs(C); + } + else if (this.m_limitState == atLowerLimit$1) { + var C = angle - this.m_lowerAngle; // float + angularError = -C; + // Prevent large angular corrections and allow some slop. + C = math.clamp(C + Settings.angularSlop, -Settings.maxAngularCorrection, 0.0); + limitImpulse = -this.m_motorMass * C; + } + else if (this.m_limitState == atUpperLimit$2) { + var C = angle - this.m_upperAngle; // float + angularError = C; + // Prevent large angular corrections and allow some slop. + C = math.clamp(C - Settings.angularSlop, 0.0, Settings.maxAngularCorrection); + limitImpulse = -this.m_motorMass * C; + } + aA -= this.m_invIA * limitImpulse; + aB += this.m_invIB * limitImpulse; } - - // IE>=10 - var stack; - try { - var err = new Error(); - if (err.stack) { - stack = err.stack; - } else { - throw err; - } - } catch (err) { - stack = err.stack; - } - if (typeof stack === 'string') { - stack = stack.split('\n'); - // Uses the last line, where the call started - for (var i = stack.length; i--;) { - var url = stack[i].match(/(\w+\:\/\/[^/]*?\/.+?)(:\d+)(:\d+)?/); - if (url) { - return url[1]; - } - } + // Solve point-to-point constraint. + { + qA.setAngle(aA); + qB.setAngle(aB); + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2 + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2 + var C = Vec2.zero(); + C.addCombine(1, cB, 1, rB); + C.subCombine(1, cA, 1, rA); + positionError = C.length(); + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var K = new Mat22(); + K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y; + K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y; + K.ey.x = K.ex.y; + K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x; + var impulse = Vec2.neg(K.solve(C)); // Vec2 + cA.subMul(mA, impulse); + aA -= iA * Vec2.crossVec2Vec2(rA, impulse); + cB.addMul(mB, impulse); + aB += iB * Vec2.crossVec2Vec2(rB, impulse); } - - // IE<11 - if (scripts.length && 'readyState' in scripts[0]) { - for (var i = scripts.length; i--;) { - if (scripts[i].readyState === 'interactive') { - return scripts[i].src; - } - } + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + return positionError <= Settings.linearSlop + && angularError <= Settings.angularSlop; + }; + RevoluteJoint.TYPE = 'revolute-joint'; + return RevoluteJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var inactiveLimit$1 = 0; +var atLowerLimit = 1; +var atUpperLimit$1 = 2; +var equalLimits = 3; +var DEFAULTS$7 = { + enableLimit: false, + lowerTranslation: 0.0, + upperTranslation: 0.0, + enableMotor: false, + maxMotorForce: 0.0, + motorSpeed: 0.0 +}; +/** + * A prismatic joint. This joint provides one degree of freedom: translation + * along an axis fixed in bodyA. Relative rotation is prevented. You can use a + * joint limit to restrict the range of motion and a joint motor to drive the + * motion or to model joint friction. + */ +var PrismaticJoint = /** @class */ (function (_super) { + __extends(PrismaticJoint, _super); + function PrismaticJoint(def, bodyA, bodyB, anchor, axis) { + var _this = this; + // @ts-ignore + if (!(_this instanceof PrismaticJoint)) { + return new PrismaticJoint(def, bodyA, bodyB, anchor, axis); } - - return location.href; - } - - return function(url) { - if (/^\.\//.test(url)) { - var src = getScriptSrc(); - var base = src.substring(0, src.lastIndexOf('/') + 1); - url = base + url.substring(2); - // } else if (/^\.\.\//.test(url)) { - // url = base + url; - } - return url; - }; - })(); - - var core = Class; - - function loadScript(src, callback) { - var el = document.createElement('script'); - el.addEventListener('load', function() { - callback(); - }); - el.addEventListener('error', function(err) { - callback(err || 'Error loading script: ' + src); - }); - el.src = src; - el.id = 'preload-' + Date.now(); - document.body.appendChild(el); - } - - function Matrix$1(a, b, c, d, e, f) { - this.reset(a, b, c, d, e, f); + def = options(def, DEFAULTS$7); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = PrismaticJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + _this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || Vec2.neo(1.0, 0.0)); + _this.m_localXAxisA.normalize(); + _this.m_localYAxisA = Vec2.crossNumVec2(1.0, _this.m_localXAxisA); + _this.m_referenceAngle = math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); + _this.m_impulse = new Vec3(); + _this.m_motorMass = 0.0; + _this.m_motorImpulse = 0.0; + _this.m_lowerTranslation = def.lowerTranslation; + _this.m_upperTranslation = def.upperTranslation; + _this.m_maxMotorForce = def.maxMotorForce; + _this.m_motorSpeed = def.motorSpeed; + _this.m_enableLimit = def.enableLimit; + _this.m_enableMotor = def.enableMotor; + _this.m_limitState = inactiveLimit$1; + _this.m_axis = Vec2.zero(); + _this.m_perp = Vec2.zero(); + _this.m_K = new Mat33(); + return _this; + // Linear constraint (point-to-line) + // d = p2 - p1 = x2 + r2 - x1 - r1 + // C = dot(perp, d) + // Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 - + // cross(w1, r1)) + // = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) + + // dot(cross(r2, perp), v2) + // J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)] + // + // Angular constraint + // C = a2 - a1 + a_initial + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // + // K = J * invM * JT + // + // J = [-a -s1 a s2] + // [0 -1 0 1] + // a = perp + // s1 = cross(d + r1, a) = cross(p2 - x1, a) + // s2 = cross(r2, a) = cross(p2 - x2, a) + // Motor/Limit linear constraint + // C = dot(ax1, d) + // Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) + + // dot(cross(r2, ax1), v2) + // J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)] + // Block Solver + // We develop a block solver that includes the joint limit. This makes the + // limit stiff (inelastic) even + // when the mass has poor distribution (leading to large torques about the + // joint anchor points). + // + // The Jacobian has 3 rows: + // J = [-uT -s1 uT s2] // linear + // [0 -1 0 1] // angular + // [-vT -a1 vT a2] // limit + // + // u = perp + // v = axis + // s1 = cross(d + r1, u), s2 = cross(r2, u) + // a1 = cross(d + r1, v), a2 = cross(r2, v) + // M * (v2 - v1) = JT * df + // J * v2 = bias + // + // v2 = v1 + invM * JT * df + // J * (v1 + invM * JT * df) = bias + // K * df = bias - J * v1 = -Cdot + // K = J * invM * JT + // Cdot = J * v1 - bias + // + // Now solve for f2. + // df = f2 - f1 + // K * (f2 - f1) = -Cdot + // f2 = invK * (-Cdot) + f1 + // + // Clamp accumulated limit impulse. + // lower: f2(3) = max(f2(3), 0) + // upper: f2(3) = min(f2(3), 0) + // + // Solve for correct f2(1:2) + // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1 + // = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3) + // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) + + // K(1:2,1:2) * f1(1:2) + // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + + // f1(1:2) + // + // Now compute impulse to be applied: + // df = f2 - f1 } - Matrix$1.prototype.toString = function() { - return '[' + this.a + ', ' + this.b + ', ' + this.c + ', ' + this.d + ', ' - + this.e + ', ' + this.f + ']'; - }; - - Matrix$1.prototype.clone = function() { - return new Matrix$1(this.a, this.b, this.c, this.d, this.e, this.f); - }; - - Matrix$1.prototype.reset = function(a, b, c, d, e, f) { - this._dirty = true; - if (typeof a === 'object') { - this.a = a.a, this.d = a.d; - this.b = a.b, this.c = a.c; - this.e = a.e, this.f = a.f; - } else { - this.a = a || 1, this.d = d || 1; - this.b = b || 0, this.c = c || 0; - this.e = e || 0, this.f = f || 0; - } - return this; - }; - - Matrix$1.prototype.identity = function() { - this._dirty = true; - this.a = 1; - this.b = 0; - this.c = 0; - this.d = 1; - this.e = 0; - this.f = 0; - return this; - }; - - Matrix$1.prototype.rotate = function(angle) { - if (!angle) { - return this; - } - - this._dirty = true; - - var u = angle ? Math.cos(angle) : 1; - // android bug may give bad 0 values - var v = angle ? Math.sin(angle) : 0; - - var a = u * this.a - v * this.b; - var b = u * this.b + v * this.a; - var c = u * this.c - v * this.d; - var d = u * this.d + v * this.c; - var e = u * this.e - v * this.f; - var f = u * this.f + v * this.e; - - this.a = a; - this.b = b; - this.c = c; - this.d = d; - this.e = e; - this.f = f; - - return this; - }; - - Matrix$1.prototype.translate = function(x, y) { - if (!x && !y) { - return this; - } - this._dirty = true; - this.e += x; - this.f += y; - return this; - }; - - Matrix$1.prototype.scale = function(x, y) { - if (!(x - 1) && !(y - 1)) { - return this; - } - this._dirty = true; - this.a *= x; - this.b *= y; - this.c *= x; - this.d *= y; - this.e *= x; - this.f *= y; - return this; - }; - - Matrix$1.prototype.skew = function(x, y) { - if (!x && !y) { - return this; - } - this._dirty = true; - - var a = this.a + this.b * x; - var b = this.b + this.a * y; - var c = this.c + this.d * x; - var d = this.d + this.c * y; - var e = this.e + this.f * x; - var f = this.f + this.e * y; - - this.a = a; - this.b = b; - this.c = c; - this.d = d; - this.e = e; - this.f = f; - return this; - }; - - Matrix$1.prototype.concat = function(m) { - this._dirty = true; - - var n = this; - - var a = n.a * m.a + n.b * m.c; - var b = n.b * m.d + n.a * m.b; - var c = n.c * m.a + n.d * m.c; - var d = n.d * m.d + n.c * m.b; - var e = n.e * m.a + m.e + n.f * m.c; - var f = n.f * m.d + m.f + n.e * m.b; - - this.a = a; - this.b = b; - this.c = c; - this.d = d; - this.e = e; - this.f = f; - - return this; - }; - - Matrix$1.prototype.inverse = Matrix$1.prototype.reverse = function() { - if (this._dirty) { - this._dirty = false; - this.inversed = this.inversed || new Matrix$1(); - var z = this.a * this.d - this.b * this.c; - this.inversed.a = this.d / z; - this.inversed.b = -this.b / z; - this.inversed.c = -this.c / z; - this.inversed.d = this.a / z; - this.inversed.e = (this.c * this.f - this.e * this.d) / z; - this.inversed.f = (this.e * this.b - this.a * this.f) / z; - } - return this.inversed; - }; - - Matrix$1.prototype.map = function(p, q) { - q = q || {}; - q.x = this.a * p.x + this.c * p.y + this.e; - q.y = this.b * p.x + this.d * p.y + this.f; - return q; + /** @internal */ + PrismaticJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + lowerTranslation: this.m_lowerTranslation, + upperTranslation: this.m_upperTranslation, + maxMotorForce: this.m_maxMotorForce, + motorSpeed: this.m_motorSpeed, + enableLimit: this.m_enableLimit, + enableMotor: this.m_enableMotor, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + localAxisA: this.m_localXAxisA, + referenceAngle: this.m_referenceAngle, + }; }; - - Matrix$1.prototype.mapX = function(x, y) { - if (typeof x === 'object') - y = x.y, x = x.x; - return this.a * x + this.c * y + this.e; + /** @internal */ + PrismaticJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + data.localAxisA = Vec2.clone(data.localAxisA); + var joint = new PrismaticJoint(data); + return joint; }; - - Matrix$1.prototype.mapY = function(x, y) { - if (typeof x === 'object') - y = x.y, x = x.x; - return this.b * x + this.d * y + this.f; + /** @internal */ + PrismaticJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + if (def.localAxisA) { + this.m_localXAxisA.setVec2(def.localAxisA); + this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA)); + } }; - - var matrix = Matrix$1; - - var create = createCommonjsModule(function (module) { - if (typeof Object.create == 'function') { - module.exports = function(proto, props) { - return Object.create.call(Object, proto, props); - }; - } else { - module.exports = function(proto, props) { - if (props) - throw Error('Second argument is not supported!'); - if (typeof proto !== 'object' || proto === null) - throw Error('Invalid prototype!'); - noop.prototype = proto; - return new noop; - }; - function noop() { - } - } - }); - - var native = Math; - - var math = create(Math); - - var random = function(min, max) { - if (typeof min === 'undefined') { - max = 1, min = 0; - } else if (typeof max === 'undefined') { - max = min, min = 0; - } - return min == max ? min : native.random() * (max - min) + min; + /** + * The local anchor point relative to bodyA's origin. + */ + PrismaticJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; }; - - var rotate = function(num, min, max) { - if (typeof min === 'undefined') { - max = 1, min = 0; - } else if (typeof max === 'undefined') { - max = min, min = 0; - } - if (max > min) { - num = (num - min) % (max - min); - return num + (num < 0 ? max : min); - } else { - num = (num - max) % (min - max); - return num + (num <= 0 ? min : max); - } + /** + * The local anchor point relative to bodyB's origin. + */ + PrismaticJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; }; - - var limit = function(num, min, max) { - if (num < min) { - return min; - } else if (num > max) { - return max; - } else { - return num; - } + /** + * The local joint axis relative to bodyA. + */ + PrismaticJoint.prototype.getLocalAxisA = function () { + return this.m_localXAxisA; }; - - var length = function(x, y) { - return native.sqrt(x * x + y * y); + /** + * Get the reference angle. + */ + PrismaticJoint.prototype.getReferenceAngle = function () { + return this.m_referenceAngle; }; - math.random = random; - math.rotate = rotate; - math.limit = limit; - math.length = length; - - function Texture$1(image, ratio) { - if (typeof image === 'object') { - this.src(image, ratio); - } - } - - Texture$1.prototype.pipe = function() { - return new Texture$1(this); + /** + * Get the current joint translation, usually in meters. + */ + PrismaticJoint.prototype.getJointTranslation = function () { + var pA = this.m_bodyA.getWorldPoint(this.m_localAnchorA); + var pB = this.m_bodyB.getWorldPoint(this.m_localAnchorB); + var d = Vec2.sub(pB, pA); + var axis = this.m_bodyA.getWorldVector(this.m_localXAxisA); + var translation = Vec2.dot(d, axis); + return translation; }; - /** - * Signatures: (image), (x, y, w, h), (w, h) + * Get the current joint translation speed, usually in meters per second. */ - Texture$1.prototype.src = function(x, y, w, h) { - if (typeof x === 'object') { - var image = x, ratio = y || 1; - - this._image = image; - this._sx = this._dx = 0; - this._sy = this._dy = 0; - this._sw = this._dw = image.width / ratio; - this._sh = this._dh = image.height / ratio; - - this.width = image.width / ratio; - this.height = image.height / ratio; - - this.ratio = ratio; - - } else { - if (typeof w === 'undefined') { - w = x, h = y; - } else { - this._sx = x, this._sy = y; - } - this._sw = this._dw = w; - this._sh = this._dh = h; - - this.width = w; - this.height = h; - } - return this; + PrismaticJoint.prototype.getJointSpeed = function () { + var bA = this.m_bodyA; + var bB = this.m_bodyB; + var rA = Rot.mulVec2(bA.m_xf.q, Vec2.sub(this.m_localAnchorA, bA.m_sweep.localCenter)); // Vec2 + var rB = Rot.mulVec2(bB.m_xf.q, Vec2.sub(this.m_localAnchorB, bB.m_sweep.localCenter)); // Vec2 + var p1 = Vec2.add(bA.m_sweep.c, rA); // Vec2 + var p2 = Vec2.add(bB.m_sweep.c, rB); // Vec2 + var d = Vec2.sub(p2, p1); // Vec2 + var axis = Rot.mulVec2(bA.m_xf.q, this.m_localXAxisA); // Vec2 + var vA = bA.m_linearVelocity; // Vec2 + var vB = bB.m_linearVelocity; // Vec2 + var wA = bA.m_angularVelocity; // float + var wB = bB.m_angularVelocity; // float + var speed = Vec2.dot(d, Vec2.crossNumVec2(wA, axis)) + + Vec2.dot(axis, Vec2.sub(Vec2.addCrossNumVec2(vB, wB, rB), Vec2.addCrossNumVec2(vA, wA, rA))); // float + return speed; }; - /** - * Signatures: (x, y, w, h), (x, y) + * Is the joint limit enabled? */ - Texture$1.prototype.dest = function(x, y, w, h) { - this._dx = x, this._dy = y; - this._dx = x, this._dy = y; - if (typeof w !== 'undefined') { - this._dw = w, this._dh = h; - this.width = w, this.height = h; - } - return this; + PrismaticJoint.prototype.isLimitEnabled = function () { + return this.m_enableLimit; }; - - Texture$1.prototype.draw = function(context, x1, y1, x2, y2, x3, y3, x4, y4) { - var image = this._image; - if (image === null || typeof image !== 'object') { - return; - } - - var sx = this._sx, sy = this._sy; - var sw = this._sw, sh = this._sh; - var dx = this._dx, dy = this._dy; - var dw = this._dw, dh = this._dh; - - if (typeof x3 !== 'undefined') { - x1 = math.limit(x1, 0, this._sw), x2 = math.limit(x2, 0, this._sw - x1); - y1 = math.limit(y1, 0, this._sh), y2 = math.limit(y2, 0, this._sh - y1); - sx += x1, sy += y1, sw = x2, sh = y2; - dx = x3, dy = y3, dw = x4, dh = y4; - - } else if (typeof x2 !== 'undefined') { - dx = x1, dy = y1, dw = x2, dh = y2; - - } else if (typeof x1 !== 'undefined') { - dw = x1, dh = y1; - } - - var ratio = this.ratio || 1; - sx *= ratio, sy *= ratio, sw *= ratio, sh *= ratio; - - try { - if (typeof image.draw === 'function') { - image.draw(context, sx, sy, sw, sh, dx, dy, dw, dh); - } else { - stats.draw++; - context.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh); - } - } catch (ex) { - if (!image._draw_failed) { - console.log('Unable to draw: ', image); - console.log(ex); - image._draw_failed = true; + /** + * Enable/disable the joint limit. + */ + PrismaticJoint.prototype.enableLimit = function (flag) { + if (flag != this.m_enableLimit) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableLimit = flag; + this.m_impulse.z = 0.0; } - } - }; - - var texture = Texture$1; - - var startsWith = function(str, sub) { - return typeof str === 'string' && typeof sub === 'string' - && str.substring(0, sub.length) == sub; }; - - var string = { - startsWith: startsWith + /** + * Get the lower joint limit, usually in meters. + */ + PrismaticJoint.prototype.getLowerLimit = function () { + return this.m_lowerTranslation; }; - - // name : atlas - var _atlases_map = {}; - // [atlas] - var _atlases_arr = []; - - // TODO: print subquery not found error - // TODO: index textures - - core.atlas = function(def) { - var atlas = is_1.fn(def.draw) ? def : new Atlas(def); - if (def.name) { - _atlases_map[def.name] = atlas; - } - _atlases_arr.push(atlas); - - deprecated(def, 'imagePath'); - deprecated(def, 'imageRatio'); - - var url = def.imagePath; - var ratio = def.imageRatio || 1; - if (is_1.string(def.image)) { - url = def.image; - } else if (is_1.hash(def.image)) { - url = def.image.src || def.image.url; - ratio = def.image.ratio || ratio; - } - url && core.preload(function(done) { - url = core.resolve(url); - var imageloader = core.config('image-loader'); - - imageloader(url, function(image) { - atlas.src(image, ratio); - done(); - - }, function(err) { - done(); - }); - }); - - return atlas; + /** + * Get the upper joint limit, usually in meters. + */ + PrismaticJoint.prototype.getUpperLimit = function () { + return this.m_upperTranslation; }; - - Atlas._super = texture; - Atlas.prototype = create(Atlas._super.prototype); - - function Atlas(def) { - Atlas._super.call(this); - - var atlas = this; - - deprecated(def, 'filter'); - deprecated(def, 'cutouts'); - deprecated(def, 'sprites'); - deprecated(def, 'factory'); - - var map = def.map || def.filter; - var ppu = def.ppu || def.ratio || 1; - var trim = def.trim || 0; - var textures = def.textures; - var factory = def.factory; - var cutouts = def.cutouts || def.sprites; - - function make(def) { - if (!def || is_1.fn(def.draw)) { - return def; - } - - def = extend({}, def); - - if (is_1.fn(map)) { - def = map(def); - } - - if (ppu != 1) { - def.x *= ppu, def.y *= ppu; - def.width *= ppu, def.height *= ppu; - def.top *= ppu, def.bottom *= ppu; - def.left *= ppu, def.right *= ppu; - } - - if (trim != 0) { - def.x += trim, def.y += trim; - def.width -= 2 * trim, def.height -= 2 * trim; - def.top -= trim, def.bottom -= trim; - def.left -= trim, def.right -= trim; - } - - var texture = atlas.pipe(); - texture.top = def.top, texture.bottom = def.bottom; - texture.left = def.left, texture.right = def.right; - texture.src(def.x, def.y, def.width, def.height); - return texture; - } - - function find(query) { - if (textures) { - if (is_1.fn(textures)) { - return textures(query); - } else if (is_1.hash(textures)) { - return textures[query]; - } - } - if (cutouts) { // deprecated - var result = null, n = 0; - for (var i = 0; i < cutouts.length; i++) { - if (string.startsWith(cutouts[i].name, query)) { - if (n === 0) { - result = cutouts[i]; - } else if (n === 1) { - result = [ result, cutouts[i] ]; - } else { - result.push(cutouts[i]); - } - n++; - } - } - if (n === 0 && is_1.fn(factory)) { - result = function(subquery) { - return factory(query + (subquery ? subquery : '')); - }; - } - return result; - } - } - - this.select = function(query) { - if (!query) { - // TODO: if `textures` is texture def, map or fn? - return new Selection(this.pipe()); - } - var found = find(query); - if (found) { - return new Selection(found, find, make); + /** + * Set the joint limits, usually in meters. + */ + PrismaticJoint.prototype.setLimits = function (lower, upper) { + if (lower != this.m_lowerTranslation || upper != this.m_upperTranslation) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_lowerTranslation = lower; + this.m_upperTranslation = upper; + this.m_impulse.z = 0.0; } - }; - - } - var nfTexture = new texture(); - nfTexture.x = nfTexture.y = nfTexture.width = nfTexture.height = 0; - nfTexture.pipe = nfTexture.src = nfTexture.dest = function() { - return this; }; - nfTexture.draw = function() { + /** + * Is the joint motor enabled? + */ + PrismaticJoint.prototype.isMotorEnabled = function () { + return this.m_enableMotor; }; - - var nfSelection = new Selection(nfTexture); - - function Selection(result, find, make) { - function link(result, subquery) { - if (!result) { - return nfTexture; - - } else if (is_1.fn(result.draw)) { - return result; - - } else if (is_1.hash(result) && is_1.number(result.width) - && is_1.number(result.height) && is_1.fn(make)) { - return make(result); - - } else if (is_1.hash(result) && is_1.defined(subquery)) { - return link(result[subquery]); - - } else if (is_1.fn(result)) { - return link(result(subquery)); - - } else if (is_1.array(result)) { - return link(result[0]); - - } else if (is_1.string(result) && is_1.fn(find)) { - return link(find(result)); - } - } - - this.one = function(subquery) { - return link(result, subquery); - }; - - this.array = function(arr) { - var array = is_1.array(arr) ? arr : []; - if (is_1.array(result)) { - for (var i = 0; i < result.length; i++) { - array[i] = link(result[i]); - } - } else { - array[0] = link(result); - } - return array; - }; - } - - core.texture = function(query) { - if (!is_1.string(query)) { - return new Selection(query); - } - - var result = null, atlas, i; - - if ((i = query.indexOf(':')) > 0 && query.length > i + 1) { - atlas = _atlases_map[query.slice(0, i)]; - result = atlas && atlas.select(query.slice(i + 1)); - } - - if (!result && (atlas = _atlases_map[query])) { - result = atlas.select(); - } - - for (i = 0; !result && i < _atlases_arr.length; i++) { - result = _atlases_arr[i].select(query); - } - - if (!result) { - console.error('Texture not found: ' + query); - result = nfSelection; - } - - return result; + /** + * Enable/disable the joint motor. + */ + PrismaticJoint.prototype.enableMotor = function (flag) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableMotor = flag; }; - - function deprecated(hash, name, msg) { - if (name in hash) - console.log(msg ? msg.replace('%name', name) : '\'' + name - + '\' field of texture atlas is deprecated.'); - } - - var iid$1 = 0; - - // TODO: do not clear next/prev/parent on remove - - core.prototype._label = ''; - - core.prototype._visible = true; - - core.prototype._parent = null; - core.prototype._next = null; - core.prototype._prev = null; - - core.prototype._first = null; - core.prototype._last = null; - - core.prototype._attrs = null; - core.prototype._flags = null; - - core.prototype.toString = function() { - return '[' + this._label + ']'; + /** + * Set the motor speed, usually in meters per second. + */ + PrismaticJoint.prototype.setMotorSpeed = function (speed) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_motorSpeed = speed; }; - /** - * @deprecated Use label() + * Set the maximum motor force, usually in N. */ - core.prototype.id = function(id) { - return this.label(id); + PrismaticJoint.prototype.setMaxMotorForce = function (force) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_maxMotorForce = force; }; - - core.prototype.label = function(label) { - if (typeof label === 'undefined') { - return this._label; - } - this._label = label; - return this; + PrismaticJoint.prototype.getMaxMotorForce = function () { + return this.m_maxMotorForce; }; - - core.prototype.attr = function(name, value) { - if (typeof value === 'undefined') { - return this._attrs !== null ? this._attrs[name] : undefined; - } - (this._attrs !== null ? this._attrs : this._attrs = {})[name] = value; - return this; + /** + * Get the motor speed, usually in meters per second. + */ + PrismaticJoint.prototype.getMotorSpeed = function () { + return this.m_motorSpeed; }; - - core.prototype.visible = function(visible) { - if (typeof visible === 'undefined') { - return this._visible; - } - this._visible = visible; - this._parent && (this._parent._ts_children = ++iid$1); - this._ts_pin = ++iid$1; - this.touch(); - return this; + /** + * Get the current motor force given the inverse time step, usually in N. + */ + PrismaticJoint.prototype.getMotorForce = function (inv_dt) { + return inv_dt * this.m_motorImpulse; }; - - core.prototype.hide = function() { - return this.visible(false); + /** + * Get the anchor point on bodyA in world coordinates. + */ + PrismaticJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); }; - - core.prototype.show = function() { - return this.visible(true); + /** + * Get the anchor point on bodyB in world coordinates. + */ + PrismaticJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); }; - - core.prototype.parent = function() { - return this._parent; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + PrismaticJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + this.m_impulse.z, this.m_axis).mul(inv_dt); }; - - core.prototype.next = function(visible) { - var next = this._next; - while (next && visible && !next._visible) { - next = next._next; - } - return next; + /** + * Get the reaction torque on bodyB in N*m. + */ + PrismaticJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_impulse.y; }; - - core.prototype.prev = function(visible) { - var prev = this._prev; - while (prev && visible && !prev._visible) { - prev = prev._prev; - } - return prev; + PrismaticJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + // Compute the effective masses. + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + var d = Vec2.zero(); + d.addCombine(1, cB, 1, rB); + d.subCombine(1, cA, 1, rA); + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + // Compute motor Jacobian and effective mass. + { + this.m_axis = Rot.mulVec2(qA, this.m_localXAxisA); + this.m_a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_axis); + this.m_a2 = Vec2.crossVec2Vec2(rB, this.m_axis); + this.m_motorMass = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 + * this.m_a2; + if (this.m_motorMass > 0.0) { + this.m_motorMass = 1.0 / this.m_motorMass; + } + } + // Prismatic constraint. + { + this.m_perp = Rot.mulVec2(qA, this.m_localYAxisA); + this.m_s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_perp); + this.m_s2 = Vec2.crossVec2Vec2(rB, this.m_perp); + Vec2.crossVec2Vec2(rA, this.m_perp); + var k11 = mA + mB + iA * this.m_s1 * this.m_s1 + iB * this.m_s2 * this.m_s2; + var k12 = iA * this.m_s1 + iB * this.m_s2; + var k13 = iA * this.m_s1 * this.m_a1 + iB * this.m_s2 * this.m_a2; + var k22 = iA + iB; + if (k22 == 0.0) { + // For bodies with fixed rotation. + k22 = 1.0; + } + var k23 = iA * this.m_a1 + iB * this.m_a2; + var k33 = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 * this.m_a2; + this.m_K.ex.set(k11, k12, k13); + this.m_K.ey.set(k12, k22, k23); + this.m_K.ez.set(k13, k23, k33); + } + // Compute motor and limit terms. + if (this.m_enableLimit) { + var jointTranslation = Vec2.dot(this.m_axis, d); // float + if (math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * Settings.linearSlop) { + this.m_limitState = equalLimits; + } + else if (jointTranslation <= this.m_lowerTranslation) { + if (this.m_limitState != atLowerLimit) { + this.m_limitState = atLowerLimit; + this.m_impulse.z = 0.0; + } + } + else if (jointTranslation >= this.m_upperTranslation) { + if (this.m_limitState != atUpperLimit$1) { + this.m_limitState = atUpperLimit$1; + this.m_impulse.z = 0.0; + } + } + else { + this.m_limitState = inactiveLimit$1; + this.m_impulse.z = 0.0; + } + } + else { + this.m_limitState = inactiveLimit$1; + this.m_impulse.z = 0.0; + } + if (this.m_enableMotor == false) { + this.m_motorImpulse = 0.0; + } + if (step.warmStarting) { + // Account for variable time step. + this.m_impulse.mul(step.dtRatio); + this.m_motorImpulse *= step.dtRatio; + var P = Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + + this.m_impulse.z, this.m_axis); + var LA = this.m_impulse.x * this.m_s1 + this.m_impulse.y + + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1; + var LB = this.m_impulse.x * this.m_s2 + this.m_impulse.y + + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2; + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + else { + this.m_impulse.setZero(); + this.m_motorImpulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; }; - - core.prototype.first = function(visible) { - var next = this._first; - while (next && visible && !next._visible) { - next = next._next; - } - return next; + PrismaticJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + // Solve linear motor constraint. + if (this.m_enableMotor && this.m_limitState != equalLimits) { + var Cdot = Vec2.dot(this.m_axis, Vec2.sub(vB, vA)) + this.m_a2 * wB + - this.m_a1 * wA; + var impulse = this.m_motorMass * (this.m_motorSpeed - Cdot); + var oldImpulse = this.m_motorImpulse; + var maxImpulse = step.dt * this.m_maxMotorForce; + this.m_motorImpulse = math.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_motorImpulse - oldImpulse; + var P = Vec2.mulNumVec2(impulse, this.m_axis); + var LA = impulse * this.m_a1; + var LB = impulse * this.m_a2; + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + var Cdot1 = Vec2.zero(); + Cdot1.x += Vec2.dot(this.m_perp, vB) + this.m_s2 * wB; + Cdot1.x -= Vec2.dot(this.m_perp, vA) + this.m_s1 * wA; + Cdot1.y = wB - wA; + if (this.m_enableLimit && this.m_limitState != inactiveLimit$1) { + // Solve prismatic and limit constraint in block form. + var Cdot2 = 0; + Cdot2 += Vec2.dot(this.m_axis, vB) + this.m_a2 * wB; + Cdot2 -= Vec2.dot(this.m_axis, vA) + this.m_a1 * wA; + var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); + var f1 = Vec3.clone(this.m_impulse); + var df = this.m_K.solve33(Vec3.neg(Cdot)); // Vec3 + this.m_impulse.add(df); + if (this.m_limitState == atLowerLimit) { + this.m_impulse.z = math.max(this.m_impulse.z, 0.0); + } + else if (this.m_limitState == atUpperLimit$1) { + this.m_impulse.z = math.min(this.m_impulse.z, 0.0); + } + // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + + // f1(1:2) + var b = Vec2.combine(-1, Cdot1, -(this.m_impulse.z - f1.z), Vec2.neo(this.m_K.ez.x, this.m_K.ez.y)); // Vec2 + var f2r = Vec2.add(this.m_K.solve22(b), Vec2.neo(f1.x, f1.y)); // Vec2 + this.m_impulse.x = f2r.x; + this.m_impulse.y = f2r.y; + df = Vec3.sub(this.m_impulse, f1); + var P = Vec2.combine(df.x, this.m_perp, df.z, this.m_axis); // Vec2 + var LA = df.x * this.m_s1 + df.y + df.z * this.m_a1; // float + var LB = df.x * this.m_s2 + df.y + df.z * this.m_a2; // float + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + else { + // Limit is inactive, just solve the prismatic constraint in block form. + var df = this.m_K.solve22(Vec2.neg(Cdot1)); // Vec2 + this.m_impulse.x += df.x; + this.m_impulse.y += df.y; + var P = Vec2.mulNumVec2(df.x, this.m_perp); // Vec2 + var LA = df.x * this.m_s1 + df.y; // float + var LB = df.x * this.m_s2 + df.y; // float + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; }; - - core.prototype.last = function(visible) { - var prev = this._last; - while (prev && visible && !prev._visible) { - prev = prev._prev; - } - return prev; + /** + * This returns true if the position errors are within tolerance. + */ + PrismaticJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + // Compute fresh Jacobians + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2 + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2 + var d = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); // Vec2 + var axis = Rot.mulVec2(qA, this.m_localXAxisA); // Vec2 + var a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), axis); // float + var a2 = Vec2.crossVec2Vec2(rB, axis); // float + var perp = Rot.mulVec2(qA, this.m_localYAxisA); // Vec2 + var s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), perp); // float + var s2 = Vec2.crossVec2Vec2(rB, perp); // float + var impulse = new Vec3(); + var C1 = Vec2.zero(); // Vec2 + C1.x = Vec2.dot(perp, d); + C1.y = aB - aA - this.m_referenceAngle; + var linearError = math.abs(C1.x); // float + var angularError = math.abs(C1.y); // float + var linearSlop = Settings.linearSlop; + var maxLinearCorrection = Settings.maxLinearCorrection; + var active = false; // bool + var C2 = 0.0; // float + if (this.m_enableLimit) { + var translation = Vec2.dot(axis, d); // float + if (math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * linearSlop) { + // Prevent large angular corrections + C2 = math.clamp(translation, -maxLinearCorrection, maxLinearCorrection); + linearError = math.max(linearError, math.abs(translation)); + active = true; + } + else if (translation <= this.m_lowerTranslation) { + // Prevent large linear corrections and allow some slop. + C2 = math.clamp(translation - this.m_lowerTranslation + linearSlop, -maxLinearCorrection, 0.0); + linearError = math + .max(linearError, this.m_lowerTranslation - translation); + active = true; + } + else if (translation >= this.m_upperTranslation) { + // Prevent large linear corrections and allow some slop. + C2 = math.clamp(translation - this.m_upperTranslation - linearSlop, 0.0, maxLinearCorrection); + linearError = math + .max(linearError, translation - this.m_upperTranslation); + active = true; + } + } + if (active) { + var k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float + var k12 = iA * s1 + iB * s2; // float + var k13 = iA * s1 * a1 + iB * s2 * a2; // float + var k22 = iA + iB; // float + if (k22 == 0.0) { + // For fixed rotation + k22 = 1.0; + } + var k23 = iA * a1 + iB * a2; // float + var k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; // float + var K = new Mat33(); + K.ex.set(k11, k12, k13); + K.ey.set(k12, k22, k23); + K.ez.set(k13, k23, k33); + var C = new Vec3(); + C.x = C1.x; + C.y = C1.y; + C.z = C2; + impulse = K.solve33(Vec3.neg(C)); + } + else { + var k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float + var k12 = iA * s1 + iB * s2; // float + var k22 = iA + iB; // float + if (k22 == 0.0) { + k22 = 1.0; + } + var K = new Mat22(); + K.ex.setNum(k11, k12); + K.ey.setNum(k12, k22); + var impulse1 = K.solve(Vec2.neg(C1)); // Vec2 + impulse.x = impulse1.x; + impulse.y = impulse1.y; + impulse.z = 0.0; + } + var P = Vec2.combine(impulse.x, perp, impulse.z, axis); // Vec2 + var LA = impulse.x * s1 + impulse.y + impulse.z * a1; // float + var LB = impulse.x * s2 + impulse.y + impulse.z * a2; // float + cA.subMul(mA, P); + aA -= iA * LA; + cB.addMul(mB, P); + aB += iB * LB; + this.m_bodyA.c_position.c = cA; + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c = cB; + this.m_bodyB.c_position.a = aB; + return linearError <= Settings.linearSlop + && angularError <= Settings.angularSlop; }; - - core.prototype.visit = function(visitor, data) { - var reverse = visitor.reverse; - var visible = visitor.visible; - if (visitor.start && visitor.start(this, data)) { - return; - } - var child, next = reverse ? this.last(visible) : this.first(visible); - while (child = next) { - next = reverse ? child.prev(visible) : child.next(visible); - if (child.visit(visitor, data)) { - return true; + PrismaticJoint.TYPE = 'prismatic-joint'; + return PrismaticJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$6 = { + ratio: 1.0 +}; +/** + * A gear joint is used to connect two joints together. Either joint can be a + * revolute or prismatic joint. You specify a gear ratio to bind the motions + * together: coordinate1 + ratio * coordinate2 = constant + * + * The ratio can be negative or positive. If one joint is a revolute joint and + * the other joint is a prismatic joint, then the ratio will have units of + * length or units of 1/length. Warning: You have to manually destroy the gear + * joint if joint1 or joint2 is destroyed. + * + * This definition requires two existing revolute or prismatic joints (any + * combination will work). + */ +var GearJoint = /** @class */ (function (_super) { + __extends(GearJoint, _super); + function GearJoint(def, bodyA, bodyB, joint1, joint2, ratio) { + var _this = this; + // @ts-ignore + if (!(_this instanceof GearJoint)) { + return new GearJoint(def, bodyA, bodyB, joint1, joint2, ratio); } - } - return visitor.end && visitor.end(this, data); + def = options(def, DEFAULTS$6); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = GearJoint.TYPE; + _this.m_joint1 = joint1 ? joint1 : def.joint1; + _this.m_joint2 = joint2 ? joint2 : def.joint2; + _this.m_ratio = math.isFinite(ratio) ? ratio : def.ratio; + _this.m_type1 = _this.m_joint1.getType(); + _this.m_type2 = _this.m_joint2.getType(); + // joint1 connects body A to body C + // joint2 connects body B to body D + var coordinateA; + var coordinateB; + // TODO_ERIN there might be some problem with the joint edges in Joint. + _this.m_bodyC = _this.m_joint1.getBodyA(); + _this.m_bodyA = _this.m_joint1.getBodyB(); + // Get geometry of joint1 + var xfA = _this.m_bodyA.m_xf; + var aA = _this.m_bodyA.m_sweep.a; + var xfC = _this.m_bodyC.m_xf; + var aC = _this.m_bodyC.m_sweep.a; + if (_this.m_type1 === RevoluteJoint.TYPE) { + var revolute = _this.m_joint1; + _this.m_localAnchorC = revolute.m_localAnchorA; + _this.m_localAnchorA = revolute.m_localAnchorB; + _this.m_referenceAngleA = revolute.m_referenceAngle; + _this.m_localAxisC = Vec2.zero(); + coordinateA = aA - aC - _this.m_referenceAngleA; + } + else { + var prismatic = _this.m_joint1; + _this.m_localAnchorC = prismatic.m_localAnchorA; + _this.m_localAnchorA = prismatic.m_localAnchorB; + _this.m_referenceAngleA = prismatic.m_referenceAngle; + _this.m_localAxisC = prismatic.m_localXAxisA; + var pC = _this.m_localAnchorC; + var pA = Rot.mulTVec2(xfC.q, Vec2.add(Rot.mulVec2(xfA.q, _this.m_localAnchorA), Vec2.sub(xfA.p, xfC.p))); + coordinateA = Vec2.dot(pA, _this.m_localAxisC) - Vec2.dot(pC, _this.m_localAxisC); + } + _this.m_bodyD = _this.m_joint2.getBodyA(); + _this.m_bodyB = _this.m_joint2.getBodyB(); + // Get geometry of joint2 + var xfB = _this.m_bodyB.m_xf; + var aB = _this.m_bodyB.m_sweep.a; + var xfD = _this.m_bodyD.m_xf; + var aD = _this.m_bodyD.m_sweep.a; + if (_this.m_type2 === RevoluteJoint.TYPE) { + var revolute = _this.m_joint2; + _this.m_localAnchorD = revolute.m_localAnchorA; + _this.m_localAnchorB = revolute.m_localAnchorB; + _this.m_referenceAngleB = revolute.m_referenceAngle; + _this.m_localAxisD = Vec2.zero(); + coordinateB = aB - aD - _this.m_referenceAngleB; + } + else { + var prismatic = _this.m_joint2; + _this.m_localAnchorD = prismatic.m_localAnchorA; + _this.m_localAnchorB = prismatic.m_localAnchorB; + _this.m_referenceAngleB = prismatic.m_referenceAngle; + _this.m_localAxisD = prismatic.m_localXAxisA; + var pD = _this.m_localAnchorD; + var pB = Rot.mulTVec2(xfD.q, Vec2.add(Rot.mulVec2(xfB.q, _this.m_localAnchorB), Vec2.sub(xfB.p, xfD.p))); + coordinateB = Vec2.dot(pB, _this.m_localAxisD) - Vec2.dot(pD, _this.m_localAxisD); + } + _this.m_constant = coordinateA + _this.m_ratio * coordinateB; + _this.m_impulse = 0.0; + return _this; + // Gear Joint: + // C0 = (coordinate1 + ratio * coordinate2)_initial + // C = (coordinate1 + ratio * coordinate2) - C0 = 0 + // J = [J1 ratio * J2] + // K = J * invM * JT + // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T + // + // Revolute: + // coordinate = rotation + // Cdot = angularVelocity + // J = [0 0 1] + // K = J * invM * JT = invI + // + // Prismatic: + // coordinate = dot(p - pg, ug) + // Cdot = dot(v + cross(w, r), ug) + // J = [ug cross(r, ug)] + // K = J * invM * JT = invMass + invI * cross(r, ug)^2 + } + /** @internal */ + GearJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + joint1: this.m_joint1, + joint2: this.m_joint2, + ratio: this.m_ratio, + // _constant: this.m_constant, + }; }; - - core.prototype.append = function(child, more) { - if (is_1.array(child)) - for (var i = 0; i < child.length; i++) - append(this, child[i]); - - else if (typeof more !== 'undefined') // deprecated - for (var i = 0; i < arguments.length; i++) - append(this, arguments[i]); - - else if (typeof child !== 'undefined') - append(this, child); - - return this; + /** @internal */ + GearJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + data.joint1 = restore(Joint, data.joint1, world); + data.joint2 = restore(Joint, data.joint2, world); + var joint = new GearJoint(data); + // if (data._constant) joint.m_constant = data._constant; + return joint; + }; + /** + * Get the first joint. + */ + GearJoint.prototype.getJoint1 = function () { + return this.m_joint1; }; - - core.prototype.prepend = function(child, more) { - if (is_1.array(child)) - for (var i = child.length - 1; i >= 0; i--) - prepend(this, child[i]); - - else if (typeof more !== 'undefined') // deprecated - for (var i = arguments.length - 1; i >= 0; i--) - prepend(this, arguments[i]); - - else if (typeof child !== 'undefined') - prepend(this, child); - - return this; + /** + * Get the second joint. + */ + GearJoint.prototype.getJoint2 = function () { + return this.m_joint2; }; - - core.prototype.appendTo = function(parent) { - append(parent, this); - return this; + /** + * Set the gear ratio. + */ + GearJoint.prototype.setRatio = function (ratio) { + this.m_ratio = ratio; }; - - core.prototype.prependTo = function(parent) { - prepend(parent, this); - return this; + /** + * Get the gear ratio. + */ + GearJoint.prototype.getRatio = function () { + return this.m_ratio; }; - - core.prototype.insertNext = function(sibling, more) { - if (is_1.array(sibling)) - for (var i = 0; i < sibling.length; i++) - insertAfter(sibling[i], this); - - else if (typeof more !== 'undefined') // deprecated - for (var i = 0; i < arguments.length; i++) - insertAfter(arguments[i], this); - - else if (typeof sibling !== 'undefined') - insertAfter(sibling, this); - - return this; + /** + * Get the anchor point on bodyA in world coordinates. + */ + GearJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); }; - - core.prototype.insertPrev = function(sibling, more) { - if (is_1.array(sibling)) - for (var i = sibling.length - 1; i >= 0; i--) - insertBefore(sibling[i], this); - - else if (typeof more !== 'undefined') // deprecated - for (var i = arguments.length - 1; i >= 0; i--) - insertBefore(arguments[i], this); - - else if (typeof sibling !== 'undefined') - insertBefore(sibling, this); - - return this; + /** + * Get the anchor point on bodyB in world coordinates. + */ + GearJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); }; - - core.prototype.insertAfter = function(prev) { - insertAfter(this, prev); - return this; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + GearJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(this.m_impulse, this.m_JvAC).mul(inv_dt); }; - - core.prototype.insertBefore = function(next) { - insertBefore(this, next); - return this; + /** + * Get the reaction torque on bodyB in N*m. + */ + GearJoint.prototype.getReactionTorque = function (inv_dt) { + var L = this.m_impulse * this.m_JwA; // float + return inv_dt * L; }; - - function append(parent, child) { - _ensure(child); - _ensure(parent); - - child.remove(); - - if (parent._last) { - parent._last._next = child; - child._prev = parent._last; - } - - child._parent = parent; - parent._last = child; - - if (!parent._first) { - parent._first = child; - } - - child._parent._flag(child, true); - - child._ts_parent = ++iid$1; - parent._ts_children = ++iid$1; - parent.touch(); - } - - function prepend(parent, child) { - _ensure(child); - _ensure(parent); - - child.remove(); - - if (parent._first) { - parent._first._prev = child; - child._next = parent._first; - } - - child._parent = parent; - parent._first = child; - - if (!parent._last) { - parent._last = child; - } - - child._parent._flag(child, true); - - child._ts_parent = ++iid$1; - parent._ts_children = ++iid$1; - parent.touch(); - } - function insertBefore(self, next) { - _ensure(self); - _ensure(next); - - self.remove(); - - var parent = next._parent; - var prev = next._prev; - - next._prev = self; - prev && (prev._next = self) || parent && (parent._first = self); - - self._parent = parent; - self._prev = prev; - self._next = next; - - self._parent._flag(self, true); - - self._ts_parent = ++iid$1; - self.touch(); - } - function insertAfter(self, prev) { - _ensure(self); - _ensure(prev); - - self.remove(); - - var parent = prev._parent; - var next = prev._next; - - prev._next = self; - next && (next._prev = self) || parent && (parent._last = self); - - self._parent = parent; - self._prev = prev; - self._next = next; - - self._parent._flag(self, true); - - self._ts_parent = ++iid$1; - self.touch(); - } - core.prototype.remove = function(child, more) { - if (typeof child !== 'undefined') { - if (is_1.array(child)) { - for (var i = 0; i < child.length; i++) - _ensure(child[i]).remove(); - - } else if (typeof more !== 'undefined') { - for (var i = 0; i < arguments.length; i++) - _ensure(arguments[i]).remove(); - - } else { - _ensure(child).remove(); + GearJoint.prototype.initVelocityConstraints = function (step) { + this.m_lcA = this.m_bodyA.m_sweep.localCenter; + this.m_lcB = this.m_bodyB.m_sweep.localCenter; + this.m_lcC = this.m_bodyC.m_sweep.localCenter; + this.m_lcD = this.m_bodyD.m_sweep.localCenter; + this.m_mA = this.m_bodyA.m_invMass; + this.m_mB = this.m_bodyB.m_invMass; + this.m_mC = this.m_bodyC.m_invMass; + this.m_mD = this.m_bodyD.m_invMass; + this.m_iA = this.m_bodyA.m_invI; + this.m_iB = this.m_bodyB.m_invI; + this.m_iC = this.m_bodyC.m_invI; + this.m_iD = this.m_bodyD.m_invI; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var aC = this.m_bodyC.c_position.a; + var vC = this.m_bodyC.c_velocity.v; + var wC = this.m_bodyC.c_velocity.w; + var aD = this.m_bodyD.c_position.a; + var vD = this.m_bodyD.c_velocity.v; + var wD = this.m_bodyD.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var qC = Rot.neo(aC); + var qD = Rot.neo(aD); + this.m_mass = 0.0; + if (this.m_type1 == RevoluteJoint.TYPE) { + this.m_JvAC = Vec2.zero(); + this.m_JwA = 1.0; + this.m_JwC = 1.0; + this.m_mass += this.m_iA + this.m_iC; } - return this; - } - - if (this._prev) { - this._prev._next = this._next; - } - if (this._next) { - this._next._prev = this._prev; - } - - if (this._parent) { - if (this._parent._first === this) { - this._parent._first = this._next; + else { + var u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2 + var rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2 + var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2 + this.m_JvAC = u; + this.m_JwC = Vec2.crossVec2Vec2(rC, u); + this.m_JwA = Vec2.crossVec2Vec2(rA, u); + this.m_mass += this.m_mC + this.m_mA + this.m_iC * this.m_JwC * this.m_JwC + this.m_iA * this.m_JwA * this.m_JwA; } - if (this._parent._last === this) { - this._parent._last = this._prev; + if (this.m_type2 == RevoluteJoint.TYPE) { + this.m_JvBD = Vec2.zero(); + this.m_JwB = this.m_ratio; + this.m_JwD = this.m_ratio; + this.m_mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD); } - - this._parent._flag(this, false); - - this._parent._ts_children = ++iid$1; - this._parent.touch(); - } - - this._prev = this._next = this._parent = null; - this._ts_parent = ++iid$1; - // this._parent.touch(); - - return this; - }; - - core.prototype.empty = function() { - var child, next = this._first; - while (child = next) { - next = child._next; - child._prev = child._next = child._parent = null; - - this._flag(child, false); - } - - this._first = this._last = null; - - this._ts_children = ++iid$1; - this.touch(); - return this; + else { + var u = Rot.mulVec2(qD, this.m_localAxisD); // Vec2 + var rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); // Vec2 + var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); // Vec2 + this.m_JvBD = Vec2.mulNumVec2(this.m_ratio, u); + this.m_JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u); + this.m_JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u); + this.m_mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD * this.m_JwD * this.m_JwD + this.m_iB * this.m_JwB * this.m_JwB; + } + // Compute effective mass. + this.m_mass = this.m_mass > 0.0 ? 1.0 / this.m_mass : 0.0; + if (step.warmStarting) { + vA.addMul(this.m_mA * this.m_impulse, this.m_JvAC); + wA += this.m_iA * this.m_impulse * this.m_JwA; + vB.addMul(this.m_mB * this.m_impulse, this.m_JvBD); + wB += this.m_iB * this.m_impulse * this.m_JwB; + vC.subMul(this.m_mC * this.m_impulse, this.m_JvAC); + wC -= this.m_iC * this.m_impulse * this.m_JwC; + vD.subMul(this.m_mD * this.m_impulse, this.m_JvBD); + wD -= this.m_iD * this.m_impulse * this.m_JwD; + } + else { + this.m_impulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + this.m_bodyC.c_velocity.v.setVec2(vC); + this.m_bodyC.c_velocity.w = wC; + this.m_bodyD.c_velocity.v.setVec2(vD); + this.m_bodyD.c_velocity.w = wD; }; - - core.prototype.touch = function() { - this._ts_touch = ++iid$1; - this._parent && this._parent.touch(); - return this; + GearJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var vC = this.m_bodyC.c_velocity.v; + var wC = this.m_bodyC.c_velocity.w; + var vD = this.m_bodyD.c_velocity.v; + var wD = this.m_bodyD.c_velocity.w; + var Cdot = Vec2.dot(this.m_JvAC, vA) - Vec2.dot(this.m_JvAC, vC) + + Vec2.dot(this.m_JvBD, vB) - Vec2.dot(this.m_JvBD, vD); // float + Cdot += (this.m_JwA * wA - this.m_JwC * wC) + + (this.m_JwB * wB - this.m_JwD * wD); + var impulse = -this.m_mass * Cdot; // float + this.m_impulse += impulse; + vA.addMul(this.m_mA * impulse, this.m_JvAC); + wA += this.m_iA * impulse * this.m_JwA; + vB.addMul(this.m_mB * impulse, this.m_JvBD); + wB += this.m_iB * impulse * this.m_JwB; + vC.subMul(this.m_mC * impulse, this.m_JvAC); + wC -= this.m_iC * impulse * this.m_JwC; + vD.subMul(this.m_mD * impulse, this.m_JvBD); + wD -= this.m_iD * impulse * this.m_JwD; + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + this.m_bodyC.c_velocity.v.setVec2(vC); + this.m_bodyC.c_velocity.w = wC; + this.m_bodyD.c_velocity.v.setVec2(vD); + this.m_bodyD.c_velocity.w = wD; }; - /** - * Deep flags used for optimizing event distribution. + * This returns true if the position errors are within tolerance. */ - core.prototype._flag = function(obj, name) { - if (typeof name === 'undefined') { - return this._flags !== null && this._flags[obj] || 0; - } - if (typeof obj === 'string') { - if (name) { - this._flags = this._flags || {}; - if (!this._flags[obj] && this._parent) { - this._parent._flag(obj, true); - } - this._flags[obj] = (this._flags[obj] || 0) + 1; - - } else if (this._flags && this._flags[obj] > 0) { - if (this._flags[obj] == 1 && this._parent) { - this._parent._flag(obj, false); - } - this._flags[obj] = this._flags[obj] - 1; + GearJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var cC = this.m_bodyC.c_position.c; + var aC = this.m_bodyC.c_position.a; + var cD = this.m_bodyD.c_position.c; + var aD = this.m_bodyD.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var qC = Rot.neo(aC); + var qD = Rot.neo(aD); + var linearError = 0.0; + var coordinateA; + var coordinateB; + var JvAC; + var JvBD; + var JwA; + var JwB; + var JwC; + var JwD; + var mass = 0.0; + if (this.m_type1 == RevoluteJoint.TYPE) { + JvAC = Vec2.zero(); + JwA = 1.0; + JwC = 1.0; + mass += this.m_iA + this.m_iC; + coordinateA = aA - aC - this.m_referenceAngleA; } - } - if (typeof obj === 'object') { - if (obj._flags) { - for ( var type in obj._flags) { - if (obj._flags[type] > 0) { - this._flag(type, name); - } - } + else { + var u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2 + var rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2 + var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2 + JvAC = u; + JwC = Vec2.crossVec2Vec2(rC, u); + JwA = Vec2.crossVec2Vec2(rA, u); + mass += this.m_mC + this.m_mA + this.m_iC * JwC * JwC + this.m_iA * JwA * JwA; + var pC = Vec2.sub(this.m_localAnchorC, this.m_lcC); // Vec2 + var pA = Rot.mulTVec2(qC, Vec2.add(rA, Vec2.sub(cA, cC))); // Vec2 + coordinateA = Vec2.dot(Vec2.sub(pA, pC), this.m_localAxisC); } - } - return this; - }; - - /** - * @private - */ - core.prototype.hitTest = function(hit) { - var width = this._pin._width; - var height = this._pin._height; - return hit.x >= 0 && hit.x <= width && hit.y >= 0 && hit.y <= height; - }; - - function _ensure(obj) { - if (obj && obj instanceof core) { - return obj; - } - throw 'Invalid node: ' + obj; - } - - var event = function(prototype, callback) { - - prototype._listeners = null; - - prototype.on = prototype.listen = function(types, listener) { - if (!types || !types.length || typeof listener !== 'function') { - return this; - } - if (this._listeners === null) { - this._listeners = {}; - } - var isarray = typeof types !== 'string' && typeof types.join === 'function'; - if (types = (isarray ? types.join(' ') : types).match(/\S+/g)) { - for (var i = 0; i < types.length; i++) { - var type = types[i]; - this._listeners[type] = this._listeners[type] || []; - this._listeners[type].push(listener); - if (typeof callback === 'function') { - callback(this, type, true); - } - } + if (this.m_type2 == RevoluteJoint.TYPE) { + JvBD = Vec2.zero(); + JwB = this.m_ratio; + JwD = this.m_ratio; + mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD); + coordinateB = aB - aD - this.m_referenceAngleB; } - return this; - }; - - prototype.off = function(types, listener) { - if (!types || !types.length || typeof listener !== 'function') { - return this; - } - if (this._listeners === null) { - return this; - } - var isarray = typeof types !== 'string' && typeof types.join === 'function'; - if (types = (isarray ? types.join(' ') : types).match(/\S+/g)) { - for (var i = 0; i < types.length; i++) { - var type = types[i], all = this._listeners[type], index; - if (all && (index = all.indexOf(listener)) >= 0) { - all.splice(index, 1); - if (!all.length) { - delete this._listeners[type]; - } - if (typeof callback === 'function') { - callback(this, type, false); - } - } - } + else { + var u = Rot.mulVec2(qD, this.m_localAxisD); + var rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); + var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); + JvBD = Vec2.mulNumVec2(this.m_ratio, u); + JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u); + JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u); + mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD + * JwD * JwD + this.m_iB * JwB * JwB; + var pD = Vec2.sub(this.m_localAnchorD, this.m_lcD); // Vec2 + var pB = Rot.mulTVec2(qD, Vec2.add(rB, Vec2.sub(cB, cD))); // Vec2 + coordinateB = Vec2.dot(pB, this.m_localAxisD) + - Vec2.dot(pD, this.m_localAxisD); } - return this; - }; - - prototype.listeners = function(type) { - return this._listeners && this._listeners[type]; - }; - - prototype.publish = function(name, args) { - var listeners = this.listeners(name); - if (!listeners || !listeners.length) { - return 0; + var C = (coordinateA + this.m_ratio * coordinateB) - this.m_constant; // float + var impulse = 0.0; // float + if (mass > 0.0) { + impulse = -C / mass; } - for (var l = 0; l < listeners.length; l++) { - listeners[l].apply(this, args); + cA.addMul(this.m_mA * impulse, JvAC); + aA += this.m_iA * impulse * JwA; + cB.addMul(this.m_mB * impulse, JvBD); + aB += this.m_iB * impulse * JwB; + cC.subMul(this.m_mC * impulse, JvAC); + aC -= this.m_iC * impulse * JwC; + cD.subMul(this.m_mD * impulse, JvBD); + aD -= this.m_iD * impulse * JwD; + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + this.m_bodyC.c_position.c.setVec2(cC); + this.m_bodyC.c_position.a = aC; + this.m_bodyD.c_position.c.setVec2(cD); + this.m_bodyD.c_position.a = aD; + // TODO_ERIN not implemented + return linearError < Settings.linearSlop; + }; + GearJoint.TYPE = 'gear-joint'; + return GearJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$5 = { + maxForce: 1.0, + maxTorque: 1.0, + correctionFactor: 0.3 +}; +/** + * A motor joint is used to control the relative motion between two bodies. A + * typical usage is to control the movement of a dynamic body with respect to + * the ground. + */ +var MotorJoint = /** @class */ (function (_super) { + __extends(MotorJoint, _super); + function MotorJoint(def, bodyA, bodyB) { + var _this = this; + // @ts-ignore + if (!(_this instanceof MotorJoint)) { + return new MotorJoint(def, bodyA, bodyB); } - return listeners.length; - }; - - prototype.trigger = function(name, args) { - this.publish(name, args); - return this; - }; - + def = options(def, DEFAULTS$5); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = MotorJoint.TYPE; + _this.m_linearOffset = math.isFinite(def.linearOffset) ? def.linearOffset : bodyA.getLocalPoint(bodyB.getPosition()); + _this.m_angularOffset = math.isFinite(def.angularOffset) ? def.angularOffset : bodyB.getAngle() - bodyA.getAngle(); + _this.m_linearImpulse = Vec2.zero(); + _this.m_angularImpulse = 0.0; + _this.m_maxForce = def.maxForce; + _this.m_maxTorque = def.maxTorque; + _this.m_correctionFactor = def.correctionFactor; + return _this; + // Point-to-point constraint + // Cdot = v2 - v1 + // = v2 + cross(w2, r2) - v1 - cross(w1, r1) + // J = [-I -r1_skew I r2_skew ] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + // Angle constraint + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // K = invI1 + invI2 + } + /** @internal */ + MotorJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + maxForce: this.m_maxForce, + maxTorque: this.m_maxTorque, + correctionFactor: this.m_correctionFactor, + linearOffset: this.m_linearOffset, + angularOffset: this.m_angularOffset, + }; }; - - event(core.prototype, function(obj, name, on) { - obj._flag(name, on); - }); - - var iid = 0; - - core._init(function() { - this._pin = new Pin(this); - }); - - core.prototype.matrix = function(relative) { - if (relative === true) { - return this._pin.relativeMatrix(); - } - return this._pin.absoluteMatrix(); + /** @internal */ + MotorJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new MotorJoint(data); + return joint; }; - - core.prototype.pin = function(a, b) { - if (typeof a === 'object') { - this._pin.set(a); - return this; - - } else if (typeof a === 'string') { - if (typeof b === 'undefined') { - return this._pin.get(a); - } else { - this._pin.set(a, b); - return this; - } - } else if (typeof a === 'undefined') { - return this._pin; - } + /** @internal */ + MotorJoint.prototype._setAnchors = function (def) { }; - - function Pin(owner) { - - this._owner = owner; - this._parent = null; - - // relative to parent - this._relativeMatrix = new matrix(); - - // relative to stage - this._absoluteMatrix = new matrix(); - - this.reset(); - } - Pin.prototype.reset = function() { - - this._textureAlpha = 1; - this._alpha = 1; - - this._width = 0; - this._height = 0; - - this._scaleX = 1; - this._scaleY = 1; - this._skewX = 0; - this._skewY = 0; - this._rotation = 0; - - // scale/skew/rotate center - this._pivoted = false; - this._pivotX = null; - this._pivotY = null; - - // self pin point - this._handled = false; - this._handleX = 0; - this._handleY = 0; - - // parent pin point - this._aligned = false; - this._alignX = 0; - this._alignY = 0; - - // as seen by parent px - this._offsetX = 0; - this._offsetY = 0; - - this._boxX = 0; - this._boxY = 0; - this._boxWidth = this._width; - this._boxHeight = this._height; - - // TODO: also set for owner - this._ts_translate = ++iid; - this._ts_transform = ++iid; - this._ts_matrix = ++iid; + /** + * Set the maximum friction force in N. + */ + MotorJoint.prototype.setMaxForce = function (force) { + this.m_maxForce = force; }; - - Pin.prototype._update = function() { - this._parent = this._owner._parent && this._owner._parent._pin; - - // if handled and transformed then be translated - if (this._handled && this._mo_handle != this._ts_transform) { - this._mo_handle = this._ts_transform; - this._ts_translate = ++iid; - } - - if (this._aligned && this._parent - && this._mo_align != this._parent._ts_transform) { - this._mo_align = this._parent._ts_transform; - this._ts_translate = ++iid; - } - - return this; + /** + * Get the maximum friction force in N. + */ + MotorJoint.prototype.getMaxForce = function () { + return this.m_maxForce; }; - - Pin.prototype.toString = function() { - return this._owner + ' (' + (this._parent ? this._parent._owner : null) + ')'; + /** + * Set the maximum friction torque in N*m. + */ + MotorJoint.prototype.setMaxTorque = function (torque) { + this.m_maxTorque = torque; }; - - // TODO: ts fields require refactoring - - Pin.prototype.absoluteMatrix = function() { - this._update(); - var ts = Math.max( - this._ts_transform, - this._ts_translate, - this._parent ? this._parent._ts_matrix : 0 - ); - if (this._mo_abs == ts) { - return this._absoluteMatrix; - } - this._mo_abs = ts; - - var abs = this._absoluteMatrix; - abs.reset(this.relativeMatrix()); - - this._parent && abs.concat(this._parent._absoluteMatrix); - - this._ts_matrix = ++iid; - - return abs; + /** + * Get the maximum friction torque in N*m. + */ + MotorJoint.prototype.getMaxTorque = function () { + return this.m_maxTorque; }; - - Pin.prototype.relativeMatrix = function() { - this._update(); - var ts = Math.max(this._ts_transform, this._ts_translate, - this._parent ? this._parent._ts_transform : 0); - if (this._mo_rel == ts) { - return this._relativeMatrix; - } - this._mo_rel = ts; - - var rel = this._relativeMatrix; - - rel.identity(); - if (this._pivoted) { - rel.translate(-this._pivotX * this._width, -this._pivotY * this._height); - } - rel.scale(this._scaleX, this._scaleY); - rel.skew(this._skewX, this._skewY); - rel.rotate(this._rotation); - if (this._pivoted) { - rel.translate(this._pivotX * this._width, this._pivotY * this._height); - } - - // calculate effective box - if (this._pivoted) { - // origin - this._boxX = 0; - this._boxY = 0; - this._boxWidth = this._width; - this._boxHeight = this._height; - - } else { - // aabb - var p, q; - if (rel.a > 0 && rel.c > 0 || rel.a < 0 && rel.c < 0) { - p = 0, q = rel.a * this._width + rel.c * this._height; - } else { - p = rel.a * this._width, q = rel.c * this._height; - } - if (p > q) { - this._boxX = q; - this._boxWidth = p - q; - } else { - this._boxX = p; - this._boxWidth = q - p; - } - if (rel.b > 0 && rel.d > 0 || rel.b < 0 && rel.d < 0) { - p = 0, q = rel.b * this._width + rel.d * this._height; - } else { - p = rel.b * this._width, q = rel.d * this._height; - } - if (p > q) { - this._boxY = q; - this._boxHeight = p - q; - } else { - this._boxY = p; - this._boxHeight = q - p; + /** + * Set the position correction factor in the range [0,1]. + */ + MotorJoint.prototype.setCorrectionFactor = function (factor) { + this.m_correctionFactor = factor; + }; + /** + * Get the position correction factor in the range [0,1]. + */ + MotorJoint.prototype.getCorrectionFactor = function () { + return this.m_correctionFactor; + }; + /** + * Set/get the target linear offset, in frame A, in meters. + */ + MotorJoint.prototype.setLinearOffset = function (linearOffset) { + if (linearOffset.x != this.m_linearOffset.x + || linearOffset.y != this.m_linearOffset.y) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_linearOffset = linearOffset; + } + }; + MotorJoint.prototype.getLinearOffset = function () { + return this.m_linearOffset; + }; + /** + * Set/get the target angular offset, in radians. + */ + MotorJoint.prototype.setAngularOffset = function (angularOffset) { + if (angularOffset != this.m_angularOffset) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_angularOffset = angularOffset; } - } - - this._x = this._offsetX; - this._y = this._offsetY; - - this._x -= this._boxX + this._handleX * this._boxWidth; - this._y -= this._boxY + this._handleY * this._boxHeight; - - if (this._aligned && this._parent) { - this._parent.relativeMatrix(); - this._x += this._alignX * this._parent._width; - this._y += this._alignY * this._parent._height; - } - - rel.translate(this._x, this._y); - - return this._relativeMatrix; }; - - Pin.prototype.get = function(key) { - if (typeof getters[key] === 'function') { - return getters[key](this); - } + MotorJoint.prototype.getAngularOffset = function () { + return this.m_angularOffset; }; - - // TODO: Use defineProperty instead? What about multi-field pinning? - Pin.prototype.set = function(a, b) { - if (typeof a === 'string') { - if (typeof setters[a] === 'function' && typeof b !== 'undefined') { - setters[a](this, b); - } - } else if (typeof a === 'object') { - for (b in a) { - if (typeof setters[b] === 'function' && typeof a[b] !== 'undefined') { - setters[b](this, a[b], a); - } - } - } - if (this._owner) { - this._owner._ts_pin = ++iid; - this._owner.touch(); - } - return this; + /** + * Get the anchor point on bodyA in world coordinates. + */ + MotorJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getPosition(); }; - - var getters = { - alpha : function(pin) { - return pin._alpha; - }, - - textureAlpha : function(pin) { - return pin._textureAlpha; - }, - - width : function(pin) { - return pin._width; - }, - - height : function(pin) { - return pin._height; - }, - - boxWidth : function(pin) { - return pin._boxWidth; - }, - - boxHeight : function(pin) { - return pin._boxHeight; - }, - - // scale : function(pin) { - // }, - - scaleX : function(pin) { - return pin._scaleX; - }, - - scaleY : function(pin) { - return pin._scaleY; - }, - - // skew : function(pin) { - // }, - - skewX : function(pin) { - return pin._skewX; - }, - - skewY : function(pin) { - return pin._skewY; - }, - - rotation : function(pin) { - return pin._rotation; - }, - - // pivot : function(pin) { - // }, - - pivotX : function(pin) { - return pin._pivotX; - }, - - pivotY : function(pin) { - return pin._pivotY; - }, - - // offset : function(pin) { - // }, - - offsetX : function(pin) { - return pin._offsetX; - }, - - offsetY : function(pin) { - return pin._offsetY; - }, - - // align : function(pin) { - // }, - - alignX : function(pin) { - return pin._alignX; - }, - - alignY : function(pin) { - return pin._alignY; - }, - - // handle : function(pin) { - // }, - - handleX : function(pin) { - return pin._handleX; - }, - - handleY : function(pin) { - return pin._handleY; - } + /** + * Get the anchor point on bodyB in world coordinates. + */ + MotorJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getPosition(); }; - - var setters = { - alpha : function(pin, value) { - pin._alpha = value; - }, - - textureAlpha : function(pin, value) { - pin._textureAlpha = value; - }, - - width : function(pin, value) { - pin._width_ = value; - pin._width = value; - pin._ts_transform = ++iid; - }, - - height : function(pin, value) { - pin._height_ = value; - pin._height = value; - pin._ts_transform = ++iid; - }, - - scale : function(pin, value) { - pin._scaleX = value; - pin._scaleY = value; - pin._ts_transform = ++iid; - }, - - scaleX : function(pin, value) { - pin._scaleX = value; - pin._ts_transform = ++iid; - }, - - scaleY : function(pin, value) { - pin._scaleY = value; - pin._ts_transform = ++iid; - }, - - skew : function(pin, value) { - pin._skewX = value; - pin._skewY = value; - pin._ts_transform = ++iid; - }, - - skewX : function(pin, value) { - pin._skewX = value; - pin._ts_transform = ++iid; - }, - - skewY : function(pin, value) { - pin._skewY = value; - pin._ts_transform = ++iid; - }, - - rotation : function(pin, value) { - pin._rotation = value; - pin._ts_transform = ++iid; - }, - - pivot : function(pin, value) { - pin._pivotX = value; - pin._pivotY = value; - pin._pivoted = true; - pin._ts_transform = ++iid; - }, - - pivotX : function(pin, value) { - pin._pivotX = value; - pin._pivoted = true; - pin._ts_transform = ++iid; - }, - - pivotY : function(pin, value) { - pin._pivotY = value; - pin._pivoted = true; - pin._ts_transform = ++iid; - }, - - offset : function(pin, value) { - pin._offsetX = value; - pin._offsetY = value; - pin._ts_translate = ++iid; - }, - - offsetX : function(pin, value) { - pin._offsetX = value; - pin._ts_translate = ++iid; - }, - - offsetY : function(pin, value) { - pin._offsetY = value; - pin._ts_translate = ++iid; - }, - - align : function(pin, value) { - this.alignX(pin, value); - this.alignY(pin, value); - }, - - alignX : function(pin, value) { - pin._alignX = value; - pin._aligned = true; - pin._ts_translate = ++iid; - - this.handleX(pin, value); - }, - - alignY : function(pin, value) { - pin._alignY = value; - pin._aligned = true; - pin._ts_translate = ++iid; - - this.handleY(pin, value); - }, - - handle : function(pin, value) { - this.handleX(pin, value); - this.handleY(pin, value); - }, - - handleX : function(pin, value) { - pin._handleX = value; - pin._handled = true; - pin._ts_translate = ++iid; - }, - - handleY : function(pin, value) { - pin._handleY = value; - pin._handled = true; - pin._ts_translate = ++iid; - }, - - resizeMode : function(pin, value, all) { - if (all) { - if (value == 'in') { - value = 'in-pad'; - } else if (value == 'out') { - value = 'out-crop'; - } - scaleTo(pin, all.resizeWidth, all.resizeHeight, value); - } - }, - - resizeWidth : function(pin, value, all) { - if (!all || !all.resizeMode) { - scaleTo(pin, value, null); + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + MotorJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + MotorJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_angularImpulse; + }; + MotorJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + // Compute the effective mass matrix. + this.m_rA = Rot.mulVec2(qA, Vec2.neg(this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.neg(this.m_localCenterB)); + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var K = new Mat22(); + K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y * this.m_rB.y; + K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y; + K.ey.x = K.ex.y; + K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x * this.m_rB.x; + this.m_linearMass = K.getInverse(); + this.m_angularMass = iA + iB; + if (this.m_angularMass > 0.0) { + this.m_angularMass = 1.0 / this.m_angularMass; } - }, - - resizeHeight : function(pin, value, all) { - if (!all || !all.resizeMode) { - scaleTo(pin, null, value); + this.m_linearError = Vec2.zero(); + this.m_linearError.addCombine(1, cB, 1, this.m_rB); + this.m_linearError.subCombine(1, cA, 1, this.m_rA); + this.m_linearError.sub(Rot.mulVec2(qA, this.m_linearOffset)); + this.m_angularError = aB - aA - this.m_angularOffset; + if (step.warmStarting) { + // Scale impulses to support a variable time step. + this.m_linearImpulse.mul(step.dtRatio); + this.m_angularImpulse *= step.dtRatio; + var P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse); } - }, - - scaleMode : function(pin, value, all) { - if (all) { - scaleTo(pin, all.scaleWidth, all.scaleHeight, value); + else { + this.m_linearImpulse.setZero(); + this.m_angularImpulse = 0.0; } - }, - - scaleWidth : function(pin, value, all) { - if (!all || !all.scaleMode) { - scaleTo(pin, value, null); + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + MotorJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var h = step.dt; + var inv_h = step.inv_dt; + // Solve angular friction + { + var Cdot = wB - wA + inv_h * this.m_correctionFactor * this.m_angularError; + var impulse = -this.m_angularMass * Cdot; + var oldImpulse = this.m_angularImpulse; + var maxImpulse = h * this.m_maxTorque; + this.m_angularImpulse = math.clamp(this.m_angularImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_angularImpulse - oldImpulse; + wA -= iA * impulse; + wB += iB * impulse; } - }, - - scaleHeight : function(pin, value, all) { - if (!all || !all.scaleMode) { - scaleTo(pin, null, value); + // Solve linear friction + { + var Cdot = Vec2.zero(); + Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); + Cdot.addMul(inv_h * this.m_correctionFactor, this.m_linearError); + var impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); + var oldImpulse = Vec2.clone(this.m_linearImpulse); + this.m_linearImpulse.add(impulse); + var maxImpulse = h * this.m_maxForce; + this.m_linearImpulse.clamp(maxImpulse); + impulse = Vec2.sub(this.m_linearImpulse, oldImpulse); + vA.subMul(mA, impulse); + wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); + vB.addMul(mB, impulse); + wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); } - }, - - matrix : function(pin, value) { - this.scaleX(pin, value.a); - this.skewX(pin, value.c / value.d); - this.skewY(pin, value.b / value.a); - this.scaleY(pin, value.d); - this.offsetX(pin, value.e); - this.offsetY(pin, value.f); - this.rotation(pin, 0); - } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; }; - - function scaleTo(pin, width, height, mode) { - var w = typeof width === 'number'; - var h = typeof height === 'number'; - var m = typeof mode === 'string'; - pin._ts_transform = ++iid; - if (w) { - pin._scaleX = width / pin._width_; - pin._width = pin._width_; - } - if (h) { - pin._scaleY = height / pin._height_; - pin._height = pin._height_; - } - if (w && h && m) { - if (mode == 'out' || mode == 'out-crop') { - pin._scaleX = pin._scaleY = Math.max(pin._scaleX, pin._scaleY); - } else if (mode == 'in' || mode == 'in-pad') { - pin._scaleX = pin._scaleY = Math.min(pin._scaleX, pin._scaleY); + /** + * This returns true if the position errors are within tolerance. + */ + MotorJoint.prototype.solvePositionConstraints = function (step) { + return true; + }; + MotorJoint.TYPE = 'motor-joint'; + return MotorJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$4 = { + maxForce: 0.0, + frequencyHz: 5.0, + dampingRatio: 0.7 +}; +/** + * A mouse joint is used to make a point on a body track a specified world + * point. This a soft constraint with a maximum force. This allows the + * constraint to stretch and without applying huge forces. + * + * NOTE: this joint is not documented in the manual because it was developed to + * be used in the testbed. If you want to learn how to use the mouse joint, look + * at the testbed. + */ +var MouseJoint = /** @class */ (function (_super) { + __extends(MouseJoint, _super); + function MouseJoint(def, bodyA, bodyB, target) { + var _this = this; + // @ts-ignore + if (!(_this instanceof MouseJoint)) { + return new MouseJoint(def, bodyA, bodyB, target); } - if (mode == 'out-crop' || mode == 'in-pad') { - pin._width = width / pin._scaleX; - pin._height = height / pin._scaleY; + def = options(def, DEFAULTS$4); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = MouseJoint.TYPE; + if (Vec2.isValid(target)) { + _this.m_targetA = Vec2.clone(target); } - } - } - core.prototype.scaleTo = function(a, b, c) { - if (typeof a === 'object') - c = b, b = a.y, a = a.x; - scaleTo(this._pin, a, b, c); - return this; - }; - - // Used by Tween class - Pin._add_shortcuts = function(Class) { - Class.prototype.size = function(w, h) { - this.pin('width', w); - this.pin('height', h); - return this; - }; - - Class.prototype.width = function(w) { - if (typeof w === 'undefined') { - return this.pin('width'); + else if (Vec2.isValid(def.target)) { + _this.m_targetA = Vec2.clone(def.target); } - this.pin('width', w); - return this; - }; - - Class.prototype.height = function(h) { - if (typeof h === 'undefined') { - return this.pin('height'); + else { + _this.m_targetA = Vec2.zero(); } - this.pin('height', h); - return this; - }; - - Class.prototype.offset = function(a, b) { - if (typeof a === 'object') - b = a.y, a = a.x; - this.pin('offsetX', a); - this.pin('offsetY', b); - return this; - }; - - Class.prototype.rotate = function(a) { - this.pin('rotation', a); - return this; - }; - - Class.prototype.skew = function(a, b) { - if (typeof a === 'object') - b = a.y, a = a.x; - else if (typeof b === 'undefined') - b = a; - this.pin('skewX', a); - this.pin('skewY', b); - return this; - }; - - Class.prototype.scale = function(a, b) { - if (typeof a === 'object') - b = a.y, a = a.x; - else if (typeof b === 'undefined') - b = a; - this.pin('scaleX', a); - this.pin('scaleY', b); - return this; - }; - - Class.prototype.alpha = function(a, ta) { - this.pin('alpha', a); - if (typeof ta !== 'undefined') { - this.pin('textureAlpha', ta); + _this.m_localAnchorB = Transform.mulTVec2(bodyB.getTransform(), _this.m_targetA); + _this.m_maxForce = def.maxForce; + _this.m_impulse = Vec2.zero(); + _this.m_frequencyHz = def.frequencyHz; + _this.m_dampingRatio = def.dampingRatio; + _this.m_beta = 0.0; + _this.m_gamma = 0.0; + // Solver temp + _this.m_rB = Vec2.zero(); + _this.m_localCenterB = Vec2.zero(); + _this.m_invMassB = 0.0; + _this.m_invIB = 0.0; + _this.m_mass = new Mat22(); + _this.m_C = Vec2.zero(); + return _this; + // p = attached point, m = mouse point + // C = p - m + // Cdot = v + // = v + cross(w, r) + // J = [I r_skew] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + } + /** @internal */ + MouseJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + target: this.m_targetA, + maxForce: this.m_maxForce, + frequencyHz: this.m_frequencyHz, + dampingRatio: this.m_dampingRatio, + _localAnchorB: this.m_localAnchorB, + }; + }; + /** @internal */ + MouseJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + data.target = Vec2.clone(data.target); + var joint = new MouseJoint(data); + if (data._localAnchorB) { + joint.m_localAnchorB = data._localAnchorB; } - return this; - }; + return joint; }; - - Pin._add_shortcuts(core); - - var pin = Pin; - - core.prototype._textures = null; - core.prototype._alpha = 1; - - core.prototype.render = function(context) { - if (!this._visible) { - return; - } - stats.node++; - - var m = this.matrix(); - context.setTransform(m.a, m.b, m.c, m.d, m.e, m.f); - - // move this elsewhere! - this._alpha = this._pin._alpha * (this._parent ? this._parent._alpha : 1); - var alpha = this._pin._textureAlpha * this._alpha; - - if (context.globalAlpha != alpha) { - context.globalAlpha = alpha; - } - - if (this._textures !== null) { - for (var i = 0, n = this._textures.length; i < n; i++) { - this._textures[i].draw(context); + /** + * Use this to update the target point. + */ + MouseJoint.prototype.setTarget = function (target) { + if (this.m_bodyB.isAwake() == false) { + this.m_bodyB.setAwake(true); } - } - - if (context.globalAlpha != this._alpha) { - context.globalAlpha = this._alpha; - } - - var child, next = this._first; - while (child = next) { - next = child._next; - child.render(context); - } + this.m_targetA = Vec2.clone(target); }; - - core.prototype._tickBefore = null; - core.prototype._tickAfter = null; - core.prototype.MAX_ELAPSE = Infinity; - - core.prototype._tick = function(elapsed, now, last) { - if (!this._visible) { - return; - } - - if (elapsed > this.MAX_ELAPSE) { - elapsed = this.MAX_ELAPSE; - } - - var ticked = false; - - if (this._tickBefore !== null) { - for (var i = 0; i < this._tickBefore.length; i++) { - stats.tick++; - var tickFn = this._tickBefore[i]; - ticked = tickFn.call(this, elapsed, now, last) === true || ticked; + MouseJoint.prototype.getTarget = function () { + return this.m_targetA; + }; + /** + * Set the maximum force in Newtons. + */ + MouseJoint.prototype.setMaxForce = function (force) { + this.m_maxForce = force; + }; + /** + * Get the maximum force in Newtons. + */ + MouseJoint.prototype.getMaxForce = function () { + return this.m_maxForce; + }; + /** + * Set the frequency in Hertz. + */ + MouseJoint.prototype.setFrequency = function (hz) { + this.m_frequencyHz = hz; + }; + /** + * Get the frequency in Hertz. + */ + MouseJoint.prototype.getFrequency = function () { + return this.m_frequencyHz; + }; + /** + * Set the damping ratio (dimensionless). + */ + MouseJoint.prototype.setDampingRatio = function (ratio) { + this.m_dampingRatio = ratio; + }; + /** + * Get the damping ratio (dimensionless). + */ + MouseJoint.prototype.getDampingRatio = function () { + return this.m_dampingRatio; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + MouseJoint.prototype.getAnchorA = function () { + return Vec2.clone(this.m_targetA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + MouseJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + MouseJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(inv_dt, this.m_impulse); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + MouseJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * 0.0; + }; + /** + * Shift the origin for any points stored in world coordinates. + */ + MouseJoint.prototype.shiftOrigin = function (newOrigin) { + this.m_targetA.sub(newOrigin); + }; + MouseJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIB = this.m_bodyB.m_invI; + var position = this.m_bodyB.c_position; + var velocity = this.m_bodyB.c_velocity; + var cB = position.c; + var aB = position.a; + var vB = velocity.v; + var wB = velocity.w; + var qB = Rot.neo(aB); + var mass = this.m_bodyB.getMass(); + // Frequency + var omega = 2.0 * math.PI * this.m_frequencyHz; + // Damping coefficient + var d = 2.0 * mass * this.m_dampingRatio * omega; + // Spring stiffness + var k = mass * (omega * omega); + // magic formulas + // gamma has units of inverse mass. + // beta has units of inverse time. + var h = step.dt; + this.m_gamma = h * (d + h * k); + if (this.m_gamma != 0.0) { + this.m_gamma = 1.0 / this.m_gamma; } - } - - var child, next = this._first; - while (child = next) { - next = child._next; - if (child._flag('_tick')) { - ticked = child._tick(elapsed, now, last) === true ? true : ticked; + this.m_beta = h * k * this.m_gamma; + // Compute the effective mass matrix. + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) * + // invI2 * skew(r2)] + // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y + // -r1.x*r1.y] + // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x] + var K = new Mat22(); + K.ex.x = this.m_invMassB + this.m_invIB * this.m_rB.y * this.m_rB.y + + this.m_gamma; + K.ex.y = -this.m_invIB * this.m_rB.x * this.m_rB.y; + K.ey.x = K.ex.y; + K.ey.y = this.m_invMassB + this.m_invIB * this.m_rB.x * this.m_rB.x + + this.m_gamma; + this.m_mass = K.getInverse(); + this.m_C.setVec2(cB); + this.m_C.addCombine(1, this.m_rB, -1, this.m_targetA); + this.m_C.mul(this.m_beta); + // Cheat with some damping + wB *= 0.98; + if (step.warmStarting) { + this.m_impulse.mul(step.dtRatio); + vB.addMul(this.m_invMassB, this.m_impulse); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, this.m_impulse); } - } - - if (this._tickAfter !== null) { - for (var i = 0; i < this._tickAfter.length; i++) { - stats.tick++; - var tickFn = this._tickAfter[i]; - ticked = tickFn.call(this, elapsed, now, last) === true || ticked; + else { + this.m_impulse.setZero(); } - } - - return ticked; + velocity.v.setVec2(vB); + velocity.w = wB; + }; + MouseJoint.prototype.solveVelocityConstraints = function (step) { + var velocity = this.m_bodyB.c_velocity; + var vB = Vec2.clone(velocity.v); + var wB = velocity.w; + // Cdot = v + cross(w, r) + var Cdot = Vec2.crossNumVec2(wB, this.m_rB); + Cdot.add(vB); + Cdot.addCombine(1, this.m_C, this.m_gamma, this.m_impulse); + Cdot.neg(); + var impulse = Mat22.mulVec2(this.m_mass, Cdot); + var oldImpulse = Vec2.clone(this.m_impulse); + this.m_impulse.add(impulse); + var maxImpulse = step.dt * this.m_maxForce; + this.m_impulse.clamp(maxImpulse); + impulse = Vec2.sub(this.m_impulse, oldImpulse); + vB.addMul(this.m_invMassB, impulse); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, impulse); + velocity.v.setVec2(vB); + velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + MouseJoint.prototype.solvePositionConstraints = function (step) { + return true; + }; + MouseJoint.TYPE = 'mouse-joint'; + return MouseJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$3 = { + collideConnected: true +}; +/** + * The pulley joint is connected to two bodies and two fixed ground points. The + * pulley supports a ratio such that: length1 + ratio * length2 <= constant + * + * Yes, the force transmitted is scaled by the ratio. + * + * Warning: the pulley joint can get a bit squirrelly by itself. They often work + * better when combined with prismatic joints. You should also cover the the + * anchor points with static shapes to prevent one side from going to zero + * length. + */ +var PulleyJoint = /** @class */ (function (_super) { + __extends(PulleyJoint, _super); + function PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio) { + var _this = this; + // @ts-ignore + if (!(_this instanceof PulleyJoint)) { + return new PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio); + } + def = options(def, DEFAULTS$3); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = PulleyJoint.TYPE; + _this.m_groundAnchorA = groundA ? groundA : def.groundAnchorA || Vec2.neo(-1.0, 1.0); + _this.m_groundAnchorB = groundB ? groundB : def.groundAnchorB || Vec2.neo(1.0, 1.0); + _this.m_localAnchorA = anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.neo(-1.0, 0.0); + _this.m_localAnchorB = anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.neo(1.0, 0.0); + _this.m_lengthA = math.isFinite(def.lengthA) ? def.lengthA : Vec2.distance(anchorA, groundA); + _this.m_lengthB = math.isFinite(def.lengthB) ? def.lengthB : Vec2.distance(anchorB, groundB); + _this.m_ratio = math.isFinite(ratio) ? ratio : def.ratio; + _this.m_constant = _this.m_lengthA + _this.m_ratio * _this.m_lengthB; + _this.m_impulse = 0.0; + return _this; + // Pulley: + // length1 = norm(p1 - s1) + // length2 = norm(p2 - s2) + // C0 = (length1 + ratio * length2)_initial + // C = C0 - (length1 + ratio * length2) + // u1 = (p1 - s1) / norm(p1 - s1) + // u2 = (p2 - s2) / norm(p2 - s2) + // Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2)) + // J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)] + // K = J * invM * JT + // = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 * + // cross(r2, u2)^2) + } + PulleyJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + groundAnchorA: this.m_groundAnchorA, + groundAnchorB: this.m_groundAnchorB, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + lengthA: this.m_lengthA, + lengthB: this.m_lengthB, + ratio: this.m_ratio, + }; + }; + /** @internal */ + PulleyJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new PulleyJoint(data); + return joint; + }; + /** + * Get the first ground anchor. + */ + PulleyJoint.prototype.getGroundAnchorA = function () { + return this.m_groundAnchorA; + }; + /** + * Get the second ground anchor. + */ + PulleyJoint.prototype.getGroundAnchorB = function () { + return this.m_groundAnchorB; + }; + /** + * Get the current length of the segment attached to bodyA. + */ + PulleyJoint.prototype.getLengthA = function () { + return this.m_lengthA; }; - - core.prototype.tick = function(ticker, before) { - if (typeof ticker !== 'function') { - return; - } - if (before) { - if (this._tickBefore === null) { - this._tickBefore = []; - } - this._tickBefore.push(ticker); - } else { - if (this._tickAfter === null) { - this._tickAfter = []; - } - this._tickAfter.push(ticker); - } - this._flag('_tick', this._tickAfter !== null && this._tickAfter.length > 0 - || this._tickBefore !== null && this._tickBefore.length > 0); + /** + * Get the current length of the segment attached to bodyB. + */ + PulleyJoint.prototype.getLengthB = function () { + return this.m_lengthB; }; - - core.prototype.untick = function(ticker) { - if (typeof ticker !== 'function') { - return; - } - var i; - if (this._tickBefore !== null && (i = this._tickBefore.indexOf(ticker)) >= 0) { - this._tickBefore.splice(i, 1); - } - if (this._tickAfter !== null && (i = this._tickAfter.indexOf(ticker)) >= 0) { - this._tickAfter.splice(i, 1); - } + /** + * Get the pulley ratio. + */ + PulleyJoint.prototype.getRatio = function () { + return this.m_ratio; }; - - core.prototype.timeout = function(fn, time) { - this.setTimeout(fn, time); + /** + * Get the current length of the segment attached to bodyA. + */ + PulleyJoint.prototype.getCurrentLengthA = function () { + var p = this.m_bodyA.getWorldPoint(this.m_localAnchorA); + var s = this.m_groundAnchorA; + return Vec2.distance(p, s); }; - - core.prototype.setTimeout = function(fn, time) { - function timer(t) { - if ((time -= t) < 0) { - this.untick(timer); - fn.call(this); - } else { - return true; - } - } - this.tick(timer); - return timer; + /** + * Get the current length of the segment attached to bodyB. + */ + PulleyJoint.prototype.getCurrentLengthB = function () { + var p = this.m_bodyB.getWorldPoint(this.m_localAnchorB); + var s = this.m_groundAnchorB; + return Vec2.distance(p, s); }; - - core.prototype.clearTimeout = function(timer) { - this.untick(timer); + /** + * Shift the origin for any points stored in world coordinates. + * + * @param newOrigin + */ + PulleyJoint.prototype.shiftOrigin = function (newOrigin) { + this.m_groundAnchorA.sub(newOrigin); + this.m_groundAnchorB.sub(newOrigin); }; - - Root._super = core; - Root.prototype = create(Root._super.prototype); - - core.root = function(request, render) { - return new Root(request, render); + /** + * Get the anchor point on bodyA in world coordinates. + */ + PulleyJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); }; - - function Root(request, render) { - Root._super.call(this); - this.label('Root'); - - var paused = true; - var stopped = true; - - var self = this; - var lastTime = 0; - var loop = function(now) { - if (paused === true || stopped === true) { - return; + /** + * Get the anchor point on bodyB in world coordinates. + */ + PulleyJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + PulleyJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(this.m_impulse, this.m_uB).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + PulleyJoint.prototype.getReactionTorque = function (inv_dt) { + return 0.0; + }; + PulleyJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // Get the pulley axes. + this.m_uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA); + this.m_uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB); + var lengthA = this.m_uA.length(); + var lengthB = this.m_uB.length(); + if (lengthA > 10.0 * Settings.linearSlop) { + this.m_uA.mul(1.0 / lengthA); } - - stats.tick = stats.node = stats.draw = 0; - - var last = lastTime || now; - var elapsed = now - last; - lastTime = now; - - var ticked = self._tick(elapsed, now, last); - if (self._mo_touch != self._ts_touch) { - self._mo_touch = self._ts_touch; - render(self); - request(loop); - } else if (ticked) { - request(loop); - } else { - paused = true; + else { + this.m_uA.setZero(); } - - stats.fps = elapsed ? 1000 / elapsed : 0; - }; - - this.start = function() { - stopped = false; - return this.resume(); - }; - - this.resume = function() { - if (paused) { - this.publish('resume'); - paused = false; - request(loop); + if (lengthB > 10.0 * Settings.linearSlop) { + this.m_uB.mul(1.0 / lengthB); } - return this; - }; - - this.pause = function() { - if (!paused) { - this.publish('pause'); + else { + this.m_uB.setZero(); } - paused = true; - return this; - }; - - this.touch_root = this.touch; - this.touch = function() { - this.resume(); - return this.touch_root(); - }; - this.stop = function() { - stopped = true; - return this; - }; - } - Root.prototype.background = function(color) { - // to be implemented by loaders - return this; - }; - - Root.prototype.viewport = function(width, height, ratio) { - if (typeof width === 'undefined') { - return extend({}, this._viewport); - } - this._viewport = { - width : width, - height : height, - ratio : ratio || 1 - }; - this.viewbox(); - var data = extend({}, this._viewport); - this.visit({ - start : function(node) { - if (!node._flag('viewport')) { - return true; - } - node.publish('viewport', [ data ]); + // Compute effective mass. + var ruA = Vec2.crossVec2Vec2(this.m_rA, this.m_uA); // float + var ruB = Vec2.crossVec2Vec2(this.m_rB, this.m_uB); // float + var mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float + var mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float + this.m_mass = mA + this.m_ratio * this.m_ratio * mB; + if (this.m_mass > 0.0) { + this.m_mass = 1.0 / this.m_mass; } - }); - return this; + if (step.warmStarting) { + // Scale impulses to support variable time steps. + this.m_impulse *= step.dtRatio; + // Warm starting. + var PA = Vec2.mulNumVec2(-this.m_impulse, this.m_uA); + var PB = Vec2.mulNumVec2(-this.m_ratio * this.m_impulse, this.m_uB); + vA.addMul(this.m_invMassA, PA); + wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA); + vB.addMul(this.m_invMassB, PB); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB); + } + else { + this.m_impulse = 0.0; + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; }; - - // TODO: static/fixed viewbox - Root.prototype.viewbox = function(width, height, mode) { - if (typeof width === 'number' && typeof height === 'number') { - this._viewbox = { - width : width, - height : height, - mode : /^(in|out|in-pad|out-crop)$/.test(mode) ? mode : 'in-pad' - }; - } - - var box = this._viewbox; - var size = this._viewport; - if (size && box) { - this.pin({ - width : box.width, - height : box.height - }); - this.scaleTo(size.width, size.height, box.mode); - } else if (size) { - this.pin({ - width : size.width, - height : size.height - }); - } - - return this; + PulleyJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA)); + var vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)); + var Cdot = -Vec2.dot(this.m_uA, vpA) - this.m_ratio + * Vec2.dot(this.m_uB, vpB); // float + var impulse = -this.m_mass * Cdot; // float + this.m_impulse += impulse; + var PA = Vec2.mulNumVec2(-impulse, this.m_uA); // Vec2 + var PB = Vec2.mulNumVec2(-this.m_ratio * impulse, this.m_uB); // Vec2 + vA.addMul(this.m_invMassA, PA); + wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA); + vB.addMul(this.m_invMassB, PB); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB); + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; }; - - var lib = core; - var Matrix = matrix; - var Texture = texture; - lib.Matrix = Matrix; - lib.Texture = Texture; - - core.canvas = function(type, attributes, drawFn) { - if (typeof type === 'string') { - if (typeof attributes === 'object') ; else { - if (typeof attributes === 'function') { - drawFn = attributes; - } - attributes = {}; + /** + * This returns true if the position errors are within tolerance. + */ + PulleyJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // Get the pulley axes. + var uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA); + var uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB); + var lengthA = uA.length(); + var lengthB = uB.length(); + if (lengthA > 10.0 * Settings.linearSlop) { + uA.mul(1.0 / lengthA); } - } else { - if (typeof type === 'function') { - drawFn = type; + else { + uA.setZero(); } - attributes = {}; - type = '2d'; - } - - var canvas = document.createElement('canvas'); - var context = canvas.getContext(type, attributes); - var texture$1 = new texture(canvas); - - texture$1.context = function() { - return context; - }; - - texture$1.size = function(width, height, ratio) { - ratio = ratio || 1; - canvas.width = width * ratio; - canvas.height = height * ratio; - this.src(canvas, ratio); - return this; - }; - - texture$1.canvas = function(fn) { - if (typeof fn === 'function') { - fn.call(this, context); - } else if (typeof fn === 'undefined' && typeof drawFn === 'function') { - drawFn.call(this, context); + if (lengthB > 10.0 * Settings.linearSlop) { + uB.mul(1.0 / lengthB); } - return this; - }; - - if (typeof drawFn === 'function') { - drawFn.call(texture$1, context); - } - - return texture$1; + else { + uB.setZero(); + } + // Compute effective mass. + var ruA = Vec2.crossVec2Vec2(rA, uA); + var ruB = Vec2.crossVec2Vec2(rB, uB); + var mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float + var mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float + var mass = mA + this.m_ratio * this.m_ratio * mB; // float + if (mass > 0.0) { + mass = 1.0 / mass; + } + var C = this.m_constant - lengthA - this.m_ratio * lengthB; // float + var linearError = math.abs(C); // float + var impulse = -mass * C; // float + var PA = Vec2.mulNumVec2(-impulse, uA); // Vec2 + var PB = Vec2.mulNumVec2(-this.m_ratio * impulse, uB); // Vec2 + cA.addMul(this.m_invMassA, PA); + aA += this.m_invIA * Vec2.crossVec2Vec2(rA, PA); + cB.addMul(this.m_invMassB, PB); + aB += this.m_invIB * Vec2.crossVec2Vec2(rB, PB); + this.m_bodyA.c_position.c = cA; + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c = cB; + this.m_bodyB.c_position.a = aB; + return linearError < Settings.linearSlop; }; - - var repeat = function(img, owidth, oheight, stretch, inner, insert) { - - var width = img.width; - var height = img.height; - var left = img.left; - var right = img.right; - var top = img.top; - var bottom = img.bottom; - - left = typeof left === 'number' && left === left ? left : 0; - right = typeof right === 'number' && right === right ? right : 0; - top = typeof top === 'number' && top === top ? top : 0; - bottom = typeof bottom === 'number' && bottom === bottom ? bottom : 0; - - width = width - left - right; - height = height - top - bottom; - - if (!inner) { - owidth = Math.max(owidth - left - right, 0); - oheight = Math.max(oheight - top - bottom, 0); - } - - var i = 0; - - if (top > 0 && left > 0) - insert(i++, 0, 0, left, top, 0, 0, left, top); - if (bottom > 0 && left > 0) - insert(i++, 0, height + top, left, bottom, 0, oheight + top, left, bottom); - if (top > 0 && right > 0) - insert(i++, width + left, 0, right, top, owidth + left, 0, right, top); - if (bottom > 0 && right > 0) - insert(i++, width + left, height + top, right, bottom, owidth + left, - oheight + top, right, bottom); - - if (stretch) { - if (top > 0) - insert(i++, left, 0, width, top, left, 0, owidth, top); - if (bottom > 0) - insert(i++, left, height + top, width, bottom, left, oheight + top, - owidth, bottom); - if (left > 0) - insert(i++, 0, top, left, height, 0, top, left, oheight); - if (right > 0) - insert(i++, width + left, top, right, height, owidth + left, top, right, - oheight); - // center - insert(i++, left, top, width, height, left, top, owidth, oheight); - - } else { // tile - var l = left, r = owidth, w; - while (r > 0) { - w = Math.min(width, r), r -= width; - var t = top, b = oheight, h; - while (b > 0) { - h = Math.min(height, b), b -= height; - insert(i++, left, top, w, h, l, t, w, h); - if (r <= 0) { - if (left) - insert(i++, 0, top, left, h, 0, t, left, h); - if (right) - insert(i++, width + left, top, right, h, l + w, t, right, h); - } - t += h; - } - if (top) - insert(i++, left, 0, w, top, l, 0, w, top); - if (bottom) - insert(i++, left, height + top, w, bottom, l, t, w, bottom); - l += w; + PulleyJoint.TYPE = 'pulley-joint'; + return PulleyJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var inactiveLimit = 0; +var atUpperLimit = 2; +var DEFAULTS$2 = { + maxLength: 0.0, +}; +/** + * A rope joint enforces a maximum distance between two points on two bodies. It + * has no other effect. + * + * Warning: if you attempt to change the maximum length during the simulation + * you will get some non-physical behavior. + * + * A model that would allow you to dynamically modify the length would have some + * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you + * want to dynamically control length. + */ +var RopeJoint = /** @class */ (function (_super) { + __extends(RopeJoint, _super); + function RopeJoint(def, bodyA, bodyB, anchor) { + var _this = this; + // @ts-ignore + if (!(_this instanceof RopeJoint)) { + return new RopeJoint(def, bodyA, bodyB, anchor); } - } - - return i; + def = options(def, DEFAULTS$2); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = RopeJoint.TYPE; + _this.m_localAnchorA = anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.neo(-1.0, 0.0); + _this.m_localAnchorB = anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.neo(1.0, 0.0); + _this.m_maxLength = def.maxLength; + _this.m_mass = 0.0; + _this.m_impulse = 0.0; + _this.m_length = 0.0; + _this.m_state = inactiveLimit; + return _this; + // Limit: + // C = norm(pB - pA) - L + // u = (pB - pA) / norm(pB - pA) + // Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA)) + // J = [-u -cross(rA, u) u cross(rB, u)] + // K = J * invM * JT + // = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2 + } + /** @internal */ + RopeJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + maxLength: this.m_maxLength, + }; }; - - var image = Image$1; - - core.image = function(image) { - var img = new Image$1(); - image && img.image(image); - return img; + /** @internal */ + RopeJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new RopeJoint(data); + return joint; }; - - Image$1._super = core; - Image$1.prototype = create(Image$1._super.prototype); - - function Image$1() { - Image$1._super.call(this); - this.label('Image'); - this._textures = []; - this._image = null; - } /** - * @deprecated Use image + * The local anchor point relative to bodyA's origin. */ - Image$1.prototype.setImage = function(a, b, c) { - return this.image(a, b, c); + RopeJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; }; - - Image$1.prototype.image = function(image) { - this._image = core.texture(image).one(); - this.pin('width', this._image ? this._image.width : 0); - this.pin('height', this._image ? this._image.height : 0); - this._textures[0] = this._image.pipe(); - this._textures.length = 1; - return this; + /** + * The local anchor point relative to bodyB's origin. + */ + RopeJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; }; - - Image$1.prototype.tile = function(inner) { - this._repeat(false, inner); - return this; + /** + * Set the maximum length of the rope. + */ + RopeJoint.prototype.setMaxLength = function (length) { + this.m_maxLength = length; }; - - Image$1.prototype.stretch = function(inner) { - this._repeat(true, inner); - return this; + /** + * Get the maximum length of the rope. + */ + RopeJoint.prototype.getMaxLength = function () { + return this.m_maxLength; }; - - Image$1.prototype._repeat = function(stretch, inner) { - var self = this; - this.untick(this._repeatTicker); - this.tick(this._repeatTicker = function() { - if (this._mo_stretch == this._pin._ts_transform) { - return; - } - this._mo_stretch = this._pin._ts_transform; - var width = this.pin('width'); - var height = this.pin('height'); - this._textures.length = repeat(this._image, width, height, stretch, inner, - insert); - }); - - function insert(i, sx, sy, sw, sh, dx, dy, dw, dh) { - var repeat = self._textures.length > i ? self._textures[i] - : self._textures[i] = self._image.pipe(); - repeat.src(sx, sy, sw, sh); - repeat.dest(dx, dy, dw, dh); - } + RopeJoint.prototype.getLimitState = function () { + // TODO LimitState + return this.m_state; }; - - core.anim = function(frames, fps) { - var anim = new Anim(); - anim.frames(frames).gotoFrame(0); - fps && anim.fps(fps); - return anim; + /** + * Get the anchor point on bodyA in world coordinates. + */ + RopeJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); }; - - Anim._super = core; - Anim.prototype = create(Anim._super.prototype); - - // TODO: replace with atlas fps or texture time - core.Anim = { - FPS : 15 + /** + * Get the anchor point on bodyB in world coordinates. + */ + RopeJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); }; - - function Anim() { - Anim._super.call(this); - this.label('Anim'); - - this._textures = []; - - this._fps = core.Anim.FPS; - this._ft = 1000 / this._fps; - - this._time = -1; - this._repeat = 0; - - this._index = 0; - this._frames = []; - - var lastTime = 0; - this.tick(function(t, now, last) { - if (this._time < 0 || this._frames.length <= 1) { - return; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + RopeJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + RopeJoint.prototype.getReactionTorque = function (inv_dt) { + return 0.0; + }; + RopeJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); + this.m_rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); + this.m_u = Vec2.zero(); + this.m_u.addCombine(1, cB, 1, this.m_rB); + this.m_u.subCombine(1, cA, 1, this.m_rA); // Vec2 + this.m_length = this.m_u.length(); + var C = this.m_length - this.m_maxLength; // float + if (C > 0.0) { + this.m_state = atUpperLimit; } - - // ignore old elapsed - var ignore = lastTime != last; - lastTime = now; - if (ignore) { - return true; + else { + this.m_state = inactiveLimit; } - - this._time += t; - if (this._time < this._ft) { - return true; + if (this.m_length > Settings.linearSlop) { + this.m_u.mul(1.0 / this.m_length); } - var n = this._time / this._ft | 0; - this._time -= n * this._ft; - this.moveFrame(n); - if (this._repeat > 0 && (this._repeat -= n) <= 0) { - this.stop(); - this._callback && this._callback(); - return false; + else { + this.m_u.setZero(); + this.m_mass = 0.0; + this.m_impulse = 0.0; + return; } - return true; - }, false); - } - Anim.prototype.fps = function(fps) { - if (typeof fps === 'undefined') { - return this._fps; - } - this._fps = fps > 0 ? fps : core.Anim.FPS; - this._ft = 1000 / this._fps; - return this; + // Compute effective mass. + var crA = Vec2.crossVec2Vec2(this.m_rA, this.m_u); // float + var crB = Vec2.crossVec2Vec2(this.m_rB, this.m_u); // float + var invMass = this.m_invMassA + this.m_invIA * crA * crA + this.m_invMassB + + this.m_invIB * crB * crB; // float + this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0; + if (step.warmStarting) { + // Scale the impulse to support a variable time step. + this.m_impulse *= step.dtRatio; + var P = Vec2.mulNumVec2(this.m_impulse, this.m_u); + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); + } + else { + this.m_impulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + RopeJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + // Cdot = dot(u, v + cross(w, r)) + var vpA = Vec2.addCrossNumVec2(vA, wA, this.m_rA); // Vec2 + var vpB = Vec2.addCrossNumVec2(vB, wB, this.m_rB); // Vec2 + var C = this.m_length - this.m_maxLength; // float + var Cdot = Vec2.dot(this.m_u, Vec2.sub(vpB, vpA)); // float + // Predictive constraint. + if (C < 0.0) { + Cdot += step.inv_dt * C; + } + var impulse = -this.m_mass * Cdot; // float + var oldImpulse = this.m_impulse; // float + this.m_impulse = math.min(0.0, this.m_impulse + impulse); + impulse = this.m_impulse - oldImpulse; + var P = Vec2.mulNumVec2(impulse, this.m_u); // Vec2 + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; }; - /** - * @deprecated Use frames + * This returns true if the position errors are within tolerance. */ - Anim.prototype.setFrames = function(a, b, c) { - return this.frames(a, b, c); - }; - - Anim.prototype.frames = function(frames) { - this._index = 0; - this._frames = core.texture(frames).array(); - this.touch(); - return this; - }; - - Anim.prototype.length = function() { - return this._frames ? this._frames.length : 0; + RopeJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; // Vec2 + var aA = this.m_bodyA.c_position.a; // float + var cB = this.m_bodyB.c_position.c; // Vec2 + var aB = this.m_bodyB.c_position.a; // float + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); + var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); + var u = Vec2.zero(); + u.addCombine(1, cB, 1, rB); + u.subCombine(1, cA, 1, rA); // Vec2 + var length = u.normalize(); // float + var C = length - this.m_maxLength; // float + C = math.clamp(C, 0.0, Settings.maxLinearCorrection); + var impulse = -this.m_mass * C; // float + var P = Vec2.mulNumVec2(impulse, u); // Vec2 + cA.subMul(this.m_invMassA, P); + aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P); + cB.addMul(this.m_invMassB, P); + aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P); + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + return length - this.m_maxLength < Settings.linearSlop; }; - - Anim.prototype.gotoFrame = function(frame, resize) { - this._index = math.rotate(frame, this._frames.length) | 0; - resize = resize || !this._textures[0]; - this._textures[0] = this._frames[this._index]; - if (resize) { - this.pin('width', this._textures[0].width); - this.pin('height', this._textures[0].height); - } - this.touch(); - return this; + RopeJoint.TYPE = 'rope-joint'; + return RopeJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$1 = { + frequencyHz: 0.0, + dampingRatio: 0.0, +}; +/** + * A weld joint essentially glues two bodies together. A weld joint may distort + * somewhat because the island constraint solver is approximate. + */ +var WeldJoint = /** @class */ (function (_super) { + __extends(WeldJoint, _super); + function WeldJoint(def, bodyA, bodyB, anchor) { + var _this = this; + // @ts-ignore + if (!(_this instanceof WeldJoint)) { + return new WeldJoint(def, bodyA, bodyB, anchor); + } + def = options(def, DEFAULTS$1); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = WeldJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + _this.m_referenceAngle = math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); + _this.m_frequencyHz = def.frequencyHz; + _this.m_dampingRatio = def.dampingRatio; + _this.m_impulse = new Vec3(); + _this.m_bias = 0.0; + _this.m_gamma = 0.0; + // Solver temp + _this.m_rA; // Vec2 + _this.m_rB; // Vec2 + _this.m_localCenterA; // Vec2 + _this.m_localCenterB; // Vec2 + _this.m_invMassA; // float + _this.m_invMassB; // float + _this.m_invIA; // float + _this.m_invIB; // float + _this.m_mass = new Mat33(); + return _this; + // Point-to-point constraint + // C = p2 - p1 + // Cdot = v2 - v1 + // / = v2 + cross(w2, r2) - v1 - cross(w1, r1) + // J = [-I -r1_skew I r2_skew ] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + // Angle constraint + // C = angle2 - angle1 - referenceAngle + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // K = invI1 + invI2 + } + /** @internal */ + WeldJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + frequencyHz: this.m_frequencyHz, + dampingRatio: this.m_dampingRatio, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + referenceAngle: this.m_referenceAngle, + }; }; - - Anim.prototype.moveFrame = function(move) { - return this.gotoFrame(this._index + move); + /** @internal */ + WeldJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new WeldJoint(data); + return joint; }; - - Anim.prototype.repeat = function(repeat, callback) { - this._repeat = repeat * this._frames.length - 1; - this._callback = callback; - this.play(); - return this; + /** @internal */ + WeldJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } }; - - Anim.prototype.play = function(frame) { - if (typeof frame !== 'undefined') { - this.gotoFrame(frame); - this._time = 0; - } else if (this._time < 0) { - this._time = 0; - } - - this.touch(); - return this; + /** + * The local anchor point relative to bodyA's origin. + */ + WeldJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; }; - - Anim.prototype.stop = function(frame) { - this._time = -1; - if (typeof frame !== 'undefined') { - this.gotoFrame(frame); - } - return this; + /** + * The local anchor point relative to bodyB's origin. + */ + WeldJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; }; - - core.string = function(frames) { - return new Str().frames(frames); + /** + * Get the reference angle. + */ + WeldJoint.prototype.getReferenceAngle = function () { + return this.m_referenceAngle; }; - - Str._super = core; - Str.prototype = create(Str._super.prototype); - - function Str() { - Str._super.call(this); - this.label('String'); - this._textures = []; - } /** - * @deprecated Use frames + * Set frequency in Hz. */ - Str.prototype.setFont = function(a, b, c) { - return this.frames(a, b, c); + WeldJoint.prototype.setFrequency = function (hz) { + this.m_frequencyHz = hz; }; - - Str.prototype.frames = function(frames) { - this._textures = []; - if (typeof frames == 'string') { - frames = core.texture(frames); - this._item = function(value) { - return frames.one(value); - }; - } else if (typeof frames === 'object') { - this._item = function(value) { - return frames[value]; - }; - } else if (typeof frames === 'function') { - this._item = frames; - } - return this; + /** + * Get frequency in Hz. + */ + WeldJoint.prototype.getFrequency = function () { + return this.m_frequencyHz; }; - /** - * @deprecated Use value + * Set damping ratio. */ - Str.prototype.setValue = function(a, b, c) { - return this.value(a, b, c); + WeldJoint.prototype.setDampingRatio = function (ratio) { + this.m_dampingRatio = ratio; }; - - Str.prototype.value = function(value) { - if (typeof value === 'undefined') { - return this._value; - } - if (this._value === value) { - return this; - } - this._value = value; - - if (value === null) { - value = ''; - } else if (typeof value !== 'string' && !is_1.array(value)) { - value = value.toString(); - } - - this._spacing = this._spacing || 0; - - var width = 0, height = 0; - for (var i = 0; i < value.length; i++) { - var image = this._textures[i] = this._item(value[i]); - width += i > 0 ? this._spacing : 0; - image.dest(width, 0); - width = width + image.width; - height = Math.max(height, image.height); - } - this.pin('width', width); - this.pin('height', height); - this._textures.length = value.length; - return this; + /** + * Get damping ratio. + */ + WeldJoint.prototype.getDampingRatio = function () { + return this.m_dampingRatio; }; - - core.row = function(align) { - return core.create().row(align).label('Row'); + /** + * Get the anchor point on bodyA in world coordinates. + */ + WeldJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); }; - - core.prototype.row = function(align) { - this.sequence('row', align); - return this; + /** + * Get the anchor point on bodyB in world coordinates. + */ + WeldJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); }; - - core.column = function(align) { - return core.create().column(align).label('Row'); + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + WeldJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt); }; - - core.prototype.column = function(align) { - this.sequence('column', align); - return this; + /** + * Get the reaction torque on bodyB in N*m. + */ + WeldJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_impulse.z; }; - - core.sequence = function(type, align) { - return core.create().sequence(type, align).label('Sequence'); + WeldJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var K = new Mat33(); + K.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y * this.m_rB.y + * iB; + K.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y * this.m_rB.x * iB; + K.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB; + K.ex.y = K.ey.x; + K.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x * this.m_rB.x + * iB; + K.ez.y = this.m_rA.x * iA + this.m_rB.x * iB; + K.ex.z = K.ez.x; + K.ey.z = K.ez.y; + K.ez.z = iA + iB; + if (this.m_frequencyHz > 0.0) { + K.getInverse22(this.m_mass); + var invM = iA + iB; // float + var m = invM > 0.0 ? 1.0 / invM : 0.0; // float + var C = aB - aA - this.m_referenceAngle; // float + // Frequency + var omega = 2.0 * math.PI * this.m_frequencyHz; // float + // Damping coefficient + var d = 2.0 * m * this.m_dampingRatio * omega; // float + // Spring stiffness + var k = m * omega * omega; // float + // magic formulas + var h = step.dt; // float + this.m_gamma = h * (d + h * k); + this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0; + this.m_bias = C * h * k * this.m_gamma; + invM += this.m_gamma; + this.m_mass.ez.z = invM != 0.0 ? 1.0 / invM : 0.0; + } + else if (K.ez.z == 0.0) { + K.getInverse22(this.m_mass); + this.m_gamma = 0.0; + this.m_bias = 0.0; + } + else { + K.getSymInverse33(this.m_mass); + this.m_gamma = 0.0; + this.m_bias = 0.0; + } + if (step.warmStarting) { + // Scale impulses to support a variable time step. + this.m_impulse.mul(step.dtRatio); + var P = Vec2.neo(this.m_impulse.x, this.m_impulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_impulse.z); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_impulse.z); + } + else { + this.m_impulse.setZero(); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; }; - - core.prototype.sequence = function(type, align) { - - this._padding = this._padding || 0; - this._spacing = this._spacing || 0; - - this.untick(this._layoutTiker); - this.tick(this._layoutTiker = function() { - if (this._mo_seq == this._ts_touch) { - return; + WeldJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + if (this.m_frequencyHz > 0.0) { + var Cdot2 = wB - wA; // float + var impulse2 = -this.m_mass.ez.z + * (Cdot2 + this.m_bias + this.m_gamma * this.m_impulse.z); // float + this.m_impulse.z += impulse2; + wA -= iA * impulse2; + wB += iB * impulse2; + var Cdot1 = Vec2.zero(); + Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2 + var impulse1 = Vec2.neg(Mat33.mulVec2(this.m_mass, Cdot1)); // Vec2 + this.m_impulse.x += impulse1.x; + this.m_impulse.y += impulse1.y; + var P = Vec2.clone(impulse1); // Vec2 + vA.subMul(mA, P); + wA -= iA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(mB, P); + wB += iB * Vec2.crossVec2Vec2(this.m_rB, P); } - this._mo_seq = this._ts_touch; - - var alignChildren = (this._mo_seqAlign != this._ts_children); - this._mo_seqAlign = this._ts_children; - - var width = 0, height = 0; - - var child, next = this.first(true); - var first = true; - while (child = next) { - next = child.next(true); - - child.matrix(true); - var w = child.pin('boxWidth'); - var h = child.pin('boxHeight'); - - if (type == 'column') { - !first && (height += this._spacing); - child.pin('offsetY') != height && child.pin('offsetY', height); - width = Math.max(width, w); - height = height + h; - alignChildren && child.pin('alignX', align); - - } else if (type == 'row') { - !first && (width += this._spacing); - child.pin('offsetX') != width && child.pin('offsetX', width); - width = width + w; - height = Math.max(height, h); - alignChildren && child.pin('alignY', align); - } - first = false; + else { + var Cdot1 = Vec2.zero(); + Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2 + var Cdot2 = wB - wA; // float + var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); // Vec3 + var impulse = Vec3.neg(Mat33.mulVec3(this.m_mass, Cdot)); // Vec3 + this.m_impulse.add(impulse); + var P = Vec2.neo(impulse.x, impulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z); } - width += 2 * this._padding; - height += 2 * this._padding; - this.pin('width') != width && this.pin('width', width); - this.pin('height') != height && this.pin('height', height); - }); - return this; + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; }; - - core.box = function() { - return core.create().box().label('Box'); + /** + * This returns true if the position errors are within tolerance. + */ + WeldJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + var positionError; + var angularError; + var K = new Mat33(); + K.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB; + K.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB; + K.ez.x = -rA.y * iA - rB.y * iB; + K.ex.y = K.ey.x; + K.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB; + K.ez.y = rA.x * iA + rB.x * iB; + K.ex.z = K.ez.x; + K.ey.z = K.ez.y; + K.ez.z = iA + iB; + if (this.m_frequencyHz > 0.0) { + var C1 = Vec2.zero(); + C1.addCombine(1, cB, 1, rB); + C1.subCombine(1, cA, 1, rA); // Vec2 + positionError = C1.length(); + angularError = 0.0; + var P = Vec2.neg(K.solve22(C1)); // Vec2 + cA.subMul(mA, P); + aA -= iA * Vec2.crossVec2Vec2(rA, P); + cB.addMul(mB, P); + aB += iB * Vec2.crossVec2Vec2(rB, P); + } + else { + var C1 = Vec2.zero(); + C1.addCombine(1, cB, 1, rB); + C1.subCombine(1, cA, 1, rA); + var C2 = aB - aA - this.m_referenceAngle; // float + positionError = C1.length(); + angularError = math.abs(C2); + var C = new Vec3(C1.x, C1.y, C2); + var impulse = new Vec3(); + if (K.ez.z > 0.0) { + impulse = Vec3.neg(K.solve33(C)); + } + else { + var impulse2 = Vec2.neg(K.solve22(C1)); + impulse.set(impulse2.x, impulse2.y, 0.0); + } + var P = Vec2.neo(impulse.x, impulse.y); + cA.subMul(mA, P); + aA -= iA * (Vec2.crossVec2Vec2(rA, P) + impulse.z); + cB.addMul(mB, P); + aB += iB * (Vec2.crossVec2Vec2(rB, P) + impulse.z); + } + this.m_bodyA.c_position.c = cA; + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c = cB; + this.m_bodyB.c_position.a = aB; + return positionError <= Settings.linearSlop && angularError <= Settings.angularSlop; }; - - core.prototype.box = function() { - this._padding = this._padding || 0; - - this.untick(this._layoutTiker); - this.tick(this._layoutTiker = function() { - if (this._mo_box == this._ts_touch) { - return; + WeldJoint.TYPE = 'weld-joint'; + return WeldJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS = { + enableMotor: false, + maxMotorTorque: 0.0, + motorSpeed: 0.0, + frequencyHz: 2.0, + dampingRatio: 0.7, +}; +/** + * A wheel joint. This joint provides two degrees of freedom: translation along + * an axis fixed in bodyA and rotation in the plane. In other words, it is a + * point to line constraint with a rotational motor and a linear spring/damper. + * This joint is designed for vehicle suspensions. + */ +var WheelJoint = /** @class */ (function (_super) { + __extends(WheelJoint, _super); + // @ts-ignore + function WheelJoint(def, bodyA, bodyB, anchor, axis) { + var _this = this; + // @ts-ignore + if (!(_this instanceof WheelJoint)) { + return new WheelJoint(def, bodyA, bodyB, anchor, axis); } - this._mo_box = this._ts_touch; - - var width = 0, height = 0; - var child, next = this.first(true); - while (child = next) { - next = child.next(true); - child.matrix(true); - var w = child.pin('boxWidth'); - var h = child.pin('boxHeight'); - width = Math.max(width, w); - height = Math.max(height, h); - } - width += 2 * this._padding; - height += 2 * this._padding; - this.pin('width') != width && this.pin('width', width); - this.pin('height') != height && this.pin('height', height); - }); - return this; + def = options(def, DEFAULTS); + _this = _super.call(this, def, bodyA, bodyB) || this; + /** @internal */ _this.m_ax = Vec2.zero(); + /** @internal */ _this.m_ay = Vec2.zero(); + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = WheelJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + // @ts-ignore localAxis + _this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || def.localAxis || Vec2.neo(1.0, 0.0)); + _this.m_localYAxisA = Vec2.crossNumVec2(1.0, _this.m_localXAxisA); + _this.m_mass = 0.0; + _this.m_impulse = 0.0; + _this.m_motorMass = 0.0; + _this.m_motorImpulse = 0.0; + _this.m_springMass = 0.0; + _this.m_springImpulse = 0.0; + _this.m_maxMotorTorque = def.maxMotorTorque; + _this.m_motorSpeed = def.motorSpeed; + _this.m_enableMotor = def.enableMotor; + _this.m_frequencyHz = def.frequencyHz; + _this.m_dampingRatio = def.dampingRatio; + _this.m_bias = 0.0; + _this.m_gamma = 0.0; + return _this; + // Linear constraint (point-to-line) + // d = pB - pA = xB + rB - xA - rA + // C = dot(ay, d) + // Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA, + // rA)) + // = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB, + // ay), vB) + // J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)] + // Spring linear constraint + // C = dot(ax, d) + // Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) + + // dot(cross(rB, ax), vB) + // J = [-ax -cross(d+rA, ax) ax cross(rB, ax)] + // Motor rotational constraint + // Cdot = wB - wA + // J = [0 0 -1 0 0 1] + } + /** @internal */ + WheelJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + enableMotor: this.m_enableMotor, + maxMotorTorque: this.m_maxMotorTorque, + motorSpeed: this.m_motorSpeed, + frequencyHz: this.m_frequencyHz, + dampingRatio: this.m_dampingRatio, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + localAxisA: this.m_localXAxisA, + }; }; - - core.layer = function() { - return core.create().layer().label('Layer'); + /** @internal */ + WheelJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new WheelJoint(data); + return joint; }; - - core.prototype.layer = function() { - - this.untick(this._layoutTiker); - this.tick(this._layoutTiker = function() { - var parent = this.parent(); - if (parent) { - var width = parent.pin('width'); - if (this.pin('width') != width) { - this.pin('width', width); - } - var height = parent.pin('height'); - if (this.pin('height') != height) { - this.pin('height', height); - } + /** @internal */ + WheelJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + if (def.localAxisA) { + this.m_localXAxisA.setVec2(def.localAxisA); + this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA)); } - }, true); - return this; }; - - // TODO: move padding to pin - core.prototype.padding = function(pad) { - this._padding = pad; - return this; + /** + * The local anchor point relative to bodyA's origin. + */ + WheelJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; }; - - core.prototype.spacing = function(space) { - this._spacing = space; - return this; + /** + * The local anchor point relative to bodyB's origin. + */ + WheelJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; }; - - function _identity(x) { - return x; - }var _cache = {}; - var _modes = {}; - var _easings = {}; - - function Easing(token) { - if (typeof token === 'function') { - return token; - } - if (typeof token !== 'string') { - return _identity; - } - var fn = _cache[token]; - if (fn) { - return fn; - } - var match = /^(\w+)(-(in|out|in-out|out-in))?(\((.*)\))?$/i.exec(token); - if (!match || !match.length) { - return _identity; - } - var easing = _easings[match[1]]; - var mode = _modes[match[3]]; - var params = match[5]; - if (easing && easing.fn) { - fn = easing.fn; - } else if (easing && easing.fc) { - fn = easing.fc.apply(easing.fc, params - && params.replace(/\s+/, '').split(',')); - } else { - fn = _identity; - } - if (mode) { - fn = mode.fn(fn); - } - // TODO: It can be a memory leak with different `params`. - _cache[token] = fn; - return fn; - } - Easing.add = function(data) { - // TODO: create a map of all { name-mode : data } - var names = (data.name || data.mode).split(/\s+/); - for (var i = 0; i < names.length; i++) { - var name = names[i]; - if (name) { - (data.name ? _easings : _modes)[name] = data; - } - } + /** + * The local joint axis relative to bodyA. + */ + WheelJoint.prototype.getLocalAxisA = function () { + return this.m_localXAxisA; }; - - Easing.add({ - mode : 'in', - fn : function(f) { - return f; - } - }); - - Easing.add({ - mode : 'out', - fn : function(f) { - return function(t) { - return 1 - f(1 - t); - }; - } - }); - - Easing.add({ - mode : 'in-out', - fn : function(f) { - return function(t) { - return (t < 0.5) ? (f(2 * t) / 2) : (1 - f(2 * (1 - t)) / 2); - }; - } - }); - - Easing.add({ - mode : 'out-in', - fn : function(f) { - return function(t) { - return (t < 0.5) ? (1 - f(2 * (1 - t)) / 2) : (f(2 * t) / 2); - }; - } - }); - - Easing.add({ - name : 'linear', - fn : function(t) { - return t; - } - }); - - Easing.add({ - name : 'quad', - fn : function(t) { - return t * t; - } - }); - - Easing.add({ - name : 'cubic', - fn : function(t) { - return t * t * t; - } - }); - - Easing.add({ - name : 'quart', - fn : function(t) { - return t * t * t * t; - } - }); - - Easing.add({ - name : 'quint', - fn : function(t) { - return t * t * t * t * t; - } - }); - - Easing.add({ - name : 'sin sine', - fn : function(t) { - return 1 - Math.cos(t * Math.PI / 2); - } - }); - - Easing.add({ - name : 'exp expo', - fn : function(t) { - return t == 0 ? 0 : Math.pow(2, 10 * (t - 1)); - } - }); - - Easing.add({ - name : 'circle circ', - fn : function(t) { - return 1 - Math.sqrt(1 - t * t); - } - }); - - Easing.add({ - name : 'bounce', - fn : function(t) { - return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 - * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 - * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t - + .984375; - } - }); - - Easing.add({ - name : 'poly', - fc : function(e) { - return function(t) { - return Math.pow(t, e); - }; - } - }); - - Easing.add({ - name : 'elastic', - fc : function(a, p) { - p = p || 0.45; - a = a || 1; - var s = p / (2 * Math.PI) * Math.asin(1 / a); - return function(t) { - return 1 + a * Math.pow(2, -10 * t) - * Math.sin((t - s) * (2 * Math.PI) / p); - }; - } - }); - - Easing.add({ - name : 'back', - fc : function(s) { - s = typeof s !== 'undefined' ? s : 1.70158; - return function(t) { - return t * t * ((s + 1) * t - s); - }; - } - }); - - var easing = Easing; - - core.prototype.tween = function(duration, delay, append) { - if (typeof duration !== 'number') { - append = duration, delay = 0, duration = 0; - } else if (typeof delay !== 'number') { - append = delay, delay = 0; - } - - if (!this._tweens) { - this._tweens = []; - var ticktime = 0; - this.tick(function(elapsed, now, last) { - if (!this._tweens.length) { - return; - } - - // ignore old elapsed - var ignore = ticktime != last; - ticktime = now; - if (ignore) { - return true; - } - - var head = this._tweens[0]; - - var next = head.tick(this, elapsed, now, last); - - if (next && head === this._tweens[0]) { - this._tweens.shift(); - } - - if (Array.isArray(next)) { - for (var i = 0; i < next.length; i++) { - try { - next[i].call(this); - } catch (e) { - console.log(e); - } - } - } else if (typeof next === 'object') { - this._tweens.unshift(next); - } - - return true; - }, true); - } - - this.touch(); - if (!append) { - this._tweens.length = 0; - } - var tween = new Tween(this, duration, delay); - this._tweens.push(tween); - return tween; + /** + * Get the current joint translation, usually in meters. + */ + WheelJoint.prototype.getJointTranslation = function () { + var bA = this.m_bodyA; + var bB = this.m_bodyB; + var pA = bA.getWorldPoint(this.m_localAnchorA); // Vec2 + var pB = bB.getWorldPoint(this.m_localAnchorB); // Vec2 + var d = Vec2.sub(pB, pA); // Vec2 + var axis = bA.getWorldVector(this.m_localXAxisA); // Vec2 + var translation = Vec2.dot(d, axis); // float + return translation; + }; + /** + * Get the current joint translation speed, usually in meters per second. + */ + WheelJoint.prototype.getJointSpeed = function () { + var wA = this.m_bodyA.m_angularVelocity; + var wB = this.m_bodyB.m_angularVelocity; + return wB - wA; + }; + /** + * Is the joint motor enabled? + */ + WheelJoint.prototype.isMotorEnabled = function () { + return this.m_enableMotor; + }; + /** + * Enable/disable the joint motor. + */ + WheelJoint.prototype.enableMotor = function (flag) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableMotor = flag; + }; + /** + * Set the motor speed, usually in radians per second. + */ + WheelJoint.prototype.setMotorSpeed = function (speed) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_motorSpeed = speed; }; - - function Tween(owner, duration, delay) { - this._end = {}; - this._duration = duration || 400; - this._delay = delay || 0; - - this._owner = owner; - this._time = 0; - } - Tween.prototype.tick = function(node, elapsed, now, last) { - this._time += elapsed; - - if (this._time < this._delay) { - return; - } - - var time = this._time - this._delay; - - if (!this._start) { - this._start = {}; - for ( var key in this._end) { - this._start[key] = this._owner.pin(key); - } - } - - var p, over; - if (time < this._duration) { - p = time / this._duration; - over = false; - } else { - p = 1; - over = true; - } - - if (typeof this._easing == 'function') { - p = this._easing(p); - } - - var q = 1 - p; - - for ( var key in this._end) { - this._owner.pin(key, this._start[key] * q + this._end[key] * p); - } - - if (over) { - var actions = [this._hide, this._remove, this._done]; - actions = actions.filter(function( element ) { - return typeof element === 'function'; - }); - return this._next || actions; - } + /** + * Get the motor speed, usually in radians per second. + */ + WheelJoint.prototype.getMotorSpeed = function () { + return this.m_motorSpeed; }; - - Tween.prototype.tween = function(duration, delay) { - return this._next = new Tween(this._owner, duration, delay); + /** + * Set/Get the maximum motor force, usually in N-m. + */ + WheelJoint.prototype.setMaxMotorTorque = function (torque) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_maxMotorTorque = torque; }; - - Tween.prototype.duration = function(duration) { - this._duration = duration; - return this; + WheelJoint.prototype.getMaxMotorTorque = function () { + return this.m_maxMotorTorque; }; - - Tween.prototype.delay = function(delay) { - this._delay = delay; - return this; + /** + * Get the current motor torque given the inverse time step, usually in N-m. + */ + WheelJoint.prototype.getMotorTorque = function (inv_dt) { + return inv_dt * this.m_motorImpulse; }; - - Tween.prototype.ease = function(easing$1) { - this._easing = easing(easing$1); - return this; + /** + * Set/Get the spring frequency in hertz. Setting the frequency to zero disables + * the spring. + */ + WheelJoint.prototype.setSpringFrequencyHz = function (hz) { + this.m_frequencyHz = hz; }; - - Tween.prototype.done = function(fn) { - this._done = fn; - return this; + WheelJoint.prototype.getSpringFrequencyHz = function () { + return this.m_frequencyHz; }; - - Tween.prototype.hide = function() { - this._hide = function() { - this.hide(); - }; - return this; + /** + * Set/Get the spring damping ratio + */ + WheelJoint.prototype.setSpringDampingRatio = function (ratio) { + this.m_dampingRatio = ratio; }; - - Tween.prototype.remove = function() { - this._remove = function() { - this.remove(); - }; - return this; + WheelJoint.prototype.getSpringDampingRatio = function () { + return this.m_dampingRatio; }; - - Tween.prototype.pin = function(a, b) { - if (typeof a === 'object') { - for ( var attr in a) { - pinning(this._owner, this._end, attr, a[attr]); - } - } else if (typeof b !== 'undefined') { - pinning(this._owner, this._end, a, b); - } - return this; + /** + * Get the anchor point on bodyA in world coordinates. + */ + WheelJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); }; - - function pinning(node, map, key, value) { - if (typeof node.pin(key) === 'number') { - map[key] = value; - } else if (typeof node.pin(key + 'X') === 'number' - && typeof node.pin(key + 'Y') === 'number') { - map[key + 'X'] = value; - map[key + 'Y'] = value; - } - } - - pin._add_shortcuts(Tween); - /** - * @deprecated Use .done(fn) instead. + * Get the anchor point on bodyB in world coordinates. */ - Tween.prototype.then = function(fn) { - this.done(fn); - return this; + WheelJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); }; - /** - * @deprecated NOOP + * Get the reaction force on bodyB at the joint anchor in Newtons. */ - Tween.prototype.clear = function(forward) { - return this; + WheelJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax).mul(inv_dt); }; - - core._load(function(stage, elem) { - Mouse.subscribe(stage, elem); - }); - - // TODO: capture mouse - - Mouse.CLICK = 'click'; - Mouse.START = 'touchstart mousedown'; - Mouse.MOVE = 'touchmove mousemove'; - Mouse.END = 'touchend mouseup'; - Mouse.CANCEL = 'touchcancel mousecancel'; - - Mouse.subscribe = function(stage, elem) { - if (stage.mouse) { + /** + * Get the reaction torque on bodyB in N*m. + */ + WheelJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_motorImpulse; + }; + WheelJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + // Compute the effective masses. + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + var d = Vec2.zero(); + d.addCombine(1, cB, 1, rB); + d.subCombine(1, cA, 1, rA); // Vec2 + // Point to line constraint + { + this.m_ay = Rot.mulVec2(qA, this.m_localYAxisA); + this.m_sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ay); + this.m_sBy = Vec2.crossVec2Vec2(rB, this.m_ay); + this.m_mass = mA + mB + iA * this.m_sAy * this.m_sAy + iB * this.m_sBy + * this.m_sBy; + if (this.m_mass > 0.0) { + this.m_mass = 1.0 / this.m_mass; + } + } + // Spring constraint + this.m_springMass = 0.0; + this.m_bias = 0.0; + this.m_gamma = 0.0; + if (this.m_frequencyHz > 0.0) { + this.m_ax = Rot.mulVec2(qA, this.m_localXAxisA); + this.m_sAx = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ax); + this.m_sBx = Vec2.crossVec2Vec2(rB, this.m_ax); + var invMass = mA + mB + iA * this.m_sAx * this.m_sAx + iB * this.m_sBx + * this.m_sBx; // float + if (invMass > 0.0) { + this.m_springMass = 1.0 / invMass; + var C = Vec2.dot(d, this.m_ax); // float + // Frequency + var omega = 2.0 * math.PI * this.m_frequencyHz; // float + // Damping coefficient + var damp = 2.0 * this.m_springMass * this.m_dampingRatio * omega; // float + // Spring stiffness + var k = this.m_springMass * omega * omega; // float + // magic formulas + var h = step.dt; // float + this.m_gamma = h * (damp + h * k); + if (this.m_gamma > 0.0) { + this.m_gamma = 1.0 / this.m_gamma; + } + this.m_bias = C * h * k * this.m_gamma; + this.m_springMass = invMass + this.m_gamma; + if (this.m_springMass > 0.0) { + this.m_springMass = 1.0 / this.m_springMass; + } + } + } + else { + this.m_springImpulse = 0.0; + } + // Rotational motor + if (this.m_enableMotor) { + this.m_motorMass = iA + iB; + if (this.m_motorMass > 0.0) { + this.m_motorMass = 1.0 / this.m_motorMass; + } + } + else { + this.m_motorMass = 0.0; + this.m_motorImpulse = 0.0; + } + if (step.warmStarting) { + // Account for variable time step. + this.m_impulse *= step.dtRatio; + this.m_springImpulse *= step.dtRatio; + this.m_motorImpulse *= step.dtRatio; + var P = Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax); + var LA = this.m_impulse * this.m_sAy + this.m_springImpulse * this.m_sAx + this.m_motorImpulse; + var LB = this.m_impulse * this.m_sBy + this.m_springImpulse * this.m_sBx + this.m_motorImpulse; + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * LA; + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * LB; + } + else { + this.m_impulse = 0.0; + this.m_springImpulse = 0.0; + this.m_motorImpulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + WheelJoint.prototype.solveVelocityConstraints = function (step) { + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + // Solve spring constraint + { + var Cdot = Vec2.dot(this.m_ax, vB) - Vec2.dot(this.m_ax, vA) + this.m_sBx + * wB - this.m_sAx * wA; // float + var impulse = -this.m_springMass + * (Cdot + this.m_bias + this.m_gamma * this.m_springImpulse); // float + this.m_springImpulse += impulse; + var P = Vec2.mulNumVec2(impulse, this.m_ax); // Vec2 + var LA = impulse * this.m_sAx; // float + var LB = impulse * this.m_sBx; // float + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + // Solve rotational motor constraint + { + var Cdot = wB - wA - this.m_motorSpeed; // float + var impulse = -this.m_motorMass * Cdot; // float + var oldImpulse = this.m_motorImpulse; // float + var maxImpulse = step.dt * this.m_maxMotorTorque; // float + this.m_motorImpulse = math.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_motorImpulse - oldImpulse; + wA -= iA * impulse; + wB += iB * impulse; + } + // Solve point to line constraint + { + var Cdot = Vec2.dot(this.m_ay, vB) - Vec2.dot(this.m_ay, vA) + this.m_sBy + * wB - this.m_sAy * wA; // float + var impulse = -this.m_mass * Cdot; // float + this.m_impulse += impulse; + var P = Vec2.mulNumVec2(impulse, this.m_ay); // Vec2 + var LA = impulse * this.m_sAy; // float + var LB = impulse * this.m_sBy; // float + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + WheelJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + var d = Vec2.zero(); + d.addCombine(1, cB, 1, rB); + d.subCombine(1, cA, 1, rA); + var ay = Rot.mulVec2(qA, this.m_localYAxisA); + var sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), ay); // float + var sBy = Vec2.crossVec2Vec2(rB, ay); // float + var C = Vec2.dot(d, ay); // float + var k = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_sAy + * this.m_sAy + this.m_invIB * this.m_sBy * this.m_sBy; // float + var impulse; // float + if (k != 0.0) { + impulse = -C / k; + } + else { + impulse = 0.0; + } + var P = Vec2.mulNumVec2(impulse, ay); // Vec2 + var LA = impulse * sAy; // float + var LB = impulse * sBy; // float + cA.subMul(this.m_invMassA, P); + aA -= this.m_invIA * LA; + cB.addMul(this.m_invMassB, P); + aB += this.m_invIB * LB; + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + return math.abs(C) <= Settings.linearSlop; + }; + WheelJoint.TYPE = 'wheel-joint'; + return WheelJoint; +}(Joint)); + +var SID = 0; +function Serializer(opts) { + var _a; + opts = opts || {}; + var rootClass = opts.rootClass || World; + var preSerialize = opts.preSerialize || function (obj) { return obj; }; + var postSerialize = opts.postSerialize || function (data, obj) { return data; }; + var preDeserialize = opts.preDeserialize || function (data) { return data; }; + var postDeserialize = opts.postDeserialize || function (obj, data) { return obj; }; + // This is used to create ref objects during serialize + var refTypes = { + World: World, + Body: Body, + Joint: Joint, + Fixture: Fixture, + Shape: Shape, + }; + // This is used by restore to deserialize objects and refs + var restoreTypes = __assign({ Vec2: Vec2, + Vec3: Vec3 }, refTypes); + var CLASS_BY_TYPE_PROP = (_a = {}, + _a[Body.STATIC] = Body, + _a[Body.DYNAMIC] = Body, + _a[Body.KINEMATIC] = Body, + _a[ChainShape.TYPE] = ChainShape, + _a[BoxShape.TYPE] = BoxShape, + _a[EdgeShape.TYPE] = EdgeShape, + _a[PolygonShape.TYPE] = PolygonShape, + _a[CircleShape.TYPE] = CircleShape, + _a[DistanceJoint.TYPE] = DistanceJoint, + _a[FrictionJoint.TYPE] = FrictionJoint, + _a[GearJoint.TYPE] = GearJoint, + _a[MotorJoint.TYPE] = MotorJoint, + _a[MouseJoint.TYPE] = MouseJoint, + _a[PrismaticJoint.TYPE] = PrismaticJoint, + _a[PulleyJoint.TYPE] = PulleyJoint, + _a[RevoluteJoint.TYPE] = RevoluteJoint, + _a[RopeJoint.TYPE] = RopeJoint, + _a[WeldJoint.TYPE] = WeldJoint, + _a[WheelJoint.TYPE] = WheelJoint, + _a); + this.toJson = function (root) { + var json = []; + var queue = [root]; + var refMap = {}; + function storeRef(value, typeName) { + value.__sid = value.__sid || ++SID; + if (!refMap[value.__sid]) { + queue.push(value); + var index = json.length + queue.length; + var ref = { + refIndex: index, + refType: typeName + }; + refMap[value.__sid] = ref; + } + return refMap[value.__sid]; + } + function serialize(obj) { + obj = preSerialize(obj); + var data = obj._serialize(); + data = postSerialize(data, obj); + return data; + } + function toJson(value, top) { + if (typeof value !== 'object' || value === null) { + return value; + } + if (typeof value._serialize === 'function') { + if (value !== top) { + // tslint:disable-next-line:no-for-in + for (var typeName in refTypes) { + if (value instanceof refTypes[typeName]) { + return storeRef(value, typeName); + } + } + } + value = serialize(value); + } + if (Array.isArray(value)) { + var newValue = []; + for (var key = 0; key < value.length; key++) { + newValue[key] = toJson(value[key]); + } + value = newValue; + } + else { + var newValue = {}; + // tslint:disable-next-line:no-for-in + for (var key in value) { + if (value.hasOwnProperty(key)) { + newValue[key] = toJson(value[key]); + } + } + value = newValue; + } + return value; + } + while (queue.length) { + var obj = queue.shift(); + var str = toJson(obj, obj); + json.push(str); + } + return json; + }; + this.fromJson = function (json) { + var refMap = {}; + function findDeserilizer(data, cls) { + if (!cls || !cls._deserialize) { + cls = CLASS_BY_TYPE_PROP[data.type]; + } + return cls && cls._deserialize; + } + /** + * Deserialize a data object. + */ + function deserialize(cls, data, ctx) { + var deserializer = findDeserilizer(data, cls); + if (!deserializer) { + return; + } + data = preDeserialize(data); + var obj = deserializer(data, ctx, restoreRef); + obj = postDeserialize(obj, data); + return obj; + } + /** + * Restore a ref object or deserialize a data object. + * + * This is passed as callback to class deserializers. + */ + function restoreRef(cls, ref, ctx) { + if (!ref.refIndex) { + return cls && cls._deserialize && deserialize(cls, ref, ctx); + } + cls = restoreTypes[ref.refType] || cls; + var index = ref.refIndex; + if (!refMap[index]) { + var data = json[index]; + var obj = deserialize(cls, data, ctx); + refMap[index] = obj; + } + return refMap[index]; + } + var root = rootClass._deserialize(json[0], null, restoreRef); + return root; + }; +} +var serializer = new Serializer(); +Serializer.toJson = serializer.toJson; +Serializer.fromJson = serializer.fromJson; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact); +function CircleCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + CollideCircles(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); +} +var CollideCircles = function (manifold, circleA, xfA, circleB, xfB) { + manifold.pointCount = 0; + var pA = Transform.mulVec2(xfA, circleA.m_p); + var pB = Transform.mulVec2(xfB, circleB.m_p); + var distSqr = Vec2.distanceSquared(pB, pA); + var rA = circleA.m_radius; + var rB = circleB.m_radius; + var radius = rA + rB; + if (distSqr > radius * radius) { + return; + } + manifold.type = ManifoldType.e_circles; + manifold.localPoint.setVec2(circleA.m_p); + manifold.localNormal.setZero(); + manifold.pointCount = 1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(EdgeShape.TYPE, CircleShape.TYPE, EdgeCircleContact); +Contact.addType(ChainShape.TYPE, CircleShape.TYPE, ChainCircleContact); +function EdgeCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + var shapeA = fixtureA.getShape(); + var shapeB = fixtureB.getShape(); + CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB); +} +function ChainCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + var chain = fixtureA.getShape(); + var edge = new EdgeShape(); + chain.getChildEdge(edge, indexA); + var shapeA = edge; + var shapeB = fixtureB.getShape(); + CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB); +} +// Compute contact points for edge versus circle. +// This accounts for edge connectivity. +var CollideEdgeCircle = function (manifold, edgeA, xfA, circleB, xfB) { + manifold.pointCount = 0; + // Compute circle in frame of edge + var Q = Transform.mulTVec2(xfA, Transform.mulVec2(xfB, circleB.m_p)); + var A = edgeA.m_vertex1; + var B = edgeA.m_vertex2; + var e = Vec2.sub(B, A); + // Barycentric coordinates + var u = Vec2.dot(e, Vec2.sub(B, Q)); + var v = Vec2.dot(e, Vec2.sub(Q, A)); + var radius = edgeA.m_radius + circleB.m_radius; + // Region A + if (v <= 0.0) { + var P_1 = Vec2.clone(A); + var d_1 = Vec2.sub(Q, P_1); + var dd_1 = Vec2.dot(d_1, d_1); + if (dd_1 > radius * radius) { + return; + } + // Is there an edge connected to A? + if (edgeA.m_hasVertex0) { + var A1 = edgeA.m_vertex0; + var B1 = A; + var e1 = Vec2.sub(B1, A1); + var u1 = Vec2.dot(e1, Vec2.sub(B1, Q)); + // Is the circle in Region AB of the previous edge? + if (u1 > 0.0) { + return; + } + } + manifold.type = ManifoldType.e_circles; + manifold.localNormal.setZero(); + manifold.localPoint.setVec2(P_1); + manifold.pointCount = 1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; + return; + } + // Region B + if (u <= 0.0) { + var P_2 = Vec2.clone(B); + var d_2 = Vec2.sub(Q, P_2); + var dd_2 = Vec2.dot(d_2, d_2); + if (dd_2 > radius * radius) { + return; + } + // Is there an edge connected to B? + if (edgeA.m_hasVertex3) { + var B2 = edgeA.m_vertex3; + var A2 = B; + var e2 = Vec2.sub(B2, A2); + var v2 = Vec2.dot(e2, Vec2.sub(Q, A2)); + // Is the circle in Region AB of the next edge? + if (v2 > 0.0) { + return; + } + } + manifold.type = ManifoldType.e_circles; + manifold.localNormal.setZero(); + manifold.localPoint.setVec2(P_2); + manifold.pointCount = 1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 1; + manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; + return; + } + // Region AB + var den = Vec2.dot(e, e); + var P = Vec2.combine(u / den, A, v / den, B); + var d = Vec2.sub(Q, P); + var dd = Vec2.dot(d, d); + if (dd > radius * radius) { + return; + } + var n = Vec2.neo(-e.y, e.x); + if (Vec2.dot(n, Vec2.sub(Q, A)) < 0.0) { + n.setNum(-n.x, -n.y); + } + n.normalize(); + manifold.type = ManifoldType.e_faceA; + manifold.localNormal = n; + manifold.localPoint.setVec2(A); + manifold.pointCount = 1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = ContactFeatureType.e_face; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(PolygonShape.TYPE, PolygonShape.TYPE, PolygonContact); +function PolygonContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + CollidePolygons(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); +} +/** + * Find the max separation between poly1 and poly2 using edge normals from + * poly1. + */ +function findMaxSeparation(poly1, xf1, poly2, xf2, output) { + var count1 = poly1.m_count; + var count2 = poly2.m_count; + var n1s = poly1.m_normals; + var v1s = poly1.m_vertices; + var v2s = poly2.m_vertices; + var xf = Transform.mulTXf(xf2, xf1); + var bestIndex = 0; + var maxSeparation = -Infinity; + for (var i = 0; i < count1; ++i) { + // Get poly1 normal in frame2. + var n = Rot.mulVec2(xf.q, n1s[i]); + var v1 = Transform.mulVec2(xf, v1s[i]); + // Find deepest point for normal i. + var si = Infinity; + for (var j = 0; j < count2; ++j) { + var sij = Vec2.dot(n, v2s[j]) - Vec2.dot(n, v1); + if (sij < si) { + si = sij; + } + } + if (si > maxSeparation) { + maxSeparation = si; + bestIndex = i; + } + } + // used to keep last FindMaxSeparation call values + output.maxSeparation = maxSeparation; + output.bestIndex = bestIndex; +} +function findIncidentEdge(c, poly1, xf1, edge1, poly2, xf2) { + var normals1 = poly1.m_normals; + var count2 = poly2.m_count; + var vertices2 = poly2.m_vertices; + var normals2 = poly2.m_normals; + // Get the normal of the reference edge in poly2's frame. + var normal1 = Rot.mulTVec2(xf2.q, Rot.mulVec2(xf1.q, normals1[edge1])); + // Find the incident edge on poly2. + var index = 0; + var minDot = Infinity; + for (var i = 0; i < count2; ++i) { + var dot = Vec2.dot(normal1, normals2[i]); + if (dot < minDot) { + minDot = dot; + index = i; + } + } + // Build the clip vertices for the incident edge. + var i1 = index; + var i2 = i1 + 1 < count2 ? i1 + 1 : 0; + c[0].v = Transform.mulVec2(xf2, vertices2[i1]); + c[0].id.cf.indexA = edge1; + c[0].id.cf.indexB = i1; + c[0].id.cf.typeA = ContactFeatureType.e_face; + c[0].id.cf.typeB = ContactFeatureType.e_vertex; + c[1].v = Transform.mulVec2(xf2, vertices2[i2]); + c[1].id.cf.indexA = edge1; + c[1].id.cf.indexB = i2; + c[1].id.cf.typeA = ContactFeatureType.e_face; + c[1].id.cf.typeB = ContactFeatureType.e_vertex; +} +var maxSeparation = { + maxSeparation: 0, + bestIndex: 0, +}; +/** + * + * Find edge normal of max separation on A - return if separating axis is found
+ * Find edge normal of max separation on B - return if separation axis is found
+ * Choose reference edge as min(minA, minB)
+ * Find incident edge
+ * Clip + * + * The normal points from 1 to 2 + */ +var CollidePolygons = function (manifold, polyA, xfA, polyB, xfB) { + manifold.pointCount = 0; + var totalRadius = polyA.m_radius + polyB.m_radius; + findMaxSeparation(polyA, xfA, polyB, xfB, maxSeparation); + var edgeA = maxSeparation.bestIndex; + var separationA = maxSeparation.maxSeparation; + if (separationA > totalRadius) + return; + findMaxSeparation(polyB, xfB, polyA, xfA, maxSeparation); + var edgeB = maxSeparation.bestIndex; + var separationB = maxSeparation.maxSeparation; + if (separationB > totalRadius) + return; + var poly1; // reference polygon + var poly2; // incident polygon + var xf1; + var xf2; + var edge1; // reference edge + var flip; + var k_tol = 0.1 * Settings.linearSlop; + if (separationB > separationA + k_tol) { + poly1 = polyB; + poly2 = polyA; + xf1 = xfB; + xf2 = xfA; + edge1 = edgeB; + manifold.type = ManifoldType.e_faceB; + flip = 1; + } + else { + poly1 = polyA; + poly2 = polyB; + xf1 = xfA; + xf2 = xfB; + edge1 = edgeA; + manifold.type = ManifoldType.e_faceA; + flip = 0; + } + var incidentEdge = [new ClipVertex(), new ClipVertex()]; + findIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2); + var count1 = poly1.m_count; + var vertices1 = poly1.m_vertices; + var iv1 = edge1; + var iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0; + var v11 = vertices1[iv1]; + var v12 = vertices1[iv2]; + var localTangent = Vec2.sub(v12, v11); + localTangent.normalize(); + var localNormal = Vec2.crossVec2Num(localTangent, 1.0); + var planePoint = Vec2.combine(0.5, v11, 0.5, v12); + var tangent = Rot.mulVec2(xf1.q, localTangent); + var normal = Vec2.crossVec2Num(tangent, 1.0); + v11 = Transform.mulVec2(xf1, v11); + v12 = Transform.mulVec2(xf1, v12); + // Face offset. + var frontOffset = Vec2.dot(normal, v11); + // Side offsets, extended by polytope skin thickness. + var sideOffset1 = -Vec2.dot(tangent, v11) + totalRadius; + var sideOffset2 = Vec2.dot(tangent, v12) + totalRadius; + // Clip incident edge against extruded edge1 side edges. + var clipPoints1 = [new ClipVertex(), new ClipVertex()]; + var clipPoints2 = [new ClipVertex(), new ClipVertex()]; + var np; + // Clip to box side 1 + np = clipSegmentToLine(clipPoints1, incidentEdge, Vec2.neg(tangent), sideOffset1, iv1); + if (np < 2) { return; - } - - stage.mouse = new Mouse(stage, elem); - - // `click` events are synthesized from start/end events on same nodes - // `mousecancel` events are synthesized on blur or mouseup outside element - - elem.addEventListener('touchstart', handleStart); - elem.addEventListener('touchend', handleEnd); - elem.addEventListener('touchmove', handleMove); - elem.addEventListener('touchcancel', handleCancel); - - elem.addEventListener('mousedown', handleStart); - elem.addEventListener('mouseup', handleEnd); - elem.addEventListener('mousemove', handleMove); - - document.addEventListener('mouseup', handleCancel); - window.addEventListener("blur", handleCancel); - - var clicklist = [], cancellist = []; - - function handleStart(event) { - event.preventDefault(); - stage.mouse.locate(event); - // false && console.log('Mouse Start: ' + event.type + ' ' + mouse); - stage.mouse.publish(event.type, event); - - stage.mouse.lookup('click', clicklist); - stage.mouse.lookup('mousecancel', cancellist); - } - - function handleMove(event) { - event.preventDefault(); - stage.mouse.locate(event); - stage.mouse.publish(event.type, event); - } - - function handleEnd(event) { - event.preventDefault(); - // up/end location is not available, last one is used instead - // false && console.log('Mouse End: ' + event.type + ' ' + mouse); - stage.mouse.publish(event.type, event); - - if (clicklist.length) { - // false && console.log('Mouse Click: ' + clicklist.length); - stage.mouse.publish('click', event, clicklist); + } + // Clip to negative box side 1 + np = clipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2); + if (np < 2) { + return; + } + // Now clipPoints2 contains the clipped points. + manifold.localNormal = localNormal; + manifold.localPoint = planePoint; + var pointCount = 0; + for (var i = 0; i < clipPoints2.length /* maxManifoldPoints */; ++i) { + var separation = Vec2.dot(normal, clipPoints2[i].v) - frontOffset; + if (separation <= totalRadius) { + var cp = manifold.points[pointCount]; + cp.localPoint.setVec2(Transform.mulTVec2(xf2, clipPoints2[i].v)); + cp.id = clipPoints2[i].id; + if (flip) { + // Swap features + var cf = cp.id.cf; + var indexA = cf.indexA; + var indexB = cf.indexB; + var typeA = cf.typeA; + var typeB = cf.typeB; + cf.indexA = indexB; + cf.indexB = indexA; + cf.typeA = typeB; + cf.typeB = typeA; + } + ++pointCount; } - cancellist.length = 0; - } + } + manifold.pointCount = pointCount; +}; - function handleCancel(event) { - if (cancellist.length) { - // false && console.log('Mouse Cancel: ' + event.type); - stage.mouse.publish('mousecancel', event, cancellist); +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(PolygonShape.TYPE, CircleShape.TYPE, PolygonCircleContact); +function PolygonCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + CollidePolygonCircle(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); +} +var CollidePolygonCircle = function (manifold, polygonA, xfA, circleB, xfB) { + manifold.pointCount = 0; + // Compute circle position in the frame of the polygon. + var c = Transform.mulVec2(xfB, circleB.m_p); + var cLocal = Transform.mulTVec2(xfA, c); + // Find the min separating edge. + var normalIndex = 0; + var separation = -Infinity; + var radius = polygonA.m_radius + circleB.m_radius; + var vertexCount = polygonA.m_count; + var vertices = polygonA.m_vertices; + var normals = polygonA.m_normals; + for (var i = 0; i < vertexCount; ++i) { + var s = Vec2.dot(normals[i], Vec2.sub(cLocal, vertices[i])); + if (s > radius) { + // Early out. + return; } - clicklist.length = 0; - } - }; - - function Mouse(stage, elem) { - if (!(this instanceof Mouse)) { - // old-style mouse subscription + if (s > separation) { + separation = s; + normalIndex = i; + } + } + // Vertices that subtend the incident face. + var vertIndex1 = normalIndex; + var vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0; + var v1 = vertices[vertIndex1]; + var v2 = vertices[vertIndex2]; + // If the center is inside the polygon ... + if (separation < math.EPSILON) { + manifold.pointCount = 1; + manifold.type = ManifoldType.e_faceA; + manifold.localNormal.setVec2(normals[normalIndex]); + manifold.localPoint.setCombine(0.5, v1, 0.5, v2); + manifold.points[0].localPoint = circleB.m_p; + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; return; - } - - var ratio = stage.viewport().ratio || 1; - - stage.on('viewport', function(size) { - ratio = size.ratio || ratio; - }); - - this.x = 0; - this.y = 0; - this.toString = function() { - return (this.x | 0) + 'x' + (this.y | 0); - }; - this.locate = function(event) { - locateElevent(elem, event, this); - this.x *= ratio; - this.y *= ratio; - }; - this.lookup = function(type, collect) { - this.type = type; - this.root = stage; - this.event = null; - collect.length = 0; - this.collect = collect; - - this.root.visit(this.visitor, this); - }; - this.publish = function(type, event, targets) { - this.type = type; - this.root = stage; - this.event = event; - this.collect = false; - this.timeStamp = Date.now(); - - if (targets) { - while (targets.length) - if (this.visitor.end(targets.shift(), this)) - break; - targets.length = 0; - } else { - this.root.visit(this.visitor, this); + } + // Compute barycentric coordinates + var u1 = Vec2.dot(Vec2.sub(cLocal, v1), Vec2.sub(v2, v1)); + var u2 = Vec2.dot(Vec2.sub(cLocal, v2), Vec2.sub(v1, v2)); + if (u1 <= 0.0) { + if (Vec2.distanceSquared(cLocal, v1) > radius * radius) { + return; } - }; - this.visitor = { - reverse : true, - visible : true, - start : function(node, mouse) { - return !node._flag(mouse.type); - }, - end : function(node, mouse) { - // mouse: event/collect, type, root - rel.raw = mouse.event; - rel.type = mouse.type; - rel.timeStamp = mouse.timeStamp; - rel.abs.x = mouse.x; - rel.abs.y = mouse.y; - - var listeners = node.listeners(mouse.type); - if (!listeners) { + manifold.pointCount = 1; + manifold.type = ManifoldType.e_faceA; + manifold.localNormal.setCombine(1, cLocal, -1, v1); + manifold.localNormal.normalize(); + manifold.localPoint = v1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; + } + else if (u2 <= 0.0) { + if (Vec2.distanceSquared(cLocal, v2) > radius * radius) { return; - } - node.matrix().inverse().map(mouse, rel); - if (!(node === mouse.root || node.attr('spy') || node.hitTest(rel))) { + } + manifold.pointCount = 1; + manifold.type = ManifoldType.e_faceA; + manifold.localNormal.setCombine(1, cLocal, -1, v2); + manifold.localNormal.normalize(); + manifold.localPoint.setVec2(v2); + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; + } + else { + var faceCenter = Vec2.mid(v1, v2); + var separation_1 = Vec2.dot(cLocal, normals[vertIndex1]) - Vec2.dot(faceCenter, normals[vertIndex1]); + if (separation_1 > radius) { return; - } - if (mouse.collect) { - mouse.collect.push(node); - } - if (mouse.event) { - var cancel = false; - for (var l = 0; l < listeners.length; l++) { - cancel = listeners[l].call(node, rel) ? true : cancel; - } - return cancel; - } } - }; + manifold.pointCount = 1; + manifold.type = ManifoldType.e_faceA; + manifold.localNormal.setVec2(normals[vertIndex1]); + manifold.localPoint.setVec2(faceCenter); + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; } - // TODO: define per mouse object with get-only x and y - var rel = {}, abs = {}; - - defineValue(rel, 'clone', function(obj) { - obj = obj || {}, obj.x = this.x, obj.y = this.y; - return obj; - }); - defineValue(rel, 'toString', function() { - return (this.x | 0) + 'x' + (this.y | 0) + ' (' + this.abs + ')'; - }); - defineValue(rel, 'abs', abs); - defineValue(abs, 'clone', function(obj) { - obj = obj || {}, obj.x = this.x, obj.y = this.y; - return obj; - }); - defineValue(abs, 'toString', function() { - return (this.x | 0) + 'x' + (this.y | 0); - }); +}; - function defineValue(obj, name, value) { - Object.defineProperty(obj, name, { - value : value - }); +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(EdgeShape.TYPE, PolygonShape.TYPE, EdgePolygonContact); +Contact.addType(ChainShape.TYPE, PolygonShape.TYPE, ChainPolygonContact); +function EdgePolygonContact(manifold, xfA, fA, indexA, xfB, fB, indexB) { + CollideEdgePolygon(manifold, fA.getShape(), xfA, fB.getShape(), xfB); +} +function ChainPolygonContact(manifold, xfA, fA, indexA, xfB, fB, indexB) { + var chain = fA.getShape(); + var edge = new EdgeShape(); + chain.getChildEdge(edge, indexA); + CollideEdgePolygon(manifold, edge, xfA, fB.getShape(), xfB); +} +var EPAxisType; +(function (EPAxisType) { + EPAxisType[EPAxisType["e_unknown"] = -1] = "e_unknown"; + EPAxisType[EPAxisType["e_edgeA"] = 1] = "e_edgeA"; + EPAxisType[EPAxisType["e_edgeB"] = 2] = "e_edgeB"; +})(EPAxisType || (EPAxisType = {})); +// unused? +var VertexType; +(function (VertexType) { + VertexType[VertexType["e_isolated"] = 0] = "e_isolated"; + VertexType[VertexType["e_concave"] = 1] = "e_concave"; + VertexType[VertexType["e_convex"] = 2] = "e_convex"; +})(VertexType || (VertexType = {})); +/** + * This structure is used to keep track of the best separating axis. + */ +var EPAxis = /** @class */ (function () { + function EPAxis() { } - - function locateElevent(el, ev, loc) { - // pageX/Y if available? - if (ev.touches && ev.touches.length) { - loc.x = ev.touches[0].clientX; - loc.y = ev.touches[0].clientY; - } else { - loc.x = ev.clientX; - loc.y = ev.clientY; - } - var rect = el.getBoundingClientRect(); - loc.x -= rect.left; - loc.y -= rect.top; - loc.x -= el.clientLeft | 0; - loc.y -= el.clientTop | 0; - return loc; + return EPAxis; +}()); +/** + * This holds polygon B expressed in frame A. + */ +var TempPolygon = /** @class */ (function () { + function TempPolygon() { + this.vertices = []; // [Settings.maxPolygonVertices] + this.normals = []; // [Settings.maxPolygonVertices]; + this.count = 0; } - var mouse = Mouse; - - /** - * Default loader for web. - */ - - - - core._supported = (function() { - var elem = document.createElement('canvas'); - return (elem.getContext && elem.getContext('2d')) ? true : false; - })(); - - window.addEventListener('load', function() { - if (core._supported) { - core.start(); - } - // TODO if not supported - }, false); - - core.config({ - 'app-loader' : AppLoader, - 'image-loader' : ImageLoader - }); - - function AppLoader(app, configs) { - configs = configs || {}; - var canvas = configs.canvas, context = null, full = false; - var width = 0, height = 0, ratio = 1; - - if (typeof canvas === 'string') { - canvas = document.getElementById(canvas); - } - - if (!canvas) { - canvas = document.getElementById('cutjs') - || document.getElementById('stage'); - } - - if (!canvas) { - full = true; - canvas = document.createElement('canvas'); - canvas.style.position = 'absolute'; - canvas.style.top = '0'; - canvas.style.left = '0'; - - var body = document.body; - body.insertBefore(canvas, body.firstChild); - } - - context = canvas.getContext('2d'); - - var devicePixelRatio = window.devicePixelRatio || 1; - var backingStoreRatio = context.webkitBackingStorePixelRatio - || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio - || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1; - ratio = devicePixelRatio / backingStoreRatio; - - var requestAnimationFrame = window.requestAnimationFrame - || window.msRequestAnimationFrame || window.mozRequestAnimationFrame - || window.webkitRequestAnimationFrame || window.oRequestAnimationFrame - || function(callback) { - return window.setTimeout(callback, 1000 / 60); - }; - var root = core.root(requestAnimationFrame, render); - - function render() { - if (width > 0 && height > 0) { - context.setTransform(1, 0, 0, 1, 0, 0); - context.clearRect(0, 0, width, height); - root.render(context); + return TempPolygon; +}()); +/** + * Reference face used for clipping + */ +var ReferenceFace = /** @class */ (function () { + function ReferenceFace() { + this.normal = Vec2.zero(); + this.sideNormal1 = Vec2.zero(); + this.sideNormal2 = Vec2.zero(); + } + return ReferenceFace; +}()); +// reused +var edgeAxis = new EPAxis(); +var polygonAxis = new EPAxis(); +var polygonBA = new TempPolygon(); +var rf = new ReferenceFace(); +/** + * This function collides and edge and a polygon, taking into account edge + * adjacency. + */ +var CollideEdgePolygon = function (manifold, edgeA, xfA, polygonB, xfB) { + // Algorithm: + // 1. Classify v1 and v2 + // 2. Classify polygon centroid as front or back + // 3. Flip normal if necessary + // 4. Initialize normal range to [-pi, pi] about face normal + // 5. Adjust normal range according to adjacent edges + // 6. Visit each separating axes, only accept axes within the range + // 7. Return if _any_ axis indicates separation + // 8. Clip + // let m_type1: VertexType; + // let m_type2: VertexType; + var xf = Transform.mulTXf(xfA, xfB); + var centroidB = Transform.mulVec2(xf, polygonB.m_centroid); + var v0 = edgeA.m_vertex0; + var v1 = edgeA.m_vertex1; + var v2 = edgeA.m_vertex2; + var v3 = edgeA.m_vertex3; + var hasVertex0 = edgeA.m_hasVertex0; + var hasVertex3 = edgeA.m_hasVertex3; + var edge1 = Vec2.sub(v2, v1); + edge1.normalize(); + var normal1 = Vec2.neo(edge1.y, -edge1.x); + var offset1 = Vec2.dot(normal1, Vec2.sub(centroidB, v1)); + var offset0 = 0.0; + var offset2 = 0.0; + var convex1 = false; + var convex2 = false; + var normal0; + var normal2; + // Is there a preceding edge? + if (hasVertex0) { + var edge0 = Vec2.sub(v1, v0); + edge0.normalize(); + normal0 = Vec2.neo(edge0.y, -edge0.x); + convex1 = Vec2.crossVec2Vec2(edge0, edge1) >= 0.0; + offset0 = Vec2.dot(normal0, centroidB) - Vec2.dot(normal0, v0); + } + // Is there a following edge? + if (hasVertex3) { + var edge2 = Vec2.sub(v3, v2); + edge2.normalize(); + normal2 = Vec2.neo(edge2.y, -edge2.x); + convex2 = Vec2.crossVec2Vec2(edge1, edge2) > 0.0; + offset2 = Vec2.dot(normal2, centroidB) - Vec2.dot(normal2, v2); + } + var front; + var normal = Vec2.zero(); + var lowerLimit = Vec2.zero(); + var upperLimit = Vec2.zero(); + // Determine front or back collision. Determine collision normal limits. + if (hasVertex0 && hasVertex3) { + if (convex1 && convex2) { + front = offset0 >= 0.0 || offset1 >= 0.0 || offset2 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal0); + upperLimit.setVec2(normal2); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setMul(-1, normal1); + } + } + else if (convex1) { + front = offset0 >= 0.0 || (offset1 >= 0.0 && offset2 >= 0.0); + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal0); + upperLimit.setVec2(normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal2); + upperLimit.setMul(-1, normal1); + } + } + else if (convex2) { + front = offset2 >= 0.0 || (offset0 >= 0.0 && offset1 >= 0.0); + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal1); + upperLimit.setVec2(normal2); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setMul(-1, normal0); + } + } + else { + front = offset0 >= 0.0 && offset1 >= 0.0 && offset2 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal1); + upperLimit.setVec2(normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal2); + upperLimit.setMul(-1, normal0); + } + } + } + else if (hasVertex0) { + if (convex1) { + front = offset0 >= 0.0 || offset1 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal0); + upperLimit.setMul(-1, normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setVec2(normal1); + upperLimit.setMul(-1, normal1); + } + } + else { + front = offset0 >= 0.0 && offset1 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal1); + upperLimit.setMul(-1, normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setVec2(normal1); + upperLimit.setMul(-1, normal0); + } + } + } + else if (hasVertex3) { + if (convex2) { + front = offset1 >= 0.0 || offset2 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setVec2(normal2); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setVec2(normal1); + } + } + else { + front = offset1 >= 0.0 && offset2 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setVec2(normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal2); + upperLimit.setVec2(normal1); + } + } + } + else { + front = offset1 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setMul(-1, normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setVec2(normal1); + upperLimit.setVec2(normal1); + } + } + // Get polygonB in frameA + polygonBA.count = polygonB.m_count; + for (var i = 0; i < polygonB.m_count; ++i) { + polygonBA.vertices[i] = Transform.mulVec2(xf, polygonB.m_vertices[i]); + polygonBA.normals[i] = Rot.mulVec2(xf.q, polygonB.m_normals[i]); + } + var radius = 2.0 * Settings.polygonRadius; + manifold.pointCount = 0; + { // ComputeEdgeSeparation + edgeAxis.type = EPAxisType.e_edgeA; + edgeAxis.index = front ? 0 : 1; + edgeAxis.separation = Infinity; + for (var i = 0; i < polygonBA.count; ++i) { + var s = Vec2.dot(normal, Vec2.sub(polygonBA.vertices[i], v1)); + if (s < edgeAxis.separation) { + edgeAxis.separation = s; + } + } + } + // If no valid normal can be found than this edge should not collide. + // @ts-ignore + if (edgeAxis.type == EPAxisType.e_unknown) { + return; + } + if (edgeAxis.separation > radius) { + return; + } + { // ComputePolygonSeparation + polygonAxis.type = EPAxisType.e_unknown; + polygonAxis.index = -1; + polygonAxis.separation = -Infinity; + var perp = Vec2.neo(-normal.y, normal.x); + for (var i = 0; i < polygonBA.count; ++i) { + var n = Vec2.neg(polygonBA.normals[i]); + var s1 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v1)); + var s2 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v2)); + var s = math.min(s1, s2); + if (s > radius) { + // No collision + polygonAxis.type = EPAxisType.e_edgeB; + polygonAxis.index = i; + polygonAxis.separation = s; + break; + } + // Adjacency + if (Vec2.dot(n, perp) >= 0.0) { + if (Vec2.dot(Vec2.sub(n, upperLimit), normal) < -Settings.angularSlop) { + continue; + } + } + else { + if (Vec2.dot(Vec2.sub(n, lowerLimit), normal) < -Settings.angularSlop) { + continue; + } + } + if (s > polygonAxis.separation) { + polygonAxis.type = EPAxisType.e_edgeB; + polygonAxis.index = i; + polygonAxis.separation = s; + } } - } - - root.background = function(color) { - canvas.style.backgroundColor = color; - return this; - }; - - app(root, canvas); - - // resize(); - // window.addEventListener('resize', resize, false); - // window.addEventListener('orientationchange', resize, false); - - var lastWidth = -1; - var lastHeight = -1; - (function resizeLoop() { - var width, height; - if (full) { - // screen.availWidth/Height? - width = (window.innerWidth > 0 ? window.innerWidth : screen.width); - height = (window.innerHeight > 0 ? window.innerHeight : screen.height); - } else { - width = canvas.clientWidth; - height = canvas.clientHeight; - } - if (lastWidth !== width || lastHeight !== height) { - lastWidth = width; - lastHeight = height; - resize(); - } - requestAnimationFrame(resizeLoop); - })(); - - function resize() { - - if (full) { - // screen.availWidth/Height? - width = (window.innerWidth > 0 ? window.innerWidth : screen.width); - height = (window.innerHeight > 0 ? window.innerHeight : screen.height); - - canvas.style.width = width + 'px'; - canvas.style.height = height + 'px'; - - } else { - width = canvas.clientWidth; - height = canvas.clientHeight; + } + if (polygonAxis.type != EPAxisType.e_unknown && polygonAxis.separation > radius) { + return; + } + // Use hysteresis for jitter reduction. + var k_relativeTol = 0.98; + var k_absoluteTol = 0.001; + var primaryAxis; + if (polygonAxis.type == EPAxisType.e_unknown) { + primaryAxis = edgeAxis; + } + else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) { + primaryAxis = polygonAxis; + } + else { + primaryAxis = edgeAxis; + } + var ie = [new ClipVertex(), new ClipVertex()]; + if (primaryAxis.type == EPAxisType.e_edgeA) { + manifold.type = ManifoldType.e_faceA; + // Search for the polygon normal that is most anti-parallel to the edge + // normal. + var bestIndex = 0; + var bestValue = Vec2.dot(normal, polygonBA.normals[0]); + for (var i = 1; i < polygonBA.count; ++i) { + var value = Vec2.dot(normal, polygonBA.normals[i]); + if (value < bestValue) { + bestValue = value; + bestIndex = i; + } } - - width *= ratio; - height *= ratio; - - if (canvas.width === width && canvas.height === height) { - return; + var i1 = bestIndex; + var i2 = i1 + 1 < polygonBA.count ? i1 + 1 : 0; + ie[0].v = polygonBA.vertices[i1]; + ie[0].id.cf.indexA = 0; + ie[0].id.cf.indexB = i1; + ie[0].id.cf.typeA = ContactFeatureType.e_face; + ie[0].id.cf.typeB = ContactFeatureType.e_vertex; + ie[1].v = polygonBA.vertices[i2]; + ie[1].id.cf.indexA = 0; + ie[1].id.cf.indexB = i2; + ie[1].id.cf.typeA = ContactFeatureType.e_face; + ie[1].id.cf.typeB = ContactFeatureType.e_vertex; + if (front) { + rf.i1 = 0; + rf.i2 = 1; + rf.v1 = v1; + rf.v2 = v2; + rf.normal.setVec2(normal1); + } + else { + rf.i1 = 1; + rf.i2 = 0; + rf.v1 = v2; + rf.v2 = v1; + rf.normal.setMul(-1, normal1); } - - canvas.width = width; - canvas.height = height; - - root.viewport(width, height, ratio); - - render(); - } } - - function ImageLoader(src, success, error) { - var image = new Image(); - image.onload = function() { - success(image); - }; - image.onerror = error; - image.src = src; + else { + manifold.type = ManifoldType.e_faceB; + ie[0].v = v1; + ie[0].id.cf.indexA = 0; + ie[0].id.cf.indexB = primaryAxis.index; + ie[0].id.cf.typeA = ContactFeatureType.e_vertex; + ie[0].id.cf.typeB = ContactFeatureType.e_face; + ie[1].v = v2; + ie[1].id.cf.indexA = 0; + ie[1].id.cf.indexB = primaryAxis.index; + ie[1].id.cf.typeA = ContactFeatureType.e_vertex; + ie[1].id.cf.typeB = ContactFeatureType.e_face; + rf.i1 = primaryAxis.index; + rf.i2 = rf.i1 + 1 < polygonBA.count ? rf.i1 + 1 : 0; + rf.v1 = polygonBA.vertices[rf.i1]; + rf.v2 = polygonBA.vertices[rf.i2]; + rf.normal.setVec2(polygonBA.normals[rf.i1]); } - - var web = createCommonjsModule(function (module) { - module.exports = lib; - - module.exports.internal = {}; - - - module.exports.internal.Image = image; - - - - - module.exports.Mouse = mouse; - module.exports.Math = math; - module.exports._extend = extend; - module.exports._create = create; - }); - - function testbed(opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = null; - } - web(function (stage, canvas) { - stage.on(web.Mouse.START, function () { - window.focus(); - // @ts-ignore - document.activeElement && document.activeElement.blur(); - canvas.focus(); - }); - stage.MAX_ELAPSE = 1000 / 30; + rf.sideNormal1.setNum(rf.normal.y, -rf.normal.x); + rf.sideNormal2.setMul(-1, rf.sideNormal1); + rf.sideOffset1 = Vec2.dot(rf.sideNormal1, rf.v1); + rf.sideOffset2 = Vec2.dot(rf.sideNormal2, rf.v2); + // Clip incident edge against extruded edge1 side edges. + var clipPoints1 = [new ClipVertex(), new ClipVertex()]; + var clipPoints2 = [new ClipVertex(), new ClipVertex()]; + var np; + // Clip to box side 1 + np = clipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1); + if (np < Settings.maxManifoldPoints) { + return; + } + // Clip to negative box side 1 + np = clipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2); + if (np < Settings.maxManifoldPoints) { + return; + } + // Now clipPoints2 contains the clipped points. + if (primaryAxis.type == EPAxisType.e_edgeA) { + manifold.localNormal = Vec2.clone(rf.normal); + manifold.localPoint = Vec2.clone(rf.v1); + } + else { + manifold.localNormal = Vec2.clone(polygonB.m_normals[rf.i1]); + manifold.localPoint = Vec2.clone(polygonB.m_vertices[rf.i1]); + } + var pointCount = 0; + for (var i = 0; i < Settings.maxManifoldPoints; ++i) { + var separation = Vec2.dot(rf.normal, Vec2.sub(clipPoints2[i].v, rf.v1)); + if (separation <= radius) { + var cp = manifold.points[pointCount]; // ManifoldPoint + if (primaryAxis.type == EPAxisType.e_edgeA) { + cp.localPoint = Transform.mulTVec2(xf, clipPoints2[i].v); + cp.id = clipPoints2[i].id; + } + else { + cp.localPoint = clipPoints2[i].v; + cp.id.cf.typeA = clipPoints2[i].id.cf.typeB; + cp.id.cf.typeB = clipPoints2[i].id.cf.typeA; + cp.id.cf.indexA = clipPoints2[i].id.cf.indexB; + cp.id.cf.indexB = clipPoints2[i].id.cf.indexA; + } + ++pointCount; + } + } + manifold.pointCount = pointCount; +}; + +/** @deprecated Merged with main namespace */ +var internal = { + CollidePolygons: CollidePolygons, + Settings: Settings, + Sweep: Sweep, + Manifold: Manifold, + Distance: Distance, + TimeOfImpact: TimeOfImpact, + DynamicTree: DynamicTree, + stats: stats +}; + +function testbed(opts, callback) { + if (typeof opts === 'function') { + callback = opts; + opts = null; + } + (function () { + var stage = Stage$1.mount(); + var canvas = stage.dom; + stage.on(Stage$1.Mouse.START, function () { + window.focus(); // @ts-ignore - var testbed = {}; - testbed.canvas = canvas; - var paused = false; - stage.on('resume', function () { - paused = false; - testbed._resume && testbed._resume(); - }); - stage.on('pause', function () { - paused = true; - testbed._pause && testbed._pause(); - }); - testbed.isPaused = function () { - return paused; + document.activeElement && document.activeElement.blur(); + canvas.focus(); + }); + stage.MAX_ELAPSE = 1000 / 30; + // @ts-ignore + var testbed = {}; + testbed.canvas = canvas; + var paused = false; + stage.on('resume', function () { + paused = false; + testbed._resume && testbed._resume(); + }); + stage.on('pause', function () { + paused = true; + testbed._pause && testbed._pause(); + }); + testbed.isPaused = function () { + return paused; + }; + testbed.togglePause = function () { + paused ? testbed.resume() : testbed.pause(); + }; + testbed.pause = function () { + // @ts-ignore + stage.pause(); + }; + testbed.resume = function () { + // @ts-ignore + stage.resume(); + testbed.focus(); + }; + testbed.focus = function () { + // @ts-ignore + document.activeElement && document.activeElement.blur(); + canvas.focus(); + }; + testbed.width = 80; + testbed.height = 60; + testbed.x = 0; + testbed.y = -10; + testbed.scaleY = -1; + testbed.ratio = 16; + testbed.hz = 60; + testbed.speed = 1; + testbed.activeKeys = {}; + testbed.background = '#222222'; + testbed.findOne = function () { + // todo: implement + return null; + }; + testbed.findAll = function () { + // todo: implement + return []; + }; + var statusText = ''; + var statusMap = {}; + function statusSet(name, value) { + if (typeof value !== 'function' && typeof value !== 'object') { + statusMap[name] = value; + } + } + function statusMerge(obj) { + // tslint:disable-next-line:no-for-in + for (var key in obj) { + statusSet(key, obj[key]); + } + } + testbed.status = function (a, b) { + if (typeof b !== 'undefined') { + statusSet(a, b); + } + else if (a && typeof a === 'object') { + statusMerge(a); + } + else if (typeof a === 'string') { + statusText = a; + } + testbed._status && testbed._status(statusText, statusMap); + }; + testbed.info = function (text) { + testbed._info && testbed._info(text); + }; + var lastDrawHash = ""; + var drawHash = ""; + (function () { + var drawingTexture = new Stage$1.Texture(); + stage.append(Stage$1.image(drawingTexture)); + var buffer = []; + stage.tick(function () { + buffer.length = 0; + }, true); + drawingTexture.draw = function (ctx) { + ctx.save(); + ctx.transform(1, 0, 0, testbed.scaleY, -testbed.x, -testbed.y); + ctx.lineWidth = 2 / testbed.ratio; + ctx.lineCap = 'round'; + for (var drawing = buffer.shift(); drawing; drawing = buffer.shift()) { + drawing(ctx, testbed.ratio); + } + ctx.restore(); }; - testbed.togglePause = function () { - paused ? testbed.resume() : testbed.pause(); + testbed.drawPoint = function (p, r, color) { + buffer.push(function (ctx, ratio) { + ctx.beginPath(); + ctx.arc(p.x, p.y, 5 / ratio, 0, 2 * Math.PI); + ctx.strokeStyle = color; + ctx.stroke(); + }); + drawHash += "point" + p.x + ',' + p.y + ',' + r + ',' + color; }; - testbed.pause = function () { - stage.pause(); + testbed.drawCircle = function (p, r, color) { + buffer.push(function (ctx) { + ctx.beginPath(); + ctx.arc(p.x, p.y, r, 0, 2 * Math.PI); + ctx.strokeStyle = color; + ctx.stroke(); + }); + drawHash += "circle" + p.x + ',' + p.y + ',' + r + ',' + color; }; - testbed.resume = function () { - stage.resume(); - testbed.focus(); + testbed.drawSegment = function (a, b, color) { + buffer.push(function (ctx) { + ctx.beginPath(); + ctx.moveTo(a.x, a.y); + ctx.lineTo(b.x, b.y); + ctx.strokeStyle = color; + ctx.stroke(); + }); + drawHash += "segment" + a.x + ',' + a.y + ',' + b.x + ',' + b.y + ',' + color; }; - testbed.focus = function () { - // @ts-ignore - document.activeElement && document.activeElement.blur(); - canvas.focus(); + testbed.drawPolygon = function (points, color) { + if (!points || !points.length) { + return; + } + buffer.push(function (ctx) { + ctx.beginPath(); + ctx.moveTo(points[0].x, points[0].y); + for (var i = 1; i < points.length; i++) { + ctx.lineTo(points[i].x, points[i].y); + } + ctx.strokeStyle = color; + ctx.closePath(); + ctx.stroke(); + }); + drawHash += "segment"; + for (var i = 1; i < points.length; i++) { + drawHash += points[i].x + ',' + points[i].y + ','; + } + drawHash += color; }; - testbed.width = 80; - testbed.height = 60; - testbed.x = 0; - testbed.y = -10; - testbed.scaleY = -1; - testbed.ratio = 16; - testbed.hz = 60; - testbed.speed = 1; - testbed.activeKeys = {}; - testbed.background = '#222222'; - testbed.findOne = function () { - // todo: implement - return null; + testbed.drawAABB = function (aabb, color) { + buffer.push(function (ctx) { + ctx.beginPath(); + ctx.moveTo(aabb.lowerBound.x, aabb.lowerBound.y); + ctx.lineTo(aabb.upperBound.x, aabb.lowerBound.y); + ctx.lineTo(aabb.upperBound.x, aabb.upperBound.y); + ctx.lineTo(aabb.lowerBound.x, aabb.upperBound.y); + ctx.strokeStyle = color; + ctx.closePath(); + ctx.stroke(); + }); + drawHash += "aabb"; + drawHash += aabb.lowerBound.x + ',' + aabb.lowerBound.y + ','; + drawHash += aabb.upperBound.x + ',' + aabb.upperBound.y + ','; + drawHash += color; }; - testbed.findAll = function () { - // todo: implement - return []; + testbed.color = function (r, g, b) { + r = r * 256 | 0; + g = g * 256 | 0; + b = b * 256 | 0; + return 'rgb(' + r + ', ' + g + ', ' + b + ')'; }; - var statusText = ''; - var statusMap = {}; - function statusSet(name, value) { - if (typeof value !== 'function' && typeof value !== 'object') { - statusMap[name] = value; - } + })(); + var world = callback(testbed); + var viewer = new Viewer(world, testbed); + var lastX = 0; + var lastY = 0; + stage.tick(function (dt, t) { + // update camera position + if (lastX !== testbed.x || lastY !== testbed.y) { + viewer.offset(-testbed.x, -testbed.y); + lastX = testbed.x; + lastY = testbed.y; } - function statusMerge(obj) { - // tslint:disable-next-line:no-for-in - for (var key in obj) { - statusSet(key, obj[key]); - } + }); + viewer.tick(function (dt, t) { + // call testbed step, if provided + if (typeof testbed.step === 'function') { + testbed.step(dt, t); } - testbed.status = function (a, b) { - if (typeof b !== 'undefined') { - statusSet(a, b); - } - else if (a && typeof a === 'object') { - statusMerge(a); - } - else if (typeof a === 'string') { - statusText = a; - } - testbed._status && testbed._status(statusText, statusMap); - }; - testbed.info = function (text) { - testbed._info && testbed._info(text); - }; - var lastDrawHash = ""; - var drawHash = ""; - (function () { - var drawingTexture = new web.Texture(); - stage.append(web.image(drawingTexture)); - var buffer = []; - stage.tick(function () { - buffer.length = 0; - }, true); - drawingTexture.draw = function (ctx) { - ctx.save(); - ctx.transform(1, 0, 0, testbed.scaleY, -testbed.x, -testbed.y); - ctx.lineWidth = 2 / testbed.ratio; - ctx.lineCap = 'round'; - for (var drawing = buffer.shift(); drawing; drawing = buffer.shift()) { - drawing(ctx, testbed.ratio); - } - ctx.restore(); - }; - testbed.drawPoint = function (p, r, color) { - buffer.push(function (ctx, ratio) { - ctx.beginPath(); - ctx.arc(p.x, p.y, 5 / ratio, 0, 2 * Math.PI); - ctx.strokeStyle = color; - ctx.stroke(); - }); - drawHash += "point" + p.x + ',' + p.y + ',' + r + ',' + color; - }; - testbed.drawCircle = function (p, r, color) { - buffer.push(function (ctx) { - ctx.beginPath(); - ctx.arc(p.x, p.y, r, 0, 2 * Math.PI); - ctx.strokeStyle = color; - ctx.stroke(); - }); - drawHash += "circle" + p.x + ',' + p.y + ',' + r + ',' + color; - }; - testbed.drawSegment = function (a, b, color) { - buffer.push(function (ctx) { - ctx.beginPath(); - ctx.moveTo(a.x, a.y); - ctx.lineTo(b.x, b.y); - ctx.strokeStyle = color; - ctx.stroke(); - }); - drawHash += "segment" + a.x + ',' + a.y + ',' + b.x + ',' + b.y + ',' + color; - }; - testbed.drawPolygon = function (points, color) { - if (!points || !points.length) { - return; - } - buffer.push(function (ctx) { - ctx.beginPath(); - ctx.moveTo(points[0].x, points[0].y); - for (var i = 1; i < points.length; i++) { - ctx.lineTo(points[i].x, points[i].y); - } - ctx.strokeStyle = color; - ctx.closePath(); - ctx.stroke(); - }); - drawHash += "segment"; - for (var i = 1; i < points.length; i++) { - drawHash += points[i].x + ',' + points[i].y + ','; - } - drawHash += color; - }; - testbed.drawAABB = function (aabb, color) { - buffer.push(function (ctx) { - ctx.beginPath(); - ctx.moveTo(aabb.lowerBound.x, aabb.lowerBound.y); - ctx.lineTo(aabb.upperBound.x, aabb.lowerBound.y); - ctx.lineTo(aabb.upperBound.x, aabb.upperBound.y); - ctx.lineTo(aabb.lowerBound.x, aabb.upperBound.y); - ctx.strokeStyle = color; - ctx.closePath(); - ctx.stroke(); - }); - drawHash += "aabb"; - drawHash += aabb.lowerBound.x + ',' + aabb.lowerBound.y + ','; - drawHash += aabb.upperBound.x + ',' + aabb.upperBound.y + ','; - drawHash += color; - }; - testbed.color = function (r, g, b) { - r = r * 256 | 0; - g = g * 256 | 0; - b = b * 256 | 0; - return 'rgb(' + r + ', ' + g + ', ' + b + ')'; - }; - })(); - var world = callback(testbed); - var viewer = new Viewer(world, testbed); - var lastX = 0; - var lastY = 0; - stage.tick(function (dt, t) { - // update camera position - if (lastX !== testbed.x || lastY !== testbed.y) { - viewer.offset(-testbed.x, -testbed.y); - lastX = testbed.x; - lastY = testbed.y; - } - }); - viewer.tick(function (dt, t) { - // call testbed step, if provided - if (typeof testbed.step === 'function') { - testbed.step(dt, t); - } - if (targetBody) { - testbed.drawSegment(targetBody.getPosition(), mouseMove, 'rgba(255,255,255,0.2)'); + if (targetBody) { + testbed.drawSegment(targetBody.getPosition(), mouseMove, 'rgba(255,255,255,0.2)'); + } + if (lastDrawHash !== drawHash) { + lastDrawHash = drawHash; + stage.touch(); + } + drawHash = ""; + return true; + }); + // stage.empty(); + stage.background(testbed.background); + stage.viewbox(testbed.width, testbed.height); + stage.pin('alignX', -0.5); + stage.pin('alignY', -0.5); + stage.prepend(viewer); + function findBody(point) { + var body; + var aabb = new AABB(point, point); + world.queryAABB(aabb, function (fixture) { + if (body) { + return; } - if (lastDrawHash !== drawHash) { - lastDrawHash = drawHash; - stage.touch(); + if (!fixture.getBody().isDynamic() || !fixture.testPoint(point)) { + return; } - drawHash = ""; + body = fixture.getBody(); return true; }); - // stage.empty(); - stage.background(testbed.background); - stage.viewbox(testbed.width, testbed.height); - stage.pin('alignX', -0.5); - stage.pin('alignY', -0.5); - stage.prepend(viewer); - function findBody(point) { - var body; - var aabb = new AABB(point, point); - world.queryAABB(aabb, function (fixture) { - if (body) { - return; - } - if (!fixture.getBody().isDynamic() || !fixture.testPoint(point)) { - return; - } - body = fixture.getBody(); - return true; - }); - return body; + return body; + } + var mouseGround = world.createBody(); + var mouseJoint; + var targetBody; + var mouseMove = { x: 0, y: 0 }; + viewer.attr('spy', true).on(Stage$1.Mouse.START, function (point) { + point = { x: point.x, y: testbed.scaleY * point.y }; + if (targetBody) { + return; } - var mouseGround = world.createBody(); - var mouseJoint; - var targetBody; - var mouseMove = { x: 0, y: 0 }; - viewer.attr('spy', true).on(web.Mouse.START, function (point) { - point = { x: point.x, y: testbed.scaleY * point.y }; - if (targetBody) { - return; + var body = findBody(point); + if (!body) { + return; + } + if (testbed.mouseForce) { + targetBody = body; + } + else { + mouseJoint = new MouseJoint({ maxForce: 1000 }, mouseGround, body, Vec2.clone(point)); + world.createJoint(mouseJoint); + } + }).on(Stage$1.Mouse.MOVE, function (point) { + point = { x: point.x, y: testbed.scaleY * point.y }; + if (mouseJoint) { + mouseJoint.setTarget(point); + } + mouseMove.x = point.x; + mouseMove.y = point.y; + }).on(Stage$1.Mouse.END, function (point) { + point = { x: point.x, y: testbed.scaleY * point.y }; + if (mouseJoint) { + world.destroyJoint(mouseJoint); + mouseJoint = null; + } + if (targetBody) { + var force = Vec2.sub(point, targetBody.getPosition()); + targetBody.applyForceToCenter(force.mul(testbed.mouseForce), true); + targetBody = null; + } + }).on(Stage$1.Mouse.CANCEL, function (point) { + point = { x: point.x, y: testbed.scaleY * point.y }; + if (mouseJoint) { + world.destroyJoint(mouseJoint); + mouseJoint = null; + } + if (targetBody) { + targetBody = null; + } + }); + window.addEventListener("keydown", function (e) { + switch (e.keyCode) { + case 'P'.charCodeAt(0): + testbed.togglePause(); + break; + } + }, false); + var downKeys = {}; + window.addEventListener("keydown", function (e) { + var keyCode = e.keyCode; + downKeys[keyCode] = true; + updateActiveKeys(keyCode, true); + testbed.keydown && testbed.keydown(keyCode, String.fromCharCode(keyCode)); + }); + window.addEventListener("keyup", function (e) { + var keyCode = e.keyCode; + downKeys[keyCode] = false; + updateActiveKeys(keyCode, false); + testbed.keyup && testbed.keyup(keyCode, String.fromCharCode(keyCode)); + }); + var activeKeys = testbed.activeKeys; + function updateActiveKeys(keyCode, down) { + var char = String.fromCharCode(keyCode); + if (/\w/.test(char)) { + activeKeys[char] = down; + } + activeKeys.right = downKeys[39] || activeKeys['D']; + activeKeys.left = downKeys[37] || activeKeys['A']; + activeKeys.up = downKeys[38] || activeKeys['W']; + activeKeys.down = downKeys[40] || activeKeys['S']; + activeKeys.fire = downKeys[32] || downKeys[13]; + } + })(); +} +Viewer._super = Stage$1.Node; +Viewer.prototype = Object.create(Viewer._super.prototype); +function Viewer(world, opts) { + var _this = this; + Viewer._super.call(this); + this.label('Planck'); + opts = opts || {}; + this._options = {}; + this._options.speed = opts.speed || 1; + this._options.hz = opts.hz || 60; + if (Math.abs(this._options.hz) < 1) { + this._options.hz = 1 / this._options.hz; + } + this._options.scaleY = opts.scaleY || -1; + this._options.ratio = opts.ratio || 16; + this._options.lineWidth = 2 / this._options.ratio; + this._world = world; + var timeStep = 1 / this._options.hz; + var elapsedTime = 0; + this.tick(function (dt) { + dt = dt * 0.001 * _this._options.speed; + elapsedTime += dt; + while (elapsedTime > timeStep) { + world.step(timeStep); + elapsedTime -= timeStep; + } + _this.renderWorld(); + return true; + }, true); + world.on('remove-fixture', function (obj) { + obj.ui && obj.ui.remove(); + }); + world.on('remove-joint', function (obj) { + obj.ui && obj.ui.remove(); + }); +} +Viewer.prototype.renderWorld = function () { + var world = this._world; + var options = this._options; + var viewer = this; + for (var b = world.getBodyList(); b; b = b.getNext()) { + for (var f = b.getFixtureList(); f; f = f.getNext()) { + if (!f.ui) { + if (f.render && f.render.stroke) { + options.strokeStyle = f.render.stroke; } - var body = findBody(point); - if (!body) { - return; + else if (b.render && b.render.stroke) { + options.strokeStyle = b.render.stroke; } - if (testbed.mouseForce) { - targetBody = body; + else if (b.isDynamic()) { + options.strokeStyle = 'rgba(255,255,255,0.9)'; } - else { - mouseJoint = new MouseJoint({ maxForce: 1000 }, mouseGround, body, Vec2.clone(point)); - world.createJoint(mouseJoint); + else if (b.isKinematic()) { + options.strokeStyle = 'rgba(255,255,255,0.7)'; } - }).on(web.Mouse.MOVE, function (point) { - point = { x: point.x, y: testbed.scaleY * point.y }; - if (mouseJoint) { - mouseJoint.setTarget(point); + else if (b.isStatic()) { + options.strokeStyle = 'rgba(255,255,255,0.5)'; } - mouseMove.x = point.x; - mouseMove.y = point.y; - }).on(web.Mouse.END, function (point) { - point = { x: point.x, y: testbed.scaleY * point.y }; - if (mouseJoint) { - world.destroyJoint(mouseJoint); - mouseJoint = null; + if (f.render && f.render.fill) { + options.fillStyle = f.render.fill; } - if (targetBody) { - var force = Vec2.sub(point, targetBody.getPosition()); - targetBody.applyForceToCenter(force.mul(testbed.mouseForce), true); - targetBody = null; + else if (b.render && b.render.fill) { + options.fillStyle = b.render.fill; } - }).on(web.Mouse.CANCEL, function (point) { - point = { x: point.x, y: testbed.scaleY * point.y }; - if (mouseJoint) { - world.destroyJoint(mouseJoint); - mouseJoint = null; + else { + options.fillStyle = ''; } - if (targetBody) { - targetBody = null; + var type = f.getType(); + var shape = f.getShape(); + if (type == 'circle') { + f.ui = viewer.drawCircle(shape, options); } - }); - window.addEventListener("keydown", function (e) { - switch (e.keyCode) { - case 'P'.charCodeAt(0): - testbed.togglePause(); - break; + if (type == 'edge') { + f.ui = viewer.drawEdge(shape, options); } - }, false); - var downKeys = {}; - window.addEventListener("keydown", function (e) { - var keyCode = e.keyCode; - downKeys[keyCode] = true; - updateActiveKeys(keyCode, true); - testbed.keydown && testbed.keydown(keyCode, String.fromCharCode(keyCode)); - }); - window.addEventListener("keyup", function (e) { - var keyCode = e.keyCode; - downKeys[keyCode] = false; - updateActiveKeys(keyCode, false); - testbed.keyup && testbed.keyup(keyCode, String.fromCharCode(keyCode)); - }); - var activeKeys = testbed.activeKeys; - function updateActiveKeys(keyCode, down) { - var char = String.fromCharCode(keyCode); - if (/\w/.test(char)) { - activeKeys[char] = down; + if (type == 'polygon') { + f.ui = viewer.drawPolygon(shape, options); } - activeKeys.right = downKeys[39] || activeKeys['D']; - activeKeys.left = downKeys[37] || activeKeys['A']; - activeKeys.up = downKeys[38] || activeKeys['W']; - activeKeys.down = downKeys[40] || activeKeys['S']; - activeKeys.fire = downKeys[32] || downKeys[13]; - } - }); - } - Viewer._super = web; - Viewer.prototype = web._create(Viewer._super.prototype); - function Viewer(world, opts) { - var _this = this; - Viewer._super.call(this); - this.label('Planck'); - opts = opts || {}; - this._options = {}; - this._options.speed = opts.speed || 1; - this._options.hz = opts.hz || 60; - if (Math.abs(this._options.hz) < 1) { - this._options.hz = 1 / this._options.hz; - } - this._options.scaleY = opts.scaleY || -1; - this._options.ratio = opts.ratio || 16; - this._options.lineWidth = 2 / this._options.ratio; - this._world = world; - var timeStep = 1 / this._options.hz; - var elapsedTime = 0; - this.tick(function (dt) { - dt = dt * 0.001 * _this._options.speed; - elapsedTime += dt; - while (elapsedTime > timeStep) { - world.step(timeStep); - elapsedTime -= timeStep; - } - _this.renderWorld(); - return true; - }, true); - world.on('remove-fixture', function (obj) { - obj.ui && obj.ui.remove(); - }); - world.on('remove-joint', function (obj) { - obj.ui && obj.ui.remove(); - }); - } - Viewer.prototype.renderWorld = function () { - var world = this._world; - var options = this._options; - var viewer = this; - for (var b = world.getBodyList(); b; b = b.getNext()) { - for (var f = b.getFixtureList(); f; f = f.getNext()) { - if (!f.ui) { - if (f.render && f.render.stroke) { - options.strokeStyle = f.render.stroke; - } - else if (b.render && b.render.stroke) { - options.strokeStyle = b.render.stroke; - } - else if (b.isDynamic()) { - options.strokeStyle = 'rgba(255,255,255,0.9)'; - } - else if (b.isKinematic()) { - options.strokeStyle = 'rgba(255,255,255,0.7)'; - } - else if (b.isStatic()) { - options.strokeStyle = 'rgba(255,255,255,0.5)'; - } - if (f.render && f.render.fill) { - options.fillStyle = f.render.fill; - } - else if (b.render && b.render.fill) { - options.fillStyle = b.render.fill; - } - else { - options.fillStyle = ''; - } - var type = f.getType(); - var shape = f.getShape(); - if (type == 'circle') { - f.ui = viewer.drawCircle(shape, options); - } - if (type == 'edge') { - f.ui = viewer.drawEdge(shape, options); - } - if (type == 'polygon') { - f.ui = viewer.drawPolygon(shape, options); - } - if (type == 'chain') { - f.ui = viewer.drawChain(shape, options); - } - if (f.ui) { - f.ui.appendTo(viewer); - } + if (type == 'chain') { + f.ui = viewer.drawChain(shape, options); } if (f.ui) { - var p = b.getPosition(); - var r = b.getAngle(); - if (f.ui.__lastX !== p.x || f.ui.__lastY !== p.y || f.ui.__lastR !== r) { - f.ui.__lastX = p.x; - f.ui.__lastY = p.y; - f.ui.__lastR = r; - f.ui.offset(p.x, options.scaleY * p.y); - f.ui.rotate(options.scaleY * r); - } + f.ui.appendTo(viewer); } } - } - for (var j = world.getJointList(); j; j = j.getNext()) { - var type = j.getType(); - var a = j.getAnchorA(); - var b = j.getAnchorB(); - if (!j.ui) { - options.strokeStyle = 'rgba(255,255,255,0.2)'; - j.ui = viewer.drawJoint(j, options); - j.ui.pin('handle', 0.5); - if (j.ui) { - j.ui.appendTo(viewer); + if (f.ui) { + var p = b.getPosition(); + var r = b.getAngle(); + if (f.ui.__lastX !== p.x || f.ui.__lastY !== p.y || f.ui.__lastR !== r) { + f.ui.__lastX = p.x; + f.ui.__lastY = p.y; + f.ui.__lastR = r; + f.ui.offset(p.x, options.scaleY * p.y); + f.ui.rotate(options.scaleY * r); } } + } + } + for (var j = world.getJointList(); j; j = j.getNext()) { + var type = j.getType(); + var a = j.getAnchorA(); + var b = j.getAnchorB(); + if (!j.ui) { + options.strokeStyle = 'rgba(255,255,255,0.2)'; + j.ui = viewer.drawJoint(j, options); + j.ui.pin('handle', 0.5); if (j.ui) { - var cx = (a.x + b.x) * 0.5; - var cy = options.scaleY * (a.y + b.y) * 0.5; - var dx = a.x - b.x; - var dy = options.scaleY * (a.y - b.y); - var d = Math.sqrt(dx * dx + dy * dy); - j.ui.width(d); - j.ui.rotate(Math.atan2(dy, dx)); - j.ui.offset(cx, cy); + j.ui.appendTo(viewer); } } - }; - Viewer.prototype.drawJoint = function (joint, options) { - var lw = options.lineWidth; - var ratio = options.ratio; - var length = 10; - var texture = web.canvas(function (ctx) { - this.size(length + 2 * lw, 2 * lw, ratio); - ctx.scale(ratio, ratio); - ctx.beginPath(); - ctx.moveTo(lw, lw); - ctx.lineTo(lw + length, lw); - ctx.lineCap = 'round'; - ctx.lineWidth = options.lineWidth; - ctx.strokeStyle = options.strokeStyle; - ctx.stroke(); - }); - var image = web.image(texture).stretch(); - return image; - }; - Viewer.prototype.drawCircle = function (shape, options) { - var lw = options.lineWidth; - var ratio = options.ratio; - var r = shape.m_radius; - var cx = r + lw; - var cy = r + lw; - var w = r * 2 + lw * 2; - var h = r * 2 + lw * 2; - var texture = web.canvas(function (ctx) { - this.size(w, h, ratio); - ctx.scale(ratio, ratio); - ctx.arc(cx, cy, r, 0, 2 * Math.PI); - if (options.fillStyle) { - ctx.fillStyle = options.fillStyle; - ctx.fill(); - } - ctx.lineTo(cx, cy); - ctx.lineWidth = options.lineWidth; - ctx.strokeStyle = options.strokeStyle; - ctx.stroke(); - }); - var image = web.image(texture) - .offset(shape.m_p.x - cx, options.scaleY * shape.m_p.y - cy); - var node = web.create().append(image); - return node; - }; - Viewer.prototype.drawEdge = function (edge, options) { - var lw = options.lineWidth; - var ratio = options.ratio; - var v1 = edge.m_vertex1; - var v2 = edge.m_vertex2; - var dx = v2.x - v1.x; - var dy = v2.y - v1.y; - var length = Math.sqrt(dx * dx + dy * dy); - var texture = web.canvas(function (ctx) { - this.size(length + 2 * lw, 2 * lw, ratio); - ctx.scale(ratio, ratio); - ctx.beginPath(); - ctx.moveTo(lw, lw); - ctx.lineTo(lw + length, lw); - ctx.lineCap = 'round'; - ctx.lineWidth = options.lineWidth; - ctx.strokeStyle = options.strokeStyle; - ctx.stroke(); - }); - var minX = Math.min(v1.x, v2.x); - var minY = Math.min(options.scaleY * v1.y, options.scaleY * v2.y); - var image = web.image(texture); - image.rotate(options.scaleY * Math.atan2(dy, dx)); - image.offset(minX - lw, minY - lw); - var node = web.create().append(image); - return node; - }; - Viewer.prototype.drawPolygon = function (shape, options) { - var lw = options.lineWidth; - var ratio = options.ratio; - var vertices = shape.m_vertices; - if (!vertices.length) { - return; + if (j.ui) { + var cx = (a.x + b.x) * 0.5; + var cy = options.scaleY * (a.y + b.y) * 0.5; + var dx = a.x - b.x; + var dy = options.scaleY * (a.y - b.y); + var d = Math.sqrt(dx * dx + dy * dy); + j.ui.width(d); + j.ui.rotate(Math.atan2(dy, dx)); + j.ui.offset(cx, cy); } - var minX = Infinity; - var minY = Infinity; - var maxX = -Infinity; - var maxY = -Infinity; + } +}; +Viewer.prototype.drawJoint = function (joint, options) { + var lw = options.lineWidth; + var ratio = options.ratio; + var length = 10; + var texture = Stage$1.canvas(function (ctx) { + this.size(length + 2 * lw, 2 * lw, ratio); + ctx.scale(ratio, ratio); + ctx.beginPath(); + ctx.moveTo(lw, lw); + ctx.lineTo(lw + length, lw); + ctx.lineCap = 'round'; + ctx.lineWidth = options.lineWidth; + ctx.strokeStyle = options.strokeStyle; + ctx.stroke(); + }); + var image = Stage$1.image(texture).stretch(); + return image; +}; +Viewer.prototype.drawCircle = function (shape, options) { + var lw = options.lineWidth; + var ratio = options.ratio; + var r = shape.m_radius; + var cx = r + lw; + var cy = r + lw; + var w = r * 2 + lw * 2; + var h = r * 2 + lw * 2; + var texture = Stage$1.canvas(function (ctx) { + this.size(w, h, ratio); + ctx.scale(ratio, ratio); + ctx.arc(cx, cy, r, 0, 2 * Math.PI); + if (options.fillStyle) { + ctx.fillStyle = options.fillStyle; + ctx.fill(); + } + ctx.lineTo(cx, cy); + ctx.lineWidth = options.lineWidth; + ctx.strokeStyle = options.strokeStyle; + ctx.stroke(); + }); + var image = Stage$1.image(texture) + .offset(shape.m_p.x - cx, options.scaleY * shape.m_p.y - cy); + var node = Stage$1.create().append(image); + return node; +}; +Viewer.prototype.drawEdge = function (edge, options) { + var lw = options.lineWidth; + var ratio = options.ratio; + var v1 = edge.m_vertex1; + var v2 = edge.m_vertex2; + var dx = v2.x - v1.x; + var dy = v2.y - v1.y; + var length = Math.sqrt(dx * dx + dy * dy); + var texture = Stage$1.canvas(function (ctx) { + this.size(length + 2 * lw, 2 * lw, ratio); + ctx.scale(ratio, ratio); + ctx.beginPath(); + ctx.moveTo(lw, lw); + ctx.lineTo(lw + length, lw); + ctx.lineCap = 'round'; + ctx.lineWidth = options.lineWidth; + ctx.strokeStyle = options.strokeStyle; + ctx.stroke(); + }); + var minX = Math.min(v1.x, v2.x); + var minY = Math.min(options.scaleY * v1.y, options.scaleY * v2.y); + var image = Stage$1.image(texture); + image.rotate(options.scaleY * Math.atan2(dy, dx)); + image.offset(minX - lw, minY - lw); + var node = Stage$1.create().append(image); + return node; +}; +Viewer.prototype.drawPolygon = function (shape, options) { + var lw = options.lineWidth; + var ratio = options.ratio; + var vertices = shape.m_vertices; + if (!vertices.length) { + return; + } + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + for (var i = 0; i < vertices.length; ++i) { + var v = vertices[i]; + minX = Math.min(minX, v.x); + maxX = Math.max(maxX, v.x); + minY = Math.min(minY, options.scaleY * v.y); + maxY = Math.max(maxY, options.scaleY * v.y); + } + var width = maxX - minX; + var height = maxY - minY; + var texture = Stage$1.canvas(function (ctx) { + this.size(width + 2 * lw, height + 2 * lw, ratio); + ctx.scale(ratio, ratio); + ctx.beginPath(); for (var i = 0; i < vertices.length; ++i) { var v = vertices[i]; - minX = Math.min(minX, v.x); - maxX = Math.max(maxX, v.x); - minY = Math.min(minY, options.scaleY * v.y); - maxY = Math.max(maxY, options.scaleY * v.y); - } - var width = maxX - minX; - var height = maxY - minY; - var texture = web.canvas(function (ctx) { - this.size(width + 2 * lw, height + 2 * lw, ratio); - ctx.scale(ratio, ratio); - ctx.beginPath(); - for (var i = 0; i < vertices.length; ++i) { - var v = vertices[i]; - var x = v.x - minX + lw; - var y = options.scaleY * v.y - minY + lw; - if (i == 0) - ctx.moveTo(x, y); - else - ctx.lineTo(x, y); - } - if (vertices.length > 2) { - ctx.closePath(); - } - if (options.fillStyle) { - ctx.fillStyle = options.fillStyle; - ctx.fill(); - ctx.closePath(); - } - ctx.lineCap = 'round'; - ctx.lineWidth = options.lineWidth; - ctx.strokeStyle = options.strokeStyle; - ctx.stroke(); - }); - var image = web.image(texture); - image.offset(minX - lw, minY - lw); - var node = web.create().append(image); - return node; - }; - Viewer.prototype.drawChain = function (shape, options) { - var lw = options.lineWidth; - var ratio = options.ratio; - var vertices = shape.m_vertices; - if (!vertices.length) { - return; + var x = v.x - minX + lw; + var y = options.scaleY * v.y - minY + lw; + if (i == 0) + ctx.moveTo(x, y); + else + ctx.lineTo(x, y); } - var minX = Infinity; - var minY = Infinity; - var maxX = -Infinity; - var maxY = -Infinity; + if (vertices.length > 2) { + ctx.closePath(); + } + if (options.fillStyle) { + ctx.fillStyle = options.fillStyle; + ctx.fill(); + ctx.closePath(); + } + ctx.lineCap = 'round'; + ctx.lineWidth = options.lineWidth; + ctx.strokeStyle = options.strokeStyle; + ctx.stroke(); + }); + var image = Stage$1.image(texture); + image.offset(minX - lw, minY - lw); + var node = Stage$1.create().append(image); + return node; +}; +Viewer.prototype.drawChain = function (shape, options) { + var lw = options.lineWidth; + var ratio = options.ratio; + var vertices = shape.m_vertices; + if (!vertices.length) { + return; + } + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + for (var i = 0; i < vertices.length; ++i) { + var v = vertices[i]; + minX = Math.min(minX, v.x); + maxX = Math.max(maxX, v.x); + minY = Math.min(minY, options.scaleY * v.y); + maxY = Math.max(maxY, options.scaleY * v.y); + } + var width = maxX - minX; + var height = maxY - minY; + var texture = Stage$1.canvas(function (ctx) { + this.size(width + 2 * lw, height + 2 * lw, ratio); + ctx.scale(ratio, ratio); + ctx.beginPath(); for (var i = 0; i < vertices.length; ++i) { var v = vertices[i]; - minX = Math.min(minX, v.x); - maxX = Math.max(maxX, v.x); - minY = Math.min(minY, options.scaleY * v.y); - maxY = Math.max(maxY, options.scaleY * v.y); - } - var width = maxX - minX; - var height = maxY - minY; - var texture = web.canvas(function (ctx) { - this.size(width + 2 * lw, height + 2 * lw, ratio); - ctx.scale(ratio, ratio); - ctx.beginPath(); - for (var i = 0; i < vertices.length; ++i) { - var v = vertices[i]; - var x = v.x - minX + lw; - var y = options.scaleY * v.y - minY + lw; - if (i == 0) - ctx.moveTo(x, y); - else - ctx.lineTo(x, y); - } - // TODO: if loop - if (vertices.length > 2) ; - if (options.fillStyle) { - ctx.fillStyle = options.fillStyle; - ctx.fill(); - ctx.closePath(); - } - ctx.lineCap = 'round'; - ctx.lineWidth = options.lineWidth; - ctx.strokeStyle = options.strokeStyle; - ctx.stroke(); - }); - var image = web.image(texture); - image.offset(minX - lw, minY - lw); - var node = web.create().append(image); - return node; - }; - /** @deprecated Merged with main namespace */ - var internal = {}; - // @ts-ignore - internal.CollidePolygons = CollidePolygons; - // @ts-ignore - internal.Settings = Settings; - // @ts-ignore - internal.Sweep = Sweep; - // @ts-ignore - internal.Manifold = Manifold; - // @ts-ignore - internal.Distance = Distance; - // @ts-ignore - internal.TimeOfImpact = TimeOfImpact; - // @ts-ignore - internal.DynamicTree = DynamicTree; - // @ts-ignore - internal.stats = stats$1; - // @ts-ignore - Solver.TimeStep = TimeStep; - // @ts-ignore - Distance.testOverlap = testOverlap; - // @ts-ignore - Distance.Input = DistanceInput; - // @ts-ignore - Distance.Output = DistanceOutput; - // @ts-ignore - Distance.Proxy = DistanceProxy; - // @ts-ignore - Distance.Cache = SimplexCache; - // @ts-ignore - TimeOfImpact.Input = TOIInput; - // @ts-ignore - TimeOfImpact.Output = TOIOutput; - - exports.AABB = AABB; - exports.Body = Body; - exports.Box = BoxShape; - exports.Chain = ChainShape; - exports.Circle = CircleShape; - exports.CollideCircles = CollideCircles; - exports.CollideEdgeCircle = CollideEdgeCircle; - exports.CollideEdgePolygon = CollideEdgePolygon; - exports.CollidePolygonCircle = CollidePolygonCircle; - exports.CollidePolygons = CollidePolygons; - exports.Contact = Contact; - exports.Distance = Distance; - exports.DistanceJoint = DistanceJoint; - exports.DynamicTree = DynamicTree; - exports.Edge = EdgeShape; - exports.Fixture = Fixture; - exports.FrictionJoint = FrictionJoint; - exports.GearJoint = GearJoint; - exports.Joint = Joint; - exports.Manifold = Manifold; - exports.Mat22 = Mat22; - exports.Mat33 = Mat33; - exports.Math = math$1; - exports.MotorJoint = MotorJoint; - exports.MouseJoint = MouseJoint; - exports.Polygon = PolygonShape; - exports.PrismaticJoint = PrismaticJoint; - exports.PulleyJoint = PulleyJoint; - exports.RevoluteJoint = RevoluteJoint; - exports.RopeJoint = RopeJoint; - exports.Rot = Rot; - exports.Serializer = Serializer; - exports.Settings = Settings; - exports.Shape = Shape; - exports.Sweep = Sweep; - exports.TimeOfImpact = TimeOfImpact; - exports.Transform = Transform; - exports.Vec2 = Vec2; - exports.Vec3 = Vec3; - exports.WeldJoint = WeldJoint; - exports.WheelJoint = WheelJoint; - exports.World = World; - exports.internal = internal; - exports.testbed = testbed; - - Object.defineProperty(exports, '__esModule', { value: true }); - -}))); + var x = v.x - minX + lw; + var y = options.scaleY * v.y - minY + lw; + if (i == 0) + ctx.moveTo(x, y); + else + ctx.lineTo(x, y); + } + // TODO: if loop + if (vertices.length > 2) ; + if (options.fillStyle) { + ctx.fillStyle = options.fillStyle; + ctx.fill(); + ctx.closePath(); + } + ctx.lineCap = 'round'; + ctx.lineWidth = options.lineWidth; + ctx.strokeStyle = options.strokeStyle; + ctx.stroke(); + }); + var image = Stage$1.image(texture); + image.offset(minX - lw, minY - lw); + var node = Stage$1.create().append(image); + return node; +}; + +var planck = /*#__PURE__*/Object.freeze({ + __proto__: null, + testbed: testbed, + Serializer: Serializer, + math: math, + Vec2: Vec2, + Vec3: Vec3, + Mat22: Mat22, + Mat33: Mat33, + Transform: Transform, + Rot: Rot, + AABB: AABB, + Shape: Shape, + FixtureProxy: FixtureProxy, + Fixture: Fixture, + MassData: MassData, + Body: Body, + ContactEdge: ContactEdge, + mixFriction: mixFriction, + mixRestitution: mixRestitution, + VelocityConstraintPoint: VelocityConstraintPoint, + Contact: Contact, + JointEdge: JointEdge, + Joint: Joint, + World: World, + CircleShape: CircleShape, + Circle: Circle, + EdgeShape: EdgeShape, + Edge: Edge, + PolygonShape: PolygonShape, + Polygon: Polygon, + ChainShape: ChainShape, + Chain: Chain, + BoxShape: BoxShape, + Box: Box, + CollideCircles: CollideCircles, + CollideEdgeCircle: CollideEdgeCircle, + CollidePolygons: CollidePolygons, + CollidePolygonCircle: CollidePolygonCircle, + CollideEdgePolygon: CollideEdgePolygon, + DistanceJoint: DistanceJoint, + FrictionJoint: FrictionJoint, + GearJoint: GearJoint, + MotorJoint: MotorJoint, + MouseJoint: MouseJoint, + PrismaticJoint: PrismaticJoint, + PulleyJoint: PulleyJoint, + RevoluteJoint: RevoluteJoint, + RopeJoint: RopeJoint, + WeldJoint: WeldJoint, + WheelJoint: WheelJoint, + Settings: Settings, + Sweep: Sweep, + get ManifoldType () { return ManifoldType; }, + get ContactFeatureType () { return ContactFeatureType; }, + get PointState () { return PointState; }, + ClipVertex: ClipVertex, + Manifold: Manifold, + ManifoldPoint: ManifoldPoint, + ContactID: ContactID, + ContactFeature: ContactFeature, + WorldManifold: WorldManifold, + getPointStates: getPointStates, + clipSegmentToLine: clipSegmentToLine, + DistanceInput: DistanceInput, + DistanceOutput: DistanceOutput, + SimplexCache: SimplexCache, + Distance: Distance, + DistanceProxy: DistanceProxy, + testOverlap: testOverlap, + TOIInput: TOIInput, + get TOIOutputState () { return TOIOutputState; }, + TOIOutput: TOIOutput, + TimeOfImpact: TimeOfImpact, + TreeNode: TreeNode, + DynamicTree: DynamicTree, + stats: stats, + internal: internal +}); + +export { AABB, Body, Box, BoxShape, Chain, ChainShape, Circle, CircleShape, ClipVertex, CollideCircles, CollideEdgeCircle, CollideEdgePolygon, CollidePolygonCircle, CollidePolygons, Contact, ContactEdge, ContactFeature, ContactFeatureType, ContactID, Distance, DistanceInput, DistanceJoint, DistanceOutput, DistanceProxy, DynamicTree, Edge, EdgeShape, Fixture, FixtureProxy, FrictionJoint, GearJoint, Joint, JointEdge, Manifold, ManifoldPoint, ManifoldType, MassData, Mat22, Mat33, MotorJoint, MouseJoint, PointState, Polygon, PolygonShape, PrismaticJoint, PulleyJoint, RevoluteJoint, RopeJoint, Rot, Serializer, Settings, Shape, SimplexCache, Sweep, TOIInput, TOIOutput, TOIOutputState, TimeOfImpact, Transform, TreeNode, Vec2, Vec3, VelocityConstraintPoint, WeldJoint, WheelJoint, World, WorldManifold, clipSegmentToLine, planck as default, getPointStates, internal, math, mixFriction, mixRestitution, stats, testOverlap, testbed }; //# sourceMappingURL=planck-with-testbed.js.map diff --git a/dist/planck-with-testbed.js.map b/dist/planck-with-testbed.js.map index 5ea7835f..d2e65900 100644 --- a/dist/planck-with-testbed.js.map +++ b/dist/planck-with-testbed.js.map @@ -1 +1 @@ -{"version":3,"file":"planck-with-testbed.js","sources":["../node_modules/tslib/tslib.es6.js","../src/util/options.ts","../src/util/common.ts","../src/common/Math.ts","../src/common/Vec2.ts","../src/collision/AABB.ts","../src/Settings.ts","../src/util/Pool.ts","../src/collision/DynamicTree.ts","../src/collision/BroadPhase.ts","../src/common/Rot.ts","../src/common/Transform.ts","../src/common/Sweep.ts","../src/dynamics/Velocity.ts","../src/dynamics/Position.ts","../src/collision/Shape.ts","../src/dynamics/Fixture.ts","../src/dynamics/Body.ts","../src/common/Mat22.ts","../src/collision/Manifold.ts","../src/util/stats.ts","../src/collision/Distance.ts","../src/dynamics/Contact.ts","../src/dynamics/Joint.ts","../src/util/Timer.ts","../src/collision/TimeOfImpact.ts","../src/dynamics/Solver.ts","../src/dynamics/World.ts","../src/common/Vec3.ts","../src/collision/shape/EdgeShape.ts","../src/collision/shape/ChainShape.ts","../src/collision/shape/PolygonShape.ts","../src/collision/shape/BoxShape.ts","../src/collision/shape/CircleShape.ts","../src/dynamics/joint/DistanceJoint.ts","../src/dynamics/joint/FrictionJoint.ts","../src/common/Mat33.ts","../src/dynamics/joint/RevoluteJoint.ts","../src/dynamics/joint/PrismaticJoint.ts","../src/dynamics/joint/GearJoint.ts","../src/dynamics/joint/MotorJoint.ts","../src/dynamics/joint/MouseJoint.ts","../src/dynamics/joint/PulleyJoint.ts","../src/dynamics/joint/RopeJoint.ts","../src/dynamics/joint/WeldJoint.ts","../src/dynamics/joint/WheelJoint.ts","../src/serializer/index.ts","../src/collision/shape/CollideCircle.ts","../src/collision/shape/CollideEdgeCircle.ts","../src/collision/shape/CollidePolygon.ts","../src/collision/shape/CollideCirclePolygone.ts","../src/collision/shape/CollideEdgePolygon.ts","../src/index.ts","../node_modules/stage-js/lib/util/stats.js","../node_modules/stage-js/lib/util/extend.js","../node_modules/stage-js/lib/util/is.js","../node_modules/stage-js/lib/util/await.js","../node_modules/stage-js/lib/core.js","../node_modules/stage-js/lib/matrix.js","../node_modules/stage-js/lib/util/create.js","../node_modules/stage-js/lib/util/math.js","../node_modules/stage-js/lib/texture.js","../node_modules/stage-js/lib/util/string.js","../node_modules/stage-js/lib/atlas.js","../node_modules/stage-js/lib/tree.js","../node_modules/stage-js/lib/util/event.js","../node_modules/stage-js/lib/event.js","../node_modules/stage-js/lib/pin.js","../node_modules/stage-js/lib/loop.js","../node_modules/stage-js/lib/root.js","../node_modules/stage-js/lib/index.js","../node_modules/stage-js/lib/canvas.js","../node_modules/stage-js/lib/util/repeat.js","../node_modules/stage-js/lib/image.js","../node_modules/stage-js/lib/anim.js","../node_modules/stage-js/lib/str.js","../node_modules/stage-js/lib/layout.js","../node_modules/stage-js/lib/addon/easing.js","../node_modules/stage-js/lib/addon/tween.js","../node_modules/stage-js/lib/addon/mouse.js","../node_modules/stage-js/lib/loader/web.js","../node_modules/stage-js/platform/web.js","../testbed/index.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","export default function(input: T, defaults: object): T {\n if (input === null || typeof input === 'undefined') {\n // tslint:disable-next-line:no-object-literal-type-assertion\n input = {} as T;\n }\n\n const output = {...input};\n\n // tslint:disable-next-line:no-for-in\n for (const key in defaults) {\n if (defaults.hasOwnProperty(key) && typeof input[key] === 'undefined') {\n output[key] = defaults[key];\n }\n }\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n const symbols = Object.getOwnPropertySymbols(defaults);\n for (let i = 0; i < symbols.length; i++) {\n const symbol = symbols[i];\n if (defaults.propertyIsEnumerable(symbol) && typeof input[symbol] === 'undefined') {\n output[symbol] = defaults[symbol];\n }\n }\n }\n\n return output;\n}\n","const _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\nexport const debug = function(...rest: any[]): void {\n if (!_DEBUG) return;\n console.log.apply(console, arguments);\n};\n\nexport const assert = function(statement: boolean, err?: string, log?: any): void {\n if (!_ASSERT) return;\n if (statement) return;\n log && console.log(log);\n throw new Error(err);\n};\n\nexport default {\n assert,\n debug,\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst math: Math & {\n readonly EPSILON: number;\n /**\n * This function is used to ensure that a floating point number is not a NaN or\n * infinity.\n */\n isFinite(x: any): boolean;\n assert(x: any): void;\n /**\n * This is a approximate yet fast inverse square-root (todo).\n */\n invSqrt(x: number): number;\n /**\n * Next Largest Power of 2 Given a binary integer value x, the next largest\n * power of 2 can be computed by a SWAR algorithm that recursively \"folds\" the\n * upper bits into the lower bits. This process yields a bit vector with the\n * same most significant 1 as x, but all 1's below it. Adding 1 to that value\n * yields the next largest power of 2. For a 32-bit value:\n */\n nextPowerOfTwo(x: number): number;\n isPowerOfTwo(x: number): boolean;\n mod(num: number, min?: number, max?: number): number;\n /**\n * Returns a min if num is less than min, and max if more than max, otherwise returns num.\n */\n clamp(num: number, min: number, max: number): number;\n /**\n * Returns a random number between min and max when two arguments are provided.\n * If one arg is provided between 0 to max.\n * If one arg is passed between 0 to 1.\n */\n random(min?: number, max?: number): number;\n} = Object.create(Math);\n\nexport default math;\n\n// @ts-ignore\n// noinspection JSConstantReassignment\nmath.EPSILON = 1e-9; // TODO\n\nmath.isFinite = function(x: unknown): boolean {\n return (typeof x === 'number') && isFinite(x) && !isNaN(x);\n};\n\nmath.assert = function(x: any): void {\n if (!_ASSERT) return;\n if (!math.isFinite(x)) {\n _DEBUG && common.debug(x);\n throw new Error('Invalid Number!');\n }\n};\n\nmath.invSqrt = function(x: number): number {\n // TODO:\n return 1 / Math.sqrt(x);\n};\n\nmath.nextPowerOfTwo = function(x: number): number {\n // TODO\n x |= (x >> 1);\n x |= (x >> 2);\n x |= (x >> 4);\n x |= (x >> 8);\n x |= (x >> 16);\n return x + 1;\n};\n\nmath.isPowerOfTwo = function(x: number): boolean {\n return x > 0 && (x & (x - 1)) === 0;\n};\n\nmath.mod = function(num: number, min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n if (max > min) {\n num = (num - min) % (max - min);\n return num + (num < 0 ? max : min);\n } else {\n num = (num - max) % (min - max);\n return num + (num <= 0 ? min : max);\n }\n};\n\nmath.clamp = function(num: number, min: number, max: number): number {\n if (num < min) {\n return min;\n } else if (num > max) {\n return max;\n } else {\n return num;\n }\n};\n\nmath.random = function(min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n return min === max ? min : Math.random() * (max - min) + min;\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Math from './Math';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport default class Vec2 {\n x: number;\n y: number;\n\n constructor(x: number, y: number);\n constructor(obj: { x: number, y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?) {\n if (!(this instanceof Vec2)) {\n return new Vec2(x, y);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n } else {\n this.x = x;\n this.y = y;\n }\n _ASSERT && Vec2.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = data.x;\n obj.y = data.y;\n return obj;\n }\n\n static zero(): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = 0;\n obj.y = 0;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = x;\n obj.y = y;\n return obj;\n }\n\n static clone(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(v.x, v.y);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Vec2.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Vec2!');\n }\n }\n\n clone(): Vec2 {\n return Vec2.clone(this);\n }\n\n /**\n * Set this vector to all zeros.\n *\n * @returns this\n */\n setZero(): Vec2 {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n set(x: number, y: number): Vec2;\n set(value: Vec2): Vec2;\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n // tslint:disable-next-line:typedef\n set(x, y?) {\n if (typeof x === 'object') {\n _ASSERT && Vec2.assert(x);\n this.x = x.x;\n this.y = x.y;\n } else {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n }\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setNum(x: number, y: number) {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setVec2(value: Vec2) {\n _ASSERT && Vec2.assert(value);\n this.x = value.x;\n this.y = value.y;\n\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use setCombine or setMul\n */\n wSet(a: number, v: Vec2, b?: number, w?: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.setCombine(a, v, b, w);\n } else {\n return this.setMul(a, v);\n }\n }\n\n /**\n * Set linear combination of v and w: `a * v + b * w`\n */\n setCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x = x;\n this.y = y;\n return this;\n }\n\n setMul(a: number, v: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Add a vector to this vector.\n *\n * @returns this\n */\n add(w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x += w.x;\n this.y += w.y;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use addCombine or addMul\n */\n wAdd(a: number, v: Vec2, b?: number, w?: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.addCombine(a, v, b, w);\n } else {\n return this.addMul(a, v);\n }\n }\n\n /**\n * Add linear combination of v and w: `a * v + b * w`\n */\n addCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x += x;\n this.y += y;\n return this;\n }\n\n addMul(a: number, v: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x += x;\n this.y += y;\n return this;\n }\n\n /**\n * @deprecated Use subCombine or subMul\n */\n wSub(a: number, v: Vec2, b?: number, w?: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.subCombine(a, v, b, w);\n } else {\n return this.subMul(a, v);\n }}\n\n /**\n * Subtract linear combination of v and w: `a * v + b * w`\n */\n subCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n subMul(a: number, v: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n /**\n * Subtract a vector from this vector\n *\n * @returns this\n */\n sub(w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x -= w.x;\n this.y -= w.y;\n return this;\n }\n\n /**\n * Multiply this vector by a scalar.\n *\n * @returns this\n */\n mul(m: number): Vec2 {\n _ASSERT && Math.assert(m);\n this.x *= m;\n this.y *= m;\n return this;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n length(): number {\n return Vec2.lengthOf(this);\n }\n\n /**\n * Get the length squared.\n */\n lengthSquared(): number {\n return Vec2.lengthSquared(this);\n }\n\n /**\n * Convert this vector into a unit vector.\n *\n * @returns old length\n */\n normalize(): number {\n const length = this.length();\n if (length < Math.EPSILON) {\n return 0.0;\n }\n const invLength = 1.0 / length;\n this.x *= invLength;\n this.y *= invLength;\n return length;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n static lengthOf(v: Vec2): number {\n _ASSERT && Vec2.assert(v);\n return Math.sqrt(v.x * v.x + v.y * v.y);\n }\n\n /**\n * Get the length squared.\n */\n static lengthSquared(v: Vec2): number {\n _ASSERT && Vec2.assert(v);\n return v.x * v.x + v.y * v.y;\n }\n\n static distance(v: Vec2, w: Vec2): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n static distanceSquared(v: Vec2, w: Vec2): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return dx * dx + dy * dy;\n }\n\n static areEqual(v: Vec2, w: Vec2): boolean {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v === w || typeof w === 'object' && w !== null && v.x === w.x && v.y === w.y;\n }\n\n /**\n * Get the skew vector such that dot(skew_vec, other) == cross(vec, other)\n */\n static skew(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.y, v.x);\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec2, w: Vec2): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.x + v.y * w.y;\n }\n\n static cross(v: Vec2, w: Vec2): number;\n static cross(v: Vec2, w: number): Vec2;\n static cross(v: number, w: Vec2): Vec2;\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n *\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n // tslint:disable-next-line:typedef\n static cross(v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n\n } else {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static crossVec2Vec2(v: Vec2, w: Vec2): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossVec2Num(v: Vec2, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossNumVec2(v: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n }\n\n static addCross(a: Vec2, v: Vec2, w: number): Vec2;\n static addCross(a: Vec2, v: number, w: Vec2): Vec2;\n /**\n * Returns `a + (v x w)`\n */\n // tslint:disable-next-line:typedef\n static addCross(a, v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n _ASSERT && common.assert(false);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossVec2Num(a: Vec2, v: Vec2, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossNumVec2(a: Vec2, v: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n static add(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x + w.x, v.y + w.y);\n }\n\n /** @internal @deprecated */\n static wAdd(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return Vec2.combine(a, v, b, w);\n } else {\n return Vec2.mulNumVec2(a, v);\n }\n }\n\n static combine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n return Vec2.zero().setCombine(a, v, b, w);\n }\n\n static sub(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x - w.x, v.y - w.y);\n }\n\n static mul(a: Vec2, b: number): Vec2;\n static mul(a: number, b: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (typeof a === 'object') {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n\n } else if (typeof b === 'object') {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n }\n\n static mulVec2Num(a: Vec2, b: number): Vec2 {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n }\n\n static mulNumVec2(a: number, b: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n\n neg(): Vec2 {\n this.x = -this.x;\n this.y = -this.y;\n return this;\n }\n\n static neg(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.x, -v.y);\n }\n\n static abs(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Math.abs(v.x), Math.abs(v.y));\n }\n\n static mid(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo((v.x + w.x) * 0.5, (v.y + w.y) * 0.5);\n }\n\n static upper(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.max(v.x, w.x), Math.max(v.y, w.y));\n }\n\n static lower(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.min(v.x, w.x), Math.min(v.y, w.y));\n }\n\n clamp(max: number): Vec2 {\n const lengthSqr = this.x * this.x + this.y * this.y;\n if (lengthSqr > max * max) {\n const invLength = Math.invSqrt(lengthSqr);\n this.x *= invLength * max;\n this.y *= invLength * max;\n }\n return this;\n }\n\n static clamp(v: Vec2, max: number): Vec2 {\n v = Vec2.neo(v.x, v.y);\n v.clamp(max);\n return v;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static scaleFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x * x, v.y * y);\n };\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static translateFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x + x, v.y + y);\n };\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n */\nexport interface RayCastInput {\n p1: Vec2;\n p2: Vec2;\n maxFraction: number;\n}\n\nexport type RayCastCallback = (subInput: RayCastInput, id: number) => number;\n\n/**\n * Ray-cast output data. The ray hits at `p1 + fraction * (p2 - p1)`,\n * where `p1` and `p2` come from RayCastInput.\n */\nexport interface RayCastOutput {\n normal: Vec2;\n fraction: number;\n}\n\nexport default class AABB {\n lowerBound: Vec2;\n upperBound: Vec2;\n\n constructor(lower?: Vec2, upper?: Vec2) {\n if (!(this instanceof AABB)) {\n return new AABB(lower, upper);\n }\n\n this.lowerBound = Vec2.zero();\n this.upperBound = Vec2.zero();\n\n if (typeof lower === 'object') {\n this.lowerBound.setVec2(lower);\n }\n if (typeof upper === 'object') {\n this.upperBound.setVec2(upper);\n } else if (typeof lower === 'object') {\n this.upperBound.setVec2(lower);\n }\n }\n\n /**\n * Verify that the bounds are sorted.\n */\n isValid(): boolean {\n return AABB.isValid(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.lowerBound) && Vec2.isValid(obj.upperBound) && Vec2.sub(obj.upperBound, obj.lowerBound).lengthSquared() >= 0;\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!AABB.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid AABB!');\n }\n }\n\n /**\n * Get the center of the AABB.\n */\n getCenter(): Vec2 {\n return Vec2.neo((this.lowerBound.x + this.upperBound.x) * 0.5, (this.lowerBound.y + this.upperBound.y) * 0.5);\n }\n\n /**\n * Get the extents of the AABB (half-widths).\n */\n getExtents(): Vec2 {\n return Vec2.neo((this.upperBound.x - this.lowerBound.x) * 0.5, (this.upperBound.y - this.lowerBound.y) * 0.5);\n }\n\n /**\n * Get the perimeter length.\n */\n getPerimeter(): number {\n return 2.0 * (this.upperBound.x - this.lowerBound.x + this.upperBound.y - this.lowerBound.y);\n }\n\n /**\n * Combine one or two AABB into this one.\n */\n combine(a: AABB, b?: AABB): void {\n b = b || this;\n\n const lowerA = a.lowerBound;\n const upperA = a.upperBound;\n const lowerB = b.lowerBound;\n const upperB = b.upperBound;\n\n const lowerX = Math.min(lowerA.x, lowerB.x);\n const lowerY = Math.min(lowerA.y, lowerB.y);\n const upperX = Math.max(upperB.x, upperA.x);\n const upperY = Math.max(upperB.y, upperA.y);\n\n this.lowerBound.setNum(lowerX, lowerY);\n this.upperBound.setNum(upperX, upperY);\n }\n\n combinePoints(a: Vec2, b: Vec2): void {\n this.lowerBound.setNum(Math.min(a.x, b.x), Math.min(a.y, b.y));\n this.upperBound.setNum(Math.max(a.x, b.x), Math.max(a.y, b.y));\n }\n\n set(aabb: AABB): void {\n this.lowerBound.setNum(aabb.lowerBound.x, aabb.lowerBound.y);\n this.upperBound.setNum(aabb.upperBound.x, aabb.upperBound.y);\n }\n\n contains(aabb: AABB): boolean {\n let result = true;\n result = result && this.lowerBound.x <= aabb.lowerBound.x;\n result = result && this.lowerBound.y <= aabb.lowerBound.y;\n result = result && aabb.upperBound.x <= this.upperBound.x;\n result = result && aabb.upperBound.y <= this.upperBound.y;\n return result;\n }\n\n extend(value: number): AABB {\n AABB.extend(this, value);\n return this;\n }\n\n static extend(aabb: AABB, value: number): void {\n aabb.lowerBound.x -= value;\n aabb.lowerBound.y -= value;\n aabb.upperBound.x += value;\n aabb.upperBound.y += value;\n }\n\n static testOverlap(a: AABB, b: AABB): boolean {\n const d1x = b.lowerBound.x - a.upperBound.x;\n const d2x = a.lowerBound.x - b.upperBound.x;\n\n const d1y = b.lowerBound.y - a.upperBound.y;\n const d2y = a.lowerBound.y - b.upperBound.y;\n\n if (d1x > 0 || d1y > 0 || d2x > 0 || d2y > 0) {\n return false;\n }\n return true;\n }\n\n static areEqual(a: AABB, b: AABB): boolean {\n return Vec2.areEqual(a.lowerBound, b.lowerBound) && Vec2.areEqual(a.upperBound, b.upperBound);\n }\n\n static diff(a: AABB, b: AABB): number {\n const wD = Math.max(0, Math.min(a.upperBound.x, b.upperBound.x) - Math.max(b.lowerBound.x, a.lowerBound.x));\n const hD = Math.max(0, Math.min(a.upperBound.y, b.upperBound.y) - Math.max(b.lowerBound.y, a.lowerBound.y));\n\n const wA = a.upperBound.x - a.lowerBound.x;\n const hA = a.upperBound.y - a.lowerBound.y;\n\n const wB = b.upperBound.x - b.lowerBound.x;\n const hB = b.upperBound.y - b.lowerBound.y;\n\n return wA * hA + wB * hB - wD * hD;\n }\n\n rayCast(output: RayCastOutput, input: RayCastInput): boolean {\n // From Real-time Collision Detection, p179.\n\n let tmin = -Infinity;\n let tmax = Infinity;\n\n const p = input.p1;\n const d = Vec2.sub(input.p2, input.p1);\n const absD = Vec2.abs(d);\n\n const normal = Vec2.zero();\n\n for (let f: 'x' | 'y' = 'x'; f !== null; f = (f === 'x' ? 'y' : null)) {\n if (absD.x < Math.EPSILON) {\n // Parallel.\n if (p[f] < this.lowerBound[f] || this.upperBound[f] < p[f]) {\n return false;\n }\n } else {\n const inv_d = 1.0 / d[f];\n let t1 = (this.lowerBound[f] - p[f]) * inv_d;\n let t2 = (this.upperBound[f] - p[f]) * inv_d;\n\n // Sign of the normal vector.\n let s = -1.0;\n\n if (t1 > t2) {\n const temp = t1;\n t1 = t2;\n t2 = temp;\n s = 1.0;\n }\n\n // Push the min up\n if (t1 > tmin) {\n normal.setZero();\n normal[f] = s;\n tmin = t1;\n }\n\n // Pull the max down\n tmax = Math.min(tmax, t2);\n\n if (tmin > tmax) {\n return false;\n }\n }\n }\n\n // Does the ray start inside the box?\n // Does the ray intersect beyond the max fraction?\n if (tmin < 0.0 || input.maxFraction < tmin) {\n return false;\n }\n\n // Intersection.\n output.fraction = tmin;\n output.normal = normal;\n return true;\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n// TODO merge with World options?\n\n/**\n * Tuning constants based on meters-kilograms-seconds (MKS) units.\n */\n// tslint:disable-next-line:no-unnecessary-class\nexport default class Settings {\n // Collision\n /**\n * The maximum number of contact points between two convex shapes. Do not change\n * this value.\n */\n static maxManifoldPoints: number = 2;\n\n /**\n * The maximum number of vertices on a convex polygon. You cannot increase this\n * too much because BlockAllocator has a maximum object size.\n */\n static maxPolygonVertices: number = 12;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This allows proxies to move\n * by a small amount without triggering a tree adjustment. This is in meters.\n */\n static aabbExtension: number = 0.1;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This is used to predict the\n * future position based on the current displacement. This is a dimensionless\n * multiplier.\n */\n static aabbMultiplier: number = 2.0;\n\n /**\n * A small length used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static linearSlop: number = 0.005;\n static get linearSlopSquared(): number { return Settings.linearSlop * Settings.linearSlop; }\n\n /**\n * A small angle used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static angularSlop: number = (2.0 / 180.0 * Math.PI);\n\n /**\n * The radius of the polygon/edge shape skin. This should not be modified.\n * Making this smaller means polygons will have an insufficient buffer for\n * continuous collision. Making it larger may create artifacts for vertex\n * collision.\n */\n static get polygonRadius(): number { return 2.0 * Settings.linearSlop; }\n\n /**\n * Maximum number of sub-steps per contact in continuous physics simulation.\n */\n static maxSubSteps: number = 8;\n\n// Dynamics\n\n /**\n * Maximum number of contacts to be handled to solve a TOI impact.\n */\n static maxTOIContacts: number = 32;\n\n /**\n * Maximum iterations to solve a TOI.\n */\n static maxTOIIterations: number = 20;\n\n /**\n * Maximum iterations to find Distance.\n */\n static maxDistnceIterations: number = 20;\n\n /**\n * A velocity threshold for elastic collisions. Any collision with a relative\n * linear velocity below this threshold will be treated as inelastic.\n */\n static velocityThreshold: number = 1.0;\n\n /**\n * The maximum linear position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxLinearCorrection: number = 0.2;\n\n /**\n * The maximum angular position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxAngularCorrection: number = (8.0 / 180.0 * Math.PI);\n\n /**\n * The maximum linear velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxTranslation: number = 2.0;\n static get maxTranslationSquared(): number { return Settings.maxTranslation * Settings.maxTranslation; }\n\n /**\n * The maximum angular velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxRotation: number = (0.5 * Math.PI);\n static get maxRotationSquared(): number { return Settings.maxRotation * Settings.maxRotation; }\n\n /**\n * This scale factor controls how fast overlap is resolved. Ideally this would\n * be 1 so that overlap is removed in one time step. However using values close\n * to 1 often lead to overshoot.\n */\n static baumgarte: number = 0.2;\n static toiBaugarte: number = 0.75;\n\n // Sleep\n\n /**\n * The time that a body must be still before it will go to sleep.\n */\n static timeToSleep: number = 0.5;\n\n /**\n * A body cannot sleep if its linear velocity is above this tolerance.\n */\n static linearSleepTolerance: number = 0.01;\n static get linearSleepToleranceSqr(): number { return Math.pow(Settings.linearSleepTolerance, 2); }\n\n /**\n * A body cannot sleep if its angular velocity is above this tolerance.\n */\n static angularSleepTolerance: number = (2.0 / 180.0 * Math.PI);\n static get angularSleepToleranceSqr(): number { return Math.pow(Settings.angularSleepTolerance, 2); }\n\n}\n","/*\n * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js\n *\n * This software is provided 'as-is', without any express or implied\n * warranty. In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * 1. The origin of this software must not be misrepresented; you must not\n * claim that you wrote the original software. If you use this software\n * in a product, an acknowledgment in the product documentation would be\n * appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n * misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n */\n\nexport default class Pool {\n _list: T[] = [];\n _max: number = Infinity;\n\n _createFn: () => T;\n _outFn: (item: T) => void;\n _inFn: (item: T) => void;\n _discardFn: (item: T) => T;\n\n _createCount: number = 0;\n _outCount: number = 0;\n _inCount: number = 0;\n _discardCount: number = 0;\n\n constructor(opts: {\n max?: number,\n create?: () => T,\n allocate?: (item: T) => void,\n release?: (item: T) => void,\n discard?: (item: T) => T,\n }) {\n this._list = [];\n this._max = opts.max || this._max;\n\n this._createFn = opts.create;\n this._outFn = opts.allocate;\n this._inFn = opts.release;\n this._discardFn = opts.discard;\n }\n\n max(n?: number): number | Pool {\n if (typeof n === 'number') {\n this._max = n;\n return this;\n }\n return this._max;\n }\n\n size(): number {\n return this._list.length;\n }\n\n allocate(): T {\n let item: T;\n if (this._list.length > 0) {\n item = this._list.shift();\n } else {\n this._createCount++;\n if (typeof this._createFn === 'function') {\n item = this._createFn();\n } else {\n // tslint:disable-next-line:no-object-literal-type-assertion\n item = {} as T;\n }\n }\n this._outCount++;\n if (typeof this._outFn === 'function') {\n this._outFn(item);\n }\n return item;\n }\n\n release(item: T): void {\n if (this._list.length < this._max) {\n this._inCount++;\n if (typeof this._inFn === 'function') {\n this._inFn(item);\n }\n this._list.push(item);\n } else {\n this._discardCount++;\n if (typeof this._discardFn === 'function') {\n item = this._discardFn(item);\n }\n }\n }\n\n /** @internal */\n toString(): string {\n return \" +\" + this._createCount + \" >\" + this._outCount + \" <\" + this._inCount + \" -\"\n + this._discardCount + \" =\" + this._list.length + \"/\" + this._max;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../Settings';\nimport common from '../util/common';\nimport Pool from '../util/Pool';\nimport Vec2 from '../common/Vec2';\nimport Math from '../common/Math';\nimport AABB, { RayCastCallback, RayCastInput } from './AABB';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport type DynamicTreeQueryCallback = (nodeId: number) => boolean;\n\n/**\n * A node in the dynamic tree. The client does not interact with this directly.\n */\nexport class TreeNode {\n id: number;\n /** Enlarged AABB */\n aabb: AABB = new AABB();\n userData: T = null;\n parent: TreeNode = null;\n child1: TreeNode = null;\n child2: TreeNode = null;\n /** 0: leaf, -1: free node */\n height: number = -1;\n\n constructor(id?: number) {\n this.id = id;\n }\n\n /** @internal */\n toString(): string {\n return this.id + \": \" + this.userData;\n }\n\n isLeaf(): boolean {\n return this.child1 == null;\n }\n}\n\n/**\n * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A\n * dynamic tree arranges data in a binary tree to accelerate queries such as\n * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we\n * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger\n * than the client object. This allows the client object to move by small\n * amounts without triggering a tree update.\n *\n * Nodes are pooled and relocatable, so we use node indices rather than\n * pointers.\n */\nexport default class DynamicTree {\n m_root: TreeNode;\n m_lastProxyId: number;\n m_nodes: {\n [id: number]: TreeNode\n };\n m_pool: Pool>;\n\n constructor() {\n this.m_root = null;\n this.m_nodes = {};\n this.m_lastProxyId = 0;\n\n this.m_pool = new Pool>({\n create(): TreeNode {\n return new TreeNode();\n }\n });\n }\n\n /**\n * Get proxy user data.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getUserData(id: number): T {\n const node = this.m_nodes[id];\n _ASSERT && common.assert(!!node);\n return node.userData;\n }\n\n /**\n * Get the fat AABB for a node id.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getFatAABB(id: number): AABB {\n const node = this.m_nodes[id];\n _ASSERT && common.assert(!!node);\n return node.aabb;\n }\n\n allocateNode(): TreeNode {\n const node = this.m_pool.allocate();\n node.id = ++this.m_lastProxyId;\n node.userData = null;\n node.parent = null;\n node.child1 = null;\n node.child2 = null;\n node.height = -1;\n this.m_nodes[node.id] = node;\n return node;\n }\n\n freeNode(node: TreeNode): void {\n this.m_pool.release(node);\n node.height = -1;\n // tslint:disable-next-line:no-dynamic-delete\n delete this.m_nodes[node.id];\n }\n\n /**\n * Create a proxy in the tree as a leaf node. We return the index of the node\n * instead of a pointer so that we can grow the node pool.\n *\n * Create a proxy. Provide a tight fitting AABB and a userData pointer.\n */\n createProxy(aabb: AABB, userData: T): number {\n _ASSERT && common.assert(AABB.isValid(aabb));\n\n const node = this.allocateNode();\n\n node.aabb.set(aabb);\n\n // Fatten the aabb.\n AABB.extend(node.aabb, Settings.aabbExtension);\n\n node.userData = userData;\n node.height = 0;\n\n this.insertLeaf(node);\n\n return node.id;\n }\n\n /**\n * Destroy a proxy. This asserts if the id is invalid.\n */\n destroyProxy(id: number): void {\n const node = this.m_nodes[id];\n\n _ASSERT && common.assert(!!node);\n _ASSERT && common.assert(node.isLeaf());\n\n this.removeLeaf(node);\n this.freeNode(node);\n }\n\n /**\n * Move a proxy with a swepted AABB. If the proxy has moved outside of its\n * fattened AABB, then the proxy is removed from the tree and re-inserted.\n * Otherwise the function returns immediately.\n *\n * @param d Displacement\n *\n * @return true if the proxy was re-inserted.\n */\n moveProxy(id: number, aabb: AABB, d: Vec2): boolean {\n _ASSERT && common.assert(AABB.isValid(aabb));\n _ASSERT && common.assert(!d || Vec2.isValid(d));\n\n const node = this.m_nodes[id];\n\n _ASSERT && common.assert(!!node);\n _ASSERT && common.assert(node.isLeaf());\n\n if (node.aabb.contains(aabb)) {\n return false;\n }\n\n this.removeLeaf(node);\n\n node.aabb.set(aabb);\n\n // Extend AABB.\n aabb = node.aabb;\n AABB.extend(aabb, Settings.aabbExtension);\n\n // Predict AABB displacement.\n // const d = Vec2.mul(Settings.aabbMultiplier, displacement);\n\n if (d.x < 0.0) {\n aabb.lowerBound.x += d.x * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.x += d.x * Settings.aabbMultiplier;\n }\n\n if (d.y < 0.0) {\n aabb.lowerBound.y += d.y * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.y += d.y * Settings.aabbMultiplier;\n }\n\n this.insertLeaf(node);\n\n return true;\n }\n\n insertLeaf(leaf: TreeNode): void {\n _ASSERT && common.assert(AABB.isValid(leaf.aabb));\n\n if (this.m_root == null) {\n this.m_root = leaf;\n this.m_root.parent = null;\n return;\n }\n\n // Find the best sibling for this node\n const leafAABB = leaf.aabb;\n let index = this.m_root;\n while (!index.isLeaf()) {\n const child1 = index.child1;\n const child2 = index.child2;\n\n const area = index.aabb.getPerimeter();\n\n const combinedAABB = new AABB();\n combinedAABB.combine(index.aabb, leafAABB);\n const combinedArea = combinedAABB.getPerimeter();\n\n // Cost of creating a new parent for this node and the new leaf\n const cost = 2.0 * combinedArea;\n\n // Minimum cost of pushing the leaf further down the tree\n const inheritanceCost = 2.0 * (combinedArea - area);\n\n // Cost of descending into child1\n let cost1;\n if (child1.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n cost1 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n const oldArea = child1.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost1 = (newArea - oldArea) + inheritanceCost;\n }\n\n // Cost of descending into child2\n let cost2;\n if (child2.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n cost2 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n const oldArea = child2.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost2 = newArea - oldArea + inheritanceCost;\n }\n\n // Descend according to the minimum cost.\n if (cost < cost1 && cost < cost2) {\n break;\n }\n\n // Descend\n if (cost1 < cost2) {\n index = child1;\n } else {\n index = child2;\n }\n }\n\n const sibling = index;\n\n // Create a new parent.\n const oldParent = sibling.parent;\n const newParent = this.allocateNode();\n newParent.parent = oldParent;\n newParent.userData = null;\n newParent.aabb.combine(leafAABB, sibling.aabb);\n newParent.height = sibling.height + 1;\n\n if (oldParent != null) {\n // The sibling was not the root.\n if (oldParent.child1 === sibling) {\n oldParent.child1 = newParent;\n } else {\n oldParent.child2 = newParent;\n }\n\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n } else {\n // The sibling was the root.\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n this.m_root = newParent;\n }\n\n // Walk back up the tree fixing heights and AABBs\n index = leaf.parent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n _ASSERT && common.assert(child1 != null);\n _ASSERT && common.assert(child2 != null);\n\n index.height = 1 + Math.max(child1.height, child2.height);\n index.aabb.combine(child1.aabb, child2.aabb);\n\n index = index.parent;\n }\n\n // validate();\n }\n\n removeLeaf(leaf: TreeNode): void {\n if (leaf === this.m_root) {\n this.m_root = null;\n return;\n }\n\n const parent = leaf.parent;\n const grandParent = parent.parent;\n let sibling;\n if (parent.child1 === leaf) {\n sibling = parent.child2;\n } else {\n sibling = parent.child1;\n }\n\n if (grandParent != null) {\n // Destroy parent and connect sibling to grandParent.\n if (grandParent.child1 === parent) {\n grandParent.child1 = sibling;\n } else {\n grandParent.child2 = sibling;\n }\n sibling.parent = grandParent;\n this.freeNode(parent);\n\n // Adjust ancestor bounds.\n let index = grandParent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n index.aabb.combine(child1.aabb, child2.aabb);\n index.height = 1 + Math.max(child1.height, child2.height);\n\n index = index.parent;\n }\n } else {\n this.m_root = sibling;\n sibling.parent = null;\n this.freeNode(parent);\n }\n\n // validate();\n }\n\n /**\n * Perform a left or right rotation if node A is imbalanced. Returns the new\n * root index.\n */\n balance(iA: TreeNode): TreeNode {\n _ASSERT && common.assert(iA != null);\n\n const A = iA;\n if (A.isLeaf() || A.height < 2) {\n return iA;\n }\n\n const B = A.child1;\n const C = A.child2;\n\n const balance = C.height - B.height;\n\n // Rotate C up\n if (balance > 1) {\n const F = C.child1;\n const G = C.child2;\n\n // Swap A and C\n C.child1 = A;\n C.parent = A.parent;\n A.parent = C;\n\n // A's old parent should point to C\n if (C.parent != null) {\n if (C.parent.child1 === iA) {\n C.parent.child1 = C;\n } else {\n C.parent.child2 = C;\n }\n } else {\n this.m_root = C;\n }\n\n // Rotate\n if (F.height > G.height) {\n C.child2 = F;\n A.child2 = G;\n G.parent = A;\n A.aabb.combine(B.aabb, G.aabb);\n C.aabb.combine(A.aabb, F.aabb);\n\n A.height = 1 + Math.max(B.height, G.height);\n C.height = 1 + Math.max(A.height, F.height);\n } else {\n C.child2 = G;\n A.child2 = F;\n F.parent = A;\n A.aabb.combine(B.aabb, F.aabb);\n C.aabb.combine(A.aabb, G.aabb);\n\n A.height = 1 + Math.max(B.height, F.height);\n C.height = 1 + Math.max(A.height, G.height);\n }\n\n return C;\n }\n\n // Rotate B up\n if (balance < -1) {\n const D = B.child1;\n const E = B.child2;\n\n // Swap A and B\n B.child1 = A;\n B.parent = A.parent;\n A.parent = B;\n\n // A's old parent should point to B\n if (B.parent != null) {\n if (B.parent.child1 === A) {\n B.parent.child1 = B;\n } else {\n B.parent.child2 = B;\n }\n } else {\n this.m_root = B;\n }\n\n // Rotate\n if (D.height > E.height) {\n B.child2 = D;\n A.child1 = E;\n E.parent = A;\n A.aabb.combine(C.aabb, E.aabb);\n B.aabb.combine(A.aabb, D.aabb);\n\n A.height = 1 + Math.max(C.height, E.height);\n B.height = 1 + Math.max(A.height, D.height);\n } else {\n B.child2 = E;\n A.child1 = D;\n D.parent = A;\n A.aabb.combine(C.aabb, D.aabb);\n B.aabb.combine(A.aabb, E.aabb);\n\n A.height = 1 + Math.max(C.height, D.height);\n B.height = 1 + Math.max(A.height, E.height);\n }\n\n return B;\n }\n\n return A;\n }\n\n /**\n * Compute the height of the binary tree in O(N) time. Should not be called\n * often.\n */\n getHeight(): number {\n if (this.m_root == null) {\n return 0;\n }\n\n return this.m_root.height;\n }\n\n /**\n * Get the ratio of the sum of the node areas to the root area.\n */\n getAreaRatio(): number {\n if (this.m_root == null) {\n return 0.0;\n }\n\n const root = this.m_root;\n const rootArea = root.aabb.getPerimeter();\n\n let totalArea = 0.0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // Free node in pool\n continue;\n }\n\n totalArea += node.aabb.getPerimeter();\n }\n\n this.iteratorPool.release(it);\n\n return totalArea / rootArea;\n }\n\n /**\n * Compute the height of a sub-tree.\n */\n computeHeight(id?: number): number {\n let node;\n if (typeof id !== 'undefined') {\n node = this.m_nodes[id];\n } else {\n node = this.m_root;\n }\n\n // _ASSERT && common.assert(0 <= id && id < this.m_nodeCapacity);\n\n if (node.isLeaf()) {\n return 0;\n }\n\n const height1 = this.computeHeight(node.child1.id);\n const height2 = this.computeHeight(node.child2.id);\n return 1 + Math.max(height1, height2);\n }\n\n validateStructure(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n if (node === this.m_root) {\n _ASSERT && common.assert(node.parent == null);\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && common.assert(child1 == null);\n _ASSERT && common.assert(child2 == null);\n _ASSERT && common.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && common.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && common.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n _ASSERT && common.assert(child1.parent === node);\n _ASSERT && common.assert(child2.parent === node);\n\n this.validateStructure(child1);\n this.validateStructure(child2);\n }\n\n validateMetrics(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && common.assert(child1 == null);\n _ASSERT && common.assert(child2 == null);\n _ASSERT && common.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && common.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && common.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n const height1 = child1.height;\n const height2 = child2.height;\n const height = 1 + Math.max(height1, height2);\n _ASSERT && common.assert(node.height === height);\n\n const aabb = new AABB();\n aabb.combine(child1.aabb, child2.aabb);\n\n _ASSERT && common.assert(AABB.areEqual(aabb, node.aabb));\n\n this.validateMetrics(child1);\n this.validateMetrics(child2);\n }\n\n /**\n * Validate this tree. For testing.\n */\n validate(): void {\n this.validateStructure(this.m_root);\n this.validateMetrics(this.m_root);\n\n _ASSERT && common.assert(this.getHeight() === this.computeHeight());\n }\n\n /**\n * Get the maximum balance of an node in the tree. The balance is the difference\n * in height of the two children of a node.\n */\n getMaxBalance(): number {\n let maxBalance = 0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height <= 1) {\n continue;\n }\n\n _ASSERT && common.assert(!node.isLeaf());\n\n const balance = Math.abs(node.child2.height - node.child1.height);\n maxBalance = Math.max(maxBalance, balance);\n }\n this.iteratorPool.release(it);\n\n return maxBalance;\n }\n\n /**\n * Build an optimal tree. Very expensive. For testing.\n */\n rebuildBottomUp(): void {\n const nodes = [];\n let count = 0;\n\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // free node in pool\n continue;\n }\n\n if (node.isLeaf()) {\n node.parent = null;\n nodes[count] = node;\n ++count;\n } else {\n this.freeNode(node);\n }\n }\n this.iteratorPool.release(it);\n\n while (count > 1) {\n let minCost = Infinity;\n let iMin = -1;\n let jMin = -1;\n for (let i = 0; i < count; ++i) {\n const aabbi = nodes[i].aabb;\n for (let j = i + 1; j < count; ++j) {\n const aabbj = nodes[j].aabb;\n const b = new AABB();\n b.combine(aabbi, aabbj);\n const cost = b.getPerimeter();\n if (cost < minCost) {\n iMin = i;\n jMin = j;\n minCost = cost;\n }\n }\n }\n\n const child1 = nodes[iMin];\n const child2 = nodes[jMin];\n\n const parent = this.allocateNode();\n parent.child1 = child1;\n parent.child2 = child2;\n parent.height = 1 + Math.max(child1.height, child2.height);\n parent.aabb.combine(child1.aabb, child2.aabb);\n parent.parent = null;\n\n child1.parent = parent;\n child2.parent = parent;\n\n nodes[jMin] = nodes[count - 1];\n nodes[iMin] = parent;\n --count;\n }\n\n this.m_root = nodes[0];\n\n this.validate();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n const aabb = node.aabb;\n aabb.lowerBound.x -= newOrigin.x;\n aabb.lowerBound.y -= newOrigin.y;\n aabb.upperBound.x -= newOrigin.x;\n aabb.upperBound.y -= newOrigin.y;\n }\n this.iteratorPool.release(it);\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query(aabb: AABB, queryCallback: DynamicTreeQueryCallback): void {\n _ASSERT && common.assert(typeof queryCallback === 'function');\n const stack = this.stackPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, aabb)) {\n if (node.isLeaf()) {\n const proceed = queryCallback(node.id);\n if (proceed === false) {\n return;\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n }\n\n this.stackPool.release(stack);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n // TODO: GC\n _ASSERT && common.assert(typeof rayCastCallback === 'function');\n const p1 = input.p1;\n const p2 = input.p2;\n const r = Vec2.sub(p2, p1);\n _ASSERT && common.assert(r.lengthSquared() > 0.0);\n r.normalize();\n\n // v is perpendicular to the segment.\n const v = Vec2.crossNumVec2(1.0, r);\n const abs_v = Vec2.abs(v);\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n\n let maxFraction = input.maxFraction;\n\n // Build a bounding box for the segment.\n const segmentAABB = new AABB();\n let t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n\n const stack = this.stackPool.allocate();\n const subInput = this.inputPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, segmentAABB) === false) {\n continue;\n }\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n const c = node.aabb.getCenter();\n const h = node.aabb.getExtents();\n const separation = Math.abs(Vec2.dot(v, Vec2.sub(p1, c))) - Vec2.dot(abs_v, h);\n if (separation > 0.0) {\n continue;\n }\n\n if (node.isLeaf()) {\n subInput.p1 = Vec2.clone(input.p1);\n subInput.p2 = Vec2.clone(input.p2);\n subInput.maxFraction = maxFraction;\n\n const value = rayCastCallback(subInput, node.id);\n\n if (value === 0.0) {\n // The client has terminated the ray cast.\n return;\n }\n\n if (value > 0.0) {\n // update segment bounding box.\n maxFraction = value;\n t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n this.stackPool.release(stack);\n this.inputPool.release(subInput);\n }\n\n private inputPool: Pool = new Pool({\n create(): RayCastInput {\n // tslint:disable-next-line:no-object-literal-type-assertion\n return {} as RayCastInput;\n },\n release(stack: RayCastInput): void {\n }\n });\n\n private stackPool: Pool>> = new Pool>>({\n create(): Array> {\n return [];\n },\n release(stack: Array>): void {\n stack.length = 0;\n }\n });\n\n private iteratorPool: Pool> = new Pool>({\n create(): Iterator {\n return new Iterator();\n },\n release(iterator: Iterator): void {\n iterator.close();\n }\n });\n\n}\n\nclass Iterator {\n parents: Array> = [];\n states: number[] = [];\n preorder(root: TreeNode): Iterator {\n this.parents.length = 0;\n this.parents.push(root);\n this.states.length = 0;\n this.states.push(0);\n return this;\n }\n next(): TreeNode {\n while (this.parents.length > 0) {\n const i = this.parents.length - 1;\n const node = this.parents[i];\n if (this.states[i] === 0) {\n this.states[i] = 1;\n return node;\n }\n if (this.states[i] === 1) {\n this.states[i] = 2;\n if (node.child1) {\n this.parents.push(node.child1);\n this.states.push(1);\n return node.child1;\n }\n }\n if (this.states[i] === 2) {\n this.states[i] = 3;\n if (node.child2) {\n this.parents.push(node.child2);\n this.states.push(1);\n return node.child2;\n }\n }\n this.parents.pop();\n this.states.pop();\n }\n }\n close(): void {\n this.parents.length = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from '../common/Vec2';\nimport Math from '../common/Math';\nimport AABB, { RayCastCallback, RayCastInput } from './AABB';\nimport DynamicTree, { DynamicTreeQueryCallback } from './DynamicTree';\nimport { FixtureProxy } from \"../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * The broad-phase wraps and extends a dynamic-tree to keep track of moved\n * objects and query them on update.\n */\nexport default class BroadPhase {\n m_tree: DynamicTree = new DynamicTree();\n m_proxyCount: number = 0;\n m_moveBuffer: number[] = [];\n\n m_callback: (userDataA: any, userDataB: any) => void;\n m_queryProxyId: number;\n\n /**\n * Get user data from a proxy. Returns null if the id is invalid.\n */\n getUserData(proxyId: number): FixtureProxy {\n return this.m_tree.getUserData(proxyId);\n }\n\n /**\n * Test overlap of fat AABBs.\n */\n testOverlap(proxyIdA: number, proxyIdB: number): boolean {\n const aabbA = this.m_tree.getFatAABB(proxyIdA);\n const aabbB = this.m_tree.getFatAABB(proxyIdB);\n return AABB.testOverlap(aabbA, aabbB);\n }\n\n /**\n * Get the fat AABB for a proxy.\n */\n getFatAABB(proxyId: number): AABB {\n return this.m_tree.getFatAABB(proxyId);\n }\n\n /**\n * Get the number of proxies.\n */\n getProxyCount(): number {\n return this.m_proxyCount;\n }\n\n /**\n * Get the height of the embedded tree.\n */\n getTreeHeight(): number {\n return this.m_tree.getHeight();\n }\n\n /**\n * Get the balance (integer) of the embedded tree.\n */\n getTreeBalance(): number {\n return this.m_tree.getMaxBalance();\n }\n\n /**\n * Get the quality metric of the embedded tree.\n */\n getTreeQuality(): number {\n return this.m_tree.getAreaRatio();\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query = (aabb: AABB, queryCallback: DynamicTreeQueryCallback): void => {\n this.m_tree.query(aabb, queryCallback);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n this.m_tree.rayCast(input, rayCastCallback);\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_tree.shiftOrigin(newOrigin);\n }\n\n /**\n * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs\n * is called.\n */\n createProxy(aabb: AABB, userData: FixtureProxy): number {\n _ASSERT && common.assert(AABB.isValid(aabb));\n const proxyId = this.m_tree.createProxy(aabb, userData);\n this.m_proxyCount++;\n this.bufferMove(proxyId);\n return proxyId;\n }\n\n /**\n * Destroy a proxy. It is up to the client to remove any pairs.\n */\n destroyProxy(proxyId: number): void {\n this.unbufferMove(proxyId);\n this.m_proxyCount--;\n this.m_tree.destroyProxy(proxyId);\n }\n\n /**\n * Call moveProxy as many times as you like, then when you are done call\n * UpdatePairs to finalized the proxy pairs (for your time step).\n */\n moveProxy(proxyId: number, aabb: AABB, displacement: Vec2): void {\n _ASSERT && common.assert(AABB.isValid(aabb));\n const changed = this.m_tree.moveProxy(proxyId, aabb, displacement);\n if (changed) {\n this.bufferMove(proxyId);\n }\n }\n\n /**\n * Call to trigger a re-processing of it's pairs on the next call to\n * UpdatePairs.\n */\n touchProxy(proxyId: number): void {\n this.bufferMove(proxyId);\n }\n\n bufferMove(proxyId: number): void {\n this.m_moveBuffer.push(proxyId);\n }\n\n unbufferMove(proxyId: number): void {\n for (let i = 0; i < this.m_moveBuffer.length; ++i) {\n if (this.m_moveBuffer[i] === proxyId) {\n this.m_moveBuffer[i] = null;\n }\n }\n }\n\n /**\n * Update the pairs. This results in pair callbacks. This can only add pairs.\n */\n updatePairs(addPairCallback: (userDataA: FixtureProxy, userDataB: FixtureProxy) => void): void {\n _ASSERT && common.assert(typeof addPairCallback === 'function');\n this.m_callback = addPairCallback;\n\n // Perform tree queries for all moving proxies.\n while (this.m_moveBuffer.length > 0) {\n this.m_queryProxyId = this.m_moveBuffer.pop();\n if (this.m_queryProxyId === null) {\n continue;\n }\n\n // We have to query the tree with the fat AABB so that\n // we don't fail to create a pair that may touch later.\n const fatAABB = this.m_tree.getFatAABB(this.m_queryProxyId);\n\n // Query tree, create pairs and add them pair buffer.\n this.m_tree.query(fatAABB, this.queryCallback);\n }\n\n // Try to keep the tree balanced.\n // this.m_tree.rebalance(4);\n }\n\n queryCallback = (proxyId: number): boolean => {\n // A proxy cannot form a pair with itself.\n if (proxyId === this.m_queryProxyId) {\n return true;\n }\n\n const proxyIdA = Math.min(proxyId, this.m_queryProxyId);\n const proxyIdB = Math.max(proxyId, this.m_queryProxyId);\n\n // TODO: Skip any duplicate pairs.\n\n const userDataA = this.m_tree.getUserData(proxyIdA);\n const userDataB = this.m_tree.getUserData(proxyIdB);\n\n // Send the pairs back to the client.\n this.m_callback(userDataA, userDataB);\n\n return true;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from './Vec2';\nimport Math from './Math';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport default class Rot {\n s: number;\n c: number;\n\n /** Initialize from an angle in radians. */\n constructor(angle?: number | Rot) {\n if (!(this instanceof Rot)) {\n return new Rot(angle);\n }\n if (typeof angle === 'number') {\n this.setAngle(angle);\n } else if (typeof angle === 'object') {\n this.setRot(angle);\n } else {\n this.setIdentity();\n }\n }\n\n /** @internal */\n static neo(angle: number): Rot {\n const obj = Object.create(Rot.prototype);\n obj.setAngle(angle);\n return obj;\n }\n\n static clone(rot: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n const obj = Object.create(Rot.prototype);\n obj.s = rot.s;\n obj.c = rot.c;\n return obj;\n }\n\n static identity(): Rot {\n const obj = Object.create(Rot.prototype);\n obj.s = 0.0;\n obj.c = 1.0;\n return obj;\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.s) && Math.isFinite(obj.c);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Rot.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Rot!');\n }\n }\n\n /** Set to the identity rotation. */\n setIdentity(): void {\n this.s = 0.0;\n this.c = 1.0;\n }\n\n set(angle: number | Rot): void {\n if (typeof angle === 'object') {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n\n } else {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n }\n\n setRot(angle: Rot): void {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n }\n\n /** Set using an angle in radians. */\n setAngle(angle: number): void {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n\n /** Get the angle in radians. */\n getAngle(): number {\n return Math.atan2(this.s, this.c);\n }\n\n /** Get the x-axis. */\n getXAxis(): Vec2 {\n return Vec2.neo(this.c, this.s);\n }\n\n /** Get the u-axis. */\n getYAxis(): Vec2 {\n return Vec2.neo(-this.s, this.c);\n }\n\n /** Multiply two rotations: q * r */\n static mul(rot: Rot, m: Rot): Rot;\n /** Rotate a vector */\n static mul(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(rot, m) {\n _ASSERT && Rot.assert(rot);\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Multiply two rotations: q * r */\n static mulRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n }\n\n /** Rotate a vector */\n static mulVec2(rot: Rot, m: Vec2): Vec2 {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n\n static mulSub(rot: Rot, v: Vec2, w: Vec2): Vec2 {\n const x = rot.c * (v.x - w.x) - rot.s * (v.y - w.y);\n const y = rot.s * (v.x - w.x) + rot.c * (v.y - w.y);\n return Vec2.neo(x, y);\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulT(rot: Rot, m: Rot): Rot;\n /** Inverse rotate a vector */\n static mulT(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(rot, m) {\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulTRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n }\n\n /** Inverse rotate a vector */\n static mulTVec2(rot: Rot, m: Vec2): Vec2 {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from './Vec2';\nimport Rot from './Rot';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A transform contains translation and rotation. It is used to represent the\n * position and orientation of rigid frames. Initialize using a position vector\n * and a rotation.\n */\nexport default class Transform {\n /** position */\n p: Vec2;\n\n /** rotation */\n q: Rot;\n\n constructor(position?: Vec2, rotation?: number) {\n if (!(this instanceof Transform)) {\n return new Transform(position, rotation);\n }\n this.p = Vec2.zero();\n this.q = Rot.identity();\n if (typeof position !== 'undefined') {\n this.p.setVec2(position);\n }\n if (typeof rotation !== 'undefined') {\n this.q.setAngle(rotation);\n }\n }\n\n static clone(xf: Transform): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(xf.p);\n obj.q = Rot.clone(xf.q);\n return obj;\n }\n\n /** @internal */\n static neo(position: Vec2, rotation: Rot): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(position);\n obj.q = Rot.clone(rotation);\n return obj;\n }\n\n static identity(): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.zero();\n obj.q = Rot.identity();\n return obj;\n }\n\n /**\n * Set this to the identity transform.\n */\n setIdentity(): void {\n this.p.setZero();\n this.q.setIdentity();\n }\n\n set(position: Vec2, rotation: number): void;\n set(xf: Transform): void;\n /**\n * Set this based on the position and angle.\n */\n // tslint:disable-next-line:typedef\n set(a, b?) {\n if (typeof b === 'undefined') {\n this.p.set(a.p);\n this.q.set(a.q);\n } else {\n this.p.set(a);\n this.q.set(b);\n }\n }\n\n /**\n * Set this based on the position and angle.\n */\n setNum(position: Vec2, rotation: number) {\n this.p.setVec2(position);\n this.q.setAngle(rotation);\n }\n\n setTransform(xf: Transform): void {\n this.p.setVec2(xf.p);\n this.q.setRot(xf.q);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.p) && Rot.isValid(obj.q);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Transform.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Transform!');\n }\n }\n\n static mul(a: Transform, b: Vec2): Vec2;\n static mul(a: Transform, b: Transform): Transform;\n // static mul(a: Transform, b: Vec2[]): Vec2[];\n // static mul(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (Array.isArray(b)) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n\n } else if ('x' in b && 'y' in b) {\n return Transform.mulVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulXf(a, b);\n }\n }\n\n static mulAll(a: Transform, b: Vec2[]): Vec2[];\n static mulAll(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mulAll(a: Transform, b) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static mulFn(a: Transform) {\n _ASSERT && Transform.assert(a);\n return function(b: Vec2): Vec2 {\n return Transform.mul(a, b);\n };\n }\n\n static mulVec2(a: Transform, b: Vec2): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = (a.q.c * b.x - a.q.s * b.y) + a.p.x;\n const y = (a.q.s * b.x + a.q.c * b.y) + a.p.y;\n return Vec2.neo(x, y);\n }\n\n static mulXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p\n // = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p\n const xf = Transform.identity();\n xf.q = Rot.mulRot(a.q, b.q);\n xf.p = Vec2.add(Rot.mulVec2(a.q, b.p), a.p);\n return xf;\n }\n\n static mulT(a: Transform, b: Vec2): Vec2;\n static mulT(a: Transform, b: Transform): Transform;\n // tslint:disable-next-line:typedef\n static mulT(a, b) {\n if ('x' in b && 'y' in b) {\n return Transform.mulTVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulTXf(a, b);\n }\n }\n\n static mulTVec2(a: Transform, b: Vec2): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const px = b.x - a.p.x;\n const py = b.y - a.p.y;\n const x = (a.q.c * px + a.q.s * py);\n const y = (-a.q.s * px + a.q.c * py);\n return Vec2.neo(x, y);\n }\n\n static mulTXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q' * (B.q * v1 + B.p - A.p)\n // = A.q' * B.q * v1 + A.q' * (B.p - A.p)\n const xf = Transform.identity();\n xf.q.setRot(Rot.mulTRot(a.q, b.q));\n xf.p.setVec2(Rot.mulTVec2(a.q, Vec2.sub(b.p, a.p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Math from './Math';\nimport Vec2 from './Vec2';\nimport Rot from './Rot';\nimport Transform from './Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * This describes the motion of a body/shape for TOI computation. Shapes are\n * defined with respect to the body origin, which may not coincide with the\n * center of mass. However, to support dynamics we must interpolate the center\n * of mass position.\n */\nexport default class Sweep {\n /** Local center of mass position */\n localCenter: Vec2;\n\n /** World center position */\n c: Vec2;\n\n /** World angle */\n a: number;\n\n /** Fraction of the current time step in the range [0,1], c0 and a0 are c and a at alpha0. */\n alpha0: number;\n\n c0: Vec2;\n a0: number;\n\n constructor(c?: Vec2, a?: number) {\n _ASSERT && common.assert(typeof c === 'undefined');\n _ASSERT && common.assert(typeof a === 'undefined');\n this.localCenter = Vec2.zero();\n this.c = Vec2.zero();\n this.a = 0;\n this.alpha0 = 0;\n this.c0 = Vec2.zero();\n this.a0 = 0;\n }\n\n setTransform(xf: Transform): void {\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n\n this.a = xf.q.getAngle();\n this.a0 = xf.q.getAngle();\n }\n\n setLocalCenter(localCenter: Vec2, xf: Transform): void {\n this.localCenter.setVec2(localCenter);\n\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n }\n\n /**\n * Get the interpolated transform at a specific time.\n *\n * @param xf\n * @param beta A factor in [0,1], where 0 indicates alpha0\n */\n getTransform(xf: Transform, beta: number = 0): void {\n xf.q.setAngle((1.0 - beta) * this.a0 + beta * this.a);\n xf.p.setCombine((1.0 - beta), this.c0, beta, this.c);\n\n // shift to origin\n xf.p.sub(Rot.mulVec2(xf.q, this.localCenter));\n }\n\n /**\n * Advance the sweep forward, yielding a new initial state.\n *\n * @param alpha The new initial time\n */\n advance(alpha: number): void {\n _ASSERT && common.assert(this.alpha0 < 1.0);\n const beta = (alpha - this.alpha0) / (1.0 - this.alpha0);\n this.c0.setCombine(beta, this.c, 1 - beta, this.c0);\n this.a0 = beta * this.a + (1 - beta) * this.a0;\n this.alpha0 = alpha;\n }\n\n forward(): void {\n this.a0 = this.a;\n this.c0.setVec2(this.c);\n }\n\n /**\n * normalize the angles in radians to be between -pi and pi.\n */\n normalize(): void {\n const a0 = Math.mod(this.a0, -Math.PI, +Math.PI);\n this.a -= this.a0 - a0;\n this.a0 = a0;\n }\n\n clone(): Sweep {\n const clone = new Sweep();\n clone.localCenter.setVec2(this.localCenter);\n clone.alpha0 = this.alpha0;\n clone.a0 = this.a0;\n clone.a = this.a;\n clone.c0.setVec2(this.c0);\n clone.c.setVec2(this.c);\n return clone;\n }\n\n set(that: Sweep): void {\n this.localCenter.setVec2(that.localCenter);\n this.alpha0 = that.alpha0;\n this.a0 = that.a0;\n this.a = that.a;\n this.c0.setVec2(that.c0);\n this.c.setVec2(that.c);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Vec2 from '../common/Vec2';\n\nexport default class Velocity {\n /** linear */\n v: Vec2;\n\n /** angular */\n w: number;\n\n constructor() {\n this.v = Vec2.zero();\n this.w = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Vec2 from '../common/Vec2';\nimport Rot from '../common/Rot';\nimport Transform from '../common/Transform';\n\n\nexport default class Position {\n /** location */\n c: Vec2;\n\n /** angle */\n a: number;\n\n constructor() {\n this.c = Vec2.zero();\n this.a = 0;\n }\n\n getTransform(xf: Transform, p: Vec2): Transform {\n xf.q.setAngle(this.a);\n xf.p.setVec2(Vec2.sub(this.c, Rot.mulVec2(xf.q, p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../dynamics/Body';\nimport AABB, { RayCastOutput, RayCastInput } from './AABB';\nimport { DistanceProxy } from './Distance';\nimport type Transform from '../common/Transform';\nimport type Vec2 from '../common/Vec2';\n\n\n/**\n * A shape is used for collision detection. You can create a shape however you\n * like. Shapes used for simulation in World are created automatically when a\n * Fixture is created. Shapes may encapsulate one or more child shapes.\n */\nexport default abstract class Shape {\n m_type: ShapeType;\n m_radius: number;\n\n /** @internal */\n _reset(): void {\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return typeof obj.m_type === 'string' && typeof obj.m_radius === 'number';\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n /**\n * Get the type of this shape. You can use this to down cast to the concrete\n * shape.\n *\n * @return the shape type.\n */\n getType(): ShapeType {\n return this.m_type;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n abstract _clone(): Shape;\n\n /**\n * Get the number of child primitives.\n */\n abstract getChildCount(): number;\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n abstract testPoint(xf: Transform, p: Vec2): boolean;\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n abstract rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean;\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n abstract computeAABB(aabb: AABB, xf: Transform, childIndex: number): void;\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n abstract computeMass(massData: MassData, density?: number): void;\n\n abstract computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void;\n\n}\n\nexport type ShapeType = \"circle\" | \"edge\" | \"polygon\" | \"chain\";\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport options from '../util/options';\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\nimport AABB, { RayCastInput, RayCastOutput } from '../collision/AABB';\nimport Shape, { ShapeType } from '../collision/Shape';\nimport Body, { MassData } from \"./Body\";\nimport BroadPhase from \"../collision/BroadPhase\";\nimport Transform from \"../common/Transform\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A fixture definition is used to create a fixture. This class defines an\n * abstract fixture definition. You can reuse fixture definitions safely.\n */\nexport interface FixtureOpt {\n userData?: unknown;\n /**\n * The friction coefficient, usually in the range [0,1]\n */\n friction?: number;\n /**\n * The restitution (elasticity) usually in the range [0,1]\n */\n restitution?: number;\n /**\n * The density, usually in kg/m^2\n */\n density?: number;\n /**\n * A sensor shape collects contact information but never generates a collision response.\n */\n isSensor?: boolean;\n /**\n * Zero, positive or negative collision group.\n * Fixtures with same positive groupIndex always collide and fixtures with same negative groupIndex never collide.\n */\n filterGroupIndex?: number;\n /**\n * Collision category bit or bits that this fixture belongs to.\n * If groupIndex is zero or not matching, then at least one bit in this fixture categoryBits should match other fixture maskBits and vice versa.\n */\n filterCategoryBits?: number;\n /**\n * Collision category bit or bits that this fixture accept for collision.\n */\n filterMaskBits?: number;\n}\n\nexport interface FixtureDef extends FixtureOpt {\n shape: Shape;\n}\n\nconst FixtureDefDefault: FixtureOpt = {\n userData : null,\n friction : 0.2,\n restitution : 0.0,\n density : 0.0,\n isSensor : false,\n\n filterGroupIndex : 0,\n filterCategoryBits : 0x0001,\n filterMaskBits : 0xFFFF\n};\n\n/**\n * This proxy is used internally to connect shape children to the broad-phase.\n */\nexport class FixtureProxy {\n aabb: AABB;\n fixture: Fixture;\n childIndex: number;\n proxyId: number;\n constructor(fixture: Fixture, childIndex: number) {\n this.aabb = new AABB();\n this.fixture = fixture;\n this.childIndex = childIndex;\n this.proxyId;\n }\n}\n\n/**\n * A fixture is used to attach a shape to a body for collision detection. A\n * fixture inherits its transform from its parent. Fixtures hold additional\n * non-geometric data such as friction, collision filters, etc.\n *\n * To create a new Fixture use {@link Body.createFixture}.\n */\nexport default class Fixture {\n /** @internal */ m_body: Body;\n /** @internal */ m_friction: number;\n /** @internal */ m_restitution: number;\n /** @internal */ m_density: number;\n /** @internal */ m_isSensor: boolean;\n /** @internal */ m_filterGroupIndex: number;\n /** @internal */ m_filterCategoryBits: number;\n /** @internal */ m_filterMaskBits: number;\n /** @internal */ m_shape: Shape;\n /** @internal */ m_next: Fixture | null;\n /** @internal */ m_proxies: FixtureProxy[];\n /** @internal */ m_proxyCount: number;\n /** @internal */ m_userData: unknown;\n\n constructor(body: Body, def: FixtureDef);\n constructor(body: Body, shape: Shape, def?: FixtureOpt);\n constructor(body: Body, shape: Shape, density?: number);\n // tslint:disable-next-line:typedef\n /** @internal */ constructor(body: Body, shape?, def?) {\n if (shape.shape) {\n def = shape;\n shape = shape.shape;\n\n } else if (typeof def === 'number') {\n def = {density : def};\n }\n\n def = options(def, FixtureDefDefault);\n\n this.m_body = body;\n\n this.m_friction = def.friction;\n this.m_restitution = def.restitution;\n this.m_density = def.density;\n this.m_isSensor = def.isSensor;\n\n this.m_filterGroupIndex = def.filterGroupIndex;\n this.m_filterCategoryBits = def.filterCategoryBits;\n this.m_filterMaskBits = def.filterMaskBits;\n\n // TODO validate shape\n this.m_shape = shape; // .clone();\n\n this.m_next = null;\n\n this.m_proxies = [];\n this.m_proxyCount = 0;\n\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n\n this.m_userData = def.userData;\n }\n\n /**\n * Re-setup fixture.\n * @internal\n */\n _reset(): void {\n const body = this.getBody();\n const broadPhase = body.m_world.m_broadPhase;\n this.destroyProxies(broadPhase);\n if (this.m_shape._reset) {\n this.m_shape._reset();\n }\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n this.createProxies(broadPhase, body.m_xf);\n body.resetMassData();\n }\n\n /** @internal */\n _serialize(): object {\n return {\n friction: this.m_friction,\n restitution: this.m_restitution,\n density: this.m_density,\n isSensor: this.m_isSensor,\n\n filterGroupIndex: this.m_filterGroupIndex,\n filterCategoryBits: this.m_filterCategoryBits,\n filterMaskBits: this.m_filterMaskBits,\n\n shape: this.m_shape,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, body: any, restore: any): Fixture {\n const shape = restore(Shape, data.shape);\n const fixture = shape && new Fixture(body, shape, data);\n return fixture;\n }\n\n /**\n * Get the type of the child shape. You can use this to down cast to the\n * concrete shape.\n */\n getType(): ShapeType {\n return this.m_shape.getType();\n }\n\n /**\n * Get the child shape. You can modify the child shape, however you should not\n * change the number of vertices because this will crash some collision caching\n * mechanisms. Manipulating the shape may lead to non-physical behavior.\n */\n getShape(): Shape {\n return this.m_shape;\n }\n\n /**\n * A sensor shape collects contact information but never generates a collision\n * response.\n */\n isSensor(): boolean {\n return this.m_isSensor;\n }\n\n /**\n * Set if this fixture is a sensor.\n */\n setSensor(sensor: boolean): void {\n if (sensor != this.m_isSensor) {\n this.m_body.setAwake(true);\n this.m_isSensor = sensor;\n }\n }\n\n // /**\n // * Get the contact filtering data.\n // */\n // getFilterData() {\n // return this.m_filter;\n // }\n\n /**\n * Get the user data that was assigned in the fixture definition. Use this to\n * store your application specific data.\n */\n getUserData(): unknown {\n return this.m_userData;\n }\n\n /**\n * Set the user data. Use this to store your application specific data.\n */\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get the parent body of this fixture. This is null if the fixture is not\n * attached.\n */\n getBody(): Body {\n return this.m_body;\n }\n\n /**\n * Get the next fixture in the parent body's fixture list.\n */\n getNext(): Fixture | null {\n return this.m_next;\n }\n\n /**\n * Get the density of this fixture.\n */\n getDensity(): number {\n return this.m_density;\n }\n\n /**\n * Set the density of this fixture. This will _not_ automatically adjust the\n * mass of the body. You must call Body.resetMassData to update the body's mass.\n */\n setDensity(density: number): void {\n _ASSERT && common.assert(Math.isFinite(density) && density >= 0.0);\n this.m_density = density;\n }\n\n /**\n * Get the coefficient of friction, usually in the range [0,1].\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Set the coefficient of friction. This will not change the friction of\n * existing contacts.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the coefficient of restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Set the coefficient of restitution. This will not change the restitution of\n * existing contacts.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Test a point in world coordinates for containment in this fixture.\n */\n testPoint(p: Vec2): boolean {\n return this.m_shape.testPoint(this.m_body.getTransform(), p);\n }\n\n /**\n * Cast a ray against this shape.\n */\n rayCast(output: RayCastOutput, input: RayCastInput, childIndex: number): boolean {\n return this.m_shape.rayCast(output, input, this.m_body.getTransform(), childIndex);\n }\n\n /**\n * Get the mass data for this fixture. The mass data is based on the density and\n * the shape. The rotational inertia is about the shape's origin. This operation\n * may be expensive.\n */\n getMassData(massData: MassData): void {\n this.m_shape.computeMass(massData, this.m_density);\n }\n\n /**\n * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a\n * more accurate AABB, compute it using the shape and the body transform.\n */\n getAABB(childIndex: number): AABB {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_proxyCount);\n return this.m_proxies[childIndex].aabb;\n }\n\n /**\n * These support body activation/deactivation.\n */\n createProxies(broadPhase: BroadPhase, xf: Transform): void {\n _ASSERT && common.assert(this.m_proxyCount == 0);\n\n // Create proxies in the broad-phase.\n this.m_proxyCount = this.m_shape.getChildCount();\n\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n this.m_shape.computeAABB(proxy.aabb, xf, i);\n proxy.proxyId = broadPhase.createProxy(proxy.aabb, proxy);\n }\n }\n\n destroyProxies(broadPhase: BroadPhase): void {\n // Destroy proxies in the broad-phase.\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n broadPhase.destroyProxy(proxy.proxyId);\n proxy.proxyId = null;\n }\n\n this.m_proxyCount = 0;\n }\n\n /**\n * Updates this fixture proxy in broad-phase (with combined AABB of current and\n * next transformation).\n */\n synchronize(broadPhase: BroadPhase, xf1: Transform, xf2: Transform): void {\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n // Compute an AABB that covers the swept shape (may miss some rotation\n // effect).\n const aabb1 = new AABB();\n const aabb2 = new AABB();\n this.m_shape.computeAABB(aabb1, xf1, proxy.childIndex);\n this.m_shape.computeAABB(aabb2, xf2, proxy.childIndex);\n\n proxy.aabb.combine(aabb1, aabb2);\n\n const displacement = Vec2.sub(xf2.p, xf1.p);\n\n broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement);\n }\n }\n\n /**\n * Set the contact filtering data. This will not update contacts until the next\n * time step when either parent body is active and awake. This automatically\n * calls refilter.\n */\n setFilterData(filter: { groupIndex: number, categoryBits: number, maskBits: number }): void {\n this.m_filterGroupIndex = filter.groupIndex;\n this.m_filterCategoryBits = filter.categoryBits;\n this.m_filterMaskBits = filter.maskBits;\n this.refilter();\n }\n\n getFilterGroupIndex(): number {\n return this.m_filterGroupIndex;\n }\n\n setFilterGroupIndex(groupIndex: number): void {\n this.m_filterGroupIndex = groupIndex;\n }\n\n getFilterCategoryBits(): number {\n return this.m_filterCategoryBits;\n }\n\n setFilterCategoryBits(categoryBits: number): void {\n this.m_filterCategoryBits = categoryBits;\n }\n\n getFilterMaskBits(): number {\n return this.m_filterMaskBits;\n }\n\n setFilterMaskBits(maskBits: number): void {\n this.m_filterMaskBits = maskBits;\n }\n\n /**\n * Call this if you want to establish collision that was previously disabled by\n * ContactFilter.\n */\n refilter(): void {\n if (this.m_body == null) {\n return;\n }\n\n // Flag associated contacts for filtering.\n let edge = this.m_body.getContactList();\n while (edge) {\n const contact = edge.contact;\n const fixtureA = contact.getFixtureA();\n const fixtureB = contact.getFixtureB();\n if (fixtureA == this || fixtureB == this) {\n contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n\n const world = this.m_body.getWorld();\n\n if (world == null) {\n return;\n }\n\n // Touch each proxy so that new pairs may be created\n const broadPhase = world.m_broadPhase;\n for (let i = 0; i < this.m_proxyCount; ++i) {\n broadPhase.touchProxy(this.m_proxies[i].proxyId);\n }\n }\n\n /**\n * Implement this method to provide collision filtering, if you want finer\n * control over contact creation.\n *\n * Return true if contact calculations should be performed between these two\n * fixtures.\n *\n * Warning: for performance reasons this is only called when the AABBs begin to\n * overlap.\n */\n shouldCollide(that: Fixture): boolean {\n\n if (that.m_filterGroupIndex === this.m_filterGroupIndex && that.m_filterGroupIndex !== 0) {\n return that.m_filterGroupIndex > 0;\n }\n\n const collideA = (that.m_filterMaskBits & this.m_filterCategoryBits) !== 0;\n const collideB = (that.m_filterCategoryBits & this.m_filterMaskBits) !== 0;\n const collide = collideA && collideB;\n return collide;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nimport common from '../util/common';\nimport options from '../util/options';\nimport Vec2 from '../common/Vec2';\nimport Rot from '../common/Rot';\nimport Math from '../common/Math';\nimport Sweep from '../common/Sweep';\nimport Transform from '../common/Transform';\nimport Velocity from './Velocity';\nimport Position from './Position';\nimport Fixture, { FixtureDef, FixtureOpt } from './Fixture';\nimport Shape from '../collision/Shape';\nimport { JointEdge } from \"./Joint\";\nimport World from \"./World\";\nimport { ContactEdge } from \"./Contact\";\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\nexport type BodyType = 'static' | 'kinematic' | 'dynamic';\n\nconst STATIC = 'static';\nconst KINEMATIC = 'kinematic';\nconst DYNAMIC = 'dynamic';\n\nexport interface BodyDef {\n /**\n * Body types are static, kinematic, or dynamic. Note: if a dynamic\n * body would have zero mass, the mass is set to one.\n */\n type?: BodyType;\n /**\n * The world position of the body. Avoid creating bodies at the\n * origin since this can lead to many overlapping shapes.\n */\n position?: Vec2;\n /**\n * The world angle of the body in radians.\n */\n angle?: number;\n /**\n * The linear velocity of the body's origin in world co-ordinates.\n */\n linearVelocity?: Vec2;\n angularVelocity?: number;\n /**\n * Linear damping is use to reduce the linear velocity. The\n * damping parameter can be larger than 1.0 but the damping effect becomes\n * sensitive to the time step when the damping parameter is large.\n */\n linearDamping?: number;\n /**\n * Angular damping is use to reduce the angular velocity.\n * The damping parameter can be larger than 1.0 but the damping effect\n * becomes sensitive to the time step when the damping parameter is large.\n */\n angularDamping?: number;\n /**\n * Should this body be prevented from rotating? Useful for characters.\n */\n fixedRotation?: boolean;\n /**\n * Is this a fast moving body that should be prevented from\n * tunneling through other moving bodies? Note that all bodies are\n * prevented from tunneling through kinematic and static bodies. This\n * setting is only considered on dynamic bodies. Warning: You should use\n * this flag sparingly since it increases processing time.\n */\n bullet?: boolean;\n gravityScale?: number;\n /**\n * Set this flag to false if this body should never fall asleep. Note that this increases CPU usage.\n */\n allowSleep?: boolean;\n /**\n * Is this body initially awake or sleeping?\n */\n awake?: boolean;\n /**\n * Does this body start out active?\n */\n active?: boolean;\n userData?: any;\n}\n\nconst BodyDefDefault: BodyDef = {\n type : STATIC,\n position : Vec2.zero(),\n angle : 0.0,\n\n linearVelocity : Vec2.zero(),\n angularVelocity : 0.0,\n\n linearDamping : 0.0,\n angularDamping : 0.0,\n\n fixedRotation : false,\n bullet : false,\n gravityScale : 1.0,\n\n allowSleep : true,\n awake : true,\n active : true,\n\n userData : null\n};\n\n/**\n * MassData This holds the mass data computed for a shape.\n */\nexport class MassData {\n /** The mass of the shape, usually in kilograms. */\n mass: number = 0;\n /** The position of the shape's centroid relative to the shape's origin. */\n center: Vec2 = Vec2.zero();\n /** The rotational inertia of the shape about the local origin. */\n I: number = 0;\n}\n\n/**\n * A rigid body composed of one or more fixtures.\n *\n * To create a new Body use {@link World.createBody}.\n */\nexport default class Body {\n /**\n * A static body does not move under simulation and behaves as if it has infinite mass.\n * Internally, zero is stored for the mass and the inverse mass.\n * Static bodies can be moved manually by the user.\n * A static body has zero velocity.\n * Static bodies do not collide with other static or kinematic bodies.\n */\n static readonly STATIC: BodyType = 'static';\n /**\n * A kinematic body moves under simulation according to its velocity.\n * Kinematic bodies do not respond to forces.\n * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity.\n * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass.\n * Kinematic bodies do not collide with other kinematic or static bodies.\n */\n static readonly KINEMATIC: BodyType = 'kinematic';\n\n /**\n * A dynamic body is fully simulated.\n * They can be moved manually by the user, but normally they move according to forces.\n * A dynamic body can collide with all body types.\n * A dynamic body always has finite, non-zero mass.\n * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate.\n */\n static readonly DYNAMIC: BodyType = 'dynamic';\n\n /** @internal */ m_world: World;\n /** @internal */ m_awakeFlag: boolean;\n /** @internal */ m_autoSleepFlag: boolean;\n /** @internal */ m_bulletFlag: boolean;\n /** @internal */ m_fixedRotationFlag: boolean;\n /** @internal */ m_activeFlag: boolean;\n /** @internal */ m_islandFlag: boolean;\n /** @internal */ m_toiFlag: boolean;\n /** @internal */ m_userData: unknown;\n /** @internal */ m_type: BodyType;\n /** @internal */ m_mass: number;\n /** @internal */ m_invMass: number;\n /** @internal Rotational inertia about the center of mass. */\n m_I: number;\n /** @internal */ m_invI: number;\n /** @internal the body origin transform */\n m_xf: Transform;\n /** @internal the swept motion for CCD */\n m_sweep: Sweep;\n // position and velocity correction\n /** @internal */ c_velocity: Velocity;\n /** @internal */ c_position: Position;\n /** @internal */ m_force: Vec2;\n /** @internal */ m_torque: number;\n /** @internal */ m_linearVelocity: Vec2;\n /** @internal */ m_angularVelocity: number;\n /** @internal */ m_linearDamping: number;\n /** @internal */ m_angularDamping: number;\n /** @internal */ m_gravityScale: number;\n /** @internal */ m_sleepTime: number;\n /** @internal */ m_jointList: JointEdge | null;\n /** @internal */ m_contactList: ContactEdge | null;\n /** @internal */ m_fixtureList: Fixture | null;\n /** @internal */ m_prev: Body | null;\n /** @internal */ m_next: Body | null;\n /** @internal */ m_destroyed: boolean;\n\n /** @internal */\n constructor(world: World, def: BodyDef) {\n def = options(def, BodyDefDefault);\n\n _ASSERT && common.assert(Vec2.isValid(def.position));\n _ASSERT && common.assert(Vec2.isValid(def.linearVelocity));\n _ASSERT && common.assert(Math.isFinite(def.angle));\n _ASSERT && common.assert(Math.isFinite(def.angularVelocity));\n _ASSERT && common.assert(Math.isFinite(def.angularDamping) && def.angularDamping >= 0.0);\n _ASSERT && common.assert(Math.isFinite(def.linearDamping) && def.linearDamping >= 0.0);\n\n this.m_world = world;\n\n this.m_awakeFlag = def.awake;\n this.m_autoSleepFlag = def.allowSleep;\n this.m_bulletFlag = def.bullet;\n this.m_fixedRotationFlag = def.fixedRotation;\n this.m_activeFlag = def.active;\n\n this.m_islandFlag = false;\n this.m_toiFlag = false;\n\n this.m_userData = def.userData;\n this.m_type = def.type;\n\n if (this.m_type == DYNAMIC) {\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n } else {\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n }\n\n // Rotational inertia about the center of mass.\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n // the body origin transform\n this.m_xf = Transform.identity();\n this.m_xf.p = Vec2.clone(def.position);\n this.m_xf.q.setAngle(def.angle);\n\n // the swept motion for CCD\n this.m_sweep = new Sweep();\n this.m_sweep.setTransform(this.m_xf);\n\n // position and velocity correction\n this.c_velocity = new Velocity();\n this.c_position = new Position();\n\n this.m_force = Vec2.zero();\n this.m_torque = 0.0;\n\n this.m_linearVelocity = Vec2.clone(def.linearVelocity);\n this.m_angularVelocity = def.angularVelocity;\n\n this.m_linearDamping = def.linearDamping;\n this.m_angularDamping = def.angularDamping;\n this.m_gravityScale = def.gravityScale;\n\n this.m_sleepTime = 0.0;\n\n this.m_jointList = null;\n this.m_contactList = null;\n this.m_fixtureList = null;\n\n this.m_prev = null;\n this.m_next = null;\n\n this.m_destroyed = false;\n }\n\n /** @internal */\n _serialize(): object {\n const fixtures = [];\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n fixtures.push(f);\n }\n return {\n type: this.m_type,\n bullet: this.m_bulletFlag,\n position: this.m_xf.p,\n angle: this.m_xf.q.getAngle(),\n linearVelocity: this.m_linearVelocity,\n angularVelocity: this.m_angularVelocity,\n fixtures,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): Body {\n const body = new Body(world, data);\n\n if (data.fixtures) {\n for (let i = data.fixtures.length - 1; i >= 0; i--) {\n const fixture = restore(Fixture, data.fixtures[i], body);\n body._addFixture(fixture);\n }\n }\n return body;\n }\n\n isWorldLocked(): boolean {\n return this.m_world && this.m_world.isLocked() ? true : false;\n }\n\n getWorld(): World {\n return this.m_world;\n }\n\n getNext(): Body | null {\n return this.m_next;\n }\n\n setUserData(data: any): void {\n this.m_userData = data;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n getFixtureList(): Fixture | null {\n return this.m_fixtureList;\n }\n\n getJointList(): JointEdge | null {\n return this.m_jointList;\n }\n\n /**\n * Warning: this list changes during the time step and you may miss some\n * collisions if you don't use ContactListener.\n */\n getContactList(): ContactEdge | null {\n return this.m_contactList;\n }\n\n isStatic(): boolean {\n return this.m_type == STATIC;\n }\n\n isDynamic(): boolean {\n return this.m_type == DYNAMIC;\n }\n\n isKinematic(): boolean {\n return this.m_type == KINEMATIC;\n }\n\n /**\n * This will alter the mass and velocity.\n */\n setStatic(): Body {\n this.setType(STATIC);\n return this;\n }\n\n setDynamic(): Body {\n this.setType(DYNAMIC);\n return this;\n }\n\n setKinematic(): Body {\n this.setType(KINEMATIC);\n return this;\n }\n\n /**\n * @internal\n */\n getType(): BodyType {\n return this.m_type;\n }\n\n /**\n * @internal\n */\n setType(type: BodyType): void {\n _ASSERT && common.assert(type === STATIC || type === KINEMATIC || type === DYNAMIC);\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type == type) {\n return;\n }\n\n this.m_type = type;\n\n this.resetMassData();\n\n if (this.m_type == STATIC) {\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_sweep.forward();\n this.synchronizeFixtures();\n }\n\n this.setAwake(true);\n\n this.m_force.setZero();\n this.m_torque = 0.0;\n\n // Delete the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n\n // Touch the proxies so that new contacts will be created (when appropriate)\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n const proxyCount = f.m_proxyCount;\n for (let i = 0; i < proxyCount; ++i) {\n broadPhase.touchProxy(f.m_proxies[i].proxyId);\n }\n }\n }\n\n isBullet(): boolean {\n return this.m_bulletFlag;\n }\n\n /**\n * Should this body be treated like a bullet for continuous collision detection?\n */\n setBullet(flag: boolean): void {\n this.m_bulletFlag = !!flag;\n }\n\n isSleepingAllowed(): boolean {\n return this.m_autoSleepFlag;\n }\n\n setSleepingAllowed(flag: boolean): void {\n this.m_autoSleepFlag = !!flag;\n if (this.m_autoSleepFlag == false) {\n this.setAwake(true);\n }\n }\n\n isAwake(): boolean {\n return this.m_awakeFlag;\n }\n\n /**\n * Set the sleep state of the body. A sleeping body has very low CPU cost.\n *\n * @param flag Set to true to wake the body, false to put it to sleep.\n */\n setAwake(flag: boolean): void {\n if (flag) {\n if (this.m_awakeFlag == false) {\n this.m_awakeFlag = true;\n this.m_sleepTime = 0.0;\n }\n } else {\n this.m_awakeFlag = false;\n this.m_sleepTime = 0.0;\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_force.setZero();\n this.m_torque = 0.0;\n }\n }\n\n isActive(): boolean {\n return this.m_activeFlag;\n }\n\n /**\n * Set the active state of the body. An inactive body is not simulated and\n * cannot be collided with or woken up. If you pass a flag of true, all fixtures\n * will be added to the broad-phase. If you pass a flag of false, all fixtures\n * will be removed from the broad-phase and all contacts will be destroyed.\n * Fixtures and joints are otherwise unaffected.\n *\n * You may continue to create/destroy fixtures and joints on inactive bodies.\n * Fixtures on an inactive body are implicitly inactive and will not participate\n * in collisions, ray-casts, or queries. Joints connected to an inactive body\n * are implicitly inactive. An inactive body is still owned by a World object\n * and remains\n */\n setActive(flag: boolean): void {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (flag == this.m_activeFlag) {\n return;\n }\n\n this.m_activeFlag = !!flag;\n\n if (this.m_activeFlag) {\n // Create all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.createProxies(broadPhase, this.m_xf);\n }\n // Contacts are created the next time step.\n\n } else {\n // Destroy all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.destroyProxies(broadPhase);\n }\n\n // Destroy the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n }\n }\n\n isFixedRotation(): boolean {\n return this.m_fixedRotationFlag;\n }\n\n /**\n * Set this body to have fixed rotation. This causes the mass to be reset.\n */\n setFixedRotation(flag: boolean): void {\n if (this.m_fixedRotationFlag == flag) {\n return;\n }\n\n this.m_fixedRotationFlag = !!flag;\n\n this.m_angularVelocity = 0.0;\n\n this.resetMassData();\n }\n\n /**\n * Get the world transform for the body's origin.\n */\n getTransform(): Transform {\n return this.m_xf;\n }\n\n /**\n * Set the position of the body's origin and rotation. Manipulating a body's\n * transform may cause non-physical behavior. Note: contacts are updated on the\n * next call to World.step.\n *\n * @param position The world position of the body's local origin.\n * @param angle The world rotation in radians.\n */\n setTransform(position: Vec2, angle: number): void {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n this.m_xf.setNum(position, angle);\n this.m_sweep.setTransform(this.m_xf);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, this.m_xf, this.m_xf);\n }\n }\n\n synchronizeTransform(): void {\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Update fixtures in broad-phase.\n */\n synchronizeFixtures(): void {\n const xf = Transform.identity();\n\n this.m_sweep.getTransform(xf, 0);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, xf, this.m_xf);\n }\n }\n\n /**\n * Used in TOI.\n */\n advance(alpha: number): void {\n // Advance to the new safe time. This doesn't sync the broad-phase.\n this.m_sweep.advance(alpha);\n this.m_sweep.c.setVec2(this.m_sweep.c0);\n this.m_sweep.a = this.m_sweep.a0;\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Get the world position for the body's origin.\n */\n getPosition(): Vec2 {\n return this.m_xf.p;\n }\n\n setPosition(p: Vec2): void {\n this.setTransform(p, this.m_sweep.a);\n }\n\n /**\n * Get the current world rotation angle in radians.\n */\n getAngle(): number {\n return this.m_sweep.a;\n }\n\n setAngle(angle: number): void {\n this.setTransform(this.m_xf.p, angle);\n }\n\n /**\n * Get the world position of the center of mass.\n */\n getWorldCenter(): Vec2 {\n return this.m_sweep.c;\n }\n\n /**\n * Get the local position of the center of mass.\n */\n getLocalCenter(): Vec2 {\n return this.m_sweep.localCenter;\n }\n\n /**\n * Get the linear velocity of the center of mass.\n *\n * @return the linear velocity of the center of mass.\n */\n getLinearVelocity(): Vec2 {\n return this.m_linearVelocity;\n }\n\n /**\n * Get the world linear velocity of a world point attached to this body.\n *\n * @param worldPoint A point in world coordinates.\n */\n getLinearVelocityFromWorldPoint(worldPoint: Vec2): Vec2 {\n const localCenter = Vec2.sub(worldPoint, this.m_sweep.c);\n return Vec2.add(this.m_linearVelocity, Vec2.crossNumVec2(this.m_angularVelocity,\n localCenter));\n }\n\n /**\n * Get the world velocity of a local point.\n *\n * @param localPoint A point in local coordinates.\n */\n getLinearVelocityFromLocalPoint(localPoint: Vec2): Vec2 {\n return this.getLinearVelocityFromWorldPoint(this.getWorldPoint(localPoint));\n }\n\n /**\n * Set the linear velocity of the center of mass.\n *\n * @param v The new linear velocity of the center of mass.\n */\n setLinearVelocity(v: Vec2): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (Vec2.dot(v, v) > 0.0) {\n this.setAwake(true);\n }\n this.m_linearVelocity.setVec2(v);\n }\n\n /**\n * Get the angular velocity.\n *\n * @returns the angular velocity in radians/second.\n */\n getAngularVelocity(): number {\n return this.m_angularVelocity;\n }\n\n /**\n * Set the angular velocity.\n *\n * @param omega The new angular velocity in radians/second.\n */\n setAngularVelocity(w: number): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (w * w > 0.0) {\n this.setAwake(true);\n }\n this.m_angularVelocity = w;\n }\n\n getLinearDamping(): number {\n return this.m_linearDamping;\n }\n\n setLinearDamping(linearDamping: number): void {\n this.m_linearDamping = linearDamping;\n }\n\n getAngularDamping(): number {\n return this.m_angularDamping;\n }\n\n setAngularDamping(angularDamping: number): void {\n this.m_angularDamping = angularDamping;\n }\n\n getGravityScale(): number {\n return this.m_gravityScale;\n }\n\n /**\n * Scale the gravity applied to this body.\n */\n setGravityScale(scale: number): void {\n this.m_gravityScale = scale;\n }\n\n /**\n * Get the total mass of the body.\n *\n * @returns The mass, usually in kilograms (kg).\n */\n getMass(): number {\n return this.m_mass;\n }\n\n /**\n * Get the rotational inertia of the body about the local origin.\n *\n * @return the rotational inertia, usually in kg-m^2.\n */\n getInertia(): number {\n return this.m_I + this.m_mass\n * Vec2.dot(this.m_sweep.localCenter, this.m_sweep.localCenter);\n }\n\n /**\n * Copy the mass data of the body to data.\n */\n getMassData(data: MassData): void {\n data.mass = this.m_mass;\n data.I = this.getInertia();\n data.center.setVec2(this.m_sweep.localCenter);\n }\n\n /**\n * This resets the mass properties to the sum of the mass properties of the\n * fixtures. This normally does not need to be called unless you called\n * SetMassData to override the mass and you later want to reset the mass.\n */\n resetMassData(): void {\n // Compute mass data from shapes. Each shape has its own density.\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n this.m_sweep.localCenter.setZero();\n\n // Static and kinematic bodies have zero mass.\n if (this.isStatic() || this.isKinematic()) {\n this.m_sweep.c0.setVec2(this.m_xf.p);\n this.m_sweep.c.setVec2(this.m_xf.p);\n this.m_sweep.a0 = this.m_sweep.a;\n return;\n }\n\n _ASSERT && common.assert(this.isDynamic());\n\n // Accumulate mass over all fixtures.\n const localCenter = Vec2.zero();\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n if (f.m_density == 0.0) {\n continue;\n }\n\n const massData = new MassData();\n f.getMassData(massData);\n this.m_mass += massData.mass;\n localCenter.addMul(massData.mass, massData.center);\n this.m_I += massData.I;\n }\n\n // Compute center of mass.\n if (this.m_mass > 0.0) {\n this.m_invMass = 1.0 / this.m_mass;\n localCenter.mul(this.m_invMass);\n\n } else {\n // Force all dynamic bodies to have a positive mass.\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n }\n\n if (this.m_I > 0.0 && this.m_fixedRotationFlag == false) {\n // Center the inertia about the center of mass.\n this.m_I -= this.m_mass * Vec2.dot(localCenter, localCenter);\n _ASSERT && common.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n\n } else {\n this.m_I = 0.0;\n this.m_invI = 0.0;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(localCenter, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Set the mass properties to override the mass properties of the fixtures. Note\n * that this changes the center of mass position. Note that creating or\n * destroying fixtures can also alter the mass. This function has no effect if\n * the body isn't dynamic.\n *\n * @param massData The mass properties.\n */\n setMassData(massData: MassData): void {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n this.m_mass = massData.mass;\n if (this.m_mass <= 0.0) {\n this.m_mass = 1.0;\n }\n\n this.m_invMass = 1.0 / this.m_mass;\n\n if (massData.I > 0.0 && this.m_fixedRotationFlag == false) {\n this.m_I = massData.I - this.m_mass\n * Vec2.dot(massData.center, massData.center);\n _ASSERT && common.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(massData.center, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Apply a force at a world point. If the force is not applied at the center of\n * mass, it will generate a torque and affect the angular velocity. This wakes\n * up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyForce(force: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping.\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n this.m_torque += Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), force);\n }\n }\n\n /**\n * Apply a force to the center of mass. This wakes up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param wake Also wake up the body\n */\n applyForceToCenter(force: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n }\n }\n\n /**\n * Apply a torque. This affects the angular velocity without affecting the\n * linear velocity of the center of mass. This wakes up the body.\n *\n * @param torque About the z-axis (out of the screen), usually in N-m.\n * @param wake Also wake up the body\n */\n applyTorque(torque: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_torque += torque;\n }\n }\n\n /**\n * Apply an impulse at a point. This immediately modifies the velocity. It also\n * modifies the angular velocity if the point of application is not at the\n * center of mass. This wakes up the body.\n *\n * @param impulse The world impulse vector, usually in N-seconds or kg-m/s.\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyLinearImpulse(impulse: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_linearVelocity.addMul(this.m_invMass, impulse);\n this.m_angularVelocity += this.m_invI * Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), impulse);\n }\n }\n\n /**\n * Apply an angular impulse.\n *\n * @param impulse The angular impulse in units of kg*m*m/s\n * @param wake Also wake up the body\n */\n applyAngularImpulse(impulse: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_angularVelocity += this.m_invI * impulse;\n }\n }\n\n /**\n * This is used to prevent connected bodies (by joints) from colliding,\n * depending on the joint's collideConnected flag.\n */\n shouldCollide(that: Body): boolean {\n // At least one body should be dynamic.\n if (this.m_type != DYNAMIC && that.m_type != DYNAMIC) {\n return false;\n }\n // Does a joint prevent collision?\n for (let jn = this.m_jointList; jn; jn = jn.next) {\n if (jn.other == that) {\n if (jn.joint.m_collideConnected == false) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addFixture(fixture: Fixture): Fixture {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.createProxies(broadPhase, this.m_xf);\n }\n\n fixture.m_next = this.m_fixtureList;\n this.m_fixtureList = fixture;\n\n // Adjust mass properties if needed.\n if (fixture.m_density > 0.0) {\n this.resetMassData();\n }\n\n // Let the world know we have a new fixture. This will cause new contacts\n // to be created at the beginning of the next time step.\n this.m_world.m_newFixture = true;\n\n return fixture;\n }\n\n /**\n * Creates a fixture and attach it to this body.\n *\n * If the density is non-zero, this function automatically updates the mass of\n * the body.\n *\n * Contacts are not created until the next time step.\n *\n * Warning: This function is locked during callbacks.\n */\n createFixture(def: FixtureDef): Fixture;\n createFixture(shape: Shape, opt?: FixtureOpt): Fixture;\n createFixture(shape: Shape, density?: number): Fixture;\n // tslint:disable-next-line:typedef\n createFixture(shape, fixdef?) {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n const fixture = new Fixture(this, shape, fixdef);\n this._addFixture(fixture);\n return fixture;\n }\n\n /**\n * Destroy a fixture. This removes the fixture from the broad-phase and destroys\n * all contacts associated with this fixture. This will automatically adjust the\n * mass of the body if the body is dynamic and the fixture has positive density.\n * All fixtures attached to a body are implicitly destroyed when the body is\n * destroyed.\n *\n * Warning: This function is locked during callbacks.\n *\n * @param fixture The fixture to be removed.\n */\n destroyFixture(fixture: Fixture): void {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n _ASSERT && common.assert(fixture.m_body == this);\n\n // Remove the fixture from this body's singly linked list.\n let found = false;\n if (this.m_fixtureList === fixture) {\n this.m_fixtureList = fixture.m_next;\n found = true;\n\n } else {\n let node = this.m_fixtureList;\n while (node != null) {\n if (node.m_next === fixture) {\n node.m_next = fixture.m_next;\n found = true;\n break;\n }\n node = node.m_next;\n }\n }\n\n // You tried to remove a shape that is not attached to this body.\n _ASSERT && common.assert(found);\n\n // Destroy any contacts associated with the fixture.\n let edge = this.m_contactList;\n while (edge) {\n const c = edge.contact;\n edge = edge.next;\n\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n\n if (fixture == fixtureA || fixture == fixtureB) {\n // This destroys the contact and removes it from\n // this body's contact list.\n this.m_world.destroyContact(c);\n }\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.destroyProxies(broadPhase);\n }\n\n fixture.m_body = null;\n fixture.m_next = null;\n\n this.m_world.publish('remove-fixture', fixture);\n\n // Reset the mass data.\n this.resetMassData();\n }\n\n /**\n * Get the corresponding world point of a local point.\n */\n getWorldPoint(localPoint: Vec2): Vec2 {\n return Transform.mulVec2(this.m_xf, localPoint);\n }\n\n /**\n * Get the corresponding world vector of a local vector.\n */\n getWorldVector(localVector: Vec2): Vec2 {\n return Rot.mulVec2(this.m_xf.q, localVector);\n }\n\n /**\n * Gets the corresponding local point of a world point.\n */\n getLocalPoint(worldPoint: Vec2): Vec2 {\n return Transform.mulTVec2(this.m_xf, worldPoint);\n }\n\n /**\n * Gets the corresponding local vector of a world vector.\n */\n getLocalVector(worldVector: Vec2): Vec2 {\n return Rot.mulTVec2(this.m_xf.q, worldVector);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from './Vec2';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 2-by-2 matrix. Stored in column-major order.\n */\nexport default class Mat22 {\n ex: Vec2;\n ey: Vec2;\n\n constructor(a: number, b: number, c: number, d: number);\n constructor(a: { x: number; y: number }, b: { x: number; y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(a?, b?, c?, d?) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec2.clone(a);\n this.ey = Vec2.clone(b);\n } else if (typeof a === 'number') {\n this.ex = Vec2.neo(a, c);\n this.ey = Vec2.neo(b, d);\n } else {\n this.ex = Vec2.zero();\n this.ey = Vec2.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.ex) && Vec2.isValid(obj.ey);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Mat22.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Mat22!');\n }\n }\n\n set(a: Mat22): void;\n set(a: Vec2, b: Vec2): void;\n set(a: number, b: number, c: number, d: number): void;\n // tslint:disable-next-line:typedef\n set(a, b?, c?, d?): void {\n if (typeof a === 'number' && typeof b === 'number' && typeof c === 'number'\n && typeof d === 'number') {\n this.ex.setNum(a, c);\n this.ey.setNum(b, d);\n\n } else if (typeof a === 'object' && typeof b === 'object') {\n this.ex.setVec2(a);\n this.ey.setVec2(b);\n\n } else if (typeof a === 'object') {\n _ASSERT && Mat22.assert(a);\n this.ex.setVec2(a.ex);\n this.ey.setVec2(a.ey);\n\n } else {\n _ASSERT && common.assert(false);\n }\n }\n\n setIdentity(): void {\n this.ex.x = 1.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 1.0;\n }\n\n setZero(): void {\n this.ex.x = 0.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 0.0;\n }\n\n getInverse(): Mat22 {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const imx = new Mat22();\n imx.ex.x = det * d;\n imx.ey.x = -det * b;\n imx.ex.y = -det * c;\n imx.ey.y = det * a;\n return imx;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const w = Vec2.zero();\n w.x = det * (d * v.x - b * v.y);\n w.y = det * (a * v.y - c * v.x);\n return w;\n }\n\n /**\n * Multiply a matrix times a vector. If a rotation matrix is provided, then this\n * transforms the vector from one frame to another.\n */\n static mul(mx: Mat22, my: Mat22): Mat22;\n static mul(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(mx, v) {\n if (v && 'x' in v && 'y' in v) {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n _ASSERT && common.assert(false);\n }\n\n static mulVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n }\n\n static mulMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n /**\n * Multiply a matrix transpose times a vector. If a rotation matrix is provided,\n * then this transforms the vector from one frame to another (inverse\n * transform).\n */\n static mulT(mx: Mat22, my: Mat22): Mat22;\n static mulT(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(mx, v) {\n if (v && 'x' in v && 'y' in v) { // Vec2\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n _ASSERT && common.assert(false);\n }\n\n static mulTVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n }\n\n static mulTMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n static abs(mx: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n return new Mat22(Vec2.abs(mx.ex), Vec2.abs(mx.ey));\n }\n\n static add(mx1: Mat22, mx2: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx1);\n _ASSERT && Mat22.assert(mx2);\n return new Mat22(Vec2.add(mx1.ex, mx2.ex), Vec2.add(mx1.ey, mx2.ey));\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Vec2 from '../common/Vec2';\nimport Transform from '../common/Transform';\nimport Math from '../common/Math';\nimport Rot from '../common/Rot';\n\nexport enum ManifoldType {\n e_circles = 0,\n e_faceA = 1,\n e_faceB = 2\n}\n\nexport enum ContactFeatureType {\n e_vertex = 0,\n e_face = 1\n}\n\n/**\n * This is used for determining the state of contact points.\n */\n export enum PointState {\n /** Point does not exist */\n nullState = 0,\n /** Point was added in the update */\n addState = 1,\n /** Point persisted across the update */\n persistState = 2,\n /** Point was removed in the update */\n removeState = 3\n}\n\n/**\n * Used for computing contact manifolds.\n */\n export class ClipVertex {\n v: Vec2 = Vec2.zero();\n id: ContactID = new ContactID();\n\n set(o: ClipVertex): void {\n this.v.setVec2(o.v);\n this.id.set(o.id);\n }\n}\n\n/**\n * A manifold for two touching convex shapes. Manifolds are created in `evaluate`\n * method of Contact subclasses.\n *\n * Supported manifold types are e_faceA or e_faceB for clip point versus plane\n * with radius and e_circles point versus point with radius.\n *\n * We store contacts in this way so that position correction can account for\n * movement, which is critical for continuous physics. All contact scenarios\n * must be expressed in one of these types. This structure is stored across time\n * steps, so we keep it small.\n *\n * @prop type e_circle, e_faceA, e_faceB\n * @prop localPoint Usage depends on manifold type:
\n * e_circles: the local center of circleA
\n * e_faceA: the center of faceA
\n * e_faceB: the center of faceB\n * @prop localNormal Usage depends on manifold type:
\n * e_circles: not used
\n * e_faceA: the normal on polygonA
\n * e_faceB: the normal on polygonB\n * @prop points The points of contact {ManifoldPoint[]}\n * @prop pointCount The number of manifold points\n */\nexport default class Manifold {\n type: ManifoldType;\n localNormal: Vec2 = Vec2.zero();\n localPoint: Vec2 = Vec2.zero();\n points: ManifoldPoint[] = [ new ManifoldPoint(), new ManifoldPoint() ];\n pointCount: number = 0;\n\n /**\n * Evaluate the manifold with supplied transforms. This assumes modest motion\n * from the original state. This does not change the point count, impulses, etc.\n * The radii must come from the shapes that generated the manifold.\n */\n getWorldManifold(wm: WorldManifold | undefined, xfA: Transform, radiusA: number, xfB: Transform, radiusB: number): WorldManifold {\n if (this.pointCount == 0) {\n return;\n }\n\n wm = wm || new WorldManifold();\n\n let normal = wm.normal;\n const points = wm.points;\n const separations = wm.separations;\n\n // TODO: improve\n switch (this.type) {\n case ManifoldType.e_circles: {\n normal = Vec2.neo(1.0, 0.0);\n const pointA = Transform.mulVec2(xfA, this.localPoint);\n const pointB = Transform.mulVec2(xfB, this.points[0].localPoint);\n const dist = Vec2.sub(pointB, pointA);\n if (Vec2.lengthSquared(dist) > Math.EPSILON * Math.EPSILON) {\n normal.setVec2(dist);\n normal.normalize();\n }\n const cA = pointA.clone().addMul(radiusA, normal);\n const cB = pointB.clone().addMul(-radiusB, normal);\n points[0] = Vec2.mid(cA, cB);\n separations[0] = Vec2.dot(Vec2.sub(cB, cA), normal);\n points.length = 1;\n separations.length = 1;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfA, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfB, this.points[i].localPoint);\n const cA = Vec2.clone(clipPoint).addMul(radiusA - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cB = Vec2.clone(clipPoint).subMul(radiusB, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cB, cA), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfB, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfA, this.points[i].localPoint);\n const cB = Vec2.combine(1, clipPoint, radiusB - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cA = Vec2.combine(1, clipPoint, -radiusA, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cA, cB), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n // Ensure normal points from A to B.\n normal.mul(-1);\n break;\n }\n }\n\n wm.normal = normal;\n wm.points = points;\n wm.separations = separations;\n return wm;\n }\n\n static clipSegmentToLine = clipSegmentToLine;\n static ClipVertex = ClipVertex;\n static getPointStates = getPointStates;\n static PointState = PointState;\n}\n\n/**\n * A manifold point is a contact point belonging to a contact manifold. It holds\n * details related to the geometry and dynamics of the contact points.\n *\n * This structure is stored across time steps, so we keep it small.\n *\n * Note: impulses are used for internal caching and may not provide reliable\n * contact forces, especially for high speed collisions.\n */\nexport class ManifoldPoint {\n /**\n * Usage depends on manifold type.\n * e_circles: the local center of circleB,\n * e_faceA: the local center of cirlceB or the clip point of polygonB,\n * e_faceB: the clip point of polygonA.\n */\n localPoint: Vec2 = Vec2.zero();\n /**\n * The non-penetration impulse\n */\n normalImpulse: number = 0;\n /**\n * The friction impulse\n */\n tangentImpulse: number = 0;\n /**\n * Uniquely identifies a contact point between two shapes to facilatate warm starting\n */\n id: ContactID = new ContactID();\n}\n\n/**\n * Contact ids to facilitate warm starting.\n */\nexport class ContactID {\n cf: ContactFeature = new ContactFeature();\n\n /**\n * Used to quickly compare contact ids.\n */\n get key(): number {\n return this.cf.indexA + this.cf.indexB * 4 + this.cf.typeA * 16 + this.cf.typeB * 64;\n }\n\n set(o: ContactID): void {\n // this.key = o.key;\n this.cf.set(o.cf);\n }\n}\n\n/**\n * The features that intersect to form the contact point.\n */\nexport class ContactFeature {\n /**\n * Feature index on shapeA\n */\n indexA: number;\n /**\n * Feature index on shapeB\n */\n indexB: number;\n /**\n * The feature type on shapeA\n */\n typeA: ContactFeatureType;\n /**\n * The feature type on shapeB\n */\n typeB: ContactFeatureType;\n set(o: ContactFeature): void {\n this.indexA = o.indexA;\n this.indexB = o.indexB;\n this.typeA = o.typeA;\n this.typeB = o.typeB;\n }\n}\n\n/**\n * This is used to compute the current state of a contact manifold.\n */\nexport class WorldManifold {\n /**\n * World vector pointing from A to B\n */\n normal: Vec2;\n /**\n * World contact point (point of intersection)\n */\n points: Vec2[] = []; // [maxManifoldPoints]\n /**\n * A negative value indicates overlap, in meters\n */\n separations: number[] = []; // [maxManifoldPoints]\n}\n\n/**\n * Compute the point states given two manifolds. The states pertain to the\n * transition from manifold1 to manifold2. So state1 is either persist or remove\n * while state2 is either add or persist.\n */\nexport function getPointStates(\n state1: PointState[],\n state2: PointState[],\n manifold1: Manifold,\n manifold2: Manifold\n): void {\n // state1, state2: PointState[Settings.maxManifoldPoints]\n\n // for (var i = 0; i < Settings.maxManifoldPoints; ++i) {\n // state1[i] = PointState.nullState;\n // state2[i] = PointState.nullState;\n // }\n\n // Detect persists and removes.\n for (let i = 0; i < manifold1.pointCount; ++i) {\n const id = manifold1.points[i].id;\n\n state1[i] = PointState.removeState;\n\n for (let j = 0; j < manifold2.pointCount; ++j) {\n if (manifold2.points[j].id.key == id.key) {\n state1[i] = PointState.persistState;\n break;\n }\n }\n }\n\n // Detect persists and adds.\n for (let i = 0; i < manifold2.pointCount; ++i) {\n const id = manifold2.points[i].id;\n\n state2[i] = PointState.addState;\n\n for (let j = 0; j < manifold1.pointCount; ++j) {\n if (manifold1.points[j].id.key == id.key) {\n state2[i] = PointState.persistState;\n break;\n }\n }\n }\n}\n\n/**\n * Clipping for contact manifolds. Sutherland-Hodgman clipping.\n */\nexport function clipSegmentToLine(\n vOut: ClipVertex[],\n vIn: ClipVertex[],\n normal: Vec2,\n offset: number,\n vertexIndexA: number\n): number {\n // Start with no output points\n let numOut = 0;\n\n // Calculate the distance of end points to the line\n const distance0 = Vec2.dot(normal, vIn[0].v) - offset;\n const distance1 = Vec2.dot(normal, vIn[1].v) - offset;\n\n // If the points are behind the plane\n if (distance0 <= 0.0)\n vOut[numOut++].set(vIn[0]);\n if (distance1 <= 0.0)\n vOut[numOut++].set(vIn[1]);\n\n // If the points are on different sides of the plane\n if (distance0 * distance1 < 0.0) {\n // Find intersection point of edge and plane\n const interp = distance0 / (distance0 - distance1);\n vOut[numOut].v.setCombine(1 - interp, vIn[0].v, interp, vIn[1].v);\n\n // VertexA is hitting edgeB.\n vOut[numOut].id.cf.indexA = vertexIndexA;\n vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB;\n vOut[numOut].id.cf.typeA = ContactFeatureType.e_vertex;\n vOut[numOut].id.cf.typeB = ContactFeatureType.e_face;\n ++numOut;\n }\n\n return numOut;\n}\n","export default {\n gjkCalls: 0,\n gjkIters: 0,\n gjkMaxIters: 0,\n\n toiTime: 0,\n toiMaxTime: 0,\n toiCalls: 0,\n toiIters: 0,\n toiMaxIters: 0,\n toiRootIters: 0,\n toiMaxRootIters: 0,\n\n toString(newline?: string): string {\n newline = typeof newline === 'string' ? newline : '\\n';\n let string = \"\";\n // tslint:disable-next-line:no-for-in\n for (const name in this) {\n if (typeof this[name] !== 'function' && typeof this[name] !== 'object') {\n string += name + ': ' + this[name] + newline;\n }\n }\n return string;\n }\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../Settings';\nimport stats from '../util/stats';\nimport common from '../util/common';\n\nimport Shape from './Shape';\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\nimport Rot from '../common/Rot';\nimport Transform from '../common/Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates.\n */\n\nstats.gjkCalls = 0;\nstats.gjkIters = 0;\nstats.gjkMaxIters = 0;\n\n/**\n * Input for Distance. You have to option to use the shape radii in the\n * computation. Even\n */\nexport class DistanceInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n transformA: Transform | null = null;\n transformB: Transform | null = null;\n useRadii: boolean = false;\n}\n\n/**\n * Output for Distance.\n *\n * @prop {Vec2} pointA closest point on shapeA\n * @prop {Vec2} pointB closest point on shapeB\n * @prop distance\n * @prop iterations number of GJK iterations used\n */\nexport class DistanceOutput {\n pointA: Vec2 = Vec2.zero();\n pointB: Vec2 = Vec2.zero();\n distance: number;\n iterations: number;\n}\n\n/**\n * Used to warm start Distance. Set count to zero on first call.\n *\n * @prop {number} metric length or area\n * @prop {array} indexA vertices on shape A\n * @prop {array} indexB vertices on shape B\n * @prop {number} count\n */\nexport class SimplexCache {\n metric: number = 0;\n indexA: number[] = [];\n indexB: number[] = [];\n count: number = 0;\n}\n\n/**\n * Compute the closest points between two shapes. Supports any combination of:\n * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On\n * the first call set SimplexCache.count to zero.\n */\nexport default function Distance(output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void {\n ++stats.gjkCalls;\n\n const proxyA = input.proxyA;\n const proxyB = input.proxyB;\n const xfA = input.transformA;\n const xfB = input.transformB;\n\n // Initialize the simplex.\n const simplex = new Simplex();\n simplex.readCache(cache, proxyA, xfA, proxyB, xfB);\n\n // Get simplex vertices as an array.\n const vertices = simplex.m_v;\n const k_maxIters = Settings.maxDistnceIterations;\n\n // These store the vertices of the last simplex so that we\n // can check for duplicates and prevent cycling.\n const saveA = [];\n const saveB = []; // int[3]\n let saveCount = 0;\n\n let distanceSqr1 = Infinity;\n let distanceSqr2 = Infinity;\n\n // Main iteration loop.\n let iter = 0;\n while (iter < k_maxIters) {\n // Copy simplex so we can identify duplicates.\n saveCount = simplex.m_count;\n for (let i = 0; i < saveCount; ++i) {\n saveA[i] = vertices[i].indexA;\n saveB[i] = vertices[i].indexB;\n }\n\n simplex.solve();\n\n // If we have 3 points, then the origin is in the corresponding triangle.\n if (simplex.m_count === 3) {\n break;\n }\n\n // Compute closest point.\n const p = simplex.getClosestPoint();\n distanceSqr2 = p.lengthSquared();\n\n // Ensure progress\n if (distanceSqr2 >= distanceSqr1) {\n // break;\n }\n distanceSqr1 = distanceSqr2;\n\n // Get search direction.\n const d = simplex.getSearchDirection();\n\n // Ensure the search direction is numerically fit.\n if (d.lengthSquared() < Math.EPSILON * Math.EPSILON) {\n // The origin is probably contained by a line segment\n // or triangle. Thus the shapes are overlapped.\n\n // We can't return zero here even though there may be overlap.\n // In case the simplex is a point, segment, or triangle it is difficult\n // to determine if the origin is contained in the CSO or very close to it.\n break;\n }\n\n // Compute a tentative new simplex vertex using support points.\n const vertex = vertices[simplex.m_count]; // SimplexVertex\n\n vertex.indexA = proxyA.getSupport(Rot.mulTVec2(xfA.q, Vec2.neg(d)));\n vertex.wA = Transform.mulVec2(xfA, proxyA.getVertex(vertex.indexA));\n\n vertex.indexB = proxyB.getSupport(Rot.mulTVec2(xfB.q, d));\n vertex.wB = Transform.mulVec2(xfB, proxyB.getVertex(vertex.indexB));\n\n vertex.w = Vec2.sub(vertex.wB, vertex.wA);\n\n // Iteration count is equated to the number of support point calls.\n ++iter;\n ++stats.gjkIters;\n\n // Check for duplicate support points. This is the main termination\n // criteria.\n let duplicate = false;\n for (let i = 0; i < saveCount; ++i) {\n if (vertex.indexA === saveA[i] && vertex.indexB === saveB[i]) {\n duplicate = true;\n break;\n }\n }\n\n // If we found a duplicate support point we must exit to avoid cycling.\n if (duplicate) {\n break;\n }\n\n // New vertex is ok and needed.\n ++simplex.m_count;\n }\n\n stats.gjkMaxIters = Math.max(stats.gjkMaxIters, iter);\n\n // Prepare output.\n simplex.getWitnessPoints(output.pointA, output.pointB);\n output.distance = Vec2.distance(output.pointA, output.pointB);\n output.iterations = iter;\n\n // Cache the simplex.\n simplex.writeCache(cache);\n\n // Apply radii if requested.\n if (input.useRadii) {\n const rA = proxyA.m_radius;\n const rB = proxyB.m_radius;\n\n if (output.distance > rA + rB && output.distance > Math.EPSILON) {\n // Shapes are still no overlapped.\n // Move the witness points to the outer surface.\n output.distance -= rA + rB;\n const normal = Vec2.sub(output.pointB, output.pointA);\n normal.normalize();\n output.pointA.addMul(rA, normal);\n output.pointB.subMul(rB, normal);\n } else {\n // Shapes are overlapped when radii are considered.\n // Move the witness points to the middle.\n const p = Vec2.mid(output.pointA, output.pointB);\n output.pointA.setVec2(p);\n output.pointB.setVec2(p);\n output.distance = 0.0;\n }\n }\n}\n\n/**\n * A distance proxy is used by the GJK algorithm. It encapsulates any shape.\n */\nexport class DistanceProxy {\n /** internal */ m_buffer: Vec2[];\n /** internal */ m_vertices: Vec2[];\n /** internal */ m_count: number;\n /** internal */ m_radius: number;\n\n\n constructor() {\n this.m_buffer = []; // Vec2[2]\n this.m_vertices = []; // Vec2[]\n this.m_count = 0;\n this.m_radius = 0;\n }\n\n /**\n * Get the vertex count.\n */\n getVertexCount(): number {\n return this.m_count;\n }\n\n /**\n * Get a vertex by index. Used by Distance.\n */\n getVertex(index: number): Vec2 {\n _ASSERT && common.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * Get the supporting vertex index in the given direction.\n */\n getSupport(d: Vec2): number {\n let bestIndex = 0;\n let bestValue = Vec2.dot(this.m_vertices[0], d);\n for (let i = 0; i < this.m_count; ++i) {\n const value = Vec2.dot(this.m_vertices[i], d);\n if (value > bestValue) {\n bestIndex = i;\n bestValue = value;\n }\n }\n return bestIndex;\n }\n\n /**\n * Get the supporting vertex in the given direction.\n */\n getSupportVertex(d: Vec2): Vec2 {\n return this.m_vertices[this.getSupport(d)];\n }\n\n /**\n * Initialize the proxy using the given shape. The shape must remain in scope\n * while the proxy is in use.\n */\n set(shape: Shape, index: number): void {\n // TODO remove, use shape instead\n _ASSERT && common.assert(typeof shape.computeDistanceProxy === 'function');\n shape.computeDistanceProxy(this, index);\n }\n}\n\nclass SimplexVertex {\n /** support point in proxyA */\n wA: Vec2 = Vec2.zero();\n /** wA index */\n indexA: number;\n\n /** support point in proxyB */\n wB: Vec2 = Vec2.zero();\n /** wB index */\n indexB: number;\n\n /** wB - wA; */\n w: Vec2 = Vec2.zero();\n /** barycentric coordinate for closest point */\n a: number;\n\n set(v: SimplexVertex): void {\n this.indexA = v.indexA;\n this.indexB = v.indexB;\n this.wA = Vec2.clone(v.wA);\n this.wB = Vec2.clone(v.wB);\n this.w = Vec2.clone(v.w);\n this.a = v.a;\n }\n}\n\nclass Simplex {\n m_v1: SimplexVertex;\n m_v2: SimplexVertex;\n m_v3: SimplexVertex;\n m_v: SimplexVertex[];\n m_count: number;\n\n constructor() {\n this.m_v1 = new SimplexVertex();\n this.m_v2 = new SimplexVertex();\n this.m_v3 = new SimplexVertex();\n this.m_v = [ this.m_v1, this.m_v2, this.m_v3 ];\n this.m_count;\n }\n\n /** @internal */\n toString(): string {\n if (this.m_count === 3) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y,\n this.m_v3.a, this.m_v3.wA.x, this.m_v3.wA.y, this.m_v3.wB.x, this.m_v3.wB.y\n ].toString();\n\n } else if (this.m_count === 2) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y\n ].toString();\n\n } else if (this.m_count === 1) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y\n ].toString();\n\n } else {\n return \"+\" + this.m_count;\n }\n }\n\n readCache(cache: SimplexCache, proxyA: DistanceProxy, transformA: Transform, proxyB: DistanceProxy, transformB: Transform): void {\n _ASSERT && common.assert(cache.count <= 3);\n\n // Copy data from cache.\n this.m_count = cache.count;\n for (let i = 0; i < this.m_count; ++i) {\n const v = this.m_v[i];\n v.indexA = cache.indexA[i];\n v.indexB = cache.indexB[i];\n const wALocal = proxyA.getVertex(v.indexA);\n const wBLocal = proxyB.getVertex(v.indexB);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 0.0;\n }\n\n // Compute the new simplex metric, if it is substantially different than\n // old metric then flush the simplex.\n if (this.m_count > 1) {\n const metric1 = cache.metric;\n const metric2 = this.getMetric();\n if (metric2 < 0.5 * metric1 || 2.0 * metric1 < metric2\n || metric2 < Math.EPSILON) {\n // Reset the simplex.\n this.m_count = 0;\n }\n }\n\n // If the cache is empty or invalid...\n if (this.m_count === 0) {\n const v = this.m_v[0];\n v.indexA = 0;\n v.indexB = 0;\n const wALocal = proxyA.getVertex(0);\n const wBLocal = proxyB.getVertex(0);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 1.0;\n this.m_count = 1;\n }\n }\n\n writeCache(cache: SimplexCache): void {\n cache.metric = this.getMetric();\n cache.count = this.m_count;\n for (let i = 0; i < this.m_count; ++i) {\n cache.indexA[i] = this.m_v[i].indexA;\n cache.indexB[i] = this.m_v[i].indexB;\n }\n }\n\n getSearchDirection(): Vec2 {\n switch (this.m_count) {\n case 1:\n return Vec2.neg(this.m_v1.w);\n\n case 2: {\n const e12 = Vec2.sub(this.m_v2.w, this.m_v1.w);\n const sgn = Vec2.crossVec2Vec2(e12, Vec2.neg(this.m_v1.w));\n if (sgn > 0.0) {\n // Origin is left of e12.\n return Vec2.crossNumVec2(1.0, e12);\n } else {\n // Origin is right of e12.\n return Vec2.crossVec2Num(e12, 1.0);\n }\n }\n\n default:\n _ASSERT && common.assert(false);\n return Vec2.zero();\n }\n }\n\n getClosestPoint(): Vec2 {\n switch (this.m_count) {\n case 0:\n _ASSERT && common.assert(false);\n return Vec2.zero();\n\n case 1:\n return Vec2.clone(this.m_v1.w);\n\n case 2:\n return Vec2.combine(this.m_v1.a, this.m_v1.w, this.m_v2.a, this.m_v2.w);\n\n case 3:\n return Vec2.zero();\n\n default:\n _ASSERT && common.assert(false);\n return Vec2.zero();\n }\n }\n\n getWitnessPoints(pA: Vec2, pB: Vec2): void {\n switch (this.m_count) {\n case 0:\n _ASSERT && common.assert(false);\n break;\n\n case 1:\n pA.setVec2(this.m_v1.wA);\n pB.setVec2(this.m_v1.wB);\n break;\n\n case 2:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pB.setCombine(this.m_v1.a, this.m_v1.wB, this.m_v2.a, this.m_v2.wB);\n break;\n\n case 3:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pA.addMul(this.m_v3.a, this.m_v3.wA);\n pB.setVec2(pA);\n break;\n\n default:\n _ASSERT && common.assert(false);\n break;\n }\n }\n\n getMetric(): number {\n switch (this.m_count) {\n case 0:\n _ASSERT && common.assert(false);\n return 0.0;\n\n case 1:\n return 0.0;\n\n case 2:\n return Vec2.distance(this.m_v1.w, this.m_v2.w);\n\n case 3:\n return Vec2.crossVec2Vec2(Vec2.sub(this.m_v2.w, this.m_v1.w), Vec2.sub(this.m_v3.w,\n this.m_v1.w));\n\n default:\n _ASSERT && common.assert(false);\n return 0.0;\n }\n }\n\n solve(): void {\n switch (this.m_count) {\n case 1:\n break;\n\n case 2:\n this.solve2();\n break;\n\n case 3:\n this.solve3();\n break;\n\n default:\n _ASSERT && common.assert(false);\n }\n }\n\n// Solve a line segment using barycentric coordinates.\n//\n// p = a1 * w1 + a2 * w2\n// a1 + a2 = 1\n//\n// The vector from the origin to the closest point on the line is\n// perpendicular to the line.\n// e12 = w2 - w1\n// dot(p, e) = 0\n// a1 * dot(w1, e) + a2 * dot(w2, e) = 0\n//\n// 2-by-2 linear system\n// [1 1 ][a1] = [1]\n// [w1.e12 w2.e12][a2] = [0]\n//\n// Define\n// d12_1 = dot(w2, e12)\n// d12_2 = -dot(w1, e12)\n// d12 = d12_1 + d12_2\n//\n// Solution\n// a1 = d12_1 / d12\n// a2 = d12_2 / d12\n solve2(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const e12 = Vec2.sub(w2, w1);\n\n // w1 region\n const d12_2 = -Vec2.dot(w1, e12);\n if (d12_2 <= 0.0) {\n // a2 <= 0, so we clamp it to 0\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // w2 region\n const d12_1 = Vec2.dot(w2, e12);\n if (d12_1 <= 0.0) {\n // a1 <= 0, so we clamp it to 0\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // Must be in e12 region.\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n }\n\n// Possible regions:\n// - points[2]\n// - edge points[0]-points[2]\n// - edge points[1]-points[2]\n// - inside the triangle\n solve3(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const w3 = this.m_v3.w;\n\n // Edge12\n // [1 1 ][a1] = [1]\n // [w1.e12 w2.e12][a2] = [0]\n // a3 = 0\n const e12 = Vec2.sub(w2, w1);\n const w1e12 = Vec2.dot(w1, e12);\n const w2e12 = Vec2.dot(w2, e12);\n const d12_1 = w2e12;\n const d12_2 = -w1e12;\n\n // Edge13\n // [1 1 ][a1] = [1]\n // [w1.e13 w3.e13][a3] = [0]\n // a2 = 0\n const e13 = Vec2.sub(w3, w1);\n const w1e13 = Vec2.dot(w1, e13);\n const w3e13 = Vec2.dot(w3, e13);\n const d13_1 = w3e13;\n const d13_2 = -w1e13;\n\n // Edge23\n // [1 1 ][a2] = [1]\n // [w2.e23 w3.e23][a3] = [0]\n // a1 = 0\n const e23 = Vec2.sub(w3, w2);\n const w2e23 = Vec2.dot(w2, e23);\n const w3e23 = Vec2.dot(w3, e23);\n const d23_1 = w3e23;\n const d23_2 = -w2e23;\n\n // Triangle123\n const n123 = Vec2.crossVec2Vec2(e12, e13);\n\n const d123_1 = n123 * Vec2.crossVec2Vec2(w2, w3);\n const d123_2 = n123 * Vec2.crossVec2Vec2(w3, w1);\n const d123_3 = n123 * Vec2.crossVec2Vec2(w1, w2);\n\n // w1 region\n if (d12_2 <= 0.0 && d13_2 <= 0.0) {\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // e12\n if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) {\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n return;\n }\n\n // e13\n if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) {\n const inv_d13 = 1.0 / (d13_1 + d13_2);\n this.m_v1.a = d13_1 * inv_d13;\n this.m_v3.a = d13_2 * inv_d13;\n this.m_count = 2;\n this.m_v2.set(this.m_v3);\n return;\n }\n\n // w2 region\n if (d12_1 <= 0.0 && d23_2 <= 0.0) {\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // w3 region\n if (d13_1 <= 0.0 && d23_1 <= 0.0) {\n this.m_v3.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // e23\n if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) {\n const inv_d23 = 1.0 / (d23_1 + d23_2);\n this.m_v2.a = d23_1 * inv_d23;\n this.m_v3.a = d23_2 * inv_d23;\n this.m_count = 2;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // Must be in triangle123\n const inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3);\n this.m_v1.a = d123_1 * inv_d123;\n this.m_v2.a = d123_2 * inv_d123;\n this.m_v3.a = d123_3 * inv_d123;\n this.m_count = 3;\n }\n}\n\n\n/**\n * Determine if two generic shapes overlap.\n */\nexport function testOverlap(shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform): boolean {\n const input = new DistanceInput();\n input.proxyA.set(shapeA, indexA);\n input.proxyB.set(shapeB, indexB);\n input.transformA = xfA;\n input.transformB = xfB;\n input.useRadii = true;\n\n const cache = new SimplexCache();\n const output = new DistanceOutput();\n\n Distance(output, cache, input);\n\n return output.distance < 10.0 * Math.EPSILON;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { ShapeType } from \"../collision/Shape\";\nimport common from '../util/common';\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\nimport Transform from '../common/Transform';\nimport Mat22 from '../common/Mat22';\nimport Rot from '../common/Rot';\nimport Settings from '../Settings';\nimport Manifold, { ManifoldType, WorldManifold } from '../collision/Manifold';\nimport { testOverlap } from '../collision/Distance';\nimport Fixture from \"./Fixture\";\nimport Body from \"./Body\";\nimport { ContactImpulse, TimeStep } from \"./Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst DEBUG_SOLVER = false;\n\n/**\n * A contact edge is used to connect bodies and contacts together in a contact\n * graph where each body is a node and each contact is an edge. A contact edge\n * belongs to a doubly linked list maintained in each attached body. Each\n * contact has two contact nodes, one for each attached body.\n *\n * @prop {Contact} contact The contact\n * @prop {ContactEdge} prev The previous contact edge in the body's contact list\n * @prop {ContactEdge} next The next contact edge in the body's contact list\n * @prop {Body} other Provides quick access to the other body attached.\n */\nexport class ContactEdge {\n contact: Contact;\n prev: ContactEdge | undefined;\n next: ContactEdge | undefined;\n other: Body | undefined;\n constructor(contact: Contact) {\n this.contact = contact;\n }\n}\n\nexport type EvaluateFunction = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void;\n\nexport type ContactCallback = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void /* & { destroyFcn?: (contact: Contact) => void }*/;\n\n\n/**\n * Friction mixing law. The idea is to allow either fixture to drive the\n * restitution to zero. For example, anything slides on ice.\n */\nexport function mixFriction(friction1: number, friction2: number): number {\n return Math.sqrt(friction1 * friction2);\n}\n\n/**\n * Restitution mixing law. The idea is allow for anything to bounce off an\n * inelastic surface. For example, a superball bounces on anything.\n */\nexport function mixRestitution(restitution1: number, restitution2: number): number {\n return restitution1 > restitution2 ? restitution1 : restitution2;\n}\n\n// TODO: move this to Settings?\nconst s_registers = [];\n\n// TODO: merge with ManifoldPoint?\nexport class VelocityConstraintPoint {\n rA: Vec2 = Vec2.zero();\n rB: Vec2 = Vec2.zero();\n normalImpulse: number = 0;\n tangentImpulse: number = 0;\n normalMass: number = 0;\n tangentMass: number = 0;\n velocityBias: number = 0;\n}\n\n/**\n * The class manages contact between two shapes. A contact exists for each\n * overlapping AABB in the broad-phase (except if filtered). Therefore a contact\n * object may exist that has no contact points.\n */\nexport default class Contact {\n /** @internal */\n m_nodeA: ContactEdge;\n /** @internal */\n m_nodeB: ContactEdge;\n /** @internal */\n m_fixtureA: Fixture;\n /** @internal */\n m_fixtureB: Fixture;\n /** @internal */\n m_indexA: number;\n /** @internal */\n m_indexB: number;\n /** @internal */\n m_evaluateFcn: EvaluateFunction;\n /** @internal */\n m_manifold: Manifold = new Manifold();\n /** @internal */\n m_prev: Contact | null = null;\n /** @internal */\n m_next: Contact | null = null;\n /** @internal */\n m_toi: number = 1.0;\n /** @internal */\n m_toiCount: number = 0;\n /** @internal This contact has a valid TOI in m_toi */\n m_toiFlag: boolean = false;\n /** @internal */\n m_friction: number;\n /** @internal */\n m_restitution: number;\n /** @internal */\n m_tangentSpeed: number = 0.0;\n /** @internal This contact can be disabled (by user) */\n m_enabledFlag: boolean = true;\n /** @internal Used when crawling contact graph when forming islands. */\n m_islandFlag: boolean = false;\n /** @internal Set when the shapes are touching. */\n m_touchingFlag: boolean = false;\n /** @internal This contact needs filtering because a fixture filter was changed. */\n m_filterFlag: boolean = false;\n /** @internal This bullet contact had a TOI event */\n m_bulletHitFlag: boolean = false;\n\n /** @internal Contact reporting impulse object cache */\n m_impulse: ContactImpulse = new ContactImpulse(this);\n\n // VelocityConstraint\n /** @internal */ v_points: VelocityConstraintPoint[] = []; // [maxManifoldPoints];\n /** @internal */ v_normal: Vec2 = Vec2.zero();\n /** @internal */ v_normalMass: Mat22 = new Mat22();\n /** @internal */ v_K: Mat22 = new Mat22();\n /** @internal */ v_pointCount: number;\n /** @internal */ v_tangentSpeed: number | undefined;\n /** @internal */ v_friction: number | undefined;\n /** @internal */ v_restitution: number | undefined;\n /** @internal */ v_invMassA: number | undefined;\n /** @internal */ v_invMassB: number | undefined;\n /** @internal */ v_invIA: number | undefined;\n /** @internal */ v_invIB: number | undefined;\n\n // PositionConstraint\n /** @internal */ p_localPoints: Vec2[] = []; // [maxManifoldPoints];\n /** @internal */ p_localNormal: Vec2 = Vec2.zero();\n /** @internal */ p_localPoint: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterA: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterB: Vec2 = Vec2.zero();\n /** @internal */ p_type: ManifoldType | undefined;\n /** @internal */ p_radiusA: number | undefined;\n /** @internal */ p_radiusB: number | undefined;\n /** @internal */ p_pointCount: number | undefined;\n /** @internal */ p_invMassA: number | undefined;\n /** @internal */ p_invMassB: number | undefined;\n /** @internal */ p_invIA: number | undefined;\n /** @internal */ p_invIB: number | undefined;\n\n constructor(fA: Fixture, indexA: number, fB: Fixture, indexB: number, evaluateFcn: EvaluateFunction) {\n // Nodes for connecting bodies.\n this.m_nodeA = new ContactEdge(this);\n this.m_nodeB = new ContactEdge(this);\n\n this.m_fixtureA = fA;\n this.m_fixtureB = fB;\n\n this.m_indexA = indexA;\n this.m_indexB = indexB;\n\n this.m_evaluateFcn = evaluateFcn;\n\n this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction);\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution);\n }\n\n initConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const shapeA = fixtureA.getShape();\n const shapeB = fixtureB.getShape();\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const manifold = this.getManifold();\n\n const pointCount = manifold.pointCount;\n _ASSERT && common.assert(pointCount > 0);\n\n this.v_invMassA = bodyA.m_invMass;\n this.v_invMassB = bodyB.m_invMass;\n this.v_invIA = bodyA.m_invI;\n this.v_invIB = bodyB.m_invI;\n\n this.v_friction = this.m_friction;\n this.v_restitution = this.m_restitution;\n this.v_tangentSpeed = this.m_tangentSpeed;\n\n this.v_pointCount = pointCount;\n\n this.v_K.setZero();\n this.v_normalMass.setZero();\n\n this.p_invMassA = bodyA.m_invMass;\n this.p_invMassB = bodyB.m_invMass;\n this.p_invIA = bodyA.m_invI;\n this.p_invIB = bodyB.m_invI;\n this.p_localCenterA = Vec2.clone(bodyA.m_sweep.localCenter);\n this.p_localCenterB = Vec2.clone(bodyB.m_sweep.localCenter);\n\n this.p_radiusA = shapeA.m_radius;\n this.p_radiusB = shapeB.m_radius;\n\n this.p_type = manifold.type;\n this.p_localNormal = Vec2.clone(manifold.localNormal);\n this.p_localPoint = Vec2.clone(manifold.localPoint);\n this.p_pointCount = pointCount;\n\n for (let j = 0; j < pointCount; ++j) {\n const cp = manifold.points[j];\n const vcp = this.v_points[j] = new VelocityConstraintPoint();\n\n if (step.warmStarting) {\n vcp.normalImpulse = step.dtRatio * cp.normalImpulse;\n vcp.tangentImpulse = step.dtRatio * cp.tangentImpulse;\n\n } else {\n vcp.normalImpulse = 0.0;\n vcp.tangentImpulse = 0.0;\n }\n\n vcp.rA.setZero();\n vcp.rB.setZero();\n vcp.normalMass = 0.0;\n vcp.tangentMass = 0.0;\n vcp.velocityBias = 0.0;\n\n this.p_localPoints[j] = Vec2.clone(cp.localPoint);\n\n }\n }\n\n /**\n * Get the contact manifold. Do not modify the manifold unless you understand\n * the internals of the library.\n */\n getManifold(): Manifold {\n return this.m_manifold;\n }\n\n /**\n * Get the world manifold.\n */\n getWorldManifold(worldManifold: WorldManifold | null | undefined): WorldManifold | undefined {\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n\n return this.m_manifold.getWorldManifold(worldManifold, bodyA.getTransform(),\n shapeA.m_radius, bodyB.getTransform(), shapeB.m_radius);\n }\n\n /**\n * Enable/disable this contact. This can be used inside the pre-solve contact\n * listener. The contact is only disabled for the current time step (or sub-step\n * in continuous collisions).\n */\n setEnabled(flag: boolean): void {\n this.m_enabledFlag = !!flag;\n }\n\n /**\n * Has this contact been disabled?\n */\n isEnabled(): boolean {\n return this.m_enabledFlag;\n }\n\n /**\n * Is this contact touching?\n */\n isTouching(): boolean {\n return this.m_touchingFlag;\n }\n\n /**\n * Get the next contact in the world's contact list.\n */\n getNext(): Contact | null {\n return this.m_next;\n }\n\n /**\n * Get fixture A in this contact.\n */\n getFixtureA(): Fixture {\n return this.m_fixtureA;\n }\n\n /**\n * Get fixture B in this contact.\n */\n getFixtureB(): Fixture {\n return this.m_fixtureB;\n }\n\n /**\n * Get the child primitive index for fixture A.\n */\n getChildIndexA(): number {\n return this.m_indexA;\n }\n\n /**\n * Get the child primitive index for fixture B.\n */\n getChildIndexB(): number {\n return this.m_indexB;\n }\n\n /**\n * Flag this contact for filtering. Filtering will occur the next time step.\n */\n flagForFiltering(): void {\n this.m_filterFlag = true;\n }\n\n /**\n * Override the default friction mixture. You can call this in\n * ContactListener.preSolve. This value persists until set or reset.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the friction.\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Reset the friction mixture to the default value.\n */\n resetFriction(): void {\n this.m_friction = mixFriction(this.m_fixtureA.m_friction,\n this.m_fixtureB.m_friction);\n }\n\n /**\n * Override the default restitution mixture. You can call this in\n * ContactListener.preSolve. The value persists until you set or reset.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Get the restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Reset the restitution to the default value.\n */\n resetRestitution(): void {\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution,\n this.m_fixtureB.m_restitution);\n }\n\n /**\n * Set the desired tangent speed for a conveyor belt behavior. In meters per\n * second.\n */\n setTangentSpeed(speed: number): void {\n this.m_tangentSpeed = speed;\n }\n\n /**\n * Get the desired tangent speed. In meters per second.\n */\n getTangentSpeed(): number {\n return this.m_tangentSpeed;\n }\n\n /**\n * Called by Update method, and implemented by subclasses.\n */\n evaluate(manifold: Manifold, xfA: Transform, xfB: Transform): void {\n this.m_evaluateFcn(manifold, xfA, this.m_fixtureA, this.m_indexA, xfB,\n this.m_fixtureB, this.m_indexB);\n }\n\n /**\n * Updates the contact manifold and touching status.\n *\n * Note: do not assume the fixture AABBs are overlapping or are valid.\n *\n * @param listener.beginContact\n * @param listener.endContact\n * @param listener.preSolve\n */\n update(listener?: {\n beginContact(contact: Contact): void,\n endContact(contact: Contact): void,\n preSolve(contact: Contact, oldManifold: Manifold): void\n }): void {\n\n // Re-enable this contact.\n this.m_enabledFlag = true;\n\n let touching = false;\n const wasTouching = this.m_touchingFlag;\n\n const sensorA = this.m_fixtureA.isSensor();\n const sensorB = this.m_fixtureB.isSensor();\n const sensor = sensorA || sensorB;\n\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const xfA = bodyA.getTransform();\n const xfB = bodyB.getTransform();\n\n let oldManifold;\n\n // Is this contact a sensor?\n if (sensor) {\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n touching = testOverlap(shapeA, this.m_indexA, shapeB, this.m_indexB, xfA, xfB);\n\n // Sensors don't generate manifolds.\n this.m_manifold.pointCount = 0;\n } else {\n\n // TODO reuse manifold\n oldManifold = this.m_manifold;\n this.m_manifold = new Manifold();\n\n this.evaluate(this.m_manifold, xfA, xfB);\n touching = this.m_manifold.pointCount > 0;\n\n // Match old contact ids to new contact ids and copy the\n // stored impulses to warm start the solver.\n for (let i = 0; i < this.m_manifold.pointCount; ++i) {\n const nmp = this.m_manifold.points[i];\n nmp.normalImpulse = 0.0;\n nmp.tangentImpulse = 0.0;\n\n for (let j = 0; j < oldManifold.pointCount; ++j) {\n const omp = oldManifold.points[j];\n if (omp.id.key == nmp.id.key) {\n nmp.normalImpulse = omp.normalImpulse;\n nmp.tangentImpulse = omp.tangentImpulse;\n break;\n }\n }\n }\n\n if (touching != wasTouching) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n }\n\n this.m_touchingFlag = touching;\n\n if (!wasTouching && touching && listener) {\n listener.beginContact(this);\n }\n\n if (wasTouching && !touching && listener) {\n listener.endContact(this);\n }\n\n if (!sensor && touching && listener) {\n listener.preSolve(this, oldManifold);\n }\n }\n\n solvePositionConstraint(step: TimeStep): number {\n return this._solvePositionConstraint(step);\n }\n\n solvePositionConstraintTOI(step: TimeStep, toiA: Body, toiB: Body): number {\n return this._solvePositionConstraint(step, toiA, toiB);\n }\n\n private _solvePositionConstraint(step: TimeStep, toiA?: Body, toiB?: Body): number {\n const toi: boolean = !!toiA && !!toiB;\n\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n let mA = 0.0;\n let iA = 0.0;\n if (!toi || (bodyA == toiA || bodyA == toiB)) {\n mA = this.p_invMassA;\n iA = this.p_invIA;\n }\n\n let mB = 0.0;\n let iB = 0.0;\n if (!toi || (bodyB == toiA || bodyB == toiB)) {\n mB = this.p_invMassB;\n iB = this.p_invIB;\n }\n\n const cA = Vec2.clone(positionA.c);\n let aA = positionA.a;\n\n const cB = Vec2.clone(positionB.c);\n let aB = positionB.a;\n\n let minSeparation = 0.0;\n\n // Solve normal constraints\n for (let j = 0; j < this.p_pointCount; ++j) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p = Vec2.sub(cA, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p = Vec2.sub(cB, Rot.mulVec2(xfB.q, localCenterB));\n\n // PositionSolverManifold\n let normal;\n let point;\n let separation;\n switch (this.p_type) {\n case ManifoldType.e_circles: {\n const pointA = Transform.mulVec2(xfA, this.p_localPoint);\n const pointB = Transform.mulVec2(xfB, this.p_localPoints[0]);\n normal = Vec2.sub(pointB, pointA);\n normal.normalize();\n point = Vec2.combine(0.5, pointA, 0.5, pointB);\n separation = Vec2.dot(Vec2.sub(pointB, pointA), normal) - this.p_radiusA - this.p_radiusB;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfA, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfB, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfB, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfA, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n\n // Ensure normal points from A to B\n normal.mul(-1);\n break;\n }\n }\n\n const rA = Vec2.sub(point, cA);\n const rB = Vec2.sub(point, cB);\n\n // Track max constraint error.\n minSeparation = Math.min(minSeparation, separation);\n\n const baumgarte = toi ? Settings.toiBaugarte : Settings.baumgarte;\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n // Prevent large corrections and allow slop.\n const C = Math.clamp(baumgarte * (separation + linearSlop), -maxLinearCorrection, 0.0);\n\n // Compute the effective mass.\n const rnA = Vec2.crossVec2Vec2(rA, normal);\n const rnB = Vec2.crossVec2Vec2(rB, normal);\n const K = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n // Compute normal impulse\n const impulse = K > 0.0 ? -C / K : 0.0;\n\n const P = Vec2.mulNumVec2(impulse, normal);\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n\n return minSeparation;\n }\n\n initVelocityConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const radiusA = this.p_radiusA;\n const radiusB = this.p_radiusB;\n const manifold = this.getManifold();\n\n const mA = this.v_invMassA;\n const mB = this.v_invMassB;\n const iA = this.v_invIA;\n const iB = this.v_invIB;\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n const cA = Vec2.clone(positionA.c);\n const aA = positionA.a;\n const vA = Vec2.clone(velocityA.v);\n const wA = velocityA.w;\n\n const cB = Vec2.clone(positionB.c);\n const aB = positionB.a;\n const vB = Vec2.clone(velocityB.v);\n const wB = velocityB.w;\n\n _ASSERT && common.assert(manifold.pointCount > 0);\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p.setCombine(1, cA, -1, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p.setCombine(1, cB, -1, Rot.mulVec2(xfB.q, localCenterB));\n\n const worldManifold = manifold.getWorldManifold(null, xfA, radiusA, xfB, radiusB);\n\n this.v_normal.setVec2(worldManifold.normal);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n vcp.rA.setVec2(Vec2.sub(worldManifold.points[j], cA));\n vcp.rB.setVec2(Vec2.sub(worldManifold.points[j], cB));\n\n const rnA = Vec2.crossVec2Vec2(vcp.rA, this.v_normal);\n const rnB = Vec2.crossVec2Vec2(vcp.rB, this.v_normal);\n\n const kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n vcp.normalMass = kNormal > 0.0 ? 1.0 / kNormal : 0.0;\n\n const tangent = Vec2.crossVec2Num(this.v_normal, 1.0);\n\n const rtA = Vec2.crossVec2Vec2(vcp.rA, tangent);\n const rtB = Vec2.crossVec2Vec2(vcp.rB, tangent);\n\n const kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB;\n\n vcp.tangentMass = kTangent > 0.0 ? 1.0 / kTangent : 0.0;\n\n // Setup a velocity bias for restitution.\n vcp.velocityBias = 0.0;\n const vRel = Vec2.dot(this.v_normal, vB)\n + Vec2.dot(this.v_normal, Vec2.crossNumVec2(wB, vcp.rB))\n - Vec2.dot(this.v_normal, vA)\n - Vec2.dot(this.v_normal, Vec2.crossNumVec2(wA, vcp.rA));\n if (vRel < -Settings.velocityThreshold) {\n vcp.velocityBias = -this.v_restitution * vRel;\n }\n }\n\n // If we have two points, then prepare the block solver.\n if (this.v_pointCount == 2 && step.blockSolve) {\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const rn1A = Vec2.crossVec2Vec2(vcp1.rA, this.v_normal);\n const rn1B = Vec2.crossVec2Vec2(vcp1.rB, this.v_normal);\n const rn2A = Vec2.crossVec2Vec2(vcp2.rA, this.v_normal);\n const rn2B = Vec2.crossVec2Vec2(vcp2.rB, this.v_normal);\n\n const k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B;\n const k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B;\n const k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B;\n\n // Ensure a reasonable condition number.\n const k_maxConditionNumber = 1000.0;\n if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) {\n // K is safe to invert.\n this.v_K.ex.setNum(k11, k12);\n this.v_K.ey.setNum(k12, k22);\n this.v_normalMass.set(this.v_K.getInverse());\n } else {\n // The constraints are redundant, just use one.\n // TODO_ERIN use deepest?\n this.v_pointCount = 1;\n }\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n warmStartConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n const P = Vec2.combine(vcp.normalImpulse, normal, vcp.tangentImpulse, tangent);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n vA.subMul(mA, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n vB.addMul(mB, P);\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n storeConstraintImpulses(step: TimeStep): void {\n const manifold = this.m_manifold;\n for (let j = 0; j < this.v_pointCount; ++j) {\n manifold.points[j].normalImpulse = this.v_points[j].normalImpulse;\n manifold.points[j].tangentImpulse = this.v_points[j].tangentImpulse;\n }\n }\n\n solveVelocityConstraint(step: TimeStep): void {\n const bodyA = this.m_fixtureA.m_body;\n const bodyB = this.m_fixtureB.m_body;\n\n const velocityA = bodyA.c_velocity;\n const positionA = bodyA.c_position;\n\n const velocityB = bodyB.c_velocity;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n const friction = this.v_friction;\n\n _ASSERT && common.assert(this.v_pointCount == 1 || this.v_pointCount == 2);\n\n // Solve tangent constraints first because non-penetration is more important\n // than friction.\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute tangent force\n const vt = Vec2.dot(dv, tangent) - this.v_tangentSpeed;\n let lambda = vcp.tangentMass * (-vt);\n\n // Clamp the accumulated force\n const maxFriction = friction * vcp.normalImpulse;\n const newImpulse = Math.clamp(vcp.tangentImpulse + lambda, -maxFriction, maxFriction);\n lambda = newImpulse - vcp.tangentImpulse;\n vcp.tangentImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, tangent);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n\n // Solve normal constraints\n if (this.v_pointCount == 1 || step.blockSolve == false) {\n for (let i = 0; i < this.v_pointCount; ++i) {\n const vcp = this.v_points[i]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute normal impulse\n const vn = Vec2.dot(dv, normal);\n let lambda = -vcp.normalMass * (vn - vcp.velocityBias);\n\n // Clamp the accumulated impulse\n const newImpulse = Math.max(vcp.normalImpulse + lambda, 0.0);\n lambda = newImpulse - vcp.normalImpulse;\n vcp.normalImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, normal);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n } else {\n // Block solver developed in collaboration with Dirk Gregorius (back in\n // 01/07 on Box2D_Lite).\n // Build the mini LCP for this contact patch\n //\n // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i =\n // 1..2\n //\n // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n )\n // b = vn0 - velocityBias\n //\n // The system is solved using the \"Total enumeration method\" (s. Murty).\n // The complementary constraint vn_i * x_i\n // implies that we must have in any solution either vn_i = 0 or x_i = 0.\n // So for the 2D contact problem the cases\n // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and\n // vn1 = 0 need to be tested. The first valid\n // solution that satisfies the problem is chosen.\n //\n // In order to account of the accumulated impulse 'a' (because of the\n // iterative nature of the solver which only requires\n // that the accumulated impulse is clamped and not the incremental\n // impulse) we change the impulse variable (x_i).\n //\n // Substitute:\n //\n // x = a + d\n //\n // a := old total impulse\n // x := new total impulse\n // d := incremental impulse\n //\n // For the current iteration we extend the formula for the incremental\n // impulse\n // to compute the new total impulse:\n //\n // vn = A * d + b\n // = A * (x - a) + b\n // = A * x + b - A * a\n // = A * x + b'\n // b' = b - A * a;\n\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const a = Vec2.neo(vcp1.normalImpulse, vcp2.normalImpulse);\n _ASSERT && common.assert(a.x >= 0.0 && a.y >= 0.0);\n\n // Relative velocity at contact\n let dv1 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp1.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp1.rA));\n let dv2 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp2.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp2.rA));\n\n // Compute normal velocity\n let vn1 = Vec2.dot(dv1, normal);\n let vn2 = Vec2.dot(dv2, normal);\n\n const b = Vec2.neo(vn1 - vcp1.velocityBias, vn2 - vcp2.velocityBias);\n\n // Compute b'\n b.sub(Mat22.mulVec2(this.v_K, a));\n\n const k_errorTol = 1e-3;\n // NOT_USED(k_errorTol);\n\n while (true) {\n //\n // Case 1: vn = 0\n //\n // 0 = A * x + b'\n //\n // Solve for x:\n //\n // x = - inv(A) * b'\n //\n const x = Mat22.mulVec2(this.v_normalMass, b).neg();\n\n if (x.x >= 0.0 && x.y >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n dv1 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA)));\n dv2 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA)));\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && common.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n _ASSERT && common.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 2: vn1 = 0 and x2 = 0\n //\n // 0 = a11 * x1 + a12 * 0 + b1'\n // vn2 = a21 * x1 + a22 * 0 + b2'\n //\n x.x = -vcp1.normalMass * b.x;\n x.y = 0.0;\n vn1 = 0.0;\n vn2 = this.v_K.ex.y * x.x + b.y;\n\n if (x.x >= 0.0 && vn2 >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv1B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB));\n const dv1A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA));\n const dv1 = Vec2.sub(dv1B, dv1A);\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n\n _ASSERT && common.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 3: vn2 = 0 and x1 = 0\n //\n // vn1 = a11 * 0 + a12 * x2 + b1'\n // 0 = a21 * 0 + a22 * x2 + b2'\n //\n x.x = 0.0;\n x.y = -vcp2.normalMass * b.y;\n vn1 = this.v_K.ey.x * x.y + b.x;\n vn2 = 0.0;\n\n if (x.y >= 0.0 && vn1 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv2B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB));\n const dv2A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA));\n const dv1 = Vec2.sub(dv2B, dv2A);\n\n // Compute normal velocity\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && common.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 4: x1 = 0 and x2 = 0\n //\n // vn1 = b1\n // vn2 = b2;\n //\n x.x = 0.0;\n x.y = 0.0;\n vn1 = b.x;\n vn2 = b.y;\n\n if (vn1 >= 0.0 && vn2 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n break;\n }\n\n // No solution, give up. This is hit sometimes, but it doesn't seem to\n // matter.\n break;\n }\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n /**\n * @internal\n */\n static addType(type1: ShapeType, type2: ShapeType, callback: ContactCallback): void {\n s_registers[type1] = s_registers[type1] || {};\n s_registers[type1][type2] = callback;\n }\n\n /**\n * @internal\n */\n static create(fixtureA: Fixture, indexA: number, fixtureB: Fixture, indexB: number): Contact | null {\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // TODO: pool contacts\n let contact;\n let evaluateFcn;\n if (evaluateFcn = s_registers[typeA] && s_registers[typeA][typeB]) {\n contact = new Contact(fixtureA, indexA, fixtureB, indexB, evaluateFcn);\n } else if (evaluateFcn = s_registers[typeB] && s_registers[typeB][typeA]) {\n contact = new Contact(fixtureB, indexB, fixtureA, indexA, evaluateFcn);\n } else {\n return null;\n }\n\n // Contact creation may swap fixtures.\n fixtureA = contact.getFixtureA();\n fixtureB = contact.getFixtureB();\n indexA = contact.getChildIndexA();\n indexB = contact.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Connect to body A\n contact.m_nodeA.contact = contact;\n contact.m_nodeA.other = bodyB;\n\n contact.m_nodeA.prev = null;\n contact.m_nodeA.next = bodyA.m_contactList;\n if (bodyA.m_contactList != null) {\n bodyA.m_contactList.prev = contact.m_nodeA;\n }\n bodyA.m_contactList = contact.m_nodeA;\n\n // Connect to body B\n contact.m_nodeB.contact = contact;\n contact.m_nodeB.other = bodyA;\n\n contact.m_nodeB.prev = null;\n contact.m_nodeB.next = bodyB.m_contactList;\n if (bodyB.m_contactList != null) {\n bodyB.m_contactList.prev = contact.m_nodeB;\n }\n bodyB.m_contactList = contact.m_nodeB;\n\n // Wake up the bodies\n if (fixtureA.isSensor() == false && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n return contact;\n }\n\n /**\n * @internal\n */\n static destroy(contact: Contact, listener: { endContact: (contact: Contact) => void }): void {\n const fixtureA = contact.m_fixtureA;\n const fixtureB = contact.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n if (contact.isTouching()) {\n listener.endContact(contact);\n }\n\n // Remove from body 1\n if (contact.m_nodeA.prev) {\n contact.m_nodeA.prev.next = contact.m_nodeA.next;\n }\n\n if (contact.m_nodeA.next) {\n contact.m_nodeA.next.prev = contact.m_nodeA.prev;\n }\n\n if (contact.m_nodeA == bodyA.m_contactList) {\n bodyA.m_contactList = contact.m_nodeA.next;\n }\n\n // Remove from body 2\n if (contact.m_nodeB.prev) {\n contact.m_nodeB.prev.next = contact.m_nodeB.next;\n }\n\n if (contact.m_nodeB.next) {\n contact.m_nodeB.next.prev = contact.m_nodeB.prev;\n }\n\n if (contact.m_nodeB == bodyB.m_contactList) {\n bodyB.m_contactList = contact.m_nodeB.next;\n }\n\n if (contact.m_manifold.pointCount > 0 && fixtureA.isSensor() == false\n && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // const destroyFcn = s_registers[typeA][typeB].destroyFcn;\n // if (typeof destroyFcn === 'function') {\n // destroyFcn(contact);\n // }\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport type Vec2 from '../common/Vec2';\nimport type Body from './Body';\nimport { TimeStep } from \"./Solver\";\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n/**\n * A joint edge is used to connect bodies and joints together in a joint graph\n * where each body is a node and each joint is an edge. A joint edge belongs to\n * a doubly linked list maintained in each attached body. Each joint has two\n * joint nodes, one for each attached body.\n */\nexport class JointEdge {\n /**\n * provides quick access to the other body attached.\n */\n other: Body | null = null;\n /**\n * the joint\n */\n joint: Joint | null = null;\n /**\n * prev the previous joint edge in the body's joint list\n */\n prev: JointEdge | null = null;\n /**\n * the next joint edge in the body's joint list\n */\n next: JointEdge | null = null;\n}\n\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointOpt {\n /**\n * Use this to attach application specific data to your joints.\n */\n userData?: any;\n /**\n * Set this flag to true if the attached bodies\n * should collide.\n */\n collideConnected?: boolean;\n}\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointDef extends JointOpt {\n /**\n * The first attached body.\n */\n bodyA: Body;\n /**\n * The second attached body.\n */\n bodyB: Body;\n}\n\nconst DEFAULTS = {\n userData : null,\n collideConnected : false\n};\n\n/**\n * The base joint class. Joints are used to constraint two bodies together in\n * various fashions. Some joints also feature limits and motors.\n */\nexport default abstract class Joint {\n\n /** @internal */ m_type: string = 'unknown-joint';\n\n /** @internal */ m_bodyA: Body;\n /** @internal */ m_bodyB: Body;\n\n /** @internal */ m_collideConnected: boolean;\n\n /** @internal */ m_prev: Joint | null = null;\n /** @internal */ m_next: Joint | null = null;\n\n /** @internal */ m_edgeA: JointEdge = new JointEdge();\n /** @internal */ m_edgeB: JointEdge = new JointEdge();\n\n /** @internal */ m_islandFlag: boolean = false;\n /** @internal */ m_userData: unknown;\n\n constructor(def: JointDef);\n constructor(def: JointOpt, bodyA: Body, bodyB: Body);\n constructor(def: JointDef | JointOpt, bodyA?: Body, bodyB?: Body) {\n bodyA = 'bodyA' in def ? def.bodyA : bodyA;\n bodyB = 'bodyB' in def ? def.bodyB : bodyB;\n\n _ASSERT && common.assert(!!bodyA);\n _ASSERT && common.assert(!!bodyB);\n _ASSERT && common.assert(bodyA != bodyB);\n\n this.m_bodyA = bodyA!;\n this.m_bodyB = bodyB!;\n\n this.m_collideConnected = !!def.collideConnected;\n this.m_userData = def.userData;\n }\n\n /**\n * Short-cut function to determine if either body is inactive.\n */\n isActive(): boolean {\n return this.m_bodyA.isActive() && this.m_bodyB.isActive();\n }\n\n /**\n * Get the type of the concrete joint.\n */\n getType(): string {\n return this.m_type;\n }\n\n /**\n * Get the first body attached to this joint.\n */\n getBodyA(): Body {\n return this.m_bodyA;\n }\n\n /**\n * Get the second body attached to this joint.\n */\n getBodyB(): Body {\n return this.m_bodyB;\n }\n\n /**\n * Get the next joint the world joint list.\n */\n getNext(): Joint {\n return this.m_next;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get collide connected. Note: modifying the collide connect flag won't work\n * correctly because the flag is only checked when fixture AABBs begin to\n * overlap.\n */\n getCollideConnected(): boolean {\n return this.m_collideConnected;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n abstract getAnchorA(): Vec2;\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n abstract getAnchorB(): Vec2;\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n abstract getReactionForce(inv_dt: number): Vec2;\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n abstract getReactionTorque(inv_dt: number): number;\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2): void {}\n\n abstract initVelocityConstraints(step: TimeStep): void;\n\n abstract solveVelocityConstraints(step: TimeStep): void;\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n abstract solvePositionConstraints(step: TimeStep): boolean;\n\n}\n","export const now = function(): number {\n return Date.now();\n};\n\nexport const diff = function(time: number): number {\n return Date.now() - time;\n};\n\nexport default {\n now,\n diff,\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../Settings';\n\nimport common from '../util/common';\nimport stats from '../util/stats';\nimport Timer from '../util/Timer';\n\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\nimport Rot from '../common/Rot';\nimport Sweep from '../common/Sweep';\nimport Transform from '../common/Transform';\n\nimport Distance, { DistanceInput, DistanceOutput, DistanceProxy, SimplexCache } from './Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Input parameters for TimeOfImpact.\n */\nexport class TOIInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n sweepA: Sweep = new Sweep();\n sweepB: Sweep = new Sweep();\n /** defines sweep interval [0, tMax] */\n tMax: number | undefined;\n}\n\nexport enum TOIOutputState {\n e_unknown = 0,\n e_failed = 1,\n e_overlapped = 2,\n e_touching = 3,\n e_separated = 4,\n}\n\n/**\n * Output parameters for TimeOfImpact.\n */\nexport class TOIOutput {\n state: TOIOutputState | undefined;\n t: number | undefined;\n}\n\nstats.toiTime = 0;\nstats.toiMaxTime = 0;\nstats.toiCalls = 0;\nstats.toiIters = 0;\nstats.toiMaxIters = 0;\nstats.toiRootIters = 0;\nstats.toiMaxRootIters = 0;\n\n/**\n * Compute the upper bound on time before two shapes penetrate. Time is\n * represented as a fraction between [0,tMax]. This uses a swept separating axis\n * and may miss some intermediate, non-tunneling collision. If you change the\n * time interval, you should call this function again.\n *\n * Note: use Distance to compute the contact point and normal at the time of\n * impact.\n *\n * CCD via the local separating axis method. This seeks progression by computing\n * the largest time at which separation is maintained.\n */\nexport default function TimeOfImpact(output: TOIOutput, input: TOIInput): void {\n const timer = Timer.now();\n\n ++stats.toiCalls;\n\n output.state = TOIOutputState.e_unknown;\n output.t = input.tMax;\n\n const proxyA = input.proxyA; // DistanceProxy\n const proxyB = input.proxyB; // DistanceProxy\n\n const sweepA = input.sweepA; // Sweep\n const sweepB = input.sweepB; // Sweep\n\n // Large rotations can make the root finder fail, so we normalize the\n // sweep angles.\n sweepA.normalize();\n sweepB.normalize();\n\n const tMax = input.tMax;\n\n const totalRadius = proxyA.m_radius + proxyB.m_radius;\n const target = Math.max(Settings.linearSlop, totalRadius - 3.0 * Settings.linearSlop);\n const tolerance = 0.25 * Settings.linearSlop;\n _ASSERT && common.assert(target > tolerance);\n\n let t1 = 0.0;\n const k_maxIterations = Settings.maxTOIIterations;\n let iter = 0;\n\n // Prepare input for distance query.\n const cache = new SimplexCache();\n\n const distanceInput = new DistanceInput();\n distanceInput.proxyA = input.proxyA;\n distanceInput.proxyB = input.proxyB;\n distanceInput.useRadii = false;\n\n // The outer loop progressively attempts to compute new separating axes.\n // This loop terminates when an axis is repeated (no progress is made).\n while (true) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n sweepA.getTransform(xfA, t1);\n sweepB.getTransform(xfB, t1);\n\n // Get the distance between shapes. We can also use the results\n // to get a separating axis.\n distanceInput.transformA = xfA;\n distanceInput.transformB = xfB;\n const distanceOutput = new DistanceOutput();\n Distance(distanceOutput, cache, distanceInput);\n\n // If the shapes are overlapped, we give up on continuous collision.\n if (distanceOutput.distance <= 0.0) {\n // Failure!\n output.state = TOIOutputState.e_overlapped;\n output.t = 0.0;\n break;\n }\n\n if (distanceOutput.distance < target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n break;\n }\n\n // Initialize the separating axis.\n const fcn = new SeparationFunction();\n fcn.initialize(cache, proxyA, sweepA, proxyB, sweepB, t1);\n\n // if (false) {\n // // Dump the curve seen by the root finder\n // const N = 100;\n // const dx = 1.0 / N;\n // const xs = []; // [ N + 1 ];\n // const fs = []; // [ N + 1 ];\n // const x = 0.0;\n // for (const i = 0; i <= N; ++i) {\n // sweepA.getTransform(xfA, x);\n // sweepB.getTransform(xfB, x);\n // const f = fcn.evaluate(xfA, xfB) - target;\n // printf(\"%g %g\\n\", x, f);\n // xs[i] = x;\n // fs[i] = f;\n // x += dx;\n // }\n // }\n\n // Compute the TOI on the separating axis. We do this by successively\n // resolving the deepest point. This loop is bounded by the number of\n // vertices.\n let done = false;\n let t2 = tMax;\n let pushBackIter = 0;\n while (true) {\n // Find the deepest point at t2. Store the witness point indices.\n let s2 = fcn.findMinSeparation(t2);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Is the final configuration separated?\n if (s2 > target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_separated;\n output.t = tMax;\n done = true;\n break;\n }\n\n // Has the separation reached tolerance?\n if (s2 > target - tolerance) {\n // Advance the sweeps\n t1 = t2;\n break;\n }\n\n // Compute the initial separation of the witness points.\n let s1 = fcn.evaluate(t1);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Check for initial overlap. This might happen if the root finder\n // runs out of iterations.\n if (s1 < target - tolerance) {\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n done = true;\n break;\n }\n\n // Check for touching\n if (s1 <= target + tolerance) {\n // Victory! t1 should hold the TOI (could be 0.0).\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n done = true;\n break;\n }\n\n // Compute 1D root of: f(x) - target = 0\n let rootIterCount = 0;\n let a1 = t1;\n let a2 = t2;\n while (true) {\n // Use a mix of the secant rule and bisection.\n let t;\n if (rootIterCount & 1) {\n // Secant rule to improve convergence.\n t = a1 + (target - s1) * (a2 - a1) / (s2 - s1);\n } else {\n // Bisection to guarantee progress.\n t = 0.5 * (a1 + a2);\n }\n\n ++rootIterCount;\n ++stats.toiRootIters;\n\n const s = fcn.evaluate(t);\n const indexA = fcn.indexA;\n const indexB = fcn.indexB;\n\n if (Math.abs(s - target) < tolerance) {\n // t2 holds a tentative value for t1\n t2 = t;\n break;\n }\n\n // Ensure we continue to bracket the root.\n if (s > target) {\n a1 = t;\n s1 = s;\n } else {\n a2 = t;\n s2 = s;\n }\n\n if (rootIterCount === 50) {\n break;\n }\n }\n\n stats.toiMaxRootIters = Math.max(stats.toiMaxRootIters, rootIterCount);\n\n ++pushBackIter;\n\n if (pushBackIter === Settings.maxPolygonVertices) {\n break;\n }\n }\n\n ++iter;\n ++stats.toiIters;\n\n if (done) {\n break;\n }\n\n if (iter === k_maxIterations) {\n // Root finder got stuck. Semi-victory.\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n break;\n }\n }\n\n stats.toiMaxIters = Math.max(stats.toiMaxIters, iter);\n\n const time = Timer.diff(timer);\n stats.toiMaxTime = Math.max(stats.toiMaxTime, time);\n stats.toiTime += time;\n}\n\nenum SeparationFunctionType {\n e_points = 1,\n e_faceA = 2,\n e_faceB = 3,\n}\n\nclass SeparationFunction {\n m_proxyA: DistanceProxy = new DistanceProxy();\n m_proxyB: DistanceProxy = new DistanceProxy();\n m_sweepA: Sweep;\n m_sweepB: Sweep;\n indexA: number;\n indexB: number;\n m_type: SeparationFunctionType;\n m_localPoint: Vec2 = Vec2.zero();\n m_axis: Vec2 = Vec2.zero();\n\n // TODO_ERIN might not need to return the separation\n\n initialize(cache: SimplexCache, proxyA: DistanceProxy, sweepA: Sweep, proxyB: DistanceProxy, sweepB: Sweep, t1: number): number {\n this.m_proxyA = proxyA;\n this.m_proxyB = proxyB;\n const count = cache.count;\n _ASSERT && common.assert(0 < count && count < 3);\n\n this.m_sweepA = sweepA;\n this.m_sweepB = sweepB;\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t1);\n this.m_sweepB.getTransform(xfB, t1);\n\n if (count === 1) {\n this.m_type = SeparationFunctionType.e_points;\n const localPointA = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n this.m_axis.setCombine(1, pointB, -1, pointA);\n const s = this.m_axis.normalize();\n return s;\n\n } else if (cache.indexA[0] === cache.indexA[1]) {\n // Two points on B and one on A.\n this.m_type = SeparationFunctionType.e_faceB;\n const localPointB1 = proxyB.getVertex(cache.indexB[0]);\n const localPointB2 = proxyB.getVertex(cache.indexB[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointB2, localPointB1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointB1, localPointB2);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n const localPointA = proxyA.getVertex(cache.indexA[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n let s = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n\n } else {\n // Two points on A and one or two points on B.\n this.m_type = SeparationFunctionType.e_faceA;\n const localPointA1 = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointA2 = this.m_proxyA.getVertex(cache.indexA[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointA2, localPointA1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointA1, localPointA2);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n let s = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n }\n }\n\n compute(find: boolean, t: number): number {\n // It was findMinSeparation and evaluate\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t);\n this.m_sweepB.getTransform(xfB, t);\n\n switch (this.m_type) {\n case SeparationFunctionType.e_points: {\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, this.m_axis);\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(this.m_axis));\n\n this.indexA = this.m_proxyA.getSupport(axisA);\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, this.m_axis) - Vec2.dot(pointA, this.m_axis);\n return sep;\n }\n\n case SeparationFunctionType.e_faceA: {\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n if (find) {\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(normal));\n\n this.indexA = -1;\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n return sep;\n }\n\n case SeparationFunctionType.e_faceB: {\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, Vec2.neg(normal));\n\n this.indexB = -1;\n this.indexA = this.m_proxyA.getSupport(axisA);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n const sep = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n return sep;\n }\n\n default:\n _ASSERT && common.assert(false);\n if (find) {\n this.indexA = -1;\n this.indexB = -1;\n }\n return 0.0;\n }\n }\n\n findMinSeparation(t: number): number {\n return this.compute(true, t);\n }\n\n evaluate(t: number): number {\n return this.compute(false, t);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../Settings';\nimport common from '../util/common';\nimport Vec2 from '../common/Vec2';\nimport Math from '../common/Math';\nimport Body from './Body';\nimport Contact from './Contact';\nimport Joint from './Joint';\nimport TimeOfImpact, { TOIInput, TOIOutput, TOIOutputState } from '../collision/TimeOfImpact';\nimport Distance, { DistanceInput, DistanceOutput, SimplexCache } from '../collision/Distance';\nimport World from \"./World\";\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport class TimeStep {\n /** time step */\n dt: number = 0;\n /** inverse time step (0 if dt == 0) */\n inv_dt: number = 0;\n velocityIterations: number = 0;\n positionIterations: number = 0;\n warmStarting: boolean = false;\n blockSolve: boolean = true;\n\n /** timestep ratio for variable timestep */\n inv_dt0: number = 0.0;\n /** dt * inv_dt0 */\n dtRatio: number = 1;\n\n reset(dt: number): void {\n if (this.dt > 0.0) {\n this.inv_dt0 = this.inv_dt;\n }\n this.dt = dt;\n this.inv_dt = dt == 0 ? 0 : 1 / dt;\n this.dtRatio = dt * this.inv_dt0;\n }\n}\n\n// reuse\nconst s_subStep = new TimeStep();\n\n/**\n * Contact impulses for reporting. Impulses are used instead of forces because\n * sub-step forces may approach infinity for rigid body collisions. These match\n * up one-to-one with the contact points in Manifold.\n */\nexport class ContactImpulse {\n // TODO: merge with Contact class?\n\n private readonly contact: Contact;\n private readonly normals: number[];\n private readonly tangents: number[];\n\n constructor(contact: Contact) {\n this.contact = contact;\n this.normals = [];\n this.tangents = [];\n }\n\n get normalImpulses(): number[] {\n const contact = this.contact;\n const normals = this.normals;\n normals.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n normals.push(contact.v_points[p].normalImpulse);\n }\n return normals;\n }\n\n get tangentImpulses(): number[] {\n const contact = this.contact;\n const tangents = this.tangents;\n tangents.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n tangents.push(contact.v_points[p].tangentImpulse);\n }\n return tangents;\n }\n}\n\n/**\n * Finds and solves islands. An island is a connected subset of the world.\n */\nexport default class Solver {\n m_world: World;\n m_stack: Body[];\n m_bodies: Body[];\n m_contacts: Contact[];\n m_joints: Joint[];\n\n constructor(world: World) {\n this.m_world = world;\n this.m_stack = [];\n this.m_bodies = [];\n this.m_contacts = [];\n this.m_joints = [];\n }\n\n clear(): void {\n this.m_stack.length = 0;\n this.m_bodies.length = 0;\n this.m_contacts.length = 0;\n this.m_joints.length = 0;\n }\n\n addBody(body: Body): void {\n _ASSERT && common.assert(body instanceof Body, 'Not a Body!', body);\n this.m_bodies.push(body);\n // why?\n // body.c_position.c.setZero();\n // body.c_position.a = 0;\n // body.c_velocity.v.setZero();\n // body.c_velocity.w = 0;\n }\n\n addContact(contact: Contact): void {\n _ASSERT && common.assert(contact instanceof Contact, 'Not a Contact!', contact);\n this.m_contacts.push(contact);\n }\n\n addJoint(joint: Joint): void {\n _ASSERT && common.assert(joint instanceof Joint, 'Not a Joint!', joint);\n this.m_joints.push(joint);\n }\n\n solveWorld(step: TimeStep): void {\n const world = this.m_world;\n\n // Clear all the island flags.\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n }\n for (let c = world.m_contactList; c; c = c.m_next) {\n c.m_islandFlag = false;\n }\n for (let j = world.m_jointList; j; j = j.m_next) {\n j.m_islandFlag = false;\n }\n\n // Build and simulate all awake islands.\n const stack = this.m_stack;\n let loop = -1;\n for (let seed = world.m_bodyList; seed; seed = seed.m_next) {\n loop++;\n if (seed.m_islandFlag) {\n continue;\n }\n\n if (seed.isAwake() == false || seed.isActive() == false) {\n continue;\n }\n\n // The seed can be dynamic or kinematic.\n if (seed.isStatic()) {\n continue;\n }\n\n // Reset island and stack.\n this.clear();\n\n stack.push(seed);\n\n seed.m_islandFlag = true;\n\n // Perform a depth first search (DFS) on the constraint graph.\n while (stack.length > 0) {\n // Grab the next body off the stack and add it to the island.\n const b = stack.pop();\n _ASSERT && common.assert(b.isActive() == true);\n this.addBody(b);\n\n // Make sure the body is awake.\n b.setAwake(true);\n\n // To keep islands as small as possible, we don't\n // propagate islands across static bodies.\n if (b.isStatic()) {\n continue;\n }\n\n // Search all contacts connected to this body.\n for (let ce = b.m_contactList; ce; ce = ce.next) {\n const contact = ce.contact;\n\n // Has this contact already been added to an island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Is this contact solid and touching?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n this.addContact(contact);\n contact.m_islandFlag = true;\n\n const other = ce.other;\n\n // Was the other body already added to this island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && common.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n\n // Search all joints connect to this body.\n for (let je = b.m_jointList; je; je = je.next) {\n if (je.joint.m_islandFlag == true) {\n continue;\n }\n\n const other = je.other;\n\n // Don't simulate joints connected to inactive bodies.\n if (other.isActive() == false) {\n continue;\n }\n\n this.addJoint(je.joint);\n je.joint.m_islandFlag = true;\n\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && common.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n }\n\n this.solveIsland(step);\n\n // Post solve cleanup.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n // Allow static bodies to participate in other islands.\n // TODO: are they added at all?\n const b = this.m_bodies[i];\n if (b.isStatic()) {\n b.m_islandFlag = false;\n }\n }\n }\n }\n\n solveIsland(step: TimeStep): void {\n // B2: Island Solve\n const world = this.m_world;\n const gravity = world.m_gravity;\n const allowSleep = world.m_allowSleep;\n\n const h = step.dt;\n\n // Integrate velocities and apply damping. Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.m_sweep.c);\n const a = body.m_sweep.a;\n const v = Vec2.clone(body.m_linearVelocity);\n let w = body.m_angularVelocity;\n\n // Store positions for continuous collision.\n body.m_sweep.c0.setVec2(body.m_sweep.c);\n body.m_sweep.a0 = body.m_sweep.a;\n\n if (body.isDynamic()) {\n // Integrate velocities.\n v.addMul(h * body.m_gravityScale, gravity);\n v.addMul(h * body.m_invMass, body.m_force);\n w += h * body.m_invI * body.m_torque;\n /**\n *
\n         * Apply damping.\n         * ODE: dv/dt + c * v = 0\n         * Solution: v(t) = v0 * exp(-c * t)\n         * Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)\n         * v2 = exp(-c * dt) * v1\n         * Pade approximation:\n         * v2 = v1 * 1 / (1 + c * dt)\n         * 
\n */\n v.mul(1.0 / (1.0 + h * body.m_linearDamping));\n w *= 1.0 / (1.0 + h * body.m_angularDamping);\n }\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(step);\n }\n\n _DEBUG && this.printBodies('M: ');\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(step);\n }\n\n _DEBUG && this.printBodies('R: ');\n\n if (step.warmStarting) {\n // Warm start.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.warmStartConstraint(step);\n }\n }\n\n _DEBUG && this.printBodies('Q: ');\n\n for (let i = 0; i < this.m_joints.length; ++i) {\n const joint = this.m_joints[i];\n joint.initVelocityConstraints(step);\n }\n\n _DEBUG && this.printBodies('E: ');\n\n // Solve velocity constraints\n for (let i = 0; i < step.velocityIterations; ++i) {\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n joint.solveVelocityConstraints(step);\n }\n\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(step);\n }\n }\n\n _DEBUG && this.printBodies('D: ');\n\n // Store impulses for warm starting\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.storeConstraintImpulses(step);\n }\n\n _DEBUG && this.printBodies('C: ');\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.lengthSquared(translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c.setVec2(c);\n body.c_position.a = a;\n body.c_velocity.v.setVec2(v);\n body.c_velocity.w = w;\n }\n\n _DEBUG && this.printBodies('B: ');\n\n // Solve position constraints\n let positionSolved = false;\n for (let i = 0; i < step.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraint(step);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -3.0 * Settings.linearSlop;\n\n let jointsOkay = true;\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n const jointOkay = joint.solvePositionConstraints(step);\n jointsOkay = jointsOkay && jointOkay;\n }\n\n if (contactsOkay && jointsOkay) {\n // Exit early if the position errors are small.\n positionSolved = true;\n break;\n }\n }\n\n _DEBUG && this.printBodies('L: ');\n\n // Copy state buffers back to the bodies\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n body.m_sweep.c.setVec2(body.c_position.c);\n body.m_sweep.a = body.c_position.a;\n body.m_linearVelocity.setVec2(body.c_velocity.v);\n body.m_angularVelocity = body.c_velocity.w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n\n if (allowSleep) {\n let minSleepTime = Infinity;\n\n const linTolSqr = Settings.linearSleepToleranceSqr;\n const angTolSqr = Settings.angularSleepToleranceSqr;\n\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n if (body.isStatic()) {\n continue;\n }\n\n if ((body.m_autoSleepFlag == false)\n || (body.m_angularVelocity * body.m_angularVelocity > angTolSqr)\n || (Vec2.lengthSquared(body.m_linearVelocity) > linTolSqr)) {\n body.m_sleepTime = 0.0;\n minSleepTime = 0.0;\n } else {\n body.m_sleepTime += h;\n minSleepTime = Math.min(minSleepTime, body.m_sleepTime);\n }\n }\n\n if (minSleepTime >= Settings.timeToSleep && positionSolved) {\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.setAwake(false);\n }\n }\n }\n }\n\n /** @internal */\n printBodies(tag: string): void {\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const b = this.m_bodies[i];\n common.debug(tag, b.c_position.a, b.c_position.c.x, b.c_position.c.y, b.c_velocity.w, b.c_velocity.v.x, b.c_velocity.v.y);\n }\n }\n\n /**\n * Find TOI contacts and solve them.\n */\n solveWorldTOI(step: TimeStep): void {\n const world = this.m_world;\n\n if (world.m_stepComplete) {\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n b.m_sweep.alpha0 = 0.0;\n }\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Invalidate TOI\n c.m_toiFlag = false;\n c.m_islandFlag = false;\n c.m_toiCount = 0;\n c.m_toi = 1.0;\n }\n }\n\n // Find TOI events and solve them.\n while (true) {\n // Find the first TOI.\n let minContact = null; // Contact\n let minAlpha = 1.0;\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Is this contact disabled?\n if (c.isEnabled() == false) {\n continue;\n }\n\n // Prevent excessive sub-stepping.\n if (c.m_toiCount > Settings.maxSubSteps) {\n continue;\n }\n\n let alpha = 1.0;\n if (c.m_toiFlag) {\n // This contact has a valid cached TOI.\n alpha = c.m_toi;\n } else {\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n // Is there a sensor?\n if (fA.isSensor() || fB.isSensor()) {\n continue;\n }\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n _ASSERT && common.assert(bA.isDynamic() || bB.isDynamic());\n\n const activeA = bA.isAwake() && !bA.isStatic();\n const activeB = bB.isAwake() && !bB.isStatic();\n\n // Is at least one body active (awake and dynamic or kinematic)?\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const collideA = bA.isBullet() || !bA.isDynamic();\n const collideB = bB.isBullet() || !bB.isDynamic();\n\n // Are these two non-bullet dynamic bodies?\n if (collideA == false && collideB == false) {\n continue;\n }\n\n // Compute the TOI for this contact.\n // Put the sweeps onto the same time interval.\n let alpha0 = bA.m_sweep.alpha0;\n\n if (bA.m_sweep.alpha0 < bB.m_sweep.alpha0) {\n alpha0 = bB.m_sweep.alpha0;\n bA.m_sweep.advance(alpha0);\n } else if (bB.m_sweep.alpha0 < bA.m_sweep.alpha0) {\n alpha0 = bA.m_sweep.alpha0;\n bB.m_sweep.advance(alpha0);\n }\n\n _ASSERT && common.assert(alpha0 < 1.0);\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const sweepA = bA.m_sweep;\n const sweepB = bB.m_sweep;\n\n // Compute the time of impact in interval [0, minTOI]\n const input = new TOIInput(); // TODO: reuse\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.sweepA.set(bA.m_sweep);\n input.sweepB.set(bB.m_sweep);\n input.tMax = 1.0;\n\n const output = new TOIOutput(); // TODO: reuse\n TimeOfImpact(output, input);\n\n // Beta is the fraction of the remaining portion of the [time?].\n const beta = output.t;\n if (output.state == TOIOutputState.e_touching) {\n alpha = Math.min(alpha0 + (1.0 - alpha0) * beta, 1.0);\n } else {\n alpha = 1.0;\n }\n\n c.m_toi = alpha;\n c.m_toiFlag = true;\n }\n\n if (alpha < minAlpha) {\n // This is the minimum TOI found so far.\n minContact = c;\n minAlpha = alpha;\n }\n }\n\n if (minContact == null || 1.0 - 10.0 * Math.EPSILON < minAlpha) {\n // No more TOI events. Done!\n world.m_stepComplete = true;\n break;\n }\n\n // Advance the bodies to the TOI.\n const fA = minContact.getFixtureA();\n const fB = minContact.getFixtureB();\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const backup1 = bA.m_sweep.clone();\n const backup2 = bB.m_sweep.clone();\n\n bA.advance(minAlpha);\n bB.advance(minAlpha);\n\n // The TOI contact likely has some new contact points.\n minContact.update(world);\n minContact.m_toiFlag = false;\n ++minContact.m_toiCount;\n\n // Is the contact solid?\n if (minContact.isEnabled() == false || minContact.isTouching() == false) {\n // Restore the sweeps.\n minContact.setEnabled(false);\n bA.m_sweep.set(backup1);\n bB.m_sweep.set(backup2);\n bA.synchronizeTransform();\n bB.synchronizeTransform();\n continue;\n }\n\n bA.setAwake(true);\n bB.setAwake(true);\n\n // Build the island\n this.clear();\n this.addBody(bA);\n this.addBody(bB);\n this.addContact(minContact);\n\n bA.m_islandFlag = true;\n bB.m_islandFlag = true;\n minContact.m_islandFlag = true;\n\n // Get contacts on bodyA and bodyB.\n const bodies = [ bA, bB ];\n for (let i = 0; i < bodies.length; ++i) {\n const body = bodies[i];\n if (body.isDynamic()) {\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n // if (this.m_bodyCount == this.m_bodyCapacity) { break; }\n // if (this.m_contactCount == this.m_contactCapacity) { break; }\n\n const contact = ce.contact;\n\n // Has this contact already been added to the island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Only add if either is static, kinematic or bullet.\n const other = ce.other;\n if (other.isDynamic() && !body.isBullet() && !other.isBullet()) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n // Tentatively advance the body to the TOI.\n const backup = other.m_sweep.clone();\n if (other.m_islandFlag == false) {\n other.advance(minAlpha);\n }\n\n // Update the contact points\n contact.update(world);\n\n // Was the contact disabled by the user?\n // Are there contact points?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n other.m_sweep.set(backup);\n other.synchronizeTransform();\n continue;\n }\n\n // Add the contact to the island\n contact.m_islandFlag = true;\n this.addContact(contact);\n\n // Has the other body already been added to the island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // Add the other body to the island.\n other.m_islandFlag = true;\n\n if (!other.isStatic()) {\n other.setAwake(true);\n }\n\n this.addBody(other);\n }\n }\n }\n\n s_subStep.reset((1.0 - minAlpha) * step.dt);\n s_subStep.dtRatio = 1.0;\n s_subStep.positionIterations = 20;\n s_subStep.velocityIterations = step.velocityIterations;\n s_subStep.warmStarting = false;\n\n this.solveIslandTOI(s_subStep, bA, bB);\n\n // Reset island flags and synchronize broad-phase proxies.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.m_islandFlag = false;\n\n if (!body.isDynamic()) {\n continue;\n }\n\n body.synchronizeFixtures();\n\n // Invalidate all contact TOIs on this displaced body.\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n ce.contact.m_toiFlag = false;\n ce.contact.m_islandFlag = false;\n }\n }\n\n // Commit fixture proxy movements to the broad-phase so that new contacts\n // are created.\n // Also, some contacts can be destroyed.\n world.findNewContacts();\n\n if (world.m_subStepping) {\n world.m_stepComplete = false;\n break;\n }\n }\n\n if (_DEBUG) for (let b = world.m_bodyList; b; b = b.m_next) {\n const c = b.m_sweep.c;\n const a = b.m_sweep.a;\n const v = b.m_linearVelocity;\n const w = b.m_angularVelocity;\n }\n }\n\n solveIslandTOI(subStep: TimeStep, toiA: Body, toiB: Body): void {\n const world = this.m_world;\n\n // Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.c_position.c.setVec2(body.m_sweep.c);\n body.c_position.a = body.m_sweep.a;\n body.c_velocity.v.setVec2(body.m_linearVelocity);\n body.c_velocity.w = body.m_angularVelocity;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(subStep);\n }\n\n // Solve position constraints.\n for (let i = 0; i < subStep.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraintTOI(subStep, toiA, toiB);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -1.5 * Settings.linearSlop;\n if (contactsOkay) {\n break;\n }\n }\n\n if (false) {\n // Is the new position really safe?\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const c = this.m_contacts[i];\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const input = new DistanceInput();\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.transformA = bA.getTransform();\n input.transformB = bB.getTransform();\n input.useRadii = false;\n\n const output = new DistanceOutput();\n const cache = new SimplexCache();\n Distance(output, cache, input);\n\n if (output.distance == 0 || cache.count == 3) {\n cache.count += 0;\n }\n }\n }\n\n // Leap of faith to new safe state.\n toiA.m_sweep.c0.setVec2(toiA.c_position.c);\n toiA.m_sweep.a0 = toiA.c_position.a;\n toiB.m_sweep.c0.setVec2(toiB.c_position.c);\n toiB.m_sweep.a0 = toiB.c_position.a;\n\n // No warm starting is needed for TOI events because warm\n // starting impulses were applied in the discrete solver.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(subStep);\n }\n\n // Solve velocity constraints.\n for (let i = 0; i < subStep.velocityIterations; ++i) {\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(subStep);\n }\n }\n\n // Don't store the TOI contact forces for warm starting\n // because they can be quite large.\n\n const h = subStep.dt;\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.dot(translation, translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n\n // Sync bodies\n body.m_sweep.c = c;\n body.m_sweep.a = a;\n body.m_linearVelocity = v;\n body.m_angularVelocity = w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n }\n\n /** @internal */\n postSolveIsland(): void {\n for (let c = 0; c < this.m_contacts.length; ++c) {\n const contact = this.m_contacts[c];\n this.m_world.postSolve(contact, contact.m_impulse);\n }\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../util/options';\nimport common from '../util/common';\nimport Vec2 from '../common/Vec2';\nimport BroadPhase from '../collision/BroadPhase';\nimport Solver, { ContactImpulse, TimeStep } from './Solver';\nimport Body, { BodyDef } from './Body';\nimport Joint from './Joint';\nimport Contact from './Contact';\nimport AABB, { RayCastInput, RayCastOutput } from \"../collision/AABB\";\nimport Fixture, { FixtureProxy } from \"./Fixture\";\nimport Manifold from \"../collision/Manifold\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * @prop gravity [{ x : 0, y : 0}]\n * @prop allowSleep [true]\n * @prop warmStarting [true]\n * @prop continuousPhysics [true]\n * @prop subStepping [false]\n * @prop blockSolve [true]\n * @prop velocityIterations [8] For the velocity constraint solver.\n * @prop positionIterations [3] For the position constraint solver.\n */\nexport interface WorldDef {\n gravity?: Vec2;\n allowSleep?: boolean;\n warmStarting?: boolean;\n continuousPhysics?: boolean;\n subStepping?: boolean;\n blockSolve?: boolean;\n velocityIterations?: number;\n positionIterations?: number;\n}\n\nconst WorldDefDefault: WorldDef = {\n gravity : Vec2.zero(),\n allowSleep : true,\n warmStarting : true,\n continuousPhysics : true,\n subStepping : false,\n blockSolve : true,\n velocityIterations : 8,\n positionIterations : 3\n};\n\n/**\n * Callback function for ray casts, see {@link World.rayCast}.\n *\n * Called for each fixture found in the query. You control how the ray cast\n * proceeds by returning a float: return -1: ignore this fixture and continue\n * return 0: terminate the ray cast return fraction: clip the ray to this point\n * return 1: don't clip the ray and continue\n *\n * @param fixture The fixture hit by the ray\n * @param point The point of initial intersection\n * @param normal The normal vector at the point of intersection\n * @param fraction\n *\n * @return -1 to filter, 0 to terminate, fraction to clip the ray for closest hit, 1 to continue\n */\nexport type WorldRayCastCallback = (fixture: Fixture, point: Vec2, normal: Vec2, fraction: number) => number;\n\n/**\n * Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\nexport type WorldAABBQueryCallback = (fixture: Fixture) => boolean;\n\nexport default class World {\n /** @internal */ m_solver: Solver;\n /** @internal */ m_broadPhase: BroadPhase;\n /** @internal */ m_contactList: Contact | null;\n /** @internal */ m_contactCount: number;\n /** @internal */ m_bodyList: Body | null;\n /** @internal */ m_bodyCount: number;\n /** @internal */ m_jointList: Joint | null;\n /** @internal */ m_jointCount: number;\n /** @internal */ m_stepComplete: boolean;\n /** @internal */ m_allowSleep: boolean;\n /** @internal */ m_gravity: Vec2;\n /** @internal */ m_clearForces: boolean;\n /** @internal */ m_newFixture: boolean;\n /** @internal */ m_locked: boolean;\n /** @internal */ m_warmStarting: boolean;\n /** @internal */ m_continuousPhysics: boolean;\n /** @internal */ m_subStepping: boolean;\n /** @internal */ m_blockSolve: boolean;\n /** @internal */ m_velocityIterations: number;\n /** @internal */ m_positionIterations: number;\n /** @internal */ m_t: number;\n\n // TODO\n /** @internal */ _listeners: {\n [key: string]: any[]\n };\n\n /**\n * @param def World definition or gravity vector.\n */\n constructor(def?: WorldDef | Vec2 | null) {\n if (!(this instanceof World)) {\n return new World(def);\n }\n\n if (def && Vec2.isValid(def)) {\n def = { gravity: def as Vec2 };\n }\n\n def = options(def, WorldDefDefault) as WorldDef;\n\n this.m_solver = new Solver(this);\n\n this.m_broadPhase = new BroadPhase();\n\n this.m_contactList = null;\n this.m_contactCount = 0;\n\n this.m_bodyList = null;\n this.m_bodyCount = 0;\n\n this.m_jointList = null;\n this.m_jointCount = 0;\n\n this.m_stepComplete = true;\n\n this.m_allowSleep = def.allowSleep;\n this.m_gravity = Vec2.clone(def.gravity);\n\n this.m_clearForces = true;\n this.m_newFixture = false;\n this.m_locked = false;\n\n // These are for debugging the solver.\n this.m_warmStarting = def.warmStarting;\n this.m_continuousPhysics = def.continuousPhysics;\n this.m_subStepping = def.subStepping;\n\n this.m_blockSolve = def.blockSolve;\n this.m_velocityIterations = def.velocityIterations;\n this.m_positionIterations = def.positionIterations;\n\n this.m_t = 0;\n }\n\n /** @internal */\n _serialize(): object {\n const bodies = [];\n const joints = [];\n\n for (let b = this.getBodyList(); b; b = b.getNext()) {\n bodies.push(b);\n }\n\n for (let j = this.getJointList(); j; j = j.getNext()) {\n // @ts-ignore\n if (typeof j._serialize === 'function') {\n joints.push(j);\n }\n }\n\n return {\n gravity: this.m_gravity,\n bodies,\n joints,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, context: any, restore: any): World {\n if (!data) {\n return new World();\n }\n\n const world = new World(data.gravity);\n\n if (data.bodies) {\n for (let i = data.bodies.length - 1; i >= 0; i -= 1) {\n world._addBody(restore(Body, data.bodies[i], world));\n }\n }\n\n if (data.joints) {\n for (let i = data.joints.length - 1; i >= 0; i--) {\n world.createJoint(restore(Joint, data.joints[i], world));\n }\n }\n\n return world;\n }\n\n /**\n * Get the world body list. With the returned body, use Body.getNext to get the\n * next body in the world list. A null body indicates the end of the list.\n *\n * @return the head of the world body list.\n */\n getBodyList(): Body | null {\n return this.m_bodyList;\n }\n\n /**\n * Get the world joint list. With the returned joint, use Joint.getNext to get\n * the next joint in the world list. A null joint indicates the end of the list.\n *\n * @return the head of the world joint list.\n */\n getJointList(): Joint | null {\n return this.m_jointList;\n }\n\n /**\n * Get the world contact list. With the returned contact, use Contact.getNext to\n * get the next contact in the world list. A null contact indicates the end of\n * the list.\n *\n * Warning: contacts are created and destroyed in the middle of a time step.\n * Use ContactListener to avoid missing contacts.\n *\n * @return the head of the world contact list.\n */\n getContactList(): Contact | null {\n return this.m_contactList;\n }\n\n getBodyCount(): number {\n return this.m_bodyCount;\n }\n\n getJointCount(): number {\n return this.m_jointCount;\n }\n\n /**\n * Get the number of contacts (each may have 0 or more contact points).\n */\n getContactCount(): number {\n return this.m_contactCount;\n }\n\n /**\n * Change the global gravity vector.\n */\n setGravity(gravity: Vec2): void {\n this.m_gravity = gravity;\n }\n\n /**\n * Get the global gravity vector.\n */\n getGravity(): Vec2 {\n return this.m_gravity;\n }\n\n /**\n * Is the world locked (in the middle of a time step).\n */\n isLocked(): boolean {\n return this.m_locked;\n }\n\n /**\n * Enable/disable sleep.\n */\n setAllowSleeping(flag: boolean): void {\n if (flag == this.m_allowSleep) {\n return;\n }\n\n this.m_allowSleep = flag;\n if (this.m_allowSleep == false) {\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.setAwake(true);\n }\n }\n }\n\n getAllowSleeping(): boolean {\n return this.m_allowSleep;\n }\n\n /**\n * Enable/disable warm starting. For testing.\n */\n setWarmStarting(flag: boolean): void {\n this.m_warmStarting = flag;\n }\n\n getWarmStarting(): boolean {\n return this.m_warmStarting;\n }\n\n /**\n * Enable/disable continuous physics. For testing.\n */\n setContinuousPhysics(flag: boolean): void {\n this.m_continuousPhysics = flag;\n }\n\n getContinuousPhysics(): boolean {\n return this.m_continuousPhysics;\n }\n\n /**\n * Enable/disable single stepped continuous physics. For testing.\n */\n setSubStepping(flag: boolean): void {\n this.m_subStepping = flag;\n }\n\n getSubStepping(): boolean {\n return this.m_subStepping;\n }\n\n /**\n * Set flag to control automatic clearing of forces after each time step.\n */\n setAutoClearForces(flag: boolean): void {\n this.m_clearForces = flag;\n }\n\n /**\n * Get the flag that controls automatic clearing of forces after each time step.\n */\n getAutoClearForces(): boolean {\n return this.m_clearForces;\n }\n\n /**\n * Manually clear the force buffer on all bodies. By default, forces are cleared\n * automatically after each call to step. The default behavior is modified by\n * calling setAutoClearForces. The purpose of this function is to support\n * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step\n * under a variable frame-rate. When you perform sub-stepping you will disable\n * auto clearing of forces and instead call clearForces after all sub-steps are\n * complete in one pass of your game loop.\n *\n * See {@link World.setAutoClearForces}\n */\n clearForces(): void {\n for (let body = this.m_bodyList; body; body = body.getNext()) {\n body.m_force.setZero();\n body.m_torque = 0.0;\n }\n }\n\n /**\n * Query the world for all fixtures that potentially overlap the provided AABB.\n *\n * @param aabb The query box.\n * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\n queryAABB(aabb: AABB, callback: WorldAABBQueryCallback): void {\n _ASSERT && common.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n this.m_broadPhase.query(aabb, function(proxyId: number): boolean { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n return callback(proxy.fixture);\n });\n }\n\n /**\n * Ray-cast the world for all fixtures in the path of the ray. Your callback\n * controls whether you get the closest point, any point, or n-points. The\n * ray-cast ignores shapes that contain the starting point.\n *\n * @param point1 The ray starting point\n * @param point2 The ray ending point\n * @param callback A user implemented callback function.\n */\n rayCast(point1: Vec2, point2: Vec2, callback: WorldRayCastCallback): void {\n _ASSERT && common.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n\n this.m_broadPhase.rayCast({\n maxFraction : 1.0,\n p1 : point1,\n p2 : point2\n }, function(input: RayCastInput, proxyId: number): number { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n const fixture = proxy.fixture;\n const index = proxy.childIndex;\n // @ts-ignore\n const output: RayCastOutput = {}; // TODO GC\n const hit = fixture.rayCast(output, input, index);\n if (hit) {\n const fraction = output.fraction;\n const point = Vec2.add(Vec2.mulNumVec2((1.0 - fraction), input.p1), Vec2.mulNumVec2(fraction, input.p2));\n return callback(fixture, point, output.normal, fraction);\n }\n return input.maxFraction;\n });\n }\n\n /**\n * Get the number of broad-phase proxies.\n */\n getProxyCount(): number {\n return this.m_broadPhase.getProxyCount();\n }\n\n /**\n * Get the height of broad-phase dynamic tree.\n */\n getTreeHeight(): number {\n return this.m_broadPhase.getTreeHeight();\n }\n\n /**\n * Get the balance of broad-phase dynamic tree.\n */\n getTreeBalance(): number {\n return this.m_broadPhase.getTreeBalance();\n }\n\n /**\n * Get the quality metric of broad-phase dynamic tree. The smaller the better.\n * The minimum is 1.\n */\n getTreeQuality(): number {\n return this.m_broadPhase.getTreeQuality();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The body shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n _ASSERT && common.assert(this.m_locked == false);\n if (this.m_locked) {\n return;\n }\n\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.m_xf.p.sub(newOrigin);\n b.m_sweep.c0.sub(newOrigin);\n b.m_sweep.c.sub(newOrigin);\n }\n\n for (let j = this.m_jointList; j; j = j.m_next) {\n j.shiftOrigin(newOrigin);\n }\n\n this.m_broadPhase.shiftOrigin(newOrigin);\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addBody(body: Body): void {\n _ASSERT && common.assert(this.isLocked() === false);\n if (this.isLocked()) {\n return;\n }\n\n // Add to world doubly linked list.\n body.m_prev = null;\n body.m_next = this.m_bodyList;\n if (this.m_bodyList) {\n this.m_bodyList.m_prev = body;\n }\n this.m_bodyList = body;\n ++this.m_bodyCount;\n }\n\n /**\n * Create a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This function is locked during callbacks.\n */\n createBody(def?: BodyDef): Body;\n createBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createBody(arg1?, arg2?) {\n _ASSERT && common.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n\n const body = new Body(this, def);\n this._addBody(body);\n return body;\n }\n\n createDynamicBody(def?: BodyDef): Body;\n createDynamicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createDynamicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'dynamic';\n return this.createBody(def);\n }\n\n createKinematicBody(def?: BodyDef): Body;\n createKinematicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createKinematicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'kinematic';\n return this.createBody(def);\n }\n\n /**\n * Destroy a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This automatically deletes all associated shapes and joints.\n *\n * Warning: This function is locked during callbacks.\n */\n destroyBody(b: Body): boolean {\n _ASSERT && common.assert(this.m_bodyCount > 0);\n _ASSERT && common.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n if (b.m_destroyed) {\n return false;\n }\n\n // Delete the attached joints.\n let je = b.m_jointList;\n while (je) {\n const je0 = je;\n je = je.next;\n\n this.publish('remove-joint', je0.joint);\n this.destroyJoint(je0.joint);\n\n b.m_jointList = je;\n }\n b.m_jointList = null;\n\n // Delete the attached contacts.\n let ce = b.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n\n this.destroyContact(ce0.contact);\n\n b.m_contactList = ce;\n }\n b.m_contactList = null;\n\n // Delete the attached fixtures. This destroys broad-phase proxies.\n let f = b.m_fixtureList;\n while (f) {\n const f0 = f;\n f = f.m_next;\n\n this.publish('remove-fixture', f0);\n f0.destroyProxies(this.m_broadPhase);\n\n b.m_fixtureList = f;\n }\n b.m_fixtureList = null;\n\n // Remove world body list.\n if (b.m_prev) {\n b.m_prev.m_next = b.m_next;\n }\n\n if (b.m_next) {\n b.m_next.m_prev = b.m_prev;\n }\n\n if (b == this.m_bodyList) {\n this.m_bodyList = b.m_next;\n }\n\n b.m_destroyed = true;\n\n --this.m_bodyCount;\n\n this.publish('remove-body', b);\n\n return true;\n }\n\n /**\n * Create a joint to constrain bodies together. No reference to the definition\n * is retained. This may cause the connected bodies to cease colliding.\n *\n * Warning: This function is locked during callbacks.\n */\n createJoint(joint: T): T | null {\n _ASSERT && common.assert(!!joint.m_bodyA);\n _ASSERT && common.assert(!!joint.m_bodyB);\n _ASSERT && common.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n // Connect to the world list.\n joint.m_prev = null;\n joint.m_next = this.m_jointList;\n if (this.m_jointList) {\n this.m_jointList.m_prev = joint;\n }\n this.m_jointList = joint;\n ++this.m_jointCount;\n\n // Connect to the bodies' doubly linked lists.\n joint.m_edgeA.joint = joint;\n joint.m_edgeA.other = joint.m_bodyB;\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = joint.m_bodyA.m_jointList;\n if (joint.m_bodyA.m_jointList)\n joint.m_bodyA.m_jointList.prev = joint.m_edgeA;\n joint.m_bodyA.m_jointList = joint.m_edgeA;\n\n joint.m_edgeB.joint = joint;\n joint.m_edgeB.other = joint.m_bodyA;\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = joint.m_bodyB.m_jointList;\n if (joint.m_bodyB.m_jointList)\n joint.m_bodyB.m_jointList.prev = joint.m_edgeB;\n joint.m_bodyB.m_jointList = joint.m_edgeB;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n for (let edge = joint.m_bodyB.getContactList(); edge; edge = edge.next) {\n if (edge.other == joint.m_bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n }\n }\n\n // Note: creating a joint doesn't wake the bodies.\n\n return joint;\n }\n\n /**\n * Destroy a joint. This may cause the connected bodies to begin colliding.\n * Warning: This function is locked during callbacks.\n */\n destroyJoint(joint: Joint): void {\n _ASSERT && common.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n // Remove from the doubly linked list.\n if (joint.m_prev) {\n joint.m_prev.m_next = joint.m_next;\n }\n\n if (joint.m_next) {\n joint.m_next.m_prev = joint.m_prev;\n }\n\n if (joint == this.m_jointList) {\n this.m_jointList = joint.m_next;\n }\n\n // Disconnect from bodies.\n const bodyA = joint.m_bodyA;\n const bodyB = joint.m_bodyB;\n\n // Wake up connected bodies.\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n\n // Remove from body 1.\n if (joint.m_edgeA.prev) {\n joint.m_edgeA.prev.next = joint.m_edgeA.next;\n }\n\n if (joint.m_edgeA.next) {\n joint.m_edgeA.next.prev = joint.m_edgeA.prev;\n }\n\n if (joint.m_edgeA == bodyA.m_jointList) {\n bodyA.m_jointList = joint.m_edgeA.next;\n }\n\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = null;\n\n // Remove from body 2\n if (joint.m_edgeB.prev) {\n joint.m_edgeB.prev.next = joint.m_edgeB.next;\n }\n\n if (joint.m_edgeB.next) {\n joint.m_edgeB.next.prev = joint.m_edgeB.prev;\n }\n\n if (joint.m_edgeB == bodyB.m_jointList) {\n bodyB.m_jointList = joint.m_edgeB.next;\n }\n\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = null;\n\n _ASSERT && common.assert(this.m_jointCount > 0);\n --this.m_jointCount;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n let edge = bodyB.getContactList();\n while (edge) {\n if (edge.other == bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n }\n\n this.publish('remove-joint', joint);\n }\n\n /** @internal */\n s_step: TimeStep = new TimeStep(); // reuse\n\n /**\n * Take a time step. This performs collision detection, integration, and\n * constraint solution.\n *\n * Broad-phase, narrow-phase, solve and solve time of impacts.\n *\n * @param timeStep Time step, this should not vary.\n */\n step(timeStep: number, velocityIterations?: number, positionIterations?: number): void {\n this.publish('pre-step', timeStep);\n\n if ((velocityIterations | 0) !== velocityIterations) {\n // TODO: remove this in future\n velocityIterations = 0;\n }\n\n velocityIterations = velocityIterations || this.m_velocityIterations;\n positionIterations = positionIterations || this.m_positionIterations;\n\n // If new fixtures were added, we need to find the new contacts.\n if (this.m_newFixture) {\n this.findNewContacts();\n this.m_newFixture = false;\n }\n\n this.m_locked = true;\n\n this.s_step.reset(timeStep);\n this.s_step.velocityIterations = velocityIterations;\n this.s_step.positionIterations = positionIterations;\n this.s_step.warmStarting = this.m_warmStarting;\n this.s_step.blockSolve = this.m_blockSolve;\n\n // Update contacts. This is where some contacts are destroyed.\n this.updateContacts();\n\n // Integrate velocities, solve velocity constraints, and integrate positions.\n if (this.m_stepComplete && timeStep > 0.0) {\n this.m_solver.solveWorld(this.s_step);\n\n // Synchronize fixtures, check for out of range bodies.\n for (let b = this.m_bodyList; b; b = b.getNext()) {\n // If a body was not in an island then it did not move.\n if (b.m_islandFlag == false) {\n continue;\n }\n\n if (b.isStatic()) {\n continue;\n }\n\n // Update fixtures (for broad-phase).\n b.synchronizeFixtures();\n }\n // Look for new contacts.\n this.findNewContacts();\n }\n\n // Handle TOI events.\n if (this.m_continuousPhysics && timeStep > 0.0) {\n this.m_solver.solveWorldTOI(this.s_step);\n }\n\n if (this.m_clearForces) {\n this.clearForces();\n }\n\n this.m_locked = false;\n\n this.publish('post-step', timeStep);\n }\n\n /**\n * @internal\n * Call this method to find new contacts.\n */\n findNewContacts(): void {\n this.m_broadPhase.updatePairs(this.createContact);\n }\n\n /**\n * @internal\n * Callback for broad-phase.\n */\n createContact = (proxyA: FixtureProxy, proxyB: FixtureProxy): void => {\n const fixtureA = proxyA.fixture;\n const fixtureB = proxyB.fixture;\n\n const indexA = proxyA.childIndex;\n const indexB = proxyB.childIndex;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Are the fixtures on the same body?\n if (bodyA == bodyB) {\n return;\n }\n\n // TODO_ERIN use a hash table to remove a potential bottleneck when both\n // bodies have a lot of contacts.\n // Does a contact already exist?\n let edge = bodyB.getContactList(); // ContactEdge\n while (edge) {\n if (edge.other == bodyA) {\n const fA = edge.contact.getFixtureA();\n const fB = edge.contact.getFixtureB();\n const iA = edge.contact.getChildIndexA();\n const iB = edge.contact.getChildIndexB();\n\n if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) {\n // A contact already exists.\n return;\n }\n\n if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) {\n // A contact already exists.\n return;\n }\n }\n\n edge = edge.next;\n }\n\n if (bodyB.shouldCollide(bodyA) == false) {\n return;\n }\n if (fixtureB.shouldCollide(fixtureA) == false) {\n return;\n }\n\n // Call the factory.\n const contact = Contact.create(fixtureA, indexA, fixtureB, indexB);\n if (contact == null) {\n return;\n }\n\n // Insert into the world.\n contact.m_prev = null;\n if (this.m_contactList != null) {\n contact.m_next = this.m_contactList;\n this.m_contactList.m_prev = contact;\n }\n this.m_contactList = contact;\n\n ++this.m_contactCount;\n }\n\n /**\n * @internal\n * Removes old non-overlapping contacts, applies filters and updates contacts.\n */\n updateContacts(): void {\n // Update awake contacts.\n let c;\n let next_c = this.m_contactList;\n while (c = next_c) {\n next_c = c.getNext();\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Is this contact flagged for filtering?\n if (c.m_filterFlag) {\n if (bodyB.shouldCollide(bodyA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n if (fixtureB.shouldCollide(fixtureA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n // Clear the filtering flag.\n c.m_filterFlag = false;\n }\n\n const activeA = bodyA.isAwake() && !bodyA.isStatic();\n const activeB = bodyB.isAwake() && !bodyB.isStatic();\n\n // At least one body must be awake and it must be dynamic or kinematic.\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const proxyIdA = fixtureA.m_proxies[indexA].proxyId;\n const proxyIdB = fixtureB.m_proxies[indexB].proxyId;\n const overlap = this.m_broadPhase.testOverlap(proxyIdA, proxyIdB);\n\n // Here we destroy contacts that cease to overlap in the broad-phase.\n if (overlap == false) {\n this.destroyContact(c);\n continue;\n }\n\n // The contact persists.\n c.update(this);\n }\n }\n\n /**\n * @internal\n */\n destroyContact(contact: Contact): void {\n Contact.destroy(contact, this);\n\n // Remove from the world.\n if (contact.m_prev) {\n contact.m_prev.m_next = contact.m_next;\n }\n if (contact.m_next) {\n contact.m_next.m_prev = contact.m_prev;\n }\n if (contact == this.m_contactList) {\n this.m_contactList = contact.m_next;\n }\n\n --this.m_contactCount;\n }\n\n\n /**\n * Called when two fixtures begin to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'begin-contact', listener: (contact: Contact) => void): World;\n /**\n * Called when two fixtures cease to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'end-contact', listener: (contact: Contact) => void): World;\n /**\n * This is called after a contact is updated. This allows you to inspect a\n * contact before it goes to the solver. If you are careful, you can modify the\n * contact manifold (e.g. disable contact). A copy of the old manifold is\n * provided so that you can detect changes. Note: this is called only for awake\n * bodies. Note: this is called even when the number of contact points is zero.\n * Note: this is not called for sensors. Note: if you set the number of contact\n * points to zero, you will not get an endContact callback. However, you may get\n * a beginContact callback the next step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n /**\n * This lets you inspect a contact after the solver is finished. This is useful\n * for inspecting impulses. Note: the contact manifold does not include time of\n * impact impulses, which can be arbitrarily large if the sub-step is small.\n * Hence the impulse is provided explicitly in a separate data structure. Note:\n * this is only called for contacts that are touching, solid, and awake.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n /** Listener is called whenever a body is removed. */\n on(name: 'remove-body', listener: (body: Body) => void): World;\n /** Listener is called whenever a joint is removed implicitly or explicitly. */\n on(name: 'remove-joint', listener: (joint: Joint) => void): World;\n /** Listener is called whenever a fixture is removed implicitly or explicitly. */\n on(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Register an event listener.\n */\n // tslint:disable-next-line:typedef\n on(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n if (!this._listeners) {\n this._listeners = {};\n }\n if (!this._listeners[name]) {\n this._listeners[name] = [];\n }\n this._listeners[name].push(listener);\n return this;\n }\n\n off(name: 'begin-contact', listener: (contact: Contact) => void): World;\n off(name: 'end-contact', listener: (contact: Contact) => void): World;\n off(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n off(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n off(name: 'remove-body', listener: (body: Body) => void): World;\n off(name: 'remove-joint', listener: (joint: Joint) => void): World;\n off(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Remove an event listener.\n */\n // tslint:disable-next-line:typedef\n off(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return this;\n }\n const index = listeners.indexOf(listener);\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n publish(name: string, arg1?: any, arg2?: any, arg3?: any): number {\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return 0;\n }\n for (let l = 0; l < listeners.length; l++) {\n listeners[l].call(this, arg1, arg2, arg3);\n }\n return listeners.length;\n }\n\n /**\n * @internal\n */\n beginContact(contact: Contact): void {\n this.publish('begin-contact', contact);\n }\n\n /**\n * @internal\n */\n endContact(contact: Contact): void {\n this.publish('end-contact', contact);\n }\n\n /**\n * @internal\n */\n preSolve(contact: Contact, oldManifold: Manifold): void {\n this.publish('pre-solve', contact, oldManifold);\n }\n\n /**\n * @internal\n */\n postSolve(contact: Contact, impulse: ContactImpulse): void {\n this.publish('post-solve', contact, impulse);\n }\n\n /**\n * Joints and fixtures are destroyed when their associated body is destroyed.\n * Register a destruction listener so that you may nullify references to these\n * joints and shapes.\n *\n * `function(object)` is called when any joint or fixture is about to\n * be destroyed due to the destruction of one of its attached or parent bodies.\n */\n\n /**\n * Register a contact filter to provide specific control over collision.\n * Otherwise the default filter is used (defaultFilter). The listener is owned\n * by you and must remain in scope.\n *\n * Moved to Fixture.\n */\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Math from './Math';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport default class Vec3 {\n x: number;\n y: number;\n z: number;\n\n constructor(x: number, y: number, z: number);\n constructor(obj: { x: number, y: number, z: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?, z?) {\n if (!(this instanceof Vec3)) {\n return new Vec3(x, y, z);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n this.z = x.z;\n } else {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n _ASSERT && Vec3.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y,\n z: this.z\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = data.x;\n obj.y = data.y;\n obj.z = data.z;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number, z: number): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = x;\n obj.y = y;\n obj.z = z;\n return obj;\n }\n\n static zero(): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = 0;\n obj.y = 0;\n obj.z = 0;\n return obj;\n }\n\n static clone(v: Vec3): Vec3 {\n _ASSERT && Vec3.assert(v);\n return Vec3.neo(v.x, v.y, v.z);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y) && Math.isFinite(obj.z);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Vec3.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Vec3!');\n }\n }\n\n setZero(): Vec3 {\n this.x = 0.0;\n this.y = 0.0;\n this.z = 0.0;\n return this;\n }\n\n set(x: number, y: number, z: number): Vec3 {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n\n add(w: Vec3): Vec3 {\n this.x += w.x;\n this.y += w.y;\n this.z += w.z;\n return this;\n }\n\n sub(w: Vec3): Vec3 {\n this.x -= w.x;\n this.y -= w.y;\n this.z -= w.z;\n return this;\n }\n\n mul(m: number): Vec3 {\n this.x *= m;\n this.y *= m;\n this.z *= m;\n return this;\n }\n\n static areEqual(v: Vec3, w: Vec3): boolean {\n _ASSERT && Vec3.assert(v);\n _ASSERT && Vec3.assert(w);\n return v === w ||\n typeof v === 'object' && v !== null &&\n typeof w === 'object' && w !== null &&\n v.x === w.x && v.y === w.y && v.z === w.z;\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec3, w: Vec3): number {\n return v.x * w.x + v.y * w.y + v.z * w.z;\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static cross(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(\n v.y * w.z - v.z * w.y,\n v.z * w.x - v.x * w.z,\n v.x * w.y - v.y * w.x\n );\n }\n\n static add(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x + w.x, v.y + w.y, v.z + w.z);\n }\n\n static sub(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x - w.x, v.y - w.y, v.z - w.z);\n }\n\n static mul(v: Vec3, m: number): Vec3 {\n return new Vec3(m * v.x, m * v.y, m * v.z);\n }\n\n neg(): Vec3 {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n }\n\n static neg(v: Vec3): Vec3 {\n return new Vec3(-v.x, -v.y, -v.z);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../../Settings';\nimport Shape from '../Shape';\nimport Transform from '../../common/Transform';\nimport Rot from '../../common/Rot';\nimport Vec2 from '../../common/Vec2';\nimport AABB, { RayCastInput, RayCastOutput } from '../AABB';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n/**\n * A line segment (edge) shape. These can be connected in chains or loops to\n * other edge shapes. The connectivity information is used to ensure correct\n * contact normals.\n */\nexport default class EdgeShape extends Shape {\n static TYPE = 'edge' as const;\n\n // These are the edge vertices\n m_vertex1: Vec2;\n m_vertex2: Vec2;\n\n // Optional adjacent vertices. These are used for smooth collision.\n // Used by chain shape.\n m_vertex0: Vec2;\n m_vertex3: Vec2;\n m_hasVertex0: boolean;\n m_hasVertex3: boolean;\n\n constructor(v1?: Vec2, v2?: Vec2) {\n // @ts-ignore\n if (!(this instanceof EdgeShape)) {\n return new EdgeShape(v1, v2);\n }\n\n super();\n\n this.m_type = EdgeShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n\n\n this.m_vertex1 = v1 ? Vec2.clone(v1) : Vec2.zero();\n this.m_vertex2 = v2 ? Vec2.clone(v2) : Vec2.zero();\n\n this.m_vertex0 = Vec2.zero();\n this.m_vertex3 = Vec2.zero();\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertex1: this.m_vertex1,\n vertex2: this.m_vertex2,\n\n vertex0: this.m_vertex0,\n vertex3: this.m_vertex3,\n hasVertex0: this.m_hasVertex0,\n hasVertex3: this.m_hasVertex3,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): EdgeShape {\n const shape = new EdgeShape(data.vertex1, data.vertex2);\n if (shape.m_hasVertex0) {\n shape.setPrevVertex(data.vertex0);\n }\n if (shape.m_hasVertex3) {\n shape.setNextVertex(data.vertex3);\n }\n return shape;\n }\n\n /** @internal @deprecated */\n setNext(v?: Vec2): EdgeShape {\n return this.setNextVertex(v);\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n setNextVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex3.setVec2(v);\n this.m_hasVertex3 = true;\n } else {\n this.m_vertex3.setZero();\n this.m_hasVertex3 = false;\n }\n return this;\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n getNextVertex(): Vec2 {\n return this.m_vertex3;\n }\n\n /** @internal @deprecated */\n setPrev(v?: Vec2): EdgeShape {\n return this.setPrevVertex(v);\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n setPrevVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex0.setVec2(v);\n this.m_hasVertex0 = true;\n } else {\n this.m_vertex0.setZero();\n this.m_hasVertex0 = false;\n }\n return this;\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n getPrevVertex(): Vec2 {\n return this.m_vertex0;\n }\n\n /**\n * Set this as an isolated edge.\n */\n _set(v1: Vec2, v2: Vec2): EdgeShape {\n this.m_vertex1.setVec2(v1);\n this.m_vertex2.setVec2(v2);\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): EdgeShape {\n const clone = new EdgeShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_vertex1.setVec2(this.m_vertex1);\n clone.m_vertex2.setVec2(this.m_vertex2);\n clone.m_vertex0.setVec2(this.m_vertex0);\n clone.m_vertex3.setVec2(this.m_vertex3);\n clone.m_hasVertex0 = this.m_hasVertex0;\n clone.m_hasVertex3 = this.m_hasVertex3;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // p = p1 + t * d\n // v = v1 + s * e\n // p1 + t * d = v1 + s * e\n // s * e - t * d = p1 - v1\n\n // NOT_USED(childIndex);\n\n // Put the ray into the edge's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n const v1 = this.m_vertex1;\n const v2 = this.m_vertex2;\n const e = Vec2.sub(v2, v1);\n const normal = Vec2.neo(e.y, -e.x);\n normal.normalize();\n\n // q = p1 + t * d\n // dot(normal, q - v1) = 0\n // dot(normal, p1 - v1) + t * dot(normal, d) = 0\n const numerator = Vec2.dot(normal, Vec2.sub(v1, p1));\n const denominator = Vec2.dot(normal, d);\n\n if (denominator == 0.0) {\n return false;\n }\n\n const t = numerator / denominator;\n if (t < 0.0 || input.maxFraction < t) {\n return false;\n }\n\n const q = Vec2.add(p1, Vec2.mulNumVec2(t, d));\n\n // q = v1 + s * r\n // s = dot(q - v1, r) / dot(r, r)\n const r = Vec2.sub(v2, v1);\n const rr = Vec2.dot(r, r);\n if (rr == 0.0) {\n return false;\n }\n\n const s = Vec2.dot(Vec2.sub(q, v1), r) / rr;\n if (s < 0.0 || 1.0 < s) {\n return false;\n }\n\n output.fraction = t;\n if (numerator > 0.0) {\n output.normal = Rot.mulVec2(xf.q, normal).neg();\n } else {\n output.normal = Rot.mulVec2(xf.q, normal);\n }\n return true;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const v1 = Transform.mulVec2(xf, this.m_vertex1);\n const v2 = Transform.mulVec2(xf, this.m_vertex2);\n\n aabb.combinePoints(v1, v2);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center.setCombine(0.5, this.m_vertex1, 0.5, this.m_vertex2);\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_vertex1);\n proxy.m_vertices.push(this.m_vertex2);\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport AABB, { RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport common from '../../util/common';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Settings from '../../Settings';\nimport Shape from '../Shape';\nimport EdgeShape from './EdgeShape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A chain shape is a free form sequence of line segments. The chain has\n * two-sided collision, so you can use inside and outside collision. Therefore,\n * you may use any winding order. Connectivity information is used to create\n * smooth collisions.\n *\n * WARNING: The chain will not collide properly if there are self-intersections.\n */\nexport default class ChainShape extends Shape {\n static TYPE = 'chain' as const;\n\n m_vertices: Vec2[];\n m_count: number;\n m_prevVertex: Vec2 | null;\n m_nextVertex: Vec2 | null;\n m_hasPrevVertex: boolean;\n m_hasNextVertex: boolean;\n\n m_isLoop: boolean;\n\n constructor(vertices?: Vec2[], loop?: boolean) {\n // @ts-ignore\n if (!(this instanceof ChainShape)) {\n return new ChainShape(vertices, loop);\n }\n\n super();\n\n this.m_type = ChainShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_vertices = [];\n this.m_count = 0;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n\n this.m_isLoop = !!loop;\n\n if (vertices && vertices.length) {\n if (loop) {\n this._createLoop(vertices);\n } else {\n this._createChain(vertices);\n }\n }\n }\n\n /** @internal */\n _serialize(): object {\n const data = {\n type: this.m_type,\n vertices: this.m_vertices,\n isLoop: this.m_isLoop,\n hasPrevVertex: this.m_hasPrevVertex,\n hasNextVertex: this.m_hasNextVertex,\n prevVertex: null as Vec2 | null,\n nextVertex: null as Vec2 | null,\n };\n if (this.m_prevVertex) {\n data.prevVertex = this.m_prevVertex;\n }\n if (this.m_nextVertex) {\n data.nextVertex = this.m_nextVertex;\n }\n return data;\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): ChainShape {\n const vertices = [] as Vec2[];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n const shape = new ChainShape(vertices, data.isLoop);\n if (data.prevVertex) {\n shape.setPrevVertex(data.prevVertex);\n }\n if (data.nextVertex) {\n shape.setNextVertex(data.nextVertex);\n }\n return shape;\n }\n\n // clear() {\n // this.m_vertices.length = 0;\n // this.m_count = 0;\n // }\n\n /**\n * @internal\n * Create a loop. This automatically adjusts connectivity.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createLoop(vertices: Vec2[]): ChainShape {\n _ASSERT && common.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && common.assert(vertices.length >= 3);\n for (let i = 1; i < vertices.length; ++i) {\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n // If the code crashes here, it means your vertices are too close together.\n _ASSERT && common.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_vertices = [];\n this.m_count = vertices.length + 1;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n this.m_vertices[vertices.length] = Vec2.clone(vertices[0]);\n\n this.m_prevVertex = this.m_vertices[this.m_count - 2];\n this.m_nextVertex = this.m_vertices[1];\n this.m_hasPrevVertex = true;\n this.m_hasNextVertex = true;\n return this;\n }\n\n /**\n * @internal\n * Create a chain with isolated end vertices.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createChain(vertices: Vec2[]): ChainShape {\n _ASSERT && common.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && common.assert(vertices.length >= 2);\n for (let i = 1; i < vertices.length; ++i) {\n // If the code crashes here, it means your vertices are too close together.\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n _ASSERT && common.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_count = vertices.length;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n return this;\n }\n\n /** @internal */\n _reset(): void {\n if (this.m_isLoop) {\n this._createLoop(this.m_vertices);\n } else {\n this._createChain(this.m_vertices);\n }\n }\n\n /**\n * Establish connectivity to a vertex that precedes the first vertex. Don't call\n * this for loops.\n */\n setPrevVertex(prevVertex: Vec2): void {\n this.m_prevVertex = prevVertex;\n this.m_hasPrevVertex = true;\n }\n\n getPrevVertex(): Vec2 {\n return this.m_prevVertex;\n }\n\n /**\n * Establish connectivity to a vertex that follows the last vertex. Don't call\n * this for loops.\n */\n setNextVertex(nextVertex: Vec2): void {\n this.m_nextVertex = nextVertex;\n this.m_hasNextVertex = true;\n }\n\n getNextVertex(): Vec2 {\n return this.m_nextVertex;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): ChainShape {\n const clone = new ChainShape();\n clone._createChain(this.m_vertices);\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_prevVertex = this.m_prevVertex;\n clone.m_nextVertex = this.m_nextVertex;\n clone.m_hasPrevVertex = this.m_hasPrevVertex;\n clone.m_hasNextVertex = this.m_hasNextVertex;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): number {\n // edge count = vertex count - 1\n return this.m_count - 1;\n }\n\n // Get a child edge.\n getChildEdge(edge: EdgeShape, childIndex: number): void {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count - 1);\n edge.m_type = EdgeShape.TYPE;\n edge.m_radius = this.m_radius;\n\n edge.m_vertex1 = this.m_vertices[childIndex];\n edge.m_vertex2 = this.m_vertices[childIndex + 1];\n\n if (childIndex > 0) {\n edge.m_vertex0 = this.m_vertices[childIndex - 1];\n edge.m_hasVertex0 = true;\n } else {\n edge.m_vertex0 = this.m_prevVertex;\n edge.m_hasVertex0 = this.m_hasPrevVertex;\n }\n\n if (childIndex < this.m_count - 2) {\n edge.m_vertex3 = this.m_vertices[childIndex + 2];\n edge.m_hasVertex3 = true;\n } else {\n edge.m_vertex3 = this.m_nextVertex;\n edge.m_hasVertex3 = this.m_hasNextVertex;\n }\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && common.assert(0 <= index && index <= this.m_count);\n if (index < this.m_count) {\n return this.m_vertices[index];\n } else {\n return this.m_vertices[0];\n }\n }\n\n isLoop(): boolean {\n return this.m_isLoop;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * This always return false.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count);\n\n const edgeShape = new EdgeShape(this.getVertex(childIndex), this.getVertex(childIndex + 1));\n return edgeShape.rayCast(output, input, xf, 0);\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count);\n\n const v1 = Transform.mulVec2(xf, this.getVertex(childIndex));\n const v2 = Transform.mulVec2(xf, this.getVertex(childIndex + 1));\n\n aabb.combinePoints(v1, v2);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * Chains have zero mass.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center = Vec2.zero();\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count);\n proxy.m_buffer[0] = this.getVertex(childIndex);\n proxy.m_buffer[1] = this.getVertex(childIndex + 1);\n proxy.m_vertices = proxy.m_buffer;\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport AABB, { RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport common from '../../util/common';\nimport Math from '../../common/Math';\nimport Transform from '../../common/Transform';\nimport Rot from '../../common/Rot';\nimport Vec2 from '../../common/Vec2';\nimport Settings from '../../Settings';\nimport Shape from '../Shape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A convex polygon. It is assumed that the interior of the polygon is to the\n * left of each edge. Polygons have a maximum number of vertices equal to\n * Settings.maxPolygonVertices. In most cases you should not need many vertices\n * for a convex polygon. extends Shape\n */\nexport default class PolygonShape extends Shape {\n static TYPE = 'polygon' as const;\n\n m_centroid: Vec2;\n m_vertices: Vec2[]; // [Settings.maxPolygonVertices]\n m_normals: Vec2[]; // [Settings.maxPolygonVertices]\n m_count: number;\n\n // @ts-ignore\n constructor(vertices?: Vec2[]) {\n // @ts-ignore\n if (!(this instanceof PolygonShape)) {\n return new PolygonShape(vertices);\n }\n\n super();\n\n this.m_type = PolygonShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_centroid = Vec2.zero();\n this.m_vertices = [];\n this.m_normals = [];\n this.m_count = 0;\n\n if (vertices && vertices.length) {\n this._set(vertices);\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertices: this.m_vertices,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): PolygonShape {\n const vertices = [] as Vec2[];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n\n const shape = new PolygonShape(vertices);\n return shape;\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && common.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): PolygonShape {\n const clone = new PolygonShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_count = this.m_count;\n clone.m_centroid.setVec2(this.m_centroid);\n for (let i = 0; i < this.m_count; i++) {\n clone.m_vertices.push(this.m_vertices[i].clone());\n }\n for (let i = 0; i < this.m_normals.length; i++) {\n clone.m_normals.push(this.m_normals[i].clone());\n }\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /** @internal */\n _reset(): void {\n this._set(this.m_vertices);\n }\n\n /**\n * @internal\n *\n * Create a convex hull from the given array of local points. The count must be\n * in the range [3, Settings.maxPolygonVertices].\n *\n * Warning: the points may be re-ordered, even if they form a convex polygon\n * Warning: collinear points are handled but not removed. Collinear points may\n * lead to poor stacking behavior.\n */\n _set(vertices: Vec2[]): void {\n _ASSERT && common.assert(3 <= vertices.length && vertices.length <= Settings.maxPolygonVertices);\n if (vertices.length < 3) {\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n let n = Math.min(vertices.length, Settings.maxPolygonVertices);\n\n // Perform welding and copy vertices into local buffer.\n const ps = [] as Vec2[]; // [Settings.maxPolygonVertices];\n for (let i = 0; i < n; ++i) {\n const v = vertices[i];\n\n let unique = true;\n for (let j = 0; j < ps.length; ++j) {\n if (Vec2.distanceSquared(v, ps[j]) < 0.25 * Settings.linearSlopSquared) {\n unique = false;\n break;\n }\n }\n\n if (unique) {\n ps.push(v);\n }\n }\n\n n = ps.length;\n if (n < 3) {\n // Polygon is degenerate.\n _ASSERT && common.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n // Create the convex hull using the Gift wrapping algorithm\n // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm\n\n // Find the right most point on the hull (in case of multiple points bottom most is used)\n let i0 = 0;\n let x0 = ps[0].x;\n for (let i = 1; i < n; ++i) {\n const x = ps[i].x;\n if (x > x0 || (x === x0 && ps[i].y < ps[i0].y)) {\n i0 = i;\n x0 = x;\n }\n }\n\n const hull = [] as number[]; // [Settings.maxPolygonVertices];\n let m = 0;\n let ih = i0;\n\n while (true) {\n hull[m] = ih;\n\n let ie = 0;\n for (let j = 1; j < n; ++j) {\n if (ie === ih) {\n ie = j;\n continue;\n }\n\n const r = Vec2.sub(ps[ie], ps[hull[m]]);\n const v = Vec2.sub(ps[j], ps[hull[m]]);\n const c = Vec2.crossVec2Vec2(r, v);\n // c < 0 means counter-clockwise wrapping, c > 0 means clockwise wrapping\n if (c < 0.0) {\n ie = j;\n }\n\n // Collinearity check\n if (c === 0.0 && v.lengthSquared() > r.lengthSquared()) {\n ie = j;\n }\n }\n\n ++m;\n ih = ie;\n\n if (ie === i0) {\n break;\n }\n }\n\n if (m < 3) {\n // Polygon is degenerate.\n _ASSERT && common.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n this.m_count = m;\n\n // Copy vertices.\n this.m_vertices = [];\n for (let i = 0; i < m; ++i) {\n this.m_vertices[i] = ps[hull[i]];\n }\n\n // Compute normals. Ensure the edges have non-zero length.\n for (let i = 0; i < m; ++i) {\n const i1 = i;\n const i2 = i + 1 < m ? i + 1 : 0;\n const edge = Vec2.sub(this.m_vertices[i2], this.m_vertices[i1]);\n _ASSERT && common.assert(edge.lengthSquared() > Math.EPSILON * Math.EPSILON);\n this.m_normals[i] = Vec2.crossVec2Num(edge, 1.0);\n this.m_normals[i].normalize();\n }\n\n // Compute the polygon centroid.\n this.m_centroid = ComputeCentroid(this.m_vertices, m);\n }\n\n /** @internal */\n _setAsBox(hx: number, hy: number, center?: Vec2, angle?: number): void {\n // start with right-bottom, counter-clockwise, as in Gift wrapping algorithm in PolygonShape._set()\n this.m_vertices[0] = Vec2.neo(hx, -hy);\n this.m_vertices[1] = Vec2.neo(hx, hy);\n this.m_vertices[2] = Vec2.neo(-hx, hy);\n this.m_vertices[3] = Vec2.neo(-hx, -hy);\n\n this.m_normals[0] = Vec2.neo(1.0, 0.0);\n this.m_normals[1] = Vec2.neo(0.0, 1.0);\n this.m_normals[2] = Vec2.neo(-1.0, 0.0);\n this.m_normals[3] = Vec2.neo(0.0, -1.0);\n\n this.m_count = 4;\n\n if (Vec2.isValid(center)) {\n angle = angle || 0;\n\n this.m_centroid.setVec2(center);\n\n const xf = Transform.identity();\n xf.p.setVec2(center);\n xf.q.setAngle(angle);\n\n // Transform vertices and normals.\n for (let i = 0; i < this.m_count; ++i) {\n this.m_vertices[i] = Transform.mulVec2(xf, this.m_vertices[i]);\n this.m_normals[i] = Rot.mulVec2(xf.q, this.m_normals[i]);\n }\n }\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): boolean {\n const pLocal = Rot.mulTVec2(xf.q, Vec2.sub(p, xf.p));\n\n for (let i = 0; i < this.m_count; ++i) {\n const dot = Vec2.dot(this.m_normals[i], Vec2.sub(pLocal, this.m_vertices[i]));\n if (dot > 0.0) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n\n // Put the ray into the polygon's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n let lower = 0.0;\n let upper = input.maxFraction;\n\n let index = -1;\n\n for (let i = 0; i < this.m_count; ++i) {\n // p = p1 + a * d\n // dot(normal, p - v) = 0\n // dot(normal, p1 - v) + a * dot(normal, d) = 0\n const numerator = Vec2.dot(this.m_normals[i], Vec2.sub(this.m_vertices[i], p1));\n const denominator = Vec2.dot(this.m_normals[i], d);\n\n if (denominator == 0.0) {\n if (numerator < 0.0) {\n return false;\n }\n } else {\n // Note: we want this predicate without division:\n // lower < numerator / denominator, where denominator < 0\n // Since denominator < 0, we have to flip the inequality:\n // lower < numerator / denominator <==> denominator * lower > numerator.\n if (denominator < 0.0 && numerator < lower * denominator) {\n // Increase lower.\n // The segment enters this half-space.\n lower = numerator / denominator;\n index = i;\n } else if (denominator > 0.0 && numerator < upper * denominator) {\n // Decrease upper.\n // The segment exits this half-space.\n upper = numerator / denominator;\n }\n }\n\n // The use of epsilon here causes the assert on lower to trip\n // in some cases. Apparently the use of epsilon was to make edge\n // shapes work, but now those are handled separately.\n // if (upper < lower - Math.EPSILON)\n if (upper < lower) {\n return false;\n }\n }\n\n _ASSERT && common.assert(0.0 <= lower && lower <= input.maxFraction);\n\n if (index >= 0) {\n output.fraction = lower;\n output.normal = Rot.mulVec2(xf.q, this.m_normals[index]);\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < this.m_count; ++i) {\n const v = Transform.mulVec2(xf, this.m_vertices[i]);\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, v.y);\n maxY = Math.max(maxY, v.y);\n }\n\n aabb.lowerBound.setNum(minX, minY);\n aabb.upperBound.setNum(maxX, maxY);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n // Polygon mass, centroid, and inertia.\n // Let rho be the polygon density in mass per unit area.\n // Then:\n // mass = rho * int(dA)\n // centroid.x = (1/mass) * rho * int(x * dA)\n // centroid.y = (1/mass) * rho * int(y * dA)\n // I = rho * int((x*x + y*y) * dA)\n //\n // We can compute these integrals by summing all the integrals\n // for each triangle of the polygon. To evaluate the integral\n // for a single triangle, we make a change of variables to\n // the (u,v) coordinates of the triangle:\n // x = x0 + e1x * u + e2x * v\n // y = y0 + e1y * u + e2y * v\n // where 0 <= u && 0 <= v && u + v <= 1.\n //\n // We integrate u from [0,1-v] and then v from [0,1].\n // We also need to use the Jacobian of the transformation:\n // D = cross(e1, e2)\n //\n // Simplification: triangle centroid = (1/3) * (p1 + p2 + p3)\n //\n // The rest of the derivation is handled by computer algebra.\n\n _ASSERT && common.assert(this.m_count >= 3);\n\n const center = Vec2.zero();\n let area = 0.0;\n let I = 0.0;\n\n // s is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const s = Vec2.zero();\n\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < this.m_count; ++i) {\n s.add(this.m_vertices[i]);\n }\n s.mul(1.0 / this.m_count);\n\n const k_inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < this.m_count; ++i) {\n // Triangle vertices.\n const e1 = Vec2.sub(this.m_vertices[i], s);\n const e2 = i + 1 < this.m_count ? Vec2.sub(this.m_vertices[i + 1], s) : Vec2 .sub(this.m_vertices[0], s);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n center.addCombine(triangleArea * k_inv3, e1, triangleArea * k_inv3, e2);\n\n const ex1 = e1.x;\n const ey1 = e1.y;\n const ex2 = e2.x;\n const ey2 = e2.y;\n\n const intx2 = ex1 * ex1 + ex2 * ex1 + ex2 * ex2;\n const inty2 = ey1 * ey1 + ey2 * ey1 + ey2 * ey2;\n\n I += (0.25 * k_inv3 * D) * (intx2 + inty2);\n }\n\n // Total mass\n massData.mass = density * area;\n\n // Center of mass\n _ASSERT && common.assert(area > Math.EPSILON);\n center.mul(1.0 / area);\n massData.center.setCombine(1, center, 1, s);\n\n // Inertia tensor relative to the local origin (point s).\n massData.I = density * I;\n\n // Shift to center of mass then to original body origin.\n massData.I += massData.mass * (Vec2.dot(massData.center, massData.center) - Vec2.dot(center, center));\n }\n\n /**\n * Validate convexity. This is a very time consuming operation.\n * @returns true if valid\n */\n validate(): boolean {\n for (let i = 0; i < this.m_count; ++i) {\n const i1 = i;\n const i2 = i < this.m_count - 1 ? i1 + 1 : 0;\n const p = this.m_vertices[i1];\n const e = Vec2.sub(this.m_vertices[i2], p);\n\n for (let j = 0; j < this.m_count; ++j) {\n if (j == i1 || j == i2) {\n continue;\n }\n\n const v = Vec2.sub(this.m_vertices[j], p);\n const c = Vec2.crossVec2Vec2(e, v);\n if (c < 0.0) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices = this.m_vertices;\n proxy.m_count = this.m_count;\n proxy.m_radius = this.m_radius;\n }\n}\n\nfunction ComputeCentroid(vs: Vec2[], count: number): Vec2 {\n _ASSERT && common.assert(count >= 3);\n\n const c = Vec2.zero();\n let area = 0.0;\n\n // pRef is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const pRef = Vec2.zero();\n if (false) {\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < count; ++i) {\n pRef.add(vs[i]);\n }\n pRef.mul(1.0 / count);\n }\n\n const inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < count; ++i) {\n // Triangle vertices.\n const p1 = pRef;\n const p2 = vs[i];\n const p3 = i + 1 < count ? vs[i + 1] : vs[0];\n\n const e1 = Vec2.sub(p2, p1);\n const e2 = Vec2.sub(p3, p1);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n c.addMul(triangleArea * inv3, p1);\n c.addMul(triangleArea * inv3, p2);\n c.addMul(triangleArea * inv3, p3);\n }\n\n // Centroid\n _ASSERT && common.assert(area > Math.EPSILON);\n c.mul(1.0 / area);\n return c;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type Vec2 from '../../common/Vec2';\nimport PolygonShape from './PolygonShape';\n\n/**\n * A rectangle polygon which extend PolygonShape.\n */\nexport default class BoxShape extends PolygonShape {\n static TYPE = 'polygon' as const;\n\n constructor(hx: number, hy: number, center?: Vec2, angle?: number) {\n // @ts-ignore\n if (!(this instanceof BoxShape)) {\n return new BoxShape(hx, hy, center, angle);\n }\n\n super();\n\n this._setAsBox(hx, hy, center, angle);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Math from '../../common/Math';\nimport Rot from '../../common/Rot';\nimport Vec2 from '../../common/Vec2';\nimport Shape from '../Shape';\nimport AABB, { RayCastInput, RayCastOutput } from '../AABB';\nimport Transform from '../../common/Transform';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport default class CircleShape extends Shape {\n static TYPE = 'circle' as const;\n\n m_p: Vec2;\n\n constructor(position: Vec2, radius?: number);\n constructor(radius?: number);\n // tslint:disable-next-line:typedef\n constructor(a, b?) {\n // @ts-ignore\n if (!(this instanceof CircleShape)) {\n return new CircleShape(a, b);\n }\n\n super();\n\n this.m_type = CircleShape.TYPE;\n this.m_p = Vec2.zero();\n this.m_radius = 1;\n\n if (typeof a === 'object' && Vec2.isValid(a)) {\n this.m_p.setVec2(a);\n\n if (typeof b === 'number') {\n this.m_radius = b;\n }\n\n } else if (typeof a === 'number') {\n this.m_radius = a;\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n p: this.m_p,\n radius: this.m_radius,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): CircleShape {\n return new CircleShape(data.p, data.radius);\n }\n\n // TODO: already defined in Shape\n getRadius(): number {\n return this.m_radius;\n }\n\n getCenter(): Vec2 {\n return this.m_p;\n }\n\n getVertex(index: 0): Vec2 {\n _ASSERT && common.assert(index == 0);\n return this.m_p;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): CircleShape {\n const clone = new CircleShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_p = this.m_p.clone();\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): boolean {\n const center = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const d = Vec2.sub(p, center);\n return Vec2.dot(d, d) <= this.m_radius * this.m_radius;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // Collision Detection in Interactive 3D Environments by Gino van den Bergen\n // From Section 3.1.2\n // x = s + a * r\n // norm(x) = radius\n\n const position = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const s = Vec2.sub(input.p1, position);\n const b = Vec2.dot(s, s) - this.m_radius * this.m_radius;\n\n // Solve quadratic equation.\n const r = Vec2.sub(input.p2, input.p1);\n const c = Vec2.dot(s, r);\n const rr = Vec2.dot(r, r);\n const sigma = c * c - rr * b;\n\n // Check for negative discriminant and short segment.\n if (sigma < 0.0 || rr < Math.EPSILON) {\n return false;\n }\n\n // Find the point of intersection of the line with the circle.\n let a = -(c + Math.sqrt(sigma));\n\n // Is the intersection point on the segment?\n if (0.0 <= a && a <= input.maxFraction * rr) {\n a /= rr;\n output.fraction = a;\n output.normal = Vec2.add(s, Vec2.mulNumVec2(a, r));\n output.normal.normalize();\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const p = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n aabb.lowerBound.setNum(p.x - this.m_radius, p.y - this.m_radius);\n aabb.upperBound.setNum(p.x + this.m_radius, p.y + this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n massData.mass = density * Math.PI * this.m_radius * this.m_radius;\n massData.center = this.m_p;\n // inertia about the local origin\n massData.I = massData.mass\n * (0.5 * this.m_radius * this.m_radius + Vec2.dot(this.m_p, this.m_p));\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_p);\n proxy.m_count = 1;\n proxy.m_radius = this.m_radius;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. A value of 0 disables softness.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * Distance length.\n */\n length?: number;\n}\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointDef extends JointDef, DistanceJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0\n};\n\n/**\n * A distance joint constrains two points on two bodies to remain at a fixed\n * distance from each other. You can view this as a massless, rigid rod.\n *\n * @param anchorA Anchor A in global coordination.\n * @param anchorB Anchor B in global coordination.\n */\nexport default class DistanceJoint extends Joint {\n static TYPE = 'distance-joint' as const;\n\n // Solver shared\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_length: number;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_gamma: number;\n /** @internal */ m_bias: number;\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: DistanceJointDef);\n constructor(def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2);\n constructor(def: DistanceJointDef, bodyA?: Body, bodyB?: Body, anchorA?: Vec2, anchorB?: Vec2) {\n // @ts-ignore\n if (!(this instanceof DistanceJoint)) {\n return new DistanceJoint(def, bodyA, bodyB, anchorA, anchorB);\n }\n\n // order of constructor arguments is changed in v0.2\n if (bodyB && anchorA && ('m_type' in anchorA) && ('x' in bodyB) && ('y' in bodyB)) {\n const temp = bodyB;\n bodyB = anchorA;\n anchorA = temp;\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = DistanceJoint.TYPE;\n\n // Solver shared\n this.m_localAnchorA = Vec2.clone(anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.zero());\n this.m_length = Math.isFinite(def.length) ? def.length :\n Vec2.distance(bodyA.getWorldPoint(this.m_localAnchorA), bodyB.getWorldPoint(this.m_localAnchorB));\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n this.m_impulse = 0.0;\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n\n // 1-D constrained system\n // m (v2 - v1) = lambda\n // v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass.\n // x2 = x1 + h * v2\n\n // 1-D mass-damper-spring system\n // m (v2 - v1) + h * d * v2 + h * k *\n\n // C = norm(p2 - p1) - L\n // u = (p2 - p1) / norm(p2 - p1)\n // Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1))\n // J = [-u -cross(r1, u) u cross(r2, u)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n length: this.m_length,\n\n impulse: this.m_impulse,\n gamma: this.m_gamma,\n bias: this.m_bias,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): DistanceJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new DistanceJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n length?: number,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.length > 0) {\n this.m_length = +def.length;\n } else if (def.length < 0) { // don't change length\n } else if (def.anchorA || def.anchorA || def.anchorA || def.anchorA) {\n this.m_length = Vec2.distance(\n this.m_bodyA.getWorldPoint(this.m_localAnchorA),\n this.m_bodyB.getWorldPoint(this.m_localAnchorB)\n );\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the natural length. Manipulating the length can lead to non-physical\n * behavior when the frequency is zero.\n */\n setLength(length: number): void {\n this.m_length = length;\n }\n\n /**\n * Get the natural length.\n */\n getLength(): number {\n return this.m_length;\n }\n\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n this.m_u = Vec2.sub(Vec2.add(cB, this.m_rB), Vec2.add(cA, this.m_rA));\n\n // Handle singularity.\n const length = this.m_u.length();\n if (length > Settings.linearSlop) {\n this.m_u.mul(1.0 / length);\n } else {\n this.m_u.setNum(0.0, 0.0);\n }\n\n const crAu = Vec2.crossVec2Vec2(this.m_rA, this.m_u);\n const crBu = Vec2.crossVec2Vec2(this.m_rB, this.m_u);\n let invMass = this.m_invMassA + this.m_invIA * crAu * crAu + this.m_invMassB\n + this.m_invIB * crBu * crBu;\n\n // Compute the effective mass matrix.\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (this.m_frequencyHz > 0.0) {\n const C = length - this.m_length;\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * this.m_mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = this.m_mass * omega * omega;\n\n // magic formulas\n const h = step.dt;\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invMass += this.m_gamma;\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n } else {\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n const Cdot = Vec2.dot(this.m_u, vpB) - Vec2.dot(this.m_u, vpA);\n\n const impulse = -this.m_mass\n * (Cdot + this.m_bias + this.m_gamma * this.m_impulse);\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u);\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n if (this.m_frequencyHz > 0.0) {\n // There is no position correction for soft distance constraints.\n return true;\n }\n\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA));\n\n const length = u.normalize();\n let C = length - this.m_length;\n C = Math\n .clamp(C, -Settings.maxLinearCorrection, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C;\n const P = Vec2.mulNumVec2(impulse, u);\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Mat22 from '../../common/Mat22';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointOpt extends JointOpt {\n /**\n * The maximum friction force in N.\n */\n maxForce?: number;\n /**\n * The maximum friction torque in N-m.\n */\n maxTorque?: number;\n}\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointDef extends JointDef, FrictionJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n maxTorque : 0.0,\n};\n\n/**\n * Friction joint. This is used for top-down friction. It provides 2D\n * translational friction and angular friction.\n *\n * @param anchor Anchor in global coordination.\n */\nexport default class FrictionJoint extends Joint {\n static TYPE = 'friction-joint' as const;\n\n /** @internal */ m_type: 'friction-joint';\n\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n // Solver shared\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: FrictionJointDef);\n constructor(def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: FrictionJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (!(this instanceof FrictionJoint)) {\n return new FrictionJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = FrictionJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n\n // Solver shared\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): FrictionJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new FrictionJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && common.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && common.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y\n * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x\n * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt; // float\n\n // Solve angular friction\n {\n const Cdot = wB - wA; // float\n let impulse = -this.m_angularMass * Cdot; // float\n\n const oldImpulse = this.m_angularImpulse; // float\n const maxImpulse = h * this.m_maxTorque; // float\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)), Vec2.add(vA,\n Vec2.crossNumVec2(wA, this.m_rA))); // Vec2\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); // Vec2\n const oldImpulse = this.m_linearImpulse; // Vec2\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce; // float\n\n if (this.m_linearImpulse.lengthSquared() > maxImpulse * maxImpulse) {\n this.m_linearImpulse.normalize();\n this.m_linearImpulse.mul(maxImpulse);\n }\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from './Vec2';\nimport Vec3 from './Vec3';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 3-by-3 matrix. Stored in column-major order.\n */\nexport default class Mat33 {\n ex: Vec3;\n ey: Vec3;\n ez: Vec3;\n\n constructor(a: Vec3, b: Vec3, c: Vec3);\n constructor();\n constructor(a?: Vec3, b?: Vec3, c?: Vec3) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec3.clone(a);\n this.ey = Vec3.clone(b);\n this.ez = Vec3.clone(c);\n } else {\n this.ex = Vec3.zero();\n this.ey = Vec3.zero();\n this.ez = Vec3.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec3.isValid(obj.ex) && Vec3.isValid(obj.ey) && Vec3.isValid(obj.ez);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Mat33.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Mat33!');\n }\n }\n\n /**\n * Set this matrix to all zeros.\n */\n setZero(): Mat33 {\n this.ex.setZero();\n this.ey.setZero();\n this.ez.setZero();\n return this;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve33(v: Vec3): Vec3 {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = new Vec3();\n r.x = det * Vec3.dot(v, Vec3.cross(this.ey, this.ez));\n r.y = det * Vec3.dot(this.ex, Vec3.cross(v, this.ez));\n r.z = det * Vec3.dot(this.ex, Vec3.cross(this.ey, v));\n return r;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix\n * equation.\n */\n solve22(v: Vec2): Vec2 {\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a21 = this.ex.y;\n const a22 = this.ey.y;\n let det = a11 * a22 - a12 * a21;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = Vec2.zero();\n r.x = det * (a22 * v.x - a12 * v.y);\n r.y = det * (a11 * v.y - a21 * v.x);\n return r;\n }\n\n /**\n * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if\n * singular.\n */\n getInverse22(M: Mat33): void {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n M.ex.x = det * d;\n M.ey.x = -det * b;\n M.ex.z = 0.0;\n M.ex.y = -det * c;\n M.ey.y = det * a;\n M.ey.z = 0.0;\n M.ez.x = 0.0;\n M.ez.y = 0.0;\n M.ez.z = 0.0;\n }\n\n /**\n * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix\n * if singular.\n */\n getSymInverse33(M: Mat33): void {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a13 = this.ez.x;\n const a22 = this.ey.y;\n const a23 = this.ez.y;\n const a33 = this.ez.z;\n\n M.ex.x = det * (a22 * a33 - a23 * a23);\n M.ex.y = det * (a13 * a23 - a12 * a33);\n M.ex.z = det * (a12 * a23 - a13 * a22);\n\n M.ey.x = M.ex.y;\n M.ey.y = det * (a11 * a33 - a13 * a13);\n M.ey.z = det * (a13 * a12 - a11 * a23);\n\n M.ez.x = M.ex.z;\n M.ez.y = M.ey.z;\n M.ez.z = det * (a11 * a22 - a12 * a12);\n }\n\n /**\n * Multiply a matrix times a vector.\n */\n static mul(a: Mat33, b: Vec2): Vec2;\n static mul(a: Mat33, b: Vec3): Vec3;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n _ASSERT && Mat33.assert(a);\n if (b && 'z' in b && 'y' in b && 'x' in b) {\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n\n } else if (b && 'y' in b && 'x' in b) {\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n _ASSERT && common.assert(false);\n }\n\n static mulVec3(a: Mat33, b: Vec3): Vec3 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n }\n\n static mulVec2(a: Mat33, b: Vec2): Vec2 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n static add(a: Mat33, b: Mat33): Mat33 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Mat33.assert(b);\n return new Mat33(\n Vec3.add(a.ex, b.ex),\n Vec3.add(a.ey, b.ey),\n Vec3.add(a.ez, b.ez)\n );\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Vec3 from '../../common/Vec3';\nimport Mat22 from '../../common/Mat22';\nimport Mat33 from '../../common/Mat33';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointOpt extends JointOpt {\n /**\n * The lower angle for the joint limit (radians).\n */\n lowerAngle?: number;\n /**\n * The upper angle for the joint limit (radians).\n */\n upperAngle?: number;\n /**\n * The maximum motor torque used to achieve the desired motor speed. Usually\n * in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed. Usually in radians per second.\n */\n motorSpeed?: number;\n /**\n * A flag to enable joint limits.\n */\n enableLimit?: boolean;\n /**\n * A flag to enable the joint motor.\n */\n enableMotor?: boolean;\n}\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointDef extends JointDef, RevoluteJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n lowerAngle : 0.0,\n upperAngle : 0.0,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n enableLimit : false,\n enableMotor : false\n};\n\n/**\n * A revolute joint constrains two bodies to share a common point while they are\n * free to rotate about the point. The relative rotation about the shared point\n * is the joint angle. You can limit the relative rotation with a joint limit\n * that specifies a lower and upper angle. You can use a motor to drive the\n * relative rotation about the shared point. A maximum motor torque is provided\n * so that infinite forces are not generated.\n */\nexport default class RevoluteJoint extends Joint {\n static TYPE = 'revolute-joint' as const;\n\n /** @internal */ m_type: 'revolute-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerAngle: number;\n /** @internal */ m_upperAngle: number;\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n // effective mass for point-to-point constraint.\n /** @internal */ m_mass: Mat33 = new Mat33();\n // effective mass for motor/limit angular constraint.\n /** @internal */ m_motorMass: number;\n /** @internal */ m_limitState: number = inactiveLimit; // TODO enum\n\n constructor(def: RevoluteJointDef);\n constructor(def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n // @ts-ignore\n constructor(def: RevoluteJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (!(this instanceof RevoluteJoint)) {\n return new RevoluteJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RevoluteJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorImpulse = 0.0;\n\n this.m_lowerAngle = def.lowerAngle;\n this.m_upperAngle = def.upperAngle;\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Motor constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerAngle: this.m_lowerAngle,\n upperAngle: this.m_upperAngle,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any):RevoluteJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RevoluteJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle in radians.\n */\n getJointAngle(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle speed in radians per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_angularVelocity - bA.m_angularVelocity;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Get the current motor torque given the inverse time step. Unit is N*m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set the motor speed in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set the maximum motor torque, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit in radians.\n */\n getLowerLimit(): number {\n return this.m_lowerAngle;\n }\n\n /**\n * Get the upper joint limit in radians.\n */\n getUpperLimit(): number {\n return this.m_upperAngle;\n }\n\n /**\n * Set the joint limits in radians.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && common.assert(lower <= upper);\n\n if (lower != this.m_lowerAngle || upper != this.m_upperAngle) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_impulse.z = 0.0;\n this.m_lowerAngle = lower;\n this.m_upperAngle = upper;\n }\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force given the inverse time step. Unit is N.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque due to the joint limit given the inverse time step.\n * Unit is N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n this.m_mass.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y\n * this.m_rB.y * iB;\n this.m_mass.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y\n * this.m_rB.x * iB;\n this.m_mass.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n this.m_mass.ex.y = this.m_mass.ey.x;\n this.m_mass.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x\n * this.m_rB.x * iB;\n this.m_mass.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n this.m_mass.ex.z = this.m_mass.ez.x;\n this.m_mass.ey.z = this.m_mass.ez.y;\n this.m_mass.ez.z = iA + iB;\n\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n\n if (this.m_enableMotor == false || fixedRotation) {\n this.m_motorImpulse = 0.0;\n }\n\n if (this.m_enableLimit && fixedRotation == false) {\n const jointAngle = aB - aA - this.m_referenceAngle; // float\n\n if (Math.abs(this.m_upperAngle - this.m_lowerAngle) < 2.0 * Settings.angularSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointAngle <= this.m_lowerAngle) {\n if (this.m_limitState != atLowerLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atLowerLimit;\n\n } else if (jointAngle >= this.m_upperAngle) {\n if (this.m_limitState != atUpperLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atUpperLimit;\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_motorImpulse + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_motorImpulse + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n // Solve motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits\n && fixedRotation == false) {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const impulse = Vec3.neg(this.m_mass.solve33(Cdot)); // Vec3\n\n if (this.m_limitState == equalLimits) {\n this.m_impulse.add(impulse);\n\n } else if (this.m_limitState == atLowerLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse < 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n\n } else if (this.m_limitState == atUpperLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse > 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n\n } else {\n // Solve point-to-point constraint\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const impulse = this.m_mass.solve22(Vec2.neg(Cdot)); // Vec2\n\n this.m_impulse.x += impulse.x;\n this.m_impulse.y += impulse.y;\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n let angularError = 0.0; // float\n let positionError = 0.0; // float\n\n const fixedRotation = (this.m_invIA + this.m_invIB == 0.0); // bool\n\n // Solve angular limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const angle = aB - aA - this.m_referenceAngle; // float\n let limitImpulse = 0.0; // float\n\n if (this.m_limitState == equalLimits) {\n // Prevent large angular corrections\n const C = Math.clamp(angle - this.m_lowerAngle,\n -Settings.maxAngularCorrection, Settings.maxAngularCorrection); // float\n limitImpulse = -this.m_motorMass * C;\n angularError = Math.abs(C);\n\n } else if (this.m_limitState == atLowerLimit) {\n let C = angle - this.m_lowerAngle; // float\n angularError = -C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C + Settings.angularSlop, -Settings.maxAngularCorrection,\n 0.0);\n limitImpulse = -this.m_motorMass * C;\n\n } else if (this.m_limitState == atUpperLimit) {\n let C = angle - this.m_upperAngle; // float\n angularError = C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C - Settings.angularSlop, 0.0,\n Settings.maxAngularCorrection);\n limitImpulse = -this.m_motorMass * C;\n }\n\n aA -= this.m_invIA * limitImpulse;\n aB += this.m_invIB * limitImpulse;\n }\n\n // Solve point-to-point constraint.\n {\n qA.setAngle(aA);\n qB.setAngle(aB);\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n\n const C = Vec2.zero();\n C.addCombine(1, cB, 1, rB);\n C.subCombine(1, cA, 1, rA);\n positionError = C.length();\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y;\n K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x;\n\n const impulse = Vec2.neg(K.solve(C)); // Vec2\n\n cA.subMul(mA, impulse);\n aA -= iA * Vec2.crossVec2Vec2(rA, impulse);\n\n cB.addMul(mB, impulse);\n aB += iB * Vec2.crossVec2Vec2(rB, impulse);\n }\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Vec3 from '../../common/Vec3';\nimport Mat22 from '../../common/Mat22';\nimport Mat33 from '../../common/Mat33';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointOpt extends JointOpt {\n /**\n * Enable/disable the joint limit.\n */\n enableLimit?: boolean;\n /**\n * The lower translation limit, usually in meters.\n */\n lowerTranslation?: number;\n /**\n * The upper translation limit, usually in meters.\n */\n upperTranslation?: number;\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorForce?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n}\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointDef extends JointDef, PrismaticJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation unit axis in bodyA.\n */\n localAxisA: Vec2;\n /**\n * referenceAngle The constrained angle between the bodies:\n * bodyB_angle - bodyA_angle.\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n enableLimit : false,\n lowerTranslation : 0.0,\n upperTranslation : 0.0,\n enableMotor : false,\n maxMotorForce : 0.0,\n motorSpeed : 0.0\n};\n\n/**\n * A prismatic joint. This joint provides one degree of freedom: translation\n * along an axis fixed in bodyA. Relative rotation is prevented. You can use a\n * joint limit to restrict the range of motion and a joint motor to drive the\n * motion or to model joint friction.\n */\nexport default class PrismaticJoint extends Joint {\n static TYPE = 'prismatic-joint' as const;\n\n /** @internal */ m_type: 'prismatic-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerTranslation: number;\n /** @internal */ m_upperTranslation: number;\n /** @internal */ m_maxMotorForce: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n /** @internal */ m_limitState: number; // TODO enum\n /** @internal */ m_axis: Vec2;\n /** @internal */ m_perp: Vec2;\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_s1: number;\n /** @internal */ m_s2: number;\n /** @internal */ m_a1: number;\n /** @internal */ m_a2: number;\n /** @internal */ m_K: Mat33;\n\n constructor(def: PrismaticJointDef);\n constructor(def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n constructor(def: PrismaticJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (!(this instanceof PrismaticJoint)) {\n return new PrismaticJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PrismaticJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || Vec2.neo(1.0, 0.0));\n this.m_localXAxisA.normalize();\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n\n this.m_lowerTranslation = def.lowerTranslation;\n this.m_upperTranslation = def.upperTranslation;\n this.m_maxMotorForce = def.maxMotorForce;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n this.m_limitState = inactiveLimit;\n\n this.m_axis = Vec2.zero();\n this.m_perp = Vec2.zero();\n\n this.m_K = new Mat33();\n\n // Linear constraint (point-to-line)\n // d = p2 - p1 = x2 + r2 - x1 - r1\n // C = dot(perp, d)\n // Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 -\n // cross(w1, r1))\n // = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) +\n // dot(cross(r2, perp), v2)\n // J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)]\n //\n // Angular constraint\n // C = a2 - a1 + a_initial\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n //\n // K = J * invM * JT\n //\n // J = [-a -s1 a s2]\n // [0 -1 0 1]\n // a = perp\n // s1 = cross(d + r1, a) = cross(p2 - x1, a)\n // s2 = cross(r2, a) = cross(p2 - x2, a)\n\n // Motor/Limit linear constraint\n // C = dot(ax1, d)\n // Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) +\n // dot(cross(r2, ax1), v2)\n // J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)]\n\n // Block Solver\n // We develop a block solver that includes the joint limit. This makes the\n // limit stiff (inelastic) even\n // when the mass has poor distribution (leading to large torques about the\n // joint anchor points).\n //\n // The Jacobian has 3 rows:\n // J = [-uT -s1 uT s2] // linear\n // [0 -1 0 1] // angular\n // [-vT -a1 vT a2] // limit\n //\n // u = perp\n // v = axis\n // s1 = cross(d + r1, u), s2 = cross(r2, u)\n // a1 = cross(d + r1, v), a2 = cross(r2, v)\n\n // M * (v2 - v1) = JT * df\n // J * v2 = bias\n //\n // v2 = v1 + invM * JT * df\n // J * (v1 + invM * JT * df) = bias\n // K * df = bias - J * v1 = -Cdot\n // K = J * invM * JT\n // Cdot = J * v1 - bias\n //\n // Now solve for f2.\n // df = f2 - f1\n // K * (f2 - f1) = -Cdot\n // f2 = invK * (-Cdot) + f1\n //\n // Clamp accumulated limit impulse.\n // lower: f2(3) = max(f2(3), 0)\n // upper: f2(3) = min(f2(3), 0)\n //\n // Solve for correct f2(1:2)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1\n // = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) +\n // K(1:2,1:2) * f1(1:2)\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n //\n // Now compute impulse to be applied:\n // df = f2 - f1\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerTranslation: this.m_lowerTranslation,\n upperTranslation: this.m_upperTranslation,\n maxMotorForce: this.m_maxMotorForce,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PrismaticJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.localAxisA = Vec2.clone(data.localAxisA);\n const joint = new PrismaticJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const pA = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const pB = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const d = Vec2.sub(pB, pA);\n const axis = this.m_bodyA.getWorldVector(this.m_localXAxisA);\n\n const translation = Vec2.dot(d, axis);\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const rA = Rot.mulVec2(bA.m_xf.q, Vec2.sub(this.m_localAnchorA, bA.m_sweep.localCenter)); // Vec2\n const rB = Rot.mulVec2(bB.m_xf.q, Vec2.sub(this.m_localAnchorB, bB.m_sweep.localCenter)); // Vec2\n const p1 = Vec2.add(bA.m_sweep.c, rA); // Vec2\n const p2 = Vec2.add(bB.m_sweep.c, rB); // Vec2\n const d = Vec2.sub(p2, p1); // Vec2\n const axis = Rot.mulVec2(bA.m_xf.q, this.m_localXAxisA); // Vec2\n\n const vA = bA.m_linearVelocity; // Vec2\n const vB = bB.m_linearVelocity; // Vec2\n const wA = bA.m_angularVelocity; // float\n const wB = bB.m_angularVelocity; // float\n\n const speed = Vec2.dot(d, Vec2.crossNumVec2(wA, axis))\n + Vec2.dot(axis, Vec2.sub(Vec2.addCrossNumVec2(vB, wB, rB), Vec2.addCrossNumVec2(vA, wA, rA))); // float\n return speed;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit, usually in meters.\n */\n getLowerLimit(): number {\n return this.m_lowerTranslation;\n }\n\n /**\n * Get the upper joint limit, usually in meters.\n */\n getUpperLimit(): number {\n return this.m_upperTranslation;\n }\n\n /**\n * Set the joint limits, usually in meters.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && common.assert(lower <= upper);\n if (lower != this.m_lowerTranslation || upper != this.m_upperTranslation) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_lowerTranslation = lower;\n this.m_upperTranslation = upper;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in meters per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Set the maximum motor force, usually in N.\n */\n setMaxMotorForce(force: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorForce = force;\n }\n\n getMaxMotorForce(): number {\n return this.m_maxMotorForce;\n }\n\n /**\n * Get the motor speed, usually in meters per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Get the current motor force given the inverse time step, usually in N.\n */\n getMotorForce(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + this.m_impulse.z, this.m_axis).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.y;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute motor Jacobian and effective mass.\n {\n this.m_axis = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_axis);\n this.m_a2 = Vec2.crossVec2Vec2(rB, this.m_axis);\n\n this.m_motorMass = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2\n * this.m_a2;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n }\n\n // Prismatic constraint.\n {\n this.m_perp = Rot.mulVec2(qA, this.m_localYAxisA);\n\n this.m_s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_perp);\n this.m_s2 = Vec2.crossVec2Vec2(rB, this.m_perp);\n\n const s1test = Vec2.crossVec2Vec2(rA, this.m_perp);\n\n const k11 = mA + mB + iA * this.m_s1 * this.m_s1 + iB * this.m_s2 * this.m_s2;\n const k12 = iA * this.m_s1 + iB * this.m_s2;\n const k13 = iA * this.m_s1 * this.m_a1 + iB * this.m_s2 * this.m_a2;\n let k22 = iA + iB;\n if (k22 == 0.0) {\n // For bodies with fixed rotation.\n k22 = 1.0;\n }\n const k23 = iA * this.m_a1 + iB * this.m_a2;\n const k33 = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 * this.m_a2;\n\n this.m_K.ex.set(k11, k12, k13);\n this.m_K.ey.set(k12, k22, k23);\n this.m_K.ez.set(k13, k23, k33);\n }\n\n // Compute motor and limit terms.\n if (this.m_enableLimit) {\n\n const jointTranslation = Vec2.dot(this.m_axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * Settings.linearSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointTranslation <= this.m_lowerTranslation) {\n if (this.m_limitState != atLowerLimit) {\n this.m_limitState = atLowerLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else if (jointTranslation >= this.m_upperTranslation) {\n if (this.m_limitState != atUpperLimit) {\n this.m_limitState = atUpperLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n if (this.m_enableMotor == false) {\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse\n + this.m_impulse.z, this.m_axis);\n const LA = this.m_impulse.x * this.m_s1 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1;\n const LB = this.m_impulse.x * this.m_s2 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Solve linear motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits) {\n const Cdot = Vec2.dot(this.m_axis, Vec2.sub(vB, vA)) + this.m_a2 * wB\n - this.m_a1 * wA;\n let impulse = this.m_motorMass * (this.m_motorSpeed - Cdot);\n const oldImpulse = this.m_motorImpulse;\n const maxImpulse = step.dt * this.m_maxMotorForce;\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_axis);\n const LA = impulse * this.m_a1;\n const LB = impulse * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n const Cdot1 = Vec2.zero();\n Cdot1.x += Vec2.dot(this.m_perp, vB) + this.m_s2 * wB;\n Cdot1.x -= Vec2.dot(this.m_perp, vA) + this.m_s1 * wA;\n Cdot1.y = wB - wA;\n\n if (this.m_enableLimit && this.m_limitState != inactiveLimit) {\n // Solve prismatic and limit constraint in block form.\n let Cdot2 = 0;\n Cdot2 += Vec2.dot(this.m_axis, vB) + this.m_a2 * wB;\n Cdot2 -= Vec2.dot(this.m_axis, vA) + this.m_a1 * wA;\n\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const f1 = Vec3.clone(this.m_impulse);\n let df = this.m_K.solve33(Vec3.neg(Cdot)); // Vec3\n this.m_impulse.add(df);\n\n if (this.m_limitState == atLowerLimit) {\n this.m_impulse.z = Math.max(this.m_impulse.z, 0.0);\n } else if (this.m_limitState == atUpperLimit) {\n this.m_impulse.z = Math.min(this.m_impulse.z, 0.0);\n }\n\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n const b = Vec2.combine(-1, Cdot1, -(this.m_impulse.z - f1.z), Vec2.neo(this.m_K.ez.x, this.m_K.ez.y)); // Vec2\n const f2r = Vec2.add(this.m_K.solve22(b), Vec2.neo(f1.x, f1.y)); // Vec2\n this.m_impulse.x = f2r.x;\n this.m_impulse.y = f2r.y;\n\n df = Vec3.sub(this.m_impulse, f1);\n\n const P = Vec2.combine(df.x, this.m_perp, df.z, this.m_axis); // Vec2\n const LA = df.x * this.m_s1 + df.y + df.z * this.m_a1; // float\n const LB = df.x * this.m_s2 + df.y + df.z * this.m_a2; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n // Limit is inactive, just solve the prismatic constraint in block form.\n const df = this.m_K.solve22(Vec2.neg(Cdot1)); // Vec2\n this.m_impulse.x += df.x;\n this.m_impulse.y += df.y;\n\n const P = Vec2.mulNumVec2(df.x, this.m_perp); // Vec2\n const LA = df.x * this.m_s1 + df.y; // float\n const LB = df.x * this.m_s2 + df.y; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute fresh Jacobians\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n const d = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); // Vec2\n\n const axis = Rot.mulVec2(qA, this.m_localXAxisA); // Vec2\n const a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), axis); // float\n const a2 = Vec2.crossVec2Vec2(rB, axis); // float\n const perp = Rot.mulVec2(qA, this.m_localYAxisA); // Vec2\n\n const s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), perp); // float\n const s2 = Vec2.crossVec2Vec2(rB, perp); // float\n\n let impulse = new Vec3();\n const C1 = Vec2.zero(); // Vec2\n C1.x = Vec2.dot(perp, d);\n C1.y = aB - aA - this.m_referenceAngle;\n\n let linearError = Math.abs(C1.x); // float\n const angularError = Math.abs(C1.y); // float\n\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n let active = false; // bool\n let C2 = 0.0; // float\n if (this.m_enableLimit) {\n\n const translation = Vec2.dot(axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * linearSlop) {\n // Prevent large angular corrections\n C2 = Math.clamp(translation, -maxLinearCorrection, maxLinearCorrection);\n linearError = Math.max(linearError, Math.abs(translation));\n active = true;\n\n } else if (translation <= this.m_lowerTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_lowerTranslation + linearSlop,\n -maxLinearCorrection, 0.0);\n linearError = Math\n .max(linearError, this.m_lowerTranslation - translation);\n active = true;\n\n } else if (translation >= this.m_upperTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_upperTranslation - linearSlop, 0.0,\n maxLinearCorrection);\n linearError = Math\n .max(linearError, translation - this.m_upperTranslation);\n active = true;\n }\n }\n\n if (active) {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n const k13 = iA * s1 * a1 + iB * s2 * a2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n // For fixed rotation\n k22 = 1.0;\n }\n const k23 = iA * a1 + iB * a2; // float\n const k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; // float\n\n const K = new Mat33();\n K.ex.set(k11, k12, k13);\n K.ey.set(k12, k22, k23);\n K.ez.set(k13, k23, k33);\n\n const C = new Vec3();\n C.x = C1.x;\n C.y = C1.y;\n C.z = C2;\n\n impulse = K.solve33(Vec3.neg(C));\n } else {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n k22 = 1.0;\n }\n\n const K = new Mat22();\n K.ex.setNum(k11, k12);\n K.ey.setNum(k12, k22);\n\n const impulse1 = K.solve(Vec2.neg(C1)); // Vec2\n impulse.x = impulse1.x;\n impulse.y = impulse1.y;\n impulse.z = 0.0;\n }\n\n const P = Vec2.combine(impulse.x, perp, impulse.z, axis); // Vec2\n const LA = impulse.x * s1 + impulse.y + impulse.z * a1; // float\n const LB = impulse.x * s2 + impulse.y + impulse.z * a2; // float\n\n cA.subMul(mA, P);\n aA -= iA * LA;\n cB.addMul(mB, P);\n aB += iB * LB;\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport RevoluteJoint from './RevoluteJoint';\nimport PrismaticJoint from './PrismaticJoint';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Gear joint definition.\n */\nexport interface GearJointOpt extends JointOpt {\n /**\n * The gear ratio. See {@link GearJoint} for explanation.\n */\n ratio?: number;\n}\n/**\n * Gear joint definition.\n */\nexport interface GearJointDef extends JointDef, GearJointOpt {\n /**\n * The first revolute/prismatic joint attached to the gear joint.\n */\n joint1: RevoluteJoint | PrismaticJoint;\n /**\n * The second prismatic/revolute joint attached to the gear joint.\n */\n joint2: RevoluteJoint | PrismaticJoint;\n}\n\nconst DEFAULTS = {\n ratio : 1.0\n};\n\n/**\n * A gear joint is used to connect two joints together. Either joint can be a\n * revolute or prismatic joint. You specify a gear ratio to bind the motions\n * together: coordinate1 + ratio * coordinate2 = constant\n *\n * The ratio can be negative or positive. If one joint is a revolute joint and\n * the other joint is a prismatic joint, then the ratio will have units of\n * length or units of 1/length. Warning: You have to manually destroy the gear\n * joint if joint1 or joint2 is destroyed.\n *\n * This definition requires two existing revolute or prismatic joints (any\n * combination will work).\n */\nexport default class GearJoint extends Joint {\n static TYPE = 'gear-joint' as const;\n\n /** @internal */ m_type: 'gear-joint';\n /** @internal */ m_joint1: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_joint2: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_type1: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_type2: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_bodyC: Body;\n /** @internal */ m_localAnchorC: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_referenceAngleA: number;\n /** @internal */ m_localAxisC: Vec2;\n /** @internal */ m_bodyD: Body;\n /** @internal */ m_localAnchorD: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngleB: number;\n /** @internal */ m_localAxisD: Vec2;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_lcA: Vec2;\n /** @internal */ m_lcB: Vec2;\n /** @internal */ m_lcC: Vec2;\n /** @internal */ m_lcD: Vec2;\n /** @internal */ m_mA: number;\n /** @internal */ m_mB: number;\n /** @internal */ m_mC: number;\n /** @internal */ m_mD: number;\n /** @internal */ m_iA: number;\n /** @internal */ m_iB: number;\n /** @internal */ m_iC: number;\n /** @internal */ m_iD: number;\n /** @internal */ m_JvAC: Vec2;\n /** @internal */ m_JvBD: Vec2;\n /** @internal */ m_JwA: number;\n /** @internal */ m_JwB: number;\n /** @internal */ m_JwC: number;\n /** @internal */ m_JwD: number;\n /** @internal */ m_mass: number;\n\n constructor(def: GearJointDef);\n constructor(def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number);\n constructor(def: GearJointDef, bodyA?: Body, bodyB?: Body, joint1?: RevoluteJoint | PrismaticJoint, joint2?: RevoluteJoint | PrismaticJoint, ratio?: number) {\n // @ts-ignore\n if (!(this instanceof GearJoint)) {\n return new GearJoint(def, bodyA, bodyB, joint1, joint2, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = GearJoint.TYPE;\n\n _ASSERT && common.assert(joint1.m_type === RevoluteJoint.TYPE\n || joint1.m_type === PrismaticJoint.TYPE);\n _ASSERT && common.assert(joint2.m_type === RevoluteJoint.TYPE\n || joint2.m_type === PrismaticJoint.TYPE);\n\n this.m_joint1 = joint1 ? joint1 : def.joint1;\n this.m_joint2 = joint2 ? joint2 : def.joint2;\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n this.m_type1 = this.m_joint1.getType() as 'revolute-joint' | 'prismatic-joint';\n this.m_type2 = this.m_joint2.getType() as 'revolute-joint' | 'prismatic-joint';\n\n // joint1 connects body A to body C\n // joint2 connects body B to body D\n\n let coordinateA: number;\n let coordinateB: number;\n\n // TODO_ERIN there might be some problem with the joint edges in Joint.\n\n this.m_bodyC = this.m_joint1.getBodyA();\n this.m_bodyA = this.m_joint1.getBodyB();\n\n // Get geometry of joint1\n const xfA = this.m_bodyA.m_xf;\n const aA = this.m_bodyA.m_sweep.a;\n const xfC = this.m_bodyC.m_xf;\n const aC = this.m_bodyC.m_sweep.a;\n\n if (this.m_type1 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint1 as RevoluteJoint;\n this.m_localAnchorC = revolute.m_localAnchorA;\n this.m_localAnchorA = revolute.m_localAnchorB;\n this.m_referenceAngleA = revolute.m_referenceAngle;\n this.m_localAxisC = Vec2.zero();\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const prismatic = this.m_joint1 as PrismaticJoint;\n this.m_localAnchorC = prismatic.m_localAnchorA;\n this.m_localAnchorA = prismatic.m_localAnchorB;\n this.m_referenceAngleA = prismatic.m_referenceAngle;\n this.m_localAxisC = prismatic.m_localXAxisA;\n\n const pC = this.m_localAnchorC;\n const pA = Rot.mulTVec2(xfC.q, Vec2.add(Rot.mulVec2(xfA.q, this.m_localAnchorA), Vec2.sub(xfA.p, xfC.p)));\n coordinateA = Vec2.dot(pA, this.m_localAxisC) - Vec2.dot(pC, this.m_localAxisC);\n }\n\n this.m_bodyD = this.m_joint2.getBodyA();\n this.m_bodyB = this.m_joint2.getBodyB();\n\n // Get geometry of joint2\n const xfB = this.m_bodyB.m_xf;\n const aB = this.m_bodyB.m_sweep.a;\n const xfD = this.m_bodyD.m_xf;\n const aD = this.m_bodyD.m_sweep.a;\n\n if (this.m_type2 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint2 as RevoluteJoint;\n this.m_localAnchorD = revolute.m_localAnchorA;\n this.m_localAnchorB = revolute.m_localAnchorB;\n this.m_referenceAngleB = revolute.m_referenceAngle;\n this.m_localAxisD = Vec2.zero();\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const prismatic = this.m_joint2 as PrismaticJoint;\n this.m_localAnchorD = prismatic.m_localAnchorA;\n this.m_localAnchorB = prismatic.m_localAnchorB;\n this.m_referenceAngleB = prismatic.m_referenceAngle;\n this.m_localAxisD = prismatic.m_localXAxisA;\n\n const pD = this.m_localAnchorD;\n const pB = Rot.mulTVec2(xfD.q, Vec2.add(Rot.mulVec2(xfB.q, this.m_localAnchorB), Vec2.sub(xfB.p, xfD.p)));\n coordinateB = Vec2.dot(pB, this.m_localAxisD) - Vec2.dot(pD, this.m_localAxisD);\n }\n\n this.m_constant = coordinateA + this.m_ratio * coordinateB;\n\n this.m_impulse = 0.0;\n\n // Gear Joint:\n // C0 = (coordinate1 + ratio * coordinate2)_initial\n // C = (coordinate1 + ratio * coordinate2) - C0 = 0\n // J = [J1 ratio * J2]\n // K = J * invM * JT\n // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T\n //\n // Revolute:\n // coordinate = rotation\n // Cdot = angularVelocity\n // J = [0 0 1]\n // K = J * invM * JT = invI\n //\n // Prismatic:\n // coordinate = dot(p - pg, ug)\n // Cdot = dot(v + cross(w, r), ug)\n // J = [ug cross(r, ug)]\n // K = J * invM * JT = invMass + invI * cross(r, ug)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n joint1: this.m_joint1,\n joint2: this.m_joint2,\n ratio: this.m_ratio,\n\n // _constant: this.m_constant,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): GearJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.joint1 = restore(Joint, data.joint1, world);\n data.joint2 = restore(Joint, data.joint2, world);\n const joint = new GearJoint(data);\n // if (data._constant) joint.m_constant = data._constant;\n return joint;\n }\n\n /**\n * Get the first joint.\n */\n getJoint1(): Joint {\n return this.m_joint1;\n }\n\n /**\n * Get the second joint.\n */\n getJoint2(): Joint {\n return this.m_joint2;\n }\n\n /**\n * Set the gear ratio.\n */\n setRatio(ratio: number): void {\n _ASSERT && common.assert(Math.isFinite(ratio));\n this.m_ratio = ratio;\n }\n\n /**\n * Get the gear ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_JvAC).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n const L = this.m_impulse * this.m_JwA; // float\n return inv_dt * L;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_lcA = this.m_bodyA.m_sweep.localCenter;\n this.m_lcB = this.m_bodyB.m_sweep.localCenter;\n this.m_lcC = this.m_bodyC.m_sweep.localCenter;\n this.m_lcD = this.m_bodyD.m_sweep.localCenter;\n this.m_mA = this.m_bodyA.m_invMass;\n this.m_mB = this.m_bodyB.m_invMass;\n this.m_mC = this.m_bodyC.m_invMass;\n this.m_mD = this.m_bodyD.m_invMass;\n this.m_iA = this.m_bodyA.m_invI;\n this.m_iB = this.m_bodyB.m_invI;\n this.m_iC = this.m_bodyC.m_invI;\n this.m_iD = this.m_bodyD.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const aC = this.m_bodyC.c_position.a;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n\n const aD = this.m_bodyD.c_position.a;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n this.m_mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n this.m_JvAC = Vec2.zero();\n this.m_JwA = 1.0;\n this.m_JwC = 1.0;\n this.m_mass += this.m_iA + this.m_iC;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n this.m_JvAC = u;\n this.m_JwC = Vec2.crossVec2Vec2(rC, u);\n this.m_JwA = Vec2.crossVec2Vec2(rA, u);\n this.m_mass += this.m_mC + this.m_mA + this.m_iC * this.m_JwC * this.m_JwC + this.m_iA * this.m_JwA * this.m_JwA;\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n this.m_JvBD = Vec2.zero();\n this.m_JwB = this.m_ratio;\n this.m_JwD = this.m_ratio;\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD); // Vec2\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); // Vec2\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); // Vec2\n this.m_JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n this.m_JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n this.m_JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD * this.m_JwD * this.m_JwD + this.m_iB * this.m_JwB * this.m_JwB;\n }\n\n // Compute effective mass.\n this.m_mass = this.m_mass > 0.0 ? 1.0 / this.m_mass : 0.0;\n\n if (step.warmStarting) {\n vA.addMul(this.m_mA * this.m_impulse, this.m_JvAC);\n wA += this.m_iA * this.m_impulse * this.m_JwA;\n\n vB.addMul(this.m_mB * this.m_impulse, this.m_JvBD);\n wB += this.m_iB * this.m_impulse * this.m_JwB;\n\n vC.subMul(this.m_mC * this.m_impulse, this.m_JvAC);\n wC -= this.m_iC * this.m_impulse * this.m_JwC;\n\n vD.subMul(this.m_mD * this.m_impulse, this.m_JvBD);\n wD -= this.m_iD * this.m_impulse * this.m_JwD;\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n let Cdot = Vec2.dot(this.m_JvAC, vA) - Vec2.dot(this.m_JvAC, vC)\n + Vec2.dot(this.m_JvBD, vB) - Vec2.dot(this.m_JvBD, vD); // float\n Cdot += (this.m_JwA * wA - this.m_JwC * wC)\n + (this.m_JwB * wB - this.m_JwD * wD);\n\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n vA.addMul(this.m_mA * impulse, this.m_JvAC);\n wA += this.m_iA * impulse * this.m_JwA;\n vB.addMul(this.m_mB * impulse, this.m_JvBD);\n wB += this.m_iB * impulse * this.m_JwB;\n vC.subMul(this.m_mC * impulse, this.m_JvAC);\n wC -= this.m_iC * impulse * this.m_JwC;\n vD.subMul(this.m_mD * impulse, this.m_JvBD);\n wD -= this.m_iD * impulse * this.m_JwD;\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n const cC = this.m_bodyC.c_position.c;\n let aC = this.m_bodyC.c_position.a;\n const cD = this.m_bodyD.c_position.c;\n let aD = this.m_bodyD.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n const linearError = 0.0;\n\n let coordinateA: number;\n let coordinateB: number;\n\n let JvAC: Vec2;\n let JvBD: Vec2;\n let JwA: number;\n let JwB: number;\n let JwC: number;\n let JwD: number;\n let mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n JvAC = Vec2.zero();\n JwA = 1.0;\n JwC = 1.0;\n mass += this.m_iA + this.m_iC;\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n JvAC = u;\n JwC = Vec2.crossVec2Vec2(rC, u);\n JwA = Vec2.crossVec2Vec2(rA, u);\n mass += this.m_mC + this.m_mA + this.m_iC * JwC * JwC + this.m_iA * JwA * JwA;\n\n const pC = Vec2.sub(this.m_localAnchorC, this.m_lcC); // Vec2\n const pA = Rot.mulTVec2(qC, Vec2.add(rA, Vec2.sub(cA, cC))); // Vec2\n coordinateA = Vec2.dot(Vec2.sub(pA, pC), this.m_localAxisC);\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n JvBD = Vec2.zero();\n JwB = this.m_ratio;\n JwD = this.m_ratio;\n mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD);\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB);\n JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD\n * JwD * JwD + this.m_iB * JwB * JwB;\n\n const pD = Vec2.sub(this.m_localAnchorD, this.m_lcD); // Vec2\n const pB = Rot.mulTVec2(qD, Vec2.add(rB, Vec2.sub(cB, cD))); // Vec2\n coordinateB = Vec2.dot(pB, this.m_localAxisD)\n - Vec2.dot(pD, this.m_localAxisD);\n }\n\n const C = (coordinateA + this.m_ratio * coordinateB) - this.m_constant; // float\n\n let impulse = 0.0; // float\n if (mass > 0.0) {\n impulse = -C / mass;\n }\n\n cA.addMul(this.m_mA * impulse, JvAC);\n aA += this.m_iA * impulse * JwA;\n cB.addMul(this.m_mB * impulse, JvBD);\n aB += this.m_iB * impulse * JwB;\n cC.subMul(this.m_mC * impulse, JvAC);\n aC -= this.m_iC * impulse * JwC;\n cD.subMul(this.m_mD * impulse, JvBD);\n aD -= this.m_iD * impulse * JwD;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n this.m_bodyC.c_position.c.setVec2(cC);\n this.m_bodyC.c_position.a = aC;\n this.m_bodyD.c_position.c.setVec2(cD);\n this.m_bodyD.c_position.a = aD;\n\n // TODO_ERIN not implemented\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Mat22 from '../../common/Mat22';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Motor joint definition.\n */\nexport interface MotorJointOpt extends JointOpt {\n /**\n * The bodyB angle minus bodyA angle in radians.\n */\n angularOffset?: number;\n /**\n * The maximum motor force in N.\n */\n maxForce?: number;\n /**\n * The maximum motor torque in N-m.\n */\n maxTorque?: number;\n /**\n * Position correction factor in the range [0,1].\n */\n correctionFactor?: number;\n /**\n * Position of bodyB minus the position of bodyA, in bodyA's frame, in meters.\n */\n linearOffset?: Vec2;\n}\n/**\n * Motor joint definition.\n */\nexport interface MotorJointDef extends JointDef, MotorJointOpt {\n}\n\nconst DEFAULTS = {\n maxForce : 1.0,\n maxTorque : 1.0,\n correctionFactor : 0.3\n};\n\n/**\n * A motor joint is used to control the relative motion between two bodies. A\n * typical usage is to control the movement of a dynamic body with respect to\n * the ground.\n */\nexport default class MotorJoint extends Joint {\n static TYPE = 'motor-joint' as const;\n\n /** @internal */ m_type: 'motor-joint';\n /** @internal */ m_linearOffset: Vec2;\n /** @internal */ m_angularOffset: number;\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n /** @internal */ m_correctionFactor: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_linearError: Vec2;\n /** @internal */ m_angularError: number;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: MotorJointDef);\n constructor(def: MotorJointOpt, bodyA: Body, bodyB: Body);\n constructor(def: MotorJointDef | MotorJointOpt, bodyA?: Body, bodyB?: Body) {\n // @ts-ignore\n if (!(this instanceof MotorJoint)) {\n return new MotorJoint(def, bodyA, bodyB);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MotorJoint.TYPE;\n\n this.m_linearOffset = Math.isFinite(def.linearOffset) ? def.linearOffset : bodyA.getLocalPoint(bodyB.getPosition());\n this.m_angularOffset = Math.isFinite(def.angularOffset) ? def.angularOffset : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n this.m_correctionFactor = def.correctionFactor;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n correctionFactor: this.m_correctionFactor,\n\n linearOffset: this.m_linearOffset,\n angularOffset: this.m_angularOffset,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MotorJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new MotorJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {}): void {\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && common.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && common.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Set the position correction factor in the range [0,1].\n */\n setCorrectionFactor(factor: number): void {\n _ASSERT && common.assert(Math.isFinite(factor) && 0.0 <= factor && factor <= 1.0);\n this.m_correctionFactor = factor;\n }\n\n /**\n * Get the position correction factor in the range [0,1].\n */\n getCorrectionFactor(): number {\n return this.m_correctionFactor;\n }\n\n /**\n * Set/get the target linear offset, in frame A, in meters.\n */\n setLinearOffset(linearOffset: Vec2): void {\n if (linearOffset.x != this.m_linearOffset.x\n || linearOffset.y != this.m_linearOffset.y) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_linearOffset = linearOffset;\n }\n }\n\n getLinearOffset(): Vec2 {\n return this.m_linearOffset;\n }\n\n /**\n * Set/get the target angular offset, in radians.\n */\n setAngularOffset(angularOffset: number): void {\n if (angularOffset != this.m_angularOffset) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_angularOffset = angularOffset;\n }\n }\n\n getAngularOffset(): number {\n return this.m_angularOffset;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getPosition();\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getPosition();\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.neg(this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.neg(this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n this.m_linearError = Vec2.zero();\n this.m_linearError.addCombine(1, cB, 1, this.m_rB);\n this.m_linearError.subCombine(1, cA, 1, this.m_rA);\n this.m_linearError.sub(Rot.mulVec2(qA, this.m_linearOffset));\n\n this.m_angularError = aB - aA - this.m_angularOffset;\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt;\n const inv_h = step.inv_dt;\n\n // Solve angular friction\n {\n const Cdot = wB - wA + inv_h * this.m_correctionFactor * this.m_angularError;\n let impulse = -this.m_angularMass * Cdot;\n\n const oldImpulse = this.m_angularImpulse;\n const maxImpulse = h * this.m_maxTorque;\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n Cdot.addMul(inv_h * this.m_correctionFactor, this.m_linearError);\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot));\n const oldImpulse = Vec2.clone(this.m_linearImpulse);\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce;\n\n this.m_linearImpulse.clamp(maxImpulse);\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Mat22 from '../../common/Mat22';\nimport Rot from '../../common/Rot';\nimport Transform from '../../common/Transform';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointOpt extends JointOpt {\n /**\n * [maxForce = 0.0] The maximum constraint force that can be exerted to move\n * the candidate body. Usually you will express as some multiple of the\n * weight (multiplier * mass * gravity).\n */\n maxForce?: number;\n /**\n * [frequencyHz = 5.0] The response speed.\n */\n frequencyHz?: number;\n /**\n * [dampingRatio = 0.7] The damping ratio. 0 = no damping, 1 = critical\n * damping.\n */\n dampingRatio?: number;\n}\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointDef extends JointDef, MouseJointOpt {\n /**\n * The initial world target point. This is assumed to coincide with the body\n * anchor initially.\n */\n target: Vec2;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n frequencyHz : 5.0,\n dampingRatio : 0.7\n};\n\n/**\n * A mouse joint is used to make a point on a body track a specified world\n * point. This a soft constraint with a maximum force. This allows the\n * constraint to stretch and without applying huge forces.\n *\n * NOTE: this joint is not documented in the manual because it was developed to\n * be used in the testbed. If you want to learn how to use the mouse joint, look\n * at the testbed.\n */\nexport default class MouseJoint extends Joint {\n static TYPE = 'mouse-joint' as const;\n\n /** @internal */ m_type: 'mouse-joint';\n /** @internal */ m_targetA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_impulse: Vec2;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_beta: number;\n /** @internal */ m_gamma: number;\n // Solver temp\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat22;\n /** @internal */ m_C: Vec2;\n\n constructor(def: MouseJointDef);\n constructor(def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2);\n constructor(def: MouseJointDef, bodyA?: Body, bodyB?: Body, target?: Vec2) {\n // @ts-ignore\n if (!(this instanceof MouseJoint)) {\n return new MouseJoint(def, bodyA, bodyB, target);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MouseJoint.TYPE;\n\n _ASSERT && common.assert(Math.isFinite(def.maxForce) && def.maxForce >= 0.0);\n _ASSERT && common.assert(Math.isFinite(def.frequencyHz) && def.frequencyHz >= 0.0);\n _ASSERT && common.assert(Math.isFinite(def.dampingRatio) && def.dampingRatio >= 0.0);\n\n this.m_targetA = target ? Vec2.clone(target) : def.target || Vec2.zero();\n this.m_localAnchorB = Transform.mulTVec2(bodyB.getTransform(), this.m_targetA);\n\n this.m_maxForce = def.maxForce;\n this.m_impulse = Vec2.zero();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_beta = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rB = Vec2.zero();\n this.m_localCenterB = Vec2.zero();\n this.m_invMassB = 0.0;\n this.m_invIB = 0.0;\n this.m_mass = new Mat22();\n this.m_C = Vec2.zero();\n\n // p = attached point, m = mouse point\n // C = p - m\n // Cdot = v\n // = v + cross(w, r)\n // J = [I r_skew]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n target: this.m_targetA,\n maxForce: this.m_maxForce,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n _localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MouseJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.target = Vec2.clone(data.target);\n const joint = new MouseJoint(data);\n if (data._localAnchorB) {\n joint.m_localAnchorB = data._localAnchorB;\n }\n return joint;\n }\n\n /**\n * Use this to update the target point.\n */\n setTarget(target: Vec2): void {\n if (this.m_bodyB.isAwake() == false) {\n this.m_bodyB.setAwake(true);\n }\n this.m_targetA = Vec2.clone(target);\n }\n\n getTarget(): Vec2 {\n return this.m_targetA;\n }\n\n /**\n * Set the maximum force in Newtons.\n */\n setMaxForce(force: number): void {\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum force in Newtons.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the frequency in Hertz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get the frequency in Hertz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set the damping ratio (dimensionless).\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get the damping ratio (dimensionless).\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return Vec2.clone(this.m_targetA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_impulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * 0.0;\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_targetA.sub(newOrigin);\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const position = this.m_bodyB.c_position;\n const velocity = this.m_bodyB.c_velocity;\n\n const cB = position.c;\n const aB = position.a;\n const vB = velocity.v;\n let wB = velocity.w;\n\n const qB = Rot.neo(aB);\n\n const mass = this.m_bodyB.getMass();\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = mass * (omega * omega);\n\n // magic formulas\n // gamma has units of inverse mass.\n // beta has units of inverse time.\n const h = step.dt;\n _ASSERT && common.assert(d + h * k > Math.EPSILON);\n this.m_gamma = h * (d + h * k);\n if (this.m_gamma != 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n this.m_beta = h * k * this.m_gamma;\n\n // Compute the effective mass matrix.\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) *\n // invI2 * skew(r2)]\n // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y\n // -r1.x*r1.y]\n // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x]\n const K = new Mat22();\n K.ex.x = this.m_invMassB + this.m_invIB * this.m_rB.y * this.m_rB.y\n + this.m_gamma;\n K.ex.y = -this.m_invIB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = this.m_invMassB + this.m_invIB * this.m_rB.x * this.m_rB.x\n + this.m_gamma;\n\n this.m_mass = K.getInverse();\n\n this.m_C.setVec2(cB);\n this.m_C.addCombine(1, this.m_rB, -1, this.m_targetA);\n this.m_C.mul(this.m_beta);\n\n // Cheat with some damping\n wB *= 0.98;\n\n if (step.warmStarting) {\n this.m_impulse.mul(step.dtRatio);\n vB.addMul(this.m_invMassB, this.m_impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, this.m_impulse);\n\n } else {\n this.m_impulse.setZero();\n }\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const velocity = this.m_bodyB.c_velocity;\n const vB = Vec2.clone(velocity.v);\n let wB = velocity.w;\n\n // Cdot = v + cross(w, r)\n\n const Cdot = Vec2.crossNumVec2(wB, this.m_rB);\n Cdot.add(vB);\n\n Cdot.addCombine(1, this.m_C, this.m_gamma, this.m_impulse);\n Cdot.neg();\n\n let impulse = Mat22.mulVec2(this.m_mass, Cdot);\n\n const oldImpulse = Vec2.clone(this.m_impulse);\n this.m_impulse.add(impulse);\n const maxImpulse = step.dt * this.m_maxForce;\n this.m_impulse.clamp(maxImpulse);\n impulse = Vec2.sub(this.m_impulse, oldImpulse);\n\n vB.addMul(this.m_invMassB, impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\n// tslint:disable-next-line:no-empty-interface\nexport interface PulleyJointOpt extends JointOpt {\n}\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\nexport interface PulleyJointDef extends JointDef, PulleyJointOpt {\n /**\n * The first ground anchor in world coordinates. This point never moves.\n */\n groundAnchorA: Vec2;\n /**\n * The second ground anchor in world coordinates. This point never moves.\n */\n groundAnchorB: Vec2;\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The reference length for the segment attached to bodyA.\n */\n lengthA: number;\n /**\n * The reference length for the segment attached to bodyB.\n */\n lengthB: number;\n /**\n * The pulley ratio, used to simulate a block-and-tackle.\n */\n ratio: number;\n}\n\nconst DEFAULTS = {\n collideConnected : true\n};\n\n/**\n * The pulley joint is connected to two bodies and two fixed ground points. The\n * pulley supports a ratio such that: length1 + ratio * length2 <= constant\n *\n * Yes, the force transmitted is scaled by the ratio.\n *\n * Warning: the pulley joint can get a bit squirrelly by itself. They often work\n * better when combined with prismatic joints. You should also cover the the\n * anchor points with static shapes to prevent one side from going to zero\n * length.\n */\nexport default class PulleyJoint extends Joint {\n static TYPE = 'pulley-joint' as const;\n // static MIN_PULLEY_LENGTH: number = 2.0; // TODO where this is used?\n\n /** @internal */ m_type: 'pulley-joint';\n /** @internal */ m_groundAnchorA: Vec2;\n /** @internal */ m_groundAnchorB: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_lengthA: number;\n /** @internal */ m_lengthB: number;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_uA: Vec2;\n /** @internal */ m_uB: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: PulleyJointDef);\n constructor(def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number);\n constructor(def: PulleyJointDef, bodyA?: Body, bodyB?: Body, groundA?: Vec2, groundB?: Vec2, anchorA?: Vec2, anchorB?: Vec2, ratio?: number) {\n // @ts-ignore\n if (!(this instanceof PulleyJoint)) {\n return new PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PulleyJoint.TYPE;\n this.m_groundAnchorA = groundA ? groundA : def.groundAnchorA || Vec2.neo(-1.0, 1.0);\n this.m_groundAnchorB = groundB ? groundB : def.groundAnchorB || Vec2.neo(1.0, 1.0);\n this.m_localAnchorA = anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n this.m_lengthA = Math.isFinite(def.lengthA) ? def.lengthA : Vec2.distance(anchorA, groundA);\n this.m_lengthB = Math.isFinite(def.lengthB) ? def.lengthB : Vec2.distance(anchorB, groundB);\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n _ASSERT && common.assert(ratio > Math.EPSILON);\n\n this.m_constant = this.m_lengthA + this.m_ratio * this.m_lengthB;\n\n this.m_impulse = 0.0;\n\n // Pulley:\n // length1 = norm(p1 - s1)\n // length2 = norm(p2 - s2)\n // C0 = (length1 + ratio * length2)_initial\n // C = C0 - (length1 + ratio * length2)\n // u1 = (p1 - s1) / norm(p1 - s1)\n // u2 = (p2 - s2) / norm(p2 - s2)\n // Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2))\n // J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 *\n // cross(r2, u2)^2)\n }\n\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n groundAnchorA: this.m_groundAnchorA,\n groundAnchorB: this.m_groundAnchorB,\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n lengthA: this.m_lengthA,\n lengthB: this.m_lengthB,\n ratio: this.m_ratio,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PulleyJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new PulleyJoint(data);\n return joint;\n }\n\n /**\n * Get the first ground anchor.\n */\n getGroundAnchorA(): Vec2 {\n return this.m_groundAnchorA;\n }\n\n /**\n * Get the second ground anchor.\n */\n getGroundAnchorB(): Vec2 {\n return this.m_groundAnchorB;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getLengthA(): number {\n return this.m_lengthA;\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getLengthB(): number {\n return this.m_lengthB;\n }\n\n /**\n * Get the pulley ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getCurrentLengthA(): number {\n const p = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const s = this.m_groundAnchorA;\n return Vec2.distance(p, s);\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getCurrentLengthB(): number {\n const p = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const s = this.m_groundAnchorB;\n return Vec2.distance(p, s);\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n *\n * @param newOrigin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_groundAnchorA.sub(newOrigin);\n this.m_groundAnchorB.sub(newOrigin);\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_uB).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n this.m_uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n this.m_uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = this.m_uA.length();\n const lengthB = this.m_uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n this.m_uA.mul(1.0 / lengthA);\n } else {\n this.m_uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n this.m_uB.mul(1.0 / lengthB);\n } else {\n this.m_uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(this.m_rA, this.m_uA); // float\n const ruB = Vec2.crossVec2Vec2(this.m_rB, this.m_uB); // float\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n this.m_mass = mA + this.m_ratio * this.m_ratio * mB;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support variable time steps.\n this.m_impulse *= step.dtRatio;\n\n // Warm starting.\n const PA = Vec2.mulNumVec2(-this.m_impulse, this.m_uA);\n const PB = Vec2.mulNumVec2(-this.m_ratio * this.m_impulse, this.m_uB);\n\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n\n const Cdot = -Vec2.dot(this.m_uA, vpA) - this.m_ratio\n * Vec2.dot(this.m_uB, vpB); // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const PA = Vec2.mulNumVec2(-impulse, this.m_uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, this.m_uB); // Vec2\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n const uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n const uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = uA.length();\n const lengthB = uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n uA.mul(1.0 / lengthA);\n } else {\n uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n uB.mul(1.0 / lengthB);\n } else {\n uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(rA, uA);\n const ruB = Vec2.crossVec2Vec2(rB, uB);\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n let mass = mA + this.m_ratio * this.m_ratio * mB; // float\n\n if (mass > 0.0) {\n mass = 1.0 / mass;\n }\n\n const C = this.m_constant - lengthA - this.m_ratio * lengthB; // float\n const linearError = Math.abs(C); // float\n\n const impulse = -mass * C; // float\n\n const PA = Vec2.mulNumVec2(-impulse, uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, uB); // Vec2\n\n cA.addMul(this.m_invMassA, PA);\n aA += this.m_invIA * Vec2.crossVec2Vec2(rA, PA);\n cB.addMul(this.m_invMassB, PB);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, PB);\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointOpt extends JointOpt {\n /**\n * The maximum length of the rope.\n * Warning: this must be larger than linearSlop or the joint will have no effect.\n */\n maxLength?: number;\n}\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointDef extends JointDef, RopeJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxLength : 0.0,\n};\n\n/**\n * A rope joint enforces a maximum distance between two points on two bodies. It\n * has no other effect.\n *\n * Warning: if you attempt to change the maximum length during the simulation\n * you will get some non-physical behavior.\n *\n * A model that would allow you to dynamically modify the length would have some\n * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you\n * want to dynamically control length.\n */\nexport default class RopeJoint extends Joint {\n static TYPE = 'rope-joint' as const;\n\n /** @internal */ m_type: 'rope-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n /** @internal */ m_maxLength: number;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_length: number;\n /** @internal */ m_state: number; // TODO enum\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n constructor(def: RopeJointDef);\n constructor(def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: RopeJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (!(this instanceof RopeJoint)) {\n return new RopeJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RopeJoint.TYPE;\n this.m_localAnchorA = anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n\n this.m_maxLength = def.maxLength;\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_length = 0.0;\n this.m_state = inactiveLimit;\n\n // Limit:\n // C = norm(pB - pA) - L\n // u = (pB - pA) / norm(pB - pA)\n // Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA))\n // J = [-u -cross(rA, u) u cross(rB, u)]\n // K = J * invM * JT\n // = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n maxLength: this.m_maxLength,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): RopeJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RopeJoint(data);\n return joint;\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum length of the rope.\n */\n setMaxLength(length: number): void {\n this.m_maxLength = length;\n }\n\n /**\n * Get the maximum length of the rope.\n */\n getMaxLength(): number {\n return this.m_maxLength;\n }\n\n getLimitState(): number {\n // TODO LimitState\n return this.m_state;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n this.m_rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n this.m_u = Vec2.zero();\n this.m_u.addCombine(1, cB, 1, this.m_rB);\n this.m_u.subCombine(1, cA, 1, this.m_rA); // Vec2\n\n this.m_length = this.m_u.length();\n\n const C = this.m_length - this.m_maxLength; // float\n if (C > 0.0) {\n this.m_state = atUpperLimit;\n } else {\n this.m_state = inactiveLimit;\n }\n\n if (this.m_length > Settings.linearSlop) {\n this.m_u.mul(1.0 / this.m_length);\n } else {\n this.m_u.setZero();\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n return;\n }\n\n // Compute effective mass.\n const crA = Vec2.crossVec2Vec2(this.m_rA, this.m_u); // float\n const crB = Vec2.crossVec2Vec2(this.m_rB, this.m_u); // float\n const invMass = this.m_invMassA + this.m_invIA * crA * crA + this.m_invMassB\n + this.m_invIB * crB * crB; // float\n\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.addCrossNumVec2(vA, wA, this.m_rA); // Vec2\n const vpB = Vec2.addCrossNumVec2(vB, wB, this.m_rB); // Vec2\n const C = this.m_length - this.m_maxLength; // float\n let Cdot = Vec2.dot(this.m_u, Vec2.sub(vpB, vpA)); // float\n\n // Predictive constraint.\n if (C < 0.0) {\n Cdot += step.inv_dt * C;\n }\n\n let impulse = -this.m_mass * Cdot; // float\n const oldImpulse = this.m_impulse; // float\n this.m_impulse = Math.min(0.0, this.m_impulse + impulse);\n impulse = this.m_impulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u); // Vec2\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c; // Vec2\n let aA = this.m_bodyA.c_position.a; // float\n const cB = this.m_bodyB.c_position.c; // Vec2\n let aB = this.m_bodyB.c_position.a; // float\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.zero();\n u.addCombine(1, cB, 1, rB);\n u.subCombine(1, cA, 1, rA); // Vec2\n\n const length = u.normalize(); // float\n let C = length - this.m_maxLength; // float\n\n C = Math.clamp(C, 0.0, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C; // float\n const P = Vec2.mulNumVec2(impulse, u); // Vec2\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return length - this.m_maxLength < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Vec3 from '../../common/Vec3';\nimport Mat33 from '../../common/Mat33';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n *\n * @prop {float} frequencyHz\n * @prop {float} dampingRatio\n *\n * @prop {Vec2} localAnchorA\n * @prop {Vec2} localAnchorB\n * @prop {float} referenceAngle\n */\nexport interface WeldJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. Rotation only. Disable softness\n * with a value of 0.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle?: number;\n}\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n */\nexport interface WeldJointDef extends JointDef, WeldJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0,\n};\n\n/**\n * A weld joint essentially glues two bodies together. A weld joint may distort\n * somewhat because the island constraint solver is approximate.\n */\nexport default class WeldJoint extends Joint {\n static TYPE = 'weld-joint' as const\n\n /** @internal */ m_type: 'weld-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_impulse: Vec3;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat33;\n\n constructor(def: WeldJointDef);\n constructor(def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: WeldJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (!(this instanceof WeldJoint)) {\n return new WeldJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WeldJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_impulse = new Vec3();\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rA; // Vec2\n this.m_rB; // Vec2\n this.m_localCenterA; // Vec2\n this.m_localCenterB; // Vec2\n this.m_invMassA; // float\n this.m_invMassB; // float\n this.m_invIA; // float\n this.m_invIB; // float\n this.m_mass = new Mat33();\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // / = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // C = angle2 - angle1 - referenceAngle\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WeldJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WeldJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Set frequency in Hz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get frequency in Hz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set damping ratio.\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get damping ratio.\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat33();\n K.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y * this.m_rB.y\n * iB;\n K.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y * this.m_rB.x * iB;\n K.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x * this.m_rB.x\n * iB;\n K.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n K.getInverse22(this.m_mass);\n\n let invM = iA + iB; // float\n const m = invM > 0.0 ? 1.0 / invM : 0.0; // float\n\n const C = aB - aA - this.m_referenceAngle; // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const d = 2.0 * m * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = m * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invM += this.m_gamma;\n this.m_mass.ez.z = invM != 0.0 ? 1.0 / invM : 0.0;\n } else if (K.ez.z == 0.0) {\n K.getInverse22(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n } else {\n K.getSymInverse33(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n if (this.m_frequencyHz > 0.0) {\n const Cdot2 = wB - wA; // float\n\n const impulse2 = -this.m_mass.ez.z\n * (Cdot2 + this.m_bias + this.m_gamma * this.m_impulse.z); // float\n this.m_impulse.z += impulse2;\n\n wA -= iA * impulse2;\n wB += iB * impulse2;\n\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n\n const impulse1 = Vec2.neg(Mat33.mulVec2(this.m_mass, Cdot1)); // Vec2\n this.m_impulse.x += impulse1.x;\n this.m_impulse.y += impulse1.y;\n\n const P = Vec2.clone(impulse1); // Vec2\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, P);\n } else {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); // Vec3\n\n const impulse = Vec3.neg(Mat33.mulVec3(this.m_mass, Cdot)); // Vec3\n this.m_impulse.add(impulse);\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n let positionError: number;\n let angularError: number;\n\n const K = new Mat33();\n K.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB;\n K.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB;\n K.ez.x = -rA.y * iA - rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB;\n K.ez.y = rA.x * iA + rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA); // Vec2\n\n positionError = C1.length();\n angularError = 0.0;\n\n const P = Vec2.neg(K.solve22(C1)); // Vec2\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n } else {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA);\n\n const C2 = aB - aA - this.m_referenceAngle; // float\n\n positionError = C1.length();\n angularError = Math.abs(C2);\n\n const C = new Vec3(C1.x, C1.y, C2);\n\n let impulse = new Vec3();\n if (K.ez.z > 0.0) {\n impulse = Vec3.neg(K.solve33(C));\n } else {\n const impulse2 = Vec2.neg(K.solve22(C1));\n impulse.set(impulse2.x, impulse2.y, 0.0);\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n cA.subMul(mA, P);\n aA -= iA * (Vec2.crossVec2Vec2(rA, P) + impulse.z);\n\n cB.addMul(mB, P);\n aB += iB * (Vec2.crossVec2Vec2(rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointOpt extends JointOpt {\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n /**\n * Suspension frequency, zero indicates no suspension.\n */\n frequencyHz?: number;\n /**\n * Suspension damping ratio, one indicates critical damping.\n */\n dampingRatio?: number;\n}\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointDef extends JointDef, WheelJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation axis in bodyA.\n */\n localAxisA: Vec2;\n}\n\nconst DEFAULTS = {\n enableMotor : false,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n frequencyHz : 2.0,\n dampingRatio : 0.7,\n};\n\n/**\n * A wheel joint. This joint provides two degrees of freedom: translation along\n * an axis fixed in bodyA and rotation in the plane. In other words, it is a\n * point to line constraint with a rotational motor and a linear spring/damper.\n * This joint is designed for vehicle suspensions.\n */\nexport default class WheelJoint extends Joint {\n static TYPE = 'wheel-joint' as const;\n\n /** @internal */ m_type: 'wheel-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_springMass: number;\n /** @internal */ m_springImpulse: number;\n\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableMotor: boolean;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n /** @internal */ m_ax: Vec2 = Vec2.zero();\n /** @internal */ m_ay: Vec2 = Vec2.zero();\n /** @internal */ m_sAx: number;\n /** @internal */ m_sBx: number;\n /** @internal */ m_sAy: number;\n /** @internal */ m_sBy: number;\n\n constructor(def: WheelJointDef);\n constructor(def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n // @ts-ignore\n constructor(def: WheelJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (!(this instanceof WheelJoint)) {\n return new WheelJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WheelJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n // @ts-ignore localAxis\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || def.localAxis || Vec2.neo(1.0, 0.0));\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n this.m_springMass = 0.0;\n this.m_springImpulse = 0.0;\n\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableMotor = def.enableMotor;\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Linear constraint (point-to-line)\n // d = pB - pA = xB + rB - xA - rA\n // C = dot(ay, d)\n // Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA,\n // rA))\n // = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB,\n // ay), vB)\n // J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)]\n\n // Spring linear constraint\n // C = dot(ax, d)\n // Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) +\n // dot(cross(rB, ax), vB)\n // J = [-ax -cross(d+rA, ax) ax cross(rB, ax)]\n\n // Motor rotational constraint\n // Cdot = wB - wA\n // J = [0 0 -1 0 0 1]\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n enableMotor: this.m_enableMotor,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WheelJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WheelJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const pA = bA.getWorldPoint(this.m_localAnchorA); // Vec2\n const pB = bB.getWorldPoint(this.m_localAnchorB); // Vec2\n const d = Vec2.sub(pB, pA); // Vec2\n const axis = bA.getWorldVector(this.m_localXAxisA); // Vec2\n\n const translation = Vec2.dot(d, axis); // float\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const wA = this.m_bodyA.m_angularVelocity;\n const wB = this.m_bodyB.m_angularVelocity;\n return wB - wA;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed, usually in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set/Get the maximum motor force, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Get the current motor torque given the inverse time step, usually in N-m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set/Get the spring frequency in hertz. Setting the frequency to zero disables\n * the spring.\n */\n setSpringFrequencyHz(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getSpringFrequencyHz(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set/Get the spring damping ratio\n */\n setSpringDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getSpringDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA); // Vec2\n\n // Point to line constraint\n {\n this.m_ay = Rot.mulVec2(qA, this.m_localYAxisA);\n this.m_sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ay);\n this.m_sBy = Vec2.crossVec2Vec2(rB, this.m_ay);\n\n this.m_mass = mA + mB + iA * this.m_sAy * this.m_sAy + iB * this.m_sBy\n * this.m_sBy;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n }\n\n // Spring constraint\n this.m_springMass = 0.0;\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n if (this.m_frequencyHz > 0.0) {\n this.m_ax = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_sAx = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ax);\n this.m_sBx = Vec2.crossVec2Vec2(rB, this.m_ax);\n\n const invMass = mA + mB + iA * this.m_sAx * this.m_sAx + iB * this.m_sBx\n * this.m_sBx; // float\n\n if (invMass > 0.0) {\n this.m_springMass = 1.0 / invMass;\n\n const C = Vec2.dot(d, this.m_ax); // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const damp = 2.0 * this.m_springMass * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = this.m_springMass * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (damp + h * k);\n if (this.m_gamma > 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n\n this.m_bias = C * h * k * this.m_gamma;\n\n this.m_springMass = invMass + this.m_gamma;\n if (this.m_springMass > 0.0) {\n this.m_springMass = 1.0 / this.m_springMass;\n }\n }\n } else {\n this.m_springImpulse = 0.0;\n }\n\n // Rotational motor\n if (this.m_enableMotor) {\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n } else {\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse *= step.dtRatio;\n this.m_springImpulse *= step.dtRatio;\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax);\n const LA = this.m_impulse * this.m_sAy + this.m_springImpulse * this.m_sAx + this.m_motorImpulse;\n const LB = this.m_impulse * this.m_sBy + this.m_springImpulse * this.m_sBx + this.m_motorImpulse;\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * LA;\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * LB;\n\n } else {\n this.m_impulse = 0.0;\n this.m_springImpulse = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Solve spring constraint\n {\n const Cdot = Vec2.dot(this.m_ax, vB) - Vec2.dot(this.m_ax, vA) + this.m_sBx\n * wB - this.m_sAx * wA; // float\n const impulse = -this.m_springMass\n * (Cdot + this.m_bias + this.m_gamma * this.m_springImpulse); // float\n this.m_springImpulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ax); // Vec2\n const LA = impulse * this.m_sAx; // float\n const LB = impulse * this.m_sBx; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n // Solve rotational motor constraint\n {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve point to line constraint\n {\n const Cdot = Vec2.dot(this.m_ay, vB) - Vec2.dot(this.m_ay, vA) + this.m_sBy\n * wB - this.m_sAy * wA; // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ay); // Vec2\n const LA = impulse * this.m_sAy; // float\n const LB = impulse * this.m_sBy; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const ay = Rot.mulVec2(qA, this.m_localYAxisA);\n\n const sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), ay); // float\n const sBy = Vec2.crossVec2Vec2(rB, ay); // float\n\n const C = Vec2.dot(d, ay); // float\n\n const k = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_sAy\n * this.m_sAy + this.m_invIB * this.m_sBy * this.m_sBy; // float\n\n let impulse; // float\n if (k != 0.0) {\n impulse = -C / k;\n } else {\n impulse = 0.0;\n }\n\n const P = Vec2.mulNumVec2(impulse, ay); // Vec2\n const LA = impulse * sAy; // float\n const LB = impulse * sBy; // float\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * LA;\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * LB;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) <= Settings.linearSlop;\n }\n\n}\n","// tslint:disable:typedef\nimport World from '../dynamics/World';\nimport Body from '../dynamics/Body';\nimport Joint from '../dynamics/Joint';\nimport Fixture from '../dynamics/Fixture';\nimport Shape from '../collision/Shape';\nimport Vec2 from '../common/Vec2';\nimport Vec3 from '../common/Vec3';\nimport ChainShape from \"../collision/shape/ChainShape\";\nimport BoxShape from \"../collision/shape/BoxShape\";\nimport EdgeShape from \"../collision/shape/EdgeShape\";\nimport PolygonShape from \"../collision/shape/PolygonShape\";\nimport CircleShape from \"../collision/shape/CircleShape\";\nimport DistanceJoint from \"../dynamics/joint/DistanceJoint\";\nimport FrictionJoint from \"../dynamics/joint/FrictionJoint\";\nimport GearJoint from \"../dynamics/joint/GearJoint\";\nimport MotorJoint from \"../dynamics/joint/MotorJoint\";\nimport MouseJoint from \"../dynamics/joint/MouseJoint\";\nimport PrismaticJoint from \"../dynamics/joint/PrismaticJoint\";\nimport PulleyJoint from \"../dynamics/joint/PulleyJoint\";\nimport RevoluteJoint from \"../dynamics/joint/RevoluteJoint\";\nimport RopeJoint from \"../dynamics/joint/RopeJoint\";\nimport WeldJoint from \"../dynamics/joint/WeldJoint\";\nimport WheelJoint from \"../dynamics/joint/WheelJoint\";\n\nlet SID = 0;\n\nfunction Serializer(opts?) {\n opts = opts || {};\n\n const rootClass = opts.rootClass || World;\n\n const preSerialize = opts.preSerialize || function(obj) { return obj; };\n const postSerialize = opts.postSerialize || function(data, obj) { return data; };\n\n const preDeserialize = opts.preDeserialize || function(data) { return data; };\n const postDeserialize = opts.postDeserialize || function(obj, data) { return obj; };\n\n // This is used to create ref objects during serialize\n const refTypes = {\n World,\n Body,\n Joint,\n Fixture,\n Shape,\n };\n\n // This is used by restore to deserialize objects and refs\n const restoreTypes = {\n Vec2,\n Vec3,\n ...refTypes\n };\n\n const CLASS_BY_TYPE_PROP = {\n [Body.STATIC]: Body,\n [Body.DYNAMIC]: Body,\n [Body.KINEMATIC]: Body,\n [ChainShape.TYPE]: ChainShape,\n [BoxShape.TYPE]: BoxShape,\n [EdgeShape.TYPE]: EdgeShape,\n [PolygonShape.TYPE]: PolygonShape,\n [CircleShape.TYPE]: CircleShape,\n [DistanceJoint.TYPE]: DistanceJoint,\n [FrictionJoint.TYPE]: FrictionJoint,\n [GearJoint.TYPE]: GearJoint,\n [MotorJoint.TYPE]: MotorJoint,\n [MouseJoint.TYPE]: MouseJoint,\n [PrismaticJoint.TYPE]: PrismaticJoint,\n [PulleyJoint.TYPE]: PulleyJoint,\n [RevoluteJoint.TYPE]: RevoluteJoint,\n [RopeJoint.TYPE]: RopeJoint,\n [WeldJoint.TYPE]: WeldJoint,\n [WheelJoint.TYPE]: WheelJoint,\n }\n\n this.toJson = function(root) {\n const json = [];\n\n const queue = [root];\n const refMap = {};\n\n function storeRef(value, typeName) {\n value.__sid = value.__sid || ++SID;\n if (!refMap[value.__sid]) {\n queue.push(value);\n const index = json.length + queue.length;\n const ref = {\n refIndex: index,\n refType: typeName\n };\n refMap[value.__sid] = ref;\n }\n return refMap[value.__sid];\n }\n\n function serialize(obj) {\n obj = preSerialize(obj);\n let data = obj._serialize();\n data = postSerialize(data, obj);\n return data;\n }\n\n function toJson(value, top?) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (typeof value._serialize === 'function') {\n if (value !== top) {\n // tslint:disable-next-line:no-for-in\n for (const typeName in refTypes) {\n if (value instanceof refTypes[typeName]) {\n return storeRef(value, typeName);\n }\n }\n }\n value = serialize(value);\n }\n if (Array.isArray(value)) {\n const newValue = [];\n for (let key = 0; key < value.length; key++) {\n newValue[key] = toJson(value[key]);\n }\n value = newValue;\n\n } else {\n const newValue = {};\n // tslint:disable-next-line:no-for-in\n for (const key in value) {\n if (value.hasOwnProperty(key)) {\n newValue[key] = toJson(value[key]);\n }\n }\n value = newValue;\n }\n return value;\n }\n\n while (queue.length) {\n const obj = queue.shift();\n const str = toJson(obj, obj);\n json.push(str);\n }\n\n return json;\n };\n\n this.fromJson = function(json: object) {\n const refMap = {};\n\n function findDeserilizer(data, cls) {\n if (!cls || !cls._deserialize) {\n cls = CLASS_BY_TYPE_PROP[data.type]\n }\n return cls && cls._deserialize;\n }\n\n /**\n * Deserialize a data object.\n */\n function deserialize(cls, data, ctx) {\n const deserializer = findDeserilizer(data, cls);\n if (!deserializer) {\n return;\n }\n data = preDeserialize(data);\n let obj = deserializer(data, ctx, restoreRef);\n obj = postDeserialize(obj, data);\n return obj;\n }\n\n /**\n * Restore a ref object or deserialize a data object.\n *\n * This is passed as callback to class deserializers.\n */\n function restoreRef(cls, ref, ctx) {\n if (!ref.refIndex) {\n return cls && cls._deserialize && deserialize(cls, ref, ctx);\n }\n cls = restoreTypes[ref.refType] || cls;\n const index = ref.refIndex;\n if (!refMap[index]) {\n const data = json[index];\n const obj = deserialize(cls, data, ctx);\n refMap[index] = obj;\n }\n return refMap[index];\n }\n\n const root = rootClass._deserialize(json[0], null, restoreRef);\n\n return root;\n };\n}\n\nconst serializer = new Serializer();\n\nSerializer.toJson = serializer.toJson;\nSerializer.fromJson = serializer.fromJson;\n\nexport default Serializer;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nimport common from '../../util/common';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Contact from '../../dynamics/Contact';\nimport CircleShape from './CircleShape';\nimport Manifold, { ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact);\n\nfunction CircleCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == CircleShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE);\n CollideCircles(manifold, fixtureA.getShape() as CircleShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport function CollideCircles(manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n const pA = Transform.mulVec2(xfA, circleA.m_p);\n const pB = Transform.mulVec2(xfB, circleB.m_p);\n\n const distSqr = Vec2.distanceSquared(pB, pA);\n const rA = circleA.m_radius;\n const rB = circleB.m_radius;\n const radius = rA + rB;\n if (distSqr > radius * radius) {\n return;\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localPoint.setVec2(circleA.m_p);\n manifold.localNormal.setZero();\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Contact from '../../dynamics/Contact';\nimport EdgeShape from './EdgeShape';\nimport ChainShape from './ChainShape';\nimport CircleShape from './CircleShape';\nimport Manifold, { ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, CircleShape.TYPE, EdgeCircleContact);\nContact.addType(ChainShape.TYPE, CircleShape.TYPE, ChainCircleContact);\n\nfunction EdgeCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == EdgeShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const shapeA = fixtureA.getShape() as EdgeShape;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\nfunction ChainCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == ChainShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const chain = fixtureA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n const shapeA = edge;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\n// Compute contact points for edge versus circle.\n// This accounts for edge connectivity.\nexport function CollideEdgeCircle(manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle in frame of edge\n const Q = Transform.mulTVec2(xfA, Transform.mulVec2(xfB, circleB.m_p));\n\n const A = edgeA.m_vertex1;\n const B = edgeA.m_vertex2;\n const e = Vec2.sub(B, A);\n\n // Barycentric coordinates\n const u = Vec2.dot(e, Vec2.sub(B, Q));\n const v = Vec2.dot(e, Vec2.sub(Q, A));\n\n const radius = edgeA.m_radius + circleB.m_radius;\n\n // Region A\n if (v <= 0.0) {\n const P = Vec2.clone(A);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to A?\n if (edgeA.m_hasVertex0) {\n const A1 = edgeA.m_vertex0;\n const B1 = A;\n const e1 = Vec2.sub(B1, A1);\n const u1 = Vec2.dot(e1, Vec2.sub(B1, Q));\n\n // Is the circle in Region AB of the previous edge?\n if (u1 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region B\n if (u <= 0.0) {\n const P = Vec2.clone(B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to B?\n if (edgeA.m_hasVertex3) {\n const B2 = edgeA.m_vertex3;\n const A2 = B;\n const e2 = Vec2.sub(B2, A2);\n const v2 = Vec2.dot(e2, Vec2.sub(Q, A2));\n\n // Is the circle in Region AB of the next edge?\n if (v2 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 1;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region AB\n const den = Vec2.dot(e, e);\n _ASSERT && common.assert(den > 0.0);\n const P = Vec2.combine(u / den, A, v / den, B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n const n = Vec2.neo(-e.y, e.x);\n if (Vec2.dot(n, Vec2.sub(Q, A)) < 0.0) {\n n.setNum(-n.x, -n.y);\n }\n n.normalize();\n\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal = n;\n manifold.localPoint.setVec2(A);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_face;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Transform from '../../common/Transform';\nimport Rot from '../../common/Rot';\nimport Vec2 from '../../common/Vec2';\nimport Settings from '../../Settings';\nimport Manifold, { clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport Contact from '../../dynamics/Contact';\nimport PolygonShape from './PolygonShape';\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, PolygonShape.TYPE, PolygonContact);\n\nfunction PolygonContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == PolygonShape.TYPE);\n CollidePolygons(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as PolygonShape, xfB);\n}\n\ninterface MaxSeparation {\n maxSeparation: number;\n bestIndex: number;\n}\n\n/**\n * Find the max separation between poly1 and poly2 using edge normals from\n * poly1.\n */\nfunction findMaxSeparation(poly1: PolygonShape, xf1: Transform, poly2: PolygonShape, xf2: Transform, output: MaxSeparation): void {\n const count1 = poly1.m_count;\n const count2 = poly2.m_count;\n const n1s = poly1.m_normals;\n const v1s = poly1.m_vertices;\n const v2s = poly2.m_vertices;\n const xf = Transform.mulTXf(xf2, xf1);\n\n let bestIndex = 0;\n let maxSeparation = -Infinity;\n for (let i = 0; i < count1; ++i) {\n // Get poly1 normal in frame2.\n const n = Rot.mulVec2(xf.q, n1s[i]);\n const v1 = Transform.mulVec2(xf, v1s[i]);\n\n // Find deepest point for normal i.\n let si = Infinity;\n for (let j = 0; j < count2; ++j) {\n const sij = Vec2.dot(n, v2s[j]) - Vec2.dot(n, v1);\n if (sij < si) {\n si = sij;\n }\n }\n\n if (si > maxSeparation) {\n maxSeparation = si;\n bestIndex = i;\n }\n }\n\n // used to keep last FindMaxSeparation call values\n output.maxSeparation = maxSeparation;\n output.bestIndex = bestIndex;\n}\n\nfunction findIncidentEdge(c: ClipVertex[], poly1: PolygonShape, xf1: Transform, edge1: number, poly2: PolygonShape, xf2: Transform): void {\n const normals1 = poly1.m_normals;\n\n const count2 = poly2.m_count;\n const vertices2 = poly2.m_vertices;\n const normals2 = poly2.m_normals;\n\n _ASSERT && common.assert(0 <= edge1 && edge1 < poly1.m_count);\n\n // Get the normal of the reference edge in poly2's frame.\n const normal1 = Rot.mulTVec2(xf2.q, Rot.mulVec2(xf1.q, normals1[edge1]));\n\n // Find the incident edge on poly2.\n let index = 0;\n let minDot = Infinity;\n for (let i = 0; i < count2; ++i) {\n const dot = Vec2.dot(normal1, normals2[i]);\n if (dot < minDot) {\n minDot = dot;\n index = i;\n }\n }\n\n // Build the clip vertices for the incident edge.\n const i1 = index;\n const i2 = i1 + 1 < count2 ? i1 + 1 : 0;\n\n c[0].v = Transform.mulVec2(xf2, vertices2[i1]);\n c[0].id.cf.indexA = edge1;\n c[0].id.cf.indexB = i1;\n c[0].id.cf.typeA = ContactFeatureType.e_face;\n c[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n c[1].v = Transform.mulVec2(xf2, vertices2[i2]);\n c[1].id.cf.indexA = edge1;\n c[1].id.cf.indexB = i2;\n c[1].id.cf.typeA = ContactFeatureType.e_face;\n c[1].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n\nconst maxSeparation = {\n maxSeparation: 0,\n bestIndex: 0,\n};\n\n/**\n *\n * Find edge normal of max separation on A - return if separating axis is found
\n * Find edge normal of max separation on B - return if separation axis is found
\n * Choose reference edge as min(minA, minB)
\n * Find incident edge
\n * Clip\n *\n * The normal points from 1 to 2\n */\nexport function CollidePolygons(manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform): void {\n manifold.pointCount = 0;\n const totalRadius = polyA.m_radius + polyB.m_radius;\n\n findMaxSeparation(polyA, xfA, polyB, xfB, maxSeparation);\n const edgeA = maxSeparation.bestIndex;\n const separationA = maxSeparation.maxSeparation;\n if (separationA > totalRadius)\n return;\n\n findMaxSeparation(polyB, xfB, polyA, xfA, maxSeparation);\n const edgeB = maxSeparation.bestIndex;\n const separationB = maxSeparation.maxSeparation;\n if (separationB > totalRadius)\n return;\n\n let poly1; // reference polygon\n let poly2; // incident polygon\n let xf1;\n let xf2;\n let edge1; // reference edge\n let flip;\n const k_tol = 0.1 * Settings.linearSlop;\n\n if (separationB > separationA + k_tol) {\n poly1 = polyB;\n poly2 = polyA;\n xf1 = xfB;\n xf2 = xfA;\n edge1 = edgeB;\n manifold.type = ManifoldType.e_faceB;\n flip = 1;\n } else {\n poly1 = polyA;\n poly2 = polyB;\n xf1 = xfA;\n xf2 = xfB;\n edge1 = edgeA;\n manifold.type = ManifoldType.e_faceA;\n flip = 0;\n }\n\n const incidentEdge = [ new ClipVertex(), new ClipVertex() ];\n findIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);\n\n const count1 = poly1.m_count;\n const vertices1 = poly1.m_vertices;\n\n const iv1 = edge1;\n const iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0;\n\n let v11 = vertices1[iv1];\n let v12 = vertices1[iv2];\n\n const localTangent = Vec2.sub(v12, v11);\n localTangent.normalize();\n\n const localNormal = Vec2.crossVec2Num(localTangent, 1.0);\n const planePoint = Vec2.combine(0.5, v11, 0.5, v12);\n\n const tangent = Rot.mulVec2(xf1.q, localTangent);\n const normal = Vec2.crossVec2Num(tangent, 1.0);\n\n v11 = Transform.mulVec2(xf1, v11);\n v12 = Transform.mulVec2(xf1, v12);\n\n // Face offset.\n const frontOffset = Vec2.dot(normal, v11);\n\n // Side offsets, extended by polytope skin thickness.\n const sideOffset1 = -Vec2.dot(tangent, v11) + totalRadius;\n const sideOffset2 = Vec2.dot(tangent, v12) + totalRadius;\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, incidentEdge, Vec2.neg(tangent), sideOffset1, iv1);\n\n if (np < 2) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2);\n\n if (np < 2) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n manifold.localNormal = localNormal;\n manifold.localPoint = planePoint;\n\n let pointCount = 0;\n for (let i = 0; i < clipPoints2.length/* maxManifoldPoints */; ++i) {\n const separation = Vec2.dot(normal, clipPoints2[i].v) - frontOffset;\n\n if (separation <= totalRadius) {\n const cp = manifold.points[pointCount];\n cp.localPoint.setVec2(Transform.mulTVec2(xf2, clipPoints2[i].v));\n cp.id = clipPoints2[i].id;\n if (flip) {\n // Swap features\n const cf = cp.id.cf;\n const indexA = cf.indexA;\n const indexB = cf.indexB;\n const typeA = cf.typeA;\n const typeB = cf.typeB;\n cf.indexA = indexB;\n cf.indexB = indexA;\n cf.typeA = typeB;\n cf.typeB = typeA;\n }\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Math from '../../common/Math';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Contact from '../../dynamics/Contact';\nimport CircleShape from './CircleShape';\nimport PolygonShape from './PolygonShape';\nimport Manifold, { ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, CircleShape.TYPE, PolygonCircleContact);\n\nfunction PolygonCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE);\n CollidePolygonCircle(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport function CollidePolygonCircle(manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle position in the frame of the polygon.\n const c = Transform.mulVec2(xfB, circleB.m_p);\n const cLocal = Transform.mulTVec2(xfA, c);\n\n // Find the min separating edge.\n let normalIndex = 0;\n let separation = -Infinity;\n const radius = polygonA.m_radius + circleB.m_radius;\n const vertexCount = polygonA.m_count;\n const vertices = polygonA.m_vertices;\n const normals = polygonA.m_normals;\n\n for (let i = 0; i < vertexCount; ++i) {\n const s = Vec2.dot(normals[i], Vec2.sub(cLocal, vertices[i]));\n\n if (s > radius) {\n // Early out.\n return;\n }\n\n if (s > separation) {\n separation = s;\n normalIndex = i;\n }\n }\n\n // Vertices that subtend the incident face.\n const vertIndex1 = normalIndex;\n const vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0;\n const v1 = vertices[vertIndex1];\n const v2 = vertices[vertIndex2];\n\n // If the center is inside the polygon ...\n if (separation < Math.EPSILON) {\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[normalIndex]);\n manifold.localPoint.setCombine(0.5, v1, 0.5, v2);\n manifold.points[0].localPoint = circleB.m_p;\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Compute barycentric coordinates\n const u1 = Vec2.dot(Vec2.sub(cLocal, v1), Vec2.sub(v2, v1));\n const u2 = Vec2.dot(Vec2.sub(cLocal, v2), Vec2.sub(v1, v2));\n if (u1 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v1) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v1);\n manifold.localNormal.normalize();\n manifold.localPoint = v1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else if (u2 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v2) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v2);\n manifold.localNormal.normalize();\n manifold.localPoint.setVec2(v2);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else {\n const faceCenter = Vec2.mid(v1, v2);\n const separation = Vec2.dot(cLocal, normals[vertIndex1]) - Vec2.dot(faceCenter, normals[vertIndex1]);\n if (separation > radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[vertIndex1]);\n manifold.localPoint.setVec2(faceCenter);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Math from '../../common/Math';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Settings from '../../Settings';\nimport Contact from '../../dynamics/Contact';\nimport Manifold, { clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport EdgeShape from './EdgeShape';\nimport ChainShape from './ChainShape';\nimport PolygonShape from './PolygonShape';\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, PolygonShape.TYPE, EdgePolygonContact);\nContact.addType(ChainShape.TYPE, PolygonShape.TYPE, ChainPolygonContact);\n\nfunction EdgePolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fA.getType() == EdgeShape.TYPE);\n _ASSERT && common.assert(fB.getType() == PolygonShape.TYPE);\n\n CollideEdgePolygon(manifold, fA.getShape() as EdgeShape, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nfunction ChainPolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fA.getType() == ChainShape.TYPE);\n _ASSERT && common.assert(fB.getType() == PolygonShape.TYPE);\n\n const chain = fA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n CollideEdgePolygon(manifold, edge, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nenum EPAxisType {\n e_unknown = -1,\n e_edgeA = 1,\n e_edgeB = 2,\n}\n\n// unused?\nenum VertexType {\n e_isolated = 0,\n e_concave = 1,\n e_convex = 2,\n}\n\n/**\n * This structure is used to keep track of the best separating axis.\n */\nclass EPAxis {\n type: EPAxisType;\n index: number;\n separation: number;\n}\n\n/**\n * This holds polygon B expressed in frame A.\n */\nclass TempPolygon {\n vertices: Vec2[] = []; // [Settings.maxPolygonVertices]\n normals: Vec2[] = []; // [Settings.maxPolygonVertices];\n count: number = 0;\n}\n\n/**\n * Reference face used for clipping\n */\nclass ReferenceFace {\n i1: number;\n i2: number;\n v1: Vec2;\n v2: Vec2;\n normal: Vec2 = Vec2.zero();\n sideNormal1: Vec2 = Vec2.zero();\n sideOffset1: number;\n sideNormal2: Vec2 = Vec2.zero();\n sideOffset2: number;\n}\n\n// reused\nconst edgeAxis = new EPAxis();\nconst polygonAxis = new EPAxis();\nconst polygonBA = new TempPolygon();\nconst rf = new ReferenceFace();\n\n/**\n * This function collides and edge and a polygon, taking into account edge\n * adjacency.\n */\nexport function CollideEdgePolygon(manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform): void {\n // Algorithm:\n // 1. Classify v1 and v2\n // 2. Classify polygon centroid as front or back\n // 3. Flip normal if necessary\n // 4. Initialize normal range to [-pi, pi] about face normal\n // 5. Adjust normal range according to adjacent edges\n // 6. Visit each separating axes, only accept axes within the range\n // 7. Return if _any_ axis indicates separation\n // 8. Clip\n\n // let m_type1: VertexType;\n // let m_type2: VertexType;\n\n const xf = Transform.mulTXf(xfA, xfB);\n\n const centroidB = Transform.mulVec2(xf, polygonB.m_centroid);\n\n const v0 = edgeA.m_vertex0;\n const v1 = edgeA.m_vertex1;\n const v2 = edgeA.m_vertex2;\n const v3 = edgeA.m_vertex3;\n\n const hasVertex0 = edgeA.m_hasVertex0;\n const hasVertex3 = edgeA.m_hasVertex3;\n\n const edge1 = Vec2.sub(v2, v1);\n edge1.normalize();\n const normal1 = Vec2.neo(edge1.y, -edge1.x);\n const offset1 = Vec2.dot(normal1, Vec2.sub(centroidB, v1));\n let offset0 = 0.0;\n let offset2 = 0.0;\n let convex1 = false;\n let convex2 = false;\n\n let normal0;\n let normal2;\n\n // Is there a preceding edge?\n if (hasVertex0) {\n const edge0 = Vec2.sub(v1, v0);\n edge0.normalize();\n normal0 = Vec2.neo(edge0.y, -edge0.x);\n convex1 = Vec2.crossVec2Vec2(edge0, edge1) >= 0.0;\n offset0 = Vec2.dot(normal0, centroidB) - Vec2.dot(normal0, v0);\n }\n\n // Is there a following edge?\n if (hasVertex3) {\n const edge2 = Vec2.sub(v3, v2);\n edge2.normalize();\n normal2 = Vec2.neo(edge2.y, -edge2.x);\n convex2 = Vec2.crossVec2Vec2(edge1, edge2) > 0.0;\n offset2 = Vec2.dot(normal2, centroidB) - Vec2.dot(normal2, v2);\n }\n\n let front;\n const normal = Vec2.zero();\n const lowerLimit = Vec2.zero();\n const upperLimit = Vec2.zero();\n\n // Determine front or back collision. Determine collision normal limits.\n if (hasVertex0 && hasVertex3) {\n if (convex1 && convex2) {\n front = offset0 >= 0.0 || offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex1) {\n front = offset0 >= 0.0 || (offset1 >= 0.0 && offset2 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex2) {\n front = offset2 >= 0.0 || (offset0 >= 0.0 && offset1 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal0);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex0) {\n if (convex1) {\n front = offset0 >= 0.0 || offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex3) {\n if (convex2) {\n front = offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n }\n } else {\n front = offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setVec2(normal1);\n }\n }\n } else {\n front = offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n }\n }\n\n // Get polygonB in frameA\n polygonBA.count = polygonB.m_count;\n for (let i = 0; i < polygonB.m_count; ++i) {\n polygonBA.vertices[i] = Transform.mulVec2(xf, polygonB.m_vertices[i]);\n polygonBA.normals[i] = Rot.mulVec2(xf.q, polygonB.m_normals[i]);\n }\n\n const radius = 2.0 * Settings.polygonRadius;\n\n manifold.pointCount = 0;\n\n { // ComputeEdgeSeparation\n edgeAxis.type = EPAxisType.e_edgeA;\n edgeAxis.index = front ? 0 : 1;\n edgeAxis.separation = Infinity;\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const s = Vec2.dot(normal, Vec2.sub(polygonBA.vertices[i], v1));\n if (s < edgeAxis.separation) {\n edgeAxis.separation = s;\n }\n }\n }\n\n // If no valid normal can be found than this edge should not collide.\n // @ts-ignore\n if (edgeAxis.type == EPAxisType.e_unknown) {\n return;\n }\n\n if (edgeAxis.separation > radius) {\n return;\n }\n\n { // ComputePolygonSeparation\n polygonAxis.type = EPAxisType.e_unknown;\n polygonAxis.index = -1;\n polygonAxis.separation = -Infinity;\n\n const perp = Vec2.neo(-normal.y, normal.x);\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const n = Vec2.neg(polygonBA.normals[i]);\n\n const s1 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v1));\n const s2 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v2));\n const s = Math.min(s1, s2);\n\n if (s > radius) {\n // No collision\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n break;\n }\n\n // Adjacency\n if (Vec2.dot(n, perp) >= 0.0) {\n if (Vec2.dot(Vec2.sub(n, upperLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n } else {\n if (Vec2.dot(Vec2.sub(n, lowerLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n }\n\n if (s > polygonAxis.separation) {\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n }\n }\n }\n\n if (polygonAxis.type != EPAxisType.e_unknown && polygonAxis.separation > radius) {\n return;\n }\n\n // Use hysteresis for jitter reduction.\n const k_relativeTol = 0.98;\n const k_absoluteTol = 0.001;\n\n let primaryAxis;\n if (polygonAxis.type == EPAxisType.e_unknown) {\n primaryAxis = edgeAxis;\n } else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) {\n primaryAxis = polygonAxis;\n } else {\n primaryAxis = edgeAxis;\n }\n\n const ie = [ new ClipVertex(), new ClipVertex() ];\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.type = ManifoldType.e_faceA;\n\n // Search for the polygon normal that is most anti-parallel to the edge\n // normal.\n let bestIndex = 0;\n let bestValue = Vec2.dot(normal, polygonBA.normals[0]);\n for (let i = 1; i < polygonBA.count; ++i) {\n const value = Vec2.dot(normal, polygonBA.normals[i]);\n if (value < bestValue) {\n bestValue = value;\n bestIndex = i;\n }\n }\n\n const i1 = bestIndex;\n const i2 = i1 + 1 < polygonBA.count ? i1 + 1 : 0;\n\n ie[0].v = polygonBA.vertices[i1];\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = i1;\n ie[0].id.cf.typeA = ContactFeatureType.e_face;\n ie[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n ie[1].v = polygonBA.vertices[i2];\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = i2;\n ie[1].id.cf.typeA = ContactFeatureType.e_face;\n ie[1].id.cf.typeB = ContactFeatureType.e_vertex;\n\n if (front) {\n rf.i1 = 0;\n rf.i2 = 1;\n rf.v1 = v1;\n rf.v2 = v2;\n rf.normal.setVec2(normal1);\n } else {\n rf.i1 = 1;\n rf.i2 = 0;\n rf.v1 = v2;\n rf.v2 = v1;\n rf.normal.setMul(-1, normal1);\n }\n } else {\n manifold.type = ManifoldType.e_faceB;\n\n ie[0].v = v1;\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = primaryAxis.index;\n ie[0].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[0].id.cf.typeB = ContactFeatureType.e_face;\n\n ie[1].v = v2;\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = primaryAxis.index;\n ie[1].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[1].id.cf.typeB = ContactFeatureType.e_face;\n\n rf.i1 = primaryAxis.index;\n rf.i2 = rf.i1 + 1 < polygonBA.count ? rf.i1 + 1 : 0;\n rf.v1 = polygonBA.vertices[rf.i1];\n rf.v2 = polygonBA.vertices[rf.i2];\n rf.normal.setVec2(polygonBA.normals[rf.i1]);\n }\n\n rf.sideNormal1.setNum(rf.normal.y, -rf.normal.x);\n rf.sideNormal2.setMul(-1, rf.sideNormal1);\n rf.sideOffset1 = Vec2.dot(rf.sideNormal1, rf.v1);\n rf.sideOffset2 = Vec2.dot(rf.sideNormal2, rf.v2);\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.localNormal = Vec2.clone(rf.normal);\n manifold.localPoint = Vec2.clone(rf.v1);\n } else {\n manifold.localNormal = Vec2.clone(polygonB.m_normals[rf.i1]);\n manifold.localPoint = Vec2.clone(polygonB.m_vertices[rf.i1]);\n }\n\n let pointCount = 0;\n for (let i = 0; i < Settings.maxManifoldPoints; ++i) {\n const separation = Vec2.dot(rf.normal, Vec2.sub(clipPoints2[i].v, rf.v1));\n\n if (separation <= radius) {\n const cp = manifold.points[pointCount]; // ManifoldPoint\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n cp.localPoint = Transform.mulTVec2(xf, clipPoints2[i].v);\n cp.id = clipPoints2[i].id;\n } else {\n cp.localPoint = clipPoints2[i].v;\n cp.id.cf.typeA = clipPoints2[i].id.cf.typeB;\n cp.id.cf.typeB = clipPoints2[i].id.cf.typeA;\n cp.id.cf.indexA = clipPoints2[i].id.cf.indexB;\n cp.id.cf.indexB = clipPoints2[i].id.cf.indexA;\n }\n\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","export { default as Serializer } from './serializer/index';\n\nexport { default as Math } from './common/Math';\nexport { default as Vec2 } from './common/Vec2';\nexport { default as Vec3 } from './common/Vec3';\nexport { default as Mat22 } from './common/Mat22';\nexport { default as Mat33 } from './common/Mat33';\nexport { default as Transform } from './common/Transform';\nexport { default as Rot } from './common/Rot';\n\nexport { default as AABB } from './collision/AABB';\n\nexport { default as Shape } from './collision/Shape';\nexport { default as Fixture } from './dynamics/Fixture';\nexport { default as Body } from './dynamics/Body';\nexport { default as Contact } from './dynamics/Contact';\nexport { default as Joint } from './dynamics/Joint';\nexport { default as World } from './dynamics/World';\n\nexport { default as Circle } from './collision/shape/CircleShape';\nexport { default as Edge } from './collision/shape/EdgeShape';\nexport { default as Polygon } from './collision/shape/PolygonShape';\nexport { default as Chain } from './collision/shape/ChainShape';\nexport { default as Box } from './collision/shape/BoxShape';\n\nexport { CollideCircles } from './collision/shape/CollideCircle';\nexport { CollideEdgeCircle } from './collision/shape/CollideEdgeCircle';\nexport { CollidePolygons } from './collision/shape/CollidePolygon';\nexport { CollidePolygonCircle } from './collision/shape/CollideCirclePolygone';\nexport { CollideEdgePolygon } from './collision/shape/CollideEdgePolygon';\n\nexport { default as DistanceJoint } from './dynamics/joint/DistanceJoint';\nexport { default as FrictionJoint } from './dynamics/joint/FrictionJoint';\nexport { default as GearJoint } from './dynamics/joint/GearJoint';\nexport { default as MotorJoint } from './dynamics/joint/MotorJoint';\nexport { default as MouseJoint } from './dynamics/joint/MouseJoint';\nexport { default as PrismaticJoint } from './dynamics/joint/PrismaticJoint';\nexport { default as PulleyJoint } from './dynamics/joint/PulleyJoint';\nexport { default as RevoluteJoint } from './dynamics/joint/RevoluteJoint';\nexport { default as RopeJoint } from './dynamics/joint/RopeJoint';\nexport { default as WeldJoint } from './dynamics/joint/WeldJoint';\nexport { default as WheelJoint } from './dynamics/joint/WheelJoint';\n\nexport { default as Settings } from './Settings';\n\nexport { default as Sweep } from './common/Sweep';\nexport { default as Manifold } from './collision/Manifold';\nexport { default as Distance } from './collision/Distance';\nexport { default as TimeOfImpact } from './collision/TimeOfImpact';\nexport { default as DynamicTree } from './collision/DynamicTree';\n\nimport Solver, { TimeStep } from './dynamics/Solver';\nimport { CollidePolygons } from './collision/shape/CollidePolygon';\nimport { default as Settings } from './Settings';\nimport { default as Sweep } from './common/Sweep';\nimport { default as Manifold } from './collision/Manifold';\nimport { default as Distance, DistanceInput, DistanceOutput, DistanceProxy, SimplexCache, testOverlap } from './collision/Distance';\nimport { default as TimeOfImpact, TOIInput, TOIOutput } from './collision/TimeOfImpact';\nimport { default as DynamicTree } from './collision/DynamicTree';\n\nimport { default as stats } from './util/stats'; // todo: what to do with this?\n\nimport { ContactImpulse } from './dynamics/Solver';\ntype _ContactImpulse = InstanceType;\nexport type { _ContactImpulse as ContactImpulse }\n\n/** @deprecated Merged with main namespace */\nexport const internal = {};\n\n// @ts-ignore\ninternal.CollidePolygons = CollidePolygons;\n// @ts-ignore\ninternal.Settings = Settings;\n// @ts-ignore\ninternal.Sweep = Sweep;\n// @ts-ignore\ninternal.Manifold = Manifold;\n// @ts-ignore\ninternal.Distance = Distance;\n// @ts-ignore\ninternal.TimeOfImpact = TimeOfImpact;\n// @ts-ignore\ninternal.DynamicTree = DynamicTree;\n// @ts-ignore\ninternal.stats = stats;\n\n// @ts-ignore\nSolver.TimeStep = TimeStep;\n\n// @ts-ignore\nDistance.testOverlap = testOverlap;\n// @ts-ignore\nDistance.Input = DistanceInput;\n// @ts-ignore\nDistance.Output = DistanceOutput;\n// @ts-ignore\nDistance.Proxy = DistanceProxy;\n// @ts-ignore\nDistance.Cache = SimplexCache;\n\n// @ts-ignore\nTimeOfImpact.Input = TOIInput;\n// @ts-ignore\nTimeOfImpact.Output = TOIOutput;\n","module.exports = {};\n","module.exports = function(base) {\n for (var i = 1; i < arguments.length; i++) {\n var obj = arguments[i];\n for ( var key in obj) {\n if (obj.hasOwnProperty(key)) {\n base[key] = obj[key];\n }\n }\n }\n return base;\n};\n","/**\n * ! is the definitive JavaScript type testing library\n * \n * @copyright 2013-2014 Enrico Marino / Jordan Harband\n * @license MIT\n */\n\nvar objProto = Object.prototype;\nvar owns = objProto.hasOwnProperty;\nvar toStr = objProto.toString;\n\nvar NON_HOST_TYPES = {\n 'boolean' : 1,\n 'number' : 1,\n 'string' : 1,\n 'undefined' : 1\n};\n\nvar hexRegex = /^[A-Fa-f0-9]+$/;\n\nvar is = module.exports = {};\n\nis.a = is.an = is.type = function(value, type) {\n return typeof value === type;\n};\n\nis.defined = function(value) {\n return typeof value !== 'undefined';\n};\n\nis.empty = function(value) {\n var type = toStr.call(value);\n var key;\n\n if ('[object Array]' === type || '[object Arguments]' === type\n || '[object String]' === type) {\n return value.length === 0;\n }\n\n if ('[object Object]' === type) {\n for (key in value) {\n if (owns.call(value, key)) {\n return false;\n }\n }\n return true;\n }\n\n return !value;\n};\n\nis.equal = function(value, other) {\n if (value === other) {\n return true;\n }\n\n var type = toStr.call(value);\n var key;\n\n if (type !== toStr.call(other)) {\n return false;\n }\n\n if ('[object Object]' === type) {\n for (key in value) {\n if (!is.equal(value[key], other[key]) || !(key in other)) {\n return false;\n }\n }\n for (key in other) {\n if (!is.equal(value[key], other[key]) || !(key in value)) {\n return false;\n }\n }\n return true;\n }\n\n if ('[object Array]' === type) {\n key = value.length;\n if (key !== other.length) {\n return false;\n }\n while (--key) {\n if (!is.equal(value[key], other[key])) {\n return false;\n }\n }\n return true;\n }\n\n if ('[object Function]' === type) {\n return value.prototype === other.prototype;\n }\n\n if ('[object Date]' === type) {\n return value.getTime() === other.getTime();\n }\n\n return false;\n};\n\nis.instance = function(value, constructor) {\n return value instanceof constructor;\n};\n\nis.nil = function(value) {\n return value === null;\n};\n\nis.undef = function(value) {\n return typeof value === 'undefined';\n};\n\nis.array = function(value) {\n return '[object Array]' === toStr.call(value);\n};\n\nis.emptyarray = function(value) {\n return is.array(value) && value.length === 0;\n};\n\nis.arraylike = function(value) {\n return !!value && !is.boolean(value) && owns.call(value, 'length')\n && isFinite(value.length) && is.number(value.length) && value.length >= 0;\n};\n\nis.boolean = function(value) {\n return '[object Boolean]' === toStr.call(value);\n};\n\nis.element = function(value) {\n return value !== undefined && typeof HTMLElement !== 'undefined'\n && value instanceof HTMLElement && value.nodeType === 1;\n};\n\nis.fn = function(value) {\n return '[object Function]' === toStr.call(value);\n};\n\nis.number = function(value) {\n return '[object Number]' === toStr.call(value);\n};\n\nis.nan = function(value) {\n return !is.number(value) || value !== value;\n};\n\nis.object = function(value) {\n return '[object Object]' === toStr.call(value);\n};\n\nis.hash = function(value) {\n return is.object(value) && value.constructor === Object && !value.nodeType\n && !value.setInterval;\n};\n\nis.regexp = function(value) {\n return '[object RegExp]' === toStr.call(value);\n};\n\nis.string = function(value) {\n return '[object String]' === toStr.call(value);\n};\n\nis.hex = function(value) {\n return is.string(value) && (!value.length || hexRegex.test(value));\n};\n","module.exports = function() {\n var count = 0;\n function fork(fn, n) {\n count += n = (typeof n === 'number' && n >= 1 ? n : 1);\n return function() {\n fn && fn.apply(this, arguments);\n if (n > 0) {\n n--, count--, call();\n }\n };\n }\n var then = [];\n function call() {\n if (count === 0) {\n while (then.length) {\n setTimeout(then.shift(), 0);\n }\n }\n }\n fork.then = function(fn) {\n if (count === 0) {\n setTimeout(fn, 0);\n } else {\n then.push(fn);\n }\n };\n return fork;\n};","if (typeof DEBUG === 'undefined')\n DEBUG = true;\n\nvar stats = require('./util/stats');\nvar extend = require('./util/extend');\nvar is = require('./util/is');\nvar _await = require('./util/await');\n\nstats.create = 0;\n\nfunction Class(arg) {\n if (!(this instanceof Class)) {\n if (is.fn(arg)) {\n return Class.app.apply(Class, arguments);\n } else if (is.object(arg)) {\n return Class.atlas.apply(Class, arguments);\n } else {\n return arg;\n }\n }\n\n stats.create++;\n\n for (var i = 0; i < _init.length; i++) {\n _init[i].call(this);\n }\n}\n\nvar _init = [];\n\nClass._init = function(fn) {\n _init.push(fn);\n};\n\nvar _load = [];\n\nClass._load = function(fn) {\n _load.push(fn);\n};\n\nvar _config = {};\n\nClass.config = function() {\n if (arguments.length === 1 && is.string(arguments[0])) {\n return _config[arguments[0]];\n }\n if (arguments.length === 1 && is.object(arguments[0])) {\n extend(_config, arguments[0]);\n }\n if (arguments.length === 2 && is.string(arguments[0])) {\n _config[arguments[0], arguments[1]];\n }\n};\n\nvar _app_queue = [];\nvar _preload_queue = [];\nvar _stages = [];\nvar _loaded = false;\nvar _paused = false;\n\nClass.app = function(app, opts) {\n if (!_loaded) {\n _app_queue.push(arguments);\n return;\n }\n DEBUG && console.log('Creating app...');\n var loader = Class.config('app-loader');\n loader(function(stage, canvas) {\n DEBUG && console.log('Initing app...');\n for (var i = 0; i < _load.length; i++) {\n _load[i].call(this, stage, canvas);\n }\n app(stage, canvas);\n _stages.push(stage);\n DEBUG && console.log('Starting app...');\n stage.start();\n }, opts);\n};\n\nvar loading = _await();\n\nClass.preload = function(load) {\n if (typeof load === 'string') {\n var url = Class.resolve(load);\n if (/\\.js($|\\?|\\#)/.test(url)) {\n DEBUG && console.log('Loading script: ' + url);\n load = function(callback) {\n loadScript(url, callback);\n };\n }\n }\n if (typeof load !== 'function') {\n return;\n }\n // if (!_started) {\n // _preload_queue.push(load);\n // return;\n // }\n load(loading());\n};\n\nClass.start = function(config) {\n DEBUG && console.log('Starting...');\n\n Class.config(config);\n\n // DEBUG && console.log('Preloading...');\n // _started = true;\n // while (_preload_queue.length) {\n // var load = _preload_queue.shift();\n // load(loading());\n // }\n\n loading.then(function() {\n DEBUG && console.log('Loading apps...');\n _loaded = true;\n while (_app_queue.length) {\n var args = _app_queue.shift();\n Class.app.apply(Class, args);\n }\n });\n};\n\nClass.pause = function() {\n if (!_paused) {\n _paused = true;\n for (var i = _stages.length - 1; i >= 0; i--) {\n _stages[i].pause();\n }\n }\n};\n\nClass.resume = function() {\n if (_paused) {\n _paused = false;\n for (var i = _stages.length - 1; i >= 0; i--) {\n _stages[i].resume();\n }\n }\n};\n\nClass.create = function() {\n return new Class();\n};\n\nClass.resolve = (function() {\n\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return function(url) {\n return url;\n };\n }\n\n var scripts = document.getElementsByTagName('script');\n\n function getScriptSrc() {\n // HTML5\n if (document.currentScript) {\n return document.currentScript.src;\n }\n\n // IE>=10\n var stack;\n try {\n var err = new Error();\n if (err.stack) {\n stack = err.stack;\n } else {\n throw err;\n }\n } catch (err) {\n stack = err.stack;\n }\n if (typeof stack === 'string') {\n stack = stack.split('\\n');\n // Uses the last line, where the call started\n for (var i = stack.length; i--;) {\n var url = stack[i].match(/(\\w+\\:\\/\\/[^/]*?\\/.+?)(:\\d+)(:\\d+)?/);\n if (url) {\n return url[1];\n }\n }\n }\n\n // IE<11\n if (scripts.length && 'readyState' in scripts[0]) {\n for (var i = scripts.length; i--;) {\n if (scripts[i].readyState === 'interactive') {\n return scripts[i].src;\n }\n }\n }\n\n return location.href;\n }\n\n return function(url) {\n if (/^\\.\\//.test(url)) {\n var src = getScriptSrc();\n var base = src.substring(0, src.lastIndexOf('/') + 1);\n url = base + url.substring(2);\n // } else if (/^\\.\\.\\//.test(url)) {\n // url = base + url;\n }\n return url;\n };\n})();\n\nmodule.exports = Class;\n\nfunction loadScript(src, callback) {\n var el = document.createElement('script');\n el.addEventListener('load', function() {\n callback();\n });\n el.addEventListener('error', function(err) {\n callback(err || 'Error loading script: ' + src);\n });\n el.src = src;\n el.id = 'preload-' + Date.now();\n document.body.appendChild(el);\n};","function Matrix(a, b, c, d, e, f) {\n this.reset(a, b, c, d, e, f);\n};\n\nMatrix.prototype.toString = function() {\n return '[' + this.a + ', ' + this.b + ', ' + this.c + ', ' + this.d + ', '\n + this.e + ', ' + this.f + ']';\n};\n\nMatrix.prototype.clone = function() {\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n};\n\nMatrix.prototype.reset = function(a, b, c, d, e, f) {\n this._dirty = true;\n if (typeof a === 'object') {\n this.a = a.a, this.d = a.d;\n this.b = a.b, this.c = a.c;\n this.e = a.e, this.f = a.f;\n } else {\n this.a = a || 1, this.d = d || 1;\n this.b = b || 0, this.c = c || 0;\n this.e = e || 0, this.f = f || 0;\n }\n return this;\n};\n\nMatrix.prototype.identity = function() {\n this._dirty = true;\n this.a = 1;\n this.b = 0;\n this.c = 0;\n this.d = 1;\n this.e = 0;\n this.f = 0;\n return this;\n};\n\nMatrix.prototype.rotate = function(angle) {\n if (!angle) {\n return this;\n }\n\n this._dirty = true;\n\n var u = angle ? Math.cos(angle) : 1;\n // android bug may give bad 0 values\n var v = angle ? Math.sin(angle) : 0;\n\n var a = u * this.a - v * this.b;\n var b = u * this.b + v * this.a;\n var c = u * this.c - v * this.d;\n var d = u * this.d + v * this.c;\n var e = u * this.e - v * this.f;\n var f = u * this.f + v * this.e;\n\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n\n return this;\n};\n\nMatrix.prototype.translate = function(x, y) {\n if (!x && !y) {\n return this;\n }\n this._dirty = true;\n this.e += x;\n this.f += y;\n return this;\n};\n\nMatrix.prototype.scale = function(x, y) {\n if (!(x - 1) && !(y - 1)) {\n return this;\n }\n this._dirty = true;\n this.a *= x;\n this.b *= y;\n this.c *= x;\n this.d *= y;\n this.e *= x;\n this.f *= y;\n return this;\n};\n\nMatrix.prototype.skew = function(x, y) {\n if (!x && !y) {\n return this;\n }\n this._dirty = true;\n\n var a = this.a + this.b * x;\n var b = this.b + this.a * y;\n var c = this.c + this.d * x;\n var d = this.d + this.c * y;\n var e = this.e + this.f * x;\n var f = this.f + this.e * y;\n\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n return this;\n};\n\nMatrix.prototype.concat = function(m) {\n this._dirty = true;\n\n var n = this;\n\n var a = n.a * m.a + n.b * m.c;\n var b = n.b * m.d + n.a * m.b;\n var c = n.c * m.a + n.d * m.c;\n var d = n.d * m.d + n.c * m.b;\n var e = n.e * m.a + m.e + n.f * m.c;\n var f = n.f * m.d + m.f + n.e * m.b;\n\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n\n return this;\n};\n\nMatrix.prototype.inverse = Matrix.prototype.reverse = function() {\n if (this._dirty) {\n this._dirty = false;\n this.inversed = this.inversed || new Matrix();\n var z = this.a * this.d - this.b * this.c;\n this.inversed.a = this.d / z;\n this.inversed.b = -this.b / z;\n this.inversed.c = -this.c / z;\n this.inversed.d = this.a / z;\n this.inversed.e = (this.c * this.f - this.e * this.d) / z;\n this.inversed.f = (this.e * this.b - this.a * this.f) / z;\n }\n return this.inversed;\n};\n\nMatrix.prototype.map = function(p, q) {\n q = q || {};\n q.x = this.a * p.x + this.c * p.y + this.e;\n q.y = this.b * p.x + this.d * p.y + this.f;\n return q;\n};\n\nMatrix.prototype.mapX = function(x, y) {\n if (typeof x === 'object')\n y = x.y, x = x.x;\n return this.a * x + this.c * y + this.e;\n};\n\nMatrix.prototype.mapY = function(x, y) {\n if (typeof x === 'object')\n y = x.y, x = x.x;\n return this.b * x + this.d * y + this.f;\n};\n\nmodule.exports = Matrix;\n","if (typeof Object.create == 'function') {\n module.exports = function(proto, props) {\n return Object.create.call(Object, proto, props);\n };\n} else {\n module.exports = function(proto, props) {\n if (props)\n throw Error('Second argument is not supported!');\n if (typeof proto !== 'object' || proto === null)\n throw Error('Invalid prototype!');\n noop.prototype = proto;\n return new noop;\n };\n function noop() {\n }\n}\n","var create = require('./create');\nvar native = Math;\n\nmodule.exports = create(Math);\n\nmodule.exports.random = function(min, max) {\n if (typeof min === 'undefined') {\n max = 1, min = 0;\n } else if (typeof max === 'undefined') {\n max = min, min = 0;\n }\n return min == max ? min : native.random() * (max - min) + min;\n};\n\nmodule.exports.rotate = function(num, min, max) {\n if (typeof min === 'undefined') {\n max = 1, min = 0;\n } else if (typeof max === 'undefined') {\n max = min, min = 0;\n }\n if (max > min) {\n num = (num - min) % (max - min);\n return num + (num < 0 ? max : min);\n } else {\n num = (num - max) % (min - max);\n return num + (num <= 0 ? min : max);\n }\n};\n\nmodule.exports.limit = function(num, min, max) {\n if (num < min) {\n return min;\n } else if (num > max) {\n return max;\n } else {\n return num;\n }\n};\n\nmodule.exports.length = function(x, y) {\n return native.sqrt(x * x + y * y);\n};","var stats = require('./util/stats');\nvar math = require('./util/math');\n\nfunction Texture(image, ratio) {\n if (typeof image === 'object') {\n this.src(image, ratio);\n }\n}\n\nTexture.prototype.pipe = function() {\n return new Texture(this);\n};\n\n/**\n * Signatures: (image), (x, y, w, h), (w, h)\n */\nTexture.prototype.src = function(x, y, w, h) {\n if (typeof x === 'object') {\n var image = x, ratio = y || 1;\n\n this._image = image;\n this._sx = this._dx = 0;\n this._sy = this._dy = 0;\n this._sw = this._dw = image.width / ratio;\n this._sh = this._dh = image.height / ratio;\n\n this.width = image.width / ratio;\n this.height = image.height / ratio;\n\n this.ratio = ratio;\n\n } else {\n if (typeof w === 'undefined') {\n w = x, h = y;\n } else {\n this._sx = x, this._sy = y;\n }\n this._sw = this._dw = w;\n this._sh = this._dh = h;\n\n this.width = w;\n this.height = h;\n }\n return this;\n};\n\n/**\n * Signatures: (x, y, w, h), (x, y)\n */\nTexture.prototype.dest = function(x, y, w, h) {\n this._dx = x, this._dy = y;\n this._dx = x, this._dy = y;\n if (typeof w !== 'undefined') {\n this._dw = w, this._dh = h;\n this.width = w, this.height = h;\n }\n return this;\n};\n\nTexture.prototype.draw = function(context, x1, y1, x2, y2, x3, y3, x4, y4) {\n var image = this._image;\n if (image === null || typeof image !== 'object') {\n return;\n }\n\n var sx = this._sx, sy = this._sy;\n var sw = this._sw, sh = this._sh;\n var dx = this._dx, dy = this._dy;\n var dw = this._dw, dh = this._dh;\n\n if (typeof x3 !== 'undefined') {\n x1 = math.limit(x1, 0, this._sw), x2 = math.limit(x2, 0, this._sw - x1);\n y1 = math.limit(y1, 0, this._sh), y2 = math.limit(y2, 0, this._sh - y1);\n sx += x1, sy += y1, sw = x2, sh = y2;\n dx = x3, dy = y3, dw = x4, dh = y4;\n\n } else if (typeof x2 !== 'undefined') {\n dx = x1, dy = y1, dw = x2, dh = y2;\n\n } else if (typeof x1 !== 'undefined') {\n dw = x1, dh = y1;\n }\n\n var ratio = this.ratio || 1;\n sx *= ratio, sy *= ratio, sw *= ratio, sh *= ratio;\n\n try {\n if (typeof image.draw === 'function') {\n image.draw(context, sx, sy, sw, sh, dx, dy, dw, dh);\n } else {\n stats.draw++;\n context.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh);\n }\n } catch (ex) {\n if (!image._draw_failed) {\n console.log('Unable to draw: ', image);\n console.log(ex);\n image._draw_failed = true;\n }\n }\n};\n\nmodule.exports = Texture;\n","module.exports.startsWith = function(str, sub) {\n return typeof str === 'string' && typeof sub === 'string'\n && str.substring(0, sub.length) == sub;\n};","if (typeof DEBUG === 'undefined')\n DEBUG = true;\n\nvar Class = require('./core');\nvar Texture = require('./texture');\n\nvar extend = require('./util/extend');\nvar create = require('./util/create');\nvar is = require('./util/is');\n\nvar string = require('./util/string');\n\n// name : atlas\nvar _atlases_map = {};\n// [atlas]\nvar _atlases_arr = [];\n\n// TODO: print subquery not found error\n// TODO: index textures\n\nClass.atlas = function(def) {\n var atlas = is.fn(def.draw) ? def : new Atlas(def);\n if (def.name) {\n _atlases_map[def.name] = atlas;\n }\n _atlases_arr.push(atlas);\n\n deprecated(def, 'imagePath');\n deprecated(def, 'imageRatio');\n\n var url = def.imagePath;\n var ratio = def.imageRatio || 1;\n if (is.string(def.image)) {\n url = def.image;\n } else if (is.hash(def.image)) {\n url = def.image.src || def.image.url;\n ratio = def.image.ratio || ratio;\n }\n url && Class.preload(function(done) {\n url = Class.resolve(url);\n DEBUG && console.log('Loading atlas: ' + url);\n var imageloader = Class.config('image-loader');\n\n imageloader(url, function(image) {\n DEBUG && console.log('Image loaded: ' + url);\n atlas.src(image, ratio);\n done();\n\n }, function(err) {\n DEBUG && console.log('Error loading atlas: ' + url, err);\n done();\n });\n });\n\n return atlas;\n};\n\nAtlas._super = Texture;\nAtlas.prototype = create(Atlas._super.prototype);\n\nfunction Atlas(def) {\n Atlas._super.call(this);\n\n var atlas = this;\n\n deprecated(def, 'filter');\n deprecated(def, 'cutouts');\n deprecated(def, 'sprites');\n deprecated(def, 'factory');\n\n var map = def.map || def.filter;\n var ppu = def.ppu || def.ratio || 1;\n var trim = def.trim || 0;\n var textures = def.textures;\n var factory = def.factory;\n var cutouts = def.cutouts || def.sprites;\n\n function make(def) {\n if (!def || is.fn(def.draw)) {\n return def;\n }\n\n def = extend({}, def);\n\n if (is.fn(map)) {\n def = map(def);\n }\n\n if (ppu != 1) {\n def.x *= ppu, def.y *= ppu;\n def.width *= ppu, def.height *= ppu;\n def.top *= ppu, def.bottom *= ppu;\n def.left *= ppu, def.right *= ppu;\n }\n\n if (trim != 0) {\n def.x += trim, def.y += trim;\n def.width -= 2 * trim, def.height -= 2 * trim;\n def.top -= trim, def.bottom -= trim;\n def.left -= trim, def.right -= trim;\n }\n\n var texture = atlas.pipe();\n texture.top = def.top, texture.bottom = def.bottom;\n texture.left = def.left, texture.right = def.right;\n texture.src(def.x, def.y, def.width, def.height);\n return texture;\n }\n\n function find(query) {\n if (textures) {\n if (is.fn(textures)) {\n return textures(query);\n } else if (is.hash(textures)) {\n return textures[query];\n }\n }\n if (cutouts) { // deprecated\n var result = null, n = 0;\n for (var i = 0; i < cutouts.length; i++) {\n if (string.startsWith(cutouts[i].name, query)) {\n if (n === 0) {\n result = cutouts[i];\n } else if (n === 1) {\n result = [ result, cutouts[i] ];\n } else {\n result.push(cutouts[i]);\n }\n n++;\n }\n }\n if (n === 0 && is.fn(factory)) {\n result = function(subquery) {\n return factory(query + (subquery ? subquery : ''));\n };\n }\n return result;\n }\n }\n\n this.select = function(query) {\n if (!query) {\n // TODO: if `textures` is texture def, map or fn?\n return new Selection(this.pipe());\n }\n var found = find(query);\n if (found) {\n return new Selection(found, find, make);\n }\n };\n\n};\n\nvar nfTexture = new Texture();\nnfTexture.x = nfTexture.y = nfTexture.width = nfTexture.height = 0;\nnfTexture.pipe = nfTexture.src = nfTexture.dest = function() {\n return this;\n};\nnfTexture.draw = function() {\n};\n\nvar nfSelection = new Selection(nfTexture);\n\nfunction Selection(result, find, make) {\n function link(result, subquery) {\n if (!result) {\n return nfTexture;\n\n } else if (is.fn(result.draw)) {\n return result;\n\n } else if (is.hash(result) && is.number(result.width)\n && is.number(result.height) && is.fn(make)) {\n return make(result);\n\n } else if (is.hash(result) && is.defined(subquery)) {\n return link(result[subquery]);\n\n } else if (is.fn(result)) {\n return link(result(subquery));\n\n } else if (is.array(result)) {\n return link(result[0]);\n\n } else if (is.string(result) && is.fn(find)) {\n return link(find(result));\n }\n }\n\n this.one = function(subquery) {\n return link(result, subquery);\n };\n\n this.array = function(arr) {\n var array = is.array(arr) ? arr : [];\n if (is.array(result)) {\n for (var i = 0; i < result.length; i++) {\n array[i] = link(result[i]);\n }\n } else {\n array[0] = link(result);\n }\n return array;\n };\n}\n\nClass.texture = function(query) {\n if (!is.string(query)) {\n return new Selection(query);\n }\n\n var result = null, atlas, i;\n\n if ((i = query.indexOf(':')) > 0 && query.length > i + 1) {\n atlas = _atlases_map[query.slice(0, i)];\n result = atlas && atlas.select(query.slice(i + 1));\n }\n\n if (!result && (atlas = _atlases_map[query])) {\n result = atlas.select();\n }\n\n for (i = 0; !result && i < _atlases_arr.length; i++) {\n result = _atlases_arr[i].select(query);\n }\n\n if (!result) {\n console.error('Texture not found: ' + query);\n result = nfSelection;\n }\n\n return result;\n};\n\nfunction deprecated(hash, name, msg) {\n if (name in hash)\n console.log(msg ? msg.replace('%name', name) : '\\'' + name\n + '\\' field of texture atlas is deprecated.');\n};\n\nmodule.exports = Atlas;\n","var Class = require('./core');\nvar is = require('./util/is');\n\nvar iid = 0;\n\n// TODO: do not clear next/prev/parent on remove\n\nClass.prototype._label = '';\n\nClass.prototype._visible = true;\n\nClass.prototype._parent = null;\nClass.prototype._next = null;\nClass.prototype._prev = null;\n\nClass.prototype._first = null;\nClass.prototype._last = null;\n\nClass.prototype._attrs = null;\nClass.prototype._flags = null;\n\nClass.prototype.toString = function() {\n return '[' + this._label + ']';\n};\n\n/**\n * @deprecated Use label()\n */\nClass.prototype.id = function(id) {\n return this.label(id);\n};\n\nClass.prototype.label = function(label) {\n if (typeof label === 'undefined') {\n return this._label;\n }\n this._label = label;\n return this;\n};\n\nClass.prototype.attr = function(name, value) {\n if (typeof value === 'undefined') {\n return this._attrs !== null ? this._attrs[name] : undefined;\n }\n (this._attrs !== null ? this._attrs : this._attrs = {})[name] = value;\n return this;\n};\n\nClass.prototype.visible = function(visible) {\n if (typeof visible === 'undefined') {\n return this._visible;\n }\n this._visible = visible;\n this._parent && (this._parent._ts_children = ++iid);\n this._ts_pin = ++iid;\n this.touch();\n return this;\n};\n\nClass.prototype.hide = function() {\n return this.visible(false);\n};\n\nClass.prototype.show = function() {\n return this.visible(true);\n};\n\nClass.prototype.parent = function() {\n return this._parent;\n};\n\nClass.prototype.next = function(visible) {\n var next = this._next;\n while (next && visible && !next._visible) {\n next = next._next;\n }\n return next;\n};\n\nClass.prototype.prev = function(visible) {\n var prev = this._prev;\n while (prev && visible && !prev._visible) {\n prev = prev._prev;\n }\n return prev;\n};\n\nClass.prototype.first = function(visible) {\n var next = this._first;\n while (next && visible && !next._visible) {\n next = next._next;\n }\n return next;\n};\n\nClass.prototype.last = function(visible) {\n var prev = this._last;\n while (prev && visible && !prev._visible) {\n prev = prev._prev;\n }\n return prev;\n};\n\nClass.prototype.visit = function(visitor, data) {\n var reverse = visitor.reverse;\n var visible = visitor.visible;\n if (visitor.start && visitor.start(this, data)) {\n return;\n }\n var child, next = reverse ? this.last(visible) : this.first(visible);\n while (child = next) {\n next = reverse ? child.prev(visible) : child.next(visible);\n if (child.visit(visitor, data)) {\n return true;\n }\n }\n return visitor.end && visitor.end(this, data);\n};\n\nClass.prototype.append = function(child, more) {\n if (is.array(child))\n for (var i = 0; i < child.length; i++)\n append(this, child[i]);\n\n else if (typeof more !== 'undefined') // deprecated\n for (var i = 0; i < arguments.length; i++)\n append(this, arguments[i]);\n\n else if (typeof child !== 'undefined')\n append(this, child);\n\n return this;\n};\n\nClass.prototype.prepend = function(child, more) {\n if (is.array(child))\n for (var i = child.length - 1; i >= 0; i--)\n prepend(this, child[i]);\n\n else if (typeof more !== 'undefined') // deprecated\n for (var i = arguments.length - 1; i >= 0; i--)\n prepend(this, arguments[i]);\n\n else if (typeof child !== 'undefined')\n prepend(this, child);\n\n return this;\n};\n\nClass.prototype.appendTo = function(parent) {\n append(parent, this);\n return this;\n};\n\nClass.prototype.prependTo = function(parent) {\n prepend(parent, this);\n return this;\n};\n\nClass.prototype.insertNext = function(sibling, more) {\n if (is.array(sibling))\n for (var i = 0; i < sibling.length; i++)\n insertAfter(sibling[i], this);\n\n else if (typeof more !== 'undefined') // deprecated\n for (var i = 0; i < arguments.length; i++)\n insertAfter(arguments[i], this);\n\n else if (typeof sibling !== 'undefined')\n insertAfter(sibling, this);\n\n return this;\n};\n\nClass.prototype.insertPrev = function(sibling, more) {\n if (is.array(sibling))\n for (var i = sibling.length - 1; i >= 0; i--)\n insertBefore(sibling[i], this);\n\n else if (typeof more !== 'undefined') // deprecated\n for (var i = arguments.length - 1; i >= 0; i--)\n insertBefore(arguments[i], this);\n\n else if (typeof sibling !== 'undefined')\n insertBefore(sibling, this);\n\n return this;\n};\n\nClass.prototype.insertAfter = function(prev) {\n insertAfter(this, prev);\n return this;\n};\n\nClass.prototype.insertBefore = function(next) {\n insertBefore(this, next);\n return this;\n};\n\nfunction append(parent, child) {\n _ensure(child);\n _ensure(parent);\n\n child.remove();\n\n if (parent._last) {\n parent._last._next = child;\n child._prev = parent._last;\n }\n\n child._parent = parent;\n parent._last = child;\n\n if (!parent._first) {\n parent._first = child;\n }\n\n child._parent._flag(child, true);\n\n child._ts_parent = ++iid;\n parent._ts_children = ++iid;\n parent.touch();\n}\n\nfunction prepend(parent, child) {\n _ensure(child);\n _ensure(parent);\n\n child.remove();\n\n if (parent._first) {\n parent._first._prev = child;\n child._next = parent._first;\n }\n\n child._parent = parent;\n parent._first = child;\n\n if (!parent._last) {\n parent._last = child;\n }\n\n child._parent._flag(child, true);\n\n child._ts_parent = ++iid;\n parent._ts_children = ++iid;\n parent.touch();\n};\n\nfunction insertBefore(self, next) {\n _ensure(self);\n _ensure(next);\n\n self.remove();\n\n var parent = next._parent;\n var prev = next._prev;\n\n next._prev = self;\n prev && (prev._next = self) || parent && (parent._first = self);\n\n self._parent = parent;\n self._prev = prev;\n self._next = next;\n\n self._parent._flag(self, true);\n\n self._ts_parent = ++iid;\n self.touch();\n};\n\nfunction insertAfter(self, prev) {\n _ensure(self);\n _ensure(prev);\n\n self.remove();\n\n var parent = prev._parent;\n var next = prev._next;\n\n prev._next = self;\n next && (next._prev = self) || parent && (parent._last = self);\n\n self._parent = parent;\n self._prev = prev;\n self._next = next;\n\n self._parent._flag(self, true);\n\n self._ts_parent = ++iid;\n self.touch();\n};\n\nClass.prototype.remove = function(child, more) {\n if (typeof child !== 'undefined') {\n if (is.array(child)) {\n for (var i = 0; i < child.length; i++)\n _ensure(child[i]).remove();\n\n } else if (typeof more !== 'undefined') {\n for (var i = 0; i < arguments.length; i++)\n _ensure(arguments[i]).remove();\n\n } else {\n _ensure(child).remove();\n }\n return this;\n }\n\n if (this._prev) {\n this._prev._next = this._next;\n }\n if (this._next) {\n this._next._prev = this._prev;\n }\n\n if (this._parent) {\n if (this._parent._first === this) {\n this._parent._first = this._next;\n }\n if (this._parent._last === this) {\n this._parent._last = this._prev;\n }\n\n this._parent._flag(this, false);\n\n this._parent._ts_children = ++iid;\n this._parent.touch();\n }\n\n this._prev = this._next = this._parent = null;\n this._ts_parent = ++iid;\n // this._parent.touch();\n\n return this;\n};\n\nClass.prototype.empty = function() {\n var child, next = this._first;\n while (child = next) {\n next = child._next;\n child._prev = child._next = child._parent = null;\n\n this._flag(child, false);\n }\n\n this._first = this._last = null;\n\n this._ts_children = ++iid;\n this.touch();\n return this;\n};\n\nClass.prototype.touch = function() {\n this._ts_touch = ++iid;\n this._parent && this._parent.touch();\n return this;\n};\n\n/**\n * Deep flags used for optimizing event distribution.\n */\nClass.prototype._flag = function(obj, name) {\n if (typeof name === 'undefined') {\n return this._flags !== null && this._flags[obj] || 0;\n }\n if (typeof obj === 'string') {\n if (name) {\n this._flags = this._flags || {};\n if (!this._flags[obj] && this._parent) {\n this._parent._flag(obj, true);\n }\n this._flags[obj] = (this._flags[obj] || 0) + 1;\n\n } else if (this._flags && this._flags[obj] > 0) {\n if (this._flags[obj] == 1 && this._parent) {\n this._parent._flag(obj, false);\n }\n this._flags[obj] = this._flags[obj] - 1;\n }\n }\n if (typeof obj === 'object') {\n if (obj._flags) {\n for ( var type in obj._flags) {\n if (obj._flags[type] > 0) {\n this._flag(type, name);\n }\n }\n }\n }\n return this;\n};\n\n/**\n * @private\n */\nClass.prototype.hitTest = function(hit) {\n var width = this._pin._width;\n var height = this._pin._height;\n return hit.x >= 0 && hit.x <= width && hit.y >= 0 && hit.y <= height;\n};\n\nfunction _ensure(obj) {\n if (obj && obj instanceof Class) {\n return obj;\n }\n throw 'Invalid node: ' + obj;\n};\n\nmodule.exports = Class;\n","module.exports = function(prototype, callback) {\n\n prototype._listeners = null;\n\n prototype.on = prototype.listen = function(types, listener) {\n if (!types || !types.length || typeof listener !== 'function') {\n return this;\n }\n if (this._listeners === null) {\n this._listeners = {};\n }\n var isarray = typeof types !== 'string' && typeof types.join === 'function';\n if (types = (isarray ? types.join(' ') : types).match(/\\S+/g)) {\n for (var i = 0; i < types.length; i++) {\n var type = types[i];\n this._listeners[type] = this._listeners[type] || [];\n this._listeners[type].push(listener);\n if (typeof callback === 'function') {\n callback(this, type, true);\n }\n }\n }\n return this;\n };\n\n prototype.off = function(types, listener) {\n if (!types || !types.length || typeof listener !== 'function') {\n return this;\n }\n if (this._listeners === null) {\n return this;\n }\n var isarray = typeof types !== 'string' && typeof types.join === 'function';\n if (types = (isarray ? types.join(' ') : types).match(/\\S+/g)) {\n for (var i = 0; i < types.length; i++) {\n var type = types[i], all = this._listeners[type], index;\n if (all && (index = all.indexOf(listener)) >= 0) {\n all.splice(index, 1);\n if (!all.length) {\n delete this._listeners[type];\n }\n if (typeof callback === 'function') {\n callback(this, type, false);\n }\n }\n }\n }\n return this;\n };\n\n prototype.listeners = function(type) {\n return this._listeners && this._listeners[type];\n };\n\n prototype.publish = function(name, args) {\n var listeners = this.listeners(name);\n if (!listeners || !listeners.length) {\n return 0;\n }\n for (var l = 0; l < listeners.length; l++) {\n listeners[l].apply(this, args);\n }\n return listeners.length;\n };\n\n prototype.trigger = function(name, args) {\n this.publish(name, args);\n return this;\n };\n\n};\n","require('./util/event')(require('./core').prototype, function(obj, name, on) {\n obj._flag(name, on);\n});\n","var Class = require('./core');\nvar Matrix = require('./matrix');\n\nvar iid = 0;\n\nClass._init(function() {\n this._pin = new Pin(this);\n});\n\nClass.prototype.matrix = function(relative) {\n if (relative === true) {\n return this._pin.relativeMatrix();\n }\n return this._pin.absoluteMatrix();\n};\n\nClass.prototype.pin = function(a, b) {\n if (typeof a === 'object') {\n this._pin.set(a);\n return this;\n\n } else if (typeof a === 'string') {\n if (typeof b === 'undefined') {\n return this._pin.get(a);\n } else {\n this._pin.set(a, b);\n return this;\n }\n } else if (typeof a === 'undefined') {\n return this._pin;\n }\n};\n\nfunction Pin(owner) {\n\n this._owner = owner;\n this._parent = null;\n\n // relative to parent\n this._relativeMatrix = new Matrix();\n\n // relative to stage\n this._absoluteMatrix = new Matrix();\n\n this.reset();\n};\n\nPin.prototype.reset = function() {\n\n this._textureAlpha = 1;\n this._alpha = 1;\n\n this._width = 0;\n this._height = 0;\n\n this._scaleX = 1;\n this._scaleY = 1;\n this._skewX = 0;\n this._skewY = 0;\n this._rotation = 0;\n\n // scale/skew/rotate center\n this._pivoted = false;\n this._pivotX = null;\n this._pivotY = null;\n\n // self pin point\n this._handled = false;\n this._handleX = 0;\n this._handleY = 0;\n\n // parent pin point\n this._aligned = false;\n this._alignX = 0;\n this._alignY = 0;\n\n // as seen by parent px\n this._offsetX = 0;\n this._offsetY = 0;\n\n this._boxX = 0;\n this._boxY = 0;\n this._boxWidth = this._width;\n this._boxHeight = this._height;\n\n // TODO: also set for owner\n this._ts_translate = ++iid;\n this._ts_transform = ++iid;\n this._ts_matrix = ++iid;\n};\n\nPin.prototype._update = function() {\n this._parent = this._owner._parent && this._owner._parent._pin;\n\n // if handled and transformed then be translated\n if (this._handled && this._mo_handle != this._ts_transform) {\n this._mo_handle = this._ts_transform;\n this._ts_translate = ++iid;\n }\n\n if (this._aligned && this._parent\n && this._mo_align != this._parent._ts_transform) {\n this._mo_align = this._parent._ts_transform;\n this._ts_translate = ++iid;\n }\n\n return this;\n};\n\nPin.prototype.toString = function() {\n return this._owner + ' (' + (this._parent ? this._parent._owner : null) + ')';\n};\n\n// TODO: ts fields require refactoring\n\nPin.prototype.absoluteMatrix = function() {\n this._update();\n var ts = Math.max(\n this._ts_transform,\n this._ts_translate,\n this._parent ? this._parent._ts_matrix : 0\n );\n if (this._mo_abs == ts) {\n return this._absoluteMatrix;\n }\n this._mo_abs = ts;\n\n var abs = this._absoluteMatrix;\n abs.reset(this.relativeMatrix());\n\n this._parent && abs.concat(this._parent._absoluteMatrix);\n\n this._ts_matrix = ++iid;\n\n return abs;\n};\n\nPin.prototype.relativeMatrix = function() {\n this._update();\n var ts = Math.max(this._ts_transform, this._ts_translate,\n this._parent ? this._parent._ts_transform : 0);\n if (this._mo_rel == ts) {\n return this._relativeMatrix;\n }\n this._mo_rel = ts;\n\n var rel = this._relativeMatrix;\n\n rel.identity();\n if (this._pivoted) {\n rel.translate(-this._pivotX * this._width, -this._pivotY * this._height);\n }\n rel.scale(this._scaleX, this._scaleY);\n rel.skew(this._skewX, this._skewY);\n rel.rotate(this._rotation);\n if (this._pivoted) {\n rel.translate(this._pivotX * this._width, this._pivotY * this._height);\n }\n\n // calculate effective box\n if (this._pivoted) {\n // origin\n this._boxX = 0;\n this._boxY = 0;\n this._boxWidth = this._width;\n this._boxHeight = this._height;\n\n } else {\n // aabb\n var p, q;\n if (rel.a > 0 && rel.c > 0 || rel.a < 0 && rel.c < 0) {\n p = 0, q = rel.a * this._width + rel.c * this._height;\n } else {\n p = rel.a * this._width, q = rel.c * this._height;\n }\n if (p > q) {\n this._boxX = q;\n this._boxWidth = p - q;\n } else {\n this._boxX = p;\n this._boxWidth = q - p;\n }\n if (rel.b > 0 && rel.d > 0 || rel.b < 0 && rel.d < 0) {\n p = 0, q = rel.b * this._width + rel.d * this._height;\n } else {\n p = rel.b * this._width, q = rel.d * this._height;\n }\n if (p > q) {\n this._boxY = q;\n this._boxHeight = p - q;\n } else {\n this._boxY = p;\n this._boxHeight = q - p;\n }\n }\n\n this._x = this._offsetX;\n this._y = this._offsetY;\n\n this._x -= this._boxX + this._handleX * this._boxWidth;\n this._y -= this._boxY + this._handleY * this._boxHeight;\n\n if (this._aligned && this._parent) {\n this._parent.relativeMatrix();\n this._x += this._alignX * this._parent._width;\n this._y += this._alignY * this._parent._height;\n }\n\n rel.translate(this._x, this._y);\n\n return this._relativeMatrix;\n};\n\nPin.prototype.get = function(key) {\n if (typeof getters[key] === 'function') {\n return getters[key](this);\n }\n};\n\n// TODO: Use defineProperty instead? What about multi-field pinning?\nPin.prototype.set = function(a, b) {\n if (typeof a === 'string') {\n if (typeof setters[a] === 'function' && typeof b !== 'undefined') {\n setters[a](this, b);\n }\n } else if (typeof a === 'object') {\n for (b in a) {\n if (typeof setters[b] === 'function' && typeof a[b] !== 'undefined') {\n setters[b](this, a[b], a);\n }\n }\n }\n if (this._owner) {\n this._owner._ts_pin = ++iid;\n this._owner.touch();\n }\n return this;\n};\n\nvar getters = {\n alpha : function(pin) {\n return pin._alpha;\n },\n\n textureAlpha : function(pin) {\n return pin._textureAlpha;\n },\n\n width : function(pin) {\n return pin._width;\n },\n\n height : function(pin) {\n return pin._height;\n },\n\n boxWidth : function(pin) {\n return pin._boxWidth;\n },\n\n boxHeight : function(pin) {\n return pin._boxHeight;\n },\n\n // scale : function(pin) {\n // },\n\n scaleX : function(pin) {\n return pin._scaleX;\n },\n\n scaleY : function(pin) {\n return pin._scaleY;\n },\n\n // skew : function(pin) {\n // },\n\n skewX : function(pin) {\n return pin._skewX;\n },\n\n skewY : function(pin) {\n return pin._skewY;\n },\n\n rotation : function(pin) {\n return pin._rotation;\n },\n\n // pivot : function(pin) {\n // },\n\n pivotX : function(pin) {\n return pin._pivotX;\n },\n\n pivotY : function(pin) {\n return pin._pivotY;\n },\n\n // offset : function(pin) {\n // },\n\n offsetX : function(pin) {\n return pin._offsetX;\n },\n\n offsetY : function(pin) {\n return pin._offsetY;\n },\n\n // align : function(pin) {\n // },\n\n alignX : function(pin) {\n return pin._alignX;\n },\n\n alignY : function(pin) {\n return pin._alignY;\n },\n\n // handle : function(pin) {\n // },\n\n handleX : function(pin) {\n return pin._handleX;\n },\n\n handleY : function(pin) {\n return pin._handleY;\n }\n};\n\nvar setters = {\n alpha : function(pin, value) {\n pin._alpha = value;\n },\n\n textureAlpha : function(pin, value) {\n pin._textureAlpha = value;\n },\n\n width : function(pin, value) {\n pin._width_ = value;\n pin._width = value;\n pin._ts_transform = ++iid;\n },\n\n height : function(pin, value) {\n pin._height_ = value;\n pin._height = value;\n pin._ts_transform = ++iid;\n },\n\n scale : function(pin, value) {\n pin._scaleX = value;\n pin._scaleY = value;\n pin._ts_transform = ++iid;\n },\n\n scaleX : function(pin, value) {\n pin._scaleX = value;\n pin._ts_transform = ++iid;\n },\n\n scaleY : function(pin, value) {\n pin._scaleY = value;\n pin._ts_transform = ++iid;\n },\n\n skew : function(pin, value) {\n pin._skewX = value;\n pin._skewY = value;\n pin._ts_transform = ++iid;\n },\n\n skewX : function(pin, value) {\n pin._skewX = value;\n pin._ts_transform = ++iid;\n },\n\n skewY : function(pin, value) {\n pin._skewY = value;\n pin._ts_transform = ++iid;\n },\n\n rotation : function(pin, value) {\n pin._rotation = value;\n pin._ts_transform = ++iid;\n },\n\n pivot : function(pin, value) {\n pin._pivotX = value;\n pin._pivotY = value;\n pin._pivoted = true;\n pin._ts_transform = ++iid;\n },\n\n pivotX : function(pin, value) {\n pin._pivotX = value;\n pin._pivoted = true;\n pin._ts_transform = ++iid;\n },\n\n pivotY : function(pin, value) {\n pin._pivotY = value;\n pin._pivoted = true;\n pin._ts_transform = ++iid;\n },\n\n offset : function(pin, value) {\n pin._offsetX = value;\n pin._offsetY = value;\n pin._ts_translate = ++iid;\n },\n\n offsetX : function(pin, value) {\n pin._offsetX = value;\n pin._ts_translate = ++iid;\n },\n\n offsetY : function(pin, value) {\n pin._offsetY = value;\n pin._ts_translate = ++iid;\n },\n\n align : function(pin, value) {\n this.alignX(pin, value);\n this.alignY(pin, value);\n },\n\n alignX : function(pin, value) {\n pin._alignX = value;\n pin._aligned = true;\n pin._ts_translate = ++iid;\n\n this.handleX(pin, value);\n },\n\n alignY : function(pin, value) {\n pin._alignY = value;\n pin._aligned = true;\n pin._ts_translate = ++iid;\n\n this.handleY(pin, value);\n },\n\n handle : function(pin, value) {\n this.handleX(pin, value);\n this.handleY(pin, value);\n },\n\n handleX : function(pin, value) {\n pin._handleX = value;\n pin._handled = true;\n pin._ts_translate = ++iid;\n },\n\n handleY : function(pin, value) {\n pin._handleY = value;\n pin._handled = true;\n pin._ts_translate = ++iid;\n },\n\n resizeMode : function(pin, value, all) {\n if (all) {\n if (value == 'in') {\n value = 'in-pad';\n } else if (value == 'out') {\n value = 'out-crop';\n }\n scaleTo(pin, all.resizeWidth, all.resizeHeight, value);\n }\n },\n\n resizeWidth : function(pin, value, all) {\n if (!all || !all.resizeMode) {\n scaleTo(pin, value, null);\n }\n },\n\n resizeHeight : function(pin, value, all) {\n if (!all || !all.resizeMode) {\n scaleTo(pin, null, value);\n }\n },\n\n scaleMode : function(pin, value, all) {\n if (all) {\n scaleTo(pin, all.scaleWidth, all.scaleHeight, value);\n }\n },\n\n scaleWidth : function(pin, value, all) {\n if (!all || !all.scaleMode) {\n scaleTo(pin, value, null);\n }\n },\n\n scaleHeight : function(pin, value, all) {\n if (!all || !all.scaleMode) {\n scaleTo(pin, null, value);\n }\n },\n\n matrix : function(pin, value) {\n this.scaleX(pin, value.a);\n this.skewX(pin, value.c / value.d);\n this.skewY(pin, value.b / value.a);\n this.scaleY(pin, value.d);\n this.offsetX(pin, value.e);\n this.offsetY(pin, value.f);\n this.rotation(pin, 0);\n }\n};\n\nfunction scaleTo(pin, width, height, mode) {\n var w = typeof width === 'number';\n var h = typeof height === 'number';\n var m = typeof mode === 'string';\n pin._ts_transform = ++iid;\n if (w) {\n pin._scaleX = width / pin._width_;\n pin._width = pin._width_;\n }\n if (h) {\n pin._scaleY = height / pin._height_;\n pin._height = pin._height_;\n }\n if (w && h && m) {\n if (mode == 'out' || mode == 'out-crop') {\n pin._scaleX = pin._scaleY = Math.max(pin._scaleX, pin._scaleY);\n } else if (mode == 'in' || mode == 'in-pad') {\n pin._scaleX = pin._scaleY = Math.min(pin._scaleX, pin._scaleY);\n }\n if (mode == 'out-crop' || mode == 'in-pad') {\n pin._width = width / pin._scaleX;\n pin._height = height / pin._scaleY;\n }\n }\n};\n\nClass.prototype.scaleTo = function(a, b, c) {\n if (typeof a === 'object')\n c = b, b = a.y, a = a.x;\n scaleTo(this._pin, a, b, c);\n return this;\n};\n\n// Used by Tween class\nPin._add_shortcuts = function(Class) {\n Class.prototype.size = function(w, h) {\n this.pin('width', w);\n this.pin('height', h);\n return this;\n };\n\n Class.prototype.width = function(w) {\n if (typeof w === 'undefined') {\n return this.pin('width');\n }\n this.pin('width', w);\n return this;\n };\n\n Class.prototype.height = function(h) {\n if (typeof h === 'undefined') {\n return this.pin('height');\n }\n this.pin('height', h);\n return this;\n };\n\n Class.prototype.offset = function(a, b) {\n if (typeof a === 'object')\n b = a.y, a = a.x;\n this.pin('offsetX', a);\n this.pin('offsetY', b);\n return this;\n };\n\n Class.prototype.rotate = function(a) {\n this.pin('rotation', a);\n return this;\n };\n\n Class.prototype.skew = function(a, b) {\n if (typeof a === 'object')\n b = a.y, a = a.x;\n else if (typeof b === 'undefined')\n b = a;\n this.pin('skewX', a);\n this.pin('skewY', b);\n return this;\n };\n\n Class.prototype.scale = function(a, b) {\n if (typeof a === 'object')\n b = a.y, a = a.x;\n else if (typeof b === 'undefined')\n b = a;\n this.pin('scaleX', a);\n this.pin('scaleY', b);\n return this;\n };\n\n Class.prototype.alpha = function(a, ta) {\n this.pin('alpha', a);\n if (typeof ta !== 'undefined') {\n this.pin('textureAlpha', ta);\n }\n return this;\n };\n};\n\nPin._add_shortcuts(Class);\n\nmodule.exports = Pin;\n","var Class = require('./core');\nrequire('./pin');\nvar stats = require('./util/stats');\n\nClass.prototype._textures = null;\nClass.prototype._alpha = 1;\n\nClass.prototype.render = function(context) {\n if (!this._visible) {\n return;\n }\n stats.node++;\n\n var m = this.matrix();\n context.setTransform(m.a, m.b, m.c, m.d, m.e, m.f);\n\n // move this elsewhere!\n this._alpha = this._pin._alpha * (this._parent ? this._parent._alpha : 1);\n var alpha = this._pin._textureAlpha * this._alpha;\n\n if (context.globalAlpha != alpha) {\n context.globalAlpha = alpha;\n }\n\n if (this._textures !== null) {\n for (var i = 0, n = this._textures.length; i < n; i++) {\n this._textures[i].draw(context);\n }\n }\n\n if (context.globalAlpha != this._alpha) {\n context.globalAlpha = this._alpha;\n }\n\n var child, next = this._first;\n while (child = next) {\n next = child._next;\n child.render(context);\n }\n};\n\nClass.prototype._tickBefore = null;\nClass.prototype._tickAfter = null;\nClass.prototype.MAX_ELAPSE = Infinity;\n\nClass.prototype._tick = function(elapsed, now, last) {\n if (!this._visible) {\n return;\n }\n\n if (elapsed > this.MAX_ELAPSE) {\n elapsed = this.MAX_ELAPSE;\n }\n\n var ticked = false;\n\n if (this._tickBefore !== null) {\n for (var i = 0; i < this._tickBefore.length; i++) {\n stats.tick++;\n var tickFn = this._tickBefore[i];\n ticked = tickFn.call(this, elapsed, now, last) === true || ticked;\n }\n }\n\n var child, next = this._first;\n while (child = next) {\n next = child._next;\n if (child._flag('_tick')) {\n ticked = child._tick(elapsed, now, last) === true ? true : ticked;\n }\n }\n\n if (this._tickAfter !== null) {\n for (var i = 0; i < this._tickAfter.length; i++) {\n stats.tick++;\n var tickFn = this._tickAfter[i];\n ticked = tickFn.call(this, elapsed, now, last) === true || ticked;\n }\n }\n\n return ticked;\n};\n\nClass.prototype.tick = function(ticker, before) {\n if (typeof ticker !== 'function') {\n return;\n }\n if (before) {\n if (this._tickBefore === null) {\n this._tickBefore = [];\n }\n this._tickBefore.push(ticker);\n } else {\n if (this._tickAfter === null) {\n this._tickAfter = [];\n }\n this._tickAfter.push(ticker);\n }\n this._flag('_tick', this._tickAfter !== null && this._tickAfter.length > 0\n || this._tickBefore !== null && this._tickBefore.length > 0);\n};\n\nClass.prototype.untick = function(ticker) {\n if (typeof ticker !== 'function') {\n return;\n }\n var i;\n if (this._tickBefore !== null && (i = this._tickBefore.indexOf(ticker)) >= 0) {\n this._tickBefore.splice(i, 1);\n }\n if (this._tickAfter !== null && (i = this._tickAfter.indexOf(ticker)) >= 0) {\n this._tickAfter.splice(i, 1);\n }\n};\n\nClass.prototype.timeout = function(fn, time) {\n this.setTimeout(fn, time);\n};\n\nClass.prototype.setTimeout = function(fn, time) {\n function timer(t) {\n if ((time -= t) < 0) {\n this.untick(timer);\n fn.call(this);\n } else {\n return true;\n }\n }\n this.tick(timer);\n return timer;\n};\n\nClass.prototype.clearTimeout = function(timer) {\n this.untick(timer);\n};\n\n","var Class = require('./core');\nrequire('./pin');\nrequire('./loop');\n\nvar stats = require('./util/stats');\nvar create = require('./util/create');\nvar extend = require('./util/extend');\n\nRoot._super = Class;\nRoot.prototype = create(Root._super.prototype);\n\nClass.root = function(request, render) {\n return new Root(request, render);\n};\n\nfunction Root(request, render) {\n Root._super.call(this);\n this.label('Root');\n\n var paused = true;\n var stopped = true;\n\n var self = this;\n var lastTime = 0;\n var loop = function(now) {\n if (paused === true || stopped === true) {\n return;\n }\n\n stats.tick = stats.node = stats.draw = 0;\n\n var last = lastTime || now;\n var elapsed = now - last;\n lastTime = now;\n\n var ticked = self._tick(elapsed, now, last);\n if (self._mo_touch != self._ts_touch) {\n self._mo_touch = self._ts_touch;\n render(self);\n request(loop);\n } else if (ticked) {\n request(loop);\n } else {\n paused = true;\n }\n\n stats.fps = elapsed ? 1000 / elapsed : 0;\n };\n\n this.start = function() {\n stopped = false;\n return this.resume();\n };\n\n this.resume = function() {\n if (paused) {\n this.publish('resume');\n paused = false;\n request(loop);\n }\n return this;\n };\n\n this.pause = function() {\n if (!paused) {\n this.publish('pause');\n }\n paused = true;\n return this;\n };\n\n this.touch_root = this.touch;\n this.touch = function() {\n this.resume();\n return this.touch_root();\n };\n this.stop = function() {\n stopped = true;\n return this;\n };\n};\n\nRoot.prototype.background = function(color) {\n // to be implemented by loaders\n return this;\n};\n\nRoot.prototype.viewport = function(width, height, ratio) {\n if (typeof width === 'undefined') {\n return extend({}, this._viewport);\n }\n this._viewport = {\n width : width,\n height : height,\n ratio : ratio || 1\n };\n this.viewbox();\n var data = extend({}, this._viewport);\n this.visit({\n start : function(node) {\n if (!node._flag('viewport')) {\n return true;\n }\n node.publish('viewport', [ data ]);\n }\n });\n return this;\n};\n\n// TODO: static/fixed viewbox\nRoot.prototype.viewbox = function(width, height, mode) {\n if (typeof width === 'number' && typeof height === 'number') {\n this._viewbox = {\n width : width,\n height : height,\n mode : /^(in|out|in-pad|out-crop)$/.test(mode) ? mode : 'in-pad'\n };\n }\n\n var box = this._viewbox;\n var size = this._viewport;\n if (size && box) {\n this.pin({\n width : box.width,\n height : box.height\n });\n this.scaleTo(size.width, size.height, box.mode);\n } else if (size) {\n this.pin({\n width : size.width,\n height : size.height\n });\n }\n\n return this;\n};\n","module.exports = require('./core');\nmodule.exports.Matrix = require('./matrix');\nmodule.exports.Texture = require('./texture');\nrequire('./atlas');\nrequire('./tree');\nrequire('./event');\nrequire('./pin');\n\nrequire('./loop');\nrequire('./root');","var Class = require('./core');\nvar Texture = require('./texture');\n\nClass.canvas = function(type, attributes, drawFn) {\n if (typeof type === 'string') {\n if (typeof attributes === 'object') {\n } else {\n if (typeof attributes === 'function') {\n drawFn = attributes;\n }\n attributes = {};\n }\n } else {\n if (typeof type === 'function') {\n drawFn = type;\n }\n attributes = {};\n type = '2d';\n }\n\n var canvas = document.createElement('canvas');\n var context = canvas.getContext(type, attributes);\n var texture = new Texture(canvas);\n\n texture.context = function() {\n return context;\n };\n\n texture.size = function(width, height, ratio) {\n ratio = ratio || 1;\n canvas.width = width * ratio;\n canvas.height = height * ratio;\n this.src(canvas, ratio);\n return this;\n };\n\n texture.canvas = function(fn) {\n if (typeof fn === 'function') {\n fn.call(this, context);\n } else if (typeof fn === 'undefined' && typeof drawFn === 'function') {\n drawFn.call(this, context);\n }\n return this;\n };\n\n if (typeof drawFn === 'function') {\n drawFn.call(texture, context);\n }\n\n return texture;\n};","module.exports = function(img, owidth, oheight, stretch, inner, insert) {\n\n var width = img.width;\n var height = img.height;\n var left = img.left;\n var right = img.right;\n var top = img.top;\n var bottom = img.bottom;\n\n left = typeof left === 'number' && left === left ? left : 0;\n right = typeof right === 'number' && right === right ? right : 0;\n top = typeof top === 'number' && top === top ? top : 0;\n bottom = typeof bottom === 'number' && bottom === bottom ? bottom : 0;\n\n width = width - left - right;\n height = height - top - bottom;\n\n if (!inner) {\n owidth = Math.max(owidth - left - right, 0);\n oheight = Math.max(oheight - top - bottom, 0);\n }\n\n var i = 0;\n\n if (top > 0 && left > 0)\n insert(i++, 0, 0, left, top, 0, 0, left, top);\n if (bottom > 0 && left > 0)\n insert(i++, 0, height + top, left, bottom, 0, oheight + top, left, bottom);\n if (top > 0 && right > 0)\n insert(i++, width + left, 0, right, top, owidth + left, 0, right, top);\n if (bottom > 0 && right > 0)\n insert(i++, width + left, height + top, right, bottom, owidth + left,\n oheight + top, right, bottom);\n\n if (stretch) {\n if (top > 0)\n insert(i++, left, 0, width, top, left, 0, owidth, top);\n if (bottom > 0)\n insert(i++, left, height + top, width, bottom, left, oheight + top,\n owidth, bottom);\n if (left > 0)\n insert(i++, 0, top, left, height, 0, top, left, oheight);\n if (right > 0)\n insert(i++, width + left, top, right, height, owidth + left, top, right,\n oheight);\n // center\n insert(i++, left, top, width, height, left, top, owidth, oheight);\n\n } else { // tile\n var l = left, r = owidth, w;\n while (r > 0) {\n w = Math.min(width, r), r -= width;\n var t = top, b = oheight, h;\n while (b > 0) {\n h = Math.min(height, b), b -= height;\n insert(i++, left, top, w, h, l, t, w, h);\n if (r <= 0) {\n if (left)\n insert(i++, 0, top, left, h, 0, t, left, h);\n if (right)\n insert(i++, width + left, top, right, h, l + w, t, right, h);\n }\n t += h;\n }\n if (top)\n insert(i++, left, 0, w, top, l, 0, w, top);\n if (bottom)\n insert(i++, left, height + top, w, bottom, l, t, w, bottom);\n l += w;\n }\n }\n\n return i;\n};","var Class = require('./core');\nrequire('./pin');\nrequire('./loop');\n\nvar repeat = require('./util/repeat');\nvar create = require('./util/create');\n\nmodule.exports = Image;\n\nClass.image = function(image) {\n var img = new Image();\n image && img.image(image);\n return img;\n};\n\nImage._super = Class;\nImage.prototype = create(Image._super.prototype);\n\nfunction Image() {\n Image._super.call(this);\n this.label('Image');\n this._textures = [];\n this._image = null;\n};\n\n/**\n * @deprecated Use image\n */\nImage.prototype.setImage = function(a, b, c) {\n return this.image(a, b, c);\n};\n\nImage.prototype.image = function(image) {\n this._image = Class.texture(image).one();\n this.pin('width', this._image ? this._image.width : 0);\n this.pin('height', this._image ? this._image.height : 0);\n this._textures[0] = this._image.pipe();\n this._textures.length = 1;\n return this;\n};\n\nImage.prototype.tile = function(inner) {\n this._repeat(false, inner);\n return this;\n};\n\nImage.prototype.stretch = function(inner) {\n this._repeat(true, inner);\n return this;\n};\n\nImage.prototype._repeat = function(stretch, inner) {\n var self = this;\n this.untick(this._repeatTicker);\n this.tick(this._repeatTicker = function() {\n if (this._mo_stretch == this._pin._ts_transform) {\n return;\n }\n this._mo_stretch = this._pin._ts_transform;\n var width = this.pin('width');\n var height = this.pin('height');\n this._textures.length = repeat(this._image, width, height, stretch, inner,\n insert);\n });\n\n function insert(i, sx, sy, sw, sh, dx, dy, dw, dh) {\n var repeat = self._textures.length > i ? self._textures[i]\n : self._textures[i] = self._image.pipe();\n repeat.src(sx, sy, sw, sh);\n repeat.dest(dx, dy, dw, dh);\n }\n};\n","var Class = require('./core');\nrequire('./pin');\nrequire('./loop');\n\nvar create = require('./util/create');\nvar math = require('./util/math');\n\nClass.anim = function(frames, fps) {\n var anim = new Anim();\n anim.frames(frames).gotoFrame(0);\n fps && anim.fps(fps);\n return anim;\n};\n\nAnim._super = Class;\nAnim.prototype = create(Anim._super.prototype);\n\n// TODO: replace with atlas fps or texture time\nClass.Anim = {\n FPS : 15\n};\n\nfunction Anim() {\n Anim._super.call(this);\n this.label('Anim');\n\n this._textures = [];\n\n this._fps = Class.Anim.FPS;\n this._ft = 1000 / this._fps;\n\n this._time = -1;\n this._repeat = 0;\n\n this._index = 0;\n this._frames = [];\n\n var lastTime = 0;\n this.tick(function(t, now, last) {\n if (this._time < 0 || this._frames.length <= 1) {\n return;\n }\n\n // ignore old elapsed\n var ignore = lastTime != last;\n lastTime = now;\n if (ignore) {\n return true;\n }\n\n this._time += t;\n if (this._time < this._ft) {\n return true;\n }\n var n = this._time / this._ft | 0;\n this._time -= n * this._ft;\n this.moveFrame(n);\n if (this._repeat > 0 && (this._repeat -= n) <= 0) {\n this.stop();\n this._callback && this._callback();\n return false;\n }\n return true;\n }, false);\n};\n\nAnim.prototype.fps = function(fps) {\n if (typeof fps === 'undefined') {\n return this._fps;\n }\n this._fps = fps > 0 ? fps : Class.Anim.FPS;\n this._ft = 1000 / this._fps;\n return this;\n};\n\n/**\n * @deprecated Use frames\n */\nAnim.prototype.setFrames = function(a, b, c) {\n return this.frames(a, b, c);\n};\n\nAnim.prototype.frames = function(frames) {\n this._index = 0;\n this._frames = Class.texture(frames).array();\n this.touch();\n return this;\n};\n\nAnim.prototype.length = function() {\n return this._frames ? this._frames.length : 0;\n};\n\nAnim.prototype.gotoFrame = function(frame, resize) {\n this._index = math.rotate(frame, this._frames.length) | 0;\n resize = resize || !this._textures[0];\n this._textures[0] = this._frames[this._index];\n if (resize) {\n this.pin('width', this._textures[0].width);\n this.pin('height', this._textures[0].height);\n }\n this.touch();\n return this;\n};\n\nAnim.prototype.moveFrame = function(move) {\n return this.gotoFrame(this._index + move);\n};\n\nAnim.prototype.repeat = function(repeat, callback) {\n this._repeat = repeat * this._frames.length - 1;\n this._callback = callback;\n this.play();\n return this;\n};\n\nAnim.prototype.play = function(frame) {\n if (typeof frame !== 'undefined') {\n this.gotoFrame(frame);\n this._time = 0;\n } else if (this._time < 0) {\n this._time = 0;\n }\n\n this.touch();\n return this;\n};\n\nAnim.prototype.stop = function(frame) {\n this._time = -1;\n if (typeof frame !== 'undefined') {\n this.gotoFrame(frame);\n }\n return this;\n};\n","var Class = require('./core');\nrequire('./pin');\nrequire('./loop');\n\nvar create = require('./util/create');\nvar is = require('./util/is');\n\nClass.string = function(frames) {\n return new Str().frames(frames);\n};\n\nStr._super = Class;\nStr.prototype = create(Str._super.prototype);\n\nfunction Str() {\n Str._super.call(this);\n this.label('String');\n this._textures = [];\n};\n\n/**\n * @deprecated Use frames\n */\nStr.prototype.setFont = function(a, b, c) {\n return this.frames(a, b, c);\n};\n\nStr.prototype.frames = function(frames) {\n this._textures = [];\n if (typeof frames == 'string') {\n frames = Class.texture(frames);\n this._item = function(value) {\n return frames.one(value);\n };\n } else if (typeof frames === 'object') {\n this._item = function(value) {\n return frames[value];\n };\n } else if (typeof frames === 'function') {\n this._item = frames;\n }\n return this;\n};\n\n/**\n * @deprecated Use value\n */\nStr.prototype.setValue = function(a, b, c) {\n return this.value(a, b, c);\n};\n\nStr.prototype.value = function(value) {\n if (typeof value === 'undefined') {\n return this._value;\n }\n if (this._value === value) {\n return this;\n }\n this._value = value;\n\n if (value === null) {\n value = '';\n } else if (typeof value !== 'string' && !is.array(value)) {\n value = value.toString();\n }\n\n this._spacing = this._spacing || 0;\n\n var width = 0, height = 0;\n for (var i = 0; i < value.length; i++) {\n var image = this._textures[i] = this._item(value[i]);\n width += i > 0 ? this._spacing : 0;\n image.dest(width, 0);\n width = width + image.width;\n height = Math.max(height, image.height);\n }\n this.pin('width', width);\n this.pin('height', height);\n this._textures.length = value.length;\n return this;\n};\n","var Class = require('./core');\nrequire('./pin');\nrequire('./loop');\n\nvar create = require('./util/create');\n\nClass.row = function(align) {\n return Class.create().row(align).label('Row');\n};\n\nClass.prototype.row = function(align) {\n this.sequence('row', align);\n return this;\n};\n\nClass.column = function(align) {\n return Class.create().column(align).label('Row');\n};\n\nClass.prototype.column = function(align) {\n this.sequence('column', align);\n return this;\n};\n\nClass.sequence = function(type, align) {\n return Class.create().sequence(type, align).label('Sequence');\n};\n\nClass.prototype.sequence = function(type, align) {\n\n this._padding = this._padding || 0;\n this._spacing = this._spacing || 0;\n\n this.untick(this._layoutTiker);\n this.tick(this._layoutTiker = function() {\n if (this._mo_seq == this._ts_touch) {\n return;\n }\n this._mo_seq = this._ts_touch;\n\n var alignChildren = (this._mo_seqAlign != this._ts_children);\n this._mo_seqAlign = this._ts_children;\n\n var width = 0, height = 0;\n\n var child, next = this.first(true);\n var first = true;\n while (child = next) {\n next = child.next(true);\n\n child.matrix(true);\n var w = child.pin('boxWidth');\n var h = child.pin('boxHeight');\n\n if (type == 'column') {\n !first && (height += this._spacing);\n child.pin('offsetY') != height && child.pin('offsetY', height);\n width = Math.max(width, w);\n height = height + h;\n alignChildren && child.pin('alignX', align);\n\n } else if (type == 'row') {\n !first && (width += this._spacing);\n child.pin('offsetX') != width && child.pin('offsetX', width);\n width = width + w;\n height = Math.max(height, h);\n alignChildren && child.pin('alignY', align);\n }\n first = false;\n }\n width += 2 * this._padding;\n height += 2 * this._padding;\n this.pin('width') != width && this.pin('width', width);\n this.pin('height') != height && this.pin('height', height);\n });\n return this;\n};\n\nClass.box = function() {\n return Class.create().box().label('Box');\n};\n\nClass.prototype.box = function() {\n this._padding = this._padding || 0;\n\n this.untick(this._layoutTiker);\n this.tick(this._layoutTiker = function() {\n if (this._mo_box == this._ts_touch) {\n return;\n }\n this._mo_box = this._ts_touch;\n\n var width = 0, height = 0;\n var child, next = this.first(true);\n while (child = next) {\n next = child.next(true);\n child.matrix(true);\n var w = child.pin('boxWidth');\n var h = child.pin('boxHeight');\n width = Math.max(width, w);\n height = Math.max(height, h);\n }\n width += 2 * this._padding;\n height += 2 * this._padding;\n this.pin('width') != width && this.pin('width', width);\n this.pin('height') != height && this.pin('height', height);\n });\n return this;\n};\n\nClass.layer = function() {\n return Class.create().layer().label('Layer');\n};\n\nClass.prototype.layer = function() {\n\n this.untick(this._layoutTiker);\n this.tick(this._layoutTiker = function() {\n var parent = this.parent();\n if (parent) {\n var width = parent.pin('width');\n if (this.pin('width') != width) {\n this.pin('width', width);\n }\n var height = parent.pin('height');\n if (this.pin('height') != height) {\n this.pin('height', height);\n }\n }\n }, true);\n return this;\n};\n\n// TODO: move padding to pin\nClass.prototype.padding = function(pad) {\n this._padding = pad;\n return this;\n};\n\nClass.prototype.spacing = function(space) {\n this._spacing = space;\n return this;\n};\n","function _identity(x) {\n return x;\n};\nvar _cache = {};\nvar _modes = {};\nvar _easings = {};\n\nfunction Easing(token) {\n if (typeof token === 'function') {\n return token;\n }\n if (typeof token !== 'string') {\n return _identity;\n }\n var fn = _cache[token];\n if (fn) {\n return fn;\n }\n var match = /^(\\w+)(-(in|out|in-out|out-in))?(\\((.*)\\))?$/i.exec(token);\n if (!match || !match.length) {\n return _identity;\n }\n var easing = _easings[match[1]];\n var mode = _modes[match[3]];\n var params = match[5];\n if (easing && easing.fn) {\n fn = easing.fn;\n } else if (easing && easing.fc) {\n fn = easing.fc.apply(easing.fc, params\n && params.replace(/\\s+/, '').split(','));\n } else {\n fn = _identity;\n }\n if (mode) {\n fn = mode.fn(fn);\n }\n // TODO: It can be a memory leak with different `params`.\n _cache[token] = fn;\n return fn;\n};\n\nEasing.add = function(data) {\n // TODO: create a map of all { name-mode : data }\n var names = (data.name || data.mode).split(/\\s+/);\n for (var i = 0; i < names.length; i++) {\n var name = names[i];\n if (name) {\n (data.name ? _easings : _modes)[name] = data;\n }\n }\n};\n\nEasing.add({\n mode : 'in',\n fn : function(f) {\n return f;\n }\n});\n\nEasing.add({\n mode : 'out',\n fn : function(f) {\n return function(t) {\n return 1 - f(1 - t);\n };\n }\n});\n\nEasing.add({\n mode : 'in-out',\n fn : function(f) {\n return function(t) {\n return (t < 0.5) ? (f(2 * t) / 2) : (1 - f(2 * (1 - t)) / 2);\n };\n }\n});\n\nEasing.add({\n mode : 'out-in',\n fn : function(f) {\n return function(t) {\n return (t < 0.5) ? (1 - f(2 * (1 - t)) / 2) : (f(2 * t) / 2);\n };\n }\n});\n\nEasing.add({\n name : 'linear',\n fn : function(t) {\n return t;\n }\n});\n\nEasing.add({\n name : 'quad',\n fn : function(t) {\n return t * t;\n }\n});\n\nEasing.add({\n name : 'cubic',\n fn : function(t) {\n return t * t * t;\n }\n});\n\nEasing.add({\n name : 'quart',\n fn : function(t) {\n return t * t * t * t;\n }\n});\n\nEasing.add({\n name : 'quint',\n fn : function(t) {\n return t * t * t * t * t;\n }\n});\n\nEasing.add({\n name : 'sin sine',\n fn : function(t) {\n return 1 - Math.cos(t * Math.PI / 2);\n }\n});\n\nEasing.add({\n name : 'exp expo',\n fn : function(t) {\n return t == 0 ? 0 : Math.pow(2, 10 * (t - 1));\n }\n});\n\nEasing.add({\n name : 'circle circ',\n fn : function(t) {\n return 1 - Math.sqrt(1 - t * t);\n }\n});\n\nEasing.add({\n name : 'bounce',\n fn : function(t) {\n return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625\n * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625\n * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t\n + .984375;\n }\n});\n\nEasing.add({\n name : 'poly',\n fc : function(e) {\n return function(t) {\n return Math.pow(t, e);\n };\n }\n});\n\nEasing.add({\n name : 'elastic',\n fc : function(a, p) {\n p = p || 0.45;\n a = a || 1;\n var s = p / (2 * Math.PI) * Math.asin(1 / a);\n return function(t) {\n return 1 + a * Math.pow(2, -10 * t)\n * Math.sin((t - s) * (2 * Math.PI) / p);\n };\n }\n});\n\nEasing.add({\n name : 'back',\n fc : function(s) {\n s = typeof s !== 'undefined' ? s : 1.70158;\n return function(t) {\n return t * t * ((s + 1) * t - s);\n };\n }\n});\n\nmodule.exports = Easing;\n","var Easing = require('./easing');\nvar Class = require('../core');\nvar Pin = require('../pin');\n\nClass.prototype.tween = function(duration, delay, append) {\n if (typeof duration !== 'number') {\n append = duration, delay = 0, duration = 0;\n } else if (typeof delay !== 'number') {\n append = delay, delay = 0;\n }\n\n if (!this._tweens) {\n this._tweens = [];\n var ticktime = 0;\n this.tick(function(elapsed, now, last) {\n if (!this._tweens.length) {\n return;\n }\n\n // ignore old elapsed\n var ignore = ticktime != last;\n ticktime = now;\n if (ignore) {\n return true;\n }\n\n var head = this._tweens[0];\n\n var next = head.tick(this, elapsed, now, last);\n\n if (next && head === this._tweens[0]) {\n this._tweens.shift();\n }\n\n if (Array.isArray(next)) {\n for (var i = 0; i < next.length; i++) {\n try {\n next[i].call(this);\n } catch (e) {\n console.log(e);\n }\n }\n } else if (typeof next === 'object') {\n this._tweens.unshift(next);\n }\n\n return true;\n }, true);\n }\n\n this.touch();\n if (!append) {\n this._tweens.length = 0;\n }\n var tween = new Tween(this, duration, delay);\n this._tweens.push(tween);\n return tween;\n};\n\nfunction Tween(owner, duration, delay) {\n this._end = {};\n this._duration = duration || 400;\n this._delay = delay || 0;\n\n this._owner = owner;\n this._time = 0;\n};\n\nTween.prototype.tick = function(node, elapsed, now, last) {\n this._time += elapsed;\n\n if (this._time < this._delay) {\n return;\n }\n\n var time = this._time - this._delay;\n\n if (!this._start) {\n this._start = {};\n for ( var key in this._end) {\n this._start[key] = this._owner.pin(key);\n }\n }\n\n var p, over;\n if (time < this._duration) {\n p = time / this._duration;\n over = false;\n } else {\n p = 1;\n over = true;\n }\n\n if (typeof this._easing == 'function') {\n p = this._easing(p);\n }\n\n var q = 1 - p;\n\n for ( var key in this._end) {\n this._owner.pin(key, this._start[key] * q + this._end[key] * p);\n }\n\n if (over) {\n var actions = [this._hide, this._remove, this._done];\n actions = actions.filter(function( element ) {\n return typeof element === 'function';\n });\n return this._next || actions;\n }\n};\n\nTween.prototype.tween = function(duration, delay) {\n return this._next = new Tween(this._owner, duration, delay);\n};\n\nTween.prototype.duration = function(duration) {\n this._duration = duration;\n return this;\n};\n\nTween.prototype.delay = function(delay) {\n this._delay = delay;\n return this;\n};\n\nTween.prototype.ease = function(easing) {\n this._easing = Easing(easing);\n return this;\n};\n\nTween.prototype.done = function(fn) {\n this._done = fn;\n return this;\n};\n\nTween.prototype.hide = function() {\n this._hide = function() {\n this.hide();\n };\n return this;\n};\n\nTween.prototype.remove = function() {\n this._remove = function() {\n this.remove();\n };\n return this;\n};\n\nTween.prototype.pin = function(a, b) {\n if (typeof a === 'object') {\n for ( var attr in a) {\n pinning(this._owner, this._end, attr, a[attr]);\n }\n } else if (typeof b !== 'undefined') {\n pinning(this._owner, this._end, a, b);\n }\n return this;\n};\n\nfunction pinning(node, map, key, value) {\n if (typeof node.pin(key) === 'number') {\n map[key] = value;\n } else if (typeof node.pin(key + 'X') === 'number'\n && typeof node.pin(key + 'Y') === 'number') {\n map[key + 'X'] = value;\n map[key + 'Y'] = value;\n }\n}\n\nPin._add_shortcuts(Tween);\n\n/**\n * @deprecated Use .done(fn) instead.\n */\nTween.prototype.then = function(fn) {\n this.done(fn);\n return this;\n};\n\n/**\n * @deprecated NOOP\n */\nTween.prototype.clear = function(forward) {\n return this;\n};\n\nmodule.exports = Tween;\n","if (typeof DEBUG === 'undefined')\n DEBUG = true;\n\nrequire('../core')._load(function(stage, elem) {\n Mouse.subscribe(stage, elem);\n});\n\n// TODO: capture mouse\n\nMouse.CLICK = 'click';\nMouse.START = 'touchstart mousedown';\nMouse.MOVE = 'touchmove mousemove';\nMouse.END = 'touchend mouseup';\nMouse.CANCEL = 'touchcancel mousecancel';\n\nMouse.subscribe = function(stage, elem) {\n if (stage.mouse) {\n return;\n }\n\n stage.mouse = new Mouse(stage, elem);\n\n // `click` events are synthesized from start/end events on same nodes\n // `mousecancel` events are synthesized on blur or mouseup outside element\n\n elem.addEventListener('touchstart', handleStart);\n elem.addEventListener('touchend', handleEnd);\n elem.addEventListener('touchmove', handleMove);\n elem.addEventListener('touchcancel', handleCancel);\n\n elem.addEventListener('mousedown', handleStart);\n elem.addEventListener('mouseup', handleEnd);\n elem.addEventListener('mousemove', handleMove);\n\n document.addEventListener('mouseup', handleCancel);\n window.addEventListener(\"blur\", handleCancel);\n\n var clicklist = [], cancellist = [];\n\n function handleStart(event) {\n event.preventDefault();\n stage.mouse.locate(event);\n // DEBUG && console.log('Mouse Start: ' + event.type + ' ' + mouse);\n stage.mouse.publish(event.type, event);\n\n stage.mouse.lookup('click', clicklist);\n stage.mouse.lookup('mousecancel', cancellist);\n }\n\n function handleMove(event) {\n event.preventDefault();\n stage.mouse.locate(event);\n stage.mouse.publish(event.type, event);\n }\n\n function handleEnd(event) {\n event.preventDefault();\n // up/end location is not available, last one is used instead\n // DEBUG && console.log('Mouse End: ' + event.type + ' ' + mouse);\n stage.mouse.publish(event.type, event);\n\n if (clicklist.length) {\n // DEBUG && console.log('Mouse Click: ' + clicklist.length);\n stage.mouse.publish('click', event, clicklist);\n }\n cancellist.length = 0;\n }\n\n function handleCancel(event) {\n if (cancellist.length) {\n // DEBUG && console.log('Mouse Cancel: ' + event.type);\n stage.mouse.publish('mousecancel', event, cancellist);\n }\n clicklist.length = 0;\n }\n};\n\nfunction Mouse(stage, elem) {\n if (!(this instanceof Mouse)) {\n // old-style mouse subscription\n return;\n }\n\n var ratio = stage.viewport().ratio || 1;\n\n stage.on('viewport', function(size) {\n ratio = size.ratio || ratio;\n });\n\n this.x = 0;\n this.y = 0;\n this.toString = function() {\n return (this.x | 0) + 'x' + (this.y | 0);\n };\n this.locate = function(event) {\n locateElevent(elem, event, this);\n this.x *= ratio;\n this.y *= ratio;\n };\n this.lookup = function(type, collect) {\n this.type = type;\n this.root = stage;\n this.event = null;\n collect.length = 0;\n this.collect = collect;\n\n this.root.visit(this.visitor, this);\n };\n this.publish = function(type, event, targets) {\n this.type = type;\n this.root = stage;\n this.event = event;\n this.collect = false;\n this.timeStamp = Date.now();\n\n if (type !== 'mousemove' && type !== 'touchmove') {\n DEBUG && console.log(this.type + ' ' + this);\n }\n\n if (targets) {\n while (targets.length)\n if (this.visitor.end(targets.shift(), this))\n break;\n targets.length = 0;\n } else {\n this.root.visit(this.visitor, this);\n }\n };\n this.visitor = {\n reverse : true,\n visible : true,\n start : function(node, mouse) {\n return !node._flag(mouse.type);\n },\n end : function(node, mouse) {\n // mouse: event/collect, type, root\n rel.raw = mouse.event;\n rel.type = mouse.type;\n rel.timeStamp = mouse.timeStamp;\n rel.abs.x = mouse.x;\n rel.abs.y = mouse.y;\n\n var listeners = node.listeners(mouse.type);\n if (!listeners) {\n return;\n }\n node.matrix().inverse().map(mouse, rel);\n if (!(node === mouse.root || node.attr('spy') || node.hitTest(rel))) {\n return;\n }\n if (mouse.collect) {\n mouse.collect.push(node);\n }\n if (mouse.event) {\n var cancel = false;\n for (var l = 0; l < listeners.length; l++) {\n cancel = listeners[l].call(node, rel) ? true : cancel;\n }\n return cancel;\n }\n }\n };\n};\n\n// TODO: define per mouse object with get-only x and y\nvar rel = {}, abs = {};\n\ndefineValue(rel, 'clone', function(obj) {\n obj = obj || {}, obj.x = this.x, obj.y = this.y;\n return obj;\n});\ndefineValue(rel, 'toString', function() {\n return (this.x | 0) + 'x' + (this.y | 0) + ' (' + this.abs + ')';\n});\ndefineValue(rel, 'abs', abs);\ndefineValue(abs, 'clone', function(obj) {\n obj = obj || {}, obj.x = this.x, obj.y = this.y;\n return obj;\n});\ndefineValue(abs, 'toString', function() {\n return (this.x | 0) + 'x' + (this.y | 0);\n});\n\nfunction defineValue(obj, name, value) {\n Object.defineProperty(obj, name, {\n value : value\n });\n}\n\nfunction locateElevent(el, ev, loc) {\n // pageX/Y if available?\n if (ev.touches && ev.touches.length) {\n loc.x = ev.touches[0].clientX;\n loc.y = ev.touches[0].clientY;\n } else {\n loc.x = ev.clientX;\n loc.y = ev.clientY;\n }\n var rect = el.getBoundingClientRect();\n loc.x -= rect.left;\n loc.y -= rect.top;\n loc.x -= el.clientLeft | 0;\n loc.y -= el.clientTop | 0;\n return loc;\n};\n\nmodule.exports = Mouse;\n","/**\n * Default loader for web.\n */\n\nif (typeof DEBUG === 'undefined')\n DEBUG = true;\n\nvar Class = require('../core');\n\nClass._supported = (function() {\n var elem = document.createElement('canvas');\n return (elem.getContext && elem.getContext('2d')) ? true : false;\n})();\n\nwindow.addEventListener('load', function() {\n DEBUG && console.log('On load.');\n if (Class._supported) {\n Class.start();\n }\n // TODO if not supported\n}, false);\n\nClass.config({\n 'app-loader' : AppLoader,\n 'image-loader' : ImageLoader\n});\n\nfunction AppLoader(app, configs) {\n configs = configs || {};\n var canvas = configs.canvas, context = null, full = false;\n var width = 0, height = 0, ratio = 1;\n\n if (typeof canvas === 'string') {\n canvas = document.getElementById(canvas);\n }\n\n if (!canvas) {\n canvas = document.getElementById('cutjs')\n || document.getElementById('stage');\n }\n\n if (!canvas) {\n full = true;\n DEBUG && console.log('Creating Canvas...');\n canvas = document.createElement('canvas');\n canvas.style.position = 'absolute';\n canvas.style.top = '0';\n canvas.style.left = '0';\n\n var body = document.body;\n body.insertBefore(canvas, body.firstChild);\n }\n\n context = canvas.getContext('2d');\n\n var devicePixelRatio = window.devicePixelRatio || 1;\n var backingStoreRatio = context.webkitBackingStorePixelRatio\n || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio\n || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1;\n ratio = devicePixelRatio / backingStoreRatio;\n\n var requestAnimationFrame = window.requestAnimationFrame\n || window.msRequestAnimationFrame || window.mozRequestAnimationFrame\n || window.webkitRequestAnimationFrame || window.oRequestAnimationFrame\n || function(callback) {\n return window.setTimeout(callback, 1000 / 60);\n };\n\n DEBUG && console.log('Creating stage...');\n var root = Class.root(requestAnimationFrame, render);\n\n function render() {\n if (width > 0 && height > 0) {\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.clearRect(0, 0, width, height);\n root.render(context);\n }\n }\n\n root.background = function(color) {\n canvas.style.backgroundColor = color;\n return this;\n };\n\n app(root, canvas);\n\n // resize();\n // window.addEventListener('resize', resize, false);\n // window.addEventListener('orientationchange', resize, false);\n\n var lastWidth = -1;\n var lastHeight = -1;\n (function resizeLoop() {\n var width, height;\n if (full) {\n // screen.availWidth/Height?\n width = (window.innerWidth > 0 ? window.innerWidth : screen.width);\n height = (window.innerHeight > 0 ? window.innerHeight : screen.height);\n } else {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n }\n if (lastWidth !== width || lastHeight !== height) {\n lastWidth = width;\n lastHeight = height;\n resize();\n }\n requestAnimationFrame(resizeLoop);\n })();\n\n function resize() {\n\n if (full) {\n // screen.availWidth/Height?\n width = (window.innerWidth > 0 ? window.innerWidth : screen.width);\n height = (window.innerHeight > 0 ? window.innerHeight : screen.height);\n\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n\n } else {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n }\n\n width *= ratio;\n height *= ratio;\n\n if (canvas.width === width && canvas.height === height) {\n return;\n }\n\n canvas.width = width;\n canvas.height = height;\n\n DEBUG && console.log('Resize: ' + width + ' x ' + height + ' / ' + ratio);\n\n root.viewport(width, height, ratio);\n\n render();\n }\n}\n\nfunction ImageLoader(src, success, error) {\n DEBUG && console.log('Loading image: ' + src);\n var image = new Image();\n image.onload = function() {\n success(image);\n };\n image.onerror = error;\n image.src = src;\n}\n","module.exports = require('../lib/');\n\nmodule.exports.internal = {};\n\nrequire('../lib/canvas');\nmodule.exports.internal.Image = require('../lib/image');\nrequire('../lib/anim');\nrequire('../lib/str');\nrequire('../lib/layout');\nrequire('../lib/addon/tween');\nmodule.exports.Mouse = require('../lib/addon/mouse');\nmodule.exports.Math = require('../lib/util/math');\nmodule.exports._extend = require('../lib/util/extend');\nmodule.exports._create = require('../lib/util/create');\n\nrequire('../lib/loader/web');","import {\n AABB,\n Body,\n Fixture,\n Joint,\n MouseJoint,\n Vec2,\n World\n} from '../src/index';\nimport { default as Stage } from 'stage-js/platform/web';\n\nexport interface ActiveKeys {\n 0?: boolean;\n 1?: boolean;\n 2?: boolean;\n 3?: boolean;\n 4?: boolean;\n 5?: boolean;\n 6?: boolean;\n 7?: boolean;\n 8?: boolean;\n 9?: boolean;\n A?: boolean;\n B?: boolean;\n C?: boolean;\n D?: boolean;\n E?: boolean;\n F?: boolean;\n G?: boolean;\n H?: boolean;\n I?: boolean;\n J?: boolean;\n K?: boolean;\n L?: boolean;\n M?: boolean;\n N?: boolean;\n O?: boolean;\n P?: boolean;\n Q?: boolean;\n R?: boolean;\n S?: boolean;\n T?: boolean;\n U?: boolean;\n V?: boolean;\n W?: boolean;\n X?: boolean;\n Y?: boolean;\n Z?: boolean;\n right?: boolean;\n left?: boolean;\n up?: boolean;\n down?: boolean;\n fire?: boolean;\n}\n\nexport interface Testbed {\n /** @private @internal */ _pause: any;\n /** @private @internal */ _resume: any;\n /** @private @internal */ _status: any;\n /** @private @internal */ _info: any;\n\n /** @private @internal */ resume: any;\n /** @private @internal */ pause: any;\n /** @private @internal */ isPaused: any;\n /** @private @internal */ togglePause: any;\n /** @private @internal */ canvas: any;\n /** @private @internal */ focus: () => void;\n\n // camera position\n /** World viewbox width. */\n width: number;\n /** World viewbox height. */\n height: number;\n /** World viewbox center vertical offset. */\n x: number;\n /** World viewbox center horizontal offset. */\n y: number;\n\n scaleY: number;\n ratio: number;\n\n /** World simulation step frequency */\n hz: number;\n /** World simulation speed, default is 1 */\n speed: number;\n\n activeKeys: ActiveKeys;\n background: string;\n\n mouseForce?: number;\n\n status(name: string, value: any): void;\n status(value: object | string): void;\n info(text: string): void;\n\n drawPoint(p: {x: number, y: number}, r: any, color: string): void;\n drawCircle(p: {x: number, y: number}, r: number, color: string): void;\n drawSegment(a: {x: number, y: number}, b: {x: number, y: number}, color: string): void;\n drawPolygon(points: Array<{x: number, y: number}>, color: string): void;\n drawAABB(aabb: AABB, color: string): void;\n color(r: number, g: number, b: number): string;\n\n // callbacks\n step?: (dt: number, t: number) => void;\n keydown?: (keyCode: number, label: string) => void;\n keyup?: (keyCode: number, label: string) => void;\n\n findOne: (query: string) => Body | Joint | Fixture | null;\n findAll: (query: string) => Body[] | Joint[] | Fixture[];\n}\n\nexport function testbed(opts: object, callback: (testbed: Testbed) => World);\nexport function testbed(callback: (testbed: Testbed) => World);\nexport function testbed(opts, callback?) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = null;\n }\n\n Stage(function(stage, canvas) {\n\n stage.on(Stage.Mouse.START, function() {\n window.focus();\n // @ts-ignore\n document.activeElement && document.activeElement.blur();\n canvas.focus();\n });\n\n stage.MAX_ELAPSE = 1000 / 30;\n\n // @ts-ignore\n const testbed: Testbed = {};\n testbed.canvas = canvas;\n\n let paused = false;\n stage.on('resume', function() {\n paused = false;\n testbed._resume && testbed._resume();\n });\n stage.on('pause', function() {\n paused = true;\n testbed._pause && testbed._pause();\n });\n testbed.isPaused = function() {\n return paused;\n };\n testbed.togglePause = function() {\n paused ? testbed.resume() : testbed.pause();\n };\n testbed.pause = function() {\n stage.pause();\n };\n testbed.resume = function() {\n stage.resume();\n testbed.focus();\n };\n testbed.focus = function() {\n // @ts-ignore\n document.activeElement && document.activeElement.blur();\n canvas.focus();\n };\n\n testbed.width = 80;\n testbed.height = 60;\n testbed.x = 0;\n testbed.y = -10;\n testbed.scaleY = -1;\n testbed.ratio = 16;\n testbed.hz = 60;\n testbed.speed = 1;\n testbed.activeKeys = {};\n testbed.background = '#222222';\n\n testbed.findOne = function() {\n // todo: implement\n return null;\n };\n\n testbed.findAll = function() {\n // todo: implement\n return [];\n };\n\n let statusText = '';\n const statusMap = {};\n\n function statusSet(name, value) {\n if (typeof value !== 'function' && typeof value !== 'object') {\n statusMap[name] = value;\n }\n }\n\n function statusMerge(obj) {\n // tslint:disable-next-line:no-for-in\n for (const key in obj) {\n statusSet(key, obj[key]);\n }\n }\n\n testbed.status = function(a, b?) {\n if (typeof b !== 'undefined') {\n statusSet(a, b);\n } else if (a && typeof a === 'object') {\n statusMerge(a);\n } else if (typeof a === 'string') {\n statusText = a;\n }\n\n testbed._status && testbed._status(statusText, statusMap);\n };\n\n testbed.info = function(text) {\n testbed._info && testbed._info(text);\n };\n\n let lastDrawHash = \"\";\n let drawHash = \"\";\n\n (function() {\n const drawingTexture = new Stage.Texture();\n stage.append(Stage.image(drawingTexture));\n\n const buffer = [];\n stage.tick(function() {\n buffer.length = 0;\n }, true);\n\n drawingTexture.draw = function(ctx) {\n ctx.save();\n ctx.transform(1, 0, 0, testbed.scaleY, -testbed.x, -testbed.y);\n ctx.lineWidth = 2 / testbed.ratio;\n ctx.lineCap = 'round';\n for (let drawing = buffer.shift(); drawing; drawing = buffer.shift()) {\n drawing(ctx, testbed.ratio);\n }\n ctx.restore();\n };\n\n testbed.drawPoint = function(p, r, color) {\n buffer.push(function(ctx, ratio) {\n ctx.beginPath();\n ctx.arc(p.x, p.y, 5 / ratio, 0, 2 * Math.PI);\n ctx.strokeStyle = color;\n ctx.stroke();\n });\n drawHash += \"point\" + p.x + ',' + p.y + ',' + r + ',' + color;\n };\n\n testbed.drawCircle = function(p, r, color) {\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.arc(p.x, p.y, r, 0, 2 * Math.PI);\n ctx.strokeStyle = color;\n ctx.stroke();\n });\n drawHash += \"circle\" + p.x + ',' + p.y + ',' + r + ',' + color;\n };\n\n testbed.drawSegment = function(a, b, color) {\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(b.x, b.y);\n ctx.strokeStyle = color;\n ctx.stroke();\n });\n drawHash += \"segment\" + a.x + ',' + a.y + ',' + b.x + ',' + b.y + ',' + color;\n };\n\n testbed.drawPolygon = function(points, color) {\n if (!points || !points.length) {\n return;\n }\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y);\n }\n ctx.strokeStyle = color;\n ctx.closePath();\n ctx.stroke();\n });\n drawHash += \"segment\";\n for (let i = 1; i < points.length; i++) {\n drawHash += points[i].x + ',' + points[i].y + ',';\n }\n drawHash += color;\n };\n\n testbed.drawAABB = function(aabb, color) {\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.moveTo(aabb.lowerBound.x, aabb.lowerBound.y);\n ctx.lineTo(aabb.upperBound.x, aabb.lowerBound.y);\n ctx.lineTo(aabb.upperBound.x, aabb.upperBound.y);\n ctx.lineTo(aabb.lowerBound.x, aabb.upperBound.y);\n ctx.strokeStyle = color;\n ctx.closePath();\n ctx.stroke();\n });\n drawHash += \"aabb\";\n drawHash += aabb.lowerBound.x + ',' + aabb.lowerBound.y + ',';\n drawHash += aabb.upperBound.x + ',' + aabb.upperBound.y + ',';\n drawHash += color;\n };\n\n testbed.color = function(r, g, b) {\n r = r * 256 | 0;\n g = g * 256 | 0;\n b = b * 256 | 0;\n return 'rgb(' + r + ', ' + g + ', ' + b + ')';\n };\n\n })();\n\n const world = callback(testbed);\n\n const viewer = new Viewer(world, testbed);\n\n let lastX = 0;\n let lastY = 0;\n stage.tick(function(dt, t) {\n // update camera position\n if (lastX !== testbed.x || lastY !== testbed.y) {\n viewer.offset(-testbed.x, -testbed.y);\n lastX = testbed.x;\n lastY = testbed.y;\n }\n });\n\n viewer.tick(function(dt, t) {\n // call testbed step, if provided\n if (typeof testbed.step === 'function') {\n testbed.step(dt, t);\n }\n\n if (targetBody) {\n testbed.drawSegment(targetBody.getPosition(), mouseMove, 'rgba(255,255,255,0.2)');\n }\n\n if (lastDrawHash !== drawHash) {\n lastDrawHash = drawHash;\n stage.touch();\n }\n drawHash = \"\";\n\n return true;\n });\n\n // stage.empty();\n stage.background(testbed.background);\n stage.viewbox(testbed.width, testbed.height);\n stage.pin('alignX', -0.5);\n stage.pin('alignY', -0.5);\n stage.prepend(viewer);\n\n function findBody(point) {\n let body;\n const aabb = new AABB(point, point);\n world.queryAABB(aabb, function(fixture) {\n if (body) {\n return;\n }\n if (!fixture.getBody().isDynamic() || !fixture.testPoint(point)) {\n return;\n }\n body = fixture.getBody();\n return true;\n });\n return body;\n }\n\n const mouseGround = world.createBody();\n let mouseJoint;\n\n let targetBody;\n const mouseMove = {x: 0, y: 0};\n\n viewer.attr('spy', true).on(Stage.Mouse.START, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (targetBody) {\n return;\n }\n\n const body = findBody(point);\n if (!body) {\n return;\n }\n\n if (testbed.mouseForce) {\n targetBody = body;\n\n } else {\n mouseJoint = new MouseJoint({maxForce: 1000}, mouseGround, body, Vec2.clone(point));\n world.createJoint(mouseJoint);\n }\n\n }).on(Stage.Mouse.MOVE, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (mouseJoint) {\n mouseJoint.setTarget(point);\n }\n\n mouseMove.x = point.x;\n mouseMove.y = point.y;\n }).on(Stage.Mouse.END, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (mouseJoint) {\n world.destroyJoint(mouseJoint);\n mouseJoint = null;\n }\n if (targetBody) {\n const force = Vec2.sub(point, targetBody.getPosition());\n targetBody.applyForceToCenter(force.mul(testbed.mouseForce), true);\n targetBody = null;\n }\n\n }).on(Stage.Mouse.CANCEL, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (mouseJoint) {\n world.destroyJoint(mouseJoint);\n mouseJoint = null;\n }\n if (targetBody) {\n targetBody = null;\n }\n });\n\n window.addEventListener(\"keydown\", function(e) {\n switch (e.keyCode) {\n case 'P'.charCodeAt(0):\n testbed.togglePause();\n break;\n }\n }, false);\n\n const downKeys = {};\n window.addEventListener(\"keydown\", function(e) {\n const keyCode = e.keyCode;\n downKeys[keyCode] = true;\n updateActiveKeys(keyCode, true);\n testbed.keydown && testbed.keydown(keyCode, String.fromCharCode(keyCode));\n });\n window.addEventListener(\"keyup\", function(e) {\n const keyCode = e.keyCode;\n downKeys[keyCode] = false;\n updateActiveKeys(keyCode, false);\n testbed.keyup && testbed.keyup(keyCode, String.fromCharCode(keyCode));\n });\n\n const activeKeys = testbed.activeKeys;\n function updateActiveKeys(keyCode, down) {\n const char = String.fromCharCode(keyCode);\n if (/\\w/.test(char)) {\n activeKeys[char] = down;\n }\n activeKeys.right = downKeys[39] || activeKeys['D'];\n activeKeys.left = downKeys[37] || activeKeys['A'];\n activeKeys.up = downKeys[38] || activeKeys['W'];\n activeKeys.down = downKeys[40] || activeKeys['S'];\n activeKeys.fire = downKeys[32] || downKeys[13] ;\n }\n\n });\n}\n\nViewer._super = Stage;\nViewer.prototype = Stage._create(Viewer._super.prototype);\n\nfunction Viewer(world, opts) {\n Viewer._super.call(this);\n this.label('Planck');\n\n opts = opts || {};\n\n this._options = {};\n this._options.speed = opts.speed || 1;\n this._options.hz = opts.hz || 60;\n if (Math.abs(this._options.hz) < 1) {\n this._options.hz = 1 / this._options.hz;\n }\n this._options.scaleY = opts.scaleY || -1;\n this._options.ratio = opts.ratio || 16;\n this._options.lineWidth = 2 / this._options.ratio;\n\n this._world = world;\n\n const timeStep = 1 / this._options.hz;\n let elapsedTime = 0;\n this.tick((dt) => {\n dt = dt * 0.001 * this._options.speed;\n elapsedTime += dt;\n while (elapsedTime > timeStep) {\n world.step(timeStep);\n elapsedTime -= timeStep;\n }\n this.renderWorld();\n return true;\n }, true);\n\n world.on('remove-fixture', function(obj) {\n obj.ui && obj.ui.remove();\n });\n\n world.on('remove-joint', function(obj) {\n obj.ui && obj.ui.remove();\n });\n}\n\nViewer.prototype.renderWorld = function() {\n const world = this._world;\n const options = this._options;\n const viewer = this;\n\n for (let b = world.getBodyList(); b; b = b.getNext()) {\n for (let f = b.getFixtureList(); f; f = f.getNext()) {\n\n if (!f.ui) {\n if (f.render && f.render.stroke) {\n options.strokeStyle = f.render.stroke;\n } else if (b.render && b.render.stroke) {\n options.strokeStyle = b.render.stroke;\n } else if (b.isDynamic()) {\n options.strokeStyle = 'rgba(255,255,255,0.9)';\n } else if (b.isKinematic()) {\n options.strokeStyle = 'rgba(255,255,255,0.7)';\n } else if (b.isStatic()) {\n options.strokeStyle = 'rgba(255,255,255,0.5)';\n }\n\n if (f.render && f.render.fill) {\n options.fillStyle = f.render.fill;\n } else if (b.render && b.render.fill) {\n options.fillStyle = b.render.fill;\n } else {\n options.fillStyle = '';\n }\n\n const type = f.getType();\n const shape = f.getShape();\n if (type == 'circle') {\n f.ui = viewer.drawCircle(shape, options);\n }\n if (type == 'edge') {\n f.ui = viewer.drawEdge(shape, options);\n }\n if (type == 'polygon') {\n f.ui = viewer.drawPolygon(shape, options);\n }\n if (type == 'chain') {\n f.ui = viewer.drawChain(shape, options);\n }\n\n if (f.ui) {\n f.ui.appendTo(viewer);\n }\n }\n\n if (f.ui) {\n const p = b.getPosition();\n const r = b.getAngle();\n if (f.ui.__lastX !== p.x || f.ui.__lastY !== p.y || f.ui.__lastR !== r) {\n f.ui.__lastX = p.x;\n f.ui.__lastY = p.y;\n f.ui.__lastR = r;\n f.ui.offset(p.x, options.scaleY * p.y);\n f.ui.rotate(options.scaleY * r);\n }\n }\n\n }\n }\n\n for (let j = world.getJointList(); j; j = j.getNext()) {\n const type = j.getType();\n const a = j.getAnchorA();\n const b = j.getAnchorB();\n\n if (!j.ui) {\n options.strokeStyle = 'rgba(255,255,255,0.2)';\n\n j.ui = viewer.drawJoint(j, options);\n j.ui.pin('handle', 0.5);\n if (j.ui) {\n j.ui.appendTo(viewer);\n }\n }\n\n if (j.ui) {\n const cx = (a.x + b.x) * 0.5;\n const cy = options.scaleY * (a.y + b.y) * 0.5;\n const dx = a.x - b.x;\n const dy = options.scaleY * (a.y - b.y);\n const d = Math.sqrt(dx * dx + dy * dy);\n j.ui.width(d);\n j.ui.rotate(Math.atan2(dy, dx));\n j.ui.offset(cx, cy);\n }\n }\n\n};\n\nViewer.prototype.drawJoint = function(joint, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const length = 10;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(length + 2 * lw, 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n ctx.moveTo(lw, lw);\n ctx.lineTo(lw + length, lw);\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const image = Stage.image(texture).stretch();\n return image;\n};\n\nViewer.prototype.drawCircle = function(shape, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const r = shape.m_radius;\n const cx = r + lw;\n const cy = r + lw;\n const w = r * 2 + lw * 2;\n const h = r * 2 + lw * 2;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(w, h, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.arc(cx, cy, r, 0, 2 * Math.PI);\n if (options.fillStyle) {\n ctx.fillStyle = options.fillStyle;\n ctx.fill();\n }\n ctx.lineTo(cx, cy);\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n const image = Stage.image(texture)\n .offset(shape.m_p.x - cx, options.scaleY * shape.m_p.y - cy);\n const node = Stage.create().append(image);\n return node;\n};\n\nViewer.prototype.drawEdge = function(edge, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const v1 = edge.m_vertex1;\n const v2 = edge.m_vertex2;\n\n const dx = v2.x - v1.x;\n const dy = v2.y - v1.y;\n\n const length = Math.sqrt(dx * dx + dy * dy);\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(length + 2 * lw, 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n ctx.moveTo(lw, lw);\n ctx.lineTo(lw + length, lw);\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const minX = Math.min(v1.x, v2.x);\n const minY = Math.min(options.scaleY * v1.y, options.scaleY * v2.y);\n\n const image = Stage.image(texture);\n image.rotate(options.scaleY * Math.atan2(dy, dx));\n image.offset(minX - lw, minY - lw);\n const node = Stage.create().append(image);\n return node;\n};\n\nViewer.prototype.drawPolygon = function(shape, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const vertices = shape.m_vertices;\n\n if (!vertices.length) {\n return;\n }\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, options.scaleY * v.y);\n maxY = Math.max(maxY, options.scaleY * v.y);\n }\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(width + 2 * lw, height + 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n const x = v.x - minX + lw;\n const y = options.scaleY * v.y - minY + lw;\n if (i == 0)\n ctx.moveTo(x, y);\n else\n ctx.lineTo(x, y);\n }\n\n if (vertices.length > 2) {\n ctx.closePath();\n }\n\n if (options.fillStyle) {\n ctx.fillStyle = options.fillStyle;\n ctx.fill();\n ctx.closePath();\n }\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const image = Stage.image(texture);\n image.offset(minX - lw, minY - lw);\n const node = Stage.create().append(image);\n return node;\n};\n\nViewer.prototype.drawChain = function(shape, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const vertices = shape.m_vertices;\n\n if (!vertices.length) {\n return;\n }\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, options.scaleY * v.y);\n maxY = Math.max(maxY, options.scaleY * v.y);\n }\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(width + 2 * lw, height + 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n const x = v.x - minX + lw;\n const y = options.scaleY * v.y - minY + lw;\n if (i == 0)\n ctx.moveTo(x, y);\n else\n ctx.lineTo(x, y);\n }\n\n // TODO: if loop\n if (vertices.length > 2) {\n // ctx.closePath();\n }\n\n if (options.fillStyle) {\n ctx.fillStyle = options.fillStyle;\n ctx.fill();\n ctx.closePath();\n }\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const image = Stage.image(texture);\n image.offset(minX - lw, minY - lw);\n const node = Stage.create().append(image);\n return node;\n};\n\n\n// Everything below this is copied from ../src/index.ts\n\nexport { default as Serializer } from '../src/serializer/index';\n\nexport { default as Math } from '../src/common/Math';\nexport { default as Vec2 } from '../src/common/Vec2';\nexport { default as Vec3 } from '../src/common/Vec3';\nexport { default as Mat22 } from '../src/common/Mat22';\nexport { default as Mat33 } from '../src/common/Mat33';\nexport { default as Transform } from '../src/common/Transform';\nexport { default as Rot } from '../src/common/Rot';\n\nexport { default as AABB } from '../src/collision/AABB';\n\nexport { default as Shape } from '../src/collision/Shape';\nexport { default as Fixture } from '../src/dynamics/Fixture';\nexport { default as Body } from '../src/dynamics/Body';\nexport { default as Contact } from '../src/dynamics/Contact';\nexport { default as Joint } from '../src/dynamics/Joint';\nexport { default as World } from '../src/dynamics/World';\n\nexport { default as Circle } from '../src/collision/shape/CircleShape';\nexport { default as Edge } from '../src/collision/shape/EdgeShape';\nexport { default as Polygon } from '../src/collision/shape/PolygonShape';\nexport { default as Chain } from '../src/collision/shape/ChainShape';\nexport { default as Box } from '../src/collision/shape/BoxShape';\n\nexport { CollideCircles } from '../src/collision/shape/CollideCircle';\nexport { CollideEdgeCircle } from '../src/collision/shape/CollideEdgeCircle';\nexport { CollidePolygons } from '../src/collision/shape/CollidePolygon';\nexport { CollidePolygonCircle } from '../src/collision/shape/CollideCirclePolygone';\nexport { CollideEdgePolygon } from '../src/collision/shape/CollideEdgePolygon';\n\nexport { default as DistanceJoint } from '../src/dynamics/joint/DistanceJoint';\nexport { default as FrictionJoint } from '../src/dynamics/joint/FrictionJoint';\nexport { default as GearJoint } from '../src/dynamics/joint/GearJoint';\nexport { default as MotorJoint } from '../src/dynamics/joint/MotorJoint';\nexport { default as MouseJoint } from '../src/dynamics/joint/MouseJoint';\nexport { default as PrismaticJoint } from '../src/dynamics/joint/PrismaticJoint';\nexport { default as PulleyJoint } from '../src/dynamics/joint/PulleyJoint';\nexport { default as RevoluteJoint } from '../src/dynamics/joint/RevoluteJoint';\nexport { default as RopeJoint } from '../src/dynamics/joint/RopeJoint';\nexport { default as WeldJoint } from '../src/dynamics/joint/WeldJoint';\nexport { default as WheelJoint } from '../src/dynamics/joint/WheelJoint';\n\nexport { default as Settings } from '../src/Settings';\n\nexport { default as Sweep } from '../src/common/Sweep';\nexport { default as Manifold } from '../src/collision/Manifold';\nexport { default as Distance } from '../src/collision/Distance';\nexport { default as TimeOfImpact } from '../src/collision/TimeOfImpact';\nexport { default as DynamicTree } from '../src/collision/DynamicTree';\n\nimport Solver, { TimeStep } from '../src/dynamics/Solver';\nimport { CollidePolygons } from '../src/collision/shape/CollidePolygon';\nimport { default as Settings } from '../src/Settings';\nimport { default as Sweep } from '../src/common/Sweep';\nimport { default as Manifold } from '../src/collision/Manifold';\nimport { default as Distance, DistanceInput, DistanceOutput, DistanceProxy, SimplexCache, testOverlap } from '../src/collision/Distance';\nimport { default as TimeOfImpact, TOIInput, TOIOutput } from '../src/collision/TimeOfImpact';\nimport { default as DynamicTree } from '../src/collision/DynamicTree';\n\nimport { default as stats } from '../src/util/stats'; // todo: what to do with this?\n\nimport { ContactImpulse } from '../src/dynamics/Solver';\ntype _ContactImpulse = InstanceType;\nexport type { _ContactImpulse as ContactImpulse }\n\n/** @deprecated Merged with main namespace */\nexport const internal = {};\n\n// @ts-ignore\ninternal.CollidePolygons = CollidePolygons;\n// @ts-ignore\ninternal.Settings = Settings;\n// @ts-ignore\ninternal.Sweep = Sweep;\n// @ts-ignore\ninternal.Manifold = Manifold;\n// @ts-ignore\ninternal.Distance = Distance;\n// @ts-ignore\ninternal.TimeOfImpact = TimeOfImpact;\n// @ts-ignore\ninternal.DynamicTree = DynamicTree;\n// @ts-ignore\ninternal.stats = stats;\n\n// @ts-ignore\nSolver.TimeStep = TimeStep;\n\n// @ts-ignore\nDistance.testOverlap = testOverlap;\n// @ts-ignore\nDistance.Input = DistanceInput;\n// @ts-ignore\nDistance.Output = DistanceOutput;\n// @ts-ignore\nDistance.Proxy = DistanceProxy;\n// @ts-ignore\nDistance.Cache = SimplexCache;\n\n// @ts-ignore\nTimeOfImpact.Input = TOIInput;\n// @ts-ignore\nTimeOfImpact.Output = TOIOutput;\n"],"names":["math","Math","stats","DEFAULTS","inactiveLimit","atLowerLimit","atUpperLimit","equalLimits","is","Matrix","Texture","Class","iid","require$$0","require$$1","require$$2","texture","Image","easing","Easing","Pin","require$$3","require$$4","require$$5","Stage"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAAA;IACA;AACA;IACA;IACA;AACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;AACA;IACA,IAAI,aAAa,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE;IACnC,IAAI,aAAa,GAAG,MAAM,CAAC,cAAc;IACzC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,KAAK,IAAI,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;IACpF,QAAQ,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1G,IAAI,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC;AACF;IACO,SAAS,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE;IAChC,IAAI,IAAI,OAAO,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,IAAI;IAC7C,QAAQ,MAAM,IAAI,SAAS,CAAC,sBAAsB,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,+BAA+B,CAAC,CAAC;IAClG,IAAI,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxB,IAAI,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE;IAC3C,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACzF,CAAC;AACD;IACO,IAAI,QAAQ,GAAG,WAAW;IACjC,IAAI,QAAQ,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,QAAQ,CAAC,CAAC,EAAE;IACrD,QAAQ,KAAK,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;IAC7D,YAAY,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7B,YAAY,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,SAAS;IACT,QAAQ,OAAO,CAAC,CAAC;IACjB,MAAK;IACL,IAAI,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC3C;;sBCxC2B,KAAQ,EAAE,QAAgB;QACnD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;;YAElD,KAAK,GAAG,EAAO,CAAC;SACjB;QAED,IAAM,MAAM,gBAAO,KAAK,CAAC,CAAC;;QAG1B,KAAK,IAAM,GAAG,IAAI,QAAQ,EAAE;YAC1B,IAAI,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,WAAW,EAAE;gBACrE,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;aAC7B;SACF;QAED,IAAI,OAAO,MAAM,CAAC,qBAAqB,KAAK,UAAU,EAAE;YACtD,IAAM,OAAO,GAAG,MAAM,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACvC,IAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC1B,IAAI,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,WAAW,EAAE;oBACjF,MAAM,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;iBACnC;aACF;SACF;QAED,OAAO,MAAM,CAAC;IAChB;;ICvBO,IAAM,KAAK,GAAG;QAAS,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,yBAAc;;QAC7B,OAAO;IAEtB,CAAC,CAAC;IAEK,IAAM,MAAM,GAAG,UAAS,SAAkB,EAAE,GAAY,EAAE,GAAS;QAC1D,OAAO;IAIvB,CAAC,CAAC;AAEF,iBAAe;QACb,MAAM,QAAA;QACN,KAAK,OAAA;KACN;;IClBD;;;;;;;;;;;;;;;;;;;;;;;QA+BMA,MAAI,GAgCN,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;IAIxB;IACA;AACAA,UAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AAEpBA,UAAI,CAAC,QAAQ,GAAG,UAAS,CAAU;QACjC,OAAO,CAAC,OAAO,CAAC,KAAK,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;AAEFA,UAAI,CAAC,MAAM,GAAG,UAAS,CAAM;QACb,OAAO;IAKvB,CAAC,CAAC;AAEFA,UAAI,CAAC,OAAO,GAAG,UAAS,CAAS;;QAE/B,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC;AAEFA,UAAI,CAAC,cAAc,GAAG,UAAS,CAAS;;QAEtC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACd,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACd,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACd,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACd,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,CAAC;IACf,CAAC,CAAC;AAEFA,UAAI,CAAC,YAAY,GAAG,UAAS,CAAS;QACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC,CAAC;AAEFA,UAAI,CAAC,GAAG,GAAG,UAAS,GAAW,EAAE,GAAY,EAAE,GAAY;QACzD,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;YAC9B,GAAG,GAAG,CAAC,CAAC;YACR,GAAG,GAAG,CAAC,CAAC;SACT;aAAM,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;YACrC,GAAG,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,CAAC;SACT;QACD,IAAI,GAAG,GAAG,GAAG,EAAE;YACb,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;YAChC,OAAO,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;SACpC;aAAM;YACL,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;YAChC,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;SACrC;IACH,CAAC,CAAC;AAEFA,UAAI,CAAC,KAAK,GAAG,UAAS,GAAW,EAAE,GAAW,EAAE,GAAW;QACzD,IAAI,GAAG,GAAG,GAAG,EAAE;YACb,OAAO,GAAG,CAAC;SACZ;aAAM,IAAI,GAAG,GAAG,GAAG,EAAE;YACpB,OAAO,GAAG,CAAC;SACZ;aAAM;YACL,OAAO,GAAG,CAAC;SACZ;IACH,CAAC,CAAC;AAEFA,UAAI,CAAC,MAAM,GAAG,UAAS,GAAY,EAAE,GAAY;QAC/C,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;YAC9B,GAAG,GAAG,CAAC,CAAC;YACR,GAAG,GAAG,CAAC,CAAC;SACT;aAAM,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;YACrC,GAAG,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,CAAC;SACT;QACD,OAAO,GAAG,KAAK,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IAC/D,CAAC;;IC1ID;;;;;;;;;;;;;;;;;;;;;;;;;QAwCE,cAAY,CAAE,EAAE,CAAE;YAChB,IAAI,EAAE,IAAI,YAAY,IAAI,CAAC,EAAE;gBAC3B,OAAO,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aACvB;YACD,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;gBAC5B,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;aACZ;iBAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBAChC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACb,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACd;iBAAM;gBACL,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;aACZ;SAEF;;QAGD,yBAAU,GAAV;YACE,OAAO;gBACL,CAAC,EAAE,IAAI,CAAC,CAAC;gBACT,CAAC,EAAE,IAAI,CAAC,CAAC;aACV,CAAC;SACH;;QAGM,iBAAY,GAAnB,UAAoB,IAAS;YAC3B,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1C,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACf,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACf,OAAO,GAAG,CAAC;SACZ;QAEM,SAAI,GAAX;YACE,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1C,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACV,OAAO,GAAG,CAAC;SACZ;;QAGM,QAAG,GAAV,UAAW,CAAS,EAAE,CAAS;YAC7B,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1C,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACV,OAAO,GAAG,CAAC;SACZ;QAEM,UAAK,GAAZ,UAAa,CAAO;YAElB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B;;QAGD,uBAAQ,GAAR;YACE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SAC7B;;;;QAKM,YAAO,GAAd,UAAe,GAAQ;YACrB,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;gBAC9C,OAAO,KAAK,CAAC;aACd;YACD,OAAOC,MAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAIA,MAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACrD;QAEM,WAAM,GAAb,UAAc,CAAM;YACJ,OAAO;SAKtB;QAED,oBAAK,GAAL;YACE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SACzB;;;;;;QAOD,sBAAO,GAAP;YACE,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;YACb,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;YACb,OAAO,IAAI,CAAC;SACb;;;;;;;QAUD,kBAAG,GAAH,UAAI,CAAC,EAAE,CAAE;YACP,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBAEzB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACb,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACd;iBAAM;gBAGL,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;aACZ;YACD,OAAO,IAAI,CAAC;SACb;;;;;;QAOA,qBAAM,GAAN,UAAO,CAAS,EAAE,CAAS;YAG1B,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAEX,OAAO,IAAI,CAAC;SACb;;;;;;QAOD,sBAAO,GAAP,UAAQ,KAAW;YAEjB,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YAEjB,OAAO,IAAI,CAAC;SACb;;;;;QAMD,mBAAI,GAAJ,UAAK,CAAS,EAAE,CAAO,EAAE,CAAU,EAAE,CAAQ;YAC3C,IAAI,OAAO,CAAC,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;gBACxD,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;aACpC;iBAAM;gBACL,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAC1B;SACF;;;;QAKD,yBAAU,GAAV,UAAW,CAAS,EAAE,CAAO,EAAE,CAAS,EAAE,CAAO;YAK/C,IAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;YAG5B,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACX,OAAO,IAAI,CAAC;SACb;QAED,qBAAM,GAAN,UAAO,CAAS,EAAE,CAAO;YAGvB,IAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClB,IAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAElB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACX,OAAO,IAAI,CAAC;SACb;;;;;;QAOD,kBAAG,GAAH,UAAI,CAAO;YAET,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,OAAO,IAAI,CAAC;SACb;;;;;QAMD,mBAAI,GAAJ,UAAK,CAAS,EAAE,CAAO,EAAE,CAAU,EAAE,CAAQ;YAC3C,IAAI,OAAO,CAAC,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;gBACxD,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;aACpC;iBAAM;gBACL,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAC1B;SACF;;;;QAKD,yBAAU,GAAV,UAAW,CAAS,EAAE,CAAO,EAAE,CAAS,EAAE,CAAO;YAM/C,IAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;YAG5B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACZ,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACZ,OAAO,IAAI,CAAC;SACb;QAED,qBAAM,GAAN,UAAO,CAAS,EAAE,CAAO;YAGvB,IAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClB,IAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAElB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACZ,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACZ,OAAO,IAAI,CAAC;SACb;;;;QAKD,mBAAI,GAAJ,UAAK,CAAS,EAAE,CAAO,EAAE,CAAU,EAAE,CAAQ;YAC3C,IAAI,OAAO,CAAC,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;gBACxD,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;aACpC;iBAAM;gBACL,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAC1B;SAAC;;;;QAKJ,yBAAU,GAAV,UAAW,CAAS,EAAE,CAAO,EAAE,CAAS,EAAE,CAAO;YAK/C,IAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;YAG5B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACZ,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACZ,OAAO,IAAI,CAAC;SACb;QAED,qBAAM,GAAN,UAAO,CAAS,EAAE,CAAO;YAGvB,IAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClB,IAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAElB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACZ,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACZ,OAAO,IAAI,CAAC;SACb;;;;;;QAOD,kBAAG,GAAH,UAAI,CAAO;YAET,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,OAAO,IAAI,CAAC;SACb;;;;;;QAOD,kBAAG,GAAH,UAAI,CAAS;YAEX,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACZ,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACZ,OAAO,IAAI,CAAC;SACb;;;;;;QAOD,qBAAM,GAAN;YACE,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SAC5B;;;;QAKD,4BAAa,GAAb;YACE,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;SACjC;;;;;;QAOD,wBAAS,GAAT;YACE,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC7B,IAAI,MAAM,GAAGA,MAAI,CAAC,OAAO,EAAE;gBACzB,OAAO,GAAG,CAAC;aACZ;YACD,IAAM,SAAS,GAAG,GAAG,GAAG,MAAM,CAAC;YAC/B,IAAI,CAAC,CAAC,IAAI,SAAS,CAAC;YACpB,IAAI,CAAC,CAAC,IAAI,SAAS,CAAC;YACpB,OAAO,MAAM,CAAC;SACf;;;;;;QAOM,aAAQ,GAAf,UAAgB,CAAO;YAErB,OAAOA,MAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SACzC;;;;QAKM,kBAAa,GAApB,UAAqB,CAAO;YAE1B,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAC9B;QAEM,aAAQ,GAAf,UAAgB,CAAO,EAAE,CAAO;YAG9B,IAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrB,IAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrB,OAAOA,MAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;SACrC;QAEM,oBAAe,GAAtB,UAAuB,CAAO,EAAE,CAAO;YAGrC,IAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrB,IAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrB,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;SAC1B;QAEM,aAAQ,GAAf,UAAgB,CAAO,EAAE,CAAO;YAG9B,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACrF;;;;QAKM,SAAI,GAAX,UAAY,CAAO;YAEjB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SAC5B;;;;QAKM,QAAG,GAAV,UAAW,CAAO,EAAE,CAAO;YAGzB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAC9B;;;;;;;;QAYM,UAAK,GAAZ,UAAa,CAAC,EAAE,CAAC;YACf,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBAGzB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAEpC;iBAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBAGhC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAEpC;iBAAM;gBAGL,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aAC9B;SACF;;;;QAKM,kBAAa,GAApB,UAAqB,CAAO,EAAE,CAAO;YAGnC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAC9B;;;;;QAMM,iBAAY,GAAnB,UAAoB,CAAO,EAAE,CAAS;YAGpC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SACpC;;;;;QAMM,iBAAY,GAAnB,UAAoB,CAAS,EAAE,CAAO;YAGpC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SACpC;;;;;QAQM,aAAQ,GAAf,UAAgB,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBAGzB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAEhD;iBAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBAGhC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAChD;SAGF;;;;QAKM,oBAAe,GAAtB,UAAuB,CAAO,EAAE,CAAO,EAAE,CAAS;YAGhD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAChD;;;;QAKM,oBAAe,GAAtB,UAAuB,CAAO,EAAE,CAAS,EAAE,CAAO;YAGhD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAChD;QAEM,QAAG,GAAV,UAAW,CAAO,EAAE,CAAO;YAGzB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SACvC;;QAGM,SAAI,GAAX,UAAY,CAAS,EAAE,CAAO,EAAE,CAAS,EAAE,CAAO;YAChD,IAAI,OAAO,CAAC,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;gBACxD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;aACjC;iBAAM;gBACL,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAC9B;SACF;QAEM,YAAO,GAAd,UAAe,CAAS,EAAE,CAAO,EAAE,CAAS,EAAE,CAAO;YACnD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SAC3C;QAEM,QAAG,GAAV,UAAW,CAAO,EAAE,CAAO;YAGzB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SACvC;;QAKM,QAAG,GAAV,UAAW,CAAC,EAAE,CAAC;YACb,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBAGzB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;aAEnC;iBAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBAGhC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aACnC;SACF;QAEM,eAAU,GAAjB,UAAkB,CAAO,EAAE,CAAS;YAGlC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;SACnC;QAEM,eAAU,GAAjB,UAAkB,CAAS,EAAE,CAAO;YAGlC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SACnC;QAED,kBAAG,GAAH;YACE,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACjB,OAAO,IAAI,CAAC;SACb;QAEM,QAAG,GAAV,UAAW,CAAO;YAEhB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC7B;QAEM,QAAG,GAAV,UAAW,CAAO;YAEhB,OAAO,IAAI,CAAC,GAAG,CAACA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAEA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/C;QAEM,QAAG,GAAV,UAAW,CAAO,EAAE,CAAO;YAGzB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;SACvD;QAEM,UAAK,GAAZ,UAAa,CAAO,EAAE,CAAO;YAG3B,OAAO,IAAI,CAAC,GAAG,CAACA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAEA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACzD;QAEM,UAAK,GAAZ,UAAa,CAAO,EAAE,CAAO;YAG3B,OAAO,IAAI,CAAC,GAAG,CAACA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAEA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACzD;QAED,oBAAK,GAAL,UAAM,GAAW;YACf,IAAM,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACpD,IAAI,SAAS,GAAG,GAAG,GAAG,GAAG,EAAE;gBACzB,IAAM,SAAS,GAAGA,MAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAC1C,IAAI,CAAC,CAAC,IAAI,SAAS,GAAG,GAAG,CAAC;gBAC1B,IAAI,CAAC,CAAC,IAAI,SAAS,GAAG,GAAG,CAAC;aAC3B;YACD,OAAO,IAAI,CAAC;SACb;QAEM,UAAK,GAAZ,UAAa,CAAO,EAAE,GAAW;YAC/B,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACb,OAAO,CAAC,CAAC;SACV;;;QAIM,YAAO,GAAd,UAAe,CAAS,EAAE,CAAS;YACjC,OAAO,UAAS,CAAO;gBACrB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;aACnC,CAAC;SACH;;;QAIM,gBAAW,GAAlB,UAAmB,CAAS,EAAE,CAAS;YACrC,OAAO,UAAS,CAAO;gBACrB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;aACnC,CAAC;SACH;QACH,WAAC;IAAD,CAAC;;IC9nBD;;;;;;;;;;;;;;;;;;;;;;;;QAyDE,cAAY,KAAY,EAAE,KAAY;YACpC,IAAI,EAAE,IAAI,YAAY,IAAI,CAAC,EAAE;gBAC3B,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;aAC/B;YAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAE9B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBAC7B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;aAChC;YACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBAC7B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;aAChC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBACpC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;aAChC;SACF;;;;QAKD,sBAAO,GAAP;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC3B;QAEM,YAAO,GAAd,UAAe,GAAQ;YACrB,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;gBAC9C,OAAO,KAAK,CAAC;aACd;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;SACtI;QAEM,WAAM,GAAb,UAAc,CAAM;YACJ,OAAO;SAKtB;;;;QAKD,wBAAS,GAAT;YACE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;SAC/G;;;;QAKD,yBAAU,GAAV;YACE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;SAC/G;;;;QAKD,2BAAY,GAAZ;YACE,OAAO,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SAC9F;;;;QAKD,sBAAO,GAAP,UAAQ,CAAO,EAAE,CAAQ;YACvB,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;YAEd,IAAM,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC;YAC5B,IAAM,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC;YAC5B,IAAM,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC;YAC5B,IAAM,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC;YAE5B,IAAM,MAAM,GAAGA,MAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAM,MAAM,GAAGA,MAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAM,MAAM,GAAGA,MAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAM,MAAM,GAAGA,MAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAE5C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACvC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SACxC;QAED,4BAAa,GAAb,UAAc,CAAO,EAAE,CAAO;YAC5B,IAAI,CAAC,UAAU,CAAC,MAAM,CAACA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAEA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,UAAU,CAAC,MAAM,CAACA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAEA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAChE;QAED,kBAAG,GAAH,UAAI,IAAU;YACZ,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SAC9D;QAED,uBAAQ,GAAR,UAAS,IAAU;YACjB,IAAI,MAAM,GAAG,IAAI,CAAC;YAClB,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAC1D,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAC1D,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAC1D,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAC1D,OAAO,MAAM,CAAC;SACf;QAED,qBAAM,GAAN,UAAO,KAAa;YAClB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACzB,OAAO,IAAI,CAAC;SACb;QAEM,WAAM,GAAb,UAAc,IAAU,EAAE,KAAa;YACrC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,CAAC;SAC5B;QAEM,gBAAW,GAAlB,UAAmB,CAAO,EAAE,CAAO;YACjC,IAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;YAC5C,IAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;YAE5C,IAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;YAC5C,IAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;YAE5C,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE;gBAC5C,OAAO,KAAK,CAAC;aACd;YACD,OAAO,IAAI,CAAC;SACb;QAEM,aAAQ,GAAf,UAAgB,CAAO,EAAE,CAAO;YAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;SAC/F;QAEM,SAAI,GAAX,UAAY,CAAO,EAAE,CAAO;YAC1B,IAAM,EAAE,GAAGA,MAAI,CAAC,GAAG,CAAC,CAAC,EAAEA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5G,IAAM,EAAE,GAAGA,MAAI,CAAC,GAAG,CAAC,CAAC,EAAEA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAE5G,IAAM,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;YAC3C,IAAM,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;YAE3C,IAAM,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;YAC3C,IAAM,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;YAE3C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;SACpC;QAED,sBAAO,GAAP,UAAQ,MAAqB,EAAE,KAAmB;;YAGhD,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;YACrB,IAAI,IAAI,GAAG,QAAQ,CAAC;YAEpB,IAAM,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;YACnB,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YACvC,IAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAEzB,IAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAE3B,KAAK,IAAI,CAAC,GAAc,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE;gBACrE,IAAI,IAAI,CAAC,CAAC,GAAGA,MAAI,CAAC,OAAO,EAAE;;oBAEzB,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;wBAC1D,OAAO,KAAK,CAAC;qBACd;iBACF;qBAAM;oBACL,IAAM,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;oBAC7C,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;;oBAG7C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBAEb,IAAI,EAAE,GAAG,EAAE,EAAE;wBACX,IAAM,IAAI,GAAG,EAAE,CAAC;wBAChB,EAAE,GAAG,EAAE,CAAC;wBACR,EAAE,GAAG,IAAI,CAAC;wBACV,CAAC,GAAG,GAAG,CAAC;qBACT;;oBAGD,IAAI,EAAE,GAAG,IAAI,EAAE;wBACb,MAAM,CAAC,OAAO,EAAE,CAAC;wBACjB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;wBACd,IAAI,GAAG,EAAE,CAAC;qBACX;;oBAGD,IAAI,GAAGA,MAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAE1B,IAAI,IAAI,GAAG,IAAI,EAAE;wBACf,OAAO,KAAK,CAAC;qBACd;iBACF;aACF;;;YAID,IAAI,IAAI,GAAG,GAAG,IAAI,KAAK,CAAC,WAAW,GAAG,IAAI,EAAE;gBAC1C,OAAO,KAAK,CAAC;aACd;;YAGD,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;YACvB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;YACvB,OAAO,IAAI,CAAC;SACb;;QAGD,uBAAQ,GAAR;YACE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SAC7B;QACH,WAAC;IAAD,CAAC;;ICxQD;;;;;;;;;;;;;;;;;;;;;;;IAwBA;IAEA;;;IAGA;;QACA;SAiIC;QAjGC,sBAAW,6BAAiB;iBAA5B,cAAyC,OAAO,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,EAAE;;;WAAA;QAc5F,sBAAW,yBAAa;;;;;;;iBAAxB,cAAqC,OAAO,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,EAAE;;;WAAA;QA+CxE,sBAAW,iCAAqB;iBAAhC,cAA6C,OAAO,QAAQ,CAAC,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,EAAE;;;WAAA;QAOxG,sBAAW,8BAAkB;iBAA7B,cAA0C,OAAO,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,EAAE;;;WAAA;QAqB/F,sBAAW,mCAAuB;iBAAlC,cAA+C,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE;;;WAAA;QAMnG,sBAAW,oCAAwB;iBAAnC,cAAgD,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE;;;WAAA;;;;;;QAzH9F,0BAAiB,GAAW,CAAC,CAAC;;;;;QAM9B,2BAAkB,GAAW,EAAE,CAAC;;;;;QAMhC,sBAAa,GAAW,GAAG,CAAC;;;;;;QAO5B,uBAAc,GAAW,GAAG,CAAC;;;;;QAM7B,mBAAU,GAAW,KAAK,CAAC;;;;;QAO3B,oBAAW,IAAY,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;;;;QAa9C,oBAAW,GAAW,CAAC,CAAC;;;;;QAOxB,uBAAc,GAAW,EAAE,CAAC;;;;QAK5B,yBAAgB,GAAW,EAAE,CAAC;;;;QAK9B,6BAAoB,GAAW,EAAE,CAAC;;;;;QAMlC,0BAAiB,GAAW,GAAG,CAAC;;;;;QAMhC,4BAAmB,GAAW,GAAG,CAAC;;;;;QAMlC,6BAAoB,IAAY,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;;;;;QAMvD,uBAAc,GAAW,GAAG,CAAC;;;;;QAO7B,oBAAW,IAAY,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;;;;;;QAQtC,kBAAS,GAAW,GAAG,CAAC;QACxB,oBAAW,GAAW,IAAI,CAAC;;;;;QAO3B,oBAAW,GAAW,GAAG,CAAC;;;;QAK1B,6BAAoB,GAAW,IAAI,CAAC;;;;QAMpC,8BAAqB,IAAY,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QAGjE,eAAC;KAjID;;IC9BA;;;;;;;;;;;;;;;;;IAkBA;QAcE,cAAY,IAMX;YAnBD,UAAK,GAAQ,EAAE,CAAC;YAChB,SAAI,GAAW,QAAQ,CAAC;YAOxB,iBAAY,GAAW,CAAC,CAAC;YACzB,cAAS,GAAW,CAAC,CAAC;YACtB,aAAQ,GAAW,CAAC,CAAC;YACrB,kBAAa,GAAW,CAAC,CAAC;YASxB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC;YAElC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;YAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;YAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC;SAChC;QAED,kBAAG,GAAH,UAAI,CAAU;YACZ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBACzB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;gBACd,OAAO,IAAI,CAAC;aACb;YACD,OAAO,IAAI,CAAC,IAAI,CAAC;SAClB;QAED,mBAAI,GAAJ;YACE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;SAC1B;QAED,uBAAQ,GAAR;YACE,IAAI,IAAO,CAAC;YACZ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;aAC3B;iBAAM;gBACL,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,UAAU,EAAE;oBACxC,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;iBACzB;qBAAM;;oBAEL,IAAI,GAAG,EAAO,CAAC;iBAChB;aACF;YACD,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE;gBACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;aACnB;YACD,OAAO,IAAI,CAAC;SACb;QAED,sBAAO,GAAP,UAAQ,IAAO;YACb,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE;gBACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE;oBACpC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;iBAClB;gBACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACvB;iBAAM;gBACL,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,UAAU,EAAE;oBACzC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;iBAC9B;aACF;SACF;;QAGD,uBAAQ,GAAR;YACE,OAAO,IAAI,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI;kBACjF,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC;SACrE;QACH,WAAC;IAAD,CAAC;;ICpGD;;;;;;;;;;;;;;;;;;;;;;;IAqCA;;;IAGA;QAWE,kBAAY,EAAW;;YARvB,SAAI,GAAS,IAAI,IAAI,EAAE,CAAC;YACxB,aAAQ,GAAM,IAAI,CAAC;YACnB,WAAM,GAAgB,IAAI,CAAC;YAC3B,WAAM,GAAgB,IAAI,CAAC;YAC3B,WAAM,GAAgB,IAAI,CAAC;;YAE3B,WAAM,GAAW,CAAC,CAAC,CAAC;YAGlB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;SACd;;QAGD,2BAAQ,GAAR;YACE,OAAO,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;SACvC;QAED,yBAAM,GAAN;YACE,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;SAC5B;QACH,eAAC;IAAD,CAAC,IAAA;IAED;;;;;;;;;;;;QAmBE;YAuwBQ,cAAS,GAAuB,IAAI,IAAI,CAAe;gBAC7D,MAAM,EAAN;;oBAEE,OAAO,EAAkB,CAAC;iBAC3B;gBACD,OAAO,EAAP,UAAQ,KAAmB;iBAC1B;aACF,CAAC,CAAC;YAEK,cAAS,GAA6B,IAAI,IAAI,CAAqB;gBACzE,MAAM,EAAN;oBACE,OAAO,EAAE,CAAC;iBACX;gBACD,OAAO,EAAP,UAAQ,KAAyB;oBAC/B,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;iBAClB;aACF,CAAC,CAAC;YAEK,iBAAY,GAAsB,IAAI,IAAI,CAAc;gBAC9D,MAAM,EAAN;oBACE,OAAO,IAAI,QAAQ,EAAE,CAAC;iBACvB;gBACD,OAAO,EAAP,UAAQ,QAAqB;oBAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC;iBAClB;aACF,CAAC,CAAC;YA/xBD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YAEvB,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,CAAc;gBAClC,MAAM,EAAN;oBACE,OAAO,IAAI,QAAQ,EAAE,CAAC;iBACvB;aACF,CAAC,CAAC;SACJ;;;;;;QAOD,iCAAW,GAAX,UAAY,EAAU;YACpB,IAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAE9B,OAAO,IAAI,CAAC,QAAQ,CAAC;SACtB;;;;;;QAOD,gCAAU,GAAV,UAAW,EAAU;YACnB,IAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAE9B,OAAO,IAAI,CAAC,IAAI,CAAC;SAClB;QAED,kCAAY,GAAZ;YACE,IAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC;YAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;YAC7B,OAAO,IAAI,CAAC;SACb;QAED,8BAAQ,GAAR,UAAS,IAAiB;YACxB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;;YAEjB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAC9B;;;;;;;QAQD,iCAAW,GAAX,UAAY,IAAU,EAAE,QAAW;YAGjC,IAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAEjC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;;YAGpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;YAE/C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACzB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YAEhB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAEtB,OAAO,IAAI,CAAC,EAAE,CAAC;SAChB;;;;QAKD,kCAAY,GAAZ,UAAa,EAAU;YACrB,IAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAK9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SACrB;;;;;;;;;;QAWD,+BAAS,GAAT,UAAU,EAAU,EAAE,IAAU,EAAE,CAAO;YAIvC,IAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAK9B,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBAC5B,OAAO,KAAK,CAAC;aACd;YAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAEtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;;YAGpB,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;;;YAK1C,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE;gBACb,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC;aACpD;iBAAM;gBACL,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC;aACpD;YAED,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE;gBACb,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC;aACpD;iBAAM;gBACL,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC;aACpD;YAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAEtB,OAAO,IAAI,CAAC;SACb;QAED,gCAAU,GAAV,UAAW,IAAiB;YAG1B,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;gBACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;gBAC1B,OAAO;aACR;;YAGD,IAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;YAC3B,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;gBACtB,IAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC5B,IAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;gBAE5B,IAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAEvC,IAAM,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;gBAChC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAC3C,IAAM,YAAY,GAAG,YAAY,CAAC,YAAY,EAAE,CAAC;;gBAGjD,IAAM,IAAI,GAAG,GAAG,GAAG,YAAY,CAAC;;gBAGhC,IAAM,eAAe,GAAG,GAAG,IAAI,YAAY,GAAG,IAAI,CAAC,CAAC;;gBAGpD,IAAI,KAAK,SAAA,CAAC;gBACV,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE;oBACnB,IAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;oBACxB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;oBACpC,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,eAAe,CAAC;iBAC/C;qBAAM;oBACL,IAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;oBACxB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;oBACpC,IAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;oBAC3C,IAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;oBACpC,KAAK,GAAG,CAAC,OAAO,GAAG,OAAO,IAAI,eAAe,CAAC;iBAC/C;;gBAGD,IAAI,KAAK,SAAA,CAAC;gBACV,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE;oBACnB,IAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;oBACxB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;oBACpC,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,eAAe,CAAC;iBAC/C;qBAAM;oBACL,IAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;oBACxB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;oBACpC,IAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;oBAC3C,IAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;oBACpC,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,eAAe,CAAC;iBAC7C;;gBAGD,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE;oBAChC,MAAM;iBACP;;gBAGD,IAAI,KAAK,GAAG,KAAK,EAAE;oBACjB,KAAK,GAAG,MAAM,CAAC;iBAChB;qBAAM;oBACL,KAAK,GAAG,MAAM,CAAC;iBAChB;aACF;YAED,IAAM,OAAO,GAAG,KAAK,CAAC;;YAGtB,IAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;YACjC,IAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACtC,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC;YAC7B,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC;YAC1B,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAC/C,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YAEtC,IAAI,SAAS,IAAI,IAAI,EAAE;;gBAErB,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO,EAAE;oBAChC,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC;iBAC9B;qBAAM;oBACL,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC;iBAC9B;gBAED,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC;gBAC3B,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC;gBACxB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;aACzB;iBAAM;;gBAEL,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC;gBAC3B,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC;gBACxB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;gBACxB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;aACzB;;YAGD,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;YACpB,OAAO,KAAK,IAAI,IAAI,EAAE;gBACpB,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAE5B,IAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC5B,IAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;gBAK5B,KAAK,CAAC,MAAM,GAAG,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC1D,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBAE7C,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;aACtB;;SAGF;QAED,gCAAU,GAAV,UAAW,IAAiB;YAC1B,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE;gBACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,OAAO;aACR;YAED,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,IAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;YAClC,IAAI,OAAO,CAAC;YACZ,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE;gBAC1B,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;aACzB;iBAAM;gBACL,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;aACzB;YAED,IAAI,WAAW,IAAI,IAAI,EAAE;;gBAEvB,IAAI,WAAW,CAAC,MAAM,KAAK,MAAM,EAAE;oBACjC,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC;iBAC9B;qBAAM;oBACL,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC;iBAC9B;gBACD,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC;gBAC7B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;;gBAGtB,IAAI,KAAK,GAAG,WAAW,CAAC;gBACxB,OAAO,KAAK,IAAI,IAAI,EAAE;oBACpB,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBAE5B,IAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;oBAC5B,IAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;oBAE5B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC7C,KAAK,CAAC,MAAM,GAAG,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;oBAE1D,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;iBACtB;aACF;iBAAM;gBACL,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;gBACtB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;gBACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aACvB;;SAGF;;;;;QAMD,6BAAO,GAAP,UAAQ,EAAe;YAGrB,IAAM,CAAC,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC9B,OAAO,EAAE,CAAC;aACX;YAED,IAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;YACnB,IAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;YAEnB,IAAM,OAAO,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;;YAGpC,IAAI,OAAO,GAAG,CAAC,EAAE;gBACf,IAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,IAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;;gBAGnB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBACb,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;gBACpB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;;gBAGb,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE;oBACpB,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE;wBAC1B,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;qBACrB;yBAAM;wBACL,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;qBACrB;iBACF;qBAAM;oBACL,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;iBACjB;;gBAGD,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE;oBACvB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACb,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACb,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACb,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;oBAC/B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;oBAE/B,CAAC,CAAC,MAAM,GAAG,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;oBAC5C,CAAC,CAAC,MAAM,GAAG,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;iBAC7C;qBAAM;oBACL,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACb,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACb,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACb,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;oBAC/B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;oBAE/B,CAAC,CAAC,MAAM,GAAG,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;oBAC5C,CAAC,CAAC,MAAM,GAAG,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;iBAC7C;gBAED,OAAO,CAAC,CAAC;aACV;;YAGD,IAAI,OAAO,GAAG,CAAC,CAAC,EAAE;gBAChB,IAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,IAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;;gBAGnB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBACb,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;gBACpB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;;gBAGb,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE;oBACpB,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;wBACzB,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;qBACrB;yBAAM;wBACL,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;qBACrB;iBACF;qBAAM;oBACL,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;iBACjB;;gBAGD,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE;oBACvB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACb,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACb,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACb,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;oBAC/B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;oBAE/B,CAAC,CAAC,MAAM,GAAG,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;oBAC5C,CAAC,CAAC,MAAM,GAAG,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;iBAC7C;qBAAM;oBACL,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACb,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACb,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACb,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;oBAC/B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;oBAE/B,CAAC,CAAC,MAAM,GAAG,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;oBAC5C,CAAC,CAAC,MAAM,GAAG,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;iBAC7C;gBAED,OAAO,CAAC,CAAC;aACV;YAED,OAAO,CAAC,CAAC;SACV;;;;;QAMD,+BAAS,GAAT;YACE,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;gBACvB,OAAO,CAAC,CAAC;aACV;YAED,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;SAC3B;;;;QAKD,kCAAY,GAAZ;YACE,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;gBACvB,OAAO,GAAG,CAAC;aACZ;YAED,IAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;YACzB,IAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAE1C,IAAI,SAAS,GAAG,GAAG,CAAC;YACpB,IAAI,IAAI,CAAC;YACT,IAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9D,OAAO,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;gBACvB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;;oBAEnB,SAAS;iBACV;gBAED,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;aACvC;YAED,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAE9B,OAAO,SAAS,GAAG,QAAQ,CAAC;SAC7B;;;;QAKD,mCAAa,GAAb,UAAc,EAAW;YACvB,IAAI,IAAI,CAAC;YACT,IAAI,OAAO,EAAE,KAAK,WAAW,EAAE;gBAC7B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;aACzB;iBAAM;gBACL,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;aACpB;;YAID,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;gBACjB,OAAO,CAAC,CAAC;aACV;YAED,IAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnD,IAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;SACvC;QAED,uCAAiB,GAAjB,UAAkB,IAAiB;YACjC,IAAI,IAAI,IAAI,IAAI,EAAE;gBAChB,OAAO;aACR;YAED,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,CAEzB;YAED,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAE3B,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;gBAIjB,OAAO;aACR;YAQD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;SAChC;QAED,qCAAe,GAAf,UAAgB,IAAiB;YAC/B,IAAI,IAAI,IAAI,IAAI,EAAE;gBAChB,OAAO;aACR;YAED,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAE3B,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;gBAIjB,OAAO;aACR;;;YAKD,IAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;YAC9B,IAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;YACf,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE;YAG9C,IAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAIvC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAC7B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;SAC9B;;;;QAKD,8BAAQ,GAAR;YACE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAGnC;;;;;QAMD,mCAAa,GAAb;YACE,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,IAAI,CAAC;YACT,IAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9D,OAAO,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;gBACvB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;oBACpB,SAAS;iBACV;gBAID,IAAM,OAAO,GAAGA,MAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAClE,UAAU,GAAGA,MAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;aAC5C;YACD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAE9B,OAAO,UAAU,CAAC;SACnB;;;;QAKD,qCAAe,GAAf;YACE,IAAM,KAAK,GAAG,EAAE,CAAC;YACjB,IAAI,KAAK,GAAG,CAAC,CAAC;;YAGd,IAAI,IAAI,CAAC;YACT,IAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9D,OAAO,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;gBACvB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;;oBAEnB,SAAS;iBACV;gBAED,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;oBACjB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;oBACnB,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;oBACpB,EAAE,KAAK,CAAC;iBACT;qBAAM;oBACL,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;iBACrB;aACF;YACD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAE9B,OAAO,KAAK,GAAG,CAAC,EAAE;gBAChB,IAAI,OAAO,GAAG,QAAQ,CAAC;gBACvB,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;gBACd,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;gBACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE;oBAC9B,IAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE;wBAClC,IAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;wBAC5B,IAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;wBACrB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;wBACxB,IAAM,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC;wBAC9B,IAAI,IAAI,GAAG,OAAO,EAAE;4BAClB,IAAI,GAAG,CAAC,CAAC;4BACT,IAAI,GAAG,CAAC,CAAC;4BACT,OAAO,GAAG,IAAI,CAAC;yBAChB;qBACF;iBACF;gBAED,IAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3B,IAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;gBAE3B,IAAM,QAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;gBACnC,QAAM,CAAC,MAAM,GAAG,MAAM,CAAC;gBACvB,QAAM,CAAC,MAAM,GAAG,MAAM,CAAC;gBACvB,QAAM,CAAC,MAAM,GAAG,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC3D,QAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC9C,QAAM,CAAC,MAAM,GAAG,IAAI,CAAC;gBAErB,MAAM,CAAC,MAAM,GAAG,QAAM,CAAC;gBACvB,MAAM,CAAC,MAAM,GAAG,QAAM,CAAC;gBAEvB,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,QAAM,CAAC;gBACrB,EAAE,KAAK,CAAC;aACT;YAED,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEvB,IAAI,CAAC,QAAQ,EAAE,CAAC;SACjB;;;;;;;QAQD,iCAAW,GAAX,UAAY,SAAe;;YAEzB,IAAI,IAAI,CAAC;YACT,IAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9D,OAAO,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;gBACvB,IAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACvB,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC;gBACjC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC;gBACjC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC;gBACjC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC;aAClC;YACD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;SAC/B;;;;;QAMD,2BAAK,GAAL,UAAM,IAAU,EAAE,aAAuC;YAEvD,IAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YAExC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvB,IAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;gBACzB,IAAI,IAAI,IAAI,IAAI,EAAE;oBAChB,SAAS;iBACV;gBAED,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;oBACrC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;wBACjB,IAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBACvC,IAAI,OAAO,KAAK,KAAK,EAAE;4BACrB,OAAO;yBACR;qBACF;yBAAM;wBACL,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;qBACzB;iBACF;aACF;YAED,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAC/B;;;;;;;;;;;QAYD,6BAAO,GAAP,UAAQ,KAAmB,EAAE,eAAgC;YAG3D,IAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;YACpB,IAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;YACpB,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAE3B,CAAC,CAAC,SAAS,EAAE,CAAC;;YAGd,IAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACpC,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;;YAK1B,IAAI,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;;YAGpC,IAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,WAAW,GAAG,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YAC7D,WAAW,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAEjC,IAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACxC,IAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YAE3C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvB,IAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;gBACzB,IAAI,IAAI,IAAI,IAAI,EAAE;oBAChB,SAAS;iBACV;gBAED,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,KAAK,EAAE;oBACtD,SAAS;iBACV;;;gBAID,IAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBAChC,IAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACjC,IAAM,UAAU,GAAGA,MAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC/E,IAAI,UAAU,GAAG,GAAG,EAAE;oBACpB,SAAS;iBACV;gBAED,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;oBACjB,QAAQ,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBACnC,QAAQ,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBACnC,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;oBAEnC,IAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;oBAEjD,IAAI,KAAK,KAAK,GAAG,EAAE;;wBAEjB,OAAO;qBACR;oBAED,IAAI,KAAK,GAAG,GAAG,EAAE;;wBAEf,WAAW,GAAG,KAAK,CAAC;wBACpB,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,WAAW,GAAG,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;wBACzD,WAAW,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;qBAClC;iBACF;qBAAM;oBACL,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;iBACzB;aACF;YACD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;SAClC;QA6BH,kBAAC;IAAD,CAAC,IAAA;IAED;QAAA;YACE,YAAO,GAAuB,EAAE,CAAC;YACjC,WAAM,GAAa,EAAE,CAAC;SAuCvB;QAtCC,2BAAQ,GAAR,UAAS,IAAiB;YACxB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;SACb;QACD,uBAAI,GAAJ;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC9B,IAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;gBAClC,IAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;oBACxB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBACnB,OAAO,IAAI,CAAC;iBACb;gBACD,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;oBACxB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBACnB,IAAI,IAAI,CAAC,MAAM,EAAE;wBACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBACpB,OAAO,IAAI,CAAC,MAAM,CAAC;qBACpB;iBACF;gBACD,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;oBACxB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBACnB,IAAI,IAAI,CAAC,MAAM,EAAE;wBACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBACpB,OAAO,IAAI,CAAC,MAAM,CAAC;qBACpB;iBACF;gBACD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACnB,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;aACnB;SACF;QACD,wBAAK,GAAL;YACE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;SACzB;QACH,eAAC;IAAD,CAAC;;ICj6BD;;;;;;;;;;;;;;;;;;;;;;;IAmCA;;;;IAIA;QAAA;YAAA,iBA6LC;YA5LC,WAAM,GAA8B,IAAI,WAAW,EAAgB,CAAC;YACpE,iBAAY,GAAW,CAAC,CAAC;YACzB,iBAAY,GAAa,EAAE,CAAC;;;;;YA4D5B,UAAK,GAAG,UAAC,IAAU,EAAE,aAAuC;gBAC1D,KAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;aACxC,CAAA;YAyGD,kBAAa,GAAG,UAAC,OAAe;;gBAE9B,IAAI,OAAO,KAAK,KAAI,CAAC,cAAc,EAAE;oBACnC,OAAO,IAAI,CAAC;iBACb;gBAED,IAAM,QAAQ,GAAGA,MAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAI,CAAC,cAAc,CAAC,CAAC;gBACxD,IAAM,QAAQ,GAAGA,MAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAI,CAAC,cAAc,CAAC,CAAC;;gBAIxD,IAAM,SAAS,GAAG,KAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACpD,IAAM,SAAS,GAAG,KAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;;gBAGpD,KAAI,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAEtC,OAAO,IAAI,CAAC;aACb,CAAA;SACF;;;;QAlLC,gCAAW,GAAX,UAAY,OAAe;YACzB,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;SACzC;;;;QAKD,gCAAW,GAAX,UAAY,QAAgB,EAAE,QAAgB;YAC5C,IAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/C,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACvC;;;;QAKD,+BAAU,GAAV,UAAW,OAAe;YACxB,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;SACxC;;;;QAKD,kCAAa,GAAb;YACE,OAAO,IAAI,CAAC,YAAY,CAAC;SAC1B;;;;QAKD,kCAAa,GAAb;YACE,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;SAChC;;;;QAKD,mCAAc,GAAd;YACE,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;SACpC;;;;QAKD,mCAAc,GAAd;YACE,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;SACnC;;;;;;;;;;;QAoBD,4BAAO,GAAP,UAAQ,KAAmB,EAAE,eAAgC;YAC3D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;SAC7C;;;;;;;QAQD,gCAAW,GAAX,UAAY,SAAe;YACzB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;SACpC;;;;;QAMD,gCAAW,GAAX,UAAY,IAAU,EAAE,QAAsB;YAE5C,IAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACxD,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,OAAO,CAAC;SAChB;;;;QAKD,iCAAY,GAAZ,UAAa,OAAe;YAC1B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAC3B,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;SACnC;;;;;QAMD,8BAAS,GAAT,UAAU,OAAe,EAAE,IAAU,EAAE,YAAkB;YAEvD,IAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;YACnE,IAAI,OAAO,EAAE;gBACX,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;aAC1B;SACF;;;;;QAMD,+BAAU,GAAV,UAAW,OAAe;YACxB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;SAC1B;QAED,+BAAU,GAAV,UAAW,OAAe;YACxB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACjC;QAED,iCAAY,GAAZ,UAAa,OAAe;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBACjD,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE;oBACpC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;iBAC7B;aACF;SACF;;;;QAKD,gCAAW,GAAX,UAAY,eAA2E;YAErF,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC;;YAGlC,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;gBAC9C,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE;oBAChC,SAAS;iBACV;;;gBAID,IAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;;gBAG5D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;aAChD;;;SAIF;QAqBH,iBAAC;IAAD,CAAC;;ICpOD;;;;;;;;;;;;;;;;;;;;;;;;;QAsCE,aAAY,KAAoB;YAC9B,IAAI,EAAE,IAAI,YAAY,GAAG,CAAC,EAAE;gBAC1B,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;aACvB;YACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBAC7B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;aACtB;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBACpC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aACpB;iBAAM;gBACL,IAAI,CAAC,WAAW,EAAE,CAAC;aACpB;SACF;;QAGM,OAAG,GAAV,UAAW,KAAa;YACtB,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACzC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,GAAG,CAAC;SACZ;QAEM,SAAK,GAAZ,UAAa,GAAQ;YAEnB,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACzC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACd,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACd,OAAO,GAAG,CAAC;SACZ;QAEM,YAAQ,GAAf;YACE,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACzC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YACZ,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YACZ,OAAO,GAAG,CAAC;SACZ;QAEM,WAAO,GAAd,UAAe,GAAQ;YACrB,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;gBAC9C,OAAO,KAAK,CAAC;aACd;YACD,OAAOA,MAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAIA,MAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACrD;QAEM,UAAM,GAAb,UAAc,CAAM;YACJ,OAAO;SAKtB;;QAGD,yBAAW,GAAX;YACE,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;YACb,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;SACd;QAED,iBAAG,GAAH,UAAI,KAAmB;YACrB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBAE7B,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;gBACjB,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;aAElB;iBAAM;;gBAGL,IAAI,CAAC,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACzB,IAAI,CAAC,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC1B;SACF;QAED,oBAAM,GAAN,UAAO,KAAU;YAEf,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;SAClB;;QAGD,sBAAQ,GAAR,UAAS,KAAa;;YAGpB,IAAI,CAAC,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SAC1B;;QAGD,sBAAQ,GAAR;YACE,OAAOA,MAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;SACnC;;QAGD,sBAAQ,GAAR;YACE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;SACjC;;QAGD,sBAAQ,GAAR;YACE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;SAClC;;QAOM,OAAG,GAAV,UAAW,GAAG,EAAE,CAAC;YAEf,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;;;;;gBAMxB,IAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;gBAC1B,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACjC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACjC,OAAO,EAAE,CAAC;aAEX;iBAAM,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;gBAE/B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aACvE;SACF;;QAGM,UAAM,GAAb,UAAc,GAAQ,EAAE,CAAM;;;;;YAO5B,IAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC1B,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACjC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACjC,OAAO,EAAE,CAAC;SACX;;QAGM,WAAO,GAAd,UAAe,GAAQ,EAAE,CAAO;YAG9B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SACvE;QAEM,UAAM,GAAb,UAAc,GAAQ,EAAE,CAAO,EAAE,CAAO;YACtC,IAAM,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,IAAM,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACvB;;QAOM,QAAI,GAAX,UAAY,GAAG,EAAE,CAAC;YAChB,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;;;;;gBAMxB,IAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;gBAC1B,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACjC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACjC,OAAO,EAAE,CAAC;aAEX;iBAAM,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;gBAE/B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aACxE;SACF;;QAGM,WAAO,GAAd,UAAe,GAAQ,EAAE,CAAM;;;;;YAM7B,IAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC1B,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACjC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACjC,OAAO,EAAE,CAAC;SACX;;QAGM,YAAQ,GAAf,UAAgB,GAAQ,EAAE,CAAO;YAE/B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SACxE;QACH,UAAC;IAAD,CAAC;;ICrOD;;;;;;;;;;;;;;;;;;;;;;;IAiCA;;;;;;QAYE,mBAAY,QAAe,EAAE,QAAiB;YAC5C,IAAI,EAAE,IAAI,YAAY,SAAS,CAAC,EAAE;gBAChC,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;aAC1C;YACD,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;gBACnC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;aAC1B;YACD,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;gBACnC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;aAC3B;SACF;QAEM,eAAK,GAAZ,UAAa,EAAa;YACxB,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC/C,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACzB,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACxB,OAAO,GAAG,CAAC;SACZ;;QAGM,aAAG,GAAV,UAAW,QAAc,EAAE,QAAa;YACtC,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC/C,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC7B,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC5B,OAAO,GAAG,CAAC;SACZ;QAEM,kBAAQ,GAAf;YACE,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC/C,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACpB,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YACvB,OAAO,GAAG,CAAC;SACZ;;;;QAKD,+BAAW,GAAX;YACE,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SACtB;;;;;QAQD,uBAAG,GAAH,UAAI,CAAC,EAAE,CAAE;YACP,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;gBAC5B,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACjB;iBAAM;gBACL,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACd,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACf;SACF;;;;QAKD,0BAAM,GAAN,UAAO,QAAc,EAAE,QAAgB;YACrC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACzB,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;SAC3B;QAED,gCAAY,GAAZ,UAAa,EAAa;YACxB,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACrB,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SACrB;QAEM,iBAAO,GAAd,UAAe,GAAQ;YACrB,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;gBAC9C,OAAO,KAAK,CAAC;aACd;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAClD;QAEM,gBAAM,GAAb,UAAc,CAAM;YACJ,OAAO;SAKtB;;;;QAOM,aAAG,GAAV,UAAW,CAAC,EAAE,CAAC;YACb,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAEpB,IAAM,GAAG,GAAG,EAAE,CAAC;gBACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACjC,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBACjC;gBACD,OAAO,GAAG,CAAC;aAEZ;iBAAM,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;gBAC/B,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAEhC;iBAAM,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;gBAC/B,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAC9B;SACF;;QAKM,gBAAM,GAAb,UAAc,CAAY,EAAE,CAAC;YAE3B,IAAM,GAAG,GAAG,EAAE,CAAC;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACjC,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACjC;YACD,OAAO,GAAG,CAAC;SACZ;;;QAIM,eAAK,GAAZ,UAAa,CAAY;YAEvB,OAAO,UAAS,CAAO;gBACrB,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAC5B,CAAC;SACH;QAEM,iBAAO,GAAd,UAAe,CAAY,EAAE,CAAO;YAGlC,IAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACvB;QAEM,eAAK,GAAZ,UAAa,CAAY,EAAE,CAAY;;;YAKrC,IAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;YAChC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,OAAO,EAAE,CAAC;SACX;;QAKM,cAAI,GAAX,UAAY,CAAC,EAAE,CAAC;YACd,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;gBACxB,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAEjC;iBAAM,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;gBAC/B,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAC/B;SACF;QAEM,kBAAQ,GAAf,UAAgB,CAAY,EAAE,CAAO;YAGnC,IAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,IAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACpC,IAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACvB;QAEM,gBAAM,GAAb,UAAc,CAAY,EAAE,CAAY;;;YAKtC,IAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;YAChC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,OAAO,EAAE,CAAC;SACX;QACH,gBAAC;IAAD,CAAC;;ICnOD;;;;;;;;;;;;;;;;;;;;;;;IAkCA;;;;;;;QAsBE,eAAY,CAAQ,EAAE,CAAU;YAG9B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACX,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;SACb;QAED,4BAAY,GAAZ,UAAa,EAAa;YACxB,IAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAClD,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAEnB,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;SAC3B;QAED,8BAAc,GAAd,UAAe,WAAiB,EAAE,EAAa;YAC7C,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAEtC,IAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAClD,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SACpB;;;;;;;QAQD,4BAAY,GAAZ,UAAa,EAAa,EAAE,IAAgB;YAAhB,qBAAA,EAAA,QAAgB;YAC1C,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACtD,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;;YAGrD,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;SAC/C;;;;;;QAOD,uBAAO,GAAP,UAAQ,KAAa;YAEnB,IAAM,IAAI,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;YACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YACpD,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;SACrB;QAED,uBAAO,GAAP;YACE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACzB;;;;QAKD,yBAAS,GAAT;YACE,IAAM,EAAE,GAAGA,MAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAACA,MAAI,CAAC,EAAE,EAAE,CAACA,MAAI,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;SACd;QAED,qBAAK,GAAL;YACE,IAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;YAC1B,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5C,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACnB,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACjB,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1B,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxB,OAAO,KAAK,CAAC;SACd;QAED,mBAAG,GAAH,UAAI,IAAW;YACb,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC1B,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzB,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACxB;QACH,YAAC;IAAD,CAAC;;IChJD;;;;;;;;;;;;;;;;;;;;;;;IA0BA;QAOE;YACE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;SACZ;QACH,eAAC;IAAD,CAAC;;ICrCD;;;;;;;;;;;;;;;;;;;;;;;IA6BA;QAOE;YACE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;SACZ;QAED,+BAAY,GAAZ,UAAa,EAAa,EAAE,CAAO;YACjC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,OAAO,EAAE,CAAC;SACX;QACH,eAAC;IAAD,CAAC;;IC9CD;;;;;;;;;;;;;;;;;;;;;;;IA+BA;;;;;;QAKA;SAkFC;;QA7EC,sBAAM,GAAN;SACC;QAEM,aAAO,GAAd,UAAe,GAAQ;YACrB,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;gBAC9C,OAAO,KAAK,CAAC;aACd;YACD,OAAO,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC;SAC3E;QAED,yBAAS,GAAT;YACE,OAAO,IAAI,CAAC,QAAQ,CAAC;SACtB;;;;;;;QAQD,uBAAO,GAAP;YACE,OAAO,IAAI,CAAC,MAAM,CAAC;SACpB;QAuDH,YAAC;IAAD,CAAC;;ICtHD;;;;;;;;;;;;;;;;;;;;;;;IAgFA,IAAM,iBAAiB,GAAe;QACpC,QAAQ,EAAG,IAAI;QACf,QAAQ,EAAG,GAAG;QACd,WAAW,EAAG,GAAG;QACjB,OAAO,EAAG,GAAG;QACb,QAAQ,EAAG,KAAK;QAEhB,gBAAgB,EAAG,CAAC;QACpB,kBAAkB,EAAG,MAAM;QAC3B,cAAc,EAAG,MAAM;KACxB,CAAC;IAEF;;;IAGA;QAKE,sBAAY,OAAgB,EAAE,UAAkB;YAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACvB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC;SACd;QACH,mBAAC;IAAD,CAAC,IAAA;IAED;;;;;;;;;yBA0BmB,iBAAY,IAAU,EAAE,KAAM,EAAE,GAAI;YACnD,IAAI,KAAK,CAAC,KAAK,EAAE;gBACf,GAAG,GAAG,KAAK,CAAC;gBACZ,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;aAErB;iBAAM,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;gBAClC,GAAG,GAAG,EAAC,OAAO,EAAG,GAAG,EAAC,CAAC;aACvB;YAED,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAEtC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YAEnB,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC;YAC/B,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC;YACrC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC;YAE/B,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC,gBAAgB,CAAC;YAC/C,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC,kBAAkB,CAAC;YACnD,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,cAAc,CAAC;;YAG3C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YAErB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YAEnB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YAEtB,IAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,EAAE,CAAC,EAAE;gBACnC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;aAC/C;YAED,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC;SAChC;;;;;QAMD,wBAAM,GAAN;YACE,IAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5B,IAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;YAC7C,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;gBACvB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;aACvB;YACD,IAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,EAAE,CAAC,EAAE;gBACnC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;aAC/C;YACD,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,aAAa,EAAE,CAAC;SACtB;;QAGD,4BAAU,GAAV;YACE,OAAO;gBACL,QAAQ,EAAE,IAAI,CAAC,UAAU;gBACzB,WAAW,EAAE,IAAI,CAAC,aAAa;gBAC/B,OAAO,EAAE,IAAI,CAAC,SAAS;gBACvB,QAAQ,EAAE,IAAI,CAAC,UAAU;gBAEzB,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;gBACzC,kBAAkB,EAAE,IAAI,CAAC,oBAAoB;gBAC7C,cAAc,EAAE,IAAI,CAAC,gBAAgB;gBAErC,KAAK,EAAE,IAAI,CAAC,OAAO;aACpB,CAAC;SACH;;QAGM,oBAAY,GAAnB,UAAoB,IAAS,EAAE,IAAS,EAAE,OAAY;YACpD,IAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACzC,IAAM,OAAO,GAAG,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACxD,OAAO,OAAO,CAAC;SAChB;;;;;QAMD,yBAAO,GAAP;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;SAC/B;;;;;;QAOD,0BAAQ,GAAR;YACE,OAAO,IAAI,CAAC,OAAO,CAAC;SACrB;;;;;QAMD,0BAAQ,GAAR;YACE,OAAO,IAAI,CAAC,UAAU,CAAC;SACxB;;;;QAKD,2BAAS,GAAT,UAAU,MAAe;YACvB,IAAI,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE;gBAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3B,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;aAC1B;SACF;;;;;;;;;;;QAaD,6BAAW,GAAX;YACE,OAAO,IAAI,CAAC,UAAU,CAAC;SACxB;;;;QAKD,6BAAW,GAAX,UAAY,IAAa;YACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;SACxB;;;;;QAMD,yBAAO,GAAP;YACE,OAAO,IAAI,CAAC,MAAM,CAAC;SACpB;;;;QAKD,yBAAO,GAAP;YACE,OAAO,IAAI,CAAC,MAAM,CAAC;SACpB;;;;QAKD,4BAAU,GAAV;YACE,OAAO,IAAI,CAAC,SAAS,CAAC;SACvB;;;;;QAMD,4BAAU,GAAV,UAAW,OAAe;YAExB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;SAC1B;;;;QAKD,6BAAW,GAAX;YACE,OAAO,IAAI,CAAC,UAAU,CAAC;SACxB;;;;;QAMD,6BAAW,GAAX,UAAY,QAAgB;YAC1B,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;SAC5B;;;;QAKD,gCAAc,GAAd;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;;;;;QAMD,gCAAc,GAAd,UAAe,WAAmB;YAChC,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;SAClC;;;;QAKD,2BAAS,GAAT,UAAU,CAAO;YACf,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;SAC9D;;;;QAKD,yBAAO,GAAP,UAAQ,MAAqB,EAAE,KAAmB,EAAE,UAAkB;YACpE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,UAAU,CAAC,CAAC;SACpF;;;;;;QAOD,6BAAW,GAAX,UAAY,QAAkB;YAC5B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;SACpD;;;;;QAMD,yBAAO,GAAP,UAAQ,UAAkB;YAExB,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;SACxC;;;;QAKD,+BAAa,GAAb,UAAc,UAAsB,EAAE,EAAa;;YAIjD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAEjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE;gBAC1C,IAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC5C,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;aAC3D;SACF;QAED,gCAAc,GAAd,UAAe,UAAsB;;YAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE;gBAC1C,IAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAChC,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACvC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;aACtB;YAED,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;SACvB;;;;;QAMD,6BAAW,GAAX,UAAY,UAAsB,EAAE,GAAc,EAAE,GAAc;YAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE;gBAC1C,IAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;;;gBAGhC,IAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;gBACzB,IAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;gBACzB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;gBACvD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;gBAEvD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAEjC,IAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;gBAE5C,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;aAC/D;SACF;;;;;;QAOD,+BAAa,GAAb,UAAc,MAAsE;YAClF,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,UAAU,CAAC;YAC5C,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC,YAAY,CAAC;YAChD,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC;YACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;SACjB;QAED,qCAAmB,GAAnB;YACE,OAAO,IAAI,CAAC,kBAAkB,CAAC;SAChC;QAED,qCAAmB,GAAnB,UAAoB,UAAkB;YACpC,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC;SACtC;QAED,uCAAqB,GAArB;YACE,OAAO,IAAI,CAAC,oBAAoB,CAAC;SAClC;QAED,uCAAqB,GAArB,UAAsB,YAAoB;YACxC,IAAI,CAAC,oBAAoB,GAAG,YAAY,CAAC;SAC1C;QAED,mCAAiB,GAAjB;YACE,OAAO,IAAI,CAAC,gBAAgB,CAAC;SAC9B;QAED,mCAAiB,GAAjB,UAAkB,QAAgB;YAChC,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;SAClC;;;;;QAMD,0BAAQ,GAAR;YACE,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;gBACvB,OAAO;aACR;;YAGD,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACxC,OAAO,IAAI,EAAE;gBACX,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;gBAC7B,IAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;gBACvC,IAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;gBACvC,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,EAAE;oBACxC,OAAO,CAAC,gBAAgB,EAAE,CAAC;iBAC5B;gBAED,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;aAClB;YAED,IAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAErC,IAAI,KAAK,IAAI,IAAI,EAAE;gBACjB,OAAO;aACR;;YAGD,IAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC;YACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE;gBAC1C,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;aAClD;SACF;;;;;;;;;;;QAYD,+BAAa,GAAb,UAAc,IAAa;YAEzB,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,KAAK,CAAC,EAAE;gBACxF,OAAO,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;aACpC;YAED,IAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,MAAM,CAAC,CAAC;YAC3E,IAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,gBAAgB,MAAM,CAAC,CAAC;YAC3E,IAAM,OAAO,GAAG,QAAQ,IAAI,QAAQ,CAAC;YACrC,OAAO,OAAO,CAAC;SAChB;QACH,cAAC;IAAD,CAAC;;ICzfD;;;;;;;;;;;;;;;;;;;;;;;IA4CA,IAAM,MAAM,GAAG,QAAQ,CAAC;IACxB,IAAM,SAAS,GAAG,WAAW,CAAC;IAC9B,IAAM,OAAO,GAAG,SAAS,CAAC;IA8D1B,IAAM,cAAc,GAAY;QAC9B,IAAI,EAAG,MAAM;QACb,QAAQ,EAAG,IAAI,CAAC,IAAI,EAAE;QACtB,KAAK,EAAG,GAAG;QAEX,cAAc,EAAG,IAAI,CAAC,IAAI,EAAE;QAC5B,eAAe,EAAG,GAAG;QAErB,aAAa,EAAG,GAAG;QACnB,cAAc,EAAG,GAAG;QAEpB,aAAa,EAAG,KAAK;QACrB,MAAM,EAAG,KAAK;QACd,YAAY,EAAG,GAAG;QAElB,UAAU,EAAG,IAAI;QACjB,KAAK,EAAG,IAAI;QACZ,MAAM,EAAG,IAAI;QAEb,QAAQ,EAAG,IAAI;KAChB,CAAC;IAEF;;;IAGA;QAAA;;YAEE,SAAI,GAAW,CAAC,CAAC;;YAEjB,WAAM,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;;YAE3B,MAAC,GAAW,CAAC,CAAC;SACf;QAAD,eAAC;IAAD,CAAC,IAAA;IAED;;;;;;;QAsEE,cAAY,KAAY,EAAE,GAAY;YACpC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YASnC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YAErB,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC;YAC7B,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,UAAU,CAAC;YACtC,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC;YAC/B,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC,aAAa,CAAC;YAC7C,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC;YAE/B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YAEvB,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC;YAC/B,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC;YAEvB,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE;gBAC1B,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;gBAClB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;aACtB;iBAAM;gBACL,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;gBAClB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;aACtB;;YAGD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;YACf,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;;YAGlB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;YAGhC,IAAI,CAAC,OAAO,GAAG,IAAI,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;YAGrC,IAAI,CAAC,UAAU,GAAG,IAAI,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,UAAU,GAAG,IAAI,QAAQ,EAAE,CAAC;YAEjC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;YAEpB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACvD,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC,eAAe,CAAC;YAE7C,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,aAAa,CAAC;YACzC,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,cAAc,CAAC;YAC3C,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,YAAY,CAAC;YAEvC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;YAEvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAE1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YAEnB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;SAC1B;;QAGD,yBAAU,GAAV;YACE,IAAM,QAAQ,GAAG,EAAE,CAAC;YACpB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;gBAChD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aAClB;YACD,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,MAAM,EAAE,IAAI,CAAC,YAAY;gBACzB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE;gBAC7B,cAAc,EAAE,IAAI,CAAC,gBAAgB;gBACrC,eAAe,EAAE,IAAI,CAAC,iBAAiB;gBACvC,QAAQ,UAAA;aACT,CAAC;SACH;;QAGM,iBAAY,GAAnB,UAAoB,IAAS,EAAE,KAAU,EAAE,OAAY;YACrD,IAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAEnC,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;oBAClD,IAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;oBACzD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;iBAC3B;aACF;YACD,OAAO,IAAI,CAAC;SACb;QAED,4BAAa,GAAb;YACE,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,GAAG,KAAK,CAAC;SAC/D;QAED,uBAAQ,GAAR;YACE,OAAO,IAAI,CAAC,OAAO,CAAC;SACrB;QAED,sBAAO,GAAP;YACE,OAAO,IAAI,CAAC,MAAM,CAAC;SACpB;QAED,0BAAW,GAAX,UAAY,IAAS;YACnB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;SACxB;QAED,0BAAW,GAAX;YACE,OAAO,IAAI,CAAC,UAAU,CAAC;SACxB;QAED,6BAAc,GAAd;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;QAED,2BAAY,GAAZ;YACE,OAAO,IAAI,CAAC,WAAW,CAAC;SACzB;;;;;QAMD,6BAAc,GAAd;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;QAED,uBAAQ,GAAR;YACE,OAAO,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC;SAC9B;QAED,wBAAS,GAAT;YACE,OAAO,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;SAC/B;QAED,0BAAW,GAAX;YACE,OAAO,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;SACjC;;;;QAKD,wBAAS,GAAT;YACE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;SACb;QAED,yBAAU,GAAV;YACE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC;SACb;QAED,2BAAY,GAAZ;YACE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;SACb;;;;QAKD,sBAAO,GAAP;YACE,OAAO,IAAI,CAAC,MAAM,CAAC;SACpB;;;;QAKD,sBAAO,GAAP,UAAQ,IAAc;YAIpB,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,EAAE;gBAChC,OAAO;aACR;YAED,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;gBACvB,OAAO;aACR;YAED,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YAEnB,IAAI,CAAC,aAAa,EAAE,CAAC;YAErB,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE;gBACzB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBAChC,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;gBAC7B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACvB,IAAI,CAAC,mBAAmB,EAAE,CAAC;aAC5B;YAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAEpB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;;YAGpB,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;YAC5B,OAAO,EAAE,EAAE;gBACT,IAAM,GAAG,GAAG,EAAE,CAAC;gBACf,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;gBACb,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;aAC1C;YACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;;YAG1B,IAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;YAC7C,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;gBAChD,IAAM,UAAU,GAAG,CAAC,CAAC,YAAY,CAAC;gBAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,EAAE,CAAC,EAAE;oBACnC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;iBAC/C;aACF;SACF;QAED,uBAAQ,GAAR;YACE,OAAO,IAAI,CAAC,YAAY,CAAC;SAC1B;;;;QAKD,wBAAS,GAAT,UAAU,IAAa;YACrB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC;SAC5B;QAED,gCAAiB,GAAjB;YACE,OAAO,IAAI,CAAC,eAAe,CAAC;SAC7B;QAED,iCAAkB,GAAlB,UAAmB,IAAa;YAC9B,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC;YAC9B,IAAI,IAAI,CAAC,eAAe,IAAI,KAAK,EAAE;gBACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACrB;SACF;QAED,sBAAO,GAAP;YACE,OAAO,IAAI,CAAC,WAAW,CAAC;SACzB;;;;;;QAOD,uBAAQ,GAAR,UAAS,IAAa;YACpB,IAAI,IAAI,EAAE;gBACR,IAAI,IAAI,CAAC,WAAW,IAAI,KAAK,EAAE;oBAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;oBACxB,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;iBACxB;aACF;iBAAM;gBACL,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;gBACvB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBAChC,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;gBAC7B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACvB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;aACrB;SACF;QAED,uBAAQ,GAAR;YACE,OAAO,IAAI,CAAC,YAAY,CAAC;SAC1B;;;;;;;;;;;;;;QAeD,wBAAS,GAAT,UAAU,IAAa;YAGrB,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE;gBAC7B,OAAO;aACR;YAED,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC;YAE3B,IAAI,IAAI,CAAC,YAAY,EAAE;;gBAErB,IAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;gBAC7C,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;oBAChD,CAAC,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;iBACxC;;aAGF;iBAAM;;gBAEL,IAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;gBAC7C,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;oBAChD,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;iBAC9B;;gBAGD,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;gBAC5B,OAAO,EAAE,EAAE;oBACT,IAAM,GAAG,GAAG,EAAE,CAAC;oBACf,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;oBACb,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;iBAC1C;gBACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;aAC3B;SACF;QAED,8BAAe,GAAf;YACE,OAAO,IAAI,CAAC,mBAAmB,CAAC;SACjC;;;;QAKD,+BAAgB,GAAhB,UAAiB,IAAa;YAC5B,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,EAAE;gBACpC,OAAO;aACR;YAED,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC;YAElC,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;YAE7B,IAAI,CAAC,aAAa,EAAE,CAAC;SACtB;;;;QAKD,2BAAY,GAAZ;YACE,OAAO,IAAI,CAAC,IAAI,CAAC;SAClB;;;;;;;;;QAUD,2BAAY,GAAZ,UAAa,QAAc,EAAE,KAAa;YAExC,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,EAAE;gBAChC,OAAO;aACR;YAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAErC,IAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;YAC7C,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;gBAChD,CAAC,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;aACjD;SACF;QAED,mCAAoB,GAApB;YACE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;SACzC;;;;QAKD,kCAAmB,GAAnB;YACE,IAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;YAEhC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAEjC,IAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;YAC7C,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;gBAChD,CAAC,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;aAC1C;SACF;;;;QAKD,sBAAO,GAAP,UAAQ,KAAa;;YAEnB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;SACzC;;;;QAKD,0BAAW,GAAX;YACE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;SACpB;QAED,0BAAW,GAAX,UAAY,CAAO;YACjB,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SACtC;;;;QAKD,uBAAQ,GAAR;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;SACvB;QAED,uBAAQ,GAAR,UAAS,KAAa;YACpB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;SACvC;;;;QAKD,6BAAc,GAAd;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;SACvB;;;;QAKD,6BAAc,GAAd;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;SACjC;;;;;;QAOD,gCAAiB,GAAjB;YACE,OAAO,IAAI,CAAC,gBAAgB,CAAC;SAC9B;;;;;;QAOD,8CAA+B,GAA/B,UAAgC,UAAgB;YAC9C,IAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAC7E,WAAW,CAAC,CAAC,CAAC;SACjB;;;;;;QAOD,8CAA+B,GAA/B,UAAgC,UAAgB;YAC9C,OAAO,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;SAC7E;;;;;;QAOD,gCAAiB,GAAjB,UAAkB,CAAO;YACvB,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE;gBACzB,OAAO;aACR;YACD,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE;gBACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACrB;YACD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SAClC;;;;;;QAOD,iCAAkB,GAAlB;YACE,OAAO,IAAI,CAAC,iBAAiB,CAAC;SAC/B;;;;;;QAOD,iCAAkB,GAAlB,UAAmB,CAAS;YAC1B,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE;gBACzB,OAAO;aACR;YACD,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE;gBACf,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACrB;YACD,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;SAC5B;QAED,+BAAgB,GAAhB;YACE,OAAO,IAAI,CAAC,eAAe,CAAC;SAC7B;QAED,+BAAgB,GAAhB,UAAiB,aAAqB;YACpC,IAAI,CAAC,eAAe,GAAG,aAAa,CAAC;SACtC;QAED,gCAAiB,GAAjB;YACE,OAAO,IAAI,CAAC,gBAAgB,CAAC;SAC9B;QAED,gCAAiB,GAAjB,UAAkB,cAAsB;YACtC,IAAI,CAAC,gBAAgB,GAAG,cAAc,CAAC;SACxC;QAED,8BAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,8BAAe,GAAf,UAAgB,KAAa;YAC3B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;SAC7B;;;;;;QAOD,sBAAO,GAAP;YACE,OAAO,IAAI,CAAC,MAAM,CAAC;SACpB;;;;;;QAOD,yBAAU,GAAV;YACE,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM;kBACzB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;SAClE;;;;QAKD,0BAAW,GAAX,UAAY,IAAc;YACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;YACxB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;SAC/C;;;;;;QAOD,4BAAa,GAAb;;YAEE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;YAClB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;YACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;YACf,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;YAClB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;;YAGnC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;gBACzC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACrC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBACjC,OAAO;aACR;;YAKD,IAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;gBAChD,IAAI,CAAC,CAAC,SAAS,IAAI,GAAG,EAAE;oBACtB,SAAS;iBACV;gBAED,IAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAChC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACxB,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC;gBAC7B,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACnD,IAAI,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC;aACxB;;YAGD,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE;gBACrB,IAAI,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;gBACnC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;aAEjC;iBAAM;;gBAEL,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;gBAClB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;aACtB;YAED,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,mBAAmB,IAAI,KAAK,EAAE;;gBAEvD,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBAE7D,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;aAE9B;iBAAM;gBACL,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;gBACf,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;aACnB;;YAGD,IAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;;YAGpD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAC1E,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;SAChC;;;;;;;;;QAUD,0BAAW,GAAX,UAAY,QAAkB;YAE5B,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,EAAE;gBAChC,OAAO;aACR;YAED,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE;gBAC1B,OAAO;aACR;YAED,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;YACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;YACf,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;YAElB,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC5B,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE;gBACtB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;aACnB;YAED,IAAI,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;YAEnC,IAAI,QAAQ,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,mBAAmB,IAAI,KAAK,EAAE;gBACzD,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM;sBAC/B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAE/C,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;aAC9B;;YAGD,IAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;;YAGxD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAC1E,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;SAChC;;;;;;;;;;QAWD,yBAAU,GAAV,UAAW,KAAW,EAAE,KAAW,EAAE,IAAoB;YAApB,qBAAA,EAAA,WAAoB;YACvD,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE;gBAC1B,OAAO;aACR;YACD,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,KAAK,EAAE;gBACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACrB;;YAED,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACxB,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;aAC7E;SACF;;;;;;;QAQD,iCAAkB,GAAlB,UAAmB,KAAW,EAAE,IAAoB;YAApB,qBAAA,EAAA,WAAoB;YAClD,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE;gBAC1B,OAAO;aACR;YACD,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,KAAK,EAAE;gBACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACrB;;YAED,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aACzB;SACF;;;;;;;;QASD,0BAAW,GAAX,UAAY,MAAc,EAAE,IAAoB;YAApB,qBAAA,EAAA,WAAoB;YAC9C,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE;gBAC1B,OAAO;aACR;YACD,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,KAAK,EAAE;gBACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACrB;;YAED,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC;aACzB;SACF;;;;;;;;;;QAWD,iCAAkB,GAAlB,UAAmB,OAAa,EAAE,KAAW,EAAE,IAAoB;YAApB,qBAAA,EAAA,WAAoB;YACjE,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE;gBAC1B,OAAO;aACR;YACD,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,KAAK,EAAE;gBACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACrB;;YAGD,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACtD,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;aACtG;SACF;;;;;;;QAQD,kCAAmB,GAAnB,UAAoB,OAAe,EAAE,IAAoB;YAApB,qBAAA,EAAA,WAAoB;YACvD,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE;gBAC1B,OAAO;aACR;YAED,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,KAAK,EAAE;gBACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACrB;;YAED,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;aACjD;SACF;;;;;QAMD,4BAAa,GAAb,UAAc,IAAU;;YAEtB,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE;gBACpD,OAAO,KAAK,CAAC;aACd;;YAED,KAAK,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE;gBAChD,IAAI,EAAE,CAAC,KAAK,IAAI,IAAI,EAAE;oBACpB,IAAI,EAAE,CAAC,KAAK,CAAC,kBAAkB,IAAI,KAAK,EAAE;wBACxC,OAAO,KAAK,CAAC;qBACd;iBACF;aACF;YACD,OAAO,IAAI,CAAC;SACb;;;;QAKD,0BAAW,GAAX,UAAY,OAAgB;YAG1B,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,EAAE;gBAChC,OAAO,IAAI,CAAC;aACb;YAED,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,IAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;gBAC7C,OAAO,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;aAC9C;YAED,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;YACpC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;;YAG7B,IAAI,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE;gBAC3B,IAAI,CAAC,aAAa,EAAE,CAAC;aACtB;;;YAID,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;YAEjC,OAAO,OAAO,CAAC;SAChB;;QAgBD,4BAAa,GAAb,UAAc,KAAK,EAAE,MAAO;YAG1B,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,EAAE;gBAChC,OAAO,IAAI,CAAC;aACb;YAED,IAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACjD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC1B,OAAO,OAAO,CAAC;SAChB;;;;;;;;;;;;QAaD,6BAAc,GAAd,UAAe,OAAgB;YAG7B,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,EAAE;gBAChC,OAAO;aACR;YAMD,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE;gBAClC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;aAGrC;iBAAM;gBACL,IAAI,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;gBAC9B,OAAO,IAAI,IAAI,IAAI,EAAE;oBACnB,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE;wBAC3B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;wBAE7B,MAAM;qBACP;oBACD,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;iBACpB;aACF;;YAMD,IAAI,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;YAC9B,OAAO,IAAI,EAAE;gBACX,IAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;gBACvB,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBAEjB,IAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;gBACjC,IAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;gBAEjC,IAAI,OAAO,IAAI,QAAQ,IAAI,OAAO,IAAI,QAAQ,EAAE;;;oBAG9C,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;iBAChC;aACF;YAED,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,IAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;gBAC7C,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;aACpC;YAED,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YACtB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YAEtB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;;YAGhD,IAAI,CAAC,aAAa,EAAE,CAAC;SACtB;;;;QAKD,4BAAa,GAAb,UAAc,UAAgB;YAC5B,OAAO,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;SACjD;;;;QAKD,6BAAc,GAAd,UAAe,WAAiB;YAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;SAC9C;;;;QAKD,4BAAa,GAAb,UAAc,UAAgB;YAC5B,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;SAClD;;;;QAKD,6BAAc,GAAd,UAAe,WAAiB;YAC9B,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;SAC/C;;;;;;;;QAj/Be,WAAM,GAAa,QAAQ,CAAC;;;;;;;;QAQ5B,cAAS,GAAa,WAAW,CAAC;;;;;;;;QASlC,YAAO,GAAa,SAAS,CAAC;QAi+BhD,WAAC;KA1/BD;;ICnJA;;;;;;;;;;;;;;;;;;;;;;;IAgCA;;;;;QAWE,eAAY,CAAE,EAAE,CAAE,EAAE,CAAE,EAAE,CAAE;YACxB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE;gBACvC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACxB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACzB;iBAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBAChC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAC1B;iBAAM;gBACL,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACtB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;aACvB;SACF;;QAGD,wBAAQ,GAAR;YACE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SAC7B;QAEM,aAAO,GAAd,UAAe,GAAQ;YACrB,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;gBAC9C,OAAO,KAAK,CAAC;aACd;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;SACrD;QAEM,YAAM,GAAb,UAAc,CAAM;YACJ,OAAO;SAKtB;;QAMD,mBAAG,GAAH,UAAI,CAAC,EAAE,CAAE,EAAE,CAAE,EAAE,CAAE;YACf,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;mBACtE,OAAO,CAAC,KAAK,QAAQ,EAAE;gBAC1B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrB,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAEtB;iBAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBACzD,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACnB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;aAEpB;iBAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBAEhC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACtB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAEvB;iBAAM,CAEN;SACF;QAED,2BAAW,GAAX;YACE,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;YAChB,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;YAChB,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;YAChB,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;SACjB;QAED,uBAAO,GAAP;YACE,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;YAChB,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;YAChB,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;YAChB,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;SACjB;QAED,0BAAU,GAAV;YACE,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,GAAG,KAAK,GAAG,EAAE;gBACf,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;aACjB;YACD,IAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;YACpB,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;YACpB,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;YACnB,OAAO,GAAG,CAAC;SACZ;;;;;QAMD,qBAAK,GAAL,UAAM,CAAO;YAEX,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,GAAG,KAAK,GAAG,EAAE;gBACf,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;aACjB;YACD,IAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,OAAO,CAAC,CAAC;SACV;;QASM,SAAG,GAAV,UAAW,EAAE,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;gBAE7B,IAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACxC,IAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACxC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAEvB;iBAAM,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE;;gBAGtC,IAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9C,IAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9C,IAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9C,IAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9C,OAAO,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;aAC9B;SAGF;QAEM,aAAO,GAAd,UAAe,EAAS,EAAE,CAAO;YAE/B,IAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxC,IAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACvB;QAEM,cAAQ,GAAf,UAAgB,EAAS,EAAE,CAAQ;;YAGjC,IAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9C,IAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9C,IAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9C,IAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9C,OAAO,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SAC9B;;QAUM,UAAI,GAAX,UAAY,EAAE,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;gBAE7B,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;aAEzD;iBAAM,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE;gBAEtC,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAClE,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAClE,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;aAC1B;SAGF;QAEM,cAAQ,GAAf,UAAgB,EAAS,EAAE,CAAO;YAGhC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SACzD;QAEM,eAAS,GAAhB,UAAiB,EAAS,EAAE,CAAQ;YAGlC,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClE,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClE,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;SAC1B;QAEM,SAAG,GAAV,UAAW,EAAS;YAElB,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SACpD;QAEM,SAAG,GAAV,UAAW,GAAU,EAAE,GAAU;YAG/B,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;SACtE;QACH,YAAC;IAAD,CAAC;;IClPD;;;;;;;;;;;;;;;;;;;;;;;IA6BA,IAAY,YAIX;IAJD,WAAY,YAAY;QACtB,yDAAa,CAAA;QACb,qDAAW,CAAA;QACX,qDAAW,CAAA;IACb,CAAC,EAJW,YAAY,KAAZ,YAAY,QAIvB;IAED,IAAY,kBAGX;IAHD,WAAY,kBAAkB;QAC5B,mEAAY,CAAA;QACZ,+DAAU,CAAA;IACZ,CAAC,EAHW,kBAAkB,KAAlB,kBAAkB,QAG7B;IAED;;;IAGC,IAAY,UASZ;IATA,WAAY,UAAU;;QAErB,qDAAa,CAAA;;QAEb,mDAAY,CAAA;;QAEZ,2DAAgB,CAAA;;QAEhB,yDAAe,CAAA;IACjB,CAAC,EATY,UAAU,KAAV,UAAU,QAStB;IAED;;;IAGC;QAAA;YACC,MAAC,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,OAAE,GAAc,IAAI,SAAS,EAAE,CAAC;SAMjC;QAJC,wBAAG,GAAH,UAAI,CAAa;YACf,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACnB;QACH,iBAAC;IAAD,CAAC,IAAA;IAED;;;;;;;;;;;;;;;;;;;;;;;;;QAwBA;YAEE,gBAAW,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,eAAU,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,WAAM,GAAoB,CAAE,IAAI,aAAa,EAAE,EAAE,IAAI,aAAa,EAAE,CAAE,CAAC;YACvE,eAAU,GAAW,CAAC,CAAC;SAmFxB;;;;;;QA5EC,mCAAgB,GAAhB,UAAiB,EAA6B,EAAE,GAAc,EAAE,OAAe,EAAE,GAAc,EAAE,OAAe;YAC9G,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE;gBACxB,OAAO;aACR;YAED,EAAE,GAAG,EAAE,IAAI,IAAI,aAAa,EAAE,CAAC;YAE/B,IAAI,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;YACvB,IAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;YACzB,IAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC;;YAGnC,QAAQ,IAAI,CAAC,IAAI;gBACf,KAAK,YAAY,CAAC,SAAS,EAAE;oBAC3B,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;oBAC5B,IAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;oBACvD,IAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;oBACjE,IAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBACtC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAGA,MAAI,CAAC,OAAO,GAAGA,MAAI,CAAC,OAAO,EAAE;wBAC1D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;wBACrB,MAAM,CAAC,SAAS,EAAE,CAAC;qBACpB;oBACD,IAAM,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBAClD,IAAM,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBACnD,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC7B,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;oBACpD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;oBAClB,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;oBACvB,MAAM;iBACP;gBAED,KAAK,YAAY,CAAC,OAAO,EAAE;oBACzB,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;oBAC9C,IAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;oBAE3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE;wBACxC,IAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;wBACpE,IAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;wBAC7G,IAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;wBACzD,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC7B,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;qBACrD;oBACD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;oBAChC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;oBACrC,MAAM;iBACP;gBAED,KAAK,YAAY,CAAC,OAAO,EAAE;oBACzB,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;oBAC9C,IAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;oBAE3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE;wBACxC,IAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;wBACpE,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;wBAC3G,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;wBACxD,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC7B,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;qBACrD;oBACD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;oBAChC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;;oBAErC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBACf,MAAM;iBACP;aACF;YAED,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC;YACnB,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC;YACnB,EAAE,CAAC,WAAW,GAAG,WAAW,CAAC;YAC7B,OAAO,EAAE,CAAC;SACX;QAEM,0BAAiB,GAAG,iBAAiB,CAAC;QACtC,mBAAU,GAAG,UAAU,CAAC;QACxB,uBAAc,GAAG,cAAc,CAAC;QAChC,mBAAU,GAAG,UAAU,CAAC;QACjC,eAAC;KAxFD,IAwFC;IAED;;;;;;;;;IASA;QAAA;;;;;;;YAOE,eAAU,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;;;;YAI/B,kBAAa,GAAW,CAAC,CAAC;;;;YAI1B,mBAAc,GAAW,CAAC,CAAC;;;;YAI3B,OAAE,GAAc,IAAI,SAAS,EAAE,CAAC;SACjC;QAAD,oBAAC;IAAD,CAAC,IAAA;IAED;;;IAGA;QAAA;YACE,OAAE,GAAmB,IAAI,cAAc,EAAE,CAAC;SAa3C;QARC,sBAAI,0BAAG;;;;iBAAP;gBACE,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC;aACtF;;;WAAA;QAED,uBAAG,GAAH,UAAI,CAAY;;YAEd,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACnB;QACH,gBAAC;IAAD,CAAC,IAAA;IAED;;;IAGA;QAAA;SAuBC;QANC,4BAAG,GAAH,UAAI,CAAiB;YACnB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;YACvB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YACrB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACtB;QACH,qBAAC;IAAD,CAAC,IAAA;IAED;;;IAGA;QAAA;;;;YAQE,WAAM,GAAW,EAAE,CAAC;;;;YAIpB,gBAAW,GAAa,EAAE,CAAC;SAC5B;QAAD,oBAAC;IAAD,CAAC,IAAA;IAED;;;;;aAKgB,cAAc,CAC5B,MAAoB,EACpB,MAAoB,EACpB,SAAmB,EACnB,SAAmB;;;;;;;QAUnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE;YAC7C,IAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAElC,MAAM,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,WAAW,CAAC;YAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE;gBAC7C,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,EAAE;oBACxC,MAAM,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;oBACpC,MAAM;iBACP;aACF;SACF;;QAGD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE;YAC7C,IAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAElC,MAAM,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC;YAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE;gBAC7C,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,EAAE;oBACxC,MAAM,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;oBACpC,MAAM;iBACP;aACF;SACF;IACH,CAAC;IAED;;;aAGgB,iBAAiB,CAC/B,IAAkB,EAClB,GAAiB,EACjB,MAAY,EACZ,MAAc,EACd,YAAoB;;QAGpB,IAAI,MAAM,GAAG,CAAC,CAAC;;QAGf,IAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QACtD,IAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;;QAGtD,IAAI,SAAS,IAAI,GAAG;YAClB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,SAAS,IAAI,GAAG;YAClB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;;QAG7B,IAAI,SAAS,GAAG,SAAS,GAAG,GAAG,EAAE;;YAE/B,IAAM,MAAM,GAAG,SAAS,IAAI,SAAS,GAAG,SAAS,CAAC,CAAC;YACnD,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;YAGlE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,YAAY,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC;YACrD,EAAE,MAAM,CAAC;SACV;QAED,OAAO,MAAM,CAAC;IAChB;;AC1WA,kBAAe;QACb,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,CAAC;QACX,WAAW,EAAE,CAAC;QAEd,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,CAAC;QACb,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,CAAC;QACX,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,CAAC;QAElB,QAAQ,EAAR,UAAS,OAAgB;YACvB,OAAO,GAAG,OAAO,OAAO,KAAK,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC;YACvD,IAAI,MAAM,GAAG,EAAE,CAAC;;YAEhB,KAAK,IAAM,MAAI,IAAI,IAAI,EAAE;gBACvB,IAAI,OAAO,IAAI,CAAC,MAAI,CAAC,KAAK,UAAU,IAAI,OAAO,IAAI,CAAC,MAAI,CAAC,KAAK,QAAQ,EAAE;oBACtE,MAAM,IAAI,MAAI,GAAG,IAAI,GAAG,IAAI,CAAC,MAAI,CAAC,GAAG,OAAO,CAAC;iBAC9C;aACF;YACD,OAAO,MAAM,CAAC;SACf;KACF;;ICxBD;;;;;;;;;;;;;;;;;;;;;;;IAsCA;;;AAIAC,WAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;AACnBA,WAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;AACnBA,WAAK,CAAC,WAAW,GAAG,CAAC,CAAC;IAEtB;;;;IAIA;QAAA;YACE,WAAM,GAAkB,IAAI,aAAa,EAAE,CAAC;YAC5C,WAAM,GAAkB,IAAI,aAAa,EAAE,CAAC;YAC5C,eAAU,GAAqB,IAAI,CAAC;YACpC,eAAU,GAAqB,IAAI,CAAC;YACpC,aAAQ,GAAY,KAAK,CAAC;SAC3B;QAAD,oBAAC;IAAD,CAAC,IAAA;IAED;;;;;;;;IAQA;QAAA;YACE,WAAM,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,WAAM,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;SAG5B;QAAD,qBAAC;IAAD,CAAC,IAAA;IAED;;;;;;;;IAQA;QAAA;YACE,WAAM,GAAW,CAAC,CAAC;YACnB,WAAM,GAAa,EAAE,CAAC;YACtB,WAAM,GAAa,EAAE,CAAC;YACtB,UAAK,GAAW,CAAC,CAAC;SACnB;QAAD,mBAAC;IAAD,CAAC,IAAA;IAED;;;;;aAKwB,QAAQ,CAAC,MAAsB,EAAE,KAAmB,EAAE,KAAoB;QAChG,EAAEA,OAAK,CAAC,QAAQ,CAAC;QAEjB,IAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,IAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,IAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC;QAC7B,IAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC;;QAG7B,IAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC9B,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;;QAGnD,IAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;QAC7B,IAAM,UAAU,GAAG,QAAQ,CAAC,oBAAoB,CAAC;;;QAIjD,IAAM,KAAK,GAAG,EAAE,CAAC;QACjB,IAAM,KAAK,GAAG,EAAE,CAAC;QACjB,IAAI,SAAS,GAAG,CAAC,CAAC;;QAMlB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,OAAO,IAAI,GAAG,UAAU,EAAE;;YAExB,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC,EAAE;gBAClC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC9B,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;aAC/B;YAED,OAAO,CAAC,KAAK,EAAE,CAAC;;YAGhB,IAAI,OAAO,CAAC,OAAO,KAAK,CAAC,EAAE;gBACzB,MAAM;aACP;;YAGD,IAAM,CAAC,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;YACrB,CAAC,CAAC,aAAa,EAAE,CAAC;;YASjC,IAAM,CAAC,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;;YAGvC,IAAI,CAAC,CAAC,aAAa,EAAE,GAAGD,MAAI,CAAC,OAAO,GAAGA,MAAI,CAAC,OAAO,EAAE;;;;;;gBAOnD,MAAM;aACP;;YAGD,IAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAEzC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpE,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAEpE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAEpE,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;;YAG1C,EAAE,IAAI,CAAC;YACP,EAAEC,OAAK,CAAC,QAAQ,CAAC;;;YAIjB,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC,EAAE;gBAClC,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE;oBAC5D,SAAS,GAAG,IAAI,CAAC;oBACjB,MAAM;iBACP;aACF;;YAGD,IAAI,SAAS,EAAE;gBACb,MAAM;aACP;;YAGD,EAAE,OAAO,CAAC,OAAO,CAAC;SACnB;QAEDA,OAAK,CAAC,WAAW,GAAGD,MAAI,CAAC,GAAG,CAACC,OAAK,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;;QAGtD,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;;QAGzB,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;;QAG1B,IAAI,KAAK,CAAC,QAAQ,EAAE;YAClB,IAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC3B,IAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;YAE3B,IAAI,MAAM,CAAC,QAAQ,GAAG,EAAE,GAAG,EAAE,IAAI,MAAM,CAAC,QAAQ,GAAGD,MAAI,CAAC,OAAO,EAAE;;;gBAG/D,MAAM,CAAC,QAAQ,IAAI,EAAE,GAAG,EAAE,CAAC;gBAC3B,IAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBACtD,MAAM,CAAC,SAAS,EAAE,CAAC;gBACnB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;aAClC;iBAAM;;;gBAGL,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBACjD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACzB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACzB,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC;aACvB;SACF;IACH,CAAC;IAED;;;IAGA;QAOE;YACE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YACjB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;SACnB;;;;QAKD,sCAAc,GAAd;YACE,OAAO,IAAI,CAAC,OAAO,CAAC;SACrB;;;;QAKD,iCAAS,GAAT,UAAU,KAAa;YAErB,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;SAC/B;;;;QAKD,kCAAU,GAAV,UAAW,CAAO;YAChB,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE;gBACrC,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9C,IAAI,KAAK,GAAG,SAAS,EAAE;oBACrB,SAAS,GAAG,CAAC,CAAC;oBACd,SAAS,GAAG,KAAK,CAAC;iBACnB;aACF;YACD,OAAO,SAAS,CAAC;SAClB;;;;QAKD,wCAAgB,GAAhB,UAAiB,CAAO;YACtB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;SAC5C;;;;;QAMD,2BAAG,GAAH,UAAI,KAAY,EAAE,KAAa;YAG7B,KAAK,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;SACzC;QACH,oBAAC;IAAD,CAAC,IAAA;IAED;QAAA;;YAEE,OAAE,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;;YAKvB,OAAE,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;;YAKvB,MAAC,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;SAYvB;QARC,2BAAG,GAAH,UAAI,CAAgB;YAClB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;YACvB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;YACvB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACd;QACH,oBAAC;IAAD,CAAC,IAAA;IAED;QAOE;YACE,IAAI,CAAC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,IAAI,CAAC,GAAG,GAAG,CAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAE,CAAC;YAC/C,IAAI,CAAC,OAAO,CAAC;SACd;;QAGD,0BAAQ,GAAR;YACE,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE;gBACtB,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO;oBACxB,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC3E,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC3E,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;iBAC5E,CAAC,QAAQ,EAAE,CAAC;aAEd;iBAAM,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE;gBAC7B,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO;oBACxB,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC3E,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;iBAC5E,CAAC,QAAQ,EAAE,CAAC;aAEd;iBAAM,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE;gBAC7B,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO;oBACxB,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;iBAC5E,CAAC,QAAQ,EAAE,CAAC;aAEd;iBAAM;gBACL,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;aAC3B;SACF;QAED,2BAAS,GAAT,UAAU,KAAmB,EAAE,MAAqB,EAAE,UAAqB,EAAE,MAAqB,EAAE,UAAqB;;YAIvH,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE;gBACrC,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACtB,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC3B,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC3B,IAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC3C,IAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC3C,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC9C,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC9C,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC3B,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;aACX;;;YAID,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE;gBACpB,IAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC7B,IAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;gBACjC,IAAI,OAAO,GAAG,GAAG,GAAG,OAAO,IAAI,GAAG,GAAG,OAAO,GAAG,OAAO;uBACjD,OAAO,GAAGA,MAAI,CAAC,OAAO,EAAE;;oBAE3B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;iBAClB;aACF;;YAGD,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE;gBACtB,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACtB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBACb,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBACb,IAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACpC,IAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACpC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC9C,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC9C,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC3B,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;gBACV,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;aAClB;SACF;QAED,4BAAU,GAAV,UAAW,KAAmB;YAC5B,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE;gBACrC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACrC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;aACtC;SACF;QAED,oCAAkB,GAAlB;YACE,QAAQ,IAAI,CAAC,OAAO;gBAClB,KAAK,CAAC;oBACJ,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAE/B,KAAK,CAAC,EAAE;oBACN,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAC/C,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC3D,IAAI,GAAG,GAAG,GAAG,EAAE;;wBAEb,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;qBACpC;yBAAM;;wBAEL,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;qBACpC;iBACF;gBAED;oBAEE,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;aACtB;SACF;QAED,iCAAe,GAAf;YACE,QAAQ,IAAI,CAAC,OAAO;gBAClB,KAAK,CAAC;oBAEJ,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;gBAErB,KAAK,CAAC;oBACJ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAEjC,KAAK,CAAC;oBACJ,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAE1E,KAAK,CAAC;oBACJ,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;gBAErB;oBAEE,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;aACtB;SACF;QAED,kCAAgB,GAAhB,UAAiB,EAAQ,EAAE,EAAQ;YACjC,QAAQ,IAAI,CAAC,OAAO;gBAClB,KAAK,CAAC;oBAEJ,MAAM;gBAER,KAAK,CAAC;oBACJ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACzB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACzB,MAAM;gBAER,KAAK,CAAC;oBACJ,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACpE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACpE,MAAM;gBAER,KAAK,CAAC;oBACJ,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACpE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACrC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACf,MAAM;aAKT;SACF;QAED,2BAAS,GAAT;YACE,QAAQ,IAAI,CAAC,OAAO;gBAClB,KAAK,CAAC;oBAEJ,OAAO,GAAG,CAAC;gBAEb,KAAK,CAAC;oBACJ,OAAO,GAAG,CAAC;gBAEb,KAAK,CAAC;oBACJ,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAEjD,KAAK,CAAC;oBACJ,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAChF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAElB;oBAEE,OAAO,GAAG,CAAC;aACd;SACF;QAED,uBAAK,GAAL;YACE,QAAQ,IAAI,CAAC,OAAO;gBAClB,KAAK,CAAC;oBACJ,MAAM;gBAER,KAAK,CAAC;oBACJ,IAAI,CAAC,MAAM,EAAE,CAAC;oBACd,MAAM;gBAER,KAAK,CAAC;oBACJ,IAAI,CAAC,MAAM,EAAE,CAAC;oBACd,MAAM;aAIT;SACF;;;;;;;;;;;;;;;;;;;;;;;;QAyBD,wBAAM,GAAN;YACE,IAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACvB,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;;YAG7B,IAAM,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACjC,IAAI,KAAK,IAAI,GAAG,EAAE;;gBAEhB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;gBAClB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;gBACjB,OAAO;aACR;;YAGD,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAChC,IAAI,KAAK,IAAI,GAAG,EAAE;;gBAEhB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;gBAClB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzB,OAAO;aACR;;YAGD,IAAM,OAAO,GAAG,GAAG,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC;YAC9B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;SAClB;;;;;;QAOD,wBAAM,GAAN;YACE,IAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;;;;;YAMvB,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC7B,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAChC,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAChC,IAAM,KAAK,GAAG,KAAK,CAAC;YACpB,IAAM,KAAK,GAAG,CAAC,KAAK,CAAC;;;;;YAMrB,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC7B,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAChC,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAChC,IAAM,KAAK,GAAG,KAAK,CAAC;YACpB,IAAM,KAAK,GAAG,CAAC,KAAK,CAAC;;;;;YAMrB,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC7B,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAChC,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAChC,IAAM,KAAK,GAAG,KAAK,CAAC;YACpB,IAAM,KAAK,GAAG,CAAC,KAAK,CAAC;;YAGrB,IAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAE1C,IAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACjD,IAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACjD,IAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;;YAGjD,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,EAAE;gBAChC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;gBAClB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;gBACjB,OAAO;aACR;;YAGD,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE;gBAC/C,IAAM,OAAO,GAAG,GAAG,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;gBACtC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC;gBAC9B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;gBACjB,OAAO;aACR;;YAGD,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE;gBAC/C,IAAM,OAAO,GAAG,GAAG,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;gBACtC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC;gBAC9B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzB,OAAO;aACR;;YAGD,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,EAAE;gBAChC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;gBAClB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzB,OAAO;aACR;;YAGD,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,EAAE;gBAChC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;gBAClB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzB,OAAO;aACR;;YAGD,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE;gBAC/C,IAAM,OAAO,GAAG,GAAG,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;gBACtC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC;gBAC9B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzB,OAAO;aACR;;YAGD,IAAM,QAAQ,GAAG,GAAG,IAAI,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC;YAChC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;SAClB;QACH,cAAC;IAAD,CAAC,IAAA;IAGD;;;aAGgB,WAAW,CAAC,MAAa,EAAE,MAAc,EAAE,MAAa,EAAE,MAAc,EAAE,GAAc,EAAE,GAAc;QACtH,IAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;QAClC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC;QACvB,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC;QACvB,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QAEtB,IAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;QACjC,IAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QAEpC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAE/B,OAAO,MAAM,CAAC,QAAQ,GAAG,IAAI,GAAGA,MAAI,CAAC,OAAO,CAAC;IAC/C;;IChsBA;;;;;;;;;;;;;;;;;;;;;;;IA4CA;;;;;;;;;;;IAWA;QAKE,qBAAY,OAAgB;YAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;SACxB;QACH,kBAAC;IAAD,CAAC,IAAA;IAuBD;;;;aAIgB,WAAW,CAAC,SAAiB,EAAE,SAAiB;QAC9D,OAAOA,MAAI,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED;;;;aAIgB,cAAc,CAAC,YAAoB,EAAE,YAAoB;QACvE,OAAO,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;IACnE,CAAC;IAED;IACA,IAAM,WAAW,GAAG,EAAE,CAAC;IAEvB;IACA;QAAA;YACE,OAAE,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;YACvB,OAAE,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;YACvB,kBAAa,GAAW,CAAC,CAAC;YAC1B,mBAAc,GAAW,CAAC,CAAC;YAC3B,eAAU,GAAW,CAAC,CAAC;YACvB,gBAAW,GAAW,CAAC,CAAC;YACxB,iBAAY,GAAW,CAAC,CAAC;SAC1B;QAAD,8BAAC;IAAD,CAAC,IAAA;IAED;;;;;;QAiFE,iBAAY,EAAW,EAAE,MAAc,EAAE,EAAW,EAAE,MAAc,EAAE,WAA6B;;YA5DnG,eAAU,GAAa,IAAI,QAAQ,EAAE,CAAC;;YAEtC,WAAM,GAAmB,IAAI,CAAC;;YAE9B,WAAM,GAAmB,IAAI,CAAC;;YAE9B,UAAK,GAAW,GAAG,CAAC;;YAEpB,eAAU,GAAW,CAAC,CAAC;;YAEvB,cAAS,GAAY,KAAK,CAAC;;YAM3B,mBAAc,GAAW,GAAG,CAAC;;YAE7B,kBAAa,GAAY,IAAI,CAAC;;YAE9B,iBAAY,GAAY,KAAK,CAAC;;YAE9B,mBAAc,GAAY,KAAK,CAAC;;YAEhC,iBAAY,GAAY,KAAK,CAAC;;YAE9B,oBAAe,GAAY,KAAK,CAAC;;YAGjC,cAAS,GAAmB,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;;6BAGpC,aAAQ,GAA8B,EAAE,CAAC;6BACzC,aAAQ,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;6BAC7B,iBAAY,GAAU,IAAI,KAAK,EAAE,CAAC;6BAClC,QAAG,GAAU,IAAI,KAAK,EAAE,CAAC;;6BAWzB,kBAAa,GAAW,EAAE,CAAC;6BAC3B,kBAAa,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;6BAClC,iBAAY,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;6BACjC,mBAAc,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;6BACnC,mBAAc,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;;YAYlD,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;YAErC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YAErB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;YACvB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;YAEvB,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;YAEjC,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACtF,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;SACnG;QAED,gCAAc,GAAd,UAAe,IAAc;YAC3B,IAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;YACjC,IAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;YAEjC,IAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACnC,IAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAEnC,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YACjC,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YAEjC,IAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAEpC,IAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;YAGvC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC;YAClC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC;YAClC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;YAE5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YACxC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;YAE1C,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC;YAE/B,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACnB,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YAE5B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC;YAClC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC;YAClC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;YAC5B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC5D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAE5D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;YACjC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;YAEjC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACpD,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC;YAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,EAAE,CAAC,EAAE;gBACnC,IAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC9B,IAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,uBAAuB,EAAE,CAAC;gBAE7D,IAAI,IAAI,CAAC,YAAY,EAAE;oBACrB,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC;oBACpD,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,cAAc,CAAC;iBAEvD;qBAAM;oBACL,GAAG,CAAC,aAAa,GAAG,GAAG,CAAC;oBACxB,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;iBAC1B;gBAED,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;gBACjB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;gBACjB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC;gBACtB,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC;gBAEvB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;aAEnD;SACF;;;;;QAMD,6BAAW,GAAX;YACE,OAAO,IAAI,CAAC,UAAU,CAAC;SACxB;;;;QAKD,kCAAgB,GAAhB,UAAiB,aAA+C;YAC9D,IAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxC,IAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxC,IAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC1C,IAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YAE1C,OAAO,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,EAAE,EACzE,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;SAC3D;;;;;;QAOD,4BAAU,GAAV,UAAW,IAAa;YACtB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC;SAC7B;;;;QAKD,2BAAS,GAAT;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;;;;QAKD,4BAAU,GAAV;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,yBAAO,GAAP;YACE,OAAO,IAAI,CAAC,MAAM,CAAC;SACpB;;;;QAKD,6BAAW,GAAX;YACE,OAAO,IAAI,CAAC,UAAU,CAAC;SACxB;;;;QAKD,6BAAW,GAAX;YACE,OAAO,IAAI,CAAC,UAAU,CAAC;SACxB;;;;QAKD,gCAAc,GAAd;YACE,OAAO,IAAI,CAAC,QAAQ,CAAC;SACtB;;;;QAKD,gCAAc,GAAd;YACE,OAAO,IAAI,CAAC,QAAQ,CAAC;SACtB;;;;QAKD,kCAAgB,GAAhB;YACE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;SAC1B;;;;;QAMD,6BAAW,GAAX,UAAY,QAAgB;YAC1B,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;SAC5B;;;;QAKD,6BAAW,GAAX;YACE,OAAO,IAAI,CAAC,UAAU,CAAC;SACxB;;;;QAKD,+BAAa,GAAb;YACE,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EACtD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;SAC/B;;;;;QAMD,gCAAc,GAAd,UAAe,WAAmB;YAChC,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;SAClC;;;;QAKD,gCAAc,GAAd;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;;;;QAKD,kCAAgB,GAAhB;YACE,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAC/D,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;SAClC;;;;;QAMD,iCAAe,GAAf,UAAgB,KAAa;YAC3B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;SAC7B;;;;QAKD,iCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,0BAAQ,GAAR,UAAS,QAAkB,EAAE,GAAc,EAAE,GAAc;YACzD,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EACnE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SACnC;;;;;;;;;;QAWD,wBAAM,GAAN,UAAO,QAIN;;YAGC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAE1B,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC;YAExC,IAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC3C,IAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC3C,IAAM,MAAM,GAAG,OAAO,IAAI,OAAO,CAAC;YAElC,IAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxC,IAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxC,IAAM,GAAG,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;YACjC,IAAM,GAAG,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;YAEjC,IAAI,WAAW,CAAC;;YAGhB,IAAI,MAAM,EAAE;gBACV,IAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;gBAC1C,IAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;gBAC1C,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;;gBAG/E,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC;aAChC;iBAAM;;gBAGL,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC;gBAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAEjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBACzC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC;;;gBAI1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE;oBACnD,IAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACtC,GAAG,CAAC,aAAa,GAAG,GAAG,CAAC;oBACxB,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;oBAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE;wBAC/C,IAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;wBAClC,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE;4BAC5B,GAAG,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;4BACtC,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,CAAC;4BACxC,MAAM;yBACP;qBACF;iBACF;gBAED,IAAI,QAAQ,IAAI,WAAW,EAAE;oBAC3B,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBACrB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;iBACtB;aACF;YAED,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;YAE/B,IAAI,CAAC,WAAW,IAAI,QAAQ,IAAI,QAAQ,EAAE;gBACxC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;aAC7B;YAED,IAAI,WAAW,IAAI,CAAC,QAAQ,IAAI,QAAQ,EAAE;gBACxC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;aAC3B;YAED,IAAI,CAAC,MAAM,IAAI,QAAQ,IAAI,QAAQ,EAAE;gBACnC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;aACtC;SACF;QAED,yCAAuB,GAAvB,UAAwB,IAAc;YACpC,OAAO,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;SAC5C;QAED,4CAA0B,GAA1B,UAA2B,IAAc,EAAE,IAAU,EAAE,IAAU;YAC/D,OAAO,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;SACxD;QAEO,0CAAwB,GAAhC,UAAiC,IAAc,EAAE,IAAW,EAAE,IAAW;YACvE,IAAM,GAAG,GAAY,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC;YAEtC,IAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;YACjC,IAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;YAEjC,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YACjC,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YAEf,KAAK,CAAC,WAAW;YACjB,KAAK,CAAC,WAAW;YACnC,IAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;YACnC,IAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;YAEnC,IAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACrD,IAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAErD,IAAI,EAAE,GAAG,GAAG,CAAC;YACb,IAAI,EAAE,GAAG,GAAG,CAAC;YACb,IAAI,CAAC,GAAG,KAAK,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE;gBAC5C,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;gBACrB,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;aACnB;YAED,IAAI,EAAE,GAAG,GAAG,CAAC;YACb,IAAI,EAAE,GAAG,GAAG,CAAC;YACb,IAAI,CAAC,GAAG,KAAK,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE;gBAC5C,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;gBACrB,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;aACnB;YAED,IAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;YAErB,IAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;YAErB,IAAI,aAAa,GAAG,GAAG,CAAC;;YAGxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE;gBAC1C,IAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACjC,IAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACjC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACnB,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACnB,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;gBACvD,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;;gBAGvD,IAAI,MAAM,SAAA,CAAC;gBACX,IAAI,KAAK,SAAA,CAAC;gBACV,IAAI,UAAU,SAAA,CAAC;gBACf,QAAQ,IAAI,CAAC,MAAM;oBACjB,KAAK,YAAY,CAAC,SAAS,EAAE;wBAC3B,IAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;wBACzD,IAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC7D,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;wBAClC,MAAM,CAAC,SAAS,EAAE,CAAC;wBACnB,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;wBAC/C,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;wBAC1F,MAAM;qBACP;oBAED,KAAK,YAAY,CAAC,OAAO,EAAE;wBACzB,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;wBAChD,IAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;wBAC7D,IAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;wBAChE,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;wBACjG,KAAK,GAAG,SAAS,CAAC;wBAClB,MAAM;qBACP;oBAED,KAAK,YAAY,CAAC,OAAO,EAAE;wBACzB,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;wBAChD,IAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;wBAC7D,IAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;wBAChE,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;wBACjG,KAAK,GAAG,SAAS,CAAC;;wBAGlB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;wBACf,MAAM;qBACP;iBACF;gBAED,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC/B,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;;gBAG/B,aAAa,GAAGA,MAAI,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;gBAEpD,IAAM,SAAS,GAAG,GAAG,GAAG,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC;gBAClE,IAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;gBACvC,IAAM,mBAAmB,GAAG,QAAQ,CAAC,mBAAmB,CAAC;;gBAGzD,IAAM,CAAC,GAAGA,MAAI,CAAC,KAAK,CAAC,SAAS,IAAI,UAAU,GAAG,UAAU,CAAC,EAAE,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;;gBAGvF,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC3C,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC3C,IAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;;gBAGpD,IAAM,OAAO,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;gBAEvC,IAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAE3C,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAErC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;aACtC;YAED,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC;YAEjB,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC;YAEjB,OAAO,aAAa,CAAC;SACtB;QAED,wCAAsB,GAAtB,UAAuB,IAAc;YACnC,IAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;YACjC,IAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;YAEjC,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YACjC,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YAEjC,IAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;YACnC,IAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;YAEnC,IAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;YACnC,IAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;YAEnC,IAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;YAC/B,IAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;YAC/B,IAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAEpC,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACrD,IAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAErD,IAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;YAEvB,IAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;YAIvB,IAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;YACjC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACnB,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACnB,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;YAC9D,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;YAE9D,IAAM,aAAa,GAAG,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;YAElF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE;gBAC1C,IAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAE7B,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACtD,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAEtD,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtD,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAEtD,IAAM,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;gBAE1D,GAAG,CAAC,UAAU,GAAG,OAAO,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC;gBAErD,IAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAEtD,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBAChD,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBAEhD,IAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;gBAE3D,GAAG,CAAC,WAAW,GAAG,QAAQ,GAAG,GAAG,GAAG,GAAG,GAAG,QAAQ,GAAG,GAAG,CAAC;;gBAGxD,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC;gBACvB,IAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;sBACpC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;sBACtD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;sBAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3D,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,iBAAiB,EAAE;oBACtC,GAAG,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;iBAC/C;aACF;;YAGD,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE;gBAC7C,IAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC9B,IAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAE9B,IAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACxD,IAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACxD,IAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACxD,IAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAExD,IAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;gBAC1D,IAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;gBAC1D,IAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;;gBAG1D,IAAM,oBAAoB,GAAG,MAAM,CAAC;gBACpC,IAAI,GAAG,GAAG,GAAG,GAAG,oBAAoB,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE;;oBAE9D,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;oBAC7B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;oBAC7B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;iBAC9C;qBAAM;;;oBAGL,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;iBACvB;aACF;YAED,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC;YACjB,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC;YAEjB,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC;YACjB,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC;SAClB;QAED,qCAAmB,GAAnB,UAAoB,IAAc;YAChC,IAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;YACjC,IAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;YAEjC,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YACjC,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YAEjC,IAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;YACnC,IAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;YACjB,KAAK,CAAC,WAAW;YACjB,KAAK,CAAC,WAAW;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAExB,IAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;YACrB,IAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;YAErB,IAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC7B,IAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE;gBAC1C,IAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAE7B,IAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;gBAC/E,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACzC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACzC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;aAClB;YAED,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC;YACjB,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC;SAClB;QAED,yCAAuB,GAAvB,UAAwB,IAAc;YACpC,IAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE;gBAC1C,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;gBAClE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;aACrE;SACF;QAED,yCAAuB,GAAvB,UAAwB,IAAc;YACpC,IAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YACrC,IAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAErC,IAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;YACjB,KAAK,CAAC,WAAW;YAEnC,IAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;YACjB,KAAK,CAAC,WAAW;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAExB,IAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;YACrB,IAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;YAErB,IAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC7B,IAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC/C,IAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;;;YAMjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE;gBAC1C,IAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;;gBAG7B,IAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACvB,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvD,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;;gBAGvD,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;gBACvD,IAAI,MAAM,GAAG,GAAG,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC,CAAC;;gBAGrC,IAAM,WAAW,GAAG,QAAQ,GAAG,GAAG,CAAC,aAAa,CAAC;gBACjD,IAAM,UAAU,GAAGA,MAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,GAAG,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBACtF,MAAM,GAAG,UAAU,GAAG,GAAG,CAAC,cAAc,CAAC;gBACzC,GAAG,CAAC,cAAc,GAAG,UAAU,CAAC;;gBAGhC,IAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAE3C,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAEzC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;aAC1C;;YAGD,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,IAAI,KAAK,EAAE;gBACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE;oBAC1C,IAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;;oBAG7B,IAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBACvB,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;oBACvD,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;;oBAGvD,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;oBAChC,IAAI,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC;;oBAGvD,IAAM,UAAU,GAAGA,MAAI,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC;oBAC7D,MAAM,GAAG,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC;oBACxC,GAAG,CAAC,aAAa,GAAG,UAAU,CAAC;;oBAG/B,IAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAE1C,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oBACjB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oBAEzC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oBACjB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;iBAC1C;aACF;iBAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA0CL,IAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC9B,IAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAE9B,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;;gBAI3D,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9G,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;;gBAG9G,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAChC,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAEhC,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;;gBAGrE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;;gBAKlC,OAAO,IAAI,EAAE;;;;;;;;;;oBAUX,IAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;oBAEpD,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;;wBAE5B,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;wBAGzB,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;wBACxC,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;wBAExC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC9B,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;wBAE/E,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC9B,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;;wBAG/E,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC;wBACzB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC;wBAczB,MAAM;qBACP;;;;;;;oBAQD,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC7B,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;oBACV,GAAG,GAAG,GAAG,CAAC;oBACV,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAEhC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE;;wBAE5B,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;wBAGzB,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;wBACxC,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;wBACxC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC9B,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;wBAE/E,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC9B,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;;wBAG/E,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC;wBACzB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC;wBAazB,MAAM;qBACP;;;;;;;oBAQD,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;oBACV,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC7B,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAChC,GAAG,GAAG,GAAG,CAAC;oBAEV,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE;;wBAE5B,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;wBAGzB,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;wBACxC,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;wBACxC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC9B,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;wBAE/E,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC9B,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;;wBAG/E,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC;wBACzB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC;wBAazB,MAAM;qBACP;;;;;;;oBAQD,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;oBACV,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;oBACV,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;oBACV,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;oBAEV,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE;;wBAE5B,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;wBAGzB,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;wBACxC,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;wBACxC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC9B,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;wBAE/E,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC9B,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;;wBAG/E,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC;wBACzB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC;wBAEzB,MAAM;qBACP;;;oBAID,MAAM;iBACP;aACF;YAED,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC;YAEjB,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC;SAClB;;;;QAKM,eAAO,GAAd,UAAe,KAAgB,EAAE,KAAgB,EAAE,QAAyB;YAC1E,WAAW,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC9C,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC;SACtC;;;;QAKM,cAAM,GAAb,UAAc,QAAiB,EAAE,MAAc,EAAE,QAAiB,EAAE,MAAc;YAChF,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YACjC,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;;YAGjC,IAAI,OAAO,CAAC;YACZ,IAAI,WAAW,CAAC;YAChB,IAAI,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE;gBACjE,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;aACxE;iBAAM,IAAI,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE;gBACxE,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;aACxE;iBAAM;gBACL,OAAO,IAAI,CAAC;aACb;;YAGD,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YACjC,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YACjC,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAClC,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAClC,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YACjC,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;;YAGjC,OAAO,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;YAClC,OAAO,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;YAE9B,OAAO,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YAC5B,OAAO,CAAC,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC;YAC3C,IAAI,KAAK,CAAC,aAAa,IAAI,IAAI,EAAE;gBAC/B,KAAK,CAAC,aAAa,CAAC,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;aAC5C;YACD,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;;YAGtC,OAAO,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;YAClC,OAAO,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;YAE9B,OAAO,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YAC5B,OAAO,CAAC,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC;YAC3C,IAAI,KAAK,CAAC,aAAa,IAAI,IAAI,EAAE;gBAC/B,KAAK,CAAC,aAAa,CAAC,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;aAC5C;YACD,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;;YAGtC,IAAI,QAAQ,CAAC,QAAQ,EAAE,IAAI,KAAK,IAAI,QAAQ,CAAC,QAAQ,EAAE,IAAI,KAAK,EAAE;gBAChE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACrB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtB;YAED,OAAO,OAAO,CAAC;SAChB;;;;QAKM,eAAO,GAAd,UAAe,OAAgB,EAAE,QAAoD;YACnF,IAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;YACpC,IAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;YAEpC,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YACjC,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YAEjC,IAAI,OAAO,CAAC,UAAU,EAAE,EAAE;gBACxB,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;aAC9B;;YAGD,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;gBACxB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;aAClD;YAED,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;gBACxB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;aAClD;YAED,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,aAAa,EAAE;gBAC1C,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;aAC5C;;YAGD,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;gBACxB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;aAClD;YAED,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;gBACxB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;aAClD;YAED,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,aAAa,EAAE;gBAC1C,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;aAC5C;YAED,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,IAAI,KAAK;mBAChE,QAAQ,CAAC,QAAQ,EAAE,IAAI,KAAK,EAAE;gBACjC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACrB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtB;YAEa,QAAQ,CAAC,OAAO,GAAG;YACnB,QAAQ,CAAC,OAAO,GAAG;;;;;SAMlC;QACH,cAAC;IAAD,CAAC;;IChvCD;;;;;;;;;;;;;;;;;;;;;;;IA+BA;;;;;;IAMA;QAAA;;;;YAIE,UAAK,GAAgB,IAAI,CAAC;;;;YAI1B,UAAK,GAAiB,IAAI,CAAC;;;;YAI3B,SAAI,GAAqB,IAAI,CAAC;;;;YAI9B,SAAI,GAAqB,IAAI,CAAC;SAC/B;QAAD,gBAAC;IAAD,CAAC,IAAA;IAmCD;;;;;QAwBE,eAAY,GAAwB,EAAE,KAAY,EAAE,KAAY;6BAlB/C,WAAM,GAAW,eAAe,CAAC;6BAOjC,WAAM,GAAiB,IAAI,CAAC;6BAC5B,WAAM,GAAiB,IAAI,CAAC;6BAE5B,YAAO,GAAc,IAAI,SAAS,EAAE,CAAC;6BACrC,YAAO,GAAc,IAAI,SAAS,EAAE,CAAC;6BAErC,iBAAY,GAAY,KAAK,CAAC;YAM7C,KAAK,GAAG,OAAO,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;YAC3C,KAAK,GAAG,OAAO,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;YAM3C,IAAI,CAAC,OAAO,GAAG,KAAM,CAAC;YACtB,IAAI,CAAC,OAAO,GAAG,KAAM,CAAC;YAEtB,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC;YACjD,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC;SAChC;;;;QAKD,wBAAQ,GAAR;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;SAC3D;;;;QAKD,uBAAO,GAAP;YACE,OAAO,IAAI,CAAC,MAAM,CAAC;SACpB;;;;QAKD,wBAAQ,GAAR;YACE,OAAO,IAAI,CAAC,OAAO,CAAC;SACrB;;;;QAKD,wBAAQ,GAAR;YACE,OAAO,IAAI,CAAC,OAAO,CAAC;SACrB;;;;QAKD,uBAAO,GAAP;YACE,OAAO,IAAI,CAAC,MAAM,CAAC;SACpB;QAED,2BAAW,GAAX;YACE,OAAO,IAAI,CAAC,UAAU,CAAC;SACxB;QAED,2BAAW,GAAX,UAAY,IAAa;YACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;SACxB;;;;;;QAOD,mCAAmB,GAAnB;YACE,OAAO,IAAI,CAAC,kBAAkB,CAAC;SAChC;;;;QAyBD,2BAAW,GAAX,UAAY,SAAe,KAAU;QAWvC,YAAC;IAAD,CAAC;;ICtNM,IAAM,GAAG,GAAG;QACjB,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC,CAAC;IAEK,IAAM,IAAI,GAAG,UAAS,IAAY;QACvC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAC3B,CAAC,CAAC;AAEF,gBAAe;QACb,GAAG,KAAA;QACH,IAAI,MAAA;KACL;;ICXD;;;;;;;;;;;;;;;;;;;;;;;IA0CA;;;IAGA;QAAA;YACE,WAAM,GAAkB,IAAI,aAAa,EAAE,CAAC;YAC5C,WAAM,GAAkB,IAAI,aAAa,EAAE,CAAC;YAC5C,WAAM,GAAU,IAAI,KAAK,EAAE,CAAC;YAC5B,WAAM,GAAU,IAAI,KAAK,EAAE,CAAC;SAG7B;QAAD,eAAC;IAAD,CAAC,IAAA;IAED,IAAY,cAMX;IAND,WAAY,cAAc;QACxB,6DAAa,CAAA;QACb,2DAAY,CAAA;QACZ,mEAAgB,CAAA;QAChB,+DAAc,CAAA;QACd,iEAAe,CAAA;IACjB,CAAC,EANW,cAAc,KAAd,cAAc,QAMzB;IAED;;;IAGA;QAAA;SAGC;QAAD,gBAAC;IAAD,CAAC,IAAA;AAEDC,WAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAClBA,WAAK,CAAC,UAAU,GAAG,CAAC,CAAC;AACrBA,WAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;AACnBA,WAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;AACnBA,WAAK,CAAC,WAAW,GAAG,CAAC,CAAC;AACtBA,WAAK,CAAC,YAAY,GAAG,CAAC,CAAC;AACvBA,WAAK,CAAC,eAAe,GAAG,CAAC,CAAC;IAE1B;;;;;;;;;;;;aAYwB,YAAY,CAAC,MAAiB,EAAE,KAAe;QACrE,IAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;QAE1B,EAAEA,OAAK,CAAC,QAAQ,CAAC;QAEjB,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC;QACxC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;QAEtB,IAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,IAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAE5B,IAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,IAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;;;QAI5B,MAAM,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,CAAC,SAAS,EAAE,CAAC;QAEnB,IAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAExB,IAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACtD,IAAM,MAAM,GAAGD,MAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,GAAG,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QACtF,IAAM,SAAS,GAAG,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC;QAG7C,IAAI,EAAE,GAAG,GAAG,CAAC;QACb,IAAM,eAAe,GAAG,QAAQ,CAAC,gBAAgB,CAAC;QAClD,IAAI,IAAI,GAAG,CAAC,CAAC;;QAGb,IAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;QAEjC,IAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;QAC1C,aAAa,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QACpC,aAAa,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QACpC,aAAa,CAAC,QAAQ,GAAG,KAAK,CAAC;;;QAI/B,OAAO,IAAI,EAAE;YACX,IAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC7B,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;;;YAI7B,aAAa,CAAC,UAAU,GAAG,GAAG,CAAC;YAC/B,aAAa,CAAC,UAAU,GAAG,GAAG,CAAC;YAC/B,IAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;YAC5C,QAAQ,CAAC,cAAc,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;;YAG/C,IAAI,cAAc,CAAC,QAAQ,IAAI,GAAG,EAAE;;gBAElC,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC,YAAY,CAAC;gBAC3C,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;gBACf,MAAM;aACP;YAED,IAAI,cAAc,CAAC,QAAQ,GAAG,MAAM,GAAG,SAAS,EAAE;;gBAEhD,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC;gBACzC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;gBACd,MAAM;aACP;;YAGD,IAAM,GAAG,GAAG,IAAI,kBAAkB,EAAE,CAAC;YACrC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;YAuB1D,IAAI,IAAI,GAAG,KAAK,CAAC;YACjB,IAAI,EAAE,GAAG,IAAI,CAAC;YACd,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,OAAO,IAAI,EAAE;;gBAEX,IAAI,EAAE,GAAG,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;;;;gBAKnC,IAAI,EAAE,GAAG,MAAM,GAAG,SAAS,EAAE;;oBAE3B,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC,WAAW,CAAC;oBAC1C,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC;oBAChB,IAAI,GAAG,IAAI,CAAC;oBACZ,MAAM;iBACP;;gBAGD,IAAI,EAAE,GAAG,MAAM,GAAG,SAAS,EAAE;;oBAE3B,EAAE,GAAG,EAAE,CAAC;oBACR,MAAM;iBACP;;gBAGD,IAAI,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;;;;;gBAM1B,IAAI,EAAE,GAAG,MAAM,GAAG,SAAS,EAAE;oBAC3B,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC;oBACvC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;oBACd,IAAI,GAAG,IAAI,CAAC;oBACZ,MAAM;iBACP;;gBAGD,IAAI,EAAE,IAAI,MAAM,GAAG,SAAS,EAAE;;oBAE5B,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC;oBACzC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;oBACd,IAAI,GAAG,IAAI,CAAC;oBACZ,MAAM;iBACP;;gBAGD,IAAI,aAAa,GAAG,CAAC,CAAC;gBACtB,IAAI,EAAE,GAAG,EAAE,CAAC;gBACZ,IAAI,EAAE,GAAG,EAAE,CAAC;gBACZ,OAAO,IAAI,EAAE;;oBAEX,IAAI,CAAC,SAAA,CAAC;oBACN,IAAI,aAAa,GAAG,CAAC,EAAE;;wBAErB,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;qBAChD;yBAAM;;wBAEL,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;qBACrB;oBAED,EAAE,aAAa,CAAC;oBAChB,EAAEC,OAAK,CAAC,YAAY,CAAC;oBAErB,IAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBACX,GAAG,CAAC,OAAO;oBACX,GAAG,CAAC,OAAO;oBAE1B,IAAID,MAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,SAAS,EAAE;;wBAEpC,EAAE,GAAG,CAAC,CAAC;wBACP,MAAM;qBACP;;oBAGD,IAAI,CAAC,GAAG,MAAM,EAAE;wBACd,EAAE,GAAG,CAAC,CAAC;wBACP,EAAE,GAAG,CAAC,CAAC;qBACR;yBAAM;wBACL,EAAE,GAAG,CAAC,CAAC;wBACP,EAAE,GAAG,CAAC,CAAC;qBACR;oBAED,IAAI,aAAa,KAAK,EAAE,EAAE;wBACxB,MAAM;qBACP;iBACF;gBAEDC,OAAK,CAAC,eAAe,GAAGD,MAAI,CAAC,GAAG,CAACC,OAAK,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;gBAEvE,EAAE,YAAY,CAAC;gBAEf,IAAI,YAAY,KAAK,QAAQ,CAAC,kBAAkB,EAAE;oBAChD,MAAM;iBACP;aACF;YAED,EAAE,IAAI,CAAC;YACP,EAAEA,OAAK,CAAC,QAAQ,CAAC;YAEjB,IAAI,IAAI,EAAE;gBACR,MAAM;aACP;YAED,IAAI,IAAI,KAAK,eAAe,EAAE;;gBAE5B,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC;gBACvC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;gBACd,MAAM;aACP;SACF;QAEDA,OAAK,CAAC,WAAW,GAAGD,MAAI,CAAC,GAAG,CAACC,OAAK,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAEtD,IAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/BA,OAAK,CAAC,UAAU,GAAGD,MAAI,CAAC,GAAG,CAACC,OAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACpDA,OAAK,CAAC,OAAO,IAAI,IAAI,CAAC;IACxB,CAAC;IAED,IAAK,sBAIJ;IAJD,WAAK,sBAAsB;QACzB,2EAAY,CAAA;QACZ,yEAAW,CAAA;QACX,yEAAW,CAAA;IACb,CAAC,EAJI,sBAAsB,KAAtB,sBAAsB,QAI1B;IAED;QAAA;YACE,aAAQ,GAAkB,IAAI,aAAa,EAAE,CAAC;YAC9C,aAAQ,GAAkB,IAAI,aAAa,EAAE,CAAC;YAM9C,iBAAY,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;YACjC,WAAM,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;SA4J5B;;QAxJC,uCAAU,GAAV,UAAW,KAAmB,EAAE,MAAqB,EAAE,MAAa,EAAE,MAAqB,EAAE,MAAa,EAAE,EAAU;YACpH,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;YACvB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;YACvB,IAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAG1B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;YACvB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;YAEvB,IAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAEpC,IAAI,KAAK,KAAK,CAAC,EAAE;gBACf,IAAI,CAAC,MAAM,GAAG,sBAAsB,CAAC,QAAQ,CAAC;gBAC9C,IAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7D,IAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7D,IAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;gBACnD,IAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;gBACnD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC9C,IAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBAClC,OAAO,CAAC,CAAC;aAEV;iBAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;;gBAE9C,IAAI,CAAC,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC;gBAC7C,IAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvD,IAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEvD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC;gBAC3E,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBACxB,IAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAE/C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;gBACzD,IAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gBAEzD,IAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtD,IAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;gBAEnD,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC5D,IAAI,CAAC,GAAG,GAAG,EAAE;oBACX,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACpC,CAAC,GAAG,CAAC,CAAC,CAAC;iBACR;gBACD,OAAO,CAAC,CAAC;aAEV;iBAAM;;gBAEL,IAAI,CAAC,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC;gBAC7C,IAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9D,IAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE9D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC;gBAC3E,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBACxB,IAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAE/C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;gBACzD,IAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gBAEzD,IAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7D,IAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;gBAEnD,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC5D,IAAI,CAAC,GAAG,GAAG,EAAE;oBACX,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACpC,CAAC,GAAG,CAAC,CAAC,CAAC;iBACR;gBACD,OAAO,CAAC,CAAC;aACV;SACF;QAED,oCAAO,GAAP,UAAQ,IAAa,EAAE,CAAS;;YAE9B,IAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAEnC,QAAQ,IAAI,CAAC,MAAM;gBACjB,KAAK,sBAAsB,CAAC,QAAQ,EAAE;oBACpC,IAAI,IAAI,EAAE;wBACR,IAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;wBAC/C,IAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;wBAEzD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;wBAC9C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;qBAC/C;oBAED,IAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACzD,IAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAEzD,IAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;oBACnD,IAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;oBAEnD,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC1E,OAAO,GAAG,CAAC;iBACZ;gBAED,KAAK,sBAAsB,CAAC,OAAO,EAAE;oBACnC,IAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC/C,IAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;oBAEzD,IAAI,IAAI,EAAE;wBACR,IAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;wBAEpD,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBACjB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;qBAC/C;oBAED,IAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACzD,IAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;oBAEnD,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAChE,OAAO,GAAG,CAAC;iBACZ;gBAED,KAAK,sBAAsB,CAAC,OAAO,EAAE;oBACnC,IAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC/C,IAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;oBAEzD,IAAI,IAAI,EAAE;wBACR,IAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;wBAEpD,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBACjB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;qBAC/C;oBAED,IAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACzD,IAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;oBAEnD,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBAChE,OAAO,GAAG,CAAC;iBACZ;gBAED;oBAEE,IAAI,IAAI,EAAE;wBACR,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBACjB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;qBAClB;oBACD,OAAO,GAAG,CAAC;aACd;SACF;QAED,8CAAiB,GAAjB,UAAkB,CAAS;YACzB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;SAC9B;QAED,qCAAQ,GAAR,UAAS,CAAS;YAChB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;SAC/B;QACH,yBAAC;IAAD,CAAC;;IC3dD;;;;;;;;;;;;;;;;;;;;;;;IAwCA;QAAA;;YAEE,OAAE,GAAW,CAAC,CAAC;;YAEf,WAAM,GAAW,CAAC,CAAC;YACnB,uBAAkB,GAAW,CAAC,CAAC;YAC/B,uBAAkB,GAAW,CAAC,CAAC;YAC/B,iBAAY,GAAY,KAAK,CAAC;YAC9B,eAAU,GAAY,IAAI,CAAC;;YAG3B,YAAO,GAAW,GAAG,CAAC;;YAEtB,YAAO,GAAW,CAAC,CAAC;SAUrB;QARC,wBAAK,GAAL,UAAM,EAAU;YACd,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE;gBACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;aAC5B;YACD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACnC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;SAClC;QACH,eAAC;IAAD,CAAC,IAAA;IAED;IACA,IAAM,SAAS,GAAG,IAAI,QAAQ,EAAE,CAAC;IAEjC;;;;;IAKA;QAOE,wBAAY,OAAgB;YAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACvB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;SACpB;QAED,sBAAI,0CAAc;iBAAlB;gBACE,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;gBAC7B,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;gBAC7B,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;gBACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;oBAChD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;iBACjD;gBACD,OAAO,OAAO,CAAC;aAChB;;;WAAA;QAED,sBAAI,2CAAe;iBAAnB;gBACE,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;gBAC7B,IAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC/B,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;gBACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;oBAChD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;iBACnD;gBACD,OAAO,QAAQ,CAAC;aACjB;;;WAAA;QACH,qBAAC;IAAD,CAAC,IAAA;IAED;;;IAGA;QAOE,gBAAY,KAAY;YACtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;SACpB;QAED,sBAAK,GAAL;YACE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;SAC1B;QAED,wBAAO,GAAP,UAAQ,IAAU;YAEhB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;;;;;SAM1B;QAED,2BAAU,GAAV,UAAW,OAAgB;YAEzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SAC/B;QAED,yBAAQ,GAAR,UAAS,KAAY;YAEnB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC3B;QAED,2BAAU,GAAV,UAAW,IAAc;YACvB,IAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;;YAG3B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;gBAC9C,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC;aACxB;YACD,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;gBACjD,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC;aACxB;YACD,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;gBAC/C,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC;aACxB;;YAGD,IAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;YAE3B,KAAK,IAAI,IAAI,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE;gBAE1D,IAAI,IAAI,CAAC,YAAY,EAAE;oBACrB,SAAS;iBACV;gBAED,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,KAAK,EAAE;oBACvD,SAAS;iBACV;;gBAGD,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;oBACnB,SAAS;iBACV;;gBAGD,IAAI,CAAC,KAAK,EAAE,CAAC;gBAEb,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEjB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;;gBAGzB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;;oBAEvB,IAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;oBAEtB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;;oBAGhB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;;;oBAIjB,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;wBAChB,SAAS;qBACV;;oBAGD,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE;wBAC/C,IAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;;wBAG3B,IAAI,OAAO,CAAC,YAAY,EAAE;4BACxB,SAAS;yBACV;;wBAGD,IAAI,OAAO,CAAC,SAAS,EAAE,IAAI,KAAK,IAAI,OAAO,CAAC,UAAU,EAAE,IAAI,KAAK,EAAE;4BACjE,SAAS;yBACV;;wBAGD,IAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;wBAC9C,IAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;wBAC9C,IAAI,OAAO,IAAI,OAAO,EAAE;4BACtB,SAAS;yBACV;wBAED,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;wBACzB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;wBAE5B,IAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;;wBAGvB,IAAI,KAAK,CAAC,YAAY,EAAE;4BACtB,SAAS;yBACV;;wBAGD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBAClB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;qBAC3B;;oBAGD,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE;wBAC7C,IAAI,EAAE,CAAC,KAAK,CAAC,YAAY,IAAI,IAAI,EAAE;4BACjC,SAAS;yBACV;wBAED,IAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;;wBAGvB,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,KAAK,EAAE;4BAC7B,SAAS;yBACV;wBAED,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;wBACxB,EAAE,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;wBAE7B,IAAI,KAAK,CAAC,YAAY,EAAE;4BACtB,SAAS;yBACV;;wBAGD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBAClB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;qBAC3B;iBACF;gBAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;;gBAGvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;;;oBAG7C,IAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC3B,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;wBAChB,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC;qBACxB;iBACF;aACF;SACF;QAED,4BAAW,GAAX,UAAY,IAAc;;YAExB,IAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;YAC3B,IAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC;YAChC,IAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC;YAEtC,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;;YAGlB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBAC7C,IAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAE9B,IAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACrC,IAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBACzB,IAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAC5C,IAAI,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC;;gBAG/B,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACxC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBAEjC,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;;oBAEpB,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;oBAC3C,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC3C,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;;;;;;;;;;;;oBAYrC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;oBAC9C,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;iBAC9C;gBAED,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;gBACtB,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;gBACtB,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;gBACtB,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;aACvB;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBAC/C,IAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACnC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;aAC9B;YAID,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBAC/C,IAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACnC,OAAO,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;aACtC;YAID,IAAI,IAAI,CAAC,YAAY,EAAE;;gBAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;oBAC/C,IAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;oBACnC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;iBACnC;aACF;YAID,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBAC7C,IAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC/B,KAAK,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;aACrC;;YAKD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC,EAAE;gBAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;oBAC7C,IAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC/B,KAAK,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;iBACtC;gBAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;oBAC/C,IAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;oBACnC,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;iBACvC;aACF;;YAKD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBAC/C,IAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACnC,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;aACvC;;YAKD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBAC7C,IAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAE9B,IAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACxC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC1B,IAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACxC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;;gBAG1B,IAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1C,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,qBAAqB,EAAE;oBACpE,IAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;oBAC7D,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;iBACd;gBAED,IAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;gBACvB,IAAI,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC,kBAAkB,EAAE;oBACrD,IAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,GAAGD,MAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACxD,CAAC,IAAI,KAAK,CAAC;iBACZ;;gBAGD,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACf,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAEX,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;gBACtB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;aACvB;;YAKD,IAAI,cAAc,GAAG,KAAK,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC,EAAE;gBAChD,IAAI,aAAa,GAAG,GAAG,CAAC;gBACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;oBAC/C,IAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;oBACnC,IAAM,UAAU,GAAG,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;oBACzD,aAAa,GAAGA,MAAI,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;iBACrD;;;gBAGD,IAAM,YAAY,GAAG,aAAa,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC;gBAEjE,IAAI,UAAU,GAAG,IAAI,CAAC;gBACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;oBAC7C,IAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC/B,IAAM,SAAS,GAAG,KAAK,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;oBACvD,UAAU,GAAG,UAAU,IAAI,SAAS,CAAC;iBACtC;gBAED,IAAI,YAAY,IAAI,UAAU,EAAE;;oBAE9B,cAAc,GAAG,IAAI,CAAC;oBACtB,MAAM;iBACP;aACF;;YAKD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBAC7C,IAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAE9B,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAC1C,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;gBACnC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACjD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC3C,IAAI,CAAC,oBAAoB,EAAE,CAAC;aAC7B;YAED,IAAI,CAAC,eAAe,EAAE,CAAC;YAEvB,IAAI,UAAU,EAAE;gBACd,IAAI,YAAY,GAAG,QAAQ,CAAC;gBAE5B,IAAM,SAAS,GAAG,QAAQ,CAAC,uBAAuB,CAAC;gBACnD,IAAM,SAAS,GAAG,QAAQ,CAAC,wBAAwB,CAAC;gBAEpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;oBAC7C,IAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC9B,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;wBACnB,SAAS;qBACV;oBAED,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,KAAK;4BAC5B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;4BAC5D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,SAAS,CAAC,EAAE;wBAC5D,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;wBACvB,YAAY,GAAG,GAAG,CAAC;qBACpB;yBAAM;wBACL,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;wBACtB,YAAY,GAAGA,MAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;qBACzD;iBACF;gBAED,IAAI,YAAY,IAAI,QAAQ,CAAC,WAAW,IAAI,cAAc,EAAE;oBAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;wBAC7C,IAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;wBAC9B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;qBACtB;iBACF;aACF;SACF;;QAGD,4BAAW,GAAX,UAAY,GAAW;YACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBAC7C,IAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC3B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3H;SACF;;;;QAKD,8BAAa,GAAb,UAAc,IAAc;YAC1B,IAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;YAE3B,IAAI,KAAK,CAAC,cAAc,EAAE;gBACxB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;oBAC9C,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC;oBACvB,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC;iBACxB;gBAED,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;;oBAEjD,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC;oBACpB,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC;oBACvB,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;oBACjB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC;iBACf;aACF;;YAGD,OAAO,IAAI,EAAE;;gBAEX,IAAI,UAAU,GAAG,IAAI,CAAC;gBACtB,IAAI,QAAQ,GAAG,GAAG,CAAC;gBAEnB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;;oBAEjD,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,KAAK,EAAE;wBAC1B,SAAS;qBACV;;oBAGD,IAAI,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE;wBACvC,SAAS;qBACV;oBAED,IAAI,KAAK,GAAG,GAAG,CAAC;oBAChB,IAAI,CAAC,CAAC,SAAS,EAAE;;wBAEf,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;qBACjB;yBAAM;wBACL,IAAM,IAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;wBAC3B,IAAM,IAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;;wBAG3B,IAAI,IAAE,CAAC,QAAQ,EAAE,IAAI,IAAE,CAAC,QAAQ,EAAE,EAAE;4BAClC,SAAS;yBACV;wBAED,IAAM,IAAE,GAAG,IAAE,CAAC,OAAO,EAAE,CAAC;wBACxB,IAAM,IAAE,GAAG,IAAE,CAAC,OAAO,EAAE,CAAC;wBAIxB,IAAM,OAAO,GAAG,IAAE,CAAC,OAAO,EAAE,IAAI,CAAC,IAAE,CAAC,QAAQ,EAAE,CAAC;wBAC/C,IAAM,OAAO,GAAG,IAAE,CAAC,OAAO,EAAE,IAAI,CAAC,IAAE,CAAC,QAAQ,EAAE,CAAC;;wBAG/C,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE;4BACxC,SAAS;yBACV;wBAED,IAAM,QAAQ,GAAG,IAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAE,CAAC,SAAS,EAAE,CAAC;wBAClD,IAAM,QAAQ,GAAG,IAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAE,CAAC,SAAS,EAAE,CAAC;;wBAGlD,IAAI,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,EAAE;4BAC1C,SAAS;yBACV;;;wBAID,IAAI,MAAM,GAAG,IAAE,CAAC,OAAO,CAAC,MAAM,CAAC;wBAE/B,IAAI,IAAE,CAAC,OAAO,CAAC,MAAM,GAAG,IAAE,CAAC,OAAO,CAAC,MAAM,EAAE;4BACzC,MAAM,GAAG,IAAE,CAAC,OAAO,CAAC,MAAM,CAAC;4BAC3B,IAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;yBAC5B;6BAAM,IAAI,IAAE,CAAC,OAAO,CAAC,MAAM,GAAG,IAAE,CAAC,OAAO,CAAC,MAAM,EAAE;4BAChD,MAAM,GAAG,IAAE,CAAC,OAAO,CAAC,MAAM,CAAC;4BAC3B,IAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;yBAC5B;wBAID,IAAM,MAAM,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;wBAClC,IAAM,MAAM,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;wBAEnB,IAAE,CAAC,QAAQ;wBACX,IAAE,CAAC,QAAQ;;wBAG1B,IAAM,KAAK,GAAG,IAAI,QAAQ,EAAE,CAAC;wBAC7B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAE,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;wBACxC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAE,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;wBACxC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAE,CAAC,OAAO,CAAC,CAAC;wBAC7B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAE,CAAC,OAAO,CAAC,CAAC;wBAC7B,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC;wBAEjB,IAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;wBAC/B,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;;wBAG5B,IAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;wBACtB,IAAI,MAAM,CAAC,KAAK,IAAI,cAAc,CAAC,UAAU,EAAE;4BAC7C,KAAK,GAAGA,MAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,MAAM,IAAI,IAAI,EAAE,GAAG,CAAC,CAAC;yBACvD;6BAAM;4BACL,KAAK,GAAG,GAAG,CAAC;yBACb;wBAED,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;wBAChB,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;qBACpB;oBAED,IAAI,KAAK,GAAG,QAAQ,EAAE;;wBAEpB,UAAU,GAAG,CAAC,CAAC;wBACf,QAAQ,GAAG,KAAK,CAAC;qBAClB;iBACF;gBAED,IAAI,UAAU,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAGA,MAAI,CAAC,OAAO,GAAG,QAAQ,EAAE;;oBAE9D,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;oBAC5B,MAAM;iBACP;;gBAGD,IAAM,EAAE,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;gBACpC,IAAM,EAAE,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;gBACpC,IAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;gBACxB,IAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;gBAExB,IAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnC,IAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAEnC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACrB,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;;gBAGrB,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACzB,UAAU,CAAC,SAAS,GAAG,KAAK,CAAC;gBAC7B,EAAE,UAAU,CAAC,UAAU,CAAC;;gBAGxB,IAAI,UAAU,CAAC,SAAS,EAAE,IAAI,KAAK,IAAI,UAAU,CAAC,UAAU,EAAE,IAAI,KAAK,EAAE;;oBAEvE,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;oBAC7B,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACxB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACxB,EAAE,CAAC,oBAAoB,EAAE,CAAC;oBAC1B,EAAE,CAAC,oBAAoB,EAAE,CAAC;oBAC1B,SAAS;iBACV;gBAED,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAClB,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;;gBAGlB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACb,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACjB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACjB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gBAE5B,EAAE,CAAC,YAAY,GAAG,IAAI,CAAC;gBACvB,EAAE,CAAC,YAAY,GAAG,IAAI,CAAC;gBACvB,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC;;gBAG/B,IAAM,MAAM,GAAG,CAAE,EAAE,EAAE,EAAE,CAAE,CAAC;gBAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;oBACtC,IAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBACvB,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;wBACpB,KAAK,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE;;;4BAIlD,IAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;;4BAG3B,IAAI,OAAO,CAAC,YAAY,EAAE;gCACxB,SAAS;6BACV;;4BAGD,IAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;4BACvB,IAAI,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE;gCAC9D,SAAS;6BACV;;4BAGD,IAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;4BAC9C,IAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;4BAC9C,IAAI,OAAO,IAAI,OAAO,EAAE;gCACtB,SAAS;6BACV;;4BAGD,IAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;4BACrC,IAAI,KAAK,CAAC,YAAY,IAAI,KAAK,EAAE;gCAC/B,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;6BACzB;;4BAGD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;;;4BAItB,IAAI,OAAO,CAAC,SAAS,EAAE,IAAI,KAAK,IAAI,OAAO,CAAC,UAAU,EAAE,IAAI,KAAK,EAAE;gCACjE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gCAC1B,KAAK,CAAC,oBAAoB,EAAE,CAAC;gCAC7B,SAAS;6BACV;;4BAGD,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;4BAC5B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;;4BAGzB,IAAI,KAAK,CAAC,YAAY,EAAE;gCACtB,SAAS;6BACV;;4BAGD,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;4BAE1B,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE;gCACrB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;6BACtB;4BAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;yBACrB;qBACF;iBACF;gBAED,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC5C,SAAS,CAAC,OAAO,GAAG,GAAG,CAAC;gBACxB,SAAS,CAAC,kBAAkB,GAAG,EAAE,CAAC;gBAClC,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;gBACvD,SAAS,CAAC,YAAY,GAAG,KAAK,CAAC;gBAE/B,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;;gBAGvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;oBAC7C,IAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC9B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;oBAE1B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;wBACrB,SAAS;qBACV;oBAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;;oBAG3B,KAAK,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE;wBAClD,EAAE,CAAC,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;wBAC7B,EAAE,CAAC,OAAO,CAAC,YAAY,GAAG,KAAK,CAAC;qBACjC;iBACF;;;;gBAKD,KAAK,CAAC,eAAe,EAAE,CAAC;gBAExB,IAAI,KAAK,CAAC,aAAa,EAAE;oBACvB,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC;oBAC7B,MAAM;iBACP;aACF;sBAOA;SACF;QAED,+BAAc,GAAd,UAAe,OAAiB,EAAE,IAAU,EAAE,IAAU;YACxC,IAAI,CAAC,QAAQ;;YAG3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBAC7C,IAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC9B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC1C,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBACnC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACjD,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC;aAC5C;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBAC/C,IAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACnC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;aACjC;;YAGD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,EAAE;gBACnD,IAAI,aAAa,GAAG,GAAG,CAAC;gBACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;oBAC/C,IAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;oBACnC,IAAM,UAAU,GAAG,OAAO,CAAC,0BAA0B,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;oBAC3E,aAAa,GAAGA,MAAI,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;iBACrD;;;gBAGD,IAAM,YAAY,GAAG,aAAa,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC;gBACjE,IAAI,YAAY,EAAE;oBAChB,MAAM;iBACP;aACF;sBA8BA;;YAGD,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;;;YAIpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBAC/C,IAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACnC,OAAO,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;aACzC;;YAGD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,EAAE;gBACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;oBAC/C,IAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;oBACnC,OAAO,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;iBAC1C;aACF;;;YAKD,IAAM,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC;;YAGrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBAC7C,IAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAE9B,IAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACxC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC1B,IAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACxC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;;gBAG1B,IAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1C,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,qBAAqB,EAAE;oBACvE,IAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;oBAC7D,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;iBACd;gBAED,IAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;gBACvB,IAAI,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC,kBAAkB,EAAE;oBACrD,IAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,GAAGA,MAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACxD,CAAC,IAAI,KAAK,CAAC;iBACZ;;gBAGD,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACf,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAEX,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;gBACtB,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;gBACtB,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;gBACtB,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;;gBAGtB,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;gBACnB,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;gBACnB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;gBAC1B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBAC3B,IAAI,CAAC,oBAAoB,EAAE,CAAC;aAC7B;YAED,IAAI,CAAC,eAAe,EAAE,CAAC;SACxB;;QAGD,gCAAe,GAAf;YACE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBAC/C,IAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACnC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;aACpD;SACF;QACH,aAAC;IAAD,CAAC;;ICv5BD;;;;;;;;;;;;;;;;;;;;;;;IA6DA,IAAM,eAAe,GAAa;QAChC,OAAO,EAAG,IAAI,CAAC,IAAI,EAAE;QACrB,UAAU,EAAG,IAAI;QACjB,YAAY,EAAG,IAAI;QACnB,iBAAiB,EAAG,IAAI;QACxB,WAAW,EAAG,KAAK;QACnB,UAAU,EAAG,IAAI;QACjB,kBAAkB,EAAG,CAAC;QACtB,kBAAkB,EAAG,CAAC;KACvB,CAAC;;;;;QAuDA,eAAY,GAA4B;YAAxC,iBA2CC;;YAylBD,WAAM,GAAa,IAAI,QAAQ,EAAE,CAAC;;;;;YAsFlC,kBAAa,GAAG,UAAC,MAAoB,EAAE,MAAoB;gBACzD,IAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;gBAChC,IAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;gBAEhC,IAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;gBACjC,IAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;gBAEjC,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACjC,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;;gBAGjC,IAAI,KAAK,IAAI,KAAK,EAAE;oBAClB,OAAO;iBACR;;;;gBAKD,IAAI,IAAI,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;gBAClC,OAAO,IAAI,EAAE;oBACX,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE;wBACvB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;wBACtC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;wBACtC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;wBACzC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;wBAEzC,IAAI,EAAE,IAAI,QAAQ,IAAI,EAAE,IAAI,QAAQ,IAAI,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,EAAE;;4BAEpE,OAAO;yBACR;wBAED,IAAI,EAAE,IAAI,QAAQ,IAAI,EAAE,IAAI,QAAQ,IAAI,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,EAAE;;4BAEpE,OAAO;yBACR;qBACF;oBAED,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;iBAClB;gBAED,IAAI,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE;oBACvC,OAAO;iBACR;gBACD,IAAI,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE;oBAC7C,OAAO;iBACR;;gBAGD,IAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;gBACnE,IAAI,OAAO,IAAI,IAAI,EAAE;oBACnB,OAAO;iBACR;;gBAGD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;gBACtB,IAAI,KAAI,CAAC,aAAa,IAAI,IAAI,EAAE;oBAC9B,OAAO,CAAC,MAAM,GAAG,KAAI,CAAC,aAAa,CAAC;oBACpC,KAAI,CAAC,aAAa,CAAC,MAAM,GAAG,OAAO,CAAC;iBACrC;gBACD,KAAI,CAAC,aAAa,GAAG,OAAO,CAAC;gBAE7B,EAAE,KAAI,CAAC,cAAc,CAAC;aACvB,CAAA;YAvxBC,IAAI,EAAE,IAAI,YAAY,KAAK,CAAC,EAAE;gBAC5B,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;aACvB;YAED,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBAC5B,GAAG,GAAG,EAAE,OAAO,EAAE,GAAW,EAAE,CAAC;aAChC;YAED,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,eAAe,CAAa,CAAC;YAEhD,IAAI,CAAC,QAAQ,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;YAEjC,IAAI,CAAC,YAAY,GAAG,IAAI,UAAU,EAAE,CAAC;YAErC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;YAExB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;YAErB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YAEtB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAE3B,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC;YACnC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAEzC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;;YAGtB,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,YAAY,CAAC;YACvC,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC,iBAAiB,CAAC;YACjD,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC;YAErC,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC;YACnC,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC,kBAAkB,CAAC;YACnD,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC,kBAAkB,CAAC;YAEnD,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;SACd;;QAGD,0BAAU,GAAV;YACE,IAAM,MAAM,GAAG,EAAE,CAAC;YAClB,IAAM,MAAM,GAAG,EAAE,CAAC;YAElB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBACnD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aAChB;YAED,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;;gBAEpD,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,UAAU,EAAE;oBACtC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBAChB;aACF;YAED,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,SAAS;gBACvB,MAAM,QAAA;gBACN,MAAM,QAAA;aACP,CAAC;SACH;;QAGM,kBAAY,GAAnB,UAAoB,IAAS,EAAE,OAAY,EAAE,OAAY;YACvD,IAAI,CAAC,IAAI,EAAE;gBACT,OAAO,IAAI,KAAK,EAAE,CAAC;aACpB;YAED,IAAM,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEtC,IAAI,IAAI,CAAC,MAAM,EAAE;gBACf,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;oBACnD,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;iBACtD;aACF;YAED,IAAI,IAAI,CAAC,MAAM,EAAE;gBACf,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;oBAChD,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;iBAC1D;aACF;YAED,OAAO,KAAK,CAAC;SACd;;;;;;;QAQD,2BAAW,GAAX;YACE,OAAO,IAAI,CAAC,UAAU,CAAC;SACxB;;;;;;;QAQD,4BAAY,GAAZ;YACE,OAAO,IAAI,CAAC,WAAW,CAAC;SACzB;;;;;;;;;;;QAYD,8BAAc,GAAd;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;QAED,4BAAY,GAAZ;YACE,OAAO,IAAI,CAAC,WAAW,CAAC;SACzB;QAED,6BAAa,GAAb;YACE,OAAO,IAAI,CAAC,YAAY,CAAC;SAC1B;;;;QAKD,+BAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,0BAAU,GAAV,UAAW,OAAa;YACtB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;SAC1B;;;;QAKD,0BAAU,GAAV;YACE,OAAO,IAAI,CAAC,SAAS,CAAC;SACvB;;;;QAKD,wBAAQ,GAAR;YACE,OAAO,IAAI,CAAC,QAAQ,CAAC;SACtB;;;;QAKD,gCAAgB,GAAhB,UAAiB,IAAa;YAC5B,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE;gBAC7B,OAAO;aACR;YAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,IAAI,CAAC,YAAY,IAAI,KAAK,EAAE;gBAC9B,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;oBAC7C,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;iBAClB;aACF;SACF;QAED,gCAAgB,GAAhB;YACE,OAAO,IAAI,CAAC,YAAY,CAAC;SAC1B;;;;QAKD,+BAAe,GAAf,UAAgB,IAAa;YAC3B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;SAC5B;QAED,+BAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,oCAAoB,GAApB,UAAqB,IAAa;YAChC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;SACjC;QAED,oCAAoB,GAApB;YACE,OAAO,IAAI,CAAC,mBAAmB,CAAC;SACjC;;;;QAKD,8BAAc,GAAd,UAAe,IAAa;YAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;SAC3B;QAED,8BAAc,GAAd;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;;;;QAKD,kCAAkB,GAAlB,UAAmB,IAAa;YAC9B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;SAC3B;;;;QAKD,kCAAkB,GAAlB;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;;;;;;;;;;;;QAaD,2BAAW,GAAX;YACE,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE;gBAC5D,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACvB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;aACrB;SACF;;;;;;;QAQD,yBAAS,GAAT,UAAU,IAAU,EAAE,QAAgC;YAEpD,IAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC;YACrC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,UAAS,OAAe;gBACpD,IAAM,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC9C,OAAO,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;aAChC,CAAC,CAAC;SACJ;;;;;;;;;;QAWD,uBAAO,GAAP,UAAQ,MAAY,EAAE,MAAY,EAAE,QAA8B;YAEhE,IAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC;YAErC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;gBACxB,WAAW,EAAG,GAAG;gBACjB,EAAE,EAAG,MAAM;gBACX,EAAE,EAAG,MAAM;aACZ,EAAE,UAAS,KAAmB,EAAE,OAAe;gBAC9C,IAAM,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC9C,IAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC9B,IAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;;gBAE/B,IAAM,MAAM,GAAkB,EAAE,CAAC;gBACjC,IAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBAClD,IAAI,GAAG,EAAE;oBACP,IAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;oBACjC,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,GAAG,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;oBACzG,OAAO,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;iBAC1D;gBACD,OAAO,KAAK,CAAC,WAAW,CAAC;aAC1B,CAAC,CAAC;SACJ;;;;QAKD,6BAAa,GAAb;YACE,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;SAC1C;;;;QAKD,6BAAa,GAAb;YACE,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;SAC1C;;;;QAKD,8BAAc,GAAd;YACE,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;SAC3C;;;;;QAMD,8BAAc,GAAd;YACE,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;SAC3C;;;;;;;QAQD,2BAAW,GAAX,UAAY,SAAe;YAEzB,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,OAAO;aACR;YAED,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;gBAC7C,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACxB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC5B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;aAC5B;YAED,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;gBAC9C,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;aAC1B;YAED,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;SAC1C;;;;QAKD,wBAAQ,GAAR,UAAS,IAAU;YAEjB,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;gBACnB,OAAO;aACR;;YAGD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;YAC9B,IAAI,IAAI,CAAC,UAAU,EAAE;gBACnB,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC;aAC/B;YACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,EAAE,IAAI,CAAC,WAAW,CAAC;SACpB;;QAWD,0BAAU,GAAV,UAAW,IAAK,EAAE,IAAK;YAErB,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;gBACnB,OAAO,IAAI,CAAC;aACb;YAED,IAAI,GAAG,GAAY,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,EAAE,CACV;iBAAM,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC7B,GAAG,GAAG,EAAE,QAAQ,EAAG,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;aACxC;iBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;gBACnC,GAAG,GAAG,IAAI,CAAC;aACZ;YAED,IAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;SACb;;QAKD,iCAAiB,GAAjB,UAAkB,IAAK,EAAE,IAAK;YAC5B,IAAI,GAAG,GAAY,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,EAAE,CACV;iBAAM,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC7B,GAAG,GAAG,EAAE,QAAQ,EAAG,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;aACxC;iBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;gBACnC,GAAG,GAAG,IAAI,CAAC;aACZ;YACD,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC;YACrB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SAC7B;;QAKD,mCAAmB,GAAnB,UAAoB,IAAK,EAAE,IAAK;YAC9B,IAAI,GAAG,GAAY,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,EAAE,CACV;iBAAM,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC7B,GAAG,GAAG,EAAE,QAAQ,EAAG,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;aACxC;iBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;gBACnC,GAAG,GAAG,IAAI,CAAC;aACZ;YACD,GAAG,CAAC,IAAI,GAAG,WAAW,CAAC;YACvB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SAC7B;;;;;;;;;QAUD,2BAAW,GAAX,UAAY,CAAO;YAGjB,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;gBACnB,OAAO;aACR;YAED,IAAI,CAAC,CAAC,WAAW,EAAE;gBACjB,OAAO,KAAK,CAAC;aACd;;YAGD,IAAI,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC;YACvB,OAAO,EAAE,EAAE;gBACT,IAAM,GAAG,GAAG,EAAE,CAAC;gBACf,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;gBAEb,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;gBACxC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAE7B,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC;aACpB;YACD,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC;;YAGrB,IAAI,EAAE,GAAG,CAAC,CAAC,aAAa,CAAC;YACzB,OAAO,EAAE,EAAE;gBACT,IAAM,GAAG,GAAG,EAAE,CAAC;gBACf,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;gBAEb,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAEjC,CAAC,CAAC,aAAa,GAAG,EAAE,CAAC;aACtB;YACD,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC;;YAGvB,IAAI,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC;YACxB,OAAO,CAAC,EAAE;gBACR,IAAM,EAAE,GAAG,CAAC,CAAC;gBACb,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBAEb,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;gBACnC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAErC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC;aACrB;YACD,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC;;YAGvB,IAAI,CAAC,CAAC,MAAM,EAAE;gBACZ,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;aAC5B;YAED,IAAI,CAAC,CAAC,MAAM,EAAE;gBACZ,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;aAC5B;YAED,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE;gBACxB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;aAC5B;YAED,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC;YAErB,EAAE,IAAI,CAAC,WAAW,CAAC;YAEnB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;YAE/B,OAAO,IAAI,CAAC;SACb;;;;;;;QAQD,2BAAW,GAAX,UAA6B,KAAQ;YAInC,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;gBACnB,OAAO,IAAI,CAAC;aACb;;YAGD,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;YACpB,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;YAChC,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,KAAK,CAAC;aACjC;YACD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,EAAE,IAAI,CAAC,YAAY,CAAC;;YAGpB,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;YAC5B,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;YACpC,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YAC1B,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;YAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW;gBAC3B,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;YACjD,KAAK,CAAC,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC;YAE1C,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;YAC5B,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;YACpC,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YAC1B,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;YAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW;gBAC3B,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;YACjD,KAAK,CAAC,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC;;YAG1C,IAAI,KAAK,CAAC,kBAAkB,IAAI,KAAK,EAAE;gBACrC,KAAK,IAAI,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;oBACtE,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE;;;wBAG/B,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;qBACjC;iBACF;aACF;;YAID,OAAO,KAAK,CAAC;SACd;;;;;QAMD,4BAAY,GAAZ,UAAa,KAAY;YAEvB,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;gBACnB,OAAO;aACR;;YAGD,IAAI,KAAK,CAAC,MAAM,EAAE;gBAChB,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;aACpC;YAED,IAAI,KAAK,CAAC,MAAM,EAAE;gBAChB,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;aACpC;YAED,IAAI,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE;gBAC7B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;aACjC;;YAGD,IAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;YAC5B,IAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;;YAG5B,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;;YAGrB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;gBACtB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;aAC9C;YAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;gBACtB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;aAC9C;YAED,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE;gBACtC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;aACxC;YAED,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YAC1B,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;;YAG1B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;gBACtB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;aAC9C;YAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;gBACtB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;aAC9C;YAED,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE;gBACtC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;aACxC;YAED,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YAC1B,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YAG1B,EAAE,IAAI,CAAC,YAAY,CAAC;;YAGpB,IAAI,KAAK,CAAC,kBAAkB,IAAI,KAAK,EAAE;gBACrC,IAAI,IAAI,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;gBAClC,OAAO,IAAI,EAAE;oBACX,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE;;;wBAGvB,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;qBACjC;oBAED,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;iBAClB;aACF;YAED,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;SACrC;;;;;;;;;QAaD,oBAAI,GAAJ,UAAK,QAAgB,EAAE,kBAA2B,EAAE,kBAA2B;YAC7E,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAEnC,IAAI,CAAC,kBAAkB,GAAG,CAAC,MAAM,kBAAkB,EAAE;;gBAEnD,kBAAkB,GAAG,CAAC,CAAC;aACxB;YAED,kBAAkB,GAAG,kBAAkB,IAAI,IAAI,CAAC,oBAAoB,CAAC;YACrE,kBAAkB,GAAG,kBAAkB,IAAI,IAAI,CAAC,oBAAoB,CAAC;;YAGrE,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;aAC3B;YAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YAErB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC;;YAG3C,IAAI,CAAC,cAAc,EAAE,CAAC;;YAGtB,IAAI,IAAI,CAAC,cAAc,IAAI,QAAQ,GAAG,GAAG,EAAE;gBACzC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;gBAGtC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;;oBAEhD,IAAI,CAAC,CAAC,YAAY,IAAI,KAAK,EAAE;wBAC3B,SAAS;qBACV;oBAED,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;wBAChB,SAAS;qBACV;;oBAGD,CAAC,CAAC,mBAAmB,EAAE,CAAC;iBACzB;;gBAED,IAAI,CAAC,eAAe,EAAE,CAAC;aACxB;;YAGD,IAAI,IAAI,CAAC,mBAAmB,IAAI,QAAQ,GAAG,GAAG,EAAE;gBAC9C,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aAC1C;YAED,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,IAAI,CAAC,WAAW,EAAE,CAAC;aACpB;YAED,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YAEtB,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;SACrC;;;;;QAMD,+BAAe,GAAf;YACE,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SACnD;;;;;QA0ED,8BAAc,GAAd;;YAEE,IAAI,CAAC,CAAC;YACN,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;YAChC,OAAO,CAAC,GAAG,MAAM,EAAE;gBACjB,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;gBACrB,IAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;gBACjC,IAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;gBACjC,IAAM,MAAM,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;gBAClC,IAAM,MAAM,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;gBAClC,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACjC,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;;gBAGjC,IAAI,CAAC,CAAC,YAAY,EAAE;oBAClB,IAAI,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE;wBACvC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;wBACvB,SAAS;qBACV;oBAED,IAAI,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE;wBAC7C,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;wBACvB,SAAS;qBACV;;oBAGD,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC;iBACxB;gBAED,IAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACrD,IAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;;gBAGrD,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE;oBACxC,SAAS;iBACV;gBAED,IAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACpD,IAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACpD,IAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;;gBAGlE,IAAI,OAAO,IAAI,KAAK,EAAE;oBACpB,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;oBACvB,SAAS;iBACV;;gBAGD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;aAChB;SACF;;;;QAKD,8BAAc,GAAd,UAAe,OAAgB;YAC7B,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;;YAG/B,IAAI,OAAO,CAAC,MAAM,EAAE;gBAClB,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;aACxC;YACD,IAAI,OAAO,CAAC,MAAM,EAAE;gBAClB,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;aACxC;YACD,IAAI,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE;gBACjC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;aACrC;YAED,EAAE,IAAI,CAAC,cAAc,CAAC;SACvB;;;;;QAgED,kBAAE,GAAF,UAAG,IAAI,EAAE,QAAQ;YACf,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;gBAC9D,OAAO,IAAI,CAAC;aACb;YACD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBACpB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;aACtB;YACD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;gBAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;aAC5B;YACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC;SACb;;;;;QAaD,mBAAG,GAAH,UAAI,IAAI,EAAE,QAAQ;YAChB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;gBAC9D,OAAO,IAAI,CAAC;aACb;YACD,IAAM,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC3D,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;gBACnC,OAAO,IAAI,CAAC;aACb;YACD,IAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,KAAK,IAAI,CAAC,EAAE;gBACd,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;aAC5B;YACD,OAAO,IAAI,CAAC;SACb;QAED,uBAAO,GAAP,UAAQ,IAAY,EAAE,IAAU,EAAE,IAAU,EAAE,IAAU;YACtD,IAAM,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC3D,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;gBACnC,OAAO,CAAC,CAAC;aACV;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACzC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;aAC3C;YACD,OAAO,SAAS,CAAC,MAAM,CAAC;SACzB;;;;QAKD,4BAAY,GAAZ,UAAa,OAAgB;YAC3B,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;SACxC;;;;QAKD,0BAAU,GAAV,UAAW,OAAgB;YACzB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;SACtC;;;;QAKD,wBAAQ,GAAR,UAAS,OAAgB,EAAE,WAAqB;YAC9C,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;SACjD;;;;QAKD,yBAAS,GAAT,UAAU,OAAgB,EAAE,OAAuB;YACjD,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SAC9C;QAkBH,YAAC;IAAD,CAAC;;IChoCD;;;;;;;;;;;;;;;;;;;;;;;;;QAyCE,cAAY,CAAE,EAAE,CAAE,EAAE,CAAE;YACpB,IAAI,EAAE,IAAI,YAAY,IAAI,CAAC,EAAE;gBAC3B,OAAO,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;aAC1B;YACD,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;gBAC5B,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;aACZ;iBAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBAChC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACb,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACb,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACd;iBAAM;gBACL,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;aACZ;SAEF;;QAGD,yBAAU,GAAV;YACE,OAAO;gBACL,CAAC,EAAE,IAAI,CAAC,CAAC;gBACT,CAAC,EAAE,IAAI,CAAC,CAAC;gBACT,CAAC,EAAE,IAAI,CAAC,CAAC;aACV,CAAC;SACH;;QAGM,iBAAY,GAAnB,UAAoB,IAAS;YAC3B,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1C,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACf,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACf,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACf,OAAO,GAAG,CAAC;SACZ;;QAGM,QAAG,GAAV,UAAW,CAAS,EAAE,CAAS,EAAE,CAAS;YACxC,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1C,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACV,OAAO,GAAG,CAAC;SACZ;QAEM,SAAI,GAAX;YACE,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1C,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACV,OAAO,GAAG,CAAC;SACZ;QAEM,UAAK,GAAZ,UAAa,CAAO;YAElB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SAChC;;QAGD,uBAAQ,GAAR;YACE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SAC7B;;;;QAKM,YAAO,GAAd,UAAe,GAAQ;YACrB,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;gBAC9C,OAAO,KAAK,CAAC;aACd;YACD,OAAOA,MAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAIA,MAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAIA,MAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAC7E;QAEM,WAAM,GAAb,UAAc,CAAM;YACJ,OAAO;SAKtB;QAED,sBAAO,GAAP;YACE,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;YACb,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;YACb,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;YACb,OAAO,IAAI,CAAC;SACb;QAED,kBAAG,GAAH,UAAI,CAAS,EAAE,CAAS,EAAE,CAAS;YACjC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACX,OAAO,IAAI,CAAC;SACb;QAED,kBAAG,GAAH,UAAI,CAAO;YACT,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,OAAO,IAAI,CAAC;SACb;QAED,kBAAG,GAAH,UAAI,CAAO;YACT,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,OAAO,IAAI,CAAC;SACb;QAED,kBAAG,GAAH,UAAI,CAAS;YACX,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACZ,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACZ,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACZ,OAAO,IAAI,CAAC;SACb;QAEM,aAAQ,GAAf,UAAgB,CAAO,EAAE,CAAO;YAG9B,OAAO,CAAC,KAAK,CAAC;gBACZ,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;oBACnC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;oBACnC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC7C;;;;QAKM,QAAG,GAAV,UAAW,CAAO,EAAE,CAAO;YACzB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAC1C;;;;QAKM,UAAK,GAAZ,UAAa,CAAO,EAAE,CAAO;YAC3B,OAAO,IAAI,IAAI,CACb,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EACrB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EACrB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CACtB,CAAC;SACH;QAEM,QAAG,GAAV,UAAW,CAAO,EAAE,CAAO;YACzB,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAClD;QAEM,QAAG,GAAV,UAAW,CAAO,EAAE,CAAO;YACzB,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAClD;QAEM,QAAG,GAAV,UAAW,CAAO,EAAE,CAAS;YAC3B,OAAO,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC5C;QAED,kBAAG,GAAH;YACE,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACjB,OAAO,IAAI,CAAC;SACb;QAEM,QAAG,GAAV,UAAW,CAAO;YAChB,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACnC;QACH,WAAC;IAAD,CAAC;;IChND;;;;;;;;;;;;;;;;;;;;;;;IAiCA;;;;;;QAKuC,6BAAK;QAc1C,mBAAY,EAAS,EAAE,EAAS;YAAhC,iBAmBC;;YAjBC,IAAI,EAAE,KAAI,YAAY,SAAS,CAAC,EAAE;gBAChC,OAAO,IAAI,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;aAC9B;YAED,QAAA,iBAAO,SAAC;YAER,KAAI,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC;YAC7B,KAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC;YAGvC,KAAI,CAAC,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACnD,KAAI,CAAC,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAEnD,KAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC7B,KAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC7B,KAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,KAAI,CAAC,YAAY,GAAG,KAAK,CAAC;;SAC3B;;QAGD,8BAAU,GAAV;YACE,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBAEjB,OAAO,EAAE,IAAI,CAAC,SAAS;gBACvB,OAAO,EAAE,IAAI,CAAC,SAAS;gBAEvB,OAAO,EAAE,IAAI,CAAC,SAAS;gBACvB,OAAO,EAAE,IAAI,CAAC,SAAS;gBACvB,UAAU,EAAE,IAAI,CAAC,YAAY;gBAC7B,UAAU,EAAE,IAAI,CAAC,YAAY;aAC9B,CAAC;SACH;;QAGM,sBAAY,GAAnB,UAAoB,IAAS;YAC3B,IAAM,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,KAAK,CAAC,YAAY,EAAE;gBACtB,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aACnC;YACD,IAAI,KAAK,CAAC,YAAY,EAAE;gBACtB,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aACnC;YACD,OAAO,KAAK,CAAC;SACd;;QAGD,2BAAO,GAAP,UAAQ,CAAQ;YACd,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SAC9B;;;;QAKD,iCAAa,GAAb,UAAc,CAAQ;YACpB,IAAI,CAAC,EAAE;gBACL,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;aAC1B;iBAAM;gBACL,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;aAC3B;YACD,OAAO,IAAI,CAAC;SACb;;;;QAKD,iCAAa,GAAb;YACE,OAAO,IAAI,CAAC,SAAS,CAAC;SACvB;;QAGD,2BAAO,GAAP,UAAQ,CAAQ;YACd,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SAC9B;;;;QAKD,iCAAa,GAAb,UAAc,CAAQ;YACpB,IAAI,CAAC,EAAE;gBACL,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;aAC1B;iBAAM;gBACL,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;aAC3B;YACD,OAAO,IAAI,CAAC;SACb;;;;QAKD,iCAAa,GAAb;YACE,OAAO,IAAI,CAAC,SAAS,CAAC;SACvB;;;;QAKD,wBAAI,GAAJ,UAAK,EAAQ,EAAE,EAAQ;YACrB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,OAAO,IAAI,CAAC;SACb;;;;;;;QAQD,0BAAM,GAAN;YACE,IAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;YAC9B,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YACvC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YACvC,OAAO,KAAK,CAAC;SACd;;;;QAKD,iCAAa,GAAb;YACE,OAAO,CAAC,CAAC;SACV;;;;;;;;QASD,6BAAS,GAAT,UAAU,EAAa,EAAE,CAAO;YAC9B,OAAO,KAAK,CAAC;SACd;;;;;;;;;QAUD,2BAAO,GAAP,UAAQ,MAAqB,EAAE,KAAmB,EAAE,EAAa,EAAE,UAAkB;;;;;;;YASnF,IAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,IAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAE3B,IAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,IAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3B,IAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,SAAS,EAAE,CAAC;;;;YAKnB,IAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YACrD,IAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAExC,IAAI,WAAW,IAAI,GAAG,EAAE;gBACtB,OAAO,KAAK,CAAC;aACd;YAED,IAAM,CAAC,GAAG,SAAS,GAAG,WAAW,CAAC;YAClC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE;gBACpC,OAAO,KAAK,CAAC;aACd;YAED,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;;;YAI9C,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1B,IAAI,EAAE,IAAI,GAAG,EAAE;gBACb,OAAO,KAAK,CAAC;aACd;YAED,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;YAC5C,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,EAAE;gBACtB,OAAO,KAAK,CAAC;aACd;YAED,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;YACpB,IAAI,SAAS,GAAG,GAAG,EAAE;gBACnB,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;aACjD;iBAAM;gBACL,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;aAC3C;YACD,OAAO,IAAI,CAAC;SACb;;;;;;;;;QAUD,+BAAW,GAAX,UAAY,IAAU,EAAE,EAAa,EAAE,UAAkB;YACvD,IAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACjD,IAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAEjD,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SAC5B;;;;;;;;QASD,+BAAW,GAAX,UAAY,QAAkB,EAAE,OAAgB;YAC9C,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC;YACpB,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACrE,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC;SAClB;QAED,wCAAoB,GAApB,UAAqB,KAAoB;YACvC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;YAClB,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;SAChC;QArQM,cAAI,GAAG,MAAe,CAAC;QAuQhC,gBAAC;KAAA,CAxQsC,KAAK;;ICtC5C;;;;;;;;;;;;;;;;;;;;;;;IAsCA;;;;;;;;;QAQwC,8BAAK;QAY3C,oBAAY,QAAiB,EAAE,IAAc;YAA7C,iBA0BC;;YAxBC,IAAI,EAAE,KAAI,YAAY,UAAU,CAAC,EAAE;gBACjC,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;aACvC;YAED,QAAA,iBAAO,SAAC;YAER,KAAI,CAAC,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC;YAC9B,KAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC;YACvC,KAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YACrB,KAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YACjB,KAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,KAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,KAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,KAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAE7B,KAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC;YAEvB,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,EAAE;gBAC/B,IAAI,IAAI,EAAE;oBACR,KAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;iBAC5B;qBAAM;oBACL,KAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;iBAC7B;aACF;;SACF;;QAGD,+BAAU,GAAV;YACE,IAAM,IAAI,GAAG;gBACX,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,QAAQ,EAAE,IAAI,CAAC,UAAU;gBACzB,MAAM,EAAE,IAAI,CAAC,QAAQ;gBACrB,aAAa,EAAE,IAAI,CAAC,eAAe;gBACnC,aAAa,EAAE,IAAI,CAAC,eAAe;gBACnC,UAAU,EAAE,IAAmB;gBAC/B,UAAU,EAAE,IAAmB;aAChC,CAAC;YACF,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC;aACrC;YACD,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC;aACrC;YACD,OAAO,IAAI,CAAC;SACb;;QAGM,uBAAY,GAAnB,UAAoB,IAAS,EAAE,OAAY,EAAE,OAAY;YACvD,IAAM,QAAQ,GAAG,EAAY,CAAC;YAC9B,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAC7C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAChD;aACF;YACD,IAAM,KAAK,GAAG,IAAI,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACpD,IAAI,IAAI,CAAC,UAAU,EAAE;gBACnB,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aACtC;YACD,IAAI,IAAI,CAAC,UAAU,EAAE;gBACnB,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aACtC;YACD,OAAO,KAAK,CAAC;SACd;;;;;;;;;;;;QAcD,gCAAW,GAAX,UAAY,QAAgB;YAG1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBAC7B,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE;gBAChB,QAAQ,CAAC,CAAC,EAAE;aAGxB;YAED,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBACxC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;aAC9C;YACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAE3D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,OAAO,IAAI,CAAC;SACb;;;;;;;;QASD,iCAAY,GAAZ,UAAa,QAAgB;YAG3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;;gBAE7B,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE;gBAChB,QAAQ,CAAC,CAAC,EAAE;aAExB;YAED,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBACxC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;aAC9C;YAED,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,OAAO,IAAI,CAAC;SACb;;QAGD,2BAAM,GAAN;YACE,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aACnC;iBAAM;gBACL,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aACpC;SACF;;;;;QAMD,kCAAa,GAAb,UAAc,UAAgB;YAC5B,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC;YAC/B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;SAC7B;QAED,kCAAa,GAAb;YACE,OAAO,IAAI,CAAC,YAAY,CAAC;SAC1B;;;;;QAMD,kCAAa,GAAb,UAAc,UAAgB;YAC5B,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC;YAC/B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;SAC7B;QAED,kCAAa,GAAb;YACE,OAAO,IAAI,CAAC,YAAY,CAAC;SAC1B;;;;;;;QAQD,2BAAM,GAAN;YACE,IAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;YAC/B,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACpC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YACvC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YACvC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;YAC7C,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;YAC7C,OAAO,KAAK,CAAC;SACd;;;;QAKD,kCAAa,GAAb;;YAEE,OAAO,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;SACzB;;QAGD,iCAAY,GAAZ,UAAa,IAAe,EAAE,UAAkB;YAE9C,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC;YAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAE9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YAEjD,IAAI,UAAU,GAAG,CAAC,EAAE;gBAClB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;gBACjD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;aAC1B;iBAAM;gBACL,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC;gBACnC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC;aAC1C;YAED,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE;gBACjC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;gBACjD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;aAC1B;iBAAM;gBACL,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC;gBACnC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC;aAC1C;SACF;QAED,8BAAS,GAAT,UAAU,KAAa;YAErB,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE;gBACxB,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;aAC/B;iBAAM;gBACL,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;aAC3B;SACF;QAED,2BAAM,GAAN;YACE,OAAO,IAAI,CAAC,QAAQ,CAAC;SACtB;;;;;;;;;;QAWD,8BAAS,GAAT,UAAU,EAAa,EAAE,CAAO;YAC9B,OAAO,KAAK,CAAC;SACd;;;;;;;;;QAUD,4BAAO,GAAP,UAAQ,MAAqB,EAAE,KAAmB,EAAE,EAAa,EAAE,UAAkB;YAGnF,IAAM,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5F,OAAO,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;SAChD;;;;;;;;;QAUD,gCAAW,GAAX,UAAY,IAAU,EAAE,EAAa,EAAE,UAAkB;YAGvD,IAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;YAC7D,IAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;YAEjE,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;SAC5B;;;;;;;;;;QAWD,gCAAW,GAAX,UAAY,QAAkB,EAAE,OAAgB;YAC9C,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC;YACpB,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9B,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC;SAClB;QAED,yCAAoB,GAApB,UAAqB,KAAoB,EAAE,UAAkB;YAE3D,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAC/C,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YACnD,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC;YAClC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;YAClB,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;SAChC;QArTM,eAAI,GAAG,OAAgB,CAAC;QAsTjC,iBAAC;KAAA,CAvTuC,KAAK;;IC9C7C;;;;;;;;;;;;;;;;;;;;;;;IAuCA;;;;;;;QAM0C,gCAAK;;QAS7C,sBAAY,QAAiB;YAA7B,iBAkBC;;YAhBC,IAAI,EAAE,KAAI,YAAY,YAAY,CAAC,EAAE;gBACnC,OAAO,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;aACnC;YAED,QAAA,iBAAO,SAAC;YAER,KAAI,CAAC,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC;YAChC,KAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC;YACvC,KAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9B,KAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YACrB,KAAI,CAAC,SAAS,GAAG,EAAE,CAAC;YACpB,KAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YAEjB,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,EAAE;gBAC/B,KAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aACrB;;SACF;;QAGD,iCAAU,GAAV;YACE,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBAEjB,QAAQ,EAAE,IAAI,CAAC,UAAU;aAC1B,CAAC;SACH;;QAGM,yBAAY,GAAnB,UAAoB,IAAS,EAAE,OAAY,EAAE,OAAY;YACvD,IAAM,QAAQ,GAAG,EAAY,CAAC;YAC9B,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAC7C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAChD;aACF;YAED,IAAM,KAAK,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;YACzC,OAAO,KAAK,CAAC;SACd;QAED,gCAAS,GAAT,UAAU,KAAa;YAErB,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;SAC/B;;;;;;;QAQD,6BAAM,GAAN;YACE,IAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;YACjC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC7B,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;gBACrC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;aACnD;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC9C,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;aACjD;YACD,OAAO,KAAK,CAAC;SACd;;;;QAKD,oCAAa,GAAb;YACE,OAAO,CAAC,CAAC;SACV;;QAGD,6BAAM,GAAN;YACE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SAC5B;;;;;;;;;;;QAYD,2BAAI,GAAJ,UAAK,QAAgB;YAEnB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvB,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACzB,OAAO;aACR;YAED,IAAI,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;;YAG/D,IAAM,EAAE,GAAG,EAAY,CAAC;YACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;gBAC1B,IAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAEtB,IAAI,MAAM,GAAG,IAAI,CAAC;gBAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;oBAClC,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ,CAAC,iBAAiB,EAAE;wBACtE,MAAM,GAAG,KAAK,CAAC;wBACf,MAAM;qBACP;iBACF;gBAED,IAAI,MAAM,EAAE;oBACV,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBACZ;aACF;YAED,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,EAAE;gBAGT,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACzB,OAAO;aACR;;;;YAMD,IAAI,EAAE,GAAG,CAAC,CAAC;YACX,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;gBAC1B,IAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClB,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;oBAC9C,EAAE,GAAG,CAAC,CAAC;oBACP,EAAE,GAAG,CAAC,CAAC;iBACR;aACF;YAED,IAAM,IAAI,GAAG,EAAc,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,IAAI,EAAE,GAAG,EAAE,CAAC;YAEZ,OAAO,IAAI,EAAE;gBACX,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;gBAEb,IAAI,EAAE,GAAG,CAAC,CAAC;gBACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;oBAC1B,IAAI,EAAE,KAAK,EAAE,EAAE;wBACb,EAAE,GAAG,CAAC,CAAC;wBACP,SAAS;qBACV;oBAED,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACxC,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACvC,IAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;oBAEnC,IAAI,CAAC,GAAG,GAAG,EAAE;wBACX,EAAE,GAAG,CAAC,CAAC;qBACR;;oBAGD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE;wBACtD,EAAE,GAAG,CAAC,CAAC;qBACR;iBACF;gBAED,EAAE,CAAC,CAAC;gBACJ,EAAE,GAAG,EAAE,CAAC;gBAER,IAAI,EAAE,KAAK,EAAE,EAAE;oBACb,MAAM;iBACP;aACF;YAED,IAAI,CAAC,GAAG,CAAC,EAAE;gBAGT,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACzB,OAAO;aACR;YAED,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;;YAGjB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;gBAC1B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;aAClC;;YAGD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;gBAC1B,IAAM,EAAE,GAAG,CAAC,CAAC;gBACb,IAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACjC,IAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;gBAEhE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBACjD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;aAC/B;;YAGD,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;SACvD;;QAGD,gCAAS,GAAT,UAAU,EAAU,EAAE,EAAU,EAAE,MAAa,EAAE,KAAc;;YAE7D,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YAExC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACxC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YAExC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YAEjB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;gBACxB,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC;gBAEnB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAEhC,IAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;gBAChC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACrB,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;;gBAGrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE;oBACrC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC/D,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC1D;aACF;SACF;;;;;;;;QASD,gCAAS,GAAT,UAAU,EAAa,EAAE,CAAO;YAC9B,IAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAErD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE;gBACrC,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9E,IAAI,GAAG,GAAG,GAAG,EAAE;oBACb,OAAO,KAAK,CAAC;iBACd;aACF;YAED,OAAO,IAAI,CAAC;SACb;;;;;;;;;QAUD,8BAAO,GAAP,UAAQ,MAAqB,EAAE,KAAmB,EAAE,EAAa,EAAE,UAAkB;;YAGnF,IAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,IAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAE3B,IAAI,KAAK,GAAG,GAAG,CAAC;YAChB,IAAI,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;YAE9B,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;YAEf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE;;;;gBAIrC,IAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAChF,IAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAEnD,IAAI,WAAW,IAAI,GAAG,EAAE;oBACtB,IAAI,SAAS,GAAG,GAAG,EAAE;wBACnB,OAAO,KAAK,CAAC;qBACd;iBACF;qBAAM;;;;;oBAKL,IAAI,WAAW,GAAG,GAAG,IAAI,SAAS,GAAG,KAAK,GAAG,WAAW,EAAE;;;wBAGxD,KAAK,GAAG,SAAS,GAAG,WAAW,CAAC;wBAChC,KAAK,GAAG,CAAC,CAAC;qBACX;yBAAM,IAAI,WAAW,GAAG,GAAG,IAAI,SAAS,GAAG,KAAK,GAAG,WAAW,EAAE;;;wBAG/D,KAAK,GAAG,SAAS,GAAG,WAAW,CAAC;qBACjC;iBACF;;;;;gBAMD,IAAI,KAAK,GAAG,KAAK,EAAE;oBACjB,OAAO,KAAK,CAAC;iBACd;aACF;YAID,IAAI,KAAK,IAAI,CAAC,EAAE;gBACd,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACxB,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;gBACzD,OAAO,IAAI,CAAC;aACb;YAED,OAAO,KAAK,CAAC;SACd;;;;;;;;;QAUD,kCAAW,GAAX,UAAY,IAAU,EAAE,EAAa,EAAE,UAAkB;YACvD,IAAI,IAAI,GAAG,QAAQ,CAAC;YACpB,IAAI,IAAI,GAAG,QAAQ,CAAC;YACpB,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;YACrB,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;YACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE;gBACrC,IAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpD,IAAI,GAAGA,MAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3B,IAAI,GAAGA,MAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3B,IAAI,GAAGA,MAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3B,IAAI,GAAGA,MAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;aAC5B;YAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SAC5B;;;;;;;;QASD,kCAAW,GAAX,UAAY,QAAkB,EAAE,OAAe;YA2B7C,IAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,IAAI,GAAG,GAAG,CAAC;YACf,IAAI,CAAC,GAAG,GAAG,CAAC;;;YAIZ,IAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;;YAGtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE;gBACrC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3B;YACD,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAE1B,IAAM,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC;YAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE;;gBAErC,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3C,IAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAEzG,IAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBAErC,IAAM,YAAY,GAAG,GAAG,GAAG,CAAC,CAAC;gBAC7B,IAAI,IAAI,YAAY,CAAC;;gBAGrB,MAAM,CAAC,UAAU,CAAC,YAAY,GAAG,MAAM,EAAE,EAAE,EAAE,YAAY,GAAG,MAAM,EAAE,EAAE,CAAC,CAAC;gBAExE,IAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;gBACjB,IAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;gBACjB,IAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;gBACjB,IAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;gBAEjB,IAAM,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;gBAChD,IAAM,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;gBAEhD,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,KAAK,GAAG,KAAK,CAAC,CAAC;aAC5C;;YAGD,QAAQ,CAAC,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;YAI/B,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;YACvB,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;;YAG5C,QAAQ,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;;YAGzB,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;SACvG;;;;;QAMD,+BAAQ,GAAR;YACE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE;gBACrC,IAAM,EAAE,GAAG,CAAC,CAAC;gBACb,IAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC7C,IAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBAC9B,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE;oBACrC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE;wBACtB,SAAS;qBACV;oBAED,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC1C,IAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBACnC,IAAI,CAAC,GAAG,GAAG,EAAE;wBACX,OAAO,KAAK,CAAC;qBACd;iBACF;aACF;YAED,OAAO,IAAI,CAAC;SACb;QAED,2CAAoB,GAApB,UAAqB,KAAoB;YACvC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YACnC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC7B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;SAChC;QA9dM,iBAAI,GAAG,SAAkB,CAAC;QA+dnC,mBAAC;KAAA,CAheyC,KAAK,GAge9C;IAED,SAAS,eAAe,CAAC,EAAU,EAAE,KAAa;QAGhD,IAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,IAAI,IAAI,GAAG,GAAG,CAAC;;;QAIf,IAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;eAOxB;QAED,IAAM,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;QAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE;;YAE9B,IAAM,EAAE,GAAG,IAAI,CAAC;YAChB,IAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACjB,IAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAE7C,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5B,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAE5B,IAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAErC,IAAM,YAAY,GAAG,GAAG,GAAG,CAAC,CAAC;YAC7B,IAAI,IAAI,YAAY,CAAC;;YAGrB,CAAC,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC;YAClC,CAAC,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC;YAClC,CAAC,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC;SACnC;QAID,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QAClB,OAAO,CAAC,CAAC;IACX;;IC1jBA;;;;;;;;;;;;;;;;;;;;;;;IA2BA;;;;QAGsC,4BAAY;QAGhD,kBAAY,EAAU,EAAE,EAAU,EAAE,MAAa,EAAE,KAAc;YAAjE,iBASC;;YAPC,IAAI,EAAE,KAAI,YAAY,QAAQ,CAAC,EAAE;gBAC/B,OAAO,IAAI,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;aAC5C;YAED,QAAA,iBAAO,SAAC;YAER,KAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;;SACvC;QAXM,aAAI,GAAG,SAAkB,CAAC;QAYnC,eAAC;KAAA,CAbqC,YAAY;;IC9BlD;;;;;;;;;;;;;;;;;;;;;;;;QAsCyC,+BAAK;;QAQ5C,qBAAY,CAAC,EAAE,CAAE;YAAjB,iBAsBC;;YApBC,IAAI,EAAE,KAAI,YAAY,WAAW,CAAC,EAAE;gBAClC,OAAO,IAAI,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAC9B;YAED,QAAA,iBAAO,SAAC;YAER,KAAI,CAAC,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC;YAC/B,KAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACvB,KAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YAElB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAC5C,KAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAEpB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;oBACzB,KAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;iBACnB;aAEF;iBAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBAChC,KAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;aACnB;;SACF;;QAGD,gCAAU,GAAV;YACE,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBAEjB,CAAC,EAAE,IAAI,CAAC,GAAG;gBACX,MAAM,EAAE,IAAI,CAAC,QAAQ;aACtB,CAAC;SACH;;QAGM,wBAAY,GAAnB,UAAoB,IAAS;YAC3B,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;SAC7C;;QAGD,+BAAS,GAAT;YACE,OAAO,IAAI,CAAC,QAAQ,CAAC;SACtB;QAED,+BAAS,GAAT;YACE,OAAO,IAAI,CAAC,GAAG,CAAC;SACjB;QAED,+BAAS,GAAT,UAAU,KAAQ;YAEhB,OAAO,IAAI,CAAC,GAAG,CAAC;SACjB;;;;;;;QAQD,4BAAM,GAAN;YACE,IAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAChC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;SACd;;;;QAKD,mCAAa,GAAb;YACE,OAAO,CAAC,CAAC;SACV;;;;;;;;QASD,+BAAS,GAAT,UAAU,EAAa,EAAE,CAAO;YAC9B,IAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;SACxD;;;;;;;;;QAUD,6BAAO,GAAP,UAAQ,MAAqB,EAAE,KAAmB,EAAE,EAAa,EAAE,UAAkB;;;;;YAMnF,IAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7D,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACvC,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;;YAGzD,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YACvC,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACzB,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1B,IAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;;YAG7B,IAAI,KAAK,GAAG,GAAG,IAAI,EAAE,GAAGA,MAAI,CAAC,OAAO,EAAE;gBACpC,OAAO,KAAK,CAAC;aACd;;YAGD,IAAI,CAAC,GAAG,EAAE,CAAC,GAAGA,MAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;;YAGhC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,WAAW,GAAG,EAAE,EAAE;gBAC3C,CAAC,IAAI,EAAE,CAAC;gBACR,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACpB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACnD,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAC;aACb;YAED,OAAO,KAAK,CAAC;SACd;;;;;;;;;QAUD,iCAAW,GAAX,UAAY,IAAU,EAAE,EAAa,EAAE,UAAkB;YACvD,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;SAClE;;;;;;;;QASD,iCAAW,GAAX,UAAY,QAAkB,EAAE,OAAe;YAC7C,QAAQ,CAAC,IAAI,GAAG,OAAO,GAAGA,MAAI,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAClE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC;;YAE3B,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI;mBACnB,GAAG,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;SAC5E;QAED,0CAAoB,GAApB,UAAqB,KAAoB;YACvC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;YAClB,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;SAChC;QA3KM,gBAAI,GAAG,QAAiB,CAAC;QA6KlC,kBAAC;KAAA,CA9KwC,KAAK;;ICtC9C;;;;;;;;;;;;;;;;;;;;;;;IAwEA,IAAME,UAAQ,GAAG;QACf,WAAW,EAAG,GAAG;QACjB,YAAY,EAAG,GAAG;KACnB,CAAC;IAEF;;;;;;;;QAO2C,iCAAK;QA2B9C,uBAAY,GAAqB,EAAE,KAAY,EAAE,KAAY,EAAE,OAAc,EAAE,OAAc;YAA7F,iBA6CC;;YA3CC,IAAI,EAAE,KAAI,YAAY,aAAa,CAAC,EAAE;gBACpC,OAAO,IAAI,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;aAC/D;;YAGD,IAAI,KAAK,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE;gBACjF,IAAM,IAAI,GAAG,KAAK,CAAC;gBACnB,KAAK,GAAG,OAAO,CAAC;gBAChB,OAAO,GAAG,IAAI,CAAC;aAChB;YAED,GAAG,GAAG,OAAO,CAAC,GAAG,EAAEA,UAAQ,CAAC,CAAC;YAC7B,QAAA,kBAAM,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,SAAC;YACzB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YACrB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YAErB,KAAI,CAAC,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC;;YAGjC,KAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3G,KAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3G,KAAI,CAAC,QAAQ,GAAGF,MAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM;gBACpD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,KAAI,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,KAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YACpG,KAAI,CAAC,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC;YACrC,KAAI,CAAC,cAAc,GAAG,GAAG,CAAC,YAAY,CAAC;YACvC,KAAI,CAAC,SAAS,GAAG,GAAG,CAAC;YACrB,KAAI,CAAC,OAAO,GAAG,GAAG,CAAC;YACnB,KAAI,CAAC,MAAM,GAAG,GAAG,CAAC;;;;;;;;;;;;;;SAgBnB;;QAGD,kCAAU,GAAV;YACE,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;gBAEzC,WAAW,EAAE,IAAI,CAAC,aAAa;gBAC/B,YAAY,EAAE,IAAI,CAAC,cAAc;gBAEjC,YAAY,EAAE,IAAI,CAAC,cAAc;gBACjC,YAAY,EAAE,IAAI,CAAC,cAAc;gBACjC,MAAM,EAAE,IAAI,CAAC,QAAQ;gBAErB,OAAO,EAAE,IAAI,CAAC,SAAS;gBACvB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,IAAI,EAAE,IAAI,CAAC,MAAM;aAClB,CAAC;SACH;;QAGM,0BAAY,GAAnB,UAAoB,IAAS,EAAE,KAAU,EAAE,OAAY;YACrD,IAAI,gBAAO,IAAI,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAM,KAAK,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;YACtC,OAAO,KAAK,CAAC;SACd;;QAGD,mCAAW,GAAX,UAAY,GAMX;YACC,IAAI,GAAG,CAAC,OAAO,EAAE;gBACf,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;aACtE;iBAAM,IAAI,GAAG,CAAC,YAAY,EAAE;gBAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;aAC/C;YAED,IAAI,GAAG,CAAC,OAAO,EAAE;gBACf,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;aACtE;iBAAM,IAAI,GAAG,CAAC,YAAY,EAAE;gBAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;aAC/C;YAED,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;gBAClB,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;aAC7B;iBAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAC1B;iBAAM,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE;gBACnE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CACzB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,EAC/C,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAClD,CAAC;aACH;SACF;;;;QAKD,uCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,uCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;;QAMD,iCAAS,GAAT,UAAU,MAAc;YACtB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;SACxB;;;;QAKD,iCAAS,GAAT;YACE,OAAO,IAAI,CAAC,QAAQ,CAAC;SACtB;QAED,oCAAY,GAAZ,UAAa,EAAU;YACrB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;SACzB;QAED,oCAAY,GAAZ;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;QAED,uCAAe,GAAf,UAAgB,KAAa;YAC3B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;SAC7B;QAED,uCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,kCAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,kCAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,wCAAgB,GAAhB,UAAiB,MAAc;YAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SAC9D;;;;QAKD,yCAAiB,GAAjB,UAAkB,MAAc;YAC9B,OAAO,GAAG,CAAC;SACZ;QAED,+CAAuB,GAAvB,UAAwB,IAAc;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEvB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAChF,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAChF,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;;YAGtE,IAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACjC,IAAI,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE;gBAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC;aAC5B;iBAAM;gBACL,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;aAC3B;YAED,IAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YACrD,IAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YACrD,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,UAAU;kBACtE,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;;YAGjC,IAAI,CAAC,MAAM,GAAG,OAAO,IAAI,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC;YAEnD,IAAI,IAAI,CAAC,aAAa,GAAG,GAAG,EAAE;gBAC5B,IAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;;gBAGjC,IAAM,KAAK,GAAG,GAAG,GAAGA,MAAI,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;;gBAGjD,IAAM,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;;gBAG1D,IAAM,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;;gBAGtC,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;gBAClB,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC/B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;gBAC9D,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;gBAEvC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;gBACxB,IAAI,CAAC,MAAM,GAAG,OAAO,IAAI,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC;aACpD;iBAAM;gBACL,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;gBACnB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;aACnB;YAED,IAAI,IAAI,CAAC,YAAY,EAAE;;gBAErB,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC;gBAE/B,IAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;gBAEpD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC9B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAEtD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC9B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;aAEvD;iBAAM;gBACL,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;aACtB;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;QAED,gDAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;;YAGnC,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3D,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3D,IAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAE/D,IAAM,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM;mBACrB,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3D,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;YAE1B,IAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7C,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC9B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACtD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC9B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAEtD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;;;;QAKD,gDAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAI,IAAI,CAAC,aAAa,GAAG,GAAG,EAAE;;gBAE5B,OAAO,IAAI,CAAC;aACb;YAED,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEvB,IAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YACpE,IAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YACpE,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAEvD,IAAM,MAAM,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,CAAC,GAAGA,MAAI;iBACH,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YAE3E,IAAM,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YACjC,IAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAEtC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC9B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC/C,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC9B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAE/C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAE/B,OAAOA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC;SAC1C;QA1WM,kBAAI,GAAG,gBAAyB,CAAC;QA4W1C,oBAAC;KAAA,CA7W0C,KAAK;;ICpFhD;;;;;;;;;;;;;;;;;;;;;;;IAiEA,IAAME,UAAQ,GAAG;QACf,QAAQ,EAAG,GAAG;QACd,SAAS,EAAG,GAAG;KAChB,CAAC;IAEF;;;;;;;QAM2C,iCAAK;QA4B9C,uBAAY,GAAqB,EAAE,KAAY,EAAE,KAAY,EAAE,MAAa;YAA5E,iBAiCC;;YA/BC,IAAI,EAAE,KAAI,YAAY,aAAa,CAAC,EAAE;gBACpC,OAAO,IAAI,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;aACrD;YAED,GAAG,GAAG,OAAO,CAAC,GAAG,EAAEA,UAAQ,CAAC,CAAC;YAC7B,QAAA,kBAAM,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,SAAC;YACzB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YACrB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YAErB,KAAI,CAAC,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC;YAEjC,KAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACzG,KAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;;YAGzG,KAAI,CAAC,eAAe,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACnC,KAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC;YAC5B,KAAI,CAAC,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC;YAC/B,KAAI,CAAC,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC;;;;;;;;;;;;SAalC;;QAGD,kCAAU,GAAV;YACE,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;gBAEzC,QAAQ,EAAE,IAAI,CAAC,UAAU;gBACzB,SAAS,EAAE,IAAI,CAAC,WAAW;gBAE3B,YAAY,EAAE,IAAI,CAAC,cAAc;gBACjC,YAAY,EAAE,IAAI,CAAC,cAAc;aAClC,CAAC;SACH;;QAGM,0BAAY,GAAnB,UAAoB,IAAS,EAAE,KAAU,EAAE,OAAY;YACrD,IAAI,gBAAO,IAAI,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAM,KAAK,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;YACtC,OAAO,KAAK,CAAC;SACd;;QAGD,mCAAW,GAAX,UAAY,GAKX;YACC,IAAI,GAAG,CAAC,OAAO,EAAE;gBACf,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;aACtE;iBAAM,IAAI,GAAG,CAAC,YAAY,EAAE;gBAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;aAC/C;YAED,IAAI,GAAG,CAAC,OAAO,EAAE;gBACf,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;aACtE;iBAAM,IAAI,GAAG,CAAC,YAAY,EAAE;gBAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;aAC/C;SACF;;;;QAMD,uCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,uCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,mCAAW,GAAX,UAAY,KAAa;YAEvB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;SACzB;;;;QAKD,mCAAW,GAAX;YACE,OAAO,IAAI,CAAC,UAAU,CAAC;SACxB;;;;QAKD,oCAAY,GAAZ,UAAa,MAAc;YAEzB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;SAC3B;;;;QAKD,oCAAY,GAAZ;YACE,OAAO,IAAI,CAAC,WAAW,CAAC;SACzB;;;;QAKD,kCAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,kCAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,wCAAgB,GAAhB,UAAiB,MAAc;YAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;SACtD;;;;QAKD,yCAAiB,GAAjB,UAAkB,MAAc;YAC9B,OAAO,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC;SACvC;QAED,+CAAuB,GAAvB,UAAwB,IAAc;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;YAGvB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAChF,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;;;;;;;;YAWhF,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAExB,IAAM,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC;YACtB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;kBAC9D,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1E,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;kBAC9D,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAElB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;YAEnC,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,aAAa,GAAG,GAAG,EAAE;gBAC5B,IAAI,CAAC,aAAa,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC;aAC/C;YAED,IAAI,IAAI,CAAC,YAAY,EAAE;;gBAErB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,OAAO,CAAC;gBAEtC,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBAEnE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAEtE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;aAEvE;iBAAM;gBACL,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;gBAC/B,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC;aAC7B;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;QAED,gDAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAExB,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;;YAGlB;gBACE,IAAM,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC;gBACrB,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gBAEzC,IAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBACzC,IAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;gBACxC,IAAI,CAAC,gBAAgB,GAAGF,MAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,GAAG,OAAO,EAC9D,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBAC7B,OAAO,GAAG,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC;gBAE7C,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;gBACnB,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;aACpB;;YAGD;gBACE,IAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAC7E,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAEvC,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC/D,IAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC;gBACxC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAElC,IAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;gBAEvC,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,GAAG,UAAU,GAAG,UAAU,EAAE;oBAClE,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;oBACjC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;iBACtC;gBAED,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;gBAErD,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACvB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAElD,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACvB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;aACnD;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;;;;QAKD,gDAAwB,GAAxB,UAAyB,IAAc;YACrC,OAAO,IAAI,CAAC;SACb;QAhUM,kBAAI,GAAG,gBAAyB,CAAC;QAkU1C,oBAAC;KAAA,CAnU0C,KAAK;;IC5EhD;;;;;;;;;;;;;;;;;;;;;;;IAiCA;;;;QAUE,eAAY,CAAQ,EAAE,CAAQ,EAAE,CAAQ;YACtC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE;gBACvC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACxB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACxB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACzB;iBAAM;gBACL,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACtB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACtB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;aACvB;SACF;;QAGD,wBAAQ,GAAR;YACE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SAC7B;QAEM,aAAO,GAAd,UAAe,GAAQ;YACrB,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;gBAC9C,OAAO,KAAK,CAAC;aACd;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;SAC7E;QAEM,YAAM,GAAb,UAAc,CAAM;YACJ,OAAO;SAKtB;;;;QAKD,uBAAO,GAAP;YACE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;SACb;;;;;QAMD,uBAAO,GAAP,UAAQ,CAAO;YACb,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1D,IAAI,GAAG,KAAK,GAAG,EAAE;gBACf,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;aACjB;YACD,IAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,CAAC;SACV;;;;;;QAOD,uBAAO,GAAP,UAAQ,CAAO;YACb,IAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,IAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,IAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,IAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;YAChC,IAAI,GAAG,KAAK,GAAG,EAAE;gBACf,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;aACjB;YACD,IAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACpC,OAAO,CAAC,CAAC;SACV;;;;;QAMD,4BAAY,GAAZ,UAAa,CAAQ;YACnB,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,GAAG,KAAK,GAAG,EAAE;gBACf,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;aACjB;YACD,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;YACjB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;YAClB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;YACb,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;YAClB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;YACjB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;YACb,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;YACb,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;YACb,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;SACd;;;;;QAMD,+BAAe,GAAf,UAAgB,CAAQ;YACtB,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1D,IAAI,GAAG,KAAK,GAAG,EAAE;gBACf,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;aACjB;YACD,IAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,IAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,IAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,IAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,IAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,IAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAEtB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YACvC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YACvC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YAEvC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YACvC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YAEvC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;SACxC;;QAQM,SAAG,GAAV,UAAW,CAAC,EAAE,CAAC;YAEb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;gBAEzC,IAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACrD,IAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACrD,IAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACrD,OAAO,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;aAE1B;iBAAM,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE;gBAEpC,IAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACtC,IAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACtC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aACvB;SAGF;QAEM,aAAO,GAAd,UAAe,CAAQ,EAAE,CAAO;YAG9B,IAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrD,IAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrD,IAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrD,OAAO,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SAC1B;QAEM,aAAO,GAAd,UAAe,CAAQ,EAAE,CAAO;YAG9B,IAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtC,IAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACvB;QAEM,SAAG,GAAV,UAAW,CAAQ,EAAE,CAAQ;YAG3B,OAAO,IAAI,KAAK,CACd,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EACpB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EACpB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CACrB,CAAC;SACH;QACH,YAAC;IAAD,CAAC;;ICjOD;;;;;;;;;;;;;;;;;;;;;;;IAyCA,IAAMG,eAAa,GAAG,CAAC,CAAC;IACxB,IAAMC,cAAY,GAAG,CAAC,CAAC;IACvB,IAAMC,cAAY,GAAG,CAAC,CAAC;IACvB,IAAMC,aAAW,GAAG,CAAC,CAAC;IAoEtB,IAAMJ,UAAQ,GAAG;QACf,UAAU,EAAG,GAAG;QAChB,UAAU,EAAG,GAAG;QAChB,cAAc,EAAG,GAAG;QACpB,UAAU,EAAG,GAAG;QAChB,WAAW,EAAG,KAAK;QACnB,WAAW,EAAG,KAAK;KACpB,CAAC;IAEF;;;;;;;;;QAQ2C,iCAAK;;QAkC9C,uBAAY,GAAqB,EAAE,KAAY,EAAE,KAAY,EAAE,MAAa;YAA5E,iBAuCC;;YArCC,IAAI,EAAE,KAAI,YAAY,aAAa,CAAC,EAAE;gBACpC,OAAO,IAAI,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;aACrD;YAED,GAAG,GAAG,OAAO,CAAC,GAAG,EAAEA,UAAQ,CAAC,CAAC;YAC7B,QAAA,kBAAM,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,SAAC;;6BAfV,YAAM,GAAU,IAAI,KAAK,EAAE,CAAC;6BAG5B,kBAAY,GAAWC,eAAa,CAAC;YAapD,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YACrB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YAErB,KAAI,CAAC,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC;YAEjC,KAAI,CAAC,cAAc,GAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1G,KAAI,CAAC,cAAc,GAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1G,KAAI,CAAC,gBAAgB,GAAGH,MAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC,cAAc,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAErH,KAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;YAC5B,KAAI,CAAC,cAAc,GAAG,GAAG,CAAC;YAE1B,KAAI,CAAC,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC;YACnC,KAAI,CAAC,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC;YACnC,KAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,cAAc,CAAC;YAC3C,KAAI,CAAC,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC;YACnC,KAAI,CAAC,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC;YACrC,KAAI,CAAC,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC;;;;;;;;;;;;;SActC;;QAGD,kCAAU,GAAV;YACE,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;gBAEzC,UAAU,EAAE,IAAI,CAAC,YAAY;gBAC7B,UAAU,EAAE,IAAI,CAAC,YAAY;gBAC7B,cAAc,EAAE,IAAI,CAAC,gBAAgB;gBACrC,UAAU,EAAE,IAAI,CAAC,YAAY;gBAC7B,WAAW,EAAE,IAAI,CAAC,aAAa;gBAC/B,WAAW,EAAE,IAAI,CAAC,aAAa;gBAE/B,YAAY,EAAE,IAAI,CAAC,cAAc;gBACjC,YAAY,EAAE,IAAI,CAAC,cAAc;gBACjC,cAAc,EAAE,IAAI,CAAC,gBAAgB;aACtC,CAAC;SACH;;QAGM,0BAAY,GAAnB,UAAoB,IAAS,EAAE,KAAU,EAAE,OAAY;YACrD,IAAI,gBAAO,IAAI,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAM,KAAK,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;YACtC,OAAO,KAAK,CAAC;SACd;;QAGD,mCAAW,GAAX,UAAY,GAKX;YACC,IAAI,GAAG,CAAC,OAAO,EAAE;gBACf,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;aACtE;iBAAM,IAAI,GAAG,CAAC,YAAY,EAAE;gBAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;aAC/C;YAED,IAAI,GAAG,CAAC,OAAO,EAAE;gBACf,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;aACtE;iBAAM,IAAI,GAAG,CAAC,YAAY,EAAE;gBAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;aAC/C;SACF;;;;QAKD,uCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,uCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,yCAAiB,GAAjB;YACE,OAAO,IAAI,CAAC,gBAAgB,CAAC;SAC9B;;;;QAKD,qCAAa,GAAb;YACE,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC;SAC5D;;;;QAKD,qCAAa,GAAb;YACE,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,OAAO,EAAE,CAAC,iBAAiB,GAAG,EAAE,CAAC,iBAAiB,CAAC;SACpD;;;;QAKD,sCAAc,GAAd;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;;;;QAKD,mCAAW,GAAX,UAAY,IAAa;YACvB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;SAC3B;;;;QAKD,sCAAc,GAAd,UAAe,MAAc;YAC3B,OAAO,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC;SACrC;;;;QAKD,qCAAa,GAAb,UAAc,KAAa;YACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;SAC3B;;;;QAKD,qCAAa,GAAb;YACE,OAAO,IAAI,CAAC,YAAY,CAAC;SAC1B;;;;QAKD,yCAAiB,GAAjB,UAAkB,MAAc;YAC9B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;SAChC;QAED,yCAAiB,GAAjB;YACE,OAAO,IAAI,CAAC,gBAAgB,CAAC;SAC9B;;;;QAKD,sCAAc,GAAd;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;;;;QAKD,mCAAW,GAAX,UAAY,IAAa;YACvB,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE;gBAC9B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gBAC1B,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC;aACxB;SACF;;;;QAKD,qCAAa,GAAb;YACE,OAAO,IAAI,CAAC,YAAY,CAAC;SAC1B;;;;QAKD,qCAAa,GAAb;YACE,OAAO,IAAI,CAAC,YAAY,CAAC;SAC1B;;;;QAKD,iCAAS,GAAT,UAAU,KAAa,EAAE,KAAa;YAGpC,IAAI,KAAK,IAAI,IAAI,CAAC,YAAY,IAAI,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE;gBAC5D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC;gBACvB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;aAC3B;SACF;;;;QAKD,kCAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,kCAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,wCAAgB,GAAhB,UAAiB,MAAc;YAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SACjE;;;;;QAMD,yCAAiB,GAAjB,UAAkB,MAAc;YAC9B,OAAO,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;SAClC;QAED,+CAAuB,GAAvB,UAAwB,IAAc;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEvB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAChF,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;;;;;;;;YAWhF,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAExB,IAAM,aAAa,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;YAExC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;kBACnE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;kBAC1D,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;kBACnE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;YAE3B,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,WAAW,GAAG,GAAG,EAAE;gBAC1B,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;aAC3C;YAED,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK,IAAI,aAAa,EAAE;gBAChD,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;aAC3B;YAED,IAAI,IAAI,CAAC,aAAa,IAAI,aAAa,IAAI,KAAK,EAAE;gBAChD,IAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBAEnD,IAAIA,MAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,GAAG,QAAQ,CAAC,WAAW,EAAE;oBAChF,IAAI,CAAC,YAAY,GAAGM,aAAW,CAAC;iBAEjC;qBAAM,IAAI,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE;oBAC1C,IAAI,IAAI,CAAC,YAAY,IAAIF,cAAY,EAAE;wBACrC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC;qBACxB;oBACD,IAAI,CAAC,YAAY,GAAGA,cAAY,CAAC;iBAElC;qBAAM,IAAI,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE;oBAC1C,IAAI,IAAI,CAAC,YAAY,IAAIC,cAAY,EAAE;wBACrC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC;qBACxB;oBACD,IAAI,CAAC,YAAY,GAAGA,cAAY,CAAC;iBAElC;qBAAM;oBACL,IAAI,CAAC,YAAY,GAAGF,eAAa,CAAC;oBAClC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC;iBACxB;aAEF;iBAAM;gBACL,IAAI,CAAC,YAAY,GAAGA,eAAa,CAAC;aACnC;YAED,IAAI,IAAI,CAAC,YAAY,EAAE;;gBAErB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACjC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,CAAC;gBAEpC,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAEvD,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAEvF,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;aAExF;iBAAM;gBACL,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;aAC3B;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;QAED,gDAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAExB,IAAM,aAAa,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;;YAGxC,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY,IAAIG,aAAW;mBACnD,aAAa,IAAI,KAAK,EAAE;gBAC7B,IAAM,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC;gBACzC,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBACvC,IAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC;gBACvC,IAAM,UAAU,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBACnD,IAAI,CAAC,cAAc,GAAGN,MAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,OAAO,EAC1D,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBAC7B,OAAO,GAAG,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC;gBAE3C,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;gBACnB,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;aACpB;;YAGD,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY,IAAIG,eAAa;mBACrD,aAAa,IAAI,KAAK,EAAE;gBAC7B,IAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1B,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7D,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7D,IAAM,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC;gBACtB,IAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBAE/C,IAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBAEpD,IAAI,IAAI,CAAC,YAAY,IAAIG,aAAW,EAAE;oBACpC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;iBAE7B;qBAAM,IAAI,IAAI,CAAC,YAAY,IAAIF,cAAY,EAAE;oBAC5C,IAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;oBAEhD,IAAI,UAAU,GAAG,GAAG,EAAE;wBACpB,IAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;wBACpG,IAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;wBACzC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;wBACtB,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;wBACtB,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;wBAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;wBAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;wBAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC;qBAExB;yBAAM;wBACL,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;qBAC7B;iBAEF;qBAAM,IAAI,IAAI,CAAC,YAAY,IAAIC,cAAY,EAAE;oBAC5C,IAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;oBAEhD,IAAI,UAAU,GAAG,GAAG,EAAE;wBACpB,IAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;wBACpG,IAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;wBACzC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;wBACtB,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;wBACtB,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;wBAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;wBAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;wBAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC;qBAExB;yBAAM;wBACL,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;qBAC7B;iBACF;gBAED,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;gBAEzC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAE1D,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;aAE3D;iBAAM;;gBAEL,IAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACzB,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5D,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5D,IAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;gBAEpD,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;gBAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;gBAE9B,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACvB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAElD,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACvB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;aACnD;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;;;;QAKD,gDAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEvB,IAAI,YAAY,GAAG,GAAG,CAAC;YACvB,IAAI,aAAa,GAAG,GAAG,CAAC;YAExB,IAAM,aAAa,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;;YAG3D,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY,IAAIF,eAAa;mBACrD,aAAa,IAAI,KAAK,EAAE;gBAC7B,IAAM,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBAC9C,IAAI,YAAY,GAAG,GAAG,CAAC;gBAEvB,IAAI,IAAI,CAAC,YAAY,IAAIG,aAAW,EAAE;;oBAEpC,IAAM,CAAC,GAAGN,MAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,EAC1C,CAAC,QAAQ,CAAC,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAC;oBACnE,YAAY,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;oBACrC,YAAY,GAAGA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAE5B;qBAAM,IAAI,IAAI,CAAC,YAAY,IAAII,cAAY,EAAE;oBAC5C,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;oBAClC,YAAY,GAAG,CAAC,CAAC,CAAC;;oBAGlB,CAAC,GAAGJ,MAAI,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,oBAAoB,EACnE,GAAG,CAAC,CAAC;oBACT,YAAY,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;iBAEtC;qBAAM,IAAI,IAAI,CAAC,YAAY,IAAIK,cAAY,EAAE;oBAC5C,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;oBAClC,YAAY,GAAG,CAAC,CAAC;;oBAGjB,CAAC,GAAGL,MAAI,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,GAAG,EACxC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;oBACnC,YAAY,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;iBACtC;gBAED,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC;gBAClC,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC;aACnC;;YAGD;gBACE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAChB,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAChB,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAC/E,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAE/E,IAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACtB,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3B,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3B,aAAa,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;gBAE3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;gBAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;gBAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;gBACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;gBAExB,IAAM,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC;gBACtB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACvD,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC9C,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAEvD,IAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAErC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACvB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBAE3C,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACvB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;aAC5C;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAE/B,OAAO,aAAa,IAAI,QAAQ,CAAC,UAAU;mBACpC,YAAY,IAAI,QAAQ,CAAC,WAAW,CAAC;SAC7C;QA3lBM,kBAAI,GAAG,gBAAyB,CAAC;QA6lB1C,oBAAC;KAAA,CA9lB0C,KAAK;;ICjIhD;;;;;;;;;;;;;;;;;;;;;;;IAyCA,IAAMG,eAAa,GAAG,CAAC,CAAC;IACxB,IAAM,YAAY,GAAG,CAAC,CAAC;IACvB,IAAME,cAAY,GAAG,CAAC,CAAC;IACvB,IAAM,WAAW,GAAG,CAAC,CAAC;IAgEtB,IAAMH,UAAQ,GAAG;QACf,WAAW,EAAG,KAAK;QACnB,gBAAgB,EAAG,GAAG;QACtB,gBAAgB,EAAG,GAAG;QACtB,WAAW,EAAG,KAAK;QACnB,aAAa,EAAG,GAAG;QACnB,UAAU,EAAG,GAAG;KACjB,CAAC;IAEF;;;;;;;QAM4C,kCAAK;QAoC/C,wBAAY,GAAsB,EAAE,KAAY,EAAE,KAAY,EAAE,MAAa,EAAE,IAAW;YAA1F,iBA6GC;;YA3GC,IAAI,EAAE,KAAI,YAAY,cAAc,CAAC,EAAE;gBACrC,OAAO,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;aAC5D;YAED,GAAG,GAAG,OAAO,CAAC,GAAG,EAAEA,UAAQ,CAAC,CAAC;YAC7B,QAAA,kBAAM,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,SAAC;YACzB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YACrB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YAErB,KAAI,CAAC,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC;YAElC,KAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACzG,KAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACzG,KAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YAC1G,KAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;YAC/B,KAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAI,CAAC,aAAa,CAAC,CAAC;YAChE,KAAI,CAAC,gBAAgB,GAAGF,MAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC,cAAc,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAErH,KAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;YAC5B,KAAI,CAAC,WAAW,GAAG,GAAG,CAAC;YACvB,KAAI,CAAC,cAAc,GAAG,GAAG,CAAC;YAE1B,KAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC,gBAAgB,CAAC;YAC/C,KAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC,gBAAgB,CAAC;YAC/C,KAAI,CAAC,eAAe,GAAG,GAAG,CAAC,aAAa,CAAC;YACzC,KAAI,CAAC,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC;YACnC,KAAI,CAAC,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC;YACrC,KAAI,CAAC,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC;YACrC,KAAI,CAAC,YAAY,GAAGG,eAAa,CAAC;YAElC,KAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,KAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAE1B,KAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA0ExB;;QAGD,mCAAU,GAAV;YACE,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;gBAEzC,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;gBACzC,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;gBACzC,aAAa,EAAE,IAAI,CAAC,eAAe;gBACnC,UAAU,EAAE,IAAI,CAAC,YAAY;gBAC7B,WAAW,EAAE,IAAI,CAAC,aAAa;gBAC/B,WAAW,EAAE,IAAI,CAAC,aAAa;gBAE/B,YAAY,EAAE,IAAI,CAAC,cAAc;gBACjC,YAAY,EAAE,IAAI,CAAC,cAAc;gBACjC,UAAU,EAAE,IAAI,CAAC,aAAa;gBAC9B,cAAc,EAAE,IAAI,CAAC,gBAAgB;aACtC,CAAC;SACH;;QAGM,2BAAY,GAAnB,UAAoB,IAAS,EAAE,KAAU,EAAE,OAAY;YACrD,IAAI,gBAAO,IAAI,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9C,IAAM,KAAK,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;YACvC,OAAO,KAAK,CAAC;SACd;;QAGD,oCAAW,GAAX,UAAY,GAMX;YACC,IAAI,GAAG,CAAC,OAAO,EAAE;gBACf,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;aACtE;iBAAM,IAAI,GAAG,CAAC,YAAY,EAAE;gBAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;aAC/C;YAED,IAAI,GAAG,CAAC,OAAO,EAAE;gBACf,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;aACtE;iBAAM,IAAI,GAAG,CAAC,YAAY,EAAE;gBAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;aAC/C;YAED,IAAI,GAAG,CAAC,UAAU,EAAE;gBAClB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC3C,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;aACpE;SACF;;;;QAKD,wCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,wCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,sCAAa,GAAb;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;;;;QAKD,0CAAiB,GAAjB;YACE,OAAO,IAAI,CAAC,gBAAgB,CAAC;SAC9B;;;;QAKD,4CAAmB,GAAnB;YACE,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3D,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3D,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3B,IAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAE7D,IAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACtC,OAAO,WAAW,CAAC;SACpB;;;;QAKD,sCAAa,GAAb;YACE,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAExB,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;YACzF,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;YACzF,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3B,IAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAExD,IAAM,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC;YAC/B,IAAM,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC;YAC/B,IAAM,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC;YAChC,IAAM,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC;YAEhC,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;kBAChD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YACnG,OAAO,KAAK,CAAC;SACd;;;;QAKD,uCAAc,GAAd;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;;;;QAKD,oCAAW,GAAX,UAAY,IAAa;YACvB,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE;gBAC9B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gBAC1B,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC;aACxB;SACF;;;;QAKD,sCAAa,GAAb;YACE,OAAO,IAAI,CAAC,kBAAkB,CAAC;SAChC;;;;QAKD,sCAAa,GAAb;YACE,OAAO,IAAI,CAAC,kBAAkB,CAAC;SAChC;;;;QAKD,kCAAS,GAAT,UAAU,KAAa,EAAE,KAAa;YAEpC,IAAI,KAAK,IAAI,IAAI,CAAC,kBAAkB,IAAI,KAAK,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBACxE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAChC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAChC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC;aACxB;SACF;;;;QAKD,uCAAc,GAAd;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;;;;QAKD,oCAAW,GAAX,UAAY,IAAa;YACvB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;SAC3B;;;;QAKD,sCAAa,GAAb,UAAc,KAAa;YACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;SAC3B;;;;QAKD,yCAAgB,GAAhB,UAAiB,KAAa;YAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;SAC9B;QAED,yCAAgB,GAAhB;YACE,OAAO,IAAI,CAAC,eAAe,CAAC;SAC7B;;;;QAKD,sCAAa,GAAb;YACE,OAAO,IAAI,CAAC,YAAY,CAAC;SAC1B;;;;QAKD,sCAAa,GAAb,UAAc,MAAc;YAC1B,OAAO,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC;SACrC;;;;QAKD,mCAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,mCAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,yCAAgB,GAAhB,UAAiB,MAAc;YAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SACrH;;;;QAKD,0CAAiB,GAAjB,UAAkB,MAAc;YAC9B,OAAO,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;SAClC;QAED,gDAAuB,GAAvB,UAAwB,IAAc;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;YAGvB,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAC/E,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAC/E,IAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAE3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;;YAGxB;gBACE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAEhD,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI;sBAClE,IAAI,CAAC,IAAI,CAAC;gBAChB,IAAI,IAAI,CAAC,WAAW,GAAG,GAAG,EAAE;oBAC1B,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;iBAC3C;aACF;;YAGD;gBACE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;gBAElD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAEjC,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;gBAEnD,IAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBAC9E,IAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;gBAC5C,IAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACpE,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;gBAClB,IAAI,GAAG,IAAI,GAAG,EAAE;;oBAEd,GAAG,GAAG,GAAG,CAAC;iBACX;gBACD,IAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;gBAC5C,IAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBAE9E,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC/B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC/B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;aAChC;;YAGD,IAAI,IAAI,CAAC,aAAa,EAAE;gBAEtB,IAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAClD,IAAIH,MAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,GAAG,GAAG,QAAQ,CAAC,UAAU,EAAE;oBAC3F,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;iBAEjC;qBAAM,IAAI,gBAAgB,IAAI,IAAI,CAAC,kBAAkB,EAAE;oBACtD,IAAI,IAAI,CAAC,YAAY,IAAI,YAAY,EAAE;wBACrC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;wBACjC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC;qBACxB;iBAEF;qBAAM,IAAI,gBAAgB,IAAI,IAAI,CAAC,kBAAkB,EAAE;oBACtD,IAAI,IAAI,CAAC,YAAY,IAAIK,cAAY,EAAE;wBACrC,IAAI,CAAC,YAAY,GAAGA,cAAY,CAAC;wBACjC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC;qBACxB;iBAEF;qBAAM;oBACL,IAAI,CAAC,YAAY,GAAGF,eAAa,CAAC;oBAClC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC;iBACxB;aAEF;iBAAM;gBACL,IAAI,CAAC,YAAY,GAAGA,eAAa,CAAC;gBAClC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC;aACxB;YAED,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK,EAAE;gBAC/B,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;aAC3B;YAED,IAAI,IAAI,CAAC,YAAY,EAAE;;gBAErB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACjC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,CAAC;gBAEpC,IAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc;sBACnE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrC,IAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;sBACpD,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;gBAC3D,IAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;sBACpD,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;gBAE3D,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;gBAEd,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;aACf;iBAAM;gBACL,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;aAC3B;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;QAED,iDAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;;YAGxB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY,IAAI,WAAW,EAAE;gBAC1D,IAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE;sBAC/D,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;gBACrB,IAAI,OAAO,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;gBAC5D,IAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC;gBACvC,IAAM,UAAU,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC;gBAClD,IAAI,CAAC,cAAc,GAAGH,MAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,OAAO,EAC1D,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBAC7B,OAAO,GAAG,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC;gBAE3C,IAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAChD,IAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;gBAC/B,IAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;gBAE/B,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;gBAEd,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;aACf;YAED,IAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YACtD,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YACtD,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;YAElB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY,IAAIG,eAAa,EAAE;;gBAE5D,IAAI,KAAK,GAAG,CAAC,CAAC;gBACd,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;gBACpD,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;gBAEpD,IAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBAE/C,IAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC1C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAEvB,IAAI,IAAI,CAAC,YAAY,IAAI,YAAY,EAAE;oBACrC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAGH,MAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;iBACpD;qBAAM,IAAI,IAAI,CAAC,YAAY,IAAIK,cAAY,EAAE;oBAC5C,IAAI,CAAC,SAAS,CAAC,CAAC,GAAGL,MAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;iBACpD;;;gBAID,IAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtG,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBAEzB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBAElC,IAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7D,IAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;gBACtD,IAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;gBAEtD,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;gBAEd,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;aACf;iBAAM;;gBAEL,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC7C,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAEzB,IAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7C,IAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;gBACnC,IAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;gBAEnC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;gBAEd,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;aACf;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;;;;QAKD,iDAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEvB,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;;YAGxB,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAC/E,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAC/E,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAEvD,IAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACjD,IAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YACrD,IAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACxC,IAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAEjD,IAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YACrD,IAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAExC,IAAI,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;YACzB,IAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACvB,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACzB,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAEvC,IAAI,WAAW,GAAGA,MAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACjC,IAAM,YAAY,GAAGA,MAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAEpC,IAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;YACvC,IAAM,mBAAmB,GAAG,QAAQ,CAAC,mBAAmB,CAAC;YAEzD,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,IAAI,EAAE,GAAG,GAAG,CAAC;YACb,IAAI,IAAI,CAAC,aAAa,EAAE;gBAEtB,IAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBACtC,IAAIA,MAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,GAAG,GAAG,UAAU,EAAE;;oBAElF,EAAE,GAAGA,MAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;oBACxE,WAAW,GAAGA,MAAI,CAAC,GAAG,CAAC,WAAW,EAAEA,MAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;oBAC3D,MAAM,GAAG,IAAI,CAAC;iBAEf;qBAAM,IAAI,WAAW,IAAI,IAAI,CAAC,kBAAkB,EAAE;;oBAEjD,EAAE,GAAGA,MAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,GAAG,UAAU,EAC9D,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;oBAC/B,WAAW,GAAGA,MAAI;yBACb,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC,CAAC;oBAC7D,MAAM,GAAG,IAAI,CAAC;iBAEf;qBAAM,IAAI,WAAW,IAAI,IAAI,CAAC,kBAAkB,EAAE;;oBAEjD,EAAE,GAAGA,MAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,GAAG,UAAU,EAAE,GAAG,EACnE,mBAAmB,CAAC,CAAC;oBACzB,WAAW,GAAGA,MAAI;yBACb,GAAG,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;oBAC7D,MAAM,GAAG,IAAI,CAAC;iBACf;aACF;YAED,IAAI,MAAM,EAAE;gBACV,IAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;gBAClD,IAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;gBAC9B,IAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;gBACxC,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;gBAClB,IAAI,GAAG,IAAI,GAAG,EAAE;;oBAEd,GAAG,GAAG,GAAG,CAAC;iBACX;gBACD,IAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;gBAC9B,IAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;gBAElD,IAAM,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC;gBACtB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBACxB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBACxB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBAExB,IAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;gBACrB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACX,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACX,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;gBAET,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAClC;iBAAM;gBACL,IAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;gBAClD,IAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;gBAC9B,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;gBAClB,IAAI,GAAG,IAAI,GAAG,EAAE;oBACd,GAAG,GAAG,GAAG,CAAC;iBACX;gBAED,IAAM,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC;gBACtB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACtB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAEtB,IAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvC,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;gBACvB,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;gBACvB,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC;aACjB;YAED,IAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACzD,IAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC;YACvD,IAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC;YAEvD,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACjB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YACd,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACjB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YAEd,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAE/B,OAAO,WAAW,IAAI,QAAQ,CAAC,UAAU;mBAClC,YAAY,IAAI,QAAQ,CAAC,WAAW,CAAC;SAC7C;QAhvBM,mBAAI,GAAG,iBAA0B,CAAC;QAkvB3C,qBAAC;KAAA,CAnvB2C,KAAK;;IC3HjD;;;;;;;;;;;;;;;;;;;;;;;IA+DA,IAAME,UAAQ,GAAG;QACf,KAAK,EAAG,GAAG;KACZ,CAAC;IAEF;;;;;;;;;;;;;;QAauC,6BAAK;QA6C1C,mBAAY,GAAiB,EAAE,KAAY,EAAE,KAAY,EAAE,MAAuC,EAAE,MAAuC,EAAE,KAAc;YAA3J,iBAiHC;;YA/GC,IAAI,EAAE,KAAI,YAAY,SAAS,CAAC,EAAE;gBAChC,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;aAChE;YAED,GAAG,GAAG,OAAO,CAAC,GAAG,EAAEA,UAAQ,CAAC,CAAC;YAC7B,QAAA,kBAAM,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,SAAC;YACzB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YACrB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YAErB,KAAI,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC;YAO7B,KAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAC7C,KAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAC7C,KAAI,CAAC,OAAO,GAAGF,MAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YAExD,KAAI,CAAC,OAAO,GAAG,KAAI,CAAC,QAAQ,CAAC,OAAO,EAA0C,CAAC;YAC/E,KAAI,CAAC,OAAO,GAAG,KAAI,CAAC,QAAQ,CAAC,OAAO,EAA0C,CAAC;;;YAK/E,IAAI,WAAmB,CAAC;YACxB,IAAI,WAAmB,CAAC;;YAIxB,KAAI,CAAC,OAAO,GAAG,KAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACxC,KAAI,CAAC,OAAO,GAAG,KAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;;YAGxC,IAAM,GAAG,GAAG,KAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAC9B,IAAM,EAAE,GAAG,KAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YAClC,IAAM,GAAG,GAAG,KAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAC9B,IAAM,EAAE,GAAG,KAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YAElC,IAAI,KAAI,CAAC,OAAO,KAAK,aAAa,CAAC,IAAI,EAAE;gBACvC,IAAM,QAAQ,GAAG,KAAI,CAAC,QAAyB,CAAC;gBAChD,KAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;gBAC9C,KAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;gBAC9C,KAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,gBAAgB,CAAC;gBACnD,KAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAEhC,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,KAAI,CAAC,iBAAiB,CAAC;aAChD;iBAAM;gBACL,IAAM,SAAS,GAAG,KAAI,CAAC,QAA0B,CAAC;gBAClD,KAAI,CAAC,cAAc,GAAG,SAAS,CAAC,cAAc,CAAC;gBAC/C,KAAI,CAAC,cAAc,GAAG,SAAS,CAAC,cAAc,CAAC;gBAC/C,KAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC,gBAAgB,CAAC;gBACpD,KAAI,CAAC,YAAY,GAAG,SAAS,CAAC,aAAa,CAAC;gBAE5C,IAAM,EAAE,GAAG,KAAI,CAAC,cAAc,CAAC;gBAC/B,IAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAI,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1G,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAI,CAAC,YAAY,CAAC,CAAC;aACjF;YAED,KAAI,CAAC,OAAO,GAAG,KAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACxC,KAAI,CAAC,OAAO,GAAG,KAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;;YAGxC,IAAM,GAAG,GAAG,KAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAC9B,IAAM,EAAE,GAAG,KAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YAClC,IAAM,GAAG,GAAG,KAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAC9B,IAAM,EAAE,GAAG,KAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YAElC,IAAI,KAAI,CAAC,OAAO,KAAK,aAAa,CAAC,IAAI,EAAE;gBACvC,IAAM,QAAQ,GAAG,KAAI,CAAC,QAAyB,CAAC;gBAChD,KAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;gBAC9C,KAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;gBAC9C,KAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,gBAAgB,CAAC;gBACnD,KAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAEhC,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,KAAI,CAAC,iBAAiB,CAAC;aAChD;iBAAM;gBACL,IAAM,SAAS,GAAG,KAAI,CAAC,QAA0B,CAAC;gBAClD,KAAI,CAAC,cAAc,GAAG,SAAS,CAAC,cAAc,CAAC;gBAC/C,KAAI,CAAC,cAAc,GAAG,SAAS,CAAC,cAAc,CAAC;gBAC/C,KAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC,gBAAgB,CAAC;gBACpD,KAAI,CAAC,YAAY,GAAG,SAAS,CAAC,aAAa,CAAC;gBAE5C,IAAM,EAAE,GAAG,KAAI,CAAC,cAAc,CAAC;gBAC/B,IAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAI,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1G,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAI,CAAC,YAAY,CAAC,CAAC;aACjF;YAED,KAAI,CAAC,UAAU,GAAG,WAAW,GAAG,KAAI,CAAC,OAAO,GAAG,WAAW,CAAC;YAE3D,KAAI,CAAC,SAAS,GAAG,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;SAoBtB;;QAGD,8BAAU,GAAV;YACE,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;gBAEzC,MAAM,EAAE,IAAI,CAAC,QAAQ;gBACrB,MAAM,EAAE,IAAI,CAAC,QAAQ;gBACrB,KAAK,EAAE,IAAI,CAAC,OAAO;;aAGpB,CAAC;SACH;;QAGM,sBAAY,GAAnB,UAAoB,IAAS,EAAE,KAAU,EAAE,OAAY;YACrD,IAAI,gBAAO,IAAI,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACjD,IAAM,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;;YAElC,OAAO,KAAK,CAAC;SACd;;;;QAKD,6BAAS,GAAT;YACE,OAAO,IAAI,CAAC,QAAQ,CAAC;SACtB;;;;QAKD,6BAAS,GAAT;YACE,OAAO,IAAI,CAAC,QAAQ,CAAC;SACtB;;;;QAKD,4BAAQ,GAAR,UAAS,KAAa;YAEpB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;SACtB;;;;QAKD,4BAAQ,GAAR;YACE,OAAO,IAAI,CAAC,OAAO,CAAC;SACrB;;;;QAKD,8BAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,8BAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,oCAAgB,GAAhB,UAAiB,MAAc;YAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SACjE;;;;QAKD,qCAAiB,GAAjB,UAAkB,MAAc;YAC9B,IAAM,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;YACtC,OAAO,MAAM,GAAG,CAAC,CAAC;SACnB;QAED,2CAAuB,GAAvB,UAAwB,IAAc;YACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YAC9C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YAC9C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YAC9C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAEhC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEvB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;YAElB,IAAI,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC,IAAI,EAAE;gBACtC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;gBACjB,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;gBACjB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;aACtC;iBAAM;gBACL,IAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC7C,IAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3D,IAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3D,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;gBAChB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACvC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;aAClH;YAED,IAAI,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC,IAAI,EAAE;gBACtC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;gBAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;gBAC1B,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;aACtE;iBAAM;gBACL,IAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC7C,IAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3D,IAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC/C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACtD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACtD,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;aAClJ;;YAGD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;YAE1D,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnD,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;gBAE9C,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnD,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;gBAE9C,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnD,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;gBAE9C,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnD,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;aAE/C;iBAAM;gBACL,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;aACtB;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;QAED,4CAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;kBAC1D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC5D,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE;mBACnC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;YAE1C,IAAM,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACpC,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;YAE1B,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5C,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;YACvC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5C,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;YACvC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5C,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;YACvC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5C,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;YAEvC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;;;;QAKD,4CAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEvB,IAAM,WAAW,GAAG,GAAG,CAAC;YAExB,IAAI,WAAmB,CAAC;YACxB,IAAI,WAAmB,CAAC;YAExB,IAAI,IAAU,CAAC;YACf,IAAI,IAAU,CAAC;YACf,IAAI,GAAW,CAAC;YAChB,IAAI,GAAW,CAAC;YAChB,IAAI,GAAW,CAAC;YAChB,IAAI,GAAW,CAAC;YAChB,IAAI,IAAI,GAAG,GAAG,CAAC;YAEf,IAAI,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC,IAAI,EAAE;gBACtC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACnB,GAAG,GAAG,GAAG,CAAC;gBACV,GAAG,GAAG,GAAG,CAAC;gBACV,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBAE9B,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC;aAChD;iBAAM;gBACL,IAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC7C,IAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3D,IAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3D,IAAI,GAAG,CAAC,CAAC;gBACT,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAChC,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAChC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;gBAE9E,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrD,IAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC5D,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;aAC7D;YAED,IAAI,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC,IAAI,EAAE;gBACtC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACnB,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;gBACnB,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;gBACnB,IAAI,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;gBAE9D,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC;aAChD;iBAAM;gBACL,IAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC7C,IAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3D,IAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3D,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACxC,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC/C,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC/C,IAAI,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI;sBACnE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;gBAExC,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrD,IAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC5D,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC;sBACvC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;aACvC;YAED,IAAM,CAAC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,GAAG,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC;YAEvE,IAAI,OAAO,GAAG,GAAG,CAAC;YAClB,IAAI,IAAI,GAAG,GAAG,EAAE;gBACd,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;aACrB;YAED,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,GAAG,GAAG,CAAC;YAChC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,GAAG,GAAG,CAAC;YAChC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,GAAG,GAAG,CAAC;YAChC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,GAAG,GAAG,CAAC;YAEhC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;;YAG/B,OAAO,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC;SAC1C;QAjeM,cAAI,GAAG,YAAqB,CAAC;QAmetC,gBAAC;KAAA,CApesC,KAAK;;IChF5C;;;;;;;;;;;;;;;;;;;;;;;IAqEA,IAAME,UAAQ,GAAG;QACf,QAAQ,EAAG,GAAG;QACd,SAAS,EAAG,GAAG;QACf,gBAAgB,EAAG,GAAG;KACvB,CAAC;IAEF;;;;;;QAKwC,8BAAK;QA4B3C,oBAAY,GAAkC,EAAE,KAAY,EAAE,KAAY;YAA1E,iBAkCC;;YAhCC,IAAI,EAAE,KAAI,YAAY,UAAU,CAAC,EAAE;gBACjC,OAAO,IAAI,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAC1C;YAED,GAAG,GAAG,OAAO,CAAC,GAAG,EAAEA,UAAQ,CAAC,CAAC;YAC7B,QAAA,kBAAM,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,SAAC;YACzB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YACrB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YAErB,KAAI,CAAC,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC;YAE9B,KAAI,CAAC,cAAc,GAAGF,MAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,YAAY,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YACpH,KAAI,CAAC,eAAe,GAAGA,MAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,aAAa,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAElH,KAAI,CAAC,eAAe,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACnC,KAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC;YAE5B,KAAI,CAAC,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC;YAC/B,KAAI,CAAC,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC;YACjC,KAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC,gBAAgB,CAAC;;;;;;;;;;;;SAahD;;QAGD,+BAAU,GAAV;YACE,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;gBAEzC,QAAQ,EAAE,IAAI,CAAC,UAAU;gBACzB,SAAS,EAAE,IAAI,CAAC,WAAW;gBAC3B,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;gBAEzC,YAAY,EAAE,IAAI,CAAC,cAAc;gBACjC,aAAa,EAAE,IAAI,CAAC,eAAe;aACpC,CAAC;SACH;;QAGM,uBAAY,GAAnB,UAAoB,IAAS,EAAE,KAAU,EAAE,OAAY;YACrD,IAAI,gBAAO,IAAI,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;YACnC,OAAO,KAAK,CAAC;SACd;;QAGD,gCAAW,GAAX,UAAY,GAAO;SAClB;;;;QAKD,gCAAW,GAAX,UAAY,KAAa;YAEvB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;SACzB;;;;QAKD,gCAAW,GAAX;YACE,OAAO,IAAI,CAAC,UAAU,CAAC;SACxB;;;;QAKD,iCAAY,GAAZ,UAAa,MAAc;YAEzB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;SAC3B;;;;QAKD,iCAAY,GAAZ;YACE,OAAO,IAAI,CAAC,WAAW,CAAC;SACzB;;;;QAKD,wCAAmB,GAAnB,UAAoB,MAAc;YAEhC,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC;SAClC;;;;QAKD,wCAAmB,GAAnB;YACE,OAAO,IAAI,CAAC,kBAAkB,CAAC;SAChC;;;;QAKD,oCAAe,GAAf,UAAgB,YAAkB;YAChC,IAAI,YAAY,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC;mBACpC,YAAY,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE;gBAC9C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,cAAc,GAAG,YAAY,CAAC;aACpC;SACF;QAED,oCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,qCAAgB,GAAhB,UAAiB,aAAqB;YACpC,IAAI,aAAa,IAAI,IAAI,CAAC,eAAe,EAAE;gBACzC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,eAAe,GAAG,aAAa,CAAC;aACtC;SACF;QAED,qCAAgB,GAAhB;YACE,OAAO,IAAI,CAAC,eAAe,CAAC;SAC7B;;;;QAKD,+BAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;SACnC;;;;QAKD,+BAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;SACnC;;;;QAKD,qCAAgB,GAAhB,UAAiB,MAAc;YAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;SACtD;;;;QAKD,sCAAiB,GAAjB,UAAkB,MAAc;YAC9B,OAAO,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC;SACvC;QAED,4CAAuB,GAAvB,UAAwB,IAAc;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;YAGvB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;;;;;;;;YAW3D,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAExB,IAAM,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC;YACtB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACnF,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1E,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAEnF,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;YAEnC,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,aAAa,GAAG,GAAG,EAAE;gBAC5B,IAAI,CAAC,aAAa,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC;aAC/C;YAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAE7D,IAAI,CAAC,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC;YAErD,IAAI,IAAI,CAAC,YAAY,EAAE;;gBAErB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,OAAO,CAAC;gBAEtC,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBAEnE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAEtE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;aAEvE;iBAAM;gBACL,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;gBAC/B,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC;aAC7B;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;QAED,6CAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAExB,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;YAClB,IAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;;YAG1B;gBACE,IAAM,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,cAAc,CAAC;gBAC7E,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gBAEzC,IAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBACzC,IAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;gBACxC,IAAI,CAAC,gBAAgB,GAAGA,MAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,GAAG,OAAO,EAC9D,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBAC7B,OAAO,GAAG,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC;gBAE7C,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;gBACnB,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;aACpB;;YAGD;gBACE,IAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACzB,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5D,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5D,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;gBAEjE,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC/D,IAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBACpD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAElC,IAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;gBAEvC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAEvC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;gBAErD,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACvB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAElD,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACvB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;aACnD;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;;;;QAKD,6CAAwB,GAAxB,UAAyB,IAAc;YACrC,OAAO,IAAI,CAAC;SACb;QAxVM,eAAI,GAAG,aAAsB,CAAC;QA0VvC,iBAAC;KAAA,CA3VuC,KAAK;;IChF7C;;;;;;;;;;;;;;;;;;;;;;;IAwEA,IAAME,UAAQ,GAAG;QACf,QAAQ,EAAG,GAAG;QACd,WAAW,EAAG,GAAG;QACjB,YAAY,EAAG,GAAG;KACnB,CAAC;IAEF;;;;;;;;;;QASwC,8BAAK;QAsB3C,oBAAY,GAAkB,EAAE,KAAY,EAAE,KAAY,EAAE,MAAa;YAAzE,iBA4CC;;YA1CC,IAAI,EAAE,KAAI,YAAY,UAAU,CAAC,EAAE;gBACjC,OAAO,IAAI,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;aAClD;YAED,GAAG,GAAG,OAAO,CAAC,GAAG,EAAEA,UAAQ,CAAC,CAAC;YAC7B,QAAA,kBAAM,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,SAAC;YACzB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YACrB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YAErB,KAAI,CAAC,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC;YAM9B,KAAI,CAAC,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACzE,KAAI,CAAC,cAAc,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,KAAI,CAAC,SAAS,CAAC,CAAC;YAE/E,KAAI,CAAC,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC;YAC/B,KAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAE7B,KAAI,CAAC,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC;YACrC,KAAI,CAAC,cAAc,GAAG,GAAG,CAAC,YAAY,CAAC;YAEvC,KAAI,CAAC,MAAM,GAAG,GAAG,CAAC;YAClB,KAAI,CAAC,OAAO,GAAG,GAAG,CAAC;;YAGnB,KAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACxB,KAAI,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAClC,KAAI,CAAC,UAAU,GAAG,GAAG,CAAC;YACtB,KAAI,CAAC,OAAO,GAAG,GAAG,CAAC;YACnB,KAAI,CAAC,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YAC1B,KAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;;;;;;;;;SASxB;;QAGD,+BAAU,GAAV;YACE,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;gBAEzC,MAAM,EAAE,IAAI,CAAC,SAAS;gBACtB,QAAQ,EAAE,IAAI,CAAC,UAAU;gBACzB,WAAW,EAAE,IAAI,CAAC,aAAa;gBAC/B,YAAY,EAAE,IAAI,CAAC,cAAc;gBAEjC,aAAa,EAAE,IAAI,CAAC,cAAc;aACnC,CAAC;SACH;;QAGM,uBAAY,GAAnB,UAAoB,IAAS,EAAE,KAAU,EAAE,OAAY;YACrD,IAAI,gBAAO,IAAI,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtC,IAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;aAC3C;YACD,OAAO,KAAK,CAAC;SACd;;;;QAKD,8BAAS,GAAT,UAAU,MAAY;YACpB,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,KAAK,EAAE;gBACnC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aAC7B;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SACrC;QAED,8BAAS,GAAT;YACE,OAAO,IAAI,CAAC,SAAS,CAAC;SACvB;;;;QAKD,gCAAW,GAAX,UAAY,KAAa;YACvB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;SACzB;;;;QAKD,gCAAW,GAAX;YACE,OAAO,IAAI,CAAC,UAAU,CAAC;SACxB;;;;QAKD,iCAAY,GAAZ,UAAa,EAAU;YACrB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;SACzB;;;;QAKD,iCAAY,GAAZ;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;;;;QAKD,oCAAe,GAAf,UAAgB,KAAa;YAC3B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;SAC7B;;;;QAKD,oCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,+BAAU,GAAV;YACE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SACnC;;;;QAKD,+BAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,qCAAgB,GAAhB,UAAiB,MAAc;YAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;SAChD;;;;QAKD,sCAAiB,GAAjB,UAAkB,MAAc;YAC9B,OAAO,MAAM,GAAG,GAAG,CAAC;SACrB;;;;QAKD,gCAAW,GAAX,UAAY,SAAe;YACzB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;SAC/B;QAED,4CAAuB,GAAvB,UAAwB,IAAc;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAEnC,IAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YACzC,IAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YAEzC,IAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;YACtB,IAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;YACtB,IAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;YACtB,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;YAEpB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEvB,IAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;;YAGpC,IAAM,KAAK,GAAG,GAAG,GAAGF,MAAI,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;;YAGjD,IAAM,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;;YAGnD,IAAM,CAAC,GAAG,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;;;;YAKjC,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;YAElB,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/B,IAAI,IAAI,CAAC,OAAO,IAAI,GAAG,EAAE;gBACvB,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;aACnC;YACD,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;;YAGnC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;;;;;;YAOhF,IAAM,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC;YACtB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;kBAC7D,IAAI,CAAC,OAAO,CAAC;YACnB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACnD,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;kBAC7D,IAAI,CAAC,OAAO,CAAC;YAEnB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;YAE7B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACtD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;YAG1B,EAAE,IAAI,IAAI,CAAC;YAEX,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACjC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC3C,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;aAEpE;iBAAM;gBACL,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;aAC1B;YAED,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvB,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;SACjB;QAED,6CAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YACzC,IAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;;YAIpB,IAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEb,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3D,IAAI,CAAC,GAAG,EAAE,CAAC;YAEX,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAE/C,IAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAM,UAAU,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC7C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACjC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YAE/C,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACpC,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAE5D,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvB,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;SACjB;;;;QAKD,6CAAwB,GAAxB,UAAyB,IAAc;YACrC,OAAO,IAAI,CAAC;SACb;QAxSM,eAAI,GAAG,aAAsB,CAAC;QA0SvC,iBAAC;KAAA,CA3SuC,KAAK;;ICvF7C;;;;;;;;;;;;;;;;;;;;;;;IAgFA,IAAME,UAAQ,GAAG;QACf,gBAAgB,EAAG,IAAI;KACxB,CAAC;IAEF;;;;;;;;;;;;QAWyC,+BAAK;QA8B5C,qBAAY,GAAmB,EAAE,KAAY,EAAE,KAAY,EAAE,OAAc,EAAE,OAAc,EAAE,OAAc,EAAE,OAAc,EAAE,KAAc;YAA3I,iBAsCC;;YApCC,IAAI,EAAE,KAAI,YAAY,WAAW,CAAC,EAAE;gBAClC,OAAO,IAAI,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;aACtF;YAED,GAAG,GAAG,OAAO,CAAC,GAAG,EAAEA,UAAQ,CAAC,CAAC;YAC7B,QAAA,kBAAM,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,SAAC;YACzB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YACrB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YAErB,KAAI,CAAC,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC;YAC/B,KAAI,CAAC,eAAe,GAAG,OAAO,GAAG,OAAO,GAAG,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACpF,KAAI,CAAC,eAAe,GAAG,OAAO,GAAG,OAAO,GAAG,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACnF,KAAI,CAAC,cAAc,GAAG,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvG,KAAI,CAAC,cAAc,GAAG,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACtG,KAAI,CAAC,SAAS,GAAGF,MAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC5F,KAAI,CAAC,SAAS,GAAGA,MAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC5F,KAAI,CAAC,OAAO,GAAGA,MAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YAIxD,KAAI,CAAC,UAAU,GAAG,KAAI,CAAC,SAAS,GAAG,KAAI,CAAC,OAAO,GAAG,KAAI,CAAC,SAAS,CAAC;YAEjE,KAAI,CAAC,SAAS,GAAG,GAAG,CAAC;;;;;;;;;;;;;;SActB;QAED,gCAAU,GAAV;YACE,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;gBAEzC,aAAa,EAAE,IAAI,CAAC,eAAe;gBACnC,aAAa,EAAE,IAAI,CAAC,eAAe;gBACnC,YAAY,EAAE,IAAI,CAAC,cAAc;gBACjC,YAAY,EAAE,IAAI,CAAC,cAAc;gBACjC,OAAO,EAAE,IAAI,CAAC,SAAS;gBACvB,OAAO,EAAE,IAAI,CAAC,SAAS;gBACvB,KAAK,EAAE,IAAI,CAAC,OAAO;aACpB,CAAC;SACH;;QAGM,wBAAY,GAAnB,UAAoB,IAAS,EAAE,KAAU,EAAE,OAAY;YACrD,IAAI,gBAAO,IAAI,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAM,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO,KAAK,CAAC;SACd;;;;QAKD,sCAAgB,GAAhB;YACE,OAAO,IAAI,CAAC,eAAe,CAAC;SAC7B;;;;QAKD,sCAAgB,GAAhB;YACE,OAAO,IAAI,CAAC,eAAe,CAAC;SAC7B;;;;QAKD,gCAAU,GAAV;YACE,OAAO,IAAI,CAAC,SAAS,CAAC;SACvB;;;;QAKD,gCAAU,GAAV;YACE,OAAO,IAAI,CAAC,SAAS,CAAC;SACvB;;;;QAKD,8BAAQ,GAAR;YACE,OAAO,IAAI,CAAC,OAAO,CAAC;SACrB;;;;QAKD,uCAAiB,GAAjB;YACE,IAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC1D,IAAM,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC;YAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SAC5B;;;;QAKD,uCAAiB,GAAjB;YACE,IAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC1D,IAAM,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC;YAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SAC5B;;;;;;QAOD,iCAAW,GAAX,UAAY,SAAe;YACzB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;SACrC;;;;QAKD,gCAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,gCAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,sCAAgB,GAAhB,UAAiB,MAAc;YAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SAC/D;;;;QAKD,uCAAiB,GAAjB,UAAkB,MAAc;YAC9B,OAAO,GAAG,CAAC;SACZ;QAED,6CAAuB,GAAvB,UAAwB,IAAc;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEvB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAChF,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;;YAGhF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YACpE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YAEpE,IAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACnC,IAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAEnC,IAAI,OAAO,GAAG,IAAI,GAAG,QAAQ,CAAC,UAAU,EAAE;gBACxC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC;aAC9B;iBAAM;gBACL,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;aACrB;YAED,IAAI,OAAO,GAAG,IAAI,GAAG,QAAQ,CAAC,UAAU,EAAE;gBACxC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC;aAC9B;iBAAM;gBACL,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;aACrB;;YAGD,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACrD,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAErD,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC;YACtD,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC;YAEtD,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YAEpD,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE;gBACrB,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;aACjC;YAED,IAAI,IAAI,CAAC,YAAY,EAAE;;gBAErB,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC;;gBAG/B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvD,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEtE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBAC/B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAEvD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBAC/B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;aAExD;iBAAM;gBACL,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;aACtB;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;QAED,8CAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3D,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAE3D,IAAM,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO;kBAC/C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC/B,IAAM,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACpC,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;YAE1B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAChD,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/D,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC/B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACvD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC/B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAEvD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;;;;QAKD,8CAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEvB,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAC/E,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;;YAG/E,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YACnE,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YAEnE,IAAM,OAAO,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;YAC5B,IAAM,OAAO,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;YAE5B,IAAI,OAAO,GAAG,IAAI,GAAG,QAAQ,CAAC,UAAU,EAAE;gBACxC,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC;aACvB;iBAAM;gBACL,EAAE,CAAC,OAAO,EAAE,CAAC;aACd;YAED,IAAI,OAAO,GAAG,IAAI,GAAG,QAAQ,CAAC,UAAU,EAAE;gBACxC,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC;aACvB;iBAAM;gBACL,EAAE,CAAC,OAAO,EAAE,CAAC;aACd;;YAGD,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACvC,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAEvC,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC;YACtD,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC;YAEtD,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YAEjD,IAAI,IAAI,GAAG,GAAG,EAAE;gBACd,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;aACnB;YAED,IAAM,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YAC7D,IAAM,WAAW,GAAGA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAEhC,IAAM,OAAO,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;YAE1B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACzC,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,EAAE,CAAC,CAAC;YAExD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC/B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAChD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC/B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAEhD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAE/B,OAAO,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC;SAC1C;QAvWM,gBAAI,GAAG,cAAuB,CAAC;QAyWxC,kBAAC;KAAA,CA1WwC,KAAK;;IC/F9C;;;;;;;;;;;;;;;;;;;;;;;IAiCA,IAAM,aAAa,GAAG,CAAC,CAAC;IAExB,IAAM,YAAY,GAAG,CAAC,CAAC;IA+BvB,IAAME,UAAQ,GAAG;QACf,SAAS,EAAG,GAAG;KAChB,CAAC;IAEF;;;;;;;;;;;;QAWuC,6BAAK;QA2B1C,mBAAY,GAAiB,EAAE,KAAY,EAAE,KAAY,EAAE,MAAa;YAAxE,iBA6BC;;YA3BC,IAAI,EAAE,KAAI,YAAY,SAAS,CAAC,EAAE;gBAChC,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;aACjD;YAED,GAAG,GAAG,OAAO,CAAC,GAAG,EAAEA,UAAQ,CAAC,CAAC;YAC7B,QAAA,kBAAM,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,SAAC;YACzB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YACrB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YAErB,KAAI,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC;YAC7B,KAAI,CAAC,cAAc,GAAG,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACrG,KAAI,CAAC,cAAc,GAAG,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAEpG,KAAI,CAAC,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC;YAEjC,KAAI,CAAC,MAAM,GAAG,GAAG,CAAC;YAClB,KAAI,CAAC,SAAS,GAAG,GAAG,CAAC;YACrB,KAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;YACpB,KAAI,CAAC,OAAO,GAAG,aAAa,CAAC;;;;;;;;;SAS9B;;QAGD,8BAAU,GAAV;YACE,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;gBAEzC,YAAY,EAAE,IAAI,CAAC,cAAc;gBACjC,YAAY,EAAE,IAAI,CAAC,cAAc;gBACjC,SAAS,EAAE,IAAI,CAAC,WAAW;aAC5B,CAAC;SACH;;QAGM,sBAAY,GAAnB,UAAoB,IAAS,EAAE,KAAU,EAAE,OAAY;YACrD,IAAI,gBAAO,IAAI,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAM,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;YAClC,OAAO,KAAK,CAAC;SACd;;;;QAKD,mCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,mCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,gCAAY,GAAZ,UAAa,MAAc;YACzB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;SAC3B;;;;QAKD,gCAAY,GAAZ;YACE,OAAO,IAAI,CAAC,WAAW,CAAC;SACzB;QAED,iCAAa,GAAb;;YAEE,OAAO,IAAI,CAAC,OAAO,CAAC;SACrB;;;;QAKD,8BAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,8BAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,oCAAgB,GAAhB,UAAiB,MAAc;YAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SAC9D;;;;QAKD,qCAAiB,GAAjB,UAAkB,MAAc;YAC9B,OAAO,GAAG,CAAC;SACZ;QAED,2CAAuB,GAAvB,UAAwB,IAAc;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEvB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YACrE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YACrE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAEzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAElC,IAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC;YAC3C,IAAI,CAAC,GAAG,GAAG,EAAE;gBACX,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC;aAC7B;iBAAM;gBACL,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC;aAC9B;YAED,IAAI,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,UAAU,EAAE;gBACvC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;aACnC;iBAAM;gBACL,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBACnB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;gBAClB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;gBACrB,OAAO;aACR;;YAGD,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YACpD,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YACpD,IAAM,OAAO,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU;kBACtE,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC;YAE/B,IAAI,CAAC,MAAM,GAAG,OAAO,IAAI,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC;YAEnD,IAAI,IAAI,CAAC,YAAY,EAAE;;gBAErB,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC;gBAE/B,IAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;gBAEpD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC9B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAEtD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC9B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;aAEvD;iBAAM;gBACL,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;aACtB;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;QAED,4CAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;;YAGnC,IAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,IAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,IAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC;YAC3C,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;;YAGlD,IAAI,CAAC,GAAG,GAAG,EAAE;gBACX,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;aACzB;YAED,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YAClC,IAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;YAClC,IAAI,CAAC,SAAS,GAAGF,MAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,CAAC;YACzD,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;YAEtC,IAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7C,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC9B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACtD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC9B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAEtD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;;;;QAKD,4CAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEvB,IAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YACpE,IAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YACpE,IAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAE3B,IAAM,MAAM,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;YAElC,CAAC,GAAGA,MAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YAErD,IAAM,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YACjC,IAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAEtC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC9B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC/C,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC9B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAE/C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAE/B,OAAO,MAAM,GAAG,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC;SACxD;QA/RM,cAAI,GAAG,YAAqB,CAAC;QAiStC,gBAAC;KAAA,CAlSsC,KAAK;;ICjF5C;;;;;;;;;;;;;;;;;;;;;;;IA+EA,IAAME,UAAQ,GAAG;QACf,WAAW,EAAG,GAAG;QACjB,YAAY,EAAG,GAAG;KACnB,CAAC;IAEF;;;;;QAIuC,6BAAK;QA6B1C,mBAAY,GAAiB,EAAE,KAAY,EAAE,KAAY,EAAE,MAAa;YAAxE,iBAiDC;;YA/CC,IAAI,EAAE,KAAI,YAAY,SAAS,CAAC,EAAE;gBAChC,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;aACjD;YAED,GAAG,GAAG,OAAO,CAAC,GAAG,EAAEA,UAAQ,CAAC,CAAC;YAC7B,QAAA,kBAAM,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,SAAC;YACzB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YACrB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YAErB,KAAI,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC;YAE7B,KAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACzG,KAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACzG,KAAI,CAAC,gBAAgB,GAAGF,MAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC,cAAc,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAErH,KAAI,CAAC,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC;YACrC,KAAI,CAAC,cAAc,GAAG,GAAG,CAAC,YAAY,CAAC;YAEvC,KAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;YAE5B,KAAI,CAAC,MAAM,GAAG,GAAG,CAAC;YAClB,KAAI,CAAC,OAAO,GAAG,GAAG,CAAC;;YAGnB,KAAI,CAAC,IAAI,CAAC;YACV,KAAI,CAAC,IAAI,CAAC;YACV,KAAI,CAAC,cAAc,CAAC;YACpB,KAAI,CAAC,cAAc,CAAC;YACpB,KAAI,CAAC,UAAU,CAAC;YAChB,KAAI,CAAC,UAAU,CAAC;YAChB,KAAI,CAAC,OAAO,CAAC;YACb,KAAI,CAAC,OAAO,CAAC;YACb,KAAI,CAAC,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;;;;;;;;;;;;;;SAe3B;;QAGD,8BAAU,GAAV;YACE,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;gBAEzC,WAAW,EAAE,IAAI,CAAC,aAAa;gBAC/B,YAAY,EAAE,IAAI,CAAC,cAAc;gBAEjC,YAAY,EAAE,IAAI,CAAC,cAAc;gBACjC,YAAY,EAAE,IAAI,CAAC,cAAc;gBACjC,cAAc,EAAE,IAAI,CAAC,gBAAgB;aACtC,CAAC;SACH;;QAGM,sBAAY,GAAnB,UAAoB,IAAS,EAAE,KAAU,EAAE,OAAY;YACrD,IAAI,gBAAO,IAAI,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAM,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;YAClC,OAAO,KAAK,CAAC;SACd;;QAGD,+BAAW,GAAX,UAAY,GAKX;YACC,IAAI,GAAG,CAAC,OAAO,EAAE;gBACf,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;aACtE;iBAAM,IAAI,GAAG,CAAC,YAAY,EAAE;gBAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;aAC/C;YAED,IAAI,GAAG,CAAC,OAAO,EAAE;gBACf,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;aACtE;iBAAM,IAAI,GAAG,CAAC,YAAY,EAAE;gBAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;aAC/C;SACF;;;;QAKD,mCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,mCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,qCAAiB,GAAjB;YACE,OAAO,IAAI,CAAC,gBAAgB,CAAC;SAC9B;;;;QAKD,gCAAY,GAAZ,UAAa,EAAU;YACrB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;SACzB;;;;QAKD,gCAAY,GAAZ;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;;;;QAKD,mCAAe,GAAf,UAAgB,KAAa;YAC3B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;SAC7B;;;;QAKD,mCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,8BAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,8BAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,oCAAgB,GAAhB,UAAiB,MAAc;YAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SACjE;;;;QAKD,qCAAiB,GAAjB,UAAkB,MAAc;YAC9B,OAAO,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;SAClC;QAED,2CAAuB,GAAvB,UAAwB,IAAc;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEvB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAChF,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;;;;;;;;YAWhF,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAExB,IAAM,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC;YACtB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;kBACvE,EAAE,CAAC;YACT,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YAC1E,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YAC9C,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;kBACvE,EAAE,CAAC;YACT,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YAC7C,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;YAEjB,IAAI,IAAI,CAAC,aAAa,GAAG,GAAG,EAAE;gBAC5B,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAE5B,IAAI,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC;gBACnB,IAAM,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;gBAExC,IAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC;;gBAG1C,IAAM,KAAK,GAAG,GAAG,GAAGA,MAAI,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;;gBAGjD,IAAM,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;;gBAGhD,IAAM,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;;gBAG5B,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;gBAClB,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC/B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;gBAC9D,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;gBAEvC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC;gBACrB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;aACnD;iBAAM,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,EAAE;gBACxB,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC5B,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;gBACnB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;aACnB;iBAAM;gBACL,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC/B,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;gBACnB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;aACnB;YAED,IAAI,IAAI,CAAC,YAAY,EAAE;;gBAErB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAEjC,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAEvD,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAEjE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;aAElE;iBAAM;gBACL,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;aAC1B;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;QAED,4CAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAExB,IAAI,IAAI,CAAC,aAAa,GAAG,GAAG,EAAE;gBAC5B,IAAM,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC;gBAEtB,IAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;uBAC3B,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAC9D,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,QAAQ,CAAC;gBAE7B,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;gBACpB,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;gBAEpB,IAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1B,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7D,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAE7D,IAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC7D,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;gBAC/B,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;gBAE/B,IAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAE/B,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAE5C,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;aAC7C;iBAAM;gBACL,IAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1B,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7D,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7D,IAAM,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC;gBACtB,IAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBAE/C,IAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC3D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAE5B,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;gBAEzC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAE1D,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;aAC3D;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;;;;QAKD,4CAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEvB,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAExB,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAC/E,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAE/E,IAAI,aAAqB,CAAC;YAC1B,IAAI,YAAoB,CAAC;YAEzB,IAAM,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC;YACtB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;YACvD,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;YAC9C,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;YAChC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;YACvD,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;YAEjB,IAAI,IAAI,CAAC,aAAa,GAAG,GAAG,EAAE;gBAC5B,IAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACvB,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC5B,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBAE5B,aAAa,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;gBAC5B,YAAY,GAAG,GAAG,CAAC;gBAEnB,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBAElC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAErC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;aACtC;iBAAM;gBACL,IAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACvB,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC5B,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBAE5B,IAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBAE3C,aAAa,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;gBAC5B,YAAY,GAAGA,MAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAE5B,IAAM,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAEnC,IAAI,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;gBACzB,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE;oBAChB,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;iBAClC;qBAAM;oBACL,IAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;oBACzC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;iBAC1C;gBAED,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;gBAEzC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAEnD,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;aACpD;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAE/B,OAAO,aAAa,IAAI,QAAQ,CAAC,UAAU,IAAI,YAAY,IAAI,QAAQ,CAAC,WAAW,CAAC;SACrF;QArcM,cAAI,GAAG,YAAqB,CAAA;QAucrC,gBAAC;KAAA,CAxcsC,KAAK;;ICxF5C;;;;;;;;;;;;;;;;;;;;;;;IAuFA,IAAM,QAAQ,GAAG;QACf,WAAW,EAAG,KAAK;QACnB,cAAc,EAAG,GAAG;QACpB,UAAU,EAAG,GAAG;QAChB,WAAW,EAAG,GAAG;QACjB,YAAY,EAAG,GAAG;KACnB,CAAC;IAEF;;;;;;;QAMwC,8BAAK;;QA4C3C,oBAAY,GAAkB,EAAE,KAAY,EAAE,KAAY,EAAE,MAAa,EAAE,IAAW;YAAtF,iBAsDC;;YApDC,IAAI,EAAE,KAAI,YAAY,UAAU,CAAC,EAAE;gBACjC,OAAO,IAAI,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;aACxD;YAED,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC7B,QAAA,kBAAM,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,SAAC;6BAjBV,UAAI,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;6BACzB,UAAI,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;YAiBxC,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YACrB,KAAK,GAAG,KAAI,CAAC,OAAO,CAAC;YAErB,KAAI,CAAC,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC;YAE9B,KAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACzG,KAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;;YAEzG,KAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YAC3H,KAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAI,CAAC,aAAa,CAAC,CAAC;YAEhE,KAAI,CAAC,MAAM,GAAG,GAAG,CAAC;YAClB,KAAI,CAAC,SAAS,GAAG,GAAG,CAAC;YACrB,KAAI,CAAC,WAAW,GAAG,GAAG,CAAC;YACvB,KAAI,CAAC,cAAc,GAAG,GAAG,CAAC;YAC1B,KAAI,CAAC,YAAY,GAAG,GAAG,CAAC;YACxB,KAAI,CAAC,eAAe,GAAG,GAAG,CAAC;YAE3B,KAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,cAAc,CAAC;YAC3C,KAAI,CAAC,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC;YACnC,KAAI,CAAC,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC;YAErC,KAAI,CAAC,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC;YACrC,KAAI,CAAC,cAAc,GAAG,GAAG,CAAC,YAAY,CAAC;YAEvC,KAAI,CAAC,MAAM,GAAG,GAAG,CAAC;YAClB,KAAI,CAAC,OAAO,GAAG,GAAG,CAAC;;;;;;;;;;;;;;;;;;SAoBpB;;QAGD,+BAAU,GAAV;YACE,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,KAAK,EAAE,IAAI,CAAC,OAAO;gBACnB,gBAAgB,EAAE,IAAI,CAAC,kBAAkB;gBAEzC,WAAW,EAAE,IAAI,CAAC,aAAa;gBAC/B,cAAc,EAAE,IAAI,CAAC,gBAAgB;gBACrC,UAAU,EAAE,IAAI,CAAC,YAAY;gBAC7B,WAAW,EAAE,IAAI,CAAC,aAAa;gBAC/B,YAAY,EAAE,IAAI,CAAC,cAAc;gBAEjC,YAAY,EAAE,IAAI,CAAC,cAAc;gBACjC,YAAY,EAAE,IAAI,CAAC,cAAc;gBACjC,UAAU,EAAE,IAAI,CAAC,aAAa;aAC/B,CAAC;SACH;;QAGM,uBAAY,GAAnB,UAAoB,IAAS,EAAE,KAAU,EAAE,OAAY;YACrD,IAAI,gBAAO,IAAI,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;YACnC,OAAO,KAAK,CAAC;SACd;;QAGD,gCAAW,GAAX,UAAY,GAMX;YACC,IAAI,GAAG,CAAC,OAAO,EAAE;gBACf,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;aACtE;iBAAM,IAAI,GAAG,CAAC,YAAY,EAAE;gBAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;aAC/C;YAED,IAAI,GAAG,CAAC,OAAO,EAAE;gBACf,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;aACtE;iBAAM,IAAI,GAAG,CAAC,YAAY,EAAE;gBAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;aAC/C;YAED,IAAI,GAAG,CAAC,UAAU,EAAE;gBAClB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC3C,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;aACpE;SACF;;;;QAKD,oCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,oCAAe,GAAf;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,kCAAa,GAAb;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;;;;QAKD,wCAAmB,GAAnB;YACE,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAExB,IAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACjD,IAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACjD,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3B,IAAM,IAAI,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAEnD,IAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACtC,OAAO,WAAW,CAAC;SACpB;;;;QAKD,kCAAa,GAAb;YACE,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;YAC1C,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;YAC1C,OAAO,EAAE,GAAG,EAAE,CAAC;SAChB;;;;QAKD,mCAAc,GAAd;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;;;;QAKD,gCAAW,GAAX,UAAY,IAAa;YACvB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;SAC3B;;;;QAKD,kCAAa,GAAb,UAAc,KAAa;YACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;SAC3B;;;;QAKD,kCAAa,GAAb;YACE,OAAO,IAAI,CAAC,YAAY,CAAC;SAC1B;;;;QAKD,sCAAiB,GAAjB,UAAkB,MAAc;YAC9B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;SAChC;QAED,sCAAiB,GAAjB;YACE,OAAO,IAAI,CAAC,gBAAgB,CAAC;SAC9B;;;;QAKD,mCAAc,GAAd,UAAe,MAAc;YAC3B,OAAO,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC;SACrC;;;;;QAMD,yCAAoB,GAApB,UAAqB,EAAU;YAC7B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;SACzB;QAED,yCAAoB,GAApB;YACE,OAAO,IAAI,CAAC,aAAa,CAAC;SAC3B;;;;QAKD,0CAAqB,GAArB,UAAsB,KAAa;YACjC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;SAC7B;QAED,0CAAqB,GAArB;YACE,OAAO,IAAI,CAAC,cAAc,CAAC;SAC5B;;;;QAKD,+BAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,+BAAU,GAAV;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACxD;;;;QAKD,qCAAgB,GAAhB,UAAiB,MAAc;YAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SAC7F;;;;QAKD,sCAAiB,GAAjB,UAAkB,MAAc;YAC9B,OAAO,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC;SACrC;QAED,4CAAuB,GAAvB,UAAwB,IAAc;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YACvD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAExB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;YAGvB,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAC/E,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAC/E,IAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;;YAG3B;gBACE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;gBAChD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAE/C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK;sBAChE,IAAI,CAAC,KAAK,CAAC;gBAEjB,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE;oBACrB,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;iBACjC;aACF;;YAGD,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC;YACxB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;YAClB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;YACnB,IAAI,IAAI,CAAC,aAAa,GAAG,GAAG,EAAE;gBAC5B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;gBAChD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAE/C,IAAM,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK;sBAClE,IAAI,CAAC,KAAK,CAAC;gBAEjB,IAAI,OAAO,GAAG,GAAG,EAAE;oBACjB,IAAI,CAAC,YAAY,GAAG,GAAG,GAAG,OAAO,CAAC;oBAElC,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;;oBAGjC,IAAM,KAAK,GAAG,GAAG,GAAGA,MAAI,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;;oBAGjD,IAAM,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;;oBAGnE,IAAM,CAAC,GAAG,IAAI,CAAC,YAAY,GAAG,KAAK,GAAG,KAAK,CAAC;;oBAG5C,IAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;oBAClB,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;oBAClC,IAAI,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE;wBACtB,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;qBACnC;oBAED,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;oBAEvC,IAAI,CAAC,YAAY,GAAG,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;oBAC3C,IAAI,IAAI,CAAC,YAAY,GAAG,GAAG,EAAE;wBAC3B,IAAI,CAAC,YAAY,GAAG,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC;qBAC7C;iBACF;aACF;iBAAM;gBACL,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC;aAC5B;;YAGD,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,EAAE,CAAC;gBAC3B,IAAI,IAAI,CAAC,WAAW,GAAG,GAAG,EAAE;oBAC1B,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;iBAC3C;aACF;iBAAM;gBACL,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;gBACvB,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;aAC3B;YAED,IAAI,IAAI,CAAC,YAAY,EAAE;;gBAErB,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC;gBAC/B,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC;gBACrC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,CAAC;gBAEpC,IAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnF,IAAM,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC;gBACjG,IAAM,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC;gBAEjG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC9B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;gBAExB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC9B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;aAEzB;iBAAM;gBACL,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;gBACrB,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC;gBAC3B,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;aAC3B;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;QAED,6CAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAExB,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;;YAGnC;gBACE,IAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK;sBACrE,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC3B,IAAM,OAAO,GAAG,CAAC,IAAI,CAAC,YAAY;uBAC3B,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;gBACjE,IAAI,CAAC,eAAe,IAAI,OAAO,CAAC;gBAEhC,IAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC9C,IAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;gBAChC,IAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;gBAEhC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;gBAEd,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;aACf;;YAGD;gBACE,IAAM,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC;gBACzC,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBAEvC,IAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC;gBACvC,IAAM,UAAU,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBACnD,IAAI,CAAC,cAAc,GAAGA,MAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,OAAO,EAC1D,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBAC7B,OAAO,GAAG,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC;gBAE3C,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;gBACnB,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;aACpB;;YAGD;gBACE,IAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK;sBACrE,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC3B,IAAM,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACpC,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;gBAE1B,IAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC9C,IAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;gBAChC,IAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;gBAEhC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;gBAEd,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;aACf;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAChC;;;;QAKD,6CAAwB,GAAxB,UAAyB,IAAc;YACrC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,IAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAEnC,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEvB,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAC/E,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAC/E,IAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAE3B,IAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAE/C,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACpD,IAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAEvC,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAE1B,IAAM,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK;kBACjE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YAE1D,IAAI,OAAO,CAAC;YACZ,IAAI,CAAC,IAAI,GAAG,EAAE;gBACZ,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;aAClB;iBAAM;gBACL,OAAO,GAAG,GAAG,CAAC;aACf;YAED,IAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACvC,IAAM,EAAE,GAAG,OAAO,GAAG,GAAG,CAAC;YACzB,IAAM,EAAE,GAAG,OAAO,GAAG,GAAG,CAAC;YAEzB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC9B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YACxB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC9B,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YAExB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAE/B,OAAOA,MAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC;SAC3C;QAxiBM,eAAI,GAAG,aAAsB,CAAC;QA0iBvC,iBAAC;KAAA,CA3iBuC,KAAK;;IC5E7C,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,SAAS,UAAU,CAAC,IAAK;;QACvB,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAElB,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;QAE1C,IAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,UAAS,GAAG,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACxE,IAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,UAAS,IAAI,EAAE,GAAG,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QAEjF,IAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,UAAS,IAAI,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QAC9E,IAAM,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,UAAS,GAAG,EAAE,IAAI,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;;QAGpF,IAAM,QAAQ,GAAG;YACf,KAAK,OAAA;YACL,IAAI,MAAA;YACJ,KAAK,OAAA;YACL,OAAO,SAAA;YACP,KAAK,OAAA;SACN,CAAC;;QAGF,IAAM,YAAY,cAChB,IAAI,MAAA;YACJ,IAAI,MAAA,IACD,QAAQ,CACZ,CAAC;QAEF,IAAM,kBAAkB;YACtB,GAAC,IAAI,CAAC,MAAM,IAAG,IAAI;YACnB,GAAC,IAAI,CAAC,OAAO,IAAG,IAAI;YACpB,GAAC,IAAI,CAAC,SAAS,IAAG,IAAI;YACtB,GAAC,UAAU,CAAC,IAAI,IAAG,UAAU;YAC7B,GAAC,QAAQ,CAAC,IAAI,IAAG,QAAQ;YACzB,GAAC,SAAS,CAAC,IAAI,IAAG,SAAS;YAC3B,GAAC,YAAY,CAAC,IAAI,IAAG,YAAY;YACjC,GAAC,WAAW,CAAC,IAAI,IAAG,WAAW;YAC/B,GAAC,aAAa,CAAC,IAAI,IAAG,aAAa;YACnC,GAAC,aAAa,CAAC,IAAI,IAAG,aAAa;YACnC,GAAC,SAAS,CAAC,IAAI,IAAG,SAAS;YAC3B,GAAC,UAAU,CAAC,IAAI,IAAG,UAAU;YAC7B,GAAC,UAAU,CAAC,IAAI,IAAG,UAAU;YAC7B,GAAC,cAAc,CAAC,IAAI,IAAG,cAAc;YACrC,GAAC,WAAW,CAAC,IAAI,IAAG,WAAW;YAC/B,GAAC,aAAa,CAAC,IAAI,IAAG,aAAa;YACnC,GAAC,SAAS,CAAC,IAAI,IAAG,SAAS;YAC3B,GAAC,SAAS,CAAC,IAAI,IAAG,SAAS;YAC3B,GAAC,UAAU,CAAC,IAAI,IAAG,UAAU;eAC9B,CAAA;QAED,IAAI,CAAC,MAAM,GAAG,UAAS,IAAI;YACzB,IAAM,IAAI,GAAG,EAAE,CAAC;YAEhB,IAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;YACrB,IAAM,MAAM,GAAG,EAAE,CAAC;YAElB,SAAS,QAAQ,CAAC,KAAK,EAAE,QAAQ;gBAC/B,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,GAAG,CAAC;gBACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;oBACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAClB,IAAM,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;oBACzC,IAAM,GAAG,GAAG;wBACV,QAAQ,EAAE,KAAK;wBACf,OAAO,EAAE,QAAQ;qBAClB,CAAC;oBACF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;iBAC3B;gBACD,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;aAC5B;YAED,SAAS,SAAS,CAAC,GAAG;gBACpB,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;gBACxB,IAAI,IAAI,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;gBAC5B,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAChC,OAAO,IAAI,CAAC;aACb;YAED,SAAS,MAAM,CAAC,KAAK,EAAE,GAAI;gBACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;oBAC/C,OAAO,KAAK,CAAC;iBACd;gBACD,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,UAAU,EAAE;oBAC1C,IAAI,KAAK,KAAK,GAAG,EAAE;;wBAEjB,KAAK,IAAM,QAAQ,IAAI,QAAQ,EAAE;4BAC/B,IAAI,KAAK,YAAY,QAAQ,CAAC,QAAQ,CAAC,EAAE;gCACvC,OAAO,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;6BAClC;yBACF;qBACF;oBACD,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;iBAC1B;gBACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;oBACxB,IAAM,QAAQ,GAAG,EAAE,CAAC;oBACpB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;wBAC3C,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;qBACpC;oBACD,KAAK,GAAG,QAAQ,CAAC;iBAElB;qBAAM;oBACL,IAAM,QAAQ,GAAG,EAAE,CAAC;;oBAEpB,KAAK,IAAM,GAAG,IAAI,KAAK,EAAE;wBACvB,IAAI,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;4BAC7B,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;yBACpC;qBACF;oBACD,KAAK,GAAG,QAAQ,CAAC;iBAClB;gBACD,OAAO,KAAK,CAAC;aACd;YAED,OAAO,KAAK,CAAC,MAAM,EAAE;gBACnB,IAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC1B,IAAM,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAChB;YAED,OAAO,IAAI,CAAC;SACb,CAAC;QAEF,IAAI,CAAC,QAAQ,GAAG,UAAS,IAAY;YACnC,IAAM,MAAM,GAAG,EAAE,CAAC;YAElB,SAAS,eAAe,CAAC,IAAI,EAAE,GAAG;gBAChC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;oBAC7B,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;iBACpC;gBACD,OAAO,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC;aAChC;;;;YAKD,SAAS,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG;gBACjC,IAAM,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAChD,IAAI,CAAC,YAAY,EAAE;oBACjB,OAAO;iBACR;gBACD,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;gBAC9C,GAAG,GAAG,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACjC,OAAO,GAAG,CAAC;aACZ;;;;;;YAOD,SAAS,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG;gBAC/B,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE;oBACjB,OAAO,GAAG,IAAI,GAAG,CAAC,YAAY,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;iBAC9D;gBACD,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC;gBACvC,IAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;oBAClB,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;oBACzB,IAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;oBACxC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;iBACrB;gBACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;aACtB;YAED,IAAM,IAAI,GAAG,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YAE/D,OAAO,IAAI,CAAC;SACb,CAAC;IACJ,CAAC;IAED,IAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;IAEpC,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IACtC,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ;;ICvMzC;;;;;;;;;;;;;;;;;;;;;;;IAqCA,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IAEzE,SAAS,mBAAmB,CAAC,QAAkB,EAAE,GAAc,EAAE,QAAiB,EAAE,MAAc,EAAE,GAAc,EAAE,QAAiB,EAAE,MAAc;QAGnJ,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAiB,EAAE,GAAG,EAAE,QAAQ,CAAC,QAAQ,EAAiB,EAAE,GAAG,CAAC,CAAC;IAC7G,CAAC;aAEe,cAAc,CAAC,QAAkB,EAAE,OAAoB,EAAE,GAAc,EAAE,OAAoB,EAAE,GAAc;QAC3H,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;QAExB,IAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAE/C,IAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC5B,IAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC5B,IAAM,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC;QACvB,IAAI,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE;YAC7B,OAAO;SACR;QAED,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC;QACvC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzC,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QAC/B,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;QACxB,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;;QAGnD,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QACpC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;QAC7D,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QACpC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;IAC/D;;ICtEA;;;;;;;;;;;;;;;;;;;;;;;IAsCA,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IACrE,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAEvE,SAAS,iBAAiB,CAAC,QAAkB,EAAE,GAAc,EAAE,QAAiB,EAAE,MAAc,EAAE,GAAc,EAAE,QAAiB,EAAE,MAAc;QAIjJ,IAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAe,CAAC;QAChD,IAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAiB,CAAC;QAElD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IAED,SAAS,kBAAkB,CAAC,QAAkB,EAAE,GAAc,EAAE,QAAiB,EAAE,MAAc,EAAE,GAAc,EAAE,QAAiB,EAAE,MAAc;QAIlJ,IAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAgB,CAAC;QAChD,IAAM,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;QAC7B,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEjC,IAAM,MAAM,GAAG,IAAI,CAAC;QACpB,IAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAiB,CAAC;QAElD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IAED;IACA;aACgB,iBAAiB,CAAC,QAAkB,EAAE,KAAgB,EAAE,GAAc,EAAE,OAAoB,EAAE,GAAc;QAC1H,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;;QAGxB,IAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAEvE,IAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;QAC1B,IAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;QAC1B,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;QAGzB,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEtC,IAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;;QAGjD,IAAI,CAAC,IAAI,GAAG,EAAE;YACZ,IAAM,GAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACxB,IAAM,GAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAC,CAAC,CAAC;YACzB,IAAM,IAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAC,EAAE,GAAC,CAAC,CAAC;YAC1B,IAAI,IAAE,GAAG,MAAM,GAAG,MAAM,EAAE;gBACxB,OAAO;aACR;;YAGD,IAAI,KAAK,CAAC,YAAY,EAAE;gBACtB,IAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;gBAC3B,IAAM,EAAE,GAAG,CAAC,CAAC;gBACb,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC5B,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;;gBAGzC,IAAI,EAAE,GAAG,GAAG,EAAE;oBACZ,OAAO;iBACR;aACF;YAED,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC;YACvC,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC/B,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,GAAC,CAAC,CAAC;YAC/B,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;YACxB,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;;YAGnD,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;YAC7D,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;YAC7D,OAAO;SACR;;QAGD,IAAI,CAAC,IAAI,GAAG,EAAE;YACZ,IAAM,GAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACxB,IAAM,GAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAC,CAAC,CAAC;YACzB,IAAM,IAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAC,EAAE,GAAC,CAAC,CAAC;YAC1B,IAAI,IAAE,GAAG,MAAM,GAAG,MAAM,EAAE;gBACxB,OAAO;aACR;;YAGD,IAAI,KAAK,CAAC,YAAY,EAAE;gBACtB,IAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;gBAC3B,IAAM,EAAE,GAAG,CAAC,CAAC;gBACb,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC5B,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;;gBAGzC,IAAI,EAAE,GAAG,GAAG,EAAE;oBACZ,OAAO;iBACR;aACF;YAED,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC;YACvC,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC/B,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,GAAC,CAAC,CAAC;YAC/B,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;YACxB,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;;YAGnD,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;YAC7D,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;YAC7D,OAAO;SACR;;QAGD,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE3B,IAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzB,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,IAAI,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE;YACxB,OAAO;SACR;QAED,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE;YACrC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACtB;QACD,CAAC,CAAC,SAAS,EAAE,CAAC;QAEd,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC;QACrC,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC;QACzB,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;QACxB,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;;QAGnD,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QACpC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC;QAC3D,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QACpC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;IAC/D;;ICtLA;;;;;;;;;;;;;;;;;;;;;;;IAsCA,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAEtE,SAAS,cAAc,CAAC,QAAkB,EAAE,GAAc,EAAE,QAAiB,EAAE,MAAc,EAAE,GAAc,EAAE,QAAiB,EAAE,MAAc;QAG9I,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAkB,EAAE,GAAG,EAAE,QAAQ,CAAC,QAAQ,EAAkB,EAAE,GAAG,CAAC,CAAC;IAChH,CAAC;IAOD;;;;IAIA,SAAS,iBAAiB,CAAC,KAAmB,EAAE,GAAc,EAAE,KAAmB,EAAE,GAAc,EAAE,MAAqB;QACxH,IAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,IAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,IAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC;QAC5B,IAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC;QAC7B,IAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC;QAC7B,IAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAEtC,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,aAAa,GAAG,CAAC,QAAQ,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE;;YAE/B,IAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACpC,IAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;;YAGzC,IAAI,EAAE,GAAG,QAAQ,CAAC;YAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE;gBAC/B,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClD,IAAI,GAAG,GAAG,EAAE,EAAE;oBACZ,EAAE,GAAG,GAAG,CAAC;iBACV;aACF;YAED,IAAI,EAAE,GAAG,aAAa,EAAE;gBACtB,aAAa,GAAG,EAAE,CAAC;gBACnB,SAAS,GAAG,CAAC,CAAC;aACf;SACF;;QAGD,MAAM,CAAC,aAAa,GAAG,aAAa,CAAC;QACrC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED,SAAS,gBAAgB,CAAC,CAAe,EAAE,KAAmB,EAAE,GAAc,EAAE,KAAa,EAAE,KAAmB,EAAE,GAAc;QAChI,IAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;QAEjC,IAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,IAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;QACnC,IAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;;QAKjC,IAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;;QAGzE,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,MAAM,GAAG,QAAQ,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE;YAC/B,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,GAAG,GAAG,MAAM,EAAE;gBAChB,MAAM,GAAG,GAAG,CAAC;gBACb,KAAK,GAAG,CAAC,CAAC;aACX;SACF;;QAGD,IAAM,EAAE,GAAG,KAAK,CAAC;QACjB,IAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QAExC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,KAAK,CAAC;QAC1B,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC;QAC7C,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;QAE/C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,KAAK,CAAC;QAC1B,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC;QAC7C,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;IACjD,CAAC;IAED,IAAM,aAAa,GAAG;QACpB,aAAa,EAAE,CAAC;QAChB,SAAS,EAAE,CAAC;KACb,CAAC;IAEF;;;;;;;;;;aAUgB,eAAe,CAAC,QAAkB,EAAE,KAAmB,EAAE,GAAc,EAAE,KAAmB,EAAE,GAAc;QAC1H,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;QACxB,IAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAEpD,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;QACzD,IAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC;QACtC,IAAM,WAAW,GAAG,aAAa,CAAC,aAAa,CAAC;QAChD,IAAI,WAAW,GAAG,WAAW;YAC3B,OAAO;QAET,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;QACzD,IAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC;QACtC,IAAM,WAAW,GAAG,aAAa,CAAC,aAAa,CAAC;QAChD,IAAI,WAAW,GAAG,WAAW;YAC3B,OAAO;QAET,IAAI,KAAK,CAAC;QACV,IAAI,KAAK,CAAC;QACV,IAAI,GAAG,CAAC;QACR,IAAI,GAAG,CAAC;QACR,IAAI,KAAK,CAAC;QACV,IAAI,IAAI,CAAC;QACT,IAAM,KAAK,GAAG,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC;QAExC,IAAI,WAAW,GAAG,WAAW,GAAG,KAAK,EAAE;YACrC,KAAK,GAAG,KAAK,CAAC;YACd,KAAK,GAAG,KAAK,CAAC;YACd,GAAG,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,GAAG,CAAC;YACV,KAAK,GAAG,KAAK,CAAC;YACd,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC;YACrC,IAAI,GAAG,CAAC,CAAC;SACV;aAAM;YACL,KAAK,GAAG,KAAK,CAAC;YACd,KAAK,GAAG,KAAK,CAAC;YACd,GAAG,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,GAAG,CAAC;YACV,KAAK,GAAG,KAAK,CAAC;YACd,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC;YACrC,IAAI,GAAG,CAAC,CAAC;SACV;QAED,IAAM,YAAY,GAAG,CAAE,IAAI,UAAU,EAAE,EAAE,IAAI,UAAU,EAAE,CAAE,CAAC;QAC5D,gBAAgB,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAE9D,IAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,IAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;QAEnC,IAAM,GAAG,GAAG,KAAK,CAAC;QAClB,IAAM,GAAG,GAAG,KAAK,GAAG,CAAC,GAAG,MAAM,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;QAE/C,IAAI,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAEzB,IAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACxC,YAAY,CAAC,SAAS,EAAE,CAAC;QAEzB,IAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACzD,IAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAEpD,IAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QACjD,IAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAE/C,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAClC,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;;QAGlC,IAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;;QAG1C,IAAM,WAAW,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC;QAC1D,IAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC;;QAGzD,IAAM,WAAW,GAAG,CAAE,IAAI,UAAU,EAAE,EAAE,IAAI,UAAU,EAAE,CAAE,CAAC;QAC3D,IAAM,WAAW,GAAG,CAAE,IAAI,UAAU,EAAE,EAAE,IAAI,UAAU,EAAE,CAAE,CAAC;QAC3D,IAAI,EAAE,CAAC;;QAGP,EAAE,GAAG,iBAAiB,CAAC,WAAW,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QAEvF,IAAI,EAAE,GAAG,CAAC,EAAE;YACV,OAAO;SACR;;QAGD,EAAE,GAAG,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QAE5E,IAAI,EAAE,GAAG,CAAC,EAAE;YACV,OAAO;SACR;;QAGD,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;QACnC,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;QAEjC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,0BAAyB,EAAE,CAAC,EAAE;YAClE,IAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;YAEpE,IAAI,UAAU,IAAI,WAAW,EAAE;gBAC7B,IAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACvC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjE,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1B,IAAI,IAAI,EAAE;;oBAER,IAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;oBACpB,IAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;oBACzB,IAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;oBACzB,IAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;oBACvB,IAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;oBACvB,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC;oBACnB,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC;oBACnB,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC;oBACjB,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC;iBAClB;gBACD,EAAE,UAAU,CAAC;aACd;SACF;QAED,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;IACnC;;IC1QA;;;;;;;;;;;;;;;;;;;;;;;IAsCA,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IAE3E,SAAS,oBAAoB,CAAC,QAAkB,EAAE,GAAc,EAAE,QAAiB,EAAE,MAAc,EAAE,GAAc,EAAE,QAAiB,EAAE,MAAc;QAGpJ,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAkB,EAAE,GAAG,EAAE,QAAQ,CAAC,QAAQ,EAAiB,EAAE,GAAG,CAAC,CAAC;IACpH,CAAC;aAEe,oBAAoB,CAAC,QAAkB,EAAE,QAAsB,EAAE,GAAc,EAAE,OAAoB,EAAE,GAAc;QACnI,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;;QAGxB,IAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;;QAG1C,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,UAAU,GAAG,CAAC,QAAQ,CAAC;QAC3B,IAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACpD,IAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC;QACrC,IAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC;QACrC,IAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC;QAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,EAAE,CAAC,EAAE;YACpC,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAE9D,IAAI,CAAC,GAAG,MAAM,EAAE;;gBAEd,OAAO;aACR;YAED,IAAI,CAAC,GAAG,UAAU,EAAE;gBAClB,UAAU,GAAG,CAAC,CAAC;gBACf,WAAW,GAAG,CAAC,CAAC;aACjB;SACF;;QAGD,IAAM,UAAU,GAAG,WAAW,CAAC;QAC/B,IAAM,UAAU,GAAG,UAAU,GAAG,CAAC,GAAG,WAAW,GAAG,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;QACrE,IAAM,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QAChC,IAAM,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;;QAGhC,IAAI,UAAU,GAAGA,MAAI,CAAC,OAAO,EAAE;YAC7B,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;YACxB,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC;YACrC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;YACnD,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YACjD,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;;YAG5C,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;YAC7D,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;YAC7D,OAAO;SACR;;QAGD,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5D,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5D,IAAI,EAAE,IAAI,GAAG,EAAE;YACb,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE;gBACtD,OAAO;aACR;YAED,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;YACxB,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC;YACrC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnD,QAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;YACjC,QAAQ,CAAC,UAAU,GAAG,EAAE,CAAC;YACzB,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;;YAGnD,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;YAC7D,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;SAC9D;aAAM,IAAI,EAAE,IAAI,GAAG,EAAE;YACpB,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE;gBACtD,OAAO;aACR;YAED,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;YACxB,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC;YACrC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnD,QAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;YACjC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAChC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;;YAGnD,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;YAC7D,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;SAC9D;aAAM;YACL,IAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACpC,IAAM,YAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrG,IAAI,YAAU,GAAG,MAAM,EAAE;gBACvB,OAAO;aACR;YAED,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;YACxB,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC;YACrC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAClD,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACxC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;;YAGnD,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;YAC7D,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;SAC9D;IACH;;ICzJA;;;;;;;;;;;;;;;;;;;;;;;IAyCA,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACvE,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IAEzE,SAAS,kBAAkB,CAAC,QAAkB,EAAE,GAAc,EAAE,EAAW,EAAE,MAAc,EAAE,GAAc,EAAE,EAAW,EAAE,MAAc;QAItI,kBAAkB,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAe,EAAE,GAAG,EAAE,EAAE,CAAC,QAAQ,EAAkB,EAAE,GAAG,CAAC,CAAC;IACpG,CAAC;IAED,SAAS,mBAAmB,CAAC,QAAkB,EAAE,GAAc,EAAE,EAAW,EAAE,MAAc,EAAE,GAAc,EAAE,EAAW,EAAE,MAAc;QAIvI,IAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAgB,CAAC;QAC1C,IAAM,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;QAC7B,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEjC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,QAAQ,EAAkB,EAAE,GAAG,CAAC,CAAC;IAC9E,CAAC;IAED,IAAK,UAIJ;IAJD,WAAK,UAAU;QACb,sDAAc,CAAA;QACd,iDAAW,CAAA;QACX,iDAAW,CAAA;IACb,CAAC,EAJI,UAAU,KAAV,UAAU,QAId;IAED;IACA,IAAK,UAIJ;IAJD,WAAK,UAAU;QACd,uDAAc,CAAA;QACd,qDAAa,CAAA;QACb,mDAAY,CAAA;IACb,CAAC,EAJI,UAAU,KAAV,UAAU,QAId;IAED;;;IAGA;QAAA;SAIC;QAAD,aAAC;IAAD,CAAC,IAAA;IAED;;;IAGA;QAAA;YACE,aAAQ,GAAW,EAAE,CAAC;YACtB,YAAO,GAAW,EAAE,CAAC;YACrB,UAAK,GAAW,CAAC,CAAC;SACnB;QAAD,kBAAC;IAAD,CAAC,IAAA;IAED;;;IAGA;QAAA;YAKE,WAAM,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,gBAAW,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;YAEhC,gBAAW,GAAS,IAAI,CAAC,IAAI,EAAE,CAAC;SAEjC;QAAD,oBAAC;IAAD,CAAC,IAAA;IAED;IACA,IAAM,QAAQ,GAAG,IAAI,MAAM,EAAE,CAAC;IAC9B,IAAM,WAAW,GAAG,IAAI,MAAM,EAAE,CAAC;IACjC,IAAM,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC;IACpC,IAAM,EAAE,GAAG,IAAI,aAAa,EAAE,CAAC;IAE/B;;;;aAIgB,kBAAkB,CAAC,QAAkB,EAAE,KAAgB,EAAE,GAAc,EAAE,QAAsB,EAAE,GAAc;;;;;;;;;;;;QAc7H,IAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAEtC,IAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QAE7D,IAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;QAC3B,IAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;QAC3B,IAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;QAC3B,IAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;QAE3B,IAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC;QACtC,IAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC;QAEtC,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/B,KAAK,CAAC,SAAS,EAAE,CAAC;QAClB,IAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3D,IAAI,OAAO,GAAG,GAAG,CAAC;QAClB,IAAI,OAAO,GAAG,GAAG,CAAC;QAClB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,IAAI,OAAO,CAAC;QACZ,IAAI,OAAO,CAAC;;QAGZ,IAAI,UAAU,EAAE;YACd,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC/B,KAAK,CAAC,SAAS,EAAE,CAAC;YAClB,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC;YAClD,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;SAChE;;QAGD,IAAI,UAAU,EAAE;YACd,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC/B,KAAK,CAAC,SAAS,EAAE,CAAC;YAClB,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC;YACjD,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;SAChE;QAED,IAAI,KAAK,CAAC;QACV,IAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;;QAG/B,IAAI,UAAU,IAAI,UAAU,EAAE;YAC5B,IAAI,OAAO,IAAI,OAAO,EAAE;gBACtB,KAAK,GAAG,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC;gBAC3D,IAAI,KAAK,EAAE;oBACT,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACxB,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC5B,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;iBAC7B;qBAAM;oBACL,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC3B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC/B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;iBAChC;aACF;iBAAM,IAAI,OAAO,EAAE;gBAClB,KAAK,GAAG,OAAO,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC,CAAC;gBAC7D,IAAI,KAAK,EAAE;oBACT,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACxB,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC5B,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;iBAC7B;qBAAM;oBACL,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC3B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC/B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;iBAChC;aACF;iBAAM,IAAI,OAAO,EAAE;gBAClB,KAAK,GAAG,OAAO,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC,CAAC;gBAC7D,IAAI,KAAK,EAAE;oBACT,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACxB,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC5B,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;iBAC7B;qBAAM;oBACL,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC3B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC/B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;iBAChC;aACF;iBAAM;gBACL,KAAK,GAAG,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC;gBAC3D,IAAI,KAAK,EAAE;oBACT,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACxB,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC5B,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;iBAC7B;qBAAM;oBACL,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC3B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC/B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;iBAChC;aACF;SACF;aAAM,IAAI,UAAU,EAAE;YACrB,IAAI,OAAO,EAAE;gBACX,KAAK,GAAG,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC;gBACzC,IAAI,KAAK,EAAE;oBACT,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACxB,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC5B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;iBAChC;qBAAM;oBACL,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC3B,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC5B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;iBAChC;aACF;iBAAM;gBACL,KAAK,GAAG,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC;gBACzC,IAAI,KAAK,EAAE;oBACT,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACxB,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC5B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;iBAChC;qBAAM;oBACL,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC3B,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC5B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;iBAChC;aACF;SACF;aAAM,IAAI,UAAU,EAAE;YACrB,IAAI,OAAO,EAAE;gBACX,KAAK,GAAG,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC;gBACzC,IAAI,KAAK,EAAE;oBACT,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACxB,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC/B,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;iBAC7B;qBAAM;oBACL,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC3B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC/B,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;iBAC7B;aACF;iBAAM;gBACL,KAAK,GAAG,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC;gBACzC,IAAI,KAAK,EAAE;oBACT,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACxB,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC/B,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;iBAC7B;qBAAM;oBACL,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC3B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC/B,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;iBAC7B;aACF;SACF;aAAM;YACL,KAAK,GAAG,OAAO,IAAI,GAAG,CAAC;YACvB,IAAI,KAAK,EAAE;gBACT,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACxB,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC/B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;aAChC;iBAAM;gBACL,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC3B,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC5B,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;aAC7B;SACF;;QAGD,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE;YACzC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACtE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;SACjE;QAED,IAAM,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC;QAE5C,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;QAExB;YACE,QAAQ,CAAC,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC;YACnC,QAAQ,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/B,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC;YAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE;gBACxC,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAChE,IAAI,CAAC,GAAG,QAAQ,CAAC,UAAU,EAAE;oBAC3B,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;iBACzB;aACF;SACF;;;QAID,IAAI,QAAQ,CAAC,IAAI,IAAI,UAAU,CAAC,SAAS,EAAE;YACzC,OAAO;SACR;QAED,IAAI,QAAQ,CAAC,UAAU,GAAG,MAAM,EAAE;YAChC,OAAO;SACR;QAED;YACE,WAAW,CAAC,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC;YACxC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACvB,WAAW,CAAC,UAAU,GAAG,CAAC,QAAQ,CAAC;YAEnC,IAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE;gBACxC,IAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEzC,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC5D,IAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC5D,IAAM,CAAC,GAAGA,MAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBAE3B,IAAI,CAAC,GAAG,MAAM,EAAE;;oBAEd,WAAW,CAAC,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC;oBACtC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC;oBACtB,WAAW,CAAC,UAAU,GAAG,CAAC,CAAC;oBAC3B,MAAM;iBACP;;gBAGD,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,EAAE;oBAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE;wBACrE,SAAS;qBACV;iBACF;qBAAM;oBACL,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE;wBACrE,SAAS;qBACV;iBACF;gBAED,IAAI,CAAC,GAAG,WAAW,CAAC,UAAU,EAAE;oBAC9B,WAAW,CAAC,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC;oBACtC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC;oBACtB,WAAW,CAAC,UAAU,GAAG,CAAC,CAAC;iBAC5B;aACF;SACF;QAED,IAAI,WAAW,CAAC,IAAI,IAAI,UAAU,CAAC,SAAS,IAAI,WAAW,CAAC,UAAU,GAAG,MAAM,EAAE;YAC/E,OAAO;SACR;;QAGD,IAAM,aAAa,GAAG,IAAI,CAAC;QAC3B,IAAM,aAAa,GAAG,KAAK,CAAC;QAE5B,IAAI,WAAW,CAAC;QAChB,IAAI,WAAW,CAAC,IAAI,IAAI,UAAU,CAAC,SAAS,EAAE;YAC5C,WAAW,GAAG,QAAQ,CAAC;SACxB;aAAM,IAAI,WAAW,CAAC,UAAU,GAAG,aAAa,GAAG,QAAQ,CAAC,UAAU,GAAG,aAAa,EAAE;YACvF,WAAW,GAAG,WAAW,CAAC;SAC3B;aAAM;YACL,WAAW,GAAG,QAAQ,CAAC;SACxB;QAED,IAAM,EAAE,GAAG,CAAE,IAAI,UAAU,EAAE,EAAE,IAAI,UAAU,EAAE,CAAE,CAAC;QAElD,IAAI,WAAW,CAAC,IAAI,IAAI,UAAU,CAAC,OAAO,EAAE;YAC1C,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC;;;YAIrC,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE;gBACxC,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrD,IAAI,KAAK,GAAG,SAAS,EAAE;oBACrB,SAAS,GAAG,KAAK,CAAC;oBAClB,SAAS,GAAG,CAAC,CAAC;iBACf;aACF;YAED,IAAM,EAAE,GAAG,SAAS,CAAC;YACrB,IAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAEjD,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACjC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACvB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC;YACxB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC;YAC9C,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;YAEhD,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACjC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACvB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC;YACxB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC;YAC9C,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;YAEhD,IAAI,KAAK,EAAE;gBACT,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;gBACV,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;gBACV,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;gBACX,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;gBACX,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;aAC5B;iBAAM;gBACL,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;gBACV,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;gBACV,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;gBACX,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;gBACX,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;aAC/B;SACF;aAAM;YACL,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC;YAErC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACb,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACvB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC;YACvC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;YAChD,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC;YAE9C,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACb,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACvB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC;YACvC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC;YAChD,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC;YAE9C,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC;YAC1B,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YACpD,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAClC,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAClC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SAC7C;QAED,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACjD,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACjD,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;;QAGjD,IAAM,WAAW,GAAG,CAAE,IAAI,UAAU,EAAE,EAAE,IAAI,UAAU,EAAE,CAAE,CAAC;QAC3D,IAAM,WAAW,GAAG,CAAE,IAAI,UAAU,EAAE,EAAE,IAAI,UAAU,EAAE,CAAE,CAAC;QAE3D,IAAI,EAAE,CAAC;;QAGP,EAAE,GAAG,iBAAiB,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAE/E,IAAI,EAAE,GAAG,QAAQ,CAAC,iBAAiB,EAAE;YACnC,OAAO;SACR;;QAGD,EAAE,GAAG,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAExF,IAAI,EAAE,GAAG,QAAQ,CAAC,iBAAiB,EAAE;YACnC,OAAO;SACR;;QAGD,IAAI,WAAW,CAAC,IAAI,IAAI,UAAU,CAAC,OAAO,EAAE;YAC1C,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YAC7C,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACzC;aAAM;YACL,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7D,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SAC9D;QAED,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,iBAAiB,EAAE,EAAE,CAAC,EAAE;YACnD,IAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAE1E,IAAI,UAAU,IAAI,MAAM,EAAE;gBACxB,IAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBAEvC,IAAI,WAAW,CAAC,IAAI,IAAI,UAAU,CAAC,OAAO,EAAE;oBAC1C,EAAE,CAAC,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzD,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC3B;qBAAM;oBACL,EAAE,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACjC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;oBAC5C,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;oBAC5C,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC;oBAC9C,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC;iBAC/C;gBAED,EAAE,UAAU,CAAC;aACd;SACF;QAED,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;IACnC;;ICjaA;IACA,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAE3B;IACA,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC;IACA,QAAQ,CAAC,KAAK,GAAG,aAAa,CAAC;IAC/B;IACA,QAAQ,CAAC,MAAM,GAAG,cAAc,CAAC;IACjC;IACA,QAAQ,CAAC,KAAK,GAAG,aAAa,CAAC;IAC/B;IACA,QAAQ,CAAC,KAAK,GAAG,YAAY,CAAC;IAE9B;IACA,YAAY,CAAC,KAAK,GAAG,QAAQ,CAAC;IAC9B;IACA,YAAY,CAAC,MAAM,GAAG,SAAS;;;;;;;ICvG/B,SAAc,GAAG,EAAE;;ICAnB,UAAc,GAAG,SAAS,IAAI,EAAE;IAChC,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC7C,IAAI,IAAI,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,MAAM,IAAI,GAAG,IAAI,GAAG,EAAE;IAC1B,MAAM,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;IACnC,QAAQ,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO;IACP,KAAK;IACL,GAAG;IACH,EAAE,OAAO,IAAI,CAAC;IACd,CAAC;;;;;;;;;;ICHD,IAAI,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;IAChC,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC;IACnC,IAAI,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;AAQ9B;IACA,IAAI,QAAQ,GAAG,gBAAgB,CAAC;AAChC;IACA,IAAI,EAAE,GAAG,iBAAiB,EAAE,CAAC;AAC7B;IACA,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,SAAS,KAAK,EAAE,IAAI,EAAE;IAC/C,EAAE,OAAO,OAAO,KAAK,KAAK,IAAI,CAAC;IAC/B,CAAC,CAAC;AACF;IACA,EAAE,CAAC,OAAO,GAAG,SAAS,KAAK,EAAE;IAC7B,EAAE,OAAO,OAAO,KAAK,KAAK,WAAW,CAAC;IACtC,CAAC,CAAC;AACF;IACA,EAAE,CAAC,KAAK,GAAG,SAAS,KAAK,EAAE;IAC3B,EAAE,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,EAAE,IAAI,GAAG,CAAC;AACV;IACA,EAAE,IAAI,gBAAgB,KAAK,IAAI,IAAI,oBAAoB,KAAK,IAAI;IAChE,SAAS,iBAAiB,KAAK,IAAI,EAAE;IACrC,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,IAAI,iBAAiB,KAAK,IAAI,EAAE;IAClC,IAAI,KAAK,GAAG,IAAI,KAAK,EAAE;IACvB,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;IACjC,QAAQ,OAAO,KAAK,CAAC;IACrB,OAAO;IACP,KAAK;IACL,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG;AACH;IACA,EAAE,OAAO,CAAC,KAAK,CAAC;IAChB,CAAC,CAAC;AACF;IACA,EAAE,CAAC,KAAK,GAAG,SAAS,KAAK,EAAE,KAAK,EAAE;IAClC,EAAE,IAAI,KAAK,KAAK,KAAK,EAAE;IACvB,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG;AACH;IACA,EAAE,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,EAAE,IAAI,GAAG,CAAC;AACV;IACA,EAAE,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;IAClC,IAAI,OAAO,KAAK,CAAC;IACjB,GAAG;AACH;IACA,EAAE,IAAI,iBAAiB,KAAK,IAAI,EAAE;IAClC,IAAI,KAAK,GAAG,IAAI,KAAK,EAAE;IACvB,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,KAAK,CAAC,EAAE;IAChE,QAAQ,OAAO,KAAK,CAAC;IACrB,OAAO;IACP,KAAK;IACL,IAAI,KAAK,GAAG,IAAI,KAAK,EAAE;IACvB,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,KAAK,CAAC,EAAE;IAChE,QAAQ,OAAO,KAAK,CAAC;IACrB,OAAO;IACP,KAAK;IACL,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG;AACH;IACA,EAAE,IAAI,gBAAgB,KAAK,IAAI,EAAE;IACjC,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC,MAAM,EAAE;IAC9B,MAAM,OAAO,KAAK,CAAC;IACnB,KAAK;IACL,IAAI,OAAO,EAAE,GAAG,EAAE;IAClB,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE;IAC7C,QAAQ,OAAO,KAAK,CAAC;IACrB,OAAO;IACP,KAAK;IACL,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG;AACH;IACA,EAAE,IAAI,mBAAmB,KAAK,IAAI,EAAE;IACpC,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC;IAC/C,GAAG;AACH;IACA,EAAE,IAAI,eAAe,KAAK,IAAI,EAAE;IAChC,IAAI,OAAO,KAAK,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;IAC/C,GAAG;AACH;IACA,EAAE,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACF;IACA,EAAE,CAAC,QAAQ,GAAG,SAAS,KAAK,EAAE,WAAW,EAAE;IAC3C,EAAE,OAAO,KAAK,YAAY,WAAW,CAAC;IACtC,CAAC,CAAC;AACF;IACA,EAAE,CAAC,GAAG,GAAG,SAAS,KAAK,EAAE;IACzB,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC;IACxB,CAAC,CAAC;AACF;IACA,EAAE,CAAC,KAAK,GAAG,SAAS,KAAK,EAAE;IAC3B,EAAE,OAAO,OAAO,KAAK,KAAK,WAAW,CAAC;IACtC,CAAC,CAAC;AACF;IACA,EAAE,CAAC,KAAK,GAAG,SAAS,KAAK,EAAE;IAC3B,EAAE,OAAO,gBAAgB,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC;AACF;IACA,EAAE,CAAC,UAAU,GAAG,SAAS,KAAK,EAAE;IAChC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC;AACF;IACA,EAAE,CAAC,SAAS,GAAG,SAAS,KAAK,EAAE;IAC/B,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC;IACpE,SAAS,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IAChF,CAAC,CAAC;AACF;IACA,EAAE,CAAC,OAAO,GAAG,SAAS,KAAK,EAAE;IAC7B,EAAE,OAAO,kBAAkB,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC;AACF;IACA,EAAE,CAAC,OAAO,GAAG,SAAS,KAAK,EAAE;IAC7B,EAAE,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,WAAW,KAAK,WAAW;IAClE,SAAS,KAAK,YAAY,WAAW,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC;IAC9D,CAAC,CAAC;AACF;IACA,EAAE,CAAC,EAAE,GAAG,SAAS,KAAK,EAAE;IACxB,EAAE,OAAO,mBAAmB,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC;AACF;IACA,EAAE,CAAC,MAAM,GAAG,SAAS,KAAK,EAAE;IAC5B,EAAE,OAAO,iBAAiB,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC;AACF;IACA,EAAE,CAAC,GAAG,GAAG,SAAS,KAAK,EAAE;IACzB,EAAE,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,KAAK,CAAC;IAC9C,CAAC,CAAC;AACF;IACA,EAAE,CAAC,MAAM,GAAG,SAAS,KAAK,EAAE;IAC5B,EAAE,OAAO,iBAAiB,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC;AACF;IACA,EAAE,CAAC,IAAI,GAAG,SAAS,KAAK,EAAE;IAC1B,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,WAAW,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ;IAC5E,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC;IAC5B,CAAC,CAAC;AACF;IACA,EAAE,CAAC,MAAM,GAAG,SAAS,KAAK,EAAE;IAC5B,EAAE,OAAO,iBAAiB,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC;AACF;IACA,EAAE,CAAC,MAAM,GAAG,SAAS,KAAK,EAAE;IAC5B,EAAE,OAAO,iBAAiB,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC;AACF;IACA,EAAE,CAAC,GAAG,GAAG,SAAS,KAAK,EAAE;IACzB,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,CAAC;;;ICtKD,UAAc,GAAG,WAAW;IAC5B,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC;IAChB,EAAE,SAAS,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE;IACvB,IAAI,KAAK,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,IAAI,OAAO,WAAW;IACtB,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACtC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;IACjB,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC;IAC7B,OAAO;IACP,KAAK,CAAC;IACN,GAAG;IACH,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;IAChB,EAAE,SAAS,IAAI,GAAG;IAClB,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE;IACrB,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE;IAC1B,QAAQ,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IACpC,OAAO;IACP,KAAK;IACL,GAAG;IACH,EAAE,IAAI,CAAC,IAAI,GAAG,SAAS,EAAE,EAAE;IAC3B,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE;IACrB,MAAM,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACxB,KAAK,MAAM;IACX,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,KAAK;IACL,GAAG,CAAC;IACJ,EAAE,OAAO,IAAI,CAAC;IACd,CAAC;;ICnBD,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACjB;IACA,SAAS,KAAK,CAAC,GAAG,EAAE;IACpB,EAAE,IAAI,EAAE,IAAI,YAAY,KAAK,CAAC,EAAE;IAChC,IAAI,IAAIO,IAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;IACpB,MAAM,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC/C,KAAK,MAAM,IAAIA,IAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;IAC/B,MAAM,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACjD,KAAK,MAAM;IACX,MAAM,OAAO,GAAG,CAAC;IACjB,KAAK;IACL,GAAG;AACH;IACA,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AACjB;IACA,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACzC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,GAAG;IACH,CAAC;AACD;IACA,IAAI,KAAK,GAAG,EAAE,CAAC;AACf;IACA,KAAK,CAAC,KAAK,GAAG,SAAS,EAAE,EAAE;IAC3B,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC,CAAC;AACF;IACA,IAAI,KAAK,GAAG,EAAE,CAAC;AACf;IACA,KAAK,CAAC,KAAK,GAAG,SAAS,EAAE,EAAE;IAC3B,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC,CAAC;AACF;IACA,IAAI,OAAO,GAAG,EAAE,CAAC;AACjB;IACA,KAAK,CAAC,MAAM,GAAG,WAAW;IAC1B,EAAE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAIA,IAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;IACzD,IAAI,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,GAAG;IACH,EAAE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAIA,IAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;IACzD,IAAI,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,GAAG;IACH,EAAE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAIA,IAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAEtD;IACH,CAAC,CAAC;AACF;IACA,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAO,GAAG,KAAK,CAAC;AACpB;IACA,KAAK,CAAC,GAAG,GAAG,SAAS,GAAG,EAAE,IAAI,EAAE;IAChC,EAAE,IAAI,CAAC,OAAO,EAAE;IAChB,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,OAAO;IACX,GAAG;IAEH,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC1C,EAAE,MAAM,CAAC,SAAS,KAAK,EAAE,MAAM,EAAE;IAEjC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC3C,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACzC,KAAK;IACL,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvB,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAExB,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;IAClB,GAAG,EAAE,IAAI,CAAC,CAAC;IACX,CAAC,CAAC;AACF;IACA,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC;AACvB;IACA,KAAK,CAAC,OAAO,GAAG,SAAS,IAAI,EAAE;IAC/B,EAAE,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;IAChC,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;IAEnC,MAAM,IAAI,GAAG,SAAS,QAAQ,EAAE;IAChC,QAAQ,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAClC,OAAO,CAAC;IACR,KAAK;IACL,GAAG;IACH,EAAE,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;IAClC,IAAI,OAAO;IACX,GAAG;IACH;IACA;IACA;IACA;IACA,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC;AACF;IACA,KAAK,CAAC,KAAK,GAAG,SAAS,MAAM,EAAE;AAE/B;IACA,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACvB;IACA;IACA;IACA;IACA;IACA;IACA;AACA;IACA,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW;IAE1B,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,OAAO,UAAU,CAAC,MAAM,EAAE;IAC9B,MAAM,IAAI,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;IACpC,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,KAAK;IACL,GAAG,CAAC,CAAC;IACL,CAAC,CAAC;AACF;IACA,KAAK,CAAC,KAAK,GAAG,WAAW;IACzB,EAAE,IAAI,CAAC,OAAO,EAAE;IAChB,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;IAClD,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IACzB,KAAK;IACL,GAAG;IACH,CAAC,CAAC;AACF;IACA,KAAK,CAAC,MAAM,GAAG,WAAW;IAC1B,EAAE,IAAI,OAAO,EAAE;IACf,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;IAClD,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1B,KAAK;IACL,GAAG;IACH,CAAC,CAAC;AACF;IACA,KAAK,CAAC,MAAM,GAAG,WAAW;IAC1B,EAAE,OAAO,IAAI,KAAK,EAAE,CAAC;IACrB,CAAC,CAAC;AACF;IACA,KAAK,CAAC,OAAO,GAAG,CAAC,WAAW;AAC5B;IACA,EAAE,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;IACxE,IAAI,OAAO,SAAS,GAAG,EAAE;IACzB,MAAM,OAAO,GAAG,CAAC;IACjB,KAAK,CAAC;IACN,GAAG;AACH;IACA,EAAE,IAAI,OAAO,GAAG,QAAQ,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;AACxD;IACA,EAAE,SAAS,YAAY,GAAG;IAC1B;IACA,IAAI,IAAI,QAAQ,CAAC,aAAa,EAAE;IAChC,MAAM,OAAO,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;IACxC,KAAK;AACL;IACA;IACA,IAAI,IAAI,KAAK,CAAC;IACd,IAAI,IAAI;IACR,MAAM,IAAI,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE;IACrB,QAAQ,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IAC1B,OAAO,MAAM;IACb,QAAQ,MAAM,GAAG,CAAC;IAClB,OAAO;IACP,KAAK,CAAC,OAAO,GAAG,EAAE;IAClB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,KAAK;IACL,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC;IACA,MAAM,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG;IACvC,QAAQ,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACxE,QAAQ,IAAI,GAAG,EAAE;IACjB,UAAU,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,SAAS;IACT,OAAO;IACP,KAAK;AACL;IACA;IACA,IAAI,IAAI,OAAO,CAAC,MAAM,IAAI,YAAY,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE;IACtD,MAAM,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG;IACzC,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,aAAa,EAAE;IACrD,UAAU,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAChC,SAAS;IACT,OAAO;IACP,KAAK;AACL;IACA,IAAI,OAAO,QAAQ,CAAC,IAAI,CAAC;IACzB,GAAG;AACH;IACA,EAAE,OAAO,SAAS,GAAG,EAAE;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;IAC3B,MAAM,IAAI,GAAG,GAAG,YAAY,EAAE,CAAC;IAC/B,MAAM,IAAI,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACpC;IACA;IACA,KAAK;IACL,IAAI,OAAO,GAAG,CAAC;IACf,GAAG,CAAC;IACJ,CAAC,GAAG,CAAC;AACL;IACA,QAAc,GAAG,KAAK,CAAC;AACvB;IACA,SAAS,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE;IACnC,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC5C,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW;IACzC,IAAI,QAAQ,EAAE,CAAC;IACf,GAAG,CAAC,CAAC;IACL,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,GAAG,EAAE;IAC7C,IAAI,QAAQ,CAAC,GAAG,IAAI,wBAAwB,GAAG,GAAG,CAAC,CAAC;IACpD,GAAG,CAAC,CAAC;IACL,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC;IACf,EAAE,EAAE,CAAC,EAAE,GAAG,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAClC,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAChC;;IC7NA,SAASC,QAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IAClC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CACA;AACAA,YAAM,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW;IACvC,EAAE,OAAO,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI;IAC5E,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;IACrC,CAAC,CAAC;AACF;AACAA,YAAM,CAAC,SAAS,CAAC,KAAK,GAAG,WAAW;IACpC,EAAE,OAAO,IAAIA,QAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC;AACF;AACAA,YAAM,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACpD,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,EAAE,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;IAC7B,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/B,GAAG,MAAM;IACT,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,GAAG;IACH,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,YAAM,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW;IACvC,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,YAAM,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,KAAK,EAAE;IAC1C,EAAE,IAAI,CAAC,KAAK,EAAE;IACd,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG;AACH;IACA,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AACrB;IACA,EAAE,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC;IACA,EAAE,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACtC;IACA,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAClC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAClC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAClC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAClC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAClC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAClC;IACA,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACb;IACA,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,YAAM,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE;IAC5C,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE;IAChB,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG;IACH,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IACd,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IACd,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,YAAM,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE;IACxC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;IAC5B,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG;IACH,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IACd,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IACd,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IACd,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IACd,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IACd,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IACd,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,YAAM,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE;IACvC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE;IAChB,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG;IACH,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AACrB;IACA,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9B,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9B,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9B,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9B,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9B,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AAC9B;IACA,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,YAAM,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE;IACtC,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AACrB;IACA,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;AACf;IACA,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACtC;IACA,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACb;IACA,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,YAAM,CAAC,SAAS,CAAC,OAAO,GAAGA,QAAM,CAAC,SAAS,CAAC,OAAO,GAAG,WAAW;IACjE,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE;IACnB,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAIA,QAAM,EAAE,CAAC;IAClD,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9D,GAAG;IACH,EAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC,CAAC;AACF;AACAA,YAAM,CAAC,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE;IACtC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACd,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC7C,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC7C,EAAE,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;AACF;AACAA,YAAM,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE;IACvC,EAAE,IAAI,OAAO,CAAC,KAAK,QAAQ;IAC3B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC;AACF;AACAA,YAAM,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE;IACvC,EAAE,IAAI,OAAO,CAAC,KAAK,QAAQ;IAC3B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC;AACF;IACA,UAAc,GAAGA,QAAM;;;ICxKvB,IAAI,OAAO,MAAM,CAAC,MAAM,IAAI,UAAU,EAAE;IACxC,EAAE,iBAAiB,SAAS,KAAK,EAAE,KAAK,EAAE;IAC1C,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACpD,GAAG,CAAC;IACJ,CAAC,MAAM;IACP,EAAE,iBAAiB,SAAS,KAAK,EAAE,KAAK,EAAE;IAC1C,IAAI,IAAI,KAAK;IACb,MAAM,MAAM,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;IACnD,MAAM,MAAM,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,IAAI,OAAO,IAAI,IAAI,CAAC;IACpB,GAAG,CAAC;IACJ,EAAE,SAAS,IAAI,GAAG;IAClB,GAAG;IACH;;;ICdA,IAAI,MAAM,GAAG,IAAI,CAAC;AAClB;IACA,QAAc,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AAC9B;IACA,UAAqB,GAAG,SAAS,GAAG,EAAE,GAAG,EAAE;IAC3C,EAAE,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;IAClC,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;IACrB,GAAG,MAAM,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;IACzC,IAAI,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;IACvB,GAAG;IACH,EAAE,OAAO,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IAChE,CAAC,CAAC;AACF;IACA,UAAqB,GAAG,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;IAChD,EAAE,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;IAClC,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;IACrB,GAAG,MAAM,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;IACzC,IAAI,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;IACvB,GAAG;IACH,EAAE,IAAI,GAAG,GAAG,GAAG,EAAE;IACjB,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;IACpC,IAAI,OAAO,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IACvC,GAAG,MAAM;IACT,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;IACpC,IAAI,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IACxC,GAAG;IACH,CAAC,CAAC;AACF;IACA,SAAoB,GAAG,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;IAC/C,EAAE,IAAI,GAAG,GAAG,GAAG,EAAE;IACjB,IAAI,OAAO,GAAG,CAAC;IACf,GAAG,MAAM,IAAI,GAAG,GAAG,GAAG,EAAE;IACxB,IAAI,OAAO,GAAG,CAAC;IACf,GAAG,MAAM;IACT,IAAI,OAAO,GAAG,CAAC;IACf,GAAG;IACH,CAAC,CAAC;AACF;IACA,UAAqB,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE;IACvC,EAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC;;;;;;ICtCD,SAASC,SAAO,CAAC,KAAK,EAAE,KAAK,EAAE;IAC/B,EAAE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;IACjC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3B,GAAG;IACH,CAAC;AACD;AACAA,aAAO,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW;IACpC,EAAE,OAAO,IAAIA,SAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC;AACF;IACA;IACA;IACA;AACAA,aAAO,CAAC,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IAC7C,EAAE,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;IAC7B,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;AAClC;IACA,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IAC5B,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IAC5B,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAC9C,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;AAC/C;IACA,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IACrC,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;AACvC;IACA,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACvB;IACA,GAAG,MAAM;IACT,IAAI,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;IAClC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM;IACX,MAAM,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IACjC,KAAK;IACL,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IAC5B,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;AAC5B;IACA,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACnB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACpB,GAAG;IACH,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA;IACA;IACA;AACAA,aAAO,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IAC9C,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IAC7B,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IAC7B,EAAE,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;IAChC,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACpC,GAAG;IACH,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,aAAO,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IAC3E,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IAC1B,EAAE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;IACnD,IAAI,OAAO;IACX,GAAG;AACH;IACA,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;IACnC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;IACnC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;IACnC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;AACnC;IACA,EAAE,IAAI,OAAO,EAAE,KAAK,WAAW,EAAE;IACjC,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;IAC5E,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;IAC5E,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;IACzC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;AACvC;IACA,GAAG,MAAM,IAAI,OAAO,EAAE,KAAK,WAAW,EAAE;IACxC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;AACvC;IACA,GAAG,MAAM,IAAI,OAAO,EAAE,KAAK,WAAW,EAAE;IACxC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;IACrB,GAAG;AACH;IACA,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAC9B,EAAE,EAAE,IAAI,KAAK,EAAE,EAAE,IAAI,KAAK,EAAE,EAAE,IAAI,KAAK,EAAE,EAAE,IAAI,KAAK,CAAC;AACrD;IACA,EAAE,IAAI;IACN,IAAI,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE;IAC1C,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1D,KAAK,MAAM;IACX,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACnB,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/D,KAAK;IACL,GAAG,CAAC,OAAO,EAAE,EAAE;IACf,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;IAC7B,MAAM,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtB,MAAM,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;IAChC,KAAK;IACL,GAAG;IACH,CAAC,CAAC;AACF;IACA,WAAc,GAAGA,SAAO;;ICtGxB,cAAyB,GAAG,SAAS,GAAG,EAAE,GAAG,EAAE;IAC/C,EAAE,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ;IAC3D,SAAS,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;IAC7C,CAAC;;;;;;ICSD;IACA,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB;IACA,IAAI,YAAY,GAAG,EAAE,CAAC;AACtB;IACA;IACA;AACA;AACAC,QAAK,CAAC,KAAK,GAAG,SAAS,GAAG,EAAE;IAC5B,EAAE,IAAI,KAAK,GAAGH,IAAE,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACrD,EAAE,IAAI,GAAG,CAAC,IAAI,EAAE;IAChB,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACnC,GAAG;IACH,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B;IACA,EAAE,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC/B,EAAE,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AAChC;IACA,EAAE,IAAI,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC;IAC1B,EAAE,IAAI,KAAK,GAAG,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC;IAClC,EAAE,IAAIA,IAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;IAC5B,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;IACpB,GAAG,MAAM,IAAIA,IAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;IACjC,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;IACzC,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;IACrC,GAAG;IACH,EAAE,GAAG,IAAIG,IAAK,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE;IACtC,IAAI,GAAG,GAAGA,IAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE7B,IAAI,IAAI,WAAW,GAAGA,IAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AACnD;IACA,IAAI,WAAW,CAAC,GAAG,EAAE,SAAS,KAAK,EAAE;IAErC,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9B,MAAM,IAAI,EAAE,CAAC;AACb;IACA,KAAK,EAAE,SAAS,GAAG,EAAE;IAErB,MAAM,IAAI,EAAE,CAAC;IACb,KAAK,CAAC,CAAC;IACP,GAAG,CAAC,CAAC;AACL;IACA,EAAE,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACF;IACA,KAAK,CAAC,MAAM,GAAGD,OAAO,CAAC;IACvB,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACjD;IACA,SAAS,KAAK,CAAC,GAAG,EAAE;IACpB,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B;IACA,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC;AACnB;IACA,EAAE,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5B,EAAE,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC7B,EAAE,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC7B,EAAE,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AAC7B;IACA,EAAE,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC;IAClC,EAAE,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;IACtC,EAAE,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;IAC3B,EAAE,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC9B,EAAE,IAAI,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC5B,EAAE,IAAI,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC;AAC3C;IACA,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE;IACrB,IAAI,IAAI,CAAC,GAAG,IAAIF,IAAE,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;IACjC,MAAM,OAAO,GAAG,CAAC;IACjB,KAAK;AACL;IACA,IAAI,GAAG,GAAG,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAC1B;IACA,IAAI,IAAIA,IAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;IACpB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,KAAK;AACL;IACA,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE;IAClB,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;IACjC,MAAM,GAAG,CAAC,KAAK,IAAI,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC;IAC1C,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC;IACxC,MAAM,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC;IACxC,KAAK;AACL;IACA,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE;IACnB,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;IACnC,MAAM,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC;IACpD,MAAM,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC;IAC1C,MAAM,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC;IAC1C,KAAK;AACL;IACA,IAAI,IAAI,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IACvD,IAAI,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACvD,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,OAAO,OAAO,CAAC;IACnB,GAAG;AACH;IACA,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE;IACvB,IAAI,IAAI,QAAQ,EAAE;IAClB,MAAM,IAAIA,IAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE;IAC3B,QAAQ,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,MAAM,IAAIA,IAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;IACpC,QAAQ,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO;IACP,KAAK;IACL,IAAI,IAAI,OAAO,EAAE;IACjB,MAAM,IAAI,MAAM,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC/C,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;IACvD,UAAU,IAAI,CAAC,KAAK,CAAC,EAAE;IACvB,YAAY,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAChC,WAAW,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE;IAC9B,YAAY,MAAM,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,WAAW,MAAM;IACjB,YAAY,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,WAAW;IACX,UAAU,CAAC,EAAE,CAAC;IACd,SAAS;IACT,OAAO;IACP,MAAM,IAAI,CAAC,KAAK,CAAC,IAAIA,IAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;IACrC,QAAQ,MAAM,GAAG,SAAS,QAAQ,EAAE;IACpC,UAAU,OAAO,OAAO,CAAC,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC;IAC7D,SAAS,CAAC;IACV,OAAO;IACP,MAAM,OAAO,MAAM,CAAC;IACpB,KAAK;IACL,GAAG;AACH;IACA,EAAE,IAAI,CAAC,MAAM,GAAG,SAAS,KAAK,EAAE;IAChC,IAAI,IAAI,CAAC,KAAK,EAAE;IAChB;IACA,MAAM,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACxC,KAAK;IACL,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,IAAI,KAAK,EAAE;IACf,MAAM,OAAO,IAAI,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9C,KAAK;IACL,GAAG,CAAC;AACJ;IACA,CACA;IACA,IAAI,SAAS,GAAG,IAAIE,OAAO,EAAE,CAAC;IAC9B,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACnE,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,IAAI,GAAG,WAAW;IAC7D,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,SAAS,CAAC,IAAI,GAAG,WAAW;IAC5B,CAAC,CAAC;AACF;IACA,IAAI,WAAW,GAAG,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC;AAC3C;IACA,SAAS,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE;IACvC,EAAE,SAAS,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE;IAClC,IAAI,IAAI,CAAC,MAAM,EAAE;IACjB,MAAM,OAAO,SAAS,CAAC;AACvB;IACA,KAAK,MAAM,IAAIF,IAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;IACnC,MAAM,OAAO,MAAM,CAAC;AACpB;IACA,KAAK,MAAM,IAAIA,IAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAIA,IAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;IACzD,WAAWA,IAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAIA,IAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;IACpD,MAAM,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AAC1B;IACA,KAAK,MAAM,IAAIA,IAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAIA,IAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;IACxD,MAAM,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpC;IACA,KAAK,MAAM,IAAIA,IAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE;IAC9B,MAAM,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpC;IACA,KAAK,MAAM,IAAIA,IAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;IACjC,MAAM,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B;IACA,KAAK,MAAM,IAAIA,IAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAIA,IAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;IACjD,MAAM,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAChC,KAAK;IACL,GAAG;AACH;IACA,EAAE,IAAI,CAAC,GAAG,GAAG,SAAS,QAAQ,EAAE;IAChC,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClC,GAAG,CAAC;AACJ;IACA,EAAE,IAAI,CAAC,KAAK,GAAG,SAAS,GAAG,EAAE;IAC7B,IAAI,IAAI,KAAK,GAAGA,IAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;IACzC,IAAI,IAAIA,IAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;IAC1B,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC9C,QAAQ,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO;IACP,KAAK,MAAM;IACX,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,KAAK;IACL,IAAI,OAAO,KAAK,CAAC;IACjB,GAAG,CAAC;IACJ,CAAC;AACD;AACAG,QAAK,CAAC,OAAO,GAAG,SAAS,KAAK,EAAE;IAChC,EAAE,IAAI,CAACH,IAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;IACzB,IAAI,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,GAAG;AACH;IACA,EAAE,IAAI,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC9B;IACA,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE;IAC5D,IAAI,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5C,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvD,GAAG;AACH;IACA,EAAE,IAAI,CAAC,MAAM,KAAK,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE;IAChD,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;IAC5B,GAAG;AACH;IACA,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACvD,IAAI,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3C,GAAG;AACH;IACA,EAAE,IAAI,CAAC,MAAM,EAAE;IACf,IAAI,OAAO,CAAC,KAAK,CAAC,qBAAqB,GAAG,KAAK,CAAC,CAAC;IACjD,IAAI,MAAM,GAAG,WAAW,CAAC;IACzB,GAAG;AACH;IACA,EAAE,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACF;IACA,SAAS,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;IACrC,EAAE,IAAI,IAAI,IAAI,IAAI;IAClB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAC9D,UAAU,0CAA0C,CAAC,CAAC;IACtD;;IC3OA,IAAII,KAAG,GAAG,CAAC,CAAC;AACZ;IACA;AACA;AACAD,QAAK,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC;AAC5B;AACAA,QAAK,CAAC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC;AAChC;AACAA,QAAK,CAAC,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;AAC/BA,QAAK,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC;AAC7BA,QAAK,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC;AAC7B;AACAA,QAAK,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC;AAC9BA,QAAK,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC;AAC7B;AACAA,QAAK,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC;AAC9BA,QAAK,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC;AAC9B;AACAA,QAAK,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW;IACtC,EAAE,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;IACjC,CAAC,CAAC;AACF;IACA;IACA;IACA;AACAA,QAAK,CAAC,SAAS,CAAC,EAAE,GAAG,SAAS,EAAE,EAAE;IAClC,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,KAAK,EAAE;IACxC,EAAE,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;IACpC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,GAAG;IACH,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,IAAI,EAAE,KAAK,EAAE;IAC7C,EAAE,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;IACpC,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IAChE,GAAG;IACH,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IACxE,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,OAAO,EAAE;IAC5C,EAAE,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE;IACtC,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,GAAG;IACH,EAAE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,EAAEC,KAAG,CAAC,CAAC;IACtD,EAAE,IAAI,CAAC,OAAO,GAAG,EAAEA,KAAG,CAAC;IACvB,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAD,QAAK,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW;IAClC,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW;IAClC,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,MAAM,GAAG,WAAW;IACpC,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,OAAO,EAAE;IACzC,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IACxB,EAAE,OAAO,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;IAC5C,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IACtB,GAAG;IACH,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,OAAO,EAAE;IACzC,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IACxB,EAAE,OAAO,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;IAC5C,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IACtB,GAAG;IACH,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,OAAO,EAAE;IAC1C,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IACzB,EAAE,OAAO,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;IAC5C,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IACtB,GAAG;IACH,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,OAAO,EAAE;IACzC,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IACxB,EAAE,OAAO,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;IAC5C,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IACtB,GAAG;IACH,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,OAAO,EAAE,IAAI,EAAE;IAChD,EAAE,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,EAAE,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,EAAE,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;IAClD,IAAI,OAAO;IACX,GAAG;IACH,EAAE,IAAI,KAAK,EAAE,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvE,EAAE,OAAO,KAAK,GAAG,IAAI,EAAE;IACvB,IAAI,IAAI,GAAG,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;IACpC,MAAM,OAAO,IAAI,CAAC;IAClB,KAAK;IACL,GAAG;IACH,EAAE,OAAO,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,KAAK,EAAE,IAAI,EAAE;IAC/C,EAAE,IAAIH,IAAE,CAAC,KAAK,CAAC,KAAK,CAAC;IACrB,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;IACzC,MAAM,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B;IACA,OAAO,IAAI,OAAO,IAAI,KAAK,WAAW;IACtC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE;IAC7C,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACjC;IACA,OAAO,IAAI,OAAO,KAAK,KAAK,WAAW;IACvC,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACxB;IACA,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAG,QAAK,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,KAAK,EAAE,IAAI,EAAE;IAChD,EAAE,IAAIH,IAAE,CAAC,KAAK,CAAC,KAAK,CAAC;IACrB,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;IAC9C,MAAM,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B;IACA,OAAO,IAAI,OAAO,IAAI,KAAK,WAAW;IACtC,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;IAClD,MAAM,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC;IACA,OAAO,IAAI,OAAO,KAAK,KAAK,WAAW;IACvC,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACzB;IACA,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAG,QAAK,CAAC,SAAS,CAAC,QAAQ,GAAG,SAAS,MAAM,EAAE;IAC5C,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACvB,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,MAAM,EAAE;IAC7C,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxB,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,OAAO,EAAE,IAAI,EAAE;IACrD,EAAE,IAAIH,IAAE,CAAC,KAAK,CAAC,OAAO,CAAC;IACvB,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE;IAC3C,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACpC;IACA,OAAO,IAAI,OAAO,IAAI,KAAK,WAAW;IACtC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE;IAC7C,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACtC;IACA,OAAO,IAAI,OAAO,OAAO,KAAK,WAAW;IACzC,IAAI,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC/B;IACA,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAG,QAAK,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,OAAO,EAAE,IAAI,EAAE;IACrD,EAAE,IAAIH,IAAE,CAAC,KAAK,CAAC,OAAO,CAAC;IACvB,IAAI,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;IAChD,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACrC;IACA,OAAO,IAAI,OAAO,IAAI,KAAK,WAAW;IACtC,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;IAClD,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACvC;IACA,OAAO,IAAI,OAAO,OAAO,KAAK,WAAW;IACzC,IAAI,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAChC;IACA,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAG,QAAK,CAAC,SAAS,CAAC,WAAW,GAAG,SAAS,IAAI,EAAE;IAC7C,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1B,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,YAAY,GAAG,SAAS,IAAI,EAAE;IAC9C,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3B,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE;IAC/B,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;AAClB;IACA,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AACjB;IACA,EAAE,IAAI,MAAM,CAAC,KAAK,EAAE;IACpB,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAC/B,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC/B,GAAG;AACH;IACA,EAAE,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IACzB,EAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;AACvB;IACA,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;IACtB,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;IAC1B,GAAG;AACH;IACA,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACnC;IACA,EAAE,KAAK,CAAC,UAAU,GAAG,EAAEC,KAAG,CAAC;IAC3B,EAAE,MAAM,CAAC,YAAY,GAAG,EAAEA,KAAG,CAAC;IAC9B,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACD;IACA,SAAS,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE;IAChC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;AAClB;IACA,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AACjB;IACA,EAAE,IAAI,MAAM,CAAC,MAAM,EAAE;IACrB,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IAChC,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;IAChC,GAAG;AACH;IACA,EAAE,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IACzB,EAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;AACxB;IACA,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;IACrB,IAAI,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACzB,GAAG;AACH;IACA,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACnC;IACA,EAAE,KAAK,CAAC,UAAU,GAAG,EAAEA,KAAG,CAAC;IAC3B,EAAE,MAAM,CAAC,YAAY,GAAG,EAAEA,KAAG,CAAC;IAC9B,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CACA;IACA,SAAS,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE;IAClC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AAChB;IACA,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAChB;IACA,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAC5B,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;AACxB;IACA,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,EAAE,IAAI,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,MAAM,KAAK,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAClE;IACA,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AACpB;IACA,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACjC;IACA,EAAE,IAAI,CAAC,UAAU,GAAG,EAAEA,KAAG,CAAC;IAC1B,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CACA;IACA,SAAS,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE;IACjC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AAChB;IACA,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAChB;IACA,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAC5B,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;AACxB;IACA,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,EAAE,IAAI,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,MAAM,KAAK,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;AACjE;IACA,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AACpB;IACA,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACjC;IACA,EAAE,IAAI,CAAC,UAAU,GAAG,EAAEA,KAAG,CAAC;IAC1B,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CACA;AACAD,QAAK,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,KAAK,EAAE,IAAI,EAAE;IAC/C,EAAE,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;IACpC,IAAI,IAAIH,IAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IACzB,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;IAC3C,QAAQ,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AACnC;IACA,KAAK,MAAM,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE;IAC5C,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE;IAC/C,QAAQ,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AACvC;IACA,KAAK,MAAM;IACX,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9B,KAAK;IACL,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG;AACH;IACA,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;IAClB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAClC,GAAG;IACH,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;IAClB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAClC,GAAG;AACH;IACA,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE;IACpB,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE;IACtC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;IACvC,KAAK;IACL,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE;IACrC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACtC,KAAK;AACL;IACA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACpC;IACA,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,EAAEI,KAAG,CAAC;IACtC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACzB,GAAG;AACH;IACA,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IAChD,EAAE,IAAI,CAAC,UAAU,GAAG,EAAEA,KAAG,CAAC;IAC1B;AACA;IACA,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAD,QAAK,CAAC,SAAS,CAAC,KAAK,GAAG,WAAW;IACnC,EAAE,IAAI,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IAChC,EAAE,OAAO,KAAK,GAAG,IAAI,EAAE;IACvB,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;IACvB,IAAI,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;AACrD;IACA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7B,GAAG;AACH;IACA,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AAClC;IACA,EAAE,IAAI,CAAC,YAAY,GAAG,EAAEC,KAAG,CAAC;IAC5B,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAD,QAAK,CAAC,SAAS,CAAC,KAAK,GAAG,WAAW;IACnC,EAAE,IAAI,CAAC,SAAS,GAAG,EAAEC,KAAG,CAAC;IACzB,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvC,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA;IACA;IACA;AACAD,QAAK,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,GAAG,EAAE,IAAI,EAAE;IAC5C,EAAE,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE;IACnC,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzD,GAAG;IACH,EAAE,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;IAC/B,IAAI,IAAI,IAAI,EAAE;IACd,MAAM,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;IACtC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;IAC7C,QAAQ,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtC,OAAO;IACP,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrD;IACA,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;IACpD,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;IACjD,QAAQ,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACvC,OAAO;IACP,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9C,KAAK;IACL,GAAG;IACH,EAAE,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;IAC/B,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE;IACpB,MAAM,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE;IACpC,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;IAClC,UAAU,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjC,SAAS;IACT,OAAO;IACP,KAAK;IACL,GAAG;IACH,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA;IACA;IACA;AACAA,QAAK,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,GAAG,EAAE;IACxC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC/B,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IACjC,EAAE,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC;IACvE,CAAC,CAAC;AACF;IACA,SAAS,OAAO,CAAC,GAAG,EAAE;IACtB,EAAE,IAAI,GAAG,IAAI,GAAG,YAAYA,IAAK,EAAE;IACnC,IAAI,OAAO,GAAG,CAAC;IACf,GAAG;IACH,EAAE,MAAM,gBAAgB,GAAG,GAAG,CAAC;IAC/B;;ICvZA,SAAc,GAAG,SAAS,SAAS,EAAE,QAAQ,EAAE;AAC/C;IACA,EAAE,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC;AAC9B;IACA,EAAE,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,KAAK,EAAE,QAAQ,EAAE;IAC9D,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;IACnE,MAAM,OAAO,IAAI,CAAC;IAClB,KAAK;IACL,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE;IAClC,MAAM,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;IAC3B,KAAK;IACL,IAAI,IAAI,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC;IAChF,IAAI,IAAI,KAAK,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;IACnE,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC7C,QAAQ,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5D,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,QAAQ,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;IAC5C,UAAU,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,SAAS;IACT,OAAO;IACP,KAAK;IACL,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;AACJ;IACA,EAAE,SAAS,CAAC,GAAG,GAAG,SAAS,KAAK,EAAE,QAAQ,EAAE;IAC5C,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;IACnE,MAAM,OAAO,IAAI,CAAC;IAClB,KAAK;IACL,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE;IAClC,MAAM,OAAO,IAAI,CAAC;IAClB,KAAK;IACL,IAAI,IAAI,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC;IAChF,IAAI,IAAI,KAAK,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;IACnE,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC7C,QAAQ,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IAChE,QAAQ,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;IACzD,UAAU,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC/B,UAAU,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;IAC3B,YAAY,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACzC,WAAW;IACX,UAAU,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;IAC9C,YAAY,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACxC,WAAW;IACX,SAAS;IACT,OAAO;IACP,KAAK;IACL,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;AACJ;IACA,EAAE,SAAS,CAAC,SAAS,GAAG,SAAS,IAAI,EAAE;IACvC,IAAI,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpD,GAAG,CAAC;AACJ;IACA,EAAE,SAAS,CAAC,OAAO,GAAG,SAAS,IAAI,EAAE,IAAI,EAAE;IAC3C,IAAI,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;IACzC,MAAM,OAAO,CAAC,CAAC;IACf,KAAK;IACL,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC/C,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,KAAK;IACL,IAAI,OAAO,SAAS,CAAC,MAAM,CAAC;IAC5B,GAAG,CAAC;AACJ;IACA,EAAE,SAAS,CAAC,OAAO,GAAG,SAAS,IAAI,EAAE,IAAI,EAAE;IAC3C,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;AACJ;IACA,CAAC;;ACtEDE,SAAuB,CAACC,IAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;IAC7E,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACtB,CAAC,CAAC;;ICCF,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ;AACAH,QAAK,CAAC,KAAK,CAAC,WAAW;IACvB,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACH;AACAA,QAAK,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,QAAQ,EAAE;IAC5C,EAAE,IAAI,QAAQ,KAAK,IAAI,EAAE;IACzB,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;IACtC,GAAG;IACH,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;IACpC,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE;IACrC,EAAE,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;IAC7B,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,OAAO,IAAI,CAAC;AAChB;IACA,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;IACpC,IAAI,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;IAClC,MAAM,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9B,KAAK,MAAM;IACX,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1B,MAAM,OAAO,IAAI,CAAC;IAClB,KAAK;IACL,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;IACvC,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,GAAG;IACH,CAAC,CAAC;AACF;IACA,SAAS,GAAG,CAAC,KAAK,EAAE;AACpB;IACA,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AACtB;IACA;IACA,EAAE,IAAI,CAAC,eAAe,GAAG,IAAIF,MAAM,EAAE,CAAC;AACtC;IACA;IACA,EAAE,IAAI,CAAC,eAAe,GAAG,IAAIA,MAAM,EAAE,CAAC;AACtC;IACA,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CACA;IACA,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,WAAW;AACjC;IACA,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;IACzB,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAClB;IACA,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;AACnB;IACA,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;IACnB,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;IACnB,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;AACrB;IACA;IACA,EAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AACtB;IACA;IACA,EAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACpB,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;AACpB;IACA;IACA,EAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;IACnB,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;AACnB;IACA;IACA,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACpB,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;AACpB;IACA,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACjB,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACjB,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/B,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC;AACjC;IACA;IACA,EAAE,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC7B,EAAE,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC7B,EAAE,IAAI,CAAC,UAAU,GAAG,EAAE,GAAG,CAAC;IAC1B,CAAC,CAAC;AACF;IACA,GAAG,CAAC,SAAS,CAAC,OAAO,GAAG,WAAW;IACnC,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;AACjE;IACA;IACA,EAAE,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,EAAE;IAC9D,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC;IACzC,IAAI,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC/B,GAAG;AACH;IACA,EAAE,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO;IACnC,SAAS,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;IACvD,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;IAChD,IAAI,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC/B,GAAG;AACH;IACA,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA,GAAG,CAAC,SAAS,CAAC,QAAQ,GAAG,WAAW;IACpC,EAAE,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IAChF,CAAC,CAAC;AACF;IACA;AACA;IACA,GAAG,CAAC,SAAS,CAAC,cAAc,GAAG,WAAW;IAC1C,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG;IACnB,IAAI,IAAI,CAAC,aAAa;IACtB,IAAI,IAAI,CAAC,aAAa;IACtB,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC;IAC9C,GAAG,CAAC;IACJ,EAAE,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE;IAC1B,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,GAAG;IACH,EAAE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;AACpB;IACA,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC;IACjC,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;AACnC;IACA,EAAE,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;AAC3D;IACA,EAAE,IAAI,CAAC,UAAU,GAAG,EAAE,GAAG,CAAC;AAC1B;IACA,EAAE,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;AACF;IACA,GAAG,CAAC,SAAS,CAAC,cAAc,GAAG,WAAW;IAC1C,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa;IAC1D,MAAM,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;IACrD,EAAE,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE;IAC1B,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,GAAG;IACH,EAAE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;AACpB;IACA,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC;AACjC;IACA,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;IACjB,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;IACrB,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7E,GAAG;IACH,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;IACrB,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3E,GAAG;AACH;IACA;IACA,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;IACrB;IACA,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACnB,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACnB,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC;AACnC;IACA,GAAG,MAAM;IACT;IACA,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;IAC1D,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IAC5D,KAAK,MAAM;IACX,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IACxD,KAAK;IACL,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE;IACf,MAAM,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACrB,MAAM,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,KAAK,MAAM;IACX,MAAM,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACrB,MAAM,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,KAAK;IACL,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;IAC1D,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IAC5D,KAAK,MAAM;IACX,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IACxD,KAAK;IACL,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE;IACf,MAAM,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACrB,MAAM,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,KAAK,MAAM;IACX,MAAM,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACrB,MAAM,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,KAAK;IACL,GAAG;AACH;IACA,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC1B,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;AAC1B;IACA,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;IACzD,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;AAC1D;IACA,EAAE,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE;IACrC,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;IAClC,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAClD,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IACnD,GAAG;AACH;IACA,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;AAClC;IACA,EAAE,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC,CAAC;AACF;IACA,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,SAAS,GAAG,EAAE;IAClC,EAAE,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,UAAU,EAAE;IAC1C,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9B,GAAG;IACH,CAAC,CAAC;AACF;IACA;IACA,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE;IACnC,EAAE,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;IAC7B,IAAI,IAAI,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;IACtE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1B,KAAK;IACL,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;IACpC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE;IACjB,MAAM,IAAI,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE;IAC3E,QAAQ,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,OAAO;IACP,KAAK;IACL,GAAG;IACH,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE;IACnB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,EAAE,GAAG,CAAC;IAChC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACxB,GAAG;IACH,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA,IAAI,OAAO,GAAG;IACd,EAAE,KAAK,GAAG,SAAS,GAAG,EAAE;IACxB,IAAI,OAAO,GAAG,CAAC,MAAM,CAAC;IACtB,GAAG;AACH;IACA,EAAE,YAAY,GAAG,SAAS,GAAG,EAAE;IAC/B,IAAI,OAAO,GAAG,CAAC,aAAa,CAAC;IAC7B,GAAG;AACH;IACA,EAAE,KAAK,GAAG,SAAS,GAAG,EAAE;IACxB,IAAI,OAAO,GAAG,CAAC,MAAM,CAAC;IACtB,GAAG;AACH;IACA,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE;IACzB,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC;IACvB,GAAG;AACH;IACA,EAAE,QAAQ,GAAG,SAAS,GAAG,EAAE;IAC3B,IAAI,OAAO,GAAG,CAAC,SAAS,CAAC;IACzB,GAAG;AACH;IACA,EAAE,SAAS,GAAG,SAAS,GAAG,EAAE;IAC5B,IAAI,OAAO,GAAG,CAAC,UAAU,CAAC;IAC1B,GAAG;AACH;IACA;IACA;AACA;IACA,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE;IACzB,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC;IACvB,GAAG;AACH;IACA,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE;IACzB,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC;IACvB,GAAG;AACH;IACA;IACA;AACA;IACA,EAAE,KAAK,GAAG,SAAS,GAAG,EAAE;IACxB,IAAI,OAAO,GAAG,CAAC,MAAM,CAAC;IACtB,GAAG;AACH;IACA,EAAE,KAAK,GAAG,SAAS,GAAG,EAAE;IACxB,IAAI,OAAO,GAAG,CAAC,MAAM,CAAC;IACtB,GAAG;AACH;IACA,EAAE,QAAQ,GAAG,SAAS,GAAG,EAAE;IAC3B,IAAI,OAAO,GAAG,CAAC,SAAS,CAAC;IACzB,GAAG;AACH;IACA;IACA;AACA;IACA,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE;IACzB,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC;IACvB,GAAG;AACH;IACA,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE;IACzB,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC;IACvB,GAAG;AACH;IACA;IACA;AACA;IACA,EAAE,OAAO,GAAG,SAAS,GAAG,EAAE;IAC1B,IAAI,OAAO,GAAG,CAAC,QAAQ,CAAC;IACxB,GAAG;AACH;IACA,EAAE,OAAO,GAAG,SAAS,GAAG,EAAE;IAC1B,IAAI,OAAO,GAAG,CAAC,QAAQ,CAAC;IACxB,GAAG;AACH;IACA;IACA;AACA;IACA,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE;IACzB,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC;IACvB,GAAG;AACH;IACA,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE;IACzB,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC;IACvB,GAAG;AACH;IACA;IACA;AACA;IACA,EAAE,OAAO,GAAG,SAAS,GAAG,EAAE;IAC1B,IAAI,OAAO,GAAG,CAAC,QAAQ,CAAC;IACxB,GAAG;AACH;IACA,EAAE,OAAO,GAAG,SAAS,GAAG,EAAE;IAC1B,IAAI,OAAO,GAAG,CAAC,QAAQ,CAAC;IACxB,GAAG;IACH,CAAC,CAAC;AACF;IACA,IAAI,OAAO,GAAG;IACd,EAAE,KAAK,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAC/B,IAAI,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC;IACvB,GAAG;AACH;IACA,EAAE,YAAY,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IACtC,IAAI,GAAG,CAAC,aAAa,GAAG,KAAK,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,KAAK,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAC/B,IAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACxB,IAAI,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC;IACvB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAChC,IAAI,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;IACzB,IAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACxB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,KAAK,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAC/B,IAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACxB,IAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACxB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAChC,IAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACxB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAChC,IAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACxB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,IAAI,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAC9B,IAAI,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC;IACvB,IAAI,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC;IACvB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,KAAK,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAC/B,IAAI,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC;IACvB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,KAAK,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAC/B,IAAI,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC;IACvB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,QAAQ,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAClC,IAAI,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC;IAC1B,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,KAAK,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAC/B,IAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACxB,IAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACxB,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;IACxB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAChC,IAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACxB,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;IACxB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAChC,IAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACxB,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;IACxB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAChC,IAAI,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;IACzB,IAAI,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;IACzB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,OAAO,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IACjC,IAAI,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;IACzB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,OAAO,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IACjC,IAAI,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;IACzB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,KAAK,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAC/B,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5B,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5B,GAAG;AACH;IACA,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAChC,IAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACxB,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;IACxB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;AAC9B;IACA,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,GAAG;AACH;IACA,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAChC,IAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACxB,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;IACxB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;AAC9B;IACA,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,GAAG;AACH;IACA,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAChC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,GAAG;AACH;IACA,EAAE,OAAO,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IACjC,IAAI,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;IACzB,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;IACxB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,OAAO,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IACjC,IAAI,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;IACzB,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;IACxB,IAAI,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,UAAU,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;IACzC,IAAI,IAAI,GAAG,EAAE;IACb,MAAM,IAAI,KAAK,IAAI,IAAI,EAAE;IACzB,QAAQ,KAAK,GAAG,QAAQ,CAAC;IACzB,OAAO,MAAM,IAAI,KAAK,IAAI,KAAK,EAAE;IACjC,QAAQ,KAAK,GAAG,UAAU,CAAC;IAC3B,OAAO;IACP,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC7D,KAAK;IACL,GAAG;AACH;IACA,EAAE,WAAW,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;IAC1C,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE;IACjC,MAAM,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAChC,KAAK;IACL,GAAG;AACH;IACA,EAAE,YAAY,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;IAC3C,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE;IACjC,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAChC,KAAK;IACL,GAAG;AACH;IACA,EAAE,SAAS,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;IACxC,IAAI,IAAI,GAAG,EAAE;IACb,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC3D,KAAK;IACL,GAAG;AACH;IACA,EAAE,UAAU,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;IACzC,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE;IAChC,MAAM,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAChC,KAAK;IACL,GAAG;AACH;IACA,EAAE,WAAW,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;IAC1C,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE;IAChC,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAChC,KAAK;IACL,GAAG;AACH;IACA,EAAE,MAAM,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;IAChC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC1B,GAAG;IACH,CAAC,CAAC;AACF;IACA,SAAS,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;IAC3C,EAAE,IAAI,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC;IACpC,EAAE,IAAI,CAAC,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC;IACrC,EAAE,IAAI,CAAC,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC;IACnC,EAAE,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC;IAC5B,EAAE,IAAI,CAAC,EAAE;IACT,IAAI,GAAG,CAAC,OAAO,GAAG,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC;IACtC,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;IAC7B,GAAG;IACH,EAAE,IAAI,CAAC,EAAE;IACT,IAAI,GAAG,CAAC,OAAO,GAAG,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC;IACxC,IAAI,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC/B,GAAG;IACH,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;IACnB,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,UAAU,EAAE;IAC7C,MAAM,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrE,KAAK,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,QAAQ,EAAE;IACjD,MAAM,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrE,KAAK;IACL,IAAI,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,IAAI,QAAQ,EAAE;IAChD,MAAM,GAAG,CAAC,MAAM,GAAG,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC;IACvC,MAAM,GAAG,CAAC,OAAO,GAAG,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;IACzC,KAAK;IACL,GAAG;IACH,CACA;AACAE,QAAK,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IAC5C,EAAE,IAAI,OAAO,CAAC,KAAK,QAAQ;IAC3B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5B,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA;IACA,GAAG,CAAC,cAAc,GAAG,SAAS,KAAK,EAAE;IACrC,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE;IACxC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACzB,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC1B,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;AACJ;IACA,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,EAAE;IACtC,IAAI,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;IAClC,MAAM,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,KAAK;IACL,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACzB,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;AACJ;IACA,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE;IACvC,IAAI,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;IAClC,MAAM,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChC,KAAK;IACL,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC1B,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;AACJ;IACA,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE;IAC1C,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;IAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC3B,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;AACJ;IACA,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE;IACvC,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC5B,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;AACJ;IACA,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE;IACxC,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;IAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvB,SAAS,IAAI,OAAO,CAAC,KAAK,WAAW;IACrC,MAAM,CAAC,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACzB,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACzB,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;AACJ;IACA,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE;IACzC,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;IAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvB,SAAS,IAAI,OAAO,CAAC,KAAK,WAAW;IACrC,MAAM,CAAC,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC1B,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC1B,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;AACJ;IACA,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE;IAC1C,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACzB,IAAI,IAAI,OAAO,EAAE,KAAK,WAAW,EAAE;IACnC,MAAM,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACnC,KAAK;IACL,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;IACJ,CAAC,CAAC;AACF;IACA,GAAG,CAAC,cAAc,CAACA,IAAK,CAAC,CAAC;AAC1B;IACA,OAAc,GAAG,GAAG;;ACvmBpBA,QAAK,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC;AACjCA,QAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3B;AACAA,QAAK,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,OAAO,EAAE;IAC3C,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;IACtB,IAAI,OAAO;IACX,GAAG;IACH,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;AACf;IACA,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACxB,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD;IACA;IACA,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5E,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;AACpD;IACA,EAAE,IAAI,OAAO,CAAC,WAAW,IAAI,KAAK,EAAE;IACpC,IAAI,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC;IAChC,GAAG;AACH;IACA,EAAE,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;IAC/B,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;IAC3D,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,KAAK;IACL,GAAG;AACH;IACA,EAAE,IAAI,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,EAAE;IAC1C,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;IACtC,GAAG;AACH;IACA,EAAE,IAAI,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IAChC,EAAE,OAAO,KAAK,GAAG,IAAI,EAAE;IACvB,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;IACvB,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1B,GAAG;IACH,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;AACnCA,QAAK,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC;AAClCA,QAAK,CAAC,SAAS,CAAC,UAAU,GAAG,QAAQ,CAAC;AACtC;AACAA,QAAK,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE;IACrD,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;IACtB,IAAI,OAAO;IACX,GAAG;AACH;IACA,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;IACjC,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC;AACrB;IACA,EAAE,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE;IACjC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACtD,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACnB,MAAM,IAAI,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC;IACxE,KAAK;IACL,GAAG;AACH;IACA,EAAE,IAAI,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IAChC,EAAE,OAAO,KAAK,GAAG,IAAI,EAAE;IACvB,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;IACvB,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;IAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;IACxE,KAAK;IACL,GAAG;AACH;IACA,EAAE,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE;IAChC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACrD,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACnB,MAAM,IAAI,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC;IACxE,KAAK;IACL,GAAG;AACH;IACA,EAAE,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,MAAM,EAAE,MAAM,EAAE;IAChD,EAAE,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;IACpC,IAAI,OAAO;IACX,GAAG;IACH,EAAE,IAAI,MAAM,EAAE;IACd,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE;IACnC,MAAM,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IAC5B,KAAK;IACL,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,GAAG,MAAM;IACT,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE;IAClC,MAAM,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;IAC3B,KAAK;IACL,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,GAAG;IACH,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;IAC5E,SAAS,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE;IAC1C,EAAE,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;IACpC,IAAI,OAAO;IACX,GAAG;IACH,EAAE,IAAI,CAAC,CAAC;IACR,EAAE,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;IAChF,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,GAAG;IACH,EAAE,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;IAC9E,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,GAAG;IACH,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,EAAE,EAAE,IAAI,EAAE;IAC7C,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,EAAE,EAAE,IAAI,EAAE;IAChD,EAAE,SAAS,KAAK,CAAC,CAAC,EAAE;IACpB,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE;IACzB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,KAAK,MAAM;IACX,MAAM,OAAO,IAAI,CAAC;IAClB,KAAK;IACL,GAAG;IACH,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,EAAE,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,YAAY,GAAG,SAAS,KAAK,EAAE;IAC/C,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;;IC9HD,IAAI,CAAC,MAAM,GAAGA,IAAK,CAAC;IACpB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC/C;AACAA,QAAK,CAAC,IAAI,GAAG,SAAS,OAAO,EAAE,MAAM,EAAE;IACvC,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC;AACF;IACA,SAAS,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE;IAC/B,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACrB;IACA,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC;IACpB,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC;AACrB;IACA,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC;IAClB,EAAE,IAAI,QAAQ,GAAG,CAAC,CAAC;IACnB,EAAE,IAAI,IAAI,GAAG,SAAS,GAAG,EAAE;IAC3B,IAAI,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE;IAC7C,MAAM,OAAO;IACb,KAAK;AACL;IACA,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;AAC7C;IACA,IAAI,IAAI,IAAI,GAAG,QAAQ,IAAI,GAAG,CAAC;IAC/B,IAAI,IAAI,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC;IAC7B,IAAI,QAAQ,GAAG,GAAG,CAAC;AACnB;IACA,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAChD,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE;IAC1C,MAAM,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACtC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACnB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,KAAK,MAAM,IAAI,MAAM,EAAE;IACvB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,KAAK,MAAM;IACX,MAAM,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK;AACL;IACA,IAAI,KAAK,CAAC,GAAG,GAAG,OAAO,GAAG,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC;IAC7C,GAAG,CAAC;AACJ;IACA,EAAE,IAAI,CAAC,KAAK,GAAG,WAAW;IAC1B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACzB,GAAG,CAAC;AACJ;IACA,EAAE,IAAI,CAAC,MAAM,GAAG,WAAW;IAC3B,IAAI,IAAI,MAAM,EAAE;IAChB,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,KAAK,CAAC;IACrB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,KAAK;IACL,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;AACJ;IACA,EAAE,IAAI,CAAC,KAAK,GAAG,WAAW;IAC1B,IAAI,IAAI,CAAC,MAAM,EAAE;IACjB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,KAAK;IACL,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;AACJ;IACA,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;IAC/B,EAAE,IAAI,CAAC,KAAK,GAAG,WAAW;IAC1B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,IAAI,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC7B,GAAG,CAAC;IACJ,EAAE,IAAI,CAAC,IAAI,GAAG,WAAW;IACzB,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;IACJ,CACA;IACA,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,KAAK,EAAE;IAC5C;IACA,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,SAAS,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;IACzD,EAAE,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;IACpC,IAAI,OAAO,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,GAAG;IACH,EAAE,IAAI,CAAC,SAAS,GAAG;IACnB,IAAI,KAAK,GAAG,KAAK;IACjB,IAAI,MAAM,GAAG,MAAM;IACnB,IAAI,KAAK,GAAG,KAAK,IAAI,CAAC;IACtB,GAAG,CAAC;IACJ,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,EAAE,IAAI,IAAI,GAAG,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,EAAE,IAAI,CAAC,KAAK,CAAC;IACb,IAAI,KAAK,GAAG,SAAS,IAAI,EAAE;IAC3B,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;IACnC,QAAQ,OAAO,IAAI,CAAC;IACpB,OAAO;IACP,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,KAAK;IACL,GAAG,CAAC,CAAC;IACL,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA;IACA,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;IACvD,EAAE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;IAC/D,IAAI,IAAI,CAAC,QAAQ,GAAG;IACpB,MAAM,KAAK,GAAG,KAAK;IACnB,MAAM,MAAM,GAAG,MAAM;IACrB,MAAM,IAAI,GAAG,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,QAAQ;IACtE,KAAK,CAAC;IACN,GAAG;AACH;IACA,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC1B,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;IAC5B,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE;IACnB,IAAI,IAAI,CAAC,GAAG,CAAC;IACb,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK;IACvB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM;IACzB,KAAK,CAAC,CAAC;IACP,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACpD,GAAG,MAAM,IAAI,IAAI,EAAE;IACnB,IAAI,IAAI,CAAC,GAAG,CAAC;IACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;IACxB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;IAC1B,KAAK,CAAC,CAAC;IACP,GAAG;AACH;IACA,EAAE,OAAO,IAAI,CAAC;IACd,CAAC;;ICvID,OAAc,GAAGE,IAAiB,CAAC;IACnC,UAAqB,GAAGC,MAAmB,CAAC;IAC5C,WAAsB,GAAGC,OAAoB;;;;ACC7CJ,QAAK,CAAC,MAAM,GAAG,SAAS,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE;IAClD,EAAE,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;IAChC,IAAI,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CACnC,MAAM;IACX,MAAM,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE;IAC5C,QAAQ,MAAM,GAAG,UAAU,CAAC;IAC5B,OAAO;IACP,MAAM,UAAU,GAAG,EAAE,CAAC;IACtB,KAAK;IACL,GAAG,MAAM;IACT,IAAI,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK;IACL,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,GAAG;AACH;IACA,EAAE,IAAI,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,EAAE,IAAI,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACpD,EAAE,IAAIK,SAAO,GAAG,IAAIN,OAAO,CAAC,MAAM,CAAC,CAAC;AACpC;IACA,EAAEM,SAAO,CAAC,OAAO,GAAG,WAAW;IAC/B,IAAI,OAAO,OAAO,CAAC;IACnB,GAAG,CAAC;AACJ;IACA,EAAEA,SAAO,CAAC,IAAI,GAAG,SAAS,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;IAChD,IAAI,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC;IACvB,IAAI,MAAM,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IACjC,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IACnC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC5B,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;AACJ;IACA,EAAEA,SAAO,CAAC,MAAM,GAAG,SAAS,EAAE,EAAE;IAChC,IAAI,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE;IAClC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7B,KAAK,MAAM,IAAI,OAAO,EAAE,KAAK,WAAW,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;IAC1E,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK;IACL,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;AACJ;IACA,EAAE,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;IACpC,IAAI,MAAM,CAAC,IAAI,CAACA,SAAO,EAAE,OAAO,CAAC,CAAC;IAClC,GAAG;AACH;IACA,EAAE,OAAOA,SAAO,CAAC;IACjB,CAAC;;IClDD,UAAc,GAAG,SAAS,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;AACxE;IACA,EAAE,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,EAAE,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAC1B,EAAE,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,EAAE,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,EAAE,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,EAAE,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;AAC1B;IACA,EAAE,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;IAC9D,EAAE,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;IACnE,EAAE,GAAG,GAAG,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IACzD,EAAE,MAAM,GAAG,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;AACxE;IACA,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;IAC/B,EAAE,MAAM,GAAG,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC;AACjC;IACA,EAAE,IAAI,CAAC,KAAK,EAAE;IACd,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;IAChD,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;IAClD,GAAG;AACH;IACA,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AACZ;IACA,EAAE,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC;IACzB,IAAI,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAClD,EAAE,IAAI,MAAM,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC;IAC5B,IAAI,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/E,EAAE,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;IAC1B,IAAI,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3E,EAAE,IAAI,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;IAC7B,IAAI,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IACxE,QAAQ,OAAO,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AACtC;IACA,EAAE,IAAI,OAAO,EAAE;IACf,IAAI,IAAI,GAAG,GAAG,CAAC;IACf,MAAM,MAAM,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7D,IAAI,IAAI,MAAM,GAAG,CAAC;IAClB,MAAM,MAAM,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,GAAG;IACxE,UAAU,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,IAAI,IAAI,IAAI,GAAG,CAAC;IAChB,MAAM,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/D,IAAI,IAAI,KAAK,GAAG,CAAC;IACjB,MAAM,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK;IAC7E,UAAU,OAAO,CAAC,CAAC;IACnB;IACA,IAAI,MAAM,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACtE;IACA,GAAG,MAAM;IACT,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC;IAChC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;IAClB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC;IACzC,MAAM,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;IAClC,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE;IACpB,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC;IAC7C,QAAQ,MAAM,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE;IACpB,UAAU,IAAI,IAAI;IAClB,YAAY,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxD,UAAU,IAAI,KAAK;IACnB,YAAY,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACzE,SAAS;IACT,QAAQ,CAAC,IAAI,CAAC,CAAC;IACf,OAAO;IACP,MAAM,IAAI,GAAG;IACb,QAAQ,MAAM,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,IAAI,MAAM;IAChB,QAAQ,MAAM,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACpE,MAAM,CAAC,IAAI,CAAC,CAAC;IACb,KAAK;IACL,GAAG;AACH;IACA,EAAE,OAAO,CAAC,CAAC;IACX,CAAC;;IClED,SAAc,GAAGC,OAAK,CAAC;AACvB;AACAN,QAAK,CAAC,KAAK,GAAG,SAAS,KAAK,EAAE;IAC9B,EAAE,IAAI,GAAG,GAAG,IAAIM,OAAK,EAAE,CAAC;IACxB,EAAE,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,EAAE,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;AACF;AACAA,WAAK,CAAC,MAAM,GAAGN,IAAK,CAAC;AACrBM,WAAK,CAAC,SAAS,GAAG,MAAM,CAACA,OAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACjD;IACA,SAASA,OAAK,GAAG;IACjB,EAAEA,OAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtB,EAAE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CACA;IACA;IACA;IACA;AACAA,WAAK,CAAC,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IAC7C,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC;AACF;AACAA,WAAK,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,KAAK,EAAE;IACxC,EAAE,IAAI,CAAC,MAAM,GAAGN,IAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;IAC3C,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACzD,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3D,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACzC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAM,WAAK,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,KAAK,EAAE;IACvC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7B,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,WAAK,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,KAAK,EAAE;IAC1C,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5B,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,WAAK,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,OAAO,EAAE,KAAK,EAAE;IACnD,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC;IAClB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,WAAW;IAC5C,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;IACrD,MAAM,OAAO;IACb,KAAK;IACL,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;IAC/C,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK;IAC7E,QAAQ,MAAM,CAAC,CAAC;IAChB,GAAG,CAAC,CAAC;AACL;IACA,EAAE,SAAS,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IACrD,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9D,UAAU,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACjD,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,GAAG;IACH,CAAC;;AChEDN,QAAK,CAAC,IAAI,GAAG,SAAS,MAAM,EAAE,GAAG,EAAE;IACnC,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;IACxB,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACnC,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA,IAAI,CAAC,MAAM,GAAGA,IAAK,CAAC;IACpB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC/C;IACA;AACAA,QAAK,CAAC,IAAI,GAAG;IACb,EAAE,GAAG,GAAG,EAAE;IACV,CAAC,CAAC;AACF;IACA,SAAS,IAAI,GAAG;IAChB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACrB;IACA,EAAE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACtB;IACA,EAAE,IAAI,CAAC,IAAI,GAAGA,IAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IAC7B,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;AAC9B;IACA,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAClB,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;AACnB;IACA,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,EAAE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;AACpB;IACA,EAAE,IAAI,QAAQ,GAAG,CAAC,CAAC;IACnB,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE;IACnC,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE;IACpD,MAAM,OAAO;IACb,KAAK;AACL;IACA;IACA,IAAI,IAAI,MAAM,GAAG,QAAQ,IAAI,IAAI,CAAC;IAClC,IAAI,QAAQ,GAAG,GAAG,CAAC;IACnB,IAAI,IAAI,MAAM,EAAE;IAChB,MAAM,OAAO,IAAI,CAAC;IAClB,KAAK;AACL;IACA,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IACpB,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;IAC/B,MAAM,OAAO,IAAI,CAAC;IAClB,KAAK;IACL,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;IAC/B,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE;IACtD,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAClB,MAAM,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;IACzC,MAAM,OAAO,KAAK,CAAC;IACnB,KAAK;IACL,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,EAAE,KAAK,CAAC,CAAC;IACZ,CACA;IACA,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,SAAS,GAAG,EAAE;IACnC,EAAE,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;IAClC,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,GAAG;IACH,EAAE,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAGA,IAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IAC7C,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IAC9B,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA;IACA;IACA;IACA,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IAC7C,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC;AACF;IACA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE;IACzC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,EAAE,IAAI,CAAC,OAAO,GAAGA,IAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAC/C,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,WAAW;IACnC,EAAE,OAAO,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAChD,CAAC,CAAC;AACF;IACA,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,KAAK,EAAE,MAAM,EAAE;IACnD,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5D,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACxC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,EAAE,IAAI,MAAM,EAAE;IACd,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACjD,GAAG;IACH,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,IAAI,EAAE;IAC1C,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC;AACF;IACA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE,QAAQ,EAAE;IACnD,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAClD,EAAE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,KAAK,EAAE;IACtC,EAAE,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;IACpC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACnB,GAAG,MAAM,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE;IAC7B,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACnB,GAAG;AACH;IACA,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,KAAK,EAAE;IACtC,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAClB,EAAE,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;IACpC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1B,GAAG;IACH,EAAE,OAAO,IAAI,CAAC;IACd,CAAC;;AC/HDA,QAAK,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE;IAChC,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC,CAAC;AACF;IACA,GAAG,CAAC,MAAM,GAAGA,IAAK,CAAC;IACnB,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7C;IACA,SAAS,GAAG,GAAG;IACf,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvB,EAAE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CACA;IACA;IACA;IACA;IACA,GAAG,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IAC1C,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC;AACF;IACA,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE;IACxC,EAAE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,EAAE,IAAI,OAAO,MAAM,IAAI,QAAQ,EAAE;IACjC,IAAI,MAAM,GAAGA,IAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,KAAK,GAAG,SAAS,KAAK,EAAE;IACjC,MAAM,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,KAAK,CAAC;IACN,GAAG,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;IACzC,IAAI,IAAI,CAAC,KAAK,GAAG,SAAS,KAAK,EAAE;IACjC,MAAM,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,KAAK,CAAC;IACN,GAAG,MAAM,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;IAC3C,IAAI,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;IACxB,GAAG;IACH,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA;IACA;IACA;IACA,GAAG,CAAC,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IAC3C,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC;AACF;IACA,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,KAAK,EAAE;IACtC,EAAE,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;IACpC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,GAAG;IACH,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE;IAC7B,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG;IACH,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;AACtB;IACA,EAAE,IAAI,KAAK,KAAK,IAAI,EAAE;IACtB,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,GAAG,MAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAACH,IAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IAC5D,IAAI,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC7B,GAAG;AACH;IACA,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;AACrC;IACA,EAAE,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;IAC5B,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACzC,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACzB,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAChC,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,GAAG;IACH,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3B,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7B,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IACvC,EAAE,OAAO,IAAI,CAAC;IACd,CAAC;;AC1EDG,QAAK,CAAC,GAAG,GAAG,SAAS,KAAK,EAAE;IAC5B,EAAE,OAAOA,IAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,GAAG,GAAG,SAAS,KAAK,EAAE;IACtC,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9B,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,MAAM,GAAG,SAAS,KAAK,EAAE;IAC/B,EAAE,OAAOA,IAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,KAAK,EAAE;IACzC,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACjC,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,QAAQ,GAAG,SAAS,IAAI,EAAE,KAAK,EAAE;IACvC,EAAE,OAAOA,IAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAChE,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,QAAQ,GAAG,SAAS,IAAI,EAAE,KAAK,EAAE;AACjD;IACA,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;IACrC,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;AACrC;IACA,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,WAAW;IAC3C,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE;IACxC,MAAM,OAAO;IACb,KAAK;IACL,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;AAClC;IACA,IAAI,IAAI,aAAa,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;IACjE,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;AAC1C;IACA,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;AAC9B;IACA,IAAI,IAAI,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC;IACrB,IAAI,OAAO,KAAK,GAAG,IAAI,EAAE;IACzB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9B;IACA,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACrC;IACA,MAAM,IAAI,IAAI,IAAI,QAAQ,EAAE;IAC5B,QAAQ,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,QAAQ,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACvE,QAAQ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACnC,QAAQ,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;IAC5B,QAAQ,aAAa,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACpD;IACA,OAAO,MAAM,IAAI,IAAI,IAAI,KAAK,EAAE;IAChC,QAAQ,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,QAAQ,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACrE,QAAQ,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;IAC1B,QAAQ,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACrC,QAAQ,aAAa,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO;IACP,MAAM,KAAK,GAAG,KAAK,CAAC;IACpB,KAAK;IACL,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,IAAI,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;IAChC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3D,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/D,GAAG,CAAC,CAAC;IACL,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,GAAG,GAAG,WAAW;IACvB,EAAE,OAAOA,IAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,GAAG,GAAG,WAAW;IACjC,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;AACrC;IACA,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,WAAW;IAC3C,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE;IACxC,MAAM,OAAO;IACb,KAAK;IACL,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;AAClC;IACA,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;IAC9B,IAAI,IAAI,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,OAAO,KAAK,GAAG,IAAI,EAAE;IACzB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnC,KAAK;IACL,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,IAAI,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;IAChC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3D,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/D,GAAG,CAAC,CAAC;IACL,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,KAAK,GAAG,WAAW;IACzB,EAAE,OAAOA,IAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,KAAK,GAAG,WAAW;AACnC;IACA,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,WAAW;IAC3C,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC/B,IAAI,IAAI,MAAM,EAAE;IAChB,MAAM,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,EAAE;IACtC,QAAQ,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACjC,OAAO;IACP,MAAM,IAAI,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE;IACxC,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACnC,OAAO;IACP,KAAK;IACL,GAAG,EAAE,IAAI,CAAC,CAAC;IACX,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA;AACAA,QAAK,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,GAAG,EAAE;IACxC,EAAE,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;IACtB,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;AACAA,QAAK,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,KAAK,EAAE;IAC1C,EAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,EAAE,OAAO,IAAI,CAAC;IACd,CAAC;;IC9ID,SAAS,SAAS,CAAC,CAAC,EAAE;IACtB,EAAE,OAAO,CAAC,CAAC;IACX,CACA,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,QAAQ,GAAG,EAAE,CAAC;AAClB;IACA,SAAS,MAAM,CAAC,KAAK,EAAE;IACvB,EAAE,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;IACnC,IAAI,OAAO,KAAK,CAAC;IACjB,GAAG;IACH,EAAE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;IACjC,IAAI,OAAO,SAAS,CAAC;IACrB,GAAG;IACH,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,EAAE,IAAI,EAAE,EAAE;IACV,IAAI,OAAO,EAAE,CAAC;IACd,GAAG;IACH,EAAE,IAAI,KAAK,GAAG,+CAA+C,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1E,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;IAC/B,IAAI,OAAO,SAAS,CAAC;IACrB,GAAG;IACH,EAAE,IAAI,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,EAAE,IAAI,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,EAAE,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,EAAE,IAAI,MAAM,IAAI,MAAM,CAAC,EAAE,EAAE;IAC3B,IAAI,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;IACnB,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,EAAE,EAAE;IAClC,IAAI,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM;IAC1C,WAAW,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,GAAG,MAAM;IACT,IAAI,EAAE,GAAG,SAAS,CAAC;IACnB,GAAG;IACH,EAAE,IAAI,IAAI,EAAE;IACZ,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACrB,GAAG;IACH;IACA,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACrB,EAAE,OAAO,EAAE,CAAC;IACZ,CACA;IACA,MAAM,CAAC,GAAG,GAAG,SAAS,IAAI,EAAE;IAC5B;IACA,EAAE,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACpD,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACzC,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,IAAI,IAAI,EAAE;IACd,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,GAAG,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;IACnD,KAAK;IACL,GAAG;IACH,CAAC,CAAC;AACF;IACA,MAAM,CAAC,GAAG,CAAC;IACX,EAAE,IAAI,GAAG,IAAI;IACb,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE;IACnB,IAAI,OAAO,CAAC,CAAC;IACb,GAAG;IACH,CAAC,CAAC,CAAC;AACH;IACA,MAAM,CAAC,GAAG,CAAC;IACX,EAAE,IAAI,GAAG,KAAK;IACd,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE;IACnB,IAAI,OAAO,SAAS,CAAC,EAAE;IACvB,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,KAAK,CAAC;IACN,GAAG;IACH,CAAC,CAAC,CAAC;AACH;IACA,MAAM,CAAC,GAAG,CAAC;IACX,EAAE,IAAI,GAAG,QAAQ;IACjB,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE;IACnB,IAAI,OAAO,SAAS,CAAC,EAAE;IACvB,MAAM,OAAO,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACnE,KAAK,CAAC;IACN,GAAG;IACH,CAAC,CAAC,CAAC;AACH;IACA,MAAM,CAAC,GAAG,CAAC;IACX,EAAE,IAAI,GAAG,QAAQ;IACjB,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE;IACnB,IAAI,OAAO,SAAS,CAAC,EAAE;IACvB,MAAM,OAAO,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACnE,KAAK,CAAC;IACN,GAAG;IACH,CAAC,CAAC,CAAC;AACH;IACA,MAAM,CAAC,GAAG,CAAC;IACX,EAAE,IAAI,GAAG,QAAQ;IACjB,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE;IACnB,IAAI,OAAO,CAAC,CAAC;IACb,GAAG;IACH,CAAC,CAAC,CAAC;AACH;IACA,MAAM,CAAC,GAAG,CAAC;IACX,EAAE,IAAI,GAAG,MAAM;IACf,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IACjB,GAAG;IACH,CAAC,CAAC,CAAC;AACH;IACA,MAAM,CAAC,GAAG,CAAC;IACX,EAAE,IAAI,GAAG,OAAO;IAChB,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,GAAG;IACH,CAAC,CAAC,CAAC;AACH;IACA,MAAM,CAAC,GAAG,CAAC;IACX,EAAE,IAAI,GAAG,OAAO;IAChB,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,GAAG;IACH,CAAC,CAAC,CAAC;AACH;IACA,MAAM,CAAC,GAAG,CAAC;IACX,EAAE,IAAI,GAAG,OAAO;IAChB,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,GAAG;IACH,CAAC,CAAC,CAAC;AACH;IACA,MAAM,CAAC,GAAG,CAAC;IACX,EAAE,IAAI,GAAG,UAAU;IACnB,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE;IACnB,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACzC,GAAG;IACH,CAAC,CAAC,CAAC;AACH;IACA,MAAM,CAAC,GAAG,CAAC;IACX,EAAE,IAAI,GAAG,UAAU;IACnB,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE;IACnB,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClD,GAAG;IACH,CAAC,CAAC,CAAC;AACH;IACA,MAAM,CAAC,GAAG,CAAC;IACX,EAAE,IAAI,GAAG,aAAa;IACtB,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE;IACnB,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,GAAG;IACH,CAAC,CAAC,CAAC;AACH;IACA,MAAM,CAAC,GAAG,CAAC;IACX,EAAE,IAAI,GAAG,QAAQ;IACjB,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,MAAM;IAChE,WAAW,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,MAAM;IAC/D,WAAW,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC;IAC3E,UAAU,OAAO,CAAC;IAClB,GAAG;IACH,CAAC,CAAC,CAAC;AACH;IACA,MAAM,CAAC,GAAG,CAAC;IACX,EAAE,IAAI,GAAG,MAAM;IACf,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE;IACnB,IAAI,OAAO,SAAS,CAAC,EAAE;IACvB,MAAM,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,KAAK,CAAC;IACN,GAAG;IACH,CAAC,CAAC,CAAC;AACH;IACA,MAAM,CAAC,GAAG,CAAC;IACX,EAAE,IAAI,GAAG,SAAS;IAClB,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE;IACtB,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IAClB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACf,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,IAAI,OAAO,SAAS,CAAC,EAAE;IACvB,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACzC,YAAY,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,KAAK,CAAC;IACN,GAAG;IACH,CAAC,CAAC,CAAC;AACH;IACA,MAAM,CAAC,GAAG,CAAC;IACX,EAAE,IAAI,GAAG,MAAM;IACf,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE;IACnB,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC;IAC/C,IAAI,OAAO,SAAS,CAAC,EAAE;IACvB,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,KAAK,CAAC;IACN,GAAG;IACH,CAAC,CAAC,CAAC;AACH;IACA,UAAc,GAAG,MAAM;;ACpLvBA,QAAK,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;IAC1D,EAAE,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;IACpC,IAAI,MAAM,GAAG,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC;IAC/C,GAAG,MAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;IACxC,IAAI,MAAM,GAAG,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC;IAC9B,GAAG;AACH;IACA,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;IACrB,IAAI,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACtB,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;IACrB,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE;IAC3C,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;IAChC,QAAQ,OAAO;IACf,OAAO;AACP;IACA;IACA,MAAM,IAAI,MAAM,GAAG,QAAQ,IAAI,IAAI,CAAC;IACpC,MAAM,QAAQ,GAAG,GAAG,CAAC;IACrB,MAAM,IAAI,MAAM,EAAE;IAClB,QAAQ,OAAO,IAAI,CAAC;IACpB,OAAO;AACP;IACA,MAAM,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACjC;IACA,MAAM,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AACrD;IACA,MAAM,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;IAC5C,QAAQ,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC7B,OAAO;AACP;IACA,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;IAC/B,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IAC9C,UAAU,IAAI;IACd,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,CAAC,OAAO,CAAC,EAAE;IACtB,YAAY,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3B,WAAW;IACX,SAAS;IACT,OAAO,MAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;IAC3C,QAAQ,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO;AACP;IACA,MAAM,OAAO,IAAI,CAAC;IAClB,KAAK,EAAE,IAAI,CAAC,CAAC;IACb,GAAG;AACH;IACA,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,EAAE,IAAI,CAAC,MAAM,EAAE;IACf,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,GAAG;IACH,EAAE,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/C,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,EAAE,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACF;IACA,SAAS,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;IACvC,EAAE,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;IACjB,EAAE,IAAI,CAAC,SAAS,GAAG,QAAQ,IAAI,GAAG,CAAC;IACnC,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC;AAC3B;IACA,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACjB,CACA;IACA,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE;IAC1D,EAAE,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC;AACxB;IACA,EAAE,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;IAChC,IAAI,OAAO;IACX,GAAG;AACH;IACA,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;AACtC;IACA,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;IACpB,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACrB,IAAI,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE;IAChC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9C,KAAK;IACL,GAAG;AACH;IACA,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;IACd,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;IAC7B,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;IAC9B,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,GAAG,MAAM;IACT,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,GAAG;AACH;IACA,EAAE,IAAI,OAAO,IAAI,CAAC,OAAO,IAAI,UAAU,EAAE;IACzC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,GAAG;AACH;IACA,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAChB;IACA,EAAE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE;IAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,GAAG;AACH;IACA,EAAE,IAAI,IAAI,EAAE;IACZ,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD,IAAI,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,OAAO,GAAG;IACjD,MAAM,OAAO,OAAO,OAAO,KAAK,UAAU,CAAC;IAC3C,KAAK,CAAC,CAAC;IACP,IAAI,OAAO,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC;IACjC,GAAG;IACH,CAAC,CAAC;AACF;IACA,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,QAAQ,EAAE,KAAK,EAAE;IAClD,EAAE,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC,CAAC;AACF;IACA,KAAK,CAAC,SAAS,CAAC,QAAQ,GAAG,SAAS,QAAQ,EAAE;IAC9C,EAAE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,KAAK,EAAE;IACxC,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,SAASO,QAAM,EAAE;IACxC,EAAE,IAAI,CAAC,OAAO,GAAGC,MAAM,CAACD,QAAM,CAAC,CAAC;IAChC,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,EAAE,EAAE;IACpC,EAAE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,WAAW;IAClC,EAAE,IAAI,CAAC,KAAK,GAAG,WAAW;IAC1B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAChB,GAAG,CAAC;IACJ,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,WAAW;IACpC,EAAE,IAAI,CAAC,OAAO,GAAG,WAAW;IAC5B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,GAAG,CAAC;IACJ,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA,KAAK,CAAC,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE;IACrC,EAAE,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;IAC7B,IAAI,MAAM,IAAI,IAAI,IAAI,CAAC,EAAE;IACzB,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,KAAK;IACL,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;IACvC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,GAAG;IACH,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA,SAAS,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE;IACxC,EAAE,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE;IACzC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACrB,GAAG,MAAM,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,QAAQ;IACpD,SAAS,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,QAAQ,EAAE;IAClD,IAAI,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;IAC3B,IAAI,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;IAC3B,GAAG;IACH,CAAC;AACD;AACAE,OAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAC1B;IACA;IACA;IACA;IACA,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,EAAE,EAAE;IACpC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,EAAE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACF;IACA;IACA;IACA;IACA,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,OAAO,EAAE;IAC1C,EAAE,OAAO,IAAI,CAAC;IACd,CAAC;;ACvLDP,QAAkB,CAAC,KAAK,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE;IAC/C,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACH;IACA;AACA;IACA,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC;IACtB,KAAK,CAAC,KAAK,GAAG,sBAAsB,CAAC;IACrC,KAAK,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACnC,KAAK,CAAC,GAAG,GAAG,kBAAkB,CAAC;IAC/B,KAAK,CAAC,MAAM,GAAG,yBAAyB,CAAC;AACzC;IACA,KAAK,CAAC,SAAS,GAAG,SAAS,KAAK,EAAE,IAAI,EAAE;IACxC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;IACnB,IAAI,OAAO;IACX,GAAG;AACH;IACA,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACvC;IACA;IACA;AACA;IACA,EAAE,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACnD,EAAE,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC/C,EAAE,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACjD,EAAE,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;AACrD;IACA,EAAE,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAClD,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC9C,EAAE,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AACjD;IACA,EAAE,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACrD,EAAE,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAChD;IACA,EAAE,IAAI,SAAS,GAAG,EAAE,EAAE,UAAU,GAAG,EAAE,CAAC;AACtC;IACA,EAAE,SAAS,WAAW,CAAC,KAAK,EAAE;IAC9B,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;IAC3B,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B;IACA,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3C;IACA,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAClD,GAAG;AACH;IACA,EAAE,SAAS,UAAU,CAAC,KAAK,EAAE;IAC7B,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;IAC3B,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3C,GAAG;AACH;IACA,EAAE,SAAS,SAAS,CAAC,KAAK,EAAE;IAC5B,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;IAC3B;IACA;IACA,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3C;IACA,IAAI,IAAI,SAAS,CAAC,MAAM,EAAE;IAC1B;IACA,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACrD,KAAK;IACL,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,GAAG;AACH;IACA,EAAE,SAAS,YAAY,CAAC,KAAK,EAAE;IAC/B,IAAI,IAAI,UAAU,CAAC,MAAM,EAAE;IAC3B;IACA,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAC5D,KAAK;IACL,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACzB,GAAG;IACH,CAAC,CAAC;AACF;IACA,SAAS,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;IAC5B,EAAE,IAAI,EAAE,IAAI,YAAY,KAAK,CAAC,EAAE;IAChC;IACA,IAAI,OAAO;IACX,GAAG;AACH;IACA,EAAE,IAAI,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC;AAC1C;IACA,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,SAAS,IAAI,EAAE;IACtC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;IAChC,GAAG,CAAC,CAAC;AACL;IACA,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,EAAE,IAAI,CAAC,QAAQ,GAAG,WAAW;IAC7B,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,GAAG,CAAC;IACJ,EAAE,IAAI,CAAC,MAAM,GAAG,SAAS,KAAK,EAAE;IAChC,IAAI,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;IACpB,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;IACpB,GAAG,CAAC;IACJ,EAAE,IAAI,CAAC,MAAM,GAAG,SAAS,IAAI,EAAE,OAAO,EAAE;IACxC,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;IACtB,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACvB,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;AAC3B;IACA,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxC,GAAG,CAAC;IACJ,EAAE,IAAI,CAAC,OAAO,GAAG,SAAS,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;IAChD,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;IACtB,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,IAAI,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACzB,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAKhC;IACA,IAAI,IAAI,OAAO,EAAE;IACjB,MAAM,OAAO,OAAO,CAAC,MAAM;IAC3B,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC;IACnD,UAAU,MAAM;IAChB,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACzB,KAAK,MAAM;IACX,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1C,KAAK;IACL,GAAG,CAAC;IACJ,EAAE,IAAI,CAAC,OAAO,GAAG;IACjB,IAAI,OAAO,GAAG,IAAI;IAClB,IAAI,OAAO,GAAG,IAAI;IAClB,IAAI,KAAK,GAAG,SAAS,IAAI,EAAE,KAAK,EAAE;IAClC,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,KAAK;IACL,IAAI,GAAG,GAAG,SAAS,IAAI,EAAE,KAAK,EAAE;IAChC;IACA,MAAM,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;IAC5B,MAAM,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IAC5B,MAAM,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IACtC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAC1B,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AAC1B;IACA,MAAM,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,IAAI,CAAC,SAAS,EAAE;IACtB,QAAQ,OAAO;IACf,OAAO;IACP,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9C,MAAM,IAAI,EAAE,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE;IAC3E,QAAQ,OAAO;IACf,OAAO;IACP,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE;IACzB,QAAQ,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO;IACP,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;IACvB,QAAQ,IAAI,MAAM,GAAG,KAAK,CAAC;IAC3B,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACnD,UAAU,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC;IAChE,SAAS;IACT,QAAQ,OAAO,MAAM,CAAC;IACtB,OAAO;IACP,KAAK;IACL,GAAG,CAAC;IACJ,CACA;IACA;IACA,IAAI,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC;AACvB;IACA,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,GAAG,EAAE;IACxC,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAClD,EAAE,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IACH,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW;IACxC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACnE,CAAC,CAAC,CAAC;IACH,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7B,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,GAAG,EAAE;IACxC,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAClD,EAAE,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IACH,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW;IACxC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACH;IACA,SAAS,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;IACvC,EAAE,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE;IACnC,IAAI,KAAK,GAAG,KAAK;IACjB,GAAG,CAAC,CAAC;IACL,CAAC;AACD;IACA,SAAS,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;IACpC;IACA,EAAE,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE;IACvC,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAClC,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAClC,GAAG,MAAM;IACT,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;IACvB,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;IACvB,GAAG;IACH,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;IACxC,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;IACrB,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC;IACpB,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,GAAG,CAAC,CAAC;IAC7B,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC;IAC5B,EAAE,OAAO,GAAG,CAAC;IACb,CACA;IACA,SAAc,GAAG,KAAK;;;;;ACxMtB;AAC+B;AAC/B;AACAF,QAAK,CAAC,UAAU,GAAG,CAAC,WAAW;IAC/B,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC9C,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC;IACnE,CAAC,GAAG,CAAC;AACL;IACA,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW;IAE3C,EAAE,IAAIA,IAAK,CAAC,UAAU,EAAE;IACxB,IAAIA,IAAK,CAAC,KAAK,EAAE,CAAC;IAClB,GAAG;IACH;IACA,CAAC,EAAE,KAAK,CAAC,CAAC;AACV;AACAA,QAAK,CAAC,MAAM,CAAC;IACb,EAAE,YAAY,GAAG,SAAS;IAC1B,EAAE,cAAc,GAAG,WAAW;IAC9B,CAAC,CAAC,CAAC;AACH;IACA,SAAS,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE;IACjC,EAAE,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IAC1B,EAAE,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC;IAC5D,EAAE,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;AACvC;IACA,EAAE,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;IAClC,IAAI,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC7C,GAAG;AACH;IACA,EAAE,IAAI,CAAC,MAAM,EAAE;IACf,IAAI,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC;IAC7C,WAAW,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5C,GAAG;AACH;IACA,EAAE,IAAI,CAAC,MAAM,EAAE;IACf,IAAI,IAAI,GAAG,IAAI,CAAC;IAEhB,IAAI,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;IACvC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;IAC3B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC;AAC5B;IACA,IAAI,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC7B,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/C,GAAG;AACH;IACA,EAAE,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACpC;IACA,EAAE,IAAI,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC;IACtD,EAAE,IAAI,iBAAiB,GAAG,OAAO,CAAC,4BAA4B;IAC9D,SAAS,OAAO,CAAC,yBAAyB,IAAI,OAAO,CAAC,wBAAwB;IAC9E,SAAS,OAAO,CAAC,uBAAuB,IAAI,OAAO,CAAC,sBAAsB,IAAI,CAAC,CAAC;IAChF,EAAE,KAAK,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAC/C;IACA,EAAE,IAAI,qBAAqB,GAAG,MAAM,CAAC,qBAAqB;IAC1D,SAAS,MAAM,CAAC,uBAAuB,IAAI,MAAM,CAAC,wBAAwB;IAC1E,SAAS,MAAM,CAAC,2BAA2B,IAAI,MAAM,CAAC,sBAAsB;IAC5E,SAAS,SAAS,QAAQ,EAAE;IAC5B,QAAQ,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC;IAGR,EAAE,IAAI,IAAI,GAAGA,IAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACvD;IACA,EAAE,SAAS,MAAM,GAAG;IACpB,IAAI,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE;IACjC,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,KAAK;IACL,GAAG;AACH;IACA,EAAE,IAAI,CAAC,UAAU,GAAG,SAAS,KAAK,EAAE;IACpC,IAAI,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC;IACzC,IAAI,OAAO,IAAI,CAAC;IAChB,GAAG,CAAC;AACJ;IACA,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACpB;IACA;IACA;IACA;AACA;IACA,EAAE,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;IACrB,EAAE,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;IACtB,EAAE,CAAC,SAAS,UAAU,GAAG;IACzB,IAAI,IAAI,KAAK,EAAE,MAAM,CAAC;IACtB,IAAI,IAAI,IAAI,EAAE;IACd;IACA,MAAM,KAAK,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,MAAM,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7E,KAAK,MAAM;IACX,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC;IACnC,KAAK;IACL,IAAI,IAAI,SAAS,KAAK,KAAK,IAAI,UAAU,KAAK,MAAM,EAAE;IACtD,MAAM,SAAS,GAAG,KAAK,CAAC;IACxB,MAAM,UAAU,GAAG,MAAM,CAAC;IAC1B,MAAM,MAAM,EAAE,CAAC;IACf,KAAK;IACL,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACtC,GAAG,GAAG,CAAC;AACP;IACA,EAAE,SAAS,MAAM,GAAG;AACpB;IACA,IAAI,IAAI,IAAI,EAAE;IACd;IACA,MAAM,KAAK,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,MAAM,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAC7E;IACA,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;IACxC,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAC1C;IACA,KAAK,MAAM;IACX,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC;IACnC,KAAK;AACL;IACA,IAAI,KAAK,IAAI,KAAK,CAAC;IACnB,IAAI,MAAM,IAAI,KAAK,CAAC;AACpB;IACA,IAAI,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE;IAC5D,MAAM,OAAO;IACb,KAAK;AACL;IACA,IAAI,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACzB,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;AAG3B;IACA,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACxC;IACA,IAAI,MAAM,EAAE,CAAC;IACb,GAAG;IACH,CAAC;AACD;IACA,SAAS,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;IAE1C,EAAE,IAAI,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAC1B,EAAE,KAAK,CAAC,MAAM,GAAG,WAAW;IAC5B,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;IACnB,GAAG,CAAC;IACJ,EAAE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;IACxB,EAAE,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;IAClB;;;ICvJA,iBAAiBE,GAAkB,CAAC;AACpC;IACA,0BAA0B,EAAE,CAAC;AAC7B;AACyB;IACzB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,GAAGC,KAAuB,CAAC;AACjC;AACD;AACG;AACK;IAC9B,uBAAuBC,KAA6B,CAAC;IACrD,sBAAsBM,IAA2B,CAAC;IAClD,yBAAyBC,MAA6B,CAAC;IACvD,yBAAyBC,MAA6B;;;aCoGtC,OAAO,CAAC,IAAI,EAAE,QAAS;QACrC,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;YAC9B,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,GAAG,IAAI,CAAC;SACb;QAEDC,GAAK,CAAC,UAAS,KAAK,EAAE,MAAM;YAE1B,KAAK,CAAC,EAAE,CAACA,GAAK,CAAC,KAAK,CAAC,KAAK,EAAE;gBAC1B,MAAM,CAAC,KAAK,EAAE,CAAC;;gBAEf,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;gBACxD,MAAM,CAAC,KAAK,EAAE,CAAC;aAChB,CAAC,CAAC;YAEH,KAAK,CAAC,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;;YAG7B,IAAM,OAAO,GAAY,EAAE,CAAC;YAC5B,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;YAExB,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE;gBACjB,MAAM,GAAG,KAAK,CAAC;gBACf,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;aACtC,CAAC,CAAC;YACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE;gBAChB,MAAM,GAAG,IAAI,CAAC;gBACd,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;aACpC,CAAC,CAAC;YACH,OAAO,CAAC,QAAQ,GAAG;gBACjB,OAAO,MAAM,CAAC;aACf,CAAC;YACF,OAAO,CAAC,WAAW,GAAG;gBACpB,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;aAC7C,CAAC;YACF,OAAO,CAAC,KAAK,GAAG;gBACd,KAAK,CAAC,KAAK,EAAE,CAAC;aACf,CAAC;YACF,OAAO,CAAC,MAAM,GAAG;gBACf,KAAK,CAAC,MAAM,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,EAAE,CAAC;aACjB,CAAC;YACF,OAAO,CAAC,KAAK,GAAG;;gBAEd,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;gBACxD,MAAM,CAAC,KAAK,EAAE,CAAC;aAChB,CAAC;YAEF,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;YACnB,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpB,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;YACnB,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;YAClB,OAAO,CAAC,UAAU,GAAG,EAAE,CAAC;YACxB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;YAE/B,OAAO,CAAC,OAAO,GAAG;;gBAEhB,OAAO,IAAI,CAAC;aACb,CAAC;YAEF,OAAO,CAAC,OAAO,GAAG;;gBAEhB,OAAO,EAAE,CAAC;aACX,CAAC;YAEF,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,IAAM,SAAS,GAAG,EAAE,CAAC;YAErB,SAAS,SAAS,CAAC,IAAI,EAAE,KAAK;gBAC5B,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;oBAC5D,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;iBACzB;aACF;YAED,SAAS,WAAW,CAAC,GAAG;;gBAEtB,KAAK,IAAM,GAAG,IAAI,GAAG,EAAE;oBACrB,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;iBAC1B;aACF;YAED,OAAO,CAAC,MAAM,GAAG,UAAS,CAAC,EAAE,CAAE;gBAC7B,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;oBAC5B,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;iBACjB;qBAAM,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;oBACrC,WAAW,CAAC,CAAC,CAAC,CAAC;iBAChB;qBAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;oBAChC,UAAU,GAAG,CAAC,CAAC;iBAChB;gBAED,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;aAC3D,CAAC;YAEF,OAAO,CAAC,IAAI,GAAG,UAAS,IAAI;gBAC1B,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;aACtC,CAAC;YAEF,IAAI,YAAY,GAAG,EAAE,CAAC;YACtB,IAAI,QAAQ,GAAG,EAAE,CAAC;YAElB,CAAC;gBACC,IAAM,cAAc,GAAG,IAAIA,GAAK,CAAC,OAAO,EAAE,CAAC;gBAC3C,KAAK,CAAC,MAAM,CAACA,GAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;gBAE1C,IAAM,MAAM,GAAG,EAAE,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC;oBACT,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;iBACnB,EAAE,IAAI,CAAC,CAAC;gBAET,cAAc,CAAC,IAAI,GAAG,UAAS,GAAG;oBAChC,GAAG,CAAC,IAAI,EAAE,CAAC;oBACX,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC/D,GAAG,CAAC,SAAS,GAAG,CAAC,GAAI,OAAO,CAAC,KAAK,CAAC;oBACnC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;oBACtB,KAAK,IAAI,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,EAAE;wBACpE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;qBAC7B;oBACD,GAAG,CAAC,OAAO,EAAE,CAAC;iBACf,CAAC;gBAEF,OAAO,CAAC,SAAS,GAAG,UAAS,CAAC,EAAE,CAAC,EAAE,KAAK;oBACtC,MAAM,CAAC,IAAI,CAAC,UAAS,GAAG,EAAE,KAAK;wBAC7B,GAAG,CAAC,SAAS,EAAE,CAAC;wBAChB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAI,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;wBAC9C,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC;wBACxB,GAAG,CAAC,MAAM,EAAE,CAAC;qBACd,CAAC,CAAC;oBACH,QAAQ,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC;iBAC/D,CAAC;gBAEF,OAAO,CAAC,UAAU,GAAG,UAAS,CAAC,EAAE,CAAC,EAAE,KAAK;oBACvC,MAAM,CAAC,IAAI,CAAC,UAAS,GAAG;wBACtB,GAAG,CAAC,SAAS,EAAE,CAAC;wBAChB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;wBACrC,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC;wBACxB,GAAG,CAAC,MAAM,EAAE,CAAC;qBACd,CAAC,CAAC;oBACH,QAAQ,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC;iBAChE,CAAC;gBAEF,OAAO,CAAC,WAAW,GAAG,UAAS,CAAC,EAAE,CAAC,EAAE,KAAK;oBACxC,MAAM,CAAC,IAAI,CAAC,UAAS,GAAG;wBACtB,GAAG,CAAC,SAAS,EAAE,CAAC;wBAChB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;wBACrB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;wBACrB,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC;wBACxB,GAAG,CAAC,MAAM,EAAE,CAAC;qBACd,CAAC,CAAC;oBACH,QAAQ,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC;iBAC/E,CAAC;gBAEF,OAAO,CAAC,WAAW,GAAG,UAAS,MAAM,EAAE,KAAK;oBAC1C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;wBAC7B,OAAO;qBACR;oBACD,MAAM,CAAC,IAAI,CAAC,UAAS,GAAG;wBACtB,GAAG,CAAC,SAAS,EAAE,CAAC;wBAChB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;4BACtC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;yBACtC;wBACD,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC;wBACxB,GAAG,CAAC,SAAS,EAAE,CAAC;wBAChB,GAAG,CAAC,MAAM,EAAE,CAAC;qBACd,CAAC,CAAC;oBACH,QAAQ,IAAI,SAAS,CAAC;oBACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;wBACtC,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;qBACnD;oBACD,QAAQ,IAAI,KAAK,CAAC;iBACnB,CAAC;gBAEF,OAAO,CAAC,QAAQ,GAAG,UAAS,IAAI,EAAE,KAAK;oBACrC,MAAM,CAAC,IAAI,CAAC,UAAS,GAAG;wBACtB,GAAG,CAAC,SAAS,EAAE,CAAC;wBAChB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;wBACjD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;wBACjD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;wBACjD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;wBACjD,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC;wBACxB,GAAG,CAAC,SAAS,EAAE,CAAC;wBAChB,GAAG,CAAC,MAAM,EAAE,CAAC;qBACd,CAAC,CAAC;oBACH,QAAQ,IAAI,MAAM,CAAC;oBACnB,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC;oBAC9D,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC;oBAC9D,QAAQ,IAAI,KAAK,CAAC;iBACnB,CAAC;gBAEF,OAAO,CAAC,KAAK,GAAG,UAAS,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC9B,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;oBAChB,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;oBAChB,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;oBAChB,OAAO,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC;iBAC/C,CAAC;aAEH,GAAG,CAAC;YAEL,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEhC,IAAM,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAE1C,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,UAAS,EAAE,EAAE,CAAC;;gBAEvB,IAAI,KAAK,KAAK,OAAO,CAAC,CAAC,IAAI,KAAK,KAAK,OAAO,CAAC,CAAC,EAAE;oBAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBACtC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;oBAClB,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;iBACnB;aACF,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,UAAS,EAAE,EAAE,CAAC;;gBAExB,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE;oBACtC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;iBACrB;gBAED,IAAI,UAAU,EAAE;oBACd,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,uBAAuB,CAAC,CAAC;iBACnF;gBAED,IAAI,YAAY,KAAK,QAAQ,EAAE;oBAC7B,YAAY,GAAG,QAAQ,CAAC;oBACxB,KAAK,CAAC,KAAK,EAAE,CAAC;iBACf;gBACD,QAAQ,GAAG,EAAE,CAAC;gBAEd,OAAO,IAAI,CAAC;aACb,CAAC,CAAC;;YAGH,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACrC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAC7C,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;YAC1B,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;YAC1B,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEtB,SAAS,QAAQ,CAAC,KAAK;gBACrB,IAAI,IAAI,CAAC;gBACT,IAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACpC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,UAAS,OAAO;oBACpC,IAAI,IAAI,EAAE;wBACR,OAAO;qBACR;oBACD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;wBAC/D,OAAO;qBACR;oBACD,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;oBACzB,OAAO,IAAI,CAAC;iBACb,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;aACb;YAED,IAAM,WAAW,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;YACvC,IAAI,UAAU,CAAC;YAEf,IAAI,UAAU,CAAC;YACf,IAAM,SAAS,GAAG,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC;YAE/B,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAACA,GAAK,CAAC,KAAK,CAAC,KAAK,EAAE,UAAS,KAAK;gBAC3D,KAAK,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACpD,IAAI,UAAU,EAAE;oBACd,OAAO;iBACR;gBAED,IAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC7B,IAAI,CAAC,IAAI,EAAE;oBACT,OAAO;iBACR;gBAED,IAAI,OAAO,CAAC,UAAU,EAAE;oBACtB,UAAU,GAAG,IAAI,CAAC;iBAEnB;qBAAM;oBACL,UAAU,GAAG,IAAI,UAAU,CAAC,EAAC,QAAQ,EAAE,IAAI,EAAC,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;oBACpF,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;iBAC/B;aAEF,CAAC,CAAC,EAAE,CAACA,GAAK,CAAC,KAAK,CAAC,IAAI,EAAE,UAAS,KAAK;gBACpC,KAAK,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACpD,IAAI,UAAU,EAAE;oBACd,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;iBAC7B;gBAED,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;gBACtB,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;aACvB,CAAC,CAAC,EAAE,CAACA,GAAK,CAAC,KAAK,CAAC,GAAG,EAAE,UAAS,KAAK;gBACnC,KAAK,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACpD,IAAI,UAAU,EAAE;oBACd,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;oBAC/B,UAAU,GAAG,IAAI,CAAC;iBACnB;gBACD,IAAI,UAAU,EAAE;oBACd,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;oBACxD,UAAU,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;oBACnE,UAAU,GAAG,IAAI,CAAC;iBACnB;aAEF,CAAC,CAAC,EAAE,CAACA,GAAK,CAAC,KAAK,CAAC,MAAM,EAAE,UAAS,KAAK;gBACtC,KAAK,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACpD,IAAI,UAAU,EAAE;oBACd,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;oBAC/B,UAAU,GAAG,IAAI,CAAC;iBACnB;gBACD,IAAI,UAAU,EAAE;oBACd,UAAU,GAAG,IAAI,CAAC;iBACnB;aACF,CAAC,CAAC;YAEH,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAS,CAAC;gBAC3C,QAAQ,CAAC,CAAC,OAAO;oBACf,KAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;wBACpB,OAAO,CAAC,WAAW,EAAE,CAAC;wBACtB,MAAM;iBACT;aACF,EAAE,KAAK,CAAC,CAAC;YAEV,IAAM,QAAQ,GAAG,EAAE,CAAC;YACpB,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAS,CAAC;gBAC3C,IAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;gBAC1B,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;gBACzB,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAChC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;aAC3E,CAAC,CAAC;YACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAS,CAAC;gBACzC,IAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;gBAC1B,QAAQ,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;gBAC1B,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACjC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;aACvE,CAAC,CAAC;YAEH,IAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;YACtC,SAAS,gBAAgB,CAAC,OAAO,EAAE,IAAI;gBACrC,IAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAC1C,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBACnB,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;iBACzB;gBACD,UAAU,CAAC,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;gBACnD,UAAU,CAAC,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;gBAClD,UAAU,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;gBAChD,UAAU,CAAC,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;gBAClD,UAAU,CAAC,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAE;aACjD;SAEF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,MAAM,GAAGA,GAAK,CAAC;IACtB,MAAM,CAAC,SAAS,GAAGA,GAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAE1D,SAAS,MAAM,CAAC,KAAK,EAAE,IAAI;QAA3B,iBAsCC;QArCC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAErB,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAElB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;YAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;SACzC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAElD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,IAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,UAAC,EAAE;YACX,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,KAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACtC,WAAW,IAAI,EAAE,CAAC;YAClB,OAAO,WAAW,GAAG,QAAQ,EAAE;gBAC7B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACrB,WAAW,IAAI,QAAQ,CAAC;aACzB;YACD,KAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;SACb,EAAE,IAAI,CAAC,CAAC;QAET,KAAK,CAAC,EAAE,CAAC,gBAAgB,EAAE,UAAS,GAAG;YACrC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;SAC3B,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,cAAc,EAAE,UAAS,GAAG;YACnC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,WAAW,GAAG;QAC7B,IAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAM,MAAM,GAAG,IAAI,CAAC;QAEpB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACpD,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBAEnD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;oBACT,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE;wBAC/B,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;qBACvC;yBAAM,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE;wBACtC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;qBACvC;yBAAM,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;wBACxB,OAAO,CAAC,WAAW,GAAG,uBAAuB,CAAC;qBAC/C;yBAAM,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;wBAC1B,OAAO,CAAC,WAAW,GAAG,uBAAuB,CAAC;qBAC/C;yBAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;wBACvB,OAAO,CAAC,WAAW,GAAG,uBAAuB,CAAC;qBAC/C;oBAED,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;wBAC7B,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;qBACnC;yBAAM,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;wBACpC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;qBACnC;yBAAM;wBACL,OAAO,CAAC,SAAS,GAAG,EAAE,CAAC;qBACxB;oBAED,IAAM,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;oBACzB,IAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;oBAC3B,IAAI,IAAI,IAAI,QAAQ,EAAE;wBACpB,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;qBAC1C;oBACD,IAAI,IAAI,IAAI,MAAM,EAAE;wBAClB,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;qBACxC;oBACD,IAAI,IAAI,IAAI,SAAS,EAAE;wBACrB,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;qBAC3C;oBACD,IAAI,IAAI,IAAI,OAAO,EAAE;wBACnB,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;qBACzC;oBAED,IAAI,CAAC,CAAC,EAAE,EAAE;wBACR,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;qBACvB;iBACF;gBAED,IAAI,CAAC,CAAC,EAAE,EAAE;oBACR,IAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC1B,IAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;oBACvB,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,KAAK,CAAC,EAAE;wBACtE,CAAC,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;wBACnB,CAAC,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;wBACnB,CAAC,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC;wBACjB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;wBACvC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;qBACjC;iBACF;aAEF;SACF;QAED,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACrD,IAAM,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;YACzB,IAAM,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;YACzB,IAAM,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;YAEzB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,OAAO,CAAC,WAAW,GAAG,uBAAuB,CAAC;gBAE9C,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBACpC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBACxB,IAAI,CAAC,CAAC,EAAE,EAAE;oBACR,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;iBACvB;aACF;YAED,IAAI,CAAC,CAAC,EAAE,EAAE;gBACR,IAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;gBAC7B,IAAM,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;gBAC9C,IAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACrB,IAAM,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxC,IAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;gBACvC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACd,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;gBAChC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;aACrB;SACF;IAEH,CAAC,CAAC;IAEF,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,UAAS,KAAK,EAAE,OAAO;QAClD,IAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;QAC7B,IAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAM,MAAM,GAAG,EAAE,CAAC;QAElB,IAAM,OAAO,GAAGA,GAAK,CAAC,MAAM,CAAC,UAAS,GAAG;YAEvC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;YAE1C,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACxB,GAAG,CAAC,SAAS,EAAE,CAAC;YAChB,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACnB,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC,CAAC;YAE5B,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;YACtB,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YAClC,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;YACtC,GAAG,CAAC,MAAM,EAAE,CAAC;SACd,CAAC,CAAC;QAEH,IAAM,KAAK,GAAGA,GAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,CAAC,SAAS,CAAC,UAAU,GAAG,UAAS,KAAK,EAAE,OAAO;QACnD,IAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;QAC7B,IAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;QACzB,IAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QAClB,IAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QAClB,IAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACzB,IAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAEzB,IAAM,OAAO,GAAGA,GAAK,CAAC,MAAM,CAAC,UAAS,GAAG;YAEvC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAEvB,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACxB,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,OAAO,CAAC,SAAS,EAAE;gBACrB,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;gBAClC,GAAG,CAAC,IAAI,EAAE,CAAC;aACZ;YACD,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACnB,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YAClC,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;YACtC,GAAG,CAAC,MAAM,EAAE,CAAC;SACd,CAAC,CAAC;QACH,IAAM,KAAK,GAAGA,GAAK,CAAC,KAAK,CAAC,OAAO,CAAC;aAC/B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/D,IAAM,IAAI,GAAGA,GAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,CAAC,SAAS,CAAC,QAAQ,GAAG,UAAS,IAAI,EAAE,OAAO;QAChD,IAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;QAC7B,IAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1B,IAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAE1B,IAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvB,IAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAEvB,IAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAE5C,IAAM,OAAO,GAAGA,GAAK,CAAC,MAAM,CAAC,UAAS,GAAG;YAEvC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;YAE1C,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACxB,GAAG,CAAC,SAAS,EAAE,CAAC;YAChB,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACnB,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC,CAAC;YAE5B,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;YACtB,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YAClC,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;YACtC,GAAG,CAAC,MAAM,EAAE,CAAC;SACd,CAAC,CAAC;QAEH,IAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,IAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAEpE,IAAM,KAAK,GAAGA,GAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAClD,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACnC,IAAM,IAAI,GAAGA,GAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,CAAC,SAAS,CAAC,WAAW,GAAG,UAAS,KAAK,EAAE,OAAO;QACpD,IAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;QAC7B,IAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC;QAElC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YACpB,OAAO;SACR;QAED,IAAI,IAAI,GAAG,QAAQ,CAAC;QACpB,IAAI,IAAI,GAAG,QAAQ,CAAC;QACpB,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;QACrB,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;YACxC,IAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC7C;QAED,IAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;QAC1B,IAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;QAE3B,IAAM,OAAO,GAAGA,GAAK,CAAC,MAAM,CAAC,UAAS,GAAG;YAEvC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;YAElD,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACxB,GAAG,CAAC,SAAS,EAAE,CAAC;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBACxC,IAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;gBAC1B,IAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC;oBACR,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;oBAEjB,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aACpB;YAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvB,GAAG,CAAC,SAAS,EAAE,CAAC;aACjB;YAED,IAAI,OAAO,CAAC,SAAS,EAAE;gBACrB,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;gBAClC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACX,GAAG,CAAC,SAAS,EAAE,CAAC;aACjB;YAED,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;YACtB,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YAClC,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;YACtC,GAAG,CAAC,MAAM,EAAE,CAAC;SACd,CAAC,CAAC;QAEH,IAAM,KAAK,GAAGA,GAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACnC,IAAM,IAAI,GAAGA,GAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,UAAS,KAAK,EAAE,OAAO;QAClD,IAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;QAC7B,IAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC;QAElC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YACpB,OAAO;SACR;QAED,IAAI,IAAI,GAAG,QAAQ,CAAC;QACpB,IAAI,IAAI,GAAG,QAAQ,CAAC;QACpB,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;QACrB,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;YACxC,IAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC7C;QAED,IAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;QAC1B,IAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;QAE3B,IAAM,OAAO,GAAGA,GAAK,CAAC,MAAM,CAAC,UAAS,GAAG;YAEvC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;YAElD,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACxB,GAAG,CAAC,SAAS,EAAE,CAAC;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBACxC,IAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;gBAC1B,IAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC;oBACR,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;oBAEjB,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aACpB;;YAGD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAExB;YAED,IAAI,OAAO,CAAC,SAAS,EAAE;gBACrB,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;gBAClC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACX,GAAG,CAAC,SAAS,EAAE,CAAC;aACjB;YAED,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;YACtB,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YAClC,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;YACtC,GAAG,CAAC,MAAM,EAAE,CAAC;SACd,CAAC,CAAC;QAEH,IAAM,KAAK,GAAGA,GAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACnC,IAAM,IAAI,GAAGA,GAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAuEF;QACa,QAAQ,GAAG,GAAG;IAE3B;IACA,QAAQ,CAAC,eAAe,GAAG,eAAe,CAAC;IAC3C;IACA,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B;IACA,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB;IACA,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B;IACA,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B;IACA,QAAQ,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC;IACA,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC;IACA,QAAQ,CAAC,KAAK,GAAGtB,OAAK,CAAC;IAEvB;IACA,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAE3B;IACA,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC;IACA,QAAQ,CAAC,KAAK,GAAG,aAAa,CAAC;IAC/B;IACA,QAAQ,CAAC,MAAM,GAAG,cAAc,CAAC;IACjC;IACA,QAAQ,CAAC,KAAK,GAAG,aAAa,CAAC;IAC/B;IACA,QAAQ,CAAC,KAAK,GAAG,YAAY,CAAC;IAE9B;IACA,YAAY,CAAC,KAAK,GAAG,QAAQ,CAAC;IAC9B;IACA,YAAY,CAAC,MAAM,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file +{"version":3,"file":"planck-with-testbed.js","sources":["../node_modules/stage-js/dist/stage.js","../node_modules/tslib/tslib.es6.js","../src/util/options.ts","../src/common/Math.ts","../src/common/Vec2.ts","../src/collision/AABB.ts","../src/Settings.ts","../src/util/Pool.ts","../src/collision/DynamicTree.ts","../src/collision/BroadPhase.ts","../src/common/Rot.ts","../src/common/Transform.ts","../src/common/Sweep.ts","../src/dynamics/Velocity.ts","../src/dynamics/Position.ts","../src/collision/Shape.ts","../src/dynamics/Fixture.ts","../src/dynamics/Body.ts","../src/dynamics/Joint.ts","../src/util/stats.ts","../src/util/Timer.ts","../src/collision/Distance.ts","../src/collision/TimeOfImpact.ts","../src/dynamics/Solver.ts","../src/common/Mat22.ts","../src/collision/Manifold.ts","../src/dynamics/Contact.ts","../src/dynamics/World.ts","../src/common/Vec3.ts","../src/collision/shape/EdgeShape.ts","../src/collision/shape/ChainShape.ts","../src/collision/shape/PolygonShape.ts","../src/collision/shape/BoxShape.ts","../src/collision/shape/CircleShape.ts","../src/dynamics/joint/DistanceJoint.ts","../src/dynamics/joint/FrictionJoint.ts","../src/common/Mat33.ts","../src/dynamics/joint/RevoluteJoint.ts","../src/dynamics/joint/PrismaticJoint.ts","../src/dynamics/joint/GearJoint.ts","../src/dynamics/joint/MotorJoint.ts","../src/dynamics/joint/MouseJoint.ts","../src/dynamics/joint/PulleyJoint.ts","../src/dynamics/joint/RopeJoint.ts","../src/dynamics/joint/WeldJoint.ts","../src/dynamics/joint/WheelJoint.ts","../src/serializer/index.ts","../src/collision/shape/CollideCircle.ts","../src/collision/shape/CollideEdgeCircle.ts","../src/collision/shape/CollidePolygon.ts","../src/collision/shape/CollideCirclePolygon.ts","../src/collision/shape/CollideEdgePolygon.ts","../src/index.ts","../testbed/index.ts"],"sourcesContent":["var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nconst stats = {\n create: 0,\n tick: 0,\n node: 0,\n draw: 0,\n fps: 0\n};\nclass Matrix {\n constructor(a, b, c, d, e, f) {\n this.reset(a, b, c, d, e, f);\n }\n toString() {\n return \"[\" + this.a + \", \" + this.b + \", \" + this.c + \", \" + this.d + \", \" + this.e + \", \" + this.f + \"]\";\n }\n clone() {\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n }\n reset(a, b, c, d, e, f) {\n this._dirty = true;\n if (typeof a === \"object\") {\n this.a = a.a, this.d = a.d;\n this.b = a.b, this.c = a.c;\n this.e = a.e, this.f = a.f;\n } else {\n this.a = a || 1, this.d = d || 1;\n this.b = b || 0, this.c = c || 0;\n this.e = e || 0, this.f = f || 0;\n }\n return this;\n }\n identity() {\n this._dirty = true;\n this.a = 1;\n this.b = 0;\n this.c = 0;\n this.d = 1;\n this.e = 0;\n this.f = 0;\n return this;\n }\n rotate(angle) {\n if (!angle) {\n return this;\n }\n this._dirty = true;\n var u = angle ? Math.cos(angle) : 1;\n var v = angle ? Math.sin(angle) : 0;\n var a = u * this.a - v * this.b;\n var b = u * this.b + v * this.a;\n var c = u * this.c - v * this.d;\n var d = u * this.d + v * this.c;\n var e = u * this.e - v * this.f;\n var f = u * this.f + v * this.e;\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n return this;\n }\n translate(x, y) {\n if (!x && !y) {\n return this;\n }\n this._dirty = true;\n this.e += x;\n this.f += y;\n return this;\n }\n scale(x, y) {\n if (!(x - 1) && !(y - 1)) {\n return this;\n }\n this._dirty = true;\n this.a *= x;\n this.b *= y;\n this.c *= x;\n this.d *= y;\n this.e *= x;\n this.f *= y;\n return this;\n }\n skew(x, y) {\n if (!x && !y) {\n return this;\n }\n this._dirty = true;\n var a = this.a + this.b * x;\n var b = this.b + this.a * y;\n var c = this.c + this.d * x;\n var d = this.d + this.c * y;\n var e = this.e + this.f * x;\n var f = this.f + this.e * y;\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n return this;\n }\n concat(m) {\n this._dirty = true;\n var n = this;\n var a = n.a * m.a + n.b * m.c;\n var b = n.b * m.d + n.a * m.b;\n var c = n.c * m.a + n.d * m.c;\n var d = n.d * m.d + n.c * m.b;\n var e = n.e * m.a + m.e + n.f * m.c;\n var f = n.f * m.d + m.f + n.e * m.b;\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n return this;\n }\n inverse() {\n if (this._dirty) {\n this._dirty = false;\n this.inverted = this.inverted || new Matrix();\n var z = this.a * this.d - this.b * this.c;\n this.inverted.a = this.d / z;\n this.inverted.b = -this.b / z;\n this.inverted.c = -this.c / z;\n this.inverted.d = this.a / z;\n this.inverted.e = (this.c * this.f - this.e * this.d) / z;\n this.inverted.f = (this.e * this.b - this.a * this.f) / z;\n }\n return this.inverted;\n }\n map(p, q) {\n q = q || {};\n q.x = this.a * p.x + this.c * p.y + this.e;\n q.y = this.b * p.x + this.d * p.y + this.f;\n return q;\n }\n mapX(x, y) {\n if (typeof x === \"object\")\n y = x.y, x = x.x;\n return this.a * x + this.c * y + this.e;\n }\n mapY(x, y) {\n if (typeof x === \"object\")\n y = x.y, x = x.x;\n return this.b * x + this.d * y + this.f;\n }\n}\nvar iid$1 = 0;\nfunction Pin(owner) {\n this._owner = owner;\n this._parent = null;\n this._relativeMatrix = new Matrix();\n this._absoluteMatrix = new Matrix();\n this.reset();\n}\nPin.prototype.reset = function() {\n this._textureAlpha = 1;\n this._alpha = 1;\n this._width = 0;\n this._height = 0;\n this._scaleX = 1;\n this._scaleY = 1;\n this._skewX = 0;\n this._skewY = 0;\n this._rotation = 0;\n this._pivoted = false;\n this._pivotX = null;\n this._pivotY = null;\n this._handled = false;\n this._handleX = 0;\n this._handleY = 0;\n this._aligned = false;\n this._alignX = 0;\n this._alignY = 0;\n this._offsetX = 0;\n this._offsetY = 0;\n this._boxX = 0;\n this._boxY = 0;\n this._boxWidth = this._width;\n this._boxHeight = this._height;\n this._ts_translate = ++iid$1;\n this._ts_transform = ++iid$1;\n this._ts_matrix = ++iid$1;\n};\nPin.prototype._update = function() {\n this._parent = this._owner._parent && this._owner._parent._pin;\n if (this._handled && this._mo_handle != this._ts_transform) {\n this._mo_handle = this._ts_transform;\n this._ts_translate = ++iid$1;\n }\n if (this._aligned && this._parent && this._mo_align != this._parent._ts_transform) {\n this._mo_align = this._parent._ts_transform;\n this._ts_translate = ++iid$1;\n }\n return this;\n};\nPin.prototype.toString = function() {\n return this._owner + \" (\" + (this._parent ? this._parent._owner : null) + \")\";\n};\nPin.prototype.absoluteMatrix = function() {\n this._update();\n var ts = Math.max(\n this._ts_transform,\n this._ts_translate,\n this._parent ? this._parent._ts_matrix : 0\n );\n if (this._mo_abs == ts) {\n return this._absoluteMatrix;\n }\n this._mo_abs = ts;\n var abs2 = this._absoluteMatrix;\n abs2.reset(this.relativeMatrix());\n this._parent && abs2.concat(this._parent._absoluteMatrix);\n this._ts_matrix = ++iid$1;\n return abs2;\n};\nPin.prototype.relativeMatrix = function() {\n this._update();\n var ts = Math.max(\n this._ts_transform,\n this._ts_translate,\n this._parent ? this._parent._ts_transform : 0\n );\n if (this._mo_rel == ts) {\n return this._relativeMatrix;\n }\n this._mo_rel = ts;\n var rel2 = this._relativeMatrix;\n rel2.identity();\n if (this._pivoted) {\n rel2.translate(-this._pivotX * this._width, -this._pivotY * this._height);\n }\n rel2.scale(this._scaleX, this._scaleY);\n rel2.skew(this._skewX, this._skewY);\n rel2.rotate(this._rotation);\n if (this._pivoted) {\n rel2.translate(this._pivotX * this._width, this._pivotY * this._height);\n }\n if (this._pivoted) {\n this._boxX = 0;\n this._boxY = 0;\n this._boxWidth = this._width;\n this._boxHeight = this._height;\n } else {\n var p, q;\n if (rel2.a > 0 && rel2.c > 0 || rel2.a < 0 && rel2.c < 0) {\n p = 0, q = rel2.a * this._width + rel2.c * this._height;\n } else {\n p = rel2.a * this._width, q = rel2.c * this._height;\n }\n if (p > q) {\n this._boxX = q;\n this._boxWidth = p - q;\n } else {\n this._boxX = p;\n this._boxWidth = q - p;\n }\n if (rel2.b > 0 && rel2.d > 0 || rel2.b < 0 && rel2.d < 0) {\n p = 0, q = rel2.b * this._width + rel2.d * this._height;\n } else {\n p = rel2.b * this._width, q = rel2.d * this._height;\n }\n if (p > q) {\n this._boxY = q;\n this._boxHeight = p - q;\n } else {\n this._boxY = p;\n this._boxHeight = q - p;\n }\n }\n this._x = this._offsetX;\n this._y = this._offsetY;\n this._x -= this._boxX + this._handleX * this._boxWidth;\n this._y -= this._boxY + this._handleY * this._boxHeight;\n if (this._aligned && this._parent) {\n this._parent.relativeMatrix();\n this._x += this._alignX * this._parent._width;\n this._y += this._alignY * this._parent._height;\n }\n rel2.translate(this._x, this._y);\n return this._relativeMatrix;\n};\nPin.prototype.get = function(key) {\n if (typeof getters[key] === \"function\") {\n return getters[key](this);\n }\n};\nPin.prototype.set = function(a, b) {\n if (typeof a === \"string\") {\n if (typeof setters[a] === \"function\" && typeof b !== \"undefined\") {\n setters[a](this, b);\n }\n } else if (typeof a === \"object\") {\n for (b in a) {\n if (typeof setters[b] === \"function\" && typeof a[b] !== \"undefined\") {\n setters[b](this, a[b], a);\n }\n }\n }\n if (this._owner) {\n this._owner._ts_pin = ++iid$1;\n this._owner.touch();\n }\n return this;\n};\nvar getters = {\n alpha: function(pin) {\n return pin._alpha;\n },\n textureAlpha: function(pin) {\n return pin._textureAlpha;\n },\n width: function(pin) {\n return pin._width;\n },\n height: function(pin) {\n return pin._height;\n },\n boxWidth: function(pin) {\n return pin._boxWidth;\n },\n boxHeight: function(pin) {\n return pin._boxHeight;\n },\n // scale : function(pin) {\n // },\n scaleX: function(pin) {\n return pin._scaleX;\n },\n scaleY: function(pin) {\n return pin._scaleY;\n },\n // skew : function(pin) {\n // },\n skewX: function(pin) {\n return pin._skewX;\n },\n skewY: function(pin) {\n return pin._skewY;\n },\n rotation: function(pin) {\n return pin._rotation;\n },\n // pivot : function(pin) {\n // },\n pivotX: function(pin) {\n return pin._pivotX;\n },\n pivotY: function(pin) {\n return pin._pivotY;\n },\n // offset : function(pin) {\n // },\n offsetX: function(pin) {\n return pin._offsetX;\n },\n offsetY: function(pin) {\n return pin._offsetY;\n },\n // align : function(pin) {\n // },\n alignX: function(pin) {\n return pin._alignX;\n },\n alignY: function(pin) {\n return pin._alignY;\n },\n // handle : function(pin) {\n // },\n handleX: function(pin) {\n return pin._handleX;\n },\n handleY: function(pin) {\n return pin._handleY;\n }\n};\nvar setters = {\n alpha: function(pin, value) {\n pin._alpha = value;\n },\n textureAlpha: function(pin, value) {\n pin._textureAlpha = value;\n },\n width: function(pin, value) {\n pin._width_ = value;\n pin._width = value;\n pin._ts_transform = ++iid$1;\n },\n height: function(pin, value) {\n pin._height_ = value;\n pin._height = value;\n pin._ts_transform = ++iid$1;\n },\n scale: function(pin, value) {\n pin._scaleX = value;\n pin._scaleY = value;\n pin._ts_transform = ++iid$1;\n },\n scaleX: function(pin, value) {\n pin._scaleX = value;\n pin._ts_transform = ++iid$1;\n },\n scaleY: function(pin, value) {\n pin._scaleY = value;\n pin._ts_transform = ++iid$1;\n },\n skew: function(pin, value) {\n pin._skewX = value;\n pin._skewY = value;\n pin._ts_transform = ++iid$1;\n },\n skewX: function(pin, value) {\n pin._skewX = value;\n pin._ts_transform = ++iid$1;\n },\n skewY: function(pin, value) {\n pin._skewY = value;\n pin._ts_transform = ++iid$1;\n },\n rotation: function(pin, value) {\n pin._rotation = value;\n pin._ts_transform = ++iid$1;\n },\n pivot: function(pin, value) {\n pin._pivotX = value;\n pin._pivotY = value;\n pin._pivoted = true;\n pin._ts_transform = ++iid$1;\n },\n pivotX: function(pin, value) {\n pin._pivotX = value;\n pin._pivoted = true;\n pin._ts_transform = ++iid$1;\n },\n pivotY: function(pin, value) {\n pin._pivotY = value;\n pin._pivoted = true;\n pin._ts_transform = ++iid$1;\n },\n offset: function(pin, value) {\n pin._offsetX = value;\n pin._offsetY = value;\n pin._ts_translate = ++iid$1;\n },\n offsetX: function(pin, value) {\n pin._offsetX = value;\n pin._ts_translate = ++iid$1;\n },\n offsetY: function(pin, value) {\n pin._offsetY = value;\n pin._ts_translate = ++iid$1;\n },\n align: function(pin, value) {\n this.alignX(pin, value);\n this.alignY(pin, value);\n },\n alignX: function(pin, value) {\n pin._alignX = value;\n pin._aligned = true;\n pin._ts_translate = ++iid$1;\n this.handleX(pin, value);\n },\n alignY: function(pin, value) {\n pin._alignY = value;\n pin._aligned = true;\n pin._ts_translate = ++iid$1;\n this.handleY(pin, value);\n },\n handle: function(pin, value) {\n this.handleX(pin, value);\n this.handleY(pin, value);\n },\n handleX: function(pin, value) {\n pin._handleX = value;\n pin._handled = true;\n pin._ts_translate = ++iid$1;\n },\n handleY: function(pin, value) {\n pin._handleY = value;\n pin._handled = true;\n pin._ts_translate = ++iid$1;\n },\n resizeMode: function(pin, value, all) {\n if (all) {\n if (value == \"in\") {\n value = \"in-pad\";\n } else if (value == \"out\") {\n value = \"out-crop\";\n }\n scaleTo(pin, all.resizeWidth, all.resizeHeight, value);\n }\n },\n resizeWidth: function(pin, value, all) {\n if (!all || !all.resizeMode) {\n scaleTo(pin, value, null);\n }\n },\n resizeHeight: function(pin, value, all) {\n if (!all || !all.resizeMode) {\n scaleTo(pin, null, value);\n }\n },\n scaleMode: function(pin, value, all) {\n if (all) {\n scaleTo(pin, all.scaleWidth, all.scaleHeight, value);\n }\n },\n scaleWidth: function(pin, value, all) {\n if (!all || !all.scaleMode) {\n scaleTo(pin, value, null);\n }\n },\n scaleHeight: function(pin, value, all) {\n if (!all || !all.scaleMode) {\n scaleTo(pin, null, value);\n }\n },\n matrix: function(pin, value) {\n this.scaleX(pin, value.a);\n this.skewX(pin, value.c / value.d);\n this.skewY(pin, value.b / value.a);\n this.scaleY(pin, value.d);\n this.offsetX(pin, value.e);\n this.offsetY(pin, value.f);\n this.rotation(pin, 0);\n }\n};\nPin.prototype.scaleTo = function(width, height, mode) {\n scaleTo(this, width, height, mode);\n};\nfunction scaleTo(pin, width, height, mode) {\n var w = typeof width === \"number\";\n var h = typeof height === \"number\";\n var m = typeof mode === \"string\";\n pin._ts_transform = ++iid$1;\n if (w) {\n pin._scaleX = width / pin._width_;\n pin._width = pin._width_;\n }\n if (h) {\n pin._scaleY = height / pin._height_;\n pin._height = pin._height_;\n }\n if (w && h && m) {\n if (mode == \"out\" || mode == \"out-crop\") {\n pin._scaleX = pin._scaleY = Math.max(pin._scaleX, pin._scaleY);\n } else if (mode == \"in\" || mode == \"in-pad\") {\n pin._scaleX = pin._scaleY = Math.min(pin._scaleX, pin._scaleY);\n }\n if (mode == \"out-crop\" || mode == \"in-pad\") {\n pin._width = width / pin._scaleX;\n pin._height = height / pin._scaleY;\n }\n }\n}\nPin._add_shortcuts = function(prototype) {\n prototype.size = function(w, h) {\n this.pin(\"width\", w);\n this.pin(\"height\", h);\n return this;\n };\n prototype.width = function(w) {\n if (typeof w === \"undefined\") {\n return this.pin(\"width\");\n }\n this.pin(\"width\", w);\n return this;\n };\n prototype.height = function(h) {\n if (typeof h === \"undefined\") {\n return this.pin(\"height\");\n }\n this.pin(\"height\", h);\n return this;\n };\n prototype.offset = function(a, b) {\n if (typeof a === \"object\")\n b = a.y, a = a.x;\n this.pin(\"offsetX\", a);\n this.pin(\"offsetY\", b);\n return this;\n };\n prototype.rotate = function(a) {\n this.pin(\"rotation\", a);\n return this;\n };\n prototype.skew = function(a, b) {\n if (typeof a === \"object\")\n b = a.y, a = a.x;\n else if (typeof b === \"undefined\")\n b = a;\n this.pin(\"skewX\", a);\n this.pin(\"skewY\", b);\n return this;\n };\n prototype.scale = function(a, b) {\n if (typeof a === \"object\")\n b = a.y, a = a.x;\n else if (typeof b === \"undefined\")\n b = a;\n this.pin(\"scaleX\", a);\n this.pin(\"scaleY\", b);\n return this;\n };\n prototype.alpha = function(a, ta) {\n this.pin(\"alpha\", a);\n if (typeof ta !== \"undefined\") {\n this.pin(\"textureAlpha\", ta);\n }\n return this;\n };\n};\nvar iid = 0;\nstats.create = 0;\nfunction assertType(obj) {\n if (obj && obj instanceof Node) {\n return obj;\n }\n throw \"Invalid node: \" + obj;\n}\nconst create = function() {\n return new Node();\n};\nfunction Node() {\n stats.create++;\n this._pin = new Pin(this);\n}\nNode.prototype.matrix = function(relative) {\n if (relative === true) {\n return this._pin.relativeMatrix();\n }\n return this._pin.absoluteMatrix();\n};\nNode.prototype.pin = function(a, b) {\n if (typeof a === \"object\") {\n this._pin.set(a);\n return this;\n } else if (typeof a === \"string\") {\n if (typeof b === \"undefined\") {\n return this._pin.get(a);\n } else {\n this._pin.set(a, b);\n return this;\n }\n } else if (typeof a === \"undefined\") {\n return this._pin;\n }\n};\nNode.prototype.scaleTo = function(a, b, c) {\n if (typeof a === \"object\")\n c = b, b = a.y, a = a.x;\n this._pin.scaleTo(a, b, c);\n return this;\n};\nPin._add_shortcuts(Node.prototype);\nNode.prototype._label = \"\";\nNode.prototype._visible = true;\nNode.prototype._parent = null;\nNode.prototype._next = null;\nNode.prototype._prev = null;\nNode.prototype._first = null;\nNode.prototype._last = null;\nNode.prototype._attrs = null;\nNode.prototype._flags = null;\nNode.prototype.toString = function() {\n return \"[\" + this._label + \"]\";\n};\nNode.prototype.id = function(id) {\n return this.label(id);\n};\nNode.prototype.label = function(label) {\n if (typeof label === \"undefined\") {\n return this._label;\n }\n this._label = label;\n return this;\n};\nNode.prototype.attr = function(name, value) {\n if (typeof value === \"undefined\") {\n return this._attrs !== null ? this._attrs[name] : void 0;\n }\n (this._attrs !== null ? this._attrs : this._attrs = {})[name] = value;\n return this;\n};\nNode.prototype.visible = function(visible) {\n if (typeof visible === \"undefined\") {\n return this._visible;\n }\n this._visible = visible;\n this._parent && (this._parent._ts_children = ++iid);\n this._ts_pin = ++iid;\n this.touch();\n return this;\n};\nNode.prototype.hide = function() {\n return this.visible(false);\n};\nNode.prototype.show = function() {\n return this.visible(true);\n};\nNode.prototype.parent = function() {\n return this._parent;\n};\nNode.prototype.next = function(visible) {\n var next = this._next;\n while (next && visible && !next._visible) {\n next = next._next;\n }\n return next;\n};\nNode.prototype.prev = function(visible) {\n var prev = this._prev;\n while (prev && visible && !prev._visible) {\n prev = prev._prev;\n }\n return prev;\n};\nNode.prototype.first = function(visible) {\n var next = this._first;\n while (next && visible && !next._visible) {\n next = next._next;\n }\n return next;\n};\nNode.prototype.last = function(visible) {\n var prev = this._last;\n while (prev && visible && !prev._visible) {\n prev = prev._prev;\n }\n return prev;\n};\nNode.prototype.visit = function(visitor, data) {\n var reverse = visitor.reverse;\n var visible = visitor.visible;\n if (visitor.start && visitor.start(this, data)) {\n return;\n }\n var child, next = reverse ? this.last(visible) : this.first(visible);\n while (child = next) {\n next = reverse ? child.prev(visible) : child.next(visible);\n if (child.visit(visitor, data)) {\n return true;\n }\n }\n return visitor.end && visitor.end(this, data);\n};\nNode.prototype.append = function(child, more) {\n if (Array.isArray(child))\n for (var i = 0; i < child.length; i++)\n append(this, child[i]);\n else if (typeof more !== \"undefined\")\n for (var i = 0; i < arguments.length; i++)\n append(this, arguments[i]);\n else if (typeof child !== \"undefined\")\n append(this, child);\n return this;\n};\nNode.prototype.prepend = function(child, more) {\n if (Array.isArray(child))\n for (var i = child.length - 1; i >= 0; i--)\n prepend(this, child[i]);\n else if (typeof more !== \"undefined\")\n for (var i = arguments.length - 1; i >= 0; i--)\n prepend(this, arguments[i]);\n else if (typeof child !== \"undefined\")\n prepend(this, child);\n return this;\n};\nNode.prototype.appendTo = function(parent) {\n append(parent, this);\n return this;\n};\nNode.prototype.prependTo = function(parent) {\n prepend(parent, this);\n return this;\n};\nNode.prototype.insertNext = function(sibling, more) {\n if (Array.isArray(sibling))\n for (var i = 0; i < sibling.length; i++)\n insertAfter(sibling[i], this);\n else if (typeof more !== \"undefined\")\n for (var i = 0; i < arguments.length; i++)\n insertAfter(arguments[i], this);\n else if (typeof sibling !== \"undefined\")\n insertAfter(sibling, this);\n return this;\n};\nNode.prototype.insertPrev = function(sibling, more) {\n if (Array.isArray(sibling))\n for (var i = sibling.length - 1; i >= 0; i--)\n insertBefore(sibling[i], this);\n else if (typeof more !== \"undefined\")\n for (var i = arguments.length - 1; i >= 0; i--)\n insertBefore(arguments[i], this);\n else if (typeof sibling !== \"undefined\")\n insertBefore(sibling, this);\n return this;\n};\nNode.prototype.insertAfter = function(prev) {\n insertAfter(this, prev);\n return this;\n};\nNode.prototype.insertBefore = function(next) {\n insertBefore(this, next);\n return this;\n};\nfunction append(parent, child) {\n assertType(child);\n assertType(parent);\n child.remove();\n if (parent._last) {\n parent._last._next = child;\n child._prev = parent._last;\n }\n child._parent = parent;\n parent._last = child;\n if (!parent._first) {\n parent._first = child;\n }\n child._parent._flag(child, true);\n child._ts_parent = ++iid;\n parent._ts_children = ++iid;\n parent.touch();\n}\nfunction prepend(parent, child) {\n assertType(child);\n assertType(parent);\n child.remove();\n if (parent._first) {\n parent._first._prev = child;\n child._next = parent._first;\n }\n child._parent = parent;\n parent._first = child;\n if (!parent._last) {\n parent._last = child;\n }\n child._parent._flag(child, true);\n child._ts_parent = ++iid;\n parent._ts_children = ++iid;\n parent.touch();\n}\nfunction insertBefore(self, next) {\n assertType(self);\n assertType(next);\n self.remove();\n var parent = next._parent;\n var prev = next._prev;\n next._prev = self;\n prev && (prev._next = self) || parent && (parent._first = self);\n self._parent = parent;\n self._prev = prev;\n self._next = next;\n self._parent._flag(self, true);\n self._ts_parent = ++iid;\n self.touch();\n}\nfunction insertAfter(self, prev) {\n assertType(self);\n assertType(prev);\n self.remove();\n var parent = prev._parent;\n var next = prev._next;\n prev._next = self;\n next && (next._prev = self) || parent && (parent._last = self);\n self._parent = parent;\n self._prev = prev;\n self._next = next;\n self._parent._flag(self, true);\n self._ts_parent = ++iid;\n self.touch();\n}\nNode.prototype.remove = function(child, more) {\n if (typeof child !== \"undefined\") {\n if (Array.isArray(child)) {\n for (var i = 0; i < child.length; i++)\n assertType(child[i]).remove();\n } else if (typeof more !== \"undefined\") {\n for (var i = 0; i < arguments.length; i++)\n assertType(arguments[i]).remove();\n } else {\n assertType(child).remove();\n }\n return this;\n }\n if (this._prev) {\n this._prev._next = this._next;\n }\n if (this._next) {\n this._next._prev = this._prev;\n }\n if (this._parent) {\n if (this._parent._first === this) {\n this._parent._first = this._next;\n }\n if (this._parent._last === this) {\n this._parent._last = this._prev;\n }\n this._parent._flag(this, false);\n this._parent._ts_children = ++iid;\n this._parent.touch();\n }\n this._prev = this._next = this._parent = null;\n this._ts_parent = ++iid;\n return this;\n};\nNode.prototype.empty = function() {\n var child, next = this._first;\n while (child = next) {\n next = child._next;\n child._prev = child._next = child._parent = null;\n this._flag(child, false);\n }\n this._first = this._last = null;\n this._ts_children = ++iid;\n this.touch();\n return this;\n};\nNode.prototype._ts_touch = null;\nNode.prototype.touch = function() {\n this._ts_touch = ++iid;\n this._parent && this._parent.touch();\n return this;\n};\nNode.prototype._flag = function(obj, name) {\n if (typeof name === \"undefined\") {\n return this._flags !== null && this._flags[obj] || 0;\n }\n if (typeof obj === \"string\") {\n if (name) {\n this._flags = this._flags || {};\n if (!this._flags[obj] && this._parent) {\n this._parent._flag(obj, true);\n }\n this._flags[obj] = (this._flags[obj] || 0) + 1;\n } else if (this._flags && this._flags[obj] > 0) {\n if (this._flags[obj] == 1 && this._parent) {\n this._parent._flag(obj, false);\n }\n this._flags[obj] = this._flags[obj] - 1;\n }\n }\n if (typeof obj === \"object\") {\n if (obj._flags) {\n for (var type in obj._flags) {\n if (obj._flags[type] > 0) {\n this._flag(type, name);\n }\n }\n }\n }\n return this;\n};\nNode.prototype.hitTest = function(hit) {\n var width = this._pin._width;\n var height = this._pin._height;\n return hit.x >= 0 && hit.x <= width && hit.y >= 0 && hit.y <= height;\n};\nNode.prototype._textures = null;\nNode.prototype._alpha = 1;\nNode.prototype.render = function(context) {\n if (!this._visible) {\n return;\n }\n stats.node++;\n var m = this.matrix();\n context.setTransform(m.a, m.b, m.c, m.d, m.e, m.f);\n this._alpha = this._pin._alpha * (this._parent ? this._parent._alpha : 1);\n var alpha = this._pin._textureAlpha * this._alpha;\n if (context.globalAlpha != alpha) {\n context.globalAlpha = alpha;\n }\n if (this._textures !== null) {\n for (var i = 0, n = this._textures.length; i < n; i++) {\n this._textures[i].draw(context);\n }\n }\n if (context.globalAlpha != this._alpha) {\n context.globalAlpha = this._alpha;\n }\n var child, next = this._first;\n while (child = next) {\n next = child._next;\n child.render(context);\n }\n};\nNode.prototype._tickBefore = null;\nNode.prototype._tickAfter = null;\nNode.prototype.MAX_ELAPSE = Infinity;\nNode.prototype._tick = function(elapsed, now, last) {\n if (!this._visible) {\n return;\n }\n if (elapsed > this.MAX_ELAPSE) {\n elapsed = this.MAX_ELAPSE;\n }\n var ticked = false;\n if (this._tickBefore !== null) {\n for (var i = 0; i < this._tickBefore.length; i++) {\n stats.tick++;\n var tickFn = this._tickBefore[i];\n ticked = tickFn.call(this, elapsed, now, last) === true || ticked;\n }\n }\n var child, next = this._first;\n while (child = next) {\n next = child._next;\n if (child._flag(\"_tick\")) {\n ticked = child._tick(elapsed, now, last) === true ? true : ticked;\n }\n }\n if (this._tickAfter !== null) {\n for (var i = 0; i < this._tickAfter.length; i++) {\n stats.tick++;\n var tickFn = this._tickAfter[i];\n ticked = tickFn.call(this, elapsed, now, last) === true || ticked;\n }\n }\n return ticked;\n};\nNode.prototype.tick = function(ticker, before) {\n if (typeof ticker !== \"function\") {\n return;\n }\n if (before) {\n if (this._tickBefore === null) {\n this._tickBefore = [];\n }\n this._tickBefore.push(ticker);\n } else {\n if (this._tickAfter === null) {\n this._tickAfter = [];\n }\n this._tickAfter.push(ticker);\n }\n this._flag(\"_tick\", this._tickAfter !== null && this._tickAfter.length > 0 || this._tickBefore !== null && this._tickBefore.length > 0);\n};\nNode.prototype.untick = function(ticker) {\n if (typeof ticker !== \"function\") {\n return;\n }\n var i;\n if (this._tickBefore !== null && (i = this._tickBefore.indexOf(ticker)) >= 0) {\n this._tickBefore.splice(i, 1);\n }\n if (this._tickAfter !== null && (i = this._tickAfter.indexOf(ticker)) >= 0) {\n this._tickAfter.splice(i, 1);\n }\n};\nNode.prototype.timeout = function(fn, time) {\n this.setTimeout(fn, time);\n};\nNode.prototype.setTimeout = function(fn, time) {\n function timer(t) {\n if ((time -= t) < 0) {\n this.untick(timer);\n fn.call(this);\n } else {\n return true;\n }\n }\n this.tick(timer);\n return timer;\n};\nNode.prototype.clearTimeout = function(timer) {\n this.untick(timer);\n};\nNode.prototype._listeners = null;\nNode.prototype._event_callback = function(name, on) {\n this._flag(name, on);\n};\nNode.prototype.on = function(types, listener) {\n if (!types || !types.length || typeof listener !== \"function\") {\n return this;\n }\n if (this._listeners === null) {\n this._listeners = {};\n }\n var isarray = typeof types !== \"string\" && typeof types.join === \"function\";\n if (types = (isarray ? types.join(\" \") : types).match(/\\S+/g)) {\n for (var i = 0; i < types.length; i++) {\n var type = types[i];\n this._listeners[type] = this._listeners[type] || [];\n this._listeners[type].push(listener);\n if (typeof this._event_callback === \"function\") {\n this._event_callback(type, true);\n }\n }\n }\n return this;\n};\nNode.prototype.off = function(types, listener) {\n if (!types || !types.length || typeof listener !== \"function\") {\n return this;\n }\n if (this._listeners === null) {\n return this;\n }\n var isarray = typeof types !== \"string\" && typeof types.join === \"function\";\n if (types = (isarray ? types.join(\" \") : types).match(/\\S+/g)) {\n for (var i = 0; i < types.length; i++) {\n var type = types[i], all = this._listeners[type], index;\n if (all && (index = all.indexOf(listener)) >= 0) {\n all.splice(index, 1);\n if (!all.length) {\n delete this._listeners[type];\n }\n if (typeof this._event_callback === \"function\") {\n this._event_callback(type, false);\n }\n }\n }\n }\n return this;\n};\nNode.prototype.listeners = function(type) {\n return this._listeners && this._listeners[type];\n};\nNode.prototype.publish = function(name, args) {\n var listeners = this.listeners(name);\n if (!listeners || !listeners.length) {\n return 0;\n }\n for (var l = 0; l < listeners.length; l++) {\n listeners[l].apply(this, args);\n }\n return listeners.length;\n};\nNode.prototype.trigger = function(name, args) {\n this.publish(name, args);\n return this;\n};\nvar native = Math;\nconst math = Object.create(Math);\nmath.random = function(min, max) {\n if (typeof min === \"undefined\") {\n max = 1, min = 0;\n } else if (typeof max === \"undefined\") {\n max = min, min = 0;\n }\n return min == max ? min : native.random() * (max - min) + min;\n};\nmath.wrap = function(num, min, max) {\n if (typeof min === \"undefined\") {\n max = 1, min = 0;\n } else if (typeof max === \"undefined\") {\n max = min, min = 0;\n }\n if (max > min) {\n num = (num - min) % (max - min);\n return num + (num < 0 ? max : min);\n } else {\n num = (num - max) % (min - max);\n return num + (num <= 0 ? min : max);\n }\n};\nmath.clamp = function(num, min, max) {\n if (num < min) {\n return min;\n } else if (num > max) {\n return max;\n } else {\n return num;\n }\n};\nmath.length = function(x, y) {\n return native.sqrt(x * x + y * y);\n};\nmath.rotate = math.wrap;\nmath.limit = math.clamp;\nconst isFn = function(value) {\n var str = Object.prototype.toString.call(value);\n return str === \"[object Function]\" || str === \"[object GeneratorFunction]\" || str === \"[object AsyncFunction]\";\n};\nconst isHash = function(value) {\n return Object.prototype.toString.call(value) === \"[object Object]\" && value.constructor === Object;\n};\nclass Texture {\n constructor(texture2, ratio) {\n if (typeof texture2 === \"object\") {\n this.src(texture2, ratio);\n }\n }\n pipe() {\n return new Texture(this);\n }\n /**\n * Signatures: (texture), (x, y, w, h), (w, h)\n */\n src(x, y, w, h) {\n if (typeof x === \"object\") {\n var drawable = x, ratio = y || 1;\n this._image = drawable;\n this._sx = this._dx = 0;\n this._sy = this._dy = 0;\n this._sw = this._dw = drawable.width / ratio;\n this._sh = this._dh = drawable.height / ratio;\n this.width = drawable.width / ratio;\n this.height = drawable.height / ratio;\n this.ratio = ratio;\n } else {\n if (typeof w === \"undefined\") {\n w = x, h = y;\n } else {\n this._sx = x, this._sy = y;\n }\n this._sw = this._dw = w;\n this._sh = this._dh = h;\n this.width = w;\n this.height = h;\n }\n return this;\n }\n /**\n * Signatures: (x, y, w, h), (x, y)\n */\n dest(x, y, w, h) {\n this._dx = x, this._dy = y;\n this._dx = x, this._dy = y;\n if (typeof w !== \"undefined\") {\n this._dw = w, this._dh = h;\n this.width = w, this.height = h;\n }\n return this;\n }\n draw(context, x1, y1, x2, y2, x3, y3, x4, y4) {\n var drawable = this._image;\n if (drawable === null || typeof drawable !== \"object\") {\n return;\n }\n var sx = this._sx, sy = this._sy;\n var sw = this._sw, sh = this._sh;\n var dx = this._dx, dy = this._dy;\n var dw = this._dw, dh = this._dh;\n if (typeof x3 !== \"undefined\") {\n x1 = math.clamp(x1, 0, this._sw), x2 = math.clamp(x2, 0, this._sw - x1);\n y1 = math.clamp(y1, 0, this._sh), y2 = math.clamp(y2, 0, this._sh - y1);\n sx += x1, sy += y1, sw = x2, sh = y2;\n dx = x3, dy = y3, dw = x4, dh = y4;\n } else if (typeof x2 !== \"undefined\") {\n dx = x1, dy = y1, dw = x2, dh = y2;\n } else if (typeof x1 !== \"undefined\") {\n dw = x1, dh = y1;\n }\n var ratio = this.ratio || 1;\n sx *= ratio, sy *= ratio, sw *= ratio, sh *= ratio;\n try {\n if (typeof drawable.draw === \"function\") {\n drawable.draw(context, sx, sy, sw, sh, dx, dy, dw, dh);\n } else {\n stats.draw++;\n context.drawImage(drawable, sx, sy, sw, sh, dx, dy, dw, dh);\n }\n } catch (ex) {\n if (!drawable._draw_failed) {\n console.log(\"Unable to draw: \", drawable);\n console.log(ex);\n drawable._draw_failed = true;\n }\n }\n }\n}\nvar NO_TEXTURE = new class extends Texture {\n constructor() {\n super();\n __publicField(this, \"pipe\", function() {\n return this;\n });\n __publicField(this, \"src\", function() {\n return this;\n });\n __publicField(this, \"dest\", function() {\n return this;\n });\n __publicField(this, \"draw\", function() {\n });\n this.x = this.y = this.width = this.height = 0;\n }\n}();\nvar NO_SELECTION = new Selection(NO_TEXTURE);\nfunction preloadImage(src) {\n console.log(\"Loading image: \" + src);\n return new Promise(function(resolve, reject) {\n const img = new Image();\n img.onload = function() {\n console.log(\"Image loaded: \" + src);\n resolve(img);\n };\n img.onerror = function(error) {\n console.log(\"Loading failed: \" + src);\n reject(error);\n };\n img.src = src;\n });\n}\nvar _atlases_map = {};\nvar _atlases_arr = [];\nconst atlas = async function(def) {\n var atlas2 = isFn(def.draw) ? def : new Atlas(def);\n if (def.name) {\n _atlases_map[def.name] = atlas2;\n }\n _atlases_arr.push(atlas2);\n deprecated(def, \"imagePath\");\n deprecated(def, \"imageRatio\");\n var url = def.imagePath;\n var ratio = def.imageRatio || 1;\n if (\"string\" === typeof def.image) {\n url = def.image;\n } else if (isHash(def.image)) {\n url = def.image.src || def.image.url;\n ratio = def.image.ratio || ratio;\n }\n if (url) {\n const image2 = await preloadImage(url);\n atlas2.src(image2, ratio);\n }\n return atlas2;\n};\nclass Atlas extends Texture {\n constructor(def) {\n super();\n var atlas2 = this;\n deprecated(def, \"filter\");\n deprecated(def, \"cutouts\");\n deprecated(def, \"sprites\");\n deprecated(def, \"factory\");\n var map = def.map || def.filter;\n var ppu = def.ppu || def.ratio || 1;\n var trim = def.trim || 0;\n var textures = def.textures;\n var factory = def.factory;\n var cutouts = def.cutouts || def.sprites;\n function make(def2) {\n if (!def2 || isFn(def2.draw)) {\n return def2;\n }\n def2 = Object.assign({}, def2);\n if (isFn(map)) {\n def2 = map(def2);\n }\n if (ppu != 1) {\n def2.x *= ppu, def2.y *= ppu;\n def2.width *= ppu, def2.height *= ppu;\n def2.top *= ppu, def2.bottom *= ppu;\n def2.left *= ppu, def2.right *= ppu;\n }\n if (trim != 0) {\n def2.x += trim, def2.y += trim;\n def2.width -= 2 * trim, def2.height -= 2 * trim;\n def2.top -= trim, def2.bottom -= trim;\n def2.left -= trim, def2.right -= trim;\n }\n var texture2 = atlas2.pipe();\n texture2.top = def2.top, texture2.bottom = def2.bottom;\n texture2.left = def2.left, texture2.right = def2.right;\n texture2.src(def2.x, def2.y, def2.width, def2.height);\n return texture2;\n }\n function find(query) {\n if (textures) {\n if (isFn(textures)) {\n return textures(query);\n } else if (isHash(textures)) {\n return textures[query];\n }\n }\n if (cutouts) {\n var result = null, n = 0;\n for (var i = 0; i < cutouts.length; i++) {\n if (string.startsWith(cutouts[i].name, query)) {\n if (n === 0) {\n result = cutouts[i];\n } else if (n === 1) {\n result = [result, cutouts[i]];\n } else {\n result.push(cutouts[i]);\n }\n n++;\n }\n }\n if (n === 0 && isFn(factory)) {\n result = function(subquery) {\n return factory(query + (subquery ? subquery : \"\"));\n };\n }\n return result;\n }\n }\n this.select = function(query) {\n if (!query) {\n return new Selection(this.pipe());\n }\n var found = find(query);\n if (found) {\n return new Selection(found, find, make);\n }\n };\n }\n}\nfunction Selection(result, find, make) {\n function link(result2, subquery) {\n if (!result2) {\n return NO_TEXTURE;\n } else if (isFn(result2.draw)) {\n return result2;\n } else if (isHash(result2) && \"number\" === typeof result2.width && \"number\" === typeof result2.height && isFn(make)) {\n return make(result2);\n } else if (isHash(result2) && \"undefined\" !== typeof subquery) {\n return link(result2[subquery]);\n } else if (isFn(result2)) {\n return link(result2(subquery));\n } else if (Array.isArray(result2)) {\n return link(result2[0]);\n } else if (\"string\" === typeof result2 && isFn(find)) {\n return link(find(result2));\n }\n }\n this.one = function(subquery) {\n return link(result, subquery);\n };\n this.array = function(arr) {\n var array = Array.isArray(arr) ? arr : [];\n if (Array.isArray(result)) {\n for (var i = 0; i < result.length; i++) {\n array[i] = link(result[i]);\n }\n } else {\n array[0] = link(result);\n }\n return array;\n };\n}\nconst texture = function(query) {\n if (!(\"string\" === typeof query)) {\n return new Selection(query);\n }\n var result = null, atlas2, i;\n if ((i = query.indexOf(\":\")) > 0 && query.length > i + 1) {\n atlas2 = _atlases_map[query.slice(0, i)];\n result = atlas2 && atlas2.select(query.slice(i + 1));\n }\n if (!result && (atlas2 = _atlases_map[query])) {\n result = atlas2.select();\n }\n for (i = 0; !result && i < _atlases_arr.length; i++) {\n result = _atlases_arr[i].select(query);\n }\n if (!result) {\n console.error(\"Texture not found: \" + query);\n result = NO_SELECTION;\n }\n return result;\n};\nfunction deprecated(hash, name, msg) {\n if (name in hash)\n console.log(msg ? msg.replace(\"%name\", name) : \"'\" + name + \"' field of texture atlas is deprecated.\");\n}\nconst canvas = function(type, attributes, plotter) {\n if (typeof type === \"string\") {\n if (typeof attributes === \"object\")\n ;\n else {\n if (typeof attributes === \"function\") {\n plotter = attributes;\n }\n attributes = {};\n }\n } else {\n if (typeof type === \"function\") {\n plotter = type;\n }\n attributes = {};\n type = \"2d\";\n }\n var canvas2 = document.createElement(\"canvas\");\n var context = canvas2.getContext(type, attributes);\n var texture2 = new Texture(canvas2);\n texture2.context = function() {\n return context;\n };\n texture2.size = function(width, height, ratio) {\n ratio = ratio || 1;\n canvas2.width = width * ratio;\n canvas2.height = height * ratio;\n this.src(canvas2, ratio);\n return this;\n };\n texture2.canvas = function(fn) {\n if (typeof fn === \"function\") {\n fn.call(this, context);\n } else if (typeof fn === \"undefined\" && typeof plotter === \"function\") {\n plotter.call(this, context);\n }\n return this;\n };\n if (typeof plotter === \"function\") {\n plotter.call(texture2, context);\n }\n return texture2;\n};\nconst PIXEL_RATIO = window.devicePixelRatio || 1;\nlet M;\nfunction memoizeDraw(callback, memoKey = () => null) {\n let lastRatio = 0;\n let lastSelection = void 0;\n let texture2 = Stage.canvas();\n let sprite2 = Stage.sprite();\n let first = true;\n sprite2.tick(function() {\n let m = this._parent.matrix();\n if (first) {\n first = false;\n if (!(m = M)) {\n return;\n }\n }\n M = m;\n let newRatio = Math.max(Math.abs(m.a), Math.abs(m.b));\n let rationChange = lastRatio / newRatio;\n if (lastRatio === 0 || rationChange > 1.25 || rationChange < 0.8) {\n const newSelection = memoKey();\n if (lastSelection !== newSelection) {\n lastRatio = newRatio;\n callback(2.5 * newRatio / PIXEL_RATIO, texture2, sprite2);\n sprite2.texture(texture2);\n sprite2.__timestamp = Date.now();\n }\n }\n }, false);\n return sprite2;\n}\nclass Mouse {\n constructor() {\n __publicField(this, \"x\", 0);\n __publicField(this, \"y\", 0);\n __publicField(this, \"ratio\", 1);\n __publicField(this, \"stage\");\n __publicField(this, \"elem\");\n __publicField(this, \"clicklist\", []);\n __publicField(this, \"cancellist\", []);\n __publicField(this, \"handleStart\", (event) => {\n event.preventDefault();\n this.locate(event);\n this.publish(event.type, event);\n this.lookup(\"click\", this.clicklist);\n this.lookup(\"mousecancel\", this.cancellist);\n });\n __publicField(this, \"handleMove\", (event) => {\n event.preventDefault();\n this.locate(event);\n this.publish(event.type, event);\n });\n __publicField(this, \"handleEnd\", (event) => {\n event.preventDefault();\n this.publish(event.type, event);\n if (this.clicklist.length) {\n this.publish(\"click\", event, this.clicklist);\n }\n this.cancellist.length = 0;\n });\n __publicField(this, \"handleCancel\", (event) => {\n if (this.cancellist.length) {\n this.publish(\"mousecancel\", event, this.cancellist);\n }\n this.clicklist.length = 0;\n });\n __publicField(this, \"toString\", function() {\n return (this.x | 0) + \"x\" + (this.y | 0);\n });\n __publicField(this, \"locate\", function(event) {\n const elem = this.elem;\n let x;\n let y;\n if (event.touches && event.touches.length) {\n x = event.touches[0].clientX;\n y = event.touches[0].clientY;\n } else {\n x = event.clientX;\n y = event.clientY;\n }\n var rect = elem.getBoundingClientRect();\n x -= rect.left;\n y -= rect.top;\n x -= elem.clientLeft | 0;\n y -= elem.clientTop | 0;\n this.x = x * this.ratio;\n this.y = y * this.ratio;\n });\n __publicField(this, \"lookup\", function(type, collect) {\n this.type = type;\n this.root = this.stage;\n this.event = null;\n collect.length = 0;\n this.collect = collect;\n this.root.visit({\n reverse: true,\n visible: true,\n start: this.visitStart,\n end: this.visitEnd\n }, this);\n });\n __publicField(this, \"publish\", function(type, event, targets) {\n this.type = type;\n this.root = this.stage;\n this.event = event;\n this.collect = false;\n this.timeStamp = Date.now();\n if (type !== \"mousemove\" && type !== \"touchmove\") {\n console.log(this.type + \" \" + this);\n }\n if (targets) {\n while (targets.length)\n if (this.visitEnd(targets.shift()))\n break;\n targets.length = 0;\n } else {\n this.root.visit({\n reverse: true,\n visible: true,\n start: this.visitStart,\n end: this.visitEnd\n }, this);\n }\n });\n __publicField(this, \"visitStart\", (node) => {\n return !node._flag(this.type);\n });\n __publicField(this, \"visitEnd\", (node) => {\n rel.raw = this.event;\n rel.type = this.type;\n rel.timeStamp = this.timeStamp;\n rel.abs.x = this.x;\n rel.abs.y = this.y;\n var listeners = node.listeners(this.type);\n if (!listeners) {\n return;\n }\n node.matrix().inverse().map(this, rel);\n if (!(node === this.root || node.attr(\"spy\") || node.hitTest(rel))) {\n return;\n }\n if (this.collect) {\n this.collect.push(node);\n }\n if (this.event) {\n var cancel = false;\n for (var l = 0; l < listeners.length; l++) {\n cancel = listeners[l].call(node, rel) ? true : cancel;\n }\n return cancel;\n }\n });\n }\n mount(stage, elem) {\n this.stage = stage;\n this.elem = elem;\n this.ratio = stage.viewport().ratio || 1;\n stage.on(\"viewport\", (size) => {\n this.ratio = size.ratio ?? this.ratio;\n });\n elem.addEventListener(\"touchstart\", this.handleStart);\n elem.addEventListener(\"touchend\", this.handleEnd);\n elem.addEventListener(\"touchmove\", this.handleMove);\n elem.addEventListener(\"touchcancel\", this.handleCancel);\n elem.addEventListener(\"mousedown\", this.handleStart);\n elem.addEventListener(\"mouseup\", this.handleEnd);\n elem.addEventListener(\"mousemove\", this.handleMove);\n document.addEventListener(\"mouseup\", this.handleCancel);\n window.addEventListener(\"blur\", this.handleCancel);\n return this;\n }\n unmount() {\n const elem = this.elem;\n elem.removeEventListener(\"touchstart\", this.handleStart);\n elem.removeEventListener(\"touchend\", this.handleEnd);\n elem.removeEventListener(\"touchmove\", this.handleMove);\n elem.removeEventListener(\"touchcancel\", this.handleCancel);\n elem.removeEventListener(\"mousedown\", this.handleStart);\n elem.removeEventListener(\"mouseup\", this.handleEnd);\n elem.removeEventListener(\"mousemove\", this.handleMove);\n document.removeEventListener(\"mouseup\", this.handleCancel);\n window.removeEventListener(\"blur\", this.handleCancel);\n return this;\n }\n}\n__publicField(Mouse, \"CLICK\", \"click\");\n__publicField(Mouse, \"START\", \"touchstart mousedown\");\n__publicField(Mouse, \"MOVE\", \"touchmove mousemove\");\n__publicField(Mouse, \"END\", \"touchend mouseup\");\n__publicField(Mouse, \"CANCEL\", \"touchcancel mousecancel\");\nvar rel = {}, abs = {};\ndefineValue(rel, \"clone\", function(obj) {\n obj = obj || {}, obj.x = this.x, obj.y = this.y;\n return obj;\n});\ndefineValue(rel, \"toString\", function() {\n return (this.x | 0) + \"x\" + (this.y | 0) + \" (\" + this.abs + \")\";\n});\ndefineValue(rel, \"abs\", abs);\ndefineValue(abs, \"clone\", function(obj) {\n obj = obj || {}, obj.x = this.x, obj.y = this.y;\n return obj;\n});\ndefineValue(abs, \"toString\", function() {\n return (this.x | 0) + \"x\" + (this.y | 0);\n});\nfunction defineValue(obj, name, value) {\n Object.defineProperty(obj, name, {\n value\n });\n}\nfunction IDENTITY(x) {\n return x;\n}\nvar _cache = {};\nvar _modes = {};\nvar _easings = {};\nclass Easing {\n static get(token, fallback = IDENTITY) {\n if (typeof token === \"function\") {\n return token;\n }\n if (typeof token !== \"string\") {\n return fallback;\n }\n var fn = _cache[token];\n if (fn) {\n return fn;\n }\n var match = /^(\\w+)(-(in|out|in-out|out-in))?(\\((.*)\\))?$/i.exec(token);\n if (!match || !match.length) {\n return fallback;\n }\n var easing = _easings[match[1]];\n var mode = _modes[match[3]];\n var params = match[5];\n if (easing && easing.fn) {\n fn = easing.fn;\n } else if (easing && easing.fc) {\n fn = easing.fc.apply(easing.fc, params && params.replace(/\\s+/, \"\").split(\",\"));\n } else {\n fn = fallback;\n }\n if (mode) {\n fn = mode.fn(fn);\n }\n _cache[token] = fn;\n return fn;\n }\n static add(data) {\n var names = (data.name || data.mode).split(/\\s+/);\n for (var i = 0; i < names.length; i++) {\n var name = names[i];\n if (name) {\n (data.name ? _easings : _modes)[name] = data;\n }\n }\n }\n}\nEasing.add({\n mode: \"in\",\n fn: function(f) {\n return f;\n }\n});\nEasing.add({\n mode: \"out\",\n fn: function(f) {\n return function(t) {\n return 1 - f(1 - t);\n };\n }\n});\nEasing.add({\n mode: \"in-out\",\n fn: function(f) {\n return function(t) {\n return t < 0.5 ? f(2 * t) / 2 : 1 - f(2 * (1 - t)) / 2;\n };\n }\n});\nEasing.add({\n mode: \"out-in\",\n fn: function(f) {\n return function(t) {\n return t < 0.5 ? 1 - f(2 * (1 - t)) / 2 : f(2 * t) / 2;\n };\n }\n});\nEasing.add({\n name: \"linear\",\n fn: function(t) {\n return t;\n }\n});\nEasing.add({\n name: \"quad\",\n fn: function(t) {\n return t * t;\n }\n});\nEasing.add({\n name: \"cubic\",\n fn: function(t) {\n return t * t * t;\n }\n});\nEasing.add({\n name: \"quart\",\n fn: function(t) {\n return t * t * t * t;\n }\n});\nEasing.add({\n name: \"quint\",\n fn: function(t) {\n return t * t * t * t * t;\n }\n});\nEasing.add({\n name: \"sin sine\",\n fn: function(t) {\n return 1 - Math.cos(t * Math.PI / 2);\n }\n});\nEasing.add({\n name: \"exp expo\",\n fn: function(t) {\n return t == 0 ? 0 : Math.pow(2, 10 * (t - 1));\n }\n});\nEasing.add({\n name: \"circle circ\",\n fn: function(t) {\n return 1 - Math.sqrt(1 - t * t);\n }\n});\nEasing.add({\n name: \"bounce\",\n fn: function(t) {\n return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + 0.75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375 : 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;\n }\n});\nEasing.add({\n name: \"poly\",\n fc: function(e) {\n return function(t) {\n return Math.pow(t, e);\n };\n }\n});\nEasing.add({\n name: \"elastic\",\n fc: function(a, p) {\n p = p || 0.45;\n a = a || 1;\n var s = p / (2 * Math.PI) * Math.asin(1 / a);\n return function(t) {\n return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p);\n };\n }\n});\nEasing.add({\n name: \"back\",\n fc: function(s) {\n s = typeof s !== \"undefined\" ? s : 1.70158;\n return function(t) {\n return t * t * ((s + 1) * t - s);\n };\n }\n});\nNode.prototype.tween = function(a, b, c) {\n let options;\n if (typeof a === \"object\" && a !== null) {\n options = a;\n } else if (typeof a === \"number\" && typeof b === \"number\") {\n options = {\n duration: a,\n delay: b,\n append: c\n };\n } else if (typeof a === \"number\") {\n options = {\n duration: a,\n delay: 0,\n append: b\n };\n } else {\n options = {\n duration: 400,\n delay: 0,\n append: a\n };\n }\n if (!this._tweens) {\n this._tweens = [];\n var ticktime = 0;\n this.tick(function(elapsed, now, last) {\n if (!this._tweens.length) {\n return false;\n }\n var ignore = ticktime != last;\n ticktime = now;\n if (ignore) {\n return true;\n }\n var head = this._tweens[0];\n var ended = head.tick(this, elapsed, now, last);\n if (ended) {\n if (head === this._tweens[0]) {\n this._tweens.shift();\n }\n var next = head.finish();\n if (next) {\n this._tweens.unshift(next);\n }\n }\n return true;\n }, true);\n }\n this.touch();\n if (!options.append) {\n this._tweens.length = 0;\n }\n var tween = new Tween(this, options);\n this._tweens.push(tween);\n return tween;\n};\nclass Tween {\n constructor(owner, options = {}) {\n __publicField(this, \"_ending\", []);\n this._end = {};\n this._duration = options.duration || 400;\n this._delay = options.delay || 0;\n this._owner = owner;\n this._time = 0;\n }\n // @internal\n tick(node, elapsed, now, last) {\n this._time += elapsed;\n if (this._time < this._delay) {\n return;\n }\n var time = this._time - this._delay;\n if (!this._start) {\n this._start = {};\n for (var key in this._end) {\n this._start[key] = this._owner.pin(key);\n }\n }\n var p = Math.min(time / this._duration, 1);\n var ended = p >= 1;\n if (typeof this._easing == \"function\") {\n p = this._easing(p);\n }\n var q = 1 - p;\n for (var key in this._end) {\n this._owner.pin(key, this._start[key] * q + this._end[key] * p);\n }\n return ended;\n }\n // @internal\n finish() {\n this._ending.forEach((callback) => {\n try {\n callback.call(this._owner);\n } catch (e) {\n console.error(e);\n }\n });\n return this._next;\n }\n tween(duration, delay) {\n return this._next = new Tween(this._owner, duration, delay);\n }\n duration(duration) {\n this._duration = duration;\n return this;\n }\n delay(delay) {\n this._delay = delay;\n return this;\n }\n ease(easing) {\n this._easing = Easing.get(easing);\n return this;\n }\n done(fn) {\n this._ending.push(fn);\n return this;\n }\n hide() {\n this._ending.push(function() {\n this.hide();\n });\n this._hide = true;\n return this;\n }\n remove() {\n this._ending.push(function() {\n this.remove();\n });\n this._remove = true;\n return this;\n }\n pin(a, b) {\n if (typeof a === \"object\") {\n for (var attr in a) {\n pinning(this._owner, this._end, attr, a[attr]);\n }\n } else if (typeof b !== \"undefined\") {\n pinning(this._owner, this._end, a, b);\n }\n return this;\n }\n /**\n * @deprecated Use .done(fn) instead.\n */\n then(fn) {\n this.done(fn);\n return this;\n }\n /**\n * @deprecated this doesn't do anything anymore, call tween on the node instead.\n */\n clear(forward) {\n return this;\n }\n}\nfunction pinning(node, map, key, value) {\n if (typeof node.pin(key) === \"number\") {\n map[key] = value;\n } else if (typeof node.pin(key + \"X\") === \"number\" && typeof node.pin(key + \"Y\") === \"number\") {\n map[key + \"X\"] = value;\n map[key + \"Y\"] = value;\n }\n}\nPin._add_shortcuts(Tween.prototype);\nconst _stages = [];\nconst pause = function() {\n for (let i = _stages.length - 1; i >= 0; i--) {\n _stages[i].pause();\n }\n};\nconst resume = function() {\n for (let i = _stages.length - 1; i >= 0; i--) {\n _stages[i].resume();\n }\n};\nconst mount = function(configs = {}) {\n let root = new Root();\n root.mount(configs);\n root.mouse = new Mouse().mount(root, root.dom);\n return root;\n};\nclass Root extends Node {\n constructor() {\n super();\n __publicField(this, \"canvas\", null);\n __publicField(this, \"dom\", null);\n __publicField(this, \"context\", null);\n __publicField(this, \"pixelWidth\", -1);\n __publicField(this, \"pixelHeight\", -1);\n __publicField(this, \"pixelRatio\", 1);\n __publicField(this, \"drawingWidth\", 0);\n __publicField(this, \"drawingHeight\", 0);\n __publicField(this, \"mounted\", false);\n __publicField(this, \"paused\", false);\n __publicField(this, \"sleep\", false);\n __publicField(this, \"mount\", (configs = {}) => {\n if (typeof configs.canvas === \"string\") {\n this.canvas = document.getElementById(configs.canvas);\n } else if (configs.canvas instanceof HTMLCanvasElement) {\n this.canvas = configs.canvas;\n } else if (configs.canvas)\n ;\n if (!this.canvas) {\n this.canvas = document.getElementById(\"cutjs\") || document.getElementById(\"stage\");\n }\n if (!this.canvas) {\n console.log(\"Creating Canvas...\");\n this.canvas = document.createElement(\"canvas\");\n Object.assign(this.canvas.style, {\n position: \"absolute\",\n display: \"block\",\n top: \"0\",\n left: \"0\",\n bottom: \"0\",\n right: \"0\",\n width: \"100%\",\n height: \"100%\"\n });\n let body = document.body;\n body.insertBefore(this.canvas, body.firstChild);\n }\n this.dom = this.canvas;\n this.context = this.canvas.getContext(\"2d\");\n this.devicePixelRatio = window.devicePixelRatio || 1;\n this.backingStoreRatio = this.context.webkitBackingStorePixelRatio || this.context.mozBackingStorePixelRatio || this.context.msBackingStorePixelRatio || this.context.oBackingStorePixelRatio || this.context.backingStorePixelRatio || 1;\n this.pixelRatio = this.devicePixelRatio / this.backingStoreRatio;\n this.mounted = true;\n _stages.push(this);\n this.requestFrame(this.onFrame);\n });\n __publicField(this, \"frameRequested\", false);\n __publicField(this, \"requestFrame\", () => {\n if (!this.frameRequested) {\n this.frameRequested = true;\n requestAnimationFrame(this.onFrame);\n }\n });\n __publicField(this, \"lastTime\", 0);\n __publicField(this, \"_mo_touch\", null);\n // monitor touch\n __publicField(this, \"onFrame\", (now) => {\n this.frameRequested = false;\n if (!this.mounted) {\n return;\n }\n this.requestFrame();\n const newPixelWidth = this.canvas.clientWidth;\n const newPixelHeight = this.canvas.clientHeight;\n if (this.pixelWidth !== newPixelWidth || this.pixelHeight !== newPixelHeight) {\n this.pixelWidth = newPixelWidth;\n this.pixelHeight = newPixelHeight;\n this.drawingWidth = newPixelWidth * this.pixelRatio;\n this.drawingHeight = newPixelHeight * this.pixelRatio;\n if (this.canvas.width !== this.drawingWidth || this.canvas.height !== this.drawingHeight) {\n this.canvas.width = this.drawingWidth;\n this.canvas.height = this.drawingHeight;\n console.log(\"Resize: [\" + this.drawingWidth + \", \" + this.drawingHeight + \"] = \" + this.pixelRatio + \" x [\" + this.pixelWidth + \", \" + this.pixelHeight + \"]\");\n this.viewport({\n width: this.drawingWidth,\n height: this.drawingHeight,\n ratio: this.pixelRatio\n });\n }\n }\n let last = this.lastTime || now;\n let elapsed = now - last;\n if (!this.mounted || this.paused || this.sleep) {\n return;\n }\n this.lastTime = now;\n let tickRequest = this._tick(elapsed, now, last);\n if (this._mo_touch != this._ts_touch) {\n this._mo_touch = this._ts_touch;\n this.sleep = false;\n if (this.drawingWidth > 0 && this.drawingHeight > 0) {\n this.context.setTransform(1, 0, 0, 1, 0, 0);\n this.context.clearRect(0, 0, this.drawingWidth, this.drawingHeight);\n this.render(this.context);\n }\n } else if (tickRequest) {\n this.sleep = false;\n } else {\n this.sleep = true;\n }\n stats.fps = elapsed ? 1e3 / elapsed : 0;\n });\n this.label(\"Root\");\n }\n resume() {\n if (this.sleep || this.paused) {\n this.requestFrame();\n }\n this.paused = false;\n this.sleep = false;\n this.publish(\"resume\");\n return this;\n }\n pause() {\n if (!this.paused) {\n this.publish(\"pause\");\n }\n this.paused = true;\n return this;\n }\n touch() {\n if (this.sleep || this.paused) {\n this.requestFrame();\n }\n this.sleep = false;\n return Node.prototype.touch();\n }\n unmount() {\n var _a;\n this.mounted = false;\n let index = _stages.indexOf(this);\n if (index >= 0) {\n _stages.splice(index, 1);\n }\n (_a = this.mouse) == null ? void 0 : _a.unmount();\n return this;\n }\n background(color) {\n this.dom.style.backgroundColor = color;\n return this;\n }\n /**\n * Set/Get viewport.\n * This is used along with viewbox to determine the scale and position of the viewbox within the viewport.\n * Viewport is the size of the container, for example size of the canvas element.\n * Viewbox is provided by the user, and is the ideal size of the content.\n */\n viewport(width, height, ratio) {\n if (typeof width === \"undefined\") {\n return Object.assign({}, this._viewport);\n }\n if (typeof width === \"object\") {\n const options = width;\n width = options.width;\n height = options.height;\n ratio = options.ratio;\n }\n this._viewport = {\n width,\n height,\n ratio: ratio || 1\n };\n this.viewbox();\n let data = Object.assign({}, this._viewport);\n this.visit({\n start: function(node) {\n if (!node._flag(\"viewport\")) {\n return true;\n }\n node.publish(\"viewport\", [data]);\n }\n });\n return this;\n }\n /**\n * Set viewbox.\n * \n * @param {mode} string - One of: 'in-pad' (like css object-fit: 'contain'), 'in', 'out-crop' (like css object-fit: 'cover'), 'out'\n */\n // TODO: static/fixed viewbox\n // TODO: use css object-fit values\n viewbox(width, height, mode) {\n if (typeof width === \"number\" && typeof height === \"number\") {\n this._viewbox = {\n width,\n height,\n mode\n };\n } else if (typeof width === \"object\" && width !== null) {\n this._viewbox = {\n ...width\n };\n }\n this.rescale();\n return this;\n }\n camera(matrix) {\n this._camera = matrix;\n this.rescale();\n return this;\n }\n rescale() {\n let viewbox = this._viewbox;\n let viewport = this._viewport;\n let camera = this._camera;\n if (viewport && viewbox) {\n const viewportWidth = viewport.width;\n const viewportHeight = viewport.height;\n const viewboxMode = /^(in|out|in-pad|out-crop)$/.test(viewbox.mode) ? viewbox.mode : \"in-pad\";\n const viewboxWidth = viewbox.width;\n const viewboxHeight = viewbox.height;\n this.pin({\n width: viewboxWidth,\n height: viewboxHeight\n });\n this.scaleTo(viewportWidth, viewportHeight, viewboxMode);\n const viewboxX = viewbox.x || 0;\n const viewboxY = viewbox.y || 0;\n const cameraZoom = (camera == null ? void 0 : camera.a) || 1;\n const cameraX = (camera == null ? void 0 : camera.e) || 0;\n const cameraY = (camera == null ? void 0 : camera.f) || 0;\n const scaleX = this.pin(\"scaleX\");\n const scaleY = this.pin(\"scaleY\");\n this.pin(\"scaleX\", scaleX * cameraZoom);\n this.pin(\"scaleY\", scaleY * cameraZoom);\n this.pin(\"offsetX\", cameraX - viewboxX * scaleX * cameraZoom);\n this.pin(\"offsetY\", cameraY - viewboxY * scaleY * cameraZoom);\n } else if (viewport) {\n this.pin({\n width: viewport.width,\n height: viewport.height\n });\n }\n return this;\n }\n}\nconst sprite = function(frame) {\n var sprite2 = new Sprite();\n frame && sprite2.texture(frame);\n return sprite2;\n};\nSprite._super = Node;\nSprite.prototype = Object.create(Sprite._super.prototype);\nfunction Sprite() {\n Sprite._super.call(this);\n this.label(\"Sprite\");\n this._textures = [];\n this._image = null;\n}\nSprite.prototype.texture = function(frame) {\n this._image = texture(frame).one();\n this.pin(\"width\", this._image ? this._image.width : 0);\n this.pin(\"height\", this._image ? this._image.height : 0);\n this._textures[0] = this._image.pipe();\n this._textures.length = 1;\n return this;\n};\nSprite.prototype.tile = function(inner) {\n this._repeat(false, inner);\n return this;\n};\nSprite.prototype.stretch = function(inner) {\n this._repeat(true, inner);\n return this;\n};\nSprite.prototype._repeat = function(stretch, inner) {\n var self = this;\n this.untick(this._repeatTicker);\n this.tick(this._repeatTicker = function() {\n if (this._mo_stretch == this._pin._ts_transform) {\n return;\n }\n this._mo_stretch = this._pin._ts_transform;\n var width = this.pin(\"width\");\n var height = this.pin(\"height\");\n this._textures.length = repeat(this._image, width, height, stretch, inner, insert);\n });\n function insert(i, sx, sy, sw, sh, dx, dy, dw, dh) {\n var repeat2 = self._textures.length > i ? self._textures[i] : self._textures[i] = self._image.pipe();\n repeat2.src(sx, sy, sw, sh);\n repeat2.dest(dx, dy, dw, dh);\n }\n};\nfunction repeat(img, owidth, oheight, stretch, inner, insert) {\n var width = img.width;\n var height = img.height;\n var left = img.left;\n var right = img.right;\n var top = img.top;\n var bottom = img.bottom;\n left = typeof left === \"number\" && left === left ? left : 0;\n right = typeof right === \"number\" && right === right ? right : 0;\n top = typeof top === \"number\" && top === top ? top : 0;\n bottom = typeof bottom === \"number\" && bottom === bottom ? bottom : 0;\n width = width - left - right;\n height = height - top - bottom;\n if (!inner) {\n owidth = Math.max(owidth - left - right, 0);\n oheight = Math.max(oheight - top - bottom, 0);\n }\n var i = 0;\n if (top > 0 && left > 0)\n insert(i++, 0, 0, left, top, 0, 0, left, top);\n if (bottom > 0 && left > 0)\n insert(i++, 0, height + top, left, bottom, 0, oheight + top, left, bottom);\n if (top > 0 && right > 0)\n insert(i++, width + left, 0, right, top, owidth + left, 0, right, top);\n if (bottom > 0 && right > 0)\n insert(\n i++,\n width + left,\n height + top,\n right,\n bottom,\n owidth + left,\n oheight + top,\n right,\n bottom\n );\n if (stretch) {\n if (top > 0)\n insert(i++, left, 0, width, top, left, 0, owidth, top);\n if (bottom > 0)\n insert(\n i++,\n left,\n height + top,\n width,\n bottom,\n left,\n oheight + top,\n owidth,\n bottom\n );\n if (left > 0)\n insert(i++, 0, top, left, height, 0, top, left, oheight);\n if (right > 0)\n insert(\n i++,\n width + left,\n top,\n right,\n height,\n owidth + left,\n top,\n right,\n oheight\n );\n insert(i++, left, top, width, height, left, top, owidth, oheight);\n } else {\n var l = left, r = owidth, w;\n while (r > 0) {\n w = Math.min(width, r), r -= width;\n var t = top, b = oheight, h;\n while (b > 0) {\n h = Math.min(height, b), b -= height;\n insert(i++, left, top, w, h, l, t, w, h);\n if (r <= 0) {\n if (left)\n insert(i++, 0, top, left, h, 0, t, left, h);\n if (right)\n insert(i++, width + left, top, right, h, l + w, t, right, h);\n }\n t += h;\n }\n if (top)\n insert(i++, left, 0, w, top, l, 0, w, top);\n if (bottom)\n insert(i++, left, height + top, w, bottom, l, t, w, bottom);\n l += w;\n }\n }\n return i;\n}\nSprite.prototype.image = Sprite.prototype.texture;\nconst image = sprite;\nconst Image$1 = Sprite;\nconst anim = function(frames, fps) {\n var anim2 = new Anim();\n anim2.frames(frames).gotoFrame(0);\n fps && anim2.fps(fps);\n return anim2;\n};\nAnim._super = Node;\nAnim.prototype = Object.create(Anim._super.prototype);\nconst FPS = 15;\nfunction Anim() {\n Anim._super.call(this);\n this.label(\"Anim\");\n this._textures = [];\n this._fps = FPS;\n this._ft = 1e3 / this._fps;\n this._time = -1;\n this._repeat = 0;\n this._index = 0;\n this._frames = [];\n var lastTime = 0;\n this.tick(function(t, now, last) {\n if (this._time < 0 || this._frames.length <= 1) {\n return;\n }\n var ignore = lastTime != last;\n lastTime = now;\n if (ignore) {\n return true;\n }\n this._time += t;\n if (this._time < this._ft) {\n return true;\n }\n var n = this._time / this._ft | 0;\n this._time -= n * this._ft;\n this.moveFrame(n);\n if (this._repeat > 0 && (this._repeat -= n) <= 0) {\n this.stop();\n this._callback && this._callback();\n return false;\n }\n return true;\n }, false);\n}\nAnim.prototype.fps = function(fps) {\n if (typeof fps === \"undefined\") {\n return this._fps;\n }\n this._fps = fps > 0 ? fps : FPS;\n this._ft = 1e3 / this._fps;\n return this;\n};\nAnim.prototype.setFrames = function(a, b, c) {\n return this.frames(a, b, c);\n};\nAnim.prototype.frames = function(frames) {\n this._index = 0;\n this._frames = texture(frames).array();\n this.touch();\n return this;\n};\nAnim.prototype.length = function() {\n return this._frames ? this._frames.length : 0;\n};\nAnim.prototype.gotoFrame = function(frame, resize) {\n this._index = math.wrap(frame, this._frames.length) | 0;\n resize = resize || !this._textures[0];\n this._textures[0] = this._frames[this._index];\n if (resize) {\n this.pin(\"width\", this._textures[0].width);\n this.pin(\"height\", this._textures[0].height);\n }\n this.touch();\n return this;\n};\nAnim.prototype.moveFrame = function(move) {\n return this.gotoFrame(this._index + move);\n};\nAnim.prototype.repeat = function(repeat2, callback) {\n this._repeat = repeat2 * this._frames.length - 1;\n this._callback = callback;\n this.play();\n return this;\n};\nAnim.prototype.play = function(frame) {\n if (typeof frame !== \"undefined\") {\n this.gotoFrame(frame);\n this._time = 0;\n } else if (this._time < 0) {\n this._time = 0;\n }\n this.touch();\n return this;\n};\nAnim.prototype.stop = function(frame) {\n this._time = -1;\n if (typeof frame !== \"undefined\") {\n this.gotoFrame(frame);\n }\n return this;\n};\nconst string$1 = function(frames) {\n return new Str().frames(frames);\n};\nStr._super = Node;\nStr.prototype = Object.create(Str._super.prototype);\nfunction Str() {\n Str._super.call(this);\n this.label(\"String\");\n this._textures = [];\n}\nStr.prototype.setFont = function(a, b, c) {\n return this.frames(a, b, c);\n};\nStr.prototype.frames = function(frames) {\n this._textures = [];\n if (typeof frames == \"string\") {\n frames = texture(frames);\n this._item = function(value) {\n return frames.one(value);\n };\n } else if (typeof frames === \"object\") {\n this._item = function(value) {\n return frames[value];\n };\n } else if (typeof frames === \"function\") {\n this._item = frames;\n }\n return this;\n};\nStr.prototype.setValue = function(a, b, c) {\n return this.value(a, b, c);\n};\nStr.prototype.value = function(value) {\n if (typeof value === \"undefined\") {\n return this._value;\n }\n if (this._value === value) {\n return this;\n }\n this._value = value;\n if (value === null) {\n value = \"\";\n } else if (typeof value !== \"string\" && !Array.isArray(value)) {\n value = value.toString();\n }\n this._spacing = this._spacing || 0;\n var width = 0, height = 0;\n for (var i = 0; i < value.length; i++) {\n var texture2 = this._textures[i] = this._item(value[i]);\n width += i > 0 ? this._spacing : 0;\n texture2.dest(width, 0);\n width = width + texture2.width;\n height = Math.max(height, texture2.height);\n }\n this.pin(\"width\", width);\n this.pin(\"height\", height);\n this._textures.length = value.length;\n return this;\n};\nconst row = function(align) {\n return create().row(align).label(\"Row\");\n};\nNode.prototype.row = function(align) {\n this.align(\"row\", align);\n return this;\n};\nconst column = function(align) {\n return create().column(align).label(\"Row\");\n};\nNode.prototype.column = function(align) {\n this.align(\"column\", align);\n return this;\n};\nNode.prototype.align = function(type, align) {\n this._padding = this._padding || 0;\n this._spacing = this._spacing || 0;\n this.untick(this._layoutTiker);\n this.tick(this._layoutTiker = function() {\n if (this._mo_seq == this._ts_touch) {\n return;\n }\n this._mo_seq = this._ts_touch;\n var alignChildren = this._mo_seqAlign != this._ts_children;\n this._mo_seqAlign = this._ts_children;\n var width = 0, height = 0;\n var child, next = this.first(true);\n var first = true;\n while (child = next) {\n next = child.next(true);\n child.matrix(true);\n var w = child.pin(\"boxWidth\");\n var h = child.pin(\"boxHeight\");\n if (type == \"column\") {\n !first && (height += this._spacing);\n child.pin(\"offsetY\") != height && child.pin(\"offsetY\", height);\n width = Math.max(width, w);\n height = height + h;\n alignChildren && child.pin(\"alignX\", align);\n } else if (type == \"row\") {\n !first && (width += this._spacing);\n child.pin(\"offsetX\") != width && child.pin(\"offsetX\", width);\n width = width + w;\n height = Math.max(height, h);\n alignChildren && child.pin(\"alignY\", align);\n }\n first = false;\n }\n width += 2 * this._padding;\n height += 2 * this._padding;\n this.pin(\"width\") != width && this.pin(\"width\", width);\n this.pin(\"height\") != height && this.pin(\"height\", height);\n });\n return this;\n};\nconst box = function() {\n return create().box().label(\"Box\");\n};\nNode.prototype.box = function() {\n this._padding = this._padding || 0;\n this.untick(this._layoutTiker);\n this.tick(this._layoutTiker = function() {\n if (this._mo_box == this._ts_touch) {\n return;\n }\n this._mo_box = this._ts_touch;\n var width = 0, height = 0;\n var child, next = this.first(true);\n while (child = next) {\n next = child.next(true);\n child.matrix(true);\n var w = child.pin(\"boxWidth\");\n var h = child.pin(\"boxHeight\");\n width = Math.max(width, w);\n height = Math.max(height, h);\n }\n width += 2 * this._padding;\n height += 2 * this._padding;\n this.pin(\"width\") != width && this.pin(\"width\", width);\n this.pin(\"height\") != height && this.pin(\"height\", height);\n });\n return this;\n};\nconst layer = function() {\n return create().layer().label(\"Layer\");\n};\nNode.prototype.layer = function() {\n this.untick(this._layoutTiker);\n this.tick(this._layoutTiker = function() {\n var parent = this.parent();\n if (parent) {\n var width = parent.pin(\"width\");\n if (this.pin(\"width\") != width) {\n this.pin(\"width\", width);\n }\n var height = parent.pin(\"height\");\n if (this.pin(\"height\") != height) {\n this.pin(\"height\", height);\n }\n }\n }, true);\n return this;\n};\nNode.prototype.padding = function(pad) {\n this._padding = pad;\n return this;\n};\nNode.prototype.spacing = function(space) {\n this._spacing = space;\n return this;\n};\nconst Stage$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n Anim,\n Atlas,\n Image: Image$1,\n Math: math,\n Matrix,\n Mouse,\n Node,\n Pin,\n Root,\n Sprite,\n Str,\n Texture,\n Tween,\n anim,\n atlas,\n box,\n canvas,\n column,\n create,\n image,\n layer,\n math,\n memoizeDraw,\n mount,\n pause,\n resume,\n row,\n sprite,\n string: string$1,\n texture\n}, Symbol.toStringTag, { value: \"Module\" }));\nexport {\n Anim,\n Atlas,\n Image$1 as Image,\n math as Math,\n Matrix,\n Mouse,\n Node,\n Pin,\n Root,\n Sprite,\n Str,\n Texture,\n Tween,\n anim,\n atlas,\n box,\n canvas,\n column,\n create,\n Stage$1 as default,\n image,\n layer,\n math,\n memoizeDraw,\n mount,\n pause,\n resume,\n row,\n sprite,\n string$1 as string,\n texture\n};\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","export const options = function(input: T, defaults: object): T {\n if (input === null || typeof input === 'undefined') {\n // tslint:disable-next-line:no-object-literal-type-assertion\n input = {} as T;\n }\n\n const output = {...input};\n\n // tslint:disable-next-line:no-for-in\n for (const key in defaults) {\n if (defaults.hasOwnProperty(key) && typeof input[key] === 'undefined') {\n output[key] = defaults[key];\n }\n }\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n const symbols = Object.getOwnPropertySymbols(defaults);\n for (let i = 0; i < symbols.length; i++) {\n const symbol = symbols[i];\n if (defaults.propertyIsEnumerable(symbol) && typeof input[symbol] === 'undefined') {\n output[symbol] = defaults[symbol];\n }\n }\n }\n\n return output;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\nexport const math = Object.assign(Object.create(Math) as typeof Math, {\n EPSILON: 1e-9, // TODO\n\n /**\n * This function is used to ensure that a floating point number is not a NaN or\n * infinity.\n */\n isFinite: function(x: unknown): boolean {\n return (typeof x === 'number') && isFinite(x) && !isNaN(x);\n },\n\n assert: function(x: any): void {\n _ASSERT && console.assert(!math.isFinite(x), 'Invalid Number!', x);\n },\n\n /**\n * Next Largest Power of 2 Given a binary integer value x, the next largest\n * power of 2 can be computed by a SWAR algorithm that recursively \"folds\" the\n * upper bits into the lower bits. This process yields a bit vector with the\n * same most significant 1 as x, but all 1's below it. Adding 1 to that value\n * yields the next largest power of 2. For a 32-bit value:\n */\n nextPowerOfTwo: function(x: number): number {\n // TODO\n x |= (x >> 1);\n x |= (x >> 2);\n x |= (x >> 4);\n x |= (x >> 8);\n x |= (x >> 16);\n return x + 1;\n },\n\n isPowerOfTwo: function(x: number): boolean {\n return x > 0 && (x & (x - 1)) === 0;\n },\n\n mod: function(num: number, min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n if (max > min) {\n num = (num - min) % (max - min);\n return num + (num < 0 ? max : min);\n } else {\n num = (num - max) % (min - max);\n return num + (num <= 0 ? min : max);\n }\n },\n /**\n * Returns a min if num is less than min, and max if more than max, otherwise returns num.\n */\n clamp: function(num: number, min: number, max: number): number {\n if (num < min) {\n return min;\n } else if (num > max) {\n return max;\n } else {\n return num;\n }\n },\n /**\n * Returns a random number between min and max when two arguments are provided.\n * If one arg is provided between 0 to max.\n * If one arg is passed between 0 to 1.\n */\n random: function(min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n return min === max ? min : Math.random() * (max - min) + min;\n }\n});\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport interface Vec2Value {\n x: number;\n y: number;\n}\n\nexport class Vec2 {\n x: number;\n y: number;\n\n constructor(x: number, y: number);\n constructor(obj: { x: number, y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Vec2)) {\n return new Vec2(x, y);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n } else {\n this.x = x;\n this.y = y;\n }\n _ASSERT && Vec2.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = data.x;\n obj.y = data.y;\n return obj;\n }\n\n static zero(): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = 0;\n obj.y = 0;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = x;\n obj.y = y;\n return obj;\n }\n\n static clone(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(v.x, v.y);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Vec2.isValid(o), 'Invalid Vec2!', o);\n }\n\n clone(): Vec2 {\n return Vec2.clone(this);\n }\n\n /**\n * Set this vector to all zeros.\n *\n * @returns this\n */\n setZero(): Vec2 {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n set(x: number, y: number): Vec2;\n set(value: Vec2Value): Vec2;\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n // tslint:disable-next-line:typedef\n set(x, y?) {\n if (typeof x === 'object') {\n _ASSERT && Vec2.assert(x);\n this.x = x.x;\n this.y = x.y;\n } else {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n }\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setNum(x: number, y: number) {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setVec2(value: Vec2Value) {\n _ASSERT && Vec2.assert(value);\n this.x = value.x;\n this.y = value.y;\n\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use setCombine or setMul\n */\n wSet(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.setCombine(a, v, b, w);\n } else {\n return this.setMul(a, v);\n }\n }\n\n /**\n * Set linear combination of v and w: `a * v + b * w`\n */\n setCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x = x;\n this.y = y;\n return this;\n }\n\n setMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Add a vector to this vector.\n *\n * @returns this\n */\n add(w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x += w.x;\n this.y += w.y;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use addCombine or addMul\n */\n wAdd(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.addCombine(a, v, b, w);\n } else {\n return this.addMul(a, v);\n }\n }\n\n /**\n * Add linear combination of v and w: `a * v + b * w`\n */\n addCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x += x;\n this.y += y;\n return this;\n }\n\n addMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x += x;\n this.y += y;\n return this;\n }\n\n /**\n * @deprecated Use subCombine or subMul\n */\n wSub(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.subCombine(a, v, b, w);\n } else {\n return this.subMul(a, v);\n }}\n\n /**\n * Subtract linear combination of v and w: `a * v + b * w`\n */\n subCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n subMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n /**\n * Subtract a vector from this vector\n *\n * @returns this\n */\n sub(w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x -= w.x;\n this.y -= w.y;\n return this;\n }\n\n /**\n * Multiply this vector by a scalar.\n *\n * @returns this\n */\n mul(m: number): Vec2 {\n _ASSERT && Math.assert(m);\n this.x *= m;\n this.y *= m;\n return this;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n length(): number {\n return Vec2.lengthOf(this);\n }\n\n /**\n * Get the length squared.\n */\n lengthSquared(): number {\n return Vec2.lengthSquared(this);\n }\n\n /**\n * Convert this vector into a unit vector.\n *\n * @returns old length\n */\n normalize(): number {\n const length = this.length();\n if (length < Math.EPSILON) {\n return 0.0;\n }\n const invLength = 1.0 / length;\n this.x *= invLength;\n this.y *= invLength;\n return length;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n static lengthOf(v: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n return Math.sqrt(v.x * v.x + v.y * v.y);\n }\n\n /**\n * Get the length squared.\n */\n static lengthSquared(v: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n return v.x * v.x + v.y * v.y;\n }\n\n static distance(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n static distanceSquared(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return dx * dx + dy * dy;\n }\n\n static areEqual(v: Vec2Value, w: Vec2Value): boolean {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v === w || typeof w === 'object' && w !== null && v.x === w.x && v.y === w.y;\n }\n\n /**\n * Get the skew vector such that dot(skew_vec, other) == cross(vec, other)\n */\n static skew(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.y, v.x);\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.x + v.y * w.y;\n }\n\n static cross(v: Vec2Value, w: Vec2Value): number;\n static cross(v: Vec2Value, w: number): Vec2;\n static cross(v: number, w: Vec2Value): Vec2;\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n *\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n // tslint:disable-next-line:typedef\n static cross(v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n\n } else {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static crossVec2Vec2(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossVec2Num(v: Vec2Value, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossNumVec2(v: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n }\n\n static addCross(a: Vec2Value, v: Vec2Value, w: number): Vec2;\n static addCross(a: Vec2Value, v: number, w: Vec2Value): Vec2;\n /**\n * Returns `a + (v x w)`\n */\n // tslint:disable-next-line:typedef\n static addCross(a, v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n _ASSERT && console.assert(false);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossVec2Num(a: Vec2Value, v: Vec2Value, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossNumVec2(a: Vec2Value, v: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n static add(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x + w.x, v.y + w.y);\n }\n\n /** @internal @deprecated */\n static wAdd(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return Vec2.combine(a, v, b, w);\n } else {\n return Vec2.mulNumVec2(a, v);\n }\n }\n\n static combine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n return Vec2.zero().setCombine(a, v, b, w);\n }\n\n static sub(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x - w.x, v.y - w.y);\n }\n\n static mul(a: Vec2Value, b: number): Vec2;\n static mul(a: number, b: Vec2Value): Vec2;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (typeof a === 'object') {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n\n } else if (typeof b === 'object') {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n }\n\n static mulVec2Num(a: Vec2Value, b: number): Vec2 {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n }\n\n static mulNumVec2(a: number, b: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n\n neg(): Vec2 {\n this.x = -this.x;\n this.y = -this.y;\n return this;\n }\n\n static neg(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.x, -v.y);\n }\n\n static abs(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Math.abs(v.x), Math.abs(v.y));\n }\n\n static mid(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo((v.x + w.x) * 0.5, (v.y + w.y) * 0.5);\n }\n\n static upper(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.max(v.x, w.x), Math.max(v.y, w.y));\n }\n\n static lower(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.min(v.x, w.x), Math.min(v.y, w.y));\n }\n\n clamp(max: number): Vec2 {\n const lengthSqr = this.x * this.x + this.y * this.y;\n if (lengthSqr > max * max) {\n const scale = max / Math.sqrt(lengthSqr);\n this.x *= scale;\n this.y *= scale;\n }\n return this;\n }\n\n static clamp(v: Vec2Value, max: number): Vec2 {\n const r = Vec2.neo(v.x, v.y);\n r.clamp(max);\n return r;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static scaleFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x * x, v.y * y);\n };\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static translateFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x + x, v.y + y);\n };\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../common/Math';\nimport { Vec2, Vec2Value } from '../common/Vec2';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n */\nexport interface RayCastInput {\n p1: Vec2;\n p2: Vec2;\n maxFraction: number;\n}\n\nexport type RayCastCallback = (subInput: RayCastInput, id: number) => number;\n\n/**\n * Ray-cast output data. The ray hits at `p1 + fraction * (p2 - p1)`,\n * where `p1` and `p2` come from RayCastInput.\n */\nexport interface RayCastOutput {\n normal: Vec2;\n fraction: number;\n}\n\nexport class AABB {\n lowerBound: Vec2;\n upperBound: Vec2;\n\n constructor(lower?: Vec2Value, upper?: Vec2Value) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof AABB)) {\n return new AABB(lower, upper);\n }\n\n this.lowerBound = Vec2.zero();\n this.upperBound = Vec2.zero();\n\n if (typeof lower === 'object') {\n this.lowerBound.setVec2(lower);\n }\n if (typeof upper === 'object') {\n this.upperBound.setVec2(upper);\n } else if (typeof lower === 'object') {\n this.upperBound.setVec2(lower);\n }\n }\n\n /**\n * Verify that the bounds are sorted.\n */\n isValid(): boolean {\n return AABB.isValid(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.lowerBound) && Vec2.isValid(obj.upperBound) && Vec2.sub(obj.upperBound, obj.lowerBound).lengthSquared() >= 0;\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!AABB.isValid(o), 'Invalid AABB!', o);\n }\n\n /**\n * Get the center of the AABB.\n */\n getCenter(): Vec2 {\n return Vec2.neo((this.lowerBound.x + this.upperBound.x) * 0.5, (this.lowerBound.y + this.upperBound.y) * 0.5);\n }\n\n /**\n * Get the extents of the AABB (half-widths).\n */\n getExtents(): Vec2 {\n return Vec2.neo((this.upperBound.x - this.lowerBound.x) * 0.5, (this.upperBound.y - this.lowerBound.y) * 0.5);\n }\n\n /**\n * Get the perimeter length.\n */\n getPerimeter(): number {\n return 2.0 * (this.upperBound.x - this.lowerBound.x + this.upperBound.y - this.lowerBound.y);\n }\n\n /**\n * Combine one or two AABB into this one.\n */\n combine(a: AABB, b?: AABB): void {\n b = b || this;\n\n const lowerA = a.lowerBound;\n const upperA = a.upperBound;\n const lowerB = b.lowerBound;\n const upperB = b.upperBound;\n\n const lowerX = Math.min(lowerA.x, lowerB.x);\n const lowerY = Math.min(lowerA.y, lowerB.y);\n const upperX = Math.max(upperB.x, upperA.x);\n const upperY = Math.max(upperB.y, upperA.y);\n\n this.lowerBound.setNum(lowerX, lowerY);\n this.upperBound.setNum(upperX, upperY);\n }\n\n combinePoints(a: Vec2Value, b: Vec2Value): void {\n this.lowerBound.setNum(Math.min(a.x, b.x), Math.min(a.y, b.y));\n this.upperBound.setNum(Math.max(a.x, b.x), Math.max(a.y, b.y));\n }\n\n set(aabb: AABB): void {\n this.lowerBound.setNum(aabb.lowerBound.x, aabb.lowerBound.y);\n this.upperBound.setNum(aabb.upperBound.x, aabb.upperBound.y);\n }\n\n contains(aabb: AABB): boolean {\n let result = true;\n result = result && this.lowerBound.x <= aabb.lowerBound.x;\n result = result && this.lowerBound.y <= aabb.lowerBound.y;\n result = result && aabb.upperBound.x <= this.upperBound.x;\n result = result && aabb.upperBound.y <= this.upperBound.y;\n return result;\n }\n\n extend(value: number): AABB {\n AABB.extend(this, value);\n return this;\n }\n\n static extend(aabb: AABB, value: number): void {\n aabb.lowerBound.x -= value;\n aabb.lowerBound.y -= value;\n aabb.upperBound.x += value;\n aabb.upperBound.y += value;\n }\n\n static testOverlap(a: AABB, b: AABB): boolean {\n const d1x = b.lowerBound.x - a.upperBound.x;\n const d2x = a.lowerBound.x - b.upperBound.x;\n\n const d1y = b.lowerBound.y - a.upperBound.y;\n const d2y = a.lowerBound.y - b.upperBound.y;\n\n if (d1x > 0 || d1y > 0 || d2x > 0 || d2y > 0) {\n return false;\n }\n return true;\n }\n\n static areEqual(a: AABB, b: AABB): boolean {\n return Vec2.areEqual(a.lowerBound, b.lowerBound) && Vec2.areEqual(a.upperBound, b.upperBound);\n }\n\n static diff(a: AABB, b: AABB): number {\n const wD = Math.max(0, Math.min(a.upperBound.x, b.upperBound.x) - Math.max(b.lowerBound.x, a.lowerBound.x));\n const hD = Math.max(0, Math.min(a.upperBound.y, b.upperBound.y) - Math.max(b.lowerBound.y, a.lowerBound.y));\n\n const wA = a.upperBound.x - a.lowerBound.x;\n const hA = a.upperBound.y - a.lowerBound.y;\n\n const wB = b.upperBound.x - b.lowerBound.x;\n const hB = b.upperBound.y - b.lowerBound.y;\n\n return wA * hA + wB * hB - wD * hD;\n }\n\n rayCast(output: RayCastOutput, input: RayCastInput): boolean {\n // From Real-time Collision Detection, p179.\n\n let tmin = -Infinity;\n let tmax = Infinity;\n\n const p = input.p1;\n const d = Vec2.sub(input.p2, input.p1);\n const absD = Vec2.abs(d);\n\n const normal = Vec2.zero();\n\n for (let f: 'x' | 'y' = 'x'; f !== null; f = (f === 'x' ? 'y' : null)) {\n if (absD.x < Math.EPSILON) {\n // Parallel.\n if (p[f] < this.lowerBound[f] || this.upperBound[f] < p[f]) {\n return false;\n }\n } else {\n const inv_d = 1.0 / d[f];\n let t1 = (this.lowerBound[f] - p[f]) * inv_d;\n let t2 = (this.upperBound[f] - p[f]) * inv_d;\n\n // Sign of the normal vector.\n let s = -1.0;\n\n if (t1 > t2) {\n const temp = t1;\n t1 = t2;\n t2 = temp;\n s = 1.0;\n }\n\n // Push the min up\n if (t1 > tmin) {\n normal.setZero();\n normal[f] = s;\n tmin = t1;\n }\n\n // Pull the max down\n tmax = Math.min(tmax, t2);\n\n if (tmin > tmax) {\n return false;\n }\n }\n }\n\n // Does the ray start inside the box?\n // Does the ray intersect beyond the max fraction?\n if (tmin < 0.0 || input.maxFraction < tmin) {\n return false;\n }\n\n // Intersection.\n output.fraction = tmin;\n output.normal = normal;\n return true;\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n// TODO merge with World options?\n\n/**\n * Tuning constants based on meters-kilograms-seconds (MKS) units.\n */\n// tslint:disable-next-line:no-unnecessary-class\nexport class Settings {\n // Collision\n /**\n * The maximum number of contact points between two convex shapes. Do not change\n * this value.\n */\n static maxManifoldPoints: number = 2;\n\n /**\n * The maximum number of vertices on a convex polygon. You cannot increase this\n * too much because BlockAllocator has a maximum object size.\n */\n static maxPolygonVertices: number = 12;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This allows proxies to move\n * by a small amount without triggering a tree adjustment. This is in meters.\n */\n static aabbExtension: number = 0.1;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This is used to predict the\n * future position based on the current displacement. This is a dimensionless\n * multiplier.\n */\n static aabbMultiplier: number = 2.0;\n\n /**\n * A small length used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static linearSlop: number = 0.005;\n static get linearSlopSquared(): number { return Settings.linearSlop * Settings.linearSlop; }\n\n /**\n * A small angle used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static angularSlop: number = (2.0 / 180.0 * Math.PI);\n\n /**\n * The radius of the polygon/edge shape skin. This should not be modified.\n * Making this smaller means polygons will have an insufficient buffer for\n * continuous collision. Making it larger may create artifacts for vertex\n * collision.\n */\n static get polygonRadius(): number { return 2.0 * Settings.linearSlop; }\n\n /**\n * Maximum number of sub-steps per contact in continuous physics simulation.\n */\n static maxSubSteps: number = 8;\n\n// Dynamics\n\n /**\n * Maximum number of contacts to be handled to solve a TOI impact.\n */\n static maxTOIContacts: number = 32;\n\n /**\n * Maximum iterations to solve a TOI.\n */\n static maxTOIIterations: number = 20;\n\n /**\n * Maximum iterations to find Distance.\n */\n static maxDistnceIterations: number = 20;\n\n /**\n * A velocity threshold for elastic collisions. Any collision with a relative\n * linear velocity below this threshold will be treated as inelastic.\n */\n static velocityThreshold: number = 1.0;\n\n /**\n * The maximum linear position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxLinearCorrection: number = 0.2;\n\n /**\n * The maximum angular position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxAngularCorrection: number = (8.0 / 180.0 * Math.PI);\n\n /**\n * The maximum linear velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxTranslation: number = 2.0;\n static get maxTranslationSquared(): number { return Settings.maxTranslation * Settings.maxTranslation; }\n\n /**\n * The maximum angular velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxRotation: number = (0.5 * Math.PI);\n static get maxRotationSquared(): number { return Settings.maxRotation * Settings.maxRotation; }\n\n /**\n * This scale factor controls how fast overlap is resolved. Ideally this would\n * be 1 so that overlap is removed in one time step. However using values close\n * to 1 often lead to overshoot.\n */\n static baumgarte: number = 0.2;\n static toiBaugarte: number = 0.75;\n\n // Sleep\n\n /**\n * The time that a body must be still before it will go to sleep.\n */\n static timeToSleep: number = 0.5;\n\n /**\n * A body cannot sleep if its linear velocity is above this tolerance.\n */\n static linearSleepTolerance: number = 0.01;\n static get linearSleepToleranceSqr(): number { return Math.pow(Settings.linearSleepTolerance, 2); }\n\n /**\n * A body cannot sleep if its angular velocity is above this tolerance.\n */\n static angularSleepTolerance: number = (2.0 / 180.0 * Math.PI);\n static get angularSleepToleranceSqr(): number { return Math.pow(Settings.angularSleepTolerance, 2); }\n\n}\n","/*\n * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js\n *\n * This software is provided 'as-is', without any express or implied\n * warranty. In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * 1. The origin of this software must not be misrepresented; you must not\n * claim that you wrote the original software. If you use this software\n * in a product, an acknowledgment in the product documentation would be\n * appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n * misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n */\n\nexport class Pool {\n _list: T[] = [];\n _max: number = Infinity;\n\n _createFn: () => T;\n _outFn: (item: T) => void;\n _inFn: (item: T) => void;\n _discardFn: (item: T) => T;\n\n _createCount: number = 0;\n _outCount: number = 0;\n _inCount: number = 0;\n _discardCount: number = 0;\n\n constructor(opts: {\n max?: number,\n create?: () => T,\n allocate?: (item: T) => void,\n release?: (item: T) => void,\n discard?: (item: T) => T,\n }) {\n this._list = [];\n this._max = opts.max || this._max;\n\n this._createFn = opts.create;\n this._outFn = opts.allocate;\n this._inFn = opts.release;\n this._discardFn = opts.discard;\n }\n\n max(n?: number): number | Pool {\n if (typeof n === 'number') {\n this._max = n;\n return this;\n }\n return this._max;\n }\n\n size(): number {\n return this._list.length;\n }\n\n allocate(): T {\n let item: T;\n if (this._list.length > 0) {\n item = this._list.shift();\n } else {\n this._createCount++;\n if (typeof this._createFn === 'function') {\n item = this._createFn();\n } else {\n // tslint:disable-next-line:no-object-literal-type-assertion\n item = {} as T;\n }\n }\n this._outCount++;\n if (typeof this._outFn === 'function') {\n this._outFn(item);\n }\n return item;\n }\n\n release(item: T): void {\n if (this._list.length < this._max) {\n this._inCount++;\n if (typeof this._inFn === 'function') {\n this._inFn(item);\n }\n this._list.push(item);\n } else {\n this._discardCount++;\n if (typeof this._discardFn === 'function') {\n item = this._discardFn(item);\n }\n }\n }\n\n /** @internal */\n toString(): string {\n return \" +\" + this._createCount + \" >\" + this._outCount + \" <\" + this._inCount + \" -\"\n + this._discardCount + \" =\" + this._list.length + \"/\" + this._max;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { Pool } from '../util/Pool';\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { AABB, RayCastCallback, RayCastInput } from './AABB';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport type DynamicTreeQueryCallback = (nodeId: number) => boolean;\n\n/**\n * A node in the dynamic tree. The client does not interact with this directly.\n */\nexport class TreeNode {\n id: number;\n /** Enlarged AABB */\n aabb: AABB = new AABB();\n userData: T = null;\n parent: TreeNode = null;\n child1: TreeNode = null;\n child2: TreeNode = null;\n /** 0: leaf, -1: free node */\n height: number = -1;\n\n constructor(id?: number) {\n this.id = id;\n }\n\n /** @internal */\n toString(): string {\n return this.id + \": \" + this.userData;\n }\n\n isLeaf(): boolean {\n return this.child1 == null;\n }\n}\n\n/**\n * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A\n * dynamic tree arranges data in a binary tree to accelerate queries such as\n * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we\n * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger\n * than the client object. This allows the client object to move by small\n * amounts without triggering a tree update.\n *\n * Nodes are pooled and relocatable, so we use node indices rather than\n * pointers.\n */\nexport class DynamicTree {\n m_root: TreeNode;\n m_lastProxyId: number;\n m_nodes: {\n [id: number]: TreeNode\n };\n m_pool: Pool>;\n\n constructor() {\n this.m_root = null;\n this.m_nodes = {};\n this.m_lastProxyId = 0;\n\n this.m_pool = new Pool>({\n create(): TreeNode {\n return new TreeNode();\n }\n });\n }\n\n /**\n * Get proxy user data.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getUserData(id: number): T {\n const node = this.m_nodes[id];\n _ASSERT && console.assert(!!node);\n return node.userData;\n }\n\n /**\n * Get the fat AABB for a node id.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getFatAABB(id: number): AABB {\n const node = this.m_nodes[id];\n _ASSERT && console.assert(!!node);\n return node.aabb;\n }\n\n allocateNode(): TreeNode {\n const node = this.m_pool.allocate();\n node.id = ++this.m_lastProxyId;\n node.userData = null;\n node.parent = null;\n node.child1 = null;\n node.child2 = null;\n node.height = -1;\n this.m_nodes[node.id] = node;\n return node;\n }\n\n freeNode(node: TreeNode): void {\n this.m_pool.release(node);\n node.height = -1;\n // tslint:disable-next-line:no-dynamic-delete\n delete this.m_nodes[node.id];\n }\n\n /**\n * Create a proxy in the tree as a leaf node. We return the index of the node\n * instead of a pointer so that we can grow the node pool.\n *\n * Create a proxy. Provide a tight fitting AABB and a userData pointer.\n */\n createProxy(aabb: AABB, userData: T): number {\n _ASSERT && console.assert(AABB.isValid(aabb));\n\n const node = this.allocateNode();\n\n node.aabb.set(aabb);\n\n // Fatten the aabb.\n AABB.extend(node.aabb, Settings.aabbExtension);\n\n node.userData = userData;\n node.height = 0;\n\n this.insertLeaf(node);\n\n return node.id;\n }\n\n /**\n * Destroy a proxy. This asserts if the id is invalid.\n */\n destroyProxy(id: number): void {\n const node = this.m_nodes[id];\n\n _ASSERT && console.assert(!!node);\n _ASSERT && console.assert(node.isLeaf());\n\n this.removeLeaf(node);\n this.freeNode(node);\n }\n\n /**\n * Move a proxy with a swepted AABB. If the proxy has moved outside of its\n * fattened AABB, then the proxy is removed from the tree and re-inserted.\n * Otherwise the function returns immediately.\n *\n * @param d Displacement\n *\n * @return true if the proxy was re-inserted.\n */\n moveProxy(id: number, aabb: AABB, d: Vec2): boolean {\n _ASSERT && console.assert(AABB.isValid(aabb));\n _ASSERT && console.assert(!d || Vec2.isValid(d));\n\n const node = this.m_nodes[id];\n\n _ASSERT && console.assert(!!node);\n _ASSERT && console.assert(node.isLeaf());\n\n if (node.aabb.contains(aabb)) {\n return false;\n }\n\n this.removeLeaf(node);\n\n node.aabb.set(aabb);\n\n // Extend AABB.\n aabb = node.aabb;\n AABB.extend(aabb, Settings.aabbExtension);\n\n // Predict AABB displacement.\n // const d = Vec2.mul(Settings.aabbMultiplier, displacement);\n\n if (d.x < 0.0) {\n aabb.lowerBound.x += d.x * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.x += d.x * Settings.aabbMultiplier;\n }\n\n if (d.y < 0.0) {\n aabb.lowerBound.y += d.y * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.y += d.y * Settings.aabbMultiplier;\n }\n\n this.insertLeaf(node);\n\n return true;\n }\n\n insertLeaf(leaf: TreeNode): void {\n _ASSERT && console.assert(AABB.isValid(leaf.aabb));\n\n if (this.m_root == null) {\n this.m_root = leaf;\n this.m_root.parent = null;\n return;\n }\n\n // Find the best sibling for this node\n const leafAABB = leaf.aabb;\n let index = this.m_root;\n while (!index.isLeaf()) {\n const child1 = index.child1;\n const child2 = index.child2;\n\n const area = index.aabb.getPerimeter();\n\n const combinedAABB = new AABB();\n combinedAABB.combine(index.aabb, leafAABB);\n const combinedArea = combinedAABB.getPerimeter();\n\n // Cost of creating a new parent for this node and the new leaf\n const cost = 2.0 * combinedArea;\n\n // Minimum cost of pushing the leaf further down the tree\n const inheritanceCost = 2.0 * (combinedArea - area);\n\n // Cost of descending into child1\n let cost1;\n if (child1.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n cost1 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n const oldArea = child1.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost1 = (newArea - oldArea) + inheritanceCost;\n }\n\n // Cost of descending into child2\n let cost2;\n if (child2.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n cost2 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n const oldArea = child2.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost2 = newArea - oldArea + inheritanceCost;\n }\n\n // Descend according to the minimum cost.\n if (cost < cost1 && cost < cost2) {\n break;\n }\n\n // Descend\n if (cost1 < cost2) {\n index = child1;\n } else {\n index = child2;\n }\n }\n\n const sibling = index;\n\n // Create a new parent.\n const oldParent = sibling.parent;\n const newParent = this.allocateNode();\n newParent.parent = oldParent;\n newParent.userData = null;\n newParent.aabb.combine(leafAABB, sibling.aabb);\n newParent.height = sibling.height + 1;\n\n if (oldParent != null) {\n // The sibling was not the root.\n if (oldParent.child1 === sibling) {\n oldParent.child1 = newParent;\n } else {\n oldParent.child2 = newParent;\n }\n\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n } else {\n // The sibling was the root.\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n this.m_root = newParent;\n }\n\n // Walk back up the tree fixing heights and AABBs\n index = leaf.parent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n _ASSERT && console.assert(child1 != null);\n _ASSERT && console.assert(child2 != null);\n\n index.height = 1 + Math.max(child1.height, child2.height);\n index.aabb.combine(child1.aabb, child2.aabb);\n\n index = index.parent;\n }\n\n // validate();\n }\n\n removeLeaf(leaf: TreeNode): void {\n if (leaf === this.m_root) {\n this.m_root = null;\n return;\n }\n\n const parent = leaf.parent;\n const grandParent = parent.parent;\n let sibling;\n if (parent.child1 === leaf) {\n sibling = parent.child2;\n } else {\n sibling = parent.child1;\n }\n\n if (grandParent != null) {\n // Destroy parent and connect sibling to grandParent.\n if (grandParent.child1 === parent) {\n grandParent.child1 = sibling;\n } else {\n grandParent.child2 = sibling;\n }\n sibling.parent = grandParent;\n this.freeNode(parent);\n\n // Adjust ancestor bounds.\n let index = grandParent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n index.aabb.combine(child1.aabb, child2.aabb);\n index.height = 1 + Math.max(child1.height, child2.height);\n\n index = index.parent;\n }\n } else {\n this.m_root = sibling;\n sibling.parent = null;\n this.freeNode(parent);\n }\n\n // validate();\n }\n\n /**\n * Perform a left or right rotation if node A is imbalanced. Returns the new\n * root index.\n */\n balance(iA: TreeNode): TreeNode {\n _ASSERT && console.assert(iA != null);\n\n const A = iA;\n if (A.isLeaf() || A.height < 2) {\n return iA;\n }\n\n const B = A.child1;\n const C = A.child2;\n\n const balance = C.height - B.height;\n\n // Rotate C up\n if (balance > 1) {\n const F = C.child1;\n const G = C.child2;\n\n // Swap A and C\n C.child1 = A;\n C.parent = A.parent;\n A.parent = C;\n\n // A's old parent should point to C\n if (C.parent != null) {\n if (C.parent.child1 === iA) {\n C.parent.child1 = C;\n } else {\n C.parent.child2 = C;\n }\n } else {\n this.m_root = C;\n }\n\n // Rotate\n if (F.height > G.height) {\n C.child2 = F;\n A.child2 = G;\n G.parent = A;\n A.aabb.combine(B.aabb, G.aabb);\n C.aabb.combine(A.aabb, F.aabb);\n\n A.height = 1 + Math.max(B.height, G.height);\n C.height = 1 + Math.max(A.height, F.height);\n } else {\n C.child2 = G;\n A.child2 = F;\n F.parent = A;\n A.aabb.combine(B.aabb, F.aabb);\n C.aabb.combine(A.aabb, G.aabb);\n\n A.height = 1 + Math.max(B.height, F.height);\n C.height = 1 + Math.max(A.height, G.height);\n }\n\n return C;\n }\n\n // Rotate B up\n if (balance < -1) {\n const D = B.child1;\n const E = B.child2;\n\n // Swap A and B\n B.child1 = A;\n B.parent = A.parent;\n A.parent = B;\n\n // A's old parent should point to B\n if (B.parent != null) {\n if (B.parent.child1 === A) {\n B.parent.child1 = B;\n } else {\n B.parent.child2 = B;\n }\n } else {\n this.m_root = B;\n }\n\n // Rotate\n if (D.height > E.height) {\n B.child2 = D;\n A.child1 = E;\n E.parent = A;\n A.aabb.combine(C.aabb, E.aabb);\n B.aabb.combine(A.aabb, D.aabb);\n\n A.height = 1 + Math.max(C.height, E.height);\n B.height = 1 + Math.max(A.height, D.height);\n } else {\n B.child2 = E;\n A.child1 = D;\n D.parent = A;\n A.aabb.combine(C.aabb, D.aabb);\n B.aabb.combine(A.aabb, E.aabb);\n\n A.height = 1 + Math.max(C.height, D.height);\n B.height = 1 + Math.max(A.height, E.height);\n }\n\n return B;\n }\n\n return A;\n }\n\n /**\n * Compute the height of the binary tree in O(N) time. Should not be called\n * often.\n */\n getHeight(): number {\n if (this.m_root == null) {\n return 0;\n }\n\n return this.m_root.height;\n }\n\n /**\n * Get the ratio of the sum of the node areas to the root area.\n */\n getAreaRatio(): number {\n if (this.m_root == null) {\n return 0.0;\n }\n\n const root = this.m_root;\n const rootArea = root.aabb.getPerimeter();\n\n let totalArea = 0.0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // Free node in pool\n continue;\n }\n\n totalArea += node.aabb.getPerimeter();\n }\n\n this.iteratorPool.release(it);\n\n return totalArea / rootArea;\n }\n\n /**\n * Compute the height of a sub-tree.\n */\n computeHeight(id?: number): number {\n let node;\n if (typeof id !== 'undefined') {\n node = this.m_nodes[id];\n } else {\n node = this.m_root;\n }\n\n // _ASSERT && console.assert(0 <= id && id < this.m_nodeCapacity);\n\n if (node.isLeaf()) {\n return 0;\n }\n\n const height1 = this.computeHeight(node.child1.id);\n const height2 = this.computeHeight(node.child2.id);\n return 1 + Math.max(height1, height2);\n }\n\n validateStructure(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n if (node === this.m_root) {\n _ASSERT && console.assert(node.parent == null);\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && console.assert(child1 == null);\n _ASSERT && console.assert(child2 == null);\n _ASSERT && console.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && console.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && console.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n _ASSERT && console.assert(child1.parent === node);\n _ASSERT && console.assert(child2.parent === node);\n\n this.validateStructure(child1);\n this.validateStructure(child2);\n }\n\n validateMetrics(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && console.assert(child1 == null);\n _ASSERT && console.assert(child2 == null);\n _ASSERT && console.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && console.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && console.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n const height1 = child1.height;\n const height2 = child2.height;\n const height = 1 + Math.max(height1, height2);\n _ASSERT && console.assert(node.height === height);\n\n const aabb = new AABB();\n aabb.combine(child1.aabb, child2.aabb);\n\n _ASSERT && console.assert(AABB.areEqual(aabb, node.aabb));\n\n this.validateMetrics(child1);\n this.validateMetrics(child2);\n }\n\n /**\n * Validate this tree. For testing.\n */\n validate(): void {\n this.validateStructure(this.m_root);\n this.validateMetrics(this.m_root);\n _ASSERT && console.assert(this.getHeight() === this.computeHeight());\n }\n\n /**\n * Get the maximum balance of an node in the tree. The balance is the difference\n * in height of the two children of a node.\n */\n getMaxBalance(): number {\n let maxBalance = 0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height <= 1) {\n continue;\n }\n\n _ASSERT && console.assert(!node.isLeaf());\n\n const balance = Math.abs(node.child2.height - node.child1.height);\n maxBalance = Math.max(maxBalance, balance);\n }\n this.iteratorPool.release(it);\n\n return maxBalance;\n }\n\n /**\n * Build an optimal tree. Very expensive. For testing.\n */\n rebuildBottomUp(): void {\n const nodes = [];\n let count = 0;\n\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // free node in pool\n continue;\n }\n\n if (node.isLeaf()) {\n node.parent = null;\n nodes[count] = node;\n ++count;\n } else {\n this.freeNode(node);\n }\n }\n this.iteratorPool.release(it);\n\n while (count > 1) {\n let minCost = Infinity;\n let iMin = -1;\n let jMin = -1;\n for (let i = 0; i < count; ++i) {\n const aabbi = nodes[i].aabb;\n for (let j = i + 1; j < count; ++j) {\n const aabbj = nodes[j].aabb;\n const b = new AABB();\n b.combine(aabbi, aabbj);\n const cost = b.getPerimeter();\n if (cost < minCost) {\n iMin = i;\n jMin = j;\n minCost = cost;\n }\n }\n }\n\n const child1 = nodes[iMin];\n const child2 = nodes[jMin];\n\n const parent = this.allocateNode();\n parent.child1 = child1;\n parent.child2 = child2;\n parent.height = 1 + Math.max(child1.height, child2.height);\n parent.aabb.combine(child1.aabb, child2.aabb);\n parent.parent = null;\n\n child1.parent = parent;\n child2.parent = parent;\n\n nodes[jMin] = nodes[count - 1];\n nodes[iMin] = parent;\n --count;\n }\n\n this.m_root = nodes[0];\n\n _ASSERT && this.validate();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n const aabb = node.aabb;\n aabb.lowerBound.x -= newOrigin.x;\n aabb.lowerBound.y -= newOrigin.y;\n aabb.upperBound.x -= newOrigin.x;\n aabb.upperBound.y -= newOrigin.y;\n }\n this.iteratorPool.release(it);\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query(aabb: AABB, queryCallback: DynamicTreeQueryCallback): void {\n _ASSERT && console.assert(typeof queryCallback === 'function');\n const stack = this.stackPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, aabb)) {\n if (node.isLeaf()) {\n const proceed = queryCallback(node.id);\n if (proceed === false) {\n return;\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n }\n\n this.stackPool.release(stack);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n // TODO: GC\n _ASSERT && console.assert(typeof rayCastCallback === 'function');\n const p1 = input.p1;\n const p2 = input.p2;\n const r = Vec2.sub(p2, p1);\n _ASSERT && console.assert(r.lengthSquared() > 0.0);\n r.normalize();\n\n // v is perpendicular to the segment.\n const v = Vec2.crossNumVec2(1.0, r);\n const abs_v = Vec2.abs(v);\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n\n let maxFraction = input.maxFraction;\n\n // Build a bounding box for the segment.\n const segmentAABB = new AABB();\n let t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n\n const stack = this.stackPool.allocate();\n const subInput = this.inputPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, segmentAABB) === false) {\n continue;\n }\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n const c = node.aabb.getCenter();\n const h = node.aabb.getExtents();\n const separation = Math.abs(Vec2.dot(v, Vec2.sub(p1, c))) - Vec2.dot(abs_v, h);\n if (separation > 0.0) {\n continue;\n }\n\n if (node.isLeaf()) {\n subInput.p1 = Vec2.clone(input.p1);\n subInput.p2 = Vec2.clone(input.p2);\n subInput.maxFraction = maxFraction;\n\n const value = rayCastCallback(subInput, node.id);\n\n if (value === 0.0) {\n // The client has terminated the ray cast.\n return;\n }\n\n if (value > 0.0) {\n // update segment bounding box.\n maxFraction = value;\n t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n this.stackPool.release(stack);\n this.inputPool.release(subInput);\n }\n\n private inputPool: Pool = new Pool({\n create(): RayCastInput {\n // tslint:disable-next-line:no-object-literal-type-assertion\n return {} as RayCastInput;\n },\n release(stack: RayCastInput): void {\n }\n });\n\n private stackPool: Pool>> = new Pool>>({\n create(): Array> {\n return [];\n },\n release(stack: Array>): void {\n stack.length = 0;\n }\n });\n\n private iteratorPool: Pool> = new Pool>({\n create(): Iterator {\n return new Iterator();\n },\n release(iterator: Iterator): void {\n iterator.close();\n }\n });\n\n}\n\nclass Iterator {\n parents: Array> = [];\n states: number[] = [];\n preorder(root: TreeNode): Iterator {\n this.parents.length = 0;\n this.parents.push(root);\n this.states.length = 0;\n this.states.push(0);\n return this;\n }\n next(): TreeNode {\n while (this.parents.length > 0) {\n const i = this.parents.length - 1;\n const node = this.parents[i];\n if (this.states[i] === 0) {\n this.states[i] = 1;\n return node;\n }\n if (this.states[i] === 1) {\n this.states[i] = 2;\n if (node.child1) {\n this.parents.push(node.child1);\n this.states.push(1);\n return node.child1;\n }\n }\n if (this.states[i] === 2) {\n this.states[i] = 3;\n if (node.child2) {\n this.parents.push(node.child2);\n this.states.push(1);\n return node.child2;\n }\n }\n this.parents.pop();\n this.states.pop();\n }\n }\n close(): void {\n this.parents.length = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { AABB, RayCastCallback, RayCastInput } from './AABB';\nimport { DynamicTree, DynamicTreeQueryCallback } from './DynamicTree';\nimport { FixtureProxy } from \"../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * The broad-phase wraps and extends a dynamic-tree to keep track of moved\n * objects and query them on update.\n */\nexport class BroadPhase {\n m_tree: DynamicTree = new DynamicTree();\n m_proxyCount: number = 0;\n m_moveBuffer: number[] = [];\n\n m_callback: (userDataA: any, userDataB: any) => void;\n m_queryProxyId: number;\n\n /**\n * Get user data from a proxy. Returns null if the id is invalid.\n */\n getUserData(proxyId: number): FixtureProxy {\n return this.m_tree.getUserData(proxyId);\n }\n\n /**\n * Test overlap of fat AABBs.\n */\n testOverlap(proxyIdA: number, proxyIdB: number): boolean {\n const aabbA = this.m_tree.getFatAABB(proxyIdA);\n const aabbB = this.m_tree.getFatAABB(proxyIdB);\n return AABB.testOverlap(aabbA, aabbB);\n }\n\n /**\n * Get the fat AABB for a proxy.\n */\n getFatAABB(proxyId: number): AABB {\n return this.m_tree.getFatAABB(proxyId);\n }\n\n /**\n * Get the number of proxies.\n */\n getProxyCount(): number {\n return this.m_proxyCount;\n }\n\n /**\n * Get the height of the embedded tree.\n */\n getTreeHeight(): number {\n return this.m_tree.getHeight();\n }\n\n /**\n * Get the balance (integer) of the embedded tree.\n */\n getTreeBalance(): number {\n return this.m_tree.getMaxBalance();\n }\n\n /**\n * Get the quality metric of the embedded tree.\n */\n getTreeQuality(): number {\n return this.m_tree.getAreaRatio();\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query = (aabb: AABB, queryCallback: DynamicTreeQueryCallback): void => {\n this.m_tree.query(aabb, queryCallback);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n this.m_tree.rayCast(input, rayCastCallback);\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_tree.shiftOrigin(newOrigin);\n }\n\n /**\n * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs\n * is called.\n */\n createProxy(aabb: AABB, userData: FixtureProxy): number {\n _ASSERT && console.assert(AABB.isValid(aabb));\n const proxyId = this.m_tree.createProxy(aabb, userData);\n this.m_proxyCount++;\n this.bufferMove(proxyId);\n return proxyId;\n }\n\n /**\n * Destroy a proxy. It is up to the client to remove any pairs.\n */\n destroyProxy(proxyId: number): void {\n this.unbufferMove(proxyId);\n this.m_proxyCount--;\n this.m_tree.destroyProxy(proxyId);\n }\n\n /**\n * Call moveProxy as many times as you like, then when you are done call\n * UpdatePairs to finalized the proxy pairs (for your time step).\n */\n moveProxy(proxyId: number, aabb: AABB, displacement: Vec2): void {\n _ASSERT && console.assert(AABB.isValid(aabb));\n const changed = this.m_tree.moveProxy(proxyId, aabb, displacement);\n if (changed) {\n this.bufferMove(proxyId);\n }\n }\n\n /**\n * Call to trigger a re-processing of it's pairs on the next call to\n * UpdatePairs.\n */\n touchProxy(proxyId: number): void {\n this.bufferMove(proxyId);\n }\n\n bufferMove(proxyId: number): void {\n this.m_moveBuffer.push(proxyId);\n }\n\n unbufferMove(proxyId: number): void {\n for (let i = 0; i < this.m_moveBuffer.length; ++i) {\n if (this.m_moveBuffer[i] === proxyId) {\n this.m_moveBuffer[i] = null;\n }\n }\n }\n\n /**\n * Update the pairs. This results in pair callbacks. This can only add pairs.\n */\n updatePairs(addPairCallback: (userDataA: FixtureProxy, userDataB: FixtureProxy) => void): void {\n _ASSERT && console.assert(typeof addPairCallback === 'function');\n this.m_callback = addPairCallback;\n\n // Perform tree queries for all moving proxies.\n while (this.m_moveBuffer.length > 0) {\n this.m_queryProxyId = this.m_moveBuffer.pop();\n if (this.m_queryProxyId === null) {\n continue;\n }\n\n // We have to query the tree with the fat AABB so that\n // we don't fail to create a pair that may touch later.\n const fatAABB = this.m_tree.getFatAABB(this.m_queryProxyId);\n\n // Query tree, create pairs and add them pair buffer.\n this.m_tree.query(fatAABB, this.queryCallback);\n }\n\n // Try to keep the tree balanced.\n // this.m_tree.rebalance(4);\n }\n\n queryCallback = (proxyId: number): boolean => {\n // A proxy cannot form a pair with itself.\n if (proxyId === this.m_queryProxyId) {\n return true;\n }\n\n const proxyIdA = Math.min(proxyId, this.m_queryProxyId);\n const proxyIdB = Math.max(proxyId, this.m_queryProxyId);\n\n // TODO: Skip any duplicate pairs.\n\n const userDataA = this.m_tree.getUserData(proxyIdA);\n const userDataB = this.m_tree.getUserData(proxyIdB);\n\n // Send the pairs back to the client.\n this.m_callback(userDataA, userDataB);\n\n return true;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2, Vec2Value } from './Vec2';\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class Rot {\n s: number;\n c: number;\n\n /** Initialize from an angle in radians. */\n constructor(angle?: number | Rot) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Rot)) {\n return new Rot(angle);\n }\n if (typeof angle === 'number') {\n this.setAngle(angle);\n } else if (typeof angle === 'object') {\n this.setRot(angle);\n } else {\n this.setIdentity();\n }\n }\n\n /** @internal */\n static neo(angle: number): Rot {\n const obj = Object.create(Rot.prototype);\n obj.setAngle(angle);\n return obj;\n }\n\n static clone(rot: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n const obj = Object.create(Rot.prototype);\n obj.s = rot.s;\n obj.c = rot.c;\n return obj;\n }\n\n static identity(): Rot {\n const obj = Object.create(Rot.prototype);\n obj.s = 0.0;\n obj.c = 1.0;\n return obj;\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.s) && Math.isFinite(obj.c);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Rot.isValid(o), 'Invalid Rot!', o);\n }\n\n /** Set to the identity rotation. */\n setIdentity(): void {\n this.s = 0.0;\n this.c = 1.0;\n }\n\n set(angle: number | Rot): void {\n if (typeof angle === 'object') {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n\n } else {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n }\n\n setRot(angle: Rot): void {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n }\n\n /** Set using an angle in radians. */\n setAngle(angle: number): void {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n\n /** Get the angle in radians. */\n getAngle(): number {\n return Math.atan2(this.s, this.c);\n }\n\n /** Get the x-axis. */\n getXAxis(): Vec2 {\n return Vec2.neo(this.c, this.s);\n }\n\n /** Get the u-axis. */\n getYAxis(): Vec2 {\n return Vec2.neo(-this.s, this.c);\n }\n\n /** Multiply two rotations: q * r */\n static mul(rot: Rot, m: Rot): Rot;\n /** Rotate a vector */\n static mul(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(rot, m) {\n _ASSERT && Rot.assert(rot);\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Multiply two rotations: q * r */\n static mulRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n }\n\n /** Rotate a vector */\n static mulVec2(rot: Rot, m: Vec2): Vec2 {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n\n static mulSub(rot: Rot, v: Vec2, w: Vec2): Vec2 {\n const x = rot.c * (v.x - w.x) - rot.s * (v.y - w.y);\n const y = rot.s * (v.x - w.x) + rot.c * (v.y - w.y);\n return Vec2.neo(x, y);\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulT(rot: Rot, m: Rot): Rot;\n /** Inverse rotate a vector */\n static mulT(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(rot, m) {\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulTRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n }\n\n /** Inverse rotate a vector */\n static mulTVec2(rot: Rot, m: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2, Vec2Value } from './Vec2';\nimport { Rot } from './Rot';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A transform contains translation and rotation. It is used to represent the\n * position and orientation of rigid frames. Initialize using a position vector\n * and a rotation.\n */\nexport class Transform {\n /** position */\n p: Vec2;\n\n /** rotation */\n q: Rot;\n\n constructor(position?: Vec2Value, rotation?: number) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Transform)) {\n return new Transform(position, rotation);\n }\n this.p = Vec2.zero();\n this.q = Rot.identity();\n if (typeof position !== 'undefined') {\n this.p.setVec2(position);\n }\n if (typeof rotation !== 'undefined') {\n this.q.setAngle(rotation);\n }\n }\n\n static clone(xf: Transform): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(xf.p);\n obj.q = Rot.clone(xf.q);\n return obj;\n }\n\n /** @internal */\n static neo(position: Vec2, rotation: Rot): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(position);\n obj.q = Rot.clone(rotation);\n return obj;\n }\n\n static identity(): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.zero();\n obj.q = Rot.identity();\n return obj;\n }\n\n /**\n * Set this to the identity transform.\n */\n setIdentity(): void {\n this.p.setZero();\n this.q.setIdentity();\n }\n\n set(position: Vec2, rotation: number): void;\n set(xf: Transform): void;\n /**\n * Set this based on the position and angle.\n */\n // tslint:disable-next-line:typedef\n set(a, b?) {\n if (typeof b === 'undefined') {\n this.p.set(a.p);\n this.q.set(a.q);\n } else {\n this.p.set(a);\n this.q.set(b);\n }\n }\n\n /**\n * Set this based on the position and angle.\n */\n setNum(position: Vec2, rotation: number) {\n this.p.setVec2(position);\n this.q.setAngle(rotation);\n }\n\n setTransform(xf: Transform): void {\n this.p.setVec2(xf.p);\n this.q.setRot(xf.q);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.p) && Rot.isValid(obj.q);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Transform.isValid(o), 'Invalid Transform!', o);\n }\n\n static mul(a: Transform, b: Vec2Value): Vec2;\n static mul(a: Transform, b: Transform): Transform;\n // static mul(a: Transform, b: Vec2Value[]): Vec2[];\n // static mul(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (Array.isArray(b)) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n\n } else if ('x' in b && 'y' in b) {\n return Transform.mulVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulXf(a, b);\n }\n }\n\n static mulAll(a: Transform, b: Vec2Value[]): Vec2[];\n static mulAll(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mulAll(a: Transform, b) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static mulFn(a: Transform) {\n _ASSERT && Transform.assert(a);\n return function(b: Vec2Value): Vec2 {\n return Transform.mul(a, b);\n };\n }\n\n static mulVec2(a: Transform, b: Vec2Value): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = (a.q.c * b.x - a.q.s * b.y) + a.p.x;\n const y = (a.q.s * b.x + a.q.c * b.y) + a.p.y;\n return Vec2.neo(x, y);\n }\n\n static mulXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p\n // = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p\n const xf = Transform.identity();\n xf.q = Rot.mulRot(a.q, b.q);\n xf.p = Vec2.add(Rot.mulVec2(a.q, b.p), a.p);\n return xf;\n }\n\n static mulT(a: Transform, b: Vec2Value): Vec2;\n static mulT(a: Transform, b: Transform): Transform;\n // tslint:disable-next-line:typedef\n static mulT(a, b) {\n if ('x' in b && 'y' in b) {\n return Transform.mulTVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulTXf(a, b);\n }\n }\n\n static mulTVec2(a: Transform, b: Vec2Value): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const px = b.x - a.p.x;\n const py = b.y - a.p.y;\n const x = (a.q.c * px + a.q.s * py);\n const y = (-a.q.s * px + a.q.c * py);\n return Vec2.neo(x, y);\n }\n\n static mulTXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q' * (B.q * v1 + B.p - A.p)\n // = A.q' * B.q * v1 + A.q' * (B.p - A.p)\n const xf = Transform.identity();\n xf.q.setRot(Rot.mulTRot(a.q, b.q));\n xf.p.setVec2(Rot.mulTVec2(a.q, Vec2.sub(b.p, a.p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\nimport { Vec2 } from './Vec2';\nimport { Rot } from './Rot';\nimport { Transform } from './Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * This describes the motion of a body/shape for TOI computation. Shapes are\n * defined with respect to the body origin, which may not coincide with the\n * center of mass. However, to support dynamics we must interpolate the center\n * of mass position.\n */\nexport class Sweep {\n /** Local center of mass position */\n localCenter: Vec2;\n\n /** World center position */\n c: Vec2;\n\n /** World angle */\n a: number;\n\n /** Fraction of the current time step in the range [0,1], c0 and a0 are c and a at alpha0. */\n alpha0: number;\n\n c0: Vec2;\n a0: number;\n\n constructor(c?: Vec2, a?: number) {\n _ASSERT && console.assert(typeof c === 'undefined');\n _ASSERT && console.assert(typeof a === 'undefined');\n this.localCenter = Vec2.zero();\n this.c = Vec2.zero();\n this.a = 0;\n this.alpha0 = 0;\n this.c0 = Vec2.zero();\n this.a0 = 0;\n }\n\n setTransform(xf: Transform): void {\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n\n this.a = xf.q.getAngle();\n this.a0 = xf.q.getAngle();\n }\n\n setLocalCenter(localCenter: Vec2, xf: Transform): void {\n this.localCenter.setVec2(localCenter);\n\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n }\n\n /**\n * Get the interpolated transform at a specific time.\n *\n * @param xf\n * @param beta A factor in [0,1], where 0 indicates alpha0\n */\n getTransform(xf: Transform, beta: number = 0): void {\n xf.q.setAngle((1.0 - beta) * this.a0 + beta * this.a);\n xf.p.setCombine((1.0 - beta), this.c0, beta, this.c);\n\n // shift to origin\n xf.p.sub(Rot.mulVec2(xf.q, this.localCenter));\n }\n\n /**\n * Advance the sweep forward, yielding a new initial state.\n *\n * @param alpha The new initial time\n */\n advance(alpha: number): void {\n _ASSERT && console.assert(this.alpha0 < 1.0);\n const beta = (alpha - this.alpha0) / (1.0 - this.alpha0);\n this.c0.setCombine(beta, this.c, 1 - beta, this.c0);\n this.a0 = beta * this.a + (1 - beta) * this.a0;\n this.alpha0 = alpha;\n }\n\n forward(): void {\n this.a0 = this.a;\n this.c0.setVec2(this.c);\n }\n\n /**\n * normalize the angles in radians to be between -pi and pi.\n */\n normalize(): void {\n const a0 = Math.mod(this.a0, -Math.PI, +Math.PI);\n this.a -= this.a0 - a0;\n this.a0 = a0;\n }\n\n clone(): Sweep {\n const clone = new Sweep();\n clone.localCenter.setVec2(this.localCenter);\n clone.alpha0 = this.alpha0;\n clone.a0 = this.a0;\n clone.a = this.a;\n clone.c0.setVec2(this.c0);\n clone.c.setVec2(this.c);\n return clone;\n }\n\n set(that: Sweep): void {\n this.localCenter.setVec2(that.localCenter);\n this.alpha0 = that.alpha0;\n this.a0 = that.a0;\n this.a = that.a;\n this.c0.setVec2(that.c0);\n this.c.setVec2(that.c);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\n\nexport class Velocity {\n /** linear */\n v: Vec2;\n\n /** angular */\n w: number;\n\n constructor() {\n this.v = Vec2.zero();\n this.w = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Transform } from '../common/Transform';\n\n\nexport class Position {\n /** location */\n c: Vec2;\n\n /** angle */\n a: number;\n\n constructor() {\n this.c = Vec2.zero();\n this.a = 0;\n }\n\n getTransform(xf: Transform, p: Vec2): Transform {\n xf.q.setAngle(this.a);\n xf.p.setVec2(Vec2.sub(this.c, Rot.mulVec2(xf.q, p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from './AABB';\nimport { DistanceProxy } from './Distance';\nimport type { Transform } from '../common/Transform';\nimport type { Vec2Value } from '../common/Vec2';\n\n// todo make shape an interface\n\n/**\n * A shape is used for collision detection. You can create a shape however you\n * like. Shapes used for simulation in World are created automatically when a\n * Fixture is created. Shapes may encapsulate one or more child shapes.\n */\nexport abstract class Shape {\n m_type: ShapeType;\n m_radius: number;\n\n /** @internal */\n abstract _reset(): void;\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return typeof obj.m_type === 'string' && typeof obj.m_radius === 'number';\n }\n\n abstract getRadius(): number;\n\n /**\n * Get the type of this shape. You can use this to down cast to the concrete\n * shape.\n *\n * @return the shape type.\n */\n abstract getType(): ShapeType;\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n abstract _clone(): Shape;\n\n /**\n * Get the number of child primitives.\n */\n abstract getChildCount(): number;\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n abstract testPoint(xf: Transform, p: Vec2Value): boolean;\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n abstract rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean;\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n abstract computeAABB(aabb: AABB, xf: Transform, childIndex: number): void;\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n abstract computeMass(massData: MassData, density?: number): void;\n\n abstract computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void;\n\n}\n\nexport type ShapeType = \"circle\" | \"edge\" | \"polygon\" | \"chain\";\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { math as Math } from '../common/Math';\nimport { Vec2, Vec2Value } from '../common/Vec2';\nimport { AABB, RayCastInput, RayCastOutput } from '../collision/AABB';\nimport { Shape, ShapeType } from '../collision/Shape';\nimport { Body, MassData } from \"./Body\";\nimport { BroadPhase } from \"../collision/BroadPhase\";\nimport { Transform } from \"../common/Transform\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A fixture definition is used to create a fixture. This class defines an\n * abstract fixture definition. You can reuse fixture definitions safely.\n */\nexport interface FixtureOpt {\n userData?: unknown;\n /**\n * The friction coefficient, usually in the range [0,1]\n */\n friction?: number;\n /**\n * The restitution (elasticity) usually in the range [0,1]\n */\n restitution?: number;\n /**\n * The density, usually in kg/m^2\n */\n density?: number;\n /**\n * A sensor shape collects contact information but never generates a collision response.\n */\n isSensor?: boolean;\n /**\n * Zero, positive or negative collision group.\n * Fixtures with same positive groupIndex always collide and fixtures with same negative groupIndex never collide.\n */\n filterGroupIndex?: number;\n /**\n * Collision category bit or bits that this fixture belongs to.\n * If groupIndex is zero or not matching, then at least one bit in this fixture categoryBits should match other fixture maskBits and vice versa.\n */\n filterCategoryBits?: number;\n /**\n * Collision category bit or bits that this fixture accept for collision.\n */\n filterMaskBits?: number;\n}\n\nexport interface FixtureDef extends FixtureOpt {\n shape: Shape;\n}\n\nconst FixtureDefDefault: FixtureOpt = {\n userData : null,\n friction : 0.2,\n restitution : 0.0,\n density : 0.0,\n isSensor : false,\n\n filterGroupIndex : 0,\n filterCategoryBits : 0x0001,\n filterMaskBits : 0xFFFF\n};\n\n/**\n * This proxy is used internally to connect shape children to the broad-phase.\n */\nexport class FixtureProxy {\n aabb: AABB;\n fixture: Fixture;\n childIndex: number;\n proxyId: number;\n constructor(fixture: Fixture, childIndex: number) {\n this.aabb = new AABB();\n this.fixture = fixture;\n this.childIndex = childIndex;\n this.proxyId;\n }\n}\n\n/**\n * A fixture is used to attach a shape to a body for collision detection. A\n * fixture inherits its transform from its parent. Fixtures hold additional\n * non-geometric data such as friction, collision filters, etc.\n *\n * To create a new Fixture use {@link Body.createFixture}.\n */\nexport class Fixture {\n /** @internal */ m_body: Body;\n /** @internal */ m_friction: number;\n /** @internal */ m_restitution: number;\n /** @internal */ m_density: number;\n /** @internal */ m_isSensor: boolean;\n /** @internal */ m_filterGroupIndex: number;\n /** @internal */ m_filterCategoryBits: number;\n /** @internal */ m_filterMaskBits: number;\n /** @internal */ m_shape: Shape;\n /** @internal */ m_next: Fixture | null;\n /** @internal */ m_proxies: FixtureProxy[];\n /** @internal */ m_proxyCount: number;\n /** @internal */ m_userData: unknown;\n\n constructor(body: Body, def: FixtureDef);\n constructor(body: Body, shape: Shape, def?: FixtureOpt);\n constructor(body: Body, shape: Shape, density?: number);\n // tslint:disable-next-line:typedef\n /** @internal */ constructor(body: Body, shape?, def?) {\n if (shape.shape) {\n def = shape;\n shape = shape.shape;\n\n } else if (typeof def === 'number') {\n def = {density : def};\n }\n\n def = options(def, FixtureDefDefault);\n\n this.m_body = body;\n\n this.m_friction = def.friction;\n this.m_restitution = def.restitution;\n this.m_density = def.density;\n this.m_isSensor = def.isSensor;\n\n this.m_filterGroupIndex = def.filterGroupIndex;\n this.m_filterCategoryBits = def.filterCategoryBits;\n this.m_filterMaskBits = def.filterMaskBits;\n\n // TODO validate shape\n this.m_shape = shape; // .clone();\n\n this.m_next = null;\n\n this.m_proxies = [];\n this.m_proxyCount = 0;\n\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n\n this.m_userData = def.userData;\n }\n\n /**\n * Re-setup fixture.\n * @internal\n */\n _reset(): void {\n const body = this.getBody();\n const broadPhase = body.m_world.m_broadPhase;\n this.destroyProxies(broadPhase);\n if (this.m_shape._reset) {\n this.m_shape._reset();\n }\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n this.createProxies(broadPhase, body.m_xf);\n body.resetMassData();\n }\n\n /** @internal */\n _serialize(): object {\n return {\n friction: this.m_friction,\n restitution: this.m_restitution,\n density: this.m_density,\n isSensor: this.m_isSensor,\n\n filterGroupIndex: this.m_filterGroupIndex,\n filterCategoryBits: this.m_filterCategoryBits,\n filterMaskBits: this.m_filterMaskBits,\n\n shape: this.m_shape,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, body: any, restore: any): Fixture {\n const shape = restore(Shape, data.shape);\n const fixture = shape && new Fixture(body, shape, data);\n return fixture;\n }\n\n /**\n * Get the type of the child shape. You can use this to down cast to the\n * concrete shape.\n */\n getType(): ShapeType {\n return this.m_shape.getType();\n }\n\n /**\n * Get the child shape. You can modify the child shape, however you should not\n * change the number of vertices because this will crash some collision caching\n * mechanisms. Manipulating the shape may lead to non-physical behavior.\n */\n getShape(): Shape {\n return this.m_shape;\n }\n\n /**\n * A sensor shape collects contact information but never generates a collision\n * response.\n */\n isSensor(): boolean {\n return this.m_isSensor;\n }\n\n /**\n * Set if this fixture is a sensor.\n */\n setSensor(sensor: boolean): void {\n if (sensor != this.m_isSensor) {\n this.m_body.setAwake(true);\n this.m_isSensor = sensor;\n }\n }\n\n // /**\n // * Get the contact filtering data.\n // */\n // getFilterData() {\n // return this.m_filter;\n // }\n\n /**\n * Get the user data that was assigned in the fixture definition. Use this to\n * store your application specific data.\n */\n getUserData(): unknown {\n return this.m_userData;\n }\n\n /**\n * Set the user data. Use this to store your application specific data.\n */\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get the parent body of this fixture. This is null if the fixture is not\n * attached.\n */\n getBody(): Body {\n return this.m_body;\n }\n\n /**\n * Get the next fixture in the parent body's fixture list.\n */\n getNext(): Fixture | null {\n return this.m_next;\n }\n\n /**\n * Get the density of this fixture.\n */\n getDensity(): number {\n return this.m_density;\n }\n\n /**\n * Set the density of this fixture. This will _not_ automatically adjust the\n * mass of the body. You must call Body.resetMassData to update the body's mass.\n */\n setDensity(density: number): void {\n _ASSERT && console.assert(Math.isFinite(density) && density >= 0.0);\n this.m_density = density;\n }\n\n /**\n * Get the coefficient of friction, usually in the range [0,1].\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Set the coefficient of friction. This will not change the friction of\n * existing contacts.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the coefficient of restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Set the coefficient of restitution. This will not change the restitution of\n * existing contacts.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Test a point in world coordinates for containment in this fixture.\n */\n testPoint(p: Vec2Value): boolean {\n return this.m_shape.testPoint(this.m_body.getTransform(), p);\n }\n\n /**\n * Cast a ray against this shape.\n */\n rayCast(output: RayCastOutput, input: RayCastInput, childIndex: number): boolean {\n return this.m_shape.rayCast(output, input, this.m_body.getTransform(), childIndex);\n }\n\n /**\n * Get the mass data for this fixture. The mass data is based on the density and\n * the shape. The rotational inertia is about the shape's origin. This operation\n * may be expensive.\n */\n getMassData(massData: MassData): void {\n this.m_shape.computeMass(massData, this.m_density);\n }\n\n /**\n * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a\n * more accurate AABB, compute it using the shape and the body transform.\n */\n getAABB(childIndex: number): AABB {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_proxies.length);\n return this.m_proxies[childIndex].aabb;\n }\n\n /**\n * These support body activation/deactivation.\n */\n createProxies(broadPhase: BroadPhase, xf: Transform): void {\n _ASSERT && console.assert(this.m_proxyCount == 0);\n\n // Create proxies in the broad-phase.\n this.m_proxyCount = this.m_shape.getChildCount();\n\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n this.m_shape.computeAABB(proxy.aabb, xf, i);\n proxy.proxyId = broadPhase.createProxy(proxy.aabb, proxy);\n }\n }\n\n destroyProxies(broadPhase: BroadPhase): void {\n // Destroy proxies in the broad-phase.\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n broadPhase.destroyProxy(proxy.proxyId);\n proxy.proxyId = null;\n }\n\n this.m_proxyCount = 0;\n }\n\n /**\n * Updates this fixture proxy in broad-phase (with combined AABB of current and\n * next transformation).\n */\n synchronize(broadPhase: BroadPhase, xf1: Transform, xf2: Transform): void {\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n // Compute an AABB that covers the swept shape (may miss some rotation\n // effect).\n const aabb1 = new AABB();\n const aabb2 = new AABB();\n this.m_shape.computeAABB(aabb1, xf1, proxy.childIndex);\n this.m_shape.computeAABB(aabb2, xf2, proxy.childIndex);\n\n proxy.aabb.combine(aabb1, aabb2);\n\n const displacement = Vec2.sub(xf2.p, xf1.p);\n\n broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement);\n }\n }\n\n /**\n * Set the contact filtering data. This will not update contacts until the next\n * time step when either parent body is active and awake. This automatically\n * calls refilter.\n */\n setFilterData(filter: { groupIndex: number, categoryBits: number, maskBits: number }): void {\n this.m_filterGroupIndex = filter.groupIndex;\n this.m_filterCategoryBits = filter.categoryBits;\n this.m_filterMaskBits = filter.maskBits;\n this.refilter();\n }\n\n getFilterGroupIndex(): number {\n return this.m_filterGroupIndex;\n }\n\n setFilterGroupIndex(groupIndex: number): void {\n this.m_filterGroupIndex = groupIndex;\n }\n\n getFilterCategoryBits(): number {\n return this.m_filterCategoryBits;\n }\n\n setFilterCategoryBits(categoryBits: number): void {\n this.m_filterCategoryBits = categoryBits;\n }\n\n getFilterMaskBits(): number {\n return this.m_filterMaskBits;\n }\n\n setFilterMaskBits(maskBits: number): void {\n this.m_filterMaskBits = maskBits;\n }\n\n /**\n * Call this if you want to establish collision that was previously disabled by\n * ContactFilter.\n */\n refilter(): void {\n if (this.m_body == null) {\n return;\n }\n\n // Flag associated contacts for filtering.\n let edge = this.m_body.getContactList();\n while (edge) {\n const contact = edge.contact;\n const fixtureA = contact.getFixtureA();\n const fixtureB = contact.getFixtureB();\n if (fixtureA == this || fixtureB == this) {\n contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n\n const world = this.m_body.getWorld();\n\n if (world == null) {\n return;\n }\n\n // Touch each proxy so that new pairs may be created\n const broadPhase = world.m_broadPhase;\n for (let i = 0; i < this.m_proxyCount; ++i) {\n broadPhase.touchProxy(this.m_proxies[i].proxyId);\n }\n }\n\n /**\n * Implement this method to provide collision filtering, if you want finer\n * control over contact creation.\n *\n * Return true if contact calculations should be performed between these two\n * fixtures.\n *\n * Warning: for performance reasons this is only called when the AABBs begin to\n * overlap.\n */\n shouldCollide(that: Fixture): boolean {\n\n if (that.m_filterGroupIndex === this.m_filterGroupIndex && that.m_filterGroupIndex !== 0) {\n return that.m_filterGroupIndex > 0;\n }\n\n const collideA = (that.m_filterMaskBits & this.m_filterCategoryBits) !== 0;\n const collideB = (that.m_filterCategoryBits & this.m_filterMaskBits) !== 0;\n const collide = collideA && collideB;\n return collide;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { Vec2, Vec2Value } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { math as Math } from '../common/Math';\nimport { Sweep } from '../common/Sweep';\nimport { Transform } from '../common/Transform';\nimport { Velocity } from './Velocity';\nimport { Position } from './Position';\nimport { Fixture, FixtureDef, FixtureOpt } from './Fixture';\nimport { Shape } from '../collision/Shape';\nimport { JointEdge } from \"./Joint\";\nimport { World } from \"./World\";\nimport { ContactEdge } from \"./Contact\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport type BodyType = 'static' | 'kinematic' | 'dynamic';\n\nconst STATIC = 'static';\nconst KINEMATIC = 'kinematic';\nconst DYNAMIC = 'dynamic';\n\nexport interface BodyDef {\n /**\n * Body types are static, kinematic, or dynamic. Note: if a dynamic\n * body would have zero mass, the mass is set to one.\n */\n type?: BodyType;\n /**\n * The world position of the body. Avoid creating bodies at the\n * origin since this can lead to many overlapping shapes.\n */\n position?: Vec2;\n /**\n * The world angle of the body in radians.\n */\n angle?: number;\n /**\n * The linear velocity of the body's origin in world co-ordinates.\n */\n linearVelocity?: Vec2;\n angularVelocity?: number;\n /**\n * Linear damping is use to reduce the linear velocity. The\n * damping parameter can be larger than 1.0 but the damping effect becomes\n * sensitive to the time step when the damping parameter is large.\n */\n linearDamping?: number;\n /**\n * Angular damping is use to reduce the angular velocity.\n * The damping parameter can be larger than 1.0 but the damping effect\n * becomes sensitive to the time step when the damping parameter is large.\n */\n angularDamping?: number;\n /**\n * Should this body be prevented from rotating? Useful for characters.\n */\n fixedRotation?: boolean;\n /**\n * Is this a fast moving body that should be prevented from\n * tunneling through other moving bodies? Note that all bodies are\n * prevented from tunneling through kinematic and static bodies. This\n * setting is only considered on dynamic bodies. Warning: You should use\n * this flag sparingly since it increases processing time.\n */\n bullet?: boolean;\n gravityScale?: number;\n /**\n * Set this flag to false if this body should never fall asleep. Note that this increases CPU usage.\n */\n allowSleep?: boolean;\n /**\n * Is this body initially awake or sleeping?\n */\n awake?: boolean;\n /**\n * Does this body start out active?\n */\n active?: boolean;\n userData?: any;\n}\n\nconst BodyDefDefault: BodyDef = {\n type : STATIC,\n position : Vec2.zero(),\n angle : 0.0,\n\n linearVelocity : Vec2.zero(),\n angularVelocity : 0.0,\n\n linearDamping : 0.0,\n angularDamping : 0.0,\n\n fixedRotation : false,\n bullet : false,\n gravityScale : 1.0,\n\n allowSleep : true,\n awake : true,\n active : true,\n\n userData : null\n};\n\n/**\n * MassData This holds the mass data computed for a shape.\n */\nexport class MassData {\n /** The mass of the shape, usually in kilograms. */\n mass: number = 0;\n /** The position of the shape's centroid relative to the shape's origin. */\n center: Vec2 = Vec2.zero();\n /** The rotational inertia of the shape about the local origin. */\n I: number = 0;\n}\n\n/**\n * A rigid body composed of one or more fixtures.\n *\n * To create a new Body use {@link World.createBody}.\n */\nexport class Body {\n /**\n * A static body does not move under simulation and behaves as if it has infinite mass.\n * Internally, zero is stored for the mass and the inverse mass.\n * Static bodies can be moved manually by the user.\n * A static body has zero velocity.\n * Static bodies do not collide with other static or kinematic bodies.\n */\n static readonly STATIC: BodyType = 'static';\n /**\n * A kinematic body moves under simulation according to its velocity.\n * Kinematic bodies do not respond to forces.\n * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity.\n * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass.\n * Kinematic bodies do not collide with other kinematic or static bodies.\n */\n static readonly KINEMATIC: BodyType = 'kinematic';\n\n /**\n * A dynamic body is fully simulated.\n * They can be moved manually by the user, but normally they move according to forces.\n * A dynamic body can collide with all body types.\n * A dynamic body always has finite, non-zero mass.\n * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate.\n */\n static readonly DYNAMIC: BodyType = 'dynamic';\n\n /** @internal */ m_world: World;\n /** @internal */ m_awakeFlag: boolean;\n /** @internal */ m_autoSleepFlag: boolean;\n /** @internal */ m_bulletFlag: boolean;\n /** @internal */ m_fixedRotationFlag: boolean;\n /** @internal */ m_activeFlag: boolean;\n /** @internal */ m_islandFlag: boolean;\n /** @internal */ m_toiFlag: boolean;\n /** @internal */ m_userData: unknown;\n /** @internal */ m_type: BodyType;\n /** @internal */ m_mass: number;\n /** @internal */ m_invMass: number;\n /** @internal Rotational inertia about the center of mass. */\n m_I: number;\n /** @internal */ m_invI: number;\n /** @internal the body origin transform */\n m_xf: Transform;\n /** @internal the swept motion for CCD */\n m_sweep: Sweep;\n // position and velocity correction\n /** @internal */ c_velocity: Velocity;\n /** @internal */ c_position: Position;\n /** @internal */ m_force: Vec2;\n /** @internal */ m_torque: number;\n /** @internal */ m_linearVelocity: Vec2;\n /** @internal */ m_angularVelocity: number;\n /** @internal */ m_linearDamping: number;\n /** @internal */ m_angularDamping: number;\n /** @internal */ m_gravityScale: number;\n /** @internal */ m_sleepTime: number;\n /** @internal */ m_jointList: JointEdge | null;\n /** @internal */ m_contactList: ContactEdge | null;\n /** @internal */ m_fixtureList: Fixture | null;\n /** @internal */ m_prev: Body | null;\n /** @internal */ m_next: Body | null;\n /** @internal */ m_destroyed: boolean;\n\n /** @internal */\n constructor(world: World, def: BodyDef) {\n def = options(def, BodyDefDefault);\n\n _ASSERT && console.assert(Vec2.isValid(def.position));\n _ASSERT && console.assert(Vec2.isValid(def.linearVelocity));\n _ASSERT && console.assert(Math.isFinite(def.angle));\n _ASSERT && console.assert(Math.isFinite(def.angularVelocity));\n _ASSERT && console.assert(Math.isFinite(def.angularDamping) && def.angularDamping >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.linearDamping) && def.linearDamping >= 0.0);\n\n this.m_world = world;\n\n this.m_awakeFlag = def.awake;\n this.m_autoSleepFlag = def.allowSleep;\n this.m_bulletFlag = def.bullet;\n this.m_fixedRotationFlag = def.fixedRotation;\n this.m_activeFlag = def.active;\n\n this.m_islandFlag = false;\n this.m_toiFlag = false;\n\n this.m_userData = def.userData;\n this.m_type = def.type;\n\n if (this.m_type == DYNAMIC) {\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n } else {\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n }\n\n // Rotational inertia about the center of mass.\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n // the body origin transform\n this.m_xf = Transform.identity();\n this.m_xf.p = Vec2.clone(def.position);\n this.m_xf.q.setAngle(def.angle);\n\n // the swept motion for CCD\n this.m_sweep = new Sweep();\n this.m_sweep.setTransform(this.m_xf);\n\n // position and velocity correction\n this.c_velocity = new Velocity();\n this.c_position = new Position();\n\n this.m_force = Vec2.zero();\n this.m_torque = 0.0;\n\n this.m_linearVelocity = Vec2.clone(def.linearVelocity);\n this.m_angularVelocity = def.angularVelocity;\n\n this.m_linearDamping = def.linearDamping;\n this.m_angularDamping = def.angularDamping;\n this.m_gravityScale = def.gravityScale;\n\n this.m_sleepTime = 0.0;\n\n this.m_jointList = null;\n this.m_contactList = null;\n this.m_fixtureList = null;\n\n this.m_prev = null;\n this.m_next = null;\n\n this.m_destroyed = false;\n }\n\n /** @internal */\n _serialize(): object {\n const fixtures = [];\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n fixtures.push(f);\n }\n return {\n type: this.m_type,\n bullet: this.m_bulletFlag,\n position: this.m_xf.p,\n angle: this.m_xf.q.getAngle(),\n linearVelocity: this.m_linearVelocity,\n angularVelocity: this.m_angularVelocity,\n fixtures,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): Body {\n const body = new Body(world, data);\n\n if (data.fixtures) {\n for (let i = data.fixtures.length - 1; i >= 0; i--) {\n const fixture = restore(Fixture, data.fixtures[i], body);\n body._addFixture(fixture);\n }\n }\n return body;\n }\n\n isWorldLocked(): boolean {\n return this.m_world && this.m_world.isLocked() ? true : false;\n }\n\n getWorld(): World {\n return this.m_world;\n }\n\n getNext(): Body | null {\n return this.m_next;\n }\n\n setUserData(data: any): void {\n this.m_userData = data;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n getFixtureList(): Fixture | null {\n return this.m_fixtureList;\n }\n\n getJointList(): JointEdge | null {\n return this.m_jointList;\n }\n\n /**\n * Warning: this list changes during the time step and you may miss some\n * collisions if you don't use ContactListener.\n */\n getContactList(): ContactEdge | null {\n return this.m_contactList;\n }\n\n isStatic(): boolean {\n return this.m_type == STATIC;\n }\n\n isDynamic(): boolean {\n return this.m_type == DYNAMIC;\n }\n\n isKinematic(): boolean {\n return this.m_type == KINEMATIC;\n }\n\n /**\n * This will alter the mass and velocity.\n */\n setStatic(): Body {\n this.setType(STATIC);\n return this;\n }\n\n setDynamic(): Body {\n this.setType(DYNAMIC);\n return this;\n }\n\n setKinematic(): Body {\n this.setType(KINEMATIC);\n return this;\n }\n\n /**\n * @internal\n */\n getType(): BodyType {\n return this.m_type;\n }\n\n /**\n * @internal\n */\n setType(type: BodyType): void {\n _ASSERT && console.assert(type === STATIC || type === KINEMATIC || type === DYNAMIC);\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type == type) {\n return;\n }\n\n this.m_type = type;\n\n this.resetMassData();\n\n if (this.m_type == STATIC) {\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_sweep.forward();\n this.synchronizeFixtures();\n }\n\n this.setAwake(true);\n\n this.m_force.setZero();\n this.m_torque = 0.0;\n\n // Delete the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n\n // Touch the proxies so that new contacts will be created (when appropriate)\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n const proxyCount = f.m_proxyCount;\n for (let i = 0; i < proxyCount; ++i) {\n broadPhase.touchProxy(f.m_proxies[i].proxyId);\n }\n }\n }\n\n isBullet(): boolean {\n return this.m_bulletFlag;\n }\n\n /**\n * Should this body be treated like a bullet for continuous collision detection?\n */\n setBullet(flag: boolean): void {\n this.m_bulletFlag = !!flag;\n }\n\n isSleepingAllowed(): boolean {\n return this.m_autoSleepFlag;\n }\n\n setSleepingAllowed(flag: boolean): void {\n this.m_autoSleepFlag = !!flag;\n if (this.m_autoSleepFlag == false) {\n this.setAwake(true);\n }\n }\n\n isAwake(): boolean {\n return this.m_awakeFlag;\n }\n\n /**\n * Set the sleep state of the body. A sleeping body has very low CPU cost.\n *\n * @param flag Set to true to wake the body, false to put it to sleep.\n */\n setAwake(flag: boolean): void {\n if (flag) {\n if (this.m_awakeFlag == false) {\n this.m_awakeFlag = true;\n this.m_sleepTime = 0.0;\n }\n } else {\n this.m_awakeFlag = false;\n this.m_sleepTime = 0.0;\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_force.setZero();\n this.m_torque = 0.0;\n }\n }\n\n isActive(): boolean {\n return this.m_activeFlag;\n }\n\n /**\n * Set the active state of the body. An inactive body is not simulated and\n * cannot be collided with or woken up. If you pass a flag of true, all fixtures\n * will be added to the broad-phase. If you pass a flag of false, all fixtures\n * will be removed from the broad-phase and all contacts will be destroyed.\n * Fixtures and joints are otherwise unaffected.\n *\n * You may continue to create/destroy fixtures and joints on inactive bodies.\n * Fixtures on an inactive body are implicitly inactive and will not participate\n * in collisions, ray-casts, or queries. Joints connected to an inactive body\n * are implicitly inactive. An inactive body is still owned by a World object\n * and remains\n */\n setActive(flag: boolean): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (flag == this.m_activeFlag) {\n return;\n }\n\n this.m_activeFlag = !!flag;\n\n if (this.m_activeFlag) {\n // Create all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.createProxies(broadPhase, this.m_xf);\n }\n // Contacts are created the next time step.\n\n } else {\n // Destroy all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.destroyProxies(broadPhase);\n }\n\n // Destroy the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n }\n }\n\n isFixedRotation(): boolean {\n return this.m_fixedRotationFlag;\n }\n\n /**\n * Set this body to have fixed rotation. This causes the mass to be reset.\n */\n setFixedRotation(flag: boolean): void {\n if (this.m_fixedRotationFlag == flag) {\n return;\n }\n\n this.m_fixedRotationFlag = !!flag;\n\n this.m_angularVelocity = 0.0;\n\n this.resetMassData();\n }\n\n /**\n * Get the world transform for the body's origin.\n */\n getTransform(): Transform {\n return this.m_xf;\n }\n\n /**\n * Set the position of the body's origin and rotation. Manipulating a body's\n * transform may cause non-physical behavior. Note: contacts are updated on the\n * next call to World.step.\n *\n * @param position The world position of the body's local origin.\n * @param angle The world rotation in radians.\n */\n setTransform(position: Vec2, angle: number): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n this.m_xf.setNum(position, angle);\n this.m_sweep.setTransform(this.m_xf);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, this.m_xf, this.m_xf);\n }\n }\n\n synchronizeTransform(): void {\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Update fixtures in broad-phase.\n */\n synchronizeFixtures(): void {\n const xf = Transform.identity();\n\n this.m_sweep.getTransform(xf, 0);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, xf, this.m_xf);\n }\n }\n\n /**\n * Used in TOI.\n */\n advance(alpha: number): void {\n // Advance to the new safe time. This doesn't sync the broad-phase.\n this.m_sweep.advance(alpha);\n this.m_sweep.c.setVec2(this.m_sweep.c0);\n this.m_sweep.a = this.m_sweep.a0;\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Get the world position for the body's origin.\n */\n getPosition(): Vec2 {\n return this.m_xf.p;\n }\n\n setPosition(p: Vec2): void {\n this.setTransform(p, this.m_sweep.a);\n }\n\n /**\n * Get the current world rotation angle in radians.\n */\n getAngle(): number {\n return this.m_sweep.a;\n }\n\n setAngle(angle: number): void {\n this.setTransform(this.m_xf.p, angle);\n }\n\n /**\n * Get the world position of the center of mass.\n */\n getWorldCenter(): Vec2 {\n return this.m_sweep.c;\n }\n\n /**\n * Get the local position of the center of mass.\n */\n getLocalCenter(): Vec2 {\n return this.m_sweep.localCenter;\n }\n\n /**\n * Get the linear velocity of the center of mass.\n *\n * @return the linear velocity of the center of mass.\n */\n getLinearVelocity(): Vec2 {\n return this.m_linearVelocity;\n }\n\n /**\n * Get the world linear velocity of a world point attached to this body.\n *\n * @param worldPoint A point in world coordinates.\n */\n getLinearVelocityFromWorldPoint(worldPoint: Vec2): Vec2 {\n const localCenter = Vec2.sub(worldPoint, this.m_sweep.c);\n return Vec2.add(this.m_linearVelocity, Vec2.crossNumVec2(this.m_angularVelocity,\n localCenter));\n }\n\n /**\n * Get the world velocity of a local point.\n *\n * @param localPoint A point in local coordinates.\n */\n getLinearVelocityFromLocalPoint(localPoint: Vec2): Vec2 {\n return this.getLinearVelocityFromWorldPoint(this.getWorldPoint(localPoint));\n }\n\n /**\n * Set the linear velocity of the center of mass.\n *\n * @param v The new linear velocity of the center of mass.\n */\n setLinearVelocity(v: Vec2): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (Vec2.dot(v, v) > 0.0) {\n this.setAwake(true);\n }\n this.m_linearVelocity.setVec2(v);\n }\n\n /**\n * Get the angular velocity.\n *\n * @returns the angular velocity in radians/second.\n */\n getAngularVelocity(): number {\n return this.m_angularVelocity;\n }\n\n /**\n * Set the angular velocity.\n *\n * @param omega The new angular velocity in radians/second.\n */\n setAngularVelocity(w: number): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (w * w > 0.0) {\n this.setAwake(true);\n }\n this.m_angularVelocity = w;\n }\n\n getLinearDamping(): number {\n return this.m_linearDamping;\n }\n\n setLinearDamping(linearDamping: number): void {\n this.m_linearDamping = linearDamping;\n }\n\n getAngularDamping(): number {\n return this.m_angularDamping;\n }\n\n setAngularDamping(angularDamping: number): void {\n this.m_angularDamping = angularDamping;\n }\n\n getGravityScale(): number {\n return this.m_gravityScale;\n }\n\n /**\n * Scale the gravity applied to this body.\n */\n setGravityScale(scale: number): void {\n this.m_gravityScale = scale;\n }\n\n /**\n * Get the total mass of the body.\n *\n * @returns The mass, usually in kilograms (kg).\n */\n getMass(): number {\n return this.m_mass;\n }\n\n /**\n * Get the rotational inertia of the body about the local origin.\n *\n * @return the rotational inertia, usually in kg-m^2.\n */\n getInertia(): number {\n return this.m_I + this.m_mass\n * Vec2.dot(this.m_sweep.localCenter, this.m_sweep.localCenter);\n }\n\n /**\n * Copy the mass data of the body to data.\n */\n getMassData(data: MassData): void {\n data.mass = this.m_mass;\n data.I = this.getInertia();\n data.center.setVec2(this.m_sweep.localCenter);\n }\n\n /**\n * This resets the mass properties to the sum of the mass properties of the\n * fixtures. This normally does not need to be called unless you called\n * SetMassData to override the mass and you later want to reset the mass.\n */\n resetMassData(): void {\n // Compute mass data from shapes. Each shape has its own density.\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n this.m_sweep.localCenter.setZero();\n\n // Static and kinematic bodies have zero mass.\n if (this.isStatic() || this.isKinematic()) {\n this.m_sweep.c0.setVec2(this.m_xf.p);\n this.m_sweep.c.setVec2(this.m_xf.p);\n this.m_sweep.a0 = this.m_sweep.a;\n return;\n }\n\n _ASSERT && console.assert(this.isDynamic());\n\n // Accumulate mass over all fixtures.\n const localCenter = Vec2.zero();\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n if (f.m_density == 0.0) {\n continue;\n }\n\n const massData = new MassData();\n f.getMassData(massData);\n this.m_mass += massData.mass;\n localCenter.addMul(massData.mass, massData.center);\n this.m_I += massData.I;\n }\n\n // Compute center of mass.\n if (this.m_mass > 0.0) {\n this.m_invMass = 1.0 / this.m_mass;\n localCenter.mul(this.m_invMass);\n\n } else {\n // Force all dynamic bodies to have a positive mass.\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n }\n\n if (this.m_I > 0.0 && this.m_fixedRotationFlag == false) {\n // Center the inertia about the center of mass.\n this.m_I -= this.m_mass * Vec2.dot(localCenter, localCenter);\n _ASSERT && console.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n\n } else {\n this.m_I = 0.0;\n this.m_invI = 0.0;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(localCenter, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Set the mass properties to override the mass properties of the fixtures. Note\n * that this changes the center of mass position. Note that creating or\n * destroying fixtures can also alter the mass. This function has no effect if\n * the body isn't dynamic.\n *\n * @param massData The mass properties.\n */\n setMassData(massData: MassData): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n this.m_mass = massData.mass;\n if (this.m_mass <= 0.0) {\n this.m_mass = 1.0;\n }\n\n this.m_invMass = 1.0 / this.m_mass;\n\n if (massData.I > 0.0 && this.m_fixedRotationFlag == false) {\n this.m_I = massData.I - this.m_mass\n * Vec2.dot(massData.center, massData.center);\n _ASSERT && console.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(massData.center, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Apply a force at a world point. If the force is not applied at the center of\n * mass, it will generate a torque and affect the angular velocity. This wakes\n * up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyForce(force: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping.\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n this.m_torque += Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), force);\n }\n }\n\n /**\n * Apply a force to the center of mass. This wakes up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param wake Also wake up the body\n */\n applyForceToCenter(force: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n }\n }\n\n /**\n * Apply a torque. This affects the angular velocity without affecting the\n * linear velocity of the center of mass. This wakes up the body.\n *\n * @param torque About the z-axis (out of the screen), usually in N-m.\n * @param wake Also wake up the body\n */\n applyTorque(torque: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_torque += torque;\n }\n }\n\n /**\n * Apply an impulse at a point. This immediately modifies the velocity. It also\n * modifies the angular velocity if the point of application is not at the\n * center of mass. This wakes up the body.\n *\n * @param impulse The world impulse vector, usually in N-seconds or kg-m/s.\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyLinearImpulse(impulse: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_linearVelocity.addMul(this.m_invMass, impulse);\n this.m_angularVelocity += this.m_invI * Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), impulse);\n }\n }\n\n /**\n * Apply an angular impulse.\n *\n * @param impulse The angular impulse in units of kg*m*m/s\n * @param wake Also wake up the body\n */\n applyAngularImpulse(impulse: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_angularVelocity += this.m_invI * impulse;\n }\n }\n\n /**\n * This is used to prevent connected bodies (by joints) from colliding,\n * depending on the joint's collideConnected flag.\n */\n shouldCollide(that: Body): boolean {\n // At least one body should be dynamic.\n if (this.m_type != DYNAMIC && that.m_type != DYNAMIC) {\n return false;\n }\n // Does a joint prevent collision?\n for (let jn = this.m_jointList; jn; jn = jn.next) {\n if (jn.other == that) {\n if (jn.joint.m_collideConnected == false) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addFixture(fixture: Fixture): Fixture {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.createProxies(broadPhase, this.m_xf);\n }\n\n fixture.m_next = this.m_fixtureList;\n this.m_fixtureList = fixture;\n\n // Adjust mass properties if needed.\n if (fixture.m_density > 0.0) {\n this.resetMassData();\n }\n\n // Let the world know we have a new fixture. This will cause new contacts\n // to be created at the beginning of the next time step.\n this.m_world.m_newFixture = true;\n\n return fixture;\n }\n\n /**\n * Creates a fixture and attach it to this body.\n *\n * If the density is non-zero, this function automatically updates the mass of\n * the body.\n *\n * Contacts are not created until the next time step.\n *\n * Warning: This function is locked during callbacks.\n */\n createFixture(def: FixtureDef): Fixture;\n createFixture(shape: Shape, opt?: FixtureOpt): Fixture;\n createFixture(shape: Shape, density?: number): Fixture;\n // tslint:disable-next-line:typedef\n createFixture(shape, fixdef?) {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n const fixture = new Fixture(this, shape, fixdef);\n this._addFixture(fixture);\n return fixture;\n }\n\n /**\n * Destroy a fixture. This removes the fixture from the broad-phase and destroys\n * all contacts associated with this fixture. This will automatically adjust the\n * mass of the body if the body is dynamic and the fixture has positive density.\n * All fixtures attached to a body are implicitly destroyed when the body is\n * destroyed.\n *\n * Warning: This function is locked during callbacks.\n *\n * @param fixture The fixture to be removed.\n */\n destroyFixture(fixture: Fixture): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n _ASSERT && console.assert(fixture.m_body == this);\n\n // Remove the fixture from this body's singly linked list.\n let found = false;\n if (this.m_fixtureList === fixture) {\n this.m_fixtureList = fixture.m_next;\n found = true;\n\n } else {\n let node = this.m_fixtureList;\n while (node != null) {\n if (node.m_next === fixture) {\n node.m_next = fixture.m_next;\n found = true;\n break;\n }\n node = node.m_next;\n }\n }\n\n // You tried to remove a shape that is not attached to this body.\n _ASSERT && console.assert(found);\n\n // Destroy any contacts associated with the fixture.\n let edge = this.m_contactList;\n while (edge) {\n const c = edge.contact;\n edge = edge.next;\n\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n\n if (fixture == fixtureA || fixture == fixtureB) {\n // This destroys the contact and removes it from\n // this body's contact list.\n this.m_world.destroyContact(c);\n }\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.destroyProxies(broadPhase);\n }\n\n fixture.m_body = null;\n fixture.m_next = null;\n\n this.m_world.publish('remove-fixture', fixture);\n\n // Reset the mass data.\n this.resetMassData();\n }\n\n /**\n * Get the corresponding world point of a local point.\n */\n getWorldPoint(localPoint: Vec2): Vec2 {\n return Transform.mulVec2(this.m_xf, localPoint);\n }\n\n /**\n * Get the corresponding world vector of a local vector.\n */\n getWorldVector(localVector: Vec2): Vec2 {\n return Rot.mulVec2(this.m_xf.q, localVector);\n }\n\n /**\n * Gets the corresponding local point of a world point.\n */\n getLocalPoint(worldPoint: Vec2Value): Vec2 {\n return Transform.mulTVec2(this.m_xf, worldPoint);\n }\n\n /**\n * Gets the corresponding local vector of a world vector.\n */\n getLocalVector(worldVector: Vec2Value): Vec2 {\n return Rot.mulTVec2(this.m_xf.q, worldVector);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { Vec2 } from '../common/Vec2';\nimport type { Body } from './Body';\nimport { TimeStep } from \"./Solver\";\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n/**\n * A joint edge is used to connect bodies and joints together in a joint graph\n * where each body is a node and each joint is an edge. A joint edge belongs to\n * a doubly linked list maintained in each attached body. Each joint has two\n * joint nodes, one for each attached body.\n */\nexport class JointEdge {\n /**\n * provides quick access to the other body attached.\n */\n other: Body | null = null;\n /**\n * the joint\n */\n joint: Joint | null = null;\n /**\n * prev the previous joint edge in the body's joint list\n */\n prev: JointEdge | null = null;\n /**\n * the next joint edge in the body's joint list\n */\n next: JointEdge | null = null;\n}\n\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointOpt {\n /**\n * Use this to attach application specific data to your joints.\n */\n userData?: any;\n /**\n * Set this flag to true if the attached bodies\n * should collide.\n */\n collideConnected?: boolean;\n}\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointDef extends JointOpt {\n /**\n * The first attached body.\n */\n bodyA: Body;\n /**\n * The second attached body.\n */\n bodyB: Body;\n}\n\nconst DEFAULTS = {\n userData : null,\n collideConnected : false\n};\n\n/**\n * The base joint class. Joints are used to constraint two bodies together in\n * various fashions. Some joints also feature limits and motors.\n */\nexport abstract class Joint {\n\n /** @internal */ m_type: string = 'unknown-joint';\n\n /** @internal */ m_bodyA: Body;\n /** @internal */ m_bodyB: Body;\n\n /** @internal */ m_collideConnected: boolean;\n\n /** @internal */ m_prev: Joint | null = null;\n /** @internal */ m_next: Joint | null = null;\n\n /** @internal */ m_edgeA: JointEdge = new JointEdge();\n /** @internal */ m_edgeB: JointEdge = new JointEdge();\n\n /** @internal */ m_islandFlag: boolean = false;\n /** @internal */ m_userData: unknown;\n\n constructor(def: JointDef);\n constructor(def: JointOpt, bodyA: Body, bodyB: Body);\n constructor(def: JointDef | JointOpt, bodyA?: Body, bodyB?: Body) {\n bodyA = 'bodyA' in def ? def.bodyA : bodyA;\n bodyB = 'bodyB' in def ? def.bodyB : bodyB;\n\n _ASSERT && console.assert(!!bodyA);\n _ASSERT && console.assert(!!bodyB);\n _ASSERT && console.assert(bodyA != bodyB);\n\n this.m_bodyA = bodyA!;\n this.m_bodyB = bodyB!;\n\n this.m_collideConnected = !!def.collideConnected;\n this.m_userData = def.userData;\n }\n\n /**\n * Short-cut function to determine if either body is inactive.\n */\n isActive(): boolean {\n return this.m_bodyA.isActive() && this.m_bodyB.isActive();\n }\n\n /**\n * Get the type of the concrete joint.\n */\n getType(): string {\n return this.m_type;\n }\n\n /**\n * Get the first body attached to this joint.\n */\n getBodyA(): Body {\n return this.m_bodyA;\n }\n\n /**\n * Get the second body attached to this joint.\n */\n getBodyB(): Body {\n return this.m_bodyB;\n }\n\n /**\n * Get the next joint the world joint list.\n */\n getNext(): Joint {\n return this.m_next;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get collide connected. Note: modifying the collide connect flag won't work\n * correctly because the flag is only checked when fixture AABBs begin to\n * overlap.\n */\n getCollideConnected(): boolean {\n return this.m_collideConnected;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n abstract getAnchorA(): Vec2;\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n abstract getAnchorB(): Vec2;\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n abstract getReactionForce(inv_dt: number): Vec2;\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n abstract getReactionTorque(inv_dt: number): number;\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2): void {}\n\n abstract initVelocityConstraints(step: TimeStep): void;\n\n abstract solveVelocityConstraints(step: TimeStep): void;\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n abstract solvePositionConstraints(step: TimeStep): boolean;\n\n}\n","export const stats = {\n gjkCalls: 0,\n gjkIters: 0,\n gjkMaxIters: 0,\n\n toiTime: 0,\n toiMaxTime: 0,\n toiCalls: 0,\n toiIters: 0,\n toiMaxIters: 0,\n toiRootIters: 0,\n toiMaxRootIters: 0,\n\n toString(newline?: string): string {\n newline = typeof newline === 'string' ? newline : '\\n';\n let string = \"\";\n // tslint:disable-next-line:no-for-in\n for (const name in this) {\n if (typeof this[name] !== 'function' && typeof this[name] !== 'object') {\n string += name + ': ' + this[name] + newline;\n }\n }\n return string;\n }\n};\n","export const now = function(): number {\n return Date.now();\n};\n\nexport const diff = function(time: number): number {\n return Date.now() - time;\n};\n\nexport default {\n now,\n diff,\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { stats } from '../util/stats';\nimport { Shape } from './Shape';\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Transform } from '../common/Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates.\n */\n\nstats.gjkCalls = 0;\nstats.gjkIters = 0;\nstats.gjkMaxIters = 0;\n\n/**\n * Input for Distance. You have to option to use the shape radii in the\n * computation. Even\n */\nexport class DistanceInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n transformA: Transform | null = null;\n transformB: Transform | null = null;\n useRadii: boolean = false;\n}\n\n/**\n * Output for Distance.\n *\n * @prop {Vec2} pointA closest point on shapeA\n * @prop {Vec2} pointB closest point on shapeB\n * @prop distance\n * @prop iterations number of GJK iterations used\n */\nexport class DistanceOutput {\n pointA: Vec2 = Vec2.zero();\n pointB: Vec2 = Vec2.zero();\n distance: number;\n iterations: number;\n}\n\n/**\n * Used to warm start Distance. Set count to zero on first call.\n *\n * @prop {number} metric length or area\n * @prop {array} indexA vertices on shape A\n * @prop {array} indexB vertices on shape B\n * @prop {number} count\n */\nexport class SimplexCache {\n metric: number = 0;\n indexA: number[] = [];\n indexB: number[] = [];\n count: number = 0;\n}\n\n/**\n * Compute the closest points between two shapes. Supports any combination of:\n * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On\n * the first call set SimplexCache.count to zero.\n */\nexport const Distance = function (output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void {\n ++stats.gjkCalls;\n\n const proxyA = input.proxyA;\n const proxyB = input.proxyB;\n const xfA = input.transformA;\n const xfB = input.transformB;\n\n // Initialize the simplex.\n const simplex = new Simplex();\n simplex.readCache(cache, proxyA, xfA, proxyB, xfB);\n\n // Get simplex vertices as an array.\n const vertices = simplex.m_v;\n const k_maxIters = Settings.maxDistnceIterations;\n\n // These store the vertices of the last simplex so that we\n // can check for duplicates and prevent cycling.\n const saveA = [];\n const saveB = []; // int[3]\n let saveCount = 0;\n\n let distanceSqr1 = Infinity;\n let distanceSqr2 = Infinity;\n\n // Main iteration loop.\n let iter = 0;\n while (iter < k_maxIters) {\n // Copy simplex so we can identify duplicates.\n saveCount = simplex.m_count;\n for (let i = 0; i < saveCount; ++i) {\n saveA[i] = vertices[i].indexA;\n saveB[i] = vertices[i].indexB;\n }\n\n simplex.solve();\n\n // If we have 3 points, then the origin is in the corresponding triangle.\n if (simplex.m_count === 3) {\n break;\n }\n\n // Compute closest point.\n const p = simplex.getClosestPoint();\n distanceSqr2 = p.lengthSquared();\n\n // Ensure progress\n if (distanceSqr2 >= distanceSqr1) {\n // break;\n }\n distanceSqr1 = distanceSqr2;\n\n // Get search direction.\n const d = simplex.getSearchDirection();\n\n // Ensure the search direction is numerically fit.\n if (d.lengthSquared() < Math.EPSILON * Math.EPSILON) {\n // The origin is probably contained by a line segment\n // or triangle. Thus the shapes are overlapped.\n\n // We can't return zero here even though there may be overlap.\n // In case the simplex is a point, segment, or triangle it is difficult\n // to determine if the origin is contained in the CSO or very close to it.\n break;\n }\n\n // Compute a tentative new simplex vertex using support points.\n const vertex = vertices[simplex.m_count]; // SimplexVertex\n\n vertex.indexA = proxyA.getSupport(Rot.mulTVec2(xfA.q, Vec2.neg(d)));\n vertex.wA = Transform.mulVec2(xfA, proxyA.getVertex(vertex.indexA));\n\n vertex.indexB = proxyB.getSupport(Rot.mulTVec2(xfB.q, d));\n vertex.wB = Transform.mulVec2(xfB, proxyB.getVertex(vertex.indexB));\n\n vertex.w = Vec2.sub(vertex.wB, vertex.wA);\n\n // Iteration count is equated to the number of support point calls.\n ++iter;\n ++stats.gjkIters;\n\n // Check for duplicate support points. This is the main termination\n // criteria.\n let duplicate = false;\n for (let i = 0; i < saveCount; ++i) {\n if (vertex.indexA === saveA[i] && vertex.indexB === saveB[i]) {\n duplicate = true;\n break;\n }\n }\n\n // If we found a duplicate support point we must exit to avoid cycling.\n if (duplicate) {\n break;\n }\n\n // New vertex is ok and needed.\n ++simplex.m_count;\n }\n\n stats.gjkMaxIters = Math.max(stats.gjkMaxIters, iter);\n\n // Prepare output.\n simplex.getWitnessPoints(output.pointA, output.pointB);\n output.distance = Vec2.distance(output.pointA, output.pointB);\n output.iterations = iter;\n\n // Cache the simplex.\n simplex.writeCache(cache);\n\n // Apply radii if requested.\n if (input.useRadii) {\n const rA = proxyA.m_radius;\n const rB = proxyB.m_radius;\n\n if (output.distance > rA + rB && output.distance > Math.EPSILON) {\n // Shapes are still no overlapped.\n // Move the witness points to the outer surface.\n output.distance -= rA + rB;\n const normal = Vec2.sub(output.pointB, output.pointA);\n normal.normalize();\n output.pointA.addMul(rA, normal);\n output.pointB.subMul(rB, normal);\n } else {\n // Shapes are overlapped when radii are considered.\n // Move the witness points to the middle.\n const p = Vec2.mid(output.pointA, output.pointB);\n output.pointA.setVec2(p);\n output.pointB.setVec2(p);\n output.distance = 0.0;\n }\n }\n}\n\n/**\n * A distance proxy is used by the GJK algorithm. It encapsulates any shape.\n */\nexport class DistanceProxy {\n /** internal */ m_buffer: Vec2[];\n /** internal */ m_vertices: Vec2[];\n /** internal */ m_count: number;\n /** internal */ m_radius: number;\n\n\n constructor() {\n this.m_buffer = []; // Vec2[2]\n this.m_vertices = []; // Vec2[]\n this.m_count = 0;\n this.m_radius = 0;\n }\n\n /**\n * Get the vertex count.\n */\n getVertexCount(): number {\n return this.m_count;\n }\n\n /**\n * Get a vertex by index. Used by Distance.\n */\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * Get the supporting vertex index in the given direction.\n */\n getSupport(d: Vec2): number {\n let bestIndex = 0;\n let bestValue = Vec2.dot(this.m_vertices[0], d);\n for (let i = 0; i < this.m_count; ++i) {\n const value = Vec2.dot(this.m_vertices[i], d);\n if (value > bestValue) {\n bestIndex = i;\n bestValue = value;\n }\n }\n return bestIndex;\n }\n\n /**\n * Get the supporting vertex in the given direction.\n */\n getSupportVertex(d: Vec2): Vec2 {\n return this.m_vertices[this.getSupport(d)];\n }\n\n /**\n * Initialize the proxy using the given shape. The shape must remain in scope\n * while the proxy is in use.\n */\n set(shape: Shape, index: number): void {\n // TODO remove, use shape instead\n _ASSERT && console.assert(typeof shape.computeDistanceProxy === 'function');\n shape.computeDistanceProxy(this, index);\n }\n}\n\nclass SimplexVertex {\n /** support point in proxyA */\n wA: Vec2 = Vec2.zero();\n /** wA index */\n indexA: number;\n\n /** support point in proxyB */\n wB: Vec2 = Vec2.zero();\n /** wB index */\n indexB: number;\n\n /** wB - wA; */\n w: Vec2 = Vec2.zero();\n /** barycentric coordinate for closest point */\n a: number;\n\n set(v: SimplexVertex): void {\n this.indexA = v.indexA;\n this.indexB = v.indexB;\n this.wA = Vec2.clone(v.wA);\n this.wB = Vec2.clone(v.wB);\n this.w = Vec2.clone(v.w);\n this.a = v.a;\n }\n}\n\nclass Simplex {\n m_v1: SimplexVertex;\n m_v2: SimplexVertex;\n m_v3: SimplexVertex;\n m_v: SimplexVertex[];\n m_count: number;\n\n constructor() {\n this.m_v1 = new SimplexVertex();\n this.m_v2 = new SimplexVertex();\n this.m_v3 = new SimplexVertex();\n this.m_v = [ this.m_v1, this.m_v2, this.m_v3 ];\n this.m_count;\n }\n\n /** @internal */\n toString(): string {\n if (this.m_count === 3) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y,\n this.m_v3.a, this.m_v3.wA.x, this.m_v3.wA.y, this.m_v3.wB.x, this.m_v3.wB.y\n ].toString();\n\n } else if (this.m_count === 2) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y\n ].toString();\n\n } else if (this.m_count === 1) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y\n ].toString();\n\n } else {\n return \"+\" + this.m_count;\n }\n }\n\n readCache(cache: SimplexCache, proxyA: DistanceProxy, transformA: Transform, proxyB: DistanceProxy, transformB: Transform): void {\n _ASSERT && console.assert(cache.count <= 3);\n\n // Copy data from cache.\n this.m_count = cache.count;\n for (let i = 0; i < this.m_count; ++i) {\n const v = this.m_v[i];\n v.indexA = cache.indexA[i];\n v.indexB = cache.indexB[i];\n const wALocal = proxyA.getVertex(v.indexA);\n const wBLocal = proxyB.getVertex(v.indexB);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 0.0;\n }\n\n // Compute the new simplex metric, if it is substantially different than\n // old metric then flush the simplex.\n if (this.m_count > 1) {\n const metric1 = cache.metric;\n const metric2 = this.getMetric();\n if (metric2 < 0.5 * metric1 || 2.0 * metric1 < metric2\n || metric2 < Math.EPSILON) {\n // Reset the simplex.\n this.m_count = 0;\n }\n }\n\n // If the cache is empty or invalid...\n if (this.m_count === 0) {\n const v = this.m_v[0];\n v.indexA = 0;\n v.indexB = 0;\n const wALocal = proxyA.getVertex(0);\n const wBLocal = proxyB.getVertex(0);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 1.0;\n this.m_count = 1;\n }\n }\n\n writeCache(cache: SimplexCache): void {\n cache.metric = this.getMetric();\n cache.count = this.m_count;\n for (let i = 0; i < this.m_count; ++i) {\n cache.indexA[i] = this.m_v[i].indexA;\n cache.indexB[i] = this.m_v[i].indexB;\n }\n }\n\n getSearchDirection(): Vec2 {\n switch (this.m_count) {\n case 1:\n return Vec2.neg(this.m_v1.w);\n\n case 2: {\n const e12 = Vec2.sub(this.m_v2.w, this.m_v1.w);\n const sgn = Vec2.crossVec2Vec2(e12, Vec2.neg(this.m_v1.w));\n if (sgn > 0.0) {\n // Origin is left of e12.\n return Vec2.crossNumVec2(1.0, e12);\n } else {\n // Origin is right of e12.\n return Vec2.crossVec2Num(e12, 1.0);\n }\n }\n\n default:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n }\n }\n\n getClosestPoint(): Vec2 {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n\n case 1:\n return Vec2.clone(this.m_v1.w);\n\n case 2:\n return Vec2.combine(this.m_v1.a, this.m_v1.w, this.m_v2.a, this.m_v2.w);\n\n case 3:\n return Vec2.zero();\n\n default:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n }\n }\n\n getWitnessPoints(pA: Vec2, pB: Vec2): void {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n break;\n\n case 1:\n pA.setVec2(this.m_v1.wA);\n pB.setVec2(this.m_v1.wB);\n break;\n\n case 2:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pB.setCombine(this.m_v1.a, this.m_v1.wB, this.m_v2.a, this.m_v2.wB);\n break;\n\n case 3:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pA.addMul(this.m_v3.a, this.m_v3.wA);\n pB.setVec2(pA);\n break;\n\n default:\n _ASSERT && console.assert(false);\n break;\n }\n }\n\n getMetric(): number {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n return 0.0;\n\n case 1:\n return 0.0;\n\n case 2:\n return Vec2.distance(this.m_v1.w, this.m_v2.w);\n\n case 3:\n return Vec2.crossVec2Vec2(Vec2.sub(this.m_v2.w, this.m_v1.w), Vec2.sub(this.m_v3.w,\n this.m_v1.w));\n\n default:\n _ASSERT && console.assert(false);\n return 0.0;\n }\n }\n\n solve(): void {\n switch (this.m_count) {\n case 1:\n break;\n\n case 2:\n this.solve2();\n break;\n\n case 3:\n this.solve3();\n break;\n\n default:\n _ASSERT && console.assert(false);\n }\n }\n\n// Solve a line segment using barycentric coordinates.\n//\n// p = a1 * w1 + a2 * w2\n// a1 + a2 = 1\n//\n// The vector from the origin to the closest point on the line is\n// perpendicular to the line.\n// e12 = w2 - w1\n// dot(p, e) = 0\n// a1 * dot(w1, e) + a2 * dot(w2, e) = 0\n//\n// 2-by-2 linear system\n// [1 1 ][a1] = [1]\n// [w1.e12 w2.e12][a2] = [0]\n//\n// Define\n// d12_1 = dot(w2, e12)\n// d12_2 = -dot(w1, e12)\n// d12 = d12_1 + d12_2\n//\n// Solution\n// a1 = d12_1 / d12\n// a2 = d12_2 / d12\n solve2(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const e12 = Vec2.sub(w2, w1);\n\n // w1 region\n const d12_2 = -Vec2.dot(w1, e12);\n if (d12_2 <= 0.0) {\n // a2 <= 0, so we clamp it to 0\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // w2 region\n const d12_1 = Vec2.dot(w2, e12);\n if (d12_1 <= 0.0) {\n // a1 <= 0, so we clamp it to 0\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // Must be in e12 region.\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n }\n\n// Possible regions:\n// - points[2]\n// - edge points[0]-points[2]\n// - edge points[1]-points[2]\n// - inside the triangle\n solve3(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const w3 = this.m_v3.w;\n\n // Edge12\n // [1 1 ][a1] = [1]\n // [w1.e12 w2.e12][a2] = [0]\n // a3 = 0\n const e12 = Vec2.sub(w2, w1);\n const w1e12 = Vec2.dot(w1, e12);\n const w2e12 = Vec2.dot(w2, e12);\n const d12_1 = w2e12;\n const d12_2 = -w1e12;\n\n // Edge13\n // [1 1 ][a1] = [1]\n // [w1.e13 w3.e13][a3] = [0]\n // a2 = 0\n const e13 = Vec2.sub(w3, w1);\n const w1e13 = Vec2.dot(w1, e13);\n const w3e13 = Vec2.dot(w3, e13);\n const d13_1 = w3e13;\n const d13_2 = -w1e13;\n\n // Edge23\n // [1 1 ][a2] = [1]\n // [w2.e23 w3.e23][a3] = [0]\n // a1 = 0\n const e23 = Vec2.sub(w3, w2);\n const w2e23 = Vec2.dot(w2, e23);\n const w3e23 = Vec2.dot(w3, e23);\n const d23_1 = w3e23;\n const d23_2 = -w2e23;\n\n // Triangle123\n const n123 = Vec2.crossVec2Vec2(e12, e13);\n\n const d123_1 = n123 * Vec2.crossVec2Vec2(w2, w3);\n const d123_2 = n123 * Vec2.crossVec2Vec2(w3, w1);\n const d123_3 = n123 * Vec2.crossVec2Vec2(w1, w2);\n\n // w1 region\n if (d12_2 <= 0.0 && d13_2 <= 0.0) {\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // e12\n if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) {\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n return;\n }\n\n // e13\n if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) {\n const inv_d13 = 1.0 / (d13_1 + d13_2);\n this.m_v1.a = d13_1 * inv_d13;\n this.m_v3.a = d13_2 * inv_d13;\n this.m_count = 2;\n this.m_v2.set(this.m_v3);\n return;\n }\n\n // w2 region\n if (d12_1 <= 0.0 && d23_2 <= 0.0) {\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // w3 region\n if (d13_1 <= 0.0 && d23_1 <= 0.0) {\n this.m_v3.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // e23\n if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) {\n const inv_d23 = 1.0 / (d23_1 + d23_2);\n this.m_v2.a = d23_1 * inv_d23;\n this.m_v3.a = d23_2 * inv_d23;\n this.m_count = 2;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // Must be in triangle123\n const inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3);\n this.m_v1.a = d123_1 * inv_d123;\n this.m_v2.a = d123_2 * inv_d123;\n this.m_v3.a = d123_3 * inv_d123;\n this.m_count = 3;\n }\n}\n\n/**\n * Determine if two generic shapes overlap.\n */\nexport const testOverlap = function (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform): boolean {\n const input = new DistanceInput();\n input.proxyA.set(shapeA, indexA);\n input.proxyB.set(shapeB, indexB);\n input.transformA = xfA;\n input.transformB = xfB;\n input.useRadii = true;\n\n const cache = new SimplexCache();\n const output = new DistanceOutput();\n\n Distance(output, cache, input);\n\n return output.distance < 10.0 * Math.EPSILON;\n}\n\n// legacy exports\nDistance.testOverlap = testOverlap;\nDistance.Input = DistanceInput;\nDistance.Output = DistanceOutput;\nDistance.Proxy = DistanceProxy;\nDistance.Cache = SimplexCache;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { stats } from '../util/stats';\nimport Timer from '../util/Timer';\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Sweep } from '../common/Sweep';\nimport { Transform } from '../common/Transform';\n\nimport { Distance, DistanceInput, DistanceOutput, DistanceProxy, SimplexCache } from './Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n/**\n * Input parameters for TimeOfImpact.\n */\nexport class TOIInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n sweepA: Sweep = new Sweep();\n sweepB: Sweep = new Sweep();\n /** defines sweep interval [0, tMax] */\n tMax: number | undefined;\n}\n\nexport enum TOIOutputState {\n e_unknown = 0,\n e_failed = 1,\n e_overlapped = 2,\n e_touching = 3,\n e_separated = 4,\n}\n\n/**\n * Output parameters for TimeOfImpact.\n */\nexport class TOIOutput {\n state: TOIOutputState | undefined;\n t: number | undefined;\n}\n\nstats.toiTime = 0;\nstats.toiMaxTime = 0;\nstats.toiCalls = 0;\nstats.toiIters = 0;\nstats.toiMaxIters = 0;\nstats.toiRootIters = 0;\nstats.toiMaxRootIters = 0;\n\n/**\n * Compute the upper bound on time before two shapes penetrate. Time is\n * represented as a fraction between [0,tMax]. This uses a swept separating axis\n * and may miss some intermediate, non-tunneling collision. If you change the\n * time interval, you should call this function again.\n *\n * Note: use Distance to compute the contact point and normal at the time of\n * impact.\n *\n * CCD via the local separating axis method. This seeks progression by computing\n * the largest time at which separation is maintained.\n */\nexport const TimeOfImpact = function (output: TOIOutput, input: TOIInput): void {\n const timer = Timer.now();\n\n ++stats.toiCalls;\n\n output.state = TOIOutputState.e_unknown;\n output.t = input.tMax;\n\n const proxyA = input.proxyA; // DistanceProxy\n const proxyB = input.proxyB; // DistanceProxy\n\n const sweepA = input.sweepA; // Sweep\n const sweepB = input.sweepB; // Sweep\n\n // Large rotations can make the root finder fail, so we normalize the\n // sweep angles.\n sweepA.normalize();\n sweepB.normalize();\n\n const tMax = input.tMax;\n\n const totalRadius = proxyA.m_radius + proxyB.m_radius;\n const target = Math.max(Settings.linearSlop, totalRadius - 3.0 * Settings.linearSlop);\n const tolerance = 0.25 * Settings.linearSlop;\n _ASSERT && console.assert(target > tolerance);\n\n let t1 = 0.0;\n const k_maxIterations = Settings.maxTOIIterations;\n let iter = 0;\n\n // Prepare input for distance query.\n const cache = new SimplexCache();\n\n const distanceInput = new DistanceInput();\n distanceInput.proxyA = input.proxyA;\n distanceInput.proxyB = input.proxyB;\n distanceInput.useRadii = false;\n\n // The outer loop progressively attempts to compute new separating axes.\n // This loop terminates when an axis is repeated (no progress is made).\n while (true) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n sweepA.getTransform(xfA, t1);\n sweepB.getTransform(xfB, t1);\n\n // Get the distance between shapes. We can also use the results\n // to get a separating axis.\n distanceInput.transformA = xfA;\n distanceInput.transformB = xfB;\n const distanceOutput = new DistanceOutput();\n Distance(distanceOutput, cache, distanceInput);\n\n // If the shapes are overlapped, we give up on continuous collision.\n if (distanceOutput.distance <= 0.0) {\n // Failure!\n output.state = TOIOutputState.e_overlapped;\n output.t = 0.0;\n break;\n }\n\n if (distanceOutput.distance < target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n break;\n }\n\n // Initialize the separating axis.\n const fcn = new SeparationFunction();\n fcn.initialize(cache, proxyA, sweepA, proxyB, sweepB, t1);\n\n // if (false) {\n // // Dump the curve seen by the root finder\n // const N = 100;\n // const dx = 1.0 / N;\n // const xs = []; // [ N + 1 ];\n // const fs = []; // [ N + 1 ];\n // const x = 0.0;\n // for (const i = 0; i <= N; ++i) {\n // sweepA.getTransform(xfA, x);\n // sweepB.getTransform(xfB, x);\n // const f = fcn.evaluate(xfA, xfB) - target;\n // printf(\"%g %g\\n\", x, f);\n // xs[i] = x;\n // fs[i] = f;\n // x += dx;\n // }\n // }\n\n // Compute the TOI on the separating axis. We do this by successively\n // resolving the deepest point. This loop is bounded by the number of\n // vertices.\n let done = false;\n let t2 = tMax;\n let pushBackIter = 0;\n while (true) {\n // Find the deepest point at t2. Store the witness point indices.\n let s2 = fcn.findMinSeparation(t2);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Is the final configuration separated?\n if (s2 > target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_separated;\n output.t = tMax;\n done = true;\n break;\n }\n\n // Has the separation reached tolerance?\n if (s2 > target - tolerance) {\n // Advance the sweeps\n t1 = t2;\n break;\n }\n\n // Compute the initial separation of the witness points.\n let s1 = fcn.evaluate(t1);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Check for initial overlap. This might happen if the root finder\n // runs out of iterations.\n if (s1 < target - tolerance) {\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n done = true;\n break;\n }\n\n // Check for touching\n if (s1 <= target + tolerance) {\n // Victory! t1 should hold the TOI (could be 0.0).\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n done = true;\n break;\n }\n\n // Compute 1D root of: f(x) - target = 0\n let rootIterCount = 0;\n let a1 = t1;\n let a2 = t2;\n while (true) {\n // Use a mix of the secant rule and bisection.\n let t;\n if (rootIterCount & 1) {\n // Secant rule to improve convergence.\n t = a1 + (target - s1) * (a2 - a1) / (s2 - s1);\n } else {\n // Bisection to guarantee progress.\n t = 0.5 * (a1 + a2);\n }\n\n ++rootIterCount;\n ++stats.toiRootIters;\n\n const s = fcn.evaluate(t);\n const indexA = fcn.indexA;\n const indexB = fcn.indexB;\n\n if (Math.abs(s - target) < tolerance) {\n // t2 holds a tentative value for t1\n t2 = t;\n break;\n }\n\n // Ensure we continue to bracket the root.\n if (s > target) {\n a1 = t;\n s1 = s;\n } else {\n a2 = t;\n s2 = s;\n }\n\n if (rootIterCount === 50) {\n break;\n }\n }\n\n stats.toiMaxRootIters = Math.max(stats.toiMaxRootIters, rootIterCount);\n\n ++pushBackIter;\n\n if (pushBackIter === Settings.maxPolygonVertices) {\n break;\n }\n }\n\n ++iter;\n ++stats.toiIters;\n\n if (done) {\n break;\n }\n\n if (iter === k_maxIterations) {\n // Root finder got stuck. Semi-victory.\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n break;\n }\n }\n\n stats.toiMaxIters = Math.max(stats.toiMaxIters, iter);\n\n const time = Timer.diff(timer);\n stats.toiMaxTime = Math.max(stats.toiMaxTime, time);\n stats.toiTime += time;\n}\n\nenum SeparationFunctionType {\n e_points = 1,\n e_faceA = 2,\n e_faceB = 3,\n}\n\nclass SeparationFunction {\n m_proxyA: DistanceProxy = new DistanceProxy();\n m_proxyB: DistanceProxy = new DistanceProxy();\n m_sweepA: Sweep;\n m_sweepB: Sweep;\n indexA: number;\n indexB: number;\n m_type: SeparationFunctionType;\n m_localPoint: Vec2 = Vec2.zero();\n m_axis: Vec2 = Vec2.zero();\n\n // TODO_ERIN might not need to return the separation\n\n initialize(cache: SimplexCache, proxyA: DistanceProxy, sweepA: Sweep, proxyB: DistanceProxy, sweepB: Sweep, t1: number): number {\n this.m_proxyA = proxyA;\n this.m_proxyB = proxyB;\n const count = cache.count;\n _ASSERT && console.assert(0 < count && count < 3);\n\n this.m_sweepA = sweepA;\n this.m_sweepB = sweepB;\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t1);\n this.m_sweepB.getTransform(xfB, t1);\n\n if (count === 1) {\n this.m_type = SeparationFunctionType.e_points;\n const localPointA = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n this.m_axis.setCombine(1, pointB, -1, pointA);\n const s = this.m_axis.normalize();\n return s;\n\n } else if (cache.indexA[0] === cache.indexA[1]) {\n // Two points on B and one on A.\n this.m_type = SeparationFunctionType.e_faceB;\n const localPointB1 = proxyB.getVertex(cache.indexB[0]);\n const localPointB2 = proxyB.getVertex(cache.indexB[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointB2, localPointB1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointB1, localPointB2);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n const localPointA = proxyA.getVertex(cache.indexA[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n let s = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n\n } else {\n // Two points on A and one or two points on B.\n this.m_type = SeparationFunctionType.e_faceA;\n const localPointA1 = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointA2 = this.m_proxyA.getVertex(cache.indexA[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointA2, localPointA1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointA1, localPointA2);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n let s = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n }\n }\n\n compute(find: boolean, t: number): number {\n // It was findMinSeparation and evaluate\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t);\n this.m_sweepB.getTransform(xfB, t);\n\n switch (this.m_type) {\n case SeparationFunctionType.e_points: {\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, this.m_axis);\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(this.m_axis));\n\n this.indexA = this.m_proxyA.getSupport(axisA);\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, this.m_axis) - Vec2.dot(pointA, this.m_axis);\n return sep;\n }\n\n case SeparationFunctionType.e_faceA: {\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n if (find) {\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(normal));\n\n this.indexA = -1;\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n return sep;\n }\n\n case SeparationFunctionType.e_faceB: {\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, Vec2.neg(normal));\n\n this.indexB = -1;\n this.indexA = this.m_proxyA.getSupport(axisA);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n const sep = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n return sep;\n }\n\n default:\n _ASSERT && console.assert(false);\n if (find) {\n this.indexA = -1;\n this.indexB = -1;\n }\n return 0.0;\n }\n }\n\n findMinSeparation(t: number): number {\n return this.compute(true, t);\n }\n\n evaluate(t: number): number {\n return this.compute(false, t);\n }\n}\n\nconst separationFunction_reuse = new SeparationFunction();\n\n// legacy exports\nTimeOfImpact.Input = TOIInput;\nTimeOfImpact.Output = TOIOutput;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { Body } from './Body';\nimport type { Contact } from './Contact';\nimport { Joint } from './Joint';\nimport { TimeOfImpact, TOIInput, TOIOutput, TOIOutputState } from '../collision/TimeOfImpact';\nimport { Distance, DistanceInput, DistanceOutput, SimplexCache } from '../collision/Distance';\nimport { World } from \"./World\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport class TimeStep {\n /** time step */\n dt: number = 0;\n /** inverse time step (0 if dt == 0) */\n inv_dt: number = 0;\n velocityIterations: number = 0;\n positionIterations: number = 0;\n warmStarting: boolean = false;\n blockSolve: boolean = true;\n\n /** timestep ratio for variable timestep */\n inv_dt0: number = 0.0;\n /** dt * inv_dt0 */\n dtRatio: number = 1;\n\n reset(dt: number): void {\n if (this.dt > 0.0) {\n this.inv_dt0 = this.inv_dt;\n }\n this.dt = dt;\n this.inv_dt = dt == 0 ? 0 : 1 / dt;\n this.dtRatio = dt * this.inv_dt0;\n }\n}\n\n// reuse\nconst s_subStep = new TimeStep();\n\n/**\n * Contact impulses for reporting. Impulses are used instead of forces because\n * sub-step forces may approach infinity for rigid body collisions. These match\n * up one-to-one with the contact points in Manifold.\n */\nexport class ContactImpulse {\n // TODO: merge with Contact class?\n\n private readonly contact: Contact;\n private readonly normals: number[];\n private readonly tangents: number[];\n\n constructor(contact: Contact) {\n this.contact = contact;\n this.normals = [];\n this.tangents = [];\n }\n\n get normalImpulses(): number[] {\n const contact = this.contact;\n const normals = this.normals;\n normals.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n normals.push(contact.v_points[p].normalImpulse);\n }\n return normals;\n }\n\n get tangentImpulses(): number[] {\n const contact = this.contact;\n const tangents = this.tangents;\n tangents.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n tangents.push(contact.v_points[p].tangentImpulse);\n }\n return tangents;\n }\n}\n\n/**\n * Finds and solves islands. An island is a connected subset of the world.\n */\nexport class Solver {\n m_world: World;\n m_stack: Body[];\n m_bodies: Body[];\n m_contacts: Contact[];\n m_joints: Joint[];\n\n constructor(world: World) {\n this.m_world = world;\n this.m_stack = [];\n this.m_bodies = [];\n this.m_contacts = [];\n this.m_joints = [];\n }\n\n clear(): void {\n this.m_stack.length = 0;\n this.m_bodies.length = 0;\n this.m_contacts.length = 0;\n this.m_joints.length = 0;\n }\n\n addBody(body: Body): void {\n _ASSERT && console.assert(body instanceof Body, 'Not a Body!', body);\n this.m_bodies.push(body);\n // why?\n // body.c_position.c.setZero();\n // body.c_position.a = 0;\n // body.c_velocity.v.setZero();\n // body.c_velocity.w = 0;\n }\n\n addContact(contact: Contact): void {\n // _ASSERT && console.assert(contact instanceof Contact, 'Not a Contact!', contact);\n this.m_contacts.push(contact);\n }\n\n addJoint(joint: Joint): void {\n _ASSERT && console.assert(joint instanceof Joint, 'Not a Joint!', joint);\n this.m_joints.push(joint);\n }\n\n solveWorld(step: TimeStep): void {\n const world = this.m_world;\n\n // Clear all the island flags.\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n }\n for (let c = world.m_contactList; c; c = c.m_next) {\n c.m_islandFlag = false;\n }\n for (let j = world.m_jointList; j; j = j.m_next) {\n j.m_islandFlag = false;\n }\n\n // Build and simulate all awake islands.\n const stack = this.m_stack;\n let loop = -1;\n for (let seed = world.m_bodyList; seed; seed = seed.m_next) {\n loop++;\n if (seed.m_islandFlag) {\n continue;\n }\n\n if (seed.isAwake() == false || seed.isActive() == false) {\n continue;\n }\n\n // The seed can be dynamic or kinematic.\n if (seed.isStatic()) {\n continue;\n }\n\n // Reset island and stack.\n this.clear();\n\n stack.push(seed);\n\n seed.m_islandFlag = true;\n\n // Perform a depth first search (DFS) on the constraint graph.\n while (stack.length > 0) {\n // Grab the next body off the stack and add it to the island.\n const b = stack.pop();\n _ASSERT && console.assert(b.isActive() == true);\n this.addBody(b);\n\n // Make sure the body is awake.\n b.setAwake(true);\n\n // To keep islands as small as possible, we don't\n // propagate islands across static bodies.\n if (b.isStatic()) {\n continue;\n }\n\n // Search all contacts connected to this body.\n for (let ce = b.m_contactList; ce; ce = ce.next) {\n const contact = ce.contact;\n\n // Has this contact already been added to an island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Is this contact solid and touching?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n this.addContact(contact);\n contact.m_islandFlag = true;\n\n const other = ce.other;\n\n // Was the other body already added to this island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && console.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n\n // Search all joints connect to this body.\n for (let je = b.m_jointList; je; je = je.next) {\n if (je.joint.m_islandFlag == true) {\n continue;\n }\n\n const other = je.other;\n\n // Don't simulate joints connected to inactive bodies.\n if (other.isActive() == false) {\n continue;\n }\n\n this.addJoint(je.joint);\n je.joint.m_islandFlag = true;\n\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && console.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n }\n\n this.solveIsland(step);\n\n // Post solve cleanup.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n // Allow static bodies to participate in other islands.\n // TODO: are they added at all?\n const b = this.m_bodies[i];\n if (b.isStatic()) {\n b.m_islandFlag = false;\n }\n }\n }\n }\n\n solveIsland(step: TimeStep): void {\n // B2: Island Solve\n const world = this.m_world;\n const gravity = world.m_gravity;\n const allowSleep = world.m_allowSleep;\n\n const h = step.dt;\n\n // Integrate velocities and apply damping. Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.m_sweep.c);\n const a = body.m_sweep.a;\n const v = Vec2.clone(body.m_linearVelocity);\n let w = body.m_angularVelocity;\n\n // Store positions for continuous collision.\n body.m_sweep.c0.setVec2(body.m_sweep.c);\n body.m_sweep.a0 = body.m_sweep.a;\n\n if (body.isDynamic()) {\n // Integrate velocities.\n v.addMul(h * body.m_gravityScale, gravity);\n v.addMul(h * body.m_invMass, body.m_force);\n w += h * body.m_invI * body.m_torque;\n /**\n *
\n         * Apply damping.\n         * ODE: dv/dt + c * v = 0\n         * Solution: v(t) = v0 * exp(-c * t)\n         * Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)\n         * v2 = exp(-c * dt) * v1\n         * Pade approximation:\n         * v2 = v1 * 1 / (1 + c * dt)\n         * 
\n */\n v.mul(1.0 / (1.0 + h * body.m_linearDamping));\n w *= 1.0 / (1.0 + h * body.m_angularDamping);\n }\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(step);\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(step);\n }\n\n if (step.warmStarting) {\n // Warm start.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.warmStartConstraint(step);\n }\n }\n\n for (let i = 0; i < this.m_joints.length; ++i) {\n const joint = this.m_joints[i];\n joint.initVelocityConstraints(step);\n }\n\n // Solve velocity constraints\n for (let i = 0; i < step.velocityIterations; ++i) {\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n joint.solveVelocityConstraints(step);\n }\n\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(step);\n }\n }\n\n // Store impulses for warm starting\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.storeConstraintImpulses(step);\n }\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.lengthSquared(translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c.setVec2(c);\n body.c_position.a = a;\n body.c_velocity.v.setVec2(v);\n body.c_velocity.w = w;\n }\n\n // Solve position constraints\n let positionSolved = false;\n for (let i = 0; i < step.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraint(step);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -3.0 * Settings.linearSlop;\n\n let jointsOkay = true;\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n const jointOkay = joint.solvePositionConstraints(step);\n jointsOkay = jointsOkay && jointOkay;\n }\n\n if (contactsOkay && jointsOkay) {\n // Exit early if the position errors are small.\n positionSolved = true;\n break;\n }\n }\n\n // Copy state buffers back to the bodies\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n body.m_sweep.c.setVec2(body.c_position.c);\n body.m_sweep.a = body.c_position.a;\n body.m_linearVelocity.setVec2(body.c_velocity.v);\n body.m_angularVelocity = body.c_velocity.w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n\n if (allowSleep) {\n let minSleepTime = Infinity;\n\n const linTolSqr = Settings.linearSleepToleranceSqr;\n const angTolSqr = Settings.angularSleepToleranceSqr;\n\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n if (body.isStatic()) {\n continue;\n }\n\n if ((body.m_autoSleepFlag == false)\n || (body.m_angularVelocity * body.m_angularVelocity > angTolSqr)\n || (Vec2.lengthSquared(body.m_linearVelocity) > linTolSqr)) {\n body.m_sleepTime = 0.0;\n minSleepTime = 0.0;\n } else {\n body.m_sleepTime += h;\n minSleepTime = Math.min(minSleepTime, body.m_sleepTime);\n }\n }\n\n if (minSleepTime >= Settings.timeToSleep && positionSolved) {\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.setAwake(false);\n }\n }\n }\n }\n\n /**\n * Find TOI contacts and solve them.\n */\n solveWorldTOI(step: TimeStep): void {\n const world = this.m_world;\n\n if (world.m_stepComplete) {\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n b.m_sweep.alpha0 = 0.0;\n }\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Invalidate TOI\n c.m_toiFlag = false;\n c.m_islandFlag = false;\n c.m_toiCount = 0;\n c.m_toi = 1.0;\n }\n }\n\n // Find TOI events and solve them.\n while (true) {\n // Find the first TOI.\n let minContact = null; // Contact\n let minAlpha = 1.0;\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Is this contact disabled?\n if (c.isEnabled() == false) {\n continue;\n }\n\n // Prevent excessive sub-stepping.\n if (c.m_toiCount > Settings.maxSubSteps) {\n continue;\n }\n\n let alpha = 1.0;\n if (c.m_toiFlag) {\n // This contact has a valid cached TOI.\n alpha = c.m_toi;\n } else {\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n // Is there a sensor?\n if (fA.isSensor() || fB.isSensor()) {\n continue;\n }\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n _ASSERT && console.assert(bA.isDynamic() || bB.isDynamic());\n\n const activeA = bA.isAwake() && !bA.isStatic();\n const activeB = bB.isAwake() && !bB.isStatic();\n\n // Is at least one body active (awake and dynamic or kinematic)?\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const collideA = bA.isBullet() || !bA.isDynamic();\n const collideB = bB.isBullet() || !bB.isDynamic();\n\n // Are these two non-bullet dynamic bodies?\n if (collideA == false && collideB == false) {\n continue;\n }\n\n // Compute the TOI for this contact.\n // Put the sweeps onto the same time interval.\n let alpha0 = bA.m_sweep.alpha0;\n\n if (bA.m_sweep.alpha0 < bB.m_sweep.alpha0) {\n alpha0 = bB.m_sweep.alpha0;\n bA.m_sweep.advance(alpha0);\n } else if (bB.m_sweep.alpha0 < bA.m_sweep.alpha0) {\n alpha0 = bA.m_sweep.alpha0;\n bB.m_sweep.advance(alpha0);\n }\n\n _ASSERT && console.assert(alpha0 < 1.0);\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const sweepA = bA.m_sweep;\n const sweepB = bB.m_sweep;\n\n // Compute the time of impact in interval [0, minTOI]\n const input = new TOIInput(); // TODO: reuse\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.sweepA.set(bA.m_sweep);\n input.sweepB.set(bB.m_sweep);\n input.tMax = 1.0;\n\n const output = new TOIOutput(); // TODO: reuse\n TimeOfImpact(output, input);\n\n // Beta is the fraction of the remaining portion of the [time?].\n const beta = output.t;\n if (output.state == TOIOutputState.e_touching) {\n alpha = Math.min(alpha0 + (1.0 - alpha0) * beta, 1.0);\n } else {\n alpha = 1.0;\n }\n\n c.m_toi = alpha;\n c.m_toiFlag = true;\n }\n\n if (alpha < minAlpha) {\n // This is the minimum TOI found so far.\n minContact = c;\n minAlpha = alpha;\n }\n }\n\n if (minContact == null || 1.0 - 10.0 * Math.EPSILON < minAlpha) {\n // No more TOI events. Done!\n world.m_stepComplete = true;\n break;\n }\n\n // Advance the bodies to the TOI.\n const fA = minContact.getFixtureA();\n const fB = minContact.getFixtureB();\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const backup1 = bA.m_sweep.clone();\n const backup2 = bB.m_sweep.clone();\n\n bA.advance(minAlpha);\n bB.advance(minAlpha);\n\n // The TOI contact likely has some new contact points.\n minContact.update(world);\n minContact.m_toiFlag = false;\n ++minContact.m_toiCount;\n\n // Is the contact solid?\n if (minContact.isEnabled() == false || minContact.isTouching() == false) {\n // Restore the sweeps.\n minContact.setEnabled(false);\n bA.m_sweep.set(backup1);\n bB.m_sweep.set(backup2);\n bA.synchronizeTransform();\n bB.synchronizeTransform();\n continue;\n }\n\n bA.setAwake(true);\n bB.setAwake(true);\n\n // Build the island\n this.clear();\n this.addBody(bA);\n this.addBody(bB);\n this.addContact(minContact);\n\n bA.m_islandFlag = true;\n bB.m_islandFlag = true;\n minContact.m_islandFlag = true;\n\n // Get contacts on bodyA and bodyB.\n const bodies = [ bA, bB ];\n for (let i = 0; i < bodies.length; ++i) {\n const body = bodies[i];\n if (body.isDynamic()) {\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n // if (this.m_bodyCount == this.m_bodyCapacity) { break; }\n // if (this.m_contactCount == this.m_contactCapacity) { break; }\n\n const contact = ce.contact;\n\n // Has this contact already been added to the island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Only add if either is static, kinematic or bullet.\n const other = ce.other;\n if (other.isDynamic() && !body.isBullet() && !other.isBullet()) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n // Tentatively advance the body to the TOI.\n const backup = other.m_sweep.clone();\n if (other.m_islandFlag == false) {\n other.advance(minAlpha);\n }\n\n // Update the contact points\n contact.update(world);\n\n // Was the contact disabled by the user?\n // Are there contact points?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n other.m_sweep.set(backup);\n other.synchronizeTransform();\n continue;\n }\n\n // Add the contact to the island\n contact.m_islandFlag = true;\n this.addContact(contact);\n\n // Has the other body already been added to the island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // Add the other body to the island.\n other.m_islandFlag = true;\n\n if (!other.isStatic()) {\n other.setAwake(true);\n }\n\n this.addBody(other);\n }\n }\n }\n\n s_subStep.reset((1.0 - minAlpha) * step.dt);\n s_subStep.dtRatio = 1.0;\n s_subStep.positionIterations = 20;\n s_subStep.velocityIterations = step.velocityIterations;\n s_subStep.warmStarting = false;\n\n this.solveIslandTOI(s_subStep, bA, bB);\n\n // Reset island flags and synchronize broad-phase proxies.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.m_islandFlag = false;\n\n if (!body.isDynamic()) {\n continue;\n }\n\n body.synchronizeFixtures();\n\n // Invalidate all contact TOIs on this displaced body.\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n ce.contact.m_toiFlag = false;\n ce.contact.m_islandFlag = false;\n }\n }\n\n // Commit fixture proxy movements to the broad-phase so that new contacts\n // are created.\n // Also, some contacts can be destroyed.\n world.findNewContacts();\n\n if (world.m_subStepping) {\n world.m_stepComplete = false;\n break;\n }\n }\n }\n\n solveIslandTOI(subStep: TimeStep, toiA: Body, toiB: Body): void {\n const world = this.m_world;\n\n // Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.c_position.c.setVec2(body.m_sweep.c);\n body.c_position.a = body.m_sweep.a;\n body.c_velocity.v.setVec2(body.m_linearVelocity);\n body.c_velocity.w = body.m_angularVelocity;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(subStep);\n }\n\n // Solve position constraints.\n for (let i = 0; i < subStep.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraintTOI(subStep, toiA, toiB);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -1.5 * Settings.linearSlop;\n if (contactsOkay) {\n break;\n }\n }\n\n if (false) {\n // Is the new position really safe?\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const c = this.m_contacts[i];\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const input = new DistanceInput();\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.transformA = bA.getTransform();\n input.transformB = bB.getTransform();\n input.useRadii = false;\n\n const output = new DistanceOutput();\n const cache = new SimplexCache();\n Distance(output, cache, input);\n\n if (output.distance == 0 || cache.count == 3) {\n cache.count += 0;\n }\n }\n }\n\n // Leap of faith to new safe state.\n toiA.m_sweep.c0.setVec2(toiA.c_position.c);\n toiA.m_sweep.a0 = toiA.c_position.a;\n toiB.m_sweep.c0.setVec2(toiB.c_position.c);\n toiB.m_sweep.a0 = toiB.c_position.a;\n\n // No warm starting is needed for TOI events because warm\n // starting impulses were applied in the discrete solver.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(subStep);\n }\n\n // Solve velocity constraints.\n for (let i = 0; i < subStep.velocityIterations; ++i) {\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(subStep);\n }\n }\n\n // Don't store the TOI contact forces for warm starting\n // because they can be quite large.\n\n const h = subStep.dt;\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.dot(translation, translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n\n // Sync bodies\n body.m_sweep.c = c;\n body.m_sweep.a = a;\n body.m_linearVelocity = v;\n body.m_angularVelocity = w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n }\n\n /** @internal */\n postSolveIsland(): void {\n for (let c = 0; c < this.m_contacts.length; ++c) {\n const contact = this.m_contacts[c];\n this.m_world.postSolve(contact, contact.m_impulse);\n }\n }\n}\n\n// @ts-ignore\nSolver.TimeStep = TimeStep;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from './Vec2';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 2-by-2 matrix. Stored in column-major order.\n */\nexport class Mat22 {\n ex: Vec2;\n ey: Vec2;\n\n constructor(a: number, b: number, c: number, d: number);\n constructor(a: { x: number; y: number }, b: { x: number; y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(a?, b?, c?, d?) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec2.clone(a);\n this.ey = Vec2.clone(b);\n } else if (typeof a === 'number') {\n this.ex = Vec2.neo(a, c);\n this.ey = Vec2.neo(b, d);\n } else {\n this.ex = Vec2.zero();\n this.ey = Vec2.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.ex) && Vec2.isValid(obj.ey);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Mat22.isValid(o), 'Invalid Mat22!', o);\n }\n\n set(a: Mat22): void;\n set(a: Vec2, b: Vec2): void;\n set(a: number, b: number, c: number, d: number): void;\n // tslint:disable-next-line:typedef\n set(a, b?, c?, d?): void {\n if (typeof a === 'number' && typeof b === 'number' && typeof c === 'number'\n && typeof d === 'number') {\n this.ex.setNum(a, c);\n this.ey.setNum(b, d);\n\n } else if (typeof a === 'object' && typeof b === 'object') {\n this.ex.setVec2(a);\n this.ey.setVec2(b);\n\n } else if (typeof a === 'object') {\n _ASSERT && Mat22.assert(a);\n this.ex.setVec2(a.ex);\n this.ey.setVec2(a.ey);\n\n } else {\n _ASSERT && console.assert(false);\n }\n }\n\n setIdentity(): void {\n this.ex.x = 1.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 1.0;\n }\n\n setZero(): void {\n this.ex.x = 0.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 0.0;\n }\n\n getInverse(): Mat22 {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const imx = new Mat22();\n imx.ex.x = det * d;\n imx.ey.x = -det * b;\n imx.ex.y = -det * c;\n imx.ey.y = det * a;\n return imx;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const w = Vec2.zero();\n w.x = det * (d * v.x - b * v.y);\n w.y = det * (a * v.y - c * v.x);\n return w;\n }\n\n /**\n * Multiply a matrix times a vector. If a rotation matrix is provided, then this\n * transforms the vector from one frame to another.\n */\n static mul(mx: Mat22, my: Mat22): Mat22;\n static mul(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(mx, v) {\n if (v && 'x' in v && 'y' in v) {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n }\n\n static mulMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n /**\n * Multiply a matrix transpose times a vector. If a rotation matrix is provided,\n * then this transforms the vector from one frame to another (inverse\n * transform).\n */\n static mulT(mx: Mat22, my: Mat22): Mat22;\n static mulT(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(mx, v) {\n if (v && 'x' in v && 'y' in v) { // Vec2\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulTVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n }\n\n static mulTMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n static abs(mx: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n return new Mat22(Vec2.abs(mx.ex), Vec2.abs(mx.ey));\n }\n\n static add(mx1: Mat22, mx2: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx1);\n _ASSERT && Mat22.assert(mx2);\n return new Mat22(Vec2.add(mx1.ex, mx2.ex), Vec2.add(mx1.ey, mx2.ey));\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { Transform } from '../common/Transform';\nimport { math as Math } from '../common/Math';\nimport { Rot } from '../common/Rot';\n\nexport enum ManifoldType {\n e_circles = 0,\n e_faceA = 1,\n e_faceB = 2\n}\n\nexport enum ContactFeatureType {\n e_vertex = 0,\n e_face = 1\n}\n\n/**\n * This is used for determining the state of contact points.\n */\n export enum PointState {\n /** Point does not exist */\n nullState = 0,\n /** Point was added in the update */\n addState = 1,\n /** Point persisted across the update */\n persistState = 2,\n /** Point was removed in the update */\n removeState = 3\n}\n\n/**\n * Used for computing contact manifolds.\n */\n export class ClipVertex {\n v: Vec2 = Vec2.zero();\n id: ContactID = new ContactID();\n\n set(o: ClipVertex): void {\n this.v.setVec2(o.v);\n this.id.set(o.id);\n }\n}\n\n/**\n * A manifold for two touching convex shapes. Manifolds are created in `evaluate`\n * method of Contact subclasses.\n *\n * Supported manifold types are e_faceA or e_faceB for clip point versus plane\n * with radius and e_circles point versus point with radius.\n *\n * We store contacts in this way so that position correction can account for\n * movement, which is critical for continuous physics. All contact scenarios\n * must be expressed in one of these types. This structure is stored across time\n * steps, so we keep it small.\n *\n * @prop type e_circle, e_faceA, e_faceB\n * @prop localPoint Usage depends on manifold type:
\n * e_circles: the local center of circleA
\n * e_faceA: the center of faceA
\n * e_faceB: the center of faceB\n * @prop localNormal Usage depends on manifold type:
\n * e_circles: not used
\n * e_faceA: the normal on polygonA
\n * e_faceB: the normal on polygonB\n * @prop points The points of contact {ManifoldPoint[]}\n * @prop pointCount The number of manifold points\n */\nexport class Manifold {\n type: ManifoldType;\n localNormal: Vec2 = Vec2.zero();\n localPoint: Vec2 = Vec2.zero();\n points: ManifoldPoint[] = [ new ManifoldPoint(), new ManifoldPoint() ];\n pointCount: number = 0;\n\n /**\n * Evaluate the manifold with supplied transforms. This assumes modest motion\n * from the original state. This does not change the point count, impulses, etc.\n * The radii must come from the shapes that generated the manifold.\n */\n getWorldManifold(wm: WorldManifold | undefined, xfA: Transform, radiusA: number, xfB: Transform, radiusB: number): WorldManifold {\n if (this.pointCount == 0) {\n return;\n }\n\n wm = wm || new WorldManifold();\n\n let normal = wm.normal;\n const points = wm.points;\n const separations = wm.separations;\n\n // TODO: improve\n switch (this.type) {\n case ManifoldType.e_circles: {\n normal = Vec2.neo(1.0, 0.0);\n const pointA = Transform.mulVec2(xfA, this.localPoint);\n const pointB = Transform.mulVec2(xfB, this.points[0].localPoint);\n const dist = Vec2.sub(pointB, pointA);\n if (Vec2.lengthSquared(dist) > Math.EPSILON * Math.EPSILON) {\n normal.setVec2(dist);\n normal.normalize();\n }\n const cA = pointA.clone().addMul(radiusA, normal);\n const cB = pointB.clone().addMul(-radiusB, normal);\n points[0] = Vec2.mid(cA, cB);\n separations[0] = Vec2.dot(Vec2.sub(cB, cA), normal);\n points.length = 1;\n separations.length = 1;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfA, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfB, this.points[i].localPoint);\n const cA = Vec2.clone(clipPoint).addMul(radiusA - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cB = Vec2.clone(clipPoint).subMul(radiusB, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cB, cA), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfB, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfA, this.points[i].localPoint);\n const cB = Vec2.combine(1, clipPoint, radiusB - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cA = Vec2.combine(1, clipPoint, -radiusA, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cA, cB), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n // Ensure normal points from A to B.\n normal.mul(-1);\n break;\n }\n }\n\n wm.normal = normal;\n wm.points = points;\n wm.separations = separations;\n return wm;\n }\n\n static clipSegmentToLine = clipSegmentToLine;\n static ClipVertex = ClipVertex;\n static getPointStates = getPointStates;\n static PointState = PointState;\n}\n\n/**\n * A manifold point is a contact point belonging to a contact manifold. It holds\n * details related to the geometry and dynamics of the contact points.\n *\n * This structure is stored across time steps, so we keep it small.\n *\n * Note: impulses are used for internal caching and may not provide reliable\n * contact forces, especially for high speed collisions.\n */\nexport class ManifoldPoint {\n /**\n * Usage depends on manifold type.\n * e_circles: the local center of circleB,\n * e_faceA: the local center of cirlceB or the clip point of polygonB,\n * e_faceB: the clip point of polygonA.\n */\n localPoint: Vec2 = Vec2.zero();\n /**\n * The non-penetration impulse\n */\n normalImpulse: number = 0;\n /**\n * The friction impulse\n */\n tangentImpulse: number = 0;\n /**\n * Uniquely identifies a contact point between two shapes to facilatate warm starting\n */\n id: ContactID = new ContactID();\n}\n\n/**\n * Contact ids to facilitate warm starting.\n */\nexport class ContactID {\n cf: ContactFeature = new ContactFeature();\n\n /**\n * Used to quickly compare contact ids.\n */\n get key(): number {\n return this.cf.indexA + this.cf.indexB * 4 + this.cf.typeA * 16 + this.cf.typeB * 64;\n }\n\n set(o: ContactID): void {\n // this.key = o.key;\n this.cf.set(o.cf);\n }\n}\n\n/**\n * The features that intersect to form the contact point.\n */\nexport class ContactFeature {\n /**\n * Feature index on shapeA\n */\n indexA: number;\n /**\n * Feature index on shapeB\n */\n indexB: number;\n /**\n * The feature type on shapeA\n */\n typeA: ContactFeatureType;\n /**\n * The feature type on shapeB\n */\n typeB: ContactFeatureType;\n set(o: ContactFeature): void {\n this.indexA = o.indexA;\n this.indexB = o.indexB;\n this.typeA = o.typeA;\n this.typeB = o.typeB;\n }\n}\n\n/**\n * This is used to compute the current state of a contact manifold.\n */\nexport class WorldManifold {\n /**\n * World vector pointing from A to B\n */\n normal: Vec2;\n /**\n * World contact point (point of intersection)\n */\n points: Vec2[] = []; // [maxManifoldPoints]\n /**\n * A negative value indicates overlap, in meters\n */\n separations: number[] = []; // [maxManifoldPoints]\n}\n\n/**\n * Compute the point states given two manifolds. The states pertain to the\n * transition from manifold1 to manifold2. So state1 is either persist or remove\n * while state2 is either add or persist.\n */\nexport function getPointStates(\n state1: PointState[],\n state2: PointState[],\n manifold1: Manifold,\n manifold2: Manifold\n): void {\n // state1, state2: PointState[Settings.maxManifoldPoints]\n\n // for (var i = 0; i < Settings.maxManifoldPoints; ++i) {\n // state1[i] = PointState.nullState;\n // state2[i] = PointState.nullState;\n // }\n\n // Detect persists and removes.\n for (let i = 0; i < manifold1.pointCount; ++i) {\n const id = manifold1.points[i].id;\n\n state1[i] = PointState.removeState;\n\n for (let j = 0; j < manifold2.pointCount; ++j) {\n if (manifold2.points[j].id.key == id.key) {\n state1[i] = PointState.persistState;\n break;\n }\n }\n }\n\n // Detect persists and adds.\n for (let i = 0; i < manifold2.pointCount; ++i) {\n const id = manifold2.points[i].id;\n\n state2[i] = PointState.addState;\n\n for (let j = 0; j < manifold1.pointCount; ++j) {\n if (manifold1.points[j].id.key == id.key) {\n state2[i] = PointState.persistState;\n break;\n }\n }\n }\n}\n\n/**\n * Clipping for contact manifolds. Sutherland-Hodgman clipping.\n */\nexport function clipSegmentToLine(\n vOut: ClipVertex[],\n vIn: ClipVertex[],\n normal: Vec2,\n offset: number,\n vertexIndexA: number\n): number {\n // Start with no output points\n let numOut = 0;\n\n // Calculate the distance of end points to the line\n const distance0 = Vec2.dot(normal, vIn[0].v) - offset;\n const distance1 = Vec2.dot(normal, vIn[1].v) - offset;\n\n // If the points are behind the plane\n if (distance0 <= 0.0)\n vOut[numOut++].set(vIn[0]);\n if (distance1 <= 0.0)\n vOut[numOut++].set(vIn[1]);\n\n // If the points are on different sides of the plane\n if (distance0 * distance1 < 0.0) {\n // Find intersection point of edge and plane\n const interp = distance0 / (distance0 - distance1);\n vOut[numOut].v.setCombine(1 - interp, vIn[0].v, interp, vIn[1].v);\n\n // VertexA is hitting edgeB.\n vOut[numOut].id.cf.indexA = vertexIndexA;\n vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB;\n vOut[numOut].id.cf.typeA = ContactFeatureType.e_vertex;\n vOut[numOut].id.cf.typeB = ContactFeatureType.e_face;\n ++numOut;\n }\n\n return numOut;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { ShapeType } from \"../collision/Shape\";\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Transform } from '../common/Transform';\nimport { Mat22 } from '../common/Mat22';\nimport { Rot } from '../common/Rot';\nimport { Settings } from '../Settings';\nimport { Manifold, ManifoldType, WorldManifold } from '../collision/Manifold';\nimport { testOverlap } from '../collision/Distance';\nimport { Fixture } from \"./Fixture\";\nimport { Body } from \"./Body\";\nimport { ContactImpulse, TimeStep } from \"./Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst DEBUG_SOLVER = false;\n\n/**\n * A contact edge is used to connect bodies and contacts together in a contact\n * graph where each body is a node and each contact is an edge. A contact edge\n * belongs to a doubly linked list maintained in each attached body. Each\n * contact has two contact nodes, one for each attached body.\n *\n * @prop {Contact} contact The contact\n * @prop {ContactEdge} prev The previous contact edge in the body's contact list\n * @prop {ContactEdge} next The next contact edge in the body's contact list\n * @prop {Body} other Provides quick access to the other body attached.\n */\nexport class ContactEdge {\n contact: Contact;\n prev: ContactEdge | undefined;\n next: ContactEdge | undefined;\n other: Body | undefined;\n constructor(contact: Contact) {\n this.contact = contact;\n }\n}\n\nexport type EvaluateFunction = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void;\n\nexport type ContactCallback = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void /* & { destroyFcn?: (contact: Contact) => void }*/;\n\n\n/**\n * Friction mixing law. The idea is to allow either fixture to drive the\n * restitution to zero. For example, anything slides on ice.\n */\nexport function mixFriction(friction1: number, friction2: number): number {\n return Math.sqrt(friction1 * friction2);\n}\n\n/**\n * Restitution mixing law. The idea is allow for anything to bounce off an\n * inelastic surface. For example, a superball bounces on anything.\n */\nexport function mixRestitution(restitution1: number, restitution2: number): number {\n return restitution1 > restitution2 ? restitution1 : restitution2;\n}\n\n// TODO: move this to Settings?\nconst s_registers = [];\n\n// TODO: merge with ManifoldPoint?\nexport class VelocityConstraintPoint {\n rA: Vec2 = Vec2.zero();\n rB: Vec2 = Vec2.zero();\n normalImpulse: number = 0;\n tangentImpulse: number = 0;\n normalMass: number = 0;\n tangentMass: number = 0;\n velocityBias: number = 0;\n}\n\n/**\n * The class manages contact between two shapes. A contact exists for each\n * overlapping AABB in the broad-phase (except if filtered). Therefore a contact\n * object may exist that has no contact points.\n */\nexport class Contact {\n /** @internal */\n m_nodeA: ContactEdge;\n /** @internal */\n m_nodeB: ContactEdge;\n /** @internal */\n m_fixtureA: Fixture;\n /** @internal */\n m_fixtureB: Fixture;\n /** @internal */\n m_indexA: number;\n /** @internal */\n m_indexB: number;\n /** @internal */\n m_evaluateFcn: EvaluateFunction;\n /** @internal */\n m_manifold: Manifold = new Manifold();\n /** @internal */\n m_prev: Contact | null = null;\n /** @internal */\n m_next: Contact | null = null;\n /** @internal */\n m_toi: number = 1.0;\n /** @internal */\n m_toiCount: number = 0;\n /** @internal This contact has a valid TOI in m_toi */\n m_toiFlag: boolean = false;\n /** @internal */\n m_friction: number;\n /** @internal */\n m_restitution: number;\n /** @internal */\n m_tangentSpeed: number = 0.0;\n /** @internal This contact can be disabled (by user) */\n m_enabledFlag: boolean = true;\n /** @internal Used when crawling contact graph when forming islands. */\n m_islandFlag: boolean = false;\n /** @internal Set when the shapes are touching. */\n m_touchingFlag: boolean = false;\n /** @internal This contact needs filtering because a fixture filter was changed. */\n m_filterFlag: boolean = false;\n /** @internal This bullet contact had a TOI event */\n m_bulletHitFlag: boolean = false;\n\n /** @internal Contact reporting impulse object cache */\n m_impulse: ContactImpulse = new ContactImpulse(this);\n\n // VelocityConstraint\n /** @internal */ v_points: VelocityConstraintPoint[] = []; // [maxManifoldPoints];\n /** @internal */ v_normal: Vec2 = Vec2.zero();\n /** @internal */ v_normalMass: Mat22 = new Mat22();\n /** @internal */ v_K: Mat22 = new Mat22();\n /** @internal */ v_pointCount: number;\n /** @internal */ v_tangentSpeed: number | undefined;\n /** @internal */ v_friction: number | undefined;\n /** @internal */ v_restitution: number | undefined;\n /** @internal */ v_invMassA: number | undefined;\n /** @internal */ v_invMassB: number | undefined;\n /** @internal */ v_invIA: number | undefined;\n /** @internal */ v_invIB: number | undefined;\n\n // PositionConstraint\n /** @internal */ p_localPoints: Vec2[] = []; // [maxManifoldPoints];\n /** @internal */ p_localNormal: Vec2 = Vec2.zero();\n /** @internal */ p_localPoint: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterA: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterB: Vec2 = Vec2.zero();\n /** @internal */ p_type: ManifoldType | undefined;\n /** @internal */ p_radiusA: number | undefined;\n /** @internal */ p_radiusB: number | undefined;\n /** @internal */ p_pointCount: number | undefined;\n /** @internal */ p_invMassA: number | undefined;\n /** @internal */ p_invMassB: number | undefined;\n /** @internal */ p_invIA: number | undefined;\n /** @internal */ p_invIB: number | undefined;\n\n constructor(fA: Fixture, indexA: number, fB: Fixture, indexB: number, evaluateFcn: EvaluateFunction) {\n // Nodes for connecting bodies.\n this.m_nodeA = new ContactEdge(this);\n this.m_nodeB = new ContactEdge(this);\n\n this.m_fixtureA = fA;\n this.m_fixtureB = fB;\n\n this.m_indexA = indexA;\n this.m_indexB = indexB;\n\n this.m_evaluateFcn = evaluateFcn;\n\n this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction);\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution);\n }\n\n initConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const shapeA = fixtureA.getShape();\n const shapeB = fixtureB.getShape();\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const manifold = this.getManifold();\n\n const pointCount = manifold.pointCount;\n _ASSERT && console.assert(pointCount > 0);\n\n this.v_invMassA = bodyA.m_invMass;\n this.v_invMassB = bodyB.m_invMass;\n this.v_invIA = bodyA.m_invI;\n this.v_invIB = bodyB.m_invI;\n\n this.v_friction = this.m_friction;\n this.v_restitution = this.m_restitution;\n this.v_tangentSpeed = this.m_tangentSpeed;\n\n this.v_pointCount = pointCount;\n\n this.v_K.setZero();\n this.v_normalMass.setZero();\n\n this.p_invMassA = bodyA.m_invMass;\n this.p_invMassB = bodyB.m_invMass;\n this.p_invIA = bodyA.m_invI;\n this.p_invIB = bodyB.m_invI;\n this.p_localCenterA = Vec2.clone(bodyA.m_sweep.localCenter);\n this.p_localCenterB = Vec2.clone(bodyB.m_sweep.localCenter);\n\n this.p_radiusA = shapeA.m_radius;\n this.p_radiusB = shapeB.m_radius;\n\n this.p_type = manifold.type;\n this.p_localNormal = Vec2.clone(manifold.localNormal);\n this.p_localPoint = Vec2.clone(manifold.localPoint);\n this.p_pointCount = pointCount;\n\n for (let j = 0; j < pointCount; ++j) {\n const cp = manifold.points[j];\n const vcp = this.v_points[j] = new VelocityConstraintPoint();\n\n if (step.warmStarting) {\n vcp.normalImpulse = step.dtRatio * cp.normalImpulse;\n vcp.tangentImpulse = step.dtRatio * cp.tangentImpulse;\n\n } else {\n vcp.normalImpulse = 0.0;\n vcp.tangentImpulse = 0.0;\n }\n\n vcp.rA.setZero();\n vcp.rB.setZero();\n vcp.normalMass = 0.0;\n vcp.tangentMass = 0.0;\n vcp.velocityBias = 0.0;\n\n this.p_localPoints[j] = Vec2.clone(cp.localPoint);\n\n }\n }\n\n /**\n * Get the contact manifold. Do not modify the manifold unless you understand\n * the internals of the library.\n */\n getManifold(): Manifold {\n return this.m_manifold;\n }\n\n /**\n * Get the world manifold.\n */\n getWorldManifold(worldManifold: WorldManifold | null | undefined): WorldManifold | undefined {\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n\n return this.m_manifold.getWorldManifold(worldManifold, bodyA.getTransform(),\n shapeA.m_radius, bodyB.getTransform(), shapeB.m_radius);\n }\n\n /**\n * Enable/disable this contact. This can be used inside the pre-solve contact\n * listener. The contact is only disabled for the current time step (or sub-step\n * in continuous collisions).\n */\n setEnabled(flag: boolean): void {\n this.m_enabledFlag = !!flag;\n }\n\n /**\n * Has this contact been disabled?\n */\n isEnabled(): boolean {\n return this.m_enabledFlag;\n }\n\n /**\n * Is this contact touching?\n */\n isTouching(): boolean {\n return this.m_touchingFlag;\n }\n\n /**\n * Get the next contact in the world's contact list.\n */\n getNext(): Contact | null {\n return this.m_next;\n }\n\n /**\n * Get fixture A in this contact.\n */\n getFixtureA(): Fixture {\n return this.m_fixtureA;\n }\n\n /**\n * Get fixture B in this contact.\n */\n getFixtureB(): Fixture {\n return this.m_fixtureB;\n }\n\n /**\n * Get the child primitive index for fixture A.\n */\n getChildIndexA(): number {\n return this.m_indexA;\n }\n\n /**\n * Get the child primitive index for fixture B.\n */\n getChildIndexB(): number {\n return this.m_indexB;\n }\n\n /**\n * Flag this contact for filtering. Filtering will occur the next time step.\n */\n flagForFiltering(): void {\n this.m_filterFlag = true;\n }\n\n /**\n * Override the default friction mixture. You can call this in\n * ContactListener.preSolve. This value persists until set or reset.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the friction.\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Reset the friction mixture to the default value.\n */\n resetFriction(): void {\n this.m_friction = mixFriction(this.m_fixtureA.m_friction,\n this.m_fixtureB.m_friction);\n }\n\n /**\n * Override the default restitution mixture. You can call this in\n * ContactListener.preSolve. The value persists until you set or reset.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Get the restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Reset the restitution to the default value.\n */\n resetRestitution(): void {\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution,\n this.m_fixtureB.m_restitution);\n }\n\n /**\n * Set the desired tangent speed for a conveyor belt behavior. In meters per\n * second.\n */\n setTangentSpeed(speed: number): void {\n this.m_tangentSpeed = speed;\n }\n\n /**\n * Get the desired tangent speed. In meters per second.\n */\n getTangentSpeed(): number {\n return this.m_tangentSpeed;\n }\n\n /**\n * Called by Update method, and implemented by subclasses.\n */\n evaluate(manifold: Manifold, xfA: Transform, xfB: Transform): void {\n this.m_evaluateFcn(manifold, xfA, this.m_fixtureA, this.m_indexA, xfB,\n this.m_fixtureB, this.m_indexB);\n }\n\n /**\n * Updates the contact manifold and touching status.\n *\n * Note: do not assume the fixture AABBs are overlapping or are valid.\n *\n * @param listener.beginContact\n * @param listener.endContact\n * @param listener.preSolve\n */\n update(listener?: {\n beginContact(contact: Contact): void,\n endContact(contact: Contact): void,\n preSolve(contact: Contact, oldManifold: Manifold): void\n }): void {\n\n // Re-enable this contact.\n this.m_enabledFlag = true;\n\n let touching = false;\n const wasTouching = this.m_touchingFlag;\n\n const sensorA = this.m_fixtureA.isSensor();\n const sensorB = this.m_fixtureB.isSensor();\n const sensor = sensorA || sensorB;\n\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const xfA = bodyA.getTransform();\n const xfB = bodyB.getTransform();\n\n let oldManifold;\n\n // Is this contact a sensor?\n if (sensor) {\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n touching = testOverlap(shapeA, this.m_indexA, shapeB, this.m_indexB, xfA, xfB);\n\n // Sensors don't generate manifolds.\n this.m_manifold.pointCount = 0;\n } else {\n\n // TODO reuse manifold\n oldManifold = this.m_manifold;\n this.m_manifold = new Manifold();\n\n this.evaluate(this.m_manifold, xfA, xfB);\n touching = this.m_manifold.pointCount > 0;\n\n // Match old contact ids to new contact ids and copy the\n // stored impulses to warm start the solver.\n for (let i = 0; i < this.m_manifold.pointCount; ++i) {\n const nmp = this.m_manifold.points[i];\n nmp.normalImpulse = 0.0;\n nmp.tangentImpulse = 0.0;\n\n for (let j = 0; j < oldManifold.pointCount; ++j) {\n const omp = oldManifold.points[j];\n if (omp.id.key == nmp.id.key) {\n nmp.normalImpulse = omp.normalImpulse;\n nmp.tangentImpulse = omp.tangentImpulse;\n break;\n }\n }\n }\n\n if (touching != wasTouching) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n }\n\n this.m_touchingFlag = touching;\n\n if (!wasTouching && touching && listener) {\n listener.beginContact(this);\n }\n\n if (wasTouching && !touching && listener) {\n listener.endContact(this);\n }\n\n if (!sensor && touching && listener) {\n listener.preSolve(this, oldManifold);\n }\n }\n\n solvePositionConstraint(step: TimeStep): number {\n return this._solvePositionConstraint(step);\n }\n\n solvePositionConstraintTOI(step: TimeStep, toiA: Body, toiB: Body): number {\n return this._solvePositionConstraint(step, toiA, toiB);\n }\n\n private _solvePositionConstraint(step: TimeStep, toiA?: Body, toiB?: Body): number {\n const toi: boolean = !!toiA && !!toiB;\n\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n let mA = 0.0;\n let iA = 0.0;\n if (!toi || (bodyA == toiA || bodyA == toiB)) {\n mA = this.p_invMassA;\n iA = this.p_invIA;\n }\n\n let mB = 0.0;\n let iB = 0.0;\n if (!toi || (bodyB == toiA || bodyB == toiB)) {\n mB = this.p_invMassB;\n iB = this.p_invIB;\n }\n\n const cA = Vec2.clone(positionA.c);\n let aA = positionA.a;\n\n const cB = Vec2.clone(positionB.c);\n let aB = positionB.a;\n\n let minSeparation = 0.0;\n\n // Solve normal constraints\n for (let j = 0; j < this.p_pointCount; ++j) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p = Vec2.sub(cA, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p = Vec2.sub(cB, Rot.mulVec2(xfB.q, localCenterB));\n\n // PositionSolverManifold\n let normal;\n let point;\n let separation;\n switch (this.p_type) {\n case ManifoldType.e_circles: {\n const pointA = Transform.mulVec2(xfA, this.p_localPoint);\n const pointB = Transform.mulVec2(xfB, this.p_localPoints[0]);\n normal = Vec2.sub(pointB, pointA);\n normal.normalize();\n point = Vec2.combine(0.5, pointA, 0.5, pointB);\n separation = Vec2.dot(Vec2.sub(pointB, pointA), normal) - this.p_radiusA - this.p_radiusB;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfA, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfB, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfB, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfA, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n\n // Ensure normal points from A to B\n normal.mul(-1);\n break;\n }\n }\n\n const rA = Vec2.sub(point, cA);\n const rB = Vec2.sub(point, cB);\n\n // Track max constraint error.\n minSeparation = Math.min(minSeparation, separation);\n\n const baumgarte = toi ? Settings.toiBaugarte : Settings.baumgarte;\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n // Prevent large corrections and allow slop.\n const C = Math.clamp(baumgarte * (separation + linearSlop), -maxLinearCorrection, 0.0);\n\n // Compute the effective mass.\n const rnA = Vec2.crossVec2Vec2(rA, normal);\n const rnB = Vec2.crossVec2Vec2(rB, normal);\n const K = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n // Compute normal impulse\n const impulse = K > 0.0 ? -C / K : 0.0;\n\n const P = Vec2.mulNumVec2(impulse, normal);\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n\n return minSeparation;\n }\n\n initVelocityConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const radiusA = this.p_radiusA;\n const radiusB = this.p_radiusB;\n const manifold = this.getManifold();\n\n const mA = this.v_invMassA;\n const mB = this.v_invMassB;\n const iA = this.v_invIA;\n const iB = this.v_invIB;\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n const cA = Vec2.clone(positionA.c);\n const aA = positionA.a;\n const vA = Vec2.clone(velocityA.v);\n const wA = velocityA.w;\n\n const cB = Vec2.clone(positionB.c);\n const aB = positionB.a;\n const vB = Vec2.clone(velocityB.v);\n const wB = velocityB.w;\n\n _ASSERT && console.assert(manifold.pointCount > 0);\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p.setCombine(1, cA, -1, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p.setCombine(1, cB, -1, Rot.mulVec2(xfB.q, localCenterB));\n\n const worldManifold = manifold.getWorldManifold(null, xfA, radiusA, xfB, radiusB);\n\n this.v_normal.setVec2(worldManifold.normal);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n vcp.rA.setVec2(Vec2.sub(worldManifold.points[j], cA));\n vcp.rB.setVec2(Vec2.sub(worldManifold.points[j], cB));\n\n const rnA = Vec2.crossVec2Vec2(vcp.rA, this.v_normal);\n const rnB = Vec2.crossVec2Vec2(vcp.rB, this.v_normal);\n\n const kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n vcp.normalMass = kNormal > 0.0 ? 1.0 / kNormal : 0.0;\n\n const tangent = Vec2.crossVec2Num(this.v_normal, 1.0);\n\n const rtA = Vec2.crossVec2Vec2(vcp.rA, tangent);\n const rtB = Vec2.crossVec2Vec2(vcp.rB, tangent);\n\n const kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB;\n\n vcp.tangentMass = kTangent > 0.0 ? 1.0 / kTangent : 0.0;\n\n // Setup a velocity bias for restitution.\n vcp.velocityBias = 0.0;\n const vRel = Vec2.dot(this.v_normal, vB)\n + Vec2.dot(this.v_normal, Vec2.crossNumVec2(wB, vcp.rB))\n - Vec2.dot(this.v_normal, vA)\n - Vec2.dot(this.v_normal, Vec2.crossNumVec2(wA, vcp.rA));\n if (vRel < -Settings.velocityThreshold) {\n vcp.velocityBias = -this.v_restitution * vRel;\n }\n }\n\n // If we have two points, then prepare the block solver.\n if (this.v_pointCount == 2 && step.blockSolve) {\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const rn1A = Vec2.crossVec2Vec2(vcp1.rA, this.v_normal);\n const rn1B = Vec2.crossVec2Vec2(vcp1.rB, this.v_normal);\n const rn2A = Vec2.crossVec2Vec2(vcp2.rA, this.v_normal);\n const rn2B = Vec2.crossVec2Vec2(vcp2.rB, this.v_normal);\n\n const k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B;\n const k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B;\n const k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B;\n\n // Ensure a reasonable condition number.\n const k_maxConditionNumber = 1000.0;\n if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) {\n // K is safe to invert.\n this.v_K.ex.setNum(k11, k12);\n this.v_K.ey.setNum(k12, k22);\n this.v_normalMass.set(this.v_K.getInverse());\n } else {\n // The constraints are redundant, just use one.\n // TODO_ERIN use deepest?\n this.v_pointCount = 1;\n }\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n warmStartConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n const P = Vec2.combine(vcp.normalImpulse, normal, vcp.tangentImpulse, tangent);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n vA.subMul(mA, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n vB.addMul(mB, P);\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n storeConstraintImpulses(step: TimeStep): void {\n const manifold = this.m_manifold;\n for (let j = 0; j < this.v_pointCount; ++j) {\n manifold.points[j].normalImpulse = this.v_points[j].normalImpulse;\n manifold.points[j].tangentImpulse = this.v_points[j].tangentImpulse;\n }\n }\n\n solveVelocityConstraint(step: TimeStep): void {\n const bodyA = this.m_fixtureA.m_body;\n const bodyB = this.m_fixtureB.m_body;\n\n const velocityA = bodyA.c_velocity;\n const positionA = bodyA.c_position;\n\n const velocityB = bodyB.c_velocity;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n const friction = this.v_friction;\n\n _ASSERT && console.assert(this.v_pointCount == 1 || this.v_pointCount == 2);\n\n // Solve tangent constraints first because non-penetration is more important\n // than friction.\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute tangent force\n const vt = Vec2.dot(dv, tangent) - this.v_tangentSpeed;\n let lambda = vcp.tangentMass * (-vt);\n\n // Clamp the accumulated force\n const maxFriction = friction * vcp.normalImpulse;\n const newImpulse = Math.clamp(vcp.tangentImpulse + lambda, -maxFriction, maxFriction);\n lambda = newImpulse - vcp.tangentImpulse;\n vcp.tangentImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, tangent);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n\n // Solve normal constraints\n if (this.v_pointCount == 1 || step.blockSolve == false) {\n for (let i = 0; i < this.v_pointCount; ++i) {\n const vcp = this.v_points[i]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute normal impulse\n const vn = Vec2.dot(dv, normal);\n let lambda = -vcp.normalMass * (vn - vcp.velocityBias);\n\n // Clamp the accumulated impulse\n const newImpulse = Math.max(vcp.normalImpulse + lambda, 0.0);\n lambda = newImpulse - vcp.normalImpulse;\n vcp.normalImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, normal);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n } else {\n // Block solver developed in collaboration with Dirk Gregorius (back in\n // 01/07 on Box2D_Lite).\n // Build the mini LCP for this contact patch\n //\n // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i =\n // 1..2\n //\n // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n )\n // b = vn0 - velocityBias\n //\n // The system is solved using the \"Total enumeration method\" (s. Murty).\n // The complementary constraint vn_i * x_i\n // implies that we must have in any solution either vn_i = 0 or x_i = 0.\n // So for the 2D contact problem the cases\n // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and\n // vn1 = 0 need to be tested. The first valid\n // solution that satisfies the problem is chosen.\n //\n // In order to account of the accumulated impulse 'a' (because of the\n // iterative nature of the solver which only requires\n // that the accumulated impulse is clamped and not the incremental\n // impulse) we change the impulse variable (x_i).\n //\n // Substitute:\n //\n // x = a + d\n //\n // a := old total impulse\n // x := new total impulse\n // d := incremental impulse\n //\n // For the current iteration we extend the formula for the incremental\n // impulse\n // to compute the new total impulse:\n //\n // vn = A * d + b\n // = A * (x - a) + b\n // = A * x + b - A * a\n // = A * x + b'\n // b' = b - A * a;\n\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const a = Vec2.neo(vcp1.normalImpulse, vcp2.normalImpulse);\n _ASSERT && console.assert(a.x >= 0.0 && a.y >= 0.0);\n\n // Relative velocity at contact\n let dv1 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp1.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp1.rA));\n let dv2 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp2.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp2.rA));\n\n // Compute normal velocity\n let vn1 = Vec2.dot(dv1, normal);\n let vn2 = Vec2.dot(dv2, normal);\n\n const b = Vec2.neo(vn1 - vcp1.velocityBias, vn2 - vcp2.velocityBias);\n\n // Compute b'\n b.sub(Mat22.mulVec2(this.v_K, a));\n\n const k_errorTol = 1e-3;\n // NOT_USED(k_errorTol);\n\n while (true) {\n //\n // Case 1: vn = 0\n //\n // 0 = A * x + b'\n //\n // Solve for x:\n //\n // x = - inv(A) * b'\n //\n const x = Mat22.mulVec2(this.v_normalMass, b).neg();\n\n if (x.x >= 0.0 && x.y >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n dv1 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA)));\n dv2 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA)));\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && console.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n _ASSERT && console.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 2: vn1 = 0 and x2 = 0\n //\n // 0 = a11 * x1 + a12 * 0 + b1'\n // vn2 = a21 * x1 + a22 * 0 + b2'\n //\n x.x = -vcp1.normalMass * b.x;\n x.y = 0.0;\n vn1 = 0.0;\n vn2 = this.v_K.ex.y * x.x + b.y;\n\n if (x.x >= 0.0 && vn2 >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv1B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB));\n const dv1A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA));\n const dv1 = Vec2.sub(dv1B, dv1A);\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n\n _ASSERT && console.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 3: vn2 = 0 and x1 = 0\n //\n // vn1 = a11 * 0 + a12 * x2 + b1'\n // 0 = a21 * 0 + a22 * x2 + b2'\n //\n x.x = 0.0;\n x.y = -vcp2.normalMass * b.y;\n vn1 = this.v_K.ey.x * x.y + b.x;\n vn2 = 0.0;\n\n if (x.y >= 0.0 && vn1 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv2B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB));\n const dv2A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA));\n const dv1 = Vec2.sub(dv2B, dv2A);\n\n // Compute normal velocity\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && console.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 4: x1 = 0 and x2 = 0\n //\n // vn1 = b1\n // vn2 = b2;\n //\n x.x = 0.0;\n x.y = 0.0;\n vn1 = b.x;\n vn2 = b.y;\n\n if (vn1 >= 0.0 && vn2 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n break;\n }\n\n // No solution, give up. This is hit sometimes, but it doesn't seem to\n // matter.\n break;\n }\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n /**\n * @internal\n */\n static addType(type1: ShapeType, type2: ShapeType, callback: ContactCallback): void {\n s_registers[type1] = s_registers[type1] || {};\n s_registers[type1][type2] = callback;\n }\n\n /**\n * @internal\n */\n static create(fixtureA: Fixture, indexA: number, fixtureB: Fixture, indexB: number): Contact | null {\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // TODO: pool contacts\n let contact;\n let evaluateFcn;\n if (evaluateFcn = s_registers[typeA] && s_registers[typeA][typeB]) {\n contact = new Contact(fixtureA, indexA, fixtureB, indexB, evaluateFcn);\n } else if (evaluateFcn = s_registers[typeB] && s_registers[typeB][typeA]) {\n contact = new Contact(fixtureB, indexB, fixtureA, indexA, evaluateFcn);\n } else {\n return null;\n }\n\n // Contact creation may swap fixtures.\n fixtureA = contact.getFixtureA();\n fixtureB = contact.getFixtureB();\n indexA = contact.getChildIndexA();\n indexB = contact.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Connect to body A\n contact.m_nodeA.contact = contact;\n contact.m_nodeA.other = bodyB;\n\n contact.m_nodeA.prev = null;\n contact.m_nodeA.next = bodyA.m_contactList;\n if (bodyA.m_contactList != null) {\n bodyA.m_contactList.prev = contact.m_nodeA;\n }\n bodyA.m_contactList = contact.m_nodeA;\n\n // Connect to body B\n contact.m_nodeB.contact = contact;\n contact.m_nodeB.other = bodyA;\n\n contact.m_nodeB.prev = null;\n contact.m_nodeB.next = bodyB.m_contactList;\n if (bodyB.m_contactList != null) {\n bodyB.m_contactList.prev = contact.m_nodeB;\n }\n bodyB.m_contactList = contact.m_nodeB;\n\n // Wake up the bodies\n if (fixtureA.isSensor() == false && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n return contact;\n }\n\n /**\n * @internal\n */\n static destroy(contact: Contact, listener: { endContact: (contact: Contact) => void }): void {\n const fixtureA = contact.m_fixtureA;\n const fixtureB = contact.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n if (contact.isTouching()) {\n listener.endContact(contact);\n }\n\n // Remove from body 1\n if (contact.m_nodeA.prev) {\n contact.m_nodeA.prev.next = contact.m_nodeA.next;\n }\n\n if (contact.m_nodeA.next) {\n contact.m_nodeA.next.prev = contact.m_nodeA.prev;\n }\n\n if (contact.m_nodeA == bodyA.m_contactList) {\n bodyA.m_contactList = contact.m_nodeA.next;\n }\n\n // Remove from body 2\n if (contact.m_nodeB.prev) {\n contact.m_nodeB.prev.next = contact.m_nodeB.next;\n }\n\n if (contact.m_nodeB.next) {\n contact.m_nodeB.next.prev = contact.m_nodeB.prev;\n }\n\n if (contact.m_nodeB == bodyB.m_contactList) {\n bodyB.m_contactList = contact.m_nodeB.next;\n }\n\n if (contact.m_manifold.pointCount > 0 && fixtureA.isSensor() == false\n && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // const destroyFcn = s_registers[typeA][typeB].destroyFcn;\n // if (typeof destroyFcn === 'function') {\n // destroyFcn(contact);\n // }\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { Vec2 } from '../common/Vec2';\nimport { BroadPhase } from '../collision/BroadPhase';\nimport { Solver, ContactImpulse, TimeStep } from './Solver';\nimport { Body, BodyDef } from './Body';\nimport { Joint } from './Joint';\nimport { Contact } from './Contact';\nimport { AABB, RayCastInput, RayCastOutput } from \"../collision/AABB\";\nimport { Fixture, FixtureProxy } from \"./Fixture\";\nimport { Manifold } from \"../collision/Manifold\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * @prop gravity [{ x : 0, y : 0}]\n * @prop allowSleep [true]\n * @prop warmStarting [true]\n * @prop continuousPhysics [true]\n * @prop subStepping [false]\n * @prop blockSolve [true]\n * @prop velocityIterations [8] For the velocity constraint solver.\n * @prop positionIterations [3] For the position constraint solver.\n */\nexport interface WorldDef {\n gravity?: Vec2;\n allowSleep?: boolean;\n warmStarting?: boolean;\n continuousPhysics?: boolean;\n subStepping?: boolean;\n blockSolve?: boolean;\n velocityIterations?: number;\n positionIterations?: number;\n}\n\nconst WorldDefDefault: WorldDef = {\n gravity : Vec2.zero(),\n allowSleep : true,\n warmStarting : true,\n continuousPhysics : true,\n subStepping : false,\n blockSolve : true,\n velocityIterations : 8,\n positionIterations : 3\n};\n\n/**\n * Callback function for ray casts, see {@link World.rayCast}.\n *\n * Called for each fixture found in the query. You control how the ray cast\n * proceeds by returning a float: return -1: ignore this fixture and continue\n * return 0: terminate the ray cast return fraction: clip the ray to this point\n * return 1: don't clip the ray and continue\n *\n * @param fixture The fixture hit by the ray\n * @param point The point of initial intersection\n * @param normal The normal vector at the point of intersection\n * @param fraction\n *\n * @return -1 to filter, 0 to terminate, fraction to clip the ray for closest hit, 1 to continue\n */\nexport type WorldRayCastCallback = (fixture: Fixture, point: Vec2, normal: Vec2, fraction: number) => number;\n\n/**\n * Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\nexport type WorldAABBQueryCallback = (fixture: Fixture) => boolean;\n\nexport class World {\n /** @internal */ m_solver: Solver;\n /** @internal */ m_broadPhase: BroadPhase;\n /** @internal */ m_contactList: Contact | null;\n /** @internal */ m_contactCount: number;\n /** @internal */ m_bodyList: Body | null;\n /** @internal */ m_bodyCount: number;\n /** @internal */ m_jointList: Joint | null;\n /** @internal */ m_jointCount: number;\n /** @internal */ m_stepComplete: boolean;\n /** @internal */ m_allowSleep: boolean;\n /** @internal */ m_gravity: Vec2;\n /** @internal */ m_clearForces: boolean;\n /** @internal */ m_newFixture: boolean;\n /** @internal */ m_locked: boolean;\n /** @internal */ m_warmStarting: boolean;\n /** @internal */ m_continuousPhysics: boolean;\n /** @internal */ m_subStepping: boolean;\n /** @internal */ m_blockSolve: boolean;\n /** @internal */ m_velocityIterations: number;\n /** @internal */ m_positionIterations: number;\n /** @internal */ m_t: number;\n\n // TODO\n /** @internal */ _listeners: {\n [key: string]: any[]\n };\n\n /**\n * @param def World definition or gravity vector.\n */\n constructor(def?: WorldDef | Vec2 | null) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof World)) {\n return new World(def);\n }\n\n this.s_step = new TimeStep();\n\n\n if (def && Vec2.isValid(def)) {\n def = { gravity: def as Vec2 };\n }\n\n def = options(def, WorldDefDefault) as WorldDef;\n\n this.m_solver = new Solver(this);\n\n this.m_broadPhase = new BroadPhase();\n\n this.m_contactList = null;\n this.m_contactCount = 0;\n\n this.m_bodyList = null;\n this.m_bodyCount = 0;\n\n this.m_jointList = null;\n this.m_jointCount = 0;\n\n this.m_stepComplete = true;\n\n this.m_allowSleep = def.allowSleep;\n this.m_gravity = Vec2.clone(def.gravity);\n\n this.m_clearForces = true;\n this.m_newFixture = false;\n this.m_locked = false;\n\n // These are for debugging the solver.\n this.m_warmStarting = def.warmStarting;\n this.m_continuousPhysics = def.continuousPhysics;\n this.m_subStepping = def.subStepping;\n\n this.m_blockSolve = def.blockSolve;\n this.m_velocityIterations = def.velocityIterations;\n this.m_positionIterations = def.positionIterations;\n\n this.m_t = 0;\n }\n\n /** @internal */\n _serialize(): object {\n const bodies = [];\n const joints = [];\n\n for (let b = this.getBodyList(); b; b = b.getNext()) {\n bodies.push(b);\n }\n\n for (let j = this.getJointList(); j; j = j.getNext()) {\n // @ts-ignore\n if (typeof j._serialize === 'function') {\n joints.push(j);\n }\n }\n\n return {\n gravity: this.m_gravity,\n bodies,\n joints,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, context: any, restore: any): World {\n if (!data) {\n return new World();\n }\n\n const world = new World(data.gravity);\n\n if (data.bodies) {\n for (let i = data.bodies.length - 1; i >= 0; i -= 1) {\n world._addBody(restore(Body, data.bodies[i], world));\n }\n }\n\n if (data.joints) {\n for (let i = data.joints.length - 1; i >= 0; i--) {\n world.createJoint(restore(Joint, data.joints[i], world));\n }\n }\n\n return world;\n }\n\n /**\n * Get the world body list. With the returned body, use Body.getNext to get the\n * next body in the world list. A null body indicates the end of the list.\n *\n * @return the head of the world body list.\n */\n getBodyList(): Body | null {\n return this.m_bodyList;\n }\n\n /**\n * Get the world joint list. With the returned joint, use Joint.getNext to get\n * the next joint in the world list. A null joint indicates the end of the list.\n *\n * @return the head of the world joint list.\n */\n getJointList(): Joint | null {\n return this.m_jointList;\n }\n\n /**\n * Get the world contact list. With the returned contact, use Contact.getNext to\n * get the next contact in the world list. A null contact indicates the end of\n * the list.\n *\n * Warning: contacts are created and destroyed in the middle of a time step.\n * Use ContactListener to avoid missing contacts.\n *\n * @return the head of the world contact list.\n */\n getContactList(): Contact | null {\n return this.m_contactList;\n }\n\n getBodyCount(): number {\n return this.m_bodyCount;\n }\n\n getJointCount(): number {\n return this.m_jointCount;\n }\n\n /**\n * Get the number of contacts (each may have 0 or more contact points).\n */\n getContactCount(): number {\n return this.m_contactCount;\n }\n\n /**\n * Change the global gravity vector.\n */\n setGravity(gravity: Vec2): void {\n this.m_gravity = gravity;\n }\n\n /**\n * Get the global gravity vector.\n */\n getGravity(): Vec2 {\n return this.m_gravity;\n }\n\n /**\n * Is the world locked (in the middle of a time step).\n */\n isLocked(): boolean {\n return this.m_locked;\n }\n\n /**\n * Enable/disable sleep.\n */\n setAllowSleeping(flag: boolean): void {\n if (flag == this.m_allowSleep) {\n return;\n }\n\n this.m_allowSleep = flag;\n if (this.m_allowSleep == false) {\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.setAwake(true);\n }\n }\n }\n\n getAllowSleeping(): boolean {\n return this.m_allowSleep;\n }\n\n /**\n * Enable/disable warm starting. For testing.\n */\n setWarmStarting(flag: boolean): void {\n this.m_warmStarting = flag;\n }\n\n getWarmStarting(): boolean {\n return this.m_warmStarting;\n }\n\n /**\n * Enable/disable continuous physics. For testing.\n */\n setContinuousPhysics(flag: boolean): void {\n this.m_continuousPhysics = flag;\n }\n\n getContinuousPhysics(): boolean {\n return this.m_continuousPhysics;\n }\n\n /**\n * Enable/disable single stepped continuous physics. For testing.\n */\n setSubStepping(flag: boolean): void {\n this.m_subStepping = flag;\n }\n\n getSubStepping(): boolean {\n return this.m_subStepping;\n }\n\n /**\n * Set flag to control automatic clearing of forces after each time step.\n */\n setAutoClearForces(flag: boolean): void {\n this.m_clearForces = flag;\n }\n\n /**\n * Get the flag that controls automatic clearing of forces after each time step.\n */\n getAutoClearForces(): boolean {\n return this.m_clearForces;\n }\n\n /**\n * Manually clear the force buffer on all bodies. By default, forces are cleared\n * automatically after each call to step. The default behavior is modified by\n * calling setAutoClearForces. The purpose of this function is to support\n * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step\n * under a variable frame-rate. When you perform sub-stepping you will disable\n * auto clearing of forces and instead call clearForces after all sub-steps are\n * complete in one pass of your game loop.\n *\n * See {@link World.setAutoClearForces}\n */\n clearForces(): void {\n for (let body = this.m_bodyList; body; body = body.getNext()) {\n body.m_force.setZero();\n body.m_torque = 0.0;\n }\n }\n\n /**\n * Query the world for all fixtures that potentially overlap the provided AABB.\n *\n * @param aabb The query box.\n * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\n queryAABB(aabb: AABB, callback: WorldAABBQueryCallback): void {\n _ASSERT && console.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n this.m_broadPhase.query(aabb, function(proxyId: number): boolean { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n return callback(proxy.fixture);\n });\n }\n\n /**\n * Ray-cast the world for all fixtures in the path of the ray. Your callback\n * controls whether you get the closest point, any point, or n-points. The\n * ray-cast ignores shapes that contain the starting point.\n *\n * @param point1 The ray starting point\n * @param point2 The ray ending point\n * @param callback A user implemented callback function.\n */\n rayCast(point1: Vec2, point2: Vec2, callback: WorldRayCastCallback): void {\n _ASSERT && console.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n\n this.m_broadPhase.rayCast({\n maxFraction : 1.0,\n p1 : point1,\n p2 : point2\n }, function(input: RayCastInput, proxyId: number): number { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n const fixture = proxy.fixture;\n const index = proxy.childIndex;\n // @ts-ignore\n const output: RayCastOutput = {}; // TODO GC\n const hit = fixture.rayCast(output, input, index);\n if (hit) {\n const fraction = output.fraction;\n const point = Vec2.add(Vec2.mulNumVec2((1.0 - fraction), input.p1), Vec2.mulNumVec2(fraction, input.p2));\n return callback(fixture, point, output.normal, fraction);\n }\n return input.maxFraction;\n });\n }\n\n /**\n * Get the number of broad-phase proxies.\n */\n getProxyCount(): number {\n return this.m_broadPhase.getProxyCount();\n }\n\n /**\n * Get the height of broad-phase dynamic tree.\n */\n getTreeHeight(): number {\n return this.m_broadPhase.getTreeHeight();\n }\n\n /**\n * Get the balance of broad-phase dynamic tree.\n */\n getTreeBalance(): number {\n return this.m_broadPhase.getTreeBalance();\n }\n\n /**\n * Get the quality metric of broad-phase dynamic tree. The smaller the better.\n * The minimum is 1.\n */\n getTreeQuality(): number {\n return this.m_broadPhase.getTreeQuality();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The body shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n _ASSERT && console.assert(this.m_locked == false);\n if (this.m_locked) {\n return;\n }\n\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.m_xf.p.sub(newOrigin);\n b.m_sweep.c0.sub(newOrigin);\n b.m_sweep.c.sub(newOrigin);\n }\n\n for (let j = this.m_jointList; j; j = j.m_next) {\n j.shiftOrigin(newOrigin);\n }\n\n this.m_broadPhase.shiftOrigin(newOrigin);\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addBody(body: Body): void {\n _ASSERT && console.assert(this.isLocked() === false);\n if (this.isLocked()) {\n return;\n }\n\n // Add to world doubly linked list.\n body.m_prev = null;\n body.m_next = this.m_bodyList;\n if (this.m_bodyList) {\n this.m_bodyList.m_prev = body;\n }\n this.m_bodyList = body;\n ++this.m_bodyCount;\n }\n\n /**\n * Create a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This function is locked during callbacks.\n */\n createBody(def?: BodyDef): Body;\n createBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createBody(arg1?, arg2?) {\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n\n const body = new Body(this, def);\n this._addBody(body);\n return body;\n }\n\n createDynamicBody(def?: BodyDef): Body;\n createDynamicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createDynamicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'dynamic';\n return this.createBody(def);\n }\n\n createKinematicBody(def?: BodyDef): Body;\n createKinematicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createKinematicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'kinematic';\n return this.createBody(def);\n }\n\n /**\n * Destroy a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This automatically deletes all associated shapes and joints.\n *\n * Warning: This function is locked during callbacks.\n */\n destroyBody(b: Body): boolean {\n _ASSERT && console.assert(this.m_bodyCount > 0);\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n if (b.m_destroyed) {\n return false;\n }\n\n // Delete the attached joints.\n let je = b.m_jointList;\n while (je) {\n const je0 = je;\n je = je.next;\n\n this.publish('remove-joint', je0.joint);\n this.destroyJoint(je0.joint);\n\n b.m_jointList = je;\n }\n b.m_jointList = null;\n\n // Delete the attached contacts.\n let ce = b.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n\n this.destroyContact(ce0.contact);\n\n b.m_contactList = ce;\n }\n b.m_contactList = null;\n\n // Delete the attached fixtures. This destroys broad-phase proxies.\n let f = b.m_fixtureList;\n while (f) {\n const f0 = f;\n f = f.m_next;\n\n this.publish('remove-fixture', f0);\n f0.destroyProxies(this.m_broadPhase);\n\n b.m_fixtureList = f;\n }\n b.m_fixtureList = null;\n\n // Remove world body list.\n if (b.m_prev) {\n b.m_prev.m_next = b.m_next;\n }\n\n if (b.m_next) {\n b.m_next.m_prev = b.m_prev;\n }\n\n if (b == this.m_bodyList) {\n this.m_bodyList = b.m_next;\n }\n\n b.m_destroyed = true;\n\n --this.m_bodyCount;\n\n this.publish('remove-body', b);\n\n return true;\n }\n\n /**\n * Create a joint to constrain bodies together. No reference to the definition\n * is retained. This may cause the connected bodies to cease colliding.\n *\n * Warning: This function is locked during callbacks.\n */\n createJoint(joint: T): T | null {\n _ASSERT && console.assert(!!joint.m_bodyA);\n _ASSERT && console.assert(!!joint.m_bodyB);\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n // Connect to the world list.\n joint.m_prev = null;\n joint.m_next = this.m_jointList;\n if (this.m_jointList) {\n this.m_jointList.m_prev = joint;\n }\n this.m_jointList = joint;\n ++this.m_jointCount;\n\n // Connect to the bodies' doubly linked lists.\n joint.m_edgeA.joint = joint;\n joint.m_edgeA.other = joint.m_bodyB;\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = joint.m_bodyA.m_jointList;\n if (joint.m_bodyA.m_jointList)\n joint.m_bodyA.m_jointList.prev = joint.m_edgeA;\n joint.m_bodyA.m_jointList = joint.m_edgeA;\n\n joint.m_edgeB.joint = joint;\n joint.m_edgeB.other = joint.m_bodyA;\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = joint.m_bodyB.m_jointList;\n if (joint.m_bodyB.m_jointList)\n joint.m_bodyB.m_jointList.prev = joint.m_edgeB;\n joint.m_bodyB.m_jointList = joint.m_edgeB;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n for (let edge = joint.m_bodyB.getContactList(); edge; edge = edge.next) {\n if (edge.other == joint.m_bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n }\n }\n\n // Note: creating a joint doesn't wake the bodies.\n\n return joint;\n }\n\n /**\n * Destroy a joint. This may cause the connected bodies to begin colliding.\n * Warning: This function is locked during callbacks.\n */\n destroyJoint(joint: Joint): void {\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n // Remove from the doubly linked list.\n if (joint.m_prev) {\n joint.m_prev.m_next = joint.m_next;\n }\n\n if (joint.m_next) {\n joint.m_next.m_prev = joint.m_prev;\n }\n\n if (joint == this.m_jointList) {\n this.m_jointList = joint.m_next;\n }\n\n // Disconnect from bodies.\n const bodyA = joint.m_bodyA;\n const bodyB = joint.m_bodyB;\n\n // Wake up connected bodies.\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n\n // Remove from body 1.\n if (joint.m_edgeA.prev) {\n joint.m_edgeA.prev.next = joint.m_edgeA.next;\n }\n\n if (joint.m_edgeA.next) {\n joint.m_edgeA.next.prev = joint.m_edgeA.prev;\n }\n\n if (joint.m_edgeA == bodyA.m_jointList) {\n bodyA.m_jointList = joint.m_edgeA.next;\n }\n\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = null;\n\n // Remove from body 2\n if (joint.m_edgeB.prev) {\n joint.m_edgeB.prev.next = joint.m_edgeB.next;\n }\n\n if (joint.m_edgeB.next) {\n joint.m_edgeB.next.prev = joint.m_edgeB.prev;\n }\n\n if (joint.m_edgeB == bodyB.m_jointList) {\n bodyB.m_jointList = joint.m_edgeB.next;\n }\n\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = null;\n\n _ASSERT && console.assert(this.m_jointCount > 0);\n --this.m_jointCount;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n let edge = bodyB.getContactList();\n while (edge) {\n if (edge.other == bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n }\n\n this.publish('remove-joint', joint);\n }\n\n /** @internal */\n s_step: TimeStep; // reuse\n\n /**\n * Take a time step. This performs collision detection, integration, and\n * constraint solution.\n *\n * Broad-phase, narrow-phase, solve and solve time of impacts.\n *\n * @param timeStep Time step, this should not vary.\n */\n step(timeStep: number, velocityIterations?: number, positionIterations?: number): void {\n this.publish('pre-step', timeStep);\n\n if ((velocityIterations | 0) !== velocityIterations) {\n // TODO: remove this in future\n velocityIterations = 0;\n }\n\n velocityIterations = velocityIterations || this.m_velocityIterations;\n positionIterations = positionIterations || this.m_positionIterations;\n\n // If new fixtures were added, we need to find the new contacts.\n if (this.m_newFixture) {\n this.findNewContacts();\n this.m_newFixture = false;\n }\n\n this.m_locked = true;\n\n this.s_step.reset(timeStep);\n this.s_step.velocityIterations = velocityIterations;\n this.s_step.positionIterations = positionIterations;\n this.s_step.warmStarting = this.m_warmStarting;\n this.s_step.blockSolve = this.m_blockSolve;\n\n // Update contacts. This is where some contacts are destroyed.\n this.updateContacts();\n\n // Integrate velocities, solve velocity constraints, and integrate positions.\n if (this.m_stepComplete && timeStep > 0.0) {\n this.m_solver.solveWorld(this.s_step);\n\n // Synchronize fixtures, check for out of range bodies.\n for (let b = this.m_bodyList; b; b = b.getNext()) {\n // If a body was not in an island then it did not move.\n if (b.m_islandFlag == false) {\n continue;\n }\n\n if (b.isStatic()) {\n continue;\n }\n\n // Update fixtures (for broad-phase).\n b.synchronizeFixtures();\n }\n // Look for new contacts.\n this.findNewContacts();\n }\n\n // Handle TOI events.\n if (this.m_continuousPhysics && timeStep > 0.0) {\n this.m_solver.solveWorldTOI(this.s_step);\n }\n\n if (this.m_clearForces) {\n this.clearForces();\n }\n\n this.m_locked = false;\n\n this.publish('post-step', timeStep);\n }\n\n /**\n * @internal\n * Call this method to find new contacts.\n */\n findNewContacts(): void {\n this.m_broadPhase.updatePairs(\n (proxyA: FixtureProxy, proxyB: FixtureProxy) => this.createContact(proxyA, proxyB)\n );\n }\n\n /**\n * @internal\n * Callback for broad-phase.\n */\n createContact(proxyA: FixtureProxy, proxyB: FixtureProxy): void {\n const fixtureA = proxyA.fixture;\n const fixtureB = proxyB.fixture;\n\n const indexA = proxyA.childIndex;\n const indexB = proxyB.childIndex;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Are the fixtures on the same body?\n if (bodyA == bodyB) {\n return;\n }\n\n // TODO_ERIN use a hash table to remove a potential bottleneck when both\n // bodies have a lot of contacts.\n // Does a contact already exist?\n let edge = bodyB.getContactList(); // ContactEdge\n while (edge) {\n if (edge.other == bodyA) {\n const fA = edge.contact.getFixtureA();\n const fB = edge.contact.getFixtureB();\n const iA = edge.contact.getChildIndexA();\n const iB = edge.contact.getChildIndexB();\n\n if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) {\n // A contact already exists.\n return;\n }\n\n if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) {\n // A contact already exists.\n return;\n }\n }\n\n edge = edge.next;\n }\n\n if (bodyB.shouldCollide(bodyA) == false) {\n return;\n }\n if (fixtureB.shouldCollide(fixtureA) == false) {\n return;\n }\n\n // Call the factory.\n const contact = Contact.create(fixtureA, indexA, fixtureB, indexB);\n if (contact == null) {\n return;\n }\n\n // Insert into the world.\n contact.m_prev = null;\n if (this.m_contactList != null) {\n contact.m_next = this.m_contactList;\n this.m_contactList.m_prev = contact;\n }\n this.m_contactList = contact;\n\n ++this.m_contactCount;\n }\n\n /**\n * @internal\n * Removes old non-overlapping contacts, applies filters and updates contacts.\n */\n updateContacts(): void {\n // Update awake contacts.\n let c;\n let next_c = this.m_contactList;\n while (c = next_c) {\n next_c = c.getNext();\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Is this contact flagged for filtering?\n if (c.m_filterFlag) {\n if (bodyB.shouldCollide(bodyA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n if (fixtureB.shouldCollide(fixtureA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n // Clear the filtering flag.\n c.m_filterFlag = false;\n }\n\n const activeA = bodyA.isAwake() && !bodyA.isStatic();\n const activeB = bodyB.isAwake() && !bodyB.isStatic();\n\n // At least one body must be awake and it must be dynamic or kinematic.\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const proxyIdA = fixtureA.m_proxies[indexA].proxyId;\n const proxyIdB = fixtureB.m_proxies[indexB].proxyId;\n const overlap = this.m_broadPhase.testOverlap(proxyIdA, proxyIdB);\n\n // Here we destroy contacts that cease to overlap in the broad-phase.\n if (overlap == false) {\n this.destroyContact(c);\n continue;\n }\n\n // The contact persists.\n c.update(this);\n }\n }\n\n /**\n * @internal\n */\n destroyContact(contact: Contact): void {\n Contact.destroy(contact, this);\n\n // Remove from the world.\n if (contact.m_prev) {\n contact.m_prev.m_next = contact.m_next;\n }\n if (contact.m_next) {\n contact.m_next.m_prev = contact.m_prev;\n }\n if (contact == this.m_contactList) {\n this.m_contactList = contact.m_next;\n }\n\n --this.m_contactCount;\n }\n\n\n /**\n * Called when two fixtures begin to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'begin-contact', listener: (contact: Contact) => void): World;\n /**\n * Called when two fixtures cease to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'end-contact', listener: (contact: Contact) => void): World;\n /**\n * This is called after a contact is updated. This allows you to inspect a\n * contact before it goes to the solver. If you are careful, you can modify the\n * contact manifold (e.g. disable contact). A copy of the old manifold is\n * provided so that you can detect changes. Note: this is called only for awake\n * bodies. Note: this is called even when the number of contact points is zero.\n * Note: this is not called for sensors. Note: if you set the number of contact\n * points to zero, you will not get an endContact callback. However, you may get\n * a beginContact callback the next step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n /**\n * This lets you inspect a contact after the solver is finished. This is useful\n * for inspecting impulses. Note: the contact manifold does not include time of\n * impact impulses, which can be arbitrarily large if the sub-step is small.\n * Hence the impulse is provided explicitly in a separate data structure. Note:\n * this is only called for contacts that are touching, solid, and awake.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n /** Listener is called whenever a body is removed. */\n on(name: 'remove-body', listener: (body: Body) => void): World;\n /** Listener is called whenever a joint is removed implicitly or explicitly. */\n on(name: 'remove-joint', listener: (joint: Joint) => void): World;\n /** Listener is called whenever a fixture is removed implicitly or explicitly. */\n on(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Register an event listener.\n */\n // tslint:disable-next-line:typedef\n on(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n if (!this._listeners) {\n this._listeners = {};\n }\n if (!this._listeners[name]) {\n this._listeners[name] = [];\n }\n this._listeners[name].push(listener);\n return this;\n }\n\n off(name: 'begin-contact', listener: (contact: Contact) => void): World;\n off(name: 'end-contact', listener: (contact: Contact) => void): World;\n off(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n off(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n off(name: 'remove-body', listener: (body: Body) => void): World;\n off(name: 'remove-joint', listener: (joint: Joint) => void): World;\n off(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Remove an event listener.\n */\n // tslint:disable-next-line:typedef\n off(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return this;\n }\n const index = listeners.indexOf(listener);\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n publish(name: string, arg1?: any, arg2?: any, arg3?: any): number {\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return 0;\n }\n for (let l = 0; l < listeners.length; l++) {\n listeners[l].call(this, arg1, arg2, arg3);\n }\n return listeners.length;\n }\n\n /**\n * @internal\n */\n beginContact(contact: Contact): void {\n this.publish('begin-contact', contact);\n }\n\n /**\n * @internal\n */\n endContact(contact: Contact): void {\n this.publish('end-contact', contact);\n }\n\n /**\n * @internal\n */\n preSolve(contact: Contact, oldManifold: Manifold): void {\n this.publish('pre-solve', contact, oldManifold);\n }\n\n /**\n * @internal\n */\n postSolve(contact: Contact, impulse: ContactImpulse): void {\n this.publish('post-solve', contact, impulse);\n }\n\n /**\n * Joints and fixtures are destroyed when their associated body is destroyed.\n * Register a destruction listener so that you may nullify references to these\n * joints and shapes.\n *\n * `function(object)` is called when any joint or fixture is about to\n * be destroyed due to the destruction of one of its attached or parent bodies.\n */\n\n /**\n * Register a contact filter to provide specific control over collision.\n * Otherwise the default filter is used (defaultFilter). The listener is owned\n * by you and must remain in scope.\n *\n * Moved to Fixture.\n */\n}","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class Vec3 {\n x: number;\n y: number;\n z: number;\n\n constructor(x: number, y: number, z: number);\n constructor(obj: { x: number, y: number, z: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?, z?) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Vec3)) {\n return new Vec3(x, y, z);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n this.z = x.z;\n } else {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n _ASSERT && Vec3.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y,\n z: this.z\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = data.x;\n obj.y = data.y;\n obj.z = data.z;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number, z: number): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = x;\n obj.y = y;\n obj.z = z;\n return obj;\n }\n\n static zero(): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = 0;\n obj.y = 0;\n obj.z = 0;\n return obj;\n }\n\n static clone(v: Vec3): Vec3 {\n _ASSERT && Vec3.assert(v);\n return Vec3.neo(v.x, v.y, v.z);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y) && Math.isFinite(obj.z);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Vec3.isValid(o), 'Invalid Vec3!', o);\n }\n\n setZero(): Vec3 {\n this.x = 0.0;\n this.y = 0.0;\n this.z = 0.0;\n return this;\n }\n\n set(x: number, y: number, z: number): Vec3 {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n\n add(w: Vec3): Vec3 {\n this.x += w.x;\n this.y += w.y;\n this.z += w.z;\n return this;\n }\n\n sub(w: Vec3): Vec3 {\n this.x -= w.x;\n this.y -= w.y;\n this.z -= w.z;\n return this;\n }\n\n mul(m: number): Vec3 {\n this.x *= m;\n this.y *= m;\n this.z *= m;\n return this;\n }\n\n static areEqual(v: Vec3, w: Vec3): boolean {\n _ASSERT && Vec3.assert(v);\n _ASSERT && Vec3.assert(w);\n return v === w ||\n typeof v === 'object' && v !== null &&\n typeof w === 'object' && w !== null &&\n v.x === w.x && v.y === w.y && v.z === w.z;\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec3, w: Vec3): number {\n return v.x * w.x + v.y * w.y + v.z * w.z;\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static cross(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(\n v.y * w.z - v.z * w.y,\n v.z * w.x - v.x * w.z,\n v.x * w.y - v.y * w.x\n );\n }\n\n static add(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x + w.x, v.y + w.y, v.z + w.z);\n }\n\n static sub(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x - w.x, v.y - w.y, v.z - w.z);\n }\n\n static mul(v: Vec3, m: number): Vec3 {\n return new Vec3(m * v.x, m * v.y, m * v.z);\n }\n\n neg(): Vec3 {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n }\n\n static neg(v: Vec3): Vec3 {\n return new Vec3(-v.x, -v.y, -v.z);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { AABB, RayCastInput, RayCastOutput } from '../AABB';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A line segment (edge) shape. These can be connected in chains or loops to\n * other edge shapes. The connectivity information is used to ensure correct\n * contact normals.\n */\nexport class EdgeShape extends Shape {\n static TYPE = 'edge' as const;\n m_type: 'edge';\n\n m_radius: number;\n\n // These are the edge vertices\n m_vertex1: Vec2;\n m_vertex2: Vec2;\n\n // Optional adjacent vertices. These are used for smooth collision.\n // Used by chain shape.\n m_vertex0: Vec2;\n m_vertex3: Vec2;\n m_hasVertex0: boolean;\n m_hasVertex3: boolean;\n\n constructor(v1?: Vec2Value, v2?: Vec2Value) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof EdgeShape)) {\n return new EdgeShape(v1, v2);\n }\n\n super();\n\n this.m_type = EdgeShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n\n this.m_vertex1 = v1 ? Vec2.clone(v1) : Vec2.zero();\n this.m_vertex2 = v2 ? Vec2.clone(v2) : Vec2.zero();\n\n this.m_vertex0 = Vec2.zero();\n this.m_vertex3 = Vec2.zero();\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertex1: this.m_vertex1,\n vertex2: this.m_vertex2,\n\n vertex0: this.m_vertex0,\n vertex3: this.m_vertex3,\n hasVertex0: this.m_hasVertex0,\n hasVertex3: this.m_hasVertex3,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): EdgeShape {\n const shape = new EdgeShape(data.vertex1, data.vertex2);\n if (shape.m_hasVertex0) {\n shape.setPrevVertex(data.vertex0);\n }\n if (shape.m_hasVertex3) {\n shape.setNextVertex(data.vertex3);\n }\n return shape;\n }\n\n /** @internal */\n _reset(): void {\n // noop\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getType(): 'edge' {\n return this.m_type;\n }\n\n /** @internal @deprecated */\n setNext(v?: Vec2): EdgeShape {\n return this.setNextVertex(v);\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n setNextVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex3.setVec2(v);\n this.m_hasVertex3 = true;\n } else {\n this.m_vertex3.setZero();\n this.m_hasVertex3 = false;\n }\n return this;\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n getNextVertex(): Vec2 {\n return this.m_vertex3;\n }\n\n /** @internal @deprecated */\n setPrev(v?: Vec2): EdgeShape {\n return this.setPrevVertex(v);\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n setPrevVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex0.setVec2(v);\n this.m_hasVertex0 = true;\n } else {\n this.m_vertex0.setZero();\n this.m_hasVertex0 = false;\n }\n return this;\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n getPrevVertex(): Vec2 {\n return this.m_vertex0;\n }\n\n /**\n * Set this as an isolated edge.\n */\n _set(v1: Vec2, v2: Vec2): EdgeShape {\n this.m_vertex1.setVec2(v1);\n this.m_vertex2.setVec2(v2);\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): EdgeShape {\n const clone = new EdgeShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_vertex1.setVec2(this.m_vertex1);\n clone.m_vertex2.setVec2(this.m_vertex2);\n clone.m_vertex0.setVec2(this.m_vertex0);\n clone.m_vertex3.setVec2(this.m_vertex3);\n clone.m_hasVertex0 = this.m_hasVertex0;\n clone.m_hasVertex3 = this.m_hasVertex3;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // p = p1 + t * d\n // v = v1 + s * e\n // p1 + t * d = v1 + s * e\n // s * e - t * d = p1 - v1\n\n // NOT_USED(childIndex);\n\n // Put the ray into the edge's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n const v1 = this.m_vertex1;\n const v2 = this.m_vertex2;\n const e = Vec2.sub(v2, v1);\n const normal = Vec2.neo(e.y, -e.x);\n normal.normalize();\n\n // q = p1 + t * d\n // dot(normal, q - v1) = 0\n // dot(normal, p1 - v1) + t * dot(normal, d) = 0\n const numerator = Vec2.dot(normal, Vec2.sub(v1, p1));\n const denominator = Vec2.dot(normal, d);\n\n if (denominator == 0.0) {\n return false;\n }\n\n const t = numerator / denominator;\n if (t < 0.0 || input.maxFraction < t) {\n return false;\n }\n\n const q = Vec2.add(p1, Vec2.mulNumVec2(t, d));\n\n // q = v1 + s * r\n // s = dot(q - v1, r) / dot(r, r)\n const r = Vec2.sub(v2, v1);\n const rr = Vec2.dot(r, r);\n if (rr == 0.0) {\n return false;\n }\n\n const s = Vec2.dot(Vec2.sub(q, v1), r) / rr;\n if (s < 0.0 || 1.0 < s) {\n return false;\n }\n\n output.fraction = t;\n if (numerator > 0.0) {\n output.normal = Rot.mulVec2(xf.q, normal).neg();\n } else {\n output.normal = Rot.mulVec2(xf.q, normal);\n }\n return true;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const v1 = Transform.mulVec2(xf, this.m_vertex1);\n const v2 = Transform.mulVec2(xf, this.m_vertex2);\n\n aabb.combinePoints(v1, v2);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center.setCombine(0.5, this.m_vertex1, 0.5, this.m_vertex2);\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_vertex1);\n proxy.m_vertices.push(this.m_vertex2);\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n}\n\nexport const Edge = EdgeShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport { Transform } from '../../common/Transform';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\nimport { EdgeShape } from './EdgeShape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A chain shape is a free form sequence of line segments. The chain has\n * two-sided collision, so you can use inside and outside collision. Therefore,\n * you may use any winding order. Connectivity information is used to create\n * smooth collisions.\n *\n * WARNING: The chain will not collide properly if there are self-intersections.\n */\nexport class ChainShape extends Shape {\n static TYPE = 'chain' as const;\n m_type: 'chain';\n\n m_radius: number;\n\n m_vertices: Vec2[];\n m_count: number;\n m_prevVertex: Vec2 | null;\n m_nextVertex: Vec2 | null;\n m_hasPrevVertex: boolean;\n m_hasNextVertex: boolean;\n\n m_isLoop: boolean;\n\n constructor(vertices?: Vec2Value[], loop?: boolean) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof ChainShape)) {\n return new ChainShape(vertices, loop);\n }\n\n super();\n\n this.m_type = ChainShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_vertices = [];\n this.m_count = 0;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n\n this.m_isLoop = !!loop;\n\n if (vertices && vertices.length) {\n if (loop) {\n this._createLoop(vertices);\n } else {\n this._createChain(vertices);\n }\n }\n }\n\n /** @internal */\n _serialize(): object {\n const data = {\n type: this.m_type,\n vertices: this.m_vertices,\n isLoop: this.m_isLoop,\n hasPrevVertex: this.m_hasPrevVertex,\n hasNextVertex: this.m_hasNextVertex,\n prevVertex: null as Vec2 | null,\n nextVertex: null as Vec2 | null,\n };\n if (this.m_prevVertex) {\n data.prevVertex = this.m_prevVertex;\n }\n if (this.m_nextVertex) {\n data.nextVertex = this.m_nextVertex;\n }\n return data;\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): ChainShape {\n const vertices: Vec2[] = [];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n const shape = new ChainShape(vertices, data.isLoop);\n if (data.prevVertex) {\n shape.setPrevVertex(data.prevVertex);\n }\n if (data.nextVertex) {\n shape.setNextVertex(data.nextVertex);\n }\n return shape;\n }\n\n // clear() {\n // this.m_vertices.length = 0;\n // this.m_count = 0;\n // }\n\n getType(): 'chain' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n /**\n * @internal\n * Create a loop. This automatically adjusts connectivity.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createLoop(vertices: Vec2Value[]): ChainShape {\n _ASSERT && console.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && console.assert(vertices.length >= 3);\n for (let i = 1; i < vertices.length; ++i) {\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n // If the code crashes here, it means your vertices are too close together.\n _ASSERT && console.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_vertices = [];\n this.m_count = vertices.length + 1;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n this.m_vertices[vertices.length] = Vec2.clone(vertices[0]);\n\n this.m_prevVertex = this.m_vertices[this.m_count - 2];\n this.m_nextVertex = this.m_vertices[1];\n this.m_hasPrevVertex = true;\n this.m_hasNextVertex = true;\n return this;\n }\n\n /**\n * @internal\n * Create a chain with isolated end vertices.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createChain(vertices: Vec2Value[]): ChainShape {\n _ASSERT && console.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && console.assert(vertices.length >= 2);\n for (let i = 1; i < vertices.length; ++i) {\n // If the code crashes here, it means your vertices are too close together.\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n _ASSERT && console.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_count = vertices.length;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n return this;\n }\n\n /** @internal */\n _reset(): void {\n if (this.m_isLoop) {\n this._createLoop(this.m_vertices);\n } else {\n this._createChain(this.m_vertices);\n }\n }\n\n /**\n * Establish connectivity to a vertex that precedes the first vertex. Don't call\n * this for loops.\n */\n setPrevVertex(prevVertex: Vec2): void {\n this.m_prevVertex = prevVertex;\n this.m_hasPrevVertex = true;\n }\n\n getPrevVertex(): Vec2 {\n return this.m_prevVertex;\n }\n\n /**\n * Establish connectivity to a vertex that follows the last vertex. Don't call\n * this for loops.\n */\n setNextVertex(nextVertex: Vec2): void {\n this.m_nextVertex = nextVertex;\n this.m_hasNextVertex = true;\n }\n\n getNextVertex(): Vec2 {\n return this.m_nextVertex;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): ChainShape {\n const clone = new ChainShape();\n clone._createChain(this.m_vertices);\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_prevVertex = this.m_prevVertex;\n clone.m_nextVertex = this.m_nextVertex;\n clone.m_hasPrevVertex = this.m_hasPrevVertex;\n clone.m_hasNextVertex = this.m_hasNextVertex;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): number {\n // edge count = vertex count - 1\n return this.m_count - 1;\n }\n\n // Get a child edge.\n getChildEdge(edge: EdgeShape, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count - 1);\n edge.m_type = EdgeShape.TYPE;\n edge.m_radius = this.m_radius;\n\n edge.m_vertex1 = this.m_vertices[childIndex];\n edge.m_vertex2 = this.m_vertices[childIndex + 1];\n\n if (childIndex > 0) {\n edge.m_vertex0 = this.m_vertices[childIndex - 1];\n edge.m_hasVertex0 = true;\n } else {\n edge.m_vertex0 = this.m_prevVertex;\n edge.m_hasVertex0 = this.m_hasPrevVertex;\n }\n\n if (childIndex < this.m_count - 2) {\n edge.m_vertex3 = this.m_vertices[childIndex + 2];\n edge.m_hasVertex3 = true;\n } else {\n edge.m_vertex3 = this.m_nextVertex;\n edge.m_hasVertex3 = this.m_hasNextVertex;\n }\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index <= this.m_count);\n if (index < this.m_count) {\n return this.m_vertices[index];\n } else {\n return this.m_vertices[0];\n }\n }\n\n isLoop(): boolean {\n return this.m_isLoop;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * This always return false.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n\n const edgeShape = new EdgeShape(this.getVertex(childIndex), this.getVertex(childIndex + 1));\n return edgeShape.rayCast(output, input, xf, 0);\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n\n const v1 = Transform.mulVec2(xf, this.getVertex(childIndex));\n const v2 = Transform.mulVec2(xf, this.getVertex(childIndex + 1));\n\n aabb.combinePoints(v1, v2);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * Chains have zero mass.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center = Vec2.zero();\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n proxy.m_buffer[0] = this.getVertex(childIndex);\n proxy.m_buffer[1] = this.getVertex(childIndex + 1);\n proxy.m_vertices = proxy.m_buffer;\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n}\n\nexport const Chain = ChainShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A convex polygon. It is assumed that the interior of the polygon is to the\n * left of each edge. Polygons have a maximum number of vertices equal to\n * Settings.maxPolygonVertices. In most cases you should not need many vertices\n * for a convex polygon. extends Shape\n */\nexport class PolygonShape extends Shape {\n static TYPE = 'polygon' as const;\n m_type: 'polygon';\n\n m_centroid: Vec2;\n m_vertices: Vec2[]; // [Settings.maxPolygonVertices]\n m_normals: Vec2[]; // [Settings.maxPolygonVertices]\n m_count: number;\n m_radius: number;\n\n // @ts-ignore\n constructor(vertices?: Vec2Value[]) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PolygonShape)) {\n return new PolygonShape(vertices);\n }\n\n super();\n\n this.m_type = PolygonShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_centroid = Vec2.zero();\n this.m_vertices = [];\n this.m_normals = [];\n this.m_count = 0;\n\n if (vertices && vertices.length) {\n this._set(vertices);\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertices: this.m_vertices,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): PolygonShape {\n const vertices: Vec2[] = [];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n\n const shape = new PolygonShape(vertices);\n return shape;\n }\n\n getType(): 'polygon' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): PolygonShape {\n const clone = new PolygonShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_count = this.m_count;\n clone.m_centroid.setVec2(this.m_centroid);\n for (let i = 0; i < this.m_count; i++) {\n clone.m_vertices.push(this.m_vertices[i].clone());\n }\n for (let i = 0; i < this.m_normals.length; i++) {\n clone.m_normals.push(this.m_normals[i].clone());\n }\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /** @internal */\n _reset(): void {\n this._set(this.m_vertices);\n }\n\n /**\n * @internal\n *\n * Create a convex hull from the given array of local points. The count must be\n * in the range [3, Settings.maxPolygonVertices].\n *\n * Warning: the points may be re-ordered, even if they form a convex polygon\n * Warning: collinear points are handled but not removed. Collinear points may\n * lead to poor stacking behavior.\n */\n _set(vertices: Vec2Value[]): void {\n _ASSERT && console.assert(3 <= vertices.length && vertices.length <= Settings.maxPolygonVertices);\n if (vertices.length < 3) {\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n let n = Math.min(vertices.length, Settings.maxPolygonVertices);\n\n // Perform welding and copy vertices into local buffer.\n const ps: Vec2[] = []; // [Settings.maxPolygonVertices];\n for (let i = 0; i < n; ++i) {\n const v = vertices[i];\n\n let unique = true;\n for (let j = 0; j < ps.length; ++j) {\n if (Vec2.distanceSquared(v, ps[j]) < 0.25 * Settings.linearSlopSquared) {\n unique = false;\n break;\n }\n }\n\n if (unique) {\n ps.push(Vec2.clone(v));\n }\n }\n\n n = ps.length;\n if (n < 3) {\n // Polygon is degenerate.\n _ASSERT && console.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n // Create the convex hull using the Gift wrapping algorithm\n // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm\n\n // Find the right most point on the hull (in case of multiple points bottom most is used)\n let i0 = 0;\n let x0 = ps[0].x;\n for (let i = 1; i < n; ++i) {\n const x = ps[i].x;\n if (x > x0 || (x === x0 && ps[i].y < ps[i0].y)) {\n i0 = i;\n x0 = x;\n }\n }\n\n const hull = [] as number[]; // [Settings.maxPolygonVertices];\n let m = 0;\n let ih = i0;\n\n while (true) {\n hull[m] = ih;\n\n let ie = 0;\n for (let j = 1; j < n; ++j) {\n if (ie === ih) {\n ie = j;\n continue;\n }\n\n const r = Vec2.sub(ps[ie], ps[hull[m]]);\n const v = Vec2.sub(ps[j], ps[hull[m]]);\n const c = Vec2.crossVec2Vec2(r, v);\n // c < 0 means counter-clockwise wrapping, c > 0 means clockwise wrapping\n if (c < 0.0) {\n ie = j;\n }\n\n // Collinearity check\n if (c === 0.0 && v.lengthSquared() > r.lengthSquared()) {\n ie = j;\n }\n }\n\n ++m;\n ih = ie;\n\n if (ie === i0) {\n break;\n }\n }\n\n if (m < 3) {\n // Polygon is degenerate.\n _ASSERT && console.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n this.m_count = m;\n\n // Copy vertices.\n this.m_vertices = [];\n for (let i = 0; i < m; ++i) {\n this.m_vertices[i] = ps[hull[i]];\n }\n\n // Compute normals. Ensure the edges have non-zero length.\n for (let i = 0; i < m; ++i) {\n const i1 = i;\n const i2 = i + 1 < m ? i + 1 : 0;\n const edge = Vec2.sub(this.m_vertices[i2], this.m_vertices[i1]);\n _ASSERT && console.assert(edge.lengthSquared() > Math.EPSILON * Math.EPSILON);\n this.m_normals[i] = Vec2.crossVec2Num(edge, 1.0);\n this.m_normals[i].normalize();\n }\n\n // Compute the polygon centroid.\n this.m_centroid = ComputeCentroid(this.m_vertices, m);\n }\n\n /** @internal */\n _setAsBox(hx: number, hy: number, center?: Vec2Value, angle?: number): void {\n // start with right-bottom, counter-clockwise, as in Gift wrapping algorithm in PolygonShape._set()\n this.m_vertices[0] = Vec2.neo(hx, -hy);\n this.m_vertices[1] = Vec2.neo(hx, hy);\n this.m_vertices[2] = Vec2.neo(-hx, hy);\n this.m_vertices[3] = Vec2.neo(-hx, -hy);\n\n this.m_normals[0] = Vec2.neo(1.0, 0.0);\n this.m_normals[1] = Vec2.neo(0.0, 1.0);\n this.m_normals[2] = Vec2.neo(-1.0, 0.0);\n this.m_normals[3] = Vec2.neo(0.0, -1.0);\n\n this.m_count = 4;\n\n if (Vec2.isValid(center)) {\n angle = angle || 0;\n\n this.m_centroid.setVec2(center);\n\n const xf = Transform.identity();\n xf.p.setVec2(center);\n xf.q.setAngle(angle);\n\n // Transform vertices and normals.\n for (let i = 0; i < this.m_count; ++i) {\n this.m_vertices[i] = Transform.mulVec2(xf, this.m_vertices[i]);\n this.m_normals[i] = Rot.mulVec2(xf.q, this.m_normals[i]);\n }\n }\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): boolean {\n const pLocal = Rot.mulTVec2(xf.q, Vec2.sub(p, xf.p));\n\n for (let i = 0; i < this.m_count; ++i) {\n const dot = Vec2.dot(this.m_normals[i], Vec2.sub(pLocal, this.m_vertices[i]));\n if (dot > 0.0) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n\n // Put the ray into the polygon's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n let lower = 0.0;\n let upper = input.maxFraction;\n\n let index = -1;\n\n for (let i = 0; i < this.m_count; ++i) {\n // p = p1 + a * d\n // dot(normal, p - v) = 0\n // dot(normal, p1 - v) + a * dot(normal, d) = 0\n const numerator = Vec2.dot(this.m_normals[i], Vec2.sub(this.m_vertices[i], p1));\n const denominator = Vec2.dot(this.m_normals[i], d);\n\n if (denominator == 0.0) {\n if (numerator < 0.0) {\n return false;\n }\n } else {\n // Note: we want this predicate without division:\n // lower < numerator / denominator, where denominator < 0\n // Since denominator < 0, we have to flip the inequality:\n // lower < numerator / denominator <==> denominator * lower > numerator.\n if (denominator < 0.0 && numerator < lower * denominator) {\n // Increase lower.\n // The segment enters this half-space.\n lower = numerator / denominator;\n index = i;\n } else if (denominator > 0.0 && numerator < upper * denominator) {\n // Decrease upper.\n // The segment exits this half-space.\n upper = numerator / denominator;\n }\n }\n\n // The use of epsilon here causes the assert on lower to trip\n // in some cases. Apparently the use of epsilon was to make edge\n // shapes work, but now those are handled separately.\n // if (upper < lower - Math.EPSILON)\n if (upper < lower) {\n return false;\n }\n }\n\n _ASSERT && console.assert(0.0 <= lower && lower <= input.maxFraction);\n\n if (index >= 0) {\n output.fraction = lower;\n output.normal = Rot.mulVec2(xf.q, this.m_normals[index]);\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < this.m_count; ++i) {\n const v = Transform.mulVec2(xf, this.m_vertices[i]);\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, v.y);\n maxY = Math.max(maxY, v.y);\n }\n\n aabb.lowerBound.setNum(minX, minY);\n aabb.upperBound.setNum(maxX, maxY);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n // Polygon mass, centroid, and inertia.\n // Let rho be the polygon density in mass per unit area.\n // Then:\n // mass = rho * int(dA)\n // centroid.x = (1/mass) * rho * int(x * dA)\n // centroid.y = (1/mass) * rho * int(y * dA)\n // I = rho * int((x*x + y*y) * dA)\n //\n // We can compute these integrals by summing all the integrals\n // for each triangle of the polygon. To evaluate the integral\n // for a single triangle, we make a change of variables to\n // the (u,v) coordinates of the triangle:\n // x = x0 + e1x * u + e2x * v\n // y = y0 + e1y * u + e2y * v\n // where 0 <= u && 0 <= v && u + v <= 1.\n //\n // We integrate u from [0,1-v] and then v from [0,1].\n // We also need to use the Jacobian of the transformation:\n // D = cross(e1, e2)\n //\n // Simplification: triangle centroid = (1/3) * (p1 + p2 + p3)\n //\n // The rest of the derivation is handled by computer algebra.\n\n _ASSERT && console.assert(this.m_count >= 3);\n\n const center = Vec2.zero();\n let area = 0.0;\n let I = 0.0;\n\n // s is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const s = Vec2.zero();\n\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < this.m_count; ++i) {\n s.add(this.m_vertices[i]);\n }\n s.mul(1.0 / this.m_count);\n\n const k_inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < this.m_count; ++i) {\n // Triangle vertices.\n const e1 = Vec2.sub(this.m_vertices[i], s);\n const e2 = i + 1 < this.m_count ? Vec2.sub(this.m_vertices[i + 1], s) : Vec2 .sub(this.m_vertices[0], s);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n center.addCombine(triangleArea * k_inv3, e1, triangleArea * k_inv3, e2);\n\n const ex1 = e1.x;\n const ey1 = e1.y;\n const ex2 = e2.x;\n const ey2 = e2.y;\n\n const intx2 = ex1 * ex1 + ex2 * ex1 + ex2 * ex2;\n const inty2 = ey1 * ey1 + ey2 * ey1 + ey2 * ey2;\n\n I += (0.25 * k_inv3 * D) * (intx2 + inty2);\n }\n\n // Total mass\n massData.mass = density * area;\n\n // Center of mass\n _ASSERT && console.assert(area > Math.EPSILON);\n center.mul(1.0 / area);\n massData.center.setCombine(1, center, 1, s);\n\n // Inertia tensor relative to the local origin (point s).\n massData.I = density * I;\n\n // Shift to center of mass then to original body origin.\n massData.I += massData.mass * (Vec2.dot(massData.center, massData.center) - Vec2.dot(center, center));\n }\n\n /**\n * Validate convexity. This is a very time consuming operation.\n * @returns true if valid\n */\n validate(): boolean {\n for (let i = 0; i < this.m_count; ++i) {\n const i1 = i;\n const i2 = i < this.m_count - 1 ? i1 + 1 : 0;\n const p = this.m_vertices[i1];\n const e = Vec2.sub(this.m_vertices[i2], p);\n\n for (let j = 0; j < this.m_count; ++j) {\n if (j == i1 || j == i2) {\n continue;\n }\n\n const v = Vec2.sub(this.m_vertices[j], p);\n const c = Vec2.crossVec2Vec2(e, v);\n if (c < 0.0) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices = this.m_vertices;\n proxy.m_count = this.m_count;\n proxy.m_radius = this.m_radius;\n }\n}\n\nfunction ComputeCentroid(vs: Vec2[], count: number): Vec2 {\n _ASSERT && console.assert(count >= 3);\n\n const c = Vec2.zero();\n let area = 0.0;\n\n // pRef is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const pRef = Vec2.zero();\n if (false) {\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < count; ++i) {\n pRef.add(vs[i]);\n }\n pRef.mul(1.0 / count);\n }\n\n const inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < count; ++i) {\n // Triangle vertices.\n const p1 = pRef;\n const p2 = vs[i];\n const p3 = i + 1 < count ? vs[i + 1] : vs[0];\n\n const e1 = Vec2.sub(p2, p1);\n const e2 = Vec2.sub(p3, p1);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n c.addMul(triangleArea * inv3, p1);\n c.addMul(triangleArea * inv3, p2);\n c.addMul(triangleArea * inv3, p3);\n }\n\n // Centroid\n _ASSERT && console.assert(area > Math.EPSILON);\n c.mul(1.0 / area);\n return c;\n}\n\nexport const Polygon = PolygonShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { Vec2Value } from '../../common/Vec2';\nimport { PolygonShape } from './PolygonShape';\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A rectangle polygon which extend PolygonShape.\n */\nexport class BoxShape extends PolygonShape {\n static TYPE = 'polygon' as const;\n\n constructor(hx: number, hy: number, center?: Vec2Value, angle?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof BoxShape)) {\n return new BoxShape(hx, hy, center, angle);\n }\n\n super();\n\n this._setAsBox(hx, hy, center, angle);\n }\n}\n\nexport const Box = BoxShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Shape } from '../Shape';\nimport { AABB, RayCastInput, RayCastOutput } from '../AABB';\nimport { Transform } from '../../common/Transform';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class CircleShape extends Shape {\n static TYPE = 'circle' as const;\n m_type: 'circle';\n\n m_p: Vec2;\n m_radius: number;\n\n constructor(position: Vec2Value, radius?: number);\n constructor(radius?: number);\n // tslint:disable-next-line:typedef\n constructor(a, b?) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof CircleShape)) {\n return new CircleShape(a, b);\n }\n\n super();\n\n this.m_type = CircleShape.TYPE;\n this.m_p = Vec2.zero();\n this.m_radius = 1;\n\n if (typeof a === 'object' && Vec2.isValid(a)) {\n this.m_p.setVec2(a);\n\n if (typeof b === 'number') {\n this.m_radius = b;\n }\n\n } else if (typeof a === 'number') {\n this.m_radius = a;\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n p: this.m_p,\n radius: this.m_radius,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): CircleShape {\n return new CircleShape(data.p, data.radius);\n }\n\n /** @internal */\n _reset(): void {\n // noop\n }\n\n getType(): 'circle' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getCenter(): Vec2 {\n return this.m_p;\n }\n\n getVertex(index: 0): Vec2 {\n _ASSERT && console.assert(index == 0);\n return this.m_p;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): CircleShape {\n const clone = new CircleShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_p = this.m_p.clone();\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): boolean {\n const center = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const d = Vec2.sub(p, center);\n return Vec2.dot(d, d) <= this.m_radius * this.m_radius;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // Collision Detection in Interactive 3D Environments by Gino van den Bergen\n // From Section 3.1.2\n // x = s + a * r\n // norm(x) = radius\n\n const position = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const s = Vec2.sub(input.p1, position);\n const b = Vec2.dot(s, s) - this.m_radius * this.m_radius;\n\n // Solve quadratic equation.\n const r = Vec2.sub(input.p2, input.p1);\n const c = Vec2.dot(s, r);\n const rr = Vec2.dot(r, r);\n const sigma = c * c - rr * b;\n\n // Check for negative discriminant and short segment.\n if (sigma < 0.0 || rr < Math.EPSILON) {\n return false;\n }\n\n // Find the point of intersection of the line with the circle.\n let a = -(c + Math.sqrt(sigma));\n\n // Is the intersection point on the segment?\n if (0.0 <= a && a <= input.maxFraction * rr) {\n a /= rr;\n output.fraction = a;\n output.normal = Vec2.add(s, Vec2.mulNumVec2(a, r));\n output.normal.normalize();\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const p = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n aabb.lowerBound.setNum(p.x - this.m_radius, p.y - this.m_radius);\n aabb.upperBound.setNum(p.x + this.m_radius, p.y + this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n massData.mass = density * Math.PI * this.m_radius * this.m_radius;\n massData.center = this.m_p;\n // inertia about the local origin\n massData.I = massData.mass\n * (0.5 * this.m_radius * this.m_radius + Vec2.dot(this.m_p, this.m_p));\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_p);\n proxy.m_count = 1;\n proxy.m_radius = this.m_radius;\n }\n\n}\n\nexport const Circle = CircleShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. A value of 0 disables softness.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * Distance length.\n */\n length?: number;\n}\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointDef extends JointDef, DistanceJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0\n};\n\n/**\n * A distance joint constrains two points on two bodies to remain at a fixed\n * distance from each other. You can view this as a massless, rigid rod.\n *\n * @param anchorA Anchor A in global coordination.\n * @param anchorB Anchor B in global coordination.\n */\nexport class DistanceJoint extends Joint {\n static TYPE = 'distance-joint' as const;\n\n // Solver shared\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_length: number;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_gamma: number;\n /** @internal */ m_bias: number;\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: DistanceJointDef);\n constructor(def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2);\n constructor(def: DistanceJointDef, bodyA?: Body, bodyB?: Body, anchorA?: Vec2, anchorB?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof DistanceJoint)) {\n return new DistanceJoint(def, bodyA, bodyB, anchorA, anchorB);\n }\n\n // order of constructor arguments is changed in v0.2\n if (bodyB && anchorA && ('m_type' in anchorA) && ('x' in bodyB) && ('y' in bodyB)) {\n const temp = bodyB;\n bodyB = anchorA as any as Body;\n anchorA = temp as any as Vec2;\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = DistanceJoint.TYPE;\n\n // Solver shared\n this.m_localAnchorA = Vec2.clone(anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.zero());\n this.m_length = Math.isFinite(def.length) ? def.length :\n Vec2.distance(bodyA.getWorldPoint(this.m_localAnchorA), bodyB.getWorldPoint(this.m_localAnchorB));\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n this.m_impulse = 0.0;\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n\n // 1-D constrained system\n // m (v2 - v1) = lambda\n // v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass.\n // x2 = x1 + h * v2\n\n // 1-D mass-damper-spring system\n // m (v2 - v1) + h * d * v2 + h * k *\n\n // C = norm(p2 - p1) - L\n // u = (p2 - p1) / norm(p2 - p1)\n // Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1))\n // J = [-u -cross(r1, u) u cross(r2, u)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n length: this.m_length,\n\n impulse: this.m_impulse,\n gamma: this.m_gamma,\n bias: this.m_bias,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): DistanceJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new DistanceJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n length?: number,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.length > 0) {\n this.m_length = +def.length;\n } else if (def.length < 0) { // don't change length\n } else if (def.anchorA || def.anchorA || def.anchorA || def.anchorA) {\n this.m_length = Vec2.distance(\n this.m_bodyA.getWorldPoint(this.m_localAnchorA),\n this.m_bodyB.getWorldPoint(this.m_localAnchorB)\n );\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the natural length. Manipulating the length can lead to non-physical\n * behavior when the frequency is zero.\n */\n setLength(length: number): void {\n this.m_length = length;\n }\n\n /**\n * Get the natural length.\n */\n getLength(): number {\n return this.m_length;\n }\n\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n this.m_u = Vec2.sub(Vec2.add(cB, this.m_rB), Vec2.add(cA, this.m_rA));\n\n // Handle singularity.\n const length = this.m_u.length();\n if (length > Settings.linearSlop) {\n this.m_u.mul(1.0 / length);\n } else {\n this.m_u.setNum(0.0, 0.0);\n }\n\n const crAu = Vec2.crossVec2Vec2(this.m_rA, this.m_u);\n const crBu = Vec2.crossVec2Vec2(this.m_rB, this.m_u);\n let invMass = this.m_invMassA + this.m_invIA * crAu * crAu + this.m_invMassB\n + this.m_invIB * crBu * crBu;\n\n // Compute the effective mass matrix.\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (this.m_frequencyHz > 0.0) {\n const C = length - this.m_length;\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * this.m_mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = this.m_mass * omega * omega;\n\n // magic formulas\n const h = step.dt;\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invMass += this.m_gamma;\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n } else {\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n const Cdot = Vec2.dot(this.m_u, vpB) - Vec2.dot(this.m_u, vpA);\n\n const impulse = -this.m_mass\n * (Cdot + this.m_bias + this.m_gamma * this.m_impulse);\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u);\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n if (this.m_frequencyHz > 0.0) {\n // There is no position correction for soft distance constraints.\n return true;\n }\n\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA));\n\n const length = u.normalize();\n let C = length - this.m_length;\n C = Math\n .clamp(C, -Settings.maxLinearCorrection, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C;\n const P = Vec2.mulNumVec2(impulse, u);\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointOpt extends JointOpt {\n /**\n * The maximum friction force in N.\n */\n maxForce?: number;\n /**\n * The maximum friction torque in N-m.\n */\n maxTorque?: number;\n}\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointDef extends JointDef, FrictionJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n maxTorque : 0.0,\n};\n\n/**\n * Friction joint. This is used for top-down friction. It provides 2D\n * translational friction and angular friction.\n *\n * @param anchor Anchor in global coordination.\n */\nexport class FrictionJoint extends Joint {\n static TYPE = 'friction-joint' as const;\n\n /** @internal */ m_type: 'friction-joint';\n\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n // Solver shared\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: FrictionJointDef);\n constructor(def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: FrictionJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof FrictionJoint)) {\n return new FrictionJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = FrictionJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n\n // Solver shared\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): FrictionJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new FrictionJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && console.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && console.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y\n * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x\n * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt; // float\n\n // Solve angular friction\n {\n const Cdot = wB - wA; // float\n let impulse = -this.m_angularMass * Cdot; // float\n\n const oldImpulse = this.m_angularImpulse; // float\n const maxImpulse = h * this.m_maxTorque; // float\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)), Vec2.add(vA,\n Vec2.crossNumVec2(wA, this.m_rA))); // Vec2\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); // Vec2\n const oldImpulse = this.m_linearImpulse; // Vec2\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce; // float\n\n if (this.m_linearImpulse.lengthSquared() > maxImpulse * maxImpulse) {\n this.m_linearImpulse.normalize();\n this.m_linearImpulse.mul(maxImpulse);\n }\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from './Vec2';\nimport { Vec3 } from './Vec3';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 3-by-3 matrix. Stored in column-major order.\n */\nexport class Mat33 {\n ex: Vec3;\n ey: Vec3;\n ez: Vec3;\n\n constructor(a: Vec3, b: Vec3, c: Vec3);\n constructor();\n constructor(a?: Vec3, b?: Vec3, c?: Vec3) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec3.clone(a);\n this.ey = Vec3.clone(b);\n this.ez = Vec3.clone(c);\n } else {\n this.ex = Vec3.zero();\n this.ey = Vec3.zero();\n this.ez = Vec3.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec3.isValid(obj.ex) && Vec3.isValid(obj.ey) && Vec3.isValid(obj.ez);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Mat33.isValid(o), 'Invalid Mat33!', o);\n }\n\n /**\n * Set this matrix to all zeros.\n */\n setZero(): Mat33 {\n this.ex.setZero();\n this.ey.setZero();\n this.ez.setZero();\n return this;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve33(v: Vec3): Vec3 {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = new Vec3();\n r.x = det * Vec3.dot(v, Vec3.cross(this.ey, this.ez));\n r.y = det * Vec3.dot(this.ex, Vec3.cross(v, this.ez));\n r.z = det * Vec3.dot(this.ex, Vec3.cross(this.ey, v));\n return r;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix\n * equation.\n */\n solve22(v: Vec2): Vec2 {\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a21 = this.ex.y;\n const a22 = this.ey.y;\n let det = a11 * a22 - a12 * a21;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = Vec2.zero();\n r.x = det * (a22 * v.x - a12 * v.y);\n r.y = det * (a11 * v.y - a21 * v.x);\n return r;\n }\n\n /**\n * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if\n * singular.\n */\n getInverse22(M: Mat33): void {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n M.ex.x = det * d;\n M.ey.x = -det * b;\n M.ex.z = 0.0;\n M.ex.y = -det * c;\n M.ey.y = det * a;\n M.ey.z = 0.0;\n M.ez.x = 0.0;\n M.ez.y = 0.0;\n M.ez.z = 0.0;\n }\n\n /**\n * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix\n * if singular.\n */\n getSymInverse33(M: Mat33): void {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a13 = this.ez.x;\n const a22 = this.ey.y;\n const a23 = this.ez.y;\n const a33 = this.ez.z;\n\n M.ex.x = det * (a22 * a33 - a23 * a23);\n M.ex.y = det * (a13 * a23 - a12 * a33);\n M.ex.z = det * (a12 * a23 - a13 * a22);\n\n M.ey.x = M.ex.y;\n M.ey.y = det * (a11 * a33 - a13 * a13);\n M.ey.z = det * (a13 * a12 - a11 * a23);\n\n M.ez.x = M.ex.z;\n M.ez.y = M.ey.z;\n M.ez.z = det * (a11 * a22 - a12 * a12);\n }\n\n /**\n * Multiply a matrix times a vector.\n */\n static mul(a: Mat33, b: Vec2): Vec2;\n static mul(a: Mat33, b: Vec3): Vec3;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n _ASSERT && Mat33.assert(a);\n if (b && 'z' in b && 'y' in b && 'x' in b) {\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n\n } else if (b && 'y' in b && 'x' in b) {\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulVec3(a: Mat33, b: Vec3): Vec3 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n }\n\n static mulVec2(a: Mat33, b: Vec2): Vec2 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n static add(a: Mat33, b: Mat33): Mat33 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Mat33.assert(b);\n return new Mat33(\n Vec3.add(a.ex, b.ex),\n Vec3.add(a.ey, b.ey),\n Vec3.add(a.ez, b.ez)\n );\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat22 } from '../../common/Mat22';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointOpt extends JointOpt {\n /**\n * The lower angle for the joint limit (radians).\n */\n lowerAngle?: number;\n /**\n * The upper angle for the joint limit (radians).\n */\n upperAngle?: number;\n /**\n * The maximum motor torque used to achieve the desired motor speed. Usually\n * in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed. Usually in radians per second.\n */\n motorSpeed?: number;\n /**\n * A flag to enable joint limits.\n */\n enableLimit?: boolean;\n /**\n * A flag to enable the joint motor.\n */\n enableMotor?: boolean;\n}\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointDef extends JointDef, RevoluteJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n lowerAngle : 0.0,\n upperAngle : 0.0,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n enableLimit : false,\n enableMotor : false\n};\n\n/**\n * A revolute joint constrains two bodies to share a common point while they are\n * free to rotate about the point. The relative rotation about the shared point\n * is the joint angle. You can limit the relative rotation with a joint limit\n * that specifies a lower and upper angle. You can use a motor to drive the\n * relative rotation about the shared point. A maximum motor torque is provided\n * so that infinite forces are not generated.\n */\nexport class RevoluteJoint extends Joint {\n static TYPE = 'revolute-joint' as const;\n\n /** @internal */ m_type: 'revolute-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerAngle: number;\n /** @internal */ m_upperAngle: number;\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n // effective mass for point-to-point constraint.\n /** @internal */ m_mass: Mat33 = new Mat33();\n // effective mass for motor/limit angular constraint.\n /** @internal */ m_motorMass: number;\n /** @internal */ m_limitState: number = inactiveLimit; // TODO enum\n\n constructor(def: RevoluteJointDef);\n constructor(def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n // @ts-ignore\n constructor(def: RevoluteJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof RevoluteJoint)) {\n return new RevoluteJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RevoluteJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorImpulse = 0.0;\n\n this.m_lowerAngle = def.lowerAngle;\n this.m_upperAngle = def.upperAngle;\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Motor constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerAngle: this.m_lowerAngle,\n upperAngle: this.m_upperAngle,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any):RevoluteJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RevoluteJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle in radians.\n */\n getJointAngle(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle speed in radians per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_angularVelocity - bA.m_angularVelocity;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Get the current motor torque given the inverse time step. Unit is N*m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set the motor speed in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set the maximum motor torque, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit in radians.\n */\n getLowerLimit(): number {\n return this.m_lowerAngle;\n }\n\n /**\n * Get the upper joint limit in radians.\n */\n getUpperLimit(): number {\n return this.m_upperAngle;\n }\n\n /**\n * Set the joint limits in radians.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && console.assert(lower <= upper);\n\n if (lower != this.m_lowerAngle || upper != this.m_upperAngle) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_impulse.z = 0.0;\n this.m_lowerAngle = lower;\n this.m_upperAngle = upper;\n }\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force given the inverse time step. Unit is N.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque due to the joint limit given the inverse time step.\n * Unit is N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n this.m_mass.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y\n * this.m_rB.y * iB;\n this.m_mass.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y\n * this.m_rB.x * iB;\n this.m_mass.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n this.m_mass.ex.y = this.m_mass.ey.x;\n this.m_mass.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x\n * this.m_rB.x * iB;\n this.m_mass.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n this.m_mass.ex.z = this.m_mass.ez.x;\n this.m_mass.ey.z = this.m_mass.ez.y;\n this.m_mass.ez.z = iA + iB;\n\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n\n if (this.m_enableMotor == false || fixedRotation) {\n this.m_motorImpulse = 0.0;\n }\n\n if (this.m_enableLimit && fixedRotation == false) {\n const jointAngle = aB - aA - this.m_referenceAngle; // float\n\n if (Math.abs(this.m_upperAngle - this.m_lowerAngle) < 2.0 * Settings.angularSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointAngle <= this.m_lowerAngle) {\n if (this.m_limitState != atLowerLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atLowerLimit;\n\n } else if (jointAngle >= this.m_upperAngle) {\n if (this.m_limitState != atUpperLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atUpperLimit;\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_motorImpulse + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_motorImpulse + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n // Solve motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits\n && fixedRotation == false) {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const impulse = Vec3.neg(this.m_mass.solve33(Cdot)); // Vec3\n\n if (this.m_limitState == equalLimits) {\n this.m_impulse.add(impulse);\n\n } else if (this.m_limitState == atLowerLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse < 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n\n } else if (this.m_limitState == atUpperLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse > 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n\n } else {\n // Solve point-to-point constraint\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const impulse = this.m_mass.solve22(Vec2.neg(Cdot)); // Vec2\n\n this.m_impulse.x += impulse.x;\n this.m_impulse.y += impulse.y;\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n let angularError = 0.0; // float\n let positionError = 0.0; // float\n\n const fixedRotation = (this.m_invIA + this.m_invIB == 0.0); // bool\n\n // Solve angular limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const angle = aB - aA - this.m_referenceAngle; // float\n let limitImpulse = 0.0; // float\n\n if (this.m_limitState == equalLimits) {\n // Prevent large angular corrections\n const C = Math.clamp(angle - this.m_lowerAngle,\n -Settings.maxAngularCorrection, Settings.maxAngularCorrection); // float\n limitImpulse = -this.m_motorMass * C;\n angularError = Math.abs(C);\n\n } else if (this.m_limitState == atLowerLimit) {\n let C = angle - this.m_lowerAngle; // float\n angularError = -C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C + Settings.angularSlop, -Settings.maxAngularCorrection,\n 0.0);\n limitImpulse = -this.m_motorMass * C;\n\n } else if (this.m_limitState == atUpperLimit) {\n let C = angle - this.m_upperAngle; // float\n angularError = C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C - Settings.angularSlop, 0.0,\n Settings.maxAngularCorrection);\n limitImpulse = -this.m_motorMass * C;\n }\n\n aA -= this.m_invIA * limitImpulse;\n aB += this.m_invIB * limitImpulse;\n }\n\n // Solve point-to-point constraint.\n {\n qA.setAngle(aA);\n qB.setAngle(aB);\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n\n const C = Vec2.zero();\n C.addCombine(1, cB, 1, rB);\n C.subCombine(1, cA, 1, rA);\n positionError = C.length();\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y;\n K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x;\n\n const impulse = Vec2.neg(K.solve(C)); // Vec2\n\n cA.subMul(mA, impulse);\n aA -= iA * Vec2.crossVec2Vec2(rA, impulse);\n\n cB.addMul(mB, impulse);\n aB += iB * Vec2.crossVec2Vec2(rB, impulse);\n }\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat22 } from '../../common/Mat22';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointOpt extends JointOpt {\n /**\n * Enable/disable the joint limit.\n */\n enableLimit?: boolean;\n /**\n * The lower translation limit, usually in meters.\n */\n lowerTranslation?: number;\n /**\n * The upper translation limit, usually in meters.\n */\n upperTranslation?: number;\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorForce?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n}\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointDef extends JointDef, PrismaticJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation unit axis in bodyA.\n */\n localAxisA: Vec2;\n /**\n * referenceAngle The constrained angle between the bodies:\n * bodyB_angle - bodyA_angle.\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n enableLimit : false,\n lowerTranslation : 0.0,\n upperTranslation : 0.0,\n enableMotor : false,\n maxMotorForce : 0.0,\n motorSpeed : 0.0\n};\n\n/**\n * A prismatic joint. This joint provides one degree of freedom: translation\n * along an axis fixed in bodyA. Relative rotation is prevented. You can use a\n * joint limit to restrict the range of motion and a joint motor to drive the\n * motion or to model joint friction.\n */\nexport class PrismaticJoint extends Joint {\n static TYPE = 'prismatic-joint' as const;\n\n /** @internal */ m_type: 'prismatic-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerTranslation: number;\n /** @internal */ m_upperTranslation: number;\n /** @internal */ m_maxMotorForce: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n /** @internal */ m_limitState: number; // TODO enum\n /** @internal */ m_axis: Vec2;\n /** @internal */ m_perp: Vec2;\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_s1: number;\n /** @internal */ m_s2: number;\n /** @internal */ m_a1: number;\n /** @internal */ m_a2: number;\n /** @internal */ m_K: Mat33;\n\n constructor(def: PrismaticJointDef);\n constructor(def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n constructor(def: PrismaticJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PrismaticJoint)) {\n return new PrismaticJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PrismaticJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || Vec2.neo(1.0, 0.0));\n this.m_localXAxisA.normalize();\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n\n this.m_lowerTranslation = def.lowerTranslation;\n this.m_upperTranslation = def.upperTranslation;\n this.m_maxMotorForce = def.maxMotorForce;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n this.m_limitState = inactiveLimit;\n\n this.m_axis = Vec2.zero();\n this.m_perp = Vec2.zero();\n\n this.m_K = new Mat33();\n\n // Linear constraint (point-to-line)\n // d = p2 - p1 = x2 + r2 - x1 - r1\n // C = dot(perp, d)\n // Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 -\n // cross(w1, r1))\n // = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) +\n // dot(cross(r2, perp), v2)\n // J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)]\n //\n // Angular constraint\n // C = a2 - a1 + a_initial\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n //\n // K = J * invM * JT\n //\n // J = [-a -s1 a s2]\n // [0 -1 0 1]\n // a = perp\n // s1 = cross(d + r1, a) = cross(p2 - x1, a)\n // s2 = cross(r2, a) = cross(p2 - x2, a)\n\n // Motor/Limit linear constraint\n // C = dot(ax1, d)\n // Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) +\n // dot(cross(r2, ax1), v2)\n // J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)]\n\n // Block Solver\n // We develop a block solver that includes the joint limit. This makes the\n // limit stiff (inelastic) even\n // when the mass has poor distribution (leading to large torques about the\n // joint anchor points).\n //\n // The Jacobian has 3 rows:\n // J = [-uT -s1 uT s2] // linear\n // [0 -1 0 1] // angular\n // [-vT -a1 vT a2] // limit\n //\n // u = perp\n // v = axis\n // s1 = cross(d + r1, u), s2 = cross(r2, u)\n // a1 = cross(d + r1, v), a2 = cross(r2, v)\n\n // M * (v2 - v1) = JT * df\n // J * v2 = bias\n //\n // v2 = v1 + invM * JT * df\n // J * (v1 + invM * JT * df) = bias\n // K * df = bias - J * v1 = -Cdot\n // K = J * invM * JT\n // Cdot = J * v1 - bias\n //\n // Now solve for f2.\n // df = f2 - f1\n // K * (f2 - f1) = -Cdot\n // f2 = invK * (-Cdot) + f1\n //\n // Clamp accumulated limit impulse.\n // lower: f2(3) = max(f2(3), 0)\n // upper: f2(3) = min(f2(3), 0)\n //\n // Solve for correct f2(1:2)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1\n // = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) +\n // K(1:2,1:2) * f1(1:2)\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n //\n // Now compute impulse to be applied:\n // df = f2 - f1\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerTranslation: this.m_lowerTranslation,\n upperTranslation: this.m_upperTranslation,\n maxMotorForce: this.m_maxMotorForce,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PrismaticJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.localAxisA = Vec2.clone(data.localAxisA);\n const joint = new PrismaticJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const pA = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const pB = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const d = Vec2.sub(pB, pA);\n const axis = this.m_bodyA.getWorldVector(this.m_localXAxisA);\n\n const translation = Vec2.dot(d, axis);\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const rA = Rot.mulVec2(bA.m_xf.q, Vec2.sub(this.m_localAnchorA, bA.m_sweep.localCenter)); // Vec2\n const rB = Rot.mulVec2(bB.m_xf.q, Vec2.sub(this.m_localAnchorB, bB.m_sweep.localCenter)); // Vec2\n const p1 = Vec2.add(bA.m_sweep.c, rA); // Vec2\n const p2 = Vec2.add(bB.m_sweep.c, rB); // Vec2\n const d = Vec2.sub(p2, p1); // Vec2\n const axis = Rot.mulVec2(bA.m_xf.q, this.m_localXAxisA); // Vec2\n\n const vA = bA.m_linearVelocity; // Vec2\n const vB = bB.m_linearVelocity; // Vec2\n const wA = bA.m_angularVelocity; // float\n const wB = bB.m_angularVelocity; // float\n\n const speed = Vec2.dot(d, Vec2.crossNumVec2(wA, axis))\n + Vec2.dot(axis, Vec2.sub(Vec2.addCrossNumVec2(vB, wB, rB), Vec2.addCrossNumVec2(vA, wA, rA))); // float\n return speed;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit, usually in meters.\n */\n getLowerLimit(): number {\n return this.m_lowerTranslation;\n }\n\n /**\n * Get the upper joint limit, usually in meters.\n */\n getUpperLimit(): number {\n return this.m_upperTranslation;\n }\n\n /**\n * Set the joint limits, usually in meters.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && console.assert(lower <= upper);\n if (lower != this.m_lowerTranslation || upper != this.m_upperTranslation) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_lowerTranslation = lower;\n this.m_upperTranslation = upper;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in meters per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Set the maximum motor force, usually in N.\n */\n setMaxMotorForce(force: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorForce = force;\n }\n\n getMaxMotorForce(): number {\n return this.m_maxMotorForce;\n }\n\n /**\n * Get the motor speed, usually in meters per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Get the current motor force given the inverse time step, usually in N.\n */\n getMotorForce(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + this.m_impulse.z, this.m_axis).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.y;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute motor Jacobian and effective mass.\n {\n this.m_axis = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_axis);\n this.m_a2 = Vec2.crossVec2Vec2(rB, this.m_axis);\n\n this.m_motorMass = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2\n * this.m_a2;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n }\n\n // Prismatic constraint.\n {\n this.m_perp = Rot.mulVec2(qA, this.m_localYAxisA);\n\n this.m_s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_perp);\n this.m_s2 = Vec2.crossVec2Vec2(rB, this.m_perp);\n\n const s1test = Vec2.crossVec2Vec2(rA, this.m_perp);\n\n const k11 = mA + mB + iA * this.m_s1 * this.m_s1 + iB * this.m_s2 * this.m_s2;\n const k12 = iA * this.m_s1 + iB * this.m_s2;\n const k13 = iA * this.m_s1 * this.m_a1 + iB * this.m_s2 * this.m_a2;\n let k22 = iA + iB;\n if (k22 == 0.0) {\n // For bodies with fixed rotation.\n k22 = 1.0;\n }\n const k23 = iA * this.m_a1 + iB * this.m_a2;\n const k33 = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 * this.m_a2;\n\n this.m_K.ex.set(k11, k12, k13);\n this.m_K.ey.set(k12, k22, k23);\n this.m_K.ez.set(k13, k23, k33);\n }\n\n // Compute motor and limit terms.\n if (this.m_enableLimit) {\n\n const jointTranslation = Vec2.dot(this.m_axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * Settings.linearSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointTranslation <= this.m_lowerTranslation) {\n if (this.m_limitState != atLowerLimit) {\n this.m_limitState = atLowerLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else if (jointTranslation >= this.m_upperTranslation) {\n if (this.m_limitState != atUpperLimit) {\n this.m_limitState = atUpperLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n if (this.m_enableMotor == false) {\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse\n + this.m_impulse.z, this.m_axis);\n const LA = this.m_impulse.x * this.m_s1 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1;\n const LB = this.m_impulse.x * this.m_s2 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Solve linear motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits) {\n const Cdot = Vec2.dot(this.m_axis, Vec2.sub(vB, vA)) + this.m_a2 * wB\n - this.m_a1 * wA;\n let impulse = this.m_motorMass * (this.m_motorSpeed - Cdot);\n const oldImpulse = this.m_motorImpulse;\n const maxImpulse = step.dt * this.m_maxMotorForce;\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_axis);\n const LA = impulse * this.m_a1;\n const LB = impulse * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n const Cdot1 = Vec2.zero();\n Cdot1.x += Vec2.dot(this.m_perp, vB) + this.m_s2 * wB;\n Cdot1.x -= Vec2.dot(this.m_perp, vA) + this.m_s1 * wA;\n Cdot1.y = wB - wA;\n\n if (this.m_enableLimit && this.m_limitState != inactiveLimit) {\n // Solve prismatic and limit constraint in block form.\n let Cdot2 = 0;\n Cdot2 += Vec2.dot(this.m_axis, vB) + this.m_a2 * wB;\n Cdot2 -= Vec2.dot(this.m_axis, vA) + this.m_a1 * wA;\n\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const f1 = Vec3.clone(this.m_impulse);\n let df = this.m_K.solve33(Vec3.neg(Cdot)); // Vec3\n this.m_impulse.add(df);\n\n if (this.m_limitState == atLowerLimit) {\n this.m_impulse.z = Math.max(this.m_impulse.z, 0.0);\n } else if (this.m_limitState == atUpperLimit) {\n this.m_impulse.z = Math.min(this.m_impulse.z, 0.0);\n }\n\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n const b = Vec2.combine(-1, Cdot1, -(this.m_impulse.z - f1.z), Vec2.neo(this.m_K.ez.x, this.m_K.ez.y)); // Vec2\n const f2r = Vec2.add(this.m_K.solve22(b), Vec2.neo(f1.x, f1.y)); // Vec2\n this.m_impulse.x = f2r.x;\n this.m_impulse.y = f2r.y;\n\n df = Vec3.sub(this.m_impulse, f1);\n\n const P = Vec2.combine(df.x, this.m_perp, df.z, this.m_axis); // Vec2\n const LA = df.x * this.m_s1 + df.y + df.z * this.m_a1; // float\n const LB = df.x * this.m_s2 + df.y + df.z * this.m_a2; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n // Limit is inactive, just solve the prismatic constraint in block form.\n const df = this.m_K.solve22(Vec2.neg(Cdot1)); // Vec2\n this.m_impulse.x += df.x;\n this.m_impulse.y += df.y;\n\n const P = Vec2.mulNumVec2(df.x, this.m_perp); // Vec2\n const LA = df.x * this.m_s1 + df.y; // float\n const LB = df.x * this.m_s2 + df.y; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute fresh Jacobians\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n const d = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); // Vec2\n\n const axis = Rot.mulVec2(qA, this.m_localXAxisA); // Vec2\n const a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), axis); // float\n const a2 = Vec2.crossVec2Vec2(rB, axis); // float\n const perp = Rot.mulVec2(qA, this.m_localYAxisA); // Vec2\n\n const s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), perp); // float\n const s2 = Vec2.crossVec2Vec2(rB, perp); // float\n\n let impulse = new Vec3();\n const C1 = Vec2.zero(); // Vec2\n C1.x = Vec2.dot(perp, d);\n C1.y = aB - aA - this.m_referenceAngle;\n\n let linearError = Math.abs(C1.x); // float\n const angularError = Math.abs(C1.y); // float\n\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n let active = false; // bool\n let C2 = 0.0; // float\n if (this.m_enableLimit) {\n\n const translation = Vec2.dot(axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * linearSlop) {\n // Prevent large angular corrections\n C2 = Math.clamp(translation, -maxLinearCorrection, maxLinearCorrection);\n linearError = Math.max(linearError, Math.abs(translation));\n active = true;\n\n } else if (translation <= this.m_lowerTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_lowerTranslation + linearSlop,\n -maxLinearCorrection, 0.0);\n linearError = Math\n .max(linearError, this.m_lowerTranslation - translation);\n active = true;\n\n } else if (translation >= this.m_upperTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_upperTranslation - linearSlop, 0.0,\n maxLinearCorrection);\n linearError = Math\n .max(linearError, translation - this.m_upperTranslation);\n active = true;\n }\n }\n\n if (active) {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n const k13 = iA * s1 * a1 + iB * s2 * a2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n // For fixed rotation\n k22 = 1.0;\n }\n const k23 = iA * a1 + iB * a2; // float\n const k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; // float\n\n const K = new Mat33();\n K.ex.set(k11, k12, k13);\n K.ey.set(k12, k22, k23);\n K.ez.set(k13, k23, k33);\n\n const C = new Vec3();\n C.x = C1.x;\n C.y = C1.y;\n C.z = C2;\n\n impulse = K.solve33(Vec3.neg(C));\n } else {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n k22 = 1.0;\n }\n\n const K = new Mat22();\n K.ex.setNum(k11, k12);\n K.ey.setNum(k12, k22);\n\n const impulse1 = K.solve(Vec2.neg(C1)); // Vec2\n impulse.x = impulse1.x;\n impulse.y = impulse1.y;\n impulse.z = 0.0;\n }\n\n const P = Vec2.combine(impulse.x, perp, impulse.z, axis); // Vec2\n const LA = impulse.x * s1 + impulse.y + impulse.z * a1; // float\n const LB = impulse.x * s2 + impulse.y + impulse.z * a2; // float\n\n cA.subMul(mA, P);\n aA -= iA * LA;\n cB.addMul(mB, P);\n aB += iB * LB;\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { RevoluteJoint } from './RevoluteJoint';\nimport { PrismaticJoint } from './PrismaticJoint';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Gear joint definition.\n */\nexport interface GearJointOpt extends JointOpt {\n /**\n * The gear ratio. See {@link GearJoint} for explanation.\n */\n ratio?: number;\n}\n/**\n * Gear joint definition.\n */\nexport interface GearJointDef extends JointDef, GearJointOpt {\n /**\n * The first revolute/prismatic joint attached to the gear joint.\n */\n joint1: RevoluteJoint | PrismaticJoint;\n /**\n * The second prismatic/revolute joint attached to the gear joint.\n */\n joint2: RevoluteJoint | PrismaticJoint;\n}\n\nconst DEFAULTS = {\n ratio : 1.0\n};\n\n/**\n * A gear joint is used to connect two joints together. Either joint can be a\n * revolute or prismatic joint. You specify a gear ratio to bind the motions\n * together: coordinate1 + ratio * coordinate2 = constant\n *\n * The ratio can be negative or positive. If one joint is a revolute joint and\n * the other joint is a prismatic joint, then the ratio will have units of\n * length or units of 1/length. Warning: You have to manually destroy the gear\n * joint if joint1 or joint2 is destroyed.\n *\n * This definition requires two existing revolute or prismatic joints (any\n * combination will work).\n */\nexport class GearJoint extends Joint {\n static TYPE = 'gear-joint' as const;\n\n /** @internal */ m_type: 'gear-joint';\n /** @internal */ m_joint1: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_joint2: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_type1: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_type2: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_bodyC: Body;\n /** @internal */ m_localAnchorC: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_referenceAngleA: number;\n /** @internal */ m_localAxisC: Vec2;\n /** @internal */ m_bodyD: Body;\n /** @internal */ m_localAnchorD: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngleB: number;\n /** @internal */ m_localAxisD: Vec2;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_lcA: Vec2;\n /** @internal */ m_lcB: Vec2;\n /** @internal */ m_lcC: Vec2;\n /** @internal */ m_lcD: Vec2;\n /** @internal */ m_mA: number;\n /** @internal */ m_mB: number;\n /** @internal */ m_mC: number;\n /** @internal */ m_mD: number;\n /** @internal */ m_iA: number;\n /** @internal */ m_iB: number;\n /** @internal */ m_iC: number;\n /** @internal */ m_iD: number;\n /** @internal */ m_JvAC: Vec2;\n /** @internal */ m_JvBD: Vec2;\n /** @internal */ m_JwA: number;\n /** @internal */ m_JwB: number;\n /** @internal */ m_JwC: number;\n /** @internal */ m_JwD: number;\n /** @internal */ m_mass: number;\n\n constructor(def: GearJointDef);\n constructor(def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number);\n constructor(def: GearJointDef, bodyA?: Body, bodyB?: Body, joint1?: RevoluteJoint | PrismaticJoint, joint2?: RevoluteJoint | PrismaticJoint, ratio?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof GearJoint)) {\n return new GearJoint(def, bodyA, bodyB, joint1, joint2, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = GearJoint.TYPE;\n\n _ASSERT && console.assert(joint1.m_type === RevoluteJoint.TYPE\n || joint1.m_type === PrismaticJoint.TYPE);\n _ASSERT && console.assert(joint2.m_type === RevoluteJoint.TYPE\n || joint2.m_type === PrismaticJoint.TYPE);\n\n this.m_joint1 = joint1 ? joint1 : def.joint1;\n this.m_joint2 = joint2 ? joint2 : def.joint2;\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n this.m_type1 = this.m_joint1.getType() as 'revolute-joint' | 'prismatic-joint';\n this.m_type2 = this.m_joint2.getType() as 'revolute-joint' | 'prismatic-joint';\n\n // joint1 connects body A to body C\n // joint2 connects body B to body D\n\n let coordinateA: number;\n let coordinateB: number;\n\n // TODO_ERIN there might be some problem with the joint edges in Joint.\n\n this.m_bodyC = this.m_joint1.getBodyA();\n this.m_bodyA = this.m_joint1.getBodyB();\n\n // Get geometry of joint1\n const xfA = this.m_bodyA.m_xf;\n const aA = this.m_bodyA.m_sweep.a;\n const xfC = this.m_bodyC.m_xf;\n const aC = this.m_bodyC.m_sweep.a;\n\n if (this.m_type1 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint1 as RevoluteJoint;\n this.m_localAnchorC = revolute.m_localAnchorA;\n this.m_localAnchorA = revolute.m_localAnchorB;\n this.m_referenceAngleA = revolute.m_referenceAngle;\n this.m_localAxisC = Vec2.zero();\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const prismatic = this.m_joint1 as PrismaticJoint;\n this.m_localAnchorC = prismatic.m_localAnchorA;\n this.m_localAnchorA = prismatic.m_localAnchorB;\n this.m_referenceAngleA = prismatic.m_referenceAngle;\n this.m_localAxisC = prismatic.m_localXAxisA;\n\n const pC = this.m_localAnchorC;\n const pA = Rot.mulTVec2(xfC.q, Vec2.add(Rot.mulVec2(xfA.q, this.m_localAnchorA), Vec2.sub(xfA.p, xfC.p)));\n coordinateA = Vec2.dot(pA, this.m_localAxisC) - Vec2.dot(pC, this.m_localAxisC);\n }\n\n this.m_bodyD = this.m_joint2.getBodyA();\n this.m_bodyB = this.m_joint2.getBodyB();\n\n // Get geometry of joint2\n const xfB = this.m_bodyB.m_xf;\n const aB = this.m_bodyB.m_sweep.a;\n const xfD = this.m_bodyD.m_xf;\n const aD = this.m_bodyD.m_sweep.a;\n\n if (this.m_type2 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint2 as RevoluteJoint;\n this.m_localAnchorD = revolute.m_localAnchorA;\n this.m_localAnchorB = revolute.m_localAnchorB;\n this.m_referenceAngleB = revolute.m_referenceAngle;\n this.m_localAxisD = Vec2.zero();\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const prismatic = this.m_joint2 as PrismaticJoint;\n this.m_localAnchorD = prismatic.m_localAnchorA;\n this.m_localAnchorB = prismatic.m_localAnchorB;\n this.m_referenceAngleB = prismatic.m_referenceAngle;\n this.m_localAxisD = prismatic.m_localXAxisA;\n\n const pD = this.m_localAnchorD;\n const pB = Rot.mulTVec2(xfD.q, Vec2.add(Rot.mulVec2(xfB.q, this.m_localAnchorB), Vec2.sub(xfB.p, xfD.p)));\n coordinateB = Vec2.dot(pB, this.m_localAxisD) - Vec2.dot(pD, this.m_localAxisD);\n }\n\n this.m_constant = coordinateA + this.m_ratio * coordinateB;\n\n this.m_impulse = 0.0;\n\n // Gear Joint:\n // C0 = (coordinate1 + ratio * coordinate2)_initial\n // C = (coordinate1 + ratio * coordinate2) - C0 = 0\n // J = [J1 ratio * J2]\n // K = J * invM * JT\n // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T\n //\n // Revolute:\n // coordinate = rotation\n // Cdot = angularVelocity\n // J = [0 0 1]\n // K = J * invM * JT = invI\n //\n // Prismatic:\n // coordinate = dot(p - pg, ug)\n // Cdot = dot(v + cross(w, r), ug)\n // J = [ug cross(r, ug)]\n // K = J * invM * JT = invMass + invI * cross(r, ug)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n joint1: this.m_joint1,\n joint2: this.m_joint2,\n ratio: this.m_ratio,\n\n // _constant: this.m_constant,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): GearJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.joint1 = restore(Joint, data.joint1, world);\n data.joint2 = restore(Joint, data.joint2, world);\n const joint = new GearJoint(data);\n // if (data._constant) joint.m_constant = data._constant;\n return joint;\n }\n\n /**\n * Get the first joint.\n */\n getJoint1(): Joint {\n return this.m_joint1;\n }\n\n /**\n * Get the second joint.\n */\n getJoint2(): Joint {\n return this.m_joint2;\n }\n\n /**\n * Set the gear ratio.\n */\n setRatio(ratio: number): void {\n _ASSERT && console.assert(Math.isFinite(ratio));\n this.m_ratio = ratio;\n }\n\n /**\n * Get the gear ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_JvAC).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n const L = this.m_impulse * this.m_JwA; // float\n return inv_dt * L;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_lcA = this.m_bodyA.m_sweep.localCenter;\n this.m_lcB = this.m_bodyB.m_sweep.localCenter;\n this.m_lcC = this.m_bodyC.m_sweep.localCenter;\n this.m_lcD = this.m_bodyD.m_sweep.localCenter;\n this.m_mA = this.m_bodyA.m_invMass;\n this.m_mB = this.m_bodyB.m_invMass;\n this.m_mC = this.m_bodyC.m_invMass;\n this.m_mD = this.m_bodyD.m_invMass;\n this.m_iA = this.m_bodyA.m_invI;\n this.m_iB = this.m_bodyB.m_invI;\n this.m_iC = this.m_bodyC.m_invI;\n this.m_iD = this.m_bodyD.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const aC = this.m_bodyC.c_position.a;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n\n const aD = this.m_bodyD.c_position.a;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n this.m_mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n this.m_JvAC = Vec2.zero();\n this.m_JwA = 1.0;\n this.m_JwC = 1.0;\n this.m_mass += this.m_iA + this.m_iC;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n this.m_JvAC = u;\n this.m_JwC = Vec2.crossVec2Vec2(rC, u);\n this.m_JwA = Vec2.crossVec2Vec2(rA, u);\n this.m_mass += this.m_mC + this.m_mA + this.m_iC * this.m_JwC * this.m_JwC + this.m_iA * this.m_JwA * this.m_JwA;\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n this.m_JvBD = Vec2.zero();\n this.m_JwB = this.m_ratio;\n this.m_JwD = this.m_ratio;\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD); // Vec2\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); // Vec2\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); // Vec2\n this.m_JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n this.m_JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n this.m_JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD * this.m_JwD * this.m_JwD + this.m_iB * this.m_JwB * this.m_JwB;\n }\n\n // Compute effective mass.\n this.m_mass = this.m_mass > 0.0 ? 1.0 / this.m_mass : 0.0;\n\n if (step.warmStarting) {\n vA.addMul(this.m_mA * this.m_impulse, this.m_JvAC);\n wA += this.m_iA * this.m_impulse * this.m_JwA;\n\n vB.addMul(this.m_mB * this.m_impulse, this.m_JvBD);\n wB += this.m_iB * this.m_impulse * this.m_JwB;\n\n vC.subMul(this.m_mC * this.m_impulse, this.m_JvAC);\n wC -= this.m_iC * this.m_impulse * this.m_JwC;\n\n vD.subMul(this.m_mD * this.m_impulse, this.m_JvBD);\n wD -= this.m_iD * this.m_impulse * this.m_JwD;\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n let Cdot = Vec2.dot(this.m_JvAC, vA) - Vec2.dot(this.m_JvAC, vC)\n + Vec2.dot(this.m_JvBD, vB) - Vec2.dot(this.m_JvBD, vD); // float\n Cdot += (this.m_JwA * wA - this.m_JwC * wC)\n + (this.m_JwB * wB - this.m_JwD * wD);\n\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n vA.addMul(this.m_mA * impulse, this.m_JvAC);\n wA += this.m_iA * impulse * this.m_JwA;\n vB.addMul(this.m_mB * impulse, this.m_JvBD);\n wB += this.m_iB * impulse * this.m_JwB;\n vC.subMul(this.m_mC * impulse, this.m_JvAC);\n wC -= this.m_iC * impulse * this.m_JwC;\n vD.subMul(this.m_mD * impulse, this.m_JvBD);\n wD -= this.m_iD * impulse * this.m_JwD;\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n const cC = this.m_bodyC.c_position.c;\n let aC = this.m_bodyC.c_position.a;\n const cD = this.m_bodyD.c_position.c;\n let aD = this.m_bodyD.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n const linearError = 0.0;\n\n let coordinateA: number;\n let coordinateB: number;\n\n let JvAC: Vec2;\n let JvBD: Vec2;\n let JwA: number;\n let JwB: number;\n let JwC: number;\n let JwD: number;\n let mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n JvAC = Vec2.zero();\n JwA = 1.0;\n JwC = 1.0;\n mass += this.m_iA + this.m_iC;\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n JvAC = u;\n JwC = Vec2.crossVec2Vec2(rC, u);\n JwA = Vec2.crossVec2Vec2(rA, u);\n mass += this.m_mC + this.m_mA + this.m_iC * JwC * JwC + this.m_iA * JwA * JwA;\n\n const pC = Vec2.sub(this.m_localAnchorC, this.m_lcC); // Vec2\n const pA = Rot.mulTVec2(qC, Vec2.add(rA, Vec2.sub(cA, cC))); // Vec2\n coordinateA = Vec2.dot(Vec2.sub(pA, pC), this.m_localAxisC);\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n JvBD = Vec2.zero();\n JwB = this.m_ratio;\n JwD = this.m_ratio;\n mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD);\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB);\n JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD\n * JwD * JwD + this.m_iB * JwB * JwB;\n\n const pD = Vec2.sub(this.m_localAnchorD, this.m_lcD); // Vec2\n const pB = Rot.mulTVec2(qD, Vec2.add(rB, Vec2.sub(cB, cD))); // Vec2\n coordinateB = Vec2.dot(pB, this.m_localAxisD)\n - Vec2.dot(pD, this.m_localAxisD);\n }\n\n const C = (coordinateA + this.m_ratio * coordinateB) - this.m_constant; // float\n\n let impulse = 0.0; // float\n if (mass > 0.0) {\n impulse = -C / mass;\n }\n\n cA.addMul(this.m_mA * impulse, JvAC);\n aA += this.m_iA * impulse * JwA;\n cB.addMul(this.m_mB * impulse, JvBD);\n aB += this.m_iB * impulse * JwB;\n cC.subMul(this.m_mC * impulse, JvAC);\n aC -= this.m_iC * impulse * JwC;\n cD.subMul(this.m_mD * impulse, JvBD);\n aD -= this.m_iD * impulse * JwD;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n this.m_bodyC.c_position.c.setVec2(cC);\n this.m_bodyC.c_position.a = aC;\n this.m_bodyD.c_position.c.setVec2(cD);\n this.m_bodyD.c_position.a = aD;\n\n // TODO_ERIN not implemented\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Motor joint definition.\n */\nexport interface MotorJointOpt extends JointOpt {\n /**\n * The bodyB angle minus bodyA angle in radians.\n */\n angularOffset?: number;\n /**\n * The maximum motor force in N.\n */\n maxForce?: number;\n /**\n * The maximum motor torque in N-m.\n */\n maxTorque?: number;\n /**\n * Position correction factor in the range [0,1].\n */\n correctionFactor?: number;\n /**\n * Position of bodyB minus the position of bodyA, in bodyA's frame, in meters.\n */\n linearOffset?: Vec2;\n}\n/**\n * Motor joint definition.\n */\nexport interface MotorJointDef extends JointDef, MotorJointOpt {\n}\n\nconst DEFAULTS = {\n maxForce : 1.0,\n maxTorque : 1.0,\n correctionFactor : 0.3\n};\n\n/**\n * A motor joint is used to control the relative motion between two bodies. A\n * typical usage is to control the movement of a dynamic body with respect to\n * the ground.\n */\nexport class MotorJoint extends Joint {\n static TYPE = 'motor-joint' as const;\n\n /** @internal */ m_type: 'motor-joint';\n /** @internal */ m_linearOffset: Vec2;\n /** @internal */ m_angularOffset: number;\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n /** @internal */ m_correctionFactor: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_linearError: Vec2;\n /** @internal */ m_angularError: number;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: MotorJointDef);\n constructor(def: MotorJointOpt, bodyA: Body, bodyB: Body);\n constructor(def: MotorJointDef | MotorJointOpt, bodyA?: Body, bodyB?: Body) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof MotorJoint)) {\n return new MotorJoint(def, bodyA, bodyB);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MotorJoint.TYPE;\n\n this.m_linearOffset = Math.isFinite(def.linearOffset) ? def.linearOffset : bodyA.getLocalPoint(bodyB.getPosition());\n this.m_angularOffset = Math.isFinite(def.angularOffset) ? def.angularOffset : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n this.m_correctionFactor = def.correctionFactor;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n correctionFactor: this.m_correctionFactor,\n\n linearOffset: this.m_linearOffset,\n angularOffset: this.m_angularOffset,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MotorJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new MotorJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {}): void {\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && console.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && console.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Set the position correction factor in the range [0,1].\n */\n setCorrectionFactor(factor: number): void {\n _ASSERT && console.assert(Math.isFinite(factor) && 0.0 <= factor && factor <= 1.0);\n this.m_correctionFactor = factor;\n }\n\n /**\n * Get the position correction factor in the range [0,1].\n */\n getCorrectionFactor(): number {\n return this.m_correctionFactor;\n }\n\n /**\n * Set/get the target linear offset, in frame A, in meters.\n */\n setLinearOffset(linearOffset: Vec2): void {\n if (linearOffset.x != this.m_linearOffset.x\n || linearOffset.y != this.m_linearOffset.y) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_linearOffset = linearOffset;\n }\n }\n\n getLinearOffset(): Vec2 {\n return this.m_linearOffset;\n }\n\n /**\n * Set/get the target angular offset, in radians.\n */\n setAngularOffset(angularOffset: number): void {\n if (angularOffset != this.m_angularOffset) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_angularOffset = angularOffset;\n }\n }\n\n getAngularOffset(): number {\n return this.m_angularOffset;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getPosition();\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getPosition();\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.neg(this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.neg(this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n this.m_linearError = Vec2.zero();\n this.m_linearError.addCombine(1, cB, 1, this.m_rB);\n this.m_linearError.subCombine(1, cA, 1, this.m_rA);\n this.m_linearError.sub(Rot.mulVec2(qA, this.m_linearOffset));\n\n this.m_angularError = aB - aA - this.m_angularOffset;\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt;\n const inv_h = step.inv_dt;\n\n // Solve angular friction\n {\n const Cdot = wB - wA + inv_h * this.m_correctionFactor * this.m_angularError;\n let impulse = -this.m_angularMass * Cdot;\n\n const oldImpulse = this.m_angularImpulse;\n const maxImpulse = h * this.m_maxTorque;\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n Cdot.addMul(inv_h * this.m_correctionFactor, this.m_linearError);\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot));\n const oldImpulse = Vec2.clone(this.m_linearImpulse);\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce;\n\n this.m_linearImpulse.clamp(maxImpulse);\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Transform } from '../../common/Transform';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointOpt extends JointOpt {\n /**\n * [maxForce = 0.0] The maximum constraint force that can be exerted to move\n * the candidate body. Usually you will express as some multiple of the\n * weight (multiplier * mass * gravity).\n */\n maxForce?: number;\n /**\n * [frequencyHz = 5.0] The response speed.\n */\n frequencyHz?: number;\n /**\n * [dampingRatio = 0.7] The damping ratio. 0 = no damping, 1 = critical\n * damping.\n */\n dampingRatio?: number;\n}\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointDef extends JointDef, MouseJointOpt {\n /**\n * The initial world target point. This is assumed to coincide with the body\n * anchor initially.\n */\n target: Vec2Value;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n frequencyHz : 5.0,\n dampingRatio : 0.7\n};\n\n/**\n * A mouse joint is used to make a point on a body track a specified world\n * point. This a soft constraint with a maximum force. This allows the\n * constraint to stretch and without applying huge forces.\n *\n * NOTE: this joint is not documented in the manual because it was developed to\n * be used in the testbed. If you want to learn how to use the mouse joint, look\n * at the testbed.\n */\nexport class MouseJoint extends Joint {\n static TYPE = 'mouse-joint' as const;\n\n /** @internal */ m_type: 'mouse-joint';\n /** @internal */ m_targetA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_impulse: Vec2;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_beta: number;\n /** @internal */ m_gamma: number;\n // Solver temp\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat22;\n /** @internal */ m_C: Vec2;\n\n constructor(def: MouseJointDef);\n constructor(def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2);\n constructor(def: MouseJointDef, bodyA?: Body, bodyB?: Body, target?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof MouseJoint)) {\n return new MouseJoint(def, bodyA, bodyB, target);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MouseJoint.TYPE;\n\n _ASSERT && console.assert(Math.isFinite(def.maxForce) && def.maxForce >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.frequencyHz) && def.frequencyHz >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.dampingRatio) && def.dampingRatio >= 0.0);\n\n if (Vec2.isValid(target)) {\n this.m_targetA = Vec2.clone(target);\n } else if (Vec2.isValid(def.target)) {\n this.m_targetA = Vec2.clone(def.target);\n } else {\n this.m_targetA = Vec2.zero();\n }\n\n this.m_localAnchorB = Transform.mulTVec2(bodyB.getTransform(), this.m_targetA);\n\n this.m_maxForce = def.maxForce;\n this.m_impulse = Vec2.zero();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_beta = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rB = Vec2.zero();\n this.m_localCenterB = Vec2.zero();\n this.m_invMassB = 0.0;\n this.m_invIB = 0.0;\n this.m_mass = new Mat22();\n this.m_C = Vec2.zero();\n\n // p = attached point, m = mouse point\n // C = p - m\n // Cdot = v\n // = v + cross(w, r)\n // J = [I r_skew]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n target: this.m_targetA,\n maxForce: this.m_maxForce,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n _localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MouseJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.target = Vec2.clone(data.target);\n const joint = new MouseJoint(data);\n if (data._localAnchorB) {\n joint.m_localAnchorB = data._localAnchorB;\n }\n return joint;\n }\n\n /**\n * Use this to update the target point.\n */\n setTarget(target: Vec2Value): void {\n if (this.m_bodyB.isAwake() == false) {\n this.m_bodyB.setAwake(true);\n }\n this.m_targetA = Vec2.clone(target);\n }\n\n getTarget(): Vec2 {\n return this.m_targetA;\n }\n\n /**\n * Set the maximum force in Newtons.\n */\n setMaxForce(force: number): void {\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum force in Newtons.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the frequency in Hertz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get the frequency in Hertz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set the damping ratio (dimensionless).\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get the damping ratio (dimensionless).\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return Vec2.clone(this.m_targetA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_impulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * 0.0;\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2Value): void {\n this.m_targetA.sub(newOrigin);\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const position = this.m_bodyB.c_position;\n const velocity = this.m_bodyB.c_velocity;\n\n const cB = position.c;\n const aB = position.a;\n const vB = velocity.v;\n let wB = velocity.w;\n\n const qB = Rot.neo(aB);\n\n const mass = this.m_bodyB.getMass();\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = mass * (omega * omega);\n\n // magic formulas\n // gamma has units of inverse mass.\n // beta has units of inverse time.\n const h = step.dt;\n _ASSERT && console.assert(d + h * k > Math.EPSILON);\n this.m_gamma = h * (d + h * k);\n if (this.m_gamma != 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n this.m_beta = h * k * this.m_gamma;\n\n // Compute the effective mass matrix.\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) *\n // invI2 * skew(r2)]\n // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y\n // -r1.x*r1.y]\n // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x]\n const K = new Mat22();\n K.ex.x = this.m_invMassB + this.m_invIB * this.m_rB.y * this.m_rB.y\n + this.m_gamma;\n K.ex.y = -this.m_invIB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = this.m_invMassB + this.m_invIB * this.m_rB.x * this.m_rB.x\n + this.m_gamma;\n\n this.m_mass = K.getInverse();\n\n this.m_C.setVec2(cB);\n this.m_C.addCombine(1, this.m_rB, -1, this.m_targetA);\n this.m_C.mul(this.m_beta);\n\n // Cheat with some damping\n wB *= 0.98;\n\n if (step.warmStarting) {\n this.m_impulse.mul(step.dtRatio);\n vB.addMul(this.m_invMassB, this.m_impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, this.m_impulse);\n\n } else {\n this.m_impulse.setZero();\n }\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const velocity = this.m_bodyB.c_velocity;\n const vB = Vec2.clone(velocity.v);\n let wB = velocity.w;\n\n // Cdot = v + cross(w, r)\n\n const Cdot = Vec2.crossNumVec2(wB, this.m_rB);\n Cdot.add(vB);\n\n Cdot.addCombine(1, this.m_C, this.m_gamma, this.m_impulse);\n Cdot.neg();\n\n let impulse = Mat22.mulVec2(this.m_mass, Cdot);\n\n const oldImpulse = Vec2.clone(this.m_impulse);\n this.m_impulse.add(impulse);\n const maxImpulse = step.dt * this.m_maxForce;\n this.m_impulse.clamp(maxImpulse);\n impulse = Vec2.sub(this.m_impulse, oldImpulse);\n\n vB.addMul(this.m_invMassB, impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\n// tslint:disable-next-line:no-empty-interface\nexport interface PulleyJointOpt extends JointOpt {\n}\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\nexport interface PulleyJointDef extends JointDef, PulleyJointOpt {\n /**\n * The first ground anchor in world coordinates. This point never moves.\n */\n groundAnchorA: Vec2;\n /**\n * The second ground anchor in world coordinates. This point never moves.\n */\n groundAnchorB: Vec2;\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The reference length for the segment attached to bodyA.\n */\n lengthA: number;\n /**\n * The reference length for the segment attached to bodyB.\n */\n lengthB: number;\n /**\n * The pulley ratio, used to simulate a block-and-tackle.\n */\n ratio: number;\n}\n\nconst DEFAULTS = {\n collideConnected : true\n};\n\n/**\n * The pulley joint is connected to two bodies and two fixed ground points. The\n * pulley supports a ratio such that: length1 + ratio * length2 <= constant\n *\n * Yes, the force transmitted is scaled by the ratio.\n *\n * Warning: the pulley joint can get a bit squirrelly by itself. They often work\n * better when combined with prismatic joints. You should also cover the the\n * anchor points with static shapes to prevent one side from going to zero\n * length.\n */\nexport class PulleyJoint extends Joint {\n static TYPE = 'pulley-joint' as const;\n // static MIN_PULLEY_LENGTH: number = 2.0; // TODO where this is used?\n\n /** @internal */ m_type: 'pulley-joint';\n /** @internal */ m_groundAnchorA: Vec2;\n /** @internal */ m_groundAnchorB: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_lengthA: number;\n /** @internal */ m_lengthB: number;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_uA: Vec2;\n /** @internal */ m_uB: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: PulleyJointDef);\n constructor(def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number);\n constructor(def: PulleyJointDef, bodyA?: Body, bodyB?: Body, groundA?: Vec2, groundB?: Vec2, anchorA?: Vec2, anchorB?: Vec2, ratio?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PulleyJoint)) {\n return new PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PulleyJoint.TYPE;\n this.m_groundAnchorA = groundA ? groundA : def.groundAnchorA || Vec2.neo(-1.0, 1.0);\n this.m_groundAnchorB = groundB ? groundB : def.groundAnchorB || Vec2.neo(1.0, 1.0);\n this.m_localAnchorA = anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n this.m_lengthA = Math.isFinite(def.lengthA) ? def.lengthA : Vec2.distance(anchorA, groundA);\n this.m_lengthB = Math.isFinite(def.lengthB) ? def.lengthB : Vec2.distance(anchorB, groundB);\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n _ASSERT && console.assert(ratio > Math.EPSILON);\n\n this.m_constant = this.m_lengthA + this.m_ratio * this.m_lengthB;\n\n this.m_impulse = 0.0;\n\n // Pulley:\n // length1 = norm(p1 - s1)\n // length2 = norm(p2 - s2)\n // C0 = (length1 + ratio * length2)_initial\n // C = C0 - (length1 + ratio * length2)\n // u1 = (p1 - s1) / norm(p1 - s1)\n // u2 = (p2 - s2) / norm(p2 - s2)\n // Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2))\n // J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 *\n // cross(r2, u2)^2)\n }\n\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n groundAnchorA: this.m_groundAnchorA,\n groundAnchorB: this.m_groundAnchorB,\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n lengthA: this.m_lengthA,\n lengthB: this.m_lengthB,\n ratio: this.m_ratio,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PulleyJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new PulleyJoint(data);\n return joint;\n }\n\n /**\n * Get the first ground anchor.\n */\n getGroundAnchorA(): Vec2 {\n return this.m_groundAnchorA;\n }\n\n /**\n * Get the second ground anchor.\n */\n getGroundAnchorB(): Vec2 {\n return this.m_groundAnchorB;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getLengthA(): number {\n return this.m_lengthA;\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getLengthB(): number {\n return this.m_lengthB;\n }\n\n /**\n * Get the pulley ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getCurrentLengthA(): number {\n const p = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const s = this.m_groundAnchorA;\n return Vec2.distance(p, s);\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getCurrentLengthB(): number {\n const p = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const s = this.m_groundAnchorB;\n return Vec2.distance(p, s);\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n *\n * @param newOrigin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_groundAnchorA.sub(newOrigin);\n this.m_groundAnchorB.sub(newOrigin);\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_uB).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n this.m_uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n this.m_uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = this.m_uA.length();\n const lengthB = this.m_uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n this.m_uA.mul(1.0 / lengthA);\n } else {\n this.m_uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n this.m_uB.mul(1.0 / lengthB);\n } else {\n this.m_uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(this.m_rA, this.m_uA); // float\n const ruB = Vec2.crossVec2Vec2(this.m_rB, this.m_uB); // float\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n this.m_mass = mA + this.m_ratio * this.m_ratio * mB;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support variable time steps.\n this.m_impulse *= step.dtRatio;\n\n // Warm starting.\n const PA = Vec2.mulNumVec2(-this.m_impulse, this.m_uA);\n const PB = Vec2.mulNumVec2(-this.m_ratio * this.m_impulse, this.m_uB);\n\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n\n const Cdot = -Vec2.dot(this.m_uA, vpA) - this.m_ratio\n * Vec2.dot(this.m_uB, vpB); // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const PA = Vec2.mulNumVec2(-impulse, this.m_uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, this.m_uB); // Vec2\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n const uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n const uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = uA.length();\n const lengthB = uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n uA.mul(1.0 / lengthA);\n } else {\n uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n uB.mul(1.0 / lengthB);\n } else {\n uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(rA, uA);\n const ruB = Vec2.crossVec2Vec2(rB, uB);\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n let mass = mA + this.m_ratio * this.m_ratio * mB; // float\n\n if (mass > 0.0) {\n mass = 1.0 / mass;\n }\n\n const C = this.m_constant - lengthA - this.m_ratio * lengthB; // float\n const linearError = Math.abs(C); // float\n\n const impulse = -mass * C; // float\n\n const PA = Vec2.mulNumVec2(-impulse, uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, uB); // Vec2\n\n cA.addMul(this.m_invMassA, PA);\n aA += this.m_invIA * Vec2.crossVec2Vec2(rA, PA);\n cB.addMul(this.m_invMassB, PB);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, PB);\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointOpt extends JointOpt {\n /**\n * The maximum length of the rope.\n * Warning: this must be larger than linearSlop or the joint will have no effect.\n */\n maxLength?: number;\n}\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointDef extends JointDef, RopeJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxLength : 0.0,\n};\n\n/**\n * A rope joint enforces a maximum distance between two points on two bodies. It\n * has no other effect.\n *\n * Warning: if you attempt to change the maximum length during the simulation\n * you will get some non-physical behavior.\n *\n * A model that would allow you to dynamically modify the length would have some\n * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you\n * want to dynamically control length.\n */\nexport class RopeJoint extends Joint {\n static TYPE = 'rope-joint' as const;\n\n /** @internal */ m_type: 'rope-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n /** @internal */ m_maxLength: number;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_length: number;\n /** @internal */ m_state: number; // TODO enum\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n constructor(def: RopeJointDef);\n constructor(def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: RopeJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof RopeJoint)) {\n return new RopeJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RopeJoint.TYPE;\n this.m_localAnchorA = anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n\n this.m_maxLength = def.maxLength;\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_length = 0.0;\n this.m_state = inactiveLimit;\n\n // Limit:\n // C = norm(pB - pA) - L\n // u = (pB - pA) / norm(pB - pA)\n // Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA))\n // J = [-u -cross(rA, u) u cross(rB, u)]\n // K = J * invM * JT\n // = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n maxLength: this.m_maxLength,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): RopeJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RopeJoint(data);\n return joint;\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum length of the rope.\n */\n setMaxLength(length: number): void {\n this.m_maxLength = length;\n }\n\n /**\n * Get the maximum length of the rope.\n */\n getMaxLength(): number {\n return this.m_maxLength;\n }\n\n getLimitState(): number {\n // TODO LimitState\n return this.m_state;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n this.m_rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n this.m_u = Vec2.zero();\n this.m_u.addCombine(1, cB, 1, this.m_rB);\n this.m_u.subCombine(1, cA, 1, this.m_rA); // Vec2\n\n this.m_length = this.m_u.length();\n\n const C = this.m_length - this.m_maxLength; // float\n if (C > 0.0) {\n this.m_state = atUpperLimit;\n } else {\n this.m_state = inactiveLimit;\n }\n\n if (this.m_length > Settings.linearSlop) {\n this.m_u.mul(1.0 / this.m_length);\n } else {\n this.m_u.setZero();\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n return;\n }\n\n // Compute effective mass.\n const crA = Vec2.crossVec2Vec2(this.m_rA, this.m_u); // float\n const crB = Vec2.crossVec2Vec2(this.m_rB, this.m_u); // float\n const invMass = this.m_invMassA + this.m_invIA * crA * crA + this.m_invMassB\n + this.m_invIB * crB * crB; // float\n\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.addCrossNumVec2(vA, wA, this.m_rA); // Vec2\n const vpB = Vec2.addCrossNumVec2(vB, wB, this.m_rB); // Vec2\n const C = this.m_length - this.m_maxLength; // float\n let Cdot = Vec2.dot(this.m_u, Vec2.sub(vpB, vpA)); // float\n\n // Predictive constraint.\n if (C < 0.0) {\n Cdot += step.inv_dt * C;\n }\n\n let impulse = -this.m_mass * Cdot; // float\n const oldImpulse = this.m_impulse; // float\n this.m_impulse = Math.min(0.0, this.m_impulse + impulse);\n impulse = this.m_impulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u); // Vec2\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c; // Vec2\n let aA = this.m_bodyA.c_position.a; // float\n const cB = this.m_bodyB.c_position.c; // Vec2\n let aB = this.m_bodyB.c_position.a; // float\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.zero();\n u.addCombine(1, cB, 1, rB);\n u.subCombine(1, cA, 1, rA); // Vec2\n\n const length = u.normalize(); // float\n let C = length - this.m_maxLength; // float\n\n C = Math.clamp(C, 0.0, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C; // float\n const P = Vec2.mulNumVec2(impulse, u); // Vec2\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return length - this.m_maxLength < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n *\n * @prop {float} frequencyHz\n * @prop {float} dampingRatio\n *\n * @prop {Vec2} localAnchorA\n * @prop {Vec2} localAnchorB\n * @prop {float} referenceAngle\n */\nexport interface WeldJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. Rotation only. Disable softness\n * with a value of 0.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle?: number;\n}\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n */\nexport interface WeldJointDef extends JointDef, WeldJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0,\n};\n\n/**\n * A weld joint essentially glues two bodies together. A weld joint may distort\n * somewhat because the island constraint solver is approximate.\n */\nexport class WeldJoint extends Joint {\n static TYPE = 'weld-joint' as const\n\n /** @internal */ m_type: 'weld-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_impulse: Vec3;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat33;\n\n constructor(def: WeldJointDef);\n constructor(def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: WeldJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof WeldJoint)) {\n return new WeldJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WeldJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_impulse = new Vec3();\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rA; // Vec2\n this.m_rB; // Vec2\n this.m_localCenterA; // Vec2\n this.m_localCenterB; // Vec2\n this.m_invMassA; // float\n this.m_invMassB; // float\n this.m_invIA; // float\n this.m_invIB; // float\n this.m_mass = new Mat33();\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // / = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // C = angle2 - angle1 - referenceAngle\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WeldJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WeldJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Set frequency in Hz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get frequency in Hz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set damping ratio.\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get damping ratio.\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat33();\n K.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y * this.m_rB.y\n * iB;\n K.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y * this.m_rB.x * iB;\n K.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x * this.m_rB.x\n * iB;\n K.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n K.getInverse22(this.m_mass);\n\n let invM = iA + iB; // float\n const m = invM > 0.0 ? 1.0 / invM : 0.0; // float\n\n const C = aB - aA - this.m_referenceAngle; // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const d = 2.0 * m * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = m * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invM += this.m_gamma;\n this.m_mass.ez.z = invM != 0.0 ? 1.0 / invM : 0.0;\n } else if (K.ez.z == 0.0) {\n K.getInverse22(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n } else {\n K.getSymInverse33(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n if (this.m_frequencyHz > 0.0) {\n const Cdot2 = wB - wA; // float\n\n const impulse2 = -this.m_mass.ez.z\n * (Cdot2 + this.m_bias + this.m_gamma * this.m_impulse.z); // float\n this.m_impulse.z += impulse2;\n\n wA -= iA * impulse2;\n wB += iB * impulse2;\n\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n\n const impulse1 = Vec2.neg(Mat33.mulVec2(this.m_mass, Cdot1)); // Vec2\n this.m_impulse.x += impulse1.x;\n this.m_impulse.y += impulse1.y;\n\n const P = Vec2.clone(impulse1); // Vec2\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, P);\n } else {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); // Vec3\n\n const impulse = Vec3.neg(Mat33.mulVec3(this.m_mass, Cdot)); // Vec3\n this.m_impulse.add(impulse);\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n let positionError: number;\n let angularError: number;\n\n const K = new Mat33();\n K.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB;\n K.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB;\n K.ez.x = -rA.y * iA - rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB;\n K.ez.y = rA.x * iA + rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA); // Vec2\n\n positionError = C1.length();\n angularError = 0.0;\n\n const P = Vec2.neg(K.solve22(C1)); // Vec2\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n } else {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA);\n\n const C2 = aB - aA - this.m_referenceAngle; // float\n\n positionError = C1.length();\n angularError = Math.abs(C2);\n\n const C = new Vec3(C1.x, C1.y, C2);\n\n let impulse = new Vec3();\n if (K.ez.z > 0.0) {\n impulse = Vec3.neg(K.solve33(C));\n } else {\n const impulse2 = Vec2.neg(K.solve22(C1));\n impulse.set(impulse2.x, impulse2.y, 0.0);\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n cA.subMul(mA, P);\n aA -= iA * (Vec2.crossVec2Vec2(rA, P) + impulse.z);\n\n cB.addMul(mB, P);\n aB += iB * (Vec2.crossVec2Vec2(rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointOpt extends JointOpt {\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n /**\n * Suspension frequency, zero indicates no suspension.\n */\n frequencyHz?: number;\n /**\n * Suspension damping ratio, one indicates critical damping.\n */\n dampingRatio?: number;\n}\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointDef extends JointDef, WheelJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation axis in bodyA.\n */\n localAxisA: Vec2;\n}\n\nconst DEFAULTS = {\n enableMotor : false,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n frequencyHz : 2.0,\n dampingRatio : 0.7,\n};\n\n/**\n * A wheel joint. This joint provides two degrees of freedom: translation along\n * an axis fixed in bodyA and rotation in the plane. In other words, it is a\n * point to line constraint with a rotational motor and a linear spring/damper.\n * This joint is designed for vehicle suspensions.\n */\nexport class WheelJoint extends Joint {\n static TYPE = 'wheel-joint' as const;\n\n /** @internal */ m_type: 'wheel-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_springMass: number;\n /** @internal */ m_springImpulse: number;\n\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableMotor: boolean;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n /** @internal */ m_ax: Vec2 = Vec2.zero();\n /** @internal */ m_ay: Vec2 = Vec2.zero();\n /** @internal */ m_sAx: number;\n /** @internal */ m_sBx: number;\n /** @internal */ m_sAy: number;\n /** @internal */ m_sBy: number;\n\n constructor(def: WheelJointDef);\n constructor(def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n // @ts-ignore\n constructor(def: WheelJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof WheelJoint)) {\n return new WheelJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WheelJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n // @ts-ignore localAxis\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || def.localAxis || Vec2.neo(1.0, 0.0));\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n this.m_springMass = 0.0;\n this.m_springImpulse = 0.0;\n\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableMotor = def.enableMotor;\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Linear constraint (point-to-line)\n // d = pB - pA = xB + rB - xA - rA\n // C = dot(ay, d)\n // Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA,\n // rA))\n // = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB,\n // ay), vB)\n // J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)]\n\n // Spring linear constraint\n // C = dot(ax, d)\n // Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) +\n // dot(cross(rB, ax), vB)\n // J = [-ax -cross(d+rA, ax) ax cross(rB, ax)]\n\n // Motor rotational constraint\n // Cdot = wB - wA\n // J = [0 0 -1 0 0 1]\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n enableMotor: this.m_enableMotor,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WheelJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WheelJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const pA = bA.getWorldPoint(this.m_localAnchorA); // Vec2\n const pB = bB.getWorldPoint(this.m_localAnchorB); // Vec2\n const d = Vec2.sub(pB, pA); // Vec2\n const axis = bA.getWorldVector(this.m_localXAxisA); // Vec2\n\n const translation = Vec2.dot(d, axis); // float\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const wA = this.m_bodyA.m_angularVelocity;\n const wB = this.m_bodyB.m_angularVelocity;\n return wB - wA;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed, usually in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set/Get the maximum motor force, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Get the current motor torque given the inverse time step, usually in N-m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set/Get the spring frequency in hertz. Setting the frequency to zero disables\n * the spring.\n */\n setSpringFrequencyHz(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getSpringFrequencyHz(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set/Get the spring damping ratio\n */\n setSpringDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getSpringDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA); // Vec2\n\n // Point to line constraint\n {\n this.m_ay = Rot.mulVec2(qA, this.m_localYAxisA);\n this.m_sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ay);\n this.m_sBy = Vec2.crossVec2Vec2(rB, this.m_ay);\n\n this.m_mass = mA + mB + iA * this.m_sAy * this.m_sAy + iB * this.m_sBy\n * this.m_sBy;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n }\n\n // Spring constraint\n this.m_springMass = 0.0;\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n if (this.m_frequencyHz > 0.0) {\n this.m_ax = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_sAx = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ax);\n this.m_sBx = Vec2.crossVec2Vec2(rB, this.m_ax);\n\n const invMass = mA + mB + iA * this.m_sAx * this.m_sAx + iB * this.m_sBx\n * this.m_sBx; // float\n\n if (invMass > 0.0) {\n this.m_springMass = 1.0 / invMass;\n\n const C = Vec2.dot(d, this.m_ax); // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const damp = 2.0 * this.m_springMass * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = this.m_springMass * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (damp + h * k);\n if (this.m_gamma > 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n\n this.m_bias = C * h * k * this.m_gamma;\n\n this.m_springMass = invMass + this.m_gamma;\n if (this.m_springMass > 0.0) {\n this.m_springMass = 1.0 / this.m_springMass;\n }\n }\n } else {\n this.m_springImpulse = 0.0;\n }\n\n // Rotational motor\n if (this.m_enableMotor) {\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n } else {\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse *= step.dtRatio;\n this.m_springImpulse *= step.dtRatio;\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax);\n const LA = this.m_impulse * this.m_sAy + this.m_springImpulse * this.m_sAx + this.m_motorImpulse;\n const LB = this.m_impulse * this.m_sBy + this.m_springImpulse * this.m_sBx + this.m_motorImpulse;\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * LA;\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * LB;\n\n } else {\n this.m_impulse = 0.0;\n this.m_springImpulse = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Solve spring constraint\n {\n const Cdot = Vec2.dot(this.m_ax, vB) - Vec2.dot(this.m_ax, vA) + this.m_sBx\n * wB - this.m_sAx * wA; // float\n const impulse = -this.m_springMass\n * (Cdot + this.m_bias + this.m_gamma * this.m_springImpulse); // float\n this.m_springImpulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ax); // Vec2\n const LA = impulse * this.m_sAx; // float\n const LB = impulse * this.m_sBx; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n // Solve rotational motor constraint\n {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve point to line constraint\n {\n const Cdot = Vec2.dot(this.m_ay, vB) - Vec2.dot(this.m_ay, vA) + this.m_sBy\n * wB - this.m_sAy * wA; // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ay); // Vec2\n const LA = impulse * this.m_sAy; // float\n const LB = impulse * this.m_sBy; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const ay = Rot.mulVec2(qA, this.m_localYAxisA);\n\n const sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), ay); // float\n const sBy = Vec2.crossVec2Vec2(rB, ay); // float\n\n const C = Vec2.dot(d, ay); // float\n\n const k = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_sAy\n * this.m_sAy + this.m_invIB * this.m_sBy * this.m_sBy; // float\n\n let impulse; // float\n if (k != 0.0) {\n impulse = -C / k;\n } else {\n impulse = 0.0;\n }\n\n const P = Vec2.mulNumVec2(impulse, ay); // Vec2\n const LA = impulse * sAy; // float\n const LB = impulse * sBy; // float\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * LA;\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * LB;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) <= Settings.linearSlop;\n }\n\n}\n","// tslint:disable:typedef\nimport { World } from '../dynamics/World';\nimport { Body } from '../dynamics/Body';\nimport { Joint } from '../dynamics/Joint';\nimport { Fixture } from '../dynamics/Fixture';\nimport { Shape } from '../collision/Shape';\nimport { Vec2 } from '../common/Vec2';\nimport { Vec3 } from '../common/Vec3';\nimport { ChainShape } from \"../collision/shape/ChainShape\";\nimport { BoxShape } from \"../collision/shape/BoxShape\";\nimport { EdgeShape } from \"../collision/shape/EdgeShape\";\nimport { PolygonShape } from \"../collision/shape/PolygonShape\";\nimport { CircleShape } from \"../collision/shape/CircleShape\";\nimport { DistanceJoint } from \"../dynamics/joint/DistanceJoint\";\nimport { FrictionJoint } from \"../dynamics/joint/FrictionJoint\";\nimport { GearJoint } from \"../dynamics/joint/GearJoint\";\nimport { MotorJoint } from \"../dynamics/joint/MotorJoint\";\nimport { MouseJoint } from \"../dynamics/joint/MouseJoint\";\nimport { PrismaticJoint } from \"../dynamics/joint/PrismaticJoint\";\nimport { PulleyJoint } from \"../dynamics/joint/PulleyJoint\";\nimport { RevoluteJoint } from \"../dynamics/joint/RevoluteJoint\";\nimport { RopeJoint } from \"../dynamics/joint/RopeJoint\";\nimport { WeldJoint } from \"../dynamics/joint/WeldJoint\";\nimport { WheelJoint } from \"../dynamics/joint/WheelJoint\";\n\nlet SID = 0;\n\nexport function Serializer(opts?) {\n opts = opts || {};\n\n const rootClass = opts.rootClass || World;\n\n const preSerialize = opts.preSerialize || function(obj) { return obj; };\n const postSerialize = opts.postSerialize || function(data, obj) { return data; };\n\n const preDeserialize = opts.preDeserialize || function(data) { return data; };\n const postDeserialize = opts.postDeserialize || function(obj, data) { return obj; };\n\n // This is used to create ref objects during serialize\n const refTypes = {\n World,\n Body,\n Joint,\n Fixture,\n Shape,\n };\n\n // This is used by restore to deserialize objects and refs\n const restoreTypes = {\n Vec2,\n Vec3,\n ...refTypes\n };\n\n const CLASS_BY_TYPE_PROP = {\n [Body.STATIC]: Body,\n [Body.DYNAMIC]: Body,\n [Body.KINEMATIC]: Body,\n [ChainShape.TYPE]: ChainShape,\n [BoxShape.TYPE]: BoxShape,\n [EdgeShape.TYPE]: EdgeShape,\n [PolygonShape.TYPE]: PolygonShape,\n [CircleShape.TYPE]: CircleShape,\n [DistanceJoint.TYPE]: DistanceJoint,\n [FrictionJoint.TYPE]: FrictionJoint,\n [GearJoint.TYPE]: GearJoint,\n [MotorJoint.TYPE]: MotorJoint,\n [MouseJoint.TYPE]: MouseJoint,\n [PrismaticJoint.TYPE]: PrismaticJoint,\n [PulleyJoint.TYPE]: PulleyJoint,\n [RevoluteJoint.TYPE]: RevoluteJoint,\n [RopeJoint.TYPE]: RopeJoint,\n [WeldJoint.TYPE]: WeldJoint,\n [WheelJoint.TYPE]: WheelJoint,\n }\n\n this.toJson = function(root) {\n const json = [];\n\n const queue = [root];\n const refMap = {};\n\n function storeRef(value, typeName) {\n value.__sid = value.__sid || ++SID;\n if (!refMap[value.__sid]) {\n queue.push(value);\n const index = json.length + queue.length;\n const ref = {\n refIndex: index,\n refType: typeName\n };\n refMap[value.__sid] = ref;\n }\n return refMap[value.__sid];\n }\n\n function serialize(obj) {\n obj = preSerialize(obj);\n let data = obj._serialize();\n data = postSerialize(data, obj);\n return data;\n }\n\n function toJson(value, top?) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (typeof value._serialize === 'function') {\n if (value !== top) {\n // tslint:disable-next-line:no-for-in\n for (const typeName in refTypes) {\n if (value instanceof refTypes[typeName]) {\n return storeRef(value, typeName);\n }\n }\n }\n value = serialize(value);\n }\n if (Array.isArray(value)) {\n const newValue = [];\n for (let key = 0; key < value.length; key++) {\n newValue[key] = toJson(value[key]);\n }\n value = newValue;\n\n } else {\n const newValue = {};\n // tslint:disable-next-line:no-for-in\n for (const key in value) {\n if (value.hasOwnProperty(key)) {\n newValue[key] = toJson(value[key]);\n }\n }\n value = newValue;\n }\n return value;\n }\n\n while (queue.length) {\n const obj = queue.shift();\n const str = toJson(obj, obj);\n json.push(str);\n }\n\n return json;\n };\n\n this.fromJson = function(json: object) {\n const refMap = {};\n\n function findDeserilizer(data, cls) {\n if (!cls || !cls._deserialize) {\n cls = CLASS_BY_TYPE_PROP[data.type]\n }\n return cls && cls._deserialize;\n }\n\n /**\n * Deserialize a data object.\n */\n function deserialize(cls, data, ctx) {\n const deserializer = findDeserilizer(data, cls);\n if (!deserializer) {\n return;\n }\n data = preDeserialize(data);\n let obj = deserializer(data, ctx, restoreRef);\n obj = postDeserialize(obj, data);\n return obj;\n }\n\n /**\n * Restore a ref object or deserialize a data object.\n *\n * This is passed as callback to class deserializers.\n */\n function restoreRef(cls, ref, ctx) {\n if (!ref.refIndex) {\n return cls && cls._deserialize && deserialize(cls, ref, ctx);\n }\n cls = restoreTypes[ref.refType] || cls;\n const index = ref.refIndex;\n if (!refMap[index]) {\n const data = json[index];\n const obj = deserialize(cls, data, ctx);\n refMap[index] = obj;\n }\n return refMap[index];\n }\n\n const root = rootClass._deserialize(json[0], null, restoreRef);\n\n return root;\n };\n}\n\nconst serializer = new Serializer();\n\nSerializer.toJson = serializer.toJson;\nSerializer.fromJson = serializer.fromJson;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { CircleShape } from './CircleShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact);\n\nfunction CircleCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == CircleShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n CollideCircles(manifold, fixtureA.getShape() as CircleShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport const CollideCircles = function (manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n const pA = Transform.mulVec2(xfA, circleA.m_p);\n const pB = Transform.mulVec2(xfB, circleB.m_p);\n\n const distSqr = Vec2.distanceSquared(pB, pA);\n const rA = circleA.m_radius;\n const rB = circleB.m_radius;\n const radius = rA + rB;\n if (distSqr > radius * radius) {\n return;\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localPoint.setVec2(circleA.m_p);\n manifold.localNormal.setZero();\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { EdgeShape } from './EdgeShape';\nimport { ChainShape } from './ChainShape';\nimport { CircleShape } from './CircleShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, CircleShape.TYPE, EdgeCircleContact);\nContact.addType(ChainShape.TYPE, CircleShape.TYPE, ChainCircleContact);\n\nfunction EdgeCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == EdgeShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const shapeA = fixtureA.getShape() as EdgeShape;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\nfunction ChainCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == ChainShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const chain = fixtureA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n const shapeA = edge;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\n// Compute contact points for edge versus circle.\n// This accounts for edge connectivity.\nexport const CollideEdgeCircle = function (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle in frame of edge\n const Q = Transform.mulTVec2(xfA, Transform.mulVec2(xfB, circleB.m_p));\n\n const A = edgeA.m_vertex1;\n const B = edgeA.m_vertex2;\n const e = Vec2.sub(B, A);\n\n // Barycentric coordinates\n const u = Vec2.dot(e, Vec2.sub(B, Q));\n const v = Vec2.dot(e, Vec2.sub(Q, A));\n\n const radius = edgeA.m_radius + circleB.m_radius;\n\n // Region A\n if (v <= 0.0) {\n const P = Vec2.clone(A);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to A?\n if (edgeA.m_hasVertex0) {\n const A1 = edgeA.m_vertex0;\n const B1 = A;\n const e1 = Vec2.sub(B1, A1);\n const u1 = Vec2.dot(e1, Vec2.sub(B1, Q));\n\n // Is the circle in Region AB of the previous edge?\n if (u1 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region B\n if (u <= 0.0) {\n const P = Vec2.clone(B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to B?\n if (edgeA.m_hasVertex3) {\n const B2 = edgeA.m_vertex3;\n const A2 = B;\n const e2 = Vec2.sub(B2, A2);\n const v2 = Vec2.dot(e2, Vec2.sub(Q, A2));\n\n // Is the circle in Region AB of the next edge?\n if (v2 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 1;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region AB\n const den = Vec2.dot(e, e);\n _ASSERT && console.assert(den > 0.0);\n const P = Vec2.combine(u / den, A, v / den, B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n const n = Vec2.neo(-e.y, e.x);\n if (Vec2.dot(n, Vec2.sub(Q, A)) < 0.0) {\n n.setNum(-n.x, -n.y);\n }\n n.normalize();\n\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal = n;\n manifold.localPoint.setVec2(A);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_face;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2 } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Manifold, clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport { Contact } from '../../dynamics/Contact';\nimport { PolygonShape } from './PolygonShape';\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, PolygonShape.TYPE, PolygonContact);\n\nfunction PolygonContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == PolygonShape.TYPE);\n CollidePolygons(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as PolygonShape, xfB);\n}\n\ninterface MaxSeparation {\n maxSeparation: number;\n bestIndex: number;\n}\n\n/**\n * Find the max separation between poly1 and poly2 using edge normals from\n * poly1.\n */\nfunction findMaxSeparation(poly1: PolygonShape, xf1: Transform, poly2: PolygonShape, xf2: Transform, output: MaxSeparation): void {\n const count1 = poly1.m_count;\n const count2 = poly2.m_count;\n const n1s = poly1.m_normals;\n const v1s = poly1.m_vertices;\n const v2s = poly2.m_vertices;\n const xf = Transform.mulTXf(xf2, xf1);\n\n let bestIndex = 0;\n let maxSeparation = -Infinity;\n for (let i = 0; i < count1; ++i) {\n // Get poly1 normal in frame2.\n const n = Rot.mulVec2(xf.q, n1s[i]);\n const v1 = Transform.mulVec2(xf, v1s[i]);\n\n // Find deepest point for normal i.\n let si = Infinity;\n for (let j = 0; j < count2; ++j) {\n const sij = Vec2.dot(n, v2s[j]) - Vec2.dot(n, v1);\n if (sij < si) {\n si = sij;\n }\n }\n\n if (si > maxSeparation) {\n maxSeparation = si;\n bestIndex = i;\n }\n }\n\n // used to keep last FindMaxSeparation call values\n output.maxSeparation = maxSeparation;\n output.bestIndex = bestIndex;\n}\n\nfunction findIncidentEdge(c: ClipVertex[], poly1: PolygonShape, xf1: Transform, edge1: number, poly2: PolygonShape, xf2: Transform): void {\n const normals1 = poly1.m_normals;\n\n const count2 = poly2.m_count;\n const vertices2 = poly2.m_vertices;\n const normals2 = poly2.m_normals;\n\n _ASSERT && console.assert(0 <= edge1 && edge1 < poly1.m_count);\n\n // Get the normal of the reference edge in poly2's frame.\n const normal1 = Rot.mulTVec2(xf2.q, Rot.mulVec2(xf1.q, normals1[edge1]));\n\n // Find the incident edge on poly2.\n let index = 0;\n let minDot = Infinity;\n for (let i = 0; i < count2; ++i) {\n const dot = Vec2.dot(normal1, normals2[i]);\n if (dot < minDot) {\n minDot = dot;\n index = i;\n }\n }\n\n // Build the clip vertices for the incident edge.\n const i1 = index;\n const i2 = i1 + 1 < count2 ? i1 + 1 : 0;\n\n c[0].v = Transform.mulVec2(xf2, vertices2[i1]);\n c[0].id.cf.indexA = edge1;\n c[0].id.cf.indexB = i1;\n c[0].id.cf.typeA = ContactFeatureType.e_face;\n c[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n c[1].v = Transform.mulVec2(xf2, vertices2[i2]);\n c[1].id.cf.indexA = edge1;\n c[1].id.cf.indexB = i2;\n c[1].id.cf.typeA = ContactFeatureType.e_face;\n c[1].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n\nconst maxSeparation = {\n maxSeparation: 0,\n bestIndex: 0,\n};\n\n/**\n *\n * Find edge normal of max separation on A - return if separating axis is found
\n * Find edge normal of max separation on B - return if separation axis is found
\n * Choose reference edge as min(minA, minB)
\n * Find incident edge
\n * Clip\n *\n * The normal points from 1 to 2\n */\nexport const CollidePolygons = function (manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform): void {\n manifold.pointCount = 0;\n const totalRadius = polyA.m_radius + polyB.m_radius;\n\n findMaxSeparation(polyA, xfA, polyB, xfB, maxSeparation);\n const edgeA = maxSeparation.bestIndex;\n const separationA = maxSeparation.maxSeparation;\n if (separationA > totalRadius)\n return;\n\n findMaxSeparation(polyB, xfB, polyA, xfA, maxSeparation);\n const edgeB = maxSeparation.bestIndex;\n const separationB = maxSeparation.maxSeparation;\n if (separationB > totalRadius)\n return;\n\n let poly1; // reference polygon\n let poly2; // incident polygon\n let xf1;\n let xf2;\n let edge1; // reference edge\n let flip;\n const k_tol = 0.1 * Settings.linearSlop;\n\n if (separationB > separationA + k_tol) {\n poly1 = polyB;\n poly2 = polyA;\n xf1 = xfB;\n xf2 = xfA;\n edge1 = edgeB;\n manifold.type = ManifoldType.e_faceB;\n flip = 1;\n } else {\n poly1 = polyA;\n poly2 = polyB;\n xf1 = xfA;\n xf2 = xfB;\n edge1 = edgeA;\n manifold.type = ManifoldType.e_faceA;\n flip = 0;\n }\n\n const incidentEdge = [ new ClipVertex(), new ClipVertex() ];\n findIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);\n\n const count1 = poly1.m_count;\n const vertices1 = poly1.m_vertices;\n\n const iv1 = edge1;\n const iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0;\n\n let v11 = vertices1[iv1];\n let v12 = vertices1[iv2];\n\n const localTangent = Vec2.sub(v12, v11);\n localTangent.normalize();\n\n const localNormal = Vec2.crossVec2Num(localTangent, 1.0);\n const planePoint = Vec2.combine(0.5, v11, 0.5, v12);\n\n const tangent = Rot.mulVec2(xf1.q, localTangent);\n const normal = Vec2.crossVec2Num(tangent, 1.0);\n\n v11 = Transform.mulVec2(xf1, v11);\n v12 = Transform.mulVec2(xf1, v12);\n\n // Face offset.\n const frontOffset = Vec2.dot(normal, v11);\n\n // Side offsets, extended by polytope skin thickness.\n const sideOffset1 = -Vec2.dot(tangent, v11) + totalRadius;\n const sideOffset2 = Vec2.dot(tangent, v12) + totalRadius;\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, incidentEdge, Vec2.neg(tangent), sideOffset1, iv1);\n\n if (np < 2) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2);\n\n if (np < 2) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n manifold.localNormal = localNormal;\n manifold.localPoint = planePoint;\n\n let pointCount = 0;\n for (let i = 0; i < clipPoints2.length/* maxManifoldPoints */; ++i) {\n const separation = Vec2.dot(normal, clipPoints2[i].v) - frontOffset;\n\n if (separation <= totalRadius) {\n const cp = manifold.points[pointCount];\n cp.localPoint.setVec2(Transform.mulTVec2(xf2, clipPoints2[i].v));\n cp.id = clipPoints2[i].id;\n if (flip) {\n // Swap features\n const cf = cp.id.cf;\n const indexA = cf.indexA;\n const indexB = cf.indexB;\n const typeA = cf.typeA;\n const typeB = cf.typeB;\n cf.indexA = indexB;\n cf.indexB = indexA;\n cf.typeA = typeB;\n cf.typeB = typeA;\n }\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { CircleShape } from './CircleShape';\nimport { PolygonShape } from './PolygonShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, CircleShape.TYPE, PolygonCircleContact);\n\nfunction PolygonCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n CollidePolygonCircle(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport const CollidePolygonCircle = function (manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle position in the frame of the polygon.\n const c = Transform.mulVec2(xfB, circleB.m_p);\n const cLocal = Transform.mulTVec2(xfA, c);\n\n // Find the min separating edge.\n let normalIndex = 0;\n let separation = -Infinity;\n const radius = polygonA.m_radius + circleB.m_radius;\n const vertexCount = polygonA.m_count;\n const vertices = polygonA.m_vertices;\n const normals = polygonA.m_normals;\n\n for (let i = 0; i < vertexCount; ++i) {\n const s = Vec2.dot(normals[i], Vec2.sub(cLocal, vertices[i]));\n\n if (s > radius) {\n // Early out.\n return;\n }\n\n if (s > separation) {\n separation = s;\n normalIndex = i;\n }\n }\n\n // Vertices that subtend the incident face.\n const vertIndex1 = normalIndex;\n const vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0;\n const v1 = vertices[vertIndex1];\n const v2 = vertices[vertIndex2];\n\n // If the center is inside the polygon ...\n if (separation < Math.EPSILON) {\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[normalIndex]);\n manifold.localPoint.setCombine(0.5, v1, 0.5, v2);\n manifold.points[0].localPoint = circleB.m_p;\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Compute barycentric coordinates\n const u1 = Vec2.dot(Vec2.sub(cLocal, v1), Vec2.sub(v2, v1));\n const u2 = Vec2.dot(Vec2.sub(cLocal, v2), Vec2.sub(v1, v2));\n if (u1 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v1) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v1);\n manifold.localNormal.normalize();\n manifold.localPoint = v1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else if (u2 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v2) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v2);\n manifold.localNormal.normalize();\n manifold.localPoint.setVec2(v2);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else {\n const faceCenter = Vec2.mid(v1, v2);\n const separation = Vec2.dot(cLocal, normals[vertIndex1]) - Vec2.dot(faceCenter, normals[vertIndex1]);\n if (separation > radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[vertIndex1]);\n manifold.localPoint.setVec2(faceCenter);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Settings } from '../../Settings';\nimport { Contact } from '../../dynamics/Contact';\nimport { Manifold, clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport { EdgeShape } from './EdgeShape';\nimport { ChainShape } from './ChainShape';\nimport { PolygonShape } from './PolygonShape';\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, PolygonShape.TYPE, EdgePolygonContact);\nContact.addType(ChainShape.TYPE, PolygonShape.TYPE, ChainPolygonContact);\n\nfunction EdgePolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fA.getType() == EdgeShape.TYPE);\n _ASSERT && console.assert(fB.getType() == PolygonShape.TYPE);\n\n CollideEdgePolygon(manifold, fA.getShape() as EdgeShape, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nfunction ChainPolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fA.getType() == ChainShape.TYPE);\n _ASSERT && console.assert(fB.getType() == PolygonShape.TYPE);\n\n const chain = fA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n CollideEdgePolygon(manifold, edge, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nenum EPAxisType {\n e_unknown = -1,\n e_edgeA = 1,\n e_edgeB = 2,\n}\n\n// unused?\nenum VertexType {\n e_isolated = 0,\n e_concave = 1,\n e_convex = 2,\n}\n\n/**\n * This structure is used to keep track of the best separating axis.\n */\nclass EPAxis {\n type: EPAxisType;\n index: number;\n separation: number;\n}\n\n/**\n * This holds polygon B expressed in frame A.\n */\nclass TempPolygon {\n vertices: Vec2[] = []; // [Settings.maxPolygonVertices]\n normals: Vec2[] = []; // [Settings.maxPolygonVertices];\n count: number = 0;\n}\n\n/**\n * Reference face used for clipping\n */\nclass ReferenceFace {\n i1: number;\n i2: number;\n v1: Vec2;\n v2: Vec2;\n normal: Vec2 = Vec2.zero();\n sideNormal1: Vec2 = Vec2.zero();\n sideOffset1: number;\n sideNormal2: Vec2 = Vec2.zero();\n sideOffset2: number;\n}\n\n// reused\nconst edgeAxis = new EPAxis();\nconst polygonAxis = new EPAxis();\nconst polygonBA = new TempPolygon();\nconst rf = new ReferenceFace();\n\n/**\n * This function collides and edge and a polygon, taking into account edge\n * adjacency.\n */\nexport const CollideEdgePolygon = function (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform): void {\n // Algorithm:\n // 1. Classify v1 and v2\n // 2. Classify polygon centroid as front or back\n // 3. Flip normal if necessary\n // 4. Initialize normal range to [-pi, pi] about face normal\n // 5. Adjust normal range according to adjacent edges\n // 6. Visit each separating axes, only accept axes within the range\n // 7. Return if _any_ axis indicates separation\n // 8. Clip\n\n // let m_type1: VertexType;\n // let m_type2: VertexType;\n\n const xf = Transform.mulTXf(xfA, xfB);\n\n const centroidB = Transform.mulVec2(xf, polygonB.m_centroid);\n\n const v0 = edgeA.m_vertex0;\n const v1 = edgeA.m_vertex1;\n const v2 = edgeA.m_vertex2;\n const v3 = edgeA.m_vertex3;\n\n const hasVertex0 = edgeA.m_hasVertex0;\n const hasVertex3 = edgeA.m_hasVertex3;\n\n const edge1 = Vec2.sub(v2, v1);\n edge1.normalize();\n const normal1 = Vec2.neo(edge1.y, -edge1.x);\n const offset1 = Vec2.dot(normal1, Vec2.sub(centroidB, v1));\n let offset0 = 0.0;\n let offset2 = 0.0;\n let convex1 = false;\n let convex2 = false;\n\n let normal0;\n let normal2;\n\n // Is there a preceding edge?\n if (hasVertex0) {\n const edge0 = Vec2.sub(v1, v0);\n edge0.normalize();\n normal0 = Vec2.neo(edge0.y, -edge0.x);\n convex1 = Vec2.crossVec2Vec2(edge0, edge1) >= 0.0;\n offset0 = Vec2.dot(normal0, centroidB) - Vec2.dot(normal0, v0);\n }\n\n // Is there a following edge?\n if (hasVertex3) {\n const edge2 = Vec2.sub(v3, v2);\n edge2.normalize();\n normal2 = Vec2.neo(edge2.y, -edge2.x);\n convex2 = Vec2.crossVec2Vec2(edge1, edge2) > 0.0;\n offset2 = Vec2.dot(normal2, centroidB) - Vec2.dot(normal2, v2);\n }\n\n let front;\n const normal = Vec2.zero();\n const lowerLimit = Vec2.zero();\n const upperLimit = Vec2.zero();\n\n // Determine front or back collision. Determine collision normal limits.\n if (hasVertex0 && hasVertex3) {\n if (convex1 && convex2) {\n front = offset0 >= 0.0 || offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex1) {\n front = offset0 >= 0.0 || (offset1 >= 0.0 && offset2 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex2) {\n front = offset2 >= 0.0 || (offset0 >= 0.0 && offset1 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal0);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex0) {\n if (convex1) {\n front = offset0 >= 0.0 || offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex3) {\n if (convex2) {\n front = offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n }\n } else {\n front = offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setVec2(normal1);\n }\n }\n } else {\n front = offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n }\n }\n\n // Get polygonB in frameA\n polygonBA.count = polygonB.m_count;\n for (let i = 0; i < polygonB.m_count; ++i) {\n polygonBA.vertices[i] = Transform.mulVec2(xf, polygonB.m_vertices[i]);\n polygonBA.normals[i] = Rot.mulVec2(xf.q, polygonB.m_normals[i]);\n }\n\n const radius = 2.0 * Settings.polygonRadius;\n\n manifold.pointCount = 0;\n\n { // ComputeEdgeSeparation\n edgeAxis.type = EPAxisType.e_edgeA;\n edgeAxis.index = front ? 0 : 1;\n edgeAxis.separation = Infinity;\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const s = Vec2.dot(normal, Vec2.sub(polygonBA.vertices[i], v1));\n if (s < edgeAxis.separation) {\n edgeAxis.separation = s;\n }\n }\n }\n\n // If no valid normal can be found than this edge should not collide.\n // @ts-ignore\n if (edgeAxis.type == EPAxisType.e_unknown) {\n return;\n }\n\n if (edgeAxis.separation > radius) {\n return;\n }\n\n { // ComputePolygonSeparation\n polygonAxis.type = EPAxisType.e_unknown;\n polygonAxis.index = -1;\n polygonAxis.separation = -Infinity;\n\n const perp = Vec2.neo(-normal.y, normal.x);\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const n = Vec2.neg(polygonBA.normals[i]);\n\n const s1 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v1));\n const s2 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v2));\n const s = Math.min(s1, s2);\n\n if (s > radius) {\n // No collision\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n break;\n }\n\n // Adjacency\n if (Vec2.dot(n, perp) >= 0.0) {\n if (Vec2.dot(Vec2.sub(n, upperLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n } else {\n if (Vec2.dot(Vec2.sub(n, lowerLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n }\n\n if (s > polygonAxis.separation) {\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n }\n }\n }\n\n if (polygonAxis.type != EPAxisType.e_unknown && polygonAxis.separation > radius) {\n return;\n }\n\n // Use hysteresis for jitter reduction.\n const k_relativeTol = 0.98;\n const k_absoluteTol = 0.001;\n\n let primaryAxis;\n if (polygonAxis.type == EPAxisType.e_unknown) {\n primaryAxis = edgeAxis;\n } else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) {\n primaryAxis = polygonAxis;\n } else {\n primaryAxis = edgeAxis;\n }\n\n const ie = [ new ClipVertex(), new ClipVertex() ];\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.type = ManifoldType.e_faceA;\n\n // Search for the polygon normal that is most anti-parallel to the edge\n // normal.\n let bestIndex = 0;\n let bestValue = Vec2.dot(normal, polygonBA.normals[0]);\n for (let i = 1; i < polygonBA.count; ++i) {\n const value = Vec2.dot(normal, polygonBA.normals[i]);\n if (value < bestValue) {\n bestValue = value;\n bestIndex = i;\n }\n }\n\n const i1 = bestIndex;\n const i2 = i1 + 1 < polygonBA.count ? i1 + 1 : 0;\n\n ie[0].v = polygonBA.vertices[i1];\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = i1;\n ie[0].id.cf.typeA = ContactFeatureType.e_face;\n ie[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n ie[1].v = polygonBA.vertices[i2];\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = i2;\n ie[1].id.cf.typeA = ContactFeatureType.e_face;\n ie[1].id.cf.typeB = ContactFeatureType.e_vertex;\n\n if (front) {\n rf.i1 = 0;\n rf.i2 = 1;\n rf.v1 = v1;\n rf.v2 = v2;\n rf.normal.setVec2(normal1);\n } else {\n rf.i1 = 1;\n rf.i2 = 0;\n rf.v1 = v2;\n rf.v2 = v1;\n rf.normal.setMul(-1, normal1);\n }\n } else {\n manifold.type = ManifoldType.e_faceB;\n\n ie[0].v = v1;\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = primaryAxis.index;\n ie[0].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[0].id.cf.typeB = ContactFeatureType.e_face;\n\n ie[1].v = v2;\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = primaryAxis.index;\n ie[1].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[1].id.cf.typeB = ContactFeatureType.e_face;\n\n rf.i1 = primaryAxis.index;\n rf.i2 = rf.i1 + 1 < polygonBA.count ? rf.i1 + 1 : 0;\n rf.v1 = polygonBA.vertices[rf.i1];\n rf.v2 = polygonBA.vertices[rf.i2];\n rf.normal.setVec2(polygonBA.normals[rf.i1]);\n }\n\n rf.sideNormal1.setNum(rf.normal.y, -rf.normal.x);\n rf.sideNormal2.setMul(-1, rf.sideNormal1);\n rf.sideOffset1 = Vec2.dot(rf.sideNormal1, rf.v1);\n rf.sideOffset2 = Vec2.dot(rf.sideNormal2, rf.v2);\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.localNormal = Vec2.clone(rf.normal);\n manifold.localPoint = Vec2.clone(rf.v1);\n } else {\n manifold.localNormal = Vec2.clone(polygonB.m_normals[rf.i1]);\n manifold.localPoint = Vec2.clone(polygonB.m_vertices[rf.i1]);\n }\n\n let pointCount = 0;\n for (let i = 0; i < Settings.maxManifoldPoints; ++i) {\n const separation = Vec2.dot(rf.normal, Vec2.sub(clipPoints2[i].v, rf.v1));\n\n if (separation <= radius) {\n const cp = manifold.points[pointCount]; // ManifoldPoint\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n cp.localPoint = Transform.mulTVec2(xf, clipPoints2[i].v);\n cp.id = clipPoints2[i].id;\n } else {\n cp.localPoint = clipPoints2[i].v;\n cp.id.cf.typeA = clipPoints2[i].id.cf.typeB;\n cp.id.cf.typeB = clipPoints2[i].id.cf.typeA;\n cp.id.cf.indexA = clipPoints2[i].id.cf.indexB;\n cp.id.cf.indexB = clipPoints2[i].id.cf.indexA;\n }\n\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","export * from './serializer/index';\n\nexport * from './common/Math';\n\nexport * from './common/Vec2';\nexport * from './common/Vec3';\nexport * from './common/Mat22';\nexport * from './common/Mat33';\nexport * from './common/Transform';\nexport * from './common/Rot';\n\nexport * from './collision/AABB';\n\nexport * from './collision/Shape';\nexport * from './dynamics/Fixture';\nexport * from './dynamics/Body';\nexport * from './dynamics/Contact';\nexport * from './dynamics/Joint';\nexport * from './dynamics/World';\n\nexport * from './collision/shape/CircleShape';\nexport * from './collision/shape/EdgeShape';\nexport * from './collision/shape/PolygonShape';\nexport * from './collision/shape/ChainShape';\nexport * from './collision/shape/BoxShape';\n\nexport * from './collision/shape/CollideCircle';\nexport * from './collision/shape/CollideEdgeCircle';\nexport * from './collision/shape/CollidePolygon';\nexport * from './collision/shape/CollideCirclePolygon';\nexport * from './collision/shape/CollideEdgePolygon';\n\nexport * from './dynamics/joint/DistanceJoint';\nexport * from './dynamics/joint/FrictionJoint';\nexport * from './dynamics/joint/GearJoint';\nexport * from './dynamics/joint/MotorJoint';\nexport * from './dynamics/joint/MouseJoint';\nexport * from './dynamics/joint/PrismaticJoint';\nexport * from './dynamics/joint/PulleyJoint';\nexport * from './dynamics/joint/RevoluteJoint';\nexport * from './dynamics/joint/RopeJoint';\nexport * from './dynamics/joint/WeldJoint';\nexport * from './dynamics/joint/WheelJoint';\n\nexport * from './Settings';\n\nexport * from './common/Sweep';\nexport * from './collision/Manifold';\nexport * from './collision/Distance';\nexport * from './collision/TimeOfImpact';\nexport * from './collision/DynamicTree';\nexport * from './util/stats';\n\nimport { CollidePolygons } from './collision/shape/CollidePolygon';\nimport { Settings } from './Settings';\nimport { Sweep } from './common/Sweep';\nimport { DynamicTree } from './collision/DynamicTree';\nimport { Manifold } from './collision/Manifold';\nimport { Distance } from './collision/Distance';\nimport { TimeOfImpact } from './collision/TimeOfImpact';\nimport { stats } from './util/stats';\n\n/** @deprecated Merged with main namespace */\nexport const internal = {\n CollidePolygons,\n Settings,\n Sweep,\n Manifold,\n Distance,\n TimeOfImpact,\n DynamicTree,\n stats\n};\n","import Stage from 'stage-js';\n\nexport * from '../src/index';\n\nimport {\n AABB,\n Body,\n Fixture,\n Joint,\n MouseJoint,\n Vec2,\n World\n} from '../src/index';\n\nexport interface ActiveKeys {\n 0?: boolean;\n 1?: boolean;\n 2?: boolean;\n 3?: boolean;\n 4?: boolean;\n 5?: boolean;\n 6?: boolean;\n 7?: boolean;\n 8?: boolean;\n 9?: boolean;\n A?: boolean;\n B?: boolean;\n C?: boolean;\n D?: boolean;\n E?: boolean;\n F?: boolean;\n G?: boolean;\n H?: boolean;\n I?: boolean;\n J?: boolean;\n K?: boolean;\n L?: boolean;\n M?: boolean;\n N?: boolean;\n O?: boolean;\n P?: boolean;\n Q?: boolean;\n R?: boolean;\n S?: boolean;\n T?: boolean;\n U?: boolean;\n V?: boolean;\n W?: boolean;\n X?: boolean;\n Y?: boolean;\n Z?: boolean;\n right?: boolean;\n left?: boolean;\n up?: boolean;\n down?: boolean;\n fire?: boolean;\n}\n\nexport interface Testbed {\n /** @private @internal */ _pause: any;\n /** @private @internal */ _resume: any;\n /** @private @internal */ _status: any;\n /** @private @internal */ _info: any;\n\n /** @private @internal */ resume: any;\n /** @private @internal */ pause: any;\n /** @private @internal */ isPaused: any;\n /** @private @internal */ togglePause: any;\n /** @private @internal */ canvas: any;\n /** @private @internal */ focus: () => void;\n\n // camera position\n /** World viewbox width. */\n width: number;\n /** World viewbox height. */\n height: number;\n /** World viewbox center vertical offset. */\n x: number;\n /** World viewbox center horizontal offset. */\n y: number;\n\n scaleY: number;\n ratio: number;\n\n /** World simulation step frequency */\n hz: number;\n /** World simulation speed, default is 1 */\n speed: number;\n\n activeKeys: ActiveKeys;\n background: string;\n\n mouseForce?: number;\n\n status(name: string, value: any): void;\n status(value: object | string): void;\n info(text: string): void;\n\n drawPoint(p: {x: number, y: number}, r: any, color: string): void;\n drawCircle(p: {x: number, y: number}, r: number, color: string): void;\n drawSegment(a: {x: number, y: number}, b: {x: number, y: number}, color: string): void;\n drawPolygon(points: Array<{x: number, y: number}>, color: string): void;\n drawAABB(aabb: AABB, color: string): void;\n color(r: number, g: number, b: number): string;\n\n // callbacks\n step?: (dt: number, t: number) => void;\n keydown?: (keyCode: number, label: string) => void;\n keyup?: (keyCode: number, label: string) => void;\n\n findOne: (query: string) => Body | Joint | Fixture | null;\n findAll: (query: string) => Body[] | Joint[] | Fixture[];\n}\n\nexport function testbed(opts: object, callback: (testbed: Testbed) => World);\nexport function testbed(callback: (testbed: Testbed) => World);\nexport function testbed(opts, callback?) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = null;\n }\n\n (function() {\n const stage = Stage.mount();\n const canvas = stage.dom;\n stage.on(Stage.Mouse.START, function() {\n window.focus();\n // @ts-ignore\n document.activeElement && document.activeElement.blur();\n canvas.focus();\n });\n\n (stage as any).MAX_ELAPSE = 1000 / 30;\n\n // @ts-ignore\n const testbed: Testbed = {};\n testbed.canvas = canvas;\n\n let paused = false;\n stage.on('resume', function() {\n paused = false;\n testbed._resume && testbed._resume();\n });\n stage.on('pause', function() {\n paused = true;\n testbed._pause && testbed._pause();\n });\n testbed.isPaused = function() {\n return paused;\n };\n testbed.togglePause = function() {\n paused ? testbed.resume() : testbed.pause();\n };\n testbed.pause = function() {\n // @ts-ignore\n stage.pause();\n };\n testbed.resume = function() {\n // @ts-ignore\n stage.resume();\n testbed.focus();\n };\n testbed.focus = function() {\n // @ts-ignore\n document.activeElement && document.activeElement.blur();\n canvas.focus();\n };\n\n testbed.width = 80;\n testbed.height = 60;\n testbed.x = 0;\n testbed.y = -10;\n testbed.scaleY = -1;\n testbed.ratio = 16;\n testbed.hz = 60;\n testbed.speed = 1;\n testbed.activeKeys = {};\n testbed.background = '#222222';\n\n testbed.findOne = function() {\n // todo: implement\n return null;\n };\n\n testbed.findAll = function() {\n // todo: implement\n return [];\n };\n\n let statusText = '';\n const statusMap = {};\n\n function statusSet(name, value) {\n if (typeof value !== 'function' && typeof value !== 'object') {\n statusMap[name] = value;\n }\n }\n\n function statusMerge(obj) {\n // tslint:disable-next-line:no-for-in\n for (const key in obj) {\n statusSet(key, obj[key]);\n }\n }\n\n testbed.status = function(a, b?) {\n if (typeof b !== 'undefined') {\n statusSet(a, b);\n } else if (a && typeof a === 'object') {\n statusMerge(a);\n } else if (typeof a === 'string') {\n statusText = a;\n }\n\n testbed._status && testbed._status(statusText, statusMap);\n };\n\n testbed.info = function(text) {\n testbed._info && testbed._info(text);\n };\n\n let lastDrawHash = \"\";\n let drawHash = \"\";\n\n (function() {\n const drawingTexture = new Stage.Texture();\n stage.append(Stage.image(drawingTexture));\n\n const buffer = [];\n stage.tick(function() {\n buffer.length = 0;\n }, true);\n\n drawingTexture.draw = function(ctx) {\n ctx.save();\n ctx.transform(1, 0, 0, testbed.scaleY, -testbed.x, -testbed.y);\n ctx.lineWidth = 2 / testbed.ratio;\n ctx.lineCap = 'round';\n for (let drawing = buffer.shift(); drawing; drawing = buffer.shift()) {\n drawing(ctx, testbed.ratio);\n }\n ctx.restore();\n };\n\n testbed.drawPoint = function(p, r, color) {\n buffer.push(function(ctx, ratio) {\n ctx.beginPath();\n ctx.arc(p.x, p.y, 5 / ratio, 0, 2 * Math.PI);\n ctx.strokeStyle = color;\n ctx.stroke();\n });\n drawHash += \"point\" + p.x + ',' + p.y + ',' + r + ',' + color;\n };\n\n testbed.drawCircle = function(p, r, color) {\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.arc(p.x, p.y, r, 0, 2 * Math.PI);\n ctx.strokeStyle = color;\n ctx.stroke();\n });\n drawHash += \"circle\" + p.x + ',' + p.y + ',' + r + ',' + color;\n };\n\n testbed.drawSegment = function(a, b, color) {\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(b.x, b.y);\n ctx.strokeStyle = color;\n ctx.stroke();\n });\n drawHash += \"segment\" + a.x + ',' + a.y + ',' + b.x + ',' + b.y + ',' + color;\n };\n\n testbed.drawPolygon = function(points, color) {\n if (!points || !points.length) {\n return;\n }\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y);\n }\n ctx.strokeStyle = color;\n ctx.closePath();\n ctx.stroke();\n });\n drawHash += \"segment\";\n for (let i = 1; i < points.length; i++) {\n drawHash += points[i].x + ',' + points[i].y + ',';\n }\n drawHash += color;\n };\n\n testbed.drawAABB = function(aabb, color) {\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.moveTo(aabb.lowerBound.x, aabb.lowerBound.y);\n ctx.lineTo(aabb.upperBound.x, aabb.lowerBound.y);\n ctx.lineTo(aabb.upperBound.x, aabb.upperBound.y);\n ctx.lineTo(aabb.lowerBound.x, aabb.upperBound.y);\n ctx.strokeStyle = color;\n ctx.closePath();\n ctx.stroke();\n });\n drawHash += \"aabb\";\n drawHash += aabb.lowerBound.x + ',' + aabb.lowerBound.y + ',';\n drawHash += aabb.upperBound.x + ',' + aabb.upperBound.y + ',';\n drawHash += color;\n };\n\n testbed.color = function(r, g, b) {\n r = r * 256 | 0;\n g = g * 256 | 0;\n b = b * 256 | 0;\n return 'rgb(' + r + ', ' + g + ', ' + b + ')';\n };\n\n })();\n\n const world = callback(testbed);\n\n const viewer = new Viewer(world, testbed);\n\n let lastX = 0;\n let lastY = 0;\n stage.tick(function(dt, t) {\n // update camera position\n if (lastX !== testbed.x || lastY !== testbed.y) {\n viewer.offset(-testbed.x, -testbed.y);\n lastX = testbed.x;\n lastY = testbed.y;\n }\n });\n\n viewer.tick(function(dt, t) {\n // call testbed step, if provided\n if (typeof testbed.step === 'function') {\n testbed.step(dt, t);\n }\n\n if (targetBody) {\n testbed.drawSegment(targetBody.getPosition(), mouseMove, 'rgba(255,255,255,0.2)');\n }\n\n if (lastDrawHash !== drawHash) {\n lastDrawHash = drawHash;\n stage.touch();\n }\n drawHash = \"\";\n\n return true;\n });\n\n // stage.empty();\n stage.background(testbed.background);\n stage.viewbox(testbed.width, testbed.height);\n stage.pin('alignX', -0.5);\n stage.pin('alignY', -0.5);\n stage.prepend(viewer);\n\n function findBody(point) {\n let body;\n const aabb = new AABB(point, point);\n world.queryAABB(aabb, function(fixture) {\n if (body) {\n return;\n }\n if (!fixture.getBody().isDynamic() || !fixture.testPoint(point)) {\n return;\n }\n body = fixture.getBody();\n return true;\n });\n return body;\n }\n\n const mouseGround = world.createBody();\n let mouseJoint;\n\n let targetBody;\n const mouseMove = {x: 0, y: 0};\n\n viewer.attr('spy', true).on(Stage.Mouse.START, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (targetBody) {\n return;\n }\n\n const body = findBody(point);\n if (!body) {\n return;\n }\n\n if (testbed.mouseForce) {\n targetBody = body;\n\n } else {\n mouseJoint = new MouseJoint({maxForce: 1000}, mouseGround, body, Vec2.clone(point));\n world.createJoint(mouseJoint);\n }\n\n }).on(Stage.Mouse.MOVE, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (mouseJoint) {\n mouseJoint.setTarget(point);\n }\n\n mouseMove.x = point.x;\n mouseMove.y = point.y;\n }).on(Stage.Mouse.END, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (mouseJoint) {\n world.destroyJoint(mouseJoint);\n mouseJoint = null;\n }\n if (targetBody) {\n const force = Vec2.sub(point, targetBody.getPosition());\n targetBody.applyForceToCenter(force.mul(testbed.mouseForce), true);\n targetBody = null;\n }\n\n }).on(Stage.Mouse.CANCEL, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (mouseJoint) {\n world.destroyJoint(mouseJoint);\n mouseJoint = null;\n }\n if (targetBody) {\n targetBody = null;\n }\n });\n\n window.addEventListener(\"keydown\", function(e) {\n switch (e.keyCode) {\n case 'P'.charCodeAt(0):\n testbed.togglePause();\n break;\n }\n }, false);\n\n const downKeys = {};\n window.addEventListener(\"keydown\", function(e) {\n const keyCode = e.keyCode;\n downKeys[keyCode] = true;\n updateActiveKeys(keyCode, true);\n testbed.keydown && testbed.keydown(keyCode, String.fromCharCode(keyCode));\n });\n window.addEventListener(\"keyup\", function(e) {\n const keyCode = e.keyCode;\n downKeys[keyCode] = false;\n updateActiveKeys(keyCode, false);\n testbed.keyup && testbed.keyup(keyCode, String.fromCharCode(keyCode));\n });\n\n const activeKeys = testbed.activeKeys;\n function updateActiveKeys(keyCode, down) {\n const char = String.fromCharCode(keyCode);\n if (/\\w/.test(char)) {\n activeKeys[char] = down;\n }\n activeKeys.right = downKeys[39] || activeKeys['D'];\n activeKeys.left = downKeys[37] || activeKeys['A'];\n activeKeys.up = downKeys[38] || activeKeys['W'];\n activeKeys.down = downKeys[40] || activeKeys['S'];\n activeKeys.fire = downKeys[32] || downKeys[13] ;\n }\n })();\n}\n\nViewer._super = Stage.Node;\nViewer.prototype = Object.create(Viewer._super.prototype);\n\nfunction Viewer(world, opts) {\n Viewer._super.call(this);\n this.label('Planck');\n\n opts = opts || {};\n\n this._options = {};\n this._options.speed = opts.speed || 1;\n this._options.hz = opts.hz || 60;\n if (Math.abs(this._options.hz) < 1) {\n this._options.hz = 1 / this._options.hz;\n }\n this._options.scaleY = opts.scaleY || -1;\n this._options.ratio = opts.ratio || 16;\n this._options.lineWidth = 2 / this._options.ratio;\n\n this._world = world;\n\n const timeStep = 1 / this._options.hz;\n let elapsedTime = 0;\n this.tick((dt) => {\n dt = dt * 0.001 * this._options.speed;\n elapsedTime += dt;\n while (elapsedTime > timeStep) {\n world.step(timeStep);\n elapsedTime -= timeStep;\n }\n this.renderWorld();\n return true;\n }, true);\n\n world.on('remove-fixture', function(obj) {\n obj.ui && obj.ui.remove();\n });\n\n world.on('remove-joint', function(obj) {\n obj.ui && obj.ui.remove();\n });\n}\n\nViewer.prototype.renderWorld = function() {\n const world = this._world;\n const options = this._options;\n const viewer = this;\n\n for (let b = world.getBodyList(); b; b = b.getNext()) {\n for (let f = b.getFixtureList(); f; f = f.getNext()) {\n\n if (!f.ui) {\n if (f.render && f.render.stroke) {\n options.strokeStyle = f.render.stroke;\n } else if (b.render && b.render.stroke) {\n options.strokeStyle = b.render.stroke;\n } else if (b.isDynamic()) {\n options.strokeStyle = 'rgba(255,255,255,0.9)';\n } else if (b.isKinematic()) {\n options.strokeStyle = 'rgba(255,255,255,0.7)';\n } else if (b.isStatic()) {\n options.strokeStyle = 'rgba(255,255,255,0.5)';\n }\n\n if (f.render && f.render.fill) {\n options.fillStyle = f.render.fill;\n } else if (b.render && b.render.fill) {\n options.fillStyle = b.render.fill;\n } else {\n options.fillStyle = '';\n }\n\n const type = f.getType();\n const shape = f.getShape();\n if (type == 'circle') {\n f.ui = viewer.drawCircle(shape, options);\n }\n if (type == 'edge') {\n f.ui = viewer.drawEdge(shape, options);\n }\n if (type == 'polygon') {\n f.ui = viewer.drawPolygon(shape, options);\n }\n if (type == 'chain') {\n f.ui = viewer.drawChain(shape, options);\n }\n\n if (f.ui) {\n f.ui.appendTo(viewer);\n }\n }\n\n if (f.ui) {\n const p = b.getPosition();\n const r = b.getAngle();\n if (f.ui.__lastX !== p.x || f.ui.__lastY !== p.y || f.ui.__lastR !== r) {\n f.ui.__lastX = p.x;\n f.ui.__lastY = p.y;\n f.ui.__lastR = r;\n f.ui.offset(p.x, options.scaleY * p.y);\n f.ui.rotate(options.scaleY * r);\n }\n }\n\n }\n }\n\n for (let j = world.getJointList(); j; j = j.getNext()) {\n const type = j.getType();\n const a = j.getAnchorA();\n const b = j.getAnchorB();\n\n if (!j.ui) {\n options.strokeStyle = 'rgba(255,255,255,0.2)';\n\n j.ui = viewer.drawJoint(j, options);\n j.ui.pin('handle', 0.5);\n if (j.ui) {\n j.ui.appendTo(viewer);\n }\n }\n\n if (j.ui) {\n const cx = (a.x + b.x) * 0.5;\n const cy = options.scaleY * (a.y + b.y) * 0.5;\n const dx = a.x - b.x;\n const dy = options.scaleY * (a.y - b.y);\n const d = Math.sqrt(dx * dx + dy * dy);\n j.ui.width(d);\n j.ui.rotate(Math.atan2(dy, dx));\n j.ui.offset(cx, cy);\n }\n }\n\n};\n\nViewer.prototype.drawJoint = function(joint, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const length = 10;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(length + 2 * lw, 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n ctx.moveTo(lw, lw);\n ctx.lineTo(lw + length, lw);\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const image = Stage.image(texture).stretch();\n return image;\n};\n\nViewer.prototype.drawCircle = function(shape, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const r = shape.m_radius;\n const cx = r + lw;\n const cy = r + lw;\n const w = r * 2 + lw * 2;\n const h = r * 2 + lw * 2;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(w, h, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.arc(cx, cy, r, 0, 2 * Math.PI);\n if (options.fillStyle) {\n ctx.fillStyle = options.fillStyle;\n ctx.fill();\n }\n ctx.lineTo(cx, cy);\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n const image = Stage.image(texture)\n .offset(shape.m_p.x - cx, options.scaleY * shape.m_p.y - cy);\n const node = Stage.create().append(image);\n return node;\n};\n\nViewer.prototype.drawEdge = function(edge, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const v1 = edge.m_vertex1;\n const v2 = edge.m_vertex2;\n\n const dx = v2.x - v1.x;\n const dy = v2.y - v1.y;\n\n const length = Math.sqrt(dx * dx + dy * dy);\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(length + 2 * lw, 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n ctx.moveTo(lw, lw);\n ctx.lineTo(lw + length, lw);\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const minX = Math.min(v1.x, v2.x);\n const minY = Math.min(options.scaleY * v1.y, options.scaleY * v2.y);\n\n const image = Stage.image(texture);\n image.rotate(options.scaleY * Math.atan2(dy, dx));\n image.offset(minX - lw, minY - lw);\n const node = Stage.create().append(image);\n return node;\n};\n\nViewer.prototype.drawPolygon = function(shape, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const vertices = shape.m_vertices;\n\n if (!vertices.length) {\n return;\n }\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, options.scaleY * v.y);\n maxY = Math.max(maxY, options.scaleY * v.y);\n }\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(width + 2 * lw, height + 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n const x = v.x - minX + lw;\n const y = options.scaleY * v.y - minY + lw;\n if (i == 0)\n ctx.moveTo(x, y);\n else\n ctx.lineTo(x, y);\n }\n\n if (vertices.length > 2) {\n ctx.closePath();\n }\n\n if (options.fillStyle) {\n ctx.fillStyle = options.fillStyle;\n ctx.fill();\n ctx.closePath();\n }\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const image = Stage.image(texture);\n image.offset(minX - lw, minY - lw);\n const node = Stage.create().append(image);\n return node;\n};\n\nViewer.prototype.drawChain = function(shape, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const vertices = shape.m_vertices;\n\n if (!vertices.length) {\n return;\n }\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, options.scaleY * v.y);\n maxY = Math.max(maxY, options.scaleY * v.y);\n }\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(width + 2 * lw, height + 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n const x = v.x - minX + lw;\n const y = options.scaleY * v.y - minY + lw;\n if (i == 0)\n ctx.moveTo(x, y);\n else\n ctx.lineTo(x, y);\n }\n\n // TODO: if loop\n if (vertices.length > 2) {\n // ctx.closePath();\n }\n\n if (options.fillStyle) {\n ctx.fillStyle = options.fillStyle;\n ctx.fill();\n ctx.closePath();\n }\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const image = Stage.image(texture);\n image.offset(minX - lw, minY - lw);\n const node = Stage.create().append(image);\n return node;\n};\n"],"names":["stats","math","Math","DEFAULTS","inactiveLimit","atLowerLimit","atUpperLimit","equalLimits","Stage"],"mappings":"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CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACxC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACp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AAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAClC,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAClC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACxC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACxC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACf,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACf,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACf,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACf,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACf,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACf,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CA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A,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA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AA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAA;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,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"} \ No newline at end of file diff --git a/dist/planck-with-testbed.min.js b/dist/planck-with-testbed.min.js index adf4badf..0af0924a 100644 --- a/dist/planck-with-testbed.min.js +++ b/dist/planck-with-testbed.min.js @@ -1,5 +1,5 @@ /** - * Planck.js v1.0.0-alpha.4 + * Planck.js v1.0.0-beta.0 * @license The MIT license * @copyright Copyright (c) 2021 Erin Catto, Ali Shakiba * @@ -21,19 +21,19 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).planck={})}(this,(function(t){"use strict"; +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).planck={})}(this,(function(t){"use strict";var e=Object.defineProperty,i=(t,i,s)=>(((t,i,s)=>{i in t?e(t,i,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[i]=s})(t,"symbol"!=typeof i?i+"":i,s),s);const s={create:0,tick:0,node:0,draw:0,fps:0};class o{constructor(t,e,i,s,o,n){this.reset(t,e,i,s,o,n)}toString(){return"["+this.a+", "+this.b+", "+this.c+", "+this.d+", "+this.e+", "+this.f+"]"}clone(){return new o(this.a,this.b,this.c,this.d,this.e,this.f)}reset(t,e,i,s,o,n){return this._dirty=!0,"object"==typeof t?(this.a=t.a,this.d=t.d,this.b=t.b,this.c=t.c,this.e=t.e,this.f=t.f):(this.a=t||1,this.d=s||1,this.b=e||0,this.c=i||0,this.e=o||0,this.f=n||0),this}identity(){return this._dirty=!0,this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,this}rotate(t){if(!t)return this;this._dirty=!0;var e=t?Math.cos(t):1,i=t?Math.sin(t):0,s=e*this.a-i*this.b,o=e*this.b+i*this.a,n=e*this.c-i*this.d,r=e*this.d+i*this.c,a=e*this.e-i*this.f,h=e*this.f+i*this.e;return this.a=s,this.b=o,this.c=n,this.d=r,this.e=a,this.f=h,this}translate(t,e){return t||e?(this._dirty=!0,this.e+=t,this.f+=e,this):this}scale(t,e){return t-1||e-1?(this._dirty=!0,this.a*=t,this.b*=e,this.c*=t,this.d*=e,this.e*=t,this.f*=e,this):this}skew(t,e){if(!t&&!e)return this;this._dirty=!0;var i=this.a+this.b*t,s=this.b+this.a*e,o=this.c+this.d*t,n=this.d+this.c*e,r=this.e+this.f*t,a=this.f+this.e*e;return this.a=i,this.b=s,this.c=o,this.d=n,this.e=r,this.f=a,this}concat(t){this._dirty=!0;var e=this,i=e.a*t.a+e.b*t.c,s=e.b*t.d+e.a*t.b,o=e.c*t.a+e.d*t.c,n=e.d*t.d+e.c*t.b,r=e.e*t.a+t.e+e.f*t.c,a=e.f*t.d+t.f+e.e*t.b;return this.a=i,this.b=s,this.c=o,this.d=n,this.e=r,this.f=a,this}inverse(){if(this._dirty){this._dirty=!1,this.inverted=this.inverted||new o;var t=this.a*this.d-this.b*this.c;this.inverted.a=this.d/t,this.inverted.b=-this.b/t,this.inverted.c=-this.c/t,this.inverted.d=this.a/t,this.inverted.e=(this.c*this.f-this.e*this.d)/t,this.inverted.f=(this.e*this.b-this.a*this.f)/t}return this.inverted}map(t,e){return(e=e||{}).x=this.a*t.x+this.c*t.y+this.e,e.y=this.b*t.x+this.d*t.y+this.f,e}mapX(t,e){return"object"==typeof t&&(e=t.y,t=t.x),this.a*t+this.c*e+this.e}mapY(t,e){return"object"==typeof t&&(e=t.y,t=t.x),this.b*t+this.d*e+this.f}}var n=0;function r(t){this._owner=t,this._parent=null,this._relativeMatrix=new o,this._absoluteMatrix=new o,this.reset()}r.prototype.reset=function(){this._textureAlpha=1,this._alpha=1,this._width=0,this._height=0,this._scaleX=1,this._scaleY=1,this._skewX=0,this._skewY=0,this._rotation=0,this._pivoted=!1,this._pivotX=null,this._pivotY=null,this._handled=!1,this._handleX=0,this._handleY=0,this._aligned=!1,this._alignX=0,this._alignY=0,this._offsetX=0,this._offsetY=0,this._boxX=0,this._boxY=0,this._boxWidth=this._width,this._boxHeight=this._height,this._ts_translate=++n,this._ts_transform=++n,this._ts_matrix=++n},r.prototype._update=function(){return this._parent=this._owner._parent&&this._owner._parent._pin,this._handled&&this._mo_handle!=this._ts_transform&&(this._mo_handle=this._ts_transform,this._ts_translate=++n),this._aligned&&this._parent&&this._mo_align!=this._parent._ts_transform&&(this._mo_align=this._parent._ts_transform,this._ts_translate=++n),this},r.prototype.toString=function(){return this._owner+" ("+(this._parent?this._parent._owner:null)+")"},r.prototype.absoluteMatrix=function(){this._update();var t=Math.max(this._ts_transform,this._ts_translate,this._parent?this._parent._ts_matrix:0);if(this._mo_abs==t)return this._absoluteMatrix;this._mo_abs=t;var e=this._absoluteMatrix;return e.reset(this.relativeMatrix()),this._parent&&e.concat(this._parent._absoluteMatrix),this._ts_matrix=++n,e},r.prototype.relativeMatrix=function(){this._update();var t=Math.max(this._ts_transform,this._ts_translate,this._parent?this._parent._ts_transform:0);if(this._mo_rel==t)return this._relativeMatrix;this._mo_rel=t;var e,i,s=this._relativeMatrix;(s.identity(),this._pivoted&&s.translate(-this._pivotX*this._width,-this._pivotY*this._height),s.scale(this._scaleX,this._scaleY),s.skew(this._skewX,this._skewY),s.rotate(this._rotation),this._pivoted&&s.translate(this._pivotX*this._width,this._pivotY*this._height),this._pivoted)?(this._boxX=0,this._boxY=0,this._boxWidth=this._width,this._boxHeight=this._height):(s.a>0&&s.c>0||s.a<0&&s.c<0?(e=0,i=s.a*this._width+s.c*this._height):(e=s.a*this._width,i=s.c*this._height),e>i?(this._boxX=i,this._boxWidth=e-i):(this._boxX=e,this._boxWidth=i-e),s.b>0&&s.d>0||s.b<0&&s.d<0?(e=0,i=s.b*this._width+s.d*this._height):(e=s.b*this._width,i=s.d*this._height),e>i?(this._boxY=i,this._boxHeight=e-i):(this._boxY=e,this._boxHeight=i-e));return this._x=this._offsetX,this._y=this._offsetY,this._x-=this._boxX+this._handleX*this._boxWidth,this._y-=this._boxY+this._handleY*this._boxHeight,this._aligned&&this._parent&&(this._parent.relativeMatrix(),this._x+=this._alignX*this._parent._width,this._y+=this._alignY*this._parent._height),s.translate(this._x,this._y),this._relativeMatrix},r.prototype.get=function(t){if("function"==typeof a[t])return a[t](this)},r.prototype.set=function(t,e){if("string"==typeof t)"function"==typeof h[t]&&void 0!==e&&h[t](this,e);else if("object"==typeof t)for(e in t)"function"==typeof h[e]&&void 0!==t[e]&&h[e](this,t[e],t);return this._owner&&(this._owner._ts_pin=++n,this._owner.touch()),this};var a={alpha:function(t){return t._alpha},textureAlpha:function(t){return t._textureAlpha},width:function(t){return t._width},height:function(t){return t._height},boxWidth:function(t){return t._boxWidth},boxHeight:function(t){return t._boxHeight},scaleX:function(t){return t._scaleX},scaleY:function(t){return t._scaleY},skewX:function(t){return t._skewX},skewY:function(t){return t._skewY},rotation:function(t){return t._rotation},pivotX:function(t){return t._pivotX},pivotY:function(t){return t._pivotY},offsetX:function(t){return t._offsetX},offsetY:function(t){return t._offsetY},alignX:function(t){return t._alignX},alignY:function(t){return t._alignY},handleX:function(t){return t._handleX},handleY:function(t){return t._handleY}},h={alpha:function(t,e){t._alpha=e},textureAlpha:function(t,e){t._textureAlpha=e},width:function(t,e){t._width_=e,t._width=e,t._ts_transform=++n},height:function(t,e){t._height_=e,t._height=e,t._ts_transform=++n},scale:function(t,e){t._scaleX=e,t._scaleY=e,t._ts_transform=++n},scaleX:function(t,e){t._scaleX=e,t._ts_transform=++n},scaleY:function(t,e){t._scaleY=e,t._ts_transform=++n},skew:function(t,e){t._skewX=e,t._skewY=e,t._ts_transform=++n},skewX:function(t,e){t._skewX=e,t._ts_transform=++n},skewY:function(t,e){t._skewY=e,t._ts_transform=++n},rotation:function(t,e){t._rotation=e,t._ts_transform=++n},pivot:function(t,e){t._pivotX=e,t._pivotY=e,t._pivoted=!0,t._ts_transform=++n},pivotX:function(t,e){t._pivotX=e,t._pivoted=!0,t._ts_transform=++n},pivotY:function(t,e){t._pivotY=e,t._pivoted=!0,t._ts_transform=++n},offset:function(t,e){t._offsetX=e,t._offsetY=e,t._ts_translate=++n},offsetX:function(t,e){t._offsetX=e,t._ts_translate=++n},offsetY:function(t,e){t._offsetY=e,t._ts_translate=++n},align:function(t,e){this.alignX(t,e),this.alignY(t,e)},alignX:function(t,e){t._alignX=e,t._aligned=!0,t._ts_translate=++n,this.handleX(t,e)},alignY:function(t,e){t._alignY=e,t._aligned=!0,t._ts_translate=++n,this.handleY(t,e)},handle:function(t,e){this.handleX(t,e),this.handleY(t,e)},handleX:function(t,e){t._handleX=e,t._handled=!0,t._ts_translate=++n},handleY:function(t,e){t._handleY=e,t._handled=!0,t._ts_translate=++n},resizeMode:function(t,e,i){i&&("in"==e?e="in-pad":"out"==e&&(e="out-crop"),c(t,i.resizeWidth,i.resizeHeight,e))},resizeWidth:function(t,e,i){i&&i.resizeMode||c(t,e,null)},resizeHeight:function(t,e,i){i&&i.resizeMode||c(t,null,e)},scaleMode:function(t,e,i){i&&c(t,i.scaleWidth,i.scaleHeight,e)},scaleWidth:function(t,e,i){i&&i.scaleMode||c(t,e,null)},scaleHeight:function(t,e,i){i&&i.scaleMode||c(t,null,e)},matrix:function(t,e){this.scaleX(t,e.a),this.skewX(t,e.c/e.d),this.skewY(t,e.b/e.a),this.scaleY(t,e.d),this.offsetX(t,e.e),this.offsetY(t,e.f),this.rotation(t,0)}};function c(t,e,i,s){var o="number"==typeof e,r="number"==typeof i,a="string"==typeof s;t._ts_transform=++n,o&&(t._scaleX=e/t._width_,t._width=t._width_),r&&(t._scaleY=i/t._height_,t._height=t._height_),o&&r&&a&&("out"==s||"out-crop"==s?t._scaleX=t._scaleY=Math.max(t._scaleX,t._scaleY):"in"!=s&&"in-pad"!=s||(t._scaleX=t._scaleY=Math.min(t._scaleX,t._scaleY)),"out-crop"!=s&&"in-pad"!=s||(t._width=e/t._scaleX,t._height=i/t._scaleY))}r.prototype.scaleTo=function(t,e,i){c(this,t,e,i)},r._add_shortcuts=function(t){t.size=function(t,e){return this.pin("width",t),this.pin("height",e),this},t.width=function(t){return void 0===t?this.pin("width"):(this.pin("width",t),this)},t.height=function(t){return void 0===t?this.pin("height"):(this.pin("height",t),this)},t.offset=function(t,e){return"object"==typeof t&&(e=t.y,t=t.x),this.pin("offsetX",t),this.pin("offsetY",e),this},t.rotate=function(t){return this.pin("rotation",t),this},t.skew=function(t,e){return"object"==typeof t?(e=t.y,t=t.x):void 0===e&&(e=t),this.pin("skewX",t),this.pin("skewY",e),this},t.scale=function(t,e){return"object"==typeof t?(e=t.y,t=t.x):void 0===e&&(e=t),this.pin("scaleX",t),this.pin("scaleY",e),this},t.alpha=function(t,e){return this.pin("alpha",t),void 0!==e&&this.pin("textureAlpha",e),this}};var m=0;function _(t){if(t&&t instanceof u)return t;throw"Invalid node: "+t}s.create=0;const l=function(){return new u};function u(){s.create++,this._pin=new r(this)}function p(t,e){_(e),_(t),e.remove(),t._last&&(t._last._next=e,e._prev=t._last),e._parent=t,t._last=e,t._first||(t._first=e),e._parent._flag(e,!0),e._ts_parent=++m,t._ts_children=++m,t.touch()}function d(t,e){_(e),_(t),e.remove(),t._first&&(t._first._prev=e,e._next=t._first),e._parent=t,t._first=e,t._last||(t._last=e),e._parent._flag(e,!0),e._ts_parent=++m,t._ts_children=++m,t.touch()}function y(t,e){_(t),_(e),t.remove();var i=e._parent,s=e._prev;e._prev=t,s&&(s._next=t)||i&&(i._first=t),t._parent=i,t._prev=s,t._next=e,t._parent._flag(t,!0),t._ts_parent=++m,t.touch()}function f(t,e){_(t),_(e),t.remove();var i=e._parent,s=e._next;e._next=t,s&&(s._prev=t)||i&&(i._last=t),t._parent=i,t._prev=e,t._next=s,t._parent._flag(t,!0),t._ts_parent=++m,t.touch()}u.prototype.matrix=function(t){return!0===t?this._pin.relativeMatrix():this._pin.absoluteMatrix()},u.prototype.pin=function(t,e){return"object"==typeof t?(this._pin.set(t),this):"string"==typeof t?void 0===e?this._pin.get(t):(this._pin.set(t,e),this):void 0===t?this._pin:void 0},u.prototype.scaleTo=function(t,e,i){return"object"==typeof t&&(i=e,e=t.y,t=t.x),this._pin.scaleTo(t,e,i),this},r._add_shortcuts(u.prototype),u.prototype._label="",u.prototype._visible=!0,u.prototype._parent=null,u.prototype._next=null,u.prototype._prev=null,u.prototype._first=null,u.prototype._last=null,u.prototype._attrs=null,u.prototype._flags=null,u.prototype.toString=function(){return"["+this._label+"]"},u.prototype.id=function(t){return this.label(t)},u.prototype.label=function(t){return void 0===t?this._label:(this._label=t,this)},u.prototype.attr=function(t,e){return void 0===e?null!==this._attrs?this._attrs[t]:void 0:((null!==this._attrs?this._attrs:this._attrs={})[t]=e,this)},u.prototype.visible=function(t){return void 0===t?this._visible:(this._visible=t,this._parent&&(this._parent._ts_children=++m),this._ts_pin=++m,this.touch(),this)},u.prototype.hide=function(){return this.visible(!1)},u.prototype.show=function(){return this.visible(!0)},u.prototype.parent=function(){return this._parent},u.prototype.next=function(t){for(var e=this._next;e&&t&&!e._visible;)e=e._next;return e},u.prototype.prev=function(t){for(var e=this._prev;e&&t&&!e._visible;)e=e._prev;return e},u.prototype.first=function(t){for(var e=this._first;e&&t&&!e._visible;)e=e._next;return e},u.prototype.last=function(t){for(var e=this._last;e&&t&&!e._visible;)e=e._prev;return e},u.prototype.visit=function(t,e){var i=t.reverse,s=t.visible;if(!t.start||!t.start(this,e)){for(var o,n=i?this.last(s):this.first(s);o=n;)if(n=i?o.prev(s):o.next(s),o.visit(t,e))return!0;return t.end&&t.end(this,e)}},u.prototype.append=function(t,e){if(Array.isArray(t))for(var i=0;i=0;i--)d(this,t[i]);else if(void 0!==e)for(i=arguments.length-1;i>=0;i--)d(this,arguments[i]);else void 0!==t&&d(this,t);return this},u.prototype.appendTo=function(t){return p(t,this),this},u.prototype.prependTo=function(t){return d(t,this),this},u.prototype.insertNext=function(t,e){if(Array.isArray(t))for(var i=0;i=0;i--)y(t[i],this);else if(void 0!==e)for(i=arguments.length-1;i>=0;i--)y(arguments[i],this);else void 0!==t&&y(t,this);return this},u.prototype.insertAfter=function(t){return f(this,t),this},u.prototype.insertBefore=function(t){return y(this,t),this},u.prototype.remove=function(t,e){if(void 0!==t){if(Array.isArray(t))for(var i=0;i0&&(1==this._flags[t]&&this._parent&&this._parent._flag(t,!1),this._flags[t]=this._flags[t]-1)),"object"==typeof t&&t._flags)for(var i in t._flags)t._flags[i]>0&&this._flag(i,e);return this},u.prototype.hitTest=function(t){var e=this._pin._width,i=this._pin._height;return t.x>=0&&t.x<=e&&t.y>=0&&t.y<=i},u.prototype._textures=null,u.prototype._alpha=1,u.prototype.render=function(t){if(this._visible){s.node++;var e=this.matrix();t.setTransform(e.a,e.b,e.c,e.d,e.e,e.f),this._alpha=this._pin._alpha*(this._parent?this._parent._alpha:1);var i=this._pin._textureAlpha*this._alpha;if(t.globalAlpha!=i&&(t.globalAlpha=i),null!==this._textures)for(var o=0,n=this._textures.length;othis.MAX_ELAPSE&&(t=this.MAX_ELAPSE);var o=!1;if(null!==this._tickBefore)for(var n=0;n0||null!==this._tickBefore&&this._tickBefore.length>0))},u.prototype.untick=function(t){var e;"function"==typeof t&&(null!==this._tickBefore&&(e=this._tickBefore.indexOf(t))>=0&&this._tickBefore.splice(e,1),null!==this._tickAfter&&(e=this._tickAfter.indexOf(t))>=0&&this._tickAfter.splice(e,1))},u.prototype.timeout=function(t,e){this.setTimeout(t,e)},u.prototype.setTimeout=function(t,e){function i(s){if(!((e-=s)<0))return!0;this.untick(i),t.call(this)}return this.tick(i),i},u.prototype.clearTimeout=function(t){this.untick(t)},u.prototype._listeners=null,u.prototype._event_callback=function(t,e){this._flag(t,e)},u.prototype.on=function(t,e){if(!t||!t.length||"function"!=typeof e)return this;if(null===this._listeners&&(this._listeners={}),t=("string"!=typeof t&&"function"==typeof t.join?t.join(" "):t).match(/\S+/g))for(var i=0;i=0&&(n.splice(s,1),n.length||delete this._listeners[o],"function"==typeof this._event_callback&&this._event_callback(o,!1))}return this},u.prototype.listeners=function(t){return this._listeners&&this._listeners[t]},u.prototype.publish=function(t,e){var i=this.listeners(t);if(!i||!i.length)return 0;for(var s=0;se?(t=(t-e)%(i-e))+(t<0?i:e):(t=(t-i)%(e-i))+(t<=0?e:i)},x.clamp=function(t,e,i){return ti?i:t},x.length=function(t,e){return v.sqrt(t*t+e*e)},x.rotate=x.wrap,x.limit=x.clamp;const g=function(t){var e=Object.prototype.toString.call(t);return"[object Function]"===e||"[object GeneratorFunction]"===e||"[object AsyncFunction]"===e},b=function(t){return"[object Object]"===Object.prototype.toString.call(t)&&t.constructor===Object};class A{constructor(t,e){"object"==typeof t&&this.src(t,e)}pipe(){return new A(this)}src(t,e,i,s){if("object"==typeof t){var o=t,n=e||1;this._image=o,this._sx=this._dx=0,this._sy=this._dy=0,this._sw=this._dw=o.width/n,this._sh=this._dh=o.height/n,this.width=o.width/n,this.height=o.height/n,this.ratio=n}else void 0===i?(i=t,s=e):(this._sx=t,this._sy=e),this._sw=this._dw=i,this._sh=this._dh=s,this.width=i,this.height=s;return this}dest(t,e,i,s){return this._dx=t,this._dy=e,this._dx=t,this._dy=e,void 0!==i&&(this._dw=i,this._dh=s,this.width=i,this.height=s),this}draw(t,e,i,o,n,r,a,h,c){var m=this._image;if(null!==m&&"object"==typeof m){var _=this._sx,l=this._sy,u=this._sw,p=this._sh,d=this._dx,y=this._dy,f=this._dw,v=this._dh;void 0!==r?(e=x.clamp(e,0,this._sw),o=x.clamp(o,0,this._sw-e),_+=e,l+=i=x.clamp(i,0,this._sh),u=o,p=n=x.clamp(n,0,this._sh-i),d=r,y=a,f=h,v=c):void 0!==o?(d=e,y=i,f=o,v=n):void 0!==e&&(f=e,v=i);var g=this.ratio||1;_*=g,l*=g,u*=g,p*=g;try{"function"==typeof m.draw?m.draw(t,_,l,u,p,d,y,f,v):(s.draw++,t.drawImage(m,_,l,u,p,d,y,f,v))}catch(t){m._draw_failed||(console.log("Unable to draw: ",m),console.log(t),m._draw_failed=!0)}}}}var B=new class extends A{constructor(){super(),i(this,"pipe",(function(){return this})),i(this,"src",(function(){return this})),i(this,"dest",(function(){return this})),i(this,"draw",(function(){})),this.x=this.y=this.width=this.height=0}},w=new S(B);var V={},C=[];class M extends A{constructor(t){super();var e=this;P(t,"filter"),P(t,"cutouts"),P(t,"sprites"),P(t,"factory");var i=t.map||t.filter,s=t.ppu||t.ratio||1,o=t.trim||0,n=t.textures,r=t.factory,a=t.cutouts||t.sprites;function h(t){if(!t||g(t.draw))return t;t=Object.assign({},t),g(i)&&(t=i(t)),1!=s&&(t.x*=s,t.y*=s,t.width*=s,t.height*=s,t.top*=s,t.bottom*=s,t.left*=s,t.right*=s),0!=o&&(t.x+=o,t.y+=o,t.width-=2*o,t.height-=2*o,t.top-=o,t.bottom-=o,t.left-=o,t.right-=o);var n=e.pipe();return n.top=t.top,n.bottom=t.bottom,n.left=t.left,n.right=t.right,n.src(t.x,t.y,t.width,t.height),n}function c(t){if(n){if(g(n))return n(t);if(b(n))return n[t]}if(a){for(var e=null,i=0,s=0;s0&&t.length>i+1&&(s=(e=V[t.slice(0,i)])&&e.select(t.slice(i+1))),!s&&(e=V[t])&&(s=e.select()),i=0;!s&&i{t.preventDefault(),this.locate(t),this.publish(t.type,t),this.lookup("click",this.clicklist),this.lookup("mousecancel",this.cancellist)})),i(this,"handleMove",(t=>{t.preventDefault(),this.locate(t),this.publish(t.type,t)})),i(this,"handleEnd",(t=>{t.preventDefault(),this.publish(t.type,t),this.clicklist.length&&this.publish("click",t,this.clicklist),this.cancellist.length=0})),i(this,"handleCancel",(t=>{this.cancellist.length&&this.publish("mousecancel",t,this.cancellist),this.clicklist.length=0})),i(this,"toString",(function(){return(0|this.x)+"x"+(0|this.y)})),i(this,"locate",(function(t){const e=this.elem;let i,s;t.touches&&t.touches.length?(i=t.touches[0].clientX,s=t.touches[0].clientY):(i=t.clientX,s=t.clientY);var o=e.getBoundingClientRect();i-=o.left,s-=o.top,i-=0|e.clientLeft,s-=0|e.clientTop,this.x=i*this.ratio,this.y=s*this.ratio})),i(this,"lookup",(function(t,e){this.type=t,this.root=this.stage,this.event=null,e.length=0,this.collect=e,this.root.visit({reverse:!0,visible:!0,start:this.visitStart,end:this.visitEnd},this)})),i(this,"publish",(function(t,e,i){if(this.type=t,this.root=this.stage,this.event=e,this.collect=!1,this.timeStamp=Date.now(),"mousemove"!==t&&"touchmove"!==t&&console.log(this.type+" "+this),i){for(;i.length&&!this.visitEnd(i.shift()););i.length=0}else this.root.visit({reverse:!0,visible:!0,start:this.visitStart,end:this.visitEnd},this)})),i(this,"visitStart",(t=>!t._flag(this.type))),i(this,"visitEnd",(t=>{F.raw=this.event,F.type=this.type,F.timeStamp=this.timeStamp,F.abs.x=this.x,F.abs.y=this.y;var e=t.listeners(this.type);if(e&&(t.matrix().inverse().map(this,F),(t===this.root||t.attr("spy")||t.hitTest(F))&&(this.collect&&this.collect.push(t),this.event))){for(var i=!1,s=0;s{this.ratio=t.ratio??this.ratio})),e.addEventListener("touchstart",this.handleStart),e.addEventListener("touchend",this.handleEnd),e.addEventListener("touchmove",this.handleMove),e.addEventListener("touchcancel",this.handleCancel),e.addEventListener("mousedown",this.handleStart),e.addEventListener("mouseup",this.handleEnd),e.addEventListener("mousemove",this.handleMove),document.addEventListener("mouseup",this.handleCancel),window.addEventListener("blur",this.handleCancel),this}unmount(){const t=this.elem;return t.removeEventListener("touchstart",this.handleStart),t.removeEventListener("touchend",this.handleEnd),t.removeEventListener("touchmove",this.handleMove),t.removeEventListener("touchcancel",this.handleCancel),t.removeEventListener("mousedown",this.handleStart),t.removeEventListener("mouseup",this.handleEnd),t.removeEventListener("mousemove",this.handleMove),document.removeEventListener("mouseup",this.handleCancel),window.removeEventListener("blur",this.handleCancel),this}}i(k,"CLICK","click"),i(k,"START","touchstart mousedown"),i(k,"MOVE","touchmove mousemove"),i(k,"END","touchend mouseup"),i(k,"CANCEL","touchcancel mousecancel");var F={},L={};function q(t,e,i){Object.defineProperty(t,e,{value:i})}function N(t){return t}q(F,"clone",(function(t){return(t=t||{}).x=this.x,t.y=this.y,t})),q(F,"toString",(function(){return(0|this.x)+"x"+(0|this.y)+" ("+this.abs+")"})),q(F,"abs",L),q(L,"clone",(function(t){return(t=t||{}).x=this.x,t.y=this.y,t})),q(L,"toString",(function(){return(0|this.x)+"x"+(0|this.y)}));var j={},D={},E={};class R{static get(t,e=N){if("function"==typeof t)return t;if("string"!=typeof t)return e;var i=j[t];if(i)return i;var s=/^(\w+)(-(in|out|in-out|out-in))?(\((.*)\))?$/i.exec(t);if(!s||!s.length)return e;var o=E[s[1]],n=D[s[3]],r=s[5];return i=o&&o.fn?o.fn:o&&o.fc?o.fc.apply(o.fc,r&&r.replace(/\s+/,"").split(",")):e,n&&(i=n.fn(i)),j[t]=i,i}static add(t){for(var e=(t.name||t.mode).split(/\s+/),i=0;i=1;"function"==typeof this._easing&&(r=this._easing(r));var h=1-r;for(var n in this._end)this._owner.pin(n,this._start[n]*h+this._end[n]*r);return a}}finish(){return this._ending.forEach((t=>{try{t.call(this._owner)}catch(t){console.error(t)}})),this._next}tween(t,e){return this._next=new O(this._owner,t,e)}duration(t){return this._duration=t,this}delay(t){return this._delay=t,this}ease(t){return this._easing=R.get(t),this}done(t){return this._ending.push(t),this}hide(){return this._ending.push((function(){this.hide()})),this._hide=!0,this}remove(){return this._ending.push((function(){this.remove()})),this._remove=!0,this}pin(t,e){if("object"==typeof t)for(var i in t)Y(this._owner,this._end,i,t[i]);else void 0!==e&&Y(this._owner,this._end,t,e);return this}then(t){return this.done(t),this}clear(t){return this}}function Y(t,e,i,s){"number"==typeof t.pin(i)?e[i]=s:"number"==typeof t.pin(i+"X")&&"number"==typeof t.pin(i+"Y")&&(e[i+"X"]=s,e[i+"Y"]=s)}r._add_shortcuts(O.prototype);const W=[];class J extends u{constructor(){super(),i(this,"canvas",null),i(this,"dom",null),i(this,"context",null),i(this,"pixelWidth",-1),i(this,"pixelHeight",-1),i(this,"pixelRatio",1),i(this,"drawingWidth",0),i(this,"drawingHeight",0),i(this,"mounted",!1),i(this,"paused",!1),i(this,"sleep",!1),i(this,"mount",((t={})=>{if("string"==typeof t.canvas?this.canvas=document.getElementById(t.canvas):t.canvas instanceof HTMLCanvasElement?this.canvas=t.canvas:t.canvas,this.canvas||(this.canvas=document.getElementById("cutjs")||document.getElementById("stage")),!this.canvas){console.log("Creating Canvas..."),this.canvas=document.createElement("canvas"),Object.assign(this.canvas.style,{position:"absolute",display:"block",top:"0",left:"0",bottom:"0",right:"0",width:"100%",height:"100%"});let t=document.body;t.insertBefore(this.canvas,t.firstChild)}this.dom=this.canvas,this.context=this.canvas.getContext("2d"),this.devicePixelRatio=window.devicePixelRatio||1,this.backingStoreRatio=this.context.webkitBackingStorePixelRatio||this.context.mozBackingStorePixelRatio||this.context.msBackingStorePixelRatio||this.context.oBackingStorePixelRatio||this.context.backingStorePixelRatio||1,this.pixelRatio=this.devicePixelRatio/this.backingStoreRatio,this.mounted=!0,W.push(this),this.requestFrame(this.onFrame)})),i(this,"frameRequested",!1),i(this,"requestFrame",(()=>{this.frameRequested||(this.frameRequested=!0,requestAnimationFrame(this.onFrame))})),i(this,"lastTime",0),i(this,"_mo_touch",null),i(this,"onFrame",(t=>{if(this.frameRequested=!1,!this.mounted)return;this.requestFrame();const e=this.canvas.clientWidth,i=this.canvas.clientHeight;this.pixelWidth===e&&this.pixelHeight===i||(this.pixelWidth=e,this.pixelHeight=i,this.drawingWidth=e*this.pixelRatio,this.drawingHeight=i*this.pixelRatio,this.canvas.width===this.drawingWidth&&this.canvas.height===this.drawingHeight||(this.canvas.width=this.drawingWidth,this.canvas.height=this.drawingHeight,console.log("Resize: ["+this.drawingWidth+", "+this.drawingHeight+"] = "+this.pixelRatio+" x ["+this.pixelWidth+", "+this.pixelHeight+"]"),this.viewport({width:this.drawingWidth,height:this.drawingHeight,ratio:this.pixelRatio})));let o=this.lastTime||t,n=t-o;if(!this.mounted||this.paused||this.sleep)return;this.lastTime=t;let r=this._tick(n,t,o);this._mo_touch!=this._ts_touch?(this._mo_touch=this._ts_touch,this.sleep=!1,this.drawingWidth>0&&this.drawingHeight>0&&(this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.drawingWidth,this.drawingHeight),this.render(this.context))):this.sleep=!r,s.fps=n?1e3/n:0})),this.label("Root")}resume(){return(this.sleep||this.paused)&&this.requestFrame(),this.paused=!1,this.sleep=!1,this.publish("resume"),this}pause(){return this.paused||this.publish("pause"),this.paused=!0,this}touch(){return(this.sleep||this.paused)&&this.requestFrame(),this.sleep=!1,u.prototype.touch()}unmount(){var t;this.mounted=!1;let e=W.indexOf(this);return e>=0&&W.splice(e,1),null==(t=this.mouse)||t.unmount(),this}background(t){return this.dom.style.backgroundColor=t,this}viewport(t,e,i){if(void 0===t)return Object.assign({},this._viewport);if("object"==typeof t){const s=t;t=s.width,e=s.height,i=s.ratio}this._viewport={width:t,height:e,ratio:i||1},this.viewbox();let s=Object.assign({},this._viewport);return this.visit({start:function(t){if(!t._flag("viewport"))return!0;t.publish("viewport",[s])}}),this}viewbox(t,e,i){return"number"==typeof t&&"number"==typeof e?this._viewbox={width:t,height:e,mode:i}:"object"==typeof t&&null!==t&&(this._viewbox={...t}),this.rescale(),this}camera(t){return this._camera=t,this.rescale(),this}rescale(){let t=this._viewbox,e=this._viewport,i=this._camera;if(e&&t){const s=e.width,o=e.height,n=/^(in|out|in-pad|out-crop)$/.test(t.mode)?t.mode:"in-pad",r=t.width,a=t.height;this.pin({width:r,height:a}),this.scaleTo(s,o,n);const h=t.x||0,c=t.y||0,m=(null==i?void 0:i.a)||1,_=(null==i?void 0:i.e)||0,l=(null==i?void 0:i.f)||0,u=this.pin("scaleX"),p=this.pin("scaleY");this.pin("scaleX",u*m),this.pin("scaleY",p*m),this.pin("offsetX",_-h*u*m),this.pin("offsetY",l-c*p*m)}else e&&this.pin({width:e.width,height:e.height});return this}}const X=function(t){var e=new H;return t&&e.texture(t),e};function H(){H._super.call(this),this.label("Sprite"),this._textures=[],this._image=null}H._super=u,H.prototype=Object.create(H._super.prototype),H.prototype.texture=function(t){return this._image=I(t).one(),this.pin("width",this._image?this._image.width:0),this.pin("height",this._image?this._image.height:0),this._textures[0]=this._image.pipe(),this._textures.length=1,this},H.prototype.tile=function(t){return this._repeat(!1,t),this},H.prototype.stretch=function(t){return this._repeat(!0,t),this},H.prototype._repeat=function(t,e){var i=this;function s(t,e,s,o,n,r,a,h,c){var m=i._textures.length>t?i._textures[t]:i._textures[t]=i._image.pipe();m.src(e,s,o,n),m.dest(r,a,h,c)}this.untick(this._repeatTicker),this.tick(this._repeatTicker=function(){if(this._mo_stretch!=this._pin._ts_transform){this._mo_stretch=this._pin._ts_transform;var i=this.pin("width"),o=this.pin("height");this._textures.length=function(t,e,i,s,o,n){var r=t.width,a=t.height,h=t.left,c=t.right,m=t.top,_=t.bottom;r=r-(h="number"==typeof h&&h==h?h:0)-(c="number"==typeof c&&c==c?c:0),a=a-(m="number"==typeof m&&m==m?m:0)-(_="number"==typeof _&&_==_?_:0),o||(e=Math.max(e-h-c,0),i=Math.max(i-m-_,0));var l=0;m>0&&h>0&&n(l++,0,0,h,m,0,0,h,m);_>0&&h>0&&n(l++,0,a+m,h,_,0,i+m,h,_);m>0&&c>0&&n(l++,r+h,0,c,m,e+h,0,c,m);_>0&&c>0&&n(l++,r+h,a+m,c,_,e+h,i+m,c,_);if(s)m>0&&n(l++,h,0,r,m,h,0,e,m),_>0&&n(l++,h,a+m,r,_,h,i+m,e,_),h>0&&n(l++,0,m,h,a,0,m,h,i),c>0&&n(l++,r+h,m,c,a,e+h,m,c,i),n(l++,h,m,r,a,h,m,e,i);else for(var u,p=h,d=e;d>0;){u=Math.min(r,d),d-=r;for(var y,f=m,v=i;v>0;)y=Math.min(a,v),v-=a,n(l++,h,m,u,y,p,f,u,y),d<=0&&(h&&n(l++,0,m,h,y,0,f,h,y),c&&n(l++,r+h,m,c,y,p+u,f,c,y)),f+=y;m&&n(l++,h,0,u,m,p,0,u,m),_&&n(l++,h,a+m,u,_,p,f,u,_),p+=u}return l}(this._image,i,o,t,e,s)}})},H.prototype.image=H.prototype.texture;const Z=X,K=H;G._super=u,G.prototype=Object.create(G._super.prototype);function G(){G._super.call(this),this.label("Anim"),this._textures=[],this._fps=15,this._ft=1e3/this._fps,this._time=-1,this._repeat=0,this._index=0,this._frames=[];var t=0;this.tick((function(e,i,s){if(!(this._time<0||this._frames.length<=1)){var o=t!=s;if(t=i,o)return!0;if(this._time+=e,this._time0&&(this._repeat-=n)<=0)||(this.stop(),this._callback&&this._callback(),!1)}}),!1)}G.prototype.fps=function(t){return void 0===t?this._fps:(this._fps=t>0?t:15,this._ft=1e3/this._fps,this)},G.prototype.setFrames=function(t,e,i){return this.frames(t,e,i)},G.prototype.frames=function(t){return this._index=0,this._frames=I(t).array(),this.touch(),this},G.prototype.length=function(){return this._frames?this._frames.length:0},G.prototype.gotoFrame=function(t,e){return this._index=0|x.wrap(t,this._frames.length),e=e||!this._textures[0],this._textures[0]=this._frames[this._index],e&&(this.pin("width",this._textures[0].width),this.pin("height",this._textures[0].height)),this.touch(),this},G.prototype.moveFrame=function(t){return this.gotoFrame(this._index+t)},G.prototype.repeat=function(t,e){return this._repeat=t*this._frames.length-1,this._callback=e,this.play(),this},G.prototype.play=function(t){return void 0!==t?(this.gotoFrame(t),this._time=0):this._time<0&&(this._time=0),this.touch(),this},G.prototype.stop=function(t){return this._time=-1,void 0!==t&&this.gotoFrame(t),this};function U(){U._super.call(this),this.label("String"),this._textures=[]}U._super=u,U.prototype=Object.create(U._super.prototype),U.prototype.setFont=function(t,e,i){return this.frames(t,e,i)},U.prototype.frames=function(t){return this._textures=[],"string"==typeof t?(t=I(t),this._item=function(e){return t.one(e)}):"object"==typeof t?this._item=function(e){return t[e]}:"function"==typeof t&&(this._item=t),this},U.prototype.setValue=function(t,e,i){return this.value(t,e,i)},U.prototype.value=function(t){if(void 0===t)return this._value;if(this._value===t)return this;this._value=t,null===t?t="":"string"==typeof t||Array.isArray(t)||(t=t.toString()),this._spacing=this._spacing||0;for(var e=0,i=0,s=0;s0?this._spacing:0,o.dest(e,0),e+=o.width,i=Math.max(i,o.height)}return this.pin("width",e),this.pin("height",i),this._textures.length=t.length,this};u.prototype.row=function(t){return this.align("row",t),this};u.prototype.column=function(t){return this.align("column",t),this},u.prototype.align=function(t,e){return this._padding=this._padding||0,this._spacing=this._spacing||0,this.untick(this._layoutTiker),this.tick(this._layoutTiker=function(){if(this._mo_seq!=this._ts_touch){this._mo_seq=this._ts_touch;var i=this._mo_seqAlign!=this._ts_children;this._mo_seqAlign=this._ts_children;for(var s,o=0,n=0,r=this.first(!0),a=!0;s=r;){r=s.next(!0),s.matrix(!0);var h=s.pin("boxWidth"),c=s.pin("boxHeight");"column"==t?(!a&&(n+=this._spacing),s.pin("offsetY")!=n&&s.pin("offsetY",n),o=Math.max(o,h),n+=c,i&&s.pin("alignX",e)):"row"==t&&(!a&&(o+=this._spacing),s.pin("offsetX")!=o&&s.pin("offsetX",o),o+=h,n=Math.max(n,c),i&&s.pin("alignY",e)),a=!1}o+=2*this._padding,n+=2*this._padding,this.pin("width")!=o&&this.pin("width",o),this.pin("height")!=n&&this.pin("height",n)}}),this};u.prototype.box=function(){return this._padding=this._padding||0,this.untick(this._layoutTiker),this.tick(this._layoutTiker=function(){if(this._mo_box!=this._ts_touch){this._mo_box=this._ts_touch;for(var t,e=0,i=0,s=this.first(!0);t=s;){s=t.next(!0),t.matrix(!0);var o=t.pin("boxWidth"),n=t.pin("boxHeight");e=Math.max(e,o),i=Math.max(i,n)}e+=2*this._padding,i+=2*this._padding,this.pin("width")!=e&&this.pin("width",e),this.pin("height")!=i&&this.pin("height",i)}}),this};u.prototype.layer=function(){return this.untick(this._layoutTiker),this.tick(this._layoutTiker=function(){var t=this.parent();if(t){var e=t.pin("width");this.pin("width")!=e&&this.pin("width",e);var i=t.pin("height");this.pin("height")!=i&&this.pin("height",i)}},!0),this},u.prototype.padding=function(t){return this._padding=t,this},u.prototype.spacing=function(t){return this._spacing=t,this};const Q=Object.freeze(Object.defineProperty({__proto__:null,Anim:G,Atlas:M,Image:K,Math:x,Matrix:o,Mouse:k,Node:u,Pin:r,Root:J,Sprite:H,Str:U,Texture:A,Tween:O,anim:function(t,e){var i=new G;return i.frames(t).gotoFrame(0),e&&i.fps(e),i},atlas:async function(t){var e=g(t.draw)?t:new M(t);t.name&&(V[t.name]=e),C.push(e),P(t,"imagePath"),P(t,"imageRatio");var i,s=t.imagePath,o=t.imageRatio||1;if("string"==typeof t.image?s=t.image:b(t.image)&&(s=t.image.src||t.image.url,o=t.image.ratio||o),s){const t=await(i=s,console.log("Loading image: "+i),new Promise((function(t,e){const s=new Image;s.onload=function(){console.log("Image loaded: "+i),t(s)},s.onerror=function(t){console.log("Loading failed: "+i),e(t)},s.src=i})));e.src(t,o)}return e},box:function(){return l().box().label("Box")},canvas:function(t,e,i){"string"==typeof t?"object"==typeof e||("function"==typeof e&&(i=e),e={}):("function"==typeof t&&(i=t),e={},t="2d");var s=document.createElement("canvas"),o=s.getContext(t,e),n=new A(s);return n.context=function(){return o},n.size=function(t,e,i){return i=i||1,s.width=t*i,s.height=e*i,this.src(s,i),this},n.canvas=function(t){return"function"==typeof t?t.call(this,o):void 0===t&&"function"==typeof i&&i.call(this,o),this},"function"==typeof i&&i.call(n,o),n},column:function(t){return l().column(t).label("Row")},create:l,image:Z,layer:function(){return l().layer().label("Layer")},math:x,memoizeDraw:function(t,e=(()=>null)){let i,s=0,o=Stage.canvas(),n=Stage.sprite(),r=!0;return n.tick((function(){let a=this._parent.matrix();if(r&&(r=!1,!(a=z)))return;z=a;let h=Math.max(Math.abs(a.a),Math.abs(a.b)),c=s/h;if(0===s||c>1.25||c<.8){const r=e();i!==r&&(s=h,t(2.5*h/T,o,n),n.texture(o),n.__timestamp=Date.now())}}),!1),n},mount:function(t={}){let e=new J;return e.mount(t),e.mouse=(new k).mount(e,e.dom),e},pause:function(){for(let t=W.length-1;t>=0;t--)W[t].pause()},resume:function(){for(let t=W.length-1;t>=0;t--)W[t].resume()},row:function(t){return l().row(t).label("Row")},sprite:X,string:function(t){return(new U).frames(t)},texture:I},Symbol.toStringTag,{value:"Module"})); /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. + Copyright (c) Microsoft Corporation. - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */var e=function(t,i){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i])})(t,i)};function i(t,i){if("function"!=typeof i&&null!==i)throw new TypeError("Class extends value "+String(i)+" is not a constructor or null");function o(){this.constructor=t}e(t,i),t.prototype=null===i?Object.create(i):(o.prototype=i.prototype,new o)}var o=function(){return(o=Object.assign||function(t){for(var e,i=1,o=arguments.length;i>1,t|=t>>2,t|=t>>4,t|=t>>8,(t|=t>>16)+1},r.isPowerOfTwo=function(t){return t>0&&0==(t&t-1)},r.mod=function(t,e,i){return void 0===e?(i=1,e=0):void 0===i&&(i=e,e=0),i>e?(t=(t-e)%(i-e))+(t<0?i:e):(t=(t-i)%(e-i))+(t<=0?e:i)},r.clamp=function(t,e,i){return ti?i:t},r.random=function(t,e){return void 0===t?(e=1,t=0):void 0===e&&(e=t,t=0),t===e?t:Math.random()*(e-t)+t};var a,h,c,m=function(){function t(e,i){if(!(this instanceof t))return new t(e,i);void 0===e?(this.x=0,this.y=0):"object"==typeof e?(this.x=e.x,this.y=e.y):(this.x=e,this.y=i)}return t.prototype._serialize=function(){return{x:this.x,y:this.y}},t._deserialize=function(e){var i=Object.create(t.prototype);return i.x=e.x,i.y=e.y,i},t.zero=function(){var e=Object.create(t.prototype);return e.x=0,e.y=0,e},t.neo=function(e,i){var o=Object.create(t.prototype);return o.x=e,o.y=i,o},t.clone=function(e){return t.neo(e.x,e.y)},t.prototype.toString=function(){return JSON.stringify(this)},t.isValid=function(t){return null!=t&&(r.isFinite(t.x)&&r.isFinite(t.y))},t.assert=function(t){},t.prototype.clone=function(){return t.clone(this)},t.prototype.setZero=function(){return this.x=0,this.y=0,this},t.prototype.set=function(t,e){return"object"==typeof t?(this.x=t.x,this.y=t.y):(this.x=t,this.y=e),this},t.prototype.setNum=function(t,e){return this.x=t,this.y=e,this},t.prototype.setVec2=function(t){return this.x=t.x,this.y=t.y,this},t.prototype.wSet=function(t,e,i,o){return void 0!==i||void 0!==o?this.setCombine(t,e,i,o):this.setMul(t,e)},t.prototype.setCombine=function(t,e,i,o){var s=t*e.x+i*o.x,n=t*e.y+i*o.y;return this.x=s,this.y=n,this},t.prototype.setMul=function(t,e){var i=t*e.x,o=t*e.y;return this.x=i,this.y=o,this},t.prototype.add=function(t){return this.x+=t.x,this.y+=t.y,this},t.prototype.wAdd=function(t,e,i,o){return void 0!==i||void 0!==o?this.addCombine(t,e,i,o):this.addMul(t,e)},t.prototype.addCombine=function(t,e,i,o){var s=t*e.x+i*o.x,n=t*e.y+i*o.y;return this.x+=s,this.y+=n,this},t.prototype.addMul=function(t,e){var i=t*e.x,o=t*e.y;return this.x+=i,this.y+=o,this},t.prototype.wSub=function(t,e,i,o){return void 0!==i||void 0!==o?this.subCombine(t,e,i,o):this.subMul(t,e)},t.prototype.subCombine=function(t,e,i,o){var s=t*e.x+i*o.x,n=t*e.y+i*o.y;return this.x-=s,this.y-=n,this},t.prototype.subMul=function(t,e){var i=t*e.x,o=t*e.y;return this.x-=i,this.y-=o,this},t.prototype.sub=function(t){return this.x-=t.x,this.y-=t.y,this},t.prototype.mul=function(t){return this.x*=t,this.y*=t,this},t.prototype.length=function(){return t.lengthOf(this)},t.prototype.lengthSquared=function(){return t.lengthSquared(this)},t.prototype.normalize=function(){var t=this.length();if(tt*t){var i=r.invSqrt(e);this.x*=i*t,this.y*=i*t}return this},t.clamp=function(e,i){return(e=t.neo(e.x,e.y)).clamp(i),e},t.scaleFn=function(e,i){return function(o){return t.neo(o.x*e,o.y*i)}},t.translateFn=function(e,i){return function(o){return t.neo(o.x+e,o.y+i)}},t}(),_=function(){function t(e,i){if(!(this instanceof t))return new t(e,i);this.lowerBound=m.zero(),this.upperBound=m.zero(),"object"==typeof e&&this.lowerBound.setVec2(e),"object"==typeof i?this.upperBound.setVec2(i):"object"==typeof e&&this.upperBound.setVec2(e)}return t.prototype.isValid=function(){return t.isValid(this)},t.isValid=function(t){return null!=t&&(m.isValid(t.lowerBound)&&m.isValid(t.upperBound)&&m.sub(t.upperBound,t.lowerBound).lengthSquared()>=0)},t.assert=function(t){},t.prototype.getCenter=function(){return m.neo(.5*(this.lowerBound.x+this.upperBound.x),.5*(this.lowerBound.y+this.upperBound.y))},t.prototype.getExtents=function(){return m.neo(.5*(this.upperBound.x-this.lowerBound.x),.5*(this.upperBound.y-this.lowerBound.y))},t.prototype.getPerimeter=function(){return 2*(this.upperBound.x-this.lowerBound.x+this.upperBound.y-this.lowerBound.y)},t.prototype.combine=function(t,e){e=e||this;var i=t.lowerBound,o=t.upperBound,s=e.lowerBound,n=e.upperBound,a=r.min(i.x,s.x),h=r.min(i.y,s.y),c=r.max(n.x,o.x),m=r.max(n.y,o.y);this.lowerBound.setNum(a,h),this.upperBound.setNum(c,m)},t.prototype.combinePoints=function(t,e){this.lowerBound.setNum(r.min(t.x,e.x),r.min(t.y,e.y)),this.upperBound.setNum(r.max(t.x,e.x),r.max(t.y,e.y))},t.prototype.set=function(t){this.lowerBound.setNum(t.lowerBound.x,t.lowerBound.y),this.upperBound.setNum(t.upperBound.x,t.upperBound.y)},t.prototype.contains=function(t){var e=!0;return e=(e=(e=(e=e&&this.lowerBound.x<=t.lowerBound.x)&&this.lowerBound.y<=t.lowerBound.y)&&t.upperBound.x<=this.upperBound.x)&&t.upperBound.y<=this.upperBound.y},t.prototype.extend=function(e){return t.extend(this,e),this},t.extend=function(t,e){t.lowerBound.x-=e,t.lowerBound.y-=e,t.upperBound.x+=e,t.upperBound.y+=e},t.testOverlap=function(t,e){var i=e.lowerBound.x-t.upperBound.x,o=t.lowerBound.x-e.upperBound.x,s=e.lowerBound.y-t.upperBound.y,n=t.lowerBound.y-e.upperBound.y;return!(i>0||s>0||o>0||n>0)},t.areEqual=function(t,e){return m.areEqual(t.lowerBound,e.lowerBound)&&m.areEqual(t.upperBound,e.upperBound)},t.diff=function(t,e){var i=r.max(0,r.min(t.upperBound.x,e.upperBound.x)-r.max(e.lowerBound.x,t.lowerBound.x)),o=r.max(0,r.min(t.upperBound.y,e.upperBound.y)-r.max(e.lowerBound.y,t.lowerBound.y));return(t.upperBound.x-t.lowerBound.x)*(t.upperBound.y-t.lowerBound.y)+(e.upperBound.x-e.lowerBound.x)*(e.upperBound.y-e.lowerBound.y)-i*o},t.prototype.rayCast=function(t,e){for(var i=-1/0,o=1/0,s=e.p1,n=m.sub(e.p2,e.p1),a=m.abs(n),h=m.zero(),c="x";null!==c;c="x"===c?"y":null)if(a.xu){var d=l;l=u,u=d,p=1}if(l>i&&(h.setZero(),h[c]=p,i=l),i>(o=r.min(o,u)))return!1}return!(i<0||e.maxFraction0?t=this._list.shift():(this._createCount++,t="function"==typeof this._createFn?this._createFn():{}),this._outCount++,"function"==typeof this._outFn&&this._outFn(t),t},t.prototype.release=function(t){this._list.length"+this._outCount+" <"+this._inCount+" -"+this._discardCount+" ="+this._list.length+"/"+this._max},t}(),p=function(){function t(t){this.aabb=new _,this.userData=null,this.parent=null,this.child1=null,this.child2=null,this.height=-1,this.id=t}return t.prototype.toString=function(){return this.id+": "+this.userData},t.prototype.isLeaf=function(){return null==this.child1},t}(),d=function(){function t(){this.inputPool=new u({create:function(){return{}},release:function(t){}}),this.stackPool=new u({create:function(){return[]},release:function(t){t.length=0}}),this.iteratorPool=new u({create:function(){return new y},release:function(t){t.close()}}),this.m_root=null,this.m_nodes={},this.m_lastProxyId=0,this.m_pool=new u({create:function(){return new p}})}return t.prototype.getUserData=function(t){return this.m_nodes[t].userData},t.prototype.getFatAABB=function(t){return this.m_nodes[t].aabb},t.prototype.allocateNode=function(){var t=this.m_pool.allocate();return t.id=++this.m_lastProxyId,t.userData=null,t.parent=null,t.child1=null,t.child2=null,t.height=-1,this.m_nodes[t.id]=t,t},t.prototype.freeNode=function(t){this.m_pool.release(t),t.height=-1,delete this.m_nodes[t.id]},t.prototype.createProxy=function(t,e){var i=this.allocateNode();return i.aabb.set(t),_.extend(i.aabb,l.aabbExtension),i.userData=e,i.height=0,this.insertLeaf(i),i.id},t.prototype.destroyProxy=function(t){var e=this.m_nodes[t];this.removeLeaf(e),this.freeNode(e)},t.prototype.moveProxy=function(t,e,i){var o=this.m_nodes[t];return!o.aabb.contains(e)&&(this.removeLeaf(o),o.aabb.set(e),e=o.aabb,_.extend(e,l.aabbExtension),i.x<0?e.lowerBound.x+=i.x*l.aabbMultiplier:e.upperBound.x+=i.x*l.aabbMultiplier,i.y<0?e.lowerBound.y+=i.y*l.aabbMultiplier:e.upperBound.y+=i.y*l.aabbMultiplier,this.insertLeaf(o),!0)},t.prototype.insertLeaf=function(t){if(null==this.m_root)return this.m_root=t,void(this.m_root.parent=null);for(var e=t.aabb,i=this.m_root;!i.isLeaf();){var o=i.child1,s=i.child2,n=i.aabb.getPerimeter(),a=new _;a.combine(i.aabb,e);var h=a.getPerimeter(),c=2*h,m=2*(h-n),l=void 0;if(o.isLeaf()){(d=new _).combine(e,o.aabb),l=d.getPerimeter()+m}else{(d=new _).combine(e,o.aabb);var u=o.aabb.getPerimeter();l=d.getPerimeter()-u+m}var p=void 0;if(s.isLeaf()){(d=new _).combine(e,s.aabb),p=d.getPerimeter()+m}else{var d;(d=new _).combine(e,s.aabb);u=s.aabb.getPerimeter();p=d.getPerimeter()-u+m}if(c1){var n=o.child1,a=o.child2;return o.child1=e,o.parent=e.parent,e.parent=o,null!=o.parent?o.parent.child1===t?o.parent.child1=o:o.parent.child2=o:this.m_root=o,n.height>a.height?(o.child2=n,e.child2=a,a.parent=e,e.aabb.combine(i.aabb,a.aabb),o.aabb.combine(e.aabb,n.aabb),e.height=1+r.max(i.height,a.height),o.height=1+r.max(e.height,n.height)):(o.child2=a,e.child2=n,n.parent=e,e.aabb.combine(i.aabb,n.aabb),o.aabb.combine(e.aabb,a.aabb),e.height=1+r.max(i.height,n.height),o.height=1+r.max(e.height,a.height)),o}if(s<-1){var h=i.child1,c=i.child2;return i.child1=e,i.parent=e.parent,e.parent=i,null!=i.parent?i.parent.child1===e?i.parent.child1=i:i.parent.child2=i:this.m_root=i,h.height>c.height?(i.child2=h,e.child1=c,c.parent=e,e.aabb.combine(o.aabb,c.aabb),i.aabb.combine(e.aabb,h.aabb),e.height=1+r.max(o.height,c.height),i.height=1+r.max(e.height,h.height)):(i.child2=c,e.child1=h,h.parent=e,e.aabb.combine(o.aabb,h.aabb),i.aabb.combine(e.aabb,c.aabb),e.height=1+r.max(o.height,h.height),i.height=1+r.max(e.height,c.height)),i}return e},t.prototype.getHeight=function(){return null==this.m_root?0:this.m_root.height},t.prototype.getAreaRatio=function(){if(null==this.m_root)return 0;for(var t,e=this.m_root.aabb.getPerimeter(),i=0,o=this.iteratorPool.allocate().preorder(this.m_root);t=o.next();)t.height<0||(i+=t.aabb.getPerimeter());return this.iteratorPool.release(o),i/e},t.prototype.computeHeight=function(t){var e;if((e=void 0!==t?this.m_nodes[t]:this.m_root).isLeaf())return 0;var i=this.computeHeight(e.child1.id),o=this.computeHeight(e.child2.id);return 1+r.max(i,o)},t.prototype.validateStructure=function(t){if(null!=t){this.m_root;var e=t.child1,i=t.child2;t.isLeaf()||(this.validateStructure(e),this.validateStructure(i))}},t.prototype.validateMetrics=function(t){if(null!=t){var e=t.child1,i=t.child2;if(!t.isLeaf()){var o=e.height,s=i.height;r.max(o,s),(new _).combine(e.aabb,i.aabb),this.validateMetrics(e),this.validateMetrics(i)}}},t.prototype.validate=function(){this.validateStructure(this.m_root),this.validateMetrics(this.m_root)},t.prototype.getMaxBalance=function(){for(var t,e=0,i=this.iteratorPool.allocate().preorder(this.m_root);t=i.next();)if(!(t.height<=1)){var o=r.abs(t.child2.height-t.child1.height);e=r.max(e,o)}return this.iteratorPool.release(i),e},t.prototype.rebuildBottomUp=function(){for(var t,e=[],i=0,o=this.iteratorPool.allocate().preorder(this.m_root);t=o.next();)t.height<0||(t.isLeaf()?(t.parent=null,e[i]=t,++i):this.freeNode(t));for(this.iteratorPool.release(o);i>1;){for(var s=1/0,n=-1,a=-1,h=0;h0;){var o=i.pop();if(null!=o)if(_.testOverlap(o.aabb,t))if(o.isLeaf()){if(!1===e(o.id))return}else i.push(o.child1),i.push(o.child2)}this.stackPool.release(i)},t.prototype.rayCast=function(t,e){var i=t.p1,o=t.p2,s=m.sub(o,i);s.normalize();var n=m.crossNumVec2(1,s),a=m.abs(n),h=t.maxFraction,c=new _,l=m.combine(1-h,i,h,o);c.combinePoints(i,l);var u=this.stackPool.allocate(),p=this.inputPool.allocate();for(u.push(this.m_root);u.length>0;){var d=u.pop();if(null!=d&&!1!==_.testOverlap(d.aabb,c)){var y=d.aabb.getCenter(),f=d.aabb.getExtents();if(!(r.abs(m.dot(n,m.sub(i,y)))-m.dot(a,f)>0))if(d.isLeaf()){p.p1=m.clone(t.p1),p.p2=m.clone(t.p2),p.maxFraction=h;var v=e(p,d.id);if(0===v)return;v>0&&(h=v,l=m.combine(1-h,i,h,o),c.combinePoints(i,l))}else u.push(d.child1),u.push(d.child2)}}this.stackPool.release(u),this.inputPool.release(p)},t}(),y=function(){function t(){this.parents=[],this.states=[]}return t.prototype.preorder=function(t){return this.parents.length=0,this.parents.push(t),this.states.length=0,this.states.push(0),this},t.prototype.next=function(){for(;this.parents.length>0;){var t=this.parents.length-1,e=this.parents[t];if(0===this.states[t])return this.states[t]=1,e;if(1===this.states[t]&&(this.states[t]=2,e.child1))return this.parents.push(e.child1),this.states.push(1),e.child1;if(2===this.states[t]&&(this.states[t]=3,e.child2))return this.parents.push(e.child2),this.states.push(1),e.child2;this.parents.pop(),this.states.pop()}},t.prototype.close=function(){this.parents.length=0},t}(),f=function(){function t(){var t=this;this.m_tree=new d,this.m_proxyCount=0,this.m_moveBuffer=[],this.query=function(e,i){t.m_tree.query(e,i)},this.queryCallback=function(e){if(e===t.m_queryProxyId)return!0;var i=r.min(e,t.m_queryProxyId),o=r.max(e,t.m_queryProxyId),s=t.m_tree.getUserData(i),n=t.m_tree.getUserData(o);return t.m_callback(s,n),!0}}return t.prototype.getUserData=function(t){return this.m_tree.getUserData(t)},t.prototype.testOverlap=function(t,e){var i=this.m_tree.getFatAABB(t),o=this.m_tree.getFatAABB(e);return _.testOverlap(i,o)},t.prototype.getFatAABB=function(t){return this.m_tree.getFatAABB(t)},t.prototype.getProxyCount=function(){return this.m_proxyCount},t.prototype.getTreeHeight=function(){return this.m_tree.getHeight()},t.prototype.getTreeBalance=function(){return this.m_tree.getMaxBalance()},t.prototype.getTreeQuality=function(){return this.m_tree.getAreaRatio()},t.prototype.rayCast=function(t,e){this.m_tree.rayCast(t,e)},t.prototype.shiftOrigin=function(t){this.m_tree.shiftOrigin(t)},t.prototype.createProxy=function(t,e){var i=this.m_tree.createProxy(t,e);return this.m_proxyCount++,this.bufferMove(i),i},t.prototype.destroyProxy=function(t){this.unbufferMove(t),this.m_proxyCount--,this.m_tree.destroyProxy(t)},t.prototype.moveProxy=function(t,e,i){this.m_tree.moveProxy(t,e,i)&&this.bufferMove(t)},t.prototype.touchProxy=function(t){this.bufferMove(t)},t.prototype.bufferMove=function(t){this.m_moveBuffer.push(t)},t.prototype.unbufferMove=function(t){for(var e=0;e0;)if(this.m_queryProxyId=this.m_moveBuffer.pop(),null!==this.m_queryProxyId){var e=this.m_tree.getFatAABB(this.m_queryProxyId);this.m_tree.query(e,this.queryCallback)}},t}(),v=function(){function t(e){if(!(this instanceof t))return new t(e);"number"==typeof e?this.setAngle(e):"object"==typeof e?this.setRot(e):this.setIdentity()}return t.neo=function(e){var i=Object.create(t.prototype);return i.setAngle(e),i},t.clone=function(e){var i=Object.create(t.prototype);return i.s=e.s,i.c=e.c,i},t.identity=function(){var e=Object.create(t.prototype);return e.s=0,e.c=1,e},t.isValid=function(t){return null!=t&&(r.isFinite(t.s)&&r.isFinite(t.c))},t.assert=function(t){},t.prototype.setIdentity=function(){this.s=0,this.c=1},t.prototype.set=function(t){"object"==typeof t?(this.s=t.s,this.c=t.c):(this.s=r.sin(t),this.c=r.cos(t))},t.prototype.setRot=function(t){this.s=t.s,this.c=t.c},t.prototype.setAngle=function(t){this.s=r.sin(t),this.c=r.cos(t)},t.prototype.getAngle=function(){return r.atan2(this.s,this.c)},t.prototype.getXAxis=function(){return m.neo(this.c,this.s)},t.prototype.getYAxis=function(){return m.neo(-this.s,this.c)},t.mul=function(e,i){if("c"in i&&"s"in i){var o=t.identity();return o.s=e.s*i.c+e.c*i.s,o.c=e.c*i.c-e.s*i.s,o}if("x"in i&&"y"in i)return m.neo(e.c*i.x-e.s*i.y,e.s*i.x+e.c*i.y)},t.mulRot=function(e,i){var o=t.identity();return o.s=e.s*i.c+e.c*i.s,o.c=e.c*i.c-e.s*i.s,o},t.mulVec2=function(t,e){return m.neo(t.c*e.x-t.s*e.y,t.s*e.x+t.c*e.y)},t.mulSub=function(t,e,i){var o=t.c*(e.x-i.x)-t.s*(e.y-i.y),s=t.s*(e.x-i.x)+t.c*(e.y-i.y);return m.neo(o,s)},t.mulT=function(e,i){if("c"in i&&"s"in i){var o=t.identity();return o.s=e.c*i.s-e.s*i.c,o.c=e.c*i.c+e.s*i.s,o}if("x"in i&&"y"in i)return m.neo(e.c*i.x+e.s*i.y,-e.s*i.x+e.c*i.y)},t.mulTRot=function(e,i){var o=t.identity();return o.s=e.c*i.s-e.s*i.c,o.c=e.c*i.c+e.s*i.s,o},t.mulTVec2=function(t,e){return m.neo(t.c*e.x+t.s*e.y,-t.s*e.x+t.c*e.y)},t}(),x=function(){function t(e,i){if(!(this instanceof t))return new t(e,i);this.p=m.zero(),this.q=v.identity(),void 0!==e&&this.p.setVec2(e),void 0!==i&&this.q.setAngle(i)}return t.clone=function(e){var i=Object.create(t.prototype);return i.p=m.clone(e.p),i.q=v.clone(e.q),i},t.neo=function(e,i){var o=Object.create(t.prototype);return o.p=m.clone(e),o.q=v.clone(i),o},t.identity=function(){var e=Object.create(t.prototype);return e.p=m.zero(),e.q=v.identity(),e},t.prototype.setIdentity=function(){this.p.setZero(),this.q.setIdentity()},t.prototype.set=function(t,e){void 0===e?(this.p.set(t.p),this.q.set(t.q)):(this.p.set(t),this.q.set(e))},t.prototype.setNum=function(t,e){this.p.setVec2(t),this.q.setAngle(e)},t.prototype.setTransform=function(t){this.p.setVec2(t.p),this.q.setRot(t.q)},t.isValid=function(t){return null!=t&&(m.isValid(t.p)&&v.isValid(t.q))},t.assert=function(t){},t.mul=function(e,i){if(Array.isArray(i)){for(var o=[],s=0;s0;var e=0!=(t.m_filterMaskBits&this.m_filterCategoryBits),i=0!=(t.m_filterCategoryBits&this.m_filterMaskBits);return e&&i},t}(),M="static",I="kinematic",S="dynamic",P={type:M,position:m.zero(),angle:0,linearVelocity:m.zero(),angularVelocity:0,linearDamping:0,angularDamping:0,fixedRotation:!1,bullet:!1,gravityScale:1,allowSleep:!0,awake:!0,active:!0,userData:null},z=function(){this.mass=0,this.center=m.zero(),this.I=0},T=function(){function t(t,e){e=s(e,P),this.m_world=t,this.m_awakeFlag=e.awake,this.m_autoSleepFlag=e.allowSleep,this.m_bulletFlag=e.bullet,this.m_fixedRotationFlag=e.fixedRotation,this.m_activeFlag=e.active,this.m_islandFlag=!1,this.m_toiFlag=!1,this.m_userData=e.userData,this.m_type=e.type,this.m_type==S?(this.m_mass=1,this.m_invMass=1):(this.m_mass=0,this.m_invMass=0),this.m_I=0,this.m_invI=0,this.m_xf=x.identity(),this.m_xf.p=m.clone(e.position),this.m_xf.q.setAngle(e.angle),this.m_sweep=new g,this.m_sweep.setTransform(this.m_xf),this.c_velocity=new b,this.c_position=new A,this.m_force=m.zero(),this.m_torque=0,this.m_linearVelocity=m.clone(e.linearVelocity),this.m_angularVelocity=e.angularVelocity,this.m_linearDamping=e.linearDamping,this.m_angularDamping=e.angularDamping,this.m_gravityScale=e.gravityScale,this.m_sleepTime=0,this.m_jointList=null,this.m_contactList=null,this.m_fixtureList=null,this.m_prev=null,this.m_next=null,this.m_destroyed=!1}return t.prototype._serialize=function(){for(var t=[],e=this.m_fixtureList;e;e=e.m_next)t.push(e);return{type:this.m_type,bullet:this.m_bulletFlag,position:this.m_xf.p,angle:this.m_xf.q.getAngle(),linearVelocity:this.m_linearVelocity,angularVelocity:this.m_angularVelocity,fixtures:t}},t._deserialize=function(e,i,o){var s=new t(i,e);if(e.fixtures)for(var n=e.fixtures.length-1;n>=0;n--){var r=o(C,e.fixtures[n],s);s._addFixture(r)}return s},t.prototype.isWorldLocked=function(){return!(!this.m_world||!this.m_world.isLocked())},t.prototype.getWorld=function(){return this.m_world},t.prototype.getNext=function(){return this.m_next},t.prototype.setUserData=function(t){this.m_userData=t},t.prototype.getUserData=function(){return this.m_userData},t.prototype.getFixtureList=function(){return this.m_fixtureList},t.prototype.getJointList=function(){return this.m_jointList},t.prototype.getContactList=function(){return this.m_contactList},t.prototype.isStatic=function(){return this.m_type==M},t.prototype.isDynamic=function(){return this.m_type==S},t.prototype.isKinematic=function(){return this.m_type==I},t.prototype.setStatic=function(){return this.setType(M),this},t.prototype.setDynamic=function(){return this.setType(S),this},t.prototype.setKinematic=function(){return this.setType(I),this},t.prototype.getType=function(){return this.m_type},t.prototype.setType=function(t){if(1!=this.isWorldLocked()&&this.m_type!=t){this.m_type=t,this.resetMassData(),this.m_type==M&&(this.m_linearVelocity.setZero(),this.m_angularVelocity=0,this.m_sweep.forward(),this.synchronizeFixtures()),this.setAwake(!0),this.m_force.setZero(),this.m_torque=0;for(var e=this.m_contactList;e;){var i=e;e=e.next,this.m_world.destroyContact(i.contact)}this.m_contactList=null;for(var o=this.m_world.m_broadPhase,s=this.m_fixtureList;s;s=s.m_next)for(var n=s.m_proxyCount,r=0;r0&&this.setAwake(!0),this.m_linearVelocity.setVec2(t))},t.prototype.getAngularVelocity=function(){return this.m_angularVelocity},t.prototype.setAngularVelocity=function(t){this.m_type!=M&&(t*t>0&&this.setAwake(!0),this.m_angularVelocity=t)},t.prototype.getLinearDamping=function(){return this.m_linearDamping},t.prototype.setLinearDamping=function(t){this.m_linearDamping=t},t.prototype.getAngularDamping=function(){return this.m_angularDamping},t.prototype.setAngularDamping=function(t){this.m_angularDamping=t},t.prototype.getGravityScale=function(){return this.m_gravityScale},t.prototype.setGravityScale=function(t){this.m_gravityScale=t},t.prototype.getMass=function(){return this.m_mass},t.prototype.getInertia=function(){return this.m_I+this.m_mass*m.dot(this.m_sweep.localCenter,this.m_sweep.localCenter)},t.prototype.getMassData=function(t){t.mass=this.m_mass,t.I=this.getInertia(),t.center.setVec2(this.m_sweep.localCenter)},t.prototype.resetMassData=function(){if(this.m_mass=0,this.m_invMass=0,this.m_I=0,this.m_invI=0,this.m_sweep.localCenter.setZero(),this.isStatic()||this.isKinematic())return this.m_sweep.c0.setVec2(this.m_xf.p),this.m_sweep.c.setVec2(this.m_xf.p),void(this.m_sweep.a0=this.m_sweep.a);for(var t=m.zero(),e=this.m_fixtureList;e;e=e.m_next)if(0!=e.m_density){var i=new z;e.getMassData(i),this.m_mass+=i.mass,t.addMul(i.mass,i.center),this.m_I+=i.I}this.m_mass>0?(this.m_invMass=1/this.m_mass,t.mul(this.m_invMass)):(this.m_mass=1,this.m_invMass=1),this.m_I>0&&0==this.m_fixedRotationFlag?(this.m_I-=this.m_mass*m.dot(t,t),this.m_invI=1/this.m_I):(this.m_I=0,this.m_invI=0);var o=m.clone(this.m_sweep.c);this.m_sweep.setLocalCenter(t,this.m_xf),this.m_linearVelocity.add(m.crossNumVec2(this.m_angularVelocity,m.sub(this.m_sweep.c,o)))},t.prototype.setMassData=function(t){if(1!=this.isWorldLocked()&&this.m_type==S){this.m_invMass=0,this.m_I=0,this.m_invI=0,this.m_mass=t.mass,this.m_mass<=0&&(this.m_mass=1),this.m_invMass=1/this.m_mass,t.I>0&&0==this.m_fixedRotationFlag&&(this.m_I=t.I-this.m_mass*m.dot(t.center,t.center),this.m_invI=1/this.m_I);var e=m.clone(this.m_sweep.c);this.m_sweep.setLocalCenter(t.center,this.m_xf),this.m_linearVelocity.add(m.crossNumVec2(this.m_angularVelocity,m.sub(this.m_sweep.c,e)))}},t.prototype.applyForce=function(t,e,i){void 0===i&&(i=!0),this.m_type==S&&(i&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&(this.m_force.add(t),this.m_torque+=m.crossVec2Vec2(m.sub(e,this.m_sweep.c),t)))},t.prototype.applyForceToCenter=function(t,e){void 0===e&&(e=!0),this.m_type==S&&(e&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&this.m_force.add(t))},t.prototype.applyTorque=function(t,e){void 0===e&&(e=!0),this.m_type==S&&(e&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&(this.m_torque+=t))},t.prototype.applyLinearImpulse=function(t,e,i){void 0===i&&(i=!0),this.m_type==S&&(i&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&(this.m_linearVelocity.addMul(this.m_invMass,t),this.m_angularVelocity+=this.m_invI*m.crossVec2Vec2(m.sub(e,this.m_sweep.c),t)))},t.prototype.applyAngularImpulse=function(t,e){void 0===e&&(e=!0),this.m_type==S&&(e&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&(this.m_angularVelocity+=this.m_invI*t))},t.prototype.shouldCollide=function(t){if(this.m_type!=S&&t.m_type!=S)return!1;for(var e=this.m_jointList;e;e=e.next)if(e.other==t&&0==e.joint.m_collideConnected)return!1;return!0},t.prototype._addFixture=function(t){if(1==this.isWorldLocked())return null;if(this.m_activeFlag){var e=this.m_world.m_broadPhase;t.createProxies(e,this.m_xf)}return t.m_next=this.m_fixtureList,this.m_fixtureList=t,t.m_density>0&&this.resetMassData(),this.m_world.m_newFixture=!0,t},t.prototype.createFixture=function(t,e){if(1==this.isWorldLocked())return null;var i=new C(this,t,e);return this._addFixture(i),i},t.prototype.destroyFixture=function(t){if(1!=this.isWorldLocked()){if(this.m_fixtureList===t)this.m_fixtureList=t.m_next;else for(var e=this.m_fixtureList;null!=e;){if(e.m_next===t){e.m_next=t.m_next;break}e=e.m_next}for(var i=this.m_contactList;i;){var o=i.contact;i=i.next;var s=o.getFixtureA(),n=o.getFixtureB();t!=s&&t!=n||this.m_world.destroyContact(o)}if(this.m_activeFlag){var r=this.m_world.m_broadPhase;t.destroyProxies(r)}t.m_body=null,t.m_next=null,this.m_world.publish("remove-fixture",t),this.resetMassData()}},t.prototype.getWorldPoint=function(t){return x.mulVec2(this.m_xf,t)},t.prototype.getWorldVector=function(t){return v.mulVec2(this.m_xf.q,t)},t.prototype.getLocalPoint=function(t){return x.mulTVec2(this.m_xf,t)},t.prototype.getLocalVector=function(t){return v.mulTVec2(this.m_xf.q,t)},t.STATIC="static",t.KINEMATIC="kinematic",t.DYNAMIC="dynamic",t}(),k=function(){function t(t,e,i,o){"object"==typeof t&&null!==t?(this.ex=m.clone(t),this.ey=m.clone(e)):"number"==typeof t?(this.ex=m.neo(t,i),this.ey=m.neo(e,o)):(this.ex=m.zero(),this.ey=m.zero())}return t.prototype.toString=function(){return JSON.stringify(this)},t.isValid=function(t){return null!=t&&(m.isValid(t.ex)&&m.isValid(t.ey))},t.assert=function(t){},t.prototype.set=function(t,e,i,o){"number"==typeof t&&"number"==typeof e&&"number"==typeof i&&"number"==typeof o?(this.ex.setNum(t,i),this.ey.setNum(e,o)):"object"==typeof t&&"object"==typeof e?(this.ex.setVec2(t),this.ey.setVec2(e)):"object"==typeof t&&(this.ex.setVec2(t.ex),this.ey.setVec2(t.ey))},t.prototype.setIdentity=function(){this.ex.x=1,this.ey.x=0,this.ex.y=0,this.ey.y=1},t.prototype.setZero=function(){this.ex.x=0,this.ey.x=0,this.ex.y=0,this.ey.y=0},t.prototype.getInverse=function(){var e=this.ex.x,i=this.ey.x,o=this.ex.y,s=this.ey.y,n=e*s-i*o;0!==n&&(n=1/n);var r=new t;return r.ex.x=n*s,r.ey.x=-n*i,r.ex.y=-n*o,r.ey.y=n*e,r},t.prototype.solve=function(t){var e=this.ex.x,i=this.ey.x,o=this.ex.y,s=this.ey.y,n=e*s-i*o;0!==n&&(n=1/n);var r=m.zero();return r.x=n*(s*t.x-i*t.y),r.y=n*(e*t.y-o*t.x),r},t.mul=function(e,i){if(i&&"x"in i&&"y"in i){var o=e.ex.x*i.x+e.ey.x*i.y,s=e.ex.y*i.x+e.ey.y*i.y;return m.neo(o,s)}if(i&&"ex"in i&&"ey"in i)return new t(e.ex.x*i.ex.x+e.ey.x*i.ex.y,e.ex.x*i.ey.x+e.ey.x*i.ey.y,e.ex.y*i.ex.x+e.ey.y*i.ex.y,e.ex.y*i.ey.x+e.ey.y*i.ey.y)},t.mulVec2=function(t,e){var i=t.ex.x*e.x+t.ey.x*e.y,o=t.ex.y*e.x+t.ey.y*e.y;return m.neo(i,o)},t.mulMat22=function(e,i){return new t(e.ex.x*i.ex.x+e.ey.x*i.ex.y,e.ex.x*i.ey.x+e.ey.x*i.ey.y,e.ex.y*i.ex.x+e.ey.y*i.ex.y,e.ex.y*i.ey.x+e.ey.y*i.ey.y)},t.mulT=function(e,i){return i&&"x"in i&&"y"in i?m.neo(m.dot(i,e.ex),m.dot(i,e.ey)):i&&"ex"in i&&"ey"in i?new t(m.neo(m.dot(e.ex,i.ex),m.dot(e.ey,i.ex)),m.neo(m.dot(e.ex,i.ey),m.dot(e.ey,i.ey))):void 0},t.mulTVec2=function(t,e){return m.neo(m.dot(e,t.ex),m.dot(e,t.ey))},t.mulTMat22=function(e,i){return new t(m.neo(m.dot(e.ex,i.ex),m.dot(e.ey,i.ex)),m.neo(m.dot(e.ex,i.ey),m.dot(e.ey,i.ey)))},t.abs=function(e){return new t(m.abs(e.ex),m.abs(e.ey))},t.add=function(e,i){return new t(m.add(e.ex,i.ex),m.add(e.ey,i.ey))},t}();!function(t){t[t.e_circles=0]="e_circles",t[t.e_faceA=1]="e_faceA",t[t.e_faceB=2]="e_faceB"}(a||(a={})),function(t){t[t.e_vertex=0]="e_vertex",t[t.e_face=1]="e_face"}(h||(h={})),function(t){t[t.nullState=0]="nullState",t[t.addState=1]="addState",t[t.persistState=2]="persistState",t[t.removeState=3]="removeState"}(c||(c={}));var L=function(){function t(){this.v=m.zero(),this.id=new N}return t.prototype.set=function(t){this.v.setVec2(t.v),this.id.set(t.id)},t}(),F=function(){function t(){this.localNormal=m.zero(),this.localPoint=m.zero(),this.points=[new q,new q],this.pointCount=0}return t.prototype.getWorldManifold=function(t,e,i,o,s){if(0!=this.pointCount){var n=(t=t||new D).normal,h=t.points,c=t.separations;switch(this.type){case a.e_circles:n=m.neo(1,0);var _=x.mulVec2(e,this.localPoint),l=x.mulVec2(o,this.points[0].localPoint),u=m.sub(l,_);m.lengthSquared(u)>r.EPSILON*r.EPSILON&&(n.setVec2(u),n.normalize());var p=_.clone().addMul(i,n),d=l.clone().addMul(-s,n);h[0]=m.mid(p,d),c[0]=m.dot(m.sub(d,p),n),h.length=1,c.length=1;break;case a.e_faceA:n=v.mulVec2(e.q,this.localNormal);for(var y=x.mulVec2(e,this.localPoint),f=0;fB+w&&t.distance>r.EPSILON){t.distance-=B+w;var V=m.sub(t.pointB,t.pointA);V.normalize(),t.pointA.addMul(B,V),t.pointB.subMul(w,V)}else{var C=m.mid(t.pointA,t.pointB);t.pointA.setVec2(C),t.pointB.setVec2(C),t.distance=0}}}var H=function(){function t(){this.m_buffer=[],this.m_vertices=[],this.m_count=0,this.m_radius=0}return t.prototype.getVertexCount=function(){return this.m_count},t.prototype.getVertex=function(t){return this.m_vertices[t]},t.prototype.getSupport=function(t){for(var e=0,i=m.dot(this.m_vertices[0],t),o=0;oi&&(e=o,i=s)}return e},t.prototype.getSupportVertex=function(t){return this.m_vertices[this.getSupport(t)]},t.prototype.set=function(t,e){t.computeDistanceProxy(this,e)},t}(),Z=function(){function t(){this.wA=m.zero(),this.wB=m.zero(),this.w=m.zero()}return t.prototype.set=function(t){this.indexA=t.indexA,this.indexB=t.indexB,this.wA=m.clone(t.wA),this.wB=m.clone(t.wB),this.w=m.clone(t.w),this.a=t.a},t}(),K=function(){function t(){this.m_v1=new Z,this.m_v2=new Z,this.m_v3=new Z,this.m_v=[this.m_v1,this.m_v2,this.m_v3],this.m_count}return t.prototype.toString=function(){return 3===this.m_count?["+"+this.m_count,this.m_v1.a,this.m_v1.wA.x,this.m_v1.wA.y,this.m_v1.wB.x,this.m_v1.wB.y,this.m_v2.a,this.m_v2.wA.x,this.m_v2.wA.y,this.m_v2.wB.x,this.m_v2.wB.y,this.m_v3.a,this.m_v3.wA.x,this.m_v3.wA.y,this.m_v3.wB.x,this.m_v3.wB.y].toString():2===this.m_count?["+"+this.m_count,this.m_v1.a,this.m_v1.wA.x,this.m_v1.wA.y,this.m_v1.wB.x,this.m_v1.wB.y,this.m_v2.a,this.m_v2.wA.x,this.m_v2.wA.y,this.m_v2.wB.x,this.m_v2.wB.y].toString():1===this.m_count?["+"+this.m_count,this.m_v1.a,this.m_v1.wA.x,this.m_v1.wA.y,this.m_v1.wB.x,this.m_v1.wB.y].toString():"+"+this.m_count},t.prototype.readCache=function(t,e,i,o,s){this.m_count=t.count;for(var n=0;n1){var c=t.metric,_=this.getMetric();(_<.5*c||2*c<_||_0?m.crossNumVec2(1,t):m.crossVec2Num(t,1);default:return m.zero()}},t.prototype.getClosestPoint=function(){switch(this.m_count){case 0:return m.zero();case 1:return m.clone(this.m_v1.w);case 2:return m.combine(this.m_v1.a,this.m_v1.w,this.m_v2.a,this.m_v2.w);case 3:default:return m.zero()}},t.prototype.getWitnessPoints=function(t,e){switch(this.m_count){case 0:break;case 1:t.setVec2(this.m_v1.wA),e.setVec2(this.m_v1.wB);break;case 2:t.setCombine(this.m_v1.a,this.m_v1.wA,this.m_v2.a,this.m_v2.wA),e.setCombine(this.m_v1.a,this.m_v1.wB,this.m_v2.a,this.m_v2.wB);break;case 3:t.setCombine(this.m_v1.a,this.m_v1.wA,this.m_v2.a,this.m_v2.wA),t.addMul(this.m_v3.a,this.m_v3.wA),e.setVec2(t)}},t.prototype.getMetric=function(){switch(this.m_count){case 0:case 1:return 0;case 2:return m.distance(this.m_v1.w,this.m_v2.w);case 3:return m.crossVec2Vec2(m.sub(this.m_v2.w,this.m_v1.w),m.sub(this.m_v3.w,this.m_v1.w));default:return 0}},t.prototype.solve=function(){switch(this.m_count){case 1:break;case 2:this.solve2();break;case 3:this.solve3()}},t.prototype.solve2=function(){var t=this.m_v1.w,e=this.m_v2.w,i=m.sub(e,t),o=-m.dot(t,i);if(o<=0)return this.m_v1.a=1,void(this.m_count=1);var s=m.dot(e,i);if(s<=0)return this.m_v2.a=1,this.m_count=1,void this.m_v1.set(this.m_v2);var n=1/(s+o);this.m_v1.a=s*n,this.m_v2.a=o*n,this.m_count=2},t.prototype.solve3=function(){var t=this.m_v1.w,e=this.m_v2.w,i=this.m_v3.w,o=m.sub(e,t),s=m.dot(t,o),n=m.dot(e,o),r=-s,a=m.sub(i,t),h=m.dot(t,a),c=m.dot(i,a),_=-h,l=m.sub(i,e),u=m.dot(e,l),p=m.dot(i,l),d=-u,y=m.crossVec2Vec2(o,a),f=y*m.crossVec2Vec2(e,i),v=y*m.crossVec2Vec2(i,t),x=y*m.crossVec2Vec2(t,e);if(r<=0&&_<=0)return this.m_v1.a=1,void(this.m_count=1);if(n>0&&r>0&&x<=0){var g=1/(n+r);return this.m_v1.a=n*g,this.m_v2.a=r*g,void(this.m_count=2)}if(c>0&&_>0&&v<=0){var b=1/(c+_);return this.m_v1.a=c*b,this.m_v3.a=_*b,this.m_count=2,void this.m_v2.set(this.m_v3)}if(n<=0&&d<=0)return this.m_v2.a=1,this.m_count=1,void this.m_v1.set(this.m_v2);if(c<=0&&p<=0)return this.m_v3.a=1,this.m_count=1,void this.m_v1.set(this.m_v3);if(p>0&&d>0&&f<=0){var A=1/(p+d);return this.m_v2.a=p*A,this.m_v3.a=d*A,this.m_count=2,void this.m_v1.set(this.m_v3)}var B=1/(f+v+x);this.m_v1.a=f*B,this.m_v2.a=v*B,this.m_v3.a=x*B,this.m_count=3},t}();function G(t,e,i,o,s,n){var a=new O;a.proxyA.set(t,e),a.proxyB.set(i,o),a.transformA=s,a.transformB=n,a.useRadii=!0;var h=new W,c=new X;return J(c,h,a),c.distance<10*r.EPSILON}var U=function(t){this.contact=t};function $(t,e){return r.sqrt(t*e)}function Q(t,e){return t>e?t:e}var tt,et=[],it=function(){this.rA=m.zero(),this.rB=m.zero(),this.normalImpulse=0,this.tangentImpulse=0,this.normalMass=0,this.tangentMass=0,this.velocityBias=0},ot=function(){function t(t,e,i,o,s){this.m_manifold=new F,this.m_prev=null,this.m_next=null,this.m_toi=1,this.m_toiCount=0,this.m_toiFlag=!1,this.m_tangentSpeed=0,this.m_enabledFlag=!0,this.m_islandFlag=!1,this.m_touchingFlag=!1,this.m_filterFlag=!1,this.m_bulletHitFlag=!1,this.m_impulse=new dt(this),this.v_points=[],this.v_normal=m.zero(),this.v_normalMass=new k,this.v_K=new k,this.p_localPoints=[],this.p_localNormal=m.zero(),this.p_localPoint=m.zero(),this.p_localCenterA=m.zero(),this.p_localCenterB=m.zero(),this.m_nodeA=new U(this),this.m_nodeB=new U(this),this.m_fixtureA=t,this.m_fixtureB=i,this.m_indexA=e,this.m_indexB=o,this.m_evaluateFcn=s,this.m_friction=$(this.m_fixtureA.m_friction,this.m_fixtureB.m_friction),this.m_restitution=Q(this.m_fixtureA.m_restitution,this.m_fixtureB.m_restitution)}return t.prototype.initConstraint=function(t){var e=this.m_fixtureA,i=this.m_fixtureB,o=e.getShape(),s=i.getShape(),n=e.getBody(),r=i.getBody(),a=this.getManifold(),h=a.pointCount;this.v_invMassA=n.m_invMass,this.v_invMassB=r.m_invMass,this.v_invIA=n.m_invI,this.v_invIB=r.m_invI,this.v_friction=this.m_friction,this.v_restitution=this.m_restitution,this.v_tangentSpeed=this.m_tangentSpeed,this.v_pointCount=h,this.v_K.setZero(),this.v_normalMass.setZero(),this.p_invMassA=n.m_invMass,this.p_invMassB=r.m_invMass,this.p_invIA=n.m_invI,this.p_invIB=r.m_invI,this.p_localCenterA=m.clone(n.m_sweep.localCenter),this.p_localCenterB=m.clone(r.m_sweep.localCenter),this.p_radiusA=o.m_radius,this.p_radiusB=s.m_radius,this.p_type=a.type,this.p_localNormal=m.clone(a.localNormal),this.p_localPoint=m.clone(a.localPoint),this.p_pointCount=h;for(var c=0;c0;for(var u=0;u0?-R/W:0,H=m.mulNumVec2(J,P);A.subMul(y,H),B-=f*m.crossVec2Vec2(N,H),w.addMul(g,H),V+=b*m.crossVec2Vec2(j,H)}return _.c.setVec2(A),_.a=B,u.c.setVec2(w),u.a=V,C},t.prototype.initVelocityConstraint=function(t){var e=this.m_fixtureA,i=this.m_fixtureB,o=e.getBody(),s=i.getBody(),n=o.c_velocity,r=s.c_velocity,a=o.c_position,h=s.c_position,c=this.p_radiusA,_=this.p_radiusB,u=this.getManifold(),p=this.v_invMassA,d=this.v_invMassB,y=this.v_invIA,f=this.v_invIB,g=m.clone(this.p_localCenterA),b=m.clone(this.p_localCenterB),A=m.clone(a.c),B=a.a,w=m.clone(n.v),V=n.w,C=m.clone(h.c),M=h.a,I=m.clone(r.v),S=r.w,P=x.identity(),z=x.identity();P.q.setAngle(B),z.q.setAngle(M),P.p.setCombine(1,A,-1,v.mulVec2(P.q,g)),z.p.setCombine(1,C,-1,v.mulVec2(z.q,b));var T=u.getWorldManifold(null,P,c,z,_);this.v_normal.setVec2(T.normal);for(var k=0;k0?1/N:0;var j=m.crossVec2Num(this.v_normal,1),D=m.crossVec2Vec2(L.rA,j),Y=m.crossVec2Vec2(L.rB,j),E=p+d+y*D*D+f*Y*Y;L.tangentMass=E>0?1/E:0,L.velocityBias=0;var R=m.dot(this.v_normal,I)+m.dot(this.v_normal,m.crossNumVec2(S,L.rB))-m.dot(this.v_normal,w)-m.dot(this.v_normal,m.crossNumVec2(V,L.rA));R<-l.velocityThreshold&&(L.velocityBias=-this.v_restitution*R)}if(2==this.v_pointCount&&t.blockSolve){var O=this.v_points[0],X=this.v_points[1],W=m.crossVec2Vec2(O.rA,this.v_normal),J=m.crossVec2Vec2(O.rB,this.v_normal),H=m.crossVec2Vec2(X.rA,this.v_normal),Z=m.crossVec2Vec2(X.rB,this.v_normal),K=p+d+y*W*W+f*J*J,G=p+d+y*H*H+f*Z*Z,U=p+d+y*W*H+f*J*Z;K*K<1e3*(K*G-U*U)?(this.v_K.ex.setNum(K,U),this.v_K.ey.setNum(U,G),this.v_normalMass.set(this.v_K.getInverse())):this.v_pointCount=1}a.c.setVec2(A),a.a=B,n.v.setVec2(w),n.w=V,h.c.setVec2(C),h.a=M,r.v.setVec2(I),r.w=S},t.prototype.warmStartConstraint=function(t){var e=this.m_fixtureA,i=this.m_fixtureB,o=e.getBody(),s=i.getBody(),n=o.c_velocity,r=s.c_velocity;o.c_position,s.c_position;for(var a=this.v_invMassA,h=this.v_invIA,c=this.v_invMassB,_=this.v_invIB,l=m.clone(n.v),u=n.w,p=m.clone(r.v),d=r.w,y=this.v_normal,f=m.crossVec2Num(y,1),v=0;v=0&&N.y>=0){var j=m.sub(N,P),D=m.mulNumVec2(j.x,d),Y=m.mulNumVec2(j.y,d);_.subCombine(n,D,n,Y),l-=a*(m.crossVec2Vec2(I.rA,D)+m.crossVec2Vec2(S.rA,Y)),u.addCombine(h,D,h,Y),p+=c*(m.crossVec2Vec2(I.rB,D)+m.crossVec2Vec2(S.rB,Y)),I.normalImpulse=N.x,S.normalImpulse=N.y;break}if(N.x=-I.normalMass*q.x,N.y=0,L=0,F=this.v_K.ex.y*N.x+q.y,N.x>=0&&F>=0){j=m.sub(N,P),D=m.mulNumVec2(j.x,d),Y=m.mulNumVec2(j.y,d);_.subCombine(n,D,n,Y),l-=a*(m.crossVec2Vec2(I.rA,D)+m.crossVec2Vec2(S.rA,Y)),u.addCombine(h,D,h,Y),p+=c*(m.crossVec2Vec2(I.rB,D)+m.crossVec2Vec2(S.rB,Y)),I.normalImpulse=N.x,S.normalImpulse=N.y;break}if(N.x=0,N.y=-S.normalMass*q.y,L=this.v_K.ey.x*N.y+q.x,F=0,N.y>=0&&L>=0){j=m.sub(N,P),D=m.mulNumVec2(j.x,d),Y=m.mulNumVec2(j.y,d);_.subCombine(n,D,n,Y),l-=a*(m.crossVec2Vec2(I.rA,D)+m.crossVec2Vec2(S.rA,Y)),u.addCombine(h,D,h,Y),p+=c*(m.crossVec2Vec2(I.rB,D)+m.crossVec2Vec2(S.rB,Y)),I.normalImpulse=N.x,S.normalImpulse=N.y;break}if(N.x=0,N.y=0,L=q.x,F=q.y,L>=0&&F>=0){j=m.sub(N,P),D=m.mulNumVec2(j.x,d),Y=m.mulNumVec2(j.y,d);_.subCombine(n,D,n,Y),l-=a*(m.crossVec2Vec2(I.rA,D)+m.crossVec2Vec2(S.rA,Y)),u.addCombine(h,D,h,Y),p+=c*(m.crossVec2Vec2(I.rB,D)+m.crossVec2Vec2(S.rB,Y)),I.normalImpulse=N.x,S.normalImpulse=N.y;break}break}}o.v.setVec2(_),o.w=l,s.v.setVec2(u),s.w=p},t.addType=function(t,e,i){et[t]=et[t]||{},et[t][e]=i},t.create=function(e,i,o,s){var n,r,a=e.getType(),h=o.getType();if(r=et[a]&&et[a][h])n=new t(e,i,o,s,r);else{if(!(r=et[h]&&et[h][a]))return null;n=new t(o,s,e,i,r)}e=n.getFixtureA(),o=n.getFixtureB(),i=n.getChildIndexA(),s=n.getChildIndexB();var c=e.getBody(),m=o.getBody();return n.m_nodeA.contact=n,n.m_nodeA.other=m,n.m_nodeA.prev=null,n.m_nodeA.next=c.m_contactList,null!=c.m_contactList&&(c.m_contactList.prev=n.m_nodeA),c.m_contactList=n.m_nodeA,n.m_nodeB.contact=n,n.m_nodeB.other=c,n.m_nodeB.prev=null,n.m_nodeB.next=m.m_contactList,null!=m.m_contactList&&(m.m_contactList.prev=n.m_nodeB),m.m_contactList=n.m_nodeB,0==e.isSensor()&&0==o.isSensor()&&(c.setAwake(!0),m.setAwake(!0)),n},t.destroy=function(t,e){var i=t.m_fixtureA,o=t.m_fixtureB,s=i.getBody(),n=o.getBody();t.isTouching()&&e.endContact(t),t.m_nodeA.prev&&(t.m_nodeA.prev.next=t.m_nodeA.next),t.m_nodeA.next&&(t.m_nodeA.next.prev=t.m_nodeA.prev),t.m_nodeA==s.m_contactList&&(s.m_contactList=t.m_nodeA.next),t.m_nodeB.prev&&(t.m_nodeB.prev.next=t.m_nodeB.next),t.m_nodeB.next&&(t.m_nodeB.next.prev=t.m_nodeB.prev),t.m_nodeB==n.m_contactList&&(n.m_contactList=t.m_nodeB.next),t.m_manifold.pointCount>0&&0==i.isSensor()&&0==o.isSensor()&&(s.setAwake(!0),n.setAwake(!0)),i.getType(),o.getType()},t}(),st=function(){this.other=null,this.joint=null,this.prev=null,this.next=null},nt=function(){function t(t,e,i){this.m_type="unknown-joint",this.m_prev=null,this.m_next=null,this.m_edgeA=new st,this.m_edgeB=new st,this.m_islandFlag=!1,e="bodyA"in t?t.bodyA:e,i="bodyB"in t?t.bodyB:i,this.m_bodyA=e,this.m_bodyB=i,this.m_collideConnected=!!t.collideConnected,this.m_userData=t.userData}return t.prototype.isActive=function(){return this.m_bodyA.isActive()&&this.m_bodyB.isActive()},t.prototype.getType=function(){return this.m_type},t.prototype.getBodyA=function(){return this.m_bodyA},t.prototype.getBodyB=function(){return this.m_bodyB},t.prototype.getNext=function(){return this.m_next},t.prototype.getUserData=function(){return this.m_userData},t.prototype.setUserData=function(t){this.m_userData=t},t.prototype.getCollideConnected=function(){return this.m_collideConnected},t.prototype.shiftOrigin=function(t){},t}(),rt=function(){return Date.now()},at=function(t){return Date.now()-t},ht=function(){this.proxyA=new H,this.proxyB=new H,this.sweepA=new g,this.sweepB=new g};!function(t){t[t.e_unknown=0]="e_unknown",t[t.e_failed=1]="e_failed",t[t.e_overlapped=2]="e_overlapped",t[t.e_touching=3]="e_touching",t[t.e_separated=4]="e_separated"}(tt||(tt={}));var ct,mt=function(){};function _t(t,e){var i=rt();++R.toiCalls,t.state=tt.e_unknown,t.t=e.tMax;var o=e.proxyA,s=e.proxyB,n=e.sweepA,a=e.sweepB;n.normalize(),a.normalize();var h=e.tMax,c=o.m_radius+s.m_radius,m=r.max(l.linearSlop,c-3*l.linearSlop),_=.25*l.linearSlop,u=0,p=l.maxTOIIterations,d=0,y=new W,f=new O;for(f.proxyA=e.proxyA,f.proxyB=e.proxyB,f.useRadii=!1;;){var v=x.identity(),g=x.identity();n.getTransform(v,u),a.getTransform(g,u),f.transformA=v,f.transformB=g;var b=new X;if(J(b,y,f),b.distance<=0){t.state=tt.e_overlapped,t.t=0;break}if(b.distancem+_){t.state=tt.e_separated,t.t=h,B=!0;break}if(C>m-_){u=w;break}var M=A.evaluate(u);if(Mm?(S=z,M=T):(P=z,C=T),50===I)break}if(R.toiMaxRootIters=r.max(R.toiMaxRootIters,I),++V===l.maxPolygonVertices)break}if(++d,++R.toiIters,B)break;if(d===p){t.state=tt.e_failed,t.t=u;break}}R.toiMaxIters=r.max(R.toiMaxIters,d);var k=at(i);R.toiMaxTime=r.max(R.toiMaxTime,k),R.toiTime+=k}R.toiTime=0,R.toiMaxTime=0,R.toiCalls=0,R.toiIters=0,R.toiMaxIters=0,R.toiRootIters=0,R.toiMaxRootIters=0,function(t){t[t.e_points=1]="e_points",t[t.e_faceA=2]="e_faceA",t[t.e_faceB=3]="e_faceB"}(ct||(ct={}));var lt=function(){function t(){this.m_proxyA=new H,this.m_proxyB=new H,this.m_localPoint=m.zero(),this.m_axis=m.zero()}return t.prototype.initialize=function(t,e,i,o,s,n){this.m_proxyA=e,this.m_proxyB=o;var r=t.count;this.m_sweepA=i,this.m_sweepB=s;var a=x.identity(),h=x.identity();if(this.m_sweepA.getTransform(a,n),this.m_sweepB.getTransform(h,n),1===r){this.m_type=ct.e_points;var c=this.m_proxyA.getVertex(t.indexA[0]),_=this.m_proxyB.getVertex(t.indexB[0]),l=x.mulVec2(a,c),u=x.mulVec2(h,_);return this.m_axis.setCombine(1,u,-1,l),b=this.m_axis.normalize()}if(t.indexA[0]===t.indexA[1]){this.m_type=ct.e_faceB;var p=o.getVertex(t.indexB[0]),d=o.getVertex(t.indexB[1]);this.m_axis=m.crossVec2Num(m.sub(d,p),1),this.m_axis.normalize();var y=v.mulVec2(h.q,this.m_axis);this.m_localPoint=m.mid(p,d);u=x.mulVec2(h,this.m_localPoint),c=e.getVertex(t.indexA[0]),l=x.mulVec2(a,c);return(b=m.dot(l,y)-m.dot(u,y))<0&&(this.m_axis=m.neg(this.m_axis),b=-b),b}this.m_type=ct.e_faceA;var f=this.m_proxyA.getVertex(t.indexA[0]),g=this.m_proxyA.getVertex(t.indexA[1]);this.m_axis=m.crossVec2Num(m.sub(g,f),1),this.m_axis.normalize();y=v.mulVec2(a.q,this.m_axis);this.m_localPoint=m.mid(f,g);var b;l=x.mulVec2(a,this.m_localPoint),_=this.m_proxyB.getVertex(t.indexB[0]),u=x.mulVec2(h,_);return(b=m.dot(u,y)-m.dot(l,y))<0&&(this.m_axis=m.neg(this.m_axis),b=-b),b},t.prototype.compute=function(t,e){var i=x.identity(),o=x.identity();switch(this.m_sweepA.getTransform(i,e),this.m_sweepB.getTransform(o,e),this.m_type){case ct.e_points:if(t){var s=v.mulTVec2(i.q,this.m_axis),n=v.mulTVec2(o.q,m.neg(this.m_axis));this.indexA=this.m_proxyA.getSupport(s),this.indexB=this.m_proxyB.getSupport(n)}var r=this.m_proxyA.getVertex(this.indexA),a=this.m_proxyB.getVertex(this.indexB),h=x.mulVec2(i,r),c=x.mulVec2(o,a);return m.dot(c,this.m_axis)-m.dot(h,this.m_axis);case ct.e_faceA:var _=v.mulVec2(i.q,this.m_axis);h=x.mulVec2(i,this.m_localPoint);if(t){n=v.mulTVec2(o.q,m.neg(_));this.indexA=-1,this.indexB=this.m_proxyB.getSupport(n)}a=this.m_proxyB.getVertex(this.indexB),c=x.mulVec2(o,a);return m.dot(c,_)-m.dot(h,_);case ct.e_faceB:_=v.mulVec2(o.q,this.m_axis),c=x.mulVec2(o,this.m_localPoint);if(t){s=v.mulTVec2(i.q,m.neg(_));this.indexB=-1,this.indexA=this.m_proxyA.getSupport(s)}r=this.m_proxyA.getVertex(this.indexA),h=x.mulVec2(i,r);return m.dot(h,_)-m.dot(c,_);default:return t&&(this.indexA=-1,this.indexB=-1),0}},t.prototype.findMinSeparation=function(t){return this.compute(!0,t)},t.prototype.evaluate=function(t){return this.compute(!1,t)},t}(),ut=function(){function t(){this.dt=0,this.inv_dt=0,this.velocityIterations=0,this.positionIterations=0,this.warmStarting=!1,this.blockSolve=!0,this.inv_dt0=0,this.dtRatio=1}return t.prototype.reset=function(t){this.dt>0&&(this.inv_dt0=this.inv_dt),this.dt=t,this.inv_dt=0==t?0:1/t,this.dtRatio=t*this.inv_dt0},t}(),pt=new ut,dt=function(){function t(t){this.contact=t,this.normals=[],this.tangents=[]}return Object.defineProperty(t.prototype,"normalImpulses",{get:function(){var t=this.contact,e=this.normals;e.length=0;for(var i=0;i0;){i=n.pop();if(this.addBody(i),i.setAwake(!0),!i.isStatic()){for(var a=i.m_contactList;a;a=a.next){var h=a.contact;if(!h.m_islandFlag&&(0!=h.isEnabled()&&0!=h.isTouching())){var c=h.m_fixtureA.m_isSensor,m=h.m_fixtureB.m_isSensor;if(!c&&!m)this.addContact(h),h.m_islandFlag=!0,(l=a.other).m_islandFlag||(n.push(l),l.m_islandFlag=!0)}}for(var _=i.m_jointList;_;_=_.next){var l;if(1!=_.joint.m_islandFlag)0!=(l=_.other).isActive()&&(this.addJoint(_.joint),_.joint.m_islandFlag=!0,l.m_islandFlag||(n.push(l),l.m_islandFlag=!0))}}}this.solveIsland(t);for(var u=0;ul.maxTranslationSquared){var y=l.maxTranslation/d.length();_.mul(y)}var f=s*u;if(f*f>l.maxRotationSquared)u*=y=l.maxRotation/r.abs(f);h.addMul(s,_),c+=s*u,a.c_position.c.setVec2(h),a.c_position.a=c,a.c_velocity.v.setVec2(_),a.c_velocity.w=u}var v=!1;for(n=0;n=-3*l.linearSlop,A=!0;for(p=0;pC||m.lengthSquared(a.m_linearVelocity)>V?(a.m_sleepTime=0,w=0):(a.m_sleepTime+=s,w=r.min(w,a.m_sleepTime)))}if(w>=l.timeToSleep&&v)for(n=0;nl.maxSubSteps)){var a=1;if(o.m_toiFlag)a=o.m_toi;else{var h=o.getFixtureA(),c=o.getFixtureB();if(h.isSensor()||c.isSensor())continue;var m=h.getBody(),_=c.getBody(),u=m.isAwake()&&!m.isStatic(),p=_.isAwake()&&!_.isStatic();if(0==u&&0==p)continue;var d=m.isBullet()||!m.isDynamic(),y=_.isBullet()||!_.isDynamic();if(0==d&&0==y)continue;var f=m.m_sweep.alpha0;m.m_sweep.alpha0<_.m_sweep.alpha0?(f=_.m_sweep.alpha0,m.m_sweep.advance(f)):_.m_sweep.alpha0=-1.5*l.linearSlop)break}e.m_sweep.c0.setVec2(e.c_position.c),e.m_sweep.a0=e.c_position.a,i.m_sweep.c0.setVec2(i.c_position.c),i.m_sweep.a0=i.c_position.a;for(o=0;ol.maxTranslationSquared){var f=l.maxTranslation/y.length();p.mul(f)}var v=h*d;if(v*v>l.maxRotationSquared)d*=f=l.maxRotation/r.abs(v);_.addMul(h,p),u+=h*d,c.c_position.c=_,c.c_position.a=u,c.c_velocity.v=p,c.c_velocity.w=d,c.m_sweep.c=_,c.m_sweep.a=u,c.m_linearVelocity=p,c.m_angularVelocity=d,c.synchronizeTransform()}this.postSolveIsland()},t.prototype.postSolveIsland=function(){for(var t=0;t=0;n-=1)s._addBody(o(T,e.bodies[n],s));if(e.joints)for(n=e.joints.length-1;n>=0;n--)s.createJoint(o(nt,e.joints[n],s));return s},t.prototype.getBodyList=function(){return this.m_bodyList},t.prototype.getJointList=function(){return this.m_jointList},t.prototype.getContactList=function(){return this.m_contactList},t.prototype.getBodyCount=function(){return this.m_bodyCount},t.prototype.getJointCount=function(){return this.m_jointCount},t.prototype.getContactCount=function(){return this.m_contactCount},t.prototype.setGravity=function(t){this.m_gravity=t},t.prototype.getGravity=function(){return this.m_gravity},t.prototype.isLocked=function(){return this.m_locked},t.prototype.setAllowSleeping=function(t){if(t!=this.m_allowSleep&&(this.m_allowSleep=t,0==this.m_allowSleep))for(var e=this.m_bodyList;e;e=e.m_next)e.setAwake(!0)},t.prototype.getAllowSleeping=function(){return this.m_allowSleep},t.prototype.setWarmStarting=function(t){this.m_warmStarting=t},t.prototype.getWarmStarting=function(){return this.m_warmStarting},t.prototype.setContinuousPhysics=function(t){this.m_continuousPhysics=t},t.prototype.getContinuousPhysics=function(){return this.m_continuousPhysics},t.prototype.setSubStepping=function(t){this.m_subStepping=t},t.prototype.getSubStepping=function(){return this.m_subStepping},t.prototype.setAutoClearForces=function(t){this.m_clearForces=t},t.prototype.getAutoClearForces=function(){return this.m_clearForces},t.prototype.clearForces=function(){for(var t=this.m_bodyList;t;t=t.getNext())t.m_force.setZero(),t.m_torque=0},t.prototype.queryAABB=function(t,e){var i=this.m_broadPhase;this.m_broadPhase.query(t,(function(t){var o=i.getUserData(t);return e(o.fixture)}))},t.prototype.rayCast=function(t,e,i){var o=this.m_broadPhase;this.m_broadPhase.rayCast({maxFraction:1,p1:t,p2:e},(function(t,e){var s=o.getUserData(e),n=s.fixture,r=s.childIndex,a={};if(n.rayCast(a,t,r)){var h=a.fraction,c=m.add(m.mulNumVec2(1-h,t.p1),m.mulNumVec2(h,t.p2));return i(n,c,a.normal,h)}return t.maxFraction}))},t.prototype.getProxyCount=function(){return this.m_broadPhase.getProxyCount()},t.prototype.getTreeHeight=function(){return this.m_broadPhase.getTreeHeight()},t.prototype.getTreeBalance=function(){return this.m_broadPhase.getTreeBalance()},t.prototype.getTreeQuality=function(){return this.m_broadPhase.getTreeQuality()},t.prototype.shiftOrigin=function(t){if(!this.m_locked){for(var e=this.m_bodyList;e;e=e.m_next)e.m_xf.p.sub(t),e.m_sweep.c0.sub(t),e.m_sweep.c.sub(t);for(var i=this.m_jointList;i;i=i.m_next)i.shiftOrigin(t);this.m_broadPhase.shiftOrigin(t)}},t.prototype._addBody=function(t){this.isLocked()||(t.m_prev=null,t.m_next=this.m_bodyList,this.m_bodyList&&(this.m_bodyList.m_prev=t),this.m_bodyList=t,++this.m_bodyCount)},t.prototype.createBody=function(t,e){if(this.isLocked())return null;var i={};t&&(m.isValid(t)?i={position:t,angle:e}:"object"==typeof t&&(i=t));var o=new T(this,i);return this._addBody(o),o},t.prototype.createDynamicBody=function(t,e){var i={};return t&&(m.isValid(t)?i={position:t,angle:e}:"object"==typeof t&&(i=t)),i.type="dynamic",this.createBody(i)},t.prototype.createKinematicBody=function(t,e){var i={};return t&&(m.isValid(t)?i={position:t,angle:e}:"object"==typeof t&&(i=t)),i.type="kinematic",this.createBody(i)},t.prototype.destroyBody=function(t){if(!this.isLocked()){if(t.m_destroyed)return!1;for(var e=t.m_jointList;e;){var i=e;e=e.next,this.publish("remove-joint",i.joint),this.destroyJoint(i.joint),t.m_jointList=e}t.m_jointList=null;for(var o=t.m_contactList;o;){var s=o;o=o.next,this.destroyContact(s.contact),t.m_contactList=o}t.m_contactList=null;for(var n=t.m_fixtureList;n;){var r=n;n=n.m_next,this.publish("remove-fixture",r),r.destroyProxies(this.m_broadPhase),t.m_fixtureList=n}return t.m_fixtureList=null,t.m_prev&&(t.m_prev.m_next=t.m_next),t.m_next&&(t.m_next.m_prev=t.m_prev),t==this.m_bodyList&&(this.m_bodyList=t.m_next),t.m_destroyed=!0,--this.m_bodyCount,this.publish("remove-body",t),!0}},t.prototype.createJoint=function(t){if(this.isLocked())return null;if(t.m_prev=null,t.m_next=this.m_jointList,this.m_jointList&&(this.m_jointList.m_prev=t),this.m_jointList=t,++this.m_jointCount,t.m_edgeA.joint=t,t.m_edgeA.other=t.m_bodyB,t.m_edgeA.prev=null,t.m_edgeA.next=t.m_bodyA.m_jointList,t.m_bodyA.m_jointList&&(t.m_bodyA.m_jointList.prev=t.m_edgeA),t.m_bodyA.m_jointList=t.m_edgeA,t.m_edgeB.joint=t,t.m_edgeB.other=t.m_bodyA,t.m_edgeB.prev=null,t.m_edgeB.next=t.m_bodyB.m_jointList,t.m_bodyB.m_jointList&&(t.m_bodyB.m_jointList.prev=t.m_edgeB),t.m_bodyB.m_jointList=t.m_edgeB,0==t.m_collideConnected)for(var e=t.m_bodyB.getContactList();e;e=e.next)e.other==t.m_bodyA&&e.contact.flagForFiltering();return t},t.prototype.destroyJoint=function(t){if(!this.isLocked()){t.m_prev&&(t.m_prev.m_next=t.m_next),t.m_next&&(t.m_next.m_prev=t.m_prev),t==this.m_jointList&&(this.m_jointList=t.m_next);var e=t.m_bodyA,i=t.m_bodyB;if(e.setAwake(!0),i.setAwake(!0),t.m_edgeA.prev&&(t.m_edgeA.prev.next=t.m_edgeA.next),t.m_edgeA.next&&(t.m_edgeA.next.prev=t.m_edgeA.prev),t.m_edgeA==e.m_jointList&&(e.m_jointList=t.m_edgeA.next),t.m_edgeA.prev=null,t.m_edgeA.next=null,t.m_edgeB.prev&&(t.m_edgeB.prev.next=t.m_edgeB.next),t.m_edgeB.next&&(t.m_edgeB.next.prev=t.m_edgeB.prev),t.m_edgeB==i.m_jointList&&(i.m_jointList=t.m_edgeB.next),t.m_edgeB.prev=null,t.m_edgeB.next=null,--this.m_jointCount,0==t.m_collideConnected)for(var o=i.getContactList();o;)o.other==e&&o.contact.flagForFiltering(),o=o.next;this.publish("remove-joint",t)}},t.prototype.step=function(t,e,i){if(this.publish("pre-step",t),(0|e)!==e&&(e=0),e=e||this.m_velocityIterations,i=i||this.m_positionIterations,this.m_newFixture&&(this.findNewContacts(),this.m_newFixture=!1),this.m_locked=!0,this.s_step.reset(t),this.s_step.velocityIterations=e,this.s_step.positionIterations=i,this.s_step.warmStarting=this.m_warmStarting,this.s_step.blockSolve=this.m_blockSolve,this.updateContacts(),this.m_stepComplete&&t>0){this.m_solver.solveWorld(this.s_step);for(var o=this.m_bodyList;o;o=o.getNext())0!=o.m_islandFlag&&(o.isStatic()||o.synchronizeFixtures());this.findNewContacts()}this.m_continuousPhysics&&t>0&&this.m_solver.solveWorldTOI(this.s_step),this.m_clearForces&&this.clearForces(),this.m_locked=!1,this.publish("post-step",t)},t.prototype.findNewContacts=function(){this.m_broadPhase.updatePairs(this.createContact)},t.prototype.updateContacts=function(){for(var t,e=this.m_contactList;t=e;){e=t.getNext();var i=t.getFixtureA(),o=t.getFixtureB(),s=t.getChildIndexA(),n=t.getChildIndexB(),r=i.getBody(),a=o.getBody();if(t.m_filterFlag){if(0==a.shouldCollide(r)){this.destroyContact(t);continue}if(0==o.shouldCollide(i)){this.destroyContact(t);continue}t.m_filterFlag=!1}var h=r.isAwake()&&!r.isStatic(),c=a.isAwake()&&!a.isStatic();if(0!=h||0!=c){var m=i.m_proxies[s].proxyId,_=o.m_proxies[n].proxyId;0!=this.m_broadPhase.testOverlap(m,_)?t.update(this):this.destroyContact(t)}}},t.prototype.destroyContact=function(t){ot.destroy(t,this),t.m_prev&&(t.m_prev.m_next=t.m_next),t.m_next&&(t.m_next.m_prev=t.m_prev),t==this.m_contactList&&(this.m_contactList=t.m_next),--this.m_contactCount},t.prototype.on=function(t,e){return"string"!=typeof t||"function"!=typeof e||(this._listeners||(this._listeners={}),this._listeners[t]||(this._listeners[t]=[]),this._listeners[t].push(e)),this},t.prototype.off=function(t,e){if("string"!=typeof t||"function"!=typeof e)return this;var i=this._listeners&&this._listeners[t];if(!i||!i.length)return this;var o=i.indexOf(e);return o>=0&&i.splice(o,1),this},t.prototype.publish=function(t,e,i,o){var s=this._listeners&&this._listeners[t];if(!s||!s.length)return 0;for(var n=0;n0?v.mulVec2(i.q,_).neg():v.mulVec2(i.q,_),!0)},e.prototype.computeAABB=function(t,e,i){var o=x.mulVec2(e,this.m_vertex1),s=x.mulVec2(e,this.m_vertex2);t.combinePoints(o,s),t.extend(this.m_radius)},e.prototype.computeMass=function(t,e){t.mass=0,t.center.setCombine(.5,this.m_vertex1,.5,this.m_vertex2),t.I=0},e.prototype.computeDistanceProxy=function(t){t.m_vertices.push(this.m_vertex1),t.m_vertices.push(this.m_vertex2),t.m_count=2,t.m_radius=this.m_radius},e.TYPE="edge",e}(B),bt=function(t){function e(i,o){var s=this;return s instanceof e?((s=t.call(this)||this).m_type=e.TYPE,s.m_radius=l.polygonRadius,s.m_vertices=[],s.m_count=0,s.m_prevVertex=null,s.m_nextVertex=null,s.m_hasPrevVertex=!1,s.m_hasNextVertex=!1,s.m_isLoop=!!o,i&&i.length&&(o?s._createLoop(i):s._createChain(i)),s):new e(i,o)}return i(e,t),e.prototype._serialize=function(){var t={type:this.m_type,vertices:this.m_vertices,isLoop:this.m_isLoop,hasPrevVertex:this.m_hasPrevVertex,hasNextVertex:this.m_hasNextVertex,prevVertex:null,nextVertex:null};return this.m_prevVertex&&(t.prevVertex=this.m_prevVertex),this.m_nextVertex&&(t.nextVertex=this.m_nextVertex),t},e._deserialize=function(t,i,o){var s=[];if(t.vertices)for(var n=0;n0?(t.m_vertex0=this.m_vertices[e-1],t.m_hasVertex0=!0):(t.m_vertex0=this.m_prevVertex,t.m_hasVertex0=this.m_hasPrevVertex),ec||_===c&&i[o].yf.lengthSquared()&&(y=a)}else y=a;if(++p,d=y,y===h)break}if(p<3)this._setAsBox(1,1);else{this.m_count=p,this.m_vertices=[];for(o=0;o0)return!1}return!0},e.prototype.rayCast=function(t,e,i,o){for(var s=v.mulTVec2(i.q,m.sub(e.p1,i.p)),n=v.mulTVec2(i.q,m.sub(e.p2,i.p)),r=m.sub(n,s),a=0,h=e.maxFraction,c=-1,_=0;_0&&l=0&&(t.fraction=a,t.normal=v.mulVec2(i.q,this.m_normals[c]),!0)},e.prototype.computeAABB=function(t,e,i){for(var o=1/0,s=1/0,n=-1/0,a=-1/0,h=0;h0?this.m_length=+t.length:t.length<0||(t.anchorA||t.anchorA||t.anchorA||t.anchorA)&&(this.m_length=m.distance(this.m_bodyA.getWorldPoint(this.m_localAnchorA),this.m_bodyB.getWorldPoint(this.m_localAnchorB)))},e.prototype.getLocalAnchorA=function(){return this.m_localAnchorA},e.prototype.getLocalAnchorB=function(){return this.m_localAnchorB},e.prototype.setLength=function(t){this.m_length=t},e.prototype.getLength=function(){return this.m_length},e.prototype.setFrequency=function(t){this.m_frequencyHz=t},e.prototype.getFrequency=function(){return this.m_frequencyHz},e.prototype.setDampingRatio=function(t){this.m_dampingRatio=t},e.prototype.getDampingRatio=function(){return this.m_dampingRatio},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return m.mulNumVec2(this.m_impulse,this.m_u).mul(t)},e.prototype.getReactionTorque=function(t){return 0},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyA.c_velocity.v,s=this.m_bodyA.c_velocity.w,n=this.m_bodyB.c_position.c,a=this.m_bodyB.c_position.a,h=this.m_bodyB.c_velocity.v,c=this.m_bodyB.c_velocity.w,_=v.neo(i),u=v.neo(a);this.m_rA=v.mulVec2(_,m.sub(this.m_localAnchorA,this.m_localCenterA)),this.m_rB=v.mulVec2(u,m.sub(this.m_localAnchorB,this.m_localCenterB)),this.m_u=m.sub(m.add(n,this.m_rB),m.add(e,this.m_rA));var p=this.m_u.length();p>l.linearSlop?this.m_u.mul(1/p):this.m_u.setNum(0,0);var d=m.crossVec2Vec2(this.m_rA,this.m_u),y=m.crossVec2Vec2(this.m_rB,this.m_u),f=this.m_invMassA+this.m_invIA*d*d+this.m_invMassB+this.m_invIB*y*y;if(this.m_mass=0!=f?1/f:0,this.m_frequencyHz>0){var x=p-this.m_length,g=2*r.PI*this.m_frequencyHz,b=2*this.m_mass*this.m_dampingRatio*g,A=this.m_mass*g*g,B=t.dt;this.m_gamma=B*(b+B*A),this.m_gamma=0!=this.m_gamma?1/this.m_gamma:0,this.m_bias=x*B*A*this.m_gamma,f+=this.m_gamma,this.m_mass=0!=f?1/f:0}else this.m_gamma=0,this.m_bias=0;if(t.warmStarting){this.m_impulse*=t.dtRatio;var w=m.mulNumVec2(this.m_impulse,this.m_u);o.subMul(this.m_invMassA,w),s-=this.m_invIA*m.crossVec2Vec2(this.m_rA,w),h.addMul(this.m_invMassB,w),c+=this.m_invIB*m.crossVec2Vec2(this.m_rB,w)}else this.m_impulse=0;this.m_bodyA.c_velocity.v.setVec2(o),this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v.setVec2(h),this.m_bodyB.c_velocity.w=c},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=m.add(e,m.crossNumVec2(i,this.m_rA)),r=m.add(o,m.crossNumVec2(s,this.m_rB)),a=m.dot(this.m_u,r)-m.dot(this.m_u,n),h=-this.m_mass*(a+this.m_bias+this.m_gamma*this.m_impulse);this.m_impulse+=h;var c=m.mulNumVec2(h,this.m_u);e.subMul(this.m_invMassA,c),i-=this.m_invIA*m.crossVec2Vec2(this.m_rA,c),o.addMul(this.m_invMassB,c),s+=this.m_invIB*m.crossVec2Vec2(this.m_rB,c),this.m_bodyA.c_velocity.v.setVec2(e),this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v.setVec2(o),this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){if(this.m_frequencyHz>0)return!0;var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyB.c_position.c,s=this.m_bodyB.c_position.a,n=v.neo(i),a=v.neo(s),h=v.mulSub(n,this.m_localAnchorA,this.m_localCenterA),c=v.mulSub(a,this.m_localAnchorB,this.m_localCenterB),_=m.sub(m.add(o,c),m.add(e,h)),u=_.normalize()-this.m_length;u=r.clamp(u,-l.maxLinearCorrection,l.maxLinearCorrection);var p=-this.m_mass*u,d=m.mulNumVec2(p,_);return e.subMul(this.m_invMassA,d),i-=this.m_invIA*m.crossVec2Vec2(h,d),o.addMul(this.m_invMassB,d),s+=this.m_invIB*m.crossVec2Vec2(c,d),this.m_bodyA.c_position.c.setVec2(e),this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c.setVec2(o),this.m_bodyB.c_position.a=s,r.abs(u)0&&(this.m_angularMass=1/this.m_angularMass),t.warmStarting){this.m_linearImpulse.mul(t.dtRatio),this.m_angularImpulse*=t.dtRatio;var d=m.neo(this.m_linearImpulse.x,this.m_linearImpulse.y);i.subMul(c,d),o-=l*(m.crossVec2Vec2(this.m_rA,d)+this.m_angularImpulse),n.addMul(_,d),r+=u*(m.crossVec2Vec2(this.m_rB,d)+this.m_angularImpulse)}else this.m_linearImpulse.setZero(),this.m_angularImpulse=0;this.m_bodyA.c_velocity.v=i,this.m_bodyA.c_velocity.w=o,this.m_bodyB.c_velocity.v=n,this.m_bodyB.c_velocity.w=r},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=this.m_invMassA,a=this.m_invMassB,h=this.m_invIA,c=this.m_invIB,_=t.dt,l=s-i,u=-this.m_angularMass*l,p=this.m_angularImpulse,d=_*this.m_maxTorque;this.m_angularImpulse=r.clamp(this.m_angularImpulse+u,-d,d),i-=h*(u=this.m_angularImpulse-p),s+=c*u;l=m.sub(m.add(o,m.crossNumVec2(s,this.m_rB)),m.add(e,m.crossNumVec2(i,this.m_rA))),u=m.neg(k.mulVec2(this.m_linearMass,l)),p=this.m_linearImpulse;this.m_linearImpulse.add(u);d=_*this.m_maxForce;this.m_linearImpulse.lengthSquared()>d*d&&(this.m_linearImpulse.normalize(),this.m_linearImpulse.mul(d)),u=m.sub(this.m_linearImpulse,p),e.subMul(n,u),i-=h*m.crossVec2Vec2(this.m_rA,u),o.addMul(a,u),s+=c*m.crossVec2Vec2(this.m_rB,u),this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){return!0},e.TYPE="friction-joint",e}(nt),St=function(){function t(t,e,i){"object"==typeof t&&null!==t?(this.ex=xt.clone(t),this.ey=xt.clone(e),this.ez=xt.clone(i)):(this.ex=xt.zero(),this.ey=xt.zero(),this.ez=xt.zero())}return t.prototype.toString=function(){return JSON.stringify(this)},t.isValid=function(t){return null!=t&&(xt.isValid(t.ex)&&xt.isValid(t.ey)&&xt.isValid(t.ez))},t.assert=function(t){},t.prototype.setZero=function(){return this.ex.setZero(),this.ey.setZero(),this.ez.setZero(),this},t.prototype.solve33=function(t){var e=xt.dot(this.ex,xt.cross(this.ey,this.ez));0!==e&&(e=1/e);var i=new xt;return i.x=e*xt.dot(t,xt.cross(this.ey,this.ez)),i.y=e*xt.dot(this.ex,xt.cross(t,this.ez)),i.z=e*xt.dot(this.ex,xt.cross(this.ey,t)),i},t.prototype.solve22=function(t){var e=this.ex.x,i=this.ey.x,o=this.ex.y,s=this.ey.y,n=e*s-i*o;0!==n&&(n=1/n);var r=m.zero();return r.x=n*(s*t.x-i*t.y),r.y=n*(e*t.y-o*t.x),r},t.prototype.getInverse22=function(t){var e=this.ex.x,i=this.ey.x,o=this.ex.y,s=this.ey.y,n=e*s-i*o;0!==n&&(n=1/n),t.ex.x=n*s,t.ey.x=-n*i,t.ex.z=0,t.ex.y=-n*o,t.ey.y=n*e,t.ey.z=0,t.ez.x=0,t.ez.y=0,t.ez.z=0},t.prototype.getSymInverse33=function(t){var e=xt.dot(this.ex,xt.cross(this.ey,this.ez));0!==e&&(e=1/e);var i=this.ex.x,o=this.ey.x,s=this.ez.x,n=this.ey.y,r=this.ez.y,a=this.ez.z;t.ex.x=e*(n*a-r*r),t.ex.y=e*(s*r-o*a),t.ex.z=e*(o*r-s*n),t.ey.x=t.ex.y,t.ey.y=e*(i*a-s*s),t.ey.z=e*(s*o-i*r),t.ez.x=t.ex.z,t.ez.y=t.ey.z,t.ez.z=e*(i*n-o*o)},t.mul=function(t,e){if(e&&"z"in e&&"y"in e&&"x"in e){var i=t.ex.x*e.x+t.ey.x*e.y+t.ez.x*e.z,o=t.ex.y*e.x+t.ey.y*e.y+t.ez.y*e.z,s=t.ex.z*e.x+t.ey.z*e.y+t.ez.z*e.z;return new xt(i,o,s)}if(e&&"y"in e&&"x"in e){i=t.ex.x*e.x+t.ey.x*e.y,o=t.ex.y*e.x+t.ey.y*e.y;return m.neo(i,o)}},t.mulVec3=function(t,e){var i=t.ex.x*e.x+t.ey.x*e.y+t.ez.x*e.z,o=t.ex.y*e.x+t.ey.y*e.y+t.ez.y*e.z,s=t.ex.z*e.x+t.ey.z*e.y+t.ez.z*e.z;return new xt(i,o,s)},t.mulVec2=function(t,e){var i=t.ex.x*e.x+t.ey.x*e.y,o=t.ex.y*e.x+t.ey.y*e.y;return m.neo(i,o)},t.add=function(e,i){return new t(xt.add(e.ex,i.ex),xt.add(e.ey,i.ey),xt.add(e.ez,i.ez))},t}(),Pt={lowerAngle:0,upperAngle:0,maxMotorTorque:0,motorSpeed:0,enableLimit:!1,enableMotor:!1},zt=function(t){function e(i,o,n,a){var h=this;return h instanceof e?(i=s(i,Pt),(h=t.call(this,i,o,n)||this).m_mass=new St,h.m_limitState=0,o=h.m_bodyA,n=h.m_bodyB,h.m_type=e.TYPE,h.m_localAnchorA=m.clone(a?o.getLocalPoint(a):i.localAnchorA||m.zero()),h.m_localAnchorB=m.clone(a?n.getLocalPoint(a):i.localAnchorB||m.zero()),h.m_referenceAngle=r.isFinite(i.referenceAngle)?i.referenceAngle:n.getAngle()-o.getAngle(),h.m_impulse=new xt,h.m_motorImpulse=0,h.m_lowerAngle=i.lowerAngle,h.m_upperAngle=i.upperAngle,h.m_maxMotorTorque=i.maxMotorTorque,h.m_motorSpeed=i.motorSpeed,h.m_enableLimit=i.enableLimit,h.m_enableMotor=i.enableMotor,h):new e(i,o,n,a)}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,lowerAngle:this.m_lowerAngle,upperAngle:this.m_upperAngle,maxMotorTorque:this.m_maxMotorTorque,motorSpeed:this.m_motorSpeed,enableLimit:this.m_enableLimit,enableMotor:this.m_enableMotor,localAnchorA:this.m_localAnchorA,localAnchorB:this.m_localAnchorB,referenceAngle:this.m_referenceAngle}},e._deserialize=function(t,i,s){return(t=o({},t)).bodyA=s(T,t.bodyA,i),t.bodyB=s(T,t.bodyB,i),new e(t)},e.prototype._setAnchors=function(t){t.anchorA?this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(t.anchorA)):t.localAnchorA&&this.m_localAnchorA.setVec2(t.localAnchorA),t.anchorB?this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(t.anchorB)):t.localAnchorB&&this.m_localAnchorB.setVec2(t.localAnchorB)},e.prototype.getLocalAnchorA=function(){return this.m_localAnchorA},e.prototype.getLocalAnchorB=function(){return this.m_localAnchorB},e.prototype.getReferenceAngle=function(){return this.m_referenceAngle},e.prototype.getJointAngle=function(){var t=this.m_bodyA;return this.m_bodyB.m_sweep.a-t.m_sweep.a-this.m_referenceAngle},e.prototype.getJointSpeed=function(){var t=this.m_bodyA;return this.m_bodyB.m_angularVelocity-t.m_angularVelocity},e.prototype.isMotorEnabled=function(){return this.m_enableMotor},e.prototype.enableMotor=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableMotor=t},e.prototype.getMotorTorque=function(t){return t*this.m_motorImpulse},e.prototype.setMotorSpeed=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_motorSpeed=t},e.prototype.getMotorSpeed=function(){return this.m_motorSpeed},e.prototype.setMaxMotorTorque=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_maxMotorTorque=t},e.prototype.getMaxMotorTorque=function(){return this.m_maxMotorTorque},e.prototype.isLimitEnabled=function(){return this.m_enableLimit},e.prototype.enableLimit=function(t){t!=this.m_enableLimit&&(this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableLimit=t,this.m_impulse.z=0)},e.prototype.getLowerLimit=function(){return this.m_lowerAngle},e.prototype.getUpperLimit=function(){return this.m_upperAngle},e.prototype.setLimits=function(t,e){t==this.m_lowerAngle&&e==this.m_upperAngle||(this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_impulse.z=0,this.m_lowerAngle=t,this.m_upperAngle=e)},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return m.neo(this.m_impulse.x,this.m_impulse.y).mul(t)},e.prototype.getReactionTorque=function(t){return t*this.m_impulse.z},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyA.c_position.a,i=this.m_bodyA.c_velocity.v,o=this.m_bodyA.c_velocity.w,s=this.m_bodyB.c_position.a,n=this.m_bodyB.c_velocity.v,a=this.m_bodyB.c_velocity.w,h=v.neo(e),c=v.neo(s);this.m_rA=v.mulVec2(h,m.sub(this.m_localAnchorA,this.m_localCenterA)),this.m_rB=v.mulVec2(c,m.sub(this.m_localAnchorB,this.m_localCenterB));var _=this.m_invMassA,u=this.m_invMassB,p=this.m_invIA,d=this.m_invIB,y=p+d===0;if(this.m_mass.ex.x=_+u+this.m_rA.y*this.m_rA.y*p+this.m_rB.y*this.m_rB.y*d,this.m_mass.ey.x=-this.m_rA.y*this.m_rA.x*p-this.m_rB.y*this.m_rB.x*d,this.m_mass.ez.x=-this.m_rA.y*p-this.m_rB.y*d,this.m_mass.ex.y=this.m_mass.ey.x,this.m_mass.ey.y=_+u+this.m_rA.x*this.m_rA.x*p+this.m_rB.x*this.m_rB.x*d,this.m_mass.ez.y=this.m_rA.x*p+this.m_rB.x*d,this.m_mass.ex.z=this.m_mass.ez.x,this.m_mass.ey.z=this.m_mass.ez.y,this.m_mass.ez.z=p+d,this.m_motorMass=p+d,this.m_motorMass>0&&(this.m_motorMass=1/this.m_motorMass),(0==this.m_enableMotor||y)&&(this.m_motorImpulse=0),this.m_enableLimit&&0==y){var f=s-e-this.m_referenceAngle;r.abs(this.m_upperAngle-this.m_lowerAngle)<2*l.angularSlop?this.m_limitState=3:f<=this.m_lowerAngle?(1!=this.m_limitState&&(this.m_impulse.z=0),this.m_limitState=1):f>=this.m_upperAngle?(2!=this.m_limitState&&(this.m_impulse.z=0),this.m_limitState=2):(this.m_limitState=0,this.m_impulse.z=0)}else this.m_limitState=0;if(t.warmStarting){this.m_impulse.mul(t.dtRatio),this.m_motorImpulse*=t.dtRatio;var x=m.neo(this.m_impulse.x,this.m_impulse.y);i.subMul(_,x),o-=p*(m.crossVec2Vec2(this.m_rA,x)+this.m_motorImpulse+this.m_impulse.z),n.addMul(u,x),a+=d*(m.crossVec2Vec2(this.m_rB,x)+this.m_motorImpulse+this.m_impulse.z)}else this.m_impulse.setZero(),this.m_motorImpulse=0;this.m_bodyA.c_velocity.v=i,this.m_bodyA.c_velocity.w=o,this.m_bodyB.c_velocity.v=n,this.m_bodyB.c_velocity.w=a},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=this.m_invMassA,a=this.m_invMassB,h=this.m_invIA,c=this.m_invIB,_=h+c===0;if(this.m_enableMotor&&3!=this.m_limitState&&0==_){var l=s-i-this.m_motorSpeed,u=-this.m_motorMass*l,p=this.m_motorImpulse,d=t.dt*this.m_maxMotorTorque;this.m_motorImpulse=r.clamp(this.m_motorImpulse+u,-d,d),i-=h*(u=this.m_motorImpulse-p),s+=c*u}if(this.m_enableLimit&&0!=this.m_limitState&&0==_){var y=m.zero();y.addCombine(1,o,1,m.crossNumVec2(s,this.m_rB)),y.subCombine(1,e,1,m.crossNumVec2(i,this.m_rA));var f=s-i;l=new xt(y.x,y.y,f),u=xt.neg(this.m_mass.solve33(l));if(3==this.m_limitState)this.m_impulse.add(u);else if(1==this.m_limitState){if(this.m_impulse.z+u.z<0){var v=m.combine(-1,y,this.m_impulse.z,m.neo(this.m_mass.ez.x,this.m_mass.ez.y)),x=this.m_mass.solve22(v);u.x=x.x,u.y=x.y,u.z=-this.m_impulse.z,this.m_impulse.x+=x.x,this.m_impulse.y+=x.y,this.m_impulse.z=0}else this.m_impulse.add(u)}else if(2==this.m_limitState){if(this.m_impulse.z+u.z>0){v=m.combine(-1,y,this.m_impulse.z,m.neo(this.m_mass.ez.x,this.m_mass.ez.y)),x=this.m_mass.solve22(v);u.x=x.x,u.y=x.y,u.z=-this.m_impulse.z,this.m_impulse.x+=x.x,this.m_impulse.y+=x.y,this.m_impulse.z=0}else this.m_impulse.add(u)}var g=m.neo(u.x,u.y);e.subMul(n,g),i-=h*(m.crossVec2Vec2(this.m_rA,g)+u.z),o.addMul(a,g),s+=c*(m.crossVec2Vec2(this.m_rB,g)+u.z)}else{(l=m.zero()).addCombine(1,o,1,m.crossNumVec2(s,this.m_rB)),l.subCombine(1,e,1,m.crossNumVec2(i,this.m_rA));u=this.m_mass.solve22(m.neg(l));this.m_impulse.x+=u.x,this.m_impulse.y+=u.y,e.subMul(n,u),i-=h*m.crossVec2Vec2(this.m_rA,u),o.addMul(a,u),s+=c*m.crossVec2Vec2(this.m_rB,u)}this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){var e,i=this.m_bodyA.c_position.c,o=this.m_bodyA.c_position.a,s=this.m_bodyB.c_position.c,n=this.m_bodyB.c_position.a,a=v.neo(o),h=v.neo(n),c=0,_=this.m_invIA+this.m_invIB==0;if(this.m_enableLimit&&0!=this.m_limitState&&0==_){var u=n-o-this.m_referenceAngle,p=0;if(3==this.m_limitState){var d=r.clamp(u-this.m_lowerAngle,-l.maxAngularCorrection,l.maxAngularCorrection);p=-this.m_motorMass*d,c=r.abs(d)}else if(1==this.m_limitState){c=-(d=u-this.m_lowerAngle),d=r.clamp(d+l.angularSlop,-l.maxAngularCorrection,0),p=-this.m_motorMass*d}else if(2==this.m_limitState){c=d=u-this.m_upperAngle,d=r.clamp(d-l.angularSlop,0,l.maxAngularCorrection),p=-this.m_motorMass*d}o-=this.m_invIA*p,n+=this.m_invIB*p}a.setAngle(o),h.setAngle(n);var y=v.mulVec2(a,m.sub(this.m_localAnchorA,this.m_localCenterA)),f=v.mulVec2(h,m.sub(this.m_localAnchorB,this.m_localCenterB));(d=m.zero()).addCombine(1,s,1,f),d.subCombine(1,i,1,y),e=d.length();var x=this.m_invMassA,g=this.m_invMassB,b=this.m_invIA,A=this.m_invIB,B=new k;B.ex.x=x+g+b*y.y*y.y+A*f.y*f.y,B.ex.y=-b*y.x*y.y-A*f.x*f.y,B.ey.x=B.ex.y,B.ey.y=x+g+b*y.x*y.x+A*f.x*f.x;var w=m.neg(B.solve(d));return i.subMul(x,w),o-=b*m.crossVec2Vec2(y,w),s.addMul(g,w),n+=A*m.crossVec2Vec2(f,w),this.m_bodyA.c_position.c.setVec2(i),this.m_bodyA.c_position.a=o,this.m_bodyB.c_position.c.setVec2(s),this.m_bodyB.c_position.a=n,e<=l.linearSlop&&c<=l.angularSlop},e.TYPE="revolute-joint",e}(nt),Tt={enableLimit:!1,lowerTranslation:0,upperTranslation:0,enableMotor:!1,maxMotorForce:0,motorSpeed:0},kt=function(t){function e(i,o,n,a,h){var c=this;return c instanceof e?(i=s(i,Tt),o=(c=t.call(this,i,o,n)||this).m_bodyA,n=c.m_bodyB,c.m_type=e.TYPE,c.m_localAnchorA=m.clone(a?o.getLocalPoint(a):i.localAnchorA||m.zero()),c.m_localAnchorB=m.clone(a?n.getLocalPoint(a):i.localAnchorB||m.zero()),c.m_localXAxisA=m.clone(h?o.getLocalVector(h):i.localAxisA||m.neo(1,0)),c.m_localXAxisA.normalize(),c.m_localYAxisA=m.crossNumVec2(1,c.m_localXAxisA),c.m_referenceAngle=r.isFinite(i.referenceAngle)?i.referenceAngle:n.getAngle()-o.getAngle(),c.m_impulse=new xt,c.m_motorMass=0,c.m_motorImpulse=0,c.m_lowerTranslation=i.lowerTranslation,c.m_upperTranslation=i.upperTranslation,c.m_maxMotorForce=i.maxMotorForce,c.m_motorSpeed=i.motorSpeed,c.m_enableLimit=i.enableLimit,c.m_enableMotor=i.enableMotor,c.m_limitState=0,c.m_axis=m.zero(),c.m_perp=m.zero(),c.m_K=new St,c):new e(i,o,n,a,h)}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,lowerTranslation:this.m_lowerTranslation,upperTranslation:this.m_upperTranslation,maxMotorForce:this.m_maxMotorForce,motorSpeed:this.m_motorSpeed,enableLimit:this.m_enableLimit,enableMotor:this.m_enableMotor,localAnchorA:this.m_localAnchorA,localAnchorB:this.m_localAnchorB,localAxisA:this.m_localXAxisA,referenceAngle:this.m_referenceAngle}},e._deserialize=function(t,i,s){return(t=o({},t)).bodyA=s(T,t.bodyA,i),t.bodyB=s(T,t.bodyB,i),t.localAxisA=m.clone(t.localAxisA),new e(t)},e.prototype._setAnchors=function(t){t.anchorA?this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(t.anchorA)):t.localAnchorA&&this.m_localAnchorA.setVec2(t.localAnchorA),t.anchorB?this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(t.anchorB)):t.localAnchorB&&this.m_localAnchorB.setVec2(t.localAnchorB),t.localAxisA&&(this.m_localXAxisA.setVec2(t.localAxisA),this.m_localYAxisA.setVec2(m.crossNumVec2(1,t.localAxisA)))},e.prototype.getLocalAnchorA=function(){return this.m_localAnchorA},e.prototype.getLocalAnchorB=function(){return this.m_localAnchorB},e.prototype.getLocalAxisA=function(){return this.m_localXAxisA},e.prototype.getReferenceAngle=function(){return this.m_referenceAngle},e.prototype.getJointTranslation=function(){var t=this.m_bodyA.getWorldPoint(this.m_localAnchorA),e=this.m_bodyB.getWorldPoint(this.m_localAnchorB),i=m.sub(e,t),o=this.m_bodyA.getWorldVector(this.m_localXAxisA);return m.dot(i,o)},e.prototype.getJointSpeed=function(){var t=this.m_bodyA,e=this.m_bodyB,i=v.mulVec2(t.m_xf.q,m.sub(this.m_localAnchorA,t.m_sweep.localCenter)),o=v.mulVec2(e.m_xf.q,m.sub(this.m_localAnchorB,e.m_sweep.localCenter)),s=m.add(t.m_sweep.c,i),n=m.add(e.m_sweep.c,o),r=m.sub(n,s),a=v.mulVec2(t.m_xf.q,this.m_localXAxisA),h=t.m_linearVelocity,c=e.m_linearVelocity,_=t.m_angularVelocity,l=e.m_angularVelocity;return m.dot(r,m.crossNumVec2(_,a))+m.dot(a,m.sub(m.addCrossNumVec2(c,l,o),m.addCrossNumVec2(h,_,i)))},e.prototype.isLimitEnabled=function(){return this.m_enableLimit},e.prototype.enableLimit=function(t){t!=this.m_enableLimit&&(this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableLimit=t,this.m_impulse.z=0)},e.prototype.getLowerLimit=function(){return this.m_lowerTranslation},e.prototype.getUpperLimit=function(){return this.m_upperTranslation},e.prototype.setLimits=function(t,e){t==this.m_lowerTranslation&&e==this.m_upperTranslation||(this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_lowerTranslation=t,this.m_upperTranslation=e,this.m_impulse.z=0)},e.prototype.isMotorEnabled=function(){return this.m_enableMotor},e.prototype.enableMotor=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableMotor=t},e.prototype.setMotorSpeed=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_motorSpeed=t},e.prototype.setMaxMotorForce=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_maxMotorForce=t},e.prototype.getMaxMotorForce=function(){return this.m_maxMotorForce},e.prototype.getMotorSpeed=function(){return this.m_motorSpeed},e.prototype.getMotorForce=function(t){return t*this.m_motorImpulse},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return m.combine(this.m_impulse.x,this.m_perp,this.m_motorImpulse+this.m_impulse.z,this.m_axis).mul(t)},e.prototype.getReactionTorque=function(t){return t*this.m_impulse.y},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyA.c_velocity.v,s=this.m_bodyA.c_velocity.w,n=this.m_bodyB.c_position.c,a=this.m_bodyB.c_position.a,h=this.m_bodyB.c_velocity.v,c=this.m_bodyB.c_velocity.w,_=v.neo(i),u=v.neo(a),p=v.mulVec2(_,m.sub(this.m_localAnchorA,this.m_localCenterA)),d=v.mulVec2(u,m.sub(this.m_localAnchorB,this.m_localCenterB)),y=m.zero();y.addCombine(1,n,1,d),y.subCombine(1,e,1,p);var f=this.m_invMassA,x=this.m_invMassB,g=this.m_invIA,b=this.m_invIB;this.m_axis=v.mulVec2(_,this.m_localXAxisA),this.m_a1=m.crossVec2Vec2(m.add(y,p),this.m_axis),this.m_a2=m.crossVec2Vec2(d,this.m_axis),this.m_motorMass=f+x+g*this.m_a1*this.m_a1+b*this.m_a2*this.m_a2,this.m_motorMass>0&&(this.m_motorMass=1/this.m_motorMass),this.m_perp=v.mulVec2(_,this.m_localYAxisA),this.m_s1=m.crossVec2Vec2(m.add(y,p),this.m_perp),this.m_s2=m.crossVec2Vec2(d,this.m_perp),m.crossVec2Vec2(p,this.m_perp);var A=f+x+g*this.m_s1*this.m_s1+b*this.m_s2*this.m_s2,B=g*this.m_s1+b*this.m_s2,w=g*this.m_s1*this.m_a1+b*this.m_s2*this.m_a2,V=g+b;0==V&&(V=1);var C=g*this.m_a1+b*this.m_a2,M=f+x+g*this.m_a1*this.m_a1+b*this.m_a2*this.m_a2;if(this.m_K.ex.set(A,B,w),this.m_K.ey.set(B,V,C),this.m_K.ez.set(w,C,M),this.m_enableLimit){var I=m.dot(this.m_axis,y);r.abs(this.m_upperTranslation-this.m_lowerTranslation)<2*l.linearSlop?this.m_limitState=3:I<=this.m_lowerTranslation?1!=this.m_limitState&&(this.m_limitState=1,this.m_impulse.z=0):I>=this.m_upperTranslation?2!=this.m_limitState&&(this.m_limitState=2,this.m_impulse.z=0):(this.m_limitState=0,this.m_impulse.z=0)}else this.m_limitState=0,this.m_impulse.z=0;if(0==this.m_enableMotor&&(this.m_motorImpulse=0),t.warmStarting){this.m_impulse.mul(t.dtRatio),this.m_motorImpulse*=t.dtRatio;var S=m.combine(this.m_impulse.x,this.m_perp,this.m_motorImpulse+this.m_impulse.z,this.m_axis),P=this.m_impulse.x*this.m_s1+this.m_impulse.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_a1,z=this.m_impulse.x*this.m_s2+this.m_impulse.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_a2;o.subMul(f,S),s-=g*P,h.addMul(x,S),c+=b*z}else this.m_impulse.setZero(),this.m_motorImpulse=0;this.m_bodyA.c_velocity.v.setVec2(o),this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v.setVec2(h),this.m_bodyB.c_velocity.w=c},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=this.m_invMassA,a=this.m_invMassB,h=this.m_invIA,c=this.m_invIB;if(this.m_enableMotor&&3!=this.m_limitState){var _=m.dot(this.m_axis,m.sub(o,e))+this.m_a2*s-this.m_a1*i,l=this.m_motorMass*(this.m_motorSpeed-_),u=this.m_motorImpulse,p=t.dt*this.m_maxMotorForce;this.m_motorImpulse=r.clamp(this.m_motorImpulse+l,-p,p),l=this.m_motorImpulse-u;var d=m.mulNumVec2(l,this.m_axis),y=l*this.m_a1,f=l*this.m_a2;e.subMul(n,d),i-=h*y,o.addMul(a,d),s+=c*f}var v=m.zero();if(v.x+=m.dot(this.m_perp,o)+this.m_s2*s,v.x-=m.dot(this.m_perp,e)+this.m_s1*i,v.y=s-i,this.m_enableLimit&&0!=this.m_limitState){var x=0;x+=m.dot(this.m_axis,o)+this.m_a2*s,x-=m.dot(this.m_axis,e)+this.m_a1*i;_=new xt(v.x,v.y,x);var g=xt.clone(this.m_impulse),b=this.m_K.solve33(xt.neg(_));this.m_impulse.add(b),1==this.m_limitState?this.m_impulse.z=r.max(this.m_impulse.z,0):2==this.m_limitState&&(this.m_impulse.z=r.min(this.m_impulse.z,0));var A=m.combine(-1,v,-(this.m_impulse.z-g.z),m.neo(this.m_K.ez.x,this.m_K.ez.y)),B=m.add(this.m_K.solve22(A),m.neo(g.x,g.y));this.m_impulse.x=B.x,this.m_impulse.y=B.y,b=xt.sub(this.m_impulse,g);d=m.combine(b.x,this.m_perp,b.z,this.m_axis),y=b.x*this.m_s1+b.y+b.z*this.m_a1,f=b.x*this.m_s2+b.y+b.z*this.m_a2;e.subMul(n,d),i-=h*y,o.addMul(a,d),s+=c*f}else{b=this.m_K.solve22(m.neg(v));this.m_impulse.x+=b.x,this.m_impulse.y+=b.y;d=m.mulNumVec2(b.x,this.m_perp),y=b.x*this.m_s1+b.y,f=b.x*this.m_s2+b.y;e.subMul(n,d),i-=h*y,o.addMul(a,d),s+=c*f}this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyB.c_position.c,s=this.m_bodyB.c_position.a,n=v.neo(i),a=v.neo(s),h=this.m_invMassA,c=this.m_invMassB,_=this.m_invIA,u=this.m_invIB,p=v.mulVec2(n,m.sub(this.m_localAnchorA,this.m_localCenterA)),d=v.mulVec2(a,m.sub(this.m_localAnchorB,this.m_localCenterB)),y=m.sub(m.add(o,d),m.add(e,p)),f=v.mulVec2(n,this.m_localXAxisA),x=m.crossVec2Vec2(m.add(y,p),f),g=m.crossVec2Vec2(d,f),b=v.mulVec2(n,this.m_localYAxisA),A=m.crossVec2Vec2(m.add(y,p),b),B=m.crossVec2Vec2(d,b),w=new xt,V=m.zero();V.x=m.dot(b,y),V.y=s-i-this.m_referenceAngle;var C=r.abs(V.x),M=r.abs(V.y),I=l.linearSlop,S=l.maxLinearCorrection,P=!1,z=0;if(this.m_enableLimit){var T=m.dot(f,y);r.abs(this.m_upperTranslation-this.m_lowerTranslation)<2*I?(z=r.clamp(T,-S,S),C=r.max(C,r.abs(T)),P=!0):T<=this.m_lowerTranslation?(z=r.clamp(T-this.m_lowerTranslation+I,-S,0),C=r.max(C,this.m_lowerTranslation-T),P=!0):T>=this.m_upperTranslation&&(z=r.clamp(T-this.m_upperTranslation-I,0,S),C=r.max(C,T-this.m_upperTranslation),P=!0)}if(P){var L=h+c+_*A*A+u*B*B,F=_*A+u*B,q=_*A*x+u*B*g;0==(Y=_+u)&&(Y=1);var N=_*x+u*g,j=h+c+_*x*x+u*g*g;(E=new St).ex.set(L,F,q),E.ey.set(F,Y,N),E.ez.set(q,N,j);var D=new xt;D.x=V.x,D.y=V.y,D.z=z,w=E.solve33(xt.neg(D))}else{var Y,E;L=h+c+_*A*A+u*B*B,F=_*A+u*B;0==(Y=_+u)&&(Y=1),(E=new k).ex.setNum(L,F),E.ey.setNum(F,Y);var R=E.solve(m.neg(V));w.x=R.x,w.y=R.y,w.z=0}var O=m.combine(w.x,b,w.z,f),X=w.x*A+w.y+w.z*x,W=w.x*B+w.y+w.z*g;return e.subMul(h,O),i-=_*X,o.addMul(c,O),s+=u*W,this.m_bodyA.c_position.c=e,this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c=o,this.m_bodyB.c_position.a=s,C<=l.linearSlop&&M<=l.angularSlop},e.TYPE="prismatic-joint",e}(nt),Lt={ratio:1},Ft=function(t){function e(i,o,n,a,h,c){var _,l,u=this;if(!(u instanceof e))return new e(i,o,n,a,h,c);i=s(i,Lt),o=(u=t.call(this,i,o,n)||this).m_bodyA,n=u.m_bodyB,u.m_type=e.TYPE,u.m_joint1=a||i.joint1,u.m_joint2=h||i.joint2,u.m_ratio=r.isFinite(c)?c:i.ratio,u.m_type1=u.m_joint1.getType(),u.m_type2=u.m_joint2.getType(),u.m_bodyC=u.m_joint1.getBodyA(),u.m_bodyA=u.m_joint1.getBodyB();var p=u.m_bodyA.m_xf,d=u.m_bodyA.m_sweep.a,y=u.m_bodyC.m_xf,f=u.m_bodyC.m_sweep.a;if(u.m_type1===zt.TYPE){var x=u.m_joint1;u.m_localAnchorC=x.m_localAnchorA,u.m_localAnchorA=x.m_localAnchorB,u.m_referenceAngleA=x.m_referenceAngle,u.m_localAxisC=m.zero(),_=d-f-u.m_referenceAngleA}else{var g=u.m_joint1;u.m_localAnchorC=g.m_localAnchorA,u.m_localAnchorA=g.m_localAnchorB,u.m_referenceAngleA=g.m_referenceAngle,u.m_localAxisC=g.m_localXAxisA;var b=u.m_localAnchorC,A=v.mulTVec2(y.q,m.add(v.mulVec2(p.q,u.m_localAnchorA),m.sub(p.p,y.p)));_=m.dot(A,u.m_localAxisC)-m.dot(b,u.m_localAxisC)}u.m_bodyD=u.m_joint2.getBodyA(),u.m_bodyB=u.m_joint2.getBodyB();var B=u.m_bodyB.m_xf,w=u.m_bodyB.m_sweep.a,V=u.m_bodyD.m_xf,C=u.m_bodyD.m_sweep.a;if(u.m_type2===zt.TYPE){x=u.m_joint2;u.m_localAnchorD=x.m_localAnchorA,u.m_localAnchorB=x.m_localAnchorB,u.m_referenceAngleB=x.m_referenceAngle,u.m_localAxisD=m.zero(),l=w-C-u.m_referenceAngleB}else{g=u.m_joint2;u.m_localAnchorD=g.m_localAnchorA,u.m_localAnchorB=g.m_localAnchorB,u.m_referenceAngleB=g.m_referenceAngle,u.m_localAxisD=g.m_localXAxisA;var M=u.m_localAnchorD,I=v.mulTVec2(V.q,m.add(v.mulVec2(B.q,u.m_localAnchorB),m.sub(B.p,V.p)));l=m.dot(I,u.m_localAxisD)-m.dot(M,u.m_localAxisD)}return u.m_constant=_+u.m_ratio*l,u.m_impulse=0,u}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,joint1:this.m_joint1,joint2:this.m_joint2,ratio:this.m_ratio}},e._deserialize=function(t,i,s){return(t=o({},t)).bodyA=s(T,t.bodyA,i),t.bodyB=s(T,t.bodyB,i),t.joint1=s(nt,t.joint1,i),t.joint2=s(nt,t.joint2,i),new e(t)},e.prototype.getJoint1=function(){return this.m_joint1},e.prototype.getJoint2=function(){return this.m_joint2},e.prototype.setRatio=function(t){this.m_ratio=t},e.prototype.getRatio=function(){return this.m_ratio},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return m.mulNumVec2(this.m_impulse,this.m_JvAC).mul(t)},e.prototype.getReactionTorque=function(t){return t*(this.m_impulse*this.m_JwA)},e.prototype.initVelocityConstraints=function(t){this.m_lcA=this.m_bodyA.m_sweep.localCenter,this.m_lcB=this.m_bodyB.m_sweep.localCenter,this.m_lcC=this.m_bodyC.m_sweep.localCenter,this.m_lcD=this.m_bodyD.m_sweep.localCenter,this.m_mA=this.m_bodyA.m_invMass,this.m_mB=this.m_bodyB.m_invMass,this.m_mC=this.m_bodyC.m_invMass,this.m_mD=this.m_bodyD.m_invMass,this.m_iA=this.m_bodyA.m_invI,this.m_iB=this.m_bodyB.m_invI,this.m_iC=this.m_bodyC.m_invI,this.m_iD=this.m_bodyD.m_invI;var e=this.m_bodyA.c_position.a,i=this.m_bodyA.c_velocity.v,o=this.m_bodyA.c_velocity.w,s=this.m_bodyB.c_position.a,n=this.m_bodyB.c_velocity.v,r=this.m_bodyB.c_velocity.w,a=this.m_bodyC.c_position.a,h=this.m_bodyC.c_velocity.v,c=this.m_bodyC.c_velocity.w,_=this.m_bodyD.c_position.a,l=this.m_bodyD.c_velocity.v,u=this.m_bodyD.c_velocity.w,p=v.neo(e),d=v.neo(s),y=v.neo(a),f=v.neo(_);if(this.m_mass=0,this.m_type1==zt.TYPE)this.m_JvAC=m.zero(),this.m_JwA=1,this.m_JwC=1,this.m_mass+=this.m_iA+this.m_iC;else{var x=v.mulVec2(y,this.m_localAxisC),g=v.mulSub(y,this.m_localAnchorC,this.m_lcC),b=v.mulSub(p,this.m_localAnchorA,this.m_lcA);this.m_JvAC=x,this.m_JwC=m.crossVec2Vec2(g,x),this.m_JwA=m.crossVec2Vec2(b,x),this.m_mass+=this.m_mC+this.m_mA+this.m_iC*this.m_JwC*this.m_JwC+this.m_iA*this.m_JwA*this.m_JwA}if(this.m_type2==zt.TYPE)this.m_JvBD=m.zero(),this.m_JwB=this.m_ratio,this.m_JwD=this.m_ratio,this.m_mass+=this.m_ratio*this.m_ratio*(this.m_iB+this.m_iD);else{x=v.mulVec2(f,this.m_localAxisD);var A=v.mulSub(f,this.m_localAnchorD,this.m_lcD),B=v.mulSub(d,this.m_localAnchorB,this.m_lcB);this.m_JvBD=m.mulNumVec2(this.m_ratio,x),this.m_JwD=this.m_ratio*m.crossVec2Vec2(A,x),this.m_JwB=this.m_ratio*m.crossVec2Vec2(B,x),this.m_mass+=this.m_ratio*this.m_ratio*(this.m_mD+this.m_mB)+this.m_iD*this.m_JwD*this.m_JwD+this.m_iB*this.m_JwB*this.m_JwB}this.m_mass=this.m_mass>0?1/this.m_mass:0,t.warmStarting?(i.addMul(this.m_mA*this.m_impulse,this.m_JvAC),o+=this.m_iA*this.m_impulse*this.m_JwA,n.addMul(this.m_mB*this.m_impulse,this.m_JvBD),r+=this.m_iB*this.m_impulse*this.m_JwB,h.subMul(this.m_mC*this.m_impulse,this.m_JvAC),c-=this.m_iC*this.m_impulse*this.m_JwC,l.subMul(this.m_mD*this.m_impulse,this.m_JvBD),u-=this.m_iD*this.m_impulse*this.m_JwD):this.m_impulse=0,this.m_bodyA.c_velocity.v.setVec2(i),this.m_bodyA.c_velocity.w=o,this.m_bodyB.c_velocity.v.setVec2(n),this.m_bodyB.c_velocity.w=r,this.m_bodyC.c_velocity.v.setVec2(h),this.m_bodyC.c_velocity.w=c,this.m_bodyD.c_velocity.v.setVec2(l),this.m_bodyD.c_velocity.w=u},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=this.m_bodyC.c_velocity.v,r=this.m_bodyC.c_velocity.w,a=this.m_bodyD.c_velocity.v,h=this.m_bodyD.c_velocity.w,c=m.dot(this.m_JvAC,e)-m.dot(this.m_JvAC,n)+m.dot(this.m_JvBD,o)-m.dot(this.m_JvBD,a);c+=this.m_JwA*i-this.m_JwC*r+(this.m_JwB*s-this.m_JwD*h);var _=-this.m_mass*c;this.m_impulse+=_,e.addMul(this.m_mA*_,this.m_JvAC),i+=this.m_iA*_*this.m_JwA,o.addMul(this.m_mB*_,this.m_JvBD),s+=this.m_iB*_*this.m_JwB,n.subMul(this.m_mC*_,this.m_JvAC),r-=this.m_iC*_*this.m_JwC,a.subMul(this.m_mD*_,this.m_JvBD),h-=this.m_iD*_*this.m_JwD,this.m_bodyA.c_velocity.v.setVec2(e),this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v.setVec2(o),this.m_bodyB.c_velocity.w=s,this.m_bodyC.c_velocity.v.setVec2(n),this.m_bodyC.c_velocity.w=r,this.m_bodyD.c_velocity.v.setVec2(a),this.m_bodyD.c_velocity.w=h},e.prototype.solvePositionConstraints=function(t){var e,i,o,s,n,r,a,h,c=this.m_bodyA.c_position.c,_=this.m_bodyA.c_position.a,u=this.m_bodyB.c_position.c,p=this.m_bodyB.c_position.a,d=this.m_bodyC.c_position.c,y=this.m_bodyC.c_position.a,f=this.m_bodyD.c_position.c,x=this.m_bodyD.c_position.a,g=v.neo(_),b=v.neo(p),A=v.neo(y),B=v.neo(x),w=0;if(this.m_type1==zt.TYPE)o=m.zero(),n=1,a=1,w+=this.m_iA+this.m_iC,e=_-y-this.m_referenceAngleA;else{var V=v.mulVec2(A,this.m_localAxisC),C=v.mulSub(A,this.m_localAnchorC,this.m_lcC),M=v.mulSub(g,this.m_localAnchorA,this.m_lcA);o=V,a=m.crossVec2Vec2(C,V),n=m.crossVec2Vec2(M,V),w+=this.m_mC+this.m_mA+this.m_iC*a*a+this.m_iA*n*n;var I=m.sub(this.m_localAnchorC,this.m_lcC),S=v.mulTVec2(A,m.add(M,m.sub(c,d)));e=m.dot(m.sub(S,I),this.m_localAxisC)}if(this.m_type2==zt.TYPE)s=m.zero(),r=this.m_ratio,h=this.m_ratio,w+=this.m_ratio*this.m_ratio*(this.m_iB+this.m_iD),i=p-x-this.m_referenceAngleB;else{V=v.mulVec2(B,this.m_localAxisD);var P=v.mulSub(B,this.m_localAnchorD,this.m_lcD),z=v.mulSub(b,this.m_localAnchorB,this.m_lcB);s=m.mulNumVec2(this.m_ratio,V),h=this.m_ratio*m.crossVec2Vec2(P,V),r=this.m_ratio*m.crossVec2Vec2(z,V),w+=this.m_ratio*this.m_ratio*(this.m_mD+this.m_mB)+this.m_iD*h*h+this.m_iB*r*r;var T=m.sub(this.m_localAnchorD,this.m_lcD),k=v.mulTVec2(B,m.add(z,m.sub(u,f)));i=m.dot(k,this.m_localAxisD)-m.dot(T,this.m_localAxisD)}var L=e+this.m_ratio*i-this.m_constant,F=0;return w>0&&(F=-L/w),c.addMul(this.m_mA*F,o),_+=this.m_iA*F*n,u.addMul(this.m_mB*F,s),p+=this.m_iB*F*r,d.subMul(this.m_mC*F,o),y-=this.m_iC*F*a,f.subMul(this.m_mD*F,s),x-=this.m_iD*F*h,this.m_bodyA.c_position.c.setVec2(c),this.m_bodyA.c_position.a=_,this.m_bodyB.c_position.c.setVec2(u),this.m_bodyB.c_position.a=p,this.m_bodyC.c_position.c.setVec2(d),this.m_bodyC.c_position.a=y,this.m_bodyD.c_position.c.setVec2(f),this.m_bodyD.c_position.a=x,00&&(this.m_angularMass=1/this.m_angularMass),this.m_linearError=m.zero(),this.m_linearError.addCombine(1,n,1,this.m_rB),this.m_linearError.subCombine(1,e,1,this.m_rA),this.m_linearError.sub(v.mulVec2(c,this.m_linearOffset)),this.m_angularError=r-i-this.m_angularOffset,t.warmStarting){this.m_linearImpulse.mul(t.dtRatio),this.m_angularImpulse*=t.dtRatio;var f=m.neo(this.m_linearImpulse.x,this.m_linearImpulse.y);o.subMul(l,f),s-=p*(m.crossVec2Vec2(this.m_rA,f)+this.m_angularImpulse),a.addMul(u,f),h+=d*(m.crossVec2Vec2(this.m_rB,f)+this.m_angularImpulse)}else this.m_linearImpulse.setZero(),this.m_angularImpulse=0;this.m_bodyA.c_velocity.v=o,this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v=a,this.m_bodyB.c_velocity.w=h},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=this.m_invMassA,a=this.m_invMassB,h=this.m_invIA,c=this.m_invIB,_=t.dt,l=t.inv_dt,u=s-i+l*this.m_correctionFactor*this.m_angularError,p=-this.m_angularMass*u,d=this.m_angularImpulse,y=_*this.m_maxTorque;this.m_angularImpulse=r.clamp(this.m_angularImpulse+p,-y,y),i-=h*(p=this.m_angularImpulse-d),s+=c*p,(u=m.zero()).addCombine(1,o,1,m.crossNumVec2(s,this.m_rB)),u.subCombine(1,e,1,m.crossNumVec2(i,this.m_rA)),u.addMul(l*this.m_correctionFactor,this.m_linearError);p=m.neg(k.mulVec2(this.m_linearMass,u)),d=m.clone(this.m_linearImpulse);this.m_linearImpulse.add(p);y=_*this.m_maxForce;this.m_linearImpulse.clamp(y),p=m.sub(this.m_linearImpulse,d),e.subMul(n,p),i-=h*m.crossVec2Vec2(this.m_rA,p),o.addMul(a,p),s+=c*m.crossVec2Vec2(this.m_rB,p),this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){return!0},e.TYPE="motor-joint",e}(nt),jt={maxForce:0,frequencyHz:5,dampingRatio:.7},Dt=function(t){function e(i,o,n,r){var a=this;return a instanceof e?(i=s(i,jt),o=(a=t.call(this,i,o,n)||this).m_bodyA,n=a.m_bodyB,a.m_type=e.TYPE,a.m_targetA=r?m.clone(r):i.target||m.zero(),a.m_localAnchorB=x.mulTVec2(n.getTransform(),a.m_targetA),a.m_maxForce=i.maxForce,a.m_impulse=m.zero(),a.m_frequencyHz=i.frequencyHz,a.m_dampingRatio=i.dampingRatio,a.m_beta=0,a.m_gamma=0,a.m_rB=m.zero(),a.m_localCenterB=m.zero(),a.m_invMassB=0,a.m_invIB=0,a.m_mass=new k,a.m_C=m.zero(),a):new e(i,o,n,r)}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,target:this.m_targetA,maxForce:this.m_maxForce,frequencyHz:this.m_frequencyHz,dampingRatio:this.m_dampingRatio,_localAnchorB:this.m_localAnchorB}},e._deserialize=function(t,i,s){(t=o({},t)).bodyA=s(T,t.bodyA,i),t.bodyB=s(T,t.bodyB,i),t.target=m.clone(t.target);var n=new e(t);return t._localAnchorB&&(n.m_localAnchorB=t._localAnchorB),n},e.prototype.setTarget=function(t){0==this.m_bodyB.isAwake()&&this.m_bodyB.setAwake(!0),this.m_targetA=m.clone(t)},e.prototype.getTarget=function(){return this.m_targetA},e.prototype.setMaxForce=function(t){this.m_maxForce=t},e.prototype.getMaxForce=function(){return this.m_maxForce},e.prototype.setFrequency=function(t){this.m_frequencyHz=t},e.prototype.getFrequency=function(){return this.m_frequencyHz},e.prototype.setDampingRatio=function(t){this.m_dampingRatio=t},e.prototype.getDampingRatio=function(){return this.m_dampingRatio},e.prototype.getAnchorA=function(){return m.clone(this.m_targetA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return m.mulNumVec2(t,this.m_impulse)},e.prototype.getReactionTorque=function(t){return 0*t},e.prototype.shiftOrigin=function(t){this.m_targetA.sub(t)},e.prototype.initVelocityConstraints=function(t){this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyB.c_position,i=this.m_bodyB.c_velocity,o=e.c,s=e.a,n=i.v,a=i.w,h=v.neo(s),c=this.m_bodyB.getMass(),_=2*r.PI*this.m_frequencyHz,l=2*c*this.m_dampingRatio*_,u=c*(_*_),p=t.dt;this.m_gamma=p*(l+p*u),0!=this.m_gamma&&(this.m_gamma=1/this.m_gamma),this.m_beta=p*u*this.m_gamma,this.m_rB=v.mulVec2(h,m.sub(this.m_localAnchorB,this.m_localCenterB));var d=new k;d.ex.x=this.m_invMassB+this.m_invIB*this.m_rB.y*this.m_rB.y+this.m_gamma,d.ex.y=-this.m_invIB*this.m_rB.x*this.m_rB.y,d.ey.x=d.ex.y,d.ey.y=this.m_invMassB+this.m_invIB*this.m_rB.x*this.m_rB.x+this.m_gamma,this.m_mass=d.getInverse(),this.m_C.setVec2(o),this.m_C.addCombine(1,this.m_rB,-1,this.m_targetA),this.m_C.mul(this.m_beta),a*=.98,t.warmStarting?(this.m_impulse.mul(t.dtRatio),n.addMul(this.m_invMassB,this.m_impulse),a+=this.m_invIB*m.crossVec2Vec2(this.m_rB,this.m_impulse)):this.m_impulse.setZero(),i.v.setVec2(n),i.w=a},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyB.c_velocity,i=m.clone(e.v),o=e.w,s=m.crossNumVec2(o,this.m_rB);s.add(i),s.addCombine(1,this.m_C,this.m_gamma,this.m_impulse),s.neg();var n=k.mulVec2(this.m_mass,s),r=m.clone(this.m_impulse);this.m_impulse.add(n);var a=t.dt*this.m_maxForce;this.m_impulse.clamp(a),n=m.sub(this.m_impulse,r),i.addMul(this.m_invMassB,n),o+=this.m_invIB*m.crossVec2Vec2(this.m_rB,n),e.v.setVec2(i),e.w=o},e.prototype.solvePositionConstraints=function(t){return!0},e.TYPE="mouse-joint",e}(nt),Yt={collideConnected:!0},Et=function(t){function e(i,o,n,a,h,c,_,l){var u=this;return u instanceof e?(i=s(i,Yt),o=(u=t.call(this,i,o,n)||this).m_bodyA,n=u.m_bodyB,u.m_type=e.TYPE,u.m_groundAnchorA=a||(i.groundAnchorA||m.neo(-1,1)),u.m_groundAnchorB=h||(i.groundAnchorB||m.neo(1,1)),u.m_localAnchorA=c?o.getLocalPoint(c):i.localAnchorA||m.neo(-1,0),u.m_localAnchorB=_?n.getLocalPoint(_):i.localAnchorB||m.neo(1,0),u.m_lengthA=r.isFinite(i.lengthA)?i.lengthA:m.distance(c,a),u.m_lengthB=r.isFinite(i.lengthB)?i.lengthB:m.distance(_,h),u.m_ratio=r.isFinite(l)?l:i.ratio,u.m_constant=u.m_lengthA+u.m_ratio*u.m_lengthB,u.m_impulse=0,u):new e(i,o,n,a,h,c,_,l)}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,groundAnchorA:this.m_groundAnchorA,groundAnchorB:this.m_groundAnchorB,localAnchorA:this.m_localAnchorA,localAnchorB:this.m_localAnchorB,lengthA:this.m_lengthA,lengthB:this.m_lengthB,ratio:this.m_ratio}},e._deserialize=function(t,i,s){return(t=o({},t)).bodyA=s(T,t.bodyA,i),t.bodyB=s(T,t.bodyB,i),new e(t)},e.prototype.getGroundAnchorA=function(){return this.m_groundAnchorA},e.prototype.getGroundAnchorB=function(){return this.m_groundAnchorB},e.prototype.getLengthA=function(){return this.m_lengthA},e.prototype.getLengthB=function(){return this.m_lengthB},e.prototype.getRatio=function(){return this.m_ratio},e.prototype.getCurrentLengthA=function(){var t=this.m_bodyA.getWorldPoint(this.m_localAnchorA),e=this.m_groundAnchorA;return m.distance(t,e)},e.prototype.getCurrentLengthB=function(){var t=this.m_bodyB.getWorldPoint(this.m_localAnchorB),e=this.m_groundAnchorB;return m.distance(t,e)},e.prototype.shiftOrigin=function(t){this.m_groundAnchorA.sub(t),this.m_groundAnchorB.sub(t)},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return m.mulNumVec2(this.m_impulse,this.m_uB).mul(t)},e.prototype.getReactionTorque=function(t){return 0},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyA.c_velocity.v,s=this.m_bodyA.c_velocity.w,n=this.m_bodyB.c_position.c,r=this.m_bodyB.c_position.a,a=this.m_bodyB.c_velocity.v,h=this.m_bodyB.c_velocity.w,c=v.neo(i),_=v.neo(r);this.m_rA=v.mulVec2(c,m.sub(this.m_localAnchorA,this.m_localCenterA)),this.m_rB=v.mulVec2(_,m.sub(this.m_localAnchorB,this.m_localCenterB)),this.m_uA=m.sub(m.add(e,this.m_rA),this.m_groundAnchorA),this.m_uB=m.sub(m.add(n,this.m_rB),this.m_groundAnchorB);var u=this.m_uA.length(),p=this.m_uB.length();u>10*l.linearSlop?this.m_uA.mul(1/u):this.m_uA.setZero(),p>10*l.linearSlop?this.m_uB.mul(1/p):this.m_uB.setZero();var d=m.crossVec2Vec2(this.m_rA,this.m_uA),y=m.crossVec2Vec2(this.m_rB,this.m_uB),f=this.m_invMassA+this.m_invIA*d*d,x=this.m_invMassB+this.m_invIB*y*y;if(this.m_mass=f+this.m_ratio*this.m_ratio*x,this.m_mass>0&&(this.m_mass=1/this.m_mass),t.warmStarting){this.m_impulse*=t.dtRatio;var g=m.mulNumVec2(-this.m_impulse,this.m_uA),b=m.mulNumVec2(-this.m_ratio*this.m_impulse,this.m_uB);o.addMul(this.m_invMassA,g),s+=this.m_invIA*m.crossVec2Vec2(this.m_rA,g),a.addMul(this.m_invMassB,b),h+=this.m_invIB*m.crossVec2Vec2(this.m_rB,b)}else this.m_impulse=0;this.m_bodyA.c_velocity.v=o,this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v=a,this.m_bodyB.c_velocity.w=h},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=m.add(e,m.crossNumVec2(i,this.m_rA)),r=m.add(o,m.crossNumVec2(s,this.m_rB)),a=-m.dot(this.m_uA,n)-this.m_ratio*m.dot(this.m_uB,r),h=-this.m_mass*a;this.m_impulse+=h;var c=m.mulNumVec2(-h,this.m_uA),_=m.mulNumVec2(-this.m_ratio*h,this.m_uB);e.addMul(this.m_invMassA,c),i+=this.m_invIA*m.crossVec2Vec2(this.m_rA,c),o.addMul(this.m_invMassB,_),s+=this.m_invIB*m.crossVec2Vec2(this.m_rB,_),this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyB.c_position.c,s=this.m_bodyB.c_position.a,n=v.neo(i),a=v.neo(s),h=v.mulVec2(n,m.sub(this.m_localAnchorA,this.m_localCenterA)),c=v.mulVec2(a,m.sub(this.m_localAnchorB,this.m_localCenterB)),_=m.sub(m.add(e,this.m_rA),this.m_groundAnchorA),u=m.sub(m.add(o,this.m_rB),this.m_groundAnchorB),p=_.length(),d=u.length();p>10*l.linearSlop?_.mul(1/p):_.setZero(),d>10*l.linearSlop?u.mul(1/d):u.setZero();var y=m.crossVec2Vec2(h,_),f=m.crossVec2Vec2(c,u),x=this.m_invMassA+this.m_invIA*y*y,g=this.m_invMassB+this.m_invIB*f*f,b=x+this.m_ratio*this.m_ratio*g;b>0&&(b=1/b);var A=this.m_constant-p-this.m_ratio*d,B=r.abs(A),w=-b*A,V=m.mulNumVec2(-w,_),C=m.mulNumVec2(-this.m_ratio*w,u);return e.addMul(this.m_invMassA,V),i+=this.m_invIA*m.crossVec2Vec2(h,V),o.addMul(this.m_invMassB,C),s+=this.m_invIB*m.crossVec2Vec2(c,C),this.m_bodyA.c_position.c=e,this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c=o,this.m_bodyB.c_position.a=s,B0?2:0,!(this.m_length>l.linearSlop))return this.m_u.setZero(),this.m_mass=0,void(this.m_impulse=0);this.m_u.mul(1/this.m_length);var p=m.crossVec2Vec2(this.m_rA,this.m_u),d=m.crossVec2Vec2(this.m_rB,this.m_u),y=this.m_invMassA+this.m_invIA*p*p+this.m_invMassB+this.m_invIB*d*d;if(this.m_mass=0!=y?1/y:0,t.warmStarting){this.m_impulse*=t.dtRatio;var f=m.mulNumVec2(this.m_impulse,this.m_u);o.subMul(this.m_invMassA,f),s-=this.m_invIA*m.crossVec2Vec2(this.m_rA,f),a.addMul(this.m_invMassB,f),h+=this.m_invIB*m.crossVec2Vec2(this.m_rB,f)}else this.m_impulse=0;this.m_bodyA.c_velocity.v.setVec2(o),this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v.setVec2(a),this.m_bodyB.c_velocity.w=h},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=m.addCrossNumVec2(e,i,this.m_rA),a=m.addCrossNumVec2(o,s,this.m_rB),h=this.m_length-this.m_maxLength,c=m.dot(this.m_u,m.sub(a,n));h<0&&(c+=t.inv_dt*h);var _=-this.m_mass*c,l=this.m_impulse;this.m_impulse=r.min(0,this.m_impulse+_),_=this.m_impulse-l;var u=m.mulNumVec2(_,this.m_u);e.subMul(this.m_invMassA,u),i-=this.m_invIA*m.crossVec2Vec2(this.m_rA,u),o.addMul(this.m_invMassB,u),s+=this.m_invIB*m.crossVec2Vec2(this.m_rB,u),this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyB.c_position.c,s=this.m_bodyB.c_position.a,n=v.neo(i),a=v.neo(s),h=v.mulSub(n,this.m_localAnchorA,this.m_localCenterA),c=v.mulSub(a,this.m_localAnchorB,this.m_localCenterB),_=m.zero();_.addCombine(1,o,1,c),_.subCombine(1,e,1,h);var u=_.normalize(),p=u-this.m_maxLength;p=r.clamp(p,0,l.maxLinearCorrection);var d=-this.m_mass*p,y=m.mulNumVec2(d,_);return e.subMul(this.m_invMassA,y),i-=this.m_invIA*m.crossVec2Vec2(h,y),o.addMul(this.m_invMassB,y),s+=this.m_invIB*m.crossVec2Vec2(c,y),this.m_bodyA.c_position.c.setVec2(e),this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c.setVec2(o),this.m_bodyB.c_position.a=s,u-this.m_maxLength0){d.getInverse22(this.m_mass);var y=u+p,f=y>0?1/y:0,x=s-e-this.m_referenceAngle,g=2*r.PI*this.m_frequencyHz,b=2*f*this.m_dampingRatio*g,A=f*g*g,B=t.dt;this.m_gamma=B*(b+B*A),this.m_gamma=0!=this.m_gamma?1/this.m_gamma:0,this.m_bias=x*B*A*this.m_gamma,y+=this.m_gamma,this.m_mass.ez.z=0!=y?1/y:0}else 0==d.ez.z?(d.getInverse22(this.m_mass),this.m_gamma=0,this.m_bias=0):(d.getSymInverse33(this.m_mass),this.m_gamma=0,this.m_bias=0);if(t.warmStarting){this.m_impulse.mul(t.dtRatio);var w=m.neo(this.m_impulse.x,this.m_impulse.y);i.subMul(_,w),o-=u*(m.crossVec2Vec2(this.m_rA,w)+this.m_impulse.z),n.addMul(l,w),a+=p*(m.crossVec2Vec2(this.m_rB,w)+this.m_impulse.z)}else this.m_impulse.setZero();this.m_bodyA.c_velocity.v=i,this.m_bodyA.c_velocity.w=o,this.m_bodyB.c_velocity.v=n,this.m_bodyB.c_velocity.w=a},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=this.m_invMassA,r=this.m_invMassB,a=this.m_invIA,h=this.m_invIB;if(this.m_frequencyHz>0){var c=s-i,_=-this.m_mass.ez.z*(c+this.m_bias+this.m_gamma*this.m_impulse.z);this.m_impulse.z+=_,i-=a*_,s+=h*_,(p=m.zero()).addCombine(1,o,1,m.crossNumVec2(s,this.m_rB)),p.subCombine(1,e,1,m.crossNumVec2(i,this.m_rA));var l=m.neg(St.mulVec2(this.m_mass,p));this.m_impulse.x+=l.x,this.m_impulse.y+=l.y;var u=m.clone(l);e.subMul(n,u),i-=a*m.crossVec2Vec2(this.m_rA,u),o.addMul(r,u),s+=h*m.crossVec2Vec2(this.m_rB,u)}else{var p;(p=m.zero()).addCombine(1,o,1,m.crossNumVec2(s,this.m_rB)),p.subCombine(1,e,1,m.crossNumVec2(i,this.m_rA));c=s-i;var d=new xt(p.x,p.y,c),y=xt.neg(St.mulVec3(this.m_mass,d));this.m_impulse.add(y);u=m.neo(y.x,y.y);e.subMul(n,u),i-=a*(m.crossVec2Vec2(this.m_rA,u)+y.z),o.addMul(r,u),s+=h*(m.crossVec2Vec2(this.m_rB,u)+y.z)}this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){var e,i,o=this.m_bodyA.c_position.c,s=this.m_bodyA.c_position.a,n=this.m_bodyB.c_position.c,a=this.m_bodyB.c_position.a,h=v.neo(s),c=v.neo(a),_=this.m_invMassA,u=this.m_invMassB,p=this.m_invIA,d=this.m_invIB,y=v.mulVec2(h,m.sub(this.m_localAnchorA,this.m_localCenterA)),f=v.mulVec2(c,m.sub(this.m_localAnchorB,this.m_localCenterB)),x=new St;if(x.ex.x=_+u+y.y*y.y*p+f.y*f.y*d,x.ey.x=-y.y*y.x*p-f.y*f.x*d,x.ez.x=-y.y*p-f.y*d,x.ex.y=x.ey.x,x.ey.y=_+u+y.x*y.x*p+f.x*f.x*d,x.ez.y=y.x*p+f.x*d,x.ex.z=x.ez.x,x.ey.z=x.ez.y,x.ez.z=p+d,this.m_frequencyHz>0){(b=m.zero()).addCombine(1,n,1,f),b.subCombine(1,o,1,y),e=b.length(),i=0;var g=m.neg(x.solve22(b));o.subMul(_,g),s-=p*m.crossVec2Vec2(y,g),n.addMul(u,g),a+=d*m.crossVec2Vec2(f,g)}else{var b;(b=m.zero()).addCombine(1,n,1,f),b.subCombine(1,o,1,y);var A=a-s-this.m_referenceAngle;e=b.length(),i=r.abs(A);var B=new xt(b.x,b.y,A),w=new xt;if(x.ez.z>0)w=xt.neg(x.solve33(B));else{var V=m.neg(x.solve22(b));w.set(V.x,V.y,0)}g=m.neo(w.x,w.y);o.subMul(_,g),s-=p*(m.crossVec2Vec2(y,g)+w.z),n.addMul(u,g),a+=d*(m.crossVec2Vec2(f,g)+w.z)}return this.m_bodyA.c_position.c=o,this.m_bodyA.c_position.a=s,this.m_bodyB.c_position.c=n,this.m_bodyB.c_position.a=a,e<=l.linearSlop&&i<=l.angularSlop},e.TYPE="weld-joint",e}(nt),Jt={enableMotor:!1,maxMotorTorque:0,motorSpeed:0,frequencyHz:2,dampingRatio:.7},Ht=function(t){function e(i,o,n,r,a){var h=this;return h instanceof e?(i=s(i,Jt),(h=t.call(this,i,o,n)||this).m_ax=m.zero(),h.m_ay=m.zero(),o=h.m_bodyA,n=h.m_bodyB,h.m_type=e.TYPE,h.m_localAnchorA=m.clone(r?o.getLocalPoint(r):i.localAnchorA||m.zero()),h.m_localAnchorB=m.clone(r?n.getLocalPoint(r):i.localAnchorB||m.zero()),h.m_localXAxisA=m.clone(a?o.getLocalVector(a):i.localAxisA||i.localAxis||m.neo(1,0)),h.m_localYAxisA=m.crossNumVec2(1,h.m_localXAxisA),h.m_mass=0,h.m_impulse=0,h.m_motorMass=0,h.m_motorImpulse=0,h.m_springMass=0,h.m_springImpulse=0,h.m_maxMotorTorque=i.maxMotorTorque,h.m_motorSpeed=i.motorSpeed,h.m_enableMotor=i.enableMotor,h.m_frequencyHz=i.frequencyHz,h.m_dampingRatio=i.dampingRatio,h.m_bias=0,h.m_gamma=0,h):new e(i,o,n,r,a)}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,enableMotor:this.m_enableMotor,maxMotorTorque:this.m_maxMotorTorque,motorSpeed:this.m_motorSpeed,frequencyHz:this.m_frequencyHz,dampingRatio:this.m_dampingRatio,localAnchorA:this.m_localAnchorA,localAnchorB:this.m_localAnchorB,localAxisA:this.m_localXAxisA}},e._deserialize=function(t,i,s){return(t=o({},t)).bodyA=s(T,t.bodyA,i),t.bodyB=s(T,t.bodyB,i),new e(t)},e.prototype._setAnchors=function(t){t.anchorA?this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(t.anchorA)):t.localAnchorA&&this.m_localAnchorA.setVec2(t.localAnchorA),t.anchorB?this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(t.anchorB)):t.localAnchorB&&this.m_localAnchorB.setVec2(t.localAnchorB),t.localAxisA&&(this.m_localXAxisA.setVec2(t.localAxisA),this.m_localYAxisA.setVec2(m.crossNumVec2(1,t.localAxisA)))},e.prototype.getLocalAnchorA=function(){return this.m_localAnchorA},e.prototype.getLocalAnchorB=function(){return this.m_localAnchorB},e.prototype.getLocalAxisA=function(){return this.m_localXAxisA},e.prototype.getJointTranslation=function(){var t=this.m_bodyA,e=this.m_bodyB,i=t.getWorldPoint(this.m_localAnchorA),o=e.getWorldPoint(this.m_localAnchorB),s=m.sub(o,i),n=t.getWorldVector(this.m_localXAxisA);return m.dot(s,n)},e.prototype.getJointSpeed=function(){var t=this.m_bodyA.m_angularVelocity;return this.m_bodyB.m_angularVelocity-t},e.prototype.isMotorEnabled=function(){return this.m_enableMotor},e.prototype.enableMotor=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableMotor=t},e.prototype.setMotorSpeed=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_motorSpeed=t},e.prototype.getMotorSpeed=function(){return this.m_motorSpeed},e.prototype.setMaxMotorTorque=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_maxMotorTorque=t},e.prototype.getMaxMotorTorque=function(){return this.m_maxMotorTorque},e.prototype.getMotorTorque=function(t){return t*this.m_motorImpulse},e.prototype.setSpringFrequencyHz=function(t){this.m_frequencyHz=t},e.prototype.getSpringFrequencyHz=function(){return this.m_frequencyHz},e.prototype.setSpringDampingRatio=function(t){this.m_dampingRatio=t},e.prototype.getSpringDampingRatio=function(){return this.m_dampingRatio},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return m.combine(this.m_impulse,this.m_ay,this.m_springImpulse,this.m_ax).mul(t)},e.prototype.getReactionTorque=function(t){return t*this.m_motorImpulse},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_invMassA,i=this.m_invMassB,o=this.m_invIA,s=this.m_invIB,n=this.m_bodyA.c_position.c,a=this.m_bodyA.c_position.a,h=this.m_bodyA.c_velocity.v,c=this.m_bodyA.c_velocity.w,_=this.m_bodyB.c_position.c,l=this.m_bodyB.c_position.a,u=this.m_bodyB.c_velocity.v,p=this.m_bodyB.c_velocity.w,d=v.neo(a),y=v.neo(l),f=v.mulVec2(d,m.sub(this.m_localAnchorA,this.m_localCenterA)),x=v.mulVec2(y,m.sub(this.m_localAnchorB,this.m_localCenterB)),g=m.zero();if(g.addCombine(1,_,1,x),g.subCombine(1,n,1,f),this.m_ay=v.mulVec2(d,this.m_localYAxisA),this.m_sAy=m.crossVec2Vec2(m.add(g,f),this.m_ay),this.m_sBy=m.crossVec2Vec2(x,this.m_ay),this.m_mass=e+i+o*this.m_sAy*this.m_sAy+s*this.m_sBy*this.m_sBy,this.m_mass>0&&(this.m_mass=1/this.m_mass),this.m_springMass=0,this.m_bias=0,this.m_gamma=0,this.m_frequencyHz>0){this.m_ax=v.mulVec2(d,this.m_localXAxisA),this.m_sAx=m.crossVec2Vec2(m.add(g,f),this.m_ax),this.m_sBx=m.crossVec2Vec2(x,this.m_ax);var b=e+i+o*this.m_sAx*this.m_sAx+s*this.m_sBx*this.m_sBx;if(b>0){this.m_springMass=1/b;var A=m.dot(g,this.m_ax),B=2*r.PI*this.m_frequencyHz,w=2*this.m_springMass*this.m_dampingRatio*B,V=this.m_springMass*B*B,C=t.dt;this.m_gamma=C*(w+C*V),this.m_gamma>0&&(this.m_gamma=1/this.m_gamma),this.m_bias=A*C*V*this.m_gamma,this.m_springMass=b+this.m_gamma,this.m_springMass>0&&(this.m_springMass=1/this.m_springMass)}}else this.m_springImpulse=0;if(this.m_enableMotor?(this.m_motorMass=o+s,this.m_motorMass>0&&(this.m_motorMass=1/this.m_motorMass)):(this.m_motorMass=0,this.m_motorImpulse=0),t.warmStarting){this.m_impulse*=t.dtRatio,this.m_springImpulse*=t.dtRatio,this.m_motorImpulse*=t.dtRatio;var M=m.combine(this.m_impulse,this.m_ay,this.m_springImpulse,this.m_ax),I=this.m_impulse*this.m_sAy+this.m_springImpulse*this.m_sAx+this.m_motorImpulse,S=this.m_impulse*this.m_sBy+this.m_springImpulse*this.m_sBx+this.m_motorImpulse;h.subMul(this.m_invMassA,M),c-=this.m_invIA*I,u.addMul(this.m_invMassB,M),p+=this.m_invIB*S}else this.m_impulse=0,this.m_springImpulse=0,this.m_motorImpulse=0;this.m_bodyA.c_velocity.v.setVec2(h),this.m_bodyA.c_velocity.w=c,this.m_bodyB.c_velocity.v.setVec2(u),this.m_bodyB.c_velocity.w=p},e.prototype.solveVelocityConstraints=function(t){var e=this.m_invMassA,i=this.m_invMassB,o=this.m_invIA,s=this.m_invIB,n=this.m_bodyA.c_velocity.v,a=this.m_bodyA.c_velocity.w,h=this.m_bodyB.c_velocity.v,c=this.m_bodyB.c_velocity.w,_=m.dot(this.m_ax,h)-m.dot(this.m_ax,n)+this.m_sBx*c-this.m_sAx*a,l=-this.m_springMass*(_+this.m_bias+this.m_gamma*this.m_springImpulse);this.m_springImpulse+=l;var u=m.mulNumVec2(l,this.m_ax),p=l*this.m_sAx,d=l*this.m_sBx;n.subMul(e,u),a-=o*p,h.addMul(i,u);_=(c+=s*d)-a-this.m_motorSpeed,l=-this.m_motorMass*_;var y=this.m_motorImpulse,f=t.dt*this.m_maxMotorTorque;this.m_motorImpulse=r.clamp(this.m_motorImpulse+l,-f,f),a-=o*(l=this.m_motorImpulse-y),c+=s*l;_=m.dot(this.m_ay,h)-m.dot(this.m_ay,n)+this.m_sBy*c-this.m_sAy*a,l=-this.m_mass*_;this.m_impulse+=l;u=m.mulNumVec2(l,this.m_ay),p=l*this.m_sAy,d=l*this.m_sBy;n.subMul(e,u),a-=o*p,h.addMul(i,u),c+=s*d,this.m_bodyA.c_velocity.v.setVec2(n),this.m_bodyA.c_velocity.w=a,this.m_bodyB.c_velocity.v.setVec2(h),this.m_bodyB.c_velocity.w=c},e.prototype.solvePositionConstraints=function(t){var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyB.c_position.c,s=this.m_bodyB.c_position.a,n=v.neo(i),a=v.neo(s),h=v.mulVec2(n,m.sub(this.m_localAnchorA,this.m_localCenterA)),c=v.mulVec2(a,m.sub(this.m_localAnchorB,this.m_localCenterB)),_=m.zero();_.addCombine(1,o,1,c),_.subCombine(1,e,1,h);var u,p=v.mulVec2(n,this.m_localYAxisA),d=m.crossVec2Vec2(m.add(_,h),p),y=m.crossVec2Vec2(c,p),f=m.dot(_,p),x=this.m_invMassA+this.m_invMassB+this.m_invIA*this.m_sAy*this.m_sAy+this.m_invIB*this.m_sBy*this.m_sBy;u=0!=x?-f/x:0;var g=m.mulNumVec2(u,p),b=u*d,A=u*y;return e.subMul(this.m_invMassA,g),i-=this.m_invIA*b,o.addMul(this.m_invMassB,g),s+=this.m_invIB*A,this.m_bodyA.c_position.c.setVec2(e),this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c.setVec2(o),this.m_bodyB.c_position.a=s,r.abs(f)<=l.linearSlop},e.TYPE="wheel-joint",e}(nt),Zt=0;function Kt(t){var e,i=(t=t||{}).rootClass||vt,s=t.preSerialize||function(t){return t},n=t.postSerialize||function(t,e){return t},r=t.preDeserialize||function(t){return t},a=t.postDeserialize||function(t,e){return t},h={World:vt,Body:T,Joint:nt,Fixture:C,Shape:B},c=o({Vec2:m,Vec3:xt},h),_=((e={})[T.STATIC]=T,e[T.DYNAMIC]=T,e[T.KINEMATIC]=T,e[bt.TYPE]=bt,e[Bt.TYPE]=Bt,e[gt.TYPE]=gt,e[At.TYPE]=At,e[wt.TYPE]=wt,e[Ct.TYPE]=Ct,e[It.TYPE]=It,e[Ft.TYPE]=Ft,e[Nt.TYPE]=Nt,e[Dt.TYPE]=Dt,e[kt.TYPE]=kt,e[Et.TYPE]=Et,e[zt.TYPE]=zt,e[Ot.TYPE]=Ot,e[Wt.TYPE]=Wt,e[Ht.TYPE]=Ht,e);this.toJson=function(t){var e=[],i=[t],o={};function r(t,s){if(t.__sid=t.__sid||++Zt,!o[t.__sid]){i.push(t);var n={refIndex:e.length+i.length,refType:s};o[t.__sid]=n}return o[t.__sid]}function a(t,e){if("object"!=typeof t||null===t)return t;if("function"==typeof t._serialize){if(t!==e)for(var i in h)if(t instanceof h[i])return r(t,i);t=function(t){var e=(t=s(t))._serialize();return n(e,t)}(t)}if(Array.isArray(t)){for(var o=[],c=0;c_*_||(t.type=a.e_circles,t.localPoint.setVec2(e.m_p),t.localNormal.setZero(),t.pointCount=1,t.points[0].localPoint.setVec2(o.m_p),t.points[0].id.cf.indexA=0,t.points[0].id.cf.typeA=h.e_vertex,t.points[0].id.cf.indexB=0,t.points[0].id.cf.typeB=h.e_vertex)}function $t(t,e,i,o,s){t.pointCount=0;var n=x.mulTVec2(i,x.mulVec2(s,o.m_p)),r=e.m_vertex1,c=e.m_vertex2,_=m.sub(c,r),l=m.dot(_,m.sub(c,n)),u=m.dot(_,m.sub(n,r)),p=e.m_radius+o.m_radius;if(u<=0){var d=m.clone(r),y=m.sub(n,d);if(m.dot(y,y)>p*p)return;if(e.m_hasVertex0){var f=e.m_vertex0,v=r,g=m.sub(v,f);if(m.dot(g,m.sub(v,n))>0)return}return t.type=a.e_circles,t.localNormal.setZero(),t.localPoint.setVec2(d),t.pointCount=1,t.points[0].localPoint.setVec2(o.m_p),t.points[0].id.cf.indexA=0,t.points[0].id.cf.typeA=h.e_vertex,t.points[0].id.cf.indexB=0,void(t.points[0].id.cf.typeB=h.e_vertex)}if(l<=0){var b=m.clone(c),A=m.sub(n,b);if(m.dot(A,A)>p*p)return;if(e.m_hasVertex3){var B=e.m_vertex3,w=c,V=m.sub(B,w);if(m.dot(V,m.sub(n,w))>0)return}return t.type=a.e_circles,t.localNormal.setZero(),t.localPoint.setVec2(b),t.pointCount=1,t.points[0].localPoint.setVec2(o.m_p),t.points[0].id.cf.indexA=1,t.points[0].id.cf.typeA=h.e_vertex,t.points[0].id.cf.indexB=0,void(t.points[0].id.cf.typeB=h.e_vertex)}var C=m.dot(_,_),M=m.combine(l/C,r,u/C,c),I=m.sub(n,M);if(!(m.dot(I,I)>p*p)){var S=m.neo(-_.y,_.x);m.dot(S,m.sub(n,r))<0&&S.setNum(-S.x,-S.y),S.normalize(),t.type=a.e_faceA,t.localNormal=S,t.localPoint.setVec2(r),t.pointCount=1,t.points[0].localPoint.setVec2(o.m_p),t.points[0].id.cf.indexA=0,t.points[0].id.cf.typeA=h.e_face,t.points[0].id.cf.indexB=0,t.points[0].id.cf.typeB=h.e_vertex}}function Qt(t,e,i,o,s){for(var n=t.m_count,r=i.m_count,a=t.m_normals,h=t.m_vertices,c=i.m_vertices,_=x.mulTXf(o,e),l=0,u=-1/0,p=0;pu&&(u=f,l=p)}s.maxSeparation=u,s.bestIndex=l}Kt.toJson=Gt.toJson,Kt.fromJson=Gt.fromJson,ot.addType(wt.TYPE,wt.TYPE,(function(t,e,i,o,s,n,r){Ut(t,i.getShape(),e,n.getShape(),s)})),ot.addType(gt.TYPE,wt.TYPE,(function(t,e,i,o,s,n,r){var a=i.getShape(),h=n.getShape();$t(t,a,e,h,s)})),ot.addType(bt.TYPE,wt.TYPE,(function(t,e,i,o,s,n,r){var a=i.getShape(),h=new gt;a.getChildEdge(h,o);var c=h,m=n.getShape();$t(t,c,e,m,s)})),ot.addType(At.TYPE,At.TYPE,(function(t,e,i,o,s,n,r){oe(t,i.getShape(),e,n.getShape(),s)}));var te,ee,ie={maxSeparation:0,bestIndex:0};function oe(t,e,i,o,s){t.pointCount=0;var n=e.m_radius+o.m_radius;Qt(e,i,o,s,ie);var r=ie.bestIndex,c=ie.maxSeparation;if(!(c>n)){Qt(o,s,e,i,ie);var _=ie.bestIndex,u=ie.maxSeparation;if(!(u>n)){var p,d,y,f,g,b;u>c+.1*l.linearSlop?(p=o,d=e,y=s,f=i,g=_,t.type=a.e_faceB,b=1):(p=e,d=o,y=i,f=s,g=r,t.type=a.e_faceA,b=0);var A=[new L,new L];!function(t,e,i,o,s,n){for(var r=e.m_normals,a=s.m_count,c=s.m_vertices,_=s.m_normals,l=v.mulTVec2(n.q,v.mulVec2(i.q,r[o])),u=0,p=1/0,d=0;du)return;v>l&&(l=v,_=f)}var g=_,b=g+1u*u)return;t.pointCount=1,t.type=a.e_faceA,t.localNormal.setCombine(1,c,-1,A),t.localNormal.normalize(),t.localPoint=A,t.points[0].localPoint.setVec2(o.m_p),t.points[0].id.cf.indexA=0,t.points[0].id.cf.typeA=h.e_vertex,t.points[0].id.cf.indexB=0,t.points[0].id.cf.typeB=h.e_vertex}else if(V<=0){if(m.distanceSquared(c,B)>u*u)return;t.pointCount=1,t.type=a.e_faceA,t.localNormal.setCombine(1,c,-1,B),t.localNormal.normalize(),t.localPoint.setVec2(B),t.points[0].localPoint.setVec2(o.m_p),t.points[0].id.cf.indexA=0,t.points[0].id.cf.typeA=h.e_vertex,t.points[0].id.cf.indexB=0,t.points[0].id.cf.typeB=h.e_vertex}else{var C=m.mid(A,B);if(m.dot(c,y[g])-m.dot(C,y[g])>u)return;t.pointCount=1,t.type=a.e_faceA,t.localNormal.setVec2(y[g]),t.localPoint.setVec2(C),t.points[0].localPoint.setVec2(o.m_p),t.points[0].id.cf.indexA=0,t.points[0].id.cf.typeA=h.e_vertex,t.points[0].id.cf.indexB=0,t.points[0].id.cf.typeB=h.e_vertex}}ot.addType(At.TYPE,wt.TYPE,(function(t,e,i,o,s,n,r){se(t,i.getShape(),e,n.getShape(),s)})),ot.addType(gt.TYPE,At.TYPE,(function(t,e,i,o,s,n,r){le(t,i.getShape(),e,n.getShape(),s)})),ot.addType(bt.TYPE,At.TYPE,(function(t,e,i,o,s,n,r){var a=i.getShape(),h=new gt;a.getChildEdge(h,o),le(t,h,e,n.getShape(),s)})),function(t){t[t.e_unknown=-1]="e_unknown",t[t.e_edgeA=1]="e_edgeA",t[t.e_edgeB=2]="e_edgeB"}(te||(te={})),function(t){t[t.e_isolated=0]="e_isolated",t[t.e_concave=1]="e_concave",t[t.e_convex=2]="e_convex"}(ee||(ee={}));var ne=function(){},re=function(){this.vertices=[],this.normals=[],this.count=0},ae=function(){this.normal=m.zero(),this.sideNormal1=m.zero(),this.sideNormal2=m.zero()},he=new ne,ce=new ne,me=new re,_e=new ae;function le(t,e,i,o,s){var n=x.mulTXf(i,s),c=x.mulVec2(n,o.m_centroid),_=e.m_vertex0,u=e.m_vertex1,p=e.m_vertex2,d=e.m_vertex3,y=e.m_hasVertex0,f=e.m_hasVertex3,g=m.sub(p,u);g.normalize();var b,A,B,w=m.neo(g.y,-g.x),V=m.dot(w,m.sub(c,u)),C=0,M=0,I=!1,S=!1;if(y){var P=m.sub(u,_);P.normalize(),b=m.neo(P.y,-P.x),I=m.crossVec2Vec2(P,g)>=0,C=m.dot(b,c)-m.dot(b,_)}if(f){var z=m.sub(d,p);z.normalize(),A=m.neo(z.y,-z.x),S=m.crossVec2Vec2(g,z)>0,M=m.dot(A,c)-m.dot(A,p)}var T=m.zero(),k=m.zero(),F=m.zero();y&&f?I&&S?(B=C>=0||V>=0||M>=0)?(T.setVec2(w),k.setVec2(b),F.setVec2(A)):(T.setMul(-1,w),k.setMul(-1,w),F.setMul(-1,w)):I?(B=C>=0||V>=0&&M>=0)?(T.setVec2(w),k.setVec2(b),F.setVec2(w)):(T.setMul(-1,w),k.setMul(-1,A),F.setMul(-1,w)):S?(B=M>=0||C>=0&&V>=0)?(T.setVec2(w),k.setVec2(w),F.setVec2(A)):(T.setMul(-1,w),k.setMul(-1,w),F.setMul(-1,b)):(B=C>=0&&V>=0&&M>=0)?(T.setVec2(w),k.setVec2(w),F.setVec2(w)):(T.setMul(-1,w),k.setMul(-1,A),F.setMul(-1,b)):y?I?(B=C>=0||V>=0)?(T.setVec2(w),k.setVec2(b),F.setMul(-1,w)):(T.setMul(-1,w),k.setVec2(w),F.setMul(-1,w)):(B=C>=0&&V>=0)?(T.setVec2(w),k.setVec2(w),F.setMul(-1,w)):(T.setMul(-1,w),k.setVec2(w),F.setMul(-1,b)):f?S?(B=V>=0||M>=0)?(T.setVec2(w),k.setMul(-1,w),F.setVec2(A)):(T.setMul(-1,w),k.setMul(-1,w),F.setVec2(w)):(B=V>=0&&M>=0)?(T.setVec2(w),k.setMul(-1,w),F.setVec2(w)):(T.setMul(-1,w),k.setMul(-1,A),F.setVec2(w)):(B=V>=0)?(T.setVec2(w),k.setMul(-1,w),F.setMul(-1,w)):(T.setMul(-1,w),k.setVec2(w),F.setVec2(w)),me.count=o.m_count;for(var q=0;qN)){ce.type=te.e_unknown,ce.index=-1,ce.separation=-1/0;var j=m.neo(-T.y,T.x);for(q=0;qN){ce.type=te.e_edgeB,ce.index=q,ce.separation=D;break}if(m.dot(Y,j)>=0){if(m.dot(m.sub(Y,F),T)<-l.angularSlop)continue}else if(m.dot(m.sub(Y,k),T)<-l.angularSlop)continue;D>ce.separation&&(ce.type=te.e_edgeB,ce.index=q,ce.separation=D)}if(!(ce.type!=te.e_unknown&&ce.separation>N)){var X;X=ce.type==te.e_unknown?he:ce.separation>.98*he.separation+.001?ce:he;var W=[new L,new L];if(X.type==te.e_edgeA){t.type=a.e_faceA;var J=0,H=m.dot(T,me.normals[0]);for(q=1;q=0},n.boolean=function(t){return"[object Boolean]"===o.call(t)},n.element=function(t){return void 0!==t&&"undefined"!=typeof HTMLElement&&t instanceof HTMLElement&&1===t.nodeType},n.fn=function(t){return"[object Function]"===o.call(t)},n.number=function(t){return"[object Number]"===o.call(t)},n.nan=function(t){return!n.number(t)||t!=t},n.object=function(t){return"[object Object]"===o.call(t)},n.hash=function(t){return n.object(t)&&t.constructor===Object&&!t.nodeType&&!t.setInterval},n.regexp=function(t){return"[object RegExp]"===o.call(t)},n.string=function(t){return"[object String]"===o.call(t)},n.hex=function(t){return n.string(t)&&(!t.length||s.test(t))}}));function fe(t){if(!(this instanceof fe))return ye.fn(t)?fe.app.apply(fe,arguments):ye.object(t)?fe.atlas.apply(fe,arguments):t;pe.create++;for(var e=0;e=1?i:1,function(){e&&e.apply(this,arguments),i>0&&(i--,t--,o())}}var i=[];function o(){if(0===t)for(;i.length;)setTimeout(i.shift(),0)}return e.then=function(e){0===t?setTimeout(e,0):i.push(e)},e}();fe.preload=function(t){if("string"==typeof t){var e=fe.resolve(t);/\.js($|\?|\#)/.test(e)&&(t=function(t){!function(t,e){var i=document.createElement("script");i.addEventListener("load",(function(){e()})),i.addEventListener("error",(function(i){e(i||"Error loading script: "+t)})),i.src=t,i.id="preload-"+Date.now(),document.body.appendChild(i)}(e,t)})}"function"==typeof t&&t(Ve())},fe.start=function(t){fe.config(t),Ve.then((function(){for(Be=!0;be.length;){var t=be.shift();fe.app.apply(fe,t)}}))},fe.pause=function(){if(!we){we=!0;for(var t=Ae.length-1;t>=0;t--)Ae[t].pause()}},fe.resume=function(){if(we){we=!1;for(var t=Ae.length-1;t>=0;t--)Ae[t].resume()}},fe.create=function(){return new fe},fe.resolve=function(){if("undefined"==typeof window||"undefined"==typeof document)return function(t){return t};var t=document.getElementsByTagName("script");return function(e){if(/^\.\//.test(e)){var i=function(){if(document.currentScript)return document.currentScript.src;var e;try{var i=new Error;if(!i.stack)throw i;e=i.stack}catch(i){e=i.stack}if("string"==typeof e)for(var o=(e=e.split("\n")).length;o--;){var s=e[o].match(/(\w+\:\/\/[^/]*?\/.+?)(:\d+)(:\d+)?/);if(s)return s[1]}if(t.length&&"readyState"in t[0])for(o=t.length;o--;)if("interactive"===t[o].readyState)return t[o].src;return location.href}();e=i.substring(0,i.lastIndexOf("/")+1)+e.substring(2)}return e}}();var Ce=fe;function Me(t,e,i,o,s,n){this.reset(t,e,i,o,s,n)}Me.prototype.toString=function(){return"["+this.a+", "+this.b+", "+this.c+", "+this.d+", "+this.e+", "+this.f+"]"},Me.prototype.clone=function(){return new Me(this.a,this.b,this.c,this.d,this.e,this.f)},Me.prototype.reset=function(t,e,i,o,s,n){return this._dirty=!0,"object"==typeof t?(this.a=t.a,this.d=t.d,this.b=t.b,this.c=t.c,this.e=t.e,this.f=t.f):(this.a=t||1,this.d=o||1,this.b=e||0,this.c=i||0,this.e=s||0,this.f=n||0),this},Me.prototype.identity=function(){return this._dirty=!0,this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,this},Me.prototype.rotate=function(t){if(!t)return this;this._dirty=!0;var e=t?Math.cos(t):1,i=t?Math.sin(t):0,o=e*this.a-i*this.b,s=e*this.b+i*this.a,n=e*this.c-i*this.d,r=e*this.d+i*this.c,a=e*this.e-i*this.f,h=e*this.f+i*this.e;return this.a=o,this.b=s,this.c=n,this.d=r,this.e=a,this.f=h,this},Me.prototype.translate=function(t,e){return t||e?(this._dirty=!0,this.e+=t,this.f+=e,this):this},Me.prototype.scale=function(t,e){return t-1||e-1?(this._dirty=!0,this.a*=t,this.b*=e,this.c*=t,this.d*=e,this.e*=t,this.f*=e,this):this},Me.prototype.skew=function(t,e){if(!t&&!e)return this;this._dirty=!0;var i=this.a+this.b*t,o=this.b+this.a*e,s=this.c+this.d*t,n=this.d+this.c*e,r=this.e+this.f*t,a=this.f+this.e*e;return this.a=i,this.b=o,this.c=s,this.d=n,this.e=r,this.f=a,this},Me.prototype.concat=function(t){this._dirty=!0;var e=this,i=e.a*t.a+e.b*t.c,o=e.b*t.d+e.a*t.b,s=e.c*t.a+e.d*t.c,n=e.d*t.d+e.c*t.b,r=e.e*t.a+t.e+e.f*t.c,a=e.f*t.d+t.f+e.e*t.b;return this.a=i,this.b=o,this.c=s,this.d=n,this.e=r,this.f=a,this},Me.prototype.inverse=Me.prototype.reverse=function(){if(this._dirty){this._dirty=!1,this.inversed=this.inversed||new Me;var t=this.a*this.d-this.b*this.c;this.inversed.a=this.d/t,this.inversed.b=-this.b/t,this.inversed.c=-this.c/t,this.inversed.d=this.a/t,this.inversed.e=(this.c*this.f-this.e*this.d)/t,this.inversed.f=(this.e*this.b-this.a*this.f)/t}return this.inversed},Me.prototype.map=function(t,e){return(e=e||{}).x=this.a*t.x+this.c*t.y+this.e,e.y=this.b*t.x+this.d*t.y+this.f,e},Me.prototype.mapX=function(t,e){return"object"==typeof t&&(e=t.y,t=t.x),this.a*t+this.c*e+this.e},Me.prototype.mapY=function(t,e){return"object"==typeof t&&(e=t.y,t=t.x),this.b*t+this.d*e+this.f};var Ie=Me,Se=ue((function(t){if("function"==typeof Object.create)t.exports=function(t,e){return Object.create.call(Object,t,e)};else{function e(){}t.exports=function(t,i){if(i)throw Error("Second argument is not supported!");if("object"!=typeof t||null===t)throw Error("Invalid prototype!");return e.prototype=t,new e}}})),Pe=Math,ze=Se(Math);function Te(t,e){"object"==typeof t&&this.src(t,e)}ze.random=function(t,e){return void 0===t?(e=1,t=0):void 0===e&&(e=t,t=0),t==e?t:Pe.random()*(e-t)+t},ze.rotate=function(t,e,i){return void 0===e?(i=1,e=0):void 0===i&&(i=e,e=0),i>e?(t=(t-e)%(i-e))+(t<0?i:e):(t=(t-i)%(e-i))+(t<=0?e:i)},ze.limit=function(t,e,i){return ti?i:t},ze.length=function(t,e){return Pe.sqrt(t*t+e*e)},Te.prototype.pipe=function(){return new Te(this)},Te.prototype.src=function(t,e,i,o){if("object"==typeof t){var s=t,n=e||1;this._image=s,this._sx=this._dx=0,this._sy=this._dy=0,this._sw=this._dw=s.width/n,this._sh=this._dh=s.height/n,this.width=s.width/n,this.height=s.height/n,this.ratio=n}else void 0===i?(i=t,o=e):(this._sx=t,this._sy=e),this._sw=this._dw=i,this._sh=this._dh=o,this.width=i,this.height=o;return this},Te.prototype.dest=function(t,e,i,o){return this._dx=t,this._dy=e,this._dx=t,this._dy=e,void 0!==i&&(this._dw=i,this._dh=o,this.width=i,this.height=o),this},Te.prototype.draw=function(t,e,i,o,s,n,r,a,h){var c=this._image;if(null!==c&&"object"==typeof c){var m=this._sx,_=this._sy,l=this._sw,u=this._sh,p=this._dx,d=this._dy,y=this._dw,f=this._dh;void 0!==n?(e=ze.limit(e,0,this._sw),o=ze.limit(o,0,this._sw-e),m+=e,_+=i=ze.limit(i,0,this._sh),l=o,u=s=ze.limit(s,0,this._sh-i),p=n,d=r,y=a,f=h):void 0!==o?(p=e,d=i,y=o,f=s):void 0!==e&&(y=e,f=i);var v=this.ratio||1;m*=v,_*=v,l*=v,u*=v;try{"function"==typeof c.draw?c.draw(t,m,_,l,u,p,d,y,f):(pe.draw++,t.drawImage(c,m,_,l,u,p,d,y,f))}catch(t){c._draw_failed||(console.log("Unable to draw: ",c),console.log(t),c._draw_failed=!0)}}};var ke=Te,Le=function(t,e){return"string"==typeof t&&"string"==typeof e&&t.substring(0,e.length)==e},Fe={},qe=[];function Ne(t){Ne._super.call(this);var e=this;Ee(t,"filter"),Ee(t,"cutouts"),Ee(t,"sprites"),Ee(t,"factory");var i=t.map||t.filter,o=t.ppu||t.ratio||1,s=t.trim||0,n=t.textures,r=t.factory,a=t.cutouts||t.sprites;function h(t){if(!t||ye.fn(t.draw))return t;t=de({},t),ye.fn(i)&&(t=i(t)),1!=o&&(t.x*=o,t.y*=o,t.width*=o,t.height*=o,t.top*=o,t.bottom*=o,t.left*=o,t.right*=o),0!=s&&(t.x+=s,t.y+=s,t.width-=2*s,t.height-=2*s,t.top-=s,t.bottom-=s,t.left-=s,t.right-=s);var n=e.pipe();return n.top=t.top,n.bottom=t.bottom,n.left=t.left,n.right=t.right,n.src(t.x,t.y,t.width,t.height),n}function c(t){if(n){if(ye.fn(n))return n(t);if(ye.hash(n))return n[t]}if(a){for(var e=null,i=0,o=0;o0&&t.length>i+1&&(o=(e=Fe[t.slice(0,i)])&&e.select(t.slice(i+1))),!o&&(e=Fe[t])&&(o=e.select()),i=0;!o&&i=0;i--)Xe(this,t[i]);else if(void 0!==e)for(i=arguments.length-1;i>=0;i--)Xe(this,arguments[i]);else void 0!==t&&Xe(this,t);return this},Ce.prototype.appendTo=function(t){return Oe(t,this),this},Ce.prototype.prependTo=function(t){return Xe(t,this),this},Ce.prototype.insertNext=function(t,e){if(ye.array(t))for(var i=0;i=0;i--)We(t[i],this);else if(void 0!==e)for(i=arguments.length-1;i>=0;i--)We(arguments[i],this);else void 0!==t&&We(t,this);return this},Ce.prototype.insertAfter=function(t){return Je(this,t),this},Ce.prototype.insertBefore=function(t){return We(this,t),this},Ce.prototype.remove=function(t,e){if(void 0!==t){if(ye.array(t))for(var i=0;i0&&(1==this._flags[t]&&this._parent&&this._parent._flag(t,!1),this._flags[t]=this._flags[t]-1)),"object"==typeof t&&t._flags)for(var i in t._flags)t._flags[i]>0&&this._flag(i,e);return this},Ce.prototype.hitTest=function(t){var e=this._pin._width,i=this._pin._height;return t.x>=0&&t.x<=e&&t.y>=0&&t.y<=i};var Ze,Ke;Ze=Ce.prototype,Ke=function(t,e,i){t._flag(e,i)},Ze._listeners=null,Ze.on=Ze.listen=function(t,e){if(!t||!t.length||"function"!=typeof e)return this;if(null===this._listeners&&(this._listeners={}),t=("string"!=typeof t&&"function"==typeof t.join?t.join(" "):t).match(/\S+/g))for(var i=0;i=0&&(n.splice(o,1),n.length||delete this._listeners[s],"function"==typeof Ke&&Ke(this,s,!1))}return this},Ze.listeners=function(t){return this._listeners&&this._listeners[t]},Ze.publish=function(t,e){var i=this.listeners(t);if(!i||!i.length)return 0;for(var o=0;o0&&o.c>0||o.a<0&&o.c<0?(e=0,i=o.a*this._width+o.c*this._height):(e=o.a*this._width,i=o.c*this._height),e>i?(this._boxX=i,this._boxWidth=e-i):(this._boxX=e,this._boxWidth=i-e),o.b>0&&o.d>0||o.b<0&&o.d<0?(e=0,i=o.b*this._width+o.d*this._height):(e=o.b*this._width,i=o.d*this._height),e>i?(this._boxY=i,this._boxHeight=e-i):(this._boxY=e,this._boxHeight=i-e));return this._x=this._offsetX,this._y=this._offsetY,this._x-=this._boxX+this._handleX*this._boxWidth,this._y-=this._boxY+this._handleY*this._boxHeight,this._aligned&&this._parent&&(this._parent.relativeMatrix(),this._x+=this._alignX*this._parent._width,this._y+=this._alignY*this._parent._height),o.translate(this._x,this._y),this._relativeMatrix},Ue.prototype.get=function(t){if("function"==typeof $e[t])return $e[t](this)},Ue.prototype.set=function(t,e){if("string"==typeof t)"function"==typeof Qe[t]&&void 0!==e&&Qe[t](this,e);else if("object"==typeof t)for(e in t)"function"==typeof Qe[e]&&void 0!==t[e]&&Qe[e](this,t[e],t);return this._owner&&(this._owner._ts_pin=++Ge,this._owner.touch()),this};var $e={alpha:function(t){return t._alpha},textureAlpha:function(t){return t._textureAlpha},width:function(t){return t._width},height:function(t){return t._height},boxWidth:function(t){return t._boxWidth},boxHeight:function(t){return t._boxHeight},scaleX:function(t){return t._scaleX},scaleY:function(t){return t._scaleY},skewX:function(t){return t._skewX},skewY:function(t){return t._skewY},rotation:function(t){return t._rotation},pivotX:function(t){return t._pivotX},pivotY:function(t){return t._pivotY},offsetX:function(t){return t._offsetX},offsetY:function(t){return t._offsetY},alignX:function(t){return t._alignX},alignY:function(t){return t._alignY},handleX:function(t){return t._handleX},handleY:function(t){return t._handleY}},Qe={alpha:function(t,e){t._alpha=e},textureAlpha:function(t,e){t._textureAlpha=e},width:function(t,e){t._width_=e,t._width=e,t._ts_transform=++Ge},height:function(t,e){t._height_=e,t._height=e,t._ts_transform=++Ge},scale:function(t,e){t._scaleX=e,t._scaleY=e,t._ts_transform=++Ge},scaleX:function(t,e){t._scaleX=e,t._ts_transform=++Ge},scaleY:function(t,e){t._scaleY=e,t._ts_transform=++Ge},skew:function(t,e){t._skewX=e,t._skewY=e,t._ts_transform=++Ge},skewX:function(t,e){t._skewX=e,t._ts_transform=++Ge},skewY:function(t,e){t._skewY=e,t._ts_transform=++Ge},rotation:function(t,e){t._rotation=e,t._ts_transform=++Ge},pivot:function(t,e){t._pivotX=e,t._pivotY=e,t._pivoted=!0,t._ts_transform=++Ge},pivotX:function(t,e){t._pivotX=e,t._pivoted=!0,t._ts_transform=++Ge},pivotY:function(t,e){t._pivotY=e,t._pivoted=!0,t._ts_transform=++Ge},offset:function(t,e){t._offsetX=e,t._offsetY=e,t._ts_translate=++Ge},offsetX:function(t,e){t._offsetX=e,t._ts_translate=++Ge},offsetY:function(t,e){t._offsetY=e,t._ts_translate=++Ge},align:function(t,e){this.alignX(t,e),this.alignY(t,e)},alignX:function(t,e){t._alignX=e,t._aligned=!0,t._ts_translate=++Ge,this.handleX(t,e)},alignY:function(t,e){t._alignY=e,t._aligned=!0,t._ts_translate=++Ge,this.handleY(t,e)},handle:function(t,e){this.handleX(t,e),this.handleY(t,e)},handleX:function(t,e){t._handleX=e,t._handled=!0,t._ts_translate=++Ge},handleY:function(t,e){t._handleY=e,t._handled=!0,t._ts_translate=++Ge},resizeMode:function(t,e,i){i&&("in"==e?e="in-pad":"out"==e&&(e="out-crop"),ti(t,i.resizeWidth,i.resizeHeight,e))},resizeWidth:function(t,e,i){i&&i.resizeMode||ti(t,e,null)},resizeHeight:function(t,e,i){i&&i.resizeMode||ti(t,null,e)},scaleMode:function(t,e,i){i&&ti(t,i.scaleWidth,i.scaleHeight,e)},scaleWidth:function(t,e,i){i&&i.scaleMode||ti(t,e,null)},scaleHeight:function(t,e,i){i&&i.scaleMode||ti(t,null,e)},matrix:function(t,e){this.scaleX(t,e.a),this.skewX(t,e.c/e.d),this.skewY(t,e.b/e.a),this.scaleY(t,e.d),this.offsetX(t,e.e),this.offsetY(t,e.f),this.rotation(t,0)}};function ti(t,e,i,o){var s="number"==typeof e,n="number"==typeof i,r="string"==typeof o;t._ts_transform=++Ge,s&&(t._scaleX=e/t._width_,t._width=t._width_),n&&(t._scaleY=i/t._height_,t._height=t._height_),s&&n&&r&&("out"==o||"out-crop"==o?t._scaleX=t._scaleY=Math.max(t._scaleX,t._scaleY):"in"!=o&&"in-pad"!=o||(t._scaleX=t._scaleY=Math.min(t._scaleX,t._scaleY)),"out-crop"!=o&&"in-pad"!=o||(t._width=e/t._scaleX,t._height=i/t._scaleY))}Ce.prototype.scaleTo=function(t,e,i){return"object"==typeof t&&(i=e,e=t.y,t=t.x),ti(this._pin,t,e,i),this},Ue._add_shortcuts=function(t){t.prototype.size=function(t,e){return this.pin("width",t),this.pin("height",e),this},t.prototype.width=function(t){return void 0===t?this.pin("width"):(this.pin("width",t),this)},t.prototype.height=function(t){return void 0===t?this.pin("height"):(this.pin("height",t),this)},t.prototype.offset=function(t,e){return"object"==typeof t&&(e=t.y,t=t.x),this.pin("offsetX",t),this.pin("offsetY",e),this},t.prototype.rotate=function(t){return this.pin("rotation",t),this},t.prototype.skew=function(t,e){return"object"==typeof t?(e=t.y,t=t.x):void 0===e&&(e=t),this.pin("skewX",t),this.pin("skewY",e),this},t.prototype.scale=function(t,e){return"object"==typeof t?(e=t.y,t=t.x):void 0===e&&(e=t),this.pin("scaleX",t),this.pin("scaleY",e),this},t.prototype.alpha=function(t,e){return this.pin("alpha",t),void 0!==e&&this.pin("textureAlpha",e),this}},Ue._add_shortcuts(Ce);var ei=Ue;function ii(t,e){ii._super.call(this),this.label("Root");var i=!0,o=!0,s=this,n=0,r=function(a){if(!0!==i&&!0!==o){pe.tick=pe.node=pe.draw=0;var h=n||a,c=a-h;n=a;var m=s._tick(c,a,h);s._mo_touch!=s._ts_touch?(s._mo_touch=s._ts_touch,e(s),t(r)):m?t(r):i=!0,pe.fps=c?1e3/c:0}};this.start=function(){return o=!1,this.resume()},this.resume=function(){return i&&(this.publish("resume"),i=!1,t(r)),this},this.pause=function(){return i||this.publish("pause"),i=!0,this},this.touch_root=this.touch,this.touch=function(){return this.resume(),this.touch_root()},this.stop=function(){return o=!0,this}}Ce.prototype._textures=null,Ce.prototype._alpha=1,Ce.prototype.render=function(t){if(this._visible){pe.node++;var e=this.matrix();t.setTransform(e.a,e.b,e.c,e.d,e.e,e.f),this._alpha=this._pin._alpha*(this._parent?this._parent._alpha:1);var i=this._pin._textureAlpha*this._alpha;if(t.globalAlpha!=i&&(t.globalAlpha=i),null!==this._textures)for(var o=0,s=this._textures.length;othis.MAX_ELAPSE&&(t=this.MAX_ELAPSE);var o=!1;if(null!==this._tickBefore)for(var s=0;s0||null!==this._tickBefore&&this._tickBefore.length>0))},Ce.prototype.untick=function(t){var e;"function"==typeof t&&(null!==this._tickBefore&&(e=this._tickBefore.indexOf(t))>=0&&this._tickBefore.splice(e,1),null!==this._tickAfter&&(e=this._tickAfter.indexOf(t))>=0&&this._tickAfter.splice(e,1))},Ce.prototype.timeout=function(t,e){this.setTimeout(t,e)},Ce.prototype.setTimeout=function(t,e){function i(o){if(!((e-=o)<0))return!0;this.untick(i),t.call(this)}return this.tick(i),i},Ce.prototype.clearTimeout=function(t){this.untick(t)},ii._super=Ce,ii.prototype=Se(ii._super.prototype),Ce.root=function(t,e){return new ii(t,e)},ii.prototype.background=function(t){return this},ii.prototype.viewport=function(t,e,i){if(void 0===t)return de({},this._viewport);this._viewport={width:t,height:e,ratio:i||1},this.viewbox();var o=de({},this._viewport);return this.visit({start:function(t){if(!t._flag("viewport"))return!0;t.publish("viewport",[o])}}),this},ii.prototype.viewbox=function(t,e,i){"number"==typeof t&&"number"==typeof e&&(this._viewbox={width:t,height:e,mode:/^(in|out|in-pad|out-crop)$/.test(i)?i:"in-pad"});var o=this._viewbox,s=this._viewport;return s&&o?(this.pin({width:o.width,height:o.height}),this.scaleTo(s.width,s.height,o.mode)):s&&this.pin({width:s.width,height:s.height}),this};var oi=Ce,si=Ie,ni=ke;oi.Matrix=si,oi.Texture=ni,Ce.canvas=function(t,e,i){"string"==typeof t?"object"==typeof e||("function"==typeof e&&(i=e),e={}):("function"==typeof t&&(i=t),e={},t="2d");var o=document.createElement("canvas"),s=o.getContext(t,e),n=new ke(o);return n.context=function(){return s},n.size=function(t,e,i){return i=i||1,o.width=t*i,o.height=e*i,this.src(o,i),this},n.canvas=function(t){return"function"==typeof t?t.call(this,s):void 0===t&&"function"==typeof i&&i.call(this,s),this},"function"==typeof i&&i.call(n,s),n};var ri=ai;function ai(){ai._super.call(this),this.label("Image"),this._textures=[],this._image=null}function hi(){hi._super.call(this),this.label("Anim"),this._textures=[],this._fps=Ce.Anim.FPS,this._ft=1e3/this._fps,this._time=-1,this._repeat=0,this._index=0,this._frames=[];var t=0;this.tick((function(e,i,o){if(!(this._time<0||this._frames.length<=1)){var s=t!=o;if(t=i,s)return!0;if(this._time+=e,this._time0&&(this._repeat-=n)<=0)||(this.stop(),this._callback&&this._callback(),!1)}}),!1)}function ci(){ci._super.call(this),this.label("String"),this._textures=[]}function mi(t){return t}Ce.image=function(t){var e=new ai;return t&&e.image(t),e},ai._super=Ce,ai.prototype=Se(ai._super.prototype),ai.prototype.setImage=function(t,e,i){return this.image(t,e,i)},ai.prototype.image=function(t){return this._image=Ce.texture(t).one(),this.pin("width",this._image?this._image.width:0),this.pin("height",this._image?this._image.height:0),this._textures[0]=this._image.pipe(),this._textures.length=1,this},ai.prototype.tile=function(t){return this._repeat(!1,t),this},ai.prototype.stretch=function(t){return this._repeat(!0,t),this},ai.prototype._repeat=function(t,e){var i=this;function o(t,e,o,s,n,r,a,h,c){var m=i._textures.length>t?i._textures[t]:i._textures[t]=i._image.pipe();m.src(e,o,s,n),m.dest(r,a,h,c)}this.untick(this._repeatTicker),this.tick(this._repeatTicker=function(){if(this._mo_stretch!=this._pin._ts_transform){this._mo_stretch=this._pin._ts_transform;var i=this.pin("width"),s=this.pin("height");this._textures.length=function(t,e,i,o,s,n){var r=t.width,a=t.height,h=t.left,c=t.right,m=t.top,_=t.bottom;r=r-(h="number"==typeof h&&h==h?h:0)-(c="number"==typeof c&&c==c?c:0),a=a-(m="number"==typeof m&&m==m?m:0)-(_="number"==typeof _&&_==_?_:0),s||(e=Math.max(e-h-c,0),i=Math.max(i-m-_,0));var l=0;if(m>0&&h>0&&n(l++,0,0,h,m,0,0,h,m),_>0&&h>0&&n(l++,0,a+m,h,_,0,i+m,h,_),m>0&&c>0&&n(l++,r+h,0,c,m,e+h,0,c,m),_>0&&c>0&&n(l++,r+h,a+m,c,_,e+h,i+m,c,_),o)m>0&&n(l++,h,0,r,m,h,0,e,m),_>0&&n(l++,h,a+m,r,_,h,i+m,e,_),h>0&&n(l++,0,m,h,a,0,m,h,i),c>0&&n(l++,r+h,m,c,a,e+h,m,c,i),n(l++,h,m,r,a,h,m,e,i);else for(var u,p=h,d=e;d>0;){u=Math.min(r,d),d-=r;for(var y,f=m,v=i;v>0;)y=Math.min(a,v),v-=a,n(l++,h,m,u,y,p,f,u,y),d<=0&&(h&&n(l++,0,m,h,y,0,f,h,y),c&&n(l++,r+h,m,c,y,p+u,f,c,y)),f+=y;m&&n(l++,h,0,u,m,p,0,u,m),_&&n(l++,h,a+m,u,_,p,f,u,_),p+=u}return l}(this._image,i,s,t,e,o)}})},Ce.anim=function(t,e){var i=new hi;return i.frames(t).gotoFrame(0),e&&i.fps(e),i},hi._super=Ce,hi.prototype=Se(hi._super.prototype),Ce.Anim={FPS:15},hi.prototype.fps=function(t){return void 0===t?this._fps:(this._fps=t>0?t:Ce.Anim.FPS,this._ft=1e3/this._fps,this)},hi.prototype.setFrames=function(t,e,i){return this.frames(t,e,i)},hi.prototype.frames=function(t){return this._index=0,this._frames=Ce.texture(t).array(),this.touch(),this},hi.prototype.length=function(){return this._frames?this._frames.length:0},hi.prototype.gotoFrame=function(t,e){return this._index=0|ze.rotate(t,this._frames.length),e=e||!this._textures[0],this._textures[0]=this._frames[this._index],e&&(this.pin("width",this._textures[0].width),this.pin("height",this._textures[0].height)),this.touch(),this},hi.prototype.moveFrame=function(t){return this.gotoFrame(this._index+t)},hi.prototype.repeat=function(t,e){return this._repeat=t*this._frames.length-1,this._callback=e,this.play(),this},hi.prototype.play=function(t){return void 0!==t?(this.gotoFrame(t),this._time=0):this._time<0&&(this._time=0),this.touch(),this},hi.prototype.stop=function(t){return this._time=-1,void 0!==t&&this.gotoFrame(t),this},Ce.string=function(t){return(new ci).frames(t)},ci._super=Ce,ci.prototype=Se(ci._super.prototype),ci.prototype.setFont=function(t,e,i){return this.frames(t,e,i)},ci.prototype.frames=function(t){return this._textures=[],"string"==typeof t?(t=Ce.texture(t),this._item=function(e){return t.one(e)}):"object"==typeof t?this._item=function(e){return t[e]}:"function"==typeof t&&(this._item=t),this},ci.prototype.setValue=function(t,e,i){return this.value(t,e,i)},ci.prototype.value=function(t){if(void 0===t)return this._value;if(this._value===t)return this;this._value=t,null===t?t="":"string"==typeof t||ye.array(t)||(t=t.toString()),this._spacing=this._spacing||0;for(var e=0,i=0,o=0;o0?this._spacing:0,s.dest(e,0),e+=s.width,i=Math.max(i,s.height)}return this.pin("width",e),this.pin("height",i),this._textures.length=t.length,this},Ce.row=function(t){return Ce.create().row(t).label("Row")},Ce.prototype.row=function(t){return this.sequence("row",t),this},Ce.column=function(t){return Ce.create().column(t).label("Row")},Ce.prototype.column=function(t){return this.sequence("column",t),this},Ce.sequence=function(t,e){return Ce.create().sequence(t,e).label("Sequence")},Ce.prototype.sequence=function(t,e){return this._padding=this._padding||0,this._spacing=this._spacing||0,this.untick(this._layoutTiker),this.tick(this._layoutTiker=function(){if(this._mo_seq!=this._ts_touch){this._mo_seq=this._ts_touch;var i=this._mo_seqAlign!=this._ts_children;this._mo_seqAlign=this._ts_children;for(var o,s=0,n=0,r=this.first(!0),a=!0;o=r;){r=o.next(!0),o.matrix(!0);var h=o.pin("boxWidth"),c=o.pin("boxHeight");"column"==t?(!a&&(n+=this._spacing),o.pin("offsetY")!=n&&o.pin("offsetY",n),s=Math.max(s,h),n+=c,i&&o.pin("alignX",e)):"row"==t&&(!a&&(s+=this._spacing),o.pin("offsetX")!=s&&o.pin("offsetX",s),s+=h,n=Math.max(n,c),i&&o.pin("alignY",e)),a=!1}s+=2*this._padding,n+=2*this._padding,this.pin("width")!=s&&this.pin("width",s),this.pin("height")!=n&&this.pin("height",n)}}),this},Ce.box=function(){return Ce.create().box().label("Box")},Ce.prototype.box=function(){return this._padding=this._padding||0,this.untick(this._layoutTiker),this.tick(this._layoutTiker=function(){if(this._mo_box!=this._ts_touch){this._mo_box=this._ts_touch;for(var t,e=0,i=0,o=this.first(!0);t=o;){o=t.next(!0),t.matrix(!0);var s=t.pin("boxWidth"),n=t.pin("boxHeight");e=Math.max(e,s),i=Math.max(i,n)}e+=2*this._padding,i+=2*this._padding,this.pin("width")!=e&&this.pin("width",e),this.pin("height")!=i&&this.pin("height",i)}}),this},Ce.layer=function(){return Ce.create().layer().label("Layer")},Ce.prototype.layer=function(){return this.untick(this._layoutTiker),this.tick(this._layoutTiker=function(){var t=this.parent();if(t){var e=t.pin("width");this.pin("width")!=e&&this.pin("width",e);var i=t.pin("height");this.pin("height")!=i&&this.pin("height",i)}},!0),this},Ce.prototype.padding=function(t){return this._padding=t,this},Ce.prototype.spacing=function(t){return this._spacing=t,this};var _i={},li={},ui={};function pi(t){if("function"==typeof t)return t;if("string"!=typeof t)return mi;var e=_i[t];if(e)return e;var i=/^(\w+)(-(in|out|in-out|out-in))?(\((.*)\))?$/i.exec(t);if(!i||!i.length)return mi;var o=ui[i[1]],s=li[i[3]],n=i[5];return e=o&&o.fn?o.fn:o&&o.fc?o.fc.apply(o.fc,n&&n.replace(/\s+/,"").split(",")):mi,s&&(e=s.fn(e)),_i[t]=e,e}pi.add=function(t){for(var e=(t.name||t.mode).split(/\s+/),i=0;i0&&a>0&&(s.setTransform(1,0,0,1,0,0),s.clearRect(0,0,r,a),l.render(s))}l.background=function(t){return o.style.backgroundColor=t,this},t(l,o);var p=-1,d=-1;function y(){n?(r=window.innerWidth>0?window.innerWidth:screen.width,a=window.innerHeight>0?window.innerHeight:screen.height,o.style.width=r+"px",o.style.height=a+"px"):(r=o.clientWidth,a=o.clientHeight),r*=i,a*=i,o.width===r&&o.height===a||(o.width=r,o.height=a,l.viewport(r,a,i),u())}!function t(){var e,i;n?(e=window.innerWidth>0?window.innerWidth:screen.width,i=window.innerHeight>0?window.innerHeight:screen.height):(e=o.clientWidth,i=o.clientHeight),p===e&&d===i||(p=e,d=i,y()),_(t)}()},"image-loader":function(t,e,i){var o=new Image;o.onload=function(){e(o)},o.onerror=i,o.src=t}});var wi=ue((function(t){t.exports=oi,t.exports.internal={},t.exports.internal.Image=ri,t.exports.Mouse=Bi,t.exports.Math=ze,t.exports._extend=de,t.exports._create=Se}));function Vi(t,e){var i=this;Vi._super.call(this),this.label("Planck"),e=e||{},this._options={},this._options.speed=e.speed||1,this._options.hz=e.hz||60,Math.abs(this._options.hz)<1&&(this._options.hz=1/this._options.hz),this._options.scaleY=e.scaleY||-1,this._options.ratio=e.ratio||16,this._options.lineWidth=2/this._options.ratio,this._world=t;var o=1/this._options.hz,s=0;this.tick((function(e){for(e=.001*e*i._options.speed,s+=e;s>o;)t.step(o),s-=o;return i.renderWorld(),!0}),!0),t.on("remove-fixture",(function(t){t.ui&&t.ui.remove()})),t.on("remove-joint",(function(t){t.ui&&t.ui.remove()}))}Vi._super=wi,Vi.prototype=wi._create(Vi._super.prototype),Vi.prototype.renderWorld=function(){for(var t=this._world,e=this._options,i=this,o=t.getBodyList();o;o=o.getNext())for(var s=o.getFixtureList();s;s=s.getNext()){if(!s.ui){s.render&&s.render.stroke?e.strokeStyle=s.render.stroke:o.render&&o.render.stroke?e.strokeStyle=o.render.stroke:o.isDynamic()?e.strokeStyle="rgba(255,255,255,0.9)":o.isKinematic()?e.strokeStyle="rgba(255,255,255,0.7)":o.isStatic()&&(e.strokeStyle="rgba(255,255,255,0.5)"),s.render&&s.render.fill?e.fillStyle=s.render.fill:o.render&&o.render.fill?e.fillStyle=o.render.fill:e.fillStyle="";var n=s.getType(),r=s.getShape();"circle"==n&&(s.ui=i.drawCircle(r,e)),"edge"==n&&(s.ui=i.drawEdge(r,e)),"polygon"==n&&(s.ui=i.drawPolygon(r,e)),"chain"==n&&(s.ui=i.drawChain(r,e)),s.ui&&s.ui.appendTo(i)}if(s.ui){var a=o.getPosition(),h=o.getAngle();s.ui.__lastX===a.x&&s.ui.__lastY===a.y&&s.ui.__lastR===h||(s.ui.__lastX=a.x,s.ui.__lastY=a.y,s.ui.__lastR=h,s.ui.offset(a.x,e.scaleY*a.y),s.ui.rotate(e.scaleY*h))}}for(var c=t.getJointList();c;c=c.getNext()){n=c.getType();var m=c.getAnchorA();o=c.getAnchorB();if(c.ui||(e.strokeStyle="rgba(255,255,255,0.2)",c.ui=i.drawJoint(c,e),c.ui.pin("handle",.5),c.ui&&c.ui.appendTo(i)),c.ui){var _=.5*(m.x+o.x),l=e.scaleY*(m.y+o.y)*.5,u=m.x-o.x,p=e.scaleY*(m.y-o.y),d=Math.sqrt(u*u+p*p);c.ui.width(d),c.ui.rotate(Math.atan2(p,u)),c.ui.offset(_,l)}}},Vi.prototype.drawJoint=function(t,e){var i=e.lineWidth,o=e.ratio,s=wi.canvas((function(t){this.size(10+2*i,2*i,o),t.scale(o,o),t.beginPath(),t.moveTo(i,i),t.lineTo(i+10,i),t.lineCap="round",t.lineWidth=e.lineWidth,t.strokeStyle=e.strokeStyle,t.stroke()}));return wi.image(s).stretch()},Vi.prototype.drawCircle=function(t,e){var i=e.lineWidth,o=e.ratio,s=t.m_radius,n=s+i,r=s+i,a=2*s+2*i,h=2*s+2*i,c=wi.canvas((function(t){this.size(a,h,o),t.scale(o,o),t.arc(n,r,s,0,2*Math.PI),e.fillStyle&&(t.fillStyle=e.fillStyle,t.fill()),t.lineTo(n,r),t.lineWidth=e.lineWidth,t.strokeStyle=e.strokeStyle,t.stroke()})),m=wi.image(c).offset(t.m_p.x-n,e.scaleY*t.m_p.y-r);return wi.create().append(m)},Vi.prototype.drawEdge=function(t,e){var i=e.lineWidth,o=e.ratio,s=t.m_vertex1,n=t.m_vertex2,r=n.x-s.x,a=n.y-s.y,h=Math.sqrt(r*r+a*a),c=wi.canvas((function(t){this.size(h+2*i,2*i,o),t.scale(o,o),t.beginPath(),t.moveTo(i,i),t.lineTo(i+h,i),t.lineCap="round",t.lineWidth=e.lineWidth,t.strokeStyle=e.strokeStyle,t.stroke()})),m=Math.min(s.x,n.x),_=Math.min(e.scaleY*s.y,e.scaleY*n.y),l=wi.image(c);return l.rotate(e.scaleY*Math.atan2(a,r)),l.offset(m-i,_-i),wi.create().append(l)},Vi.prototype.drawPolygon=function(t,e){var i=e.lineWidth,o=e.ratio,s=t.m_vertices;if(s.length){for(var n=1/0,r=1/0,a=-1/0,h=-1/0,c=0;c2&&t.closePath(),e.fillStyle&&(t.fillStyle=e.fillStyle,t.fill(),t.closePath()),t.lineCap="round",t.lineWidth=e.lineWidth,t.strokeStyle=e.strokeStyle,t.stroke()})),p=wi.image(u);return p.offset(n-i,r-i),wi.create().append(p)}},Vi.prototype.drawChain=function(t,e){var i=e.lineWidth,o=e.ratio,s=t.m_vertices;if(s.length){for(var n=1/0,r=1/0,a=-1/0,h=-1/0,c=0;c>1,t|=t>>2,t|=t>>4,t|=t>>8,(t|=t>>16)+1},isPowerOfTwo:function(t){return t>0&&0==(t&t-1)},mod:function(t,e,i){return void 0===e?(i=1,e=0):void 0===i&&(i=e,e=0),i>e?(t=(t-e)%(i-e))+(t<0?i:e):(t=(t-i)%(e-i))+(t<=0?e:i)},clamp:function(t,e,i){return ti?i:t},random:function(t,e){return void 0===t?(e=1,t=0):void 0===e&&(e=t,t=0),t===e?t:Math.random()*(e-t)+t}}),ot=function(){function t(e,i){if(!(this instanceof t))return new t(e,i);void 0===e?(this.x=0,this.y=0):"object"==typeof e?(this.x=e.x,this.y=e.y):(this.x=e,this.y=i)}return t.prototype._serialize=function(){return{x:this.x,y:this.y}},t._deserialize=function(e){var i=Object.create(t.prototype);return i.x=e.x,i.y=e.y,i},t.zero=function(){var e=Object.create(t.prototype);return e.x=0,e.y=0,e},t.neo=function(e,i){var s=Object.create(t.prototype);return s.x=e,s.y=i,s},t.clone=function(e){return t.neo(e.x,e.y)},t.prototype.toString=function(){return JSON.stringify(this)},t.isValid=function(t){return null!=t&&(st.isFinite(t.x)&&st.isFinite(t.y))},t.assert=function(t){},t.prototype.clone=function(){return t.clone(this)},t.prototype.setZero=function(){return this.x=0,this.y=0,this},t.prototype.set=function(t,e){return"object"==typeof t?(this.x=t.x,this.y=t.y):(this.x=t,this.y=e),this},t.prototype.setNum=function(t,e){return this.x=t,this.y=e,this},t.prototype.setVec2=function(t){return this.x=t.x,this.y=t.y,this},t.prototype.wSet=function(t,e,i,s){return void 0!==i||void 0!==s?this.setCombine(t,e,i,s):this.setMul(t,e)},t.prototype.setCombine=function(t,e,i,s){var o=t*e.x+i*s.x,n=t*e.y+i*s.y;return this.x=o,this.y=n,this},t.prototype.setMul=function(t,e){var i=t*e.x,s=t*e.y;return this.x=i,this.y=s,this},t.prototype.add=function(t){return this.x+=t.x,this.y+=t.y,this},t.prototype.wAdd=function(t,e,i,s){return void 0!==i||void 0!==s?this.addCombine(t,e,i,s):this.addMul(t,e)},t.prototype.addCombine=function(t,e,i,s){var o=t*e.x+i*s.x,n=t*e.y+i*s.y;return this.x+=o,this.y+=n,this},t.prototype.addMul=function(t,e){var i=t*e.x,s=t*e.y;return this.x+=i,this.y+=s,this},t.prototype.wSub=function(t,e,i,s){return void 0!==i||void 0!==s?this.subCombine(t,e,i,s):this.subMul(t,e)},t.prototype.subCombine=function(t,e,i,s){var o=t*e.x+i*s.x,n=t*e.y+i*s.y;return this.x-=o,this.y-=n,this},t.prototype.subMul=function(t,e){var i=t*e.x,s=t*e.y;return this.x-=i,this.y-=s,this},t.prototype.sub=function(t){return this.x-=t.x,this.y-=t.y,this},t.prototype.mul=function(t){return this.x*=t,this.y*=t,this},t.prototype.length=function(){return t.lengthOf(this)},t.prototype.lengthSquared=function(){return t.lengthSquared(this)},t.prototype.normalize=function(){var t=this.length();if(tt*t){var i=t/st.sqrt(e);this.x*=i,this.y*=i}return this},t.clamp=function(e,i){var s=t.neo(e.x,e.y);return s.clamp(i),s},t.scaleFn=function(e,i){return function(s){return t.neo(s.x*e,s.y*i)}},t.translateFn=function(e,i){return function(s){return t.neo(s.x+e,s.y+i)}},t}(),nt=function(){function t(e,i){if(!(this instanceof t))return new t(e,i);this.lowerBound=ot.zero(),this.upperBound=ot.zero(),"object"==typeof e&&this.lowerBound.setVec2(e),"object"==typeof i?this.upperBound.setVec2(i):"object"==typeof e&&this.upperBound.setVec2(e)}return t.prototype.isValid=function(){return t.isValid(this)},t.isValid=function(t){return null!=t&&(ot.isValid(t.lowerBound)&&ot.isValid(t.upperBound)&&ot.sub(t.upperBound,t.lowerBound).lengthSquared()>=0)},t.assert=function(t){},t.prototype.getCenter=function(){return ot.neo(.5*(this.lowerBound.x+this.upperBound.x),.5*(this.lowerBound.y+this.upperBound.y))},t.prototype.getExtents=function(){return ot.neo(.5*(this.upperBound.x-this.lowerBound.x),.5*(this.upperBound.y-this.lowerBound.y))},t.prototype.getPerimeter=function(){return 2*(this.upperBound.x-this.lowerBound.x+this.upperBound.y-this.lowerBound.y)},t.prototype.combine=function(t,e){e=e||this;var i=t.lowerBound,s=t.upperBound,o=e.lowerBound,n=e.upperBound,r=st.min(i.x,o.x),a=st.min(i.y,o.y),h=st.max(n.x,s.x),c=st.max(n.y,s.y);this.lowerBound.setNum(r,a),this.upperBound.setNum(h,c)},t.prototype.combinePoints=function(t,e){this.lowerBound.setNum(st.min(t.x,e.x),st.min(t.y,e.y)),this.upperBound.setNum(st.max(t.x,e.x),st.max(t.y,e.y))},t.prototype.set=function(t){this.lowerBound.setNum(t.lowerBound.x,t.lowerBound.y),this.upperBound.setNum(t.upperBound.x,t.upperBound.y)},t.prototype.contains=function(t){var e=!0;return e=(e=(e=(e=e&&this.lowerBound.x<=t.lowerBound.x)&&this.lowerBound.y<=t.lowerBound.y)&&t.upperBound.x<=this.upperBound.x)&&t.upperBound.y<=this.upperBound.y},t.prototype.extend=function(e){return t.extend(this,e),this},t.extend=function(t,e){t.lowerBound.x-=e,t.lowerBound.y-=e,t.upperBound.x+=e,t.upperBound.y+=e},t.testOverlap=function(t,e){var i=e.lowerBound.x-t.upperBound.x,s=t.lowerBound.x-e.upperBound.x,o=e.lowerBound.y-t.upperBound.y,n=t.lowerBound.y-e.upperBound.y;return!(i>0||o>0||s>0||n>0)},t.areEqual=function(t,e){return ot.areEqual(t.lowerBound,e.lowerBound)&&ot.areEqual(t.upperBound,e.upperBound)},t.diff=function(t,e){var i=st.max(0,st.min(t.upperBound.x,e.upperBound.x)-st.max(e.lowerBound.x,t.lowerBound.x)),s=st.max(0,st.min(t.upperBound.y,e.upperBound.y)-st.max(e.lowerBound.y,t.lowerBound.y));return(t.upperBound.x-t.lowerBound.x)*(t.upperBound.y-t.lowerBound.y)+(e.upperBound.x-e.lowerBound.x)*(e.upperBound.y-e.lowerBound.y)-i*s},t.prototype.rayCast=function(t,e){for(var i=-1/0,s=1/0,o=e.p1,n=ot.sub(e.p2,e.p1),r=ot.abs(n),a=ot.zero(),h="x";null!==h;h="x"===h?"y":null)if(r.x_){var u=m;m=_,_=u,l=1}if(m>i&&(a.setZero(),a[h]=l,i=m),i>(s=st.min(s,_)))return!1}return!(i<0||e.maxFraction0?t=this._list.shift():(this._createCount++,t="function"==typeof this._createFn?this._createFn():{}),this._outCount++,"function"==typeof this._outFn&&this._outFn(t),t},t.prototype.release=function(t){this._list.length"+this._outCount+" <"+this._inCount+" -"+this._discardCount+" ="+this._list.length+"/"+this._max},t}(),ht=function(){function t(t){this.aabb=new nt,this.userData=null,this.parent=null,this.child1=null,this.child2=null,this.height=-1,this.id=t}return t.prototype.toString=function(){return this.id+": "+this.userData},t.prototype.isLeaf=function(){return null==this.child1},t}(),ct=function(){function t(){this.inputPool=new at({create:function(){return{}},release:function(t){}}),this.stackPool=new at({create:function(){return[]},release:function(t){t.length=0}}),this.iteratorPool=new at({create:function(){return new mt},release:function(t){t.close()}}),this.m_root=null,this.m_nodes={},this.m_lastProxyId=0,this.m_pool=new at({create:function(){return new ht}})}return t.prototype.getUserData=function(t){return this.m_nodes[t].userData},t.prototype.getFatAABB=function(t){return this.m_nodes[t].aabb},t.prototype.allocateNode=function(){var t=this.m_pool.allocate();return t.id=++this.m_lastProxyId,t.userData=null,t.parent=null,t.child1=null,t.child2=null,t.height=-1,this.m_nodes[t.id]=t,t},t.prototype.freeNode=function(t){this.m_pool.release(t),t.height=-1,delete this.m_nodes[t.id]},t.prototype.createProxy=function(t,e){var i=this.allocateNode();return i.aabb.set(t),nt.extend(i.aabb,rt.aabbExtension),i.userData=e,i.height=0,this.insertLeaf(i),i.id},t.prototype.destroyProxy=function(t){var e=this.m_nodes[t];this.removeLeaf(e),this.freeNode(e)},t.prototype.moveProxy=function(t,e,i){var s=this.m_nodes[t];return!s.aabb.contains(e)&&(this.removeLeaf(s),s.aabb.set(e),e=s.aabb,nt.extend(e,rt.aabbExtension),i.x<0?e.lowerBound.x+=i.x*rt.aabbMultiplier:e.upperBound.x+=i.x*rt.aabbMultiplier,i.y<0?e.lowerBound.y+=i.y*rt.aabbMultiplier:e.upperBound.y+=i.y*rt.aabbMultiplier,this.insertLeaf(s),!0)},t.prototype.insertLeaf=function(t){if(null==this.m_root)return this.m_root=t,void(this.m_root.parent=null);for(var e=t.aabb,i=this.m_root;!i.isLeaf();){var s=i.child1,o=i.child2,n=i.aabb.getPerimeter(),r=new nt;r.combine(i.aabb,e);var a=r.getPerimeter(),h=2*a,c=2*(a-n),m=void 0;if(s.isLeaf()){(u=new nt).combine(e,s.aabb),m=u.getPerimeter()+c}else{(u=new nt).combine(e,s.aabb);var _=s.aabb.getPerimeter();m=u.getPerimeter()-_+c}var l=void 0;if(o.isLeaf()){(u=new nt).combine(e,o.aabb),l=u.getPerimeter()+c}else{var u;(u=new nt).combine(e,o.aabb);_=o.aabb.getPerimeter();l=u.getPerimeter()-_+c}if(h1){var n=s.child1,r=s.child2;return s.child1=e,s.parent=e.parent,e.parent=s,null!=s.parent?s.parent.child1===t?s.parent.child1=s:s.parent.child2=s:this.m_root=s,n.height>r.height?(s.child2=n,e.child2=r,r.parent=e,e.aabb.combine(i.aabb,r.aabb),s.aabb.combine(e.aabb,n.aabb),e.height=1+st.max(i.height,r.height),s.height=1+st.max(e.height,n.height)):(s.child2=r,e.child2=n,n.parent=e,e.aabb.combine(i.aabb,n.aabb),s.aabb.combine(e.aabb,r.aabb),e.height=1+st.max(i.height,n.height),s.height=1+st.max(e.height,r.height)),s}if(o<-1){var a=i.child1,h=i.child2;return i.child1=e,i.parent=e.parent,e.parent=i,null!=i.parent?i.parent.child1===e?i.parent.child1=i:i.parent.child2=i:this.m_root=i,a.height>h.height?(i.child2=a,e.child1=h,h.parent=e,e.aabb.combine(s.aabb,h.aabb),i.aabb.combine(e.aabb,a.aabb),e.height=1+st.max(s.height,h.height),i.height=1+st.max(e.height,a.height)):(i.child2=h,e.child1=a,a.parent=e,e.aabb.combine(s.aabb,a.aabb),i.aabb.combine(e.aabb,h.aabb),e.height=1+st.max(s.height,a.height),i.height=1+st.max(e.height,h.height)),i}return e},t.prototype.getHeight=function(){return null==this.m_root?0:this.m_root.height},t.prototype.getAreaRatio=function(){if(null==this.m_root)return 0;for(var t,e=this.m_root.aabb.getPerimeter(),i=0,s=this.iteratorPool.allocate().preorder(this.m_root);t=s.next();)t.height<0||(i+=t.aabb.getPerimeter());return this.iteratorPool.release(s),i/e},t.prototype.computeHeight=function(t){var e;if((e=void 0!==t?this.m_nodes[t]:this.m_root).isLeaf())return 0;var i=this.computeHeight(e.child1.id),s=this.computeHeight(e.child2.id);return 1+st.max(i,s)},t.prototype.validateStructure=function(t){if(null!=t){this.m_root;var e=t.child1,i=t.child2;t.isLeaf()||(this.validateStructure(e),this.validateStructure(i))}},t.prototype.validateMetrics=function(t){if(null!=t){var e=t.child1,i=t.child2;if(!t.isLeaf()){var s=e.height,o=i.height;st.max(s,o),(new nt).combine(e.aabb,i.aabb),this.validateMetrics(e),this.validateMetrics(i)}}},t.prototype.validate=function(){this.validateStructure(this.m_root),this.validateMetrics(this.m_root)},t.prototype.getMaxBalance=function(){for(var t,e=0,i=this.iteratorPool.allocate().preorder(this.m_root);t=i.next();)if(!(t.height<=1)){var s=st.abs(t.child2.height-t.child1.height);e=st.max(e,s)}return this.iteratorPool.release(i),e},t.prototype.rebuildBottomUp=function(){for(var t,e=[],i=0,s=this.iteratorPool.allocate().preorder(this.m_root);t=s.next();)t.height<0||(t.isLeaf()?(t.parent=null,e[i]=t,++i):this.freeNode(t));for(this.iteratorPool.release(s);i>1;){for(var o=1/0,n=-1,r=-1,a=0;a0;){var s=i.pop();if(null!=s)if(nt.testOverlap(s.aabb,t))if(s.isLeaf()){if(!1===e(s.id))return}else i.push(s.child1),i.push(s.child2)}this.stackPool.release(i)},t.prototype.rayCast=function(t,e){var i=t.p1,s=t.p2,o=ot.sub(s,i);o.normalize();var n=ot.crossNumVec2(1,o),r=ot.abs(n),a=t.maxFraction,h=new nt,c=ot.combine(1-a,i,a,s);h.combinePoints(i,c);var m=this.stackPool.allocate(),_=this.inputPool.allocate();for(m.push(this.m_root);m.length>0;){var l=m.pop();if(null!=l&&!1!==nt.testOverlap(l.aabb,h)){var u=l.aabb.getCenter(),p=l.aabb.getExtents();if(!(st.abs(ot.dot(n,ot.sub(i,u)))-ot.dot(r,p)>0))if(l.isLeaf()){_.p1=ot.clone(t.p1),_.p2=ot.clone(t.p2),_.maxFraction=a;var d=e(_,l.id);if(0===d)return;d>0&&(a=d,c=ot.combine(1-a,i,a,s),h.combinePoints(i,c))}else m.push(l.child1),m.push(l.child2)}}this.stackPool.release(m),this.inputPool.release(_)},t}(),mt=function(){function t(){this.parents=[],this.states=[]}return t.prototype.preorder=function(t){return this.parents.length=0,this.parents.push(t),this.states.length=0,this.states.push(0),this},t.prototype.next=function(){for(;this.parents.length>0;){var t=this.parents.length-1,e=this.parents[t];if(0===this.states[t])return this.states[t]=1,e;if(1===this.states[t]&&(this.states[t]=2,e.child1))return this.parents.push(e.child1),this.states.push(1),e.child1;if(2===this.states[t]&&(this.states[t]=3,e.child2))return this.parents.push(e.child2),this.states.push(1),e.child2;this.parents.pop(),this.states.pop()}},t.prototype.close=function(){this.parents.length=0},t}(),_t=function(){function t(){var t=this;this.m_tree=new ct,this.m_proxyCount=0,this.m_moveBuffer=[],this.query=function(e,i){t.m_tree.query(e,i)},this.queryCallback=function(e){if(e===t.m_queryProxyId)return!0;var i=st.min(e,t.m_queryProxyId),s=st.max(e,t.m_queryProxyId),o=t.m_tree.getUserData(i),n=t.m_tree.getUserData(s);return t.m_callback(o,n),!0}}return t.prototype.getUserData=function(t){return this.m_tree.getUserData(t)},t.prototype.testOverlap=function(t,e){var i=this.m_tree.getFatAABB(t),s=this.m_tree.getFatAABB(e);return nt.testOverlap(i,s)},t.prototype.getFatAABB=function(t){return this.m_tree.getFatAABB(t)},t.prototype.getProxyCount=function(){return this.m_proxyCount},t.prototype.getTreeHeight=function(){return this.m_tree.getHeight()},t.prototype.getTreeBalance=function(){return this.m_tree.getMaxBalance()},t.prototype.getTreeQuality=function(){return this.m_tree.getAreaRatio()},t.prototype.rayCast=function(t,e){this.m_tree.rayCast(t,e)},t.prototype.shiftOrigin=function(t){this.m_tree.shiftOrigin(t)},t.prototype.createProxy=function(t,e){var i=this.m_tree.createProxy(t,e);return this.m_proxyCount++,this.bufferMove(i),i},t.prototype.destroyProxy=function(t){this.unbufferMove(t),this.m_proxyCount--,this.m_tree.destroyProxy(t)},t.prototype.moveProxy=function(t,e,i){this.m_tree.moveProxy(t,e,i)&&this.bufferMove(t)},t.prototype.touchProxy=function(t){this.bufferMove(t)},t.prototype.bufferMove=function(t){this.m_moveBuffer.push(t)},t.prototype.unbufferMove=function(t){for(var e=0;e0;)if(this.m_queryProxyId=this.m_moveBuffer.pop(),null!==this.m_queryProxyId){var e=this.m_tree.getFatAABB(this.m_queryProxyId);this.m_tree.query(e,this.queryCallback)}},t}(),lt=function(){function t(e){if(!(this instanceof t))return new t(e);"number"==typeof e?this.setAngle(e):"object"==typeof e?this.setRot(e):this.setIdentity()}return t.neo=function(e){var i=Object.create(t.prototype);return i.setAngle(e),i},t.clone=function(e){var i=Object.create(t.prototype);return i.s=e.s,i.c=e.c,i},t.identity=function(){var e=Object.create(t.prototype);return e.s=0,e.c=1,e},t.isValid=function(t){return null!=t&&(st.isFinite(t.s)&&st.isFinite(t.c))},t.assert=function(t){},t.prototype.setIdentity=function(){this.s=0,this.c=1},t.prototype.set=function(t){"object"==typeof t?(this.s=t.s,this.c=t.c):(this.s=st.sin(t),this.c=st.cos(t))},t.prototype.setRot=function(t){this.s=t.s,this.c=t.c},t.prototype.setAngle=function(t){this.s=st.sin(t),this.c=st.cos(t)},t.prototype.getAngle=function(){return st.atan2(this.s,this.c)},t.prototype.getXAxis=function(){return ot.neo(this.c,this.s)},t.prototype.getYAxis=function(){return ot.neo(-this.s,this.c)},t.mul=function(e,i){if("c"in i&&"s"in i){var s=t.identity();return s.s=e.s*i.c+e.c*i.s,s.c=e.c*i.c-e.s*i.s,s}if("x"in i&&"y"in i)return ot.neo(e.c*i.x-e.s*i.y,e.s*i.x+e.c*i.y)},t.mulRot=function(e,i){var s=t.identity();return s.s=e.s*i.c+e.c*i.s,s.c=e.c*i.c-e.s*i.s,s},t.mulVec2=function(t,e){return ot.neo(t.c*e.x-t.s*e.y,t.s*e.x+t.c*e.y)},t.mulSub=function(t,e,i){var s=t.c*(e.x-i.x)-t.s*(e.y-i.y),o=t.s*(e.x-i.x)+t.c*(e.y-i.y);return ot.neo(s,o)},t.mulT=function(e,i){if("c"in i&&"s"in i){var s=t.identity();return s.s=e.c*i.s-e.s*i.c,s.c=e.c*i.c+e.s*i.s,s}if("x"in i&&"y"in i)return ot.neo(e.c*i.x+e.s*i.y,-e.s*i.x+e.c*i.y)},t.mulTRot=function(e,i){var s=t.identity();return s.s=e.c*i.s-e.s*i.c,s.c=e.c*i.c+e.s*i.s,s},t.mulTVec2=function(t,e){return ot.neo(t.c*e.x+t.s*e.y,-t.s*e.x+t.c*e.y)},t}(),ut=function(){function t(e,i){if(!(this instanceof t))return new t(e,i);this.p=ot.zero(),this.q=lt.identity(),void 0!==e&&this.p.setVec2(e),void 0!==i&&this.q.setAngle(i)}return t.clone=function(e){var i=Object.create(t.prototype);return i.p=ot.clone(e.p),i.q=lt.clone(e.q),i},t.neo=function(e,i){var s=Object.create(t.prototype);return s.p=ot.clone(e),s.q=lt.clone(i),s},t.identity=function(){var e=Object.create(t.prototype);return e.p=ot.zero(),e.q=lt.identity(),e},t.prototype.setIdentity=function(){this.p.setZero(),this.q.setIdentity()},t.prototype.set=function(t,e){void 0===e?(this.p.set(t.p),this.q.set(t.q)):(this.p.set(t),this.q.set(e))},t.prototype.setNum=function(t,e){this.p.setVec2(t),this.q.setAngle(e)},t.prototype.setTransform=function(t){this.p.setVec2(t.p),this.q.setRot(t.q)},t.isValid=function(t){return null!=t&&(ot.isValid(t.p)&<.isValid(t.q))},t.assert=function(t){},t.mul=function(e,i){if(Array.isArray(i)){for(var s=[],o=0;o0;var e=0!=(t.m_filterMaskBits&this.m_filterCategoryBits),i=0!=(t.m_filterCategoryBits&this.m_filterMaskBits);return e&&i},t}(),bt="static",At="kinematic",Bt="dynamic",wt={type:bt,position:ot.zero(),angle:0,linearVelocity:ot.zero(),angularVelocity:0,linearDamping:0,angularDamping:0,fixedRotation:!1,bullet:!1,gravityScale:1,allowSleep:!0,awake:!0,active:!0,userData:null},Vt=function(){this.mass=0,this.center=ot.zero(),this.I=0},Ct=function(){function t(t,e){e=it(e,wt),this.m_world=t,this.m_awakeFlag=e.awake,this.m_autoSleepFlag=e.allowSleep,this.m_bulletFlag=e.bullet,this.m_fixedRotationFlag=e.fixedRotation,this.m_activeFlag=e.active,this.m_islandFlag=!1,this.m_toiFlag=!1,this.m_userData=e.userData,this.m_type=e.type,this.m_type==Bt?(this.m_mass=1,this.m_invMass=1):(this.m_mass=0,this.m_invMass=0),this.m_I=0,this.m_invI=0,this.m_xf=ut.identity(),this.m_xf.p=ot.clone(e.position),this.m_xf.q.setAngle(e.angle),this.m_sweep=new pt,this.m_sweep.setTransform(this.m_xf),this.c_velocity=new dt,this.c_position=new yt,this.m_force=ot.zero(),this.m_torque=0,this.m_linearVelocity=ot.clone(e.linearVelocity),this.m_angularVelocity=e.angularVelocity,this.m_linearDamping=e.linearDamping,this.m_angularDamping=e.angularDamping,this.m_gravityScale=e.gravityScale,this.m_sleepTime=0,this.m_jointList=null,this.m_contactList=null,this.m_fixtureList=null,this.m_prev=null,this.m_next=null,this.m_destroyed=!1}return t.prototype._serialize=function(){for(var t=[],e=this.m_fixtureList;e;e=e.m_next)t.push(e);return{type:this.m_type,bullet:this.m_bulletFlag,position:this.m_xf.p,angle:this.m_xf.q.getAngle(),linearVelocity:this.m_linearVelocity,angularVelocity:this.m_angularVelocity,fixtures:t}},t._deserialize=function(e,i,s){var o=new t(i,e);if(e.fixtures)for(var n=e.fixtures.length-1;n>=0;n--){var r=s(gt,e.fixtures[n],o);o._addFixture(r)}return o},t.prototype.isWorldLocked=function(){return!(!this.m_world||!this.m_world.isLocked())},t.prototype.getWorld=function(){return this.m_world},t.prototype.getNext=function(){return this.m_next},t.prototype.setUserData=function(t){this.m_userData=t},t.prototype.getUserData=function(){return this.m_userData},t.prototype.getFixtureList=function(){return this.m_fixtureList},t.prototype.getJointList=function(){return this.m_jointList},t.prototype.getContactList=function(){return this.m_contactList},t.prototype.isStatic=function(){return this.m_type==bt},t.prototype.isDynamic=function(){return this.m_type==Bt},t.prototype.isKinematic=function(){return this.m_type==At},t.prototype.setStatic=function(){return this.setType(bt),this},t.prototype.setDynamic=function(){return this.setType(Bt),this},t.prototype.setKinematic=function(){return this.setType(At),this},t.prototype.getType=function(){return this.m_type},t.prototype.setType=function(t){if(1!=this.isWorldLocked()&&this.m_type!=t){this.m_type=t,this.resetMassData(),this.m_type==bt&&(this.m_linearVelocity.setZero(),this.m_angularVelocity=0,this.m_sweep.forward(),this.synchronizeFixtures()),this.setAwake(!0),this.m_force.setZero(),this.m_torque=0;for(var e=this.m_contactList;e;){var i=e;e=e.next,this.m_world.destroyContact(i.contact)}this.m_contactList=null;for(var s=this.m_world.m_broadPhase,o=this.m_fixtureList;o;o=o.m_next)for(var n=o.m_proxyCount,r=0;r0&&this.setAwake(!0),this.m_linearVelocity.setVec2(t))},t.prototype.getAngularVelocity=function(){return this.m_angularVelocity},t.prototype.setAngularVelocity=function(t){this.m_type!=bt&&(t*t>0&&this.setAwake(!0),this.m_angularVelocity=t)},t.prototype.getLinearDamping=function(){return this.m_linearDamping},t.prototype.setLinearDamping=function(t){this.m_linearDamping=t},t.prototype.getAngularDamping=function(){return this.m_angularDamping},t.prototype.setAngularDamping=function(t){this.m_angularDamping=t},t.prototype.getGravityScale=function(){return this.m_gravityScale},t.prototype.setGravityScale=function(t){this.m_gravityScale=t},t.prototype.getMass=function(){return this.m_mass},t.prototype.getInertia=function(){return this.m_I+this.m_mass*ot.dot(this.m_sweep.localCenter,this.m_sweep.localCenter)},t.prototype.getMassData=function(t){t.mass=this.m_mass,t.I=this.getInertia(),t.center.setVec2(this.m_sweep.localCenter)},t.prototype.resetMassData=function(){if(this.m_mass=0,this.m_invMass=0,this.m_I=0,this.m_invI=0,this.m_sweep.localCenter.setZero(),this.isStatic()||this.isKinematic())return this.m_sweep.c0.setVec2(this.m_xf.p),this.m_sweep.c.setVec2(this.m_xf.p),void(this.m_sweep.a0=this.m_sweep.a);for(var t=ot.zero(),e=this.m_fixtureList;e;e=e.m_next)if(0!=e.m_density){var i=new Vt;e.getMassData(i),this.m_mass+=i.mass,t.addMul(i.mass,i.center),this.m_I+=i.I}this.m_mass>0?(this.m_invMass=1/this.m_mass,t.mul(this.m_invMass)):(this.m_mass=1,this.m_invMass=1),this.m_I>0&&0==this.m_fixedRotationFlag?(this.m_I-=this.m_mass*ot.dot(t,t),this.m_invI=1/this.m_I):(this.m_I=0,this.m_invI=0);var s=ot.clone(this.m_sweep.c);this.m_sweep.setLocalCenter(t,this.m_xf),this.m_linearVelocity.add(ot.crossNumVec2(this.m_angularVelocity,ot.sub(this.m_sweep.c,s)))},t.prototype.setMassData=function(t){if(1!=this.isWorldLocked()&&this.m_type==Bt){this.m_invMass=0,this.m_I=0,this.m_invI=0,this.m_mass=t.mass,this.m_mass<=0&&(this.m_mass=1),this.m_invMass=1/this.m_mass,t.I>0&&0==this.m_fixedRotationFlag&&(this.m_I=t.I-this.m_mass*ot.dot(t.center,t.center),this.m_invI=1/this.m_I);var e=ot.clone(this.m_sweep.c);this.m_sweep.setLocalCenter(t.center,this.m_xf),this.m_linearVelocity.add(ot.crossNumVec2(this.m_angularVelocity,ot.sub(this.m_sweep.c,e)))}},t.prototype.applyForce=function(t,e,i){void 0===i&&(i=!0),this.m_type==Bt&&(i&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&(this.m_force.add(t),this.m_torque+=ot.crossVec2Vec2(ot.sub(e,this.m_sweep.c),t)))},t.prototype.applyForceToCenter=function(t,e){void 0===e&&(e=!0),this.m_type==Bt&&(e&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&this.m_force.add(t))},t.prototype.applyTorque=function(t,e){void 0===e&&(e=!0),this.m_type==Bt&&(e&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&(this.m_torque+=t))},t.prototype.applyLinearImpulse=function(t,e,i){void 0===i&&(i=!0),this.m_type==Bt&&(i&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&(this.m_linearVelocity.addMul(this.m_invMass,t),this.m_angularVelocity+=this.m_invI*ot.crossVec2Vec2(ot.sub(e,this.m_sweep.c),t)))},t.prototype.applyAngularImpulse=function(t,e){void 0===e&&(e=!0),this.m_type==Bt&&(e&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&(this.m_angularVelocity+=this.m_invI*t))},t.prototype.shouldCollide=function(t){if(this.m_type!=Bt&&t.m_type!=Bt)return!1;for(var e=this.m_jointList;e;e=e.next)if(e.other==t&&0==e.joint.m_collideConnected)return!1;return!0},t.prototype._addFixture=function(t){if(1==this.isWorldLocked())return null;if(this.m_activeFlag){var e=this.m_world.m_broadPhase;t.createProxies(e,this.m_xf)}return t.m_next=this.m_fixtureList,this.m_fixtureList=t,t.m_density>0&&this.resetMassData(),this.m_world.m_newFixture=!0,t},t.prototype.createFixture=function(t,e){if(1==this.isWorldLocked())return null;var i=new gt(this,t,e);return this._addFixture(i),i},t.prototype.destroyFixture=function(t){if(1!=this.isWorldLocked()){if(this.m_fixtureList===t)this.m_fixtureList=t.m_next;else for(var e=this.m_fixtureList;null!=e;){if(e.m_next===t){e.m_next=t.m_next;break}e=e.m_next}for(var i=this.m_contactList;i;){var s=i.contact;i=i.next;var o=s.getFixtureA(),n=s.getFixtureB();t!=o&&t!=n||this.m_world.destroyContact(s)}if(this.m_activeFlag){var r=this.m_world.m_broadPhase;t.destroyProxies(r)}t.m_body=null,t.m_next=null,this.m_world.publish("remove-fixture",t),this.resetMassData()}},t.prototype.getWorldPoint=function(t){return ut.mulVec2(this.m_xf,t)},t.prototype.getWorldVector=function(t){return lt.mulVec2(this.m_xf.q,t)},t.prototype.getLocalPoint=function(t){return ut.mulTVec2(this.m_xf,t)},t.prototype.getLocalVector=function(t){return lt.mulTVec2(this.m_xf.q,t)},t.STATIC="static",t.KINEMATIC="kinematic",t.DYNAMIC="dynamic",t}(),Mt=function(){this.other=null,this.joint=null,this.prev=null,this.next=null},St=function(){function t(t,e,i){this.m_type="unknown-joint",this.m_prev=null,this.m_next=null,this.m_edgeA=new Mt,this.m_edgeB=new Mt,this.m_islandFlag=!1,e="bodyA"in t?t.bodyA:e,i="bodyB"in t?t.bodyB:i,this.m_bodyA=e,this.m_bodyB=i,this.m_collideConnected=!!t.collideConnected,this.m_userData=t.userData}return t.prototype.isActive=function(){return this.m_bodyA.isActive()&&this.m_bodyB.isActive()},t.prototype.getType=function(){return this.m_type},t.prototype.getBodyA=function(){return this.m_bodyA},t.prototype.getBodyB=function(){return this.m_bodyB},t.prototype.getNext=function(){return this.m_next},t.prototype.getUserData=function(){return this.m_userData},t.prototype.setUserData=function(t){this.m_userData=t},t.prototype.getCollideConnected=function(){return this.m_collideConnected},t.prototype.shiftOrigin=function(t){},t}(),It={gjkCalls:0,gjkIters:0,gjkMaxIters:0,toiTime:0,toiMaxTime:0,toiCalls:0,toiIters:0,toiMaxIters:0,toiRootIters:0,toiMaxRootIters:0,toString:function(t){t="string"==typeof t?t:"\n";var e="";for(var i in this)"function"!=typeof this[i]&&"object"!=typeof this[i]&&(e+=i+": "+this[i]+t);return e}},Pt=function(){return Date.now()},Tt=function(t){return Date.now()-t};It.gjkCalls=0,It.gjkIters=0,It.gjkMaxIters=0;var zt=function(){this.proxyA=new qt,this.proxyB=new qt,this.transformA=null,this.transformB=null,this.useRadii=!1},kt=function(){this.pointA=ot.zero(),this.pointB=ot.zero()},Ft=function(){this.metric=0,this.indexA=[],this.indexB=[],this.count=0},Lt=function(t,e,i){++It.gjkCalls;var s=i.proxyA,o=i.proxyB,n=i.transformA,r=i.transformB,a=new jt;a.readCache(e,s,n,o,r);for(var h=a.m_v,c=rt.maxDistnceIterations,m=[],_=[],l=0,u=0;uv+x&&t.distance>st.EPSILON){t.distance-=v+x;var g=ot.sub(t.pointB,t.pointA);g.normalize(),t.pointA.addMul(v,g),t.pointB.subMul(x,g)}else{var b=ot.mid(t.pointA,t.pointB);t.pointA.setVec2(b),t.pointB.setVec2(b),t.distance=0}}},qt=function(){function t(){this.m_buffer=[],this.m_vertices=[],this.m_count=0,this.m_radius=0}return t.prototype.getVertexCount=function(){return this.m_count},t.prototype.getVertex=function(t){return this.m_vertices[t]},t.prototype.getSupport=function(t){for(var e=0,i=ot.dot(this.m_vertices[0],t),s=0;si&&(e=s,i=o)}return e},t.prototype.getSupportVertex=function(t){return this.m_vertices[this.getSupport(t)]},t.prototype.set=function(t,e){t.computeDistanceProxy(this,e)},t}(),Nt=function(){function t(){this.wA=ot.zero(),this.wB=ot.zero(),this.w=ot.zero()}return t.prototype.set=function(t){this.indexA=t.indexA,this.indexB=t.indexB,this.wA=ot.clone(t.wA),this.wB=ot.clone(t.wB),this.w=ot.clone(t.w),this.a=t.a},t}(),jt=function(){function t(){this.m_v1=new Nt,this.m_v2=new Nt,this.m_v3=new Nt,this.m_v=[this.m_v1,this.m_v2,this.m_v3],this.m_count}return t.prototype.toString=function(){return 3===this.m_count?["+"+this.m_count,this.m_v1.a,this.m_v1.wA.x,this.m_v1.wA.y,this.m_v1.wB.x,this.m_v1.wB.y,this.m_v2.a,this.m_v2.wA.x,this.m_v2.wA.y,this.m_v2.wB.x,this.m_v2.wB.y,this.m_v3.a,this.m_v3.wA.x,this.m_v3.wA.y,this.m_v3.wB.x,this.m_v3.wB.y].toString():2===this.m_count?["+"+this.m_count,this.m_v1.a,this.m_v1.wA.x,this.m_v1.wA.y,this.m_v1.wB.x,this.m_v1.wB.y,this.m_v2.a,this.m_v2.wA.x,this.m_v2.wA.y,this.m_v2.wB.x,this.m_v2.wB.y].toString():1===this.m_count?["+"+this.m_count,this.m_v1.a,this.m_v1.wA.x,this.m_v1.wA.y,this.m_v1.wB.x,this.m_v1.wB.y].toString():"+"+this.m_count},t.prototype.readCache=function(t,e,i,s,o){this.m_count=t.count;for(var n=0;n1){var h=t.metric,c=this.getMetric();(c<.5*h||2*h0?ot.crossNumVec2(1,t):ot.crossVec2Num(t,1);default:return ot.zero()}},t.prototype.getClosestPoint=function(){switch(this.m_count){case 0:return ot.zero();case 1:return ot.clone(this.m_v1.w);case 2:return ot.combine(this.m_v1.a,this.m_v1.w,this.m_v2.a,this.m_v2.w);case 3:default:return ot.zero()}},t.prototype.getWitnessPoints=function(t,e){switch(this.m_count){case 0:break;case 1:t.setVec2(this.m_v1.wA),e.setVec2(this.m_v1.wB);break;case 2:t.setCombine(this.m_v1.a,this.m_v1.wA,this.m_v2.a,this.m_v2.wA),e.setCombine(this.m_v1.a,this.m_v1.wB,this.m_v2.a,this.m_v2.wB);break;case 3:t.setCombine(this.m_v1.a,this.m_v1.wA,this.m_v2.a,this.m_v2.wA),t.addMul(this.m_v3.a,this.m_v3.wA),e.setVec2(t)}},t.prototype.getMetric=function(){switch(this.m_count){case 0:case 1:return 0;case 2:return ot.distance(this.m_v1.w,this.m_v2.w);case 3:return ot.crossVec2Vec2(ot.sub(this.m_v2.w,this.m_v1.w),ot.sub(this.m_v3.w,this.m_v1.w));default:return 0}},t.prototype.solve=function(){switch(this.m_count){case 1:break;case 2:this.solve2();break;case 3:this.solve3()}},t.prototype.solve2=function(){var t=this.m_v1.w,e=this.m_v2.w,i=ot.sub(e,t),s=-ot.dot(t,i);if(s<=0)return this.m_v1.a=1,void(this.m_count=1);var o=ot.dot(e,i);if(o<=0)return this.m_v2.a=1,this.m_count=1,void this.m_v1.set(this.m_v2);var n=1/(o+s);this.m_v1.a=o*n,this.m_v2.a=s*n,this.m_count=2},t.prototype.solve3=function(){var t=this.m_v1.w,e=this.m_v2.w,i=this.m_v3.w,s=ot.sub(e,t),o=ot.dot(t,s),n=ot.dot(e,s),r=-o,a=ot.sub(i,t),h=ot.dot(t,a),c=ot.dot(i,a),m=-h,_=ot.sub(i,e),l=ot.dot(e,_),u=ot.dot(i,_),p=-l,d=ot.crossVec2Vec2(s,a),y=d*ot.crossVec2Vec2(e,i),f=d*ot.crossVec2Vec2(i,t),v=d*ot.crossVec2Vec2(t,e);if(r<=0&&m<=0)return this.m_v1.a=1,void(this.m_count=1);if(n>0&&r>0&&v<=0){var x=1/(n+r);return this.m_v1.a=n*x,this.m_v2.a=r*x,void(this.m_count=2)}if(c>0&&m>0&&f<=0){var g=1/(c+m);return this.m_v1.a=c*g,this.m_v3.a=m*g,this.m_count=2,void this.m_v2.set(this.m_v3)}if(n<=0&&p<=0)return this.m_v2.a=1,this.m_count=1,void this.m_v1.set(this.m_v2);if(c<=0&&u<=0)return this.m_v3.a=1,this.m_count=1,void this.m_v1.set(this.m_v3);if(u>0&&p>0&&y<=0){var b=1/(u+p);return this.m_v2.a=u*b,this.m_v3.a=p*b,this.m_count=2,void this.m_v1.set(this.m_v3)}var A=1/(y+f+v);this.m_v1.a=y*A,this.m_v2.a=f*A,this.m_v3.a=v*A,this.m_count=3},t}(),Dt=function(t,e,i,s,o,n){var r=new zt;r.proxyA.set(t,e),r.proxyB.set(i,s),r.transformA=o,r.transformB=n,r.useRadii=!0;var a=new Ft,h=new kt;return Lt(h,a,r),h.distance<10*st.EPSILON};Lt.testOverlap=Dt,Lt.Input=zt,Lt.Output=kt,Lt.Proxy=qt,Lt.Cache=Ft;var Et,Rt=function(){this.proxyA=new qt,this.proxyB=new qt,this.sweepA=new pt,this.sweepB=new pt};t.TOIOutputState=void 0,(Et=t.TOIOutputState||(t.TOIOutputState={}))[Et.e_unknown=0]="e_unknown",Et[Et.e_failed=1]="e_failed",Et[Et.e_overlapped=2]="e_overlapped",Et[Et.e_touching=3]="e_touching",Et[Et.e_separated=4]="e_separated";var Ot=function(){};It.toiTime=0,It.toiMaxTime=0,It.toiCalls=0,It.toiIters=0,It.toiMaxIters=0,It.toiRootIters=0,It.toiMaxRootIters=0;var Yt,Wt=function(e,i){var s=Pt();++It.toiCalls,e.state=t.TOIOutputState.e_unknown,e.t=i.tMax;var o=i.proxyA,n=i.proxyB,r=i.sweepA,a=i.sweepB;r.normalize(),a.normalize();var h=i.tMax,c=o.m_radius+n.m_radius,m=st.max(rt.linearSlop,c-3*rt.linearSlop),_=.25*rt.linearSlop,l=0,u=rt.maxTOIIterations,p=0,d=new Ft,y=new zt;for(y.proxyA=i.proxyA,y.proxyB=i.proxyB,y.useRadii=!1;;){var f=ut.identity(),v=ut.identity();r.getTransform(f,l),a.getTransform(v,l),y.transformA=f,y.transformB=v;var x=new kt;if(Lt(x,d,y),x.distance<=0){e.state=t.TOIOutputState.e_overlapped,e.t=0;break}if(x.distancem+_){e.state=t.TOIOutputState.e_separated,e.t=h,b=!0;break}if(w>m-_){l=A;break}var V=g.evaluate(l);if(Vm?(M=I,V=P):(S=I,w=P),50===C)break}if(It.toiMaxRootIters=st.max(It.toiMaxRootIters,C),++B===rt.maxPolygonVertices)break}if(++p,++It.toiIters,b)break;if(p===u){e.state=t.TOIOutputState.e_failed,e.t=l;break}}It.toiMaxIters=st.max(It.toiMaxIters,p);var T=Tt(s);It.toiMaxTime=st.max(It.toiMaxTime,T),It.toiTime+=T};!function(t){t[t.e_points=1]="e_points",t[t.e_faceA=2]="e_faceA",t[t.e_faceB=3]="e_faceB"}(Yt||(Yt={}));var Jt=function(){function t(){this.m_proxyA=new qt,this.m_proxyB=new qt,this.m_localPoint=ot.zero(),this.m_axis=ot.zero()}return t.prototype.initialize=function(t,e,i,s,o,n){this.m_proxyA=e,this.m_proxyB=s;var r=t.count;this.m_sweepA=i,this.m_sweepB=o;var a=ut.identity(),h=ut.identity();if(this.m_sweepA.getTransform(a,n),this.m_sweepB.getTransform(h,n),1===r){this.m_type=Yt.e_points;var c=this.m_proxyA.getVertex(t.indexA[0]),m=this.m_proxyB.getVertex(t.indexB[0]),_=ut.mulVec2(a,c),l=ut.mulVec2(h,m);return this.m_axis.setCombine(1,l,-1,_),v=this.m_axis.normalize()}if(t.indexA[0]===t.indexA[1]){this.m_type=Yt.e_faceB;var u=s.getVertex(t.indexB[0]),p=s.getVertex(t.indexB[1]);this.m_axis=ot.crossVec2Num(ot.sub(p,u),1),this.m_axis.normalize();var d=lt.mulVec2(h.q,this.m_axis);this.m_localPoint=ot.mid(u,p);l=ut.mulVec2(h,this.m_localPoint),c=e.getVertex(t.indexA[0]),_=ut.mulVec2(a,c);return(v=ot.dot(_,d)-ot.dot(l,d))<0&&(this.m_axis=ot.neg(this.m_axis),v=-v),v}this.m_type=Yt.e_faceA;var y=this.m_proxyA.getVertex(t.indexA[0]),f=this.m_proxyA.getVertex(t.indexA[1]);this.m_axis=ot.crossVec2Num(ot.sub(f,y),1),this.m_axis.normalize();d=lt.mulVec2(a.q,this.m_axis);this.m_localPoint=ot.mid(y,f);var v;_=ut.mulVec2(a,this.m_localPoint),m=this.m_proxyB.getVertex(t.indexB[0]),l=ut.mulVec2(h,m);return(v=ot.dot(l,d)-ot.dot(_,d))<0&&(this.m_axis=ot.neg(this.m_axis),v=-v),v},t.prototype.compute=function(t,e){var i=ut.identity(),s=ut.identity();switch(this.m_sweepA.getTransform(i,e),this.m_sweepB.getTransform(s,e),this.m_type){case Yt.e_points:if(t){var o=lt.mulTVec2(i.q,this.m_axis),n=lt.mulTVec2(s.q,ot.neg(this.m_axis));this.indexA=this.m_proxyA.getSupport(o),this.indexB=this.m_proxyB.getSupport(n)}var r=this.m_proxyA.getVertex(this.indexA),a=this.m_proxyB.getVertex(this.indexB),h=ut.mulVec2(i,r),c=ut.mulVec2(s,a);return ot.dot(c,this.m_axis)-ot.dot(h,this.m_axis);case Yt.e_faceA:var m=lt.mulVec2(i.q,this.m_axis);h=ut.mulVec2(i,this.m_localPoint);if(t){n=lt.mulTVec2(s.q,ot.neg(m));this.indexA=-1,this.indexB=this.m_proxyB.getSupport(n)}a=this.m_proxyB.getVertex(this.indexB),c=ut.mulVec2(s,a);return ot.dot(c,m)-ot.dot(h,m);case Yt.e_faceB:m=lt.mulVec2(s.q,this.m_axis),c=ut.mulVec2(s,this.m_localPoint);if(t){o=lt.mulTVec2(i.q,ot.neg(m));this.indexB=-1,this.indexA=this.m_proxyA.getSupport(o)}r=this.m_proxyA.getVertex(this.indexA),h=ut.mulVec2(i,r);return ot.dot(h,m)-ot.dot(c,m);default:return t&&(this.indexA=-1,this.indexB=-1),0}},t.prototype.findMinSeparation=function(t){return this.compute(!0,t)},t.prototype.evaluate=function(t){return this.compute(!1,t)},t}();new Jt,Wt.Input=Rt,Wt.Output=Ot;var Xt=function(){function t(){this.dt=0,this.inv_dt=0,this.velocityIterations=0,this.positionIterations=0,this.warmStarting=!1,this.blockSolve=!0,this.inv_dt0=0,this.dtRatio=1}return t.prototype.reset=function(t){this.dt>0&&(this.inv_dt0=this.inv_dt),this.dt=t,this.inv_dt=0==t?0:1/t,this.dtRatio=t*this.inv_dt0},t}(),Ht=new Xt,Zt=function(){function t(t){this.contact=t,this.normals=[],this.tangents=[]}return Object.defineProperty(t.prototype,"normalImpulses",{get:function(){var t=this.contact,e=this.normals;e.length=0;for(var i=0;i0;){i=n.pop();if(this.addBody(i),i.setAwake(!0),!i.isStatic()){for(var a=i.m_contactList;a;a=a.next){var h=a.contact;if(!h.m_islandFlag&&(0!=h.isEnabled()&&0!=h.isTouching())){var c=h.m_fixtureA.m_isSensor,m=h.m_fixtureB.m_isSensor;if(!c&&!m)this.addContact(h),h.m_islandFlag=!0,(l=a.other).m_islandFlag||(n.push(l),l.m_islandFlag=!0)}}for(var _=i.m_jointList;_;_=_.next){var l;if(1!=_.joint.m_islandFlag)0!=(l=_.other).isActive()&&(this.addJoint(_.joint),_.joint.m_islandFlag=!0,l.m_islandFlag||(n.push(l),l.m_islandFlag=!0))}}}this.solveIsland(t);for(var u=0;urt.maxTranslationSquared){var u=rt.maxTranslation/l.length();c.mul(u)}var p=o*m;if(p*p>rt.maxRotationSquared)m*=u=rt.maxRotation/st.abs(p);a.addMul(o,c),h+=o*m,r.c_position.c.setVec2(a),r.c_position.a=h,r.c_velocity.v.setVec2(c),r.c_velocity.w=m}var d=!1;for(n=0;n=-3*rt.linearSlop,x=!0;for(_=0;_B||ot.lengthSquared(r.m_linearVelocity)>A?(r.m_sleepTime=0,b=0):(r.m_sleepTime+=o,b=st.min(b,r.m_sleepTime)))}if(b>=rt.timeToSleep&&d)for(n=0;nrt.maxSubSteps)){var a=1;if(o.m_toiFlag)a=o.m_toi;else{var h=o.getFixtureA(),c=o.getFixtureB();if(h.isSensor()||c.isSensor())continue;var m=h.getBody(),_=c.getBody(),l=m.isAwake()&&!m.isStatic(),u=_.isAwake()&&!_.isStatic();if(0==l&&0==u)continue;var p=m.isBullet()||!m.isDynamic(),d=_.isBullet()||!_.isDynamic();if(0==p&&0==d)continue;var y=m.m_sweep.alpha0;m.m_sweep.alpha0<_.m_sweep.alpha0?(y=_.m_sweep.alpha0,m.m_sweep.advance(y)):_.m_sweep.alpha0=-1.5*rt.linearSlop)break}e.m_sweep.c0.setVec2(e.c_position.c),e.m_sweep.a0=e.c_position.a,i.m_sweep.c0.setVec2(i.c_position.c),i.m_sweep.a0=i.c_position.a;for(s=0;srt.maxTranslationSquared){var p=rt.maxTranslation/u.length();_.mul(p)}var d=a*l;if(d*d>rt.maxRotationSquared)l*=p=rt.maxRotation/st.abs(d);c.addMul(a,_),m+=a*l,h.c_position.c=c,h.c_position.a=m,h.c_velocity.v=_,h.c_velocity.w=l,h.m_sweep.c=c,h.m_sweep.a=m,h.m_linearVelocity=_,h.m_angularVelocity=l,h.synchronizeTransform()}this.postSolveIsland()},e.prototype.postSolveIsland=function(){for(var t=0;tst.EPSILON*st.EPSILON&&(r.setVec2(_),r.normalize());var l=c.clone().addMul(s,r),u=m.clone().addMul(-n,r);a[0]=ot.mid(l,u),h[0]=ot.dot(ot.sub(u,l),r),a.length=1,h.length=1;break;case t.ManifoldType.e_faceA:r=lt.mulVec2(i.q,this.localNormal);for(var p=ut.mulVec2(i,this.localPoint),d=0;de?t:e}var _e=[],le=function(){this.rA=ot.zero(),this.rB=ot.zero(),this.normalImpulse=0,this.tangentImpulse=0,this.normalMass=0,this.tangentMass=0,this.velocityBias=0},ue=function(){function e(t,e,i,s,o){this.m_manifold=new ee,this.m_prev=null,this.m_next=null,this.m_toi=1,this.m_toiCount=0,this.m_toiFlag=!1,this.m_tangentSpeed=0,this.m_enabledFlag=!0,this.m_islandFlag=!1,this.m_touchingFlag=!1,this.m_filterFlag=!1,this.m_bulletHitFlag=!1,this.m_impulse=new Zt(this),this.v_points=[],this.v_normal=ot.zero(),this.v_normalMass=new $t,this.v_K=new $t,this.p_localPoints=[],this.p_localNormal=ot.zero(),this.p_localPoint=ot.zero(),this.p_localCenterA=ot.zero(),this.p_localCenterB=ot.zero(),this.m_nodeA=new he(this),this.m_nodeB=new he(this),this.m_fixtureA=t,this.m_fixtureB=i,this.m_indexA=e,this.m_indexB=s,this.m_evaluateFcn=o,this.m_friction=ce(this.m_fixtureA.m_friction,this.m_fixtureB.m_friction),this.m_restitution=me(this.m_fixtureA.m_restitution,this.m_fixtureB.m_restitution)}return e.prototype.initConstraint=function(t){var e=this.m_fixtureA,i=this.m_fixtureB,s=e.getShape(),o=i.getShape(),n=e.getBody(),r=i.getBody(),a=this.getManifold(),h=a.pointCount;this.v_invMassA=n.m_invMass,this.v_invMassB=r.m_invMass,this.v_invIA=n.m_invI,this.v_invIB=r.m_invI,this.v_friction=this.m_friction,this.v_restitution=this.m_restitution,this.v_tangentSpeed=this.m_tangentSpeed,this.v_pointCount=h,this.v_K.setZero(),this.v_normalMass.setZero(),this.p_invMassA=n.m_invMass,this.p_invMassB=r.m_invMass,this.p_invIA=n.m_invI,this.p_invIB=r.m_invI,this.p_localCenterA=ot.clone(n.m_sweep.localCenter),this.p_localCenterB=ot.clone(r.m_sweep.localCenter),this.p_radiusA=s.m_radius,this.p_radiusB=o.m_radius,this.p_type=a.type,this.p_localNormal=ot.clone(a.localNormal),this.p_localPoint=ot.clone(a.localPoint),this.p_pointCount=h;for(var c=0;c0;for(var u=0;u0?-N/E:0,O=ot.mulNumVec2(R,V);f.subMul(u,O),v-=p*ot.crossVec2Vec2(z,O),x.addMul(d,O),g+=y*ot.crossVec2Vec2(k,O)}return c.c.setVec2(f),c.a=v,m.c.setVec2(x),m.a=g,b},e.prototype.initVelocityConstraint=function(t){var e=this.m_fixtureA,i=this.m_fixtureB,s=e.getBody(),o=i.getBody(),n=s.c_velocity,r=o.c_velocity,a=s.c_position,h=o.c_position,c=this.p_radiusA,m=this.p_radiusB,_=this.getManifold(),l=this.v_invMassA,u=this.v_invMassB,p=this.v_invIA,d=this.v_invIB,y=ot.clone(this.p_localCenterA),f=ot.clone(this.p_localCenterB),v=ot.clone(a.c),x=a.a,g=ot.clone(n.v),b=n.w,A=ot.clone(h.c),B=h.a,w=ot.clone(r.v),V=r.w,C=ut.identity(),M=ut.identity();C.q.setAngle(x),M.q.setAngle(B),C.p.setCombine(1,v,-1,lt.mulVec2(C.q,y)),M.p.setCombine(1,A,-1,lt.mulVec2(M.q,f));var S=_.getWorldManifold(null,C,c,M,m);this.v_normal.setVec2(S.normal);for(var I=0;I0?1/k:0;var F=ot.crossVec2Num(this.v_normal,1),L=ot.crossVec2Vec2(P.rA,F),q=ot.crossVec2Vec2(P.rB,F),N=l+u+p*L*L+d*q*q;P.tangentMass=N>0?1/N:0,P.velocityBias=0;var j=ot.dot(this.v_normal,w)+ot.dot(this.v_normal,ot.crossNumVec2(V,P.rB))-ot.dot(this.v_normal,g)-ot.dot(this.v_normal,ot.crossNumVec2(b,P.rA));j<-rt.velocityThreshold&&(P.velocityBias=-this.v_restitution*j)}if(2==this.v_pointCount&&t.blockSolve){var D=this.v_points[0],E=this.v_points[1],R=ot.crossVec2Vec2(D.rA,this.v_normal),O=ot.crossVec2Vec2(D.rB,this.v_normal),Y=ot.crossVec2Vec2(E.rA,this.v_normal),W=ot.crossVec2Vec2(E.rB,this.v_normal),J=l+u+p*R*R+d*O*O,X=l+u+p*Y*Y+d*W*W,H=l+u+p*R*Y+d*O*W;J*J<1e3*(J*X-H*H)?(this.v_K.ex.setNum(J,H),this.v_K.ey.setNum(H,X),this.v_normalMass.set(this.v_K.getInverse())):this.v_pointCount=1}a.c.setVec2(v),a.a=x,n.v.setVec2(g),n.w=b,h.c.setVec2(A),h.a=B,r.v.setVec2(w),r.w=V},e.prototype.warmStartConstraint=function(t){var e=this.m_fixtureA,i=this.m_fixtureB,s=e.getBody(),o=i.getBody(),n=s.c_velocity,r=o.c_velocity;s.c_position,o.c_position;for(var a=this.v_invMassA,h=this.v_invIA,c=this.v_invMassB,m=this.v_invIB,_=ot.clone(n.v),l=n.w,u=ot.clone(r.v),p=r.w,d=this.v_normal,y=ot.crossVec2Num(d,1),f=0;f=0&&F.y>=0){var L=ot.sub(F,S),q=ot.mulNumVec2(L.x,u),N=ot.mulNumVec2(L.y,u);c.subCombine(n,q,n,N),m-=r*(ot.crossVec2Vec2(C.rA,q)+ot.crossVec2Vec2(M.rA,N)),_.addCombine(a,q,a,N),l+=h*(ot.crossVec2Vec2(C.rB,q)+ot.crossVec2Vec2(M.rB,N)),C.normalImpulse=F.x,M.normalImpulse=F.y;break}if(F.x=-C.normalMass*k.x,F.y=0,T=0,z=this.v_K.ex.y*F.x+k.y,F.x>=0&&z>=0){L=ot.sub(F,S),q=ot.mulNumVec2(L.x,u),N=ot.mulNumVec2(L.y,u);c.subCombine(n,q,n,N),m-=r*(ot.crossVec2Vec2(C.rA,q)+ot.crossVec2Vec2(M.rA,N)),_.addCombine(a,q,a,N),l+=h*(ot.crossVec2Vec2(C.rB,q)+ot.crossVec2Vec2(M.rB,N)),C.normalImpulse=F.x,M.normalImpulse=F.y;break}if(F.x=0,F.y=-M.normalMass*k.y,T=this.v_K.ey.x*F.y+k.x,z=0,F.y>=0&&T>=0){L=ot.sub(F,S),q=ot.mulNumVec2(L.x,u),N=ot.mulNumVec2(L.y,u);c.subCombine(n,q,n,N),m-=r*(ot.crossVec2Vec2(C.rA,q)+ot.crossVec2Vec2(M.rA,N)),_.addCombine(a,q,a,N),l+=h*(ot.crossVec2Vec2(C.rB,q)+ot.crossVec2Vec2(M.rB,N)),C.normalImpulse=F.x,M.normalImpulse=F.y;break}if(F.x=0,F.y=0,T=k.x,z=k.y,T>=0&&z>=0){L=ot.sub(F,S),q=ot.mulNumVec2(L.x,u),N=ot.mulNumVec2(L.y,u);c.subCombine(n,q,n,N),m-=r*(ot.crossVec2Vec2(C.rA,q)+ot.crossVec2Vec2(M.rA,N)),_.addCombine(a,q,a,N),l+=h*(ot.crossVec2Vec2(C.rB,q)+ot.crossVec2Vec2(M.rB,N)),C.normalImpulse=F.x,M.normalImpulse=F.y;break}break}}s.v.setVec2(c),s.w=m,o.v.setVec2(_),o.w=l},e.addType=function(t,e,i){_e[t]=_e[t]||{},_e[t][e]=i},e.create=function(t,i,s,o){var n,r,a=t.getType(),h=s.getType();if(r=_e[a]&&_e[a][h])n=new e(t,i,s,o,r);else{if(!(r=_e[h]&&_e[h][a]))return null;n=new e(s,o,t,i,r)}t=n.getFixtureA(),s=n.getFixtureB(),i=n.getChildIndexA(),o=n.getChildIndexB();var c=t.getBody(),m=s.getBody();return n.m_nodeA.contact=n,n.m_nodeA.other=m,n.m_nodeA.prev=null,n.m_nodeA.next=c.m_contactList,null!=c.m_contactList&&(c.m_contactList.prev=n.m_nodeA),c.m_contactList=n.m_nodeA,n.m_nodeB.contact=n,n.m_nodeB.other=c,n.m_nodeB.prev=null,n.m_nodeB.next=m.m_contactList,null!=m.m_contactList&&(m.m_contactList.prev=n.m_nodeB),m.m_contactList=n.m_nodeB,0==t.isSensor()&&0==s.isSensor()&&(c.setAwake(!0),m.setAwake(!0)),n},e.destroy=function(t,e){var i=t.m_fixtureA,s=t.m_fixtureB,o=i.getBody(),n=s.getBody();t.isTouching()&&e.endContact(t),t.m_nodeA.prev&&(t.m_nodeA.prev.next=t.m_nodeA.next),t.m_nodeA.next&&(t.m_nodeA.next.prev=t.m_nodeA.prev),t.m_nodeA==o.m_contactList&&(o.m_contactList=t.m_nodeA.next),t.m_nodeB.prev&&(t.m_nodeB.prev.next=t.m_nodeB.next),t.m_nodeB.next&&(t.m_nodeB.next.prev=t.m_nodeB.prev),t.m_nodeB==n.m_contactList&&(n.m_contactList=t.m_nodeB.next),t.m_manifold.pointCount>0&&0==i.isSensor()&&0==s.isSensor()&&(o.setAwake(!0),n.setAwake(!0)),i.getType(),s.getType()},e}(),pe={gravity:ot.zero(),allowSleep:!0,warmStarting:!0,continuousPhysics:!0,subStepping:!1,blockSolve:!0,velocityIterations:8,positionIterations:3},de=function(){function t(e){if(!(this instanceof t))return new t(e);this.s_step=new Xt,e&&ot.isValid(e)&&(e={gravity:e}),e=it(e,pe),this.m_solver=new Kt(this),this.m_broadPhase=new _t,this.m_contactList=null,this.m_contactCount=0,this.m_bodyList=null,this.m_bodyCount=0,this.m_jointList=null,this.m_jointCount=0,this.m_stepComplete=!0,this.m_allowSleep=e.allowSleep,this.m_gravity=ot.clone(e.gravity),this.m_clearForces=!0,this.m_newFixture=!1,this.m_locked=!1,this.m_warmStarting=e.warmStarting,this.m_continuousPhysics=e.continuousPhysics,this.m_subStepping=e.subStepping,this.m_blockSolve=e.blockSolve,this.m_velocityIterations=e.velocityIterations,this.m_positionIterations=e.positionIterations,this.m_t=0}return t.prototype._serialize=function(){for(var t=[],e=[],i=this.getBodyList();i;i=i.getNext())t.push(i);for(var s=this.getJointList();s;s=s.getNext())"function"==typeof s._serialize&&e.push(s);return{gravity:this.m_gravity,bodies:t,joints:e}},t._deserialize=function(e,i,s){if(!e)return new t;var o=new t(e.gravity);if(e.bodies)for(var n=e.bodies.length-1;n>=0;n-=1)o._addBody(s(Ct,e.bodies[n],o));if(e.joints)for(n=e.joints.length-1;n>=0;n--)o.createJoint(s(St,e.joints[n],o));return o},t.prototype.getBodyList=function(){return this.m_bodyList},t.prototype.getJointList=function(){return this.m_jointList},t.prototype.getContactList=function(){return this.m_contactList},t.prototype.getBodyCount=function(){return this.m_bodyCount},t.prototype.getJointCount=function(){return this.m_jointCount},t.prototype.getContactCount=function(){return this.m_contactCount},t.prototype.setGravity=function(t){this.m_gravity=t},t.prototype.getGravity=function(){return this.m_gravity},t.prototype.isLocked=function(){return this.m_locked},t.prototype.setAllowSleeping=function(t){if(t!=this.m_allowSleep&&(this.m_allowSleep=t,0==this.m_allowSleep))for(var e=this.m_bodyList;e;e=e.m_next)e.setAwake(!0)},t.prototype.getAllowSleeping=function(){return this.m_allowSleep},t.prototype.setWarmStarting=function(t){this.m_warmStarting=t},t.prototype.getWarmStarting=function(){return this.m_warmStarting},t.prototype.setContinuousPhysics=function(t){this.m_continuousPhysics=t},t.prototype.getContinuousPhysics=function(){return this.m_continuousPhysics},t.prototype.setSubStepping=function(t){this.m_subStepping=t},t.prototype.getSubStepping=function(){return this.m_subStepping},t.prototype.setAutoClearForces=function(t){this.m_clearForces=t},t.prototype.getAutoClearForces=function(){return this.m_clearForces},t.prototype.clearForces=function(){for(var t=this.m_bodyList;t;t=t.getNext())t.m_force.setZero(),t.m_torque=0},t.prototype.queryAABB=function(t,e){var i=this.m_broadPhase;this.m_broadPhase.query(t,(function(t){var s=i.getUserData(t);return e(s.fixture)}))},t.prototype.rayCast=function(t,e,i){var s=this.m_broadPhase;this.m_broadPhase.rayCast({maxFraction:1,p1:t,p2:e},(function(t,e){var o=s.getUserData(e),n=o.fixture,r=o.childIndex,a={};if(n.rayCast(a,t,r)){var h=a.fraction,c=ot.add(ot.mulNumVec2(1-h,t.p1),ot.mulNumVec2(h,t.p2));return i(n,c,a.normal,h)}return t.maxFraction}))},t.prototype.getProxyCount=function(){return this.m_broadPhase.getProxyCount()},t.prototype.getTreeHeight=function(){return this.m_broadPhase.getTreeHeight()},t.prototype.getTreeBalance=function(){return this.m_broadPhase.getTreeBalance()},t.prototype.getTreeQuality=function(){return this.m_broadPhase.getTreeQuality()},t.prototype.shiftOrigin=function(t){if(!this.m_locked){for(var e=this.m_bodyList;e;e=e.m_next)e.m_xf.p.sub(t),e.m_sweep.c0.sub(t),e.m_sweep.c.sub(t);for(var i=this.m_jointList;i;i=i.m_next)i.shiftOrigin(t);this.m_broadPhase.shiftOrigin(t)}},t.prototype._addBody=function(t){this.isLocked()||(t.m_prev=null,t.m_next=this.m_bodyList,this.m_bodyList&&(this.m_bodyList.m_prev=t),this.m_bodyList=t,++this.m_bodyCount)},t.prototype.createBody=function(t,e){if(this.isLocked())return null;var i={};t&&(ot.isValid(t)?i={position:t,angle:e}:"object"==typeof t&&(i=t));var s=new Ct(this,i);return this._addBody(s),s},t.prototype.createDynamicBody=function(t,e){var i={};return t&&(ot.isValid(t)?i={position:t,angle:e}:"object"==typeof t&&(i=t)),i.type="dynamic",this.createBody(i)},t.prototype.createKinematicBody=function(t,e){var i={};return t&&(ot.isValid(t)?i={position:t,angle:e}:"object"==typeof t&&(i=t)),i.type="kinematic",this.createBody(i)},t.prototype.destroyBody=function(t){if(!this.isLocked()){if(t.m_destroyed)return!1;for(var e=t.m_jointList;e;){var i=e;e=e.next,this.publish("remove-joint",i.joint),this.destroyJoint(i.joint),t.m_jointList=e}t.m_jointList=null;for(var s=t.m_contactList;s;){var o=s;s=s.next,this.destroyContact(o.contact),t.m_contactList=s}t.m_contactList=null;for(var n=t.m_fixtureList;n;){var r=n;n=n.m_next,this.publish("remove-fixture",r),r.destroyProxies(this.m_broadPhase),t.m_fixtureList=n}return t.m_fixtureList=null,t.m_prev&&(t.m_prev.m_next=t.m_next),t.m_next&&(t.m_next.m_prev=t.m_prev),t==this.m_bodyList&&(this.m_bodyList=t.m_next),t.m_destroyed=!0,--this.m_bodyCount,this.publish("remove-body",t),!0}},t.prototype.createJoint=function(t){if(this.isLocked())return null;if(t.m_prev=null,t.m_next=this.m_jointList,this.m_jointList&&(this.m_jointList.m_prev=t),this.m_jointList=t,++this.m_jointCount,t.m_edgeA.joint=t,t.m_edgeA.other=t.m_bodyB,t.m_edgeA.prev=null,t.m_edgeA.next=t.m_bodyA.m_jointList,t.m_bodyA.m_jointList&&(t.m_bodyA.m_jointList.prev=t.m_edgeA),t.m_bodyA.m_jointList=t.m_edgeA,t.m_edgeB.joint=t,t.m_edgeB.other=t.m_bodyA,t.m_edgeB.prev=null,t.m_edgeB.next=t.m_bodyB.m_jointList,t.m_bodyB.m_jointList&&(t.m_bodyB.m_jointList.prev=t.m_edgeB),t.m_bodyB.m_jointList=t.m_edgeB,0==t.m_collideConnected)for(var e=t.m_bodyB.getContactList();e;e=e.next)e.other==t.m_bodyA&&e.contact.flagForFiltering();return t},t.prototype.destroyJoint=function(t){if(!this.isLocked()){t.m_prev&&(t.m_prev.m_next=t.m_next),t.m_next&&(t.m_next.m_prev=t.m_prev),t==this.m_jointList&&(this.m_jointList=t.m_next);var e=t.m_bodyA,i=t.m_bodyB;if(e.setAwake(!0),i.setAwake(!0),t.m_edgeA.prev&&(t.m_edgeA.prev.next=t.m_edgeA.next),t.m_edgeA.next&&(t.m_edgeA.next.prev=t.m_edgeA.prev),t.m_edgeA==e.m_jointList&&(e.m_jointList=t.m_edgeA.next),t.m_edgeA.prev=null,t.m_edgeA.next=null,t.m_edgeB.prev&&(t.m_edgeB.prev.next=t.m_edgeB.next),t.m_edgeB.next&&(t.m_edgeB.next.prev=t.m_edgeB.prev),t.m_edgeB==i.m_jointList&&(i.m_jointList=t.m_edgeB.next),t.m_edgeB.prev=null,t.m_edgeB.next=null,--this.m_jointCount,0==t.m_collideConnected)for(var s=i.getContactList();s;)s.other==e&&s.contact.flagForFiltering(),s=s.next;this.publish("remove-joint",t)}},t.prototype.step=function(t,e,i){if(this.publish("pre-step",t),(0|e)!==e&&(e=0),e=e||this.m_velocityIterations,i=i||this.m_positionIterations,this.m_newFixture&&(this.findNewContacts(),this.m_newFixture=!1),this.m_locked=!0,this.s_step.reset(t),this.s_step.velocityIterations=e,this.s_step.positionIterations=i,this.s_step.warmStarting=this.m_warmStarting,this.s_step.blockSolve=this.m_blockSolve,this.updateContacts(),this.m_stepComplete&&t>0){this.m_solver.solveWorld(this.s_step);for(var s=this.m_bodyList;s;s=s.getNext())0!=s.m_islandFlag&&(s.isStatic()||s.synchronizeFixtures());this.findNewContacts()}this.m_continuousPhysics&&t>0&&this.m_solver.solveWorldTOI(this.s_step),this.m_clearForces&&this.clearForces(),this.m_locked=!1,this.publish("post-step",t)},t.prototype.findNewContacts=function(){var t=this;this.m_broadPhase.updatePairs((function(e,i){return t.createContact(e,i)}))},t.prototype.createContact=function(t,e){var i=t.fixture,s=e.fixture,o=t.childIndex,n=e.childIndex,r=i.getBody(),a=s.getBody();if(r!=a){for(var h=a.getContactList();h;){if(h.other==r){var c=h.contact.getFixtureA(),m=h.contact.getFixtureB(),_=h.contact.getChildIndexA(),l=h.contact.getChildIndexB();if(c==i&&m==s&&_==o&&l==n)return;if(c==s&&m==i&&_==n&&l==o)return}h=h.next}if(0!=a.shouldCollide(r)&&0!=s.shouldCollide(i)){var u=ue.create(i,o,s,n);null!=u&&(u.m_prev=null,null!=this.m_contactList&&(u.m_next=this.m_contactList,this.m_contactList.m_prev=u),this.m_contactList=u,++this.m_contactCount)}}},t.prototype.updateContacts=function(){for(var t,e=this.m_contactList;t=e;){e=t.getNext();var i=t.getFixtureA(),s=t.getFixtureB(),o=t.getChildIndexA(),n=t.getChildIndexB(),r=i.getBody(),a=s.getBody();if(t.m_filterFlag){if(0==a.shouldCollide(r)){this.destroyContact(t);continue}if(0==s.shouldCollide(i)){this.destroyContact(t);continue}t.m_filterFlag=!1}var h=r.isAwake()&&!r.isStatic(),c=a.isAwake()&&!a.isStatic();if(0!=h||0!=c){var m=i.m_proxies[o].proxyId,_=s.m_proxies[n].proxyId;0!=this.m_broadPhase.testOverlap(m,_)?t.update(this):this.destroyContact(t)}}},t.prototype.destroyContact=function(t){ue.destroy(t,this),t.m_prev&&(t.m_prev.m_next=t.m_next),t.m_next&&(t.m_next.m_prev=t.m_prev),t==this.m_contactList&&(this.m_contactList=t.m_next),--this.m_contactCount},t.prototype.on=function(t,e){return"string"!=typeof t||"function"!=typeof e||(this._listeners||(this._listeners={}),this._listeners[t]||(this._listeners[t]=[]),this._listeners[t].push(e)),this},t.prototype.off=function(t,e){if("string"!=typeof t||"function"!=typeof e)return this;var i=this._listeners&&this._listeners[t];if(!i||!i.length)return this;var s=i.indexOf(e);return s>=0&&i.splice(s,1),this},t.prototype.publish=function(t,e,i,s){var o=this._listeners&&this._listeners[t];if(!o||!o.length)return 0;for(var n=0;n0?lt.mulVec2(i.q,m).neg():lt.mulVec2(i.q,m),!0)},e.prototype.computeAABB=function(t,e,i){var s=ut.mulVec2(e,this.m_vertex1),o=ut.mulVec2(e,this.m_vertex2);t.combinePoints(s,o),t.extend(this.m_radius)},e.prototype.computeMass=function(t,e){t.mass=0,t.center.setCombine(.5,this.m_vertex1,.5,this.m_vertex2),t.I=0},e.prototype.computeDistanceProxy=function(t){t.m_vertices.push(this.m_vertex1),t.m_vertices.push(this.m_vertex2),t.m_count=2,t.m_radius=this.m_radius},e.TYPE="edge",e}(ft),ve=fe,xe=function(t){function e(i,s){var o=this;return o instanceof e?((o=t.call(this)||this).m_type=e.TYPE,o.m_radius=rt.polygonRadius,o.m_vertices=[],o.m_count=0,o.m_prevVertex=null,o.m_nextVertex=null,o.m_hasPrevVertex=!1,o.m_hasNextVertex=!1,o.m_isLoop=!!s,i&&i.length&&(s?o._createLoop(i):o._createChain(i)),o):new e(i,s)}return tt(e,t),e.prototype._serialize=function(){var t={type:this.m_type,vertices:this.m_vertices,isLoop:this.m_isLoop,hasPrevVertex:this.m_hasPrevVertex,hasNextVertex:this.m_hasNextVertex,prevVertex:null,nextVertex:null};return this.m_prevVertex&&(t.prevVertex=this.m_prevVertex),this.m_nextVertex&&(t.nextVertex=this.m_nextVertex),t},e._deserialize=function(t,i,s){var o=[];if(t.vertices)for(var n=0;n0?(t.m_vertex0=this.m_vertices[e-1],t.m_hasVertex0=!0):(t.m_vertex0=this.m_prevVertex,t.m_hasVertex0=this.m_hasPrevVertex),eh||c===h&&i[s].yp.lengthSquared()&&(u=r)}else u=r;if(++_,l=u,u===a)break}if(_<3)this._setAsBox(1,1);else{this.m_count=_,this.m_vertices=[];for(s=0;s<_;++s)this.m_vertices[s]=i[m[s]];for(s=0;s<_;++s){var y=s,f=s+1<_?s+1:0,v=ot.sub(this.m_vertices[f],this.m_vertices[y]);this.m_normals[s]=ot.crossVec2Num(v,1),this.m_normals[s].normalize()}this.m_centroid=function(t,e){for(var i=ot.zero(),s=0,o=ot.zero(),n=1/3,r=0;r0)return!1}return!0},e.prototype.rayCast=function(t,e,i,s){for(var o=lt.mulTVec2(i.q,ot.sub(e.p1,i.p)),n=lt.mulTVec2(i.q,ot.sub(e.p2,i.p)),r=ot.sub(n,o),a=0,h=e.maxFraction,c=-1,m=0;m0&&_=0&&(t.fraction=a,t.normal=lt.mulVec2(i.q,this.m_normals[c]),!0)},e.prototype.computeAABB=function(t,e,i){for(var s=1/0,o=1/0,n=-1/0,r=-1/0,a=0;a0?this.m_length=+t.length:t.length<0||(t.anchorA||t.anchorA||t.anchorA||t.anchorA)&&(this.m_length=ot.distance(this.m_bodyA.getWorldPoint(this.m_localAnchorA),this.m_bodyB.getWorldPoint(this.m_localAnchorB)))},e.prototype.getLocalAnchorA=function(){return this.m_localAnchorA},e.prototype.getLocalAnchorB=function(){return this.m_localAnchorB},e.prototype.setLength=function(t){this.m_length=t},e.prototype.getLength=function(){return this.m_length},e.prototype.setFrequency=function(t){this.m_frequencyHz=t},e.prototype.getFrequency=function(){return this.m_frequencyHz},e.prototype.setDampingRatio=function(t){this.m_dampingRatio=t},e.prototype.getDampingRatio=function(){return this.m_dampingRatio},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return ot.mulNumVec2(this.m_impulse,this.m_u).mul(t)},e.prototype.getReactionTorque=function(t){return 0},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,s=this.m_bodyA.c_velocity.v,o=this.m_bodyA.c_velocity.w,n=this.m_bodyB.c_position.c,r=this.m_bodyB.c_position.a,a=this.m_bodyB.c_velocity.v,h=this.m_bodyB.c_velocity.w,c=lt.neo(i),m=lt.neo(r);this.m_rA=lt.mulVec2(c,ot.sub(this.m_localAnchorA,this.m_localCenterA)),this.m_rB=lt.mulVec2(m,ot.sub(this.m_localAnchorB,this.m_localCenterB)),this.m_u=ot.sub(ot.add(n,this.m_rB),ot.add(e,this.m_rA));var _=this.m_u.length();_>rt.linearSlop?this.m_u.mul(1/_):this.m_u.setNum(0,0);var l=ot.crossVec2Vec2(this.m_rA,this.m_u),u=ot.crossVec2Vec2(this.m_rB,this.m_u),p=this.m_invMassA+this.m_invIA*l*l+this.m_invMassB+this.m_invIB*u*u;if(this.m_mass=0!=p?1/p:0,this.m_frequencyHz>0){var d=_-this.m_length,y=2*st.PI*this.m_frequencyHz,f=2*this.m_mass*this.m_dampingRatio*y,v=this.m_mass*y*y,x=t.dt;this.m_gamma=x*(f+x*v),this.m_gamma=0!=this.m_gamma?1/this.m_gamma:0,this.m_bias=d*x*v*this.m_gamma,p+=this.m_gamma,this.m_mass=0!=p?1/p:0}else this.m_gamma=0,this.m_bias=0;if(t.warmStarting){this.m_impulse*=t.dtRatio;var g=ot.mulNumVec2(this.m_impulse,this.m_u);s.subMul(this.m_invMassA,g),o-=this.m_invIA*ot.crossVec2Vec2(this.m_rA,g),a.addMul(this.m_invMassB,g),h+=this.m_invIB*ot.crossVec2Vec2(this.m_rB,g)}else this.m_impulse=0;this.m_bodyA.c_velocity.v.setVec2(s),this.m_bodyA.c_velocity.w=o,this.m_bodyB.c_velocity.v.setVec2(a),this.m_bodyB.c_velocity.w=h},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,s=this.m_bodyB.c_velocity.v,o=this.m_bodyB.c_velocity.w,n=ot.add(e,ot.crossNumVec2(i,this.m_rA)),r=ot.add(s,ot.crossNumVec2(o,this.m_rB)),a=ot.dot(this.m_u,r)-ot.dot(this.m_u,n),h=-this.m_mass*(a+this.m_bias+this.m_gamma*this.m_impulse);this.m_impulse+=h;var c=ot.mulNumVec2(h,this.m_u);e.subMul(this.m_invMassA,c),i-=this.m_invIA*ot.crossVec2Vec2(this.m_rA,c),s.addMul(this.m_invMassB,c),o+=this.m_invIB*ot.crossVec2Vec2(this.m_rB,c),this.m_bodyA.c_velocity.v.setVec2(e),this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v.setVec2(s),this.m_bodyB.c_velocity.w=o},e.prototype.solvePositionConstraints=function(t){if(this.m_frequencyHz>0)return!0;var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,s=this.m_bodyB.c_position.c,o=this.m_bodyB.c_position.a,n=lt.neo(i),r=lt.neo(o),a=lt.mulSub(n,this.m_localAnchorA,this.m_localCenterA),h=lt.mulSub(r,this.m_localAnchorB,this.m_localCenterB),c=ot.sub(ot.add(s,h),ot.add(e,a)),m=c.normalize()-this.m_length;m=st.clamp(m,-rt.maxLinearCorrection,rt.maxLinearCorrection);var _=-this.m_mass*m,l=ot.mulNumVec2(_,c);return e.subMul(this.m_invMassA,l),i-=this.m_invIA*ot.crossVec2Vec2(a,l),s.addMul(this.m_invMassB,l),o+=this.m_invIB*ot.crossVec2Vec2(h,l),this.m_bodyA.c_position.c.setVec2(e),this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c.setVec2(s),this.m_bodyB.c_position.a=o,st.abs(m)0&&(this.m_angularMass=1/this.m_angularMass),t.warmStarting){this.m_linearImpulse.mul(t.dtRatio),this.m_angularImpulse*=t.dtRatio;var p=ot.neo(this.m_linearImpulse.x,this.m_linearImpulse.y);i.subMul(c,p),s-=_*(ot.crossVec2Vec2(this.m_rA,p)+this.m_angularImpulse),n.addMul(m,p),r+=l*(ot.crossVec2Vec2(this.m_rB,p)+this.m_angularImpulse)}else this.m_linearImpulse.setZero(),this.m_angularImpulse=0;this.m_bodyA.c_velocity.v=i,this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v=n,this.m_bodyB.c_velocity.w=r},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,s=this.m_bodyB.c_velocity.v,o=this.m_bodyB.c_velocity.w,n=this.m_invMassA,r=this.m_invMassB,a=this.m_invIA,h=this.m_invIB,c=t.dt,m=o-i,_=-this.m_angularMass*m,l=this.m_angularImpulse,u=c*this.m_maxTorque;this.m_angularImpulse=st.clamp(this.m_angularImpulse+_,-u,u),i-=a*(_=this.m_angularImpulse-l),o+=h*_;m=ot.sub(ot.add(s,ot.crossNumVec2(o,this.m_rB)),ot.add(e,ot.crossNumVec2(i,this.m_rA))),_=ot.neg($t.mulVec2(this.m_linearMass,m)),l=this.m_linearImpulse;this.m_linearImpulse.add(_);u=c*this.m_maxForce;this.m_linearImpulse.lengthSquared()>u*u&&(this.m_linearImpulse.normalize(),this.m_linearImpulse.mul(u)),_=ot.sub(this.m_linearImpulse,l),e.subMul(n,_),i-=a*ot.crossVec2Vec2(this.m_rA,_),s.addMul(r,_),o+=h*ot.crossVec2Vec2(this.m_rB,_),this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=s,this.m_bodyB.c_velocity.w=o},e.prototype.solvePositionConstraints=function(t){return!0},e.TYPE="friction-joint",e}(St),Te=function(){function t(t,e,i){"object"==typeof t&&null!==t?(this.ex=ye.clone(t),this.ey=ye.clone(e),this.ez=ye.clone(i)):(this.ex=ye.zero(),this.ey=ye.zero(),this.ez=ye.zero())}return t.prototype.toString=function(){return JSON.stringify(this)},t.isValid=function(t){return null!=t&&(ye.isValid(t.ex)&&ye.isValid(t.ey)&&ye.isValid(t.ez))},t.assert=function(t){},t.prototype.setZero=function(){return this.ex.setZero(),this.ey.setZero(),this.ez.setZero(),this},t.prototype.solve33=function(t){var e=ye.dot(this.ex,ye.cross(this.ey,this.ez));0!==e&&(e=1/e);var i=new ye;return i.x=e*ye.dot(t,ye.cross(this.ey,this.ez)),i.y=e*ye.dot(this.ex,ye.cross(t,this.ez)),i.z=e*ye.dot(this.ex,ye.cross(this.ey,t)),i},t.prototype.solve22=function(t){var e=this.ex.x,i=this.ey.x,s=this.ex.y,o=this.ey.y,n=e*o-i*s;0!==n&&(n=1/n);var r=ot.zero();return r.x=n*(o*t.x-i*t.y),r.y=n*(e*t.y-s*t.x),r},t.prototype.getInverse22=function(t){var e=this.ex.x,i=this.ey.x,s=this.ex.y,o=this.ey.y,n=e*o-i*s;0!==n&&(n=1/n),t.ex.x=n*o,t.ey.x=-n*i,t.ex.z=0,t.ex.y=-n*s,t.ey.y=n*e,t.ey.z=0,t.ez.x=0,t.ez.y=0,t.ez.z=0},t.prototype.getSymInverse33=function(t){var e=ye.dot(this.ex,ye.cross(this.ey,this.ez));0!==e&&(e=1/e);var i=this.ex.x,s=this.ey.x,o=this.ez.x,n=this.ey.y,r=this.ez.y,a=this.ez.z;t.ex.x=e*(n*a-r*r),t.ex.y=e*(o*r-s*a),t.ex.z=e*(s*r-o*n),t.ey.x=t.ex.y,t.ey.y=e*(i*a-o*o),t.ey.z=e*(o*s-i*r),t.ez.x=t.ex.z,t.ez.y=t.ey.z,t.ez.z=e*(i*n-s*s)},t.mul=function(t,e){if(e&&"z"in e&&"y"in e&&"x"in e){var i=t.ex.x*e.x+t.ey.x*e.y+t.ez.x*e.z,s=t.ex.y*e.x+t.ey.y*e.y+t.ez.y*e.z,o=t.ex.z*e.x+t.ey.z*e.y+t.ez.z*e.z;return new ye(i,s,o)}if(e&&"y"in e&&"x"in e){i=t.ex.x*e.x+t.ey.x*e.y,s=t.ex.y*e.x+t.ey.y*e.y;return ot.neo(i,s)}},t.mulVec3=function(t,e){var i=t.ex.x*e.x+t.ey.x*e.y+t.ez.x*e.z,s=t.ex.y*e.x+t.ey.y*e.y+t.ez.y*e.z,o=t.ex.z*e.x+t.ey.z*e.y+t.ez.z*e.z;return new ye(i,s,o)},t.mulVec2=function(t,e){var i=t.ex.x*e.x+t.ey.x*e.y,s=t.ex.y*e.x+t.ey.y*e.y;return ot.neo(i,s)},t.add=function(e,i){return new t(ye.add(e.ex,i.ex),ye.add(e.ey,i.ey),ye.add(e.ez,i.ez))},t}(),ze={lowerAngle:0,upperAngle:0,maxMotorTorque:0,motorSpeed:0,enableLimit:!1,enableMotor:!1},ke=function(t){function e(i,s,o,n){var r=this;return r instanceof e?(i=it(i,ze),(r=t.call(this,i,s,o)||this).m_mass=new Te,r.m_limitState=0,s=r.m_bodyA,o=r.m_bodyB,r.m_type=e.TYPE,r.m_localAnchorA=ot.clone(n?s.getLocalPoint(n):i.localAnchorA||ot.zero()),r.m_localAnchorB=ot.clone(n?o.getLocalPoint(n):i.localAnchorB||ot.zero()),r.m_referenceAngle=st.isFinite(i.referenceAngle)?i.referenceAngle:o.getAngle()-s.getAngle(),r.m_impulse=new ye,r.m_motorImpulse=0,r.m_lowerAngle=i.lowerAngle,r.m_upperAngle=i.upperAngle,r.m_maxMotorTorque=i.maxMotorTorque,r.m_motorSpeed=i.motorSpeed,r.m_enableLimit=i.enableLimit,r.m_enableMotor=i.enableMotor,r):new e(i,s,o,n)}return tt(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,lowerAngle:this.m_lowerAngle,upperAngle:this.m_upperAngle,maxMotorTorque:this.m_maxMotorTorque,motorSpeed:this.m_motorSpeed,enableLimit:this.m_enableLimit,enableMotor:this.m_enableMotor,localAnchorA:this.m_localAnchorA,localAnchorB:this.m_localAnchorB,referenceAngle:this.m_referenceAngle}},e._deserialize=function(t,i,s){return(t=et({},t)).bodyA=s(Ct,t.bodyA,i),t.bodyB=s(Ct,t.bodyB,i),new e(t)},e.prototype._setAnchors=function(t){t.anchorA?this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(t.anchorA)):t.localAnchorA&&this.m_localAnchorA.setVec2(t.localAnchorA),t.anchorB?this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(t.anchorB)):t.localAnchorB&&this.m_localAnchorB.setVec2(t.localAnchorB)},e.prototype.getLocalAnchorA=function(){return this.m_localAnchorA},e.prototype.getLocalAnchorB=function(){return this.m_localAnchorB},e.prototype.getReferenceAngle=function(){return this.m_referenceAngle},e.prototype.getJointAngle=function(){var t=this.m_bodyA;return this.m_bodyB.m_sweep.a-t.m_sweep.a-this.m_referenceAngle},e.prototype.getJointSpeed=function(){var t=this.m_bodyA;return this.m_bodyB.m_angularVelocity-t.m_angularVelocity},e.prototype.isMotorEnabled=function(){return this.m_enableMotor},e.prototype.enableMotor=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableMotor=t},e.prototype.getMotorTorque=function(t){return t*this.m_motorImpulse},e.prototype.setMotorSpeed=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_motorSpeed=t},e.prototype.getMotorSpeed=function(){return this.m_motorSpeed},e.prototype.setMaxMotorTorque=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_maxMotorTorque=t},e.prototype.getMaxMotorTorque=function(){return this.m_maxMotorTorque},e.prototype.isLimitEnabled=function(){return this.m_enableLimit},e.prototype.enableLimit=function(t){t!=this.m_enableLimit&&(this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableLimit=t,this.m_impulse.z=0)},e.prototype.getLowerLimit=function(){return this.m_lowerAngle},e.prototype.getUpperLimit=function(){return this.m_upperAngle},e.prototype.setLimits=function(t,e){t==this.m_lowerAngle&&e==this.m_upperAngle||(this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_impulse.z=0,this.m_lowerAngle=t,this.m_upperAngle=e)},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return ot.neo(this.m_impulse.x,this.m_impulse.y).mul(t)},e.prototype.getReactionTorque=function(t){return t*this.m_impulse.z},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyA.c_position.a,i=this.m_bodyA.c_velocity.v,s=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_position.a,n=this.m_bodyB.c_velocity.v,r=this.m_bodyB.c_velocity.w,a=lt.neo(e),h=lt.neo(o);this.m_rA=lt.mulVec2(a,ot.sub(this.m_localAnchorA,this.m_localCenterA)),this.m_rB=lt.mulVec2(h,ot.sub(this.m_localAnchorB,this.m_localCenterB));var c=this.m_invMassA,m=this.m_invMassB,_=this.m_invIA,l=this.m_invIB,u=_+l===0;if(this.m_mass.ex.x=c+m+this.m_rA.y*this.m_rA.y*_+this.m_rB.y*this.m_rB.y*l,this.m_mass.ey.x=-this.m_rA.y*this.m_rA.x*_-this.m_rB.y*this.m_rB.x*l,this.m_mass.ez.x=-this.m_rA.y*_-this.m_rB.y*l,this.m_mass.ex.y=this.m_mass.ey.x,this.m_mass.ey.y=c+m+this.m_rA.x*this.m_rA.x*_+this.m_rB.x*this.m_rB.x*l,this.m_mass.ez.y=this.m_rA.x*_+this.m_rB.x*l,this.m_mass.ex.z=this.m_mass.ez.x,this.m_mass.ey.z=this.m_mass.ez.y,this.m_mass.ez.z=_+l,this.m_motorMass=_+l,this.m_motorMass>0&&(this.m_motorMass=1/this.m_motorMass),(0==this.m_enableMotor||u)&&(this.m_motorImpulse=0),this.m_enableLimit&&0==u){var p=o-e-this.m_referenceAngle;st.abs(this.m_upperAngle-this.m_lowerAngle)<2*rt.angularSlop?this.m_limitState=3:p<=this.m_lowerAngle?(1!=this.m_limitState&&(this.m_impulse.z=0),this.m_limitState=1):p>=this.m_upperAngle?(2!=this.m_limitState&&(this.m_impulse.z=0),this.m_limitState=2):(this.m_limitState=0,this.m_impulse.z=0)}else this.m_limitState=0;if(t.warmStarting){this.m_impulse.mul(t.dtRatio),this.m_motorImpulse*=t.dtRatio;var d=ot.neo(this.m_impulse.x,this.m_impulse.y);i.subMul(c,d),s-=_*(ot.crossVec2Vec2(this.m_rA,d)+this.m_motorImpulse+this.m_impulse.z),n.addMul(m,d),r+=l*(ot.crossVec2Vec2(this.m_rB,d)+this.m_motorImpulse+this.m_impulse.z)}else this.m_impulse.setZero(),this.m_motorImpulse=0;this.m_bodyA.c_velocity.v=i,this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v=n,this.m_bodyB.c_velocity.w=r},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,s=this.m_bodyB.c_velocity.v,o=this.m_bodyB.c_velocity.w,n=this.m_invMassA,r=this.m_invMassB,a=this.m_invIA,h=this.m_invIB,c=a+h===0;if(this.m_enableMotor&&3!=this.m_limitState&&0==c){var m=o-i-this.m_motorSpeed,_=-this.m_motorMass*m,l=this.m_motorImpulse,u=t.dt*this.m_maxMotorTorque;this.m_motorImpulse=st.clamp(this.m_motorImpulse+_,-u,u),i-=a*(_=this.m_motorImpulse-l),o+=h*_}if(this.m_enableLimit&&0!=this.m_limitState&&0==c){var p=ot.zero();p.addCombine(1,s,1,ot.crossNumVec2(o,this.m_rB)),p.subCombine(1,e,1,ot.crossNumVec2(i,this.m_rA));var d=o-i;m=new ye(p.x,p.y,d),_=ye.neg(this.m_mass.solve33(m));if(3==this.m_limitState)this.m_impulse.add(_);else if(1==this.m_limitState){if(this.m_impulse.z+_.z<0){var y=ot.combine(-1,p,this.m_impulse.z,ot.neo(this.m_mass.ez.x,this.m_mass.ez.y)),f=this.m_mass.solve22(y);_.x=f.x,_.y=f.y,_.z=-this.m_impulse.z,this.m_impulse.x+=f.x,this.m_impulse.y+=f.y,this.m_impulse.z=0}else this.m_impulse.add(_)}else if(2==this.m_limitState){if(this.m_impulse.z+_.z>0){y=ot.combine(-1,p,this.m_impulse.z,ot.neo(this.m_mass.ez.x,this.m_mass.ez.y)),f=this.m_mass.solve22(y);_.x=f.x,_.y=f.y,_.z=-this.m_impulse.z,this.m_impulse.x+=f.x,this.m_impulse.y+=f.y,this.m_impulse.z=0}else this.m_impulse.add(_)}var v=ot.neo(_.x,_.y);e.subMul(n,v),i-=a*(ot.crossVec2Vec2(this.m_rA,v)+_.z),s.addMul(r,v),o+=h*(ot.crossVec2Vec2(this.m_rB,v)+_.z)}else{(m=ot.zero()).addCombine(1,s,1,ot.crossNumVec2(o,this.m_rB)),m.subCombine(1,e,1,ot.crossNumVec2(i,this.m_rA));_=this.m_mass.solve22(ot.neg(m));this.m_impulse.x+=_.x,this.m_impulse.y+=_.y,e.subMul(n,_),i-=a*ot.crossVec2Vec2(this.m_rA,_),s.addMul(r,_),o+=h*ot.crossVec2Vec2(this.m_rB,_)}this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=s,this.m_bodyB.c_velocity.w=o},e.prototype.solvePositionConstraints=function(t){var e,i=this.m_bodyA.c_position.c,s=this.m_bodyA.c_position.a,o=this.m_bodyB.c_position.c,n=this.m_bodyB.c_position.a,r=lt.neo(s),a=lt.neo(n),h=0,c=this.m_invIA+this.m_invIB==0;if(this.m_enableLimit&&0!=this.m_limitState&&0==c){var m=n-s-this.m_referenceAngle,_=0;if(3==this.m_limitState){var l=st.clamp(m-this.m_lowerAngle,-rt.maxAngularCorrection,rt.maxAngularCorrection);_=-this.m_motorMass*l,h=st.abs(l)}else if(1==this.m_limitState){h=-(l=m-this.m_lowerAngle),l=st.clamp(l+rt.angularSlop,-rt.maxAngularCorrection,0),_=-this.m_motorMass*l}else if(2==this.m_limitState){h=l=m-this.m_upperAngle,l=st.clamp(l-rt.angularSlop,0,rt.maxAngularCorrection),_=-this.m_motorMass*l}s-=this.m_invIA*_,n+=this.m_invIB*_}r.setAngle(s),a.setAngle(n);var u=lt.mulVec2(r,ot.sub(this.m_localAnchorA,this.m_localCenterA)),p=lt.mulVec2(a,ot.sub(this.m_localAnchorB,this.m_localCenterB));(l=ot.zero()).addCombine(1,o,1,p),l.subCombine(1,i,1,u),e=l.length();var d=this.m_invMassA,y=this.m_invMassB,f=this.m_invIA,v=this.m_invIB,x=new $t;x.ex.x=d+y+f*u.y*u.y+v*p.y*p.y,x.ex.y=-f*u.x*u.y-v*p.x*p.y,x.ey.x=x.ex.y,x.ey.y=d+y+f*u.x*u.x+v*p.x*p.x;var g=ot.neg(x.solve(l));return i.subMul(d,g),s-=f*ot.crossVec2Vec2(u,g),o.addMul(y,g),n+=v*ot.crossVec2Vec2(p,g),this.m_bodyA.c_position.c.setVec2(i),this.m_bodyA.c_position.a=s,this.m_bodyB.c_position.c.setVec2(o),this.m_bodyB.c_position.a=n,e<=rt.linearSlop&&h<=rt.angularSlop},e.TYPE="revolute-joint",e}(St),Fe={enableLimit:!1,lowerTranslation:0,upperTranslation:0,enableMotor:!1,maxMotorForce:0,motorSpeed:0},Le=function(t){function e(i,s,o,n,r){var a=this;return a instanceof e?(i=it(i,Fe),s=(a=t.call(this,i,s,o)||this).m_bodyA,o=a.m_bodyB,a.m_type=e.TYPE,a.m_localAnchorA=ot.clone(n?s.getLocalPoint(n):i.localAnchorA||ot.zero()),a.m_localAnchorB=ot.clone(n?o.getLocalPoint(n):i.localAnchorB||ot.zero()),a.m_localXAxisA=ot.clone(r?s.getLocalVector(r):i.localAxisA||ot.neo(1,0)),a.m_localXAxisA.normalize(),a.m_localYAxisA=ot.crossNumVec2(1,a.m_localXAxisA),a.m_referenceAngle=st.isFinite(i.referenceAngle)?i.referenceAngle:o.getAngle()-s.getAngle(),a.m_impulse=new ye,a.m_motorMass=0,a.m_motorImpulse=0,a.m_lowerTranslation=i.lowerTranslation,a.m_upperTranslation=i.upperTranslation,a.m_maxMotorForce=i.maxMotorForce,a.m_motorSpeed=i.motorSpeed,a.m_enableLimit=i.enableLimit,a.m_enableMotor=i.enableMotor,a.m_limitState=0,a.m_axis=ot.zero(),a.m_perp=ot.zero(),a.m_K=new Te,a):new e(i,s,o,n,r)}return tt(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,lowerTranslation:this.m_lowerTranslation,upperTranslation:this.m_upperTranslation,maxMotorForce:this.m_maxMotorForce,motorSpeed:this.m_motorSpeed,enableLimit:this.m_enableLimit,enableMotor:this.m_enableMotor,localAnchorA:this.m_localAnchorA,localAnchorB:this.m_localAnchorB,localAxisA:this.m_localXAxisA,referenceAngle:this.m_referenceAngle}},e._deserialize=function(t,i,s){return(t=et({},t)).bodyA=s(Ct,t.bodyA,i),t.bodyB=s(Ct,t.bodyB,i),t.localAxisA=ot.clone(t.localAxisA),new e(t)},e.prototype._setAnchors=function(t){t.anchorA?this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(t.anchorA)):t.localAnchorA&&this.m_localAnchorA.setVec2(t.localAnchorA),t.anchorB?this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(t.anchorB)):t.localAnchorB&&this.m_localAnchorB.setVec2(t.localAnchorB),t.localAxisA&&(this.m_localXAxisA.setVec2(t.localAxisA),this.m_localYAxisA.setVec2(ot.crossNumVec2(1,t.localAxisA)))},e.prototype.getLocalAnchorA=function(){return this.m_localAnchorA},e.prototype.getLocalAnchorB=function(){return this.m_localAnchorB},e.prototype.getLocalAxisA=function(){return this.m_localXAxisA},e.prototype.getReferenceAngle=function(){return this.m_referenceAngle},e.prototype.getJointTranslation=function(){var t=this.m_bodyA.getWorldPoint(this.m_localAnchorA),e=this.m_bodyB.getWorldPoint(this.m_localAnchorB),i=ot.sub(e,t),s=this.m_bodyA.getWorldVector(this.m_localXAxisA);return ot.dot(i,s)},e.prototype.getJointSpeed=function(){var t=this.m_bodyA,e=this.m_bodyB,i=lt.mulVec2(t.m_xf.q,ot.sub(this.m_localAnchorA,t.m_sweep.localCenter)),s=lt.mulVec2(e.m_xf.q,ot.sub(this.m_localAnchorB,e.m_sweep.localCenter)),o=ot.add(t.m_sweep.c,i),n=ot.add(e.m_sweep.c,s),r=ot.sub(n,o),a=lt.mulVec2(t.m_xf.q,this.m_localXAxisA),h=t.m_linearVelocity,c=e.m_linearVelocity,m=t.m_angularVelocity,_=e.m_angularVelocity;return ot.dot(r,ot.crossNumVec2(m,a))+ot.dot(a,ot.sub(ot.addCrossNumVec2(c,_,s),ot.addCrossNumVec2(h,m,i)))},e.prototype.isLimitEnabled=function(){return this.m_enableLimit},e.prototype.enableLimit=function(t){t!=this.m_enableLimit&&(this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableLimit=t,this.m_impulse.z=0)},e.prototype.getLowerLimit=function(){return this.m_lowerTranslation},e.prototype.getUpperLimit=function(){return this.m_upperTranslation},e.prototype.setLimits=function(t,e){t==this.m_lowerTranslation&&e==this.m_upperTranslation||(this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_lowerTranslation=t,this.m_upperTranslation=e,this.m_impulse.z=0)},e.prototype.isMotorEnabled=function(){return this.m_enableMotor},e.prototype.enableMotor=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableMotor=t},e.prototype.setMotorSpeed=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_motorSpeed=t},e.prototype.setMaxMotorForce=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_maxMotorForce=t},e.prototype.getMaxMotorForce=function(){return this.m_maxMotorForce},e.prototype.getMotorSpeed=function(){return this.m_motorSpeed},e.prototype.getMotorForce=function(t){return t*this.m_motorImpulse},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return ot.combine(this.m_impulse.x,this.m_perp,this.m_motorImpulse+this.m_impulse.z,this.m_axis).mul(t)},e.prototype.getReactionTorque=function(t){return t*this.m_impulse.y},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,s=this.m_bodyA.c_velocity.v,o=this.m_bodyA.c_velocity.w,n=this.m_bodyB.c_position.c,r=this.m_bodyB.c_position.a,a=this.m_bodyB.c_velocity.v,h=this.m_bodyB.c_velocity.w,c=lt.neo(i),m=lt.neo(r),_=lt.mulVec2(c,ot.sub(this.m_localAnchorA,this.m_localCenterA)),l=lt.mulVec2(m,ot.sub(this.m_localAnchorB,this.m_localCenterB)),u=ot.zero();u.addCombine(1,n,1,l),u.subCombine(1,e,1,_);var p=this.m_invMassA,d=this.m_invMassB,y=this.m_invIA,f=this.m_invIB;this.m_axis=lt.mulVec2(c,this.m_localXAxisA),this.m_a1=ot.crossVec2Vec2(ot.add(u,_),this.m_axis),this.m_a2=ot.crossVec2Vec2(l,this.m_axis),this.m_motorMass=p+d+y*this.m_a1*this.m_a1+f*this.m_a2*this.m_a2,this.m_motorMass>0&&(this.m_motorMass=1/this.m_motorMass),this.m_perp=lt.mulVec2(c,this.m_localYAxisA),this.m_s1=ot.crossVec2Vec2(ot.add(u,_),this.m_perp),this.m_s2=ot.crossVec2Vec2(l,this.m_perp),ot.crossVec2Vec2(_,this.m_perp);var v=p+d+y*this.m_s1*this.m_s1+f*this.m_s2*this.m_s2,x=y*this.m_s1+f*this.m_s2,g=y*this.m_s1*this.m_a1+f*this.m_s2*this.m_a2,b=y+f;0==b&&(b=1);var A=y*this.m_a1+f*this.m_a2,B=p+d+y*this.m_a1*this.m_a1+f*this.m_a2*this.m_a2;if(this.m_K.ex.set(v,x,g),this.m_K.ey.set(x,b,A),this.m_K.ez.set(g,A,B),this.m_enableLimit){var w=ot.dot(this.m_axis,u);st.abs(this.m_upperTranslation-this.m_lowerTranslation)<2*rt.linearSlop?this.m_limitState=3:w<=this.m_lowerTranslation?1!=this.m_limitState&&(this.m_limitState=1,this.m_impulse.z=0):w>=this.m_upperTranslation?2!=this.m_limitState&&(this.m_limitState=2,this.m_impulse.z=0):(this.m_limitState=0,this.m_impulse.z=0)}else this.m_limitState=0,this.m_impulse.z=0;if(0==this.m_enableMotor&&(this.m_motorImpulse=0),t.warmStarting){this.m_impulse.mul(t.dtRatio),this.m_motorImpulse*=t.dtRatio;var V=ot.combine(this.m_impulse.x,this.m_perp,this.m_motorImpulse+this.m_impulse.z,this.m_axis),C=this.m_impulse.x*this.m_s1+this.m_impulse.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_a1,M=this.m_impulse.x*this.m_s2+this.m_impulse.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_a2;s.subMul(p,V),o-=y*C,a.addMul(d,V),h+=f*M}else this.m_impulse.setZero(),this.m_motorImpulse=0;this.m_bodyA.c_velocity.v.setVec2(s),this.m_bodyA.c_velocity.w=o,this.m_bodyB.c_velocity.v.setVec2(a),this.m_bodyB.c_velocity.w=h},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,s=this.m_bodyB.c_velocity.v,o=this.m_bodyB.c_velocity.w,n=this.m_invMassA,r=this.m_invMassB,a=this.m_invIA,h=this.m_invIB;if(this.m_enableMotor&&3!=this.m_limitState){var c=ot.dot(this.m_axis,ot.sub(s,e))+this.m_a2*o-this.m_a1*i,m=this.m_motorMass*(this.m_motorSpeed-c),_=this.m_motorImpulse,l=t.dt*this.m_maxMotorForce;this.m_motorImpulse=st.clamp(this.m_motorImpulse+m,-l,l),m=this.m_motorImpulse-_;var u=ot.mulNumVec2(m,this.m_axis),p=m*this.m_a1,d=m*this.m_a2;e.subMul(n,u),i-=a*p,s.addMul(r,u),o+=h*d}var y=ot.zero();if(y.x+=ot.dot(this.m_perp,s)+this.m_s2*o,y.x-=ot.dot(this.m_perp,e)+this.m_s1*i,y.y=o-i,this.m_enableLimit&&0!=this.m_limitState){var f=0;f+=ot.dot(this.m_axis,s)+this.m_a2*o,f-=ot.dot(this.m_axis,e)+this.m_a1*i;c=new ye(y.x,y.y,f);var v=ye.clone(this.m_impulse),x=this.m_K.solve33(ye.neg(c));this.m_impulse.add(x),1==this.m_limitState?this.m_impulse.z=st.max(this.m_impulse.z,0):2==this.m_limitState&&(this.m_impulse.z=st.min(this.m_impulse.z,0));var g=ot.combine(-1,y,-(this.m_impulse.z-v.z),ot.neo(this.m_K.ez.x,this.m_K.ez.y)),b=ot.add(this.m_K.solve22(g),ot.neo(v.x,v.y));this.m_impulse.x=b.x,this.m_impulse.y=b.y,x=ye.sub(this.m_impulse,v);u=ot.combine(x.x,this.m_perp,x.z,this.m_axis),p=x.x*this.m_s1+x.y+x.z*this.m_a1,d=x.x*this.m_s2+x.y+x.z*this.m_a2;e.subMul(n,u),i-=a*p,s.addMul(r,u),o+=h*d}else{x=this.m_K.solve22(ot.neg(y));this.m_impulse.x+=x.x,this.m_impulse.y+=x.y;u=ot.mulNumVec2(x.x,this.m_perp),p=x.x*this.m_s1+x.y,d=x.x*this.m_s2+x.y;e.subMul(n,u),i-=a*p,s.addMul(r,u),o+=h*d}this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=s,this.m_bodyB.c_velocity.w=o},e.prototype.solvePositionConstraints=function(t){var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,s=this.m_bodyB.c_position.c,o=this.m_bodyB.c_position.a,n=lt.neo(i),r=lt.neo(o),a=this.m_invMassA,h=this.m_invMassB,c=this.m_invIA,m=this.m_invIB,_=lt.mulVec2(n,ot.sub(this.m_localAnchorA,this.m_localCenterA)),l=lt.mulVec2(r,ot.sub(this.m_localAnchorB,this.m_localCenterB)),u=ot.sub(ot.add(s,l),ot.add(e,_)),p=lt.mulVec2(n,this.m_localXAxisA),d=ot.crossVec2Vec2(ot.add(u,_),p),y=ot.crossVec2Vec2(l,p),f=lt.mulVec2(n,this.m_localYAxisA),v=ot.crossVec2Vec2(ot.add(u,_),f),x=ot.crossVec2Vec2(l,f),g=new ye,b=ot.zero();b.x=ot.dot(f,u),b.y=o-i-this.m_referenceAngle;var A=st.abs(b.x),B=st.abs(b.y),w=rt.linearSlop,V=rt.maxLinearCorrection,C=!1,M=0;if(this.m_enableLimit){var S=ot.dot(p,u);st.abs(this.m_upperTranslation-this.m_lowerTranslation)<2*w?(M=st.clamp(S,-V,V),A=st.max(A,st.abs(S)),C=!0):S<=this.m_lowerTranslation?(M=st.clamp(S-this.m_lowerTranslation+w,-V,0),A=st.max(A,this.m_lowerTranslation-S),C=!0):S>=this.m_upperTranslation&&(M=st.clamp(S-this.m_upperTranslation-w,0,V),A=st.max(A,S-this.m_upperTranslation),C=!0)}if(C){var I=a+h+c*v*v+m*x*x,P=c*v+m*x,T=c*v*d+m*x*y;0==(L=c+m)&&(L=1);var z=c*d+m*y,k=a+h+c*d*d+m*y*y;(q=new Te).ex.set(I,P,T),q.ey.set(P,L,z),q.ez.set(T,z,k);var F=new ye;F.x=b.x,F.y=b.y,F.z=M,g=q.solve33(ye.neg(F))}else{var L,q;I=a+h+c*v*v+m*x*x,P=c*v+m*x;0==(L=c+m)&&(L=1),(q=new $t).ex.setNum(I,P),q.ey.setNum(P,L);var N=q.solve(ot.neg(b));g.x=N.x,g.y=N.y,g.z=0}var j=ot.combine(g.x,f,g.z,p),D=g.x*v+g.y+g.z*d,E=g.x*x+g.y+g.z*y;return e.subMul(a,j),i-=c*D,s.addMul(h,j),o+=m*E,this.m_bodyA.c_position.c=e,this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c=s,this.m_bodyB.c_position.a=o,A<=rt.linearSlop&&B<=rt.angularSlop},e.TYPE="prismatic-joint",e}(St),qe={ratio:1},Ne=function(t){function e(i,s,o,n,r,a){var h,c,m=this;if(!(m instanceof e))return new e(i,s,o,n,r,a);i=it(i,qe),s=(m=t.call(this,i,s,o)||this).m_bodyA,o=m.m_bodyB,m.m_type=e.TYPE,m.m_joint1=n||i.joint1,m.m_joint2=r||i.joint2,m.m_ratio=st.isFinite(a)?a:i.ratio,m.m_type1=m.m_joint1.getType(),m.m_type2=m.m_joint2.getType(),m.m_bodyC=m.m_joint1.getBodyA(),m.m_bodyA=m.m_joint1.getBodyB();var _=m.m_bodyA.m_xf,l=m.m_bodyA.m_sweep.a,u=m.m_bodyC.m_xf,p=m.m_bodyC.m_sweep.a;if(m.m_type1===ke.TYPE){var d=m.m_joint1;m.m_localAnchorC=d.m_localAnchorA,m.m_localAnchorA=d.m_localAnchorB,m.m_referenceAngleA=d.m_referenceAngle,m.m_localAxisC=ot.zero(),h=l-p-m.m_referenceAngleA}else{var y=m.m_joint1;m.m_localAnchorC=y.m_localAnchorA,m.m_localAnchorA=y.m_localAnchorB,m.m_referenceAngleA=y.m_referenceAngle,m.m_localAxisC=y.m_localXAxisA;var f=m.m_localAnchorC,v=lt.mulTVec2(u.q,ot.add(lt.mulVec2(_.q,m.m_localAnchorA),ot.sub(_.p,u.p)));h=ot.dot(v,m.m_localAxisC)-ot.dot(f,m.m_localAxisC)}m.m_bodyD=m.m_joint2.getBodyA(),m.m_bodyB=m.m_joint2.getBodyB();var x=m.m_bodyB.m_xf,g=m.m_bodyB.m_sweep.a,b=m.m_bodyD.m_xf,A=m.m_bodyD.m_sweep.a;if(m.m_type2===ke.TYPE){d=m.m_joint2;m.m_localAnchorD=d.m_localAnchorA,m.m_localAnchorB=d.m_localAnchorB,m.m_referenceAngleB=d.m_referenceAngle,m.m_localAxisD=ot.zero(),c=g-A-m.m_referenceAngleB}else{y=m.m_joint2;m.m_localAnchorD=y.m_localAnchorA,m.m_localAnchorB=y.m_localAnchorB,m.m_referenceAngleB=y.m_referenceAngle,m.m_localAxisD=y.m_localXAxisA;var B=m.m_localAnchorD,w=lt.mulTVec2(b.q,ot.add(lt.mulVec2(x.q,m.m_localAnchorB),ot.sub(x.p,b.p)));c=ot.dot(w,m.m_localAxisD)-ot.dot(B,m.m_localAxisD)}return m.m_constant=h+m.m_ratio*c,m.m_impulse=0,m}return tt(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,joint1:this.m_joint1,joint2:this.m_joint2,ratio:this.m_ratio}},e._deserialize=function(t,i,s){return(t=et({},t)).bodyA=s(Ct,t.bodyA,i),t.bodyB=s(Ct,t.bodyB,i),t.joint1=s(St,t.joint1,i),t.joint2=s(St,t.joint2,i),new e(t)},e.prototype.getJoint1=function(){return this.m_joint1},e.prototype.getJoint2=function(){return this.m_joint2},e.prototype.setRatio=function(t){this.m_ratio=t},e.prototype.getRatio=function(){return this.m_ratio},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return ot.mulNumVec2(this.m_impulse,this.m_JvAC).mul(t)},e.prototype.getReactionTorque=function(t){return t*(this.m_impulse*this.m_JwA)},e.prototype.initVelocityConstraints=function(t){this.m_lcA=this.m_bodyA.m_sweep.localCenter,this.m_lcB=this.m_bodyB.m_sweep.localCenter,this.m_lcC=this.m_bodyC.m_sweep.localCenter,this.m_lcD=this.m_bodyD.m_sweep.localCenter,this.m_mA=this.m_bodyA.m_invMass,this.m_mB=this.m_bodyB.m_invMass,this.m_mC=this.m_bodyC.m_invMass,this.m_mD=this.m_bodyD.m_invMass,this.m_iA=this.m_bodyA.m_invI,this.m_iB=this.m_bodyB.m_invI,this.m_iC=this.m_bodyC.m_invI,this.m_iD=this.m_bodyD.m_invI;var e=this.m_bodyA.c_position.a,i=this.m_bodyA.c_velocity.v,s=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_position.a,n=this.m_bodyB.c_velocity.v,r=this.m_bodyB.c_velocity.w,a=this.m_bodyC.c_position.a,h=this.m_bodyC.c_velocity.v,c=this.m_bodyC.c_velocity.w,m=this.m_bodyD.c_position.a,_=this.m_bodyD.c_velocity.v,l=this.m_bodyD.c_velocity.w,u=lt.neo(e),p=lt.neo(o),d=lt.neo(a),y=lt.neo(m);if(this.m_mass=0,this.m_type1==ke.TYPE)this.m_JvAC=ot.zero(),this.m_JwA=1,this.m_JwC=1,this.m_mass+=this.m_iA+this.m_iC;else{var f=lt.mulVec2(d,this.m_localAxisC),v=lt.mulSub(d,this.m_localAnchorC,this.m_lcC),x=lt.mulSub(u,this.m_localAnchorA,this.m_lcA);this.m_JvAC=f,this.m_JwC=ot.crossVec2Vec2(v,f),this.m_JwA=ot.crossVec2Vec2(x,f),this.m_mass+=this.m_mC+this.m_mA+this.m_iC*this.m_JwC*this.m_JwC+this.m_iA*this.m_JwA*this.m_JwA}if(this.m_type2==ke.TYPE)this.m_JvBD=ot.zero(),this.m_JwB=this.m_ratio,this.m_JwD=this.m_ratio,this.m_mass+=this.m_ratio*this.m_ratio*(this.m_iB+this.m_iD);else{f=lt.mulVec2(y,this.m_localAxisD);var g=lt.mulSub(y,this.m_localAnchorD,this.m_lcD),b=lt.mulSub(p,this.m_localAnchorB,this.m_lcB);this.m_JvBD=ot.mulNumVec2(this.m_ratio,f),this.m_JwD=this.m_ratio*ot.crossVec2Vec2(g,f),this.m_JwB=this.m_ratio*ot.crossVec2Vec2(b,f),this.m_mass+=this.m_ratio*this.m_ratio*(this.m_mD+this.m_mB)+this.m_iD*this.m_JwD*this.m_JwD+this.m_iB*this.m_JwB*this.m_JwB}this.m_mass=this.m_mass>0?1/this.m_mass:0,t.warmStarting?(i.addMul(this.m_mA*this.m_impulse,this.m_JvAC),s+=this.m_iA*this.m_impulse*this.m_JwA,n.addMul(this.m_mB*this.m_impulse,this.m_JvBD),r+=this.m_iB*this.m_impulse*this.m_JwB,h.subMul(this.m_mC*this.m_impulse,this.m_JvAC),c-=this.m_iC*this.m_impulse*this.m_JwC,_.subMul(this.m_mD*this.m_impulse,this.m_JvBD),l-=this.m_iD*this.m_impulse*this.m_JwD):this.m_impulse=0,this.m_bodyA.c_velocity.v.setVec2(i),this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v.setVec2(n),this.m_bodyB.c_velocity.w=r,this.m_bodyC.c_velocity.v.setVec2(h),this.m_bodyC.c_velocity.w=c,this.m_bodyD.c_velocity.v.setVec2(_),this.m_bodyD.c_velocity.w=l},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,s=this.m_bodyB.c_velocity.v,o=this.m_bodyB.c_velocity.w,n=this.m_bodyC.c_velocity.v,r=this.m_bodyC.c_velocity.w,a=this.m_bodyD.c_velocity.v,h=this.m_bodyD.c_velocity.w,c=ot.dot(this.m_JvAC,e)-ot.dot(this.m_JvAC,n)+ot.dot(this.m_JvBD,s)-ot.dot(this.m_JvBD,a);c+=this.m_JwA*i-this.m_JwC*r+(this.m_JwB*o-this.m_JwD*h);var m=-this.m_mass*c;this.m_impulse+=m,e.addMul(this.m_mA*m,this.m_JvAC),i+=this.m_iA*m*this.m_JwA,s.addMul(this.m_mB*m,this.m_JvBD),o+=this.m_iB*m*this.m_JwB,n.subMul(this.m_mC*m,this.m_JvAC),r-=this.m_iC*m*this.m_JwC,a.subMul(this.m_mD*m,this.m_JvBD),h-=this.m_iD*m*this.m_JwD,this.m_bodyA.c_velocity.v.setVec2(e),this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v.setVec2(s),this.m_bodyB.c_velocity.w=o,this.m_bodyC.c_velocity.v.setVec2(n),this.m_bodyC.c_velocity.w=r,this.m_bodyD.c_velocity.v.setVec2(a),this.m_bodyD.c_velocity.w=h},e.prototype.solvePositionConstraints=function(t){var e,i,s,o,n,r,a,h,c=this.m_bodyA.c_position.c,m=this.m_bodyA.c_position.a,_=this.m_bodyB.c_position.c,l=this.m_bodyB.c_position.a,u=this.m_bodyC.c_position.c,p=this.m_bodyC.c_position.a,d=this.m_bodyD.c_position.c,y=this.m_bodyD.c_position.a,f=lt.neo(m),v=lt.neo(l),x=lt.neo(p),g=lt.neo(y),b=0;if(this.m_type1==ke.TYPE)s=ot.zero(),n=1,a=1,b+=this.m_iA+this.m_iC,e=m-p-this.m_referenceAngleA;else{var A=lt.mulVec2(x,this.m_localAxisC),B=lt.mulSub(x,this.m_localAnchorC,this.m_lcC),w=lt.mulSub(f,this.m_localAnchorA,this.m_lcA);s=A,a=ot.crossVec2Vec2(B,A),n=ot.crossVec2Vec2(w,A),b+=this.m_mC+this.m_mA+this.m_iC*a*a+this.m_iA*n*n;var V=ot.sub(this.m_localAnchorC,this.m_lcC),C=lt.mulTVec2(x,ot.add(w,ot.sub(c,u)));e=ot.dot(ot.sub(C,V),this.m_localAxisC)}if(this.m_type2==ke.TYPE)o=ot.zero(),r=this.m_ratio,h=this.m_ratio,b+=this.m_ratio*this.m_ratio*(this.m_iB+this.m_iD),i=l-y-this.m_referenceAngleB;else{A=lt.mulVec2(g,this.m_localAxisD);var M=lt.mulSub(g,this.m_localAnchorD,this.m_lcD),S=lt.mulSub(v,this.m_localAnchorB,this.m_lcB);o=ot.mulNumVec2(this.m_ratio,A),h=this.m_ratio*ot.crossVec2Vec2(M,A),r=this.m_ratio*ot.crossVec2Vec2(S,A),b+=this.m_ratio*this.m_ratio*(this.m_mD+this.m_mB)+this.m_iD*h*h+this.m_iB*r*r;var I=ot.sub(this.m_localAnchorD,this.m_lcD),P=lt.mulTVec2(g,ot.add(S,ot.sub(_,d)));i=ot.dot(P,this.m_localAxisD)-ot.dot(I,this.m_localAxisD)}var T=e+this.m_ratio*i-this.m_constant,z=0;return b>0&&(z=-T/b),c.addMul(this.m_mA*z,s),m+=this.m_iA*z*n,_.addMul(this.m_mB*z,o),l+=this.m_iB*z*r,u.subMul(this.m_mC*z,s),p-=this.m_iC*z*a,d.subMul(this.m_mD*z,o),y-=this.m_iD*z*h,this.m_bodyA.c_position.c.setVec2(c),this.m_bodyA.c_position.a=m,this.m_bodyB.c_position.c.setVec2(_),this.m_bodyB.c_position.a=l,this.m_bodyC.c_position.c.setVec2(u),this.m_bodyC.c_position.a=p,this.m_bodyD.c_position.c.setVec2(d),this.m_bodyD.c_position.a=y,00&&(this.m_angularMass=1/this.m_angularMass),this.m_linearError=ot.zero(),this.m_linearError.addCombine(1,n,1,this.m_rB),this.m_linearError.subCombine(1,e,1,this.m_rA),this.m_linearError.sub(lt.mulVec2(c,this.m_linearOffset)),this.m_angularError=r-i-this.m_angularOffset,t.warmStarting){this.m_linearImpulse.mul(t.dtRatio),this.m_angularImpulse*=t.dtRatio;var y=ot.neo(this.m_linearImpulse.x,this.m_linearImpulse.y);s.subMul(_,y),o-=u*(ot.crossVec2Vec2(this.m_rA,y)+this.m_angularImpulse),a.addMul(l,y),h+=p*(ot.crossVec2Vec2(this.m_rB,y)+this.m_angularImpulse)}else this.m_linearImpulse.setZero(),this.m_angularImpulse=0;this.m_bodyA.c_velocity.v=s,this.m_bodyA.c_velocity.w=o,this.m_bodyB.c_velocity.v=a,this.m_bodyB.c_velocity.w=h},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,s=this.m_bodyB.c_velocity.v,o=this.m_bodyB.c_velocity.w,n=this.m_invMassA,r=this.m_invMassB,a=this.m_invIA,h=this.m_invIB,c=t.dt,m=t.inv_dt,_=o-i+m*this.m_correctionFactor*this.m_angularError,l=-this.m_angularMass*_,u=this.m_angularImpulse,p=c*this.m_maxTorque;this.m_angularImpulse=st.clamp(this.m_angularImpulse+l,-p,p),i-=a*(l=this.m_angularImpulse-u),o+=h*l,(_=ot.zero()).addCombine(1,s,1,ot.crossNumVec2(o,this.m_rB)),_.subCombine(1,e,1,ot.crossNumVec2(i,this.m_rA)),_.addMul(m*this.m_correctionFactor,this.m_linearError);l=ot.neg($t.mulVec2(this.m_linearMass,_)),u=ot.clone(this.m_linearImpulse);this.m_linearImpulse.add(l);p=c*this.m_maxForce;this.m_linearImpulse.clamp(p),l=ot.sub(this.m_linearImpulse,u),e.subMul(n,l),i-=a*ot.crossVec2Vec2(this.m_rA,l),s.addMul(r,l),o+=h*ot.crossVec2Vec2(this.m_rB,l),this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=s,this.m_bodyB.c_velocity.w=o},e.prototype.solvePositionConstraints=function(t){return!0},e.TYPE="motor-joint",e}(St),Ee={maxForce:0,frequencyHz:5,dampingRatio:.7},Re=function(t){function e(i,s,o,n){var r=this;return r instanceof e?(i=it(i,Ee),s=(r=t.call(this,i,s,o)||this).m_bodyA,o=r.m_bodyB,r.m_type=e.TYPE,ot.isValid(n)?r.m_targetA=ot.clone(n):ot.isValid(i.target)?r.m_targetA=ot.clone(i.target):r.m_targetA=ot.zero(),r.m_localAnchorB=ut.mulTVec2(o.getTransform(),r.m_targetA),r.m_maxForce=i.maxForce,r.m_impulse=ot.zero(),r.m_frequencyHz=i.frequencyHz,r.m_dampingRatio=i.dampingRatio,r.m_beta=0,r.m_gamma=0,r.m_rB=ot.zero(),r.m_localCenterB=ot.zero(),r.m_invMassB=0,r.m_invIB=0,r.m_mass=new $t,r.m_C=ot.zero(),r):new e(i,s,o,n)}return tt(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,target:this.m_targetA,maxForce:this.m_maxForce,frequencyHz:this.m_frequencyHz,dampingRatio:this.m_dampingRatio,_localAnchorB:this.m_localAnchorB}},e._deserialize=function(t,i,s){(t=et({},t)).bodyA=s(Ct,t.bodyA,i),t.bodyB=s(Ct,t.bodyB,i),t.target=ot.clone(t.target);var o=new e(t);return t._localAnchorB&&(o.m_localAnchorB=t._localAnchorB),o},e.prototype.setTarget=function(t){0==this.m_bodyB.isAwake()&&this.m_bodyB.setAwake(!0),this.m_targetA=ot.clone(t)},e.prototype.getTarget=function(){return this.m_targetA},e.prototype.setMaxForce=function(t){this.m_maxForce=t},e.prototype.getMaxForce=function(){return this.m_maxForce},e.prototype.setFrequency=function(t){this.m_frequencyHz=t},e.prototype.getFrequency=function(){return this.m_frequencyHz},e.prototype.setDampingRatio=function(t){this.m_dampingRatio=t},e.prototype.getDampingRatio=function(){return this.m_dampingRatio},e.prototype.getAnchorA=function(){return ot.clone(this.m_targetA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return ot.mulNumVec2(t,this.m_impulse)},e.prototype.getReactionTorque=function(t){return 0*t},e.prototype.shiftOrigin=function(t){this.m_targetA.sub(t)},e.prototype.initVelocityConstraints=function(t){this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyB.c_position,i=this.m_bodyB.c_velocity,s=e.c,o=e.a,n=i.v,r=i.w,a=lt.neo(o),h=this.m_bodyB.getMass(),c=2*st.PI*this.m_frequencyHz,m=2*h*this.m_dampingRatio*c,_=h*(c*c),l=t.dt;this.m_gamma=l*(m+l*_),0!=this.m_gamma&&(this.m_gamma=1/this.m_gamma),this.m_beta=l*_*this.m_gamma,this.m_rB=lt.mulVec2(a,ot.sub(this.m_localAnchorB,this.m_localCenterB));var u=new $t;u.ex.x=this.m_invMassB+this.m_invIB*this.m_rB.y*this.m_rB.y+this.m_gamma,u.ex.y=-this.m_invIB*this.m_rB.x*this.m_rB.y,u.ey.x=u.ex.y,u.ey.y=this.m_invMassB+this.m_invIB*this.m_rB.x*this.m_rB.x+this.m_gamma,this.m_mass=u.getInverse(),this.m_C.setVec2(s),this.m_C.addCombine(1,this.m_rB,-1,this.m_targetA),this.m_C.mul(this.m_beta),r*=.98,t.warmStarting?(this.m_impulse.mul(t.dtRatio),n.addMul(this.m_invMassB,this.m_impulse),r+=this.m_invIB*ot.crossVec2Vec2(this.m_rB,this.m_impulse)):this.m_impulse.setZero(),i.v.setVec2(n),i.w=r},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyB.c_velocity,i=ot.clone(e.v),s=e.w,o=ot.crossNumVec2(s,this.m_rB);o.add(i),o.addCombine(1,this.m_C,this.m_gamma,this.m_impulse),o.neg();var n=$t.mulVec2(this.m_mass,o),r=ot.clone(this.m_impulse);this.m_impulse.add(n);var a=t.dt*this.m_maxForce;this.m_impulse.clamp(a),n=ot.sub(this.m_impulse,r),i.addMul(this.m_invMassB,n),s+=this.m_invIB*ot.crossVec2Vec2(this.m_rB,n),e.v.setVec2(i),e.w=s},e.prototype.solvePositionConstraints=function(t){return!0},e.TYPE="mouse-joint",e}(St),Oe={collideConnected:!0},Ye=function(t){function e(i,s,o,n,r,a,h,c){var m=this;return m instanceof e?(i=it(i,Oe),s=(m=t.call(this,i,s,o)||this).m_bodyA,o=m.m_bodyB,m.m_type=e.TYPE,m.m_groundAnchorA=n||(i.groundAnchorA||ot.neo(-1,1)),m.m_groundAnchorB=r||(i.groundAnchorB||ot.neo(1,1)),m.m_localAnchorA=a?s.getLocalPoint(a):i.localAnchorA||ot.neo(-1,0),m.m_localAnchorB=h?o.getLocalPoint(h):i.localAnchorB||ot.neo(1,0),m.m_lengthA=st.isFinite(i.lengthA)?i.lengthA:ot.distance(a,n),m.m_lengthB=st.isFinite(i.lengthB)?i.lengthB:ot.distance(h,r),m.m_ratio=st.isFinite(c)?c:i.ratio,m.m_constant=m.m_lengthA+m.m_ratio*m.m_lengthB,m.m_impulse=0,m):new e(i,s,o,n,r,a,h,c)}return tt(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,groundAnchorA:this.m_groundAnchorA,groundAnchorB:this.m_groundAnchorB,localAnchorA:this.m_localAnchorA,localAnchorB:this.m_localAnchorB,lengthA:this.m_lengthA,lengthB:this.m_lengthB,ratio:this.m_ratio}},e._deserialize=function(t,i,s){return(t=et({},t)).bodyA=s(Ct,t.bodyA,i),t.bodyB=s(Ct,t.bodyB,i),new e(t)},e.prototype.getGroundAnchorA=function(){return this.m_groundAnchorA},e.prototype.getGroundAnchorB=function(){return this.m_groundAnchorB},e.prototype.getLengthA=function(){return this.m_lengthA},e.prototype.getLengthB=function(){return this.m_lengthB},e.prototype.getRatio=function(){return this.m_ratio},e.prototype.getCurrentLengthA=function(){var t=this.m_bodyA.getWorldPoint(this.m_localAnchorA),e=this.m_groundAnchorA;return ot.distance(t,e)},e.prototype.getCurrentLengthB=function(){var t=this.m_bodyB.getWorldPoint(this.m_localAnchorB),e=this.m_groundAnchorB;return ot.distance(t,e)},e.prototype.shiftOrigin=function(t){this.m_groundAnchorA.sub(t),this.m_groundAnchorB.sub(t)},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return ot.mulNumVec2(this.m_impulse,this.m_uB).mul(t)},e.prototype.getReactionTorque=function(t){return 0},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,s=this.m_bodyA.c_velocity.v,o=this.m_bodyA.c_velocity.w,n=this.m_bodyB.c_position.c,r=this.m_bodyB.c_position.a,a=this.m_bodyB.c_velocity.v,h=this.m_bodyB.c_velocity.w,c=lt.neo(i),m=lt.neo(r);this.m_rA=lt.mulVec2(c,ot.sub(this.m_localAnchorA,this.m_localCenterA)),this.m_rB=lt.mulVec2(m,ot.sub(this.m_localAnchorB,this.m_localCenterB)),this.m_uA=ot.sub(ot.add(e,this.m_rA),this.m_groundAnchorA),this.m_uB=ot.sub(ot.add(n,this.m_rB),this.m_groundAnchorB);var _=this.m_uA.length(),l=this.m_uB.length();_>10*rt.linearSlop?this.m_uA.mul(1/_):this.m_uA.setZero(),l>10*rt.linearSlop?this.m_uB.mul(1/l):this.m_uB.setZero();var u=ot.crossVec2Vec2(this.m_rA,this.m_uA),p=ot.crossVec2Vec2(this.m_rB,this.m_uB),d=this.m_invMassA+this.m_invIA*u*u,y=this.m_invMassB+this.m_invIB*p*p;if(this.m_mass=d+this.m_ratio*this.m_ratio*y,this.m_mass>0&&(this.m_mass=1/this.m_mass),t.warmStarting){this.m_impulse*=t.dtRatio;var f=ot.mulNumVec2(-this.m_impulse,this.m_uA),v=ot.mulNumVec2(-this.m_ratio*this.m_impulse,this.m_uB);s.addMul(this.m_invMassA,f),o+=this.m_invIA*ot.crossVec2Vec2(this.m_rA,f),a.addMul(this.m_invMassB,v),h+=this.m_invIB*ot.crossVec2Vec2(this.m_rB,v)}else this.m_impulse=0;this.m_bodyA.c_velocity.v=s,this.m_bodyA.c_velocity.w=o,this.m_bodyB.c_velocity.v=a,this.m_bodyB.c_velocity.w=h},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,s=this.m_bodyB.c_velocity.v,o=this.m_bodyB.c_velocity.w,n=ot.add(e,ot.crossNumVec2(i,this.m_rA)),r=ot.add(s,ot.crossNumVec2(o,this.m_rB)),a=-ot.dot(this.m_uA,n)-this.m_ratio*ot.dot(this.m_uB,r),h=-this.m_mass*a;this.m_impulse+=h;var c=ot.mulNumVec2(-h,this.m_uA),m=ot.mulNumVec2(-this.m_ratio*h,this.m_uB);e.addMul(this.m_invMassA,c),i+=this.m_invIA*ot.crossVec2Vec2(this.m_rA,c),s.addMul(this.m_invMassB,m),o+=this.m_invIB*ot.crossVec2Vec2(this.m_rB,m),this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=s,this.m_bodyB.c_velocity.w=o},e.prototype.solvePositionConstraints=function(t){var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,s=this.m_bodyB.c_position.c,o=this.m_bodyB.c_position.a,n=lt.neo(i),r=lt.neo(o),a=lt.mulVec2(n,ot.sub(this.m_localAnchorA,this.m_localCenterA)),h=lt.mulVec2(r,ot.sub(this.m_localAnchorB,this.m_localCenterB)),c=ot.sub(ot.add(e,this.m_rA),this.m_groundAnchorA),m=ot.sub(ot.add(s,this.m_rB),this.m_groundAnchorB),_=c.length(),l=m.length();_>10*rt.linearSlop?c.mul(1/_):c.setZero(),l>10*rt.linearSlop?m.mul(1/l):m.setZero();var u=ot.crossVec2Vec2(a,c),p=ot.crossVec2Vec2(h,m),d=this.m_invMassA+this.m_invIA*u*u,y=this.m_invMassB+this.m_invIB*p*p,f=d+this.m_ratio*this.m_ratio*y;f>0&&(f=1/f);var v=this.m_constant-_-this.m_ratio*l,x=st.abs(v),g=-f*v,b=ot.mulNumVec2(-g,c),A=ot.mulNumVec2(-this.m_ratio*g,m);return e.addMul(this.m_invMassA,b),i+=this.m_invIA*ot.crossVec2Vec2(a,b),s.addMul(this.m_invMassB,A),o+=this.m_invIB*ot.crossVec2Vec2(h,A),this.m_bodyA.c_position.c=e,this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c=s,this.m_bodyB.c_position.a=o,x0?2:0,!(this.m_length>rt.linearSlop))return this.m_u.setZero(),this.m_mass=0,void(this.m_impulse=0);this.m_u.mul(1/this.m_length);var l=ot.crossVec2Vec2(this.m_rA,this.m_u),u=ot.crossVec2Vec2(this.m_rB,this.m_u),p=this.m_invMassA+this.m_invIA*l*l+this.m_invMassB+this.m_invIB*u*u;if(this.m_mass=0!=p?1/p:0,t.warmStarting){this.m_impulse*=t.dtRatio;var d=ot.mulNumVec2(this.m_impulse,this.m_u);s.subMul(this.m_invMassA,d),o-=this.m_invIA*ot.crossVec2Vec2(this.m_rA,d),a.addMul(this.m_invMassB,d),h+=this.m_invIB*ot.crossVec2Vec2(this.m_rB,d)}else this.m_impulse=0;this.m_bodyA.c_velocity.v.setVec2(s),this.m_bodyA.c_velocity.w=o,this.m_bodyB.c_velocity.v.setVec2(a),this.m_bodyB.c_velocity.w=h},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,s=this.m_bodyB.c_velocity.v,o=this.m_bodyB.c_velocity.w,n=ot.addCrossNumVec2(e,i,this.m_rA),r=ot.addCrossNumVec2(s,o,this.m_rB),a=this.m_length-this.m_maxLength,h=ot.dot(this.m_u,ot.sub(r,n));a<0&&(h+=t.inv_dt*a);var c=-this.m_mass*h,m=this.m_impulse;this.m_impulse=st.min(0,this.m_impulse+c),c=this.m_impulse-m;var _=ot.mulNumVec2(c,this.m_u);e.subMul(this.m_invMassA,_),i-=this.m_invIA*ot.crossVec2Vec2(this.m_rA,_),s.addMul(this.m_invMassB,_),o+=this.m_invIB*ot.crossVec2Vec2(this.m_rB,_),this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=s,this.m_bodyB.c_velocity.w=o},e.prototype.solvePositionConstraints=function(t){var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,s=this.m_bodyB.c_position.c,o=this.m_bodyB.c_position.a,n=lt.neo(i),r=lt.neo(o),a=lt.mulSub(n,this.m_localAnchorA,this.m_localCenterA),h=lt.mulSub(r,this.m_localAnchorB,this.m_localCenterB),c=ot.zero();c.addCombine(1,s,1,h),c.subCombine(1,e,1,a);var m=c.normalize(),_=m-this.m_maxLength;_=st.clamp(_,0,rt.maxLinearCorrection);var l=-this.m_mass*_,u=ot.mulNumVec2(l,c);return e.subMul(this.m_invMassA,u),i-=this.m_invIA*ot.crossVec2Vec2(a,u),s.addMul(this.m_invMassB,u),o+=this.m_invIB*ot.crossVec2Vec2(h,u),this.m_bodyA.c_position.c.setVec2(e),this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c.setVec2(s),this.m_bodyB.c_position.a=o,m-this.m_maxLength0){u.getInverse22(this.m_mass);var p=_+l,d=p>0?1/p:0,y=o-e-this.m_referenceAngle,f=2*st.PI*this.m_frequencyHz,v=2*d*this.m_dampingRatio*f,x=d*f*f,g=t.dt;this.m_gamma=g*(v+g*x),this.m_gamma=0!=this.m_gamma?1/this.m_gamma:0,this.m_bias=y*g*x*this.m_gamma,p+=this.m_gamma,this.m_mass.ez.z=0!=p?1/p:0}else 0==u.ez.z?(u.getInverse22(this.m_mass),this.m_gamma=0,this.m_bias=0):(u.getSymInverse33(this.m_mass),this.m_gamma=0,this.m_bias=0);if(t.warmStarting){this.m_impulse.mul(t.dtRatio);var b=ot.neo(this.m_impulse.x,this.m_impulse.y);i.subMul(c,b),s-=_*(ot.crossVec2Vec2(this.m_rA,b)+this.m_impulse.z),n.addMul(m,b),r+=l*(ot.crossVec2Vec2(this.m_rB,b)+this.m_impulse.z)}else this.m_impulse.setZero();this.m_bodyA.c_velocity.v=i,this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v=n,this.m_bodyB.c_velocity.w=r},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,s=this.m_bodyB.c_velocity.v,o=this.m_bodyB.c_velocity.w,n=this.m_invMassA,r=this.m_invMassB,a=this.m_invIA,h=this.m_invIB;if(this.m_frequencyHz>0){var c=o-i,m=-this.m_mass.ez.z*(c+this.m_bias+this.m_gamma*this.m_impulse.z);this.m_impulse.z+=m,i-=a*m,o+=h*m,(u=ot.zero()).addCombine(1,s,1,ot.crossNumVec2(o,this.m_rB)),u.subCombine(1,e,1,ot.crossNumVec2(i,this.m_rA));var _=ot.neg(Te.mulVec2(this.m_mass,u));this.m_impulse.x+=_.x,this.m_impulse.y+=_.y;var l=ot.clone(_);e.subMul(n,l),i-=a*ot.crossVec2Vec2(this.m_rA,l),s.addMul(r,l),o+=h*ot.crossVec2Vec2(this.m_rB,l)}else{var u;(u=ot.zero()).addCombine(1,s,1,ot.crossNumVec2(o,this.m_rB)),u.subCombine(1,e,1,ot.crossNumVec2(i,this.m_rA));c=o-i;var p=new ye(u.x,u.y,c),d=ye.neg(Te.mulVec3(this.m_mass,p));this.m_impulse.add(d);l=ot.neo(d.x,d.y);e.subMul(n,l),i-=a*(ot.crossVec2Vec2(this.m_rA,l)+d.z),s.addMul(r,l),o+=h*(ot.crossVec2Vec2(this.m_rB,l)+d.z)}this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=s,this.m_bodyB.c_velocity.w=o},e.prototype.solvePositionConstraints=function(t){var e,i,s=this.m_bodyA.c_position.c,o=this.m_bodyA.c_position.a,n=this.m_bodyB.c_position.c,r=this.m_bodyB.c_position.a,a=lt.neo(o),h=lt.neo(r),c=this.m_invMassA,m=this.m_invMassB,_=this.m_invIA,l=this.m_invIB,u=lt.mulVec2(a,ot.sub(this.m_localAnchorA,this.m_localCenterA)),p=lt.mulVec2(h,ot.sub(this.m_localAnchorB,this.m_localCenterB)),d=new Te;if(d.ex.x=c+m+u.y*u.y*_+p.y*p.y*l,d.ey.x=-u.y*u.x*_-p.y*p.x*l,d.ez.x=-u.y*_-p.y*l,d.ex.y=d.ey.x,d.ey.y=c+m+u.x*u.x*_+p.x*p.x*l,d.ez.y=u.x*_+p.x*l,d.ex.z=d.ez.x,d.ey.z=d.ez.y,d.ez.z=_+l,this.m_frequencyHz>0){(f=ot.zero()).addCombine(1,n,1,p),f.subCombine(1,s,1,u),e=f.length(),i=0;var y=ot.neg(d.solve22(f));s.subMul(c,y),o-=_*ot.crossVec2Vec2(u,y),n.addMul(m,y),r+=l*ot.crossVec2Vec2(p,y)}else{var f;(f=ot.zero()).addCombine(1,n,1,p),f.subCombine(1,s,1,u);var v=r-o-this.m_referenceAngle;e=f.length(),i=st.abs(v);var x=new ye(f.x,f.y,v),g=new ye;if(d.ez.z>0)g=ye.neg(d.solve33(x));else{var b=ot.neg(d.solve22(f));g.set(b.x,b.y,0)}y=ot.neo(g.x,g.y);s.subMul(c,y),o-=_*(ot.crossVec2Vec2(u,y)+g.z),n.addMul(m,y),r+=l*(ot.crossVec2Vec2(p,y)+g.z)}return this.m_bodyA.c_position.c=s,this.m_bodyA.c_position.a=o,this.m_bodyB.c_position.c=n,this.m_bodyB.c_position.a=r,e<=rt.linearSlop&&i<=rt.angularSlop},e.TYPE="weld-joint",e}(St),Ze={enableMotor:!1,maxMotorTorque:0,motorSpeed:0,frequencyHz:2,dampingRatio:.7},Ke=function(t){function e(i,s,o,n,r){var a=this;return a instanceof e?(i=it(i,Ze),(a=t.call(this,i,s,o)||this).m_ax=ot.zero(),a.m_ay=ot.zero(),s=a.m_bodyA,o=a.m_bodyB,a.m_type=e.TYPE,a.m_localAnchorA=ot.clone(n?s.getLocalPoint(n):i.localAnchorA||ot.zero()),a.m_localAnchorB=ot.clone(n?o.getLocalPoint(n):i.localAnchorB||ot.zero()),a.m_localXAxisA=ot.clone(r?s.getLocalVector(r):i.localAxisA||i.localAxis||ot.neo(1,0)),a.m_localYAxisA=ot.crossNumVec2(1,a.m_localXAxisA),a.m_mass=0,a.m_impulse=0,a.m_motorMass=0,a.m_motorImpulse=0,a.m_springMass=0,a.m_springImpulse=0,a.m_maxMotorTorque=i.maxMotorTorque,a.m_motorSpeed=i.motorSpeed,a.m_enableMotor=i.enableMotor,a.m_frequencyHz=i.frequencyHz,a.m_dampingRatio=i.dampingRatio,a.m_bias=0,a.m_gamma=0,a):new e(i,s,o,n,r)}return tt(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,enableMotor:this.m_enableMotor,maxMotorTorque:this.m_maxMotorTorque,motorSpeed:this.m_motorSpeed,frequencyHz:this.m_frequencyHz,dampingRatio:this.m_dampingRatio,localAnchorA:this.m_localAnchorA,localAnchorB:this.m_localAnchorB,localAxisA:this.m_localXAxisA}},e._deserialize=function(t,i,s){return(t=et({},t)).bodyA=s(Ct,t.bodyA,i),t.bodyB=s(Ct,t.bodyB,i),new e(t)},e.prototype._setAnchors=function(t){t.anchorA?this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(t.anchorA)):t.localAnchorA&&this.m_localAnchorA.setVec2(t.localAnchorA),t.anchorB?this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(t.anchorB)):t.localAnchorB&&this.m_localAnchorB.setVec2(t.localAnchorB),t.localAxisA&&(this.m_localXAxisA.setVec2(t.localAxisA),this.m_localYAxisA.setVec2(ot.crossNumVec2(1,t.localAxisA)))},e.prototype.getLocalAnchorA=function(){return this.m_localAnchorA},e.prototype.getLocalAnchorB=function(){return this.m_localAnchorB},e.prototype.getLocalAxisA=function(){return this.m_localXAxisA},e.prototype.getJointTranslation=function(){var t=this.m_bodyA,e=this.m_bodyB,i=t.getWorldPoint(this.m_localAnchorA),s=e.getWorldPoint(this.m_localAnchorB),o=ot.sub(s,i),n=t.getWorldVector(this.m_localXAxisA);return ot.dot(o,n)},e.prototype.getJointSpeed=function(){var t=this.m_bodyA.m_angularVelocity;return this.m_bodyB.m_angularVelocity-t},e.prototype.isMotorEnabled=function(){return this.m_enableMotor},e.prototype.enableMotor=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableMotor=t},e.prototype.setMotorSpeed=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_motorSpeed=t},e.prototype.getMotorSpeed=function(){return this.m_motorSpeed},e.prototype.setMaxMotorTorque=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_maxMotorTorque=t},e.prototype.getMaxMotorTorque=function(){return this.m_maxMotorTorque},e.prototype.getMotorTorque=function(t){return t*this.m_motorImpulse},e.prototype.setSpringFrequencyHz=function(t){this.m_frequencyHz=t},e.prototype.getSpringFrequencyHz=function(){return this.m_frequencyHz},e.prototype.setSpringDampingRatio=function(t){this.m_dampingRatio=t},e.prototype.getSpringDampingRatio=function(){return this.m_dampingRatio},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return ot.combine(this.m_impulse,this.m_ay,this.m_springImpulse,this.m_ax).mul(t)},e.prototype.getReactionTorque=function(t){return t*this.m_motorImpulse},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_invMassA,i=this.m_invMassB,s=this.m_invIA,o=this.m_invIB,n=this.m_bodyA.c_position.c,r=this.m_bodyA.c_position.a,a=this.m_bodyA.c_velocity.v,h=this.m_bodyA.c_velocity.w,c=this.m_bodyB.c_position.c,m=this.m_bodyB.c_position.a,_=this.m_bodyB.c_velocity.v,l=this.m_bodyB.c_velocity.w,u=lt.neo(r),p=lt.neo(m),d=lt.mulVec2(u,ot.sub(this.m_localAnchorA,this.m_localCenterA)),y=lt.mulVec2(p,ot.sub(this.m_localAnchorB,this.m_localCenterB)),f=ot.zero();if(f.addCombine(1,c,1,y),f.subCombine(1,n,1,d),this.m_ay=lt.mulVec2(u,this.m_localYAxisA),this.m_sAy=ot.crossVec2Vec2(ot.add(f,d),this.m_ay),this.m_sBy=ot.crossVec2Vec2(y,this.m_ay),this.m_mass=e+i+s*this.m_sAy*this.m_sAy+o*this.m_sBy*this.m_sBy,this.m_mass>0&&(this.m_mass=1/this.m_mass),this.m_springMass=0,this.m_bias=0,this.m_gamma=0,this.m_frequencyHz>0){this.m_ax=lt.mulVec2(u,this.m_localXAxisA),this.m_sAx=ot.crossVec2Vec2(ot.add(f,d),this.m_ax),this.m_sBx=ot.crossVec2Vec2(y,this.m_ax);var v=e+i+s*this.m_sAx*this.m_sAx+o*this.m_sBx*this.m_sBx;if(v>0){this.m_springMass=1/v;var x=ot.dot(f,this.m_ax),g=2*st.PI*this.m_frequencyHz,b=2*this.m_springMass*this.m_dampingRatio*g,A=this.m_springMass*g*g,B=t.dt;this.m_gamma=B*(b+B*A),this.m_gamma>0&&(this.m_gamma=1/this.m_gamma),this.m_bias=x*B*A*this.m_gamma,this.m_springMass=v+this.m_gamma,this.m_springMass>0&&(this.m_springMass=1/this.m_springMass)}}else this.m_springImpulse=0;if(this.m_enableMotor?(this.m_motorMass=s+o,this.m_motorMass>0&&(this.m_motorMass=1/this.m_motorMass)):(this.m_motorMass=0,this.m_motorImpulse=0),t.warmStarting){this.m_impulse*=t.dtRatio,this.m_springImpulse*=t.dtRatio,this.m_motorImpulse*=t.dtRatio;var w=ot.combine(this.m_impulse,this.m_ay,this.m_springImpulse,this.m_ax),V=this.m_impulse*this.m_sAy+this.m_springImpulse*this.m_sAx+this.m_motorImpulse,C=this.m_impulse*this.m_sBy+this.m_springImpulse*this.m_sBx+this.m_motorImpulse;a.subMul(this.m_invMassA,w),h-=this.m_invIA*V,_.addMul(this.m_invMassB,w),l+=this.m_invIB*C}else this.m_impulse=0,this.m_springImpulse=0,this.m_motorImpulse=0;this.m_bodyA.c_velocity.v.setVec2(a),this.m_bodyA.c_velocity.w=h,this.m_bodyB.c_velocity.v.setVec2(_),this.m_bodyB.c_velocity.w=l},e.prototype.solveVelocityConstraints=function(t){var e=this.m_invMassA,i=this.m_invMassB,s=this.m_invIA,o=this.m_invIB,n=this.m_bodyA.c_velocity.v,r=this.m_bodyA.c_velocity.w,a=this.m_bodyB.c_velocity.v,h=this.m_bodyB.c_velocity.w,c=ot.dot(this.m_ax,a)-ot.dot(this.m_ax,n)+this.m_sBx*h-this.m_sAx*r,m=-this.m_springMass*(c+this.m_bias+this.m_gamma*this.m_springImpulse);this.m_springImpulse+=m;var _=ot.mulNumVec2(m,this.m_ax),l=m*this.m_sAx,u=m*this.m_sBx;n.subMul(e,_),r-=s*l,a.addMul(i,_);c=(h+=o*u)-r-this.m_motorSpeed,m=-this.m_motorMass*c;var p=this.m_motorImpulse,d=t.dt*this.m_maxMotorTorque;this.m_motorImpulse=st.clamp(this.m_motorImpulse+m,-d,d),r-=s*(m=this.m_motorImpulse-p),h+=o*m;c=ot.dot(this.m_ay,a)-ot.dot(this.m_ay,n)+this.m_sBy*h-this.m_sAy*r,m=-this.m_mass*c;this.m_impulse+=m;_=ot.mulNumVec2(m,this.m_ay),l=m*this.m_sAy,u=m*this.m_sBy;n.subMul(e,_),r-=s*l,a.addMul(i,_),h+=o*u,this.m_bodyA.c_velocity.v.setVec2(n),this.m_bodyA.c_velocity.w=r,this.m_bodyB.c_velocity.v.setVec2(a),this.m_bodyB.c_velocity.w=h},e.prototype.solvePositionConstraints=function(t){var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,s=this.m_bodyB.c_position.c,o=this.m_bodyB.c_position.a,n=lt.neo(i),r=lt.neo(o),a=lt.mulVec2(n,ot.sub(this.m_localAnchorA,this.m_localCenterA)),h=lt.mulVec2(r,ot.sub(this.m_localAnchorB,this.m_localCenterB)),c=ot.zero();c.addCombine(1,s,1,h),c.subCombine(1,e,1,a);var m,_=lt.mulVec2(n,this.m_localYAxisA),l=ot.crossVec2Vec2(ot.add(c,a),_),u=ot.crossVec2Vec2(h,_),p=ot.dot(c,_),d=this.m_invMassA+this.m_invMassB+this.m_invIA*this.m_sAy*this.m_sAy+this.m_invIB*this.m_sBy*this.m_sBy;m=0!=d?-p/d:0;var y=ot.mulNumVec2(m,_),f=m*l,v=m*u;return e.subMul(this.m_invMassA,y),i-=this.m_invIA*f,s.addMul(this.m_invMassB,y),o+=this.m_invIB*v,this.m_bodyA.c_position.c.setVec2(e),this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c.setVec2(s),this.m_bodyB.c_position.a=o,st.abs(p)<=rt.linearSlop},e.TYPE="wheel-joint",e}(St),Ge=0;function Ue(t){var e,i=(t=t||{}).rootClass||de,s=t.preSerialize||function(t){return t},o=t.postSerialize||function(t,e){return t},n=t.preDeserialize||function(t){return t},r=t.postDeserialize||function(t,e){return t},a={World:de,Body:Ct,Joint:St,Fixture:gt,Shape:ft},h=et({Vec2:ot,Vec3:ye},a),c=((e={})[Ct.STATIC]=Ct,e[Ct.DYNAMIC]=Ct,e[Ct.KINEMATIC]=Ct,e[xe.TYPE]=xe,e[Be.TYPE]=Be,e[fe.TYPE]=fe,e[be.TYPE]=be,e[Ve.TYPE]=Ve,e[Se.TYPE]=Se,e[Pe.TYPE]=Pe,e[Ne.TYPE]=Ne,e[De.TYPE]=De,e[Re.TYPE]=Re,e[Le.TYPE]=Le,e[Ye.TYPE]=Ye,e[ke.TYPE]=ke,e[Je.TYPE]=Je,e[He.TYPE]=He,e[Ke.TYPE]=Ke,e);this.toJson=function(t){var e=[],i=[t],n={};function r(t,s){if(t.__sid=t.__sid||++Ge,!n[t.__sid]){i.push(t);var o={refIndex:e.length+i.length,refType:s};n[t.__sid]=o}return n[t.__sid]}function h(t,e){if("object"!=typeof t||null===t)return t;if("function"==typeof t._serialize){if(t!==e)for(var i in a)if(t instanceof a[i])return r(t,i);t=function(t){var e=(t=s(t))._serialize();return o(e,t)}(t)}if(Array.isArray(t)){for(var n=[],c=0;cc*c||(e.type=t.ManifoldType.e_circles,e.localPoint.setVec2(i.m_p),e.localNormal.setZero(),e.pointCount=1,e.points[0].localPoint.setVec2(o.m_p),e.points[0].id.cf.indexA=0,e.points[0].id.cf.typeA=t.ContactFeatureType.e_vertex,e.points[0].id.cf.indexB=0,e.points[0].id.cf.typeB=t.ContactFeatureType.e_vertex)};ue.addType(fe.TYPE,Ve.TYPE,(function(t,e,i,s,o,n,r){var a=i.getShape(),h=n.getShape();ti(t,a,e,h,o)})),ue.addType(xe.TYPE,Ve.TYPE,(function(t,e,i,s,o,n,r){var a=i.getShape(),h=new fe;a.getChildEdge(h,s);var c=h,m=n.getShape();ti(t,c,e,m,o)}));var ti=function(e,i,s,o,n){e.pointCount=0;var r=ut.mulTVec2(s,ut.mulVec2(n,o.m_p)),a=i.m_vertex1,h=i.m_vertex2,c=ot.sub(h,a),m=ot.dot(c,ot.sub(h,r)),_=ot.dot(c,ot.sub(r,a)),l=i.m_radius+o.m_radius;if(_<=0){var u=ot.clone(a),p=ot.sub(r,u);if(ot.dot(p,p)>l*l)return;if(i.m_hasVertex0){var d=i.m_vertex0,y=a,f=ot.sub(y,d);if(ot.dot(f,ot.sub(y,r))>0)return}return e.type=t.ManifoldType.e_circles,e.localNormal.setZero(),e.localPoint.setVec2(u),e.pointCount=1,e.points[0].localPoint.setVec2(o.m_p),e.points[0].id.cf.indexA=0,e.points[0].id.cf.typeA=t.ContactFeatureType.e_vertex,e.points[0].id.cf.indexB=0,void(e.points[0].id.cf.typeB=t.ContactFeatureType.e_vertex)}if(m<=0){var v=ot.clone(h),x=ot.sub(r,v);if(ot.dot(x,x)>l*l)return;if(i.m_hasVertex3){var g=i.m_vertex3,b=h,A=ot.sub(g,b);if(ot.dot(A,ot.sub(r,b))>0)return}return e.type=t.ManifoldType.e_circles,e.localNormal.setZero(),e.localPoint.setVec2(v),e.pointCount=1,e.points[0].localPoint.setVec2(o.m_p),e.points[0].id.cf.indexA=1,e.points[0].id.cf.typeA=t.ContactFeatureType.e_vertex,e.points[0].id.cf.indexB=0,void(e.points[0].id.cf.typeB=t.ContactFeatureType.e_vertex)}var B=ot.dot(c,c),w=ot.combine(m/B,a,_/B,h),V=ot.sub(r,w);if(!(ot.dot(V,V)>l*l)){var C=ot.neo(-c.y,c.x);ot.dot(C,ot.sub(r,a))<0&&C.setNum(-C.x,-C.y),C.normalize(),e.type=t.ManifoldType.e_faceA,e.localNormal=C,e.localPoint.setVec2(a),e.pointCount=1,e.points[0].localPoint.setVec2(o.m_p),e.points[0].id.cf.indexA=0,e.points[0].id.cf.typeA=t.ContactFeatureType.e_face,e.points[0].id.cf.indexB=0,e.points[0].id.cf.typeB=t.ContactFeatureType.e_vertex}};function ei(t,e,i,s,o){for(var n=t.m_count,r=i.m_count,a=t.m_normals,h=t.m_vertices,c=i.m_vertices,m=ut.mulTXf(s,e),_=0,l=-1/0,u=0;ul&&(l=y,_=u)}o.maxSeparation=l,o.bestIndex=_}ue.addType(be.TYPE,be.TYPE,(function(t,e,i,s,o,n,r){si(t,i.getShape(),e,n.getShape(),o)}));var ii={maxSeparation:0,bestIndex:0},si=function(e,i,s,o,n){e.pointCount=0;var r=i.m_radius+o.m_radius;ei(i,s,o,n,ii);var a=ii.bestIndex,h=ii.maxSeparation;if(!(h>r)){ei(o,n,i,s,ii);var c=ii.bestIndex,m=ii.maxSeparation;if(!(m>r)){var _,l,u,p,d,y;m>h+.1*rt.linearSlop?(_=o,l=i,u=n,p=s,d=c,e.type=t.ManifoldType.e_faceB,y=1):(_=i,l=o,u=s,p=n,d=a,e.type=t.ManifoldType.e_faceA,y=0);var f=[new te,new te];!function(e,i,s,o,n,r){for(var a=i.m_normals,h=n.m_count,c=n.m_vertices,m=n.m_normals,_=lt.mulTVec2(r.q,lt.mulVec2(s.q,a[o])),l=0,u=1/0,p=0;pm)return;d>c&&(c=d,h=p)}var y=h,f=y+1<_?y+1:0,v=l[y],x=l[f];if(cm*m)return;e.pointCount=1,e.type=t.ManifoldType.e_faceA,e.localNormal.setCombine(1,a,-1,v),e.localNormal.normalize(),e.localPoint=v,e.points[0].localPoint.setVec2(o.m_p),e.points[0].id.cf.indexA=0,e.points[0].id.cf.typeA=t.ContactFeatureType.e_vertex,e.points[0].id.cf.indexB=0,e.points[0].id.cf.typeB=t.ContactFeatureType.e_vertex}else if(b<=0){if(ot.distanceSquared(a,x)>m*m)return;e.pointCount=1,e.type=t.ManifoldType.e_faceA,e.localNormal.setCombine(1,a,-1,x),e.localNormal.normalize(),e.localPoint.setVec2(x),e.points[0].localPoint.setVec2(o.m_p),e.points[0].id.cf.indexA=0,e.points[0].id.cf.typeA=t.ContactFeatureType.e_vertex,e.points[0].id.cf.indexB=0,e.points[0].id.cf.typeB=t.ContactFeatureType.e_vertex}else{var A=ot.mid(v,x);if(ot.dot(a,u[y])-ot.dot(A,u[y])>m)return;e.pointCount=1,e.type=t.ManifoldType.e_faceA,e.localNormal.setVec2(u[y]),e.localPoint.setVec2(A),e.points[0].localPoint.setVec2(o.m_p),e.points[0].id.cf.indexA=0,e.points[0].id.cf.typeA=t.ContactFeatureType.e_vertex,e.points[0].id.cf.indexB=0,e.points[0].id.cf.typeB=t.ContactFeatureType.e_vertex}};ue.addType(fe.TYPE,be.TYPE,(function(t,e,i,s,o,n,r){pi(t,i.getShape(),e,n.getShape(),o)})),ue.addType(xe.TYPE,be.TYPE,(function(t,e,i,s,o,n,r){var a=i.getShape(),h=new fe;a.getChildEdge(h,s),pi(t,h,e,n.getShape(),o)})),function(t){t[t.e_unknown=-1]="e_unknown",t[t.e_edgeA=1]="e_edgeA",t[t.e_edgeB=2]="e_edgeB"}(oi||(oi={})),function(t){t[t.e_isolated=0]="e_isolated",t[t.e_concave=1]="e_concave",t[t.e_convex=2]="e_convex"}(ni||(ni={}));var ai=function(){},hi=function(){this.vertices=[],this.normals=[],this.count=0},ci=function(){this.normal=ot.zero(),this.sideNormal1=ot.zero(),this.sideNormal2=ot.zero()},mi=new ai,_i=new ai,li=new hi,ui=new ci,pi=function(e,i,s,o,n){var r=ut.mulTXf(s,n),a=ut.mulVec2(r,o.m_centroid),h=i.m_vertex0,c=i.m_vertex1,m=i.m_vertex2,_=i.m_vertex3,l=i.m_hasVertex0,u=i.m_hasVertex3,p=ot.sub(m,c);p.normalize();var d,y,f,v=ot.neo(p.y,-p.x),x=ot.dot(v,ot.sub(a,c)),g=0,b=0,A=!1,B=!1;if(l){var w=ot.sub(c,h);w.normalize(),d=ot.neo(w.y,-w.x),A=ot.crossVec2Vec2(w,p)>=0,g=ot.dot(d,a)-ot.dot(d,h)}if(u){var V=ot.sub(_,m);V.normalize(),y=ot.neo(V.y,-V.x),B=ot.crossVec2Vec2(p,V)>0,b=ot.dot(y,a)-ot.dot(y,m)}var C=ot.zero(),M=ot.zero(),S=ot.zero();l&&u?A&&B?(f=g>=0||x>=0||b>=0)?(C.setVec2(v),M.setVec2(d),S.setVec2(y)):(C.setMul(-1,v),M.setMul(-1,v),S.setMul(-1,v)):A?(f=g>=0||x>=0&&b>=0)?(C.setVec2(v),M.setVec2(d),S.setVec2(v)):(C.setMul(-1,v),M.setMul(-1,y),S.setMul(-1,v)):B?(f=b>=0||g>=0&&x>=0)?(C.setVec2(v),M.setVec2(v),S.setVec2(y)):(C.setMul(-1,v),M.setMul(-1,v),S.setMul(-1,d)):(f=g>=0&&x>=0&&b>=0)?(C.setVec2(v),M.setVec2(v),S.setVec2(v)):(C.setMul(-1,v),M.setMul(-1,y),S.setMul(-1,d)):l?A?(f=g>=0||x>=0)?(C.setVec2(v),M.setVec2(d),S.setMul(-1,v)):(C.setMul(-1,v),M.setVec2(v),S.setMul(-1,v)):(f=g>=0&&x>=0)?(C.setVec2(v),M.setVec2(v),S.setMul(-1,v)):(C.setMul(-1,v),M.setVec2(v),S.setMul(-1,d)):u?B?(f=x>=0||b>=0)?(C.setVec2(v),M.setMul(-1,v),S.setVec2(y)):(C.setMul(-1,v),M.setMul(-1,v),S.setVec2(v)):(f=x>=0&&b>=0)?(C.setVec2(v),M.setMul(-1,v),S.setVec2(v)):(C.setMul(-1,v),M.setMul(-1,y),S.setVec2(v)):(f=x>=0)?(C.setVec2(v),M.setMul(-1,v),S.setMul(-1,v)):(C.setMul(-1,v),M.setVec2(v),S.setVec2(v)),li.count=o.m_count;for(var I=0;IP)){_i.type=oi.e_unknown,_i.index=-1,_i.separation=-1/0;var T=ot.neo(-C.y,C.x);for(I=0;IP){_i.type=oi.e_edgeB,_i.index=I,_i.separation=z;break}if(ot.dot(k,T)>=0){if(ot.dot(ot.sub(k,S),C)<-rt.angularSlop)continue}else if(ot.dot(ot.sub(k,M),C)<-rt.angularSlop)continue;z>_i.separation&&(_i.type=oi.e_edgeB,_i.index=I,_i.separation=z)}if(!(_i.type!=oi.e_unknown&&_i.separation>P)){var q;q=_i.type==oi.e_unknown?mi:_i.separation>.98*mi.separation+.001?_i:mi;var N=[new te,new te];if(q.type==oi.e_edgeA){e.type=t.ManifoldType.e_faceA;var j=0,D=ot.dot(C,li.normals[0]);for(I=1;Is;)t.step(s),o-=s;return i.renderWorld(),!0}),!0),t.on("remove-fixture",(function(t){t.ui&&t.ui.remove()})),t.on("remove-joint",(function(t){t.ui&&t.ui.remove()}))}fi._super=Q.Node,fi.prototype=Object.create(fi._super.prototype),fi.prototype.renderWorld=function(){for(var t=this._world,e=this._options,i=this,s=t.getBodyList();s;s=s.getNext())for(var o=s.getFixtureList();o;o=o.getNext()){if(!o.ui){o.render&&o.render.stroke?e.strokeStyle=o.render.stroke:s.render&&s.render.stroke?e.strokeStyle=s.render.stroke:s.isDynamic()?e.strokeStyle="rgba(255,255,255,0.9)":s.isKinematic()?e.strokeStyle="rgba(255,255,255,0.7)":s.isStatic()&&(e.strokeStyle="rgba(255,255,255,0.5)"),o.render&&o.render.fill?e.fillStyle=o.render.fill:s.render&&s.render.fill?e.fillStyle=s.render.fill:e.fillStyle="";var n=o.getType(),r=o.getShape();"circle"==n&&(o.ui=i.drawCircle(r,e)),"edge"==n&&(o.ui=i.drawEdge(r,e)),"polygon"==n&&(o.ui=i.drawPolygon(r,e)),"chain"==n&&(o.ui=i.drawChain(r,e)),o.ui&&o.ui.appendTo(i)}if(o.ui){var a=s.getPosition(),h=s.getAngle();o.ui.__lastX===a.x&&o.ui.__lastY===a.y&&o.ui.__lastR===h||(o.ui.__lastX=a.x,o.ui.__lastY=a.y,o.ui.__lastR=h,o.ui.offset(a.x,e.scaleY*a.y),o.ui.rotate(e.scaleY*h))}}for(var c=t.getJointList();c;c=c.getNext()){n=c.getType();var m=c.getAnchorA();s=c.getAnchorB();if(c.ui||(e.strokeStyle="rgba(255,255,255,0.2)",c.ui=i.drawJoint(c,e),c.ui.pin("handle",.5),c.ui&&c.ui.appendTo(i)),c.ui){var _=.5*(m.x+s.x),l=e.scaleY*(m.y+s.y)*.5,u=m.x-s.x,p=e.scaleY*(m.y-s.y),d=Math.sqrt(u*u+p*p);c.ui.width(d),c.ui.rotate(Math.atan2(p,u)),c.ui.offset(_,l)}}},fi.prototype.drawJoint=function(t,e){var i=e.lineWidth,s=e.ratio,o=Q.canvas((function(t){this.size(10+2*i,2*i,s),t.scale(s,s),t.beginPath(),t.moveTo(i,i),t.lineTo(i+10,i),t.lineCap="round",t.lineWidth=e.lineWidth,t.strokeStyle=e.strokeStyle,t.stroke()}));return Q.image(o).stretch()},fi.prototype.drawCircle=function(t,e){var i=e.lineWidth,s=e.ratio,o=t.m_radius,n=o+i,r=o+i,a=2*o+2*i,h=2*o+2*i,c=Q.canvas((function(t){this.size(a,h,s),t.scale(s,s),t.arc(n,r,o,0,2*Math.PI),e.fillStyle&&(t.fillStyle=e.fillStyle,t.fill()),t.lineTo(n,r),t.lineWidth=e.lineWidth,t.strokeStyle=e.strokeStyle,t.stroke()})),m=Q.image(c).offset(t.m_p.x-n,e.scaleY*t.m_p.y-r);return Q.create().append(m)},fi.prototype.drawEdge=function(t,e){var i=e.lineWidth,s=e.ratio,o=t.m_vertex1,n=t.m_vertex2,r=n.x-o.x,a=n.y-o.y,h=Math.sqrt(r*r+a*a),c=Q.canvas((function(t){this.size(h+2*i,2*i,s),t.scale(s,s),t.beginPath(),t.moveTo(i,i),t.lineTo(i+h,i),t.lineCap="round",t.lineWidth=e.lineWidth,t.strokeStyle=e.strokeStyle,t.stroke()})),m=Math.min(o.x,n.x),_=Math.min(e.scaleY*o.y,e.scaleY*n.y),l=Q.image(c);return l.rotate(e.scaleY*Math.atan2(a,r)),l.offset(m-i,_-i),Q.create().append(l)},fi.prototype.drawPolygon=function(t,e){var i=e.lineWidth,s=e.ratio,o=t.m_vertices;if(o.length){for(var n=1/0,r=1/0,a=-1/0,h=-1/0,c=0;c2&&t.closePath(),e.fillStyle&&(t.fillStyle=e.fillStyle,t.fill(),t.closePath()),t.lineCap="round",t.lineWidth=e.lineWidth,t.strokeStyle=e.strokeStyle,t.stroke()})),p=Q.image(u);return p.offset(n-i,r-i),Q.create().append(p)}},fi.prototype.drawChain=function(t,e){var i=e.lineWidth,s=e.ratio,o=t.m_vertices;if(o.length){for(var n=1/0,r=1/0,a=-1/0,h=-1/0,c=0;c= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","export default function(input: T, defaults: object): T {\n if (input === null || typeof input === 'undefined') {\n // tslint:disable-next-line:no-object-literal-type-assertion\n input = {} as T;\n }\n\n const output = {...input};\n\n // tslint:disable-next-line:no-for-in\n for (const key in defaults) {\n if (defaults.hasOwnProperty(key) && typeof input[key] === 'undefined') {\n output[key] = defaults[key];\n }\n }\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n const symbols = Object.getOwnPropertySymbols(defaults);\n for (let i = 0; i < symbols.length; i++) {\n const symbol = symbols[i];\n if (defaults.propertyIsEnumerable(symbol) && typeof input[symbol] === 'undefined') {\n output[symbol] = defaults[symbol];\n }\n }\n }\n\n return output;\n}\n","const _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\nexport const debug = function(...rest: any[]): void {\n if (!_DEBUG) return;\n console.log.apply(console, arguments);\n};\n\nexport const assert = function(statement: boolean, err?: string, log?: any): void {\n if (!_ASSERT) return;\n if (statement) return;\n log && console.log(log);\n throw new Error(err);\n};\n\nexport default {\n assert,\n debug,\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst math: Math & {\n readonly EPSILON: number;\n /**\n * This function is used to ensure that a floating point number is not a NaN or\n * infinity.\n */\n isFinite(x: any): boolean;\n assert(x: any): void;\n /**\n * This is a approximate yet fast inverse square-root (todo).\n */\n invSqrt(x: number): number;\n /**\n * Next Largest Power of 2 Given a binary integer value x, the next largest\n * power of 2 can be computed by a SWAR algorithm that recursively \"folds\" the\n * upper bits into the lower bits. This process yields a bit vector with the\n * same most significant 1 as x, but all 1's below it. Adding 1 to that value\n * yields the next largest power of 2. For a 32-bit value:\n */\n nextPowerOfTwo(x: number): number;\n isPowerOfTwo(x: number): boolean;\n mod(num: number, min?: number, max?: number): number;\n /**\n * Returns a min if num is less than min, and max if more than max, otherwise returns num.\n */\n clamp(num: number, min: number, max: number): number;\n /**\n * Returns a random number between min and max when two arguments are provided.\n * If one arg is provided between 0 to max.\n * If one arg is passed between 0 to 1.\n */\n random(min?: number, max?: number): number;\n} = Object.create(Math);\n\nexport default math;\n\n// @ts-ignore\n// noinspection JSConstantReassignment\nmath.EPSILON = 1e-9; // TODO\n\nmath.isFinite = function(x: unknown): boolean {\n return (typeof x === 'number') && isFinite(x) && !isNaN(x);\n};\n\nmath.assert = function(x: any): void {\n if (!_ASSERT) return;\n if (!math.isFinite(x)) {\n _DEBUG && common.debug(x);\n throw new Error('Invalid Number!');\n }\n};\n\nmath.invSqrt = function(x: number): number {\n // TODO:\n return 1 / Math.sqrt(x);\n};\n\nmath.nextPowerOfTwo = function(x: number): number {\n // TODO\n x |= (x >> 1);\n x |= (x >> 2);\n x |= (x >> 4);\n x |= (x >> 8);\n x |= (x >> 16);\n return x + 1;\n};\n\nmath.isPowerOfTwo = function(x: number): boolean {\n return x > 0 && (x & (x - 1)) === 0;\n};\n\nmath.mod = function(num: number, min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n if (max > min) {\n num = (num - min) % (max - min);\n return num + (num < 0 ? max : min);\n } else {\n num = (num - max) % (min - max);\n return num + (num <= 0 ? min : max);\n }\n};\n\nmath.clamp = function(num: number, min: number, max: number): number {\n if (num < min) {\n return min;\n } else if (num > max) {\n return max;\n } else {\n return num;\n }\n};\n\nmath.random = function(min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n return min === max ? min : Math.random() * (max - min) + min;\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Vec2 from '../common/Vec2';\nimport Transform from '../common/Transform';\nimport Math from '../common/Math';\nimport Rot from '../common/Rot';\n\nexport enum ManifoldType {\n e_circles = 0,\n e_faceA = 1,\n e_faceB = 2\n}\n\nexport enum ContactFeatureType {\n e_vertex = 0,\n e_face = 1\n}\n\n/**\n * This is used for determining the state of contact points.\n */\n export enum PointState {\n /** Point does not exist */\n nullState = 0,\n /** Point was added in the update */\n addState = 1,\n /** Point persisted across the update */\n persistState = 2,\n /** Point was removed in the update */\n removeState = 3\n}\n\n/**\n * Used for computing contact manifolds.\n */\n export class ClipVertex {\n v: Vec2 = Vec2.zero();\n id: ContactID = new ContactID();\n\n set(o: ClipVertex): void {\n this.v.setVec2(o.v);\n this.id.set(o.id);\n }\n}\n\n/**\n * A manifold for two touching convex shapes. Manifolds are created in `evaluate`\n * method of Contact subclasses.\n *\n * Supported manifold types are e_faceA or e_faceB for clip point versus plane\n * with radius and e_circles point versus point with radius.\n *\n * We store contacts in this way so that position correction can account for\n * movement, which is critical for continuous physics. All contact scenarios\n * must be expressed in one of these types. This structure is stored across time\n * steps, so we keep it small.\n *\n * @prop type e_circle, e_faceA, e_faceB\n * @prop localPoint Usage depends on manifold type:
\n * e_circles: the local center of circleA
\n * e_faceA: the center of faceA
\n * e_faceB: the center of faceB\n * @prop localNormal Usage depends on manifold type:
\n * e_circles: not used
\n * e_faceA: the normal on polygonA
\n * e_faceB: the normal on polygonB\n * @prop points The points of contact {ManifoldPoint[]}\n * @prop pointCount The number of manifold points\n */\nexport default class Manifold {\n type: ManifoldType;\n localNormal: Vec2 = Vec2.zero();\n localPoint: Vec2 = Vec2.zero();\n points: ManifoldPoint[] = [ new ManifoldPoint(), new ManifoldPoint() ];\n pointCount: number = 0;\n\n /**\n * Evaluate the manifold with supplied transforms. This assumes modest motion\n * from the original state. This does not change the point count, impulses, etc.\n * The radii must come from the shapes that generated the manifold.\n */\n getWorldManifold(wm: WorldManifold | undefined, xfA: Transform, radiusA: number, xfB: Transform, radiusB: number): WorldManifold {\n if (this.pointCount == 0) {\n return;\n }\n\n wm = wm || new WorldManifold();\n\n let normal = wm.normal;\n const points = wm.points;\n const separations = wm.separations;\n\n // TODO: improve\n switch (this.type) {\n case ManifoldType.e_circles: {\n normal = Vec2.neo(1.0, 0.0);\n const pointA = Transform.mulVec2(xfA, this.localPoint);\n const pointB = Transform.mulVec2(xfB, this.points[0].localPoint);\n const dist = Vec2.sub(pointB, pointA);\n if (Vec2.lengthSquared(dist) > Math.EPSILON * Math.EPSILON) {\n normal.setVec2(dist);\n normal.normalize();\n }\n const cA = pointA.clone().addMul(radiusA, normal);\n const cB = pointB.clone().addMul(-radiusB, normal);\n points[0] = Vec2.mid(cA, cB);\n separations[0] = Vec2.dot(Vec2.sub(cB, cA), normal);\n points.length = 1;\n separations.length = 1;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfA, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfB, this.points[i].localPoint);\n const cA = Vec2.clone(clipPoint).addMul(radiusA - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cB = Vec2.clone(clipPoint).subMul(radiusB, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cB, cA), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfB, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfA, this.points[i].localPoint);\n const cB = Vec2.combine(1, clipPoint, radiusB - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cA = Vec2.combine(1, clipPoint, -radiusA, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cA, cB), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n // Ensure normal points from A to B.\n normal.mul(-1);\n break;\n }\n }\n\n wm.normal = normal;\n wm.points = points;\n wm.separations = separations;\n return wm;\n }\n\n static clipSegmentToLine = clipSegmentToLine;\n static ClipVertex = ClipVertex;\n static getPointStates = getPointStates;\n static PointState = PointState;\n}\n\n/**\n * A manifold point is a contact point belonging to a contact manifold. It holds\n * details related to the geometry and dynamics of the contact points.\n *\n * This structure is stored across time steps, so we keep it small.\n *\n * Note: impulses are used for internal caching and may not provide reliable\n * contact forces, especially for high speed collisions.\n */\nexport class ManifoldPoint {\n /**\n * Usage depends on manifold type.\n * e_circles: the local center of circleB,\n * e_faceA: the local center of cirlceB or the clip point of polygonB,\n * e_faceB: the clip point of polygonA.\n */\n localPoint: Vec2 = Vec2.zero();\n /**\n * The non-penetration impulse\n */\n normalImpulse: number = 0;\n /**\n * The friction impulse\n */\n tangentImpulse: number = 0;\n /**\n * Uniquely identifies a contact point between two shapes to facilatate warm starting\n */\n id: ContactID = new ContactID();\n}\n\n/**\n * Contact ids to facilitate warm starting.\n */\nexport class ContactID {\n cf: ContactFeature = new ContactFeature();\n\n /**\n * Used to quickly compare contact ids.\n */\n get key(): number {\n return this.cf.indexA + this.cf.indexB * 4 + this.cf.typeA * 16 + this.cf.typeB * 64;\n }\n\n set(o: ContactID): void {\n // this.key = o.key;\n this.cf.set(o.cf);\n }\n}\n\n/**\n * The features that intersect to form the contact point.\n */\nexport class ContactFeature {\n /**\n * Feature index on shapeA\n */\n indexA: number;\n /**\n * Feature index on shapeB\n */\n indexB: number;\n /**\n * The feature type on shapeA\n */\n typeA: ContactFeatureType;\n /**\n * The feature type on shapeB\n */\n typeB: ContactFeatureType;\n set(o: ContactFeature): void {\n this.indexA = o.indexA;\n this.indexB = o.indexB;\n this.typeA = o.typeA;\n this.typeB = o.typeB;\n }\n}\n\n/**\n * This is used to compute the current state of a contact manifold.\n */\nexport class WorldManifold {\n /**\n * World vector pointing from A to B\n */\n normal: Vec2;\n /**\n * World contact point (point of intersection)\n */\n points: Vec2[] = []; // [maxManifoldPoints]\n /**\n * A negative value indicates overlap, in meters\n */\n separations: number[] = []; // [maxManifoldPoints]\n}\n\n/**\n * Compute the point states given two manifolds. The states pertain to the\n * transition from manifold1 to manifold2. So state1 is either persist or remove\n * while state2 is either add or persist.\n */\nexport function getPointStates(\n state1: PointState[],\n state2: PointState[],\n manifold1: Manifold,\n manifold2: Manifold\n): void {\n // state1, state2: PointState[Settings.maxManifoldPoints]\n\n // for (var i = 0; i < Settings.maxManifoldPoints; ++i) {\n // state1[i] = PointState.nullState;\n // state2[i] = PointState.nullState;\n // }\n\n // Detect persists and removes.\n for (let i = 0; i < manifold1.pointCount; ++i) {\n const id = manifold1.points[i].id;\n\n state1[i] = PointState.removeState;\n\n for (let j = 0; j < manifold2.pointCount; ++j) {\n if (manifold2.points[j].id.key == id.key) {\n state1[i] = PointState.persistState;\n break;\n }\n }\n }\n\n // Detect persists and adds.\n for (let i = 0; i < manifold2.pointCount; ++i) {\n const id = manifold2.points[i].id;\n\n state2[i] = PointState.addState;\n\n for (let j = 0; j < manifold1.pointCount; ++j) {\n if (manifold1.points[j].id.key == id.key) {\n state2[i] = PointState.persistState;\n break;\n }\n }\n }\n}\n\n/**\n * Clipping for contact manifolds. Sutherland-Hodgman clipping.\n */\nexport function clipSegmentToLine(\n vOut: ClipVertex[],\n vIn: ClipVertex[],\n normal: Vec2,\n offset: number,\n vertexIndexA: number\n): number {\n // Start with no output points\n let numOut = 0;\n\n // Calculate the distance of end points to the line\n const distance0 = Vec2.dot(normal, vIn[0].v) - offset;\n const distance1 = Vec2.dot(normal, vIn[1].v) - offset;\n\n // If the points are behind the plane\n if (distance0 <= 0.0)\n vOut[numOut++].set(vIn[0]);\n if (distance1 <= 0.0)\n vOut[numOut++].set(vIn[1]);\n\n // If the points are on different sides of the plane\n if (distance0 * distance1 < 0.0) {\n // Find intersection point of edge and plane\n const interp = distance0 / (distance0 - distance1);\n vOut[numOut].v.setCombine(1 - interp, vIn[0].v, interp, vIn[1].v);\n\n // VertexA is hitting edgeB.\n vOut[numOut].id.cf.indexA = vertexIndexA;\n vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB;\n vOut[numOut].id.cf.typeA = ContactFeatureType.e_vertex;\n vOut[numOut].id.cf.typeB = ContactFeatureType.e_face;\n ++numOut;\n }\n\n return numOut;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Math from './Math';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport default class Vec2 {\n x: number;\n y: number;\n\n constructor(x: number, y: number);\n constructor(obj: { x: number, y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?) {\n if (!(this instanceof Vec2)) {\n return new Vec2(x, y);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n } else {\n this.x = x;\n this.y = y;\n }\n _ASSERT && Vec2.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = data.x;\n obj.y = data.y;\n return obj;\n }\n\n static zero(): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = 0;\n obj.y = 0;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = x;\n obj.y = y;\n return obj;\n }\n\n static clone(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(v.x, v.y);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Vec2.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Vec2!');\n }\n }\n\n clone(): Vec2 {\n return Vec2.clone(this);\n }\n\n /**\n * Set this vector to all zeros.\n *\n * @returns this\n */\n setZero(): Vec2 {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n set(x: number, y: number): Vec2;\n set(value: Vec2): Vec2;\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n // tslint:disable-next-line:typedef\n set(x, y?) {\n if (typeof x === 'object') {\n _ASSERT && Vec2.assert(x);\n this.x = x.x;\n this.y = x.y;\n } else {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n }\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setNum(x: number, y: number) {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setVec2(value: Vec2) {\n _ASSERT && Vec2.assert(value);\n this.x = value.x;\n this.y = value.y;\n\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use setCombine or setMul\n */\n wSet(a: number, v: Vec2, b?: number, w?: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.setCombine(a, v, b, w);\n } else {\n return this.setMul(a, v);\n }\n }\n\n /**\n * Set linear combination of v and w: `a * v + b * w`\n */\n setCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x = x;\n this.y = y;\n return this;\n }\n\n setMul(a: number, v: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Add a vector to this vector.\n *\n * @returns this\n */\n add(w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x += w.x;\n this.y += w.y;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use addCombine or addMul\n */\n wAdd(a: number, v: Vec2, b?: number, w?: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.addCombine(a, v, b, w);\n } else {\n return this.addMul(a, v);\n }\n }\n\n /**\n * Add linear combination of v and w: `a * v + b * w`\n */\n addCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x += x;\n this.y += y;\n return this;\n }\n\n addMul(a: number, v: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x += x;\n this.y += y;\n return this;\n }\n\n /**\n * @deprecated Use subCombine or subMul\n */\n wSub(a: number, v: Vec2, b?: number, w?: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.subCombine(a, v, b, w);\n } else {\n return this.subMul(a, v);\n }}\n\n /**\n * Subtract linear combination of v and w: `a * v + b * w`\n */\n subCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n subMul(a: number, v: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n /**\n * Subtract a vector from this vector\n *\n * @returns this\n */\n sub(w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x -= w.x;\n this.y -= w.y;\n return this;\n }\n\n /**\n * Multiply this vector by a scalar.\n *\n * @returns this\n */\n mul(m: number): Vec2 {\n _ASSERT && Math.assert(m);\n this.x *= m;\n this.y *= m;\n return this;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n length(): number {\n return Vec2.lengthOf(this);\n }\n\n /**\n * Get the length squared.\n */\n lengthSquared(): number {\n return Vec2.lengthSquared(this);\n }\n\n /**\n * Convert this vector into a unit vector.\n *\n * @returns old length\n */\n normalize(): number {\n const length = this.length();\n if (length < Math.EPSILON) {\n return 0.0;\n }\n const invLength = 1.0 / length;\n this.x *= invLength;\n this.y *= invLength;\n return length;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n static lengthOf(v: Vec2): number {\n _ASSERT && Vec2.assert(v);\n return Math.sqrt(v.x * v.x + v.y * v.y);\n }\n\n /**\n * Get the length squared.\n */\n static lengthSquared(v: Vec2): number {\n _ASSERT && Vec2.assert(v);\n return v.x * v.x + v.y * v.y;\n }\n\n static distance(v: Vec2, w: Vec2): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n static distanceSquared(v: Vec2, w: Vec2): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return dx * dx + dy * dy;\n }\n\n static areEqual(v: Vec2, w: Vec2): boolean {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v === w || typeof w === 'object' && w !== null && v.x === w.x && v.y === w.y;\n }\n\n /**\n * Get the skew vector such that dot(skew_vec, other) == cross(vec, other)\n */\n static skew(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.y, v.x);\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec2, w: Vec2): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.x + v.y * w.y;\n }\n\n static cross(v: Vec2, w: Vec2): number;\n static cross(v: Vec2, w: number): Vec2;\n static cross(v: number, w: Vec2): Vec2;\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n *\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n // tslint:disable-next-line:typedef\n static cross(v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n\n } else {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static crossVec2Vec2(v: Vec2, w: Vec2): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossVec2Num(v: Vec2, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossNumVec2(v: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n }\n\n static addCross(a: Vec2, v: Vec2, w: number): Vec2;\n static addCross(a: Vec2, v: number, w: Vec2): Vec2;\n /**\n * Returns `a + (v x w)`\n */\n // tslint:disable-next-line:typedef\n static addCross(a, v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n _ASSERT && common.assert(false);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossVec2Num(a: Vec2, v: Vec2, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossNumVec2(a: Vec2, v: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n static add(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x + w.x, v.y + w.y);\n }\n\n /** @internal @deprecated */\n static wAdd(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return Vec2.combine(a, v, b, w);\n } else {\n return Vec2.mulNumVec2(a, v);\n }\n }\n\n static combine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n return Vec2.zero().setCombine(a, v, b, w);\n }\n\n static sub(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x - w.x, v.y - w.y);\n }\n\n static mul(a: Vec2, b: number): Vec2;\n static mul(a: number, b: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (typeof a === 'object') {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n\n } else if (typeof b === 'object') {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n }\n\n static mulVec2Num(a: Vec2, b: number): Vec2 {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n }\n\n static mulNumVec2(a: number, b: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n\n neg(): Vec2 {\n this.x = -this.x;\n this.y = -this.y;\n return this;\n }\n\n static neg(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.x, -v.y);\n }\n\n static abs(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Math.abs(v.x), Math.abs(v.y));\n }\n\n static mid(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo((v.x + w.x) * 0.5, (v.y + w.y) * 0.5);\n }\n\n static upper(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.max(v.x, w.x), Math.max(v.y, w.y));\n }\n\n static lower(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.min(v.x, w.x), Math.min(v.y, w.y));\n }\n\n clamp(max: number): Vec2 {\n const lengthSqr = this.x * this.x + this.y * this.y;\n if (lengthSqr > max * max) {\n const invLength = Math.invSqrt(lengthSqr);\n this.x *= invLength * max;\n this.y *= invLength * max;\n }\n return this;\n }\n\n static clamp(v: Vec2, max: number): Vec2 {\n v = Vec2.neo(v.x, v.y);\n v.clamp(max);\n return v;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static scaleFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x * x, v.y * y);\n };\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static translateFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x + x, v.y + y);\n };\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n */\nexport interface RayCastInput {\n p1: Vec2;\n p2: Vec2;\n maxFraction: number;\n}\n\nexport type RayCastCallback = (subInput: RayCastInput, id: number) => number;\n\n/**\n * Ray-cast output data. The ray hits at `p1 + fraction * (p2 - p1)`,\n * where `p1` and `p2` come from RayCastInput.\n */\nexport interface RayCastOutput {\n normal: Vec2;\n fraction: number;\n}\n\nexport default class AABB {\n lowerBound: Vec2;\n upperBound: Vec2;\n\n constructor(lower?: Vec2, upper?: Vec2) {\n if (!(this instanceof AABB)) {\n return new AABB(lower, upper);\n }\n\n this.lowerBound = Vec2.zero();\n this.upperBound = Vec2.zero();\n\n if (typeof lower === 'object') {\n this.lowerBound.setVec2(lower);\n }\n if (typeof upper === 'object') {\n this.upperBound.setVec2(upper);\n } else if (typeof lower === 'object') {\n this.upperBound.setVec2(lower);\n }\n }\n\n /**\n * Verify that the bounds are sorted.\n */\n isValid(): boolean {\n return AABB.isValid(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.lowerBound) && Vec2.isValid(obj.upperBound) && Vec2.sub(obj.upperBound, obj.lowerBound).lengthSquared() >= 0;\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!AABB.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid AABB!');\n }\n }\n\n /**\n * Get the center of the AABB.\n */\n getCenter(): Vec2 {\n return Vec2.neo((this.lowerBound.x + this.upperBound.x) * 0.5, (this.lowerBound.y + this.upperBound.y) * 0.5);\n }\n\n /**\n * Get the extents of the AABB (half-widths).\n */\n getExtents(): Vec2 {\n return Vec2.neo((this.upperBound.x - this.lowerBound.x) * 0.5, (this.upperBound.y - this.lowerBound.y) * 0.5);\n }\n\n /**\n * Get the perimeter length.\n */\n getPerimeter(): number {\n return 2.0 * (this.upperBound.x - this.lowerBound.x + this.upperBound.y - this.lowerBound.y);\n }\n\n /**\n * Combine one or two AABB into this one.\n */\n combine(a: AABB, b?: AABB): void {\n b = b || this;\n\n const lowerA = a.lowerBound;\n const upperA = a.upperBound;\n const lowerB = b.lowerBound;\n const upperB = b.upperBound;\n\n const lowerX = Math.min(lowerA.x, lowerB.x);\n const lowerY = Math.min(lowerA.y, lowerB.y);\n const upperX = Math.max(upperB.x, upperA.x);\n const upperY = Math.max(upperB.y, upperA.y);\n\n this.lowerBound.setNum(lowerX, lowerY);\n this.upperBound.setNum(upperX, upperY);\n }\n\n combinePoints(a: Vec2, b: Vec2): void {\n this.lowerBound.setNum(Math.min(a.x, b.x), Math.min(a.y, b.y));\n this.upperBound.setNum(Math.max(a.x, b.x), Math.max(a.y, b.y));\n }\n\n set(aabb: AABB): void {\n this.lowerBound.setNum(aabb.lowerBound.x, aabb.lowerBound.y);\n this.upperBound.setNum(aabb.upperBound.x, aabb.upperBound.y);\n }\n\n contains(aabb: AABB): boolean {\n let result = true;\n result = result && this.lowerBound.x <= aabb.lowerBound.x;\n result = result && this.lowerBound.y <= aabb.lowerBound.y;\n result = result && aabb.upperBound.x <= this.upperBound.x;\n result = result && aabb.upperBound.y <= this.upperBound.y;\n return result;\n }\n\n extend(value: number): AABB {\n AABB.extend(this, value);\n return this;\n }\n\n static extend(aabb: AABB, value: number): void {\n aabb.lowerBound.x -= value;\n aabb.lowerBound.y -= value;\n aabb.upperBound.x += value;\n aabb.upperBound.y += value;\n }\n\n static testOverlap(a: AABB, b: AABB): boolean {\n const d1x = b.lowerBound.x - a.upperBound.x;\n const d2x = a.lowerBound.x - b.upperBound.x;\n\n const d1y = b.lowerBound.y - a.upperBound.y;\n const d2y = a.lowerBound.y - b.upperBound.y;\n\n if (d1x > 0 || d1y > 0 || d2x > 0 || d2y > 0) {\n return false;\n }\n return true;\n }\n\n static areEqual(a: AABB, b: AABB): boolean {\n return Vec2.areEqual(a.lowerBound, b.lowerBound) && Vec2.areEqual(a.upperBound, b.upperBound);\n }\n\n static diff(a: AABB, b: AABB): number {\n const wD = Math.max(0, Math.min(a.upperBound.x, b.upperBound.x) - Math.max(b.lowerBound.x, a.lowerBound.x));\n const hD = Math.max(0, Math.min(a.upperBound.y, b.upperBound.y) - Math.max(b.lowerBound.y, a.lowerBound.y));\n\n const wA = a.upperBound.x - a.lowerBound.x;\n const hA = a.upperBound.y - a.lowerBound.y;\n\n const wB = b.upperBound.x - b.lowerBound.x;\n const hB = b.upperBound.y - b.lowerBound.y;\n\n return wA * hA + wB * hB - wD * hD;\n }\n\n rayCast(output: RayCastOutput, input: RayCastInput): boolean {\n // From Real-time Collision Detection, p179.\n\n let tmin = -Infinity;\n let tmax = Infinity;\n\n const p = input.p1;\n const d = Vec2.sub(input.p2, input.p1);\n const absD = Vec2.abs(d);\n\n const normal = Vec2.zero();\n\n for (let f: 'x' | 'y' = 'x'; f !== null; f = (f === 'x' ? 'y' : null)) {\n if (absD.x < Math.EPSILON) {\n // Parallel.\n if (p[f] < this.lowerBound[f] || this.upperBound[f] < p[f]) {\n return false;\n }\n } else {\n const inv_d = 1.0 / d[f];\n let t1 = (this.lowerBound[f] - p[f]) * inv_d;\n let t2 = (this.upperBound[f] - p[f]) * inv_d;\n\n // Sign of the normal vector.\n let s = -1.0;\n\n if (t1 > t2) {\n const temp = t1;\n t1 = t2;\n t2 = temp;\n s = 1.0;\n }\n\n // Push the min up\n if (t1 > tmin) {\n normal.setZero();\n normal[f] = s;\n tmin = t1;\n }\n\n // Pull the max down\n tmax = Math.min(tmax, t2);\n\n if (tmin > tmax) {\n return false;\n }\n }\n }\n\n // Does the ray start inside the box?\n // Does the ray intersect beyond the max fraction?\n if (tmin < 0.0 || input.maxFraction < tmin) {\n return false;\n }\n\n // Intersection.\n output.fraction = tmin;\n output.normal = normal;\n return true;\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n// TODO merge with World options?\n\n/**\n * Tuning constants based on meters-kilograms-seconds (MKS) units.\n */\n// tslint:disable-next-line:no-unnecessary-class\nexport default class Settings {\n // Collision\n /**\n * The maximum number of contact points between two convex shapes. Do not change\n * this value.\n */\n static maxManifoldPoints: number = 2;\n\n /**\n * The maximum number of vertices on a convex polygon. You cannot increase this\n * too much because BlockAllocator has a maximum object size.\n */\n static maxPolygonVertices: number = 12;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This allows proxies to move\n * by a small amount without triggering a tree adjustment. This is in meters.\n */\n static aabbExtension: number = 0.1;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This is used to predict the\n * future position based on the current displacement. This is a dimensionless\n * multiplier.\n */\n static aabbMultiplier: number = 2.0;\n\n /**\n * A small length used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static linearSlop: number = 0.005;\n static get linearSlopSquared(): number { return Settings.linearSlop * Settings.linearSlop; }\n\n /**\n * A small angle used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static angularSlop: number = (2.0 / 180.0 * Math.PI);\n\n /**\n * The radius of the polygon/edge shape skin. This should not be modified.\n * Making this smaller means polygons will have an insufficient buffer for\n * continuous collision. Making it larger may create artifacts for vertex\n * collision.\n */\n static get polygonRadius(): number { return 2.0 * Settings.linearSlop; }\n\n /**\n * Maximum number of sub-steps per contact in continuous physics simulation.\n */\n static maxSubSteps: number = 8;\n\n// Dynamics\n\n /**\n * Maximum number of contacts to be handled to solve a TOI impact.\n */\n static maxTOIContacts: number = 32;\n\n /**\n * Maximum iterations to solve a TOI.\n */\n static maxTOIIterations: number = 20;\n\n /**\n * Maximum iterations to find Distance.\n */\n static maxDistnceIterations: number = 20;\n\n /**\n * A velocity threshold for elastic collisions. Any collision with a relative\n * linear velocity below this threshold will be treated as inelastic.\n */\n static velocityThreshold: number = 1.0;\n\n /**\n * The maximum linear position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxLinearCorrection: number = 0.2;\n\n /**\n * The maximum angular position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxAngularCorrection: number = (8.0 / 180.0 * Math.PI);\n\n /**\n * The maximum linear velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxTranslation: number = 2.0;\n static get maxTranslationSquared(): number { return Settings.maxTranslation * Settings.maxTranslation; }\n\n /**\n * The maximum angular velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxRotation: number = (0.5 * Math.PI);\n static get maxRotationSquared(): number { return Settings.maxRotation * Settings.maxRotation; }\n\n /**\n * This scale factor controls how fast overlap is resolved. Ideally this would\n * be 1 so that overlap is removed in one time step. However using values close\n * to 1 often lead to overshoot.\n */\n static baumgarte: number = 0.2;\n static toiBaugarte: number = 0.75;\n\n // Sleep\n\n /**\n * The time that a body must be still before it will go to sleep.\n */\n static timeToSleep: number = 0.5;\n\n /**\n * A body cannot sleep if its linear velocity is above this tolerance.\n */\n static linearSleepTolerance: number = 0.01;\n static get linearSleepToleranceSqr(): number { return Math.pow(Settings.linearSleepTolerance, 2); }\n\n /**\n * A body cannot sleep if its angular velocity is above this tolerance.\n */\n static angularSleepTolerance: number = (2.0 / 180.0 * Math.PI);\n static get angularSleepToleranceSqr(): number { return Math.pow(Settings.angularSleepTolerance, 2); }\n\n}\n","/*\n * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js\n *\n * This software is provided 'as-is', without any express or implied\n * warranty. In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * 1. The origin of this software must not be misrepresented; you must not\n * claim that you wrote the original software. If you use this software\n * in a product, an acknowledgment in the product documentation would be\n * appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n * misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n */\n\nexport default class Pool {\n _list: T[] = [];\n _max: number = Infinity;\n\n _createFn: () => T;\n _outFn: (item: T) => void;\n _inFn: (item: T) => void;\n _discardFn: (item: T) => T;\n\n _createCount: number = 0;\n _outCount: number = 0;\n _inCount: number = 0;\n _discardCount: number = 0;\n\n constructor(opts: {\n max?: number,\n create?: () => T,\n allocate?: (item: T) => void,\n release?: (item: T) => void,\n discard?: (item: T) => T,\n }) {\n this._list = [];\n this._max = opts.max || this._max;\n\n this._createFn = opts.create;\n this._outFn = opts.allocate;\n this._inFn = opts.release;\n this._discardFn = opts.discard;\n }\n\n max(n?: number): number | Pool {\n if (typeof n === 'number') {\n this._max = n;\n return this;\n }\n return this._max;\n }\n\n size(): number {\n return this._list.length;\n }\n\n allocate(): T {\n let item: T;\n if (this._list.length > 0) {\n item = this._list.shift();\n } else {\n this._createCount++;\n if (typeof this._createFn === 'function') {\n item = this._createFn();\n } else {\n // tslint:disable-next-line:no-object-literal-type-assertion\n item = {} as T;\n }\n }\n this._outCount++;\n if (typeof this._outFn === 'function') {\n this._outFn(item);\n }\n return item;\n }\n\n release(item: T): void {\n if (this._list.length < this._max) {\n this._inCount++;\n if (typeof this._inFn === 'function') {\n this._inFn(item);\n }\n this._list.push(item);\n } else {\n this._discardCount++;\n if (typeof this._discardFn === 'function') {\n item = this._discardFn(item);\n }\n }\n }\n\n /** @internal */\n toString(): string {\n return \" +\" + this._createCount + \" >\" + this._outCount + \" <\" + this._inCount + \" -\"\n + this._discardCount + \" =\" + this._list.length + \"/\" + this._max;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../Settings';\nimport common from '../util/common';\nimport Pool from '../util/Pool';\nimport Vec2 from '../common/Vec2';\nimport Math from '../common/Math';\nimport AABB, { RayCastCallback, RayCastInput } from './AABB';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport type DynamicTreeQueryCallback = (nodeId: number) => boolean;\n\n/**\n * A node in the dynamic tree. The client does not interact with this directly.\n */\nexport class TreeNode {\n id: number;\n /** Enlarged AABB */\n aabb: AABB = new AABB();\n userData: T = null;\n parent: TreeNode = null;\n child1: TreeNode = null;\n child2: TreeNode = null;\n /** 0: leaf, -1: free node */\n height: number = -1;\n\n constructor(id?: number) {\n this.id = id;\n }\n\n /** @internal */\n toString(): string {\n return this.id + \": \" + this.userData;\n }\n\n isLeaf(): boolean {\n return this.child1 == null;\n }\n}\n\n/**\n * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A\n * dynamic tree arranges data in a binary tree to accelerate queries such as\n * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we\n * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger\n * than the client object. This allows the client object to move by small\n * amounts without triggering a tree update.\n *\n * Nodes are pooled and relocatable, so we use node indices rather than\n * pointers.\n */\nexport default class DynamicTree {\n m_root: TreeNode;\n m_lastProxyId: number;\n m_nodes: {\n [id: number]: TreeNode\n };\n m_pool: Pool>;\n\n constructor() {\n this.m_root = null;\n this.m_nodes = {};\n this.m_lastProxyId = 0;\n\n this.m_pool = new Pool>({\n create(): TreeNode {\n return new TreeNode();\n }\n });\n }\n\n /**\n * Get proxy user data.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getUserData(id: number): T {\n const node = this.m_nodes[id];\n _ASSERT && common.assert(!!node);\n return node.userData;\n }\n\n /**\n * Get the fat AABB for a node id.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getFatAABB(id: number): AABB {\n const node = this.m_nodes[id];\n _ASSERT && common.assert(!!node);\n return node.aabb;\n }\n\n allocateNode(): TreeNode {\n const node = this.m_pool.allocate();\n node.id = ++this.m_lastProxyId;\n node.userData = null;\n node.parent = null;\n node.child1 = null;\n node.child2 = null;\n node.height = -1;\n this.m_nodes[node.id] = node;\n return node;\n }\n\n freeNode(node: TreeNode): void {\n this.m_pool.release(node);\n node.height = -1;\n // tslint:disable-next-line:no-dynamic-delete\n delete this.m_nodes[node.id];\n }\n\n /**\n * Create a proxy in the tree as a leaf node. We return the index of the node\n * instead of a pointer so that we can grow the node pool.\n *\n * Create a proxy. Provide a tight fitting AABB and a userData pointer.\n */\n createProxy(aabb: AABB, userData: T): number {\n _ASSERT && common.assert(AABB.isValid(aabb));\n\n const node = this.allocateNode();\n\n node.aabb.set(aabb);\n\n // Fatten the aabb.\n AABB.extend(node.aabb, Settings.aabbExtension);\n\n node.userData = userData;\n node.height = 0;\n\n this.insertLeaf(node);\n\n return node.id;\n }\n\n /**\n * Destroy a proxy. This asserts if the id is invalid.\n */\n destroyProxy(id: number): void {\n const node = this.m_nodes[id];\n\n _ASSERT && common.assert(!!node);\n _ASSERT && common.assert(node.isLeaf());\n\n this.removeLeaf(node);\n this.freeNode(node);\n }\n\n /**\n * Move a proxy with a swepted AABB. If the proxy has moved outside of its\n * fattened AABB, then the proxy is removed from the tree and re-inserted.\n * Otherwise the function returns immediately.\n *\n * @param d Displacement\n *\n * @return true if the proxy was re-inserted.\n */\n moveProxy(id: number, aabb: AABB, d: Vec2): boolean {\n _ASSERT && common.assert(AABB.isValid(aabb));\n _ASSERT && common.assert(!d || Vec2.isValid(d));\n\n const node = this.m_nodes[id];\n\n _ASSERT && common.assert(!!node);\n _ASSERT && common.assert(node.isLeaf());\n\n if (node.aabb.contains(aabb)) {\n return false;\n }\n\n this.removeLeaf(node);\n\n node.aabb.set(aabb);\n\n // Extend AABB.\n aabb = node.aabb;\n AABB.extend(aabb, Settings.aabbExtension);\n\n // Predict AABB displacement.\n // const d = Vec2.mul(Settings.aabbMultiplier, displacement);\n\n if (d.x < 0.0) {\n aabb.lowerBound.x += d.x * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.x += d.x * Settings.aabbMultiplier;\n }\n\n if (d.y < 0.0) {\n aabb.lowerBound.y += d.y * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.y += d.y * Settings.aabbMultiplier;\n }\n\n this.insertLeaf(node);\n\n return true;\n }\n\n insertLeaf(leaf: TreeNode): void {\n _ASSERT && common.assert(AABB.isValid(leaf.aabb));\n\n if (this.m_root == null) {\n this.m_root = leaf;\n this.m_root.parent = null;\n return;\n }\n\n // Find the best sibling for this node\n const leafAABB = leaf.aabb;\n let index = this.m_root;\n while (!index.isLeaf()) {\n const child1 = index.child1;\n const child2 = index.child2;\n\n const area = index.aabb.getPerimeter();\n\n const combinedAABB = new AABB();\n combinedAABB.combine(index.aabb, leafAABB);\n const combinedArea = combinedAABB.getPerimeter();\n\n // Cost of creating a new parent for this node and the new leaf\n const cost = 2.0 * combinedArea;\n\n // Minimum cost of pushing the leaf further down the tree\n const inheritanceCost = 2.0 * (combinedArea - area);\n\n // Cost of descending into child1\n let cost1;\n if (child1.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n cost1 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n const oldArea = child1.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost1 = (newArea - oldArea) + inheritanceCost;\n }\n\n // Cost of descending into child2\n let cost2;\n if (child2.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n cost2 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n const oldArea = child2.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost2 = newArea - oldArea + inheritanceCost;\n }\n\n // Descend according to the minimum cost.\n if (cost < cost1 && cost < cost2) {\n break;\n }\n\n // Descend\n if (cost1 < cost2) {\n index = child1;\n } else {\n index = child2;\n }\n }\n\n const sibling = index;\n\n // Create a new parent.\n const oldParent = sibling.parent;\n const newParent = this.allocateNode();\n newParent.parent = oldParent;\n newParent.userData = null;\n newParent.aabb.combine(leafAABB, sibling.aabb);\n newParent.height = sibling.height + 1;\n\n if (oldParent != null) {\n // The sibling was not the root.\n if (oldParent.child1 === sibling) {\n oldParent.child1 = newParent;\n } else {\n oldParent.child2 = newParent;\n }\n\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n } else {\n // The sibling was the root.\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n this.m_root = newParent;\n }\n\n // Walk back up the tree fixing heights and AABBs\n index = leaf.parent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n _ASSERT && common.assert(child1 != null);\n _ASSERT && common.assert(child2 != null);\n\n index.height = 1 + Math.max(child1.height, child2.height);\n index.aabb.combine(child1.aabb, child2.aabb);\n\n index = index.parent;\n }\n\n // validate();\n }\n\n removeLeaf(leaf: TreeNode): void {\n if (leaf === this.m_root) {\n this.m_root = null;\n return;\n }\n\n const parent = leaf.parent;\n const grandParent = parent.parent;\n let sibling;\n if (parent.child1 === leaf) {\n sibling = parent.child2;\n } else {\n sibling = parent.child1;\n }\n\n if (grandParent != null) {\n // Destroy parent and connect sibling to grandParent.\n if (grandParent.child1 === parent) {\n grandParent.child1 = sibling;\n } else {\n grandParent.child2 = sibling;\n }\n sibling.parent = grandParent;\n this.freeNode(parent);\n\n // Adjust ancestor bounds.\n let index = grandParent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n index.aabb.combine(child1.aabb, child2.aabb);\n index.height = 1 + Math.max(child1.height, child2.height);\n\n index = index.parent;\n }\n } else {\n this.m_root = sibling;\n sibling.parent = null;\n this.freeNode(parent);\n }\n\n // validate();\n }\n\n /**\n * Perform a left or right rotation if node A is imbalanced. Returns the new\n * root index.\n */\n balance(iA: TreeNode): TreeNode {\n _ASSERT && common.assert(iA != null);\n\n const A = iA;\n if (A.isLeaf() || A.height < 2) {\n return iA;\n }\n\n const B = A.child1;\n const C = A.child2;\n\n const balance = C.height - B.height;\n\n // Rotate C up\n if (balance > 1) {\n const F = C.child1;\n const G = C.child2;\n\n // Swap A and C\n C.child1 = A;\n C.parent = A.parent;\n A.parent = C;\n\n // A's old parent should point to C\n if (C.parent != null) {\n if (C.parent.child1 === iA) {\n C.parent.child1 = C;\n } else {\n C.parent.child2 = C;\n }\n } else {\n this.m_root = C;\n }\n\n // Rotate\n if (F.height > G.height) {\n C.child2 = F;\n A.child2 = G;\n G.parent = A;\n A.aabb.combine(B.aabb, G.aabb);\n C.aabb.combine(A.aabb, F.aabb);\n\n A.height = 1 + Math.max(B.height, G.height);\n C.height = 1 + Math.max(A.height, F.height);\n } else {\n C.child2 = G;\n A.child2 = F;\n F.parent = A;\n A.aabb.combine(B.aabb, F.aabb);\n C.aabb.combine(A.aabb, G.aabb);\n\n A.height = 1 + Math.max(B.height, F.height);\n C.height = 1 + Math.max(A.height, G.height);\n }\n\n return C;\n }\n\n // Rotate B up\n if (balance < -1) {\n const D = B.child1;\n const E = B.child2;\n\n // Swap A and B\n B.child1 = A;\n B.parent = A.parent;\n A.parent = B;\n\n // A's old parent should point to B\n if (B.parent != null) {\n if (B.parent.child1 === A) {\n B.parent.child1 = B;\n } else {\n B.parent.child2 = B;\n }\n } else {\n this.m_root = B;\n }\n\n // Rotate\n if (D.height > E.height) {\n B.child2 = D;\n A.child1 = E;\n E.parent = A;\n A.aabb.combine(C.aabb, E.aabb);\n B.aabb.combine(A.aabb, D.aabb);\n\n A.height = 1 + Math.max(C.height, E.height);\n B.height = 1 + Math.max(A.height, D.height);\n } else {\n B.child2 = E;\n A.child1 = D;\n D.parent = A;\n A.aabb.combine(C.aabb, D.aabb);\n B.aabb.combine(A.aabb, E.aabb);\n\n A.height = 1 + Math.max(C.height, D.height);\n B.height = 1 + Math.max(A.height, E.height);\n }\n\n return B;\n }\n\n return A;\n }\n\n /**\n * Compute the height of the binary tree in O(N) time. Should not be called\n * often.\n */\n getHeight(): number {\n if (this.m_root == null) {\n return 0;\n }\n\n return this.m_root.height;\n }\n\n /**\n * Get the ratio of the sum of the node areas to the root area.\n */\n getAreaRatio(): number {\n if (this.m_root == null) {\n return 0.0;\n }\n\n const root = this.m_root;\n const rootArea = root.aabb.getPerimeter();\n\n let totalArea = 0.0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // Free node in pool\n continue;\n }\n\n totalArea += node.aabb.getPerimeter();\n }\n\n this.iteratorPool.release(it);\n\n return totalArea / rootArea;\n }\n\n /**\n * Compute the height of a sub-tree.\n */\n computeHeight(id?: number): number {\n let node;\n if (typeof id !== 'undefined') {\n node = this.m_nodes[id];\n } else {\n node = this.m_root;\n }\n\n // _ASSERT && common.assert(0 <= id && id < this.m_nodeCapacity);\n\n if (node.isLeaf()) {\n return 0;\n }\n\n const height1 = this.computeHeight(node.child1.id);\n const height2 = this.computeHeight(node.child2.id);\n return 1 + Math.max(height1, height2);\n }\n\n validateStructure(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n if (node === this.m_root) {\n _ASSERT && common.assert(node.parent == null);\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && common.assert(child1 == null);\n _ASSERT && common.assert(child2 == null);\n _ASSERT && common.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && common.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && common.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n _ASSERT && common.assert(child1.parent === node);\n _ASSERT && common.assert(child2.parent === node);\n\n this.validateStructure(child1);\n this.validateStructure(child2);\n }\n\n validateMetrics(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && common.assert(child1 == null);\n _ASSERT && common.assert(child2 == null);\n _ASSERT && common.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && common.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && common.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n const height1 = child1.height;\n const height2 = child2.height;\n const height = 1 + Math.max(height1, height2);\n _ASSERT && common.assert(node.height === height);\n\n const aabb = new AABB();\n aabb.combine(child1.aabb, child2.aabb);\n\n _ASSERT && common.assert(AABB.areEqual(aabb, node.aabb));\n\n this.validateMetrics(child1);\n this.validateMetrics(child2);\n }\n\n /**\n * Validate this tree. For testing.\n */\n validate(): void {\n this.validateStructure(this.m_root);\n this.validateMetrics(this.m_root);\n\n _ASSERT && common.assert(this.getHeight() === this.computeHeight());\n }\n\n /**\n * Get the maximum balance of an node in the tree. The balance is the difference\n * in height of the two children of a node.\n */\n getMaxBalance(): number {\n let maxBalance = 0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height <= 1) {\n continue;\n }\n\n _ASSERT && common.assert(!node.isLeaf());\n\n const balance = Math.abs(node.child2.height - node.child1.height);\n maxBalance = Math.max(maxBalance, balance);\n }\n this.iteratorPool.release(it);\n\n return maxBalance;\n }\n\n /**\n * Build an optimal tree. Very expensive. For testing.\n */\n rebuildBottomUp(): void {\n const nodes = [];\n let count = 0;\n\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // free node in pool\n continue;\n }\n\n if (node.isLeaf()) {\n node.parent = null;\n nodes[count] = node;\n ++count;\n } else {\n this.freeNode(node);\n }\n }\n this.iteratorPool.release(it);\n\n while (count > 1) {\n let minCost = Infinity;\n let iMin = -1;\n let jMin = -1;\n for (let i = 0; i < count; ++i) {\n const aabbi = nodes[i].aabb;\n for (let j = i + 1; j < count; ++j) {\n const aabbj = nodes[j].aabb;\n const b = new AABB();\n b.combine(aabbi, aabbj);\n const cost = b.getPerimeter();\n if (cost < minCost) {\n iMin = i;\n jMin = j;\n minCost = cost;\n }\n }\n }\n\n const child1 = nodes[iMin];\n const child2 = nodes[jMin];\n\n const parent = this.allocateNode();\n parent.child1 = child1;\n parent.child2 = child2;\n parent.height = 1 + Math.max(child1.height, child2.height);\n parent.aabb.combine(child1.aabb, child2.aabb);\n parent.parent = null;\n\n child1.parent = parent;\n child2.parent = parent;\n\n nodes[jMin] = nodes[count - 1];\n nodes[iMin] = parent;\n --count;\n }\n\n this.m_root = nodes[0];\n\n this.validate();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n const aabb = node.aabb;\n aabb.lowerBound.x -= newOrigin.x;\n aabb.lowerBound.y -= newOrigin.y;\n aabb.upperBound.x -= newOrigin.x;\n aabb.upperBound.y -= newOrigin.y;\n }\n this.iteratorPool.release(it);\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query(aabb: AABB, queryCallback: DynamicTreeQueryCallback): void {\n _ASSERT && common.assert(typeof queryCallback === 'function');\n const stack = this.stackPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, aabb)) {\n if (node.isLeaf()) {\n const proceed = queryCallback(node.id);\n if (proceed === false) {\n return;\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n }\n\n this.stackPool.release(stack);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n // TODO: GC\n _ASSERT && common.assert(typeof rayCastCallback === 'function');\n const p1 = input.p1;\n const p2 = input.p2;\n const r = Vec2.sub(p2, p1);\n _ASSERT && common.assert(r.lengthSquared() > 0.0);\n r.normalize();\n\n // v is perpendicular to the segment.\n const v = Vec2.crossNumVec2(1.0, r);\n const abs_v = Vec2.abs(v);\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n\n let maxFraction = input.maxFraction;\n\n // Build a bounding box for the segment.\n const segmentAABB = new AABB();\n let t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n\n const stack = this.stackPool.allocate();\n const subInput = this.inputPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, segmentAABB) === false) {\n continue;\n }\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n const c = node.aabb.getCenter();\n const h = node.aabb.getExtents();\n const separation = Math.abs(Vec2.dot(v, Vec2.sub(p1, c))) - Vec2.dot(abs_v, h);\n if (separation > 0.0) {\n continue;\n }\n\n if (node.isLeaf()) {\n subInput.p1 = Vec2.clone(input.p1);\n subInput.p2 = Vec2.clone(input.p2);\n subInput.maxFraction = maxFraction;\n\n const value = rayCastCallback(subInput, node.id);\n\n if (value === 0.0) {\n // The client has terminated the ray cast.\n return;\n }\n\n if (value > 0.0) {\n // update segment bounding box.\n maxFraction = value;\n t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n this.stackPool.release(stack);\n this.inputPool.release(subInput);\n }\n\n private inputPool: Pool = new Pool({\n create(): RayCastInput {\n // tslint:disable-next-line:no-object-literal-type-assertion\n return {} as RayCastInput;\n },\n release(stack: RayCastInput): void {\n }\n });\n\n private stackPool: Pool>> = new Pool>>({\n create(): Array> {\n return [];\n },\n release(stack: Array>): void {\n stack.length = 0;\n }\n });\n\n private iteratorPool: Pool> = new Pool>({\n create(): Iterator {\n return new Iterator();\n },\n release(iterator: Iterator): void {\n iterator.close();\n }\n });\n\n}\n\nclass Iterator {\n parents: Array> = [];\n states: number[] = [];\n preorder(root: TreeNode): Iterator {\n this.parents.length = 0;\n this.parents.push(root);\n this.states.length = 0;\n this.states.push(0);\n return this;\n }\n next(): TreeNode {\n while (this.parents.length > 0) {\n const i = this.parents.length - 1;\n const node = this.parents[i];\n if (this.states[i] === 0) {\n this.states[i] = 1;\n return node;\n }\n if (this.states[i] === 1) {\n this.states[i] = 2;\n if (node.child1) {\n this.parents.push(node.child1);\n this.states.push(1);\n return node.child1;\n }\n }\n if (this.states[i] === 2) {\n this.states[i] = 3;\n if (node.child2) {\n this.parents.push(node.child2);\n this.states.push(1);\n return node.child2;\n }\n }\n this.parents.pop();\n this.states.pop();\n }\n }\n close(): void {\n this.parents.length = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from '../common/Vec2';\nimport Math from '../common/Math';\nimport AABB, { RayCastCallback, RayCastInput } from './AABB';\nimport DynamicTree, { DynamicTreeQueryCallback } from './DynamicTree';\nimport { FixtureProxy } from \"../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * The broad-phase wraps and extends a dynamic-tree to keep track of moved\n * objects and query them on update.\n */\nexport default class BroadPhase {\n m_tree: DynamicTree = new DynamicTree();\n m_proxyCount: number = 0;\n m_moveBuffer: number[] = [];\n\n m_callback: (userDataA: any, userDataB: any) => void;\n m_queryProxyId: number;\n\n /**\n * Get user data from a proxy. Returns null if the id is invalid.\n */\n getUserData(proxyId: number): FixtureProxy {\n return this.m_tree.getUserData(proxyId);\n }\n\n /**\n * Test overlap of fat AABBs.\n */\n testOverlap(proxyIdA: number, proxyIdB: number): boolean {\n const aabbA = this.m_tree.getFatAABB(proxyIdA);\n const aabbB = this.m_tree.getFatAABB(proxyIdB);\n return AABB.testOverlap(aabbA, aabbB);\n }\n\n /**\n * Get the fat AABB for a proxy.\n */\n getFatAABB(proxyId: number): AABB {\n return this.m_tree.getFatAABB(proxyId);\n }\n\n /**\n * Get the number of proxies.\n */\n getProxyCount(): number {\n return this.m_proxyCount;\n }\n\n /**\n * Get the height of the embedded tree.\n */\n getTreeHeight(): number {\n return this.m_tree.getHeight();\n }\n\n /**\n * Get the balance (integer) of the embedded tree.\n */\n getTreeBalance(): number {\n return this.m_tree.getMaxBalance();\n }\n\n /**\n * Get the quality metric of the embedded tree.\n */\n getTreeQuality(): number {\n return this.m_tree.getAreaRatio();\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query = (aabb: AABB, queryCallback: DynamicTreeQueryCallback): void => {\n this.m_tree.query(aabb, queryCallback);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n this.m_tree.rayCast(input, rayCastCallback);\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_tree.shiftOrigin(newOrigin);\n }\n\n /**\n * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs\n * is called.\n */\n createProxy(aabb: AABB, userData: FixtureProxy): number {\n _ASSERT && common.assert(AABB.isValid(aabb));\n const proxyId = this.m_tree.createProxy(aabb, userData);\n this.m_proxyCount++;\n this.bufferMove(proxyId);\n return proxyId;\n }\n\n /**\n * Destroy a proxy. It is up to the client to remove any pairs.\n */\n destroyProxy(proxyId: number): void {\n this.unbufferMove(proxyId);\n this.m_proxyCount--;\n this.m_tree.destroyProxy(proxyId);\n }\n\n /**\n * Call moveProxy as many times as you like, then when you are done call\n * UpdatePairs to finalized the proxy pairs (for your time step).\n */\n moveProxy(proxyId: number, aabb: AABB, displacement: Vec2): void {\n _ASSERT && common.assert(AABB.isValid(aabb));\n const changed = this.m_tree.moveProxy(proxyId, aabb, displacement);\n if (changed) {\n this.bufferMove(proxyId);\n }\n }\n\n /**\n * Call to trigger a re-processing of it's pairs on the next call to\n * UpdatePairs.\n */\n touchProxy(proxyId: number): void {\n this.bufferMove(proxyId);\n }\n\n bufferMove(proxyId: number): void {\n this.m_moveBuffer.push(proxyId);\n }\n\n unbufferMove(proxyId: number): void {\n for (let i = 0; i < this.m_moveBuffer.length; ++i) {\n if (this.m_moveBuffer[i] === proxyId) {\n this.m_moveBuffer[i] = null;\n }\n }\n }\n\n /**\n * Update the pairs. This results in pair callbacks. This can only add pairs.\n */\n updatePairs(addPairCallback: (userDataA: FixtureProxy, userDataB: FixtureProxy) => void): void {\n _ASSERT && common.assert(typeof addPairCallback === 'function');\n this.m_callback = addPairCallback;\n\n // Perform tree queries for all moving proxies.\n while (this.m_moveBuffer.length > 0) {\n this.m_queryProxyId = this.m_moveBuffer.pop();\n if (this.m_queryProxyId === null) {\n continue;\n }\n\n // We have to query the tree with the fat AABB so that\n // we don't fail to create a pair that may touch later.\n const fatAABB = this.m_tree.getFatAABB(this.m_queryProxyId);\n\n // Query tree, create pairs and add them pair buffer.\n this.m_tree.query(fatAABB, this.queryCallback);\n }\n\n // Try to keep the tree balanced.\n // this.m_tree.rebalance(4);\n }\n\n queryCallback = (proxyId: number): boolean => {\n // A proxy cannot form a pair with itself.\n if (proxyId === this.m_queryProxyId) {\n return true;\n }\n\n const proxyIdA = Math.min(proxyId, this.m_queryProxyId);\n const proxyIdB = Math.max(proxyId, this.m_queryProxyId);\n\n // TODO: Skip any duplicate pairs.\n\n const userDataA = this.m_tree.getUserData(proxyIdA);\n const userDataB = this.m_tree.getUserData(proxyIdB);\n\n // Send the pairs back to the client.\n this.m_callback(userDataA, userDataB);\n\n return true;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from './Vec2';\nimport Math from './Math';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport default class Rot {\n s: number;\n c: number;\n\n /** Initialize from an angle in radians. */\n constructor(angle?: number | Rot) {\n if (!(this instanceof Rot)) {\n return new Rot(angle);\n }\n if (typeof angle === 'number') {\n this.setAngle(angle);\n } else if (typeof angle === 'object') {\n this.setRot(angle);\n } else {\n this.setIdentity();\n }\n }\n\n /** @internal */\n static neo(angle: number): Rot {\n const obj = Object.create(Rot.prototype);\n obj.setAngle(angle);\n return obj;\n }\n\n static clone(rot: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n const obj = Object.create(Rot.prototype);\n obj.s = rot.s;\n obj.c = rot.c;\n return obj;\n }\n\n static identity(): Rot {\n const obj = Object.create(Rot.prototype);\n obj.s = 0.0;\n obj.c = 1.0;\n return obj;\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.s) && Math.isFinite(obj.c);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Rot.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Rot!');\n }\n }\n\n /** Set to the identity rotation. */\n setIdentity(): void {\n this.s = 0.0;\n this.c = 1.0;\n }\n\n set(angle: number | Rot): void {\n if (typeof angle === 'object') {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n\n } else {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n }\n\n setRot(angle: Rot): void {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n }\n\n /** Set using an angle in radians. */\n setAngle(angle: number): void {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n\n /** Get the angle in radians. */\n getAngle(): number {\n return Math.atan2(this.s, this.c);\n }\n\n /** Get the x-axis. */\n getXAxis(): Vec2 {\n return Vec2.neo(this.c, this.s);\n }\n\n /** Get the u-axis. */\n getYAxis(): Vec2 {\n return Vec2.neo(-this.s, this.c);\n }\n\n /** Multiply two rotations: q * r */\n static mul(rot: Rot, m: Rot): Rot;\n /** Rotate a vector */\n static mul(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(rot, m) {\n _ASSERT && Rot.assert(rot);\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Multiply two rotations: q * r */\n static mulRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n }\n\n /** Rotate a vector */\n static mulVec2(rot: Rot, m: Vec2): Vec2 {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n\n static mulSub(rot: Rot, v: Vec2, w: Vec2): Vec2 {\n const x = rot.c * (v.x - w.x) - rot.s * (v.y - w.y);\n const y = rot.s * (v.x - w.x) + rot.c * (v.y - w.y);\n return Vec2.neo(x, y);\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulT(rot: Rot, m: Rot): Rot;\n /** Inverse rotate a vector */\n static mulT(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(rot, m) {\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulTRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n }\n\n /** Inverse rotate a vector */\n static mulTVec2(rot: Rot, m: Vec2): Vec2 {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from './Vec2';\nimport Rot from './Rot';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A transform contains translation and rotation. It is used to represent the\n * position and orientation of rigid frames. Initialize using a position vector\n * and a rotation.\n */\nexport default class Transform {\n /** position */\n p: Vec2;\n\n /** rotation */\n q: Rot;\n\n constructor(position?: Vec2, rotation?: number) {\n if (!(this instanceof Transform)) {\n return new Transform(position, rotation);\n }\n this.p = Vec2.zero();\n this.q = Rot.identity();\n if (typeof position !== 'undefined') {\n this.p.setVec2(position);\n }\n if (typeof rotation !== 'undefined') {\n this.q.setAngle(rotation);\n }\n }\n\n static clone(xf: Transform): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(xf.p);\n obj.q = Rot.clone(xf.q);\n return obj;\n }\n\n /** @internal */\n static neo(position: Vec2, rotation: Rot): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(position);\n obj.q = Rot.clone(rotation);\n return obj;\n }\n\n static identity(): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.zero();\n obj.q = Rot.identity();\n return obj;\n }\n\n /**\n * Set this to the identity transform.\n */\n setIdentity(): void {\n this.p.setZero();\n this.q.setIdentity();\n }\n\n set(position: Vec2, rotation: number): void;\n set(xf: Transform): void;\n /**\n * Set this based on the position and angle.\n */\n // tslint:disable-next-line:typedef\n set(a, b?) {\n if (typeof b === 'undefined') {\n this.p.set(a.p);\n this.q.set(a.q);\n } else {\n this.p.set(a);\n this.q.set(b);\n }\n }\n\n /**\n * Set this based on the position and angle.\n */\n setNum(position: Vec2, rotation: number) {\n this.p.setVec2(position);\n this.q.setAngle(rotation);\n }\n\n setTransform(xf: Transform): void {\n this.p.setVec2(xf.p);\n this.q.setRot(xf.q);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.p) && Rot.isValid(obj.q);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Transform.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Transform!');\n }\n }\n\n static mul(a: Transform, b: Vec2): Vec2;\n static mul(a: Transform, b: Transform): Transform;\n // static mul(a: Transform, b: Vec2[]): Vec2[];\n // static mul(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (Array.isArray(b)) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n\n } else if ('x' in b && 'y' in b) {\n return Transform.mulVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulXf(a, b);\n }\n }\n\n static mulAll(a: Transform, b: Vec2[]): Vec2[];\n static mulAll(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mulAll(a: Transform, b) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static mulFn(a: Transform) {\n _ASSERT && Transform.assert(a);\n return function(b: Vec2): Vec2 {\n return Transform.mul(a, b);\n };\n }\n\n static mulVec2(a: Transform, b: Vec2): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = (a.q.c * b.x - a.q.s * b.y) + a.p.x;\n const y = (a.q.s * b.x + a.q.c * b.y) + a.p.y;\n return Vec2.neo(x, y);\n }\n\n static mulXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p\n // = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p\n const xf = Transform.identity();\n xf.q = Rot.mulRot(a.q, b.q);\n xf.p = Vec2.add(Rot.mulVec2(a.q, b.p), a.p);\n return xf;\n }\n\n static mulT(a: Transform, b: Vec2): Vec2;\n static mulT(a: Transform, b: Transform): Transform;\n // tslint:disable-next-line:typedef\n static mulT(a, b) {\n if ('x' in b && 'y' in b) {\n return Transform.mulTVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulTXf(a, b);\n }\n }\n\n static mulTVec2(a: Transform, b: Vec2): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const px = b.x - a.p.x;\n const py = b.y - a.p.y;\n const x = (a.q.c * px + a.q.s * py);\n const y = (-a.q.s * px + a.q.c * py);\n return Vec2.neo(x, y);\n }\n\n static mulTXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q' * (B.q * v1 + B.p - A.p)\n // = A.q' * B.q * v1 + A.q' * (B.p - A.p)\n const xf = Transform.identity();\n xf.q.setRot(Rot.mulTRot(a.q, b.q));\n xf.p.setVec2(Rot.mulTVec2(a.q, Vec2.sub(b.p, a.p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Math from './Math';\nimport Vec2 from './Vec2';\nimport Rot from './Rot';\nimport Transform from './Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * This describes the motion of a body/shape for TOI computation. Shapes are\n * defined with respect to the body origin, which may not coincide with the\n * center of mass. However, to support dynamics we must interpolate the center\n * of mass position.\n */\nexport default class Sweep {\n /** Local center of mass position */\n localCenter: Vec2;\n\n /** World center position */\n c: Vec2;\n\n /** World angle */\n a: number;\n\n /** Fraction of the current time step in the range [0,1], c0 and a0 are c and a at alpha0. */\n alpha0: number;\n\n c0: Vec2;\n a0: number;\n\n constructor(c?: Vec2, a?: number) {\n _ASSERT && common.assert(typeof c === 'undefined');\n _ASSERT && common.assert(typeof a === 'undefined');\n this.localCenter = Vec2.zero();\n this.c = Vec2.zero();\n this.a = 0;\n this.alpha0 = 0;\n this.c0 = Vec2.zero();\n this.a0 = 0;\n }\n\n setTransform(xf: Transform): void {\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n\n this.a = xf.q.getAngle();\n this.a0 = xf.q.getAngle();\n }\n\n setLocalCenter(localCenter: Vec2, xf: Transform): void {\n this.localCenter.setVec2(localCenter);\n\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n }\n\n /**\n * Get the interpolated transform at a specific time.\n *\n * @param xf\n * @param beta A factor in [0,1], where 0 indicates alpha0\n */\n getTransform(xf: Transform, beta: number = 0): void {\n xf.q.setAngle((1.0 - beta) * this.a0 + beta * this.a);\n xf.p.setCombine((1.0 - beta), this.c0, beta, this.c);\n\n // shift to origin\n xf.p.sub(Rot.mulVec2(xf.q, this.localCenter));\n }\n\n /**\n * Advance the sweep forward, yielding a new initial state.\n *\n * @param alpha The new initial time\n */\n advance(alpha: number): void {\n _ASSERT && common.assert(this.alpha0 < 1.0);\n const beta = (alpha - this.alpha0) / (1.0 - this.alpha0);\n this.c0.setCombine(beta, this.c, 1 - beta, this.c0);\n this.a0 = beta * this.a + (1 - beta) * this.a0;\n this.alpha0 = alpha;\n }\n\n forward(): void {\n this.a0 = this.a;\n this.c0.setVec2(this.c);\n }\n\n /**\n * normalize the angles in radians to be between -pi and pi.\n */\n normalize(): void {\n const a0 = Math.mod(this.a0, -Math.PI, +Math.PI);\n this.a -= this.a0 - a0;\n this.a0 = a0;\n }\n\n clone(): Sweep {\n const clone = new Sweep();\n clone.localCenter.setVec2(this.localCenter);\n clone.alpha0 = this.alpha0;\n clone.a0 = this.a0;\n clone.a = this.a;\n clone.c0.setVec2(this.c0);\n clone.c.setVec2(this.c);\n return clone;\n }\n\n set(that: Sweep): void {\n this.localCenter.setVec2(that.localCenter);\n this.alpha0 = that.alpha0;\n this.a0 = that.a0;\n this.a = that.a;\n this.c0.setVec2(that.c0);\n this.c.setVec2(that.c);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Vec2 from '../common/Vec2';\n\nexport default class Velocity {\n /** linear */\n v: Vec2;\n\n /** angular */\n w: number;\n\n constructor() {\n this.v = Vec2.zero();\n this.w = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Vec2 from '../common/Vec2';\nimport Rot from '../common/Rot';\nimport Transform from '../common/Transform';\n\n\nexport default class Position {\n /** location */\n c: Vec2;\n\n /** angle */\n a: number;\n\n constructor() {\n this.c = Vec2.zero();\n this.a = 0;\n }\n\n getTransform(xf: Transform, p: Vec2): Transform {\n xf.q.setAngle(this.a);\n xf.p.setVec2(Vec2.sub(this.c, Rot.mulVec2(xf.q, p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../dynamics/Body';\nimport AABB, { RayCastOutput, RayCastInput } from './AABB';\nimport { DistanceProxy } from './Distance';\nimport type Transform from '../common/Transform';\nimport type Vec2 from '../common/Vec2';\n\n\n/**\n * A shape is used for collision detection. You can create a shape however you\n * like. Shapes used for simulation in World are created automatically when a\n * Fixture is created. Shapes may encapsulate one or more child shapes.\n */\nexport default abstract class Shape {\n m_type: ShapeType;\n m_radius: number;\n\n /** @internal */\n _reset(): void {\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return typeof obj.m_type === 'string' && typeof obj.m_radius === 'number';\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n /**\n * Get the type of this shape. You can use this to down cast to the concrete\n * shape.\n *\n * @return the shape type.\n */\n getType(): ShapeType {\n return this.m_type;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n abstract _clone(): Shape;\n\n /**\n * Get the number of child primitives.\n */\n abstract getChildCount(): number;\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n abstract testPoint(xf: Transform, p: Vec2): boolean;\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n abstract rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean;\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n abstract computeAABB(aabb: AABB, xf: Transform, childIndex: number): void;\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n abstract computeMass(massData: MassData, density?: number): void;\n\n abstract computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void;\n\n}\n\nexport type ShapeType = \"circle\" | \"edge\" | \"polygon\" | \"chain\";\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport options from '../util/options';\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\nimport AABB, { RayCastInput, RayCastOutput } from '../collision/AABB';\nimport Shape, { ShapeType } from '../collision/Shape';\nimport Body, { MassData } from \"./Body\";\nimport BroadPhase from \"../collision/BroadPhase\";\nimport Transform from \"../common/Transform\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A fixture definition is used to create a fixture. This class defines an\n * abstract fixture definition. You can reuse fixture definitions safely.\n */\nexport interface FixtureOpt {\n userData?: unknown;\n /**\n * The friction coefficient, usually in the range [0,1]\n */\n friction?: number;\n /**\n * The restitution (elasticity) usually in the range [0,1]\n */\n restitution?: number;\n /**\n * The density, usually in kg/m^2\n */\n density?: number;\n /**\n * A sensor shape collects contact information but never generates a collision response.\n */\n isSensor?: boolean;\n /**\n * Zero, positive or negative collision group.\n * Fixtures with same positive groupIndex always collide and fixtures with same negative groupIndex never collide.\n */\n filterGroupIndex?: number;\n /**\n * Collision category bit or bits that this fixture belongs to.\n * If groupIndex is zero or not matching, then at least one bit in this fixture categoryBits should match other fixture maskBits and vice versa.\n */\n filterCategoryBits?: number;\n /**\n * Collision category bit or bits that this fixture accept for collision.\n */\n filterMaskBits?: number;\n}\n\nexport interface FixtureDef extends FixtureOpt {\n shape: Shape;\n}\n\nconst FixtureDefDefault: FixtureOpt = {\n userData : null,\n friction : 0.2,\n restitution : 0.0,\n density : 0.0,\n isSensor : false,\n\n filterGroupIndex : 0,\n filterCategoryBits : 0x0001,\n filterMaskBits : 0xFFFF\n};\n\n/**\n * This proxy is used internally to connect shape children to the broad-phase.\n */\nexport class FixtureProxy {\n aabb: AABB;\n fixture: Fixture;\n childIndex: number;\n proxyId: number;\n constructor(fixture: Fixture, childIndex: number) {\n this.aabb = new AABB();\n this.fixture = fixture;\n this.childIndex = childIndex;\n this.proxyId;\n }\n}\n\n/**\n * A fixture is used to attach a shape to a body for collision detection. A\n * fixture inherits its transform from its parent. Fixtures hold additional\n * non-geometric data such as friction, collision filters, etc.\n *\n * To create a new Fixture use {@link Body.createFixture}.\n */\nexport default class Fixture {\n /** @internal */ m_body: Body;\n /** @internal */ m_friction: number;\n /** @internal */ m_restitution: number;\n /** @internal */ m_density: number;\n /** @internal */ m_isSensor: boolean;\n /** @internal */ m_filterGroupIndex: number;\n /** @internal */ m_filterCategoryBits: number;\n /** @internal */ m_filterMaskBits: number;\n /** @internal */ m_shape: Shape;\n /** @internal */ m_next: Fixture | null;\n /** @internal */ m_proxies: FixtureProxy[];\n /** @internal */ m_proxyCount: number;\n /** @internal */ m_userData: unknown;\n\n constructor(body: Body, def: FixtureDef);\n constructor(body: Body, shape: Shape, def?: FixtureOpt);\n constructor(body: Body, shape: Shape, density?: number);\n // tslint:disable-next-line:typedef\n /** @internal */ constructor(body: Body, shape?, def?) {\n if (shape.shape) {\n def = shape;\n shape = shape.shape;\n\n } else if (typeof def === 'number') {\n def = {density : def};\n }\n\n def = options(def, FixtureDefDefault);\n\n this.m_body = body;\n\n this.m_friction = def.friction;\n this.m_restitution = def.restitution;\n this.m_density = def.density;\n this.m_isSensor = def.isSensor;\n\n this.m_filterGroupIndex = def.filterGroupIndex;\n this.m_filterCategoryBits = def.filterCategoryBits;\n this.m_filterMaskBits = def.filterMaskBits;\n\n // TODO validate shape\n this.m_shape = shape; // .clone();\n\n this.m_next = null;\n\n this.m_proxies = [];\n this.m_proxyCount = 0;\n\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n\n this.m_userData = def.userData;\n }\n\n /**\n * Re-setup fixture.\n * @internal\n */\n _reset(): void {\n const body = this.getBody();\n const broadPhase = body.m_world.m_broadPhase;\n this.destroyProxies(broadPhase);\n if (this.m_shape._reset) {\n this.m_shape._reset();\n }\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n this.createProxies(broadPhase, body.m_xf);\n body.resetMassData();\n }\n\n /** @internal */\n _serialize(): object {\n return {\n friction: this.m_friction,\n restitution: this.m_restitution,\n density: this.m_density,\n isSensor: this.m_isSensor,\n\n filterGroupIndex: this.m_filterGroupIndex,\n filterCategoryBits: this.m_filterCategoryBits,\n filterMaskBits: this.m_filterMaskBits,\n\n shape: this.m_shape,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, body: any, restore: any): Fixture {\n const shape = restore(Shape, data.shape);\n const fixture = shape && new Fixture(body, shape, data);\n return fixture;\n }\n\n /**\n * Get the type of the child shape. You can use this to down cast to the\n * concrete shape.\n */\n getType(): ShapeType {\n return this.m_shape.getType();\n }\n\n /**\n * Get the child shape. You can modify the child shape, however you should not\n * change the number of vertices because this will crash some collision caching\n * mechanisms. Manipulating the shape may lead to non-physical behavior.\n */\n getShape(): Shape {\n return this.m_shape;\n }\n\n /**\n * A sensor shape collects contact information but never generates a collision\n * response.\n */\n isSensor(): boolean {\n return this.m_isSensor;\n }\n\n /**\n * Set if this fixture is a sensor.\n */\n setSensor(sensor: boolean): void {\n if (sensor != this.m_isSensor) {\n this.m_body.setAwake(true);\n this.m_isSensor = sensor;\n }\n }\n\n // /**\n // * Get the contact filtering data.\n // */\n // getFilterData() {\n // return this.m_filter;\n // }\n\n /**\n * Get the user data that was assigned in the fixture definition. Use this to\n * store your application specific data.\n */\n getUserData(): unknown {\n return this.m_userData;\n }\n\n /**\n * Set the user data. Use this to store your application specific data.\n */\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get the parent body of this fixture. This is null if the fixture is not\n * attached.\n */\n getBody(): Body {\n return this.m_body;\n }\n\n /**\n * Get the next fixture in the parent body's fixture list.\n */\n getNext(): Fixture | null {\n return this.m_next;\n }\n\n /**\n * Get the density of this fixture.\n */\n getDensity(): number {\n return this.m_density;\n }\n\n /**\n * Set the density of this fixture. This will _not_ automatically adjust the\n * mass of the body. You must call Body.resetMassData to update the body's mass.\n */\n setDensity(density: number): void {\n _ASSERT && common.assert(Math.isFinite(density) && density >= 0.0);\n this.m_density = density;\n }\n\n /**\n * Get the coefficient of friction, usually in the range [0,1].\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Set the coefficient of friction. This will not change the friction of\n * existing contacts.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the coefficient of restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Set the coefficient of restitution. This will not change the restitution of\n * existing contacts.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Test a point in world coordinates for containment in this fixture.\n */\n testPoint(p: Vec2): boolean {\n return this.m_shape.testPoint(this.m_body.getTransform(), p);\n }\n\n /**\n * Cast a ray against this shape.\n */\n rayCast(output: RayCastOutput, input: RayCastInput, childIndex: number): boolean {\n return this.m_shape.rayCast(output, input, this.m_body.getTransform(), childIndex);\n }\n\n /**\n * Get the mass data for this fixture. The mass data is based on the density and\n * the shape. The rotational inertia is about the shape's origin. This operation\n * may be expensive.\n */\n getMassData(massData: MassData): void {\n this.m_shape.computeMass(massData, this.m_density);\n }\n\n /**\n * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a\n * more accurate AABB, compute it using the shape and the body transform.\n */\n getAABB(childIndex: number): AABB {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_proxyCount);\n return this.m_proxies[childIndex].aabb;\n }\n\n /**\n * These support body activation/deactivation.\n */\n createProxies(broadPhase: BroadPhase, xf: Transform): void {\n _ASSERT && common.assert(this.m_proxyCount == 0);\n\n // Create proxies in the broad-phase.\n this.m_proxyCount = this.m_shape.getChildCount();\n\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n this.m_shape.computeAABB(proxy.aabb, xf, i);\n proxy.proxyId = broadPhase.createProxy(proxy.aabb, proxy);\n }\n }\n\n destroyProxies(broadPhase: BroadPhase): void {\n // Destroy proxies in the broad-phase.\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n broadPhase.destroyProxy(proxy.proxyId);\n proxy.proxyId = null;\n }\n\n this.m_proxyCount = 0;\n }\n\n /**\n * Updates this fixture proxy in broad-phase (with combined AABB of current and\n * next transformation).\n */\n synchronize(broadPhase: BroadPhase, xf1: Transform, xf2: Transform): void {\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n // Compute an AABB that covers the swept shape (may miss some rotation\n // effect).\n const aabb1 = new AABB();\n const aabb2 = new AABB();\n this.m_shape.computeAABB(aabb1, xf1, proxy.childIndex);\n this.m_shape.computeAABB(aabb2, xf2, proxy.childIndex);\n\n proxy.aabb.combine(aabb1, aabb2);\n\n const displacement = Vec2.sub(xf2.p, xf1.p);\n\n broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement);\n }\n }\n\n /**\n * Set the contact filtering data. This will not update contacts until the next\n * time step when either parent body is active and awake. This automatically\n * calls refilter.\n */\n setFilterData(filter: { groupIndex: number, categoryBits: number, maskBits: number }): void {\n this.m_filterGroupIndex = filter.groupIndex;\n this.m_filterCategoryBits = filter.categoryBits;\n this.m_filterMaskBits = filter.maskBits;\n this.refilter();\n }\n\n getFilterGroupIndex(): number {\n return this.m_filterGroupIndex;\n }\n\n setFilterGroupIndex(groupIndex: number): void {\n this.m_filterGroupIndex = groupIndex;\n }\n\n getFilterCategoryBits(): number {\n return this.m_filterCategoryBits;\n }\n\n setFilterCategoryBits(categoryBits: number): void {\n this.m_filterCategoryBits = categoryBits;\n }\n\n getFilterMaskBits(): number {\n return this.m_filterMaskBits;\n }\n\n setFilterMaskBits(maskBits: number): void {\n this.m_filterMaskBits = maskBits;\n }\n\n /**\n * Call this if you want to establish collision that was previously disabled by\n * ContactFilter.\n */\n refilter(): void {\n if (this.m_body == null) {\n return;\n }\n\n // Flag associated contacts for filtering.\n let edge = this.m_body.getContactList();\n while (edge) {\n const contact = edge.contact;\n const fixtureA = contact.getFixtureA();\n const fixtureB = contact.getFixtureB();\n if (fixtureA == this || fixtureB == this) {\n contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n\n const world = this.m_body.getWorld();\n\n if (world == null) {\n return;\n }\n\n // Touch each proxy so that new pairs may be created\n const broadPhase = world.m_broadPhase;\n for (let i = 0; i < this.m_proxyCount; ++i) {\n broadPhase.touchProxy(this.m_proxies[i].proxyId);\n }\n }\n\n /**\n * Implement this method to provide collision filtering, if you want finer\n * control over contact creation.\n *\n * Return true if contact calculations should be performed between these two\n * fixtures.\n *\n * Warning: for performance reasons this is only called when the AABBs begin to\n * overlap.\n */\n shouldCollide(that: Fixture): boolean {\n\n if (that.m_filterGroupIndex === this.m_filterGroupIndex && that.m_filterGroupIndex !== 0) {\n return that.m_filterGroupIndex > 0;\n }\n\n const collideA = (that.m_filterMaskBits & this.m_filterCategoryBits) !== 0;\n const collideB = (that.m_filterCategoryBits & this.m_filterMaskBits) !== 0;\n const collide = collideA && collideB;\n return collide;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nimport common from '../util/common';\nimport options from '../util/options';\nimport Vec2 from '../common/Vec2';\nimport Rot from '../common/Rot';\nimport Math from '../common/Math';\nimport Sweep from '../common/Sweep';\nimport Transform from '../common/Transform';\nimport Velocity from './Velocity';\nimport Position from './Position';\nimport Fixture, { FixtureDef, FixtureOpt } from './Fixture';\nimport Shape from '../collision/Shape';\nimport { JointEdge } from \"./Joint\";\nimport World from \"./World\";\nimport { ContactEdge } from \"./Contact\";\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\nexport type BodyType = 'static' | 'kinematic' | 'dynamic';\n\nconst STATIC = 'static';\nconst KINEMATIC = 'kinematic';\nconst DYNAMIC = 'dynamic';\n\nexport interface BodyDef {\n /**\n * Body types are static, kinematic, or dynamic. Note: if a dynamic\n * body would have zero mass, the mass is set to one.\n */\n type?: BodyType;\n /**\n * The world position of the body. Avoid creating bodies at the\n * origin since this can lead to many overlapping shapes.\n */\n position?: Vec2;\n /**\n * The world angle of the body in radians.\n */\n angle?: number;\n /**\n * The linear velocity of the body's origin in world co-ordinates.\n */\n linearVelocity?: Vec2;\n angularVelocity?: number;\n /**\n * Linear damping is use to reduce the linear velocity. The\n * damping parameter can be larger than 1.0 but the damping effect becomes\n * sensitive to the time step when the damping parameter is large.\n */\n linearDamping?: number;\n /**\n * Angular damping is use to reduce the angular velocity.\n * The damping parameter can be larger than 1.0 but the damping effect\n * becomes sensitive to the time step when the damping parameter is large.\n */\n angularDamping?: number;\n /**\n * Should this body be prevented from rotating? Useful for characters.\n */\n fixedRotation?: boolean;\n /**\n * Is this a fast moving body that should be prevented from\n * tunneling through other moving bodies? Note that all bodies are\n * prevented from tunneling through kinematic and static bodies. This\n * setting is only considered on dynamic bodies. Warning: You should use\n * this flag sparingly since it increases processing time.\n */\n bullet?: boolean;\n gravityScale?: number;\n /**\n * Set this flag to false if this body should never fall asleep. Note that this increases CPU usage.\n */\n allowSleep?: boolean;\n /**\n * Is this body initially awake or sleeping?\n */\n awake?: boolean;\n /**\n * Does this body start out active?\n */\n active?: boolean;\n userData?: any;\n}\n\nconst BodyDefDefault: BodyDef = {\n type : STATIC,\n position : Vec2.zero(),\n angle : 0.0,\n\n linearVelocity : Vec2.zero(),\n angularVelocity : 0.0,\n\n linearDamping : 0.0,\n angularDamping : 0.0,\n\n fixedRotation : false,\n bullet : false,\n gravityScale : 1.0,\n\n allowSleep : true,\n awake : true,\n active : true,\n\n userData : null\n};\n\n/**\n * MassData This holds the mass data computed for a shape.\n */\nexport class MassData {\n /** The mass of the shape, usually in kilograms. */\n mass: number = 0;\n /** The position of the shape's centroid relative to the shape's origin. */\n center: Vec2 = Vec2.zero();\n /** The rotational inertia of the shape about the local origin. */\n I: number = 0;\n}\n\n/**\n * A rigid body composed of one or more fixtures.\n *\n * To create a new Body use {@link World.createBody}.\n */\nexport default class Body {\n /**\n * A static body does not move under simulation and behaves as if it has infinite mass.\n * Internally, zero is stored for the mass and the inverse mass.\n * Static bodies can be moved manually by the user.\n * A static body has zero velocity.\n * Static bodies do not collide with other static or kinematic bodies.\n */\n static readonly STATIC: BodyType = 'static';\n /**\n * A kinematic body moves under simulation according to its velocity.\n * Kinematic bodies do not respond to forces.\n * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity.\n * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass.\n * Kinematic bodies do not collide with other kinematic or static bodies.\n */\n static readonly KINEMATIC: BodyType = 'kinematic';\n\n /**\n * A dynamic body is fully simulated.\n * They can be moved manually by the user, but normally they move according to forces.\n * A dynamic body can collide with all body types.\n * A dynamic body always has finite, non-zero mass.\n * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate.\n */\n static readonly DYNAMIC: BodyType = 'dynamic';\n\n /** @internal */ m_world: World;\n /** @internal */ m_awakeFlag: boolean;\n /** @internal */ m_autoSleepFlag: boolean;\n /** @internal */ m_bulletFlag: boolean;\n /** @internal */ m_fixedRotationFlag: boolean;\n /** @internal */ m_activeFlag: boolean;\n /** @internal */ m_islandFlag: boolean;\n /** @internal */ m_toiFlag: boolean;\n /** @internal */ m_userData: unknown;\n /** @internal */ m_type: BodyType;\n /** @internal */ m_mass: number;\n /** @internal */ m_invMass: number;\n /** @internal Rotational inertia about the center of mass. */\n m_I: number;\n /** @internal */ m_invI: number;\n /** @internal the body origin transform */\n m_xf: Transform;\n /** @internal the swept motion for CCD */\n m_sweep: Sweep;\n // position and velocity correction\n /** @internal */ c_velocity: Velocity;\n /** @internal */ c_position: Position;\n /** @internal */ m_force: Vec2;\n /** @internal */ m_torque: number;\n /** @internal */ m_linearVelocity: Vec2;\n /** @internal */ m_angularVelocity: number;\n /** @internal */ m_linearDamping: number;\n /** @internal */ m_angularDamping: number;\n /** @internal */ m_gravityScale: number;\n /** @internal */ m_sleepTime: number;\n /** @internal */ m_jointList: JointEdge | null;\n /** @internal */ m_contactList: ContactEdge | null;\n /** @internal */ m_fixtureList: Fixture | null;\n /** @internal */ m_prev: Body | null;\n /** @internal */ m_next: Body | null;\n /** @internal */ m_destroyed: boolean;\n\n /** @internal */\n constructor(world: World, def: BodyDef) {\n def = options(def, BodyDefDefault);\n\n _ASSERT && common.assert(Vec2.isValid(def.position));\n _ASSERT && common.assert(Vec2.isValid(def.linearVelocity));\n _ASSERT && common.assert(Math.isFinite(def.angle));\n _ASSERT && common.assert(Math.isFinite(def.angularVelocity));\n _ASSERT && common.assert(Math.isFinite(def.angularDamping) && def.angularDamping >= 0.0);\n _ASSERT && common.assert(Math.isFinite(def.linearDamping) && def.linearDamping >= 0.0);\n\n this.m_world = world;\n\n this.m_awakeFlag = def.awake;\n this.m_autoSleepFlag = def.allowSleep;\n this.m_bulletFlag = def.bullet;\n this.m_fixedRotationFlag = def.fixedRotation;\n this.m_activeFlag = def.active;\n\n this.m_islandFlag = false;\n this.m_toiFlag = false;\n\n this.m_userData = def.userData;\n this.m_type = def.type;\n\n if (this.m_type == DYNAMIC) {\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n } else {\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n }\n\n // Rotational inertia about the center of mass.\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n // the body origin transform\n this.m_xf = Transform.identity();\n this.m_xf.p = Vec2.clone(def.position);\n this.m_xf.q.setAngle(def.angle);\n\n // the swept motion for CCD\n this.m_sweep = new Sweep();\n this.m_sweep.setTransform(this.m_xf);\n\n // position and velocity correction\n this.c_velocity = new Velocity();\n this.c_position = new Position();\n\n this.m_force = Vec2.zero();\n this.m_torque = 0.0;\n\n this.m_linearVelocity = Vec2.clone(def.linearVelocity);\n this.m_angularVelocity = def.angularVelocity;\n\n this.m_linearDamping = def.linearDamping;\n this.m_angularDamping = def.angularDamping;\n this.m_gravityScale = def.gravityScale;\n\n this.m_sleepTime = 0.0;\n\n this.m_jointList = null;\n this.m_contactList = null;\n this.m_fixtureList = null;\n\n this.m_prev = null;\n this.m_next = null;\n\n this.m_destroyed = false;\n }\n\n /** @internal */\n _serialize(): object {\n const fixtures = [];\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n fixtures.push(f);\n }\n return {\n type: this.m_type,\n bullet: this.m_bulletFlag,\n position: this.m_xf.p,\n angle: this.m_xf.q.getAngle(),\n linearVelocity: this.m_linearVelocity,\n angularVelocity: this.m_angularVelocity,\n fixtures,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): Body {\n const body = new Body(world, data);\n\n if (data.fixtures) {\n for (let i = data.fixtures.length - 1; i >= 0; i--) {\n const fixture = restore(Fixture, data.fixtures[i], body);\n body._addFixture(fixture);\n }\n }\n return body;\n }\n\n isWorldLocked(): boolean {\n return this.m_world && this.m_world.isLocked() ? true : false;\n }\n\n getWorld(): World {\n return this.m_world;\n }\n\n getNext(): Body | null {\n return this.m_next;\n }\n\n setUserData(data: any): void {\n this.m_userData = data;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n getFixtureList(): Fixture | null {\n return this.m_fixtureList;\n }\n\n getJointList(): JointEdge | null {\n return this.m_jointList;\n }\n\n /**\n * Warning: this list changes during the time step and you may miss some\n * collisions if you don't use ContactListener.\n */\n getContactList(): ContactEdge | null {\n return this.m_contactList;\n }\n\n isStatic(): boolean {\n return this.m_type == STATIC;\n }\n\n isDynamic(): boolean {\n return this.m_type == DYNAMIC;\n }\n\n isKinematic(): boolean {\n return this.m_type == KINEMATIC;\n }\n\n /**\n * This will alter the mass and velocity.\n */\n setStatic(): Body {\n this.setType(STATIC);\n return this;\n }\n\n setDynamic(): Body {\n this.setType(DYNAMIC);\n return this;\n }\n\n setKinematic(): Body {\n this.setType(KINEMATIC);\n return this;\n }\n\n /**\n * @internal\n */\n getType(): BodyType {\n return this.m_type;\n }\n\n /**\n * @internal\n */\n setType(type: BodyType): void {\n _ASSERT && common.assert(type === STATIC || type === KINEMATIC || type === DYNAMIC);\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type == type) {\n return;\n }\n\n this.m_type = type;\n\n this.resetMassData();\n\n if (this.m_type == STATIC) {\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_sweep.forward();\n this.synchronizeFixtures();\n }\n\n this.setAwake(true);\n\n this.m_force.setZero();\n this.m_torque = 0.0;\n\n // Delete the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n\n // Touch the proxies so that new contacts will be created (when appropriate)\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n const proxyCount = f.m_proxyCount;\n for (let i = 0; i < proxyCount; ++i) {\n broadPhase.touchProxy(f.m_proxies[i].proxyId);\n }\n }\n }\n\n isBullet(): boolean {\n return this.m_bulletFlag;\n }\n\n /**\n * Should this body be treated like a bullet for continuous collision detection?\n */\n setBullet(flag: boolean): void {\n this.m_bulletFlag = !!flag;\n }\n\n isSleepingAllowed(): boolean {\n return this.m_autoSleepFlag;\n }\n\n setSleepingAllowed(flag: boolean): void {\n this.m_autoSleepFlag = !!flag;\n if (this.m_autoSleepFlag == false) {\n this.setAwake(true);\n }\n }\n\n isAwake(): boolean {\n return this.m_awakeFlag;\n }\n\n /**\n * Set the sleep state of the body. A sleeping body has very low CPU cost.\n *\n * @param flag Set to true to wake the body, false to put it to sleep.\n */\n setAwake(flag: boolean): void {\n if (flag) {\n if (this.m_awakeFlag == false) {\n this.m_awakeFlag = true;\n this.m_sleepTime = 0.0;\n }\n } else {\n this.m_awakeFlag = false;\n this.m_sleepTime = 0.0;\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_force.setZero();\n this.m_torque = 0.0;\n }\n }\n\n isActive(): boolean {\n return this.m_activeFlag;\n }\n\n /**\n * Set the active state of the body. An inactive body is not simulated and\n * cannot be collided with or woken up. If you pass a flag of true, all fixtures\n * will be added to the broad-phase. If you pass a flag of false, all fixtures\n * will be removed from the broad-phase and all contacts will be destroyed.\n * Fixtures and joints are otherwise unaffected.\n *\n * You may continue to create/destroy fixtures and joints on inactive bodies.\n * Fixtures on an inactive body are implicitly inactive and will not participate\n * in collisions, ray-casts, or queries. Joints connected to an inactive body\n * are implicitly inactive. An inactive body is still owned by a World object\n * and remains\n */\n setActive(flag: boolean): void {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (flag == this.m_activeFlag) {\n return;\n }\n\n this.m_activeFlag = !!flag;\n\n if (this.m_activeFlag) {\n // Create all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.createProxies(broadPhase, this.m_xf);\n }\n // Contacts are created the next time step.\n\n } else {\n // Destroy all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.destroyProxies(broadPhase);\n }\n\n // Destroy the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n }\n }\n\n isFixedRotation(): boolean {\n return this.m_fixedRotationFlag;\n }\n\n /**\n * Set this body to have fixed rotation. This causes the mass to be reset.\n */\n setFixedRotation(flag: boolean): void {\n if (this.m_fixedRotationFlag == flag) {\n return;\n }\n\n this.m_fixedRotationFlag = !!flag;\n\n this.m_angularVelocity = 0.0;\n\n this.resetMassData();\n }\n\n /**\n * Get the world transform for the body's origin.\n */\n getTransform(): Transform {\n return this.m_xf;\n }\n\n /**\n * Set the position of the body's origin and rotation. Manipulating a body's\n * transform may cause non-physical behavior. Note: contacts are updated on the\n * next call to World.step.\n *\n * @param position The world position of the body's local origin.\n * @param angle The world rotation in radians.\n */\n setTransform(position: Vec2, angle: number): void {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n this.m_xf.setNum(position, angle);\n this.m_sweep.setTransform(this.m_xf);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, this.m_xf, this.m_xf);\n }\n }\n\n synchronizeTransform(): void {\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Update fixtures in broad-phase.\n */\n synchronizeFixtures(): void {\n const xf = Transform.identity();\n\n this.m_sweep.getTransform(xf, 0);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, xf, this.m_xf);\n }\n }\n\n /**\n * Used in TOI.\n */\n advance(alpha: number): void {\n // Advance to the new safe time. This doesn't sync the broad-phase.\n this.m_sweep.advance(alpha);\n this.m_sweep.c.setVec2(this.m_sweep.c0);\n this.m_sweep.a = this.m_sweep.a0;\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Get the world position for the body's origin.\n */\n getPosition(): Vec2 {\n return this.m_xf.p;\n }\n\n setPosition(p: Vec2): void {\n this.setTransform(p, this.m_sweep.a);\n }\n\n /**\n * Get the current world rotation angle in radians.\n */\n getAngle(): number {\n return this.m_sweep.a;\n }\n\n setAngle(angle: number): void {\n this.setTransform(this.m_xf.p, angle);\n }\n\n /**\n * Get the world position of the center of mass.\n */\n getWorldCenter(): Vec2 {\n return this.m_sweep.c;\n }\n\n /**\n * Get the local position of the center of mass.\n */\n getLocalCenter(): Vec2 {\n return this.m_sweep.localCenter;\n }\n\n /**\n * Get the linear velocity of the center of mass.\n *\n * @return the linear velocity of the center of mass.\n */\n getLinearVelocity(): Vec2 {\n return this.m_linearVelocity;\n }\n\n /**\n * Get the world linear velocity of a world point attached to this body.\n *\n * @param worldPoint A point in world coordinates.\n */\n getLinearVelocityFromWorldPoint(worldPoint: Vec2): Vec2 {\n const localCenter = Vec2.sub(worldPoint, this.m_sweep.c);\n return Vec2.add(this.m_linearVelocity, Vec2.crossNumVec2(this.m_angularVelocity,\n localCenter));\n }\n\n /**\n * Get the world velocity of a local point.\n *\n * @param localPoint A point in local coordinates.\n */\n getLinearVelocityFromLocalPoint(localPoint: Vec2): Vec2 {\n return this.getLinearVelocityFromWorldPoint(this.getWorldPoint(localPoint));\n }\n\n /**\n * Set the linear velocity of the center of mass.\n *\n * @param v The new linear velocity of the center of mass.\n */\n setLinearVelocity(v: Vec2): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (Vec2.dot(v, v) > 0.0) {\n this.setAwake(true);\n }\n this.m_linearVelocity.setVec2(v);\n }\n\n /**\n * Get the angular velocity.\n *\n * @returns the angular velocity in radians/second.\n */\n getAngularVelocity(): number {\n return this.m_angularVelocity;\n }\n\n /**\n * Set the angular velocity.\n *\n * @param omega The new angular velocity in radians/second.\n */\n setAngularVelocity(w: number): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (w * w > 0.0) {\n this.setAwake(true);\n }\n this.m_angularVelocity = w;\n }\n\n getLinearDamping(): number {\n return this.m_linearDamping;\n }\n\n setLinearDamping(linearDamping: number): void {\n this.m_linearDamping = linearDamping;\n }\n\n getAngularDamping(): number {\n return this.m_angularDamping;\n }\n\n setAngularDamping(angularDamping: number): void {\n this.m_angularDamping = angularDamping;\n }\n\n getGravityScale(): number {\n return this.m_gravityScale;\n }\n\n /**\n * Scale the gravity applied to this body.\n */\n setGravityScale(scale: number): void {\n this.m_gravityScale = scale;\n }\n\n /**\n * Get the total mass of the body.\n *\n * @returns The mass, usually in kilograms (kg).\n */\n getMass(): number {\n return this.m_mass;\n }\n\n /**\n * Get the rotational inertia of the body about the local origin.\n *\n * @return the rotational inertia, usually in kg-m^2.\n */\n getInertia(): number {\n return this.m_I + this.m_mass\n * Vec2.dot(this.m_sweep.localCenter, this.m_sweep.localCenter);\n }\n\n /**\n * Copy the mass data of the body to data.\n */\n getMassData(data: MassData): void {\n data.mass = this.m_mass;\n data.I = this.getInertia();\n data.center.setVec2(this.m_sweep.localCenter);\n }\n\n /**\n * This resets the mass properties to the sum of the mass properties of the\n * fixtures. This normally does not need to be called unless you called\n * SetMassData to override the mass and you later want to reset the mass.\n */\n resetMassData(): void {\n // Compute mass data from shapes. Each shape has its own density.\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n this.m_sweep.localCenter.setZero();\n\n // Static and kinematic bodies have zero mass.\n if (this.isStatic() || this.isKinematic()) {\n this.m_sweep.c0.setVec2(this.m_xf.p);\n this.m_sweep.c.setVec2(this.m_xf.p);\n this.m_sweep.a0 = this.m_sweep.a;\n return;\n }\n\n _ASSERT && common.assert(this.isDynamic());\n\n // Accumulate mass over all fixtures.\n const localCenter = Vec2.zero();\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n if (f.m_density == 0.0) {\n continue;\n }\n\n const massData = new MassData();\n f.getMassData(massData);\n this.m_mass += massData.mass;\n localCenter.addMul(massData.mass, massData.center);\n this.m_I += massData.I;\n }\n\n // Compute center of mass.\n if (this.m_mass > 0.0) {\n this.m_invMass = 1.0 / this.m_mass;\n localCenter.mul(this.m_invMass);\n\n } else {\n // Force all dynamic bodies to have a positive mass.\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n }\n\n if (this.m_I > 0.0 && this.m_fixedRotationFlag == false) {\n // Center the inertia about the center of mass.\n this.m_I -= this.m_mass * Vec2.dot(localCenter, localCenter);\n _ASSERT && common.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n\n } else {\n this.m_I = 0.0;\n this.m_invI = 0.0;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(localCenter, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Set the mass properties to override the mass properties of the fixtures. Note\n * that this changes the center of mass position. Note that creating or\n * destroying fixtures can also alter the mass. This function has no effect if\n * the body isn't dynamic.\n *\n * @param massData The mass properties.\n */\n setMassData(massData: MassData): void {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n this.m_mass = massData.mass;\n if (this.m_mass <= 0.0) {\n this.m_mass = 1.0;\n }\n\n this.m_invMass = 1.0 / this.m_mass;\n\n if (massData.I > 0.0 && this.m_fixedRotationFlag == false) {\n this.m_I = massData.I - this.m_mass\n * Vec2.dot(massData.center, massData.center);\n _ASSERT && common.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(massData.center, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Apply a force at a world point. If the force is not applied at the center of\n * mass, it will generate a torque and affect the angular velocity. This wakes\n * up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyForce(force: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping.\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n this.m_torque += Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), force);\n }\n }\n\n /**\n * Apply a force to the center of mass. This wakes up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param wake Also wake up the body\n */\n applyForceToCenter(force: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n }\n }\n\n /**\n * Apply a torque. This affects the angular velocity without affecting the\n * linear velocity of the center of mass. This wakes up the body.\n *\n * @param torque About the z-axis (out of the screen), usually in N-m.\n * @param wake Also wake up the body\n */\n applyTorque(torque: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_torque += torque;\n }\n }\n\n /**\n * Apply an impulse at a point. This immediately modifies the velocity. It also\n * modifies the angular velocity if the point of application is not at the\n * center of mass. This wakes up the body.\n *\n * @param impulse The world impulse vector, usually in N-seconds or kg-m/s.\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyLinearImpulse(impulse: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_linearVelocity.addMul(this.m_invMass, impulse);\n this.m_angularVelocity += this.m_invI * Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), impulse);\n }\n }\n\n /**\n * Apply an angular impulse.\n *\n * @param impulse The angular impulse in units of kg*m*m/s\n * @param wake Also wake up the body\n */\n applyAngularImpulse(impulse: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_angularVelocity += this.m_invI * impulse;\n }\n }\n\n /**\n * This is used to prevent connected bodies (by joints) from colliding,\n * depending on the joint's collideConnected flag.\n */\n shouldCollide(that: Body): boolean {\n // At least one body should be dynamic.\n if (this.m_type != DYNAMIC && that.m_type != DYNAMIC) {\n return false;\n }\n // Does a joint prevent collision?\n for (let jn = this.m_jointList; jn; jn = jn.next) {\n if (jn.other == that) {\n if (jn.joint.m_collideConnected == false) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addFixture(fixture: Fixture): Fixture {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.createProxies(broadPhase, this.m_xf);\n }\n\n fixture.m_next = this.m_fixtureList;\n this.m_fixtureList = fixture;\n\n // Adjust mass properties if needed.\n if (fixture.m_density > 0.0) {\n this.resetMassData();\n }\n\n // Let the world know we have a new fixture. This will cause new contacts\n // to be created at the beginning of the next time step.\n this.m_world.m_newFixture = true;\n\n return fixture;\n }\n\n /**\n * Creates a fixture and attach it to this body.\n *\n * If the density is non-zero, this function automatically updates the mass of\n * the body.\n *\n * Contacts are not created until the next time step.\n *\n * Warning: This function is locked during callbacks.\n */\n createFixture(def: FixtureDef): Fixture;\n createFixture(shape: Shape, opt?: FixtureOpt): Fixture;\n createFixture(shape: Shape, density?: number): Fixture;\n // tslint:disable-next-line:typedef\n createFixture(shape, fixdef?) {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n const fixture = new Fixture(this, shape, fixdef);\n this._addFixture(fixture);\n return fixture;\n }\n\n /**\n * Destroy a fixture. This removes the fixture from the broad-phase and destroys\n * all contacts associated with this fixture. This will automatically adjust the\n * mass of the body if the body is dynamic and the fixture has positive density.\n * All fixtures attached to a body are implicitly destroyed when the body is\n * destroyed.\n *\n * Warning: This function is locked during callbacks.\n *\n * @param fixture The fixture to be removed.\n */\n destroyFixture(fixture: Fixture): void {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n _ASSERT && common.assert(fixture.m_body == this);\n\n // Remove the fixture from this body's singly linked list.\n let found = false;\n if (this.m_fixtureList === fixture) {\n this.m_fixtureList = fixture.m_next;\n found = true;\n\n } else {\n let node = this.m_fixtureList;\n while (node != null) {\n if (node.m_next === fixture) {\n node.m_next = fixture.m_next;\n found = true;\n break;\n }\n node = node.m_next;\n }\n }\n\n // You tried to remove a shape that is not attached to this body.\n _ASSERT && common.assert(found);\n\n // Destroy any contacts associated with the fixture.\n let edge = this.m_contactList;\n while (edge) {\n const c = edge.contact;\n edge = edge.next;\n\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n\n if (fixture == fixtureA || fixture == fixtureB) {\n // This destroys the contact and removes it from\n // this body's contact list.\n this.m_world.destroyContact(c);\n }\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.destroyProxies(broadPhase);\n }\n\n fixture.m_body = null;\n fixture.m_next = null;\n\n this.m_world.publish('remove-fixture', fixture);\n\n // Reset the mass data.\n this.resetMassData();\n }\n\n /**\n * Get the corresponding world point of a local point.\n */\n getWorldPoint(localPoint: Vec2): Vec2 {\n return Transform.mulVec2(this.m_xf, localPoint);\n }\n\n /**\n * Get the corresponding world vector of a local vector.\n */\n getWorldVector(localVector: Vec2): Vec2 {\n return Rot.mulVec2(this.m_xf.q, localVector);\n }\n\n /**\n * Gets the corresponding local point of a world point.\n */\n getLocalPoint(worldPoint: Vec2): Vec2 {\n return Transform.mulTVec2(this.m_xf, worldPoint);\n }\n\n /**\n * Gets the corresponding local vector of a world vector.\n */\n getLocalVector(worldVector: Vec2): Vec2 {\n return Rot.mulTVec2(this.m_xf.q, worldVector);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from './Vec2';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 2-by-2 matrix. Stored in column-major order.\n */\nexport default class Mat22 {\n ex: Vec2;\n ey: Vec2;\n\n constructor(a: number, b: number, c: number, d: number);\n constructor(a: { x: number; y: number }, b: { x: number; y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(a?, b?, c?, d?) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec2.clone(a);\n this.ey = Vec2.clone(b);\n } else if (typeof a === 'number') {\n this.ex = Vec2.neo(a, c);\n this.ey = Vec2.neo(b, d);\n } else {\n this.ex = Vec2.zero();\n this.ey = Vec2.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.ex) && Vec2.isValid(obj.ey);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Mat22.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Mat22!');\n }\n }\n\n set(a: Mat22): void;\n set(a: Vec2, b: Vec2): void;\n set(a: number, b: number, c: number, d: number): void;\n // tslint:disable-next-line:typedef\n set(a, b?, c?, d?): void {\n if (typeof a === 'number' && typeof b === 'number' && typeof c === 'number'\n && typeof d === 'number') {\n this.ex.setNum(a, c);\n this.ey.setNum(b, d);\n\n } else if (typeof a === 'object' && typeof b === 'object') {\n this.ex.setVec2(a);\n this.ey.setVec2(b);\n\n } else if (typeof a === 'object') {\n _ASSERT && Mat22.assert(a);\n this.ex.setVec2(a.ex);\n this.ey.setVec2(a.ey);\n\n } else {\n _ASSERT && common.assert(false);\n }\n }\n\n setIdentity(): void {\n this.ex.x = 1.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 1.0;\n }\n\n setZero(): void {\n this.ex.x = 0.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 0.0;\n }\n\n getInverse(): Mat22 {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const imx = new Mat22();\n imx.ex.x = det * d;\n imx.ey.x = -det * b;\n imx.ex.y = -det * c;\n imx.ey.y = det * a;\n return imx;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const w = Vec2.zero();\n w.x = det * (d * v.x - b * v.y);\n w.y = det * (a * v.y - c * v.x);\n return w;\n }\n\n /**\n * Multiply a matrix times a vector. If a rotation matrix is provided, then this\n * transforms the vector from one frame to another.\n */\n static mul(mx: Mat22, my: Mat22): Mat22;\n static mul(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(mx, v) {\n if (v && 'x' in v && 'y' in v) {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n _ASSERT && common.assert(false);\n }\n\n static mulVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n }\n\n static mulMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n /**\n * Multiply a matrix transpose times a vector. If a rotation matrix is provided,\n * then this transforms the vector from one frame to another (inverse\n * transform).\n */\n static mulT(mx: Mat22, my: Mat22): Mat22;\n static mulT(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(mx, v) {\n if (v && 'x' in v && 'y' in v) { // Vec2\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n _ASSERT && common.assert(false);\n }\n\n static mulTVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n }\n\n static mulTMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n static abs(mx: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n return new Mat22(Vec2.abs(mx.ex), Vec2.abs(mx.ey));\n }\n\n static add(mx1: Mat22, mx2: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx1);\n _ASSERT && Mat22.assert(mx2);\n return new Mat22(Vec2.add(mx1.ex, mx2.ex), Vec2.add(mx1.ey, mx2.ey));\n }\n}\n","export default {\n gjkCalls: 0,\n gjkIters: 0,\n gjkMaxIters: 0,\n\n toiTime: 0,\n toiMaxTime: 0,\n toiCalls: 0,\n toiIters: 0,\n toiMaxIters: 0,\n toiRootIters: 0,\n toiMaxRootIters: 0,\n\n toString(newline?: string): string {\n newline = typeof newline === 'string' ? newline : '\\n';\n let string = \"\";\n // tslint:disable-next-line:no-for-in\n for (const name in this) {\n if (typeof this[name] !== 'function' && typeof this[name] !== 'object') {\n string += name + ': ' + this[name] + newline;\n }\n }\n return string;\n }\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../Settings';\nimport stats from '../util/stats';\nimport common from '../util/common';\n\nimport Shape from './Shape';\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\nimport Rot from '../common/Rot';\nimport Transform from '../common/Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates.\n */\n\nstats.gjkCalls = 0;\nstats.gjkIters = 0;\nstats.gjkMaxIters = 0;\n\n/**\n * Input for Distance. You have to option to use the shape radii in the\n * computation. Even\n */\nexport class DistanceInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n transformA: Transform | null = null;\n transformB: Transform | null = null;\n useRadii: boolean = false;\n}\n\n/**\n * Output for Distance.\n *\n * @prop {Vec2} pointA closest point on shapeA\n * @prop {Vec2} pointB closest point on shapeB\n * @prop distance\n * @prop iterations number of GJK iterations used\n */\nexport class DistanceOutput {\n pointA: Vec2 = Vec2.zero();\n pointB: Vec2 = Vec2.zero();\n distance: number;\n iterations: number;\n}\n\n/**\n * Used to warm start Distance. Set count to zero on first call.\n *\n * @prop {number} metric length or area\n * @prop {array} indexA vertices on shape A\n * @prop {array} indexB vertices on shape B\n * @prop {number} count\n */\nexport class SimplexCache {\n metric: number = 0;\n indexA: number[] = [];\n indexB: number[] = [];\n count: number = 0;\n}\n\n/**\n * Compute the closest points between two shapes. Supports any combination of:\n * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On\n * the first call set SimplexCache.count to zero.\n */\nexport default function Distance(output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void {\n ++stats.gjkCalls;\n\n const proxyA = input.proxyA;\n const proxyB = input.proxyB;\n const xfA = input.transformA;\n const xfB = input.transformB;\n\n // Initialize the simplex.\n const simplex = new Simplex();\n simplex.readCache(cache, proxyA, xfA, proxyB, xfB);\n\n // Get simplex vertices as an array.\n const vertices = simplex.m_v;\n const k_maxIters = Settings.maxDistnceIterations;\n\n // These store the vertices of the last simplex so that we\n // can check for duplicates and prevent cycling.\n const saveA = [];\n const saveB = []; // int[3]\n let saveCount = 0;\n\n let distanceSqr1 = Infinity;\n let distanceSqr2 = Infinity;\n\n // Main iteration loop.\n let iter = 0;\n while (iter < k_maxIters) {\n // Copy simplex so we can identify duplicates.\n saveCount = simplex.m_count;\n for (let i = 0; i < saveCount; ++i) {\n saveA[i] = vertices[i].indexA;\n saveB[i] = vertices[i].indexB;\n }\n\n simplex.solve();\n\n // If we have 3 points, then the origin is in the corresponding triangle.\n if (simplex.m_count === 3) {\n break;\n }\n\n // Compute closest point.\n const p = simplex.getClosestPoint();\n distanceSqr2 = p.lengthSquared();\n\n // Ensure progress\n if (distanceSqr2 >= distanceSqr1) {\n // break;\n }\n distanceSqr1 = distanceSqr2;\n\n // Get search direction.\n const d = simplex.getSearchDirection();\n\n // Ensure the search direction is numerically fit.\n if (d.lengthSquared() < Math.EPSILON * Math.EPSILON) {\n // The origin is probably contained by a line segment\n // or triangle. Thus the shapes are overlapped.\n\n // We can't return zero here even though there may be overlap.\n // In case the simplex is a point, segment, or triangle it is difficult\n // to determine if the origin is contained in the CSO or very close to it.\n break;\n }\n\n // Compute a tentative new simplex vertex using support points.\n const vertex = vertices[simplex.m_count]; // SimplexVertex\n\n vertex.indexA = proxyA.getSupport(Rot.mulTVec2(xfA.q, Vec2.neg(d)));\n vertex.wA = Transform.mulVec2(xfA, proxyA.getVertex(vertex.indexA));\n\n vertex.indexB = proxyB.getSupport(Rot.mulTVec2(xfB.q, d));\n vertex.wB = Transform.mulVec2(xfB, proxyB.getVertex(vertex.indexB));\n\n vertex.w = Vec2.sub(vertex.wB, vertex.wA);\n\n // Iteration count is equated to the number of support point calls.\n ++iter;\n ++stats.gjkIters;\n\n // Check for duplicate support points. This is the main termination\n // criteria.\n let duplicate = false;\n for (let i = 0; i < saveCount; ++i) {\n if (vertex.indexA === saveA[i] && vertex.indexB === saveB[i]) {\n duplicate = true;\n break;\n }\n }\n\n // If we found a duplicate support point we must exit to avoid cycling.\n if (duplicate) {\n break;\n }\n\n // New vertex is ok and needed.\n ++simplex.m_count;\n }\n\n stats.gjkMaxIters = Math.max(stats.gjkMaxIters, iter);\n\n // Prepare output.\n simplex.getWitnessPoints(output.pointA, output.pointB);\n output.distance = Vec2.distance(output.pointA, output.pointB);\n output.iterations = iter;\n\n // Cache the simplex.\n simplex.writeCache(cache);\n\n // Apply radii if requested.\n if (input.useRadii) {\n const rA = proxyA.m_radius;\n const rB = proxyB.m_radius;\n\n if (output.distance > rA + rB && output.distance > Math.EPSILON) {\n // Shapes are still no overlapped.\n // Move the witness points to the outer surface.\n output.distance -= rA + rB;\n const normal = Vec2.sub(output.pointB, output.pointA);\n normal.normalize();\n output.pointA.addMul(rA, normal);\n output.pointB.subMul(rB, normal);\n } else {\n // Shapes are overlapped when radii are considered.\n // Move the witness points to the middle.\n const p = Vec2.mid(output.pointA, output.pointB);\n output.pointA.setVec2(p);\n output.pointB.setVec2(p);\n output.distance = 0.0;\n }\n }\n}\n\n/**\n * A distance proxy is used by the GJK algorithm. It encapsulates any shape.\n */\nexport class DistanceProxy {\n /** internal */ m_buffer: Vec2[];\n /** internal */ m_vertices: Vec2[];\n /** internal */ m_count: number;\n /** internal */ m_radius: number;\n\n\n constructor() {\n this.m_buffer = []; // Vec2[2]\n this.m_vertices = []; // Vec2[]\n this.m_count = 0;\n this.m_radius = 0;\n }\n\n /**\n * Get the vertex count.\n */\n getVertexCount(): number {\n return this.m_count;\n }\n\n /**\n * Get a vertex by index. Used by Distance.\n */\n getVertex(index: number): Vec2 {\n _ASSERT && common.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * Get the supporting vertex index in the given direction.\n */\n getSupport(d: Vec2): number {\n let bestIndex = 0;\n let bestValue = Vec2.dot(this.m_vertices[0], d);\n for (let i = 0; i < this.m_count; ++i) {\n const value = Vec2.dot(this.m_vertices[i], d);\n if (value > bestValue) {\n bestIndex = i;\n bestValue = value;\n }\n }\n return bestIndex;\n }\n\n /**\n * Get the supporting vertex in the given direction.\n */\n getSupportVertex(d: Vec2): Vec2 {\n return this.m_vertices[this.getSupport(d)];\n }\n\n /**\n * Initialize the proxy using the given shape. The shape must remain in scope\n * while the proxy is in use.\n */\n set(shape: Shape, index: number): void {\n // TODO remove, use shape instead\n _ASSERT && common.assert(typeof shape.computeDistanceProxy === 'function');\n shape.computeDistanceProxy(this, index);\n }\n}\n\nclass SimplexVertex {\n /** support point in proxyA */\n wA: Vec2 = Vec2.zero();\n /** wA index */\n indexA: number;\n\n /** support point in proxyB */\n wB: Vec2 = Vec2.zero();\n /** wB index */\n indexB: number;\n\n /** wB - wA; */\n w: Vec2 = Vec2.zero();\n /** barycentric coordinate for closest point */\n a: number;\n\n set(v: SimplexVertex): void {\n this.indexA = v.indexA;\n this.indexB = v.indexB;\n this.wA = Vec2.clone(v.wA);\n this.wB = Vec2.clone(v.wB);\n this.w = Vec2.clone(v.w);\n this.a = v.a;\n }\n}\n\nclass Simplex {\n m_v1: SimplexVertex;\n m_v2: SimplexVertex;\n m_v3: SimplexVertex;\n m_v: SimplexVertex[];\n m_count: number;\n\n constructor() {\n this.m_v1 = new SimplexVertex();\n this.m_v2 = new SimplexVertex();\n this.m_v3 = new SimplexVertex();\n this.m_v = [ this.m_v1, this.m_v2, this.m_v3 ];\n this.m_count;\n }\n\n /** @internal */\n toString(): string {\n if (this.m_count === 3) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y,\n this.m_v3.a, this.m_v3.wA.x, this.m_v3.wA.y, this.m_v3.wB.x, this.m_v3.wB.y\n ].toString();\n\n } else if (this.m_count === 2) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y\n ].toString();\n\n } else if (this.m_count === 1) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y\n ].toString();\n\n } else {\n return \"+\" + this.m_count;\n }\n }\n\n readCache(cache: SimplexCache, proxyA: DistanceProxy, transformA: Transform, proxyB: DistanceProxy, transformB: Transform): void {\n _ASSERT && common.assert(cache.count <= 3);\n\n // Copy data from cache.\n this.m_count = cache.count;\n for (let i = 0; i < this.m_count; ++i) {\n const v = this.m_v[i];\n v.indexA = cache.indexA[i];\n v.indexB = cache.indexB[i];\n const wALocal = proxyA.getVertex(v.indexA);\n const wBLocal = proxyB.getVertex(v.indexB);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 0.0;\n }\n\n // Compute the new simplex metric, if it is substantially different than\n // old metric then flush the simplex.\n if (this.m_count > 1) {\n const metric1 = cache.metric;\n const metric2 = this.getMetric();\n if (metric2 < 0.5 * metric1 || 2.0 * metric1 < metric2\n || metric2 < Math.EPSILON) {\n // Reset the simplex.\n this.m_count = 0;\n }\n }\n\n // If the cache is empty or invalid...\n if (this.m_count === 0) {\n const v = this.m_v[0];\n v.indexA = 0;\n v.indexB = 0;\n const wALocal = proxyA.getVertex(0);\n const wBLocal = proxyB.getVertex(0);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 1.0;\n this.m_count = 1;\n }\n }\n\n writeCache(cache: SimplexCache): void {\n cache.metric = this.getMetric();\n cache.count = this.m_count;\n for (let i = 0; i < this.m_count; ++i) {\n cache.indexA[i] = this.m_v[i].indexA;\n cache.indexB[i] = this.m_v[i].indexB;\n }\n }\n\n getSearchDirection(): Vec2 {\n switch (this.m_count) {\n case 1:\n return Vec2.neg(this.m_v1.w);\n\n case 2: {\n const e12 = Vec2.sub(this.m_v2.w, this.m_v1.w);\n const sgn = Vec2.crossVec2Vec2(e12, Vec2.neg(this.m_v1.w));\n if (sgn > 0.0) {\n // Origin is left of e12.\n return Vec2.crossNumVec2(1.0, e12);\n } else {\n // Origin is right of e12.\n return Vec2.crossVec2Num(e12, 1.0);\n }\n }\n\n default:\n _ASSERT && common.assert(false);\n return Vec2.zero();\n }\n }\n\n getClosestPoint(): Vec2 {\n switch (this.m_count) {\n case 0:\n _ASSERT && common.assert(false);\n return Vec2.zero();\n\n case 1:\n return Vec2.clone(this.m_v1.w);\n\n case 2:\n return Vec2.combine(this.m_v1.a, this.m_v1.w, this.m_v2.a, this.m_v2.w);\n\n case 3:\n return Vec2.zero();\n\n default:\n _ASSERT && common.assert(false);\n return Vec2.zero();\n }\n }\n\n getWitnessPoints(pA: Vec2, pB: Vec2): void {\n switch (this.m_count) {\n case 0:\n _ASSERT && common.assert(false);\n break;\n\n case 1:\n pA.setVec2(this.m_v1.wA);\n pB.setVec2(this.m_v1.wB);\n break;\n\n case 2:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pB.setCombine(this.m_v1.a, this.m_v1.wB, this.m_v2.a, this.m_v2.wB);\n break;\n\n case 3:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pA.addMul(this.m_v3.a, this.m_v3.wA);\n pB.setVec2(pA);\n break;\n\n default:\n _ASSERT && common.assert(false);\n break;\n }\n }\n\n getMetric(): number {\n switch (this.m_count) {\n case 0:\n _ASSERT && common.assert(false);\n return 0.0;\n\n case 1:\n return 0.0;\n\n case 2:\n return Vec2.distance(this.m_v1.w, this.m_v2.w);\n\n case 3:\n return Vec2.crossVec2Vec2(Vec2.sub(this.m_v2.w, this.m_v1.w), Vec2.sub(this.m_v3.w,\n this.m_v1.w));\n\n default:\n _ASSERT && common.assert(false);\n return 0.0;\n }\n }\n\n solve(): void {\n switch (this.m_count) {\n case 1:\n break;\n\n case 2:\n this.solve2();\n break;\n\n case 3:\n this.solve3();\n break;\n\n default:\n _ASSERT && common.assert(false);\n }\n }\n\n// Solve a line segment using barycentric coordinates.\n//\n// p = a1 * w1 + a2 * w2\n// a1 + a2 = 1\n//\n// The vector from the origin to the closest point on the line is\n// perpendicular to the line.\n// e12 = w2 - w1\n// dot(p, e) = 0\n// a1 * dot(w1, e) + a2 * dot(w2, e) = 0\n//\n// 2-by-2 linear system\n// [1 1 ][a1] = [1]\n// [w1.e12 w2.e12][a2] = [0]\n//\n// Define\n// d12_1 = dot(w2, e12)\n// d12_2 = -dot(w1, e12)\n// d12 = d12_1 + d12_2\n//\n// Solution\n// a1 = d12_1 / d12\n// a2 = d12_2 / d12\n solve2(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const e12 = Vec2.sub(w2, w1);\n\n // w1 region\n const d12_2 = -Vec2.dot(w1, e12);\n if (d12_2 <= 0.0) {\n // a2 <= 0, so we clamp it to 0\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // w2 region\n const d12_1 = Vec2.dot(w2, e12);\n if (d12_1 <= 0.0) {\n // a1 <= 0, so we clamp it to 0\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // Must be in e12 region.\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n }\n\n// Possible regions:\n// - points[2]\n// - edge points[0]-points[2]\n// - edge points[1]-points[2]\n// - inside the triangle\n solve3(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const w3 = this.m_v3.w;\n\n // Edge12\n // [1 1 ][a1] = [1]\n // [w1.e12 w2.e12][a2] = [0]\n // a3 = 0\n const e12 = Vec2.sub(w2, w1);\n const w1e12 = Vec2.dot(w1, e12);\n const w2e12 = Vec2.dot(w2, e12);\n const d12_1 = w2e12;\n const d12_2 = -w1e12;\n\n // Edge13\n // [1 1 ][a1] = [1]\n // [w1.e13 w3.e13][a3] = [0]\n // a2 = 0\n const e13 = Vec2.sub(w3, w1);\n const w1e13 = Vec2.dot(w1, e13);\n const w3e13 = Vec2.dot(w3, e13);\n const d13_1 = w3e13;\n const d13_2 = -w1e13;\n\n // Edge23\n // [1 1 ][a2] = [1]\n // [w2.e23 w3.e23][a3] = [0]\n // a1 = 0\n const e23 = Vec2.sub(w3, w2);\n const w2e23 = Vec2.dot(w2, e23);\n const w3e23 = Vec2.dot(w3, e23);\n const d23_1 = w3e23;\n const d23_2 = -w2e23;\n\n // Triangle123\n const n123 = Vec2.crossVec2Vec2(e12, e13);\n\n const d123_1 = n123 * Vec2.crossVec2Vec2(w2, w3);\n const d123_2 = n123 * Vec2.crossVec2Vec2(w3, w1);\n const d123_3 = n123 * Vec2.crossVec2Vec2(w1, w2);\n\n // w1 region\n if (d12_2 <= 0.0 && d13_2 <= 0.0) {\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // e12\n if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) {\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n return;\n }\n\n // e13\n if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) {\n const inv_d13 = 1.0 / (d13_1 + d13_2);\n this.m_v1.a = d13_1 * inv_d13;\n this.m_v3.a = d13_2 * inv_d13;\n this.m_count = 2;\n this.m_v2.set(this.m_v3);\n return;\n }\n\n // w2 region\n if (d12_1 <= 0.0 && d23_2 <= 0.0) {\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // w3 region\n if (d13_1 <= 0.0 && d23_1 <= 0.0) {\n this.m_v3.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // e23\n if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) {\n const inv_d23 = 1.0 / (d23_1 + d23_2);\n this.m_v2.a = d23_1 * inv_d23;\n this.m_v3.a = d23_2 * inv_d23;\n this.m_count = 2;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // Must be in triangle123\n const inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3);\n this.m_v1.a = d123_1 * inv_d123;\n this.m_v2.a = d123_2 * inv_d123;\n this.m_v3.a = d123_3 * inv_d123;\n this.m_count = 3;\n }\n}\n\n\n/**\n * Determine if two generic shapes overlap.\n */\nexport function testOverlap(shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform): boolean {\n const input = new DistanceInput();\n input.proxyA.set(shapeA, indexA);\n input.proxyB.set(shapeB, indexB);\n input.transformA = xfA;\n input.transformB = xfB;\n input.useRadii = true;\n\n const cache = new SimplexCache();\n const output = new DistanceOutput();\n\n Distance(output, cache, input);\n\n return output.distance < 10.0 * Math.EPSILON;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { ShapeType } from \"../collision/Shape\";\nimport common from '../util/common';\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\nimport Transform from '../common/Transform';\nimport Mat22 from '../common/Mat22';\nimport Rot from '../common/Rot';\nimport Settings from '../Settings';\nimport Manifold, { ManifoldType, WorldManifold } from '../collision/Manifold';\nimport { testOverlap } from '../collision/Distance';\nimport Fixture from \"./Fixture\";\nimport Body from \"./Body\";\nimport { ContactImpulse, TimeStep } from \"./Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst DEBUG_SOLVER = false;\n\n/**\n * A contact edge is used to connect bodies and contacts together in a contact\n * graph where each body is a node and each contact is an edge. A contact edge\n * belongs to a doubly linked list maintained in each attached body. Each\n * contact has two contact nodes, one for each attached body.\n *\n * @prop {Contact} contact The contact\n * @prop {ContactEdge} prev The previous contact edge in the body's contact list\n * @prop {ContactEdge} next The next contact edge in the body's contact list\n * @prop {Body} other Provides quick access to the other body attached.\n */\nexport class ContactEdge {\n contact: Contact;\n prev: ContactEdge | undefined;\n next: ContactEdge | undefined;\n other: Body | undefined;\n constructor(contact: Contact) {\n this.contact = contact;\n }\n}\n\nexport type EvaluateFunction = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void;\n\nexport type ContactCallback = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void /* & { destroyFcn?: (contact: Contact) => void }*/;\n\n\n/**\n * Friction mixing law. The idea is to allow either fixture to drive the\n * restitution to zero. For example, anything slides on ice.\n */\nexport function mixFriction(friction1: number, friction2: number): number {\n return Math.sqrt(friction1 * friction2);\n}\n\n/**\n * Restitution mixing law. The idea is allow for anything to bounce off an\n * inelastic surface. For example, a superball bounces on anything.\n */\nexport function mixRestitution(restitution1: number, restitution2: number): number {\n return restitution1 > restitution2 ? restitution1 : restitution2;\n}\n\n// TODO: move this to Settings?\nconst s_registers = [];\n\n// TODO: merge with ManifoldPoint?\nexport class VelocityConstraintPoint {\n rA: Vec2 = Vec2.zero();\n rB: Vec2 = Vec2.zero();\n normalImpulse: number = 0;\n tangentImpulse: number = 0;\n normalMass: number = 0;\n tangentMass: number = 0;\n velocityBias: number = 0;\n}\n\n/**\n * The class manages contact between two shapes. A contact exists for each\n * overlapping AABB in the broad-phase (except if filtered). Therefore a contact\n * object may exist that has no contact points.\n */\nexport default class Contact {\n /** @internal */\n m_nodeA: ContactEdge;\n /** @internal */\n m_nodeB: ContactEdge;\n /** @internal */\n m_fixtureA: Fixture;\n /** @internal */\n m_fixtureB: Fixture;\n /** @internal */\n m_indexA: number;\n /** @internal */\n m_indexB: number;\n /** @internal */\n m_evaluateFcn: EvaluateFunction;\n /** @internal */\n m_manifold: Manifold = new Manifold();\n /** @internal */\n m_prev: Contact | null = null;\n /** @internal */\n m_next: Contact | null = null;\n /** @internal */\n m_toi: number = 1.0;\n /** @internal */\n m_toiCount: number = 0;\n /** @internal This contact has a valid TOI in m_toi */\n m_toiFlag: boolean = false;\n /** @internal */\n m_friction: number;\n /** @internal */\n m_restitution: number;\n /** @internal */\n m_tangentSpeed: number = 0.0;\n /** @internal This contact can be disabled (by user) */\n m_enabledFlag: boolean = true;\n /** @internal Used when crawling contact graph when forming islands. */\n m_islandFlag: boolean = false;\n /** @internal Set when the shapes are touching. */\n m_touchingFlag: boolean = false;\n /** @internal This contact needs filtering because a fixture filter was changed. */\n m_filterFlag: boolean = false;\n /** @internal This bullet contact had a TOI event */\n m_bulletHitFlag: boolean = false;\n\n /** @internal Contact reporting impulse object cache */\n m_impulse: ContactImpulse = new ContactImpulse(this);\n\n // VelocityConstraint\n /** @internal */ v_points: VelocityConstraintPoint[] = []; // [maxManifoldPoints];\n /** @internal */ v_normal: Vec2 = Vec2.zero();\n /** @internal */ v_normalMass: Mat22 = new Mat22();\n /** @internal */ v_K: Mat22 = new Mat22();\n /** @internal */ v_pointCount: number;\n /** @internal */ v_tangentSpeed: number | undefined;\n /** @internal */ v_friction: number | undefined;\n /** @internal */ v_restitution: number | undefined;\n /** @internal */ v_invMassA: number | undefined;\n /** @internal */ v_invMassB: number | undefined;\n /** @internal */ v_invIA: number | undefined;\n /** @internal */ v_invIB: number | undefined;\n\n // PositionConstraint\n /** @internal */ p_localPoints: Vec2[] = []; // [maxManifoldPoints];\n /** @internal */ p_localNormal: Vec2 = Vec2.zero();\n /** @internal */ p_localPoint: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterA: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterB: Vec2 = Vec2.zero();\n /** @internal */ p_type: ManifoldType | undefined;\n /** @internal */ p_radiusA: number | undefined;\n /** @internal */ p_radiusB: number | undefined;\n /** @internal */ p_pointCount: number | undefined;\n /** @internal */ p_invMassA: number | undefined;\n /** @internal */ p_invMassB: number | undefined;\n /** @internal */ p_invIA: number | undefined;\n /** @internal */ p_invIB: number | undefined;\n\n constructor(fA: Fixture, indexA: number, fB: Fixture, indexB: number, evaluateFcn: EvaluateFunction) {\n // Nodes for connecting bodies.\n this.m_nodeA = new ContactEdge(this);\n this.m_nodeB = new ContactEdge(this);\n\n this.m_fixtureA = fA;\n this.m_fixtureB = fB;\n\n this.m_indexA = indexA;\n this.m_indexB = indexB;\n\n this.m_evaluateFcn = evaluateFcn;\n\n this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction);\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution);\n }\n\n initConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const shapeA = fixtureA.getShape();\n const shapeB = fixtureB.getShape();\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const manifold = this.getManifold();\n\n const pointCount = manifold.pointCount;\n _ASSERT && common.assert(pointCount > 0);\n\n this.v_invMassA = bodyA.m_invMass;\n this.v_invMassB = bodyB.m_invMass;\n this.v_invIA = bodyA.m_invI;\n this.v_invIB = bodyB.m_invI;\n\n this.v_friction = this.m_friction;\n this.v_restitution = this.m_restitution;\n this.v_tangentSpeed = this.m_tangentSpeed;\n\n this.v_pointCount = pointCount;\n\n this.v_K.setZero();\n this.v_normalMass.setZero();\n\n this.p_invMassA = bodyA.m_invMass;\n this.p_invMassB = bodyB.m_invMass;\n this.p_invIA = bodyA.m_invI;\n this.p_invIB = bodyB.m_invI;\n this.p_localCenterA = Vec2.clone(bodyA.m_sweep.localCenter);\n this.p_localCenterB = Vec2.clone(bodyB.m_sweep.localCenter);\n\n this.p_radiusA = shapeA.m_radius;\n this.p_radiusB = shapeB.m_radius;\n\n this.p_type = manifold.type;\n this.p_localNormal = Vec2.clone(manifold.localNormal);\n this.p_localPoint = Vec2.clone(manifold.localPoint);\n this.p_pointCount = pointCount;\n\n for (let j = 0; j < pointCount; ++j) {\n const cp = manifold.points[j];\n const vcp = this.v_points[j] = new VelocityConstraintPoint();\n\n if (step.warmStarting) {\n vcp.normalImpulse = step.dtRatio * cp.normalImpulse;\n vcp.tangentImpulse = step.dtRatio * cp.tangentImpulse;\n\n } else {\n vcp.normalImpulse = 0.0;\n vcp.tangentImpulse = 0.0;\n }\n\n vcp.rA.setZero();\n vcp.rB.setZero();\n vcp.normalMass = 0.0;\n vcp.tangentMass = 0.0;\n vcp.velocityBias = 0.0;\n\n this.p_localPoints[j] = Vec2.clone(cp.localPoint);\n\n }\n }\n\n /**\n * Get the contact manifold. Do not modify the manifold unless you understand\n * the internals of the library.\n */\n getManifold(): Manifold {\n return this.m_manifold;\n }\n\n /**\n * Get the world manifold.\n */\n getWorldManifold(worldManifold: WorldManifold | null | undefined): WorldManifold | undefined {\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n\n return this.m_manifold.getWorldManifold(worldManifold, bodyA.getTransform(),\n shapeA.m_radius, bodyB.getTransform(), shapeB.m_radius);\n }\n\n /**\n * Enable/disable this contact. This can be used inside the pre-solve contact\n * listener. The contact is only disabled for the current time step (or sub-step\n * in continuous collisions).\n */\n setEnabled(flag: boolean): void {\n this.m_enabledFlag = !!flag;\n }\n\n /**\n * Has this contact been disabled?\n */\n isEnabled(): boolean {\n return this.m_enabledFlag;\n }\n\n /**\n * Is this contact touching?\n */\n isTouching(): boolean {\n return this.m_touchingFlag;\n }\n\n /**\n * Get the next contact in the world's contact list.\n */\n getNext(): Contact | null {\n return this.m_next;\n }\n\n /**\n * Get fixture A in this contact.\n */\n getFixtureA(): Fixture {\n return this.m_fixtureA;\n }\n\n /**\n * Get fixture B in this contact.\n */\n getFixtureB(): Fixture {\n return this.m_fixtureB;\n }\n\n /**\n * Get the child primitive index for fixture A.\n */\n getChildIndexA(): number {\n return this.m_indexA;\n }\n\n /**\n * Get the child primitive index for fixture B.\n */\n getChildIndexB(): number {\n return this.m_indexB;\n }\n\n /**\n * Flag this contact for filtering. Filtering will occur the next time step.\n */\n flagForFiltering(): void {\n this.m_filterFlag = true;\n }\n\n /**\n * Override the default friction mixture. You can call this in\n * ContactListener.preSolve. This value persists until set or reset.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the friction.\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Reset the friction mixture to the default value.\n */\n resetFriction(): void {\n this.m_friction = mixFriction(this.m_fixtureA.m_friction,\n this.m_fixtureB.m_friction);\n }\n\n /**\n * Override the default restitution mixture. You can call this in\n * ContactListener.preSolve. The value persists until you set or reset.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Get the restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Reset the restitution to the default value.\n */\n resetRestitution(): void {\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution,\n this.m_fixtureB.m_restitution);\n }\n\n /**\n * Set the desired tangent speed for a conveyor belt behavior. In meters per\n * second.\n */\n setTangentSpeed(speed: number): void {\n this.m_tangentSpeed = speed;\n }\n\n /**\n * Get the desired tangent speed. In meters per second.\n */\n getTangentSpeed(): number {\n return this.m_tangentSpeed;\n }\n\n /**\n * Called by Update method, and implemented by subclasses.\n */\n evaluate(manifold: Manifold, xfA: Transform, xfB: Transform): void {\n this.m_evaluateFcn(manifold, xfA, this.m_fixtureA, this.m_indexA, xfB,\n this.m_fixtureB, this.m_indexB);\n }\n\n /**\n * Updates the contact manifold and touching status.\n *\n * Note: do not assume the fixture AABBs are overlapping or are valid.\n *\n * @param listener.beginContact\n * @param listener.endContact\n * @param listener.preSolve\n */\n update(listener?: {\n beginContact(contact: Contact): void,\n endContact(contact: Contact): void,\n preSolve(contact: Contact, oldManifold: Manifold): void\n }): void {\n\n // Re-enable this contact.\n this.m_enabledFlag = true;\n\n let touching = false;\n const wasTouching = this.m_touchingFlag;\n\n const sensorA = this.m_fixtureA.isSensor();\n const sensorB = this.m_fixtureB.isSensor();\n const sensor = sensorA || sensorB;\n\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const xfA = bodyA.getTransform();\n const xfB = bodyB.getTransform();\n\n let oldManifold;\n\n // Is this contact a sensor?\n if (sensor) {\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n touching = testOverlap(shapeA, this.m_indexA, shapeB, this.m_indexB, xfA, xfB);\n\n // Sensors don't generate manifolds.\n this.m_manifold.pointCount = 0;\n } else {\n\n // TODO reuse manifold\n oldManifold = this.m_manifold;\n this.m_manifold = new Manifold();\n\n this.evaluate(this.m_manifold, xfA, xfB);\n touching = this.m_manifold.pointCount > 0;\n\n // Match old contact ids to new contact ids and copy the\n // stored impulses to warm start the solver.\n for (let i = 0; i < this.m_manifold.pointCount; ++i) {\n const nmp = this.m_manifold.points[i];\n nmp.normalImpulse = 0.0;\n nmp.tangentImpulse = 0.0;\n\n for (let j = 0; j < oldManifold.pointCount; ++j) {\n const omp = oldManifold.points[j];\n if (omp.id.key == nmp.id.key) {\n nmp.normalImpulse = omp.normalImpulse;\n nmp.tangentImpulse = omp.tangentImpulse;\n break;\n }\n }\n }\n\n if (touching != wasTouching) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n }\n\n this.m_touchingFlag = touching;\n\n if (!wasTouching && touching && listener) {\n listener.beginContact(this);\n }\n\n if (wasTouching && !touching && listener) {\n listener.endContact(this);\n }\n\n if (!sensor && touching && listener) {\n listener.preSolve(this, oldManifold);\n }\n }\n\n solvePositionConstraint(step: TimeStep): number {\n return this._solvePositionConstraint(step);\n }\n\n solvePositionConstraintTOI(step: TimeStep, toiA: Body, toiB: Body): number {\n return this._solvePositionConstraint(step, toiA, toiB);\n }\n\n private _solvePositionConstraint(step: TimeStep, toiA?: Body, toiB?: Body): number {\n const toi: boolean = !!toiA && !!toiB;\n\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n let mA = 0.0;\n let iA = 0.0;\n if (!toi || (bodyA == toiA || bodyA == toiB)) {\n mA = this.p_invMassA;\n iA = this.p_invIA;\n }\n\n let mB = 0.0;\n let iB = 0.0;\n if (!toi || (bodyB == toiA || bodyB == toiB)) {\n mB = this.p_invMassB;\n iB = this.p_invIB;\n }\n\n const cA = Vec2.clone(positionA.c);\n let aA = positionA.a;\n\n const cB = Vec2.clone(positionB.c);\n let aB = positionB.a;\n\n let minSeparation = 0.0;\n\n // Solve normal constraints\n for (let j = 0; j < this.p_pointCount; ++j) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p = Vec2.sub(cA, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p = Vec2.sub(cB, Rot.mulVec2(xfB.q, localCenterB));\n\n // PositionSolverManifold\n let normal;\n let point;\n let separation;\n switch (this.p_type) {\n case ManifoldType.e_circles: {\n const pointA = Transform.mulVec2(xfA, this.p_localPoint);\n const pointB = Transform.mulVec2(xfB, this.p_localPoints[0]);\n normal = Vec2.sub(pointB, pointA);\n normal.normalize();\n point = Vec2.combine(0.5, pointA, 0.5, pointB);\n separation = Vec2.dot(Vec2.sub(pointB, pointA), normal) - this.p_radiusA - this.p_radiusB;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfA, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfB, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfB, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfA, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n\n // Ensure normal points from A to B\n normal.mul(-1);\n break;\n }\n }\n\n const rA = Vec2.sub(point, cA);\n const rB = Vec2.sub(point, cB);\n\n // Track max constraint error.\n minSeparation = Math.min(minSeparation, separation);\n\n const baumgarte = toi ? Settings.toiBaugarte : Settings.baumgarte;\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n // Prevent large corrections and allow slop.\n const C = Math.clamp(baumgarte * (separation + linearSlop), -maxLinearCorrection, 0.0);\n\n // Compute the effective mass.\n const rnA = Vec2.crossVec2Vec2(rA, normal);\n const rnB = Vec2.crossVec2Vec2(rB, normal);\n const K = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n // Compute normal impulse\n const impulse = K > 0.0 ? -C / K : 0.0;\n\n const P = Vec2.mulNumVec2(impulse, normal);\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n\n return minSeparation;\n }\n\n initVelocityConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const radiusA = this.p_radiusA;\n const radiusB = this.p_radiusB;\n const manifold = this.getManifold();\n\n const mA = this.v_invMassA;\n const mB = this.v_invMassB;\n const iA = this.v_invIA;\n const iB = this.v_invIB;\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n const cA = Vec2.clone(positionA.c);\n const aA = positionA.a;\n const vA = Vec2.clone(velocityA.v);\n const wA = velocityA.w;\n\n const cB = Vec2.clone(positionB.c);\n const aB = positionB.a;\n const vB = Vec2.clone(velocityB.v);\n const wB = velocityB.w;\n\n _ASSERT && common.assert(manifold.pointCount > 0);\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p.setCombine(1, cA, -1, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p.setCombine(1, cB, -1, Rot.mulVec2(xfB.q, localCenterB));\n\n const worldManifold = manifold.getWorldManifold(null, xfA, radiusA, xfB, radiusB);\n\n this.v_normal.setVec2(worldManifold.normal);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n vcp.rA.setVec2(Vec2.sub(worldManifold.points[j], cA));\n vcp.rB.setVec2(Vec2.sub(worldManifold.points[j], cB));\n\n const rnA = Vec2.crossVec2Vec2(vcp.rA, this.v_normal);\n const rnB = Vec2.crossVec2Vec2(vcp.rB, this.v_normal);\n\n const kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n vcp.normalMass = kNormal > 0.0 ? 1.0 / kNormal : 0.0;\n\n const tangent = Vec2.crossVec2Num(this.v_normal, 1.0);\n\n const rtA = Vec2.crossVec2Vec2(vcp.rA, tangent);\n const rtB = Vec2.crossVec2Vec2(vcp.rB, tangent);\n\n const kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB;\n\n vcp.tangentMass = kTangent > 0.0 ? 1.0 / kTangent : 0.0;\n\n // Setup a velocity bias for restitution.\n vcp.velocityBias = 0.0;\n const vRel = Vec2.dot(this.v_normal, vB)\n + Vec2.dot(this.v_normal, Vec2.crossNumVec2(wB, vcp.rB))\n - Vec2.dot(this.v_normal, vA)\n - Vec2.dot(this.v_normal, Vec2.crossNumVec2(wA, vcp.rA));\n if (vRel < -Settings.velocityThreshold) {\n vcp.velocityBias = -this.v_restitution * vRel;\n }\n }\n\n // If we have two points, then prepare the block solver.\n if (this.v_pointCount == 2 && step.blockSolve) {\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const rn1A = Vec2.crossVec2Vec2(vcp1.rA, this.v_normal);\n const rn1B = Vec2.crossVec2Vec2(vcp1.rB, this.v_normal);\n const rn2A = Vec2.crossVec2Vec2(vcp2.rA, this.v_normal);\n const rn2B = Vec2.crossVec2Vec2(vcp2.rB, this.v_normal);\n\n const k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B;\n const k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B;\n const k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B;\n\n // Ensure a reasonable condition number.\n const k_maxConditionNumber = 1000.0;\n if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) {\n // K is safe to invert.\n this.v_K.ex.setNum(k11, k12);\n this.v_K.ey.setNum(k12, k22);\n this.v_normalMass.set(this.v_K.getInverse());\n } else {\n // The constraints are redundant, just use one.\n // TODO_ERIN use deepest?\n this.v_pointCount = 1;\n }\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n warmStartConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n const P = Vec2.combine(vcp.normalImpulse, normal, vcp.tangentImpulse, tangent);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n vA.subMul(mA, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n vB.addMul(mB, P);\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n storeConstraintImpulses(step: TimeStep): void {\n const manifold = this.m_manifold;\n for (let j = 0; j < this.v_pointCount; ++j) {\n manifold.points[j].normalImpulse = this.v_points[j].normalImpulse;\n manifold.points[j].tangentImpulse = this.v_points[j].tangentImpulse;\n }\n }\n\n solveVelocityConstraint(step: TimeStep): void {\n const bodyA = this.m_fixtureA.m_body;\n const bodyB = this.m_fixtureB.m_body;\n\n const velocityA = bodyA.c_velocity;\n const positionA = bodyA.c_position;\n\n const velocityB = bodyB.c_velocity;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n const friction = this.v_friction;\n\n _ASSERT && common.assert(this.v_pointCount == 1 || this.v_pointCount == 2);\n\n // Solve tangent constraints first because non-penetration is more important\n // than friction.\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute tangent force\n const vt = Vec2.dot(dv, tangent) - this.v_tangentSpeed;\n let lambda = vcp.tangentMass * (-vt);\n\n // Clamp the accumulated force\n const maxFriction = friction * vcp.normalImpulse;\n const newImpulse = Math.clamp(vcp.tangentImpulse + lambda, -maxFriction, maxFriction);\n lambda = newImpulse - vcp.tangentImpulse;\n vcp.tangentImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, tangent);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n\n // Solve normal constraints\n if (this.v_pointCount == 1 || step.blockSolve == false) {\n for (let i = 0; i < this.v_pointCount; ++i) {\n const vcp = this.v_points[i]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute normal impulse\n const vn = Vec2.dot(dv, normal);\n let lambda = -vcp.normalMass * (vn - vcp.velocityBias);\n\n // Clamp the accumulated impulse\n const newImpulse = Math.max(vcp.normalImpulse + lambda, 0.0);\n lambda = newImpulse - vcp.normalImpulse;\n vcp.normalImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, normal);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n } else {\n // Block solver developed in collaboration with Dirk Gregorius (back in\n // 01/07 on Box2D_Lite).\n // Build the mini LCP for this contact patch\n //\n // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i =\n // 1..2\n //\n // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n )\n // b = vn0 - velocityBias\n //\n // The system is solved using the \"Total enumeration method\" (s. Murty).\n // The complementary constraint vn_i * x_i\n // implies that we must have in any solution either vn_i = 0 or x_i = 0.\n // So for the 2D contact problem the cases\n // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and\n // vn1 = 0 need to be tested. The first valid\n // solution that satisfies the problem is chosen.\n //\n // In order to account of the accumulated impulse 'a' (because of the\n // iterative nature of the solver which only requires\n // that the accumulated impulse is clamped and not the incremental\n // impulse) we change the impulse variable (x_i).\n //\n // Substitute:\n //\n // x = a + d\n //\n // a := old total impulse\n // x := new total impulse\n // d := incremental impulse\n //\n // For the current iteration we extend the formula for the incremental\n // impulse\n // to compute the new total impulse:\n //\n // vn = A * d + b\n // = A * (x - a) + b\n // = A * x + b - A * a\n // = A * x + b'\n // b' = b - A * a;\n\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const a = Vec2.neo(vcp1.normalImpulse, vcp2.normalImpulse);\n _ASSERT && common.assert(a.x >= 0.0 && a.y >= 0.0);\n\n // Relative velocity at contact\n let dv1 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp1.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp1.rA));\n let dv2 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp2.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp2.rA));\n\n // Compute normal velocity\n let vn1 = Vec2.dot(dv1, normal);\n let vn2 = Vec2.dot(dv2, normal);\n\n const b = Vec2.neo(vn1 - vcp1.velocityBias, vn2 - vcp2.velocityBias);\n\n // Compute b'\n b.sub(Mat22.mulVec2(this.v_K, a));\n\n const k_errorTol = 1e-3;\n // NOT_USED(k_errorTol);\n\n while (true) {\n //\n // Case 1: vn = 0\n //\n // 0 = A * x + b'\n //\n // Solve for x:\n //\n // x = - inv(A) * b'\n //\n const x = Mat22.mulVec2(this.v_normalMass, b).neg();\n\n if (x.x >= 0.0 && x.y >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n dv1 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA)));\n dv2 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA)));\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && common.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n _ASSERT && common.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 2: vn1 = 0 and x2 = 0\n //\n // 0 = a11 * x1 + a12 * 0 + b1'\n // vn2 = a21 * x1 + a22 * 0 + b2'\n //\n x.x = -vcp1.normalMass * b.x;\n x.y = 0.0;\n vn1 = 0.0;\n vn2 = this.v_K.ex.y * x.x + b.y;\n\n if (x.x >= 0.0 && vn2 >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv1B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB));\n const dv1A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA));\n const dv1 = Vec2.sub(dv1B, dv1A);\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n\n _ASSERT && common.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 3: vn2 = 0 and x1 = 0\n //\n // vn1 = a11 * 0 + a12 * x2 + b1'\n // 0 = a21 * 0 + a22 * x2 + b2'\n //\n x.x = 0.0;\n x.y = -vcp2.normalMass * b.y;\n vn1 = this.v_K.ey.x * x.y + b.x;\n vn2 = 0.0;\n\n if (x.y >= 0.0 && vn1 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv2B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB));\n const dv2A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA));\n const dv1 = Vec2.sub(dv2B, dv2A);\n\n // Compute normal velocity\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && common.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 4: x1 = 0 and x2 = 0\n //\n // vn1 = b1\n // vn2 = b2;\n //\n x.x = 0.0;\n x.y = 0.0;\n vn1 = b.x;\n vn2 = b.y;\n\n if (vn1 >= 0.0 && vn2 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n break;\n }\n\n // No solution, give up. This is hit sometimes, but it doesn't seem to\n // matter.\n break;\n }\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n /**\n * @internal\n */\n static addType(type1: ShapeType, type2: ShapeType, callback: ContactCallback): void {\n s_registers[type1] = s_registers[type1] || {};\n s_registers[type1][type2] = callback;\n }\n\n /**\n * @internal\n */\n static create(fixtureA: Fixture, indexA: number, fixtureB: Fixture, indexB: number): Contact | null {\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // TODO: pool contacts\n let contact;\n let evaluateFcn;\n if (evaluateFcn = s_registers[typeA] && s_registers[typeA][typeB]) {\n contact = new Contact(fixtureA, indexA, fixtureB, indexB, evaluateFcn);\n } else if (evaluateFcn = s_registers[typeB] && s_registers[typeB][typeA]) {\n contact = new Contact(fixtureB, indexB, fixtureA, indexA, evaluateFcn);\n } else {\n return null;\n }\n\n // Contact creation may swap fixtures.\n fixtureA = contact.getFixtureA();\n fixtureB = contact.getFixtureB();\n indexA = contact.getChildIndexA();\n indexB = contact.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Connect to body A\n contact.m_nodeA.contact = contact;\n contact.m_nodeA.other = bodyB;\n\n contact.m_nodeA.prev = null;\n contact.m_nodeA.next = bodyA.m_contactList;\n if (bodyA.m_contactList != null) {\n bodyA.m_contactList.prev = contact.m_nodeA;\n }\n bodyA.m_contactList = contact.m_nodeA;\n\n // Connect to body B\n contact.m_nodeB.contact = contact;\n contact.m_nodeB.other = bodyA;\n\n contact.m_nodeB.prev = null;\n contact.m_nodeB.next = bodyB.m_contactList;\n if (bodyB.m_contactList != null) {\n bodyB.m_contactList.prev = contact.m_nodeB;\n }\n bodyB.m_contactList = contact.m_nodeB;\n\n // Wake up the bodies\n if (fixtureA.isSensor() == false && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n return contact;\n }\n\n /**\n * @internal\n */\n static destroy(contact: Contact, listener: { endContact: (contact: Contact) => void }): void {\n const fixtureA = contact.m_fixtureA;\n const fixtureB = contact.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n if (contact.isTouching()) {\n listener.endContact(contact);\n }\n\n // Remove from body 1\n if (contact.m_nodeA.prev) {\n contact.m_nodeA.prev.next = contact.m_nodeA.next;\n }\n\n if (contact.m_nodeA.next) {\n contact.m_nodeA.next.prev = contact.m_nodeA.prev;\n }\n\n if (contact.m_nodeA == bodyA.m_contactList) {\n bodyA.m_contactList = contact.m_nodeA.next;\n }\n\n // Remove from body 2\n if (contact.m_nodeB.prev) {\n contact.m_nodeB.prev.next = contact.m_nodeB.next;\n }\n\n if (contact.m_nodeB.next) {\n contact.m_nodeB.next.prev = contact.m_nodeB.prev;\n }\n\n if (contact.m_nodeB == bodyB.m_contactList) {\n bodyB.m_contactList = contact.m_nodeB.next;\n }\n\n if (contact.m_manifold.pointCount > 0 && fixtureA.isSensor() == false\n && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // const destroyFcn = s_registers[typeA][typeB].destroyFcn;\n // if (typeof destroyFcn === 'function') {\n // destroyFcn(contact);\n // }\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../Settings';\n\nimport common from '../util/common';\nimport stats from '../util/stats';\nimport Timer from '../util/Timer';\n\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\nimport Rot from '../common/Rot';\nimport Sweep from '../common/Sweep';\nimport Transform from '../common/Transform';\n\nimport Distance, { DistanceInput, DistanceOutput, DistanceProxy, SimplexCache } from './Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Input parameters for TimeOfImpact.\n */\nexport class TOIInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n sweepA: Sweep = new Sweep();\n sweepB: Sweep = new Sweep();\n /** defines sweep interval [0, tMax] */\n tMax: number | undefined;\n}\n\nexport enum TOIOutputState {\n e_unknown = 0,\n e_failed = 1,\n e_overlapped = 2,\n e_touching = 3,\n e_separated = 4,\n}\n\n/**\n * Output parameters for TimeOfImpact.\n */\nexport class TOIOutput {\n state: TOIOutputState | undefined;\n t: number | undefined;\n}\n\nstats.toiTime = 0;\nstats.toiMaxTime = 0;\nstats.toiCalls = 0;\nstats.toiIters = 0;\nstats.toiMaxIters = 0;\nstats.toiRootIters = 0;\nstats.toiMaxRootIters = 0;\n\n/**\n * Compute the upper bound on time before two shapes penetrate. Time is\n * represented as a fraction between [0,tMax]. This uses a swept separating axis\n * and may miss some intermediate, non-tunneling collision. If you change the\n * time interval, you should call this function again.\n *\n * Note: use Distance to compute the contact point and normal at the time of\n * impact.\n *\n * CCD via the local separating axis method. This seeks progression by computing\n * the largest time at which separation is maintained.\n */\nexport default function TimeOfImpact(output: TOIOutput, input: TOIInput): void {\n const timer = Timer.now();\n\n ++stats.toiCalls;\n\n output.state = TOIOutputState.e_unknown;\n output.t = input.tMax;\n\n const proxyA = input.proxyA; // DistanceProxy\n const proxyB = input.proxyB; // DistanceProxy\n\n const sweepA = input.sweepA; // Sweep\n const sweepB = input.sweepB; // Sweep\n\n // Large rotations can make the root finder fail, so we normalize the\n // sweep angles.\n sweepA.normalize();\n sweepB.normalize();\n\n const tMax = input.tMax;\n\n const totalRadius = proxyA.m_radius + proxyB.m_radius;\n const target = Math.max(Settings.linearSlop, totalRadius - 3.0 * Settings.linearSlop);\n const tolerance = 0.25 * Settings.linearSlop;\n _ASSERT && common.assert(target > tolerance);\n\n let t1 = 0.0;\n const k_maxIterations = Settings.maxTOIIterations;\n let iter = 0;\n\n // Prepare input for distance query.\n const cache = new SimplexCache();\n\n const distanceInput = new DistanceInput();\n distanceInput.proxyA = input.proxyA;\n distanceInput.proxyB = input.proxyB;\n distanceInput.useRadii = false;\n\n // The outer loop progressively attempts to compute new separating axes.\n // This loop terminates when an axis is repeated (no progress is made).\n while (true) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n sweepA.getTransform(xfA, t1);\n sweepB.getTransform(xfB, t1);\n\n // Get the distance between shapes. We can also use the results\n // to get a separating axis.\n distanceInput.transformA = xfA;\n distanceInput.transformB = xfB;\n const distanceOutput = new DistanceOutput();\n Distance(distanceOutput, cache, distanceInput);\n\n // If the shapes are overlapped, we give up on continuous collision.\n if (distanceOutput.distance <= 0.0) {\n // Failure!\n output.state = TOIOutputState.e_overlapped;\n output.t = 0.0;\n break;\n }\n\n if (distanceOutput.distance < target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n break;\n }\n\n // Initialize the separating axis.\n const fcn = new SeparationFunction();\n fcn.initialize(cache, proxyA, sweepA, proxyB, sweepB, t1);\n\n // if (false) {\n // // Dump the curve seen by the root finder\n // const N = 100;\n // const dx = 1.0 / N;\n // const xs = []; // [ N + 1 ];\n // const fs = []; // [ N + 1 ];\n // const x = 0.0;\n // for (const i = 0; i <= N; ++i) {\n // sweepA.getTransform(xfA, x);\n // sweepB.getTransform(xfB, x);\n // const f = fcn.evaluate(xfA, xfB) - target;\n // printf(\"%g %g\\n\", x, f);\n // xs[i] = x;\n // fs[i] = f;\n // x += dx;\n // }\n // }\n\n // Compute the TOI on the separating axis. We do this by successively\n // resolving the deepest point. This loop is bounded by the number of\n // vertices.\n let done = false;\n let t2 = tMax;\n let pushBackIter = 0;\n while (true) {\n // Find the deepest point at t2. Store the witness point indices.\n let s2 = fcn.findMinSeparation(t2);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Is the final configuration separated?\n if (s2 > target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_separated;\n output.t = tMax;\n done = true;\n break;\n }\n\n // Has the separation reached tolerance?\n if (s2 > target - tolerance) {\n // Advance the sweeps\n t1 = t2;\n break;\n }\n\n // Compute the initial separation of the witness points.\n let s1 = fcn.evaluate(t1);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Check for initial overlap. This might happen if the root finder\n // runs out of iterations.\n if (s1 < target - tolerance) {\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n done = true;\n break;\n }\n\n // Check for touching\n if (s1 <= target + tolerance) {\n // Victory! t1 should hold the TOI (could be 0.0).\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n done = true;\n break;\n }\n\n // Compute 1D root of: f(x) - target = 0\n let rootIterCount = 0;\n let a1 = t1;\n let a2 = t2;\n while (true) {\n // Use a mix of the secant rule and bisection.\n let t;\n if (rootIterCount & 1) {\n // Secant rule to improve convergence.\n t = a1 + (target - s1) * (a2 - a1) / (s2 - s1);\n } else {\n // Bisection to guarantee progress.\n t = 0.5 * (a1 + a2);\n }\n\n ++rootIterCount;\n ++stats.toiRootIters;\n\n const s = fcn.evaluate(t);\n const indexA = fcn.indexA;\n const indexB = fcn.indexB;\n\n if (Math.abs(s - target) < tolerance) {\n // t2 holds a tentative value for t1\n t2 = t;\n break;\n }\n\n // Ensure we continue to bracket the root.\n if (s > target) {\n a1 = t;\n s1 = s;\n } else {\n a2 = t;\n s2 = s;\n }\n\n if (rootIterCount === 50) {\n break;\n }\n }\n\n stats.toiMaxRootIters = Math.max(stats.toiMaxRootIters, rootIterCount);\n\n ++pushBackIter;\n\n if (pushBackIter === Settings.maxPolygonVertices) {\n break;\n }\n }\n\n ++iter;\n ++stats.toiIters;\n\n if (done) {\n break;\n }\n\n if (iter === k_maxIterations) {\n // Root finder got stuck. Semi-victory.\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n break;\n }\n }\n\n stats.toiMaxIters = Math.max(stats.toiMaxIters, iter);\n\n const time = Timer.diff(timer);\n stats.toiMaxTime = Math.max(stats.toiMaxTime, time);\n stats.toiTime += time;\n}\n\nenum SeparationFunctionType {\n e_points = 1,\n e_faceA = 2,\n e_faceB = 3,\n}\n\nclass SeparationFunction {\n m_proxyA: DistanceProxy = new DistanceProxy();\n m_proxyB: DistanceProxy = new DistanceProxy();\n m_sweepA: Sweep;\n m_sweepB: Sweep;\n indexA: number;\n indexB: number;\n m_type: SeparationFunctionType;\n m_localPoint: Vec2 = Vec2.zero();\n m_axis: Vec2 = Vec2.zero();\n\n // TODO_ERIN might not need to return the separation\n\n initialize(cache: SimplexCache, proxyA: DistanceProxy, sweepA: Sweep, proxyB: DistanceProxy, sweepB: Sweep, t1: number): number {\n this.m_proxyA = proxyA;\n this.m_proxyB = proxyB;\n const count = cache.count;\n _ASSERT && common.assert(0 < count && count < 3);\n\n this.m_sweepA = sweepA;\n this.m_sweepB = sweepB;\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t1);\n this.m_sweepB.getTransform(xfB, t1);\n\n if (count === 1) {\n this.m_type = SeparationFunctionType.e_points;\n const localPointA = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n this.m_axis.setCombine(1, pointB, -1, pointA);\n const s = this.m_axis.normalize();\n return s;\n\n } else if (cache.indexA[0] === cache.indexA[1]) {\n // Two points on B and one on A.\n this.m_type = SeparationFunctionType.e_faceB;\n const localPointB1 = proxyB.getVertex(cache.indexB[0]);\n const localPointB2 = proxyB.getVertex(cache.indexB[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointB2, localPointB1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointB1, localPointB2);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n const localPointA = proxyA.getVertex(cache.indexA[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n let s = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n\n } else {\n // Two points on A and one or two points on B.\n this.m_type = SeparationFunctionType.e_faceA;\n const localPointA1 = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointA2 = this.m_proxyA.getVertex(cache.indexA[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointA2, localPointA1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointA1, localPointA2);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n let s = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n }\n }\n\n compute(find: boolean, t: number): number {\n // It was findMinSeparation and evaluate\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t);\n this.m_sweepB.getTransform(xfB, t);\n\n switch (this.m_type) {\n case SeparationFunctionType.e_points: {\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, this.m_axis);\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(this.m_axis));\n\n this.indexA = this.m_proxyA.getSupport(axisA);\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, this.m_axis) - Vec2.dot(pointA, this.m_axis);\n return sep;\n }\n\n case SeparationFunctionType.e_faceA: {\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n if (find) {\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(normal));\n\n this.indexA = -1;\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n return sep;\n }\n\n case SeparationFunctionType.e_faceB: {\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, Vec2.neg(normal));\n\n this.indexB = -1;\n this.indexA = this.m_proxyA.getSupport(axisA);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n const sep = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n return sep;\n }\n\n default:\n _ASSERT && common.assert(false);\n if (find) {\n this.indexA = -1;\n this.indexB = -1;\n }\n return 0.0;\n }\n }\n\n findMinSeparation(t: number): number {\n return this.compute(true, t);\n }\n\n evaluate(t: number): number {\n return this.compute(false, t);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport type Vec2 from '../common/Vec2';\nimport type Body from './Body';\nimport { TimeStep } from \"./Solver\";\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n/**\n * A joint edge is used to connect bodies and joints together in a joint graph\n * where each body is a node and each joint is an edge. A joint edge belongs to\n * a doubly linked list maintained in each attached body. Each joint has two\n * joint nodes, one for each attached body.\n */\nexport class JointEdge {\n /**\n * provides quick access to the other body attached.\n */\n other: Body | null = null;\n /**\n * the joint\n */\n joint: Joint | null = null;\n /**\n * prev the previous joint edge in the body's joint list\n */\n prev: JointEdge | null = null;\n /**\n * the next joint edge in the body's joint list\n */\n next: JointEdge | null = null;\n}\n\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointOpt {\n /**\n * Use this to attach application specific data to your joints.\n */\n userData?: any;\n /**\n * Set this flag to true if the attached bodies\n * should collide.\n */\n collideConnected?: boolean;\n}\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointDef extends JointOpt {\n /**\n * The first attached body.\n */\n bodyA: Body;\n /**\n * The second attached body.\n */\n bodyB: Body;\n}\n\nconst DEFAULTS = {\n userData : null,\n collideConnected : false\n};\n\n/**\n * The base joint class. Joints are used to constraint two bodies together in\n * various fashions. Some joints also feature limits and motors.\n */\nexport default abstract class Joint {\n\n /** @internal */ m_type: string = 'unknown-joint';\n\n /** @internal */ m_bodyA: Body;\n /** @internal */ m_bodyB: Body;\n\n /** @internal */ m_collideConnected: boolean;\n\n /** @internal */ m_prev: Joint | null = null;\n /** @internal */ m_next: Joint | null = null;\n\n /** @internal */ m_edgeA: JointEdge = new JointEdge();\n /** @internal */ m_edgeB: JointEdge = new JointEdge();\n\n /** @internal */ m_islandFlag: boolean = false;\n /** @internal */ m_userData: unknown;\n\n constructor(def: JointDef);\n constructor(def: JointOpt, bodyA: Body, bodyB: Body);\n constructor(def: JointDef | JointOpt, bodyA?: Body, bodyB?: Body) {\n bodyA = 'bodyA' in def ? def.bodyA : bodyA;\n bodyB = 'bodyB' in def ? def.bodyB : bodyB;\n\n _ASSERT && common.assert(!!bodyA);\n _ASSERT && common.assert(!!bodyB);\n _ASSERT && common.assert(bodyA != bodyB);\n\n this.m_bodyA = bodyA!;\n this.m_bodyB = bodyB!;\n\n this.m_collideConnected = !!def.collideConnected;\n this.m_userData = def.userData;\n }\n\n /**\n * Short-cut function to determine if either body is inactive.\n */\n isActive(): boolean {\n return this.m_bodyA.isActive() && this.m_bodyB.isActive();\n }\n\n /**\n * Get the type of the concrete joint.\n */\n getType(): string {\n return this.m_type;\n }\n\n /**\n * Get the first body attached to this joint.\n */\n getBodyA(): Body {\n return this.m_bodyA;\n }\n\n /**\n * Get the second body attached to this joint.\n */\n getBodyB(): Body {\n return this.m_bodyB;\n }\n\n /**\n * Get the next joint the world joint list.\n */\n getNext(): Joint {\n return this.m_next;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get collide connected. Note: modifying the collide connect flag won't work\n * correctly because the flag is only checked when fixture AABBs begin to\n * overlap.\n */\n getCollideConnected(): boolean {\n return this.m_collideConnected;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n abstract getAnchorA(): Vec2;\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n abstract getAnchorB(): Vec2;\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n abstract getReactionForce(inv_dt: number): Vec2;\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n abstract getReactionTorque(inv_dt: number): number;\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2): void {}\n\n abstract initVelocityConstraints(step: TimeStep): void;\n\n abstract solveVelocityConstraints(step: TimeStep): void;\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n abstract solvePositionConstraints(step: TimeStep): boolean;\n\n}\n","export const now = function(): number {\n return Date.now();\n};\n\nexport const diff = function(time: number): number {\n return Date.now() - time;\n};\n\nexport default {\n now,\n diff,\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../Settings';\nimport common from '../util/common';\nimport Vec2 from '../common/Vec2';\nimport Math from '../common/Math';\nimport Body from './Body';\nimport Contact from './Contact';\nimport Joint from './Joint';\nimport TimeOfImpact, { TOIInput, TOIOutput, TOIOutputState } from '../collision/TimeOfImpact';\nimport Distance, { DistanceInput, DistanceOutput, SimplexCache } from '../collision/Distance';\nimport World from \"./World\";\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport class TimeStep {\n /** time step */\n dt: number = 0;\n /** inverse time step (0 if dt == 0) */\n inv_dt: number = 0;\n velocityIterations: number = 0;\n positionIterations: number = 0;\n warmStarting: boolean = false;\n blockSolve: boolean = true;\n\n /** timestep ratio for variable timestep */\n inv_dt0: number = 0.0;\n /** dt * inv_dt0 */\n dtRatio: number = 1;\n\n reset(dt: number): void {\n if (this.dt > 0.0) {\n this.inv_dt0 = this.inv_dt;\n }\n this.dt = dt;\n this.inv_dt = dt == 0 ? 0 : 1 / dt;\n this.dtRatio = dt * this.inv_dt0;\n }\n}\n\n// reuse\nconst s_subStep = new TimeStep();\n\n/**\n * Contact impulses for reporting. Impulses are used instead of forces because\n * sub-step forces may approach infinity for rigid body collisions. These match\n * up one-to-one with the contact points in Manifold.\n */\nexport class ContactImpulse {\n // TODO: merge with Contact class?\n\n private readonly contact: Contact;\n private readonly normals: number[];\n private readonly tangents: number[];\n\n constructor(contact: Contact) {\n this.contact = contact;\n this.normals = [];\n this.tangents = [];\n }\n\n get normalImpulses(): number[] {\n const contact = this.contact;\n const normals = this.normals;\n normals.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n normals.push(contact.v_points[p].normalImpulse);\n }\n return normals;\n }\n\n get tangentImpulses(): number[] {\n const contact = this.contact;\n const tangents = this.tangents;\n tangents.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n tangents.push(contact.v_points[p].tangentImpulse);\n }\n return tangents;\n }\n}\n\n/**\n * Finds and solves islands. An island is a connected subset of the world.\n */\nexport default class Solver {\n m_world: World;\n m_stack: Body[];\n m_bodies: Body[];\n m_contacts: Contact[];\n m_joints: Joint[];\n\n constructor(world: World) {\n this.m_world = world;\n this.m_stack = [];\n this.m_bodies = [];\n this.m_contacts = [];\n this.m_joints = [];\n }\n\n clear(): void {\n this.m_stack.length = 0;\n this.m_bodies.length = 0;\n this.m_contacts.length = 0;\n this.m_joints.length = 0;\n }\n\n addBody(body: Body): void {\n _ASSERT && common.assert(body instanceof Body, 'Not a Body!', body);\n this.m_bodies.push(body);\n // why?\n // body.c_position.c.setZero();\n // body.c_position.a = 0;\n // body.c_velocity.v.setZero();\n // body.c_velocity.w = 0;\n }\n\n addContact(contact: Contact): void {\n _ASSERT && common.assert(contact instanceof Contact, 'Not a Contact!', contact);\n this.m_contacts.push(contact);\n }\n\n addJoint(joint: Joint): void {\n _ASSERT && common.assert(joint instanceof Joint, 'Not a Joint!', joint);\n this.m_joints.push(joint);\n }\n\n solveWorld(step: TimeStep): void {\n const world = this.m_world;\n\n // Clear all the island flags.\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n }\n for (let c = world.m_contactList; c; c = c.m_next) {\n c.m_islandFlag = false;\n }\n for (let j = world.m_jointList; j; j = j.m_next) {\n j.m_islandFlag = false;\n }\n\n // Build and simulate all awake islands.\n const stack = this.m_stack;\n let loop = -1;\n for (let seed = world.m_bodyList; seed; seed = seed.m_next) {\n loop++;\n if (seed.m_islandFlag) {\n continue;\n }\n\n if (seed.isAwake() == false || seed.isActive() == false) {\n continue;\n }\n\n // The seed can be dynamic or kinematic.\n if (seed.isStatic()) {\n continue;\n }\n\n // Reset island and stack.\n this.clear();\n\n stack.push(seed);\n\n seed.m_islandFlag = true;\n\n // Perform a depth first search (DFS) on the constraint graph.\n while (stack.length > 0) {\n // Grab the next body off the stack and add it to the island.\n const b = stack.pop();\n _ASSERT && common.assert(b.isActive() == true);\n this.addBody(b);\n\n // Make sure the body is awake.\n b.setAwake(true);\n\n // To keep islands as small as possible, we don't\n // propagate islands across static bodies.\n if (b.isStatic()) {\n continue;\n }\n\n // Search all contacts connected to this body.\n for (let ce = b.m_contactList; ce; ce = ce.next) {\n const contact = ce.contact;\n\n // Has this contact already been added to an island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Is this contact solid and touching?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n this.addContact(contact);\n contact.m_islandFlag = true;\n\n const other = ce.other;\n\n // Was the other body already added to this island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && common.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n\n // Search all joints connect to this body.\n for (let je = b.m_jointList; je; je = je.next) {\n if (je.joint.m_islandFlag == true) {\n continue;\n }\n\n const other = je.other;\n\n // Don't simulate joints connected to inactive bodies.\n if (other.isActive() == false) {\n continue;\n }\n\n this.addJoint(je.joint);\n je.joint.m_islandFlag = true;\n\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && common.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n }\n\n this.solveIsland(step);\n\n // Post solve cleanup.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n // Allow static bodies to participate in other islands.\n // TODO: are they added at all?\n const b = this.m_bodies[i];\n if (b.isStatic()) {\n b.m_islandFlag = false;\n }\n }\n }\n }\n\n solveIsland(step: TimeStep): void {\n // B2: Island Solve\n const world = this.m_world;\n const gravity = world.m_gravity;\n const allowSleep = world.m_allowSleep;\n\n const h = step.dt;\n\n // Integrate velocities and apply damping. Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.m_sweep.c);\n const a = body.m_sweep.a;\n const v = Vec2.clone(body.m_linearVelocity);\n let w = body.m_angularVelocity;\n\n // Store positions for continuous collision.\n body.m_sweep.c0.setVec2(body.m_sweep.c);\n body.m_sweep.a0 = body.m_sweep.a;\n\n if (body.isDynamic()) {\n // Integrate velocities.\n v.addMul(h * body.m_gravityScale, gravity);\n v.addMul(h * body.m_invMass, body.m_force);\n w += h * body.m_invI * body.m_torque;\n /**\n *
\n         * Apply damping.\n         * ODE: dv/dt + c * v = 0\n         * Solution: v(t) = v0 * exp(-c * t)\n         * Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)\n         * v2 = exp(-c * dt) * v1\n         * Pade approximation:\n         * v2 = v1 * 1 / (1 + c * dt)\n         * 
\n */\n v.mul(1.0 / (1.0 + h * body.m_linearDamping));\n w *= 1.0 / (1.0 + h * body.m_angularDamping);\n }\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(step);\n }\n\n _DEBUG && this.printBodies('M: ');\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(step);\n }\n\n _DEBUG && this.printBodies('R: ');\n\n if (step.warmStarting) {\n // Warm start.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.warmStartConstraint(step);\n }\n }\n\n _DEBUG && this.printBodies('Q: ');\n\n for (let i = 0; i < this.m_joints.length; ++i) {\n const joint = this.m_joints[i];\n joint.initVelocityConstraints(step);\n }\n\n _DEBUG && this.printBodies('E: ');\n\n // Solve velocity constraints\n for (let i = 0; i < step.velocityIterations; ++i) {\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n joint.solveVelocityConstraints(step);\n }\n\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(step);\n }\n }\n\n _DEBUG && this.printBodies('D: ');\n\n // Store impulses for warm starting\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.storeConstraintImpulses(step);\n }\n\n _DEBUG && this.printBodies('C: ');\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.lengthSquared(translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c.setVec2(c);\n body.c_position.a = a;\n body.c_velocity.v.setVec2(v);\n body.c_velocity.w = w;\n }\n\n _DEBUG && this.printBodies('B: ');\n\n // Solve position constraints\n let positionSolved = false;\n for (let i = 0; i < step.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraint(step);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -3.0 * Settings.linearSlop;\n\n let jointsOkay = true;\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n const jointOkay = joint.solvePositionConstraints(step);\n jointsOkay = jointsOkay && jointOkay;\n }\n\n if (contactsOkay && jointsOkay) {\n // Exit early if the position errors are small.\n positionSolved = true;\n break;\n }\n }\n\n _DEBUG && this.printBodies('L: ');\n\n // Copy state buffers back to the bodies\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n body.m_sweep.c.setVec2(body.c_position.c);\n body.m_sweep.a = body.c_position.a;\n body.m_linearVelocity.setVec2(body.c_velocity.v);\n body.m_angularVelocity = body.c_velocity.w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n\n if (allowSleep) {\n let minSleepTime = Infinity;\n\n const linTolSqr = Settings.linearSleepToleranceSqr;\n const angTolSqr = Settings.angularSleepToleranceSqr;\n\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n if (body.isStatic()) {\n continue;\n }\n\n if ((body.m_autoSleepFlag == false)\n || (body.m_angularVelocity * body.m_angularVelocity > angTolSqr)\n || (Vec2.lengthSquared(body.m_linearVelocity) > linTolSqr)) {\n body.m_sleepTime = 0.0;\n minSleepTime = 0.0;\n } else {\n body.m_sleepTime += h;\n minSleepTime = Math.min(minSleepTime, body.m_sleepTime);\n }\n }\n\n if (minSleepTime >= Settings.timeToSleep && positionSolved) {\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.setAwake(false);\n }\n }\n }\n }\n\n /** @internal */\n printBodies(tag: string): void {\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const b = this.m_bodies[i];\n common.debug(tag, b.c_position.a, b.c_position.c.x, b.c_position.c.y, b.c_velocity.w, b.c_velocity.v.x, b.c_velocity.v.y);\n }\n }\n\n /**\n * Find TOI contacts and solve them.\n */\n solveWorldTOI(step: TimeStep): void {\n const world = this.m_world;\n\n if (world.m_stepComplete) {\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n b.m_sweep.alpha0 = 0.0;\n }\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Invalidate TOI\n c.m_toiFlag = false;\n c.m_islandFlag = false;\n c.m_toiCount = 0;\n c.m_toi = 1.0;\n }\n }\n\n // Find TOI events and solve them.\n while (true) {\n // Find the first TOI.\n let minContact = null; // Contact\n let minAlpha = 1.0;\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Is this contact disabled?\n if (c.isEnabled() == false) {\n continue;\n }\n\n // Prevent excessive sub-stepping.\n if (c.m_toiCount > Settings.maxSubSteps) {\n continue;\n }\n\n let alpha = 1.0;\n if (c.m_toiFlag) {\n // This contact has a valid cached TOI.\n alpha = c.m_toi;\n } else {\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n // Is there a sensor?\n if (fA.isSensor() || fB.isSensor()) {\n continue;\n }\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n _ASSERT && common.assert(bA.isDynamic() || bB.isDynamic());\n\n const activeA = bA.isAwake() && !bA.isStatic();\n const activeB = bB.isAwake() && !bB.isStatic();\n\n // Is at least one body active (awake and dynamic or kinematic)?\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const collideA = bA.isBullet() || !bA.isDynamic();\n const collideB = bB.isBullet() || !bB.isDynamic();\n\n // Are these two non-bullet dynamic bodies?\n if (collideA == false && collideB == false) {\n continue;\n }\n\n // Compute the TOI for this contact.\n // Put the sweeps onto the same time interval.\n let alpha0 = bA.m_sweep.alpha0;\n\n if (bA.m_sweep.alpha0 < bB.m_sweep.alpha0) {\n alpha0 = bB.m_sweep.alpha0;\n bA.m_sweep.advance(alpha0);\n } else if (bB.m_sweep.alpha0 < bA.m_sweep.alpha0) {\n alpha0 = bA.m_sweep.alpha0;\n bB.m_sweep.advance(alpha0);\n }\n\n _ASSERT && common.assert(alpha0 < 1.0);\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const sweepA = bA.m_sweep;\n const sweepB = bB.m_sweep;\n\n // Compute the time of impact in interval [0, minTOI]\n const input = new TOIInput(); // TODO: reuse\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.sweepA.set(bA.m_sweep);\n input.sweepB.set(bB.m_sweep);\n input.tMax = 1.0;\n\n const output = new TOIOutput(); // TODO: reuse\n TimeOfImpact(output, input);\n\n // Beta is the fraction of the remaining portion of the [time?].\n const beta = output.t;\n if (output.state == TOIOutputState.e_touching) {\n alpha = Math.min(alpha0 + (1.0 - alpha0) * beta, 1.0);\n } else {\n alpha = 1.0;\n }\n\n c.m_toi = alpha;\n c.m_toiFlag = true;\n }\n\n if (alpha < minAlpha) {\n // This is the minimum TOI found so far.\n minContact = c;\n minAlpha = alpha;\n }\n }\n\n if (minContact == null || 1.0 - 10.0 * Math.EPSILON < minAlpha) {\n // No more TOI events. Done!\n world.m_stepComplete = true;\n break;\n }\n\n // Advance the bodies to the TOI.\n const fA = minContact.getFixtureA();\n const fB = minContact.getFixtureB();\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const backup1 = bA.m_sweep.clone();\n const backup2 = bB.m_sweep.clone();\n\n bA.advance(minAlpha);\n bB.advance(minAlpha);\n\n // The TOI contact likely has some new contact points.\n minContact.update(world);\n minContact.m_toiFlag = false;\n ++minContact.m_toiCount;\n\n // Is the contact solid?\n if (minContact.isEnabled() == false || minContact.isTouching() == false) {\n // Restore the sweeps.\n minContact.setEnabled(false);\n bA.m_sweep.set(backup1);\n bB.m_sweep.set(backup2);\n bA.synchronizeTransform();\n bB.synchronizeTransform();\n continue;\n }\n\n bA.setAwake(true);\n bB.setAwake(true);\n\n // Build the island\n this.clear();\n this.addBody(bA);\n this.addBody(bB);\n this.addContact(minContact);\n\n bA.m_islandFlag = true;\n bB.m_islandFlag = true;\n minContact.m_islandFlag = true;\n\n // Get contacts on bodyA and bodyB.\n const bodies = [ bA, bB ];\n for (let i = 0; i < bodies.length; ++i) {\n const body = bodies[i];\n if (body.isDynamic()) {\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n // if (this.m_bodyCount == this.m_bodyCapacity) { break; }\n // if (this.m_contactCount == this.m_contactCapacity) { break; }\n\n const contact = ce.contact;\n\n // Has this contact already been added to the island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Only add if either is static, kinematic or bullet.\n const other = ce.other;\n if (other.isDynamic() && !body.isBullet() && !other.isBullet()) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n // Tentatively advance the body to the TOI.\n const backup = other.m_sweep.clone();\n if (other.m_islandFlag == false) {\n other.advance(minAlpha);\n }\n\n // Update the contact points\n contact.update(world);\n\n // Was the contact disabled by the user?\n // Are there contact points?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n other.m_sweep.set(backup);\n other.synchronizeTransform();\n continue;\n }\n\n // Add the contact to the island\n contact.m_islandFlag = true;\n this.addContact(contact);\n\n // Has the other body already been added to the island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // Add the other body to the island.\n other.m_islandFlag = true;\n\n if (!other.isStatic()) {\n other.setAwake(true);\n }\n\n this.addBody(other);\n }\n }\n }\n\n s_subStep.reset((1.0 - minAlpha) * step.dt);\n s_subStep.dtRatio = 1.0;\n s_subStep.positionIterations = 20;\n s_subStep.velocityIterations = step.velocityIterations;\n s_subStep.warmStarting = false;\n\n this.solveIslandTOI(s_subStep, bA, bB);\n\n // Reset island flags and synchronize broad-phase proxies.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.m_islandFlag = false;\n\n if (!body.isDynamic()) {\n continue;\n }\n\n body.synchronizeFixtures();\n\n // Invalidate all contact TOIs on this displaced body.\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n ce.contact.m_toiFlag = false;\n ce.contact.m_islandFlag = false;\n }\n }\n\n // Commit fixture proxy movements to the broad-phase so that new contacts\n // are created.\n // Also, some contacts can be destroyed.\n world.findNewContacts();\n\n if (world.m_subStepping) {\n world.m_stepComplete = false;\n break;\n }\n }\n\n if (_DEBUG) for (let b = world.m_bodyList; b; b = b.m_next) {\n const c = b.m_sweep.c;\n const a = b.m_sweep.a;\n const v = b.m_linearVelocity;\n const w = b.m_angularVelocity;\n }\n }\n\n solveIslandTOI(subStep: TimeStep, toiA: Body, toiB: Body): void {\n const world = this.m_world;\n\n // Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.c_position.c.setVec2(body.m_sweep.c);\n body.c_position.a = body.m_sweep.a;\n body.c_velocity.v.setVec2(body.m_linearVelocity);\n body.c_velocity.w = body.m_angularVelocity;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(subStep);\n }\n\n // Solve position constraints.\n for (let i = 0; i < subStep.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraintTOI(subStep, toiA, toiB);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -1.5 * Settings.linearSlop;\n if (contactsOkay) {\n break;\n }\n }\n\n if (false) {\n // Is the new position really safe?\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const c = this.m_contacts[i];\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const input = new DistanceInput();\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.transformA = bA.getTransform();\n input.transformB = bB.getTransform();\n input.useRadii = false;\n\n const output = new DistanceOutput();\n const cache = new SimplexCache();\n Distance(output, cache, input);\n\n if (output.distance == 0 || cache.count == 3) {\n cache.count += 0;\n }\n }\n }\n\n // Leap of faith to new safe state.\n toiA.m_sweep.c0.setVec2(toiA.c_position.c);\n toiA.m_sweep.a0 = toiA.c_position.a;\n toiB.m_sweep.c0.setVec2(toiB.c_position.c);\n toiB.m_sweep.a0 = toiB.c_position.a;\n\n // No warm starting is needed for TOI events because warm\n // starting impulses were applied in the discrete solver.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(subStep);\n }\n\n // Solve velocity constraints.\n for (let i = 0; i < subStep.velocityIterations; ++i) {\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(subStep);\n }\n }\n\n // Don't store the TOI contact forces for warm starting\n // because they can be quite large.\n\n const h = subStep.dt;\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.dot(translation, translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n\n // Sync bodies\n body.m_sweep.c = c;\n body.m_sweep.a = a;\n body.m_linearVelocity = v;\n body.m_angularVelocity = w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n }\n\n /** @internal */\n postSolveIsland(): void {\n for (let c = 0; c < this.m_contacts.length; ++c) {\n const contact = this.m_contacts[c];\n this.m_world.postSolve(contact, contact.m_impulse);\n }\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../util/options';\nimport common from '../util/common';\nimport Vec2 from '../common/Vec2';\nimport BroadPhase from '../collision/BroadPhase';\nimport Solver, { ContactImpulse, TimeStep } from './Solver';\nimport Body, { BodyDef } from './Body';\nimport Joint from './Joint';\nimport Contact from './Contact';\nimport AABB, { RayCastInput, RayCastOutput } from \"../collision/AABB\";\nimport Fixture, { FixtureProxy } from \"./Fixture\";\nimport Manifold from \"../collision/Manifold\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * @prop gravity [{ x : 0, y : 0}]\n * @prop allowSleep [true]\n * @prop warmStarting [true]\n * @prop continuousPhysics [true]\n * @prop subStepping [false]\n * @prop blockSolve [true]\n * @prop velocityIterations [8] For the velocity constraint solver.\n * @prop positionIterations [3] For the position constraint solver.\n */\nexport interface WorldDef {\n gravity?: Vec2;\n allowSleep?: boolean;\n warmStarting?: boolean;\n continuousPhysics?: boolean;\n subStepping?: boolean;\n blockSolve?: boolean;\n velocityIterations?: number;\n positionIterations?: number;\n}\n\nconst WorldDefDefault: WorldDef = {\n gravity : Vec2.zero(),\n allowSleep : true,\n warmStarting : true,\n continuousPhysics : true,\n subStepping : false,\n blockSolve : true,\n velocityIterations : 8,\n positionIterations : 3\n};\n\n/**\n * Callback function for ray casts, see {@link World.rayCast}.\n *\n * Called for each fixture found in the query. You control how the ray cast\n * proceeds by returning a float: return -1: ignore this fixture and continue\n * return 0: terminate the ray cast return fraction: clip the ray to this point\n * return 1: don't clip the ray and continue\n *\n * @param fixture The fixture hit by the ray\n * @param point The point of initial intersection\n * @param normal The normal vector at the point of intersection\n * @param fraction\n *\n * @return -1 to filter, 0 to terminate, fraction to clip the ray for closest hit, 1 to continue\n */\nexport type WorldRayCastCallback = (fixture: Fixture, point: Vec2, normal: Vec2, fraction: number) => number;\n\n/**\n * Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\nexport type WorldAABBQueryCallback = (fixture: Fixture) => boolean;\n\nexport default class World {\n /** @internal */ m_solver: Solver;\n /** @internal */ m_broadPhase: BroadPhase;\n /** @internal */ m_contactList: Contact | null;\n /** @internal */ m_contactCount: number;\n /** @internal */ m_bodyList: Body | null;\n /** @internal */ m_bodyCount: number;\n /** @internal */ m_jointList: Joint | null;\n /** @internal */ m_jointCount: number;\n /** @internal */ m_stepComplete: boolean;\n /** @internal */ m_allowSleep: boolean;\n /** @internal */ m_gravity: Vec2;\n /** @internal */ m_clearForces: boolean;\n /** @internal */ m_newFixture: boolean;\n /** @internal */ m_locked: boolean;\n /** @internal */ m_warmStarting: boolean;\n /** @internal */ m_continuousPhysics: boolean;\n /** @internal */ m_subStepping: boolean;\n /** @internal */ m_blockSolve: boolean;\n /** @internal */ m_velocityIterations: number;\n /** @internal */ m_positionIterations: number;\n /** @internal */ m_t: number;\n\n // TODO\n /** @internal */ _listeners: {\n [key: string]: any[]\n };\n\n /**\n * @param def World definition or gravity vector.\n */\n constructor(def?: WorldDef | Vec2 | null) {\n if (!(this instanceof World)) {\n return new World(def);\n }\n\n if (def && Vec2.isValid(def)) {\n def = { gravity: def as Vec2 };\n }\n\n def = options(def, WorldDefDefault) as WorldDef;\n\n this.m_solver = new Solver(this);\n\n this.m_broadPhase = new BroadPhase();\n\n this.m_contactList = null;\n this.m_contactCount = 0;\n\n this.m_bodyList = null;\n this.m_bodyCount = 0;\n\n this.m_jointList = null;\n this.m_jointCount = 0;\n\n this.m_stepComplete = true;\n\n this.m_allowSleep = def.allowSleep;\n this.m_gravity = Vec2.clone(def.gravity);\n\n this.m_clearForces = true;\n this.m_newFixture = false;\n this.m_locked = false;\n\n // These are for debugging the solver.\n this.m_warmStarting = def.warmStarting;\n this.m_continuousPhysics = def.continuousPhysics;\n this.m_subStepping = def.subStepping;\n\n this.m_blockSolve = def.blockSolve;\n this.m_velocityIterations = def.velocityIterations;\n this.m_positionIterations = def.positionIterations;\n\n this.m_t = 0;\n }\n\n /** @internal */\n _serialize(): object {\n const bodies = [];\n const joints = [];\n\n for (let b = this.getBodyList(); b; b = b.getNext()) {\n bodies.push(b);\n }\n\n for (let j = this.getJointList(); j; j = j.getNext()) {\n // @ts-ignore\n if (typeof j._serialize === 'function') {\n joints.push(j);\n }\n }\n\n return {\n gravity: this.m_gravity,\n bodies,\n joints,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, context: any, restore: any): World {\n if (!data) {\n return new World();\n }\n\n const world = new World(data.gravity);\n\n if (data.bodies) {\n for (let i = data.bodies.length - 1; i >= 0; i -= 1) {\n world._addBody(restore(Body, data.bodies[i], world));\n }\n }\n\n if (data.joints) {\n for (let i = data.joints.length - 1; i >= 0; i--) {\n world.createJoint(restore(Joint, data.joints[i], world));\n }\n }\n\n return world;\n }\n\n /**\n * Get the world body list. With the returned body, use Body.getNext to get the\n * next body in the world list. A null body indicates the end of the list.\n *\n * @return the head of the world body list.\n */\n getBodyList(): Body | null {\n return this.m_bodyList;\n }\n\n /**\n * Get the world joint list. With the returned joint, use Joint.getNext to get\n * the next joint in the world list. A null joint indicates the end of the list.\n *\n * @return the head of the world joint list.\n */\n getJointList(): Joint | null {\n return this.m_jointList;\n }\n\n /**\n * Get the world contact list. With the returned contact, use Contact.getNext to\n * get the next contact in the world list. A null contact indicates the end of\n * the list.\n *\n * Warning: contacts are created and destroyed in the middle of a time step.\n * Use ContactListener to avoid missing contacts.\n *\n * @return the head of the world contact list.\n */\n getContactList(): Contact | null {\n return this.m_contactList;\n }\n\n getBodyCount(): number {\n return this.m_bodyCount;\n }\n\n getJointCount(): number {\n return this.m_jointCount;\n }\n\n /**\n * Get the number of contacts (each may have 0 or more contact points).\n */\n getContactCount(): number {\n return this.m_contactCount;\n }\n\n /**\n * Change the global gravity vector.\n */\n setGravity(gravity: Vec2): void {\n this.m_gravity = gravity;\n }\n\n /**\n * Get the global gravity vector.\n */\n getGravity(): Vec2 {\n return this.m_gravity;\n }\n\n /**\n * Is the world locked (in the middle of a time step).\n */\n isLocked(): boolean {\n return this.m_locked;\n }\n\n /**\n * Enable/disable sleep.\n */\n setAllowSleeping(flag: boolean): void {\n if (flag == this.m_allowSleep) {\n return;\n }\n\n this.m_allowSleep = flag;\n if (this.m_allowSleep == false) {\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.setAwake(true);\n }\n }\n }\n\n getAllowSleeping(): boolean {\n return this.m_allowSleep;\n }\n\n /**\n * Enable/disable warm starting. For testing.\n */\n setWarmStarting(flag: boolean): void {\n this.m_warmStarting = flag;\n }\n\n getWarmStarting(): boolean {\n return this.m_warmStarting;\n }\n\n /**\n * Enable/disable continuous physics. For testing.\n */\n setContinuousPhysics(flag: boolean): void {\n this.m_continuousPhysics = flag;\n }\n\n getContinuousPhysics(): boolean {\n return this.m_continuousPhysics;\n }\n\n /**\n * Enable/disable single stepped continuous physics. For testing.\n */\n setSubStepping(flag: boolean): void {\n this.m_subStepping = flag;\n }\n\n getSubStepping(): boolean {\n return this.m_subStepping;\n }\n\n /**\n * Set flag to control automatic clearing of forces after each time step.\n */\n setAutoClearForces(flag: boolean): void {\n this.m_clearForces = flag;\n }\n\n /**\n * Get the flag that controls automatic clearing of forces after each time step.\n */\n getAutoClearForces(): boolean {\n return this.m_clearForces;\n }\n\n /**\n * Manually clear the force buffer on all bodies. By default, forces are cleared\n * automatically after each call to step. The default behavior is modified by\n * calling setAutoClearForces. The purpose of this function is to support\n * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step\n * under a variable frame-rate. When you perform sub-stepping you will disable\n * auto clearing of forces and instead call clearForces after all sub-steps are\n * complete in one pass of your game loop.\n *\n * See {@link World.setAutoClearForces}\n */\n clearForces(): void {\n for (let body = this.m_bodyList; body; body = body.getNext()) {\n body.m_force.setZero();\n body.m_torque = 0.0;\n }\n }\n\n /**\n * Query the world for all fixtures that potentially overlap the provided AABB.\n *\n * @param aabb The query box.\n * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\n queryAABB(aabb: AABB, callback: WorldAABBQueryCallback): void {\n _ASSERT && common.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n this.m_broadPhase.query(aabb, function(proxyId: number): boolean { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n return callback(proxy.fixture);\n });\n }\n\n /**\n * Ray-cast the world for all fixtures in the path of the ray. Your callback\n * controls whether you get the closest point, any point, or n-points. The\n * ray-cast ignores shapes that contain the starting point.\n *\n * @param point1 The ray starting point\n * @param point2 The ray ending point\n * @param callback A user implemented callback function.\n */\n rayCast(point1: Vec2, point2: Vec2, callback: WorldRayCastCallback): void {\n _ASSERT && common.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n\n this.m_broadPhase.rayCast({\n maxFraction : 1.0,\n p1 : point1,\n p2 : point2\n }, function(input: RayCastInput, proxyId: number): number { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n const fixture = proxy.fixture;\n const index = proxy.childIndex;\n // @ts-ignore\n const output: RayCastOutput = {}; // TODO GC\n const hit = fixture.rayCast(output, input, index);\n if (hit) {\n const fraction = output.fraction;\n const point = Vec2.add(Vec2.mulNumVec2((1.0 - fraction), input.p1), Vec2.mulNumVec2(fraction, input.p2));\n return callback(fixture, point, output.normal, fraction);\n }\n return input.maxFraction;\n });\n }\n\n /**\n * Get the number of broad-phase proxies.\n */\n getProxyCount(): number {\n return this.m_broadPhase.getProxyCount();\n }\n\n /**\n * Get the height of broad-phase dynamic tree.\n */\n getTreeHeight(): number {\n return this.m_broadPhase.getTreeHeight();\n }\n\n /**\n * Get the balance of broad-phase dynamic tree.\n */\n getTreeBalance(): number {\n return this.m_broadPhase.getTreeBalance();\n }\n\n /**\n * Get the quality metric of broad-phase dynamic tree. The smaller the better.\n * The minimum is 1.\n */\n getTreeQuality(): number {\n return this.m_broadPhase.getTreeQuality();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The body shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n _ASSERT && common.assert(this.m_locked == false);\n if (this.m_locked) {\n return;\n }\n\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.m_xf.p.sub(newOrigin);\n b.m_sweep.c0.sub(newOrigin);\n b.m_sweep.c.sub(newOrigin);\n }\n\n for (let j = this.m_jointList; j; j = j.m_next) {\n j.shiftOrigin(newOrigin);\n }\n\n this.m_broadPhase.shiftOrigin(newOrigin);\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addBody(body: Body): void {\n _ASSERT && common.assert(this.isLocked() === false);\n if (this.isLocked()) {\n return;\n }\n\n // Add to world doubly linked list.\n body.m_prev = null;\n body.m_next = this.m_bodyList;\n if (this.m_bodyList) {\n this.m_bodyList.m_prev = body;\n }\n this.m_bodyList = body;\n ++this.m_bodyCount;\n }\n\n /**\n * Create a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This function is locked during callbacks.\n */\n createBody(def?: BodyDef): Body;\n createBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createBody(arg1?, arg2?) {\n _ASSERT && common.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n\n const body = new Body(this, def);\n this._addBody(body);\n return body;\n }\n\n createDynamicBody(def?: BodyDef): Body;\n createDynamicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createDynamicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'dynamic';\n return this.createBody(def);\n }\n\n createKinematicBody(def?: BodyDef): Body;\n createKinematicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createKinematicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'kinematic';\n return this.createBody(def);\n }\n\n /**\n * Destroy a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This automatically deletes all associated shapes and joints.\n *\n * Warning: This function is locked during callbacks.\n */\n destroyBody(b: Body): boolean {\n _ASSERT && common.assert(this.m_bodyCount > 0);\n _ASSERT && common.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n if (b.m_destroyed) {\n return false;\n }\n\n // Delete the attached joints.\n let je = b.m_jointList;\n while (je) {\n const je0 = je;\n je = je.next;\n\n this.publish('remove-joint', je0.joint);\n this.destroyJoint(je0.joint);\n\n b.m_jointList = je;\n }\n b.m_jointList = null;\n\n // Delete the attached contacts.\n let ce = b.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n\n this.destroyContact(ce0.contact);\n\n b.m_contactList = ce;\n }\n b.m_contactList = null;\n\n // Delete the attached fixtures. This destroys broad-phase proxies.\n let f = b.m_fixtureList;\n while (f) {\n const f0 = f;\n f = f.m_next;\n\n this.publish('remove-fixture', f0);\n f0.destroyProxies(this.m_broadPhase);\n\n b.m_fixtureList = f;\n }\n b.m_fixtureList = null;\n\n // Remove world body list.\n if (b.m_prev) {\n b.m_prev.m_next = b.m_next;\n }\n\n if (b.m_next) {\n b.m_next.m_prev = b.m_prev;\n }\n\n if (b == this.m_bodyList) {\n this.m_bodyList = b.m_next;\n }\n\n b.m_destroyed = true;\n\n --this.m_bodyCount;\n\n this.publish('remove-body', b);\n\n return true;\n }\n\n /**\n * Create a joint to constrain bodies together. No reference to the definition\n * is retained. This may cause the connected bodies to cease colliding.\n *\n * Warning: This function is locked during callbacks.\n */\n createJoint(joint: T): T | null {\n _ASSERT && common.assert(!!joint.m_bodyA);\n _ASSERT && common.assert(!!joint.m_bodyB);\n _ASSERT && common.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n // Connect to the world list.\n joint.m_prev = null;\n joint.m_next = this.m_jointList;\n if (this.m_jointList) {\n this.m_jointList.m_prev = joint;\n }\n this.m_jointList = joint;\n ++this.m_jointCount;\n\n // Connect to the bodies' doubly linked lists.\n joint.m_edgeA.joint = joint;\n joint.m_edgeA.other = joint.m_bodyB;\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = joint.m_bodyA.m_jointList;\n if (joint.m_bodyA.m_jointList)\n joint.m_bodyA.m_jointList.prev = joint.m_edgeA;\n joint.m_bodyA.m_jointList = joint.m_edgeA;\n\n joint.m_edgeB.joint = joint;\n joint.m_edgeB.other = joint.m_bodyA;\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = joint.m_bodyB.m_jointList;\n if (joint.m_bodyB.m_jointList)\n joint.m_bodyB.m_jointList.prev = joint.m_edgeB;\n joint.m_bodyB.m_jointList = joint.m_edgeB;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n for (let edge = joint.m_bodyB.getContactList(); edge; edge = edge.next) {\n if (edge.other == joint.m_bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n }\n }\n\n // Note: creating a joint doesn't wake the bodies.\n\n return joint;\n }\n\n /**\n * Destroy a joint. This may cause the connected bodies to begin colliding.\n * Warning: This function is locked during callbacks.\n */\n destroyJoint(joint: Joint): void {\n _ASSERT && common.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n // Remove from the doubly linked list.\n if (joint.m_prev) {\n joint.m_prev.m_next = joint.m_next;\n }\n\n if (joint.m_next) {\n joint.m_next.m_prev = joint.m_prev;\n }\n\n if (joint == this.m_jointList) {\n this.m_jointList = joint.m_next;\n }\n\n // Disconnect from bodies.\n const bodyA = joint.m_bodyA;\n const bodyB = joint.m_bodyB;\n\n // Wake up connected bodies.\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n\n // Remove from body 1.\n if (joint.m_edgeA.prev) {\n joint.m_edgeA.prev.next = joint.m_edgeA.next;\n }\n\n if (joint.m_edgeA.next) {\n joint.m_edgeA.next.prev = joint.m_edgeA.prev;\n }\n\n if (joint.m_edgeA == bodyA.m_jointList) {\n bodyA.m_jointList = joint.m_edgeA.next;\n }\n\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = null;\n\n // Remove from body 2\n if (joint.m_edgeB.prev) {\n joint.m_edgeB.prev.next = joint.m_edgeB.next;\n }\n\n if (joint.m_edgeB.next) {\n joint.m_edgeB.next.prev = joint.m_edgeB.prev;\n }\n\n if (joint.m_edgeB == bodyB.m_jointList) {\n bodyB.m_jointList = joint.m_edgeB.next;\n }\n\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = null;\n\n _ASSERT && common.assert(this.m_jointCount > 0);\n --this.m_jointCount;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n let edge = bodyB.getContactList();\n while (edge) {\n if (edge.other == bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n }\n\n this.publish('remove-joint', joint);\n }\n\n /** @internal */\n s_step: TimeStep = new TimeStep(); // reuse\n\n /**\n * Take a time step. This performs collision detection, integration, and\n * constraint solution.\n *\n * Broad-phase, narrow-phase, solve and solve time of impacts.\n *\n * @param timeStep Time step, this should not vary.\n */\n step(timeStep: number, velocityIterations?: number, positionIterations?: number): void {\n this.publish('pre-step', timeStep);\n\n if ((velocityIterations | 0) !== velocityIterations) {\n // TODO: remove this in future\n velocityIterations = 0;\n }\n\n velocityIterations = velocityIterations || this.m_velocityIterations;\n positionIterations = positionIterations || this.m_positionIterations;\n\n // If new fixtures were added, we need to find the new contacts.\n if (this.m_newFixture) {\n this.findNewContacts();\n this.m_newFixture = false;\n }\n\n this.m_locked = true;\n\n this.s_step.reset(timeStep);\n this.s_step.velocityIterations = velocityIterations;\n this.s_step.positionIterations = positionIterations;\n this.s_step.warmStarting = this.m_warmStarting;\n this.s_step.blockSolve = this.m_blockSolve;\n\n // Update contacts. This is where some contacts are destroyed.\n this.updateContacts();\n\n // Integrate velocities, solve velocity constraints, and integrate positions.\n if (this.m_stepComplete && timeStep > 0.0) {\n this.m_solver.solveWorld(this.s_step);\n\n // Synchronize fixtures, check for out of range bodies.\n for (let b = this.m_bodyList; b; b = b.getNext()) {\n // If a body was not in an island then it did not move.\n if (b.m_islandFlag == false) {\n continue;\n }\n\n if (b.isStatic()) {\n continue;\n }\n\n // Update fixtures (for broad-phase).\n b.synchronizeFixtures();\n }\n // Look for new contacts.\n this.findNewContacts();\n }\n\n // Handle TOI events.\n if (this.m_continuousPhysics && timeStep > 0.0) {\n this.m_solver.solveWorldTOI(this.s_step);\n }\n\n if (this.m_clearForces) {\n this.clearForces();\n }\n\n this.m_locked = false;\n\n this.publish('post-step', timeStep);\n }\n\n /**\n * @internal\n * Call this method to find new contacts.\n */\n findNewContacts(): void {\n this.m_broadPhase.updatePairs(this.createContact);\n }\n\n /**\n * @internal\n * Callback for broad-phase.\n */\n createContact = (proxyA: FixtureProxy, proxyB: FixtureProxy): void => {\n const fixtureA = proxyA.fixture;\n const fixtureB = proxyB.fixture;\n\n const indexA = proxyA.childIndex;\n const indexB = proxyB.childIndex;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Are the fixtures on the same body?\n if (bodyA == bodyB) {\n return;\n }\n\n // TODO_ERIN use a hash table to remove a potential bottleneck when both\n // bodies have a lot of contacts.\n // Does a contact already exist?\n let edge = bodyB.getContactList(); // ContactEdge\n while (edge) {\n if (edge.other == bodyA) {\n const fA = edge.contact.getFixtureA();\n const fB = edge.contact.getFixtureB();\n const iA = edge.contact.getChildIndexA();\n const iB = edge.contact.getChildIndexB();\n\n if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) {\n // A contact already exists.\n return;\n }\n\n if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) {\n // A contact already exists.\n return;\n }\n }\n\n edge = edge.next;\n }\n\n if (bodyB.shouldCollide(bodyA) == false) {\n return;\n }\n if (fixtureB.shouldCollide(fixtureA) == false) {\n return;\n }\n\n // Call the factory.\n const contact = Contact.create(fixtureA, indexA, fixtureB, indexB);\n if (contact == null) {\n return;\n }\n\n // Insert into the world.\n contact.m_prev = null;\n if (this.m_contactList != null) {\n contact.m_next = this.m_contactList;\n this.m_contactList.m_prev = contact;\n }\n this.m_contactList = contact;\n\n ++this.m_contactCount;\n }\n\n /**\n * @internal\n * Removes old non-overlapping contacts, applies filters and updates contacts.\n */\n updateContacts(): void {\n // Update awake contacts.\n let c;\n let next_c = this.m_contactList;\n while (c = next_c) {\n next_c = c.getNext();\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Is this contact flagged for filtering?\n if (c.m_filterFlag) {\n if (bodyB.shouldCollide(bodyA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n if (fixtureB.shouldCollide(fixtureA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n // Clear the filtering flag.\n c.m_filterFlag = false;\n }\n\n const activeA = bodyA.isAwake() && !bodyA.isStatic();\n const activeB = bodyB.isAwake() && !bodyB.isStatic();\n\n // At least one body must be awake and it must be dynamic or kinematic.\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const proxyIdA = fixtureA.m_proxies[indexA].proxyId;\n const proxyIdB = fixtureB.m_proxies[indexB].proxyId;\n const overlap = this.m_broadPhase.testOverlap(proxyIdA, proxyIdB);\n\n // Here we destroy contacts that cease to overlap in the broad-phase.\n if (overlap == false) {\n this.destroyContact(c);\n continue;\n }\n\n // The contact persists.\n c.update(this);\n }\n }\n\n /**\n * @internal\n */\n destroyContact(contact: Contact): void {\n Contact.destroy(contact, this);\n\n // Remove from the world.\n if (contact.m_prev) {\n contact.m_prev.m_next = contact.m_next;\n }\n if (contact.m_next) {\n contact.m_next.m_prev = contact.m_prev;\n }\n if (contact == this.m_contactList) {\n this.m_contactList = contact.m_next;\n }\n\n --this.m_contactCount;\n }\n\n\n /**\n * Called when two fixtures begin to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'begin-contact', listener: (contact: Contact) => void): World;\n /**\n * Called when two fixtures cease to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'end-contact', listener: (contact: Contact) => void): World;\n /**\n * This is called after a contact is updated. This allows you to inspect a\n * contact before it goes to the solver. If you are careful, you can modify the\n * contact manifold (e.g. disable contact). A copy of the old manifold is\n * provided so that you can detect changes. Note: this is called only for awake\n * bodies. Note: this is called even when the number of contact points is zero.\n * Note: this is not called for sensors. Note: if you set the number of contact\n * points to zero, you will not get an endContact callback. However, you may get\n * a beginContact callback the next step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n /**\n * This lets you inspect a contact after the solver is finished. This is useful\n * for inspecting impulses. Note: the contact manifold does not include time of\n * impact impulses, which can be arbitrarily large if the sub-step is small.\n * Hence the impulse is provided explicitly in a separate data structure. Note:\n * this is only called for contacts that are touching, solid, and awake.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n /** Listener is called whenever a body is removed. */\n on(name: 'remove-body', listener: (body: Body) => void): World;\n /** Listener is called whenever a joint is removed implicitly or explicitly. */\n on(name: 'remove-joint', listener: (joint: Joint) => void): World;\n /** Listener is called whenever a fixture is removed implicitly or explicitly. */\n on(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Register an event listener.\n */\n // tslint:disable-next-line:typedef\n on(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n if (!this._listeners) {\n this._listeners = {};\n }\n if (!this._listeners[name]) {\n this._listeners[name] = [];\n }\n this._listeners[name].push(listener);\n return this;\n }\n\n off(name: 'begin-contact', listener: (contact: Contact) => void): World;\n off(name: 'end-contact', listener: (contact: Contact) => void): World;\n off(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n off(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n off(name: 'remove-body', listener: (body: Body) => void): World;\n off(name: 'remove-joint', listener: (joint: Joint) => void): World;\n off(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Remove an event listener.\n */\n // tslint:disable-next-line:typedef\n off(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return this;\n }\n const index = listeners.indexOf(listener);\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n publish(name: string, arg1?: any, arg2?: any, arg3?: any): number {\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return 0;\n }\n for (let l = 0; l < listeners.length; l++) {\n listeners[l].call(this, arg1, arg2, arg3);\n }\n return listeners.length;\n }\n\n /**\n * @internal\n */\n beginContact(contact: Contact): void {\n this.publish('begin-contact', contact);\n }\n\n /**\n * @internal\n */\n endContact(contact: Contact): void {\n this.publish('end-contact', contact);\n }\n\n /**\n * @internal\n */\n preSolve(contact: Contact, oldManifold: Manifold): void {\n this.publish('pre-solve', contact, oldManifold);\n }\n\n /**\n * @internal\n */\n postSolve(contact: Contact, impulse: ContactImpulse): void {\n this.publish('post-solve', contact, impulse);\n }\n\n /**\n * Joints and fixtures are destroyed when their associated body is destroyed.\n * Register a destruction listener so that you may nullify references to these\n * joints and shapes.\n *\n * `function(object)` is called when any joint or fixture is about to\n * be destroyed due to the destruction of one of its attached or parent bodies.\n */\n\n /**\n * Register a contact filter to provide specific control over collision.\n * Otherwise the default filter is used (defaultFilter). The listener is owned\n * by you and must remain in scope.\n *\n * Moved to Fixture.\n */\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Math from './Math';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport default class Vec3 {\n x: number;\n y: number;\n z: number;\n\n constructor(x: number, y: number, z: number);\n constructor(obj: { x: number, y: number, z: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?, z?) {\n if (!(this instanceof Vec3)) {\n return new Vec3(x, y, z);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n this.z = x.z;\n } else {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n _ASSERT && Vec3.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y,\n z: this.z\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = data.x;\n obj.y = data.y;\n obj.z = data.z;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number, z: number): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = x;\n obj.y = y;\n obj.z = z;\n return obj;\n }\n\n static zero(): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = 0;\n obj.y = 0;\n obj.z = 0;\n return obj;\n }\n\n static clone(v: Vec3): Vec3 {\n _ASSERT && Vec3.assert(v);\n return Vec3.neo(v.x, v.y, v.z);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y) && Math.isFinite(obj.z);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Vec3.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Vec3!');\n }\n }\n\n setZero(): Vec3 {\n this.x = 0.0;\n this.y = 0.0;\n this.z = 0.0;\n return this;\n }\n\n set(x: number, y: number, z: number): Vec3 {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n\n add(w: Vec3): Vec3 {\n this.x += w.x;\n this.y += w.y;\n this.z += w.z;\n return this;\n }\n\n sub(w: Vec3): Vec3 {\n this.x -= w.x;\n this.y -= w.y;\n this.z -= w.z;\n return this;\n }\n\n mul(m: number): Vec3 {\n this.x *= m;\n this.y *= m;\n this.z *= m;\n return this;\n }\n\n static areEqual(v: Vec3, w: Vec3): boolean {\n _ASSERT && Vec3.assert(v);\n _ASSERT && Vec3.assert(w);\n return v === w ||\n typeof v === 'object' && v !== null &&\n typeof w === 'object' && w !== null &&\n v.x === w.x && v.y === w.y && v.z === w.z;\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec3, w: Vec3): number {\n return v.x * w.x + v.y * w.y + v.z * w.z;\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static cross(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(\n v.y * w.z - v.z * w.y,\n v.z * w.x - v.x * w.z,\n v.x * w.y - v.y * w.x\n );\n }\n\n static add(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x + w.x, v.y + w.y, v.z + w.z);\n }\n\n static sub(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x - w.x, v.y - w.y, v.z - w.z);\n }\n\n static mul(v: Vec3, m: number): Vec3 {\n return new Vec3(m * v.x, m * v.y, m * v.z);\n }\n\n neg(): Vec3 {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n }\n\n static neg(v: Vec3): Vec3 {\n return new Vec3(-v.x, -v.y, -v.z);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../../Settings';\nimport Shape from '../Shape';\nimport Transform from '../../common/Transform';\nimport Rot from '../../common/Rot';\nimport Vec2 from '../../common/Vec2';\nimport AABB, { RayCastInput, RayCastOutput } from '../AABB';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n/**\n * A line segment (edge) shape. These can be connected in chains or loops to\n * other edge shapes. The connectivity information is used to ensure correct\n * contact normals.\n */\nexport default class EdgeShape extends Shape {\n static TYPE = 'edge' as const;\n\n // These are the edge vertices\n m_vertex1: Vec2;\n m_vertex2: Vec2;\n\n // Optional adjacent vertices. These are used for smooth collision.\n // Used by chain shape.\n m_vertex0: Vec2;\n m_vertex3: Vec2;\n m_hasVertex0: boolean;\n m_hasVertex3: boolean;\n\n constructor(v1?: Vec2, v2?: Vec2) {\n // @ts-ignore\n if (!(this instanceof EdgeShape)) {\n return new EdgeShape(v1, v2);\n }\n\n super();\n\n this.m_type = EdgeShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n\n\n this.m_vertex1 = v1 ? Vec2.clone(v1) : Vec2.zero();\n this.m_vertex2 = v2 ? Vec2.clone(v2) : Vec2.zero();\n\n this.m_vertex0 = Vec2.zero();\n this.m_vertex3 = Vec2.zero();\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertex1: this.m_vertex1,\n vertex2: this.m_vertex2,\n\n vertex0: this.m_vertex0,\n vertex3: this.m_vertex3,\n hasVertex0: this.m_hasVertex0,\n hasVertex3: this.m_hasVertex3,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): EdgeShape {\n const shape = new EdgeShape(data.vertex1, data.vertex2);\n if (shape.m_hasVertex0) {\n shape.setPrevVertex(data.vertex0);\n }\n if (shape.m_hasVertex3) {\n shape.setNextVertex(data.vertex3);\n }\n return shape;\n }\n\n /** @internal @deprecated */\n setNext(v?: Vec2): EdgeShape {\n return this.setNextVertex(v);\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n setNextVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex3.setVec2(v);\n this.m_hasVertex3 = true;\n } else {\n this.m_vertex3.setZero();\n this.m_hasVertex3 = false;\n }\n return this;\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n getNextVertex(): Vec2 {\n return this.m_vertex3;\n }\n\n /** @internal @deprecated */\n setPrev(v?: Vec2): EdgeShape {\n return this.setPrevVertex(v);\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n setPrevVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex0.setVec2(v);\n this.m_hasVertex0 = true;\n } else {\n this.m_vertex0.setZero();\n this.m_hasVertex0 = false;\n }\n return this;\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n getPrevVertex(): Vec2 {\n return this.m_vertex0;\n }\n\n /**\n * Set this as an isolated edge.\n */\n _set(v1: Vec2, v2: Vec2): EdgeShape {\n this.m_vertex1.setVec2(v1);\n this.m_vertex2.setVec2(v2);\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): EdgeShape {\n const clone = new EdgeShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_vertex1.setVec2(this.m_vertex1);\n clone.m_vertex2.setVec2(this.m_vertex2);\n clone.m_vertex0.setVec2(this.m_vertex0);\n clone.m_vertex3.setVec2(this.m_vertex3);\n clone.m_hasVertex0 = this.m_hasVertex0;\n clone.m_hasVertex3 = this.m_hasVertex3;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // p = p1 + t * d\n // v = v1 + s * e\n // p1 + t * d = v1 + s * e\n // s * e - t * d = p1 - v1\n\n // NOT_USED(childIndex);\n\n // Put the ray into the edge's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n const v1 = this.m_vertex1;\n const v2 = this.m_vertex2;\n const e = Vec2.sub(v2, v1);\n const normal = Vec2.neo(e.y, -e.x);\n normal.normalize();\n\n // q = p1 + t * d\n // dot(normal, q - v1) = 0\n // dot(normal, p1 - v1) + t * dot(normal, d) = 0\n const numerator = Vec2.dot(normal, Vec2.sub(v1, p1));\n const denominator = Vec2.dot(normal, d);\n\n if (denominator == 0.0) {\n return false;\n }\n\n const t = numerator / denominator;\n if (t < 0.0 || input.maxFraction < t) {\n return false;\n }\n\n const q = Vec2.add(p1, Vec2.mulNumVec2(t, d));\n\n // q = v1 + s * r\n // s = dot(q - v1, r) / dot(r, r)\n const r = Vec2.sub(v2, v1);\n const rr = Vec2.dot(r, r);\n if (rr == 0.0) {\n return false;\n }\n\n const s = Vec2.dot(Vec2.sub(q, v1), r) / rr;\n if (s < 0.0 || 1.0 < s) {\n return false;\n }\n\n output.fraction = t;\n if (numerator > 0.0) {\n output.normal = Rot.mulVec2(xf.q, normal).neg();\n } else {\n output.normal = Rot.mulVec2(xf.q, normal);\n }\n return true;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const v1 = Transform.mulVec2(xf, this.m_vertex1);\n const v2 = Transform.mulVec2(xf, this.m_vertex2);\n\n aabb.combinePoints(v1, v2);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center.setCombine(0.5, this.m_vertex1, 0.5, this.m_vertex2);\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_vertex1);\n proxy.m_vertices.push(this.m_vertex2);\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport AABB, { RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport common from '../../util/common';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Settings from '../../Settings';\nimport Shape from '../Shape';\nimport EdgeShape from './EdgeShape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A chain shape is a free form sequence of line segments. The chain has\n * two-sided collision, so you can use inside and outside collision. Therefore,\n * you may use any winding order. Connectivity information is used to create\n * smooth collisions.\n *\n * WARNING: The chain will not collide properly if there are self-intersections.\n */\nexport default class ChainShape extends Shape {\n static TYPE = 'chain' as const;\n\n m_vertices: Vec2[];\n m_count: number;\n m_prevVertex: Vec2 | null;\n m_nextVertex: Vec2 | null;\n m_hasPrevVertex: boolean;\n m_hasNextVertex: boolean;\n\n m_isLoop: boolean;\n\n constructor(vertices?: Vec2[], loop?: boolean) {\n // @ts-ignore\n if (!(this instanceof ChainShape)) {\n return new ChainShape(vertices, loop);\n }\n\n super();\n\n this.m_type = ChainShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_vertices = [];\n this.m_count = 0;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n\n this.m_isLoop = !!loop;\n\n if (vertices && vertices.length) {\n if (loop) {\n this._createLoop(vertices);\n } else {\n this._createChain(vertices);\n }\n }\n }\n\n /** @internal */\n _serialize(): object {\n const data = {\n type: this.m_type,\n vertices: this.m_vertices,\n isLoop: this.m_isLoop,\n hasPrevVertex: this.m_hasPrevVertex,\n hasNextVertex: this.m_hasNextVertex,\n prevVertex: null as Vec2 | null,\n nextVertex: null as Vec2 | null,\n };\n if (this.m_prevVertex) {\n data.prevVertex = this.m_prevVertex;\n }\n if (this.m_nextVertex) {\n data.nextVertex = this.m_nextVertex;\n }\n return data;\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): ChainShape {\n const vertices = [] as Vec2[];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n const shape = new ChainShape(vertices, data.isLoop);\n if (data.prevVertex) {\n shape.setPrevVertex(data.prevVertex);\n }\n if (data.nextVertex) {\n shape.setNextVertex(data.nextVertex);\n }\n return shape;\n }\n\n // clear() {\n // this.m_vertices.length = 0;\n // this.m_count = 0;\n // }\n\n /**\n * @internal\n * Create a loop. This automatically adjusts connectivity.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createLoop(vertices: Vec2[]): ChainShape {\n _ASSERT && common.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && common.assert(vertices.length >= 3);\n for (let i = 1; i < vertices.length; ++i) {\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n // If the code crashes here, it means your vertices are too close together.\n _ASSERT && common.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_vertices = [];\n this.m_count = vertices.length + 1;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n this.m_vertices[vertices.length] = Vec2.clone(vertices[0]);\n\n this.m_prevVertex = this.m_vertices[this.m_count - 2];\n this.m_nextVertex = this.m_vertices[1];\n this.m_hasPrevVertex = true;\n this.m_hasNextVertex = true;\n return this;\n }\n\n /**\n * @internal\n * Create a chain with isolated end vertices.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createChain(vertices: Vec2[]): ChainShape {\n _ASSERT && common.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && common.assert(vertices.length >= 2);\n for (let i = 1; i < vertices.length; ++i) {\n // If the code crashes here, it means your vertices are too close together.\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n _ASSERT && common.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_count = vertices.length;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n return this;\n }\n\n /** @internal */\n _reset(): void {\n if (this.m_isLoop) {\n this._createLoop(this.m_vertices);\n } else {\n this._createChain(this.m_vertices);\n }\n }\n\n /**\n * Establish connectivity to a vertex that precedes the first vertex. Don't call\n * this for loops.\n */\n setPrevVertex(prevVertex: Vec2): void {\n this.m_prevVertex = prevVertex;\n this.m_hasPrevVertex = true;\n }\n\n getPrevVertex(): Vec2 {\n return this.m_prevVertex;\n }\n\n /**\n * Establish connectivity to a vertex that follows the last vertex. Don't call\n * this for loops.\n */\n setNextVertex(nextVertex: Vec2): void {\n this.m_nextVertex = nextVertex;\n this.m_hasNextVertex = true;\n }\n\n getNextVertex(): Vec2 {\n return this.m_nextVertex;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): ChainShape {\n const clone = new ChainShape();\n clone._createChain(this.m_vertices);\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_prevVertex = this.m_prevVertex;\n clone.m_nextVertex = this.m_nextVertex;\n clone.m_hasPrevVertex = this.m_hasPrevVertex;\n clone.m_hasNextVertex = this.m_hasNextVertex;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): number {\n // edge count = vertex count - 1\n return this.m_count - 1;\n }\n\n // Get a child edge.\n getChildEdge(edge: EdgeShape, childIndex: number): void {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count - 1);\n edge.m_type = EdgeShape.TYPE;\n edge.m_radius = this.m_radius;\n\n edge.m_vertex1 = this.m_vertices[childIndex];\n edge.m_vertex2 = this.m_vertices[childIndex + 1];\n\n if (childIndex > 0) {\n edge.m_vertex0 = this.m_vertices[childIndex - 1];\n edge.m_hasVertex0 = true;\n } else {\n edge.m_vertex0 = this.m_prevVertex;\n edge.m_hasVertex0 = this.m_hasPrevVertex;\n }\n\n if (childIndex < this.m_count - 2) {\n edge.m_vertex3 = this.m_vertices[childIndex + 2];\n edge.m_hasVertex3 = true;\n } else {\n edge.m_vertex3 = this.m_nextVertex;\n edge.m_hasVertex3 = this.m_hasNextVertex;\n }\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && common.assert(0 <= index && index <= this.m_count);\n if (index < this.m_count) {\n return this.m_vertices[index];\n } else {\n return this.m_vertices[0];\n }\n }\n\n isLoop(): boolean {\n return this.m_isLoop;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * This always return false.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count);\n\n const edgeShape = new EdgeShape(this.getVertex(childIndex), this.getVertex(childIndex + 1));\n return edgeShape.rayCast(output, input, xf, 0);\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count);\n\n const v1 = Transform.mulVec2(xf, this.getVertex(childIndex));\n const v2 = Transform.mulVec2(xf, this.getVertex(childIndex + 1));\n\n aabb.combinePoints(v1, v2);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * Chains have zero mass.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center = Vec2.zero();\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count);\n proxy.m_buffer[0] = this.getVertex(childIndex);\n proxy.m_buffer[1] = this.getVertex(childIndex + 1);\n proxy.m_vertices = proxy.m_buffer;\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport AABB, { RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport common from '../../util/common';\nimport Math from '../../common/Math';\nimport Transform from '../../common/Transform';\nimport Rot from '../../common/Rot';\nimport Vec2 from '../../common/Vec2';\nimport Settings from '../../Settings';\nimport Shape from '../Shape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A convex polygon. It is assumed that the interior of the polygon is to the\n * left of each edge. Polygons have a maximum number of vertices equal to\n * Settings.maxPolygonVertices. In most cases you should not need many vertices\n * for a convex polygon. extends Shape\n */\nexport default class PolygonShape extends Shape {\n static TYPE = 'polygon' as const;\n\n m_centroid: Vec2;\n m_vertices: Vec2[]; // [Settings.maxPolygonVertices]\n m_normals: Vec2[]; // [Settings.maxPolygonVertices]\n m_count: number;\n\n // @ts-ignore\n constructor(vertices?: Vec2[]) {\n // @ts-ignore\n if (!(this instanceof PolygonShape)) {\n return new PolygonShape(vertices);\n }\n\n super();\n\n this.m_type = PolygonShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_centroid = Vec2.zero();\n this.m_vertices = [];\n this.m_normals = [];\n this.m_count = 0;\n\n if (vertices && vertices.length) {\n this._set(vertices);\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertices: this.m_vertices,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): PolygonShape {\n const vertices = [] as Vec2[];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n\n const shape = new PolygonShape(vertices);\n return shape;\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && common.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): PolygonShape {\n const clone = new PolygonShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_count = this.m_count;\n clone.m_centroid.setVec2(this.m_centroid);\n for (let i = 0; i < this.m_count; i++) {\n clone.m_vertices.push(this.m_vertices[i].clone());\n }\n for (let i = 0; i < this.m_normals.length; i++) {\n clone.m_normals.push(this.m_normals[i].clone());\n }\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /** @internal */\n _reset(): void {\n this._set(this.m_vertices);\n }\n\n /**\n * @internal\n *\n * Create a convex hull from the given array of local points. The count must be\n * in the range [3, Settings.maxPolygonVertices].\n *\n * Warning: the points may be re-ordered, even if they form a convex polygon\n * Warning: collinear points are handled but not removed. Collinear points may\n * lead to poor stacking behavior.\n */\n _set(vertices: Vec2[]): void {\n _ASSERT && common.assert(3 <= vertices.length && vertices.length <= Settings.maxPolygonVertices);\n if (vertices.length < 3) {\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n let n = Math.min(vertices.length, Settings.maxPolygonVertices);\n\n // Perform welding and copy vertices into local buffer.\n const ps = [] as Vec2[]; // [Settings.maxPolygonVertices];\n for (let i = 0; i < n; ++i) {\n const v = vertices[i];\n\n let unique = true;\n for (let j = 0; j < ps.length; ++j) {\n if (Vec2.distanceSquared(v, ps[j]) < 0.25 * Settings.linearSlopSquared) {\n unique = false;\n break;\n }\n }\n\n if (unique) {\n ps.push(v);\n }\n }\n\n n = ps.length;\n if (n < 3) {\n // Polygon is degenerate.\n _ASSERT && common.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n // Create the convex hull using the Gift wrapping algorithm\n // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm\n\n // Find the right most point on the hull (in case of multiple points bottom most is used)\n let i0 = 0;\n let x0 = ps[0].x;\n for (let i = 1; i < n; ++i) {\n const x = ps[i].x;\n if (x > x0 || (x === x0 && ps[i].y < ps[i0].y)) {\n i0 = i;\n x0 = x;\n }\n }\n\n const hull = [] as number[]; // [Settings.maxPolygonVertices];\n let m = 0;\n let ih = i0;\n\n while (true) {\n hull[m] = ih;\n\n let ie = 0;\n for (let j = 1; j < n; ++j) {\n if (ie === ih) {\n ie = j;\n continue;\n }\n\n const r = Vec2.sub(ps[ie], ps[hull[m]]);\n const v = Vec2.sub(ps[j], ps[hull[m]]);\n const c = Vec2.crossVec2Vec2(r, v);\n // c < 0 means counter-clockwise wrapping, c > 0 means clockwise wrapping\n if (c < 0.0) {\n ie = j;\n }\n\n // Collinearity check\n if (c === 0.0 && v.lengthSquared() > r.lengthSquared()) {\n ie = j;\n }\n }\n\n ++m;\n ih = ie;\n\n if (ie === i0) {\n break;\n }\n }\n\n if (m < 3) {\n // Polygon is degenerate.\n _ASSERT && common.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n this.m_count = m;\n\n // Copy vertices.\n this.m_vertices = [];\n for (let i = 0; i < m; ++i) {\n this.m_vertices[i] = ps[hull[i]];\n }\n\n // Compute normals. Ensure the edges have non-zero length.\n for (let i = 0; i < m; ++i) {\n const i1 = i;\n const i2 = i + 1 < m ? i + 1 : 0;\n const edge = Vec2.sub(this.m_vertices[i2], this.m_vertices[i1]);\n _ASSERT && common.assert(edge.lengthSquared() > Math.EPSILON * Math.EPSILON);\n this.m_normals[i] = Vec2.crossVec2Num(edge, 1.0);\n this.m_normals[i].normalize();\n }\n\n // Compute the polygon centroid.\n this.m_centroid = ComputeCentroid(this.m_vertices, m);\n }\n\n /** @internal */\n _setAsBox(hx: number, hy: number, center?: Vec2, angle?: number): void {\n // start with right-bottom, counter-clockwise, as in Gift wrapping algorithm in PolygonShape._set()\n this.m_vertices[0] = Vec2.neo(hx, -hy);\n this.m_vertices[1] = Vec2.neo(hx, hy);\n this.m_vertices[2] = Vec2.neo(-hx, hy);\n this.m_vertices[3] = Vec2.neo(-hx, -hy);\n\n this.m_normals[0] = Vec2.neo(1.0, 0.0);\n this.m_normals[1] = Vec2.neo(0.0, 1.0);\n this.m_normals[2] = Vec2.neo(-1.0, 0.0);\n this.m_normals[3] = Vec2.neo(0.0, -1.0);\n\n this.m_count = 4;\n\n if (Vec2.isValid(center)) {\n angle = angle || 0;\n\n this.m_centroid.setVec2(center);\n\n const xf = Transform.identity();\n xf.p.setVec2(center);\n xf.q.setAngle(angle);\n\n // Transform vertices and normals.\n for (let i = 0; i < this.m_count; ++i) {\n this.m_vertices[i] = Transform.mulVec2(xf, this.m_vertices[i]);\n this.m_normals[i] = Rot.mulVec2(xf.q, this.m_normals[i]);\n }\n }\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): boolean {\n const pLocal = Rot.mulTVec2(xf.q, Vec2.sub(p, xf.p));\n\n for (let i = 0; i < this.m_count; ++i) {\n const dot = Vec2.dot(this.m_normals[i], Vec2.sub(pLocal, this.m_vertices[i]));\n if (dot > 0.0) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n\n // Put the ray into the polygon's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n let lower = 0.0;\n let upper = input.maxFraction;\n\n let index = -1;\n\n for (let i = 0; i < this.m_count; ++i) {\n // p = p1 + a * d\n // dot(normal, p - v) = 0\n // dot(normal, p1 - v) + a * dot(normal, d) = 0\n const numerator = Vec2.dot(this.m_normals[i], Vec2.sub(this.m_vertices[i], p1));\n const denominator = Vec2.dot(this.m_normals[i], d);\n\n if (denominator == 0.0) {\n if (numerator < 0.0) {\n return false;\n }\n } else {\n // Note: we want this predicate without division:\n // lower < numerator / denominator, where denominator < 0\n // Since denominator < 0, we have to flip the inequality:\n // lower < numerator / denominator <==> denominator * lower > numerator.\n if (denominator < 0.0 && numerator < lower * denominator) {\n // Increase lower.\n // The segment enters this half-space.\n lower = numerator / denominator;\n index = i;\n } else if (denominator > 0.0 && numerator < upper * denominator) {\n // Decrease upper.\n // The segment exits this half-space.\n upper = numerator / denominator;\n }\n }\n\n // The use of epsilon here causes the assert on lower to trip\n // in some cases. Apparently the use of epsilon was to make edge\n // shapes work, but now those are handled separately.\n // if (upper < lower - Math.EPSILON)\n if (upper < lower) {\n return false;\n }\n }\n\n _ASSERT && common.assert(0.0 <= lower && lower <= input.maxFraction);\n\n if (index >= 0) {\n output.fraction = lower;\n output.normal = Rot.mulVec2(xf.q, this.m_normals[index]);\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < this.m_count; ++i) {\n const v = Transform.mulVec2(xf, this.m_vertices[i]);\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, v.y);\n maxY = Math.max(maxY, v.y);\n }\n\n aabb.lowerBound.setNum(minX, minY);\n aabb.upperBound.setNum(maxX, maxY);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n // Polygon mass, centroid, and inertia.\n // Let rho be the polygon density in mass per unit area.\n // Then:\n // mass = rho * int(dA)\n // centroid.x = (1/mass) * rho * int(x * dA)\n // centroid.y = (1/mass) * rho * int(y * dA)\n // I = rho * int((x*x + y*y) * dA)\n //\n // We can compute these integrals by summing all the integrals\n // for each triangle of the polygon. To evaluate the integral\n // for a single triangle, we make a change of variables to\n // the (u,v) coordinates of the triangle:\n // x = x0 + e1x * u + e2x * v\n // y = y0 + e1y * u + e2y * v\n // where 0 <= u && 0 <= v && u + v <= 1.\n //\n // We integrate u from [0,1-v] and then v from [0,1].\n // We also need to use the Jacobian of the transformation:\n // D = cross(e1, e2)\n //\n // Simplification: triangle centroid = (1/3) * (p1 + p2 + p3)\n //\n // The rest of the derivation is handled by computer algebra.\n\n _ASSERT && common.assert(this.m_count >= 3);\n\n const center = Vec2.zero();\n let area = 0.0;\n let I = 0.0;\n\n // s is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const s = Vec2.zero();\n\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < this.m_count; ++i) {\n s.add(this.m_vertices[i]);\n }\n s.mul(1.0 / this.m_count);\n\n const k_inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < this.m_count; ++i) {\n // Triangle vertices.\n const e1 = Vec2.sub(this.m_vertices[i], s);\n const e2 = i + 1 < this.m_count ? Vec2.sub(this.m_vertices[i + 1], s) : Vec2 .sub(this.m_vertices[0], s);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n center.addCombine(triangleArea * k_inv3, e1, triangleArea * k_inv3, e2);\n\n const ex1 = e1.x;\n const ey1 = e1.y;\n const ex2 = e2.x;\n const ey2 = e2.y;\n\n const intx2 = ex1 * ex1 + ex2 * ex1 + ex2 * ex2;\n const inty2 = ey1 * ey1 + ey2 * ey1 + ey2 * ey2;\n\n I += (0.25 * k_inv3 * D) * (intx2 + inty2);\n }\n\n // Total mass\n massData.mass = density * area;\n\n // Center of mass\n _ASSERT && common.assert(area > Math.EPSILON);\n center.mul(1.0 / area);\n massData.center.setCombine(1, center, 1, s);\n\n // Inertia tensor relative to the local origin (point s).\n massData.I = density * I;\n\n // Shift to center of mass then to original body origin.\n massData.I += massData.mass * (Vec2.dot(massData.center, massData.center) - Vec2.dot(center, center));\n }\n\n /**\n * Validate convexity. This is a very time consuming operation.\n * @returns true if valid\n */\n validate(): boolean {\n for (let i = 0; i < this.m_count; ++i) {\n const i1 = i;\n const i2 = i < this.m_count - 1 ? i1 + 1 : 0;\n const p = this.m_vertices[i1];\n const e = Vec2.sub(this.m_vertices[i2], p);\n\n for (let j = 0; j < this.m_count; ++j) {\n if (j == i1 || j == i2) {\n continue;\n }\n\n const v = Vec2.sub(this.m_vertices[j], p);\n const c = Vec2.crossVec2Vec2(e, v);\n if (c < 0.0) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices = this.m_vertices;\n proxy.m_count = this.m_count;\n proxy.m_radius = this.m_radius;\n }\n}\n\nfunction ComputeCentroid(vs: Vec2[], count: number): Vec2 {\n _ASSERT && common.assert(count >= 3);\n\n const c = Vec2.zero();\n let area = 0.0;\n\n // pRef is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const pRef = Vec2.zero();\n if (false) {\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < count; ++i) {\n pRef.add(vs[i]);\n }\n pRef.mul(1.0 / count);\n }\n\n const inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < count; ++i) {\n // Triangle vertices.\n const p1 = pRef;\n const p2 = vs[i];\n const p3 = i + 1 < count ? vs[i + 1] : vs[0];\n\n const e1 = Vec2.sub(p2, p1);\n const e2 = Vec2.sub(p3, p1);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n c.addMul(triangleArea * inv3, p1);\n c.addMul(triangleArea * inv3, p2);\n c.addMul(triangleArea * inv3, p3);\n }\n\n // Centroid\n _ASSERT && common.assert(area > Math.EPSILON);\n c.mul(1.0 / area);\n return c;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type Vec2 from '../../common/Vec2';\nimport PolygonShape from './PolygonShape';\n\n/**\n * A rectangle polygon which extend PolygonShape.\n */\nexport default class BoxShape extends PolygonShape {\n static TYPE = 'polygon' as const;\n\n constructor(hx: number, hy: number, center?: Vec2, angle?: number) {\n // @ts-ignore\n if (!(this instanceof BoxShape)) {\n return new BoxShape(hx, hy, center, angle);\n }\n\n super();\n\n this._setAsBox(hx, hy, center, angle);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Math from '../../common/Math';\nimport Rot from '../../common/Rot';\nimport Vec2 from '../../common/Vec2';\nimport Shape from '../Shape';\nimport AABB, { RayCastInput, RayCastOutput } from '../AABB';\nimport Transform from '../../common/Transform';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport default class CircleShape extends Shape {\n static TYPE = 'circle' as const;\n\n m_p: Vec2;\n\n constructor(position: Vec2, radius?: number);\n constructor(radius?: number);\n // tslint:disable-next-line:typedef\n constructor(a, b?) {\n // @ts-ignore\n if (!(this instanceof CircleShape)) {\n return new CircleShape(a, b);\n }\n\n super();\n\n this.m_type = CircleShape.TYPE;\n this.m_p = Vec2.zero();\n this.m_radius = 1;\n\n if (typeof a === 'object' && Vec2.isValid(a)) {\n this.m_p.setVec2(a);\n\n if (typeof b === 'number') {\n this.m_radius = b;\n }\n\n } else if (typeof a === 'number') {\n this.m_radius = a;\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n p: this.m_p,\n radius: this.m_radius,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): CircleShape {\n return new CircleShape(data.p, data.radius);\n }\n\n // TODO: already defined in Shape\n getRadius(): number {\n return this.m_radius;\n }\n\n getCenter(): Vec2 {\n return this.m_p;\n }\n\n getVertex(index: 0): Vec2 {\n _ASSERT && common.assert(index == 0);\n return this.m_p;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): CircleShape {\n const clone = new CircleShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_p = this.m_p.clone();\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): boolean {\n const center = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const d = Vec2.sub(p, center);\n return Vec2.dot(d, d) <= this.m_radius * this.m_radius;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // Collision Detection in Interactive 3D Environments by Gino van den Bergen\n // From Section 3.1.2\n // x = s + a * r\n // norm(x) = radius\n\n const position = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const s = Vec2.sub(input.p1, position);\n const b = Vec2.dot(s, s) - this.m_radius * this.m_radius;\n\n // Solve quadratic equation.\n const r = Vec2.sub(input.p2, input.p1);\n const c = Vec2.dot(s, r);\n const rr = Vec2.dot(r, r);\n const sigma = c * c - rr * b;\n\n // Check for negative discriminant and short segment.\n if (sigma < 0.0 || rr < Math.EPSILON) {\n return false;\n }\n\n // Find the point of intersection of the line with the circle.\n let a = -(c + Math.sqrt(sigma));\n\n // Is the intersection point on the segment?\n if (0.0 <= a && a <= input.maxFraction * rr) {\n a /= rr;\n output.fraction = a;\n output.normal = Vec2.add(s, Vec2.mulNumVec2(a, r));\n output.normal.normalize();\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const p = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n aabb.lowerBound.setNum(p.x - this.m_radius, p.y - this.m_radius);\n aabb.upperBound.setNum(p.x + this.m_radius, p.y + this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n massData.mass = density * Math.PI * this.m_radius * this.m_radius;\n massData.center = this.m_p;\n // inertia about the local origin\n massData.I = massData.mass\n * (0.5 * this.m_radius * this.m_radius + Vec2.dot(this.m_p, this.m_p));\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_p);\n proxy.m_count = 1;\n proxy.m_radius = this.m_radius;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. A value of 0 disables softness.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * Distance length.\n */\n length?: number;\n}\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointDef extends JointDef, DistanceJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0\n};\n\n/**\n * A distance joint constrains two points on two bodies to remain at a fixed\n * distance from each other. You can view this as a massless, rigid rod.\n *\n * @param anchorA Anchor A in global coordination.\n * @param anchorB Anchor B in global coordination.\n */\nexport default class DistanceJoint extends Joint {\n static TYPE = 'distance-joint' as const;\n\n // Solver shared\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_length: number;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_gamma: number;\n /** @internal */ m_bias: number;\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: DistanceJointDef);\n constructor(def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2);\n constructor(def: DistanceJointDef, bodyA?: Body, bodyB?: Body, anchorA?: Vec2, anchorB?: Vec2) {\n // @ts-ignore\n if (!(this instanceof DistanceJoint)) {\n return new DistanceJoint(def, bodyA, bodyB, anchorA, anchorB);\n }\n\n // order of constructor arguments is changed in v0.2\n if (bodyB && anchorA && ('m_type' in anchorA) && ('x' in bodyB) && ('y' in bodyB)) {\n const temp = bodyB;\n bodyB = anchorA;\n anchorA = temp;\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = DistanceJoint.TYPE;\n\n // Solver shared\n this.m_localAnchorA = Vec2.clone(anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.zero());\n this.m_length = Math.isFinite(def.length) ? def.length :\n Vec2.distance(bodyA.getWorldPoint(this.m_localAnchorA), bodyB.getWorldPoint(this.m_localAnchorB));\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n this.m_impulse = 0.0;\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n\n // 1-D constrained system\n // m (v2 - v1) = lambda\n // v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass.\n // x2 = x1 + h * v2\n\n // 1-D mass-damper-spring system\n // m (v2 - v1) + h * d * v2 + h * k *\n\n // C = norm(p2 - p1) - L\n // u = (p2 - p1) / norm(p2 - p1)\n // Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1))\n // J = [-u -cross(r1, u) u cross(r2, u)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n length: this.m_length,\n\n impulse: this.m_impulse,\n gamma: this.m_gamma,\n bias: this.m_bias,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): DistanceJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new DistanceJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n length?: number,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.length > 0) {\n this.m_length = +def.length;\n } else if (def.length < 0) { // don't change length\n } else if (def.anchorA || def.anchorA || def.anchorA || def.anchorA) {\n this.m_length = Vec2.distance(\n this.m_bodyA.getWorldPoint(this.m_localAnchorA),\n this.m_bodyB.getWorldPoint(this.m_localAnchorB)\n );\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the natural length. Manipulating the length can lead to non-physical\n * behavior when the frequency is zero.\n */\n setLength(length: number): void {\n this.m_length = length;\n }\n\n /**\n * Get the natural length.\n */\n getLength(): number {\n return this.m_length;\n }\n\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n this.m_u = Vec2.sub(Vec2.add(cB, this.m_rB), Vec2.add(cA, this.m_rA));\n\n // Handle singularity.\n const length = this.m_u.length();\n if (length > Settings.linearSlop) {\n this.m_u.mul(1.0 / length);\n } else {\n this.m_u.setNum(0.0, 0.0);\n }\n\n const crAu = Vec2.crossVec2Vec2(this.m_rA, this.m_u);\n const crBu = Vec2.crossVec2Vec2(this.m_rB, this.m_u);\n let invMass = this.m_invMassA + this.m_invIA * crAu * crAu + this.m_invMassB\n + this.m_invIB * crBu * crBu;\n\n // Compute the effective mass matrix.\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (this.m_frequencyHz > 0.0) {\n const C = length - this.m_length;\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * this.m_mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = this.m_mass * omega * omega;\n\n // magic formulas\n const h = step.dt;\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invMass += this.m_gamma;\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n } else {\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n const Cdot = Vec2.dot(this.m_u, vpB) - Vec2.dot(this.m_u, vpA);\n\n const impulse = -this.m_mass\n * (Cdot + this.m_bias + this.m_gamma * this.m_impulse);\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u);\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n if (this.m_frequencyHz > 0.0) {\n // There is no position correction for soft distance constraints.\n return true;\n }\n\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA));\n\n const length = u.normalize();\n let C = length - this.m_length;\n C = Math\n .clamp(C, -Settings.maxLinearCorrection, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C;\n const P = Vec2.mulNumVec2(impulse, u);\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Mat22 from '../../common/Mat22';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointOpt extends JointOpt {\n /**\n * The maximum friction force in N.\n */\n maxForce?: number;\n /**\n * The maximum friction torque in N-m.\n */\n maxTorque?: number;\n}\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointDef extends JointDef, FrictionJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n maxTorque : 0.0,\n};\n\n/**\n * Friction joint. This is used for top-down friction. It provides 2D\n * translational friction and angular friction.\n *\n * @param anchor Anchor in global coordination.\n */\nexport default class FrictionJoint extends Joint {\n static TYPE = 'friction-joint' as const;\n\n /** @internal */ m_type: 'friction-joint';\n\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n // Solver shared\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: FrictionJointDef);\n constructor(def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: FrictionJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (!(this instanceof FrictionJoint)) {\n return new FrictionJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = FrictionJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n\n // Solver shared\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): FrictionJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new FrictionJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && common.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && common.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y\n * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x\n * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt; // float\n\n // Solve angular friction\n {\n const Cdot = wB - wA; // float\n let impulse = -this.m_angularMass * Cdot; // float\n\n const oldImpulse = this.m_angularImpulse; // float\n const maxImpulse = h * this.m_maxTorque; // float\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)), Vec2.add(vA,\n Vec2.crossNumVec2(wA, this.m_rA))); // Vec2\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); // Vec2\n const oldImpulse = this.m_linearImpulse; // Vec2\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce; // float\n\n if (this.m_linearImpulse.lengthSquared() > maxImpulse * maxImpulse) {\n this.m_linearImpulse.normalize();\n this.m_linearImpulse.mul(maxImpulse);\n }\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from './Vec2';\nimport Vec3 from './Vec3';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 3-by-3 matrix. Stored in column-major order.\n */\nexport default class Mat33 {\n ex: Vec3;\n ey: Vec3;\n ez: Vec3;\n\n constructor(a: Vec3, b: Vec3, c: Vec3);\n constructor();\n constructor(a?: Vec3, b?: Vec3, c?: Vec3) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec3.clone(a);\n this.ey = Vec3.clone(b);\n this.ez = Vec3.clone(c);\n } else {\n this.ex = Vec3.zero();\n this.ey = Vec3.zero();\n this.ez = Vec3.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec3.isValid(obj.ex) && Vec3.isValid(obj.ey) && Vec3.isValid(obj.ez);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Mat33.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Mat33!');\n }\n }\n\n /**\n * Set this matrix to all zeros.\n */\n setZero(): Mat33 {\n this.ex.setZero();\n this.ey.setZero();\n this.ez.setZero();\n return this;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve33(v: Vec3): Vec3 {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = new Vec3();\n r.x = det * Vec3.dot(v, Vec3.cross(this.ey, this.ez));\n r.y = det * Vec3.dot(this.ex, Vec3.cross(v, this.ez));\n r.z = det * Vec3.dot(this.ex, Vec3.cross(this.ey, v));\n return r;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix\n * equation.\n */\n solve22(v: Vec2): Vec2 {\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a21 = this.ex.y;\n const a22 = this.ey.y;\n let det = a11 * a22 - a12 * a21;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = Vec2.zero();\n r.x = det * (a22 * v.x - a12 * v.y);\n r.y = det * (a11 * v.y - a21 * v.x);\n return r;\n }\n\n /**\n * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if\n * singular.\n */\n getInverse22(M: Mat33): void {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n M.ex.x = det * d;\n M.ey.x = -det * b;\n M.ex.z = 0.0;\n M.ex.y = -det * c;\n M.ey.y = det * a;\n M.ey.z = 0.0;\n M.ez.x = 0.0;\n M.ez.y = 0.0;\n M.ez.z = 0.0;\n }\n\n /**\n * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix\n * if singular.\n */\n getSymInverse33(M: Mat33): void {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a13 = this.ez.x;\n const a22 = this.ey.y;\n const a23 = this.ez.y;\n const a33 = this.ez.z;\n\n M.ex.x = det * (a22 * a33 - a23 * a23);\n M.ex.y = det * (a13 * a23 - a12 * a33);\n M.ex.z = det * (a12 * a23 - a13 * a22);\n\n M.ey.x = M.ex.y;\n M.ey.y = det * (a11 * a33 - a13 * a13);\n M.ey.z = det * (a13 * a12 - a11 * a23);\n\n M.ez.x = M.ex.z;\n M.ez.y = M.ey.z;\n M.ez.z = det * (a11 * a22 - a12 * a12);\n }\n\n /**\n * Multiply a matrix times a vector.\n */\n static mul(a: Mat33, b: Vec2): Vec2;\n static mul(a: Mat33, b: Vec3): Vec3;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n _ASSERT && Mat33.assert(a);\n if (b && 'z' in b && 'y' in b && 'x' in b) {\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n\n } else if (b && 'y' in b && 'x' in b) {\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n _ASSERT && common.assert(false);\n }\n\n static mulVec3(a: Mat33, b: Vec3): Vec3 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n }\n\n static mulVec2(a: Mat33, b: Vec2): Vec2 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n static add(a: Mat33, b: Mat33): Mat33 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Mat33.assert(b);\n return new Mat33(\n Vec3.add(a.ex, b.ex),\n Vec3.add(a.ey, b.ey),\n Vec3.add(a.ez, b.ez)\n );\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Vec3 from '../../common/Vec3';\nimport Mat22 from '../../common/Mat22';\nimport Mat33 from '../../common/Mat33';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointOpt extends JointOpt {\n /**\n * The lower angle for the joint limit (radians).\n */\n lowerAngle?: number;\n /**\n * The upper angle for the joint limit (radians).\n */\n upperAngle?: number;\n /**\n * The maximum motor torque used to achieve the desired motor speed. Usually\n * in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed. Usually in radians per second.\n */\n motorSpeed?: number;\n /**\n * A flag to enable joint limits.\n */\n enableLimit?: boolean;\n /**\n * A flag to enable the joint motor.\n */\n enableMotor?: boolean;\n}\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointDef extends JointDef, RevoluteJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n lowerAngle : 0.0,\n upperAngle : 0.0,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n enableLimit : false,\n enableMotor : false\n};\n\n/**\n * A revolute joint constrains two bodies to share a common point while they are\n * free to rotate about the point. The relative rotation about the shared point\n * is the joint angle. You can limit the relative rotation with a joint limit\n * that specifies a lower and upper angle. You can use a motor to drive the\n * relative rotation about the shared point. A maximum motor torque is provided\n * so that infinite forces are not generated.\n */\nexport default class RevoluteJoint extends Joint {\n static TYPE = 'revolute-joint' as const;\n\n /** @internal */ m_type: 'revolute-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerAngle: number;\n /** @internal */ m_upperAngle: number;\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n // effective mass for point-to-point constraint.\n /** @internal */ m_mass: Mat33 = new Mat33();\n // effective mass for motor/limit angular constraint.\n /** @internal */ m_motorMass: number;\n /** @internal */ m_limitState: number = inactiveLimit; // TODO enum\n\n constructor(def: RevoluteJointDef);\n constructor(def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n // @ts-ignore\n constructor(def: RevoluteJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (!(this instanceof RevoluteJoint)) {\n return new RevoluteJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RevoluteJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorImpulse = 0.0;\n\n this.m_lowerAngle = def.lowerAngle;\n this.m_upperAngle = def.upperAngle;\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Motor constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerAngle: this.m_lowerAngle,\n upperAngle: this.m_upperAngle,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any):RevoluteJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RevoluteJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle in radians.\n */\n getJointAngle(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle speed in radians per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_angularVelocity - bA.m_angularVelocity;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Get the current motor torque given the inverse time step. Unit is N*m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set the motor speed in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set the maximum motor torque, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit in radians.\n */\n getLowerLimit(): number {\n return this.m_lowerAngle;\n }\n\n /**\n * Get the upper joint limit in radians.\n */\n getUpperLimit(): number {\n return this.m_upperAngle;\n }\n\n /**\n * Set the joint limits in radians.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && common.assert(lower <= upper);\n\n if (lower != this.m_lowerAngle || upper != this.m_upperAngle) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_impulse.z = 0.0;\n this.m_lowerAngle = lower;\n this.m_upperAngle = upper;\n }\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force given the inverse time step. Unit is N.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque due to the joint limit given the inverse time step.\n * Unit is N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n this.m_mass.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y\n * this.m_rB.y * iB;\n this.m_mass.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y\n * this.m_rB.x * iB;\n this.m_mass.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n this.m_mass.ex.y = this.m_mass.ey.x;\n this.m_mass.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x\n * this.m_rB.x * iB;\n this.m_mass.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n this.m_mass.ex.z = this.m_mass.ez.x;\n this.m_mass.ey.z = this.m_mass.ez.y;\n this.m_mass.ez.z = iA + iB;\n\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n\n if (this.m_enableMotor == false || fixedRotation) {\n this.m_motorImpulse = 0.0;\n }\n\n if (this.m_enableLimit && fixedRotation == false) {\n const jointAngle = aB - aA - this.m_referenceAngle; // float\n\n if (Math.abs(this.m_upperAngle - this.m_lowerAngle) < 2.0 * Settings.angularSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointAngle <= this.m_lowerAngle) {\n if (this.m_limitState != atLowerLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atLowerLimit;\n\n } else if (jointAngle >= this.m_upperAngle) {\n if (this.m_limitState != atUpperLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atUpperLimit;\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_motorImpulse + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_motorImpulse + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n // Solve motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits\n && fixedRotation == false) {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const impulse = Vec3.neg(this.m_mass.solve33(Cdot)); // Vec3\n\n if (this.m_limitState == equalLimits) {\n this.m_impulse.add(impulse);\n\n } else if (this.m_limitState == atLowerLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse < 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n\n } else if (this.m_limitState == atUpperLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse > 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n\n } else {\n // Solve point-to-point constraint\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const impulse = this.m_mass.solve22(Vec2.neg(Cdot)); // Vec2\n\n this.m_impulse.x += impulse.x;\n this.m_impulse.y += impulse.y;\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n let angularError = 0.0; // float\n let positionError = 0.0; // float\n\n const fixedRotation = (this.m_invIA + this.m_invIB == 0.0); // bool\n\n // Solve angular limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const angle = aB - aA - this.m_referenceAngle; // float\n let limitImpulse = 0.0; // float\n\n if (this.m_limitState == equalLimits) {\n // Prevent large angular corrections\n const C = Math.clamp(angle - this.m_lowerAngle,\n -Settings.maxAngularCorrection, Settings.maxAngularCorrection); // float\n limitImpulse = -this.m_motorMass * C;\n angularError = Math.abs(C);\n\n } else if (this.m_limitState == atLowerLimit) {\n let C = angle - this.m_lowerAngle; // float\n angularError = -C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C + Settings.angularSlop, -Settings.maxAngularCorrection,\n 0.0);\n limitImpulse = -this.m_motorMass * C;\n\n } else if (this.m_limitState == atUpperLimit) {\n let C = angle - this.m_upperAngle; // float\n angularError = C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C - Settings.angularSlop, 0.0,\n Settings.maxAngularCorrection);\n limitImpulse = -this.m_motorMass * C;\n }\n\n aA -= this.m_invIA * limitImpulse;\n aB += this.m_invIB * limitImpulse;\n }\n\n // Solve point-to-point constraint.\n {\n qA.setAngle(aA);\n qB.setAngle(aB);\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n\n const C = Vec2.zero();\n C.addCombine(1, cB, 1, rB);\n C.subCombine(1, cA, 1, rA);\n positionError = C.length();\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y;\n K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x;\n\n const impulse = Vec2.neg(K.solve(C)); // Vec2\n\n cA.subMul(mA, impulse);\n aA -= iA * Vec2.crossVec2Vec2(rA, impulse);\n\n cB.addMul(mB, impulse);\n aB += iB * Vec2.crossVec2Vec2(rB, impulse);\n }\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Vec3 from '../../common/Vec3';\nimport Mat22 from '../../common/Mat22';\nimport Mat33 from '../../common/Mat33';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointOpt extends JointOpt {\n /**\n * Enable/disable the joint limit.\n */\n enableLimit?: boolean;\n /**\n * The lower translation limit, usually in meters.\n */\n lowerTranslation?: number;\n /**\n * The upper translation limit, usually in meters.\n */\n upperTranslation?: number;\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorForce?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n}\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointDef extends JointDef, PrismaticJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation unit axis in bodyA.\n */\n localAxisA: Vec2;\n /**\n * referenceAngle The constrained angle between the bodies:\n * bodyB_angle - bodyA_angle.\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n enableLimit : false,\n lowerTranslation : 0.0,\n upperTranslation : 0.0,\n enableMotor : false,\n maxMotorForce : 0.0,\n motorSpeed : 0.0\n};\n\n/**\n * A prismatic joint. This joint provides one degree of freedom: translation\n * along an axis fixed in bodyA. Relative rotation is prevented. You can use a\n * joint limit to restrict the range of motion and a joint motor to drive the\n * motion or to model joint friction.\n */\nexport default class PrismaticJoint extends Joint {\n static TYPE = 'prismatic-joint' as const;\n\n /** @internal */ m_type: 'prismatic-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerTranslation: number;\n /** @internal */ m_upperTranslation: number;\n /** @internal */ m_maxMotorForce: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n /** @internal */ m_limitState: number; // TODO enum\n /** @internal */ m_axis: Vec2;\n /** @internal */ m_perp: Vec2;\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_s1: number;\n /** @internal */ m_s2: number;\n /** @internal */ m_a1: number;\n /** @internal */ m_a2: number;\n /** @internal */ m_K: Mat33;\n\n constructor(def: PrismaticJointDef);\n constructor(def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n constructor(def: PrismaticJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (!(this instanceof PrismaticJoint)) {\n return new PrismaticJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PrismaticJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || Vec2.neo(1.0, 0.0));\n this.m_localXAxisA.normalize();\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n\n this.m_lowerTranslation = def.lowerTranslation;\n this.m_upperTranslation = def.upperTranslation;\n this.m_maxMotorForce = def.maxMotorForce;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n this.m_limitState = inactiveLimit;\n\n this.m_axis = Vec2.zero();\n this.m_perp = Vec2.zero();\n\n this.m_K = new Mat33();\n\n // Linear constraint (point-to-line)\n // d = p2 - p1 = x2 + r2 - x1 - r1\n // C = dot(perp, d)\n // Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 -\n // cross(w1, r1))\n // = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) +\n // dot(cross(r2, perp), v2)\n // J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)]\n //\n // Angular constraint\n // C = a2 - a1 + a_initial\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n //\n // K = J * invM * JT\n //\n // J = [-a -s1 a s2]\n // [0 -1 0 1]\n // a = perp\n // s1 = cross(d + r1, a) = cross(p2 - x1, a)\n // s2 = cross(r2, a) = cross(p2 - x2, a)\n\n // Motor/Limit linear constraint\n // C = dot(ax1, d)\n // Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) +\n // dot(cross(r2, ax1), v2)\n // J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)]\n\n // Block Solver\n // We develop a block solver that includes the joint limit. This makes the\n // limit stiff (inelastic) even\n // when the mass has poor distribution (leading to large torques about the\n // joint anchor points).\n //\n // The Jacobian has 3 rows:\n // J = [-uT -s1 uT s2] // linear\n // [0 -1 0 1] // angular\n // [-vT -a1 vT a2] // limit\n //\n // u = perp\n // v = axis\n // s1 = cross(d + r1, u), s2 = cross(r2, u)\n // a1 = cross(d + r1, v), a2 = cross(r2, v)\n\n // M * (v2 - v1) = JT * df\n // J * v2 = bias\n //\n // v2 = v1 + invM * JT * df\n // J * (v1 + invM * JT * df) = bias\n // K * df = bias - J * v1 = -Cdot\n // K = J * invM * JT\n // Cdot = J * v1 - bias\n //\n // Now solve for f2.\n // df = f2 - f1\n // K * (f2 - f1) = -Cdot\n // f2 = invK * (-Cdot) + f1\n //\n // Clamp accumulated limit impulse.\n // lower: f2(3) = max(f2(3), 0)\n // upper: f2(3) = min(f2(3), 0)\n //\n // Solve for correct f2(1:2)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1\n // = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) +\n // K(1:2,1:2) * f1(1:2)\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n //\n // Now compute impulse to be applied:\n // df = f2 - f1\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerTranslation: this.m_lowerTranslation,\n upperTranslation: this.m_upperTranslation,\n maxMotorForce: this.m_maxMotorForce,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PrismaticJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.localAxisA = Vec2.clone(data.localAxisA);\n const joint = new PrismaticJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const pA = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const pB = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const d = Vec2.sub(pB, pA);\n const axis = this.m_bodyA.getWorldVector(this.m_localXAxisA);\n\n const translation = Vec2.dot(d, axis);\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const rA = Rot.mulVec2(bA.m_xf.q, Vec2.sub(this.m_localAnchorA, bA.m_sweep.localCenter)); // Vec2\n const rB = Rot.mulVec2(bB.m_xf.q, Vec2.sub(this.m_localAnchorB, bB.m_sweep.localCenter)); // Vec2\n const p1 = Vec2.add(bA.m_sweep.c, rA); // Vec2\n const p2 = Vec2.add(bB.m_sweep.c, rB); // Vec2\n const d = Vec2.sub(p2, p1); // Vec2\n const axis = Rot.mulVec2(bA.m_xf.q, this.m_localXAxisA); // Vec2\n\n const vA = bA.m_linearVelocity; // Vec2\n const vB = bB.m_linearVelocity; // Vec2\n const wA = bA.m_angularVelocity; // float\n const wB = bB.m_angularVelocity; // float\n\n const speed = Vec2.dot(d, Vec2.crossNumVec2(wA, axis))\n + Vec2.dot(axis, Vec2.sub(Vec2.addCrossNumVec2(vB, wB, rB), Vec2.addCrossNumVec2(vA, wA, rA))); // float\n return speed;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit, usually in meters.\n */\n getLowerLimit(): number {\n return this.m_lowerTranslation;\n }\n\n /**\n * Get the upper joint limit, usually in meters.\n */\n getUpperLimit(): number {\n return this.m_upperTranslation;\n }\n\n /**\n * Set the joint limits, usually in meters.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && common.assert(lower <= upper);\n if (lower != this.m_lowerTranslation || upper != this.m_upperTranslation) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_lowerTranslation = lower;\n this.m_upperTranslation = upper;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in meters per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Set the maximum motor force, usually in N.\n */\n setMaxMotorForce(force: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorForce = force;\n }\n\n getMaxMotorForce(): number {\n return this.m_maxMotorForce;\n }\n\n /**\n * Get the motor speed, usually in meters per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Get the current motor force given the inverse time step, usually in N.\n */\n getMotorForce(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + this.m_impulse.z, this.m_axis).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.y;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute motor Jacobian and effective mass.\n {\n this.m_axis = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_axis);\n this.m_a2 = Vec2.crossVec2Vec2(rB, this.m_axis);\n\n this.m_motorMass = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2\n * this.m_a2;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n }\n\n // Prismatic constraint.\n {\n this.m_perp = Rot.mulVec2(qA, this.m_localYAxisA);\n\n this.m_s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_perp);\n this.m_s2 = Vec2.crossVec2Vec2(rB, this.m_perp);\n\n const s1test = Vec2.crossVec2Vec2(rA, this.m_perp);\n\n const k11 = mA + mB + iA * this.m_s1 * this.m_s1 + iB * this.m_s2 * this.m_s2;\n const k12 = iA * this.m_s1 + iB * this.m_s2;\n const k13 = iA * this.m_s1 * this.m_a1 + iB * this.m_s2 * this.m_a2;\n let k22 = iA + iB;\n if (k22 == 0.0) {\n // For bodies with fixed rotation.\n k22 = 1.0;\n }\n const k23 = iA * this.m_a1 + iB * this.m_a2;\n const k33 = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 * this.m_a2;\n\n this.m_K.ex.set(k11, k12, k13);\n this.m_K.ey.set(k12, k22, k23);\n this.m_K.ez.set(k13, k23, k33);\n }\n\n // Compute motor and limit terms.\n if (this.m_enableLimit) {\n\n const jointTranslation = Vec2.dot(this.m_axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * Settings.linearSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointTranslation <= this.m_lowerTranslation) {\n if (this.m_limitState != atLowerLimit) {\n this.m_limitState = atLowerLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else if (jointTranslation >= this.m_upperTranslation) {\n if (this.m_limitState != atUpperLimit) {\n this.m_limitState = atUpperLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n if (this.m_enableMotor == false) {\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse\n + this.m_impulse.z, this.m_axis);\n const LA = this.m_impulse.x * this.m_s1 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1;\n const LB = this.m_impulse.x * this.m_s2 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Solve linear motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits) {\n const Cdot = Vec2.dot(this.m_axis, Vec2.sub(vB, vA)) + this.m_a2 * wB\n - this.m_a1 * wA;\n let impulse = this.m_motorMass * (this.m_motorSpeed - Cdot);\n const oldImpulse = this.m_motorImpulse;\n const maxImpulse = step.dt * this.m_maxMotorForce;\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_axis);\n const LA = impulse * this.m_a1;\n const LB = impulse * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n const Cdot1 = Vec2.zero();\n Cdot1.x += Vec2.dot(this.m_perp, vB) + this.m_s2 * wB;\n Cdot1.x -= Vec2.dot(this.m_perp, vA) + this.m_s1 * wA;\n Cdot1.y = wB - wA;\n\n if (this.m_enableLimit && this.m_limitState != inactiveLimit) {\n // Solve prismatic and limit constraint in block form.\n let Cdot2 = 0;\n Cdot2 += Vec2.dot(this.m_axis, vB) + this.m_a2 * wB;\n Cdot2 -= Vec2.dot(this.m_axis, vA) + this.m_a1 * wA;\n\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const f1 = Vec3.clone(this.m_impulse);\n let df = this.m_K.solve33(Vec3.neg(Cdot)); // Vec3\n this.m_impulse.add(df);\n\n if (this.m_limitState == atLowerLimit) {\n this.m_impulse.z = Math.max(this.m_impulse.z, 0.0);\n } else if (this.m_limitState == atUpperLimit) {\n this.m_impulse.z = Math.min(this.m_impulse.z, 0.0);\n }\n\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n const b = Vec2.combine(-1, Cdot1, -(this.m_impulse.z - f1.z), Vec2.neo(this.m_K.ez.x, this.m_K.ez.y)); // Vec2\n const f2r = Vec2.add(this.m_K.solve22(b), Vec2.neo(f1.x, f1.y)); // Vec2\n this.m_impulse.x = f2r.x;\n this.m_impulse.y = f2r.y;\n\n df = Vec3.sub(this.m_impulse, f1);\n\n const P = Vec2.combine(df.x, this.m_perp, df.z, this.m_axis); // Vec2\n const LA = df.x * this.m_s1 + df.y + df.z * this.m_a1; // float\n const LB = df.x * this.m_s2 + df.y + df.z * this.m_a2; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n // Limit is inactive, just solve the prismatic constraint in block form.\n const df = this.m_K.solve22(Vec2.neg(Cdot1)); // Vec2\n this.m_impulse.x += df.x;\n this.m_impulse.y += df.y;\n\n const P = Vec2.mulNumVec2(df.x, this.m_perp); // Vec2\n const LA = df.x * this.m_s1 + df.y; // float\n const LB = df.x * this.m_s2 + df.y; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute fresh Jacobians\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n const d = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); // Vec2\n\n const axis = Rot.mulVec2(qA, this.m_localXAxisA); // Vec2\n const a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), axis); // float\n const a2 = Vec2.crossVec2Vec2(rB, axis); // float\n const perp = Rot.mulVec2(qA, this.m_localYAxisA); // Vec2\n\n const s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), perp); // float\n const s2 = Vec2.crossVec2Vec2(rB, perp); // float\n\n let impulse = new Vec3();\n const C1 = Vec2.zero(); // Vec2\n C1.x = Vec2.dot(perp, d);\n C1.y = aB - aA - this.m_referenceAngle;\n\n let linearError = Math.abs(C1.x); // float\n const angularError = Math.abs(C1.y); // float\n\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n let active = false; // bool\n let C2 = 0.0; // float\n if (this.m_enableLimit) {\n\n const translation = Vec2.dot(axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * linearSlop) {\n // Prevent large angular corrections\n C2 = Math.clamp(translation, -maxLinearCorrection, maxLinearCorrection);\n linearError = Math.max(linearError, Math.abs(translation));\n active = true;\n\n } else if (translation <= this.m_lowerTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_lowerTranslation + linearSlop,\n -maxLinearCorrection, 0.0);\n linearError = Math\n .max(linearError, this.m_lowerTranslation - translation);\n active = true;\n\n } else if (translation >= this.m_upperTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_upperTranslation - linearSlop, 0.0,\n maxLinearCorrection);\n linearError = Math\n .max(linearError, translation - this.m_upperTranslation);\n active = true;\n }\n }\n\n if (active) {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n const k13 = iA * s1 * a1 + iB * s2 * a2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n // For fixed rotation\n k22 = 1.0;\n }\n const k23 = iA * a1 + iB * a2; // float\n const k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; // float\n\n const K = new Mat33();\n K.ex.set(k11, k12, k13);\n K.ey.set(k12, k22, k23);\n K.ez.set(k13, k23, k33);\n\n const C = new Vec3();\n C.x = C1.x;\n C.y = C1.y;\n C.z = C2;\n\n impulse = K.solve33(Vec3.neg(C));\n } else {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n k22 = 1.0;\n }\n\n const K = new Mat22();\n K.ex.setNum(k11, k12);\n K.ey.setNum(k12, k22);\n\n const impulse1 = K.solve(Vec2.neg(C1)); // Vec2\n impulse.x = impulse1.x;\n impulse.y = impulse1.y;\n impulse.z = 0.0;\n }\n\n const P = Vec2.combine(impulse.x, perp, impulse.z, axis); // Vec2\n const LA = impulse.x * s1 + impulse.y + impulse.z * a1; // float\n const LB = impulse.x * s2 + impulse.y + impulse.z * a2; // float\n\n cA.subMul(mA, P);\n aA -= iA * LA;\n cB.addMul(mB, P);\n aB += iB * LB;\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport RevoluteJoint from './RevoluteJoint';\nimport PrismaticJoint from './PrismaticJoint';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Gear joint definition.\n */\nexport interface GearJointOpt extends JointOpt {\n /**\n * The gear ratio. See {@link GearJoint} for explanation.\n */\n ratio?: number;\n}\n/**\n * Gear joint definition.\n */\nexport interface GearJointDef extends JointDef, GearJointOpt {\n /**\n * The first revolute/prismatic joint attached to the gear joint.\n */\n joint1: RevoluteJoint | PrismaticJoint;\n /**\n * The second prismatic/revolute joint attached to the gear joint.\n */\n joint2: RevoluteJoint | PrismaticJoint;\n}\n\nconst DEFAULTS = {\n ratio : 1.0\n};\n\n/**\n * A gear joint is used to connect two joints together. Either joint can be a\n * revolute or prismatic joint. You specify a gear ratio to bind the motions\n * together: coordinate1 + ratio * coordinate2 = constant\n *\n * The ratio can be negative or positive. If one joint is a revolute joint and\n * the other joint is a prismatic joint, then the ratio will have units of\n * length or units of 1/length. Warning: You have to manually destroy the gear\n * joint if joint1 or joint2 is destroyed.\n *\n * This definition requires two existing revolute or prismatic joints (any\n * combination will work).\n */\nexport default class GearJoint extends Joint {\n static TYPE = 'gear-joint' as const;\n\n /** @internal */ m_type: 'gear-joint';\n /** @internal */ m_joint1: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_joint2: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_type1: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_type2: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_bodyC: Body;\n /** @internal */ m_localAnchorC: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_referenceAngleA: number;\n /** @internal */ m_localAxisC: Vec2;\n /** @internal */ m_bodyD: Body;\n /** @internal */ m_localAnchorD: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngleB: number;\n /** @internal */ m_localAxisD: Vec2;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_lcA: Vec2;\n /** @internal */ m_lcB: Vec2;\n /** @internal */ m_lcC: Vec2;\n /** @internal */ m_lcD: Vec2;\n /** @internal */ m_mA: number;\n /** @internal */ m_mB: number;\n /** @internal */ m_mC: number;\n /** @internal */ m_mD: number;\n /** @internal */ m_iA: number;\n /** @internal */ m_iB: number;\n /** @internal */ m_iC: number;\n /** @internal */ m_iD: number;\n /** @internal */ m_JvAC: Vec2;\n /** @internal */ m_JvBD: Vec2;\n /** @internal */ m_JwA: number;\n /** @internal */ m_JwB: number;\n /** @internal */ m_JwC: number;\n /** @internal */ m_JwD: number;\n /** @internal */ m_mass: number;\n\n constructor(def: GearJointDef);\n constructor(def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number);\n constructor(def: GearJointDef, bodyA?: Body, bodyB?: Body, joint1?: RevoluteJoint | PrismaticJoint, joint2?: RevoluteJoint | PrismaticJoint, ratio?: number) {\n // @ts-ignore\n if (!(this instanceof GearJoint)) {\n return new GearJoint(def, bodyA, bodyB, joint1, joint2, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = GearJoint.TYPE;\n\n _ASSERT && common.assert(joint1.m_type === RevoluteJoint.TYPE\n || joint1.m_type === PrismaticJoint.TYPE);\n _ASSERT && common.assert(joint2.m_type === RevoluteJoint.TYPE\n || joint2.m_type === PrismaticJoint.TYPE);\n\n this.m_joint1 = joint1 ? joint1 : def.joint1;\n this.m_joint2 = joint2 ? joint2 : def.joint2;\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n this.m_type1 = this.m_joint1.getType() as 'revolute-joint' | 'prismatic-joint';\n this.m_type2 = this.m_joint2.getType() as 'revolute-joint' | 'prismatic-joint';\n\n // joint1 connects body A to body C\n // joint2 connects body B to body D\n\n let coordinateA: number;\n let coordinateB: number;\n\n // TODO_ERIN there might be some problem with the joint edges in Joint.\n\n this.m_bodyC = this.m_joint1.getBodyA();\n this.m_bodyA = this.m_joint1.getBodyB();\n\n // Get geometry of joint1\n const xfA = this.m_bodyA.m_xf;\n const aA = this.m_bodyA.m_sweep.a;\n const xfC = this.m_bodyC.m_xf;\n const aC = this.m_bodyC.m_sweep.a;\n\n if (this.m_type1 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint1 as RevoluteJoint;\n this.m_localAnchorC = revolute.m_localAnchorA;\n this.m_localAnchorA = revolute.m_localAnchorB;\n this.m_referenceAngleA = revolute.m_referenceAngle;\n this.m_localAxisC = Vec2.zero();\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const prismatic = this.m_joint1 as PrismaticJoint;\n this.m_localAnchorC = prismatic.m_localAnchorA;\n this.m_localAnchorA = prismatic.m_localAnchorB;\n this.m_referenceAngleA = prismatic.m_referenceAngle;\n this.m_localAxisC = prismatic.m_localXAxisA;\n\n const pC = this.m_localAnchorC;\n const pA = Rot.mulTVec2(xfC.q, Vec2.add(Rot.mulVec2(xfA.q, this.m_localAnchorA), Vec2.sub(xfA.p, xfC.p)));\n coordinateA = Vec2.dot(pA, this.m_localAxisC) - Vec2.dot(pC, this.m_localAxisC);\n }\n\n this.m_bodyD = this.m_joint2.getBodyA();\n this.m_bodyB = this.m_joint2.getBodyB();\n\n // Get geometry of joint2\n const xfB = this.m_bodyB.m_xf;\n const aB = this.m_bodyB.m_sweep.a;\n const xfD = this.m_bodyD.m_xf;\n const aD = this.m_bodyD.m_sweep.a;\n\n if (this.m_type2 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint2 as RevoluteJoint;\n this.m_localAnchorD = revolute.m_localAnchorA;\n this.m_localAnchorB = revolute.m_localAnchorB;\n this.m_referenceAngleB = revolute.m_referenceAngle;\n this.m_localAxisD = Vec2.zero();\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const prismatic = this.m_joint2 as PrismaticJoint;\n this.m_localAnchorD = prismatic.m_localAnchorA;\n this.m_localAnchorB = prismatic.m_localAnchorB;\n this.m_referenceAngleB = prismatic.m_referenceAngle;\n this.m_localAxisD = prismatic.m_localXAxisA;\n\n const pD = this.m_localAnchorD;\n const pB = Rot.mulTVec2(xfD.q, Vec2.add(Rot.mulVec2(xfB.q, this.m_localAnchorB), Vec2.sub(xfB.p, xfD.p)));\n coordinateB = Vec2.dot(pB, this.m_localAxisD) - Vec2.dot(pD, this.m_localAxisD);\n }\n\n this.m_constant = coordinateA + this.m_ratio * coordinateB;\n\n this.m_impulse = 0.0;\n\n // Gear Joint:\n // C0 = (coordinate1 + ratio * coordinate2)_initial\n // C = (coordinate1 + ratio * coordinate2) - C0 = 0\n // J = [J1 ratio * J2]\n // K = J * invM * JT\n // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T\n //\n // Revolute:\n // coordinate = rotation\n // Cdot = angularVelocity\n // J = [0 0 1]\n // K = J * invM * JT = invI\n //\n // Prismatic:\n // coordinate = dot(p - pg, ug)\n // Cdot = dot(v + cross(w, r), ug)\n // J = [ug cross(r, ug)]\n // K = J * invM * JT = invMass + invI * cross(r, ug)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n joint1: this.m_joint1,\n joint2: this.m_joint2,\n ratio: this.m_ratio,\n\n // _constant: this.m_constant,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): GearJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.joint1 = restore(Joint, data.joint1, world);\n data.joint2 = restore(Joint, data.joint2, world);\n const joint = new GearJoint(data);\n // if (data._constant) joint.m_constant = data._constant;\n return joint;\n }\n\n /**\n * Get the first joint.\n */\n getJoint1(): Joint {\n return this.m_joint1;\n }\n\n /**\n * Get the second joint.\n */\n getJoint2(): Joint {\n return this.m_joint2;\n }\n\n /**\n * Set the gear ratio.\n */\n setRatio(ratio: number): void {\n _ASSERT && common.assert(Math.isFinite(ratio));\n this.m_ratio = ratio;\n }\n\n /**\n * Get the gear ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_JvAC).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n const L = this.m_impulse * this.m_JwA; // float\n return inv_dt * L;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_lcA = this.m_bodyA.m_sweep.localCenter;\n this.m_lcB = this.m_bodyB.m_sweep.localCenter;\n this.m_lcC = this.m_bodyC.m_sweep.localCenter;\n this.m_lcD = this.m_bodyD.m_sweep.localCenter;\n this.m_mA = this.m_bodyA.m_invMass;\n this.m_mB = this.m_bodyB.m_invMass;\n this.m_mC = this.m_bodyC.m_invMass;\n this.m_mD = this.m_bodyD.m_invMass;\n this.m_iA = this.m_bodyA.m_invI;\n this.m_iB = this.m_bodyB.m_invI;\n this.m_iC = this.m_bodyC.m_invI;\n this.m_iD = this.m_bodyD.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const aC = this.m_bodyC.c_position.a;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n\n const aD = this.m_bodyD.c_position.a;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n this.m_mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n this.m_JvAC = Vec2.zero();\n this.m_JwA = 1.0;\n this.m_JwC = 1.0;\n this.m_mass += this.m_iA + this.m_iC;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n this.m_JvAC = u;\n this.m_JwC = Vec2.crossVec2Vec2(rC, u);\n this.m_JwA = Vec2.crossVec2Vec2(rA, u);\n this.m_mass += this.m_mC + this.m_mA + this.m_iC * this.m_JwC * this.m_JwC + this.m_iA * this.m_JwA * this.m_JwA;\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n this.m_JvBD = Vec2.zero();\n this.m_JwB = this.m_ratio;\n this.m_JwD = this.m_ratio;\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD); // Vec2\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); // Vec2\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); // Vec2\n this.m_JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n this.m_JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n this.m_JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD * this.m_JwD * this.m_JwD + this.m_iB * this.m_JwB * this.m_JwB;\n }\n\n // Compute effective mass.\n this.m_mass = this.m_mass > 0.0 ? 1.0 / this.m_mass : 0.0;\n\n if (step.warmStarting) {\n vA.addMul(this.m_mA * this.m_impulse, this.m_JvAC);\n wA += this.m_iA * this.m_impulse * this.m_JwA;\n\n vB.addMul(this.m_mB * this.m_impulse, this.m_JvBD);\n wB += this.m_iB * this.m_impulse * this.m_JwB;\n\n vC.subMul(this.m_mC * this.m_impulse, this.m_JvAC);\n wC -= this.m_iC * this.m_impulse * this.m_JwC;\n\n vD.subMul(this.m_mD * this.m_impulse, this.m_JvBD);\n wD -= this.m_iD * this.m_impulse * this.m_JwD;\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n let Cdot = Vec2.dot(this.m_JvAC, vA) - Vec2.dot(this.m_JvAC, vC)\n + Vec2.dot(this.m_JvBD, vB) - Vec2.dot(this.m_JvBD, vD); // float\n Cdot += (this.m_JwA * wA - this.m_JwC * wC)\n + (this.m_JwB * wB - this.m_JwD * wD);\n\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n vA.addMul(this.m_mA * impulse, this.m_JvAC);\n wA += this.m_iA * impulse * this.m_JwA;\n vB.addMul(this.m_mB * impulse, this.m_JvBD);\n wB += this.m_iB * impulse * this.m_JwB;\n vC.subMul(this.m_mC * impulse, this.m_JvAC);\n wC -= this.m_iC * impulse * this.m_JwC;\n vD.subMul(this.m_mD * impulse, this.m_JvBD);\n wD -= this.m_iD * impulse * this.m_JwD;\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n const cC = this.m_bodyC.c_position.c;\n let aC = this.m_bodyC.c_position.a;\n const cD = this.m_bodyD.c_position.c;\n let aD = this.m_bodyD.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n const linearError = 0.0;\n\n let coordinateA: number;\n let coordinateB: number;\n\n let JvAC: Vec2;\n let JvBD: Vec2;\n let JwA: number;\n let JwB: number;\n let JwC: number;\n let JwD: number;\n let mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n JvAC = Vec2.zero();\n JwA = 1.0;\n JwC = 1.0;\n mass += this.m_iA + this.m_iC;\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n JvAC = u;\n JwC = Vec2.crossVec2Vec2(rC, u);\n JwA = Vec2.crossVec2Vec2(rA, u);\n mass += this.m_mC + this.m_mA + this.m_iC * JwC * JwC + this.m_iA * JwA * JwA;\n\n const pC = Vec2.sub(this.m_localAnchorC, this.m_lcC); // Vec2\n const pA = Rot.mulTVec2(qC, Vec2.add(rA, Vec2.sub(cA, cC))); // Vec2\n coordinateA = Vec2.dot(Vec2.sub(pA, pC), this.m_localAxisC);\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n JvBD = Vec2.zero();\n JwB = this.m_ratio;\n JwD = this.m_ratio;\n mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD);\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB);\n JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD\n * JwD * JwD + this.m_iB * JwB * JwB;\n\n const pD = Vec2.sub(this.m_localAnchorD, this.m_lcD); // Vec2\n const pB = Rot.mulTVec2(qD, Vec2.add(rB, Vec2.sub(cB, cD))); // Vec2\n coordinateB = Vec2.dot(pB, this.m_localAxisD)\n - Vec2.dot(pD, this.m_localAxisD);\n }\n\n const C = (coordinateA + this.m_ratio * coordinateB) - this.m_constant; // float\n\n let impulse = 0.0; // float\n if (mass > 0.0) {\n impulse = -C / mass;\n }\n\n cA.addMul(this.m_mA * impulse, JvAC);\n aA += this.m_iA * impulse * JwA;\n cB.addMul(this.m_mB * impulse, JvBD);\n aB += this.m_iB * impulse * JwB;\n cC.subMul(this.m_mC * impulse, JvAC);\n aC -= this.m_iC * impulse * JwC;\n cD.subMul(this.m_mD * impulse, JvBD);\n aD -= this.m_iD * impulse * JwD;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n this.m_bodyC.c_position.c.setVec2(cC);\n this.m_bodyC.c_position.a = aC;\n this.m_bodyD.c_position.c.setVec2(cD);\n this.m_bodyD.c_position.a = aD;\n\n // TODO_ERIN not implemented\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Mat22 from '../../common/Mat22';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Motor joint definition.\n */\nexport interface MotorJointOpt extends JointOpt {\n /**\n * The bodyB angle minus bodyA angle in radians.\n */\n angularOffset?: number;\n /**\n * The maximum motor force in N.\n */\n maxForce?: number;\n /**\n * The maximum motor torque in N-m.\n */\n maxTorque?: number;\n /**\n * Position correction factor in the range [0,1].\n */\n correctionFactor?: number;\n /**\n * Position of bodyB minus the position of bodyA, in bodyA's frame, in meters.\n */\n linearOffset?: Vec2;\n}\n/**\n * Motor joint definition.\n */\nexport interface MotorJointDef extends JointDef, MotorJointOpt {\n}\n\nconst DEFAULTS = {\n maxForce : 1.0,\n maxTorque : 1.0,\n correctionFactor : 0.3\n};\n\n/**\n * A motor joint is used to control the relative motion between two bodies. A\n * typical usage is to control the movement of a dynamic body with respect to\n * the ground.\n */\nexport default class MotorJoint extends Joint {\n static TYPE = 'motor-joint' as const;\n\n /** @internal */ m_type: 'motor-joint';\n /** @internal */ m_linearOffset: Vec2;\n /** @internal */ m_angularOffset: number;\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n /** @internal */ m_correctionFactor: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_linearError: Vec2;\n /** @internal */ m_angularError: number;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: MotorJointDef);\n constructor(def: MotorJointOpt, bodyA: Body, bodyB: Body);\n constructor(def: MotorJointDef | MotorJointOpt, bodyA?: Body, bodyB?: Body) {\n // @ts-ignore\n if (!(this instanceof MotorJoint)) {\n return new MotorJoint(def, bodyA, bodyB);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MotorJoint.TYPE;\n\n this.m_linearOffset = Math.isFinite(def.linearOffset) ? def.linearOffset : bodyA.getLocalPoint(bodyB.getPosition());\n this.m_angularOffset = Math.isFinite(def.angularOffset) ? def.angularOffset : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n this.m_correctionFactor = def.correctionFactor;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n correctionFactor: this.m_correctionFactor,\n\n linearOffset: this.m_linearOffset,\n angularOffset: this.m_angularOffset,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MotorJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new MotorJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {}): void {\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && common.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && common.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Set the position correction factor in the range [0,1].\n */\n setCorrectionFactor(factor: number): void {\n _ASSERT && common.assert(Math.isFinite(factor) && 0.0 <= factor && factor <= 1.0);\n this.m_correctionFactor = factor;\n }\n\n /**\n * Get the position correction factor in the range [0,1].\n */\n getCorrectionFactor(): number {\n return this.m_correctionFactor;\n }\n\n /**\n * Set/get the target linear offset, in frame A, in meters.\n */\n setLinearOffset(linearOffset: Vec2): void {\n if (linearOffset.x != this.m_linearOffset.x\n || linearOffset.y != this.m_linearOffset.y) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_linearOffset = linearOffset;\n }\n }\n\n getLinearOffset(): Vec2 {\n return this.m_linearOffset;\n }\n\n /**\n * Set/get the target angular offset, in radians.\n */\n setAngularOffset(angularOffset: number): void {\n if (angularOffset != this.m_angularOffset) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_angularOffset = angularOffset;\n }\n }\n\n getAngularOffset(): number {\n return this.m_angularOffset;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getPosition();\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getPosition();\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.neg(this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.neg(this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n this.m_linearError = Vec2.zero();\n this.m_linearError.addCombine(1, cB, 1, this.m_rB);\n this.m_linearError.subCombine(1, cA, 1, this.m_rA);\n this.m_linearError.sub(Rot.mulVec2(qA, this.m_linearOffset));\n\n this.m_angularError = aB - aA - this.m_angularOffset;\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt;\n const inv_h = step.inv_dt;\n\n // Solve angular friction\n {\n const Cdot = wB - wA + inv_h * this.m_correctionFactor * this.m_angularError;\n let impulse = -this.m_angularMass * Cdot;\n\n const oldImpulse = this.m_angularImpulse;\n const maxImpulse = h * this.m_maxTorque;\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n Cdot.addMul(inv_h * this.m_correctionFactor, this.m_linearError);\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot));\n const oldImpulse = Vec2.clone(this.m_linearImpulse);\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce;\n\n this.m_linearImpulse.clamp(maxImpulse);\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Mat22 from '../../common/Mat22';\nimport Rot from '../../common/Rot';\nimport Transform from '../../common/Transform';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointOpt extends JointOpt {\n /**\n * [maxForce = 0.0] The maximum constraint force that can be exerted to move\n * the candidate body. Usually you will express as some multiple of the\n * weight (multiplier * mass * gravity).\n */\n maxForce?: number;\n /**\n * [frequencyHz = 5.0] The response speed.\n */\n frequencyHz?: number;\n /**\n * [dampingRatio = 0.7] The damping ratio. 0 = no damping, 1 = critical\n * damping.\n */\n dampingRatio?: number;\n}\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointDef extends JointDef, MouseJointOpt {\n /**\n * The initial world target point. This is assumed to coincide with the body\n * anchor initially.\n */\n target: Vec2;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n frequencyHz : 5.0,\n dampingRatio : 0.7\n};\n\n/**\n * A mouse joint is used to make a point on a body track a specified world\n * point. This a soft constraint with a maximum force. This allows the\n * constraint to stretch and without applying huge forces.\n *\n * NOTE: this joint is not documented in the manual because it was developed to\n * be used in the testbed. If you want to learn how to use the mouse joint, look\n * at the testbed.\n */\nexport default class MouseJoint extends Joint {\n static TYPE = 'mouse-joint' as const;\n\n /** @internal */ m_type: 'mouse-joint';\n /** @internal */ m_targetA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_impulse: Vec2;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_beta: number;\n /** @internal */ m_gamma: number;\n // Solver temp\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat22;\n /** @internal */ m_C: Vec2;\n\n constructor(def: MouseJointDef);\n constructor(def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2);\n constructor(def: MouseJointDef, bodyA?: Body, bodyB?: Body, target?: Vec2) {\n // @ts-ignore\n if (!(this instanceof MouseJoint)) {\n return new MouseJoint(def, bodyA, bodyB, target);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MouseJoint.TYPE;\n\n _ASSERT && common.assert(Math.isFinite(def.maxForce) && def.maxForce >= 0.0);\n _ASSERT && common.assert(Math.isFinite(def.frequencyHz) && def.frequencyHz >= 0.0);\n _ASSERT && common.assert(Math.isFinite(def.dampingRatio) && def.dampingRatio >= 0.0);\n\n this.m_targetA = target ? Vec2.clone(target) : def.target || Vec2.zero();\n this.m_localAnchorB = Transform.mulTVec2(bodyB.getTransform(), this.m_targetA);\n\n this.m_maxForce = def.maxForce;\n this.m_impulse = Vec2.zero();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_beta = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rB = Vec2.zero();\n this.m_localCenterB = Vec2.zero();\n this.m_invMassB = 0.0;\n this.m_invIB = 0.0;\n this.m_mass = new Mat22();\n this.m_C = Vec2.zero();\n\n // p = attached point, m = mouse point\n // C = p - m\n // Cdot = v\n // = v + cross(w, r)\n // J = [I r_skew]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n target: this.m_targetA,\n maxForce: this.m_maxForce,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n _localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MouseJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.target = Vec2.clone(data.target);\n const joint = new MouseJoint(data);\n if (data._localAnchorB) {\n joint.m_localAnchorB = data._localAnchorB;\n }\n return joint;\n }\n\n /**\n * Use this to update the target point.\n */\n setTarget(target: Vec2): void {\n if (this.m_bodyB.isAwake() == false) {\n this.m_bodyB.setAwake(true);\n }\n this.m_targetA = Vec2.clone(target);\n }\n\n getTarget(): Vec2 {\n return this.m_targetA;\n }\n\n /**\n * Set the maximum force in Newtons.\n */\n setMaxForce(force: number): void {\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum force in Newtons.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the frequency in Hertz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get the frequency in Hertz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set the damping ratio (dimensionless).\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get the damping ratio (dimensionless).\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return Vec2.clone(this.m_targetA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_impulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * 0.0;\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_targetA.sub(newOrigin);\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const position = this.m_bodyB.c_position;\n const velocity = this.m_bodyB.c_velocity;\n\n const cB = position.c;\n const aB = position.a;\n const vB = velocity.v;\n let wB = velocity.w;\n\n const qB = Rot.neo(aB);\n\n const mass = this.m_bodyB.getMass();\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = mass * (omega * omega);\n\n // magic formulas\n // gamma has units of inverse mass.\n // beta has units of inverse time.\n const h = step.dt;\n _ASSERT && common.assert(d + h * k > Math.EPSILON);\n this.m_gamma = h * (d + h * k);\n if (this.m_gamma != 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n this.m_beta = h * k * this.m_gamma;\n\n // Compute the effective mass matrix.\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) *\n // invI2 * skew(r2)]\n // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y\n // -r1.x*r1.y]\n // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x]\n const K = new Mat22();\n K.ex.x = this.m_invMassB + this.m_invIB * this.m_rB.y * this.m_rB.y\n + this.m_gamma;\n K.ex.y = -this.m_invIB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = this.m_invMassB + this.m_invIB * this.m_rB.x * this.m_rB.x\n + this.m_gamma;\n\n this.m_mass = K.getInverse();\n\n this.m_C.setVec2(cB);\n this.m_C.addCombine(1, this.m_rB, -1, this.m_targetA);\n this.m_C.mul(this.m_beta);\n\n // Cheat with some damping\n wB *= 0.98;\n\n if (step.warmStarting) {\n this.m_impulse.mul(step.dtRatio);\n vB.addMul(this.m_invMassB, this.m_impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, this.m_impulse);\n\n } else {\n this.m_impulse.setZero();\n }\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const velocity = this.m_bodyB.c_velocity;\n const vB = Vec2.clone(velocity.v);\n let wB = velocity.w;\n\n // Cdot = v + cross(w, r)\n\n const Cdot = Vec2.crossNumVec2(wB, this.m_rB);\n Cdot.add(vB);\n\n Cdot.addCombine(1, this.m_C, this.m_gamma, this.m_impulse);\n Cdot.neg();\n\n let impulse = Mat22.mulVec2(this.m_mass, Cdot);\n\n const oldImpulse = Vec2.clone(this.m_impulse);\n this.m_impulse.add(impulse);\n const maxImpulse = step.dt * this.m_maxForce;\n this.m_impulse.clamp(maxImpulse);\n impulse = Vec2.sub(this.m_impulse, oldImpulse);\n\n vB.addMul(this.m_invMassB, impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\n// tslint:disable-next-line:no-empty-interface\nexport interface PulleyJointOpt extends JointOpt {\n}\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\nexport interface PulleyJointDef extends JointDef, PulleyJointOpt {\n /**\n * The first ground anchor in world coordinates. This point never moves.\n */\n groundAnchorA: Vec2;\n /**\n * The second ground anchor in world coordinates. This point never moves.\n */\n groundAnchorB: Vec2;\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The reference length for the segment attached to bodyA.\n */\n lengthA: number;\n /**\n * The reference length for the segment attached to bodyB.\n */\n lengthB: number;\n /**\n * The pulley ratio, used to simulate a block-and-tackle.\n */\n ratio: number;\n}\n\nconst DEFAULTS = {\n collideConnected : true\n};\n\n/**\n * The pulley joint is connected to two bodies and two fixed ground points. The\n * pulley supports a ratio such that: length1 + ratio * length2 <= constant\n *\n * Yes, the force transmitted is scaled by the ratio.\n *\n * Warning: the pulley joint can get a bit squirrelly by itself. They often work\n * better when combined with prismatic joints. You should also cover the the\n * anchor points with static shapes to prevent one side from going to zero\n * length.\n */\nexport default class PulleyJoint extends Joint {\n static TYPE = 'pulley-joint' as const;\n // static MIN_PULLEY_LENGTH: number = 2.0; // TODO where this is used?\n\n /** @internal */ m_type: 'pulley-joint';\n /** @internal */ m_groundAnchorA: Vec2;\n /** @internal */ m_groundAnchorB: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_lengthA: number;\n /** @internal */ m_lengthB: number;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_uA: Vec2;\n /** @internal */ m_uB: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: PulleyJointDef);\n constructor(def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number);\n constructor(def: PulleyJointDef, bodyA?: Body, bodyB?: Body, groundA?: Vec2, groundB?: Vec2, anchorA?: Vec2, anchorB?: Vec2, ratio?: number) {\n // @ts-ignore\n if (!(this instanceof PulleyJoint)) {\n return new PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PulleyJoint.TYPE;\n this.m_groundAnchorA = groundA ? groundA : def.groundAnchorA || Vec2.neo(-1.0, 1.0);\n this.m_groundAnchorB = groundB ? groundB : def.groundAnchorB || Vec2.neo(1.0, 1.0);\n this.m_localAnchorA = anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n this.m_lengthA = Math.isFinite(def.lengthA) ? def.lengthA : Vec2.distance(anchorA, groundA);\n this.m_lengthB = Math.isFinite(def.lengthB) ? def.lengthB : Vec2.distance(anchorB, groundB);\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n _ASSERT && common.assert(ratio > Math.EPSILON);\n\n this.m_constant = this.m_lengthA + this.m_ratio * this.m_lengthB;\n\n this.m_impulse = 0.0;\n\n // Pulley:\n // length1 = norm(p1 - s1)\n // length2 = norm(p2 - s2)\n // C0 = (length1 + ratio * length2)_initial\n // C = C0 - (length1 + ratio * length2)\n // u1 = (p1 - s1) / norm(p1 - s1)\n // u2 = (p2 - s2) / norm(p2 - s2)\n // Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2))\n // J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 *\n // cross(r2, u2)^2)\n }\n\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n groundAnchorA: this.m_groundAnchorA,\n groundAnchorB: this.m_groundAnchorB,\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n lengthA: this.m_lengthA,\n lengthB: this.m_lengthB,\n ratio: this.m_ratio,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PulleyJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new PulleyJoint(data);\n return joint;\n }\n\n /**\n * Get the first ground anchor.\n */\n getGroundAnchorA(): Vec2 {\n return this.m_groundAnchorA;\n }\n\n /**\n * Get the second ground anchor.\n */\n getGroundAnchorB(): Vec2 {\n return this.m_groundAnchorB;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getLengthA(): number {\n return this.m_lengthA;\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getLengthB(): number {\n return this.m_lengthB;\n }\n\n /**\n * Get the pulley ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getCurrentLengthA(): number {\n const p = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const s = this.m_groundAnchorA;\n return Vec2.distance(p, s);\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getCurrentLengthB(): number {\n const p = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const s = this.m_groundAnchorB;\n return Vec2.distance(p, s);\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n *\n * @param newOrigin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_groundAnchorA.sub(newOrigin);\n this.m_groundAnchorB.sub(newOrigin);\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_uB).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n this.m_uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n this.m_uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = this.m_uA.length();\n const lengthB = this.m_uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n this.m_uA.mul(1.0 / lengthA);\n } else {\n this.m_uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n this.m_uB.mul(1.0 / lengthB);\n } else {\n this.m_uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(this.m_rA, this.m_uA); // float\n const ruB = Vec2.crossVec2Vec2(this.m_rB, this.m_uB); // float\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n this.m_mass = mA + this.m_ratio * this.m_ratio * mB;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support variable time steps.\n this.m_impulse *= step.dtRatio;\n\n // Warm starting.\n const PA = Vec2.mulNumVec2(-this.m_impulse, this.m_uA);\n const PB = Vec2.mulNumVec2(-this.m_ratio * this.m_impulse, this.m_uB);\n\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n\n const Cdot = -Vec2.dot(this.m_uA, vpA) - this.m_ratio\n * Vec2.dot(this.m_uB, vpB); // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const PA = Vec2.mulNumVec2(-impulse, this.m_uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, this.m_uB); // Vec2\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n const uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n const uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = uA.length();\n const lengthB = uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n uA.mul(1.0 / lengthA);\n } else {\n uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n uB.mul(1.0 / lengthB);\n } else {\n uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(rA, uA);\n const ruB = Vec2.crossVec2Vec2(rB, uB);\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n let mass = mA + this.m_ratio * this.m_ratio * mB; // float\n\n if (mass > 0.0) {\n mass = 1.0 / mass;\n }\n\n const C = this.m_constant - lengthA - this.m_ratio * lengthB; // float\n const linearError = Math.abs(C); // float\n\n const impulse = -mass * C; // float\n\n const PA = Vec2.mulNumVec2(-impulse, uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, uB); // Vec2\n\n cA.addMul(this.m_invMassA, PA);\n aA += this.m_invIA * Vec2.crossVec2Vec2(rA, PA);\n cB.addMul(this.m_invMassB, PB);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, PB);\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointOpt extends JointOpt {\n /**\n * The maximum length of the rope.\n * Warning: this must be larger than linearSlop or the joint will have no effect.\n */\n maxLength?: number;\n}\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointDef extends JointDef, RopeJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxLength : 0.0,\n};\n\n/**\n * A rope joint enforces a maximum distance between two points on two bodies. It\n * has no other effect.\n *\n * Warning: if you attempt to change the maximum length during the simulation\n * you will get some non-physical behavior.\n *\n * A model that would allow you to dynamically modify the length would have some\n * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you\n * want to dynamically control length.\n */\nexport default class RopeJoint extends Joint {\n static TYPE = 'rope-joint' as const;\n\n /** @internal */ m_type: 'rope-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n /** @internal */ m_maxLength: number;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_length: number;\n /** @internal */ m_state: number; // TODO enum\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n constructor(def: RopeJointDef);\n constructor(def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: RopeJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (!(this instanceof RopeJoint)) {\n return new RopeJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RopeJoint.TYPE;\n this.m_localAnchorA = anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n\n this.m_maxLength = def.maxLength;\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_length = 0.0;\n this.m_state = inactiveLimit;\n\n // Limit:\n // C = norm(pB - pA) - L\n // u = (pB - pA) / norm(pB - pA)\n // Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA))\n // J = [-u -cross(rA, u) u cross(rB, u)]\n // K = J * invM * JT\n // = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n maxLength: this.m_maxLength,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): RopeJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RopeJoint(data);\n return joint;\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum length of the rope.\n */\n setMaxLength(length: number): void {\n this.m_maxLength = length;\n }\n\n /**\n * Get the maximum length of the rope.\n */\n getMaxLength(): number {\n return this.m_maxLength;\n }\n\n getLimitState(): number {\n // TODO LimitState\n return this.m_state;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n this.m_rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n this.m_u = Vec2.zero();\n this.m_u.addCombine(1, cB, 1, this.m_rB);\n this.m_u.subCombine(1, cA, 1, this.m_rA); // Vec2\n\n this.m_length = this.m_u.length();\n\n const C = this.m_length - this.m_maxLength; // float\n if (C > 0.0) {\n this.m_state = atUpperLimit;\n } else {\n this.m_state = inactiveLimit;\n }\n\n if (this.m_length > Settings.linearSlop) {\n this.m_u.mul(1.0 / this.m_length);\n } else {\n this.m_u.setZero();\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n return;\n }\n\n // Compute effective mass.\n const crA = Vec2.crossVec2Vec2(this.m_rA, this.m_u); // float\n const crB = Vec2.crossVec2Vec2(this.m_rB, this.m_u); // float\n const invMass = this.m_invMassA + this.m_invIA * crA * crA + this.m_invMassB\n + this.m_invIB * crB * crB; // float\n\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.addCrossNumVec2(vA, wA, this.m_rA); // Vec2\n const vpB = Vec2.addCrossNumVec2(vB, wB, this.m_rB); // Vec2\n const C = this.m_length - this.m_maxLength; // float\n let Cdot = Vec2.dot(this.m_u, Vec2.sub(vpB, vpA)); // float\n\n // Predictive constraint.\n if (C < 0.0) {\n Cdot += step.inv_dt * C;\n }\n\n let impulse = -this.m_mass * Cdot; // float\n const oldImpulse = this.m_impulse; // float\n this.m_impulse = Math.min(0.0, this.m_impulse + impulse);\n impulse = this.m_impulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u); // Vec2\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c; // Vec2\n let aA = this.m_bodyA.c_position.a; // float\n const cB = this.m_bodyB.c_position.c; // Vec2\n let aB = this.m_bodyB.c_position.a; // float\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.zero();\n u.addCombine(1, cB, 1, rB);\n u.subCombine(1, cA, 1, rA); // Vec2\n\n const length = u.normalize(); // float\n let C = length - this.m_maxLength; // float\n\n C = Math.clamp(C, 0.0, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C; // float\n const P = Vec2.mulNumVec2(impulse, u); // Vec2\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return length - this.m_maxLength < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Vec3 from '../../common/Vec3';\nimport Mat33 from '../../common/Mat33';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n *\n * @prop {float} frequencyHz\n * @prop {float} dampingRatio\n *\n * @prop {Vec2} localAnchorA\n * @prop {Vec2} localAnchorB\n * @prop {float} referenceAngle\n */\nexport interface WeldJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. Rotation only. Disable softness\n * with a value of 0.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle?: number;\n}\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n */\nexport interface WeldJointDef extends JointDef, WeldJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0,\n};\n\n/**\n * A weld joint essentially glues two bodies together. A weld joint may distort\n * somewhat because the island constraint solver is approximate.\n */\nexport default class WeldJoint extends Joint {\n static TYPE = 'weld-joint' as const\n\n /** @internal */ m_type: 'weld-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_impulse: Vec3;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat33;\n\n constructor(def: WeldJointDef);\n constructor(def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: WeldJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (!(this instanceof WeldJoint)) {\n return new WeldJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WeldJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_impulse = new Vec3();\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rA; // Vec2\n this.m_rB; // Vec2\n this.m_localCenterA; // Vec2\n this.m_localCenterB; // Vec2\n this.m_invMassA; // float\n this.m_invMassB; // float\n this.m_invIA; // float\n this.m_invIB; // float\n this.m_mass = new Mat33();\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // / = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // C = angle2 - angle1 - referenceAngle\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WeldJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WeldJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Set frequency in Hz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get frequency in Hz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set damping ratio.\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get damping ratio.\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat33();\n K.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y * this.m_rB.y\n * iB;\n K.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y * this.m_rB.x * iB;\n K.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x * this.m_rB.x\n * iB;\n K.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n K.getInverse22(this.m_mass);\n\n let invM = iA + iB; // float\n const m = invM > 0.0 ? 1.0 / invM : 0.0; // float\n\n const C = aB - aA - this.m_referenceAngle; // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const d = 2.0 * m * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = m * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invM += this.m_gamma;\n this.m_mass.ez.z = invM != 0.0 ? 1.0 / invM : 0.0;\n } else if (K.ez.z == 0.0) {\n K.getInverse22(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n } else {\n K.getSymInverse33(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n if (this.m_frequencyHz > 0.0) {\n const Cdot2 = wB - wA; // float\n\n const impulse2 = -this.m_mass.ez.z\n * (Cdot2 + this.m_bias + this.m_gamma * this.m_impulse.z); // float\n this.m_impulse.z += impulse2;\n\n wA -= iA * impulse2;\n wB += iB * impulse2;\n\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n\n const impulse1 = Vec2.neg(Mat33.mulVec2(this.m_mass, Cdot1)); // Vec2\n this.m_impulse.x += impulse1.x;\n this.m_impulse.y += impulse1.y;\n\n const P = Vec2.clone(impulse1); // Vec2\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, P);\n } else {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); // Vec3\n\n const impulse = Vec3.neg(Mat33.mulVec3(this.m_mass, Cdot)); // Vec3\n this.m_impulse.add(impulse);\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n let positionError: number;\n let angularError: number;\n\n const K = new Mat33();\n K.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB;\n K.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB;\n K.ez.x = -rA.y * iA - rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB;\n K.ez.y = rA.x * iA + rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA); // Vec2\n\n positionError = C1.length();\n angularError = 0.0;\n\n const P = Vec2.neg(K.solve22(C1)); // Vec2\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n } else {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA);\n\n const C2 = aB - aA - this.m_referenceAngle; // float\n\n positionError = C1.length();\n angularError = Math.abs(C2);\n\n const C = new Vec3(C1.x, C1.y, C2);\n\n let impulse = new Vec3();\n if (K.ez.z > 0.0) {\n impulse = Vec3.neg(K.solve33(C));\n } else {\n const impulse2 = Vec2.neg(K.solve22(C1));\n impulse.set(impulse2.x, impulse2.y, 0.0);\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n cA.subMul(mA, P);\n aA -= iA * (Vec2.crossVec2Vec2(rA, P) + impulse.z);\n\n cB.addMul(mB, P);\n aB += iB * (Vec2.crossVec2Vec2(rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointOpt extends JointOpt {\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n /**\n * Suspension frequency, zero indicates no suspension.\n */\n frequencyHz?: number;\n /**\n * Suspension damping ratio, one indicates critical damping.\n */\n dampingRatio?: number;\n}\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointDef extends JointDef, WheelJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation axis in bodyA.\n */\n localAxisA: Vec2;\n}\n\nconst DEFAULTS = {\n enableMotor : false,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n frequencyHz : 2.0,\n dampingRatio : 0.7,\n};\n\n/**\n * A wheel joint. This joint provides two degrees of freedom: translation along\n * an axis fixed in bodyA and rotation in the plane. In other words, it is a\n * point to line constraint with a rotational motor and a linear spring/damper.\n * This joint is designed for vehicle suspensions.\n */\nexport default class WheelJoint extends Joint {\n static TYPE = 'wheel-joint' as const;\n\n /** @internal */ m_type: 'wheel-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_springMass: number;\n /** @internal */ m_springImpulse: number;\n\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableMotor: boolean;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n /** @internal */ m_ax: Vec2 = Vec2.zero();\n /** @internal */ m_ay: Vec2 = Vec2.zero();\n /** @internal */ m_sAx: number;\n /** @internal */ m_sBx: number;\n /** @internal */ m_sAy: number;\n /** @internal */ m_sBy: number;\n\n constructor(def: WheelJointDef);\n constructor(def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n // @ts-ignore\n constructor(def: WheelJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (!(this instanceof WheelJoint)) {\n return new WheelJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WheelJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n // @ts-ignore localAxis\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || def.localAxis || Vec2.neo(1.0, 0.0));\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n this.m_springMass = 0.0;\n this.m_springImpulse = 0.0;\n\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableMotor = def.enableMotor;\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Linear constraint (point-to-line)\n // d = pB - pA = xB + rB - xA - rA\n // C = dot(ay, d)\n // Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA,\n // rA))\n // = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB,\n // ay), vB)\n // J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)]\n\n // Spring linear constraint\n // C = dot(ax, d)\n // Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) +\n // dot(cross(rB, ax), vB)\n // J = [-ax -cross(d+rA, ax) ax cross(rB, ax)]\n\n // Motor rotational constraint\n // Cdot = wB - wA\n // J = [0 0 -1 0 0 1]\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n enableMotor: this.m_enableMotor,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WheelJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WheelJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const pA = bA.getWorldPoint(this.m_localAnchorA); // Vec2\n const pB = bB.getWorldPoint(this.m_localAnchorB); // Vec2\n const d = Vec2.sub(pB, pA); // Vec2\n const axis = bA.getWorldVector(this.m_localXAxisA); // Vec2\n\n const translation = Vec2.dot(d, axis); // float\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const wA = this.m_bodyA.m_angularVelocity;\n const wB = this.m_bodyB.m_angularVelocity;\n return wB - wA;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed, usually in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set/Get the maximum motor force, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Get the current motor torque given the inverse time step, usually in N-m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set/Get the spring frequency in hertz. Setting the frequency to zero disables\n * the spring.\n */\n setSpringFrequencyHz(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getSpringFrequencyHz(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set/Get the spring damping ratio\n */\n setSpringDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getSpringDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA); // Vec2\n\n // Point to line constraint\n {\n this.m_ay = Rot.mulVec2(qA, this.m_localYAxisA);\n this.m_sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ay);\n this.m_sBy = Vec2.crossVec2Vec2(rB, this.m_ay);\n\n this.m_mass = mA + mB + iA * this.m_sAy * this.m_sAy + iB * this.m_sBy\n * this.m_sBy;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n }\n\n // Spring constraint\n this.m_springMass = 0.0;\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n if (this.m_frequencyHz > 0.0) {\n this.m_ax = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_sAx = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ax);\n this.m_sBx = Vec2.crossVec2Vec2(rB, this.m_ax);\n\n const invMass = mA + mB + iA * this.m_sAx * this.m_sAx + iB * this.m_sBx\n * this.m_sBx; // float\n\n if (invMass > 0.0) {\n this.m_springMass = 1.0 / invMass;\n\n const C = Vec2.dot(d, this.m_ax); // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const damp = 2.0 * this.m_springMass * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = this.m_springMass * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (damp + h * k);\n if (this.m_gamma > 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n\n this.m_bias = C * h * k * this.m_gamma;\n\n this.m_springMass = invMass + this.m_gamma;\n if (this.m_springMass > 0.0) {\n this.m_springMass = 1.0 / this.m_springMass;\n }\n }\n } else {\n this.m_springImpulse = 0.0;\n }\n\n // Rotational motor\n if (this.m_enableMotor) {\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n } else {\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse *= step.dtRatio;\n this.m_springImpulse *= step.dtRatio;\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax);\n const LA = this.m_impulse * this.m_sAy + this.m_springImpulse * this.m_sAx + this.m_motorImpulse;\n const LB = this.m_impulse * this.m_sBy + this.m_springImpulse * this.m_sBx + this.m_motorImpulse;\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * LA;\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * LB;\n\n } else {\n this.m_impulse = 0.0;\n this.m_springImpulse = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Solve spring constraint\n {\n const Cdot = Vec2.dot(this.m_ax, vB) - Vec2.dot(this.m_ax, vA) + this.m_sBx\n * wB - this.m_sAx * wA; // float\n const impulse = -this.m_springMass\n * (Cdot + this.m_bias + this.m_gamma * this.m_springImpulse); // float\n this.m_springImpulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ax); // Vec2\n const LA = impulse * this.m_sAx; // float\n const LB = impulse * this.m_sBx; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n // Solve rotational motor constraint\n {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve point to line constraint\n {\n const Cdot = Vec2.dot(this.m_ay, vB) - Vec2.dot(this.m_ay, vA) + this.m_sBy\n * wB - this.m_sAy * wA; // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ay); // Vec2\n const LA = impulse * this.m_sAy; // float\n const LB = impulse * this.m_sBy; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const ay = Rot.mulVec2(qA, this.m_localYAxisA);\n\n const sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), ay); // float\n const sBy = Vec2.crossVec2Vec2(rB, ay); // float\n\n const C = Vec2.dot(d, ay); // float\n\n const k = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_sAy\n * this.m_sAy + this.m_invIB * this.m_sBy * this.m_sBy; // float\n\n let impulse; // float\n if (k != 0.0) {\n impulse = -C / k;\n } else {\n impulse = 0.0;\n }\n\n const P = Vec2.mulNumVec2(impulse, ay); // Vec2\n const LA = impulse * sAy; // float\n const LB = impulse * sBy; // float\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * LA;\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * LB;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) <= Settings.linearSlop;\n }\n\n}\n","// tslint:disable:typedef\nimport World from '../dynamics/World';\nimport Body from '../dynamics/Body';\nimport Joint from '../dynamics/Joint';\nimport Fixture from '../dynamics/Fixture';\nimport Shape from '../collision/Shape';\nimport Vec2 from '../common/Vec2';\nimport Vec3 from '../common/Vec3';\nimport ChainShape from \"../collision/shape/ChainShape\";\nimport BoxShape from \"../collision/shape/BoxShape\";\nimport EdgeShape from \"../collision/shape/EdgeShape\";\nimport PolygonShape from \"../collision/shape/PolygonShape\";\nimport CircleShape from \"../collision/shape/CircleShape\";\nimport DistanceJoint from \"../dynamics/joint/DistanceJoint\";\nimport FrictionJoint from \"../dynamics/joint/FrictionJoint\";\nimport GearJoint from \"../dynamics/joint/GearJoint\";\nimport MotorJoint from \"../dynamics/joint/MotorJoint\";\nimport MouseJoint from \"../dynamics/joint/MouseJoint\";\nimport PrismaticJoint from \"../dynamics/joint/PrismaticJoint\";\nimport PulleyJoint from \"../dynamics/joint/PulleyJoint\";\nimport RevoluteJoint from \"../dynamics/joint/RevoluteJoint\";\nimport RopeJoint from \"../dynamics/joint/RopeJoint\";\nimport WeldJoint from \"../dynamics/joint/WeldJoint\";\nimport WheelJoint from \"../dynamics/joint/WheelJoint\";\n\nlet SID = 0;\n\nfunction Serializer(opts?) {\n opts = opts || {};\n\n const rootClass = opts.rootClass || World;\n\n const preSerialize = opts.preSerialize || function(obj) { return obj; };\n const postSerialize = opts.postSerialize || function(data, obj) { return data; };\n\n const preDeserialize = opts.preDeserialize || function(data) { return data; };\n const postDeserialize = opts.postDeserialize || function(obj, data) { return obj; };\n\n // This is used to create ref objects during serialize\n const refTypes = {\n World,\n Body,\n Joint,\n Fixture,\n Shape,\n };\n\n // This is used by restore to deserialize objects and refs\n const restoreTypes = {\n Vec2,\n Vec3,\n ...refTypes\n };\n\n const CLASS_BY_TYPE_PROP = {\n [Body.STATIC]: Body,\n [Body.DYNAMIC]: Body,\n [Body.KINEMATIC]: Body,\n [ChainShape.TYPE]: ChainShape,\n [BoxShape.TYPE]: BoxShape,\n [EdgeShape.TYPE]: EdgeShape,\n [PolygonShape.TYPE]: PolygonShape,\n [CircleShape.TYPE]: CircleShape,\n [DistanceJoint.TYPE]: DistanceJoint,\n [FrictionJoint.TYPE]: FrictionJoint,\n [GearJoint.TYPE]: GearJoint,\n [MotorJoint.TYPE]: MotorJoint,\n [MouseJoint.TYPE]: MouseJoint,\n [PrismaticJoint.TYPE]: PrismaticJoint,\n [PulleyJoint.TYPE]: PulleyJoint,\n [RevoluteJoint.TYPE]: RevoluteJoint,\n [RopeJoint.TYPE]: RopeJoint,\n [WeldJoint.TYPE]: WeldJoint,\n [WheelJoint.TYPE]: WheelJoint,\n }\n\n this.toJson = function(root) {\n const json = [];\n\n const queue = [root];\n const refMap = {};\n\n function storeRef(value, typeName) {\n value.__sid = value.__sid || ++SID;\n if (!refMap[value.__sid]) {\n queue.push(value);\n const index = json.length + queue.length;\n const ref = {\n refIndex: index,\n refType: typeName\n };\n refMap[value.__sid] = ref;\n }\n return refMap[value.__sid];\n }\n\n function serialize(obj) {\n obj = preSerialize(obj);\n let data = obj._serialize();\n data = postSerialize(data, obj);\n return data;\n }\n\n function toJson(value, top?) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (typeof value._serialize === 'function') {\n if (value !== top) {\n // tslint:disable-next-line:no-for-in\n for (const typeName in refTypes) {\n if (value instanceof refTypes[typeName]) {\n return storeRef(value, typeName);\n }\n }\n }\n value = serialize(value);\n }\n if (Array.isArray(value)) {\n const newValue = [];\n for (let key = 0; key < value.length; key++) {\n newValue[key] = toJson(value[key]);\n }\n value = newValue;\n\n } else {\n const newValue = {};\n // tslint:disable-next-line:no-for-in\n for (const key in value) {\n if (value.hasOwnProperty(key)) {\n newValue[key] = toJson(value[key]);\n }\n }\n value = newValue;\n }\n return value;\n }\n\n while (queue.length) {\n const obj = queue.shift();\n const str = toJson(obj, obj);\n json.push(str);\n }\n\n return json;\n };\n\n this.fromJson = function(json: object) {\n const refMap = {};\n\n function findDeserilizer(data, cls) {\n if (!cls || !cls._deserialize) {\n cls = CLASS_BY_TYPE_PROP[data.type]\n }\n return cls && cls._deserialize;\n }\n\n /**\n * Deserialize a data object.\n */\n function deserialize(cls, data, ctx) {\n const deserializer = findDeserilizer(data, cls);\n if (!deserializer) {\n return;\n }\n data = preDeserialize(data);\n let obj = deserializer(data, ctx, restoreRef);\n obj = postDeserialize(obj, data);\n return obj;\n }\n\n /**\n * Restore a ref object or deserialize a data object.\n *\n * This is passed as callback to class deserializers.\n */\n function restoreRef(cls, ref, ctx) {\n if (!ref.refIndex) {\n return cls && cls._deserialize && deserialize(cls, ref, ctx);\n }\n cls = restoreTypes[ref.refType] || cls;\n const index = ref.refIndex;\n if (!refMap[index]) {\n const data = json[index];\n const obj = deserialize(cls, data, ctx);\n refMap[index] = obj;\n }\n return refMap[index];\n }\n\n const root = rootClass._deserialize(json[0], null, restoreRef);\n\n return root;\n };\n}\n\nconst serializer = new Serializer();\n\nSerializer.toJson = serializer.toJson;\nSerializer.fromJson = serializer.fromJson;\n\nexport default Serializer;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nimport common from '../../util/common';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Contact from '../../dynamics/Contact';\nimport CircleShape from './CircleShape';\nimport Manifold, { ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact);\n\nfunction CircleCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == CircleShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE);\n CollideCircles(manifold, fixtureA.getShape() as CircleShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport function CollideCircles(manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n const pA = Transform.mulVec2(xfA, circleA.m_p);\n const pB = Transform.mulVec2(xfB, circleB.m_p);\n\n const distSqr = Vec2.distanceSquared(pB, pA);\n const rA = circleA.m_radius;\n const rB = circleB.m_radius;\n const radius = rA + rB;\n if (distSqr > radius * radius) {\n return;\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localPoint.setVec2(circleA.m_p);\n manifold.localNormal.setZero();\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Contact from '../../dynamics/Contact';\nimport EdgeShape from './EdgeShape';\nimport ChainShape from './ChainShape';\nimport CircleShape from './CircleShape';\nimport Manifold, { ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, CircleShape.TYPE, EdgeCircleContact);\nContact.addType(ChainShape.TYPE, CircleShape.TYPE, ChainCircleContact);\n\nfunction EdgeCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == EdgeShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const shapeA = fixtureA.getShape() as EdgeShape;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\nfunction ChainCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == ChainShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const chain = fixtureA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n const shapeA = edge;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\n// Compute contact points for edge versus circle.\n// This accounts for edge connectivity.\nexport function CollideEdgeCircle(manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle in frame of edge\n const Q = Transform.mulTVec2(xfA, Transform.mulVec2(xfB, circleB.m_p));\n\n const A = edgeA.m_vertex1;\n const B = edgeA.m_vertex2;\n const e = Vec2.sub(B, A);\n\n // Barycentric coordinates\n const u = Vec2.dot(e, Vec2.sub(B, Q));\n const v = Vec2.dot(e, Vec2.sub(Q, A));\n\n const radius = edgeA.m_radius + circleB.m_radius;\n\n // Region A\n if (v <= 0.0) {\n const P = Vec2.clone(A);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to A?\n if (edgeA.m_hasVertex0) {\n const A1 = edgeA.m_vertex0;\n const B1 = A;\n const e1 = Vec2.sub(B1, A1);\n const u1 = Vec2.dot(e1, Vec2.sub(B1, Q));\n\n // Is the circle in Region AB of the previous edge?\n if (u1 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region B\n if (u <= 0.0) {\n const P = Vec2.clone(B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to B?\n if (edgeA.m_hasVertex3) {\n const B2 = edgeA.m_vertex3;\n const A2 = B;\n const e2 = Vec2.sub(B2, A2);\n const v2 = Vec2.dot(e2, Vec2.sub(Q, A2));\n\n // Is the circle in Region AB of the next edge?\n if (v2 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 1;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region AB\n const den = Vec2.dot(e, e);\n _ASSERT && common.assert(den > 0.0);\n const P = Vec2.combine(u / den, A, v / den, B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n const n = Vec2.neo(-e.y, e.x);\n if (Vec2.dot(n, Vec2.sub(Q, A)) < 0.0) {\n n.setNum(-n.x, -n.y);\n }\n n.normalize();\n\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal = n;\n manifold.localPoint.setVec2(A);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_face;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Transform from '../../common/Transform';\nimport Rot from '../../common/Rot';\nimport Vec2 from '../../common/Vec2';\nimport Settings from '../../Settings';\nimport Manifold, { clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport Contact from '../../dynamics/Contact';\nimport PolygonShape from './PolygonShape';\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, PolygonShape.TYPE, PolygonContact);\n\nfunction PolygonContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == PolygonShape.TYPE);\n CollidePolygons(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as PolygonShape, xfB);\n}\n\ninterface MaxSeparation {\n maxSeparation: number;\n bestIndex: number;\n}\n\n/**\n * Find the max separation between poly1 and poly2 using edge normals from\n * poly1.\n */\nfunction findMaxSeparation(poly1: PolygonShape, xf1: Transform, poly2: PolygonShape, xf2: Transform, output: MaxSeparation): void {\n const count1 = poly1.m_count;\n const count2 = poly2.m_count;\n const n1s = poly1.m_normals;\n const v1s = poly1.m_vertices;\n const v2s = poly2.m_vertices;\n const xf = Transform.mulTXf(xf2, xf1);\n\n let bestIndex = 0;\n let maxSeparation = -Infinity;\n for (let i = 0; i < count1; ++i) {\n // Get poly1 normal in frame2.\n const n = Rot.mulVec2(xf.q, n1s[i]);\n const v1 = Transform.mulVec2(xf, v1s[i]);\n\n // Find deepest point for normal i.\n let si = Infinity;\n for (let j = 0; j < count2; ++j) {\n const sij = Vec2.dot(n, v2s[j]) - Vec2.dot(n, v1);\n if (sij < si) {\n si = sij;\n }\n }\n\n if (si > maxSeparation) {\n maxSeparation = si;\n bestIndex = i;\n }\n }\n\n // used to keep last FindMaxSeparation call values\n output.maxSeparation = maxSeparation;\n output.bestIndex = bestIndex;\n}\n\nfunction findIncidentEdge(c: ClipVertex[], poly1: PolygonShape, xf1: Transform, edge1: number, poly2: PolygonShape, xf2: Transform): void {\n const normals1 = poly1.m_normals;\n\n const count2 = poly2.m_count;\n const vertices2 = poly2.m_vertices;\n const normals2 = poly2.m_normals;\n\n _ASSERT && common.assert(0 <= edge1 && edge1 < poly1.m_count);\n\n // Get the normal of the reference edge in poly2's frame.\n const normal1 = Rot.mulTVec2(xf2.q, Rot.mulVec2(xf1.q, normals1[edge1]));\n\n // Find the incident edge on poly2.\n let index = 0;\n let minDot = Infinity;\n for (let i = 0; i < count2; ++i) {\n const dot = Vec2.dot(normal1, normals2[i]);\n if (dot < minDot) {\n minDot = dot;\n index = i;\n }\n }\n\n // Build the clip vertices for the incident edge.\n const i1 = index;\n const i2 = i1 + 1 < count2 ? i1 + 1 : 0;\n\n c[0].v = Transform.mulVec2(xf2, vertices2[i1]);\n c[0].id.cf.indexA = edge1;\n c[0].id.cf.indexB = i1;\n c[0].id.cf.typeA = ContactFeatureType.e_face;\n c[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n c[1].v = Transform.mulVec2(xf2, vertices2[i2]);\n c[1].id.cf.indexA = edge1;\n c[1].id.cf.indexB = i2;\n c[1].id.cf.typeA = ContactFeatureType.e_face;\n c[1].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n\nconst maxSeparation = {\n maxSeparation: 0,\n bestIndex: 0,\n};\n\n/**\n *\n * Find edge normal of max separation on A - return if separating axis is found
\n * Find edge normal of max separation on B - return if separation axis is found
\n * Choose reference edge as min(minA, minB)
\n * Find incident edge
\n * Clip\n *\n * The normal points from 1 to 2\n */\nexport function CollidePolygons(manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform): void {\n manifold.pointCount = 0;\n const totalRadius = polyA.m_radius + polyB.m_radius;\n\n findMaxSeparation(polyA, xfA, polyB, xfB, maxSeparation);\n const edgeA = maxSeparation.bestIndex;\n const separationA = maxSeparation.maxSeparation;\n if (separationA > totalRadius)\n return;\n\n findMaxSeparation(polyB, xfB, polyA, xfA, maxSeparation);\n const edgeB = maxSeparation.bestIndex;\n const separationB = maxSeparation.maxSeparation;\n if (separationB > totalRadius)\n return;\n\n let poly1; // reference polygon\n let poly2; // incident polygon\n let xf1;\n let xf2;\n let edge1; // reference edge\n let flip;\n const k_tol = 0.1 * Settings.linearSlop;\n\n if (separationB > separationA + k_tol) {\n poly1 = polyB;\n poly2 = polyA;\n xf1 = xfB;\n xf2 = xfA;\n edge1 = edgeB;\n manifold.type = ManifoldType.e_faceB;\n flip = 1;\n } else {\n poly1 = polyA;\n poly2 = polyB;\n xf1 = xfA;\n xf2 = xfB;\n edge1 = edgeA;\n manifold.type = ManifoldType.e_faceA;\n flip = 0;\n }\n\n const incidentEdge = [ new ClipVertex(), new ClipVertex() ];\n findIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);\n\n const count1 = poly1.m_count;\n const vertices1 = poly1.m_vertices;\n\n const iv1 = edge1;\n const iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0;\n\n let v11 = vertices1[iv1];\n let v12 = vertices1[iv2];\n\n const localTangent = Vec2.sub(v12, v11);\n localTangent.normalize();\n\n const localNormal = Vec2.crossVec2Num(localTangent, 1.0);\n const planePoint = Vec2.combine(0.5, v11, 0.5, v12);\n\n const tangent = Rot.mulVec2(xf1.q, localTangent);\n const normal = Vec2.crossVec2Num(tangent, 1.0);\n\n v11 = Transform.mulVec2(xf1, v11);\n v12 = Transform.mulVec2(xf1, v12);\n\n // Face offset.\n const frontOffset = Vec2.dot(normal, v11);\n\n // Side offsets, extended by polytope skin thickness.\n const sideOffset1 = -Vec2.dot(tangent, v11) + totalRadius;\n const sideOffset2 = Vec2.dot(tangent, v12) + totalRadius;\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, incidentEdge, Vec2.neg(tangent), sideOffset1, iv1);\n\n if (np < 2) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2);\n\n if (np < 2) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n manifold.localNormal = localNormal;\n manifold.localPoint = planePoint;\n\n let pointCount = 0;\n for (let i = 0; i < clipPoints2.length/* maxManifoldPoints */; ++i) {\n const separation = Vec2.dot(normal, clipPoints2[i].v) - frontOffset;\n\n if (separation <= totalRadius) {\n const cp = manifold.points[pointCount];\n cp.localPoint.setVec2(Transform.mulTVec2(xf2, clipPoints2[i].v));\n cp.id = clipPoints2[i].id;\n if (flip) {\n // Swap features\n const cf = cp.id.cf;\n const indexA = cf.indexA;\n const indexB = cf.indexB;\n const typeA = cf.typeA;\n const typeB = cf.typeB;\n cf.indexA = indexB;\n cf.indexB = indexA;\n cf.typeA = typeB;\n cf.typeB = typeA;\n }\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Math from '../../common/Math';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Settings from '../../Settings';\nimport Contact from '../../dynamics/Contact';\nimport Manifold, { clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport EdgeShape from './EdgeShape';\nimport ChainShape from './ChainShape';\nimport PolygonShape from './PolygonShape';\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, PolygonShape.TYPE, EdgePolygonContact);\nContact.addType(ChainShape.TYPE, PolygonShape.TYPE, ChainPolygonContact);\n\nfunction EdgePolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fA.getType() == EdgeShape.TYPE);\n _ASSERT && common.assert(fB.getType() == PolygonShape.TYPE);\n\n CollideEdgePolygon(manifold, fA.getShape() as EdgeShape, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nfunction ChainPolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fA.getType() == ChainShape.TYPE);\n _ASSERT && common.assert(fB.getType() == PolygonShape.TYPE);\n\n const chain = fA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n CollideEdgePolygon(manifold, edge, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nenum EPAxisType {\n e_unknown = -1,\n e_edgeA = 1,\n e_edgeB = 2,\n}\n\n// unused?\nenum VertexType {\n e_isolated = 0,\n e_concave = 1,\n e_convex = 2,\n}\n\n/**\n * This structure is used to keep track of the best separating axis.\n */\nclass EPAxis {\n type: EPAxisType;\n index: number;\n separation: number;\n}\n\n/**\n * This holds polygon B expressed in frame A.\n */\nclass TempPolygon {\n vertices: Vec2[] = []; // [Settings.maxPolygonVertices]\n normals: Vec2[] = []; // [Settings.maxPolygonVertices];\n count: number = 0;\n}\n\n/**\n * Reference face used for clipping\n */\nclass ReferenceFace {\n i1: number;\n i2: number;\n v1: Vec2;\n v2: Vec2;\n normal: Vec2 = Vec2.zero();\n sideNormal1: Vec2 = Vec2.zero();\n sideOffset1: number;\n sideNormal2: Vec2 = Vec2.zero();\n sideOffset2: number;\n}\n\n// reused\nconst edgeAxis = new EPAxis();\nconst polygonAxis = new EPAxis();\nconst polygonBA = new TempPolygon();\nconst rf = new ReferenceFace();\n\n/**\n * This function collides and edge and a polygon, taking into account edge\n * adjacency.\n */\nexport function CollideEdgePolygon(manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform): void {\n // Algorithm:\n // 1. Classify v1 and v2\n // 2. Classify polygon centroid as front or back\n // 3. Flip normal if necessary\n // 4. Initialize normal range to [-pi, pi] about face normal\n // 5. Adjust normal range according to adjacent edges\n // 6. Visit each separating axes, only accept axes within the range\n // 7. Return if _any_ axis indicates separation\n // 8. Clip\n\n // let m_type1: VertexType;\n // let m_type2: VertexType;\n\n const xf = Transform.mulTXf(xfA, xfB);\n\n const centroidB = Transform.mulVec2(xf, polygonB.m_centroid);\n\n const v0 = edgeA.m_vertex0;\n const v1 = edgeA.m_vertex1;\n const v2 = edgeA.m_vertex2;\n const v3 = edgeA.m_vertex3;\n\n const hasVertex0 = edgeA.m_hasVertex0;\n const hasVertex3 = edgeA.m_hasVertex3;\n\n const edge1 = Vec2.sub(v2, v1);\n edge1.normalize();\n const normal1 = Vec2.neo(edge1.y, -edge1.x);\n const offset1 = Vec2.dot(normal1, Vec2.sub(centroidB, v1));\n let offset0 = 0.0;\n let offset2 = 0.0;\n let convex1 = false;\n let convex2 = false;\n\n let normal0;\n let normal2;\n\n // Is there a preceding edge?\n if (hasVertex0) {\n const edge0 = Vec2.sub(v1, v0);\n edge0.normalize();\n normal0 = Vec2.neo(edge0.y, -edge0.x);\n convex1 = Vec2.crossVec2Vec2(edge0, edge1) >= 0.0;\n offset0 = Vec2.dot(normal0, centroidB) - Vec2.dot(normal0, v0);\n }\n\n // Is there a following edge?\n if (hasVertex3) {\n const edge2 = Vec2.sub(v3, v2);\n edge2.normalize();\n normal2 = Vec2.neo(edge2.y, -edge2.x);\n convex2 = Vec2.crossVec2Vec2(edge1, edge2) > 0.0;\n offset2 = Vec2.dot(normal2, centroidB) - Vec2.dot(normal2, v2);\n }\n\n let front;\n const normal = Vec2.zero();\n const lowerLimit = Vec2.zero();\n const upperLimit = Vec2.zero();\n\n // Determine front or back collision. Determine collision normal limits.\n if (hasVertex0 && hasVertex3) {\n if (convex1 && convex2) {\n front = offset0 >= 0.0 || offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex1) {\n front = offset0 >= 0.0 || (offset1 >= 0.0 && offset2 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex2) {\n front = offset2 >= 0.0 || (offset0 >= 0.0 && offset1 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal0);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex0) {\n if (convex1) {\n front = offset0 >= 0.0 || offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex3) {\n if (convex2) {\n front = offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n }\n } else {\n front = offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setVec2(normal1);\n }\n }\n } else {\n front = offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n }\n }\n\n // Get polygonB in frameA\n polygonBA.count = polygonB.m_count;\n for (let i = 0; i < polygonB.m_count; ++i) {\n polygonBA.vertices[i] = Transform.mulVec2(xf, polygonB.m_vertices[i]);\n polygonBA.normals[i] = Rot.mulVec2(xf.q, polygonB.m_normals[i]);\n }\n\n const radius = 2.0 * Settings.polygonRadius;\n\n manifold.pointCount = 0;\n\n { // ComputeEdgeSeparation\n edgeAxis.type = EPAxisType.e_edgeA;\n edgeAxis.index = front ? 0 : 1;\n edgeAxis.separation = Infinity;\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const s = Vec2.dot(normal, Vec2.sub(polygonBA.vertices[i], v1));\n if (s < edgeAxis.separation) {\n edgeAxis.separation = s;\n }\n }\n }\n\n // If no valid normal can be found than this edge should not collide.\n // @ts-ignore\n if (edgeAxis.type == EPAxisType.e_unknown) {\n return;\n }\n\n if (edgeAxis.separation > radius) {\n return;\n }\n\n { // ComputePolygonSeparation\n polygonAxis.type = EPAxisType.e_unknown;\n polygonAxis.index = -1;\n polygonAxis.separation = -Infinity;\n\n const perp = Vec2.neo(-normal.y, normal.x);\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const n = Vec2.neg(polygonBA.normals[i]);\n\n const s1 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v1));\n const s2 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v2));\n const s = Math.min(s1, s2);\n\n if (s > radius) {\n // No collision\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n break;\n }\n\n // Adjacency\n if (Vec2.dot(n, perp) >= 0.0) {\n if (Vec2.dot(Vec2.sub(n, upperLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n } else {\n if (Vec2.dot(Vec2.sub(n, lowerLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n }\n\n if (s > polygonAxis.separation) {\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n }\n }\n }\n\n if (polygonAxis.type != EPAxisType.e_unknown && polygonAxis.separation > radius) {\n return;\n }\n\n // Use hysteresis for jitter reduction.\n const k_relativeTol = 0.98;\n const k_absoluteTol = 0.001;\n\n let primaryAxis;\n if (polygonAxis.type == EPAxisType.e_unknown) {\n primaryAxis = edgeAxis;\n } else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) {\n primaryAxis = polygonAxis;\n } else {\n primaryAxis = edgeAxis;\n }\n\n const ie = [ new ClipVertex(), new ClipVertex() ];\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.type = ManifoldType.e_faceA;\n\n // Search for the polygon normal that is most anti-parallel to the edge\n // normal.\n let bestIndex = 0;\n let bestValue = Vec2.dot(normal, polygonBA.normals[0]);\n for (let i = 1; i < polygonBA.count; ++i) {\n const value = Vec2.dot(normal, polygonBA.normals[i]);\n if (value < bestValue) {\n bestValue = value;\n bestIndex = i;\n }\n }\n\n const i1 = bestIndex;\n const i2 = i1 + 1 < polygonBA.count ? i1 + 1 : 0;\n\n ie[0].v = polygonBA.vertices[i1];\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = i1;\n ie[0].id.cf.typeA = ContactFeatureType.e_face;\n ie[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n ie[1].v = polygonBA.vertices[i2];\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = i2;\n ie[1].id.cf.typeA = ContactFeatureType.e_face;\n ie[1].id.cf.typeB = ContactFeatureType.e_vertex;\n\n if (front) {\n rf.i1 = 0;\n rf.i2 = 1;\n rf.v1 = v1;\n rf.v2 = v2;\n rf.normal.setVec2(normal1);\n } else {\n rf.i1 = 1;\n rf.i2 = 0;\n rf.v1 = v2;\n rf.v2 = v1;\n rf.normal.setMul(-1, normal1);\n }\n } else {\n manifold.type = ManifoldType.e_faceB;\n\n ie[0].v = v1;\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = primaryAxis.index;\n ie[0].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[0].id.cf.typeB = ContactFeatureType.e_face;\n\n ie[1].v = v2;\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = primaryAxis.index;\n ie[1].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[1].id.cf.typeB = ContactFeatureType.e_face;\n\n rf.i1 = primaryAxis.index;\n rf.i2 = rf.i1 + 1 < polygonBA.count ? rf.i1 + 1 : 0;\n rf.v1 = polygonBA.vertices[rf.i1];\n rf.v2 = polygonBA.vertices[rf.i2];\n rf.normal.setVec2(polygonBA.normals[rf.i1]);\n }\n\n rf.sideNormal1.setNum(rf.normal.y, -rf.normal.x);\n rf.sideNormal2.setMul(-1, rf.sideNormal1);\n rf.sideOffset1 = Vec2.dot(rf.sideNormal1, rf.v1);\n rf.sideOffset2 = Vec2.dot(rf.sideNormal2, rf.v2);\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.localNormal = Vec2.clone(rf.normal);\n manifold.localPoint = Vec2.clone(rf.v1);\n } else {\n manifold.localNormal = Vec2.clone(polygonB.m_normals[rf.i1]);\n manifold.localPoint = Vec2.clone(polygonB.m_vertices[rf.i1]);\n }\n\n let pointCount = 0;\n for (let i = 0; i < Settings.maxManifoldPoints; ++i) {\n const separation = Vec2.dot(rf.normal, Vec2.sub(clipPoints2[i].v, rf.v1));\n\n if (separation <= radius) {\n const cp = manifold.points[pointCount]; // ManifoldPoint\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n cp.localPoint = Transform.mulTVec2(xf, clipPoints2[i].v);\n cp.id = clipPoints2[i].id;\n } else {\n cp.localPoint = clipPoints2[i].v;\n cp.id.cf.typeA = clipPoints2[i].id.cf.typeB;\n cp.id.cf.typeB = clipPoints2[i].id.cf.typeA;\n cp.id.cf.indexA = clipPoints2[i].id.cf.indexB;\n cp.id.cf.indexB = clipPoints2[i].id.cf.indexA;\n }\n\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Math from '../../common/Math';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Contact from '../../dynamics/Contact';\nimport CircleShape from './CircleShape';\nimport PolygonShape from './PolygonShape';\nimport Manifold, { ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, CircleShape.TYPE, PolygonCircleContact);\n\nfunction PolygonCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE);\n CollidePolygonCircle(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport function CollidePolygonCircle(manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle position in the frame of the polygon.\n const c = Transform.mulVec2(xfB, circleB.m_p);\n const cLocal = Transform.mulTVec2(xfA, c);\n\n // Find the min separating edge.\n let normalIndex = 0;\n let separation = -Infinity;\n const radius = polygonA.m_radius + circleB.m_radius;\n const vertexCount = polygonA.m_count;\n const vertices = polygonA.m_vertices;\n const normals = polygonA.m_normals;\n\n for (let i = 0; i < vertexCount; ++i) {\n const s = Vec2.dot(normals[i], Vec2.sub(cLocal, vertices[i]));\n\n if (s > radius) {\n // Early out.\n return;\n }\n\n if (s > separation) {\n separation = s;\n normalIndex = i;\n }\n }\n\n // Vertices that subtend the incident face.\n const vertIndex1 = normalIndex;\n const vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0;\n const v1 = vertices[vertIndex1];\n const v2 = vertices[vertIndex2];\n\n // If the center is inside the polygon ...\n if (separation < Math.EPSILON) {\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[normalIndex]);\n manifold.localPoint.setCombine(0.5, v1, 0.5, v2);\n manifold.points[0].localPoint = circleB.m_p;\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Compute barycentric coordinates\n const u1 = Vec2.dot(Vec2.sub(cLocal, v1), Vec2.sub(v2, v1));\n const u2 = Vec2.dot(Vec2.sub(cLocal, v2), Vec2.sub(v1, v2));\n if (u1 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v1) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v1);\n manifold.localNormal.normalize();\n manifold.localPoint = v1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else if (u2 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v2) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v2);\n manifold.localNormal.normalize();\n manifold.localPoint.setVec2(v2);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else {\n const faceCenter = Vec2.mid(v1, v2);\n const separation = Vec2.dot(cLocal, normals[vertIndex1]) - Vec2.dot(faceCenter, normals[vertIndex1]);\n if (separation > radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[vertIndex1]);\n manifold.localPoint.setVec2(faceCenter);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n }\n}\n","export { default as Serializer } from './serializer/index';\n\nexport { default as Math } from './common/Math';\nexport { default as Vec2 } from './common/Vec2';\nexport { default as Vec3 } from './common/Vec3';\nexport { default as Mat22 } from './common/Mat22';\nexport { default as Mat33 } from './common/Mat33';\nexport { default as Transform } from './common/Transform';\nexport { default as Rot } from './common/Rot';\n\nexport { default as AABB } from './collision/AABB';\n\nexport { default as Shape } from './collision/Shape';\nexport { default as Fixture } from './dynamics/Fixture';\nexport { default as Body } from './dynamics/Body';\nexport { default as Contact } from './dynamics/Contact';\nexport { default as Joint } from './dynamics/Joint';\nexport { default as World } from './dynamics/World';\n\nexport { default as Circle } from './collision/shape/CircleShape';\nexport { default as Edge } from './collision/shape/EdgeShape';\nexport { default as Polygon } from './collision/shape/PolygonShape';\nexport { default as Chain } from './collision/shape/ChainShape';\nexport { default as Box } from './collision/shape/BoxShape';\n\nexport { CollideCircles } from './collision/shape/CollideCircle';\nexport { CollideEdgeCircle } from './collision/shape/CollideEdgeCircle';\nexport { CollidePolygons } from './collision/shape/CollidePolygon';\nexport { CollidePolygonCircle } from './collision/shape/CollideCirclePolygone';\nexport { CollideEdgePolygon } from './collision/shape/CollideEdgePolygon';\n\nexport { default as DistanceJoint } from './dynamics/joint/DistanceJoint';\nexport { default as FrictionJoint } from './dynamics/joint/FrictionJoint';\nexport { default as GearJoint } from './dynamics/joint/GearJoint';\nexport { default as MotorJoint } from './dynamics/joint/MotorJoint';\nexport { default as MouseJoint } from './dynamics/joint/MouseJoint';\nexport { default as PrismaticJoint } from './dynamics/joint/PrismaticJoint';\nexport { default as PulleyJoint } from './dynamics/joint/PulleyJoint';\nexport { default as RevoluteJoint } from './dynamics/joint/RevoluteJoint';\nexport { default as RopeJoint } from './dynamics/joint/RopeJoint';\nexport { default as WeldJoint } from './dynamics/joint/WeldJoint';\nexport { default as WheelJoint } from './dynamics/joint/WheelJoint';\n\nexport { default as Settings } from './Settings';\n\nexport { default as Sweep } from './common/Sweep';\nexport { default as Manifold } from './collision/Manifold';\nexport { default as Distance } from './collision/Distance';\nexport { default as TimeOfImpact } from './collision/TimeOfImpact';\nexport { default as DynamicTree } from './collision/DynamicTree';\n\nimport Solver, { TimeStep } from './dynamics/Solver';\nimport { CollidePolygons } from './collision/shape/CollidePolygon';\nimport { default as Settings } from './Settings';\nimport { default as Sweep } from './common/Sweep';\nimport { default as Manifold } from './collision/Manifold';\nimport { default as Distance, DistanceInput, DistanceOutput, DistanceProxy, SimplexCache, testOverlap } from './collision/Distance';\nimport { default as TimeOfImpact, TOIInput, TOIOutput } from './collision/TimeOfImpact';\nimport { default as DynamicTree } from './collision/DynamicTree';\n\nimport { default as stats } from './util/stats'; // todo: what to do with this?\n\nimport { ContactImpulse } from './dynamics/Solver';\ntype _ContactImpulse = InstanceType;\nexport type { _ContactImpulse as ContactImpulse }\n\n/** @deprecated Merged with main namespace */\nexport const internal = {};\n\n// @ts-ignore\ninternal.CollidePolygons = CollidePolygons;\n// @ts-ignore\ninternal.Settings = Settings;\n// @ts-ignore\ninternal.Sweep = Sweep;\n// @ts-ignore\ninternal.Manifold = Manifold;\n// @ts-ignore\ninternal.Distance = Distance;\n// @ts-ignore\ninternal.TimeOfImpact = TimeOfImpact;\n// @ts-ignore\ninternal.DynamicTree = DynamicTree;\n// @ts-ignore\ninternal.stats = stats;\n\n// @ts-ignore\nSolver.TimeStep = TimeStep;\n\n// @ts-ignore\nDistance.testOverlap = testOverlap;\n// @ts-ignore\nDistance.Input = DistanceInput;\n// @ts-ignore\nDistance.Output = DistanceOutput;\n// @ts-ignore\nDistance.Proxy = DistanceProxy;\n// @ts-ignore\nDistance.Cache = SimplexCache;\n\n// @ts-ignore\nTimeOfImpact.Input = TOIInput;\n// @ts-ignore\nTimeOfImpact.Output = TOIOutput;\n","module.exports = {};\n","module.exports = function(base) {\n for (var i = 1; i < arguments.length; i++) {\n var obj = arguments[i];\n for ( var key in obj) {\n if (obj.hasOwnProperty(key)) {\n base[key] = obj[key];\n }\n }\n }\n return base;\n};\n","/**\n * ! is the definitive JavaScript type testing library\n * \n * @copyright 2013-2014 Enrico Marino / Jordan Harband\n * @license MIT\n */\n\nvar objProto = Object.prototype;\nvar owns = objProto.hasOwnProperty;\nvar toStr = objProto.toString;\n\nvar NON_HOST_TYPES = {\n 'boolean' : 1,\n 'number' : 1,\n 'string' : 1,\n 'undefined' : 1\n};\n\nvar hexRegex = /^[A-Fa-f0-9]+$/;\n\nvar is = module.exports = {};\n\nis.a = is.an = is.type = function(value, type) {\n return typeof value === type;\n};\n\nis.defined = function(value) {\n return typeof value !== 'undefined';\n};\n\nis.empty = function(value) {\n var type = toStr.call(value);\n var key;\n\n if ('[object Array]' === type || '[object Arguments]' === type\n || '[object String]' === type) {\n return value.length === 0;\n }\n\n if ('[object Object]' === type) {\n for (key in value) {\n if (owns.call(value, key)) {\n return false;\n }\n }\n return true;\n }\n\n return !value;\n};\n\nis.equal = function(value, other) {\n if (value === other) {\n return true;\n }\n\n var type = toStr.call(value);\n var key;\n\n if (type !== toStr.call(other)) {\n return false;\n }\n\n if ('[object Object]' === type) {\n for (key in value) {\n if (!is.equal(value[key], other[key]) || !(key in other)) {\n return false;\n }\n }\n for (key in other) {\n if (!is.equal(value[key], other[key]) || !(key in value)) {\n return false;\n }\n }\n return true;\n }\n\n if ('[object Array]' === type) {\n key = value.length;\n if (key !== other.length) {\n return false;\n }\n while (--key) {\n if (!is.equal(value[key], other[key])) {\n return false;\n }\n }\n return true;\n }\n\n if ('[object Function]' === type) {\n return value.prototype === other.prototype;\n }\n\n if ('[object Date]' === type) {\n return value.getTime() === other.getTime();\n }\n\n return false;\n};\n\nis.instance = function(value, constructor) {\n return value instanceof constructor;\n};\n\nis.nil = function(value) {\n return value === null;\n};\n\nis.undef = function(value) {\n return typeof value === 'undefined';\n};\n\nis.array = function(value) {\n return '[object Array]' === toStr.call(value);\n};\n\nis.emptyarray = function(value) {\n return is.array(value) && value.length === 0;\n};\n\nis.arraylike = function(value) {\n return !!value && !is.boolean(value) && owns.call(value, 'length')\n && isFinite(value.length) && is.number(value.length) && value.length >= 0;\n};\n\nis.boolean = function(value) {\n return '[object Boolean]' === toStr.call(value);\n};\n\nis.element = function(value) {\n return value !== undefined && typeof HTMLElement !== 'undefined'\n && value instanceof HTMLElement && value.nodeType === 1;\n};\n\nis.fn = function(value) {\n return '[object Function]' === toStr.call(value);\n};\n\nis.number = function(value) {\n return '[object Number]' === toStr.call(value);\n};\n\nis.nan = function(value) {\n return !is.number(value) || value !== value;\n};\n\nis.object = function(value) {\n return '[object Object]' === toStr.call(value);\n};\n\nis.hash = function(value) {\n return is.object(value) && value.constructor === Object && !value.nodeType\n && !value.setInterval;\n};\n\nis.regexp = function(value) {\n return '[object RegExp]' === toStr.call(value);\n};\n\nis.string = function(value) {\n return '[object String]' === toStr.call(value);\n};\n\nis.hex = function(value) {\n return is.string(value) && (!value.length || hexRegex.test(value));\n};\n","if (typeof DEBUG === 'undefined')\n DEBUG = true;\n\nvar stats = require('./util/stats');\nvar extend = require('./util/extend');\nvar is = require('./util/is');\nvar _await = require('./util/await');\n\nstats.create = 0;\n\nfunction Class(arg) {\n if (!(this instanceof Class)) {\n if (is.fn(arg)) {\n return Class.app.apply(Class, arguments);\n } else if (is.object(arg)) {\n return Class.atlas.apply(Class, arguments);\n } else {\n return arg;\n }\n }\n\n stats.create++;\n\n for (var i = 0; i < _init.length; i++) {\n _init[i].call(this);\n }\n}\n\nvar _init = [];\n\nClass._init = function(fn) {\n _init.push(fn);\n};\n\nvar _load = [];\n\nClass._load = function(fn) {\n _load.push(fn);\n};\n\nvar _config = {};\n\nClass.config = function() {\n if (arguments.length === 1 && is.string(arguments[0])) {\n return _config[arguments[0]];\n }\n if (arguments.length === 1 && is.object(arguments[0])) {\n extend(_config, arguments[0]);\n }\n if (arguments.length === 2 && is.string(arguments[0])) {\n _config[arguments[0], arguments[1]];\n }\n};\n\nvar _app_queue = [];\nvar _preload_queue = [];\nvar _stages = [];\nvar _loaded = false;\nvar _paused = false;\n\nClass.app = function(app, opts) {\n if (!_loaded) {\n _app_queue.push(arguments);\n return;\n }\n DEBUG && console.log('Creating app...');\n var loader = Class.config('app-loader');\n loader(function(stage, canvas) {\n DEBUG && console.log('Initing app...');\n for (var i = 0; i < _load.length; i++) {\n _load[i].call(this, stage, canvas);\n }\n app(stage, canvas);\n _stages.push(stage);\n DEBUG && console.log('Starting app...');\n stage.start();\n }, opts);\n};\n\nvar loading = _await();\n\nClass.preload = function(load) {\n if (typeof load === 'string') {\n var url = Class.resolve(load);\n if (/\\.js($|\\?|\\#)/.test(url)) {\n DEBUG && console.log('Loading script: ' + url);\n load = function(callback) {\n loadScript(url, callback);\n };\n }\n }\n if (typeof load !== 'function') {\n return;\n }\n // if (!_started) {\n // _preload_queue.push(load);\n // return;\n // }\n load(loading());\n};\n\nClass.start = function(config) {\n DEBUG && console.log('Starting...');\n\n Class.config(config);\n\n // DEBUG && console.log('Preloading...');\n // _started = true;\n // while (_preload_queue.length) {\n // var load = _preload_queue.shift();\n // load(loading());\n // }\n\n loading.then(function() {\n DEBUG && console.log('Loading apps...');\n _loaded = true;\n while (_app_queue.length) {\n var args = _app_queue.shift();\n Class.app.apply(Class, args);\n }\n });\n};\n\nClass.pause = function() {\n if (!_paused) {\n _paused = true;\n for (var i = _stages.length - 1; i >= 0; i--) {\n _stages[i].pause();\n }\n }\n};\n\nClass.resume = function() {\n if (_paused) {\n _paused = false;\n for (var i = _stages.length - 1; i >= 0; i--) {\n _stages[i].resume();\n }\n }\n};\n\nClass.create = function() {\n return new Class();\n};\n\nClass.resolve = (function() {\n\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return function(url) {\n return url;\n };\n }\n\n var scripts = document.getElementsByTagName('script');\n\n function getScriptSrc() {\n // HTML5\n if (document.currentScript) {\n return document.currentScript.src;\n }\n\n // IE>=10\n var stack;\n try {\n var err = new Error();\n if (err.stack) {\n stack = err.stack;\n } else {\n throw err;\n }\n } catch (err) {\n stack = err.stack;\n }\n if (typeof stack === 'string') {\n stack = stack.split('\\n');\n // Uses the last line, where the call started\n for (var i = stack.length; i--;) {\n var url = stack[i].match(/(\\w+\\:\\/\\/[^/]*?\\/.+?)(:\\d+)(:\\d+)?/);\n if (url) {\n return url[1];\n }\n }\n }\n\n // IE<11\n if (scripts.length && 'readyState' in scripts[0]) {\n for (var i = scripts.length; i--;) {\n if (scripts[i].readyState === 'interactive') {\n return scripts[i].src;\n }\n }\n }\n\n return location.href;\n }\n\n return function(url) {\n if (/^\\.\\//.test(url)) {\n var src = getScriptSrc();\n var base = src.substring(0, src.lastIndexOf('/') + 1);\n url = base + url.substring(2);\n // } else if (/^\\.\\.\\//.test(url)) {\n // url = base + url;\n }\n return url;\n };\n})();\n\nmodule.exports = Class;\n\nfunction loadScript(src, callback) {\n var el = document.createElement('script');\n el.addEventListener('load', function() {\n callback();\n });\n el.addEventListener('error', function(err) {\n callback(err || 'Error loading script: ' + src);\n });\n el.src = src;\n el.id = 'preload-' + Date.now();\n document.body.appendChild(el);\n};","module.exports = function() {\n var count = 0;\n function fork(fn, n) {\n count += n = (typeof n === 'number' && n >= 1 ? n : 1);\n return function() {\n fn && fn.apply(this, arguments);\n if (n > 0) {\n n--, count--, call();\n }\n };\n }\n var then = [];\n function call() {\n if (count === 0) {\n while (then.length) {\n setTimeout(then.shift(), 0);\n }\n }\n }\n fork.then = function(fn) {\n if (count === 0) {\n setTimeout(fn, 0);\n } else {\n then.push(fn);\n }\n };\n return fork;\n};","function Matrix(a, b, c, d, e, f) {\n this.reset(a, b, c, d, e, f);\n};\n\nMatrix.prototype.toString = function() {\n return '[' + this.a + ', ' + this.b + ', ' + this.c + ', ' + this.d + ', '\n + this.e + ', ' + this.f + ']';\n};\n\nMatrix.prototype.clone = function() {\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n};\n\nMatrix.prototype.reset = function(a, b, c, d, e, f) {\n this._dirty = true;\n if (typeof a === 'object') {\n this.a = a.a, this.d = a.d;\n this.b = a.b, this.c = a.c;\n this.e = a.e, this.f = a.f;\n } else {\n this.a = a || 1, this.d = d || 1;\n this.b = b || 0, this.c = c || 0;\n this.e = e || 0, this.f = f || 0;\n }\n return this;\n};\n\nMatrix.prototype.identity = function() {\n this._dirty = true;\n this.a = 1;\n this.b = 0;\n this.c = 0;\n this.d = 1;\n this.e = 0;\n this.f = 0;\n return this;\n};\n\nMatrix.prototype.rotate = function(angle) {\n if (!angle) {\n return this;\n }\n\n this._dirty = true;\n\n var u = angle ? Math.cos(angle) : 1;\n // android bug may give bad 0 values\n var v = angle ? Math.sin(angle) : 0;\n\n var a = u * this.a - v * this.b;\n var b = u * this.b + v * this.a;\n var c = u * this.c - v * this.d;\n var d = u * this.d + v * this.c;\n var e = u * this.e - v * this.f;\n var f = u * this.f + v * this.e;\n\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n\n return this;\n};\n\nMatrix.prototype.translate = function(x, y) {\n if (!x && !y) {\n return this;\n }\n this._dirty = true;\n this.e += x;\n this.f += y;\n return this;\n};\n\nMatrix.prototype.scale = function(x, y) {\n if (!(x - 1) && !(y - 1)) {\n return this;\n }\n this._dirty = true;\n this.a *= x;\n this.b *= y;\n this.c *= x;\n this.d *= y;\n this.e *= x;\n this.f *= y;\n return this;\n};\n\nMatrix.prototype.skew = function(x, y) {\n if (!x && !y) {\n return this;\n }\n this._dirty = true;\n\n var a = this.a + this.b * x;\n var b = this.b + this.a * y;\n var c = this.c + this.d * x;\n var d = this.d + this.c * y;\n var e = this.e + this.f * x;\n var f = this.f + this.e * y;\n\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n return this;\n};\n\nMatrix.prototype.concat = function(m) {\n this._dirty = true;\n\n var n = this;\n\n var a = n.a * m.a + n.b * m.c;\n var b = n.b * m.d + n.a * m.b;\n var c = n.c * m.a + n.d * m.c;\n var d = n.d * m.d + n.c * m.b;\n var e = n.e * m.a + m.e + n.f * m.c;\n var f = n.f * m.d + m.f + n.e * m.b;\n\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n\n return this;\n};\n\nMatrix.prototype.inverse = Matrix.prototype.reverse = function() {\n if (this._dirty) {\n this._dirty = false;\n this.inversed = this.inversed || new Matrix();\n var z = this.a * this.d - this.b * this.c;\n this.inversed.a = this.d / z;\n this.inversed.b = -this.b / z;\n this.inversed.c = -this.c / z;\n this.inversed.d = this.a / z;\n this.inversed.e = (this.c * this.f - this.e * this.d) / z;\n this.inversed.f = (this.e * this.b - this.a * this.f) / z;\n }\n return this.inversed;\n};\n\nMatrix.prototype.map = function(p, q) {\n q = q || {};\n q.x = this.a * p.x + this.c * p.y + this.e;\n q.y = this.b * p.x + this.d * p.y + this.f;\n return q;\n};\n\nMatrix.prototype.mapX = function(x, y) {\n if (typeof x === 'object')\n y = x.y, x = x.x;\n return this.a * x + this.c * y + this.e;\n};\n\nMatrix.prototype.mapY = function(x, y) {\n if (typeof x === 'object')\n y = x.y, x = x.x;\n return this.b * x + this.d * y + this.f;\n};\n\nmodule.exports = Matrix;\n","if (typeof Object.create == 'function') {\n module.exports = function(proto, props) {\n return Object.create.call(Object, proto, props);\n };\n} else {\n module.exports = function(proto, props) {\n if (props)\n throw Error('Second argument is not supported!');\n if (typeof proto !== 'object' || proto === null)\n throw Error('Invalid prototype!');\n noop.prototype = proto;\n return new noop;\n };\n function noop() {\n }\n}\n","var create = require('./create');\nvar native = Math;\n\nmodule.exports = create(Math);\n\nmodule.exports.random = function(min, max) {\n if (typeof min === 'undefined') {\n max = 1, min = 0;\n } else if (typeof max === 'undefined') {\n max = min, min = 0;\n }\n return min == max ? min : native.random() * (max - min) + min;\n};\n\nmodule.exports.rotate = function(num, min, max) {\n if (typeof min === 'undefined') {\n max = 1, min = 0;\n } else if (typeof max === 'undefined') {\n max = min, min = 0;\n }\n if (max > min) {\n num = (num - min) % (max - min);\n return num + (num < 0 ? max : min);\n } else {\n num = (num - max) % (min - max);\n return num + (num <= 0 ? min : max);\n }\n};\n\nmodule.exports.limit = function(num, min, max) {\n if (num < min) {\n return min;\n } else if (num > max) {\n return max;\n } else {\n return num;\n }\n};\n\nmodule.exports.length = function(x, y) {\n return native.sqrt(x * x + y * y);\n};","var stats = require('./util/stats');\nvar math = require('./util/math');\n\nfunction Texture(image, ratio) {\n if (typeof image === 'object') {\n this.src(image, ratio);\n }\n}\n\nTexture.prototype.pipe = function() {\n return new Texture(this);\n};\n\n/**\n * Signatures: (image), (x, y, w, h), (w, h)\n */\nTexture.prototype.src = function(x, y, w, h) {\n if (typeof x === 'object') {\n var image = x, ratio = y || 1;\n\n this._image = image;\n this._sx = this._dx = 0;\n this._sy = this._dy = 0;\n this._sw = this._dw = image.width / ratio;\n this._sh = this._dh = image.height / ratio;\n\n this.width = image.width / ratio;\n this.height = image.height / ratio;\n\n this.ratio = ratio;\n\n } else {\n if (typeof w === 'undefined') {\n w = x, h = y;\n } else {\n this._sx = x, this._sy = y;\n }\n this._sw = this._dw = w;\n this._sh = this._dh = h;\n\n this.width = w;\n this.height = h;\n }\n return this;\n};\n\n/**\n * Signatures: (x, y, w, h), (x, y)\n */\nTexture.prototype.dest = function(x, y, w, h) {\n this._dx = x, this._dy = y;\n this._dx = x, this._dy = y;\n if (typeof w !== 'undefined') {\n this._dw = w, this._dh = h;\n this.width = w, this.height = h;\n }\n return this;\n};\n\nTexture.prototype.draw = function(context, x1, y1, x2, y2, x3, y3, x4, y4) {\n var image = this._image;\n if (image === null || typeof image !== 'object') {\n return;\n }\n\n var sx = this._sx, sy = this._sy;\n var sw = this._sw, sh = this._sh;\n var dx = this._dx, dy = this._dy;\n var dw = this._dw, dh = this._dh;\n\n if (typeof x3 !== 'undefined') {\n x1 = math.limit(x1, 0, this._sw), x2 = math.limit(x2, 0, this._sw - x1);\n y1 = math.limit(y1, 0, this._sh), y2 = math.limit(y2, 0, this._sh - y1);\n sx += x1, sy += y1, sw = x2, sh = y2;\n dx = x3, dy = y3, dw = x4, dh = y4;\n\n } else if (typeof x2 !== 'undefined') {\n dx = x1, dy = y1, dw = x2, dh = y2;\n\n } else if (typeof x1 !== 'undefined') {\n dw = x1, dh = y1;\n }\n\n var ratio = this.ratio || 1;\n sx *= ratio, sy *= ratio, sw *= ratio, sh *= ratio;\n\n try {\n if (typeof image.draw === 'function') {\n image.draw(context, sx, sy, sw, sh, dx, dy, dw, dh);\n } else {\n stats.draw++;\n context.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh);\n }\n } catch (ex) {\n if (!image._draw_failed) {\n console.log('Unable to draw: ', image);\n console.log(ex);\n image._draw_failed = true;\n }\n }\n};\n\nmodule.exports = Texture;\n","module.exports.startsWith = function(str, sub) {\n return typeof str === 'string' && typeof sub === 'string'\n && str.substring(0, sub.length) == sub;\n};","if (typeof DEBUG === 'undefined')\n DEBUG = true;\n\nvar Class = require('./core');\nvar Texture = require('./texture');\n\nvar extend = require('./util/extend');\nvar create = require('./util/create');\nvar is = require('./util/is');\n\nvar string = require('./util/string');\n\n// name : atlas\nvar _atlases_map = {};\n// [atlas]\nvar _atlases_arr = [];\n\n// TODO: print subquery not found error\n// TODO: index textures\n\nClass.atlas = function(def) {\n var atlas = is.fn(def.draw) ? def : new Atlas(def);\n if (def.name) {\n _atlases_map[def.name] = atlas;\n }\n _atlases_arr.push(atlas);\n\n deprecated(def, 'imagePath');\n deprecated(def, 'imageRatio');\n\n var url = def.imagePath;\n var ratio = def.imageRatio || 1;\n if (is.string(def.image)) {\n url = def.image;\n } else if (is.hash(def.image)) {\n url = def.image.src || def.image.url;\n ratio = def.image.ratio || ratio;\n }\n url && Class.preload(function(done) {\n url = Class.resolve(url);\n DEBUG && console.log('Loading atlas: ' + url);\n var imageloader = Class.config('image-loader');\n\n imageloader(url, function(image) {\n DEBUG && console.log('Image loaded: ' + url);\n atlas.src(image, ratio);\n done();\n\n }, function(err) {\n DEBUG && console.log('Error loading atlas: ' + url, err);\n done();\n });\n });\n\n return atlas;\n};\n\nAtlas._super = Texture;\nAtlas.prototype = create(Atlas._super.prototype);\n\nfunction Atlas(def) {\n Atlas._super.call(this);\n\n var atlas = this;\n\n deprecated(def, 'filter');\n deprecated(def, 'cutouts');\n deprecated(def, 'sprites');\n deprecated(def, 'factory');\n\n var map = def.map || def.filter;\n var ppu = def.ppu || def.ratio || 1;\n var trim = def.trim || 0;\n var textures = def.textures;\n var factory = def.factory;\n var cutouts = def.cutouts || def.sprites;\n\n function make(def) {\n if (!def || is.fn(def.draw)) {\n return def;\n }\n\n def = extend({}, def);\n\n if (is.fn(map)) {\n def = map(def);\n }\n\n if (ppu != 1) {\n def.x *= ppu, def.y *= ppu;\n def.width *= ppu, def.height *= ppu;\n def.top *= ppu, def.bottom *= ppu;\n def.left *= ppu, def.right *= ppu;\n }\n\n if (trim != 0) {\n def.x += trim, def.y += trim;\n def.width -= 2 * trim, def.height -= 2 * trim;\n def.top -= trim, def.bottom -= trim;\n def.left -= trim, def.right -= trim;\n }\n\n var texture = atlas.pipe();\n texture.top = def.top, texture.bottom = def.bottom;\n texture.left = def.left, texture.right = def.right;\n texture.src(def.x, def.y, def.width, def.height);\n return texture;\n }\n\n function find(query) {\n if (textures) {\n if (is.fn(textures)) {\n return textures(query);\n } else if (is.hash(textures)) {\n return textures[query];\n }\n }\n if (cutouts) { // deprecated\n var result = null, n = 0;\n for (var i = 0; i < cutouts.length; i++) {\n if (string.startsWith(cutouts[i].name, query)) {\n if (n === 0) {\n result = cutouts[i];\n } else if (n === 1) {\n result = [ result, cutouts[i] ];\n } else {\n result.push(cutouts[i]);\n }\n n++;\n }\n }\n if (n === 0 && is.fn(factory)) {\n result = function(subquery) {\n return factory(query + (subquery ? subquery : ''));\n };\n }\n return result;\n }\n }\n\n this.select = function(query) {\n if (!query) {\n // TODO: if `textures` is texture def, map or fn?\n return new Selection(this.pipe());\n }\n var found = find(query);\n if (found) {\n return new Selection(found, find, make);\n }\n };\n\n};\n\nvar nfTexture = new Texture();\nnfTexture.x = nfTexture.y = nfTexture.width = nfTexture.height = 0;\nnfTexture.pipe = nfTexture.src = nfTexture.dest = function() {\n return this;\n};\nnfTexture.draw = function() {\n};\n\nvar nfSelection = new Selection(nfTexture);\n\nfunction Selection(result, find, make) {\n function link(result, subquery) {\n if (!result) {\n return nfTexture;\n\n } else if (is.fn(result.draw)) {\n return result;\n\n } else if (is.hash(result) && is.number(result.width)\n && is.number(result.height) && is.fn(make)) {\n return make(result);\n\n } else if (is.hash(result) && is.defined(subquery)) {\n return link(result[subquery]);\n\n } else if (is.fn(result)) {\n return link(result(subquery));\n\n } else if (is.array(result)) {\n return link(result[0]);\n\n } else if (is.string(result) && is.fn(find)) {\n return link(find(result));\n }\n }\n\n this.one = function(subquery) {\n return link(result, subquery);\n };\n\n this.array = function(arr) {\n var array = is.array(arr) ? arr : [];\n if (is.array(result)) {\n for (var i = 0; i < result.length; i++) {\n array[i] = link(result[i]);\n }\n } else {\n array[0] = link(result);\n }\n return array;\n };\n}\n\nClass.texture = function(query) {\n if (!is.string(query)) {\n return new Selection(query);\n }\n\n var result = null, atlas, i;\n\n if ((i = query.indexOf(':')) > 0 && query.length > i + 1) {\n atlas = _atlases_map[query.slice(0, i)];\n result = atlas && atlas.select(query.slice(i + 1));\n }\n\n if (!result && (atlas = _atlases_map[query])) {\n result = atlas.select();\n }\n\n for (i = 0; !result && i < _atlases_arr.length; i++) {\n result = _atlases_arr[i].select(query);\n }\n\n if (!result) {\n console.error('Texture not found: ' + query);\n result = nfSelection;\n }\n\n return result;\n};\n\nfunction deprecated(hash, name, msg) {\n if (name in hash)\n console.log(msg ? msg.replace('%name', name) : '\\'' + name\n + '\\' field of texture atlas is deprecated.');\n};\n\nmodule.exports = Atlas;\n","var Class = require('./core');\nvar is = require('./util/is');\n\nvar iid = 0;\n\n// TODO: do not clear next/prev/parent on remove\n\nClass.prototype._label = '';\n\nClass.prototype._visible = true;\n\nClass.prototype._parent = null;\nClass.prototype._next = null;\nClass.prototype._prev = null;\n\nClass.prototype._first = null;\nClass.prototype._last = null;\n\nClass.prototype._attrs = null;\nClass.prototype._flags = null;\n\nClass.prototype.toString = function() {\n return '[' + this._label + ']';\n};\n\n/**\n * @deprecated Use label()\n */\nClass.prototype.id = function(id) {\n return this.label(id);\n};\n\nClass.prototype.label = function(label) {\n if (typeof label === 'undefined') {\n return this._label;\n }\n this._label = label;\n return this;\n};\n\nClass.prototype.attr = function(name, value) {\n if (typeof value === 'undefined') {\n return this._attrs !== null ? this._attrs[name] : undefined;\n }\n (this._attrs !== null ? this._attrs : this._attrs = {})[name] = value;\n return this;\n};\n\nClass.prototype.visible = function(visible) {\n if (typeof visible === 'undefined') {\n return this._visible;\n }\n this._visible = visible;\n this._parent && (this._parent._ts_children = ++iid);\n this._ts_pin = ++iid;\n this.touch();\n return this;\n};\n\nClass.prototype.hide = function() {\n return this.visible(false);\n};\n\nClass.prototype.show = function() {\n return this.visible(true);\n};\n\nClass.prototype.parent = function() {\n return this._parent;\n};\n\nClass.prototype.next = function(visible) {\n var next = this._next;\n while (next && visible && !next._visible) {\n next = next._next;\n }\n return next;\n};\n\nClass.prototype.prev = function(visible) {\n var prev = this._prev;\n while (prev && visible && !prev._visible) {\n prev = prev._prev;\n }\n return prev;\n};\n\nClass.prototype.first = function(visible) {\n var next = this._first;\n while (next && visible && !next._visible) {\n next = next._next;\n }\n return next;\n};\n\nClass.prototype.last = function(visible) {\n var prev = this._last;\n while (prev && visible && !prev._visible) {\n prev = prev._prev;\n }\n return prev;\n};\n\nClass.prototype.visit = function(visitor, data) {\n var reverse = visitor.reverse;\n var visible = visitor.visible;\n if (visitor.start && visitor.start(this, data)) {\n return;\n }\n var child, next = reverse ? this.last(visible) : this.first(visible);\n while (child = next) {\n next = reverse ? child.prev(visible) : child.next(visible);\n if (child.visit(visitor, data)) {\n return true;\n }\n }\n return visitor.end && visitor.end(this, data);\n};\n\nClass.prototype.append = function(child, more) {\n if (is.array(child))\n for (var i = 0; i < child.length; i++)\n append(this, child[i]);\n\n else if (typeof more !== 'undefined') // deprecated\n for (var i = 0; i < arguments.length; i++)\n append(this, arguments[i]);\n\n else if (typeof child !== 'undefined')\n append(this, child);\n\n return this;\n};\n\nClass.prototype.prepend = function(child, more) {\n if (is.array(child))\n for (var i = child.length - 1; i >= 0; i--)\n prepend(this, child[i]);\n\n else if (typeof more !== 'undefined') // deprecated\n for (var i = arguments.length - 1; i >= 0; i--)\n prepend(this, arguments[i]);\n\n else if (typeof child !== 'undefined')\n prepend(this, child);\n\n return this;\n};\n\nClass.prototype.appendTo = function(parent) {\n append(parent, this);\n return this;\n};\n\nClass.prototype.prependTo = function(parent) {\n prepend(parent, this);\n return this;\n};\n\nClass.prototype.insertNext = function(sibling, more) {\n if (is.array(sibling))\n for (var i = 0; i < sibling.length; i++)\n insertAfter(sibling[i], this);\n\n else if (typeof more !== 'undefined') // deprecated\n for (var i = 0; i < arguments.length; i++)\n insertAfter(arguments[i], this);\n\n else if (typeof sibling !== 'undefined')\n insertAfter(sibling, this);\n\n return this;\n};\n\nClass.prototype.insertPrev = function(sibling, more) {\n if (is.array(sibling))\n for (var i = sibling.length - 1; i >= 0; i--)\n insertBefore(sibling[i], this);\n\n else if (typeof more !== 'undefined') // deprecated\n for (var i = arguments.length - 1; i >= 0; i--)\n insertBefore(arguments[i], this);\n\n else if (typeof sibling !== 'undefined')\n insertBefore(sibling, this);\n\n return this;\n};\n\nClass.prototype.insertAfter = function(prev) {\n insertAfter(this, prev);\n return this;\n};\n\nClass.prototype.insertBefore = function(next) {\n insertBefore(this, next);\n return this;\n};\n\nfunction append(parent, child) {\n _ensure(child);\n _ensure(parent);\n\n child.remove();\n\n if (parent._last) {\n parent._last._next = child;\n child._prev = parent._last;\n }\n\n child._parent = parent;\n parent._last = child;\n\n if (!parent._first) {\n parent._first = child;\n }\n\n child._parent._flag(child, true);\n\n child._ts_parent = ++iid;\n parent._ts_children = ++iid;\n parent.touch();\n}\n\nfunction prepend(parent, child) {\n _ensure(child);\n _ensure(parent);\n\n child.remove();\n\n if (parent._first) {\n parent._first._prev = child;\n child._next = parent._first;\n }\n\n child._parent = parent;\n parent._first = child;\n\n if (!parent._last) {\n parent._last = child;\n }\n\n child._parent._flag(child, true);\n\n child._ts_parent = ++iid;\n parent._ts_children = ++iid;\n parent.touch();\n};\n\nfunction insertBefore(self, next) {\n _ensure(self);\n _ensure(next);\n\n self.remove();\n\n var parent = next._parent;\n var prev = next._prev;\n\n next._prev = self;\n prev && (prev._next = self) || parent && (parent._first = self);\n\n self._parent = parent;\n self._prev = prev;\n self._next = next;\n\n self._parent._flag(self, true);\n\n self._ts_parent = ++iid;\n self.touch();\n};\n\nfunction insertAfter(self, prev) {\n _ensure(self);\n _ensure(prev);\n\n self.remove();\n\n var parent = prev._parent;\n var next = prev._next;\n\n prev._next = self;\n next && (next._prev = self) || parent && (parent._last = self);\n\n self._parent = parent;\n self._prev = prev;\n self._next = next;\n\n self._parent._flag(self, true);\n\n self._ts_parent = ++iid;\n self.touch();\n};\n\nClass.prototype.remove = function(child, more) {\n if (typeof child !== 'undefined') {\n if (is.array(child)) {\n for (var i = 0; i < child.length; i++)\n _ensure(child[i]).remove();\n\n } else if (typeof more !== 'undefined') {\n for (var i = 0; i < arguments.length; i++)\n _ensure(arguments[i]).remove();\n\n } else {\n _ensure(child).remove();\n }\n return this;\n }\n\n if (this._prev) {\n this._prev._next = this._next;\n }\n if (this._next) {\n this._next._prev = this._prev;\n }\n\n if (this._parent) {\n if (this._parent._first === this) {\n this._parent._first = this._next;\n }\n if (this._parent._last === this) {\n this._parent._last = this._prev;\n }\n\n this._parent._flag(this, false);\n\n this._parent._ts_children = ++iid;\n this._parent.touch();\n }\n\n this._prev = this._next = this._parent = null;\n this._ts_parent = ++iid;\n // this._parent.touch();\n\n return this;\n};\n\nClass.prototype.empty = function() {\n var child, next = this._first;\n while (child = next) {\n next = child._next;\n child._prev = child._next = child._parent = null;\n\n this._flag(child, false);\n }\n\n this._first = this._last = null;\n\n this._ts_children = ++iid;\n this.touch();\n return this;\n};\n\nClass.prototype.touch = function() {\n this._ts_touch = ++iid;\n this._parent && this._parent.touch();\n return this;\n};\n\n/**\n * Deep flags used for optimizing event distribution.\n */\nClass.prototype._flag = function(obj, name) {\n if (typeof name === 'undefined') {\n return this._flags !== null && this._flags[obj] || 0;\n }\n if (typeof obj === 'string') {\n if (name) {\n this._flags = this._flags || {};\n if (!this._flags[obj] && this._parent) {\n this._parent._flag(obj, true);\n }\n this._flags[obj] = (this._flags[obj] || 0) + 1;\n\n } else if (this._flags && this._flags[obj] > 0) {\n if (this._flags[obj] == 1 && this._parent) {\n this._parent._flag(obj, false);\n }\n this._flags[obj] = this._flags[obj] - 1;\n }\n }\n if (typeof obj === 'object') {\n if (obj._flags) {\n for ( var type in obj._flags) {\n if (obj._flags[type] > 0) {\n this._flag(type, name);\n }\n }\n }\n }\n return this;\n};\n\n/**\n * @private\n */\nClass.prototype.hitTest = function(hit) {\n var width = this._pin._width;\n var height = this._pin._height;\n return hit.x >= 0 && hit.x <= width && hit.y >= 0 && hit.y <= height;\n};\n\nfunction _ensure(obj) {\n if (obj && obj instanceof Class) {\n return obj;\n }\n throw 'Invalid node: ' + obj;\n};\n\nmodule.exports = Class;\n","module.exports = function(prototype, callback) {\n\n prototype._listeners = null;\n\n prototype.on = prototype.listen = function(types, listener) {\n if (!types || !types.length || typeof listener !== 'function') {\n return this;\n }\n if (this._listeners === null) {\n this._listeners = {};\n }\n var isarray = typeof types !== 'string' && typeof types.join === 'function';\n if (types = (isarray ? types.join(' ') : types).match(/\\S+/g)) {\n for (var i = 0; i < types.length; i++) {\n var type = types[i];\n this._listeners[type] = this._listeners[type] || [];\n this._listeners[type].push(listener);\n if (typeof callback === 'function') {\n callback(this, type, true);\n }\n }\n }\n return this;\n };\n\n prototype.off = function(types, listener) {\n if (!types || !types.length || typeof listener !== 'function') {\n return this;\n }\n if (this._listeners === null) {\n return this;\n }\n var isarray = typeof types !== 'string' && typeof types.join === 'function';\n if (types = (isarray ? types.join(' ') : types).match(/\\S+/g)) {\n for (var i = 0; i < types.length; i++) {\n var type = types[i], all = this._listeners[type], index;\n if (all && (index = all.indexOf(listener)) >= 0) {\n all.splice(index, 1);\n if (!all.length) {\n delete this._listeners[type];\n }\n if (typeof callback === 'function') {\n callback(this, type, false);\n }\n }\n }\n }\n return this;\n };\n\n prototype.listeners = function(type) {\n return this._listeners && this._listeners[type];\n };\n\n prototype.publish = function(name, args) {\n var listeners = this.listeners(name);\n if (!listeners || !listeners.length) {\n return 0;\n }\n for (var l = 0; l < listeners.length; l++) {\n listeners[l].apply(this, args);\n }\n return listeners.length;\n };\n\n prototype.trigger = function(name, args) {\n this.publish(name, args);\n return this;\n };\n\n};\n","require('./util/event')(require('./core').prototype, function(obj, name, on) {\n obj._flag(name, on);\n});\n","var Class = require('./core');\nvar Matrix = require('./matrix');\n\nvar iid = 0;\n\nClass._init(function() {\n this._pin = new Pin(this);\n});\n\nClass.prototype.matrix = function(relative) {\n if (relative === true) {\n return this._pin.relativeMatrix();\n }\n return this._pin.absoluteMatrix();\n};\n\nClass.prototype.pin = function(a, b) {\n if (typeof a === 'object') {\n this._pin.set(a);\n return this;\n\n } else if (typeof a === 'string') {\n if (typeof b === 'undefined') {\n return this._pin.get(a);\n } else {\n this._pin.set(a, b);\n return this;\n }\n } else if (typeof a === 'undefined') {\n return this._pin;\n }\n};\n\nfunction Pin(owner) {\n\n this._owner = owner;\n this._parent = null;\n\n // relative to parent\n this._relativeMatrix = new Matrix();\n\n // relative to stage\n this._absoluteMatrix = new Matrix();\n\n this.reset();\n};\n\nPin.prototype.reset = function() {\n\n this._textureAlpha = 1;\n this._alpha = 1;\n\n this._width = 0;\n this._height = 0;\n\n this._scaleX = 1;\n this._scaleY = 1;\n this._skewX = 0;\n this._skewY = 0;\n this._rotation = 0;\n\n // scale/skew/rotate center\n this._pivoted = false;\n this._pivotX = null;\n this._pivotY = null;\n\n // self pin point\n this._handled = false;\n this._handleX = 0;\n this._handleY = 0;\n\n // parent pin point\n this._aligned = false;\n this._alignX = 0;\n this._alignY = 0;\n\n // as seen by parent px\n this._offsetX = 0;\n this._offsetY = 0;\n\n this._boxX = 0;\n this._boxY = 0;\n this._boxWidth = this._width;\n this._boxHeight = this._height;\n\n // TODO: also set for owner\n this._ts_translate = ++iid;\n this._ts_transform = ++iid;\n this._ts_matrix = ++iid;\n};\n\nPin.prototype._update = function() {\n this._parent = this._owner._parent && this._owner._parent._pin;\n\n // if handled and transformed then be translated\n if (this._handled && this._mo_handle != this._ts_transform) {\n this._mo_handle = this._ts_transform;\n this._ts_translate = ++iid;\n }\n\n if (this._aligned && this._parent\n && this._mo_align != this._parent._ts_transform) {\n this._mo_align = this._parent._ts_transform;\n this._ts_translate = ++iid;\n }\n\n return this;\n};\n\nPin.prototype.toString = function() {\n return this._owner + ' (' + (this._parent ? this._parent._owner : null) + ')';\n};\n\n// TODO: ts fields require refactoring\n\nPin.prototype.absoluteMatrix = function() {\n this._update();\n var ts = Math.max(\n this._ts_transform,\n this._ts_translate,\n this._parent ? this._parent._ts_matrix : 0\n );\n if (this._mo_abs == ts) {\n return this._absoluteMatrix;\n }\n this._mo_abs = ts;\n\n var abs = this._absoluteMatrix;\n abs.reset(this.relativeMatrix());\n\n this._parent && abs.concat(this._parent._absoluteMatrix);\n\n this._ts_matrix = ++iid;\n\n return abs;\n};\n\nPin.prototype.relativeMatrix = function() {\n this._update();\n var ts = Math.max(this._ts_transform, this._ts_translate,\n this._parent ? this._parent._ts_transform : 0);\n if (this._mo_rel == ts) {\n return this._relativeMatrix;\n }\n this._mo_rel = ts;\n\n var rel = this._relativeMatrix;\n\n rel.identity();\n if (this._pivoted) {\n rel.translate(-this._pivotX * this._width, -this._pivotY * this._height);\n }\n rel.scale(this._scaleX, this._scaleY);\n rel.skew(this._skewX, this._skewY);\n rel.rotate(this._rotation);\n if (this._pivoted) {\n rel.translate(this._pivotX * this._width, this._pivotY * this._height);\n }\n\n // calculate effective box\n if (this._pivoted) {\n // origin\n this._boxX = 0;\n this._boxY = 0;\n this._boxWidth = this._width;\n this._boxHeight = this._height;\n\n } else {\n // aabb\n var p, q;\n if (rel.a > 0 && rel.c > 0 || rel.a < 0 && rel.c < 0) {\n p = 0, q = rel.a * this._width + rel.c * this._height;\n } else {\n p = rel.a * this._width, q = rel.c * this._height;\n }\n if (p > q) {\n this._boxX = q;\n this._boxWidth = p - q;\n } else {\n this._boxX = p;\n this._boxWidth = q - p;\n }\n if (rel.b > 0 && rel.d > 0 || rel.b < 0 && rel.d < 0) {\n p = 0, q = rel.b * this._width + rel.d * this._height;\n } else {\n p = rel.b * this._width, q = rel.d * this._height;\n }\n if (p > q) {\n this._boxY = q;\n this._boxHeight = p - q;\n } else {\n this._boxY = p;\n this._boxHeight = q - p;\n }\n }\n\n this._x = this._offsetX;\n this._y = this._offsetY;\n\n this._x -= this._boxX + this._handleX * this._boxWidth;\n this._y -= this._boxY + this._handleY * this._boxHeight;\n\n if (this._aligned && this._parent) {\n this._parent.relativeMatrix();\n this._x += this._alignX * this._parent._width;\n this._y += this._alignY * this._parent._height;\n }\n\n rel.translate(this._x, this._y);\n\n return this._relativeMatrix;\n};\n\nPin.prototype.get = function(key) {\n if (typeof getters[key] === 'function') {\n return getters[key](this);\n }\n};\n\n// TODO: Use defineProperty instead? What about multi-field pinning?\nPin.prototype.set = function(a, b) {\n if (typeof a === 'string') {\n if (typeof setters[a] === 'function' && typeof b !== 'undefined') {\n setters[a](this, b);\n }\n } else if (typeof a === 'object') {\n for (b in a) {\n if (typeof setters[b] === 'function' && typeof a[b] !== 'undefined') {\n setters[b](this, a[b], a);\n }\n }\n }\n if (this._owner) {\n this._owner._ts_pin = ++iid;\n this._owner.touch();\n }\n return this;\n};\n\nvar getters = {\n alpha : function(pin) {\n return pin._alpha;\n },\n\n textureAlpha : function(pin) {\n return pin._textureAlpha;\n },\n\n width : function(pin) {\n return pin._width;\n },\n\n height : function(pin) {\n return pin._height;\n },\n\n boxWidth : function(pin) {\n return pin._boxWidth;\n },\n\n boxHeight : function(pin) {\n return pin._boxHeight;\n },\n\n // scale : function(pin) {\n // },\n\n scaleX : function(pin) {\n return pin._scaleX;\n },\n\n scaleY : function(pin) {\n return pin._scaleY;\n },\n\n // skew : function(pin) {\n // },\n\n skewX : function(pin) {\n return pin._skewX;\n },\n\n skewY : function(pin) {\n return pin._skewY;\n },\n\n rotation : function(pin) {\n return pin._rotation;\n },\n\n // pivot : function(pin) {\n // },\n\n pivotX : function(pin) {\n return pin._pivotX;\n },\n\n pivotY : function(pin) {\n return pin._pivotY;\n },\n\n // offset : function(pin) {\n // },\n\n offsetX : function(pin) {\n return pin._offsetX;\n },\n\n offsetY : function(pin) {\n return pin._offsetY;\n },\n\n // align : function(pin) {\n // },\n\n alignX : function(pin) {\n return pin._alignX;\n },\n\n alignY : function(pin) {\n return pin._alignY;\n },\n\n // handle : function(pin) {\n // },\n\n handleX : function(pin) {\n return pin._handleX;\n },\n\n handleY : function(pin) {\n return pin._handleY;\n }\n};\n\nvar setters = {\n alpha : function(pin, value) {\n pin._alpha = value;\n },\n\n textureAlpha : function(pin, value) {\n pin._textureAlpha = value;\n },\n\n width : function(pin, value) {\n pin._width_ = value;\n pin._width = value;\n pin._ts_transform = ++iid;\n },\n\n height : function(pin, value) {\n pin._height_ = value;\n pin._height = value;\n pin._ts_transform = ++iid;\n },\n\n scale : function(pin, value) {\n pin._scaleX = value;\n pin._scaleY = value;\n pin._ts_transform = ++iid;\n },\n\n scaleX : function(pin, value) {\n pin._scaleX = value;\n pin._ts_transform = ++iid;\n },\n\n scaleY : function(pin, value) {\n pin._scaleY = value;\n pin._ts_transform = ++iid;\n },\n\n skew : function(pin, value) {\n pin._skewX = value;\n pin._skewY = value;\n pin._ts_transform = ++iid;\n },\n\n skewX : function(pin, value) {\n pin._skewX = value;\n pin._ts_transform = ++iid;\n },\n\n skewY : function(pin, value) {\n pin._skewY = value;\n pin._ts_transform = ++iid;\n },\n\n rotation : function(pin, value) {\n pin._rotation = value;\n pin._ts_transform = ++iid;\n },\n\n pivot : function(pin, value) {\n pin._pivotX = value;\n pin._pivotY = value;\n pin._pivoted = true;\n pin._ts_transform = ++iid;\n },\n\n pivotX : function(pin, value) {\n pin._pivotX = value;\n pin._pivoted = true;\n pin._ts_transform = ++iid;\n },\n\n pivotY : function(pin, value) {\n pin._pivotY = value;\n pin._pivoted = true;\n pin._ts_transform = ++iid;\n },\n\n offset : function(pin, value) {\n pin._offsetX = value;\n pin._offsetY = value;\n pin._ts_translate = ++iid;\n },\n\n offsetX : function(pin, value) {\n pin._offsetX = value;\n pin._ts_translate = ++iid;\n },\n\n offsetY : function(pin, value) {\n pin._offsetY = value;\n pin._ts_translate = ++iid;\n },\n\n align : function(pin, value) {\n this.alignX(pin, value);\n this.alignY(pin, value);\n },\n\n alignX : function(pin, value) {\n pin._alignX = value;\n pin._aligned = true;\n pin._ts_translate = ++iid;\n\n this.handleX(pin, value);\n },\n\n alignY : function(pin, value) {\n pin._alignY = value;\n pin._aligned = true;\n pin._ts_translate = ++iid;\n\n this.handleY(pin, value);\n },\n\n handle : function(pin, value) {\n this.handleX(pin, value);\n this.handleY(pin, value);\n },\n\n handleX : function(pin, value) {\n pin._handleX = value;\n pin._handled = true;\n pin._ts_translate = ++iid;\n },\n\n handleY : function(pin, value) {\n pin._handleY = value;\n pin._handled = true;\n pin._ts_translate = ++iid;\n },\n\n resizeMode : function(pin, value, all) {\n if (all) {\n if (value == 'in') {\n value = 'in-pad';\n } else if (value == 'out') {\n value = 'out-crop';\n }\n scaleTo(pin, all.resizeWidth, all.resizeHeight, value);\n }\n },\n\n resizeWidth : function(pin, value, all) {\n if (!all || !all.resizeMode) {\n scaleTo(pin, value, null);\n }\n },\n\n resizeHeight : function(pin, value, all) {\n if (!all || !all.resizeMode) {\n scaleTo(pin, null, value);\n }\n },\n\n scaleMode : function(pin, value, all) {\n if (all) {\n scaleTo(pin, all.scaleWidth, all.scaleHeight, value);\n }\n },\n\n scaleWidth : function(pin, value, all) {\n if (!all || !all.scaleMode) {\n scaleTo(pin, value, null);\n }\n },\n\n scaleHeight : function(pin, value, all) {\n if (!all || !all.scaleMode) {\n scaleTo(pin, null, value);\n }\n },\n\n matrix : function(pin, value) {\n this.scaleX(pin, value.a);\n this.skewX(pin, value.c / value.d);\n this.skewY(pin, value.b / value.a);\n this.scaleY(pin, value.d);\n this.offsetX(pin, value.e);\n this.offsetY(pin, value.f);\n this.rotation(pin, 0);\n }\n};\n\nfunction scaleTo(pin, width, height, mode) {\n var w = typeof width === 'number';\n var h = typeof height === 'number';\n var m = typeof mode === 'string';\n pin._ts_transform = ++iid;\n if (w) {\n pin._scaleX = width / pin._width_;\n pin._width = pin._width_;\n }\n if (h) {\n pin._scaleY = height / pin._height_;\n pin._height = pin._height_;\n }\n if (w && h && m) {\n if (mode == 'out' || mode == 'out-crop') {\n pin._scaleX = pin._scaleY = Math.max(pin._scaleX, pin._scaleY);\n } else if (mode == 'in' || mode == 'in-pad') {\n pin._scaleX = pin._scaleY = Math.min(pin._scaleX, pin._scaleY);\n }\n if (mode == 'out-crop' || mode == 'in-pad') {\n pin._width = width / pin._scaleX;\n pin._height = height / pin._scaleY;\n }\n }\n};\n\nClass.prototype.scaleTo = function(a, b, c) {\n if (typeof a === 'object')\n c = b, b = a.y, a = a.x;\n scaleTo(this._pin, a, b, c);\n return this;\n};\n\n// Used by Tween class\nPin._add_shortcuts = function(Class) {\n Class.prototype.size = function(w, h) {\n this.pin('width', w);\n this.pin('height', h);\n return this;\n };\n\n Class.prototype.width = function(w) {\n if (typeof w === 'undefined') {\n return this.pin('width');\n }\n this.pin('width', w);\n return this;\n };\n\n Class.prototype.height = function(h) {\n if (typeof h === 'undefined') {\n return this.pin('height');\n }\n this.pin('height', h);\n return this;\n };\n\n Class.prototype.offset = function(a, b) {\n if (typeof a === 'object')\n b = a.y, a = a.x;\n this.pin('offsetX', a);\n this.pin('offsetY', b);\n return this;\n };\n\n Class.prototype.rotate = function(a) {\n this.pin('rotation', a);\n return this;\n };\n\n Class.prototype.skew = function(a, b) {\n if (typeof a === 'object')\n b = a.y, a = a.x;\n else if (typeof b === 'undefined')\n b = a;\n this.pin('skewX', a);\n this.pin('skewY', b);\n return this;\n };\n\n Class.prototype.scale = function(a, b) {\n if (typeof a === 'object')\n b = a.y, a = a.x;\n else if (typeof b === 'undefined')\n b = a;\n this.pin('scaleX', a);\n this.pin('scaleY', b);\n return this;\n };\n\n Class.prototype.alpha = function(a, ta) {\n this.pin('alpha', a);\n if (typeof ta !== 'undefined') {\n this.pin('textureAlpha', ta);\n }\n return this;\n };\n};\n\nPin._add_shortcuts(Class);\n\nmodule.exports = Pin;\n","var Class = require('./core');\nrequire('./pin');\nrequire('./loop');\n\nvar stats = require('./util/stats');\nvar create = require('./util/create');\nvar extend = require('./util/extend');\n\nRoot._super = Class;\nRoot.prototype = create(Root._super.prototype);\n\nClass.root = function(request, render) {\n return new Root(request, render);\n};\n\nfunction Root(request, render) {\n Root._super.call(this);\n this.label('Root');\n\n var paused = true;\n var stopped = true;\n\n var self = this;\n var lastTime = 0;\n var loop = function(now) {\n if (paused === true || stopped === true) {\n return;\n }\n\n stats.tick = stats.node = stats.draw = 0;\n\n var last = lastTime || now;\n var elapsed = now - last;\n lastTime = now;\n\n var ticked = self._tick(elapsed, now, last);\n if (self._mo_touch != self._ts_touch) {\n self._mo_touch = self._ts_touch;\n render(self);\n request(loop);\n } else if (ticked) {\n request(loop);\n } else {\n paused = true;\n }\n\n stats.fps = elapsed ? 1000 / elapsed : 0;\n };\n\n this.start = function() {\n stopped = false;\n return this.resume();\n };\n\n this.resume = function() {\n if (paused) {\n this.publish('resume');\n paused = false;\n request(loop);\n }\n return this;\n };\n\n this.pause = function() {\n if (!paused) {\n this.publish('pause');\n }\n paused = true;\n return this;\n };\n\n this.touch_root = this.touch;\n this.touch = function() {\n this.resume();\n return this.touch_root();\n };\n this.stop = function() {\n stopped = true;\n return this;\n };\n};\n\nRoot.prototype.background = function(color) {\n // to be implemented by loaders\n return this;\n};\n\nRoot.prototype.viewport = function(width, height, ratio) {\n if (typeof width === 'undefined') {\n return extend({}, this._viewport);\n }\n this._viewport = {\n width : width,\n height : height,\n ratio : ratio || 1\n };\n this.viewbox();\n var data = extend({}, this._viewport);\n this.visit({\n start : function(node) {\n if (!node._flag('viewport')) {\n return true;\n }\n node.publish('viewport', [ data ]);\n }\n });\n return this;\n};\n\n// TODO: static/fixed viewbox\nRoot.prototype.viewbox = function(width, height, mode) {\n if (typeof width === 'number' && typeof height === 'number') {\n this._viewbox = {\n width : width,\n height : height,\n mode : /^(in|out|in-pad|out-crop)$/.test(mode) ? mode : 'in-pad'\n };\n }\n\n var box = this._viewbox;\n var size = this._viewport;\n if (size && box) {\n this.pin({\n width : box.width,\n height : box.height\n });\n this.scaleTo(size.width, size.height, box.mode);\n } else if (size) {\n this.pin({\n width : size.width,\n height : size.height\n });\n }\n\n return this;\n};\n","var Class = require('./core');\nrequire('./pin');\nvar stats = require('./util/stats');\n\nClass.prototype._textures = null;\nClass.prototype._alpha = 1;\n\nClass.prototype.render = function(context) {\n if (!this._visible) {\n return;\n }\n stats.node++;\n\n var m = this.matrix();\n context.setTransform(m.a, m.b, m.c, m.d, m.e, m.f);\n\n // move this elsewhere!\n this._alpha = this._pin._alpha * (this._parent ? this._parent._alpha : 1);\n var alpha = this._pin._textureAlpha * this._alpha;\n\n if (context.globalAlpha != alpha) {\n context.globalAlpha = alpha;\n }\n\n if (this._textures !== null) {\n for (var i = 0, n = this._textures.length; i < n; i++) {\n this._textures[i].draw(context);\n }\n }\n\n if (context.globalAlpha != this._alpha) {\n context.globalAlpha = this._alpha;\n }\n\n var child, next = this._first;\n while (child = next) {\n next = child._next;\n child.render(context);\n }\n};\n\nClass.prototype._tickBefore = null;\nClass.prototype._tickAfter = null;\nClass.prototype.MAX_ELAPSE = Infinity;\n\nClass.prototype._tick = function(elapsed, now, last) {\n if (!this._visible) {\n return;\n }\n\n if (elapsed > this.MAX_ELAPSE) {\n elapsed = this.MAX_ELAPSE;\n }\n\n var ticked = false;\n\n if (this._tickBefore !== null) {\n for (var i = 0; i < this._tickBefore.length; i++) {\n stats.tick++;\n var tickFn = this._tickBefore[i];\n ticked = tickFn.call(this, elapsed, now, last) === true || ticked;\n }\n }\n\n var child, next = this._first;\n while (child = next) {\n next = child._next;\n if (child._flag('_tick')) {\n ticked = child._tick(elapsed, now, last) === true ? true : ticked;\n }\n }\n\n if (this._tickAfter !== null) {\n for (var i = 0; i < this._tickAfter.length; i++) {\n stats.tick++;\n var tickFn = this._tickAfter[i];\n ticked = tickFn.call(this, elapsed, now, last) === true || ticked;\n }\n }\n\n return ticked;\n};\n\nClass.prototype.tick = function(ticker, before) {\n if (typeof ticker !== 'function') {\n return;\n }\n if (before) {\n if (this._tickBefore === null) {\n this._tickBefore = [];\n }\n this._tickBefore.push(ticker);\n } else {\n if (this._tickAfter === null) {\n this._tickAfter = [];\n }\n this._tickAfter.push(ticker);\n }\n this._flag('_tick', this._tickAfter !== null && this._tickAfter.length > 0\n || this._tickBefore !== null && this._tickBefore.length > 0);\n};\n\nClass.prototype.untick = function(ticker) {\n if (typeof ticker !== 'function') {\n return;\n }\n var i;\n if (this._tickBefore !== null && (i = this._tickBefore.indexOf(ticker)) >= 0) {\n this._tickBefore.splice(i, 1);\n }\n if (this._tickAfter !== null && (i = this._tickAfter.indexOf(ticker)) >= 0) {\n this._tickAfter.splice(i, 1);\n }\n};\n\nClass.prototype.timeout = function(fn, time) {\n this.setTimeout(fn, time);\n};\n\nClass.prototype.setTimeout = function(fn, time) {\n function timer(t) {\n if ((time -= t) < 0) {\n this.untick(timer);\n fn.call(this);\n } else {\n return true;\n }\n }\n this.tick(timer);\n return timer;\n};\n\nClass.prototype.clearTimeout = function(timer) {\n this.untick(timer);\n};\n\n","module.exports = require('./core');\nmodule.exports.Matrix = require('./matrix');\nmodule.exports.Texture = require('./texture');\nrequire('./atlas');\nrequire('./tree');\nrequire('./event');\nrequire('./pin');\n\nrequire('./loop');\nrequire('./root');","var Class = require('./core');\nvar Texture = require('./texture');\n\nClass.canvas = function(type, attributes, drawFn) {\n if (typeof type === 'string') {\n if (typeof attributes === 'object') {\n } else {\n if (typeof attributes === 'function') {\n drawFn = attributes;\n }\n attributes = {};\n }\n } else {\n if (typeof type === 'function') {\n drawFn = type;\n }\n attributes = {};\n type = '2d';\n }\n\n var canvas = document.createElement('canvas');\n var context = canvas.getContext(type, attributes);\n var texture = new Texture(canvas);\n\n texture.context = function() {\n return context;\n };\n\n texture.size = function(width, height, ratio) {\n ratio = ratio || 1;\n canvas.width = width * ratio;\n canvas.height = height * ratio;\n this.src(canvas, ratio);\n return this;\n };\n\n texture.canvas = function(fn) {\n if (typeof fn === 'function') {\n fn.call(this, context);\n } else if (typeof fn === 'undefined' && typeof drawFn === 'function') {\n drawFn.call(this, context);\n }\n return this;\n };\n\n if (typeof drawFn === 'function') {\n drawFn.call(texture, context);\n }\n\n return texture;\n};","module.exports = function(img, owidth, oheight, stretch, inner, insert) {\n\n var width = img.width;\n var height = img.height;\n var left = img.left;\n var right = img.right;\n var top = img.top;\n var bottom = img.bottom;\n\n left = typeof left === 'number' && left === left ? left : 0;\n right = typeof right === 'number' && right === right ? right : 0;\n top = typeof top === 'number' && top === top ? top : 0;\n bottom = typeof bottom === 'number' && bottom === bottom ? bottom : 0;\n\n width = width - left - right;\n height = height - top - bottom;\n\n if (!inner) {\n owidth = Math.max(owidth - left - right, 0);\n oheight = Math.max(oheight - top - bottom, 0);\n }\n\n var i = 0;\n\n if (top > 0 && left > 0)\n insert(i++, 0, 0, left, top, 0, 0, left, top);\n if (bottom > 0 && left > 0)\n insert(i++, 0, height + top, left, bottom, 0, oheight + top, left, bottom);\n if (top > 0 && right > 0)\n insert(i++, width + left, 0, right, top, owidth + left, 0, right, top);\n if (bottom > 0 && right > 0)\n insert(i++, width + left, height + top, right, bottom, owidth + left,\n oheight + top, right, bottom);\n\n if (stretch) {\n if (top > 0)\n insert(i++, left, 0, width, top, left, 0, owidth, top);\n if (bottom > 0)\n insert(i++, left, height + top, width, bottom, left, oheight + top,\n owidth, bottom);\n if (left > 0)\n insert(i++, 0, top, left, height, 0, top, left, oheight);\n if (right > 0)\n insert(i++, width + left, top, right, height, owidth + left, top, right,\n oheight);\n // center\n insert(i++, left, top, width, height, left, top, owidth, oheight);\n\n } else { // tile\n var l = left, r = owidth, w;\n while (r > 0) {\n w = Math.min(width, r), r -= width;\n var t = top, b = oheight, h;\n while (b > 0) {\n h = Math.min(height, b), b -= height;\n insert(i++, left, top, w, h, l, t, w, h);\n if (r <= 0) {\n if (left)\n insert(i++, 0, top, left, h, 0, t, left, h);\n if (right)\n insert(i++, width + left, top, right, h, l + w, t, right, h);\n }\n t += h;\n }\n if (top)\n insert(i++, left, 0, w, top, l, 0, w, top);\n if (bottom)\n insert(i++, left, height + top, w, bottom, l, t, w, bottom);\n l += w;\n }\n }\n\n return i;\n};","var Class = require('./core');\nrequire('./pin');\nrequire('./loop');\n\nvar repeat = require('./util/repeat');\nvar create = require('./util/create');\n\nmodule.exports = Image;\n\nClass.image = function(image) {\n var img = new Image();\n image && img.image(image);\n return img;\n};\n\nImage._super = Class;\nImage.prototype = create(Image._super.prototype);\n\nfunction Image() {\n Image._super.call(this);\n this.label('Image');\n this._textures = [];\n this._image = null;\n};\n\n/**\n * @deprecated Use image\n */\nImage.prototype.setImage = function(a, b, c) {\n return this.image(a, b, c);\n};\n\nImage.prototype.image = function(image) {\n this._image = Class.texture(image).one();\n this.pin('width', this._image ? this._image.width : 0);\n this.pin('height', this._image ? this._image.height : 0);\n this._textures[0] = this._image.pipe();\n this._textures.length = 1;\n return this;\n};\n\nImage.prototype.tile = function(inner) {\n this._repeat(false, inner);\n return this;\n};\n\nImage.prototype.stretch = function(inner) {\n this._repeat(true, inner);\n return this;\n};\n\nImage.prototype._repeat = function(stretch, inner) {\n var self = this;\n this.untick(this._repeatTicker);\n this.tick(this._repeatTicker = function() {\n if (this._mo_stretch == this._pin._ts_transform) {\n return;\n }\n this._mo_stretch = this._pin._ts_transform;\n var width = this.pin('width');\n var height = this.pin('height');\n this._textures.length = repeat(this._image, width, height, stretch, inner,\n insert);\n });\n\n function insert(i, sx, sy, sw, sh, dx, dy, dw, dh) {\n var repeat = self._textures.length > i ? self._textures[i]\n : self._textures[i] = self._image.pipe();\n repeat.src(sx, sy, sw, sh);\n repeat.dest(dx, dy, dw, dh);\n }\n};\n","var Class = require('./core');\nrequire('./pin');\nrequire('./loop');\n\nvar create = require('./util/create');\nvar math = require('./util/math');\n\nClass.anim = function(frames, fps) {\n var anim = new Anim();\n anim.frames(frames).gotoFrame(0);\n fps && anim.fps(fps);\n return anim;\n};\n\nAnim._super = Class;\nAnim.prototype = create(Anim._super.prototype);\n\n// TODO: replace with atlas fps or texture time\nClass.Anim = {\n FPS : 15\n};\n\nfunction Anim() {\n Anim._super.call(this);\n this.label('Anim');\n\n this._textures = [];\n\n this._fps = Class.Anim.FPS;\n this._ft = 1000 / this._fps;\n\n this._time = -1;\n this._repeat = 0;\n\n this._index = 0;\n this._frames = [];\n\n var lastTime = 0;\n this.tick(function(t, now, last) {\n if (this._time < 0 || this._frames.length <= 1) {\n return;\n }\n\n // ignore old elapsed\n var ignore = lastTime != last;\n lastTime = now;\n if (ignore) {\n return true;\n }\n\n this._time += t;\n if (this._time < this._ft) {\n return true;\n }\n var n = this._time / this._ft | 0;\n this._time -= n * this._ft;\n this.moveFrame(n);\n if (this._repeat > 0 && (this._repeat -= n) <= 0) {\n this.stop();\n this._callback && this._callback();\n return false;\n }\n return true;\n }, false);\n};\n\nAnim.prototype.fps = function(fps) {\n if (typeof fps === 'undefined') {\n return this._fps;\n }\n this._fps = fps > 0 ? fps : Class.Anim.FPS;\n this._ft = 1000 / this._fps;\n return this;\n};\n\n/**\n * @deprecated Use frames\n */\nAnim.prototype.setFrames = function(a, b, c) {\n return this.frames(a, b, c);\n};\n\nAnim.prototype.frames = function(frames) {\n this._index = 0;\n this._frames = Class.texture(frames).array();\n this.touch();\n return this;\n};\n\nAnim.prototype.length = function() {\n return this._frames ? this._frames.length : 0;\n};\n\nAnim.prototype.gotoFrame = function(frame, resize) {\n this._index = math.rotate(frame, this._frames.length) | 0;\n resize = resize || !this._textures[0];\n this._textures[0] = this._frames[this._index];\n if (resize) {\n this.pin('width', this._textures[0].width);\n this.pin('height', this._textures[0].height);\n }\n this.touch();\n return this;\n};\n\nAnim.prototype.moveFrame = function(move) {\n return this.gotoFrame(this._index + move);\n};\n\nAnim.prototype.repeat = function(repeat, callback) {\n this._repeat = repeat * this._frames.length - 1;\n this._callback = callback;\n this.play();\n return this;\n};\n\nAnim.prototype.play = function(frame) {\n if (typeof frame !== 'undefined') {\n this.gotoFrame(frame);\n this._time = 0;\n } else if (this._time < 0) {\n this._time = 0;\n }\n\n this.touch();\n return this;\n};\n\nAnim.prototype.stop = function(frame) {\n this._time = -1;\n if (typeof frame !== 'undefined') {\n this.gotoFrame(frame);\n }\n return this;\n};\n","var Class = require('./core');\nrequire('./pin');\nrequire('./loop');\n\nvar create = require('./util/create');\nvar is = require('./util/is');\n\nClass.string = function(frames) {\n return new Str().frames(frames);\n};\n\nStr._super = Class;\nStr.prototype = create(Str._super.prototype);\n\nfunction Str() {\n Str._super.call(this);\n this.label('String');\n this._textures = [];\n};\n\n/**\n * @deprecated Use frames\n */\nStr.prototype.setFont = function(a, b, c) {\n return this.frames(a, b, c);\n};\n\nStr.prototype.frames = function(frames) {\n this._textures = [];\n if (typeof frames == 'string') {\n frames = Class.texture(frames);\n this._item = function(value) {\n return frames.one(value);\n };\n } else if (typeof frames === 'object') {\n this._item = function(value) {\n return frames[value];\n };\n } else if (typeof frames === 'function') {\n this._item = frames;\n }\n return this;\n};\n\n/**\n * @deprecated Use value\n */\nStr.prototype.setValue = function(a, b, c) {\n return this.value(a, b, c);\n};\n\nStr.prototype.value = function(value) {\n if (typeof value === 'undefined') {\n return this._value;\n }\n if (this._value === value) {\n return this;\n }\n this._value = value;\n\n if (value === null) {\n value = '';\n } else if (typeof value !== 'string' && !is.array(value)) {\n value = value.toString();\n }\n\n this._spacing = this._spacing || 0;\n\n var width = 0, height = 0;\n for (var i = 0; i < value.length; i++) {\n var image = this._textures[i] = this._item(value[i]);\n width += i > 0 ? this._spacing : 0;\n image.dest(width, 0);\n width = width + image.width;\n height = Math.max(height, image.height);\n }\n this.pin('width', width);\n this.pin('height', height);\n this._textures.length = value.length;\n return this;\n};\n","function _identity(x) {\n return x;\n};\nvar _cache = {};\nvar _modes = {};\nvar _easings = {};\n\nfunction Easing(token) {\n if (typeof token === 'function') {\n return token;\n }\n if (typeof token !== 'string') {\n return _identity;\n }\n var fn = _cache[token];\n if (fn) {\n return fn;\n }\n var match = /^(\\w+)(-(in|out|in-out|out-in))?(\\((.*)\\))?$/i.exec(token);\n if (!match || !match.length) {\n return _identity;\n }\n var easing = _easings[match[1]];\n var mode = _modes[match[3]];\n var params = match[5];\n if (easing && easing.fn) {\n fn = easing.fn;\n } else if (easing && easing.fc) {\n fn = easing.fc.apply(easing.fc, params\n && params.replace(/\\s+/, '').split(','));\n } else {\n fn = _identity;\n }\n if (mode) {\n fn = mode.fn(fn);\n }\n // TODO: It can be a memory leak with different `params`.\n _cache[token] = fn;\n return fn;\n};\n\nEasing.add = function(data) {\n // TODO: create a map of all { name-mode : data }\n var names = (data.name || data.mode).split(/\\s+/);\n for (var i = 0; i < names.length; i++) {\n var name = names[i];\n if (name) {\n (data.name ? _easings : _modes)[name] = data;\n }\n }\n};\n\nEasing.add({\n mode : 'in',\n fn : function(f) {\n return f;\n }\n});\n\nEasing.add({\n mode : 'out',\n fn : function(f) {\n return function(t) {\n return 1 - f(1 - t);\n };\n }\n});\n\nEasing.add({\n mode : 'in-out',\n fn : function(f) {\n return function(t) {\n return (t < 0.5) ? (f(2 * t) / 2) : (1 - f(2 * (1 - t)) / 2);\n };\n }\n});\n\nEasing.add({\n mode : 'out-in',\n fn : function(f) {\n return function(t) {\n return (t < 0.5) ? (1 - f(2 * (1 - t)) / 2) : (f(2 * t) / 2);\n };\n }\n});\n\nEasing.add({\n name : 'linear',\n fn : function(t) {\n return t;\n }\n});\n\nEasing.add({\n name : 'quad',\n fn : function(t) {\n return t * t;\n }\n});\n\nEasing.add({\n name : 'cubic',\n fn : function(t) {\n return t * t * t;\n }\n});\n\nEasing.add({\n name : 'quart',\n fn : function(t) {\n return t * t * t * t;\n }\n});\n\nEasing.add({\n name : 'quint',\n fn : function(t) {\n return t * t * t * t * t;\n }\n});\n\nEasing.add({\n name : 'sin sine',\n fn : function(t) {\n return 1 - Math.cos(t * Math.PI / 2);\n }\n});\n\nEasing.add({\n name : 'exp expo',\n fn : function(t) {\n return t == 0 ? 0 : Math.pow(2, 10 * (t - 1));\n }\n});\n\nEasing.add({\n name : 'circle circ',\n fn : function(t) {\n return 1 - Math.sqrt(1 - t * t);\n }\n});\n\nEasing.add({\n name : 'bounce',\n fn : function(t) {\n return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625\n * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625\n * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t\n + .984375;\n }\n});\n\nEasing.add({\n name : 'poly',\n fc : function(e) {\n return function(t) {\n return Math.pow(t, e);\n };\n }\n});\n\nEasing.add({\n name : 'elastic',\n fc : function(a, p) {\n p = p || 0.45;\n a = a || 1;\n var s = p / (2 * Math.PI) * Math.asin(1 / a);\n return function(t) {\n return 1 + a * Math.pow(2, -10 * t)\n * Math.sin((t - s) * (2 * Math.PI) / p);\n };\n }\n});\n\nEasing.add({\n name : 'back',\n fc : function(s) {\n s = typeof s !== 'undefined' ? s : 1.70158;\n return function(t) {\n return t * t * ((s + 1) * t - s);\n };\n }\n});\n\nmodule.exports = Easing;\n","var Class = require('./core');\nrequire('./pin');\nrequire('./loop');\n\nvar create = require('./util/create');\n\nClass.row = function(align) {\n return Class.create().row(align).label('Row');\n};\n\nClass.prototype.row = function(align) {\n this.sequence('row', align);\n return this;\n};\n\nClass.column = function(align) {\n return Class.create().column(align).label('Row');\n};\n\nClass.prototype.column = function(align) {\n this.sequence('column', align);\n return this;\n};\n\nClass.sequence = function(type, align) {\n return Class.create().sequence(type, align).label('Sequence');\n};\n\nClass.prototype.sequence = function(type, align) {\n\n this._padding = this._padding || 0;\n this._spacing = this._spacing || 0;\n\n this.untick(this._layoutTiker);\n this.tick(this._layoutTiker = function() {\n if (this._mo_seq == this._ts_touch) {\n return;\n }\n this._mo_seq = this._ts_touch;\n\n var alignChildren = (this._mo_seqAlign != this._ts_children);\n this._mo_seqAlign = this._ts_children;\n\n var width = 0, height = 0;\n\n var child, next = this.first(true);\n var first = true;\n while (child = next) {\n next = child.next(true);\n\n child.matrix(true);\n var w = child.pin('boxWidth');\n var h = child.pin('boxHeight');\n\n if (type == 'column') {\n !first && (height += this._spacing);\n child.pin('offsetY') != height && child.pin('offsetY', height);\n width = Math.max(width, w);\n height = height + h;\n alignChildren && child.pin('alignX', align);\n\n } else if (type == 'row') {\n !first && (width += this._spacing);\n child.pin('offsetX') != width && child.pin('offsetX', width);\n width = width + w;\n height = Math.max(height, h);\n alignChildren && child.pin('alignY', align);\n }\n first = false;\n }\n width += 2 * this._padding;\n height += 2 * this._padding;\n this.pin('width') != width && this.pin('width', width);\n this.pin('height') != height && this.pin('height', height);\n });\n return this;\n};\n\nClass.box = function() {\n return Class.create().box().label('Box');\n};\n\nClass.prototype.box = function() {\n this._padding = this._padding || 0;\n\n this.untick(this._layoutTiker);\n this.tick(this._layoutTiker = function() {\n if (this._mo_box == this._ts_touch) {\n return;\n }\n this._mo_box = this._ts_touch;\n\n var width = 0, height = 0;\n var child, next = this.first(true);\n while (child = next) {\n next = child.next(true);\n child.matrix(true);\n var w = child.pin('boxWidth');\n var h = child.pin('boxHeight');\n width = Math.max(width, w);\n height = Math.max(height, h);\n }\n width += 2 * this._padding;\n height += 2 * this._padding;\n this.pin('width') != width && this.pin('width', width);\n this.pin('height') != height && this.pin('height', height);\n });\n return this;\n};\n\nClass.layer = function() {\n return Class.create().layer().label('Layer');\n};\n\nClass.prototype.layer = function() {\n\n this.untick(this._layoutTiker);\n this.tick(this._layoutTiker = function() {\n var parent = this.parent();\n if (parent) {\n var width = parent.pin('width');\n if (this.pin('width') != width) {\n this.pin('width', width);\n }\n var height = parent.pin('height');\n if (this.pin('height') != height) {\n this.pin('height', height);\n }\n }\n }, true);\n return this;\n};\n\n// TODO: move padding to pin\nClass.prototype.padding = function(pad) {\n this._padding = pad;\n return this;\n};\n\nClass.prototype.spacing = function(space) {\n this._spacing = space;\n return this;\n};\n","var Easing = require('./easing');\nvar Class = require('../core');\nvar Pin = require('../pin');\n\nClass.prototype.tween = function(duration, delay, append) {\n if (typeof duration !== 'number') {\n append = duration, delay = 0, duration = 0;\n } else if (typeof delay !== 'number') {\n append = delay, delay = 0;\n }\n\n if (!this._tweens) {\n this._tweens = [];\n var ticktime = 0;\n this.tick(function(elapsed, now, last) {\n if (!this._tweens.length) {\n return;\n }\n\n // ignore old elapsed\n var ignore = ticktime != last;\n ticktime = now;\n if (ignore) {\n return true;\n }\n\n var head = this._tweens[0];\n\n var next = head.tick(this, elapsed, now, last);\n\n if (next && head === this._tweens[0]) {\n this._tweens.shift();\n }\n\n if (Array.isArray(next)) {\n for (var i = 0; i < next.length; i++) {\n try {\n next[i].call(this);\n } catch (e) {\n console.log(e);\n }\n }\n } else if (typeof next === 'object') {\n this._tweens.unshift(next);\n }\n\n return true;\n }, true);\n }\n\n this.touch();\n if (!append) {\n this._tweens.length = 0;\n }\n var tween = new Tween(this, duration, delay);\n this._tweens.push(tween);\n return tween;\n};\n\nfunction Tween(owner, duration, delay) {\n this._end = {};\n this._duration = duration || 400;\n this._delay = delay || 0;\n\n this._owner = owner;\n this._time = 0;\n};\n\nTween.prototype.tick = function(node, elapsed, now, last) {\n this._time += elapsed;\n\n if (this._time < this._delay) {\n return;\n }\n\n var time = this._time - this._delay;\n\n if (!this._start) {\n this._start = {};\n for ( var key in this._end) {\n this._start[key] = this._owner.pin(key);\n }\n }\n\n var p, over;\n if (time < this._duration) {\n p = time / this._duration;\n over = false;\n } else {\n p = 1;\n over = true;\n }\n\n if (typeof this._easing == 'function') {\n p = this._easing(p);\n }\n\n var q = 1 - p;\n\n for ( var key in this._end) {\n this._owner.pin(key, this._start[key] * q + this._end[key] * p);\n }\n\n if (over) {\n var actions = [this._hide, this._remove, this._done];\n actions = actions.filter(function( element ) {\n return typeof element === 'function';\n });\n return this._next || actions;\n }\n};\n\nTween.prototype.tween = function(duration, delay) {\n return this._next = new Tween(this._owner, duration, delay);\n};\n\nTween.prototype.duration = function(duration) {\n this._duration = duration;\n return this;\n};\n\nTween.prototype.delay = function(delay) {\n this._delay = delay;\n return this;\n};\n\nTween.prototype.ease = function(easing) {\n this._easing = Easing(easing);\n return this;\n};\n\nTween.prototype.done = function(fn) {\n this._done = fn;\n return this;\n};\n\nTween.prototype.hide = function() {\n this._hide = function() {\n this.hide();\n };\n return this;\n};\n\nTween.prototype.remove = function() {\n this._remove = function() {\n this.remove();\n };\n return this;\n};\n\nTween.prototype.pin = function(a, b) {\n if (typeof a === 'object') {\n for ( var attr in a) {\n pinning(this._owner, this._end, attr, a[attr]);\n }\n } else if (typeof b !== 'undefined') {\n pinning(this._owner, this._end, a, b);\n }\n return this;\n};\n\nfunction pinning(node, map, key, value) {\n if (typeof node.pin(key) === 'number') {\n map[key] = value;\n } else if (typeof node.pin(key + 'X') === 'number'\n && typeof node.pin(key + 'Y') === 'number') {\n map[key + 'X'] = value;\n map[key + 'Y'] = value;\n }\n}\n\nPin._add_shortcuts(Tween);\n\n/**\n * @deprecated Use .done(fn) instead.\n */\nTween.prototype.then = function(fn) {\n this.done(fn);\n return this;\n};\n\n/**\n * @deprecated NOOP\n */\nTween.prototype.clear = function(forward) {\n return this;\n};\n\nmodule.exports = Tween;\n","if (typeof DEBUG === 'undefined')\n DEBUG = true;\n\nrequire('../core')._load(function(stage, elem) {\n Mouse.subscribe(stage, elem);\n});\n\n// TODO: capture mouse\n\nMouse.CLICK = 'click';\nMouse.START = 'touchstart mousedown';\nMouse.MOVE = 'touchmove mousemove';\nMouse.END = 'touchend mouseup';\nMouse.CANCEL = 'touchcancel mousecancel';\n\nMouse.subscribe = function(stage, elem) {\n if (stage.mouse) {\n return;\n }\n\n stage.mouse = new Mouse(stage, elem);\n\n // `click` events are synthesized from start/end events on same nodes\n // `mousecancel` events are synthesized on blur or mouseup outside element\n\n elem.addEventListener('touchstart', handleStart);\n elem.addEventListener('touchend', handleEnd);\n elem.addEventListener('touchmove', handleMove);\n elem.addEventListener('touchcancel', handleCancel);\n\n elem.addEventListener('mousedown', handleStart);\n elem.addEventListener('mouseup', handleEnd);\n elem.addEventListener('mousemove', handleMove);\n\n document.addEventListener('mouseup', handleCancel);\n window.addEventListener(\"blur\", handleCancel);\n\n var clicklist = [], cancellist = [];\n\n function handleStart(event) {\n event.preventDefault();\n stage.mouse.locate(event);\n // DEBUG && console.log('Mouse Start: ' + event.type + ' ' + mouse);\n stage.mouse.publish(event.type, event);\n\n stage.mouse.lookup('click', clicklist);\n stage.mouse.lookup('mousecancel', cancellist);\n }\n\n function handleMove(event) {\n event.preventDefault();\n stage.mouse.locate(event);\n stage.mouse.publish(event.type, event);\n }\n\n function handleEnd(event) {\n event.preventDefault();\n // up/end location is not available, last one is used instead\n // DEBUG && console.log('Mouse End: ' + event.type + ' ' + mouse);\n stage.mouse.publish(event.type, event);\n\n if (clicklist.length) {\n // DEBUG && console.log('Mouse Click: ' + clicklist.length);\n stage.mouse.publish('click', event, clicklist);\n }\n cancellist.length = 0;\n }\n\n function handleCancel(event) {\n if (cancellist.length) {\n // DEBUG && console.log('Mouse Cancel: ' + event.type);\n stage.mouse.publish('mousecancel', event, cancellist);\n }\n clicklist.length = 0;\n }\n};\n\nfunction Mouse(stage, elem) {\n if (!(this instanceof Mouse)) {\n // old-style mouse subscription\n return;\n }\n\n var ratio = stage.viewport().ratio || 1;\n\n stage.on('viewport', function(size) {\n ratio = size.ratio || ratio;\n });\n\n this.x = 0;\n this.y = 0;\n this.toString = function() {\n return (this.x | 0) + 'x' + (this.y | 0);\n };\n this.locate = function(event) {\n locateElevent(elem, event, this);\n this.x *= ratio;\n this.y *= ratio;\n };\n this.lookup = function(type, collect) {\n this.type = type;\n this.root = stage;\n this.event = null;\n collect.length = 0;\n this.collect = collect;\n\n this.root.visit(this.visitor, this);\n };\n this.publish = function(type, event, targets) {\n this.type = type;\n this.root = stage;\n this.event = event;\n this.collect = false;\n this.timeStamp = Date.now();\n\n if (type !== 'mousemove' && type !== 'touchmove') {\n DEBUG && console.log(this.type + ' ' + this);\n }\n\n if (targets) {\n while (targets.length)\n if (this.visitor.end(targets.shift(), this))\n break;\n targets.length = 0;\n } else {\n this.root.visit(this.visitor, this);\n }\n };\n this.visitor = {\n reverse : true,\n visible : true,\n start : function(node, mouse) {\n return !node._flag(mouse.type);\n },\n end : function(node, mouse) {\n // mouse: event/collect, type, root\n rel.raw = mouse.event;\n rel.type = mouse.type;\n rel.timeStamp = mouse.timeStamp;\n rel.abs.x = mouse.x;\n rel.abs.y = mouse.y;\n\n var listeners = node.listeners(mouse.type);\n if (!listeners) {\n return;\n }\n node.matrix().inverse().map(mouse, rel);\n if (!(node === mouse.root || node.attr('spy') || node.hitTest(rel))) {\n return;\n }\n if (mouse.collect) {\n mouse.collect.push(node);\n }\n if (mouse.event) {\n var cancel = false;\n for (var l = 0; l < listeners.length; l++) {\n cancel = listeners[l].call(node, rel) ? true : cancel;\n }\n return cancel;\n }\n }\n };\n};\n\n// TODO: define per mouse object with get-only x and y\nvar rel = {}, abs = {};\n\ndefineValue(rel, 'clone', function(obj) {\n obj = obj || {}, obj.x = this.x, obj.y = this.y;\n return obj;\n});\ndefineValue(rel, 'toString', function() {\n return (this.x | 0) + 'x' + (this.y | 0) + ' (' + this.abs + ')';\n});\ndefineValue(rel, 'abs', abs);\ndefineValue(abs, 'clone', function(obj) {\n obj = obj || {}, obj.x = this.x, obj.y = this.y;\n return obj;\n});\ndefineValue(abs, 'toString', function() {\n return (this.x | 0) + 'x' + (this.y | 0);\n});\n\nfunction defineValue(obj, name, value) {\n Object.defineProperty(obj, name, {\n value : value\n });\n}\n\nfunction locateElevent(el, ev, loc) {\n // pageX/Y if available?\n if (ev.touches && ev.touches.length) {\n loc.x = ev.touches[0].clientX;\n loc.y = ev.touches[0].clientY;\n } else {\n loc.x = ev.clientX;\n loc.y = ev.clientY;\n }\n var rect = el.getBoundingClientRect();\n loc.x -= rect.left;\n loc.y -= rect.top;\n loc.x -= el.clientLeft | 0;\n loc.y -= el.clientTop | 0;\n return loc;\n};\n\nmodule.exports = Mouse;\n","/**\n * Default loader for web.\n */\n\nif (typeof DEBUG === 'undefined')\n DEBUG = true;\n\nvar Class = require('../core');\n\nClass._supported = (function() {\n var elem = document.createElement('canvas');\n return (elem.getContext && elem.getContext('2d')) ? true : false;\n})();\n\nwindow.addEventListener('load', function() {\n DEBUG && console.log('On load.');\n if (Class._supported) {\n Class.start();\n }\n // TODO if not supported\n}, false);\n\nClass.config({\n 'app-loader' : AppLoader,\n 'image-loader' : ImageLoader\n});\n\nfunction AppLoader(app, configs) {\n configs = configs || {};\n var canvas = configs.canvas, context = null, full = false;\n var width = 0, height = 0, ratio = 1;\n\n if (typeof canvas === 'string') {\n canvas = document.getElementById(canvas);\n }\n\n if (!canvas) {\n canvas = document.getElementById('cutjs')\n || document.getElementById('stage');\n }\n\n if (!canvas) {\n full = true;\n DEBUG && console.log('Creating Canvas...');\n canvas = document.createElement('canvas');\n canvas.style.position = 'absolute';\n canvas.style.top = '0';\n canvas.style.left = '0';\n\n var body = document.body;\n body.insertBefore(canvas, body.firstChild);\n }\n\n context = canvas.getContext('2d');\n\n var devicePixelRatio = window.devicePixelRatio || 1;\n var backingStoreRatio = context.webkitBackingStorePixelRatio\n || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio\n || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1;\n ratio = devicePixelRatio / backingStoreRatio;\n\n var requestAnimationFrame = window.requestAnimationFrame\n || window.msRequestAnimationFrame || window.mozRequestAnimationFrame\n || window.webkitRequestAnimationFrame || window.oRequestAnimationFrame\n || function(callback) {\n return window.setTimeout(callback, 1000 / 60);\n };\n\n DEBUG && console.log('Creating stage...');\n var root = Class.root(requestAnimationFrame, render);\n\n function render() {\n if (width > 0 && height > 0) {\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.clearRect(0, 0, width, height);\n root.render(context);\n }\n }\n\n root.background = function(color) {\n canvas.style.backgroundColor = color;\n return this;\n };\n\n app(root, canvas);\n\n // resize();\n // window.addEventListener('resize', resize, false);\n // window.addEventListener('orientationchange', resize, false);\n\n var lastWidth = -1;\n var lastHeight = -1;\n (function resizeLoop() {\n var width, height;\n if (full) {\n // screen.availWidth/Height?\n width = (window.innerWidth > 0 ? window.innerWidth : screen.width);\n height = (window.innerHeight > 0 ? window.innerHeight : screen.height);\n } else {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n }\n if (lastWidth !== width || lastHeight !== height) {\n lastWidth = width;\n lastHeight = height;\n resize();\n }\n requestAnimationFrame(resizeLoop);\n })();\n\n function resize() {\n\n if (full) {\n // screen.availWidth/Height?\n width = (window.innerWidth > 0 ? window.innerWidth : screen.width);\n height = (window.innerHeight > 0 ? window.innerHeight : screen.height);\n\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n\n } else {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n }\n\n width *= ratio;\n height *= ratio;\n\n if (canvas.width === width && canvas.height === height) {\n return;\n }\n\n canvas.width = width;\n canvas.height = height;\n\n DEBUG && console.log('Resize: ' + width + ' x ' + height + ' / ' + ratio);\n\n root.viewport(width, height, ratio);\n\n render();\n }\n}\n\nfunction ImageLoader(src, success, error) {\n DEBUG && console.log('Loading image: ' + src);\n var image = new Image();\n image.onload = function() {\n success(image);\n };\n image.onerror = error;\n image.src = src;\n}\n","module.exports = require('../lib/');\n\nmodule.exports.internal = {};\n\nrequire('../lib/canvas');\nmodule.exports.internal.Image = require('../lib/image');\nrequire('../lib/anim');\nrequire('../lib/str');\nrequire('../lib/layout');\nrequire('../lib/addon/tween');\nmodule.exports.Mouse = require('../lib/addon/mouse');\nmodule.exports.Math = require('../lib/util/math');\nmodule.exports._extend = require('../lib/util/extend');\nmodule.exports._create = require('../lib/util/create');\n\nrequire('../lib/loader/web');","import {\n AABB,\n Body,\n Fixture,\n Joint,\n MouseJoint,\n Vec2,\n World\n} from '../src/index';\nimport { default as Stage } from 'stage-js/platform/web';\n\nexport interface ActiveKeys {\n 0?: boolean;\n 1?: boolean;\n 2?: boolean;\n 3?: boolean;\n 4?: boolean;\n 5?: boolean;\n 6?: boolean;\n 7?: boolean;\n 8?: boolean;\n 9?: boolean;\n A?: boolean;\n B?: boolean;\n C?: boolean;\n D?: boolean;\n E?: boolean;\n F?: boolean;\n G?: boolean;\n H?: boolean;\n I?: boolean;\n J?: boolean;\n K?: boolean;\n L?: boolean;\n M?: boolean;\n N?: boolean;\n O?: boolean;\n P?: boolean;\n Q?: boolean;\n R?: boolean;\n S?: boolean;\n T?: boolean;\n U?: boolean;\n V?: boolean;\n W?: boolean;\n X?: boolean;\n Y?: boolean;\n Z?: boolean;\n right?: boolean;\n left?: boolean;\n up?: boolean;\n down?: boolean;\n fire?: boolean;\n}\n\nexport interface Testbed {\n /** @private @internal */ _pause: any;\n /** @private @internal */ _resume: any;\n /** @private @internal */ _status: any;\n /** @private @internal */ _info: any;\n\n /** @private @internal */ resume: any;\n /** @private @internal */ pause: any;\n /** @private @internal */ isPaused: any;\n /** @private @internal */ togglePause: any;\n /** @private @internal */ canvas: any;\n /** @private @internal */ focus: () => void;\n\n // camera position\n /** World viewbox width. */\n width: number;\n /** World viewbox height. */\n height: number;\n /** World viewbox center vertical offset. */\n x: number;\n /** World viewbox center horizontal offset. */\n y: number;\n\n scaleY: number;\n ratio: number;\n\n /** World simulation step frequency */\n hz: number;\n /** World simulation speed, default is 1 */\n speed: number;\n\n activeKeys: ActiveKeys;\n background: string;\n\n mouseForce?: number;\n\n status(name: string, value: any): void;\n status(value: object | string): void;\n info(text: string): void;\n\n drawPoint(p: {x: number, y: number}, r: any, color: string): void;\n drawCircle(p: {x: number, y: number}, r: number, color: string): void;\n drawSegment(a: {x: number, y: number}, b: {x: number, y: number}, color: string): void;\n drawPolygon(points: Array<{x: number, y: number}>, color: string): void;\n drawAABB(aabb: AABB, color: string): void;\n color(r: number, g: number, b: number): string;\n\n // callbacks\n step?: (dt: number, t: number) => void;\n keydown?: (keyCode: number, label: string) => void;\n keyup?: (keyCode: number, label: string) => void;\n\n findOne: (query: string) => Body | Joint | Fixture | null;\n findAll: (query: string) => Body[] | Joint[] | Fixture[];\n}\n\nexport function testbed(opts: object, callback: (testbed: Testbed) => World);\nexport function testbed(callback: (testbed: Testbed) => World);\nexport function testbed(opts, callback?) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = null;\n }\n\n Stage(function(stage, canvas) {\n\n stage.on(Stage.Mouse.START, function() {\n window.focus();\n // @ts-ignore\n document.activeElement && document.activeElement.blur();\n canvas.focus();\n });\n\n stage.MAX_ELAPSE = 1000 / 30;\n\n // @ts-ignore\n const testbed: Testbed = {};\n testbed.canvas = canvas;\n\n let paused = false;\n stage.on('resume', function() {\n paused = false;\n testbed._resume && testbed._resume();\n });\n stage.on('pause', function() {\n paused = true;\n testbed._pause && testbed._pause();\n });\n testbed.isPaused = function() {\n return paused;\n };\n testbed.togglePause = function() {\n paused ? testbed.resume() : testbed.pause();\n };\n testbed.pause = function() {\n stage.pause();\n };\n testbed.resume = function() {\n stage.resume();\n testbed.focus();\n };\n testbed.focus = function() {\n // @ts-ignore\n document.activeElement && document.activeElement.blur();\n canvas.focus();\n };\n\n testbed.width = 80;\n testbed.height = 60;\n testbed.x = 0;\n testbed.y = -10;\n testbed.scaleY = -1;\n testbed.ratio = 16;\n testbed.hz = 60;\n testbed.speed = 1;\n testbed.activeKeys = {};\n testbed.background = '#222222';\n\n testbed.findOne = function() {\n // todo: implement\n return null;\n };\n\n testbed.findAll = function() {\n // todo: implement\n return [];\n };\n\n let statusText = '';\n const statusMap = {};\n\n function statusSet(name, value) {\n if (typeof value !== 'function' && typeof value !== 'object') {\n statusMap[name] = value;\n }\n }\n\n function statusMerge(obj) {\n // tslint:disable-next-line:no-for-in\n for (const key in obj) {\n statusSet(key, obj[key]);\n }\n }\n\n testbed.status = function(a, b?) {\n if (typeof b !== 'undefined') {\n statusSet(a, b);\n } else if (a && typeof a === 'object') {\n statusMerge(a);\n } else if (typeof a === 'string') {\n statusText = a;\n }\n\n testbed._status && testbed._status(statusText, statusMap);\n };\n\n testbed.info = function(text) {\n testbed._info && testbed._info(text);\n };\n\n let lastDrawHash = \"\";\n let drawHash = \"\";\n\n (function() {\n const drawingTexture = new Stage.Texture();\n stage.append(Stage.image(drawingTexture));\n\n const buffer = [];\n stage.tick(function() {\n buffer.length = 0;\n }, true);\n\n drawingTexture.draw = function(ctx) {\n ctx.save();\n ctx.transform(1, 0, 0, testbed.scaleY, -testbed.x, -testbed.y);\n ctx.lineWidth = 2 / testbed.ratio;\n ctx.lineCap = 'round';\n for (let drawing = buffer.shift(); drawing; drawing = buffer.shift()) {\n drawing(ctx, testbed.ratio);\n }\n ctx.restore();\n };\n\n testbed.drawPoint = function(p, r, color) {\n buffer.push(function(ctx, ratio) {\n ctx.beginPath();\n ctx.arc(p.x, p.y, 5 / ratio, 0, 2 * Math.PI);\n ctx.strokeStyle = color;\n ctx.stroke();\n });\n drawHash += \"point\" + p.x + ',' + p.y + ',' + r + ',' + color;\n };\n\n testbed.drawCircle = function(p, r, color) {\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.arc(p.x, p.y, r, 0, 2 * Math.PI);\n ctx.strokeStyle = color;\n ctx.stroke();\n });\n drawHash += \"circle\" + p.x + ',' + p.y + ',' + r + ',' + color;\n };\n\n testbed.drawSegment = function(a, b, color) {\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(b.x, b.y);\n ctx.strokeStyle = color;\n ctx.stroke();\n });\n drawHash += \"segment\" + a.x + ',' + a.y + ',' + b.x + ',' + b.y + ',' + color;\n };\n\n testbed.drawPolygon = function(points, color) {\n if (!points || !points.length) {\n return;\n }\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y);\n }\n ctx.strokeStyle = color;\n ctx.closePath();\n ctx.stroke();\n });\n drawHash += \"segment\";\n for (let i = 1; i < points.length; i++) {\n drawHash += points[i].x + ',' + points[i].y + ',';\n }\n drawHash += color;\n };\n\n testbed.drawAABB = function(aabb, color) {\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.moveTo(aabb.lowerBound.x, aabb.lowerBound.y);\n ctx.lineTo(aabb.upperBound.x, aabb.lowerBound.y);\n ctx.lineTo(aabb.upperBound.x, aabb.upperBound.y);\n ctx.lineTo(aabb.lowerBound.x, aabb.upperBound.y);\n ctx.strokeStyle = color;\n ctx.closePath();\n ctx.stroke();\n });\n drawHash += \"aabb\";\n drawHash += aabb.lowerBound.x + ',' + aabb.lowerBound.y + ',';\n drawHash += aabb.upperBound.x + ',' + aabb.upperBound.y + ',';\n drawHash += color;\n };\n\n testbed.color = function(r, g, b) {\n r = r * 256 | 0;\n g = g * 256 | 0;\n b = b * 256 | 0;\n return 'rgb(' + r + ', ' + g + ', ' + b + ')';\n };\n\n })();\n\n const world = callback(testbed);\n\n const viewer = new Viewer(world, testbed);\n\n let lastX = 0;\n let lastY = 0;\n stage.tick(function(dt, t) {\n // update camera position\n if (lastX !== testbed.x || lastY !== testbed.y) {\n viewer.offset(-testbed.x, -testbed.y);\n lastX = testbed.x;\n lastY = testbed.y;\n }\n });\n\n viewer.tick(function(dt, t) {\n // call testbed step, if provided\n if (typeof testbed.step === 'function') {\n testbed.step(dt, t);\n }\n\n if (targetBody) {\n testbed.drawSegment(targetBody.getPosition(), mouseMove, 'rgba(255,255,255,0.2)');\n }\n\n if (lastDrawHash !== drawHash) {\n lastDrawHash = drawHash;\n stage.touch();\n }\n drawHash = \"\";\n\n return true;\n });\n\n // stage.empty();\n stage.background(testbed.background);\n stage.viewbox(testbed.width, testbed.height);\n stage.pin('alignX', -0.5);\n stage.pin('alignY', -0.5);\n stage.prepend(viewer);\n\n function findBody(point) {\n let body;\n const aabb = new AABB(point, point);\n world.queryAABB(aabb, function(fixture) {\n if (body) {\n return;\n }\n if (!fixture.getBody().isDynamic() || !fixture.testPoint(point)) {\n return;\n }\n body = fixture.getBody();\n return true;\n });\n return body;\n }\n\n const mouseGround = world.createBody();\n let mouseJoint;\n\n let targetBody;\n const mouseMove = {x: 0, y: 0};\n\n viewer.attr('spy', true).on(Stage.Mouse.START, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (targetBody) {\n return;\n }\n\n const body = findBody(point);\n if (!body) {\n return;\n }\n\n if (testbed.mouseForce) {\n targetBody = body;\n\n } else {\n mouseJoint = new MouseJoint({maxForce: 1000}, mouseGround, body, Vec2.clone(point));\n world.createJoint(mouseJoint);\n }\n\n }).on(Stage.Mouse.MOVE, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (mouseJoint) {\n mouseJoint.setTarget(point);\n }\n\n mouseMove.x = point.x;\n mouseMove.y = point.y;\n }).on(Stage.Mouse.END, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (mouseJoint) {\n world.destroyJoint(mouseJoint);\n mouseJoint = null;\n }\n if (targetBody) {\n const force = Vec2.sub(point, targetBody.getPosition());\n targetBody.applyForceToCenter(force.mul(testbed.mouseForce), true);\n targetBody = null;\n }\n\n }).on(Stage.Mouse.CANCEL, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (mouseJoint) {\n world.destroyJoint(mouseJoint);\n mouseJoint = null;\n }\n if (targetBody) {\n targetBody = null;\n }\n });\n\n window.addEventListener(\"keydown\", function(e) {\n switch (e.keyCode) {\n case 'P'.charCodeAt(0):\n testbed.togglePause();\n break;\n }\n }, false);\n\n const downKeys = {};\n window.addEventListener(\"keydown\", function(e) {\n const keyCode = e.keyCode;\n downKeys[keyCode] = true;\n updateActiveKeys(keyCode, true);\n testbed.keydown && testbed.keydown(keyCode, String.fromCharCode(keyCode));\n });\n window.addEventListener(\"keyup\", function(e) {\n const keyCode = e.keyCode;\n downKeys[keyCode] = false;\n updateActiveKeys(keyCode, false);\n testbed.keyup && testbed.keyup(keyCode, String.fromCharCode(keyCode));\n });\n\n const activeKeys = testbed.activeKeys;\n function updateActiveKeys(keyCode, down) {\n const char = String.fromCharCode(keyCode);\n if (/\\w/.test(char)) {\n activeKeys[char] = down;\n }\n activeKeys.right = downKeys[39] || activeKeys['D'];\n activeKeys.left = downKeys[37] || activeKeys['A'];\n activeKeys.up = downKeys[38] || activeKeys['W'];\n activeKeys.down = downKeys[40] || activeKeys['S'];\n activeKeys.fire = downKeys[32] || downKeys[13] ;\n }\n\n });\n}\n\nViewer._super = Stage;\nViewer.prototype = Stage._create(Viewer._super.prototype);\n\nfunction Viewer(world, opts) {\n Viewer._super.call(this);\n this.label('Planck');\n\n opts = opts || {};\n\n this._options = {};\n this._options.speed = opts.speed || 1;\n this._options.hz = opts.hz || 60;\n if (Math.abs(this._options.hz) < 1) {\n this._options.hz = 1 / this._options.hz;\n }\n this._options.scaleY = opts.scaleY || -1;\n this._options.ratio = opts.ratio || 16;\n this._options.lineWidth = 2 / this._options.ratio;\n\n this._world = world;\n\n const timeStep = 1 / this._options.hz;\n let elapsedTime = 0;\n this.tick((dt) => {\n dt = dt * 0.001 * this._options.speed;\n elapsedTime += dt;\n while (elapsedTime > timeStep) {\n world.step(timeStep);\n elapsedTime -= timeStep;\n }\n this.renderWorld();\n return true;\n }, true);\n\n world.on('remove-fixture', function(obj) {\n obj.ui && obj.ui.remove();\n });\n\n world.on('remove-joint', function(obj) {\n obj.ui && obj.ui.remove();\n });\n}\n\nViewer.prototype.renderWorld = function() {\n const world = this._world;\n const options = this._options;\n const viewer = this;\n\n for (let b = world.getBodyList(); b; b = b.getNext()) {\n for (let f = b.getFixtureList(); f; f = f.getNext()) {\n\n if (!f.ui) {\n if (f.render && f.render.stroke) {\n options.strokeStyle = f.render.stroke;\n } else if (b.render && b.render.stroke) {\n options.strokeStyle = b.render.stroke;\n } else if (b.isDynamic()) {\n options.strokeStyle = 'rgba(255,255,255,0.9)';\n } else if (b.isKinematic()) {\n options.strokeStyle = 'rgba(255,255,255,0.7)';\n } else if (b.isStatic()) {\n options.strokeStyle = 'rgba(255,255,255,0.5)';\n }\n\n if (f.render && f.render.fill) {\n options.fillStyle = f.render.fill;\n } else if (b.render && b.render.fill) {\n options.fillStyle = b.render.fill;\n } else {\n options.fillStyle = '';\n }\n\n const type = f.getType();\n const shape = f.getShape();\n if (type == 'circle') {\n f.ui = viewer.drawCircle(shape, options);\n }\n if (type == 'edge') {\n f.ui = viewer.drawEdge(shape, options);\n }\n if (type == 'polygon') {\n f.ui = viewer.drawPolygon(shape, options);\n }\n if (type == 'chain') {\n f.ui = viewer.drawChain(shape, options);\n }\n\n if (f.ui) {\n f.ui.appendTo(viewer);\n }\n }\n\n if (f.ui) {\n const p = b.getPosition();\n const r = b.getAngle();\n if (f.ui.__lastX !== p.x || f.ui.__lastY !== p.y || f.ui.__lastR !== r) {\n f.ui.__lastX = p.x;\n f.ui.__lastY = p.y;\n f.ui.__lastR = r;\n f.ui.offset(p.x, options.scaleY * p.y);\n f.ui.rotate(options.scaleY * r);\n }\n }\n\n }\n }\n\n for (let j = world.getJointList(); j; j = j.getNext()) {\n const type = j.getType();\n const a = j.getAnchorA();\n const b = j.getAnchorB();\n\n if (!j.ui) {\n options.strokeStyle = 'rgba(255,255,255,0.2)';\n\n j.ui = viewer.drawJoint(j, options);\n j.ui.pin('handle', 0.5);\n if (j.ui) {\n j.ui.appendTo(viewer);\n }\n }\n\n if (j.ui) {\n const cx = (a.x + b.x) * 0.5;\n const cy = options.scaleY * (a.y + b.y) * 0.5;\n const dx = a.x - b.x;\n const dy = options.scaleY * (a.y - b.y);\n const d = Math.sqrt(dx * dx + dy * dy);\n j.ui.width(d);\n j.ui.rotate(Math.atan2(dy, dx));\n j.ui.offset(cx, cy);\n }\n }\n\n};\n\nViewer.prototype.drawJoint = function(joint, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const length = 10;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(length + 2 * lw, 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n ctx.moveTo(lw, lw);\n ctx.lineTo(lw + length, lw);\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const image = Stage.image(texture).stretch();\n return image;\n};\n\nViewer.prototype.drawCircle = function(shape, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const r = shape.m_radius;\n const cx = r + lw;\n const cy = r + lw;\n const w = r * 2 + lw * 2;\n const h = r * 2 + lw * 2;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(w, h, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.arc(cx, cy, r, 0, 2 * Math.PI);\n if (options.fillStyle) {\n ctx.fillStyle = options.fillStyle;\n ctx.fill();\n }\n ctx.lineTo(cx, cy);\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n const image = Stage.image(texture)\n .offset(shape.m_p.x - cx, options.scaleY * shape.m_p.y - cy);\n const node = Stage.create().append(image);\n return node;\n};\n\nViewer.prototype.drawEdge = function(edge, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const v1 = edge.m_vertex1;\n const v2 = edge.m_vertex2;\n\n const dx = v2.x - v1.x;\n const dy = v2.y - v1.y;\n\n const length = Math.sqrt(dx * dx + dy * dy);\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(length + 2 * lw, 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n ctx.moveTo(lw, lw);\n ctx.lineTo(lw + length, lw);\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const minX = Math.min(v1.x, v2.x);\n const minY = Math.min(options.scaleY * v1.y, options.scaleY * v2.y);\n\n const image = Stage.image(texture);\n image.rotate(options.scaleY * Math.atan2(dy, dx));\n image.offset(minX - lw, minY - lw);\n const node = Stage.create().append(image);\n return node;\n};\n\nViewer.prototype.drawPolygon = function(shape, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const vertices = shape.m_vertices;\n\n if (!vertices.length) {\n return;\n }\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, options.scaleY * v.y);\n maxY = Math.max(maxY, options.scaleY * v.y);\n }\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(width + 2 * lw, height + 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n const x = v.x - minX + lw;\n const y = options.scaleY * v.y - minY + lw;\n if (i == 0)\n ctx.moveTo(x, y);\n else\n ctx.lineTo(x, y);\n }\n\n if (vertices.length > 2) {\n ctx.closePath();\n }\n\n if (options.fillStyle) {\n ctx.fillStyle = options.fillStyle;\n ctx.fill();\n ctx.closePath();\n }\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const image = Stage.image(texture);\n image.offset(minX - lw, minY - lw);\n const node = Stage.create().append(image);\n return node;\n};\n\nViewer.prototype.drawChain = function(shape, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const vertices = shape.m_vertices;\n\n if (!vertices.length) {\n return;\n }\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, options.scaleY * v.y);\n maxY = Math.max(maxY, options.scaleY * v.y);\n }\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(width + 2 * lw, height + 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n const x = v.x - minX + lw;\n const y = options.scaleY * v.y - minY + lw;\n if (i == 0)\n ctx.moveTo(x, y);\n else\n ctx.lineTo(x, y);\n }\n\n // TODO: if loop\n if (vertices.length > 2) {\n // ctx.closePath();\n }\n\n if (options.fillStyle) {\n ctx.fillStyle = options.fillStyle;\n ctx.fill();\n ctx.closePath();\n }\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const image = Stage.image(texture);\n image.offset(minX - lw, minY - lw);\n const node = Stage.create().append(image);\n return node;\n};\n\n\n// Everything below this is copied from ../src/index.ts\n\nexport { default as Serializer } from '../src/serializer/index';\n\nexport { default as Math } from '../src/common/Math';\nexport { default as Vec2 } from '../src/common/Vec2';\nexport { default as Vec3 } from '../src/common/Vec3';\nexport { default as Mat22 } from '../src/common/Mat22';\nexport { default as Mat33 } from '../src/common/Mat33';\nexport { default as Transform } from '../src/common/Transform';\nexport { default as Rot } from '../src/common/Rot';\n\nexport { default as AABB } from '../src/collision/AABB';\n\nexport { default as Shape } from '../src/collision/Shape';\nexport { default as Fixture } from '../src/dynamics/Fixture';\nexport { default as Body } from '../src/dynamics/Body';\nexport { default as Contact } from '../src/dynamics/Contact';\nexport { default as Joint } from '../src/dynamics/Joint';\nexport { default as World } from '../src/dynamics/World';\n\nexport { default as Circle } from '../src/collision/shape/CircleShape';\nexport { default as Edge } from '../src/collision/shape/EdgeShape';\nexport { default as Polygon } from '../src/collision/shape/PolygonShape';\nexport { default as Chain } from '../src/collision/shape/ChainShape';\nexport { default as Box } from '../src/collision/shape/BoxShape';\n\nexport { CollideCircles } from '../src/collision/shape/CollideCircle';\nexport { CollideEdgeCircle } from '../src/collision/shape/CollideEdgeCircle';\nexport { CollidePolygons } from '../src/collision/shape/CollidePolygon';\nexport { CollidePolygonCircle } from '../src/collision/shape/CollideCirclePolygone';\nexport { CollideEdgePolygon } from '../src/collision/shape/CollideEdgePolygon';\n\nexport { default as DistanceJoint } from '../src/dynamics/joint/DistanceJoint';\nexport { default as FrictionJoint } from '../src/dynamics/joint/FrictionJoint';\nexport { default as GearJoint } from '../src/dynamics/joint/GearJoint';\nexport { default as MotorJoint } from '../src/dynamics/joint/MotorJoint';\nexport { default as MouseJoint } from '../src/dynamics/joint/MouseJoint';\nexport { default as PrismaticJoint } from '../src/dynamics/joint/PrismaticJoint';\nexport { default as PulleyJoint } from '../src/dynamics/joint/PulleyJoint';\nexport { default as RevoluteJoint } from '../src/dynamics/joint/RevoluteJoint';\nexport { default as RopeJoint } from '../src/dynamics/joint/RopeJoint';\nexport { default as WeldJoint } from '../src/dynamics/joint/WeldJoint';\nexport { default as WheelJoint } from '../src/dynamics/joint/WheelJoint';\n\nexport { default as Settings } from '../src/Settings';\n\nexport { default as Sweep } from '../src/common/Sweep';\nexport { default as Manifold } from '../src/collision/Manifold';\nexport { default as Distance } from '../src/collision/Distance';\nexport { default as TimeOfImpact } from '../src/collision/TimeOfImpact';\nexport { default as DynamicTree } from '../src/collision/DynamicTree';\n\nimport Solver, { TimeStep } from '../src/dynamics/Solver';\nimport { CollidePolygons } from '../src/collision/shape/CollidePolygon';\nimport { default as Settings } from '../src/Settings';\nimport { default as Sweep } from '../src/common/Sweep';\nimport { default as Manifold } from '../src/collision/Manifold';\nimport { default as Distance, DistanceInput, DistanceOutput, DistanceProxy, SimplexCache, testOverlap } from '../src/collision/Distance';\nimport { default as TimeOfImpact, TOIInput, TOIOutput } from '../src/collision/TimeOfImpact';\nimport { default as DynamicTree } from '../src/collision/DynamicTree';\n\nimport { default as stats } from '../src/util/stats'; // todo: what to do with this?\n\nimport { ContactImpulse } from '../src/dynamics/Solver';\ntype _ContactImpulse = InstanceType;\nexport type { _ContactImpulse as ContactImpulse }\n\n/** @deprecated Merged with main namespace */\nexport const internal = {};\n\n// @ts-ignore\ninternal.CollidePolygons = CollidePolygons;\n// @ts-ignore\ninternal.Settings = Settings;\n// @ts-ignore\ninternal.Sweep = Sweep;\n// @ts-ignore\ninternal.Manifold = Manifold;\n// @ts-ignore\ninternal.Distance = Distance;\n// @ts-ignore\ninternal.TimeOfImpact = TimeOfImpact;\n// @ts-ignore\ninternal.DynamicTree = DynamicTree;\n// @ts-ignore\ninternal.stats = stats;\n\n// @ts-ignore\nSolver.TimeStep = TimeStep;\n\n// @ts-ignore\nDistance.testOverlap = testOverlap;\n// @ts-ignore\nDistance.Input = DistanceInput;\n// @ts-ignore\nDistance.Output = DistanceOutput;\n// @ts-ignore\nDistance.Proxy = DistanceProxy;\n// @ts-ignore\nDistance.Cache = SimplexCache;\n\n// @ts-ignore\nTimeOfImpact.Input = TOIInput;\n// @ts-ignore\nTimeOfImpact.Output = TOIOutput;\n"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","__assign","assign","t","s","i","n","arguments","length","apply","input","defaults","output","key","getOwnPropertySymbols","symbols","symbol","propertyIsEnumerable","_i","rest","math","Math","EPSILON","isFinite","x","isNaN","assert","invSqrt","sqrt","nextPowerOfTwo","isPowerOfTwo","mod","num","min","max","clamp","random","ManifoldType","ContactFeatureType","PointState","y","Vec2","data","obj","v","neo","JSON","stringify","o","clone","value","a","w","setCombine","setMul","addCombine","addMul","subCombine","subMul","m","lengthOf","lengthSquared","invLength","dx","dy","combine","mulNumVec2","zero","abs","lengthSqr","lower","upper","AABB","lowerBound","upperBound","setVec2","isValid","sub","lowerA","upperA","lowerB","upperB","lowerX","lowerY","upperX","upperY","setNum","aabb","result","extend","d1x","d2x","d1y","d2y","areEqual","wD","hD","tmin","Infinity","tmax","p1","p2","absD","normal","f","inv_d","t1","t2","temp","setZero","maxFraction","fraction","Settings","linearSlop","maxTranslation","maxRotation","pow","linearSleepTolerance","angularSleepTolerance","PI","opts","_list","_max","_createFn","_outFn","allocate","_inFn","release","_discardFn","discard","Pool","item","shift","_createCount","_outCount","_inCount","push","_discardCount","id","TreeNode","userData","child1","stack","Iterator","iterator","close","m_root","m_nodes","m_lastProxyId","m_pool","DynamicTree","node","parent","child2","height","allocateNode","set","aabbExtension","insertLeaf","removeLeaf","freeNode","contains","aabbMultiplier","leaf","leafAABB","index","isLeaf","area","getPerimeter","combinedAABB","combinedArea","cost","inheritanceCost","cost1","oldArea","cost2","sibling","oldParent","newParent","balance","grandParent","iA","A","B","C","F","G","D","E","rootArea","totalArea","it","iteratorPool","preorder","next","height1","computeHeight","height2","validateStructure","validateMetrics","maxBalance","nodes","count","minCost","iMin","jMin","aabbi","j","aabbj","parent_1","validate","newOrigin","queryCallback","stackPool","pop","testOverlap","rayCastCallback","r","normalize","crossNumVec2","abs_v","segmentAABB","combinePoints","subInput","inputPool","c","getCenter","h","getExtents","dot","root","parents","states","_this","m_tree","query","proxyId","m_queryProxyId","proxyIdA","proxyIdB","userDataA","getUserData","userDataB","m_callback","BroadPhase","aabbA","getFatAABB","aabbB","m_proxyCount","getHeight","getMaxBalance","getAreaRatio","rayCast","shiftOrigin","createProxy","bufferMove","unbufferMove","destroyProxy","displacement","moveProxy","m_moveBuffer","addPairCallback","fatAABB","angle","Rot","setAngle","setRot","setIdentity","rot","sin","cos","atan2","qr","identity","position","rotation","Transform","q","xf","isArray","arr","mul","mulVec2","mulXf","mulRot","add","mulTVec2","mulTXf","px","py","mulTRot","localCenter","alpha0","c0","a0","Sweep","getAngle","beta","alpha","that","Position","Shape","m_type","m_radius","FixtureDefDefault","friction","restitution","density","isSensor","filterGroupIndex","filterCategoryBits","filterMaskBits","fixture","childIndex","body","shape","def","options","m_body","m_friction","m_restitution","m_density","m_isSensor","m_filterGroupIndex","m_filterCategoryBits","m_filterMaskBits","m_shape","m_next","m_proxies","childCount","getChildCount","FixtureProxy","m_userData","Fixture","getBody","broadPhase","m_world","m_broadPhase","destroyProxies","_reset","createProxies","m_xf","resetMassData","restore","getType","sensor","setAwake","testPoint","getTransform","massData","computeMass","proxy","computeAABB","xf1","xf2","aabb1","aabb2","filter","groupIndex","categoryBits","maskBits","refilter","edge","getContactList","contact","fixtureA","getFixtureA","fixtureB","getFixtureB","flagForFiltering","world","getWorld","touchProxy","collideA","collideB","STATIC","KINEMATIC","DYNAMIC","BodyDefDefault","type","linearVelocity","angularVelocity","linearDamping","angularDamping","fixedRotation","bullet","gravityScale","allowSleep","awake","active","m_awakeFlag","m_autoSleepFlag","m_bulletFlag","m_fixedRotationFlag","m_activeFlag","m_islandFlag","m_toiFlag","m_mass","m_invMass","m_I","m_invI","m_sweep","setTransform","c_velocity","Velocity","c_position","m_force","m_torque","m_linearVelocity","m_angularVelocity","m_linearDamping","m_angularDamping","m_gravityScale","m_sleepTime","m_jointList","m_contactList","m_fixtureList","m_prev","m_destroyed","Body","fixtures","_addFixture","isLocked","setType","isWorldLocked","forward","synchronizeFixtures","ce","ce0","destroyContact","proxyCount","flag","synchronize","advance","worldPoint","localPoint","getLinearVelocityFromWorldPoint","getWorldPoint","scale","mass","I","getInertia","center","isStatic","isKinematic","MassData","getMassData","oldCenter","setLocalCenter","force","point","wake","crossVec2Vec2","torque","impulse","jn","other","joint","m_collideConnected","m_newFixture","fixdef","publish","localVector","worldVector","ex","ey","Mat22","det","imx","mx","mx1","mx2","ContactID","ClipVertex","ManifoldPoint","Manifold","wm","xfA","radiusA","xfB","radiusB","pointCount","WorldManifold","points","separations","e_circles","pointA","pointB","dist","cA","cB","mid","e_faceA","localNormal","planePoint","clipPoint","e_faceB","clipSegmentToLine","getPointStates","ContactFeature","cf","indexA","indexB","typeA","typeB","state1","state2","manifold1","manifold2","removeState","persistState","addState","vOut","vIn","offset","vertexIndexA","numOut","distance0","distance1","interp","e_vertex","e_face","gjkCalls","gjkIters","gjkMaxIters","toiTime","toiMaxTime","toiCalls","toiIters","toiMaxIters","toiRootIters","toiMaxRootIters","toString","newline","string","name_1","DistanceProxy","Distance","cache","stats","proxyA","proxyB","transformA","transformB","simplex","Simplex","readCache","vertices","m_v","k_maxIters","maxDistnceIterations","saveA","saveB","saveCount","iter","m_count","solve","getClosestPoint","getSearchDirection","vertex","getSupport","neg","wA","getVertex","wB","duplicate","getWitnessPoints","distance","iterations","writeCache","useRadii","rA","rB","m_buffer","m_vertices","bestIndex","bestValue","computeDistanceProxy","SimplexVertex","m_v1","m_v2","m_v3","wALocal","wBLocal","metric1","metric","metric2","getMetric","e12","crossVec2Num","pA","pB","solve2","solve3","w1","w2","d12_2","d12_1","inv_d12","w3","w1e12","e13","w1e13","d13_1","d13_2","e23","w2e23","d23_1","d23_2","n123","d123_1","d123_2","d123_3","inv_d13","inv_d23","inv_d123","shapeA","shapeB","DistanceInput","SimplexCache","DistanceOutput","mixFriction","friction1","friction2","mixRestitution","restitution1","restitution2","TOIOutputState","s_registers","fA","fB","evaluateFcn","ContactImpulse","m_nodeA","ContactEdge","m_nodeB","m_fixtureA","m_fixtureB","m_indexA","m_indexB","m_evaluateFcn","Contact","step","getShape","bodyA","bodyB","manifold","getManifold","v_invMassA","v_invMassB","v_invIA","v_invIB","v_friction","v_restitution","v_tangentSpeed","m_tangentSpeed","v_pointCount","v_K","v_normalMass","p_invMassA","p_invMassB","p_invIA","p_invIB","p_localCenterA","p_localCenterB","p_radiusA","p_radiusB","p_type","p_localNormal","p_localPoint","p_pointCount","cp","vcp","v_points","VelocityConstraintPoint","warmStarting","normalImpulse","dtRatio","tangentImpulse","normalMass","tangentMass","velocityBias","p_localPoints","m_manifold","worldManifold","getWorldManifold","m_enabledFlag","m_touchingFlag","m_filterFlag","speed","listener","oldManifold","touching","wasTouching","sensorA","sensorB","evaluate","nmp","omp","beginContact","endContact","preSolve","_solvePositionConstraint","toiA","toiB","toi","positionA","positionB","localCenterA","localCenterB","mA","mB","iB","aA","aB","minSeparation","separation","baumgarte","toiBaugarte","maxLinearCorrection","rnA","rnB","K","P","velocityA","velocityB","vA","vB","v_normal","kNormal","tangent","rtA","rtB","kTangent","vRel","velocityThreshold","blockSolve","vcp1","vcp2","rn1A","rn1B","rn2A","rn2B","k11","k22","k12","getInverse","dv","vt","lambda","maxFriction","newImpulse","vn","dv1","dv2","vn1","vn2","P1","P2","type1","type2","callback","getChildIndexA","getChildIndexB","prev","isTouching","JointEdge","m_bodyA","m_bodyB","collideConnected","Joint","isActive","Date","now","time","SeparationFunctionType","TimeOfImpact","timer","Timer","state","e_unknown","tMax","sweepA","sweepB","totalRadius","target","tolerance","k_maxIterations","maxTOIIterations","distanceInput","distanceOutput","e_overlapped","e_touching","fcn","SeparationFunction","initialize","done","pushBackIter","s2","findMinSeparation","e_separated","s1","e_failed","rootIterCount","a1","a2","maxPolygonVertices","m_proxyA","m_proxyB","m_sweepA","m_sweepB","e_points","localPointA","localPointB","m_axis","localPointB1","localPointB2","m_localPoint","localPointA1","localPointA2","find","axisA","axisB","compute","TimeStep","dt","inv_dt0","inv_dt","s_subStep","normals","tangents","m_stack","m_bodies","m_contacts","m_joints","Solver","m_bodyList","seed","isAwake","clear","addBody","isEnabled","addContact","je","addJoint","solveIsland","gravity","m_gravity","m_allowSleep","isDynamic","initConstraint","initVelocityConstraint","warmStartConstraint","initVelocityConstraints","velocityIterations","solveVelocityConstraints","solveVelocityConstraint","storeConstraintImpulses","translation","maxTranslationSquared","ratio","maxRotationSquared","positionSolved","positionIterations","solvePositionConstraint","contactsOkay","jointsOkay","jointOkay","solvePositionConstraints","synchronizeTransform","postSolveIsland","minSleepTime","linTolSqr","linearSleepToleranceSqr","angTolSqr","angularSleepToleranceSqr","timeToSleep","tag","common","m_stepComplete","m_toiCount","m_toi","minContact","minAlpha","maxSubSteps","fA_1","fB_1","bA_1","bB_1","activeA","activeB","isBullet","TOIInput","TOIOutput","bA","bB","backup1","backup2","update","bodies","backup","reset","solveIslandTOI","findNewContacts","m_subStepping","setEnabled","subStep","solvePositionConstraintTOI","postSolve","m_impulse","WorldDefDefault","continuousPhysics","subStepping","shouldCollide","m_contactCount","World","m_solver","m_bodyCount","m_jointCount","m_clearForces","m_locked","m_warmStarting","m_continuousPhysics","m_blockSolve","m_velocityIterations","m_positionIterations","m_t","joints","getBodyList","getNext","getJointList","_serialize","context","_addBody","createJoint","point1","point2","getProxyCount","getTreeHeight","getTreeBalance","getTreeQuality","arg1","arg2","createBody","je0","destroyJoint","f0","m_edgeA","m_edgeB","timeStep","s_step","updateContacts","solveWorld","solveWorldTOI","clearForces","updatePairs","createContact","next_c","destroy","name","_listeners","listeners","indexOf","splice","arg3","l","z","Vec3","v1","v2","EdgeShape","_super","TYPE","polygonRadius","m_vertex1","m_vertex2","m_vertex0","m_vertex3","m_hasVertex0","m_hasVertex3","vertex1","vertex2","vertex0","vertex3","hasVertex0","hasVertex3","setPrevVertex","setNextVertex","e","numerator","denominator","rr","loop","ChainShape","m_prevVertex","m_nextVertex","m_hasPrevVertex","m_hasNextVertex","m_isLoop","_createLoop","_createChain","isLoop","hasPrevVertex","hasNextVertex","prevVertex","nextVertex","PolygonShape","m_centroid","m_normals","_set","_setAsBox","ps","unique","distanceSquared","linearSlopSquared","i0","x0","hull","ih","ie","i1","i2","vs","pRef","inv3","p3","e1","e2","triangleArea","ComputeCentroid","hx","hy","pLocal","minX","minY","maxX","maxY","k_inv3","ex1","ey1","ex2","ey2","BoxShape","CircleShape","m_p","radius","sigma","DEFAULTS","frequencyHz","dampingRatio","anchorA","anchorB","DistanceJoint","m_localAnchorA","getLocalPoint","localAnchorA","m_localAnchorB","localAnchorB","m_length","m_frequencyHz","m_dampingRatio","m_gamma","m_bias","gamma","bias","hz","m_u","m_localCenterA","m_localCenterB","m_invMassA","m_invMassB","m_invIA","m_invIB","qA","qB","m_rA","m_rB","crAu","crBu","invMass","omega","k","vpA","vpB","Cdot","mulSub","u","maxForce","maxTorque","anchor","FrictionJoint","m_linearImpulse","m_angularImpulse","m_maxForce","m_maxTorque","m_linearMass","m_angularMass","oldImpulse","maxImpulse","ez","Mat33","cross","a11","a12","a21","a22","M","a13","a23","a33","lowerAngle","upperAngle","maxMotorTorque","motorSpeed","enableLimit","enableMotor","RevoluteJoint","m_referenceAngle","referenceAngle","m_motorImpulse","m_lowerAngle","m_upperAngle","m_maxMotorTorque","m_motorSpeed","m_enableLimit","m_enableMotor","m_motorMass","jointAngle","angularSlop","m_limitState","Cdot1","Cdot2","solve33","rhs","reduced","solve22","positionError","angularError","limitImpulse","maxAngularCorrection","lowerTranslation","upperTranslation","maxMotorForce","axis","PrismaticJoint","m_localXAxisA","getLocalVector","localAxisA","m_localYAxisA","m_lowerTranslation","m_upperTranslation","m_maxMotorForce","m_perp","m_K","getWorldVector","addCrossNumVec2","m_a1","m_a2","m_s1","m_s2","k13","k23","k33","jointTranslation","LA","LB","f1","df","f2r","perp","C1","linearError","C2","impulse1","joint1","joint2","coordinateA","coordinateB","GearJoint","m_joint1","m_joint2","m_ratio","m_type1","m_type2","m_bodyC","getBodyA","getBodyB","xfC","aC","revolute","m_localAnchorC","m_referenceAngleA","m_localAxisC","prismatic","pC","m_bodyD","xfD","aD","m_localAnchorD","m_referenceAngleB","m_localAxisD","pD","m_constant","m_JvAC","m_JwA","m_lcA","m_lcB","m_lcC","m_lcD","m_mA","m_mB","m_mC","m_mD","m_iA","m_iB","m_iC","m_iD","vC","wC","vD","qC","qD","m_JwC","rC","m_JvBD","m_JwB","m_JwD","rD","JvAC","JvBD","JwA","JwB","JwC","JwD","cC","cD","correctionFactor","MotorJoint","m_linearOffset","linearOffset","getPosition","m_angularOffset","angularOffset","m_correctionFactor","factor","m_linearError","m_angularError","inv_h","MouseJoint","m_targetA","m_beta","m_C","_localAnchorB","velocity","getMass","groundA","groundB","PulleyJoint","m_groundAnchorA","groundAnchorA","m_groundAnchorB","groundAnchorB","m_lengthA","lengthA","m_lengthB","lengthB","m_uB","m_uA","ruA","ruB","PA","PB","uA","uB","maxLength","RopeJoint","m_maxLength","m_state","crA","crB","WeldJoint","getInverse22","invM","getSymInverse33","impulse2","mulVec3","WheelJoint","localAxis","m_springMass","m_springImpulse","m_ay","m_ax","m_sAy","m_sBy","m_sAx","m_sBx","damp","ay","sAy","sBy","SID","Serializer","rootClass","preSerialize","postSerialize","preDeserialize","postDeserialize","refTypes","restoreTypes","CLASS_BY_TYPE_PROP","_a","toJson","json","queue","refMap","storeRef","typeName","__sid","ref","refIndex","refType","top","serialize","newValue","str","fromJson","deserialize","cls","ctx","deserializer","_deserialize","findDeserilizer","restoreRef","serializer","CollideCircles","circleA","circleB","distSqr","CollideEdgeCircle","edgeA","Q","P_1","d_1","A1","B1","P_2","d_2","B2","A2","den","findMaxSeparation","poly1","poly2","count1","count2","n1s","v1s","v2s","maxSeparation","si","sij","addType","chain","getChildEdge","CollidePolygons","EPAxisType","VertexType","polyA","polyB","separationA","edgeB","separationB","edge1","flip","incidentEdge","normals1","vertices2","normals2","normal1","minDot","findIncidentEdge","vertices1","iv1","iv2","v11","v12","localTangent","frontOffset","sideOffset1","sideOffset2","clipPoints1","clipPoints2","CollidePolygonCircle","polygonA","cLocal","normalIndex","vertexCount","vertIndex1","vertIndex2","u1","u2","faceCenter","CollideEdgePolygon","edgeAxis","EPAxis","polygonAxis","polygonBA","TempPolygon","rf","ReferenceFace","polygonB","centroidB","v0","v3","normal0","normal2","front","offset1","offset0","offset2","convex1","convex2","edge0","edge2","lowerLimit","upperLimit","e_edgeA","e_edgeB","primaryAxis","sideNormal1","sideNormal2","maxManifoldPoints","Input","Output","Proxy","Cache","base","objProto","owns","toStr","hexRegex","is","module","an","defined","empty","equal","getTime","instance","nil","undef","array","emptyarray","arraylike","boolean","number","element","undefined","HTMLElement","nodeType","fn","nan","object","hash","setInterval","regexp","hex","test","Class","arg","app","atlas","_init","_load","_config","config","_app_queue","_stages","_loaded","_paused","loader","stage","canvas","start","loading","fork","then","setTimeout","_await","preload","load","url","resolve","src","el","document","createElement","addEventListener","err","appendChild","loadScript","args","pause","resume","window","scripts","getElementsByTagName","currentScript","Error","split","match","readyState","location","href","getScriptSrc","substring","lastIndexOf","Matrix","_dirty","rotate","translate","skew","concat","inverse","reverse","inversed","map","mapX","mapY","proto","props","noop","native","Texture","image","pipe","_image","_sx","_dx","_sy","_dy","_sw","_dw","width","_sh","_dh","dest","draw","x1","y1","x2","y2","x3","y3","x4","y4","sx","sy","sw","sh","dw","dh","limit","drawImage","_draw_failed","console","log","_atlases_map","_atlases_arr","Atlas","deprecated","ppu","trim","textures","factory","cutouts","sprites","make","bottom","left","right","texture","subquery","select","Selection","found","imagePath","imageRatio","imageloader","nfTexture","nfSelection","link","one","msg","replace","slice","error","iid","append","child","_ensure","remove","_last","_next","_prev","_parent","_first","_flag","_ts_parent","_ts_children","touch","prepend","insertBefore","self","insertAfter","_label","_visible","_attrs","_flags","label","attr","visible","_ts_pin","hide","show","first","last","visit","visitor","end","more","appendTo","prependTo","insertNext","insertPrev","_ts_touch","hitTest","hit","_pin","_width","_height","require$$1","on","listen","types","join","off","all","trigger","Pin","owner","_owner","_relativeMatrix","_absoluteMatrix","matrix","relative","relativeMatrix","absoluteMatrix","pin","get","_textureAlpha","_alpha","_scaleX","_scaleY","_skewX","_skewY","_rotation","_pivoted","_pivotX","_pivotY","_handled","_handleX","_handleY","_aligned","_alignX","_alignY","_offsetX","_offsetY","_boxX","_boxY","_boxWidth","_boxHeight","_ts_translate","_ts_transform","_ts_matrix","_update","_mo_handle","_mo_align","ts","_mo_abs","_mo_rel","rel","_x","_y","getters","setters","textureAlpha","boxWidth","boxHeight","scaleX","scaleY","skewX","skewY","pivotX","pivotY","offsetX","offsetY","alignX","alignY","handleX","handleY","_width_","_height_","pivot","align","handle","resizeMode","scaleTo","resizeWidth","resizeHeight","scaleMode","scaleWidth","scaleHeight","mode","_add_shortcuts","size","ta","Root","request","render","paused","stopped","lastTime","tick","elapsed","ticked","_tick","_mo_touch","fps","touch_root","stop","_textures","globalAlpha","_tickBefore","_tickAfter","MAX_ELAPSE","ticker","before","untick","timeout","clearTimeout","background","color","viewport","_viewport","viewbox","_viewbox","box","require$$0","require$$2","attributes","drawFn","getContext","Image","Anim","_fps","FPS","_ft","_time","_repeat","_index","_frames","ignore","moveFrame","_callback","Str","_identity","img","setImage","tile","inner","stretch","insert","repeat","_repeatTicker","_mo_stretch","owidth","oheight","anim","frames","gotoFrame","setFrames","frame","resize","move","play","setFont","_item","setValue","_value","_spacing","row","sequence","column","_padding","_layoutTiker","_mo_seq","alignChildren","_mo_seqAlign","_mo_box","layer","padding","pad","spacing","space","_cache","_modes","_easings","Easing","token","exec","easing","params","fc","names","asin","Tween","duration","delay","_end","_duration","_delay","pinning","Mouse","elem","locate","event","ev","loc","touches","clientX","clientY","rect","getBoundingClientRect","clientLeft","clientTop","locateElevent","lookup","collect","targets","timeStamp","mouse","raw","cancel","tween","_tweens","ticktime","head","unshift","over","_start","_easing","actions","_hide","_remove","_done","ease","subscribe","CLICK","START","MOVE","END","CANCEL","handleStart","handleEnd","handleMove","handleCancel","clicklist","cancellist","preventDefault","defineValue","defineProperty","_supported","app-loader","configs","full","getElementById","style","firstChild","devicePixelRatio","backingStoreRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","requestAnimationFrame","msRequestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","oRequestAnimationFrame","clearRect","backgroundColor","lastWidth","lastHeight","innerWidth","screen","innerHeight","clientWidth","clientHeight","resizeLoop","image-loader","success","onload","onerror","exports","internal","require$$3","require$$4","require$$5","Viewer","_options","lineWidth","_world","elapsedTime","renderWorld","ui","Stage","_create","viewer","getFixtureList","stroke","strokeStyle","fill","fillStyle","drawCircle","drawEdge","drawPolygon","drawChain","__lastX","__lastY","__lastR","getAnchorA","getAnchorB","drawJoint","cx","cy","lw","beginPath","moveTo","lineTo","lineCap","arc","closePath","focus","activeElement","blur","testbed","_resume","_pause","isPaused","togglePause","activeKeys","findOne","findAll","statusText","statusMap","statusSet","status","statusMerge","_status","info","text","_info","lastDrawHash","drawHash","drawingTexture","buffer","save","transform","drawing","drawPoint","drawSegment","drawAABB","g","lastX","lastY","targetBody","mouseMove","mouseJoint","mouseGround","queryAABB","findBody","mouseForce","setTarget","applyForceToCenter","keyCode","charCodeAt","downKeys","updateActiveKeys","keydown","fromCharCode","keyup","down","char","up","fire"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"planck-with-testbed.min.js","sources":["../node_modules/stage-js/dist/stage.js","../node_modules/tslib/tslib.es6.js","../src/util/options.ts","../src/common/Math.ts","../src/common/Vec2.ts","../src/collision/AABB.ts","../src/Settings.ts","../src/util/Pool.ts","../src/collision/DynamicTree.ts","../src/collision/BroadPhase.ts","../src/common/Rot.ts","../src/common/Transform.ts","../src/common/Sweep.ts","../src/dynamics/Velocity.ts","../src/dynamics/Position.ts","../src/collision/Shape.ts","../src/dynamics/Fixture.ts","../src/dynamics/Body.ts","../src/dynamics/Joint.ts","../src/util/stats.ts","../src/util/Timer.ts","../src/collision/Distance.ts","../src/collision/TimeOfImpact.ts","../src/dynamics/Solver.ts","../src/common/Mat22.ts","../src/collision/Manifold.ts","../src/dynamics/Contact.ts","../src/dynamics/World.ts","../src/common/Vec3.ts","../src/collision/shape/EdgeShape.ts","../src/collision/shape/ChainShape.ts","../src/collision/shape/PolygonShape.ts","../src/collision/shape/BoxShape.ts","../src/collision/shape/CircleShape.ts","../src/dynamics/joint/DistanceJoint.ts","../src/dynamics/joint/FrictionJoint.ts","../src/common/Mat33.ts","../src/dynamics/joint/RevoluteJoint.ts","../src/dynamics/joint/PrismaticJoint.ts","../src/dynamics/joint/GearJoint.ts","../src/dynamics/joint/MotorJoint.ts","../src/dynamics/joint/MouseJoint.ts","../src/dynamics/joint/PulleyJoint.ts","../src/dynamics/joint/RopeJoint.ts","../src/dynamics/joint/WeldJoint.ts","../src/dynamics/joint/WheelJoint.ts","../src/serializer/index.ts","../src/collision/shape/CollideCircle.ts","../src/collision/shape/CollideEdgeCircle.ts","../src/collision/shape/CollidePolygon.ts","../src/collision/shape/CollideCirclePolygon.ts","../src/collision/shape/CollideEdgePolygon.ts","../src/index.ts","../testbed/index.ts"],"sourcesContent":["var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nconst stats = {\n create: 0,\n tick: 0,\n node: 0,\n draw: 0,\n fps: 0\n};\nclass Matrix {\n constructor(a, b, c, d, e, f) {\n this.reset(a, b, c, d, e, f);\n }\n toString() {\n return \"[\" + this.a + \", \" + this.b + \", \" + this.c + \", \" + this.d + \", \" + this.e + \", \" + this.f + \"]\";\n }\n clone() {\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n }\n reset(a, b, c, d, e, f) {\n this._dirty = true;\n if (typeof a === \"object\") {\n this.a = a.a, this.d = a.d;\n this.b = a.b, this.c = a.c;\n this.e = a.e, this.f = a.f;\n } else {\n this.a = a || 1, this.d = d || 1;\n this.b = b || 0, this.c = c || 0;\n this.e = e || 0, this.f = f || 0;\n }\n return this;\n }\n identity() {\n this._dirty = true;\n this.a = 1;\n this.b = 0;\n this.c = 0;\n this.d = 1;\n this.e = 0;\n this.f = 0;\n return this;\n }\n rotate(angle) {\n if (!angle) {\n return this;\n }\n this._dirty = true;\n var u = angle ? Math.cos(angle) : 1;\n var v = angle ? Math.sin(angle) : 0;\n var a = u * this.a - v * this.b;\n var b = u * this.b + v * this.a;\n var c = u * this.c - v * this.d;\n var d = u * this.d + v * this.c;\n var e = u * this.e - v * this.f;\n var f = u * this.f + v * this.e;\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n return this;\n }\n translate(x, y) {\n if (!x && !y) {\n return this;\n }\n this._dirty = true;\n this.e += x;\n this.f += y;\n return this;\n }\n scale(x, y) {\n if (!(x - 1) && !(y - 1)) {\n return this;\n }\n this._dirty = true;\n this.a *= x;\n this.b *= y;\n this.c *= x;\n this.d *= y;\n this.e *= x;\n this.f *= y;\n return this;\n }\n skew(x, y) {\n if (!x && !y) {\n return this;\n }\n this._dirty = true;\n var a = this.a + this.b * x;\n var b = this.b + this.a * y;\n var c = this.c + this.d * x;\n var d = this.d + this.c * y;\n var e = this.e + this.f * x;\n var f = this.f + this.e * y;\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n return this;\n }\n concat(m) {\n this._dirty = true;\n var n = this;\n var a = n.a * m.a + n.b * m.c;\n var b = n.b * m.d + n.a * m.b;\n var c = n.c * m.a + n.d * m.c;\n var d = n.d * m.d + n.c * m.b;\n var e = n.e * m.a + m.e + n.f * m.c;\n var f = n.f * m.d + m.f + n.e * m.b;\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n return this;\n }\n inverse() {\n if (this._dirty) {\n this._dirty = false;\n this.inverted = this.inverted || new Matrix();\n var z = this.a * this.d - this.b * this.c;\n this.inverted.a = this.d / z;\n this.inverted.b = -this.b / z;\n this.inverted.c = -this.c / z;\n this.inverted.d = this.a / z;\n this.inverted.e = (this.c * this.f - this.e * this.d) / z;\n this.inverted.f = (this.e * this.b - this.a * this.f) / z;\n }\n return this.inverted;\n }\n map(p, q) {\n q = q || {};\n q.x = this.a * p.x + this.c * p.y + this.e;\n q.y = this.b * p.x + this.d * p.y + this.f;\n return q;\n }\n mapX(x, y) {\n if (typeof x === \"object\")\n y = x.y, x = x.x;\n return this.a * x + this.c * y + this.e;\n }\n mapY(x, y) {\n if (typeof x === \"object\")\n y = x.y, x = x.x;\n return this.b * x + this.d * y + this.f;\n }\n}\nvar iid$1 = 0;\nfunction Pin(owner) {\n this._owner = owner;\n this._parent = null;\n this._relativeMatrix = new Matrix();\n this._absoluteMatrix = new Matrix();\n this.reset();\n}\nPin.prototype.reset = function() {\n this._textureAlpha = 1;\n this._alpha = 1;\n this._width = 0;\n this._height = 0;\n this._scaleX = 1;\n this._scaleY = 1;\n this._skewX = 0;\n this._skewY = 0;\n this._rotation = 0;\n this._pivoted = false;\n this._pivotX = null;\n this._pivotY = null;\n this._handled = false;\n this._handleX = 0;\n this._handleY = 0;\n this._aligned = false;\n this._alignX = 0;\n this._alignY = 0;\n this._offsetX = 0;\n this._offsetY = 0;\n this._boxX = 0;\n this._boxY = 0;\n this._boxWidth = this._width;\n this._boxHeight = this._height;\n this._ts_translate = ++iid$1;\n this._ts_transform = ++iid$1;\n this._ts_matrix = ++iid$1;\n};\nPin.prototype._update = function() {\n this._parent = this._owner._parent && this._owner._parent._pin;\n if (this._handled && this._mo_handle != this._ts_transform) {\n this._mo_handle = this._ts_transform;\n this._ts_translate = ++iid$1;\n }\n if (this._aligned && this._parent && this._mo_align != this._parent._ts_transform) {\n this._mo_align = this._parent._ts_transform;\n this._ts_translate = ++iid$1;\n }\n return this;\n};\nPin.prototype.toString = function() {\n return this._owner + \" (\" + (this._parent ? this._parent._owner : null) + \")\";\n};\nPin.prototype.absoluteMatrix = function() {\n this._update();\n var ts = Math.max(\n this._ts_transform,\n this._ts_translate,\n this._parent ? this._parent._ts_matrix : 0\n );\n if (this._mo_abs == ts) {\n return this._absoluteMatrix;\n }\n this._mo_abs = ts;\n var abs2 = this._absoluteMatrix;\n abs2.reset(this.relativeMatrix());\n this._parent && abs2.concat(this._parent._absoluteMatrix);\n this._ts_matrix = ++iid$1;\n return abs2;\n};\nPin.prototype.relativeMatrix = function() {\n this._update();\n var ts = Math.max(\n this._ts_transform,\n this._ts_translate,\n this._parent ? this._parent._ts_transform : 0\n );\n if (this._mo_rel == ts) {\n return this._relativeMatrix;\n }\n this._mo_rel = ts;\n var rel2 = this._relativeMatrix;\n rel2.identity();\n if (this._pivoted) {\n rel2.translate(-this._pivotX * this._width, -this._pivotY * this._height);\n }\n rel2.scale(this._scaleX, this._scaleY);\n rel2.skew(this._skewX, this._skewY);\n rel2.rotate(this._rotation);\n if (this._pivoted) {\n rel2.translate(this._pivotX * this._width, this._pivotY * this._height);\n }\n if (this._pivoted) {\n this._boxX = 0;\n this._boxY = 0;\n this._boxWidth = this._width;\n this._boxHeight = this._height;\n } else {\n var p, q;\n if (rel2.a > 0 && rel2.c > 0 || rel2.a < 0 && rel2.c < 0) {\n p = 0, q = rel2.a * this._width + rel2.c * this._height;\n } else {\n p = rel2.a * this._width, q = rel2.c * this._height;\n }\n if (p > q) {\n this._boxX = q;\n this._boxWidth = p - q;\n } else {\n this._boxX = p;\n this._boxWidth = q - p;\n }\n if (rel2.b > 0 && rel2.d > 0 || rel2.b < 0 && rel2.d < 0) {\n p = 0, q = rel2.b * this._width + rel2.d * this._height;\n } else {\n p = rel2.b * this._width, q = rel2.d * this._height;\n }\n if (p > q) {\n this._boxY = q;\n this._boxHeight = p - q;\n } else {\n this._boxY = p;\n this._boxHeight = q - p;\n }\n }\n this._x = this._offsetX;\n this._y = this._offsetY;\n this._x -= this._boxX + this._handleX * this._boxWidth;\n this._y -= this._boxY + this._handleY * this._boxHeight;\n if (this._aligned && this._parent) {\n this._parent.relativeMatrix();\n this._x += this._alignX * this._parent._width;\n this._y += this._alignY * this._parent._height;\n }\n rel2.translate(this._x, this._y);\n return this._relativeMatrix;\n};\nPin.prototype.get = function(key) {\n if (typeof getters[key] === \"function\") {\n return getters[key](this);\n }\n};\nPin.prototype.set = function(a, b) {\n if (typeof a === \"string\") {\n if (typeof setters[a] === \"function\" && typeof b !== \"undefined\") {\n setters[a](this, b);\n }\n } else if (typeof a === \"object\") {\n for (b in a) {\n if (typeof setters[b] === \"function\" && typeof a[b] !== \"undefined\") {\n setters[b](this, a[b], a);\n }\n }\n }\n if (this._owner) {\n this._owner._ts_pin = ++iid$1;\n this._owner.touch();\n }\n return this;\n};\nvar getters = {\n alpha: function(pin) {\n return pin._alpha;\n },\n textureAlpha: function(pin) {\n return pin._textureAlpha;\n },\n width: function(pin) {\n return pin._width;\n },\n height: function(pin) {\n return pin._height;\n },\n boxWidth: function(pin) {\n return pin._boxWidth;\n },\n boxHeight: function(pin) {\n return pin._boxHeight;\n },\n // scale : function(pin) {\n // },\n scaleX: function(pin) {\n return pin._scaleX;\n },\n scaleY: function(pin) {\n return pin._scaleY;\n },\n // skew : function(pin) {\n // },\n skewX: function(pin) {\n return pin._skewX;\n },\n skewY: function(pin) {\n return pin._skewY;\n },\n rotation: function(pin) {\n return pin._rotation;\n },\n // pivot : function(pin) {\n // },\n pivotX: function(pin) {\n return pin._pivotX;\n },\n pivotY: function(pin) {\n return pin._pivotY;\n },\n // offset : function(pin) {\n // },\n offsetX: function(pin) {\n return pin._offsetX;\n },\n offsetY: function(pin) {\n return pin._offsetY;\n },\n // align : function(pin) {\n // },\n alignX: function(pin) {\n return pin._alignX;\n },\n alignY: function(pin) {\n return pin._alignY;\n },\n // handle : function(pin) {\n // },\n handleX: function(pin) {\n return pin._handleX;\n },\n handleY: function(pin) {\n return pin._handleY;\n }\n};\nvar setters = {\n alpha: function(pin, value) {\n pin._alpha = value;\n },\n textureAlpha: function(pin, value) {\n pin._textureAlpha = value;\n },\n width: function(pin, value) {\n pin._width_ = value;\n pin._width = value;\n pin._ts_transform = ++iid$1;\n },\n height: function(pin, value) {\n pin._height_ = value;\n pin._height = value;\n pin._ts_transform = ++iid$1;\n },\n scale: function(pin, value) {\n pin._scaleX = value;\n pin._scaleY = value;\n pin._ts_transform = ++iid$1;\n },\n scaleX: function(pin, value) {\n pin._scaleX = value;\n pin._ts_transform = ++iid$1;\n },\n scaleY: function(pin, value) {\n pin._scaleY = value;\n pin._ts_transform = ++iid$1;\n },\n skew: function(pin, value) {\n pin._skewX = value;\n pin._skewY = value;\n pin._ts_transform = ++iid$1;\n },\n skewX: function(pin, value) {\n pin._skewX = value;\n pin._ts_transform = ++iid$1;\n },\n skewY: function(pin, value) {\n pin._skewY = value;\n pin._ts_transform = ++iid$1;\n },\n rotation: function(pin, value) {\n pin._rotation = value;\n pin._ts_transform = ++iid$1;\n },\n pivot: function(pin, value) {\n pin._pivotX = value;\n pin._pivotY = value;\n pin._pivoted = true;\n pin._ts_transform = ++iid$1;\n },\n pivotX: function(pin, value) {\n pin._pivotX = value;\n pin._pivoted = true;\n pin._ts_transform = ++iid$1;\n },\n pivotY: function(pin, value) {\n pin._pivotY = value;\n pin._pivoted = true;\n pin._ts_transform = ++iid$1;\n },\n offset: function(pin, value) {\n pin._offsetX = value;\n pin._offsetY = value;\n pin._ts_translate = ++iid$1;\n },\n offsetX: function(pin, value) {\n pin._offsetX = value;\n pin._ts_translate = ++iid$1;\n },\n offsetY: function(pin, value) {\n pin._offsetY = value;\n pin._ts_translate = ++iid$1;\n },\n align: function(pin, value) {\n this.alignX(pin, value);\n this.alignY(pin, value);\n },\n alignX: function(pin, value) {\n pin._alignX = value;\n pin._aligned = true;\n pin._ts_translate = ++iid$1;\n this.handleX(pin, value);\n },\n alignY: function(pin, value) {\n pin._alignY = value;\n pin._aligned = true;\n pin._ts_translate = ++iid$1;\n this.handleY(pin, value);\n },\n handle: function(pin, value) {\n this.handleX(pin, value);\n this.handleY(pin, value);\n },\n handleX: function(pin, value) {\n pin._handleX = value;\n pin._handled = true;\n pin._ts_translate = ++iid$1;\n },\n handleY: function(pin, value) {\n pin._handleY = value;\n pin._handled = true;\n pin._ts_translate = ++iid$1;\n },\n resizeMode: function(pin, value, all) {\n if (all) {\n if (value == \"in\") {\n value = \"in-pad\";\n } else if (value == \"out\") {\n value = \"out-crop\";\n }\n scaleTo(pin, all.resizeWidth, all.resizeHeight, value);\n }\n },\n resizeWidth: function(pin, value, all) {\n if (!all || !all.resizeMode) {\n scaleTo(pin, value, null);\n }\n },\n resizeHeight: function(pin, value, all) {\n if (!all || !all.resizeMode) {\n scaleTo(pin, null, value);\n }\n },\n scaleMode: function(pin, value, all) {\n if (all) {\n scaleTo(pin, all.scaleWidth, all.scaleHeight, value);\n }\n },\n scaleWidth: function(pin, value, all) {\n if (!all || !all.scaleMode) {\n scaleTo(pin, value, null);\n }\n },\n scaleHeight: function(pin, value, all) {\n if (!all || !all.scaleMode) {\n scaleTo(pin, null, value);\n }\n },\n matrix: function(pin, value) {\n this.scaleX(pin, value.a);\n this.skewX(pin, value.c / value.d);\n this.skewY(pin, value.b / value.a);\n this.scaleY(pin, value.d);\n this.offsetX(pin, value.e);\n this.offsetY(pin, value.f);\n this.rotation(pin, 0);\n }\n};\nPin.prototype.scaleTo = function(width, height, mode) {\n scaleTo(this, width, height, mode);\n};\nfunction scaleTo(pin, width, height, mode) {\n var w = typeof width === \"number\";\n var h = typeof height === \"number\";\n var m = typeof mode === \"string\";\n pin._ts_transform = ++iid$1;\n if (w) {\n pin._scaleX = width / pin._width_;\n pin._width = pin._width_;\n }\n if (h) {\n pin._scaleY = height / pin._height_;\n pin._height = pin._height_;\n }\n if (w && h && m) {\n if (mode == \"out\" || mode == \"out-crop\") {\n pin._scaleX = pin._scaleY = Math.max(pin._scaleX, pin._scaleY);\n } else if (mode == \"in\" || mode == \"in-pad\") {\n pin._scaleX = pin._scaleY = Math.min(pin._scaleX, pin._scaleY);\n }\n if (mode == \"out-crop\" || mode == \"in-pad\") {\n pin._width = width / pin._scaleX;\n pin._height = height / pin._scaleY;\n }\n }\n}\nPin._add_shortcuts = function(prototype) {\n prototype.size = function(w, h) {\n this.pin(\"width\", w);\n this.pin(\"height\", h);\n return this;\n };\n prototype.width = function(w) {\n if (typeof w === \"undefined\") {\n return this.pin(\"width\");\n }\n this.pin(\"width\", w);\n return this;\n };\n prototype.height = function(h) {\n if (typeof h === \"undefined\") {\n return this.pin(\"height\");\n }\n this.pin(\"height\", h);\n return this;\n };\n prototype.offset = function(a, b) {\n if (typeof a === \"object\")\n b = a.y, a = a.x;\n this.pin(\"offsetX\", a);\n this.pin(\"offsetY\", b);\n return this;\n };\n prototype.rotate = function(a) {\n this.pin(\"rotation\", a);\n return this;\n };\n prototype.skew = function(a, b) {\n if (typeof a === \"object\")\n b = a.y, a = a.x;\n else if (typeof b === \"undefined\")\n b = a;\n this.pin(\"skewX\", a);\n this.pin(\"skewY\", b);\n return this;\n };\n prototype.scale = function(a, b) {\n if (typeof a === \"object\")\n b = a.y, a = a.x;\n else if (typeof b === \"undefined\")\n b = a;\n this.pin(\"scaleX\", a);\n this.pin(\"scaleY\", b);\n return this;\n };\n prototype.alpha = function(a, ta) {\n this.pin(\"alpha\", a);\n if (typeof ta !== \"undefined\") {\n this.pin(\"textureAlpha\", ta);\n }\n return this;\n };\n};\nvar iid = 0;\nstats.create = 0;\nfunction assertType(obj) {\n if (obj && obj instanceof Node) {\n return obj;\n }\n throw \"Invalid node: \" + obj;\n}\nconst create = function() {\n return new Node();\n};\nfunction Node() {\n stats.create++;\n this._pin = new Pin(this);\n}\nNode.prototype.matrix = function(relative) {\n if (relative === true) {\n return this._pin.relativeMatrix();\n }\n return this._pin.absoluteMatrix();\n};\nNode.prototype.pin = function(a, b) {\n if (typeof a === \"object\") {\n this._pin.set(a);\n return this;\n } else if (typeof a === \"string\") {\n if (typeof b === \"undefined\") {\n return this._pin.get(a);\n } else {\n this._pin.set(a, b);\n return this;\n }\n } else if (typeof a === \"undefined\") {\n return this._pin;\n }\n};\nNode.prototype.scaleTo = function(a, b, c) {\n if (typeof a === \"object\")\n c = b, b = a.y, a = a.x;\n this._pin.scaleTo(a, b, c);\n return this;\n};\nPin._add_shortcuts(Node.prototype);\nNode.prototype._label = \"\";\nNode.prototype._visible = true;\nNode.prototype._parent = null;\nNode.prototype._next = null;\nNode.prototype._prev = null;\nNode.prototype._first = null;\nNode.prototype._last = null;\nNode.prototype._attrs = null;\nNode.prototype._flags = null;\nNode.prototype.toString = function() {\n return \"[\" + this._label + \"]\";\n};\nNode.prototype.id = function(id) {\n return this.label(id);\n};\nNode.prototype.label = function(label) {\n if (typeof label === \"undefined\") {\n return this._label;\n }\n this._label = label;\n return this;\n};\nNode.prototype.attr = function(name, value) {\n if (typeof value === \"undefined\") {\n return this._attrs !== null ? this._attrs[name] : void 0;\n }\n (this._attrs !== null ? this._attrs : this._attrs = {})[name] = value;\n return this;\n};\nNode.prototype.visible = function(visible) {\n if (typeof visible === \"undefined\") {\n return this._visible;\n }\n this._visible = visible;\n this._parent && (this._parent._ts_children = ++iid);\n this._ts_pin = ++iid;\n this.touch();\n return this;\n};\nNode.prototype.hide = function() {\n return this.visible(false);\n};\nNode.prototype.show = function() {\n return this.visible(true);\n};\nNode.prototype.parent = function() {\n return this._parent;\n};\nNode.prototype.next = function(visible) {\n var next = this._next;\n while (next && visible && !next._visible) {\n next = next._next;\n }\n return next;\n};\nNode.prototype.prev = function(visible) {\n var prev = this._prev;\n while (prev && visible && !prev._visible) {\n prev = prev._prev;\n }\n return prev;\n};\nNode.prototype.first = function(visible) {\n var next = this._first;\n while (next && visible && !next._visible) {\n next = next._next;\n }\n return next;\n};\nNode.prototype.last = function(visible) {\n var prev = this._last;\n while (prev && visible && !prev._visible) {\n prev = prev._prev;\n }\n return prev;\n};\nNode.prototype.visit = function(visitor, data) {\n var reverse = visitor.reverse;\n var visible = visitor.visible;\n if (visitor.start && visitor.start(this, data)) {\n return;\n }\n var child, next = reverse ? this.last(visible) : this.first(visible);\n while (child = next) {\n next = reverse ? child.prev(visible) : child.next(visible);\n if (child.visit(visitor, data)) {\n return true;\n }\n }\n return visitor.end && visitor.end(this, data);\n};\nNode.prototype.append = function(child, more) {\n if (Array.isArray(child))\n for (var i = 0; i < child.length; i++)\n append(this, child[i]);\n else if (typeof more !== \"undefined\")\n for (var i = 0; i < arguments.length; i++)\n append(this, arguments[i]);\n else if (typeof child !== \"undefined\")\n append(this, child);\n return this;\n};\nNode.prototype.prepend = function(child, more) {\n if (Array.isArray(child))\n for (var i = child.length - 1; i >= 0; i--)\n prepend(this, child[i]);\n else if (typeof more !== \"undefined\")\n for (var i = arguments.length - 1; i >= 0; i--)\n prepend(this, arguments[i]);\n else if (typeof child !== \"undefined\")\n prepend(this, child);\n return this;\n};\nNode.prototype.appendTo = function(parent) {\n append(parent, this);\n return this;\n};\nNode.prototype.prependTo = function(parent) {\n prepend(parent, this);\n return this;\n};\nNode.prototype.insertNext = function(sibling, more) {\n if (Array.isArray(sibling))\n for (var i = 0; i < sibling.length; i++)\n insertAfter(sibling[i], this);\n else if (typeof more !== \"undefined\")\n for (var i = 0; i < arguments.length; i++)\n insertAfter(arguments[i], this);\n else if (typeof sibling !== \"undefined\")\n insertAfter(sibling, this);\n return this;\n};\nNode.prototype.insertPrev = function(sibling, more) {\n if (Array.isArray(sibling))\n for (var i = sibling.length - 1; i >= 0; i--)\n insertBefore(sibling[i], this);\n else if (typeof more !== \"undefined\")\n for (var i = arguments.length - 1; i >= 0; i--)\n insertBefore(arguments[i], this);\n else if (typeof sibling !== \"undefined\")\n insertBefore(sibling, this);\n return this;\n};\nNode.prototype.insertAfter = function(prev) {\n insertAfter(this, prev);\n return this;\n};\nNode.prototype.insertBefore = function(next) {\n insertBefore(this, next);\n return this;\n};\nfunction append(parent, child) {\n assertType(child);\n assertType(parent);\n child.remove();\n if (parent._last) {\n parent._last._next = child;\n child._prev = parent._last;\n }\n child._parent = parent;\n parent._last = child;\n if (!parent._first) {\n parent._first = child;\n }\n child._parent._flag(child, true);\n child._ts_parent = ++iid;\n parent._ts_children = ++iid;\n parent.touch();\n}\nfunction prepend(parent, child) {\n assertType(child);\n assertType(parent);\n child.remove();\n if (parent._first) {\n parent._first._prev = child;\n child._next = parent._first;\n }\n child._parent = parent;\n parent._first = child;\n if (!parent._last) {\n parent._last = child;\n }\n child._parent._flag(child, true);\n child._ts_parent = ++iid;\n parent._ts_children = ++iid;\n parent.touch();\n}\nfunction insertBefore(self, next) {\n assertType(self);\n assertType(next);\n self.remove();\n var parent = next._parent;\n var prev = next._prev;\n next._prev = self;\n prev && (prev._next = self) || parent && (parent._first = self);\n self._parent = parent;\n self._prev = prev;\n self._next = next;\n self._parent._flag(self, true);\n self._ts_parent = ++iid;\n self.touch();\n}\nfunction insertAfter(self, prev) {\n assertType(self);\n assertType(prev);\n self.remove();\n var parent = prev._parent;\n var next = prev._next;\n prev._next = self;\n next && (next._prev = self) || parent && (parent._last = self);\n self._parent = parent;\n self._prev = prev;\n self._next = next;\n self._parent._flag(self, true);\n self._ts_parent = ++iid;\n self.touch();\n}\nNode.prototype.remove = function(child, more) {\n if (typeof child !== \"undefined\") {\n if (Array.isArray(child)) {\n for (var i = 0; i < child.length; i++)\n assertType(child[i]).remove();\n } else if (typeof more !== \"undefined\") {\n for (var i = 0; i < arguments.length; i++)\n assertType(arguments[i]).remove();\n } else {\n assertType(child).remove();\n }\n return this;\n }\n if (this._prev) {\n this._prev._next = this._next;\n }\n if (this._next) {\n this._next._prev = this._prev;\n }\n if (this._parent) {\n if (this._parent._first === this) {\n this._parent._first = this._next;\n }\n if (this._parent._last === this) {\n this._parent._last = this._prev;\n }\n this._parent._flag(this, false);\n this._parent._ts_children = ++iid;\n this._parent.touch();\n }\n this._prev = this._next = this._parent = null;\n this._ts_parent = ++iid;\n return this;\n};\nNode.prototype.empty = function() {\n var child, next = this._first;\n while (child = next) {\n next = child._next;\n child._prev = child._next = child._parent = null;\n this._flag(child, false);\n }\n this._first = this._last = null;\n this._ts_children = ++iid;\n this.touch();\n return this;\n};\nNode.prototype._ts_touch = null;\nNode.prototype.touch = function() {\n this._ts_touch = ++iid;\n this._parent && this._parent.touch();\n return this;\n};\nNode.prototype._flag = function(obj, name) {\n if (typeof name === \"undefined\") {\n return this._flags !== null && this._flags[obj] || 0;\n }\n if (typeof obj === \"string\") {\n if (name) {\n this._flags = this._flags || {};\n if (!this._flags[obj] && this._parent) {\n this._parent._flag(obj, true);\n }\n this._flags[obj] = (this._flags[obj] || 0) + 1;\n } else if (this._flags && this._flags[obj] > 0) {\n if (this._flags[obj] == 1 && this._parent) {\n this._parent._flag(obj, false);\n }\n this._flags[obj] = this._flags[obj] - 1;\n }\n }\n if (typeof obj === \"object\") {\n if (obj._flags) {\n for (var type in obj._flags) {\n if (obj._flags[type] > 0) {\n this._flag(type, name);\n }\n }\n }\n }\n return this;\n};\nNode.prototype.hitTest = function(hit) {\n var width = this._pin._width;\n var height = this._pin._height;\n return hit.x >= 0 && hit.x <= width && hit.y >= 0 && hit.y <= height;\n};\nNode.prototype._textures = null;\nNode.prototype._alpha = 1;\nNode.prototype.render = function(context) {\n if (!this._visible) {\n return;\n }\n stats.node++;\n var m = this.matrix();\n context.setTransform(m.a, m.b, m.c, m.d, m.e, m.f);\n this._alpha = this._pin._alpha * (this._parent ? this._parent._alpha : 1);\n var alpha = this._pin._textureAlpha * this._alpha;\n if (context.globalAlpha != alpha) {\n context.globalAlpha = alpha;\n }\n if (this._textures !== null) {\n for (var i = 0, n = this._textures.length; i < n; i++) {\n this._textures[i].draw(context);\n }\n }\n if (context.globalAlpha != this._alpha) {\n context.globalAlpha = this._alpha;\n }\n var child, next = this._first;\n while (child = next) {\n next = child._next;\n child.render(context);\n }\n};\nNode.prototype._tickBefore = null;\nNode.prototype._tickAfter = null;\nNode.prototype.MAX_ELAPSE = Infinity;\nNode.prototype._tick = function(elapsed, now, last) {\n if (!this._visible) {\n return;\n }\n if (elapsed > this.MAX_ELAPSE) {\n elapsed = this.MAX_ELAPSE;\n }\n var ticked = false;\n if (this._tickBefore !== null) {\n for (var i = 0; i < this._tickBefore.length; i++) {\n stats.tick++;\n var tickFn = this._tickBefore[i];\n ticked = tickFn.call(this, elapsed, now, last) === true || ticked;\n }\n }\n var child, next = this._first;\n while (child = next) {\n next = child._next;\n if (child._flag(\"_tick\")) {\n ticked = child._tick(elapsed, now, last) === true ? true : ticked;\n }\n }\n if (this._tickAfter !== null) {\n for (var i = 0; i < this._tickAfter.length; i++) {\n stats.tick++;\n var tickFn = this._tickAfter[i];\n ticked = tickFn.call(this, elapsed, now, last) === true || ticked;\n }\n }\n return ticked;\n};\nNode.prototype.tick = function(ticker, before) {\n if (typeof ticker !== \"function\") {\n return;\n }\n if (before) {\n if (this._tickBefore === null) {\n this._tickBefore = [];\n }\n this._tickBefore.push(ticker);\n } else {\n if (this._tickAfter === null) {\n this._tickAfter = [];\n }\n this._tickAfter.push(ticker);\n }\n this._flag(\"_tick\", this._tickAfter !== null && this._tickAfter.length > 0 || this._tickBefore !== null && this._tickBefore.length > 0);\n};\nNode.prototype.untick = function(ticker) {\n if (typeof ticker !== \"function\") {\n return;\n }\n var i;\n if (this._tickBefore !== null && (i = this._tickBefore.indexOf(ticker)) >= 0) {\n this._tickBefore.splice(i, 1);\n }\n if (this._tickAfter !== null && (i = this._tickAfter.indexOf(ticker)) >= 0) {\n this._tickAfter.splice(i, 1);\n }\n};\nNode.prototype.timeout = function(fn, time) {\n this.setTimeout(fn, time);\n};\nNode.prototype.setTimeout = function(fn, time) {\n function timer(t) {\n if ((time -= t) < 0) {\n this.untick(timer);\n fn.call(this);\n } else {\n return true;\n }\n }\n this.tick(timer);\n return timer;\n};\nNode.prototype.clearTimeout = function(timer) {\n this.untick(timer);\n};\nNode.prototype._listeners = null;\nNode.prototype._event_callback = function(name, on) {\n this._flag(name, on);\n};\nNode.prototype.on = function(types, listener) {\n if (!types || !types.length || typeof listener !== \"function\") {\n return this;\n }\n if (this._listeners === null) {\n this._listeners = {};\n }\n var isarray = typeof types !== \"string\" && typeof types.join === \"function\";\n if (types = (isarray ? types.join(\" \") : types).match(/\\S+/g)) {\n for (var i = 0; i < types.length; i++) {\n var type = types[i];\n this._listeners[type] = this._listeners[type] || [];\n this._listeners[type].push(listener);\n if (typeof this._event_callback === \"function\") {\n this._event_callback(type, true);\n }\n }\n }\n return this;\n};\nNode.prototype.off = function(types, listener) {\n if (!types || !types.length || typeof listener !== \"function\") {\n return this;\n }\n if (this._listeners === null) {\n return this;\n }\n var isarray = typeof types !== \"string\" && typeof types.join === \"function\";\n if (types = (isarray ? types.join(\" \") : types).match(/\\S+/g)) {\n for (var i = 0; i < types.length; i++) {\n var type = types[i], all = this._listeners[type], index;\n if (all && (index = all.indexOf(listener)) >= 0) {\n all.splice(index, 1);\n if (!all.length) {\n delete this._listeners[type];\n }\n if (typeof this._event_callback === \"function\") {\n this._event_callback(type, false);\n }\n }\n }\n }\n return this;\n};\nNode.prototype.listeners = function(type) {\n return this._listeners && this._listeners[type];\n};\nNode.prototype.publish = function(name, args) {\n var listeners = this.listeners(name);\n if (!listeners || !listeners.length) {\n return 0;\n }\n for (var l = 0; l < listeners.length; l++) {\n listeners[l].apply(this, args);\n }\n return listeners.length;\n};\nNode.prototype.trigger = function(name, args) {\n this.publish(name, args);\n return this;\n};\nvar native = Math;\nconst math = Object.create(Math);\nmath.random = function(min, max) {\n if (typeof min === \"undefined\") {\n max = 1, min = 0;\n } else if (typeof max === \"undefined\") {\n max = min, min = 0;\n }\n return min == max ? min : native.random() * (max - min) + min;\n};\nmath.wrap = function(num, min, max) {\n if (typeof min === \"undefined\") {\n max = 1, min = 0;\n } else if (typeof max === \"undefined\") {\n max = min, min = 0;\n }\n if (max > min) {\n num = (num - min) % (max - min);\n return num + (num < 0 ? max : min);\n } else {\n num = (num - max) % (min - max);\n return num + (num <= 0 ? min : max);\n }\n};\nmath.clamp = function(num, min, max) {\n if (num < min) {\n return min;\n } else if (num > max) {\n return max;\n } else {\n return num;\n }\n};\nmath.length = function(x, y) {\n return native.sqrt(x * x + y * y);\n};\nmath.rotate = math.wrap;\nmath.limit = math.clamp;\nconst isFn = function(value) {\n var str = Object.prototype.toString.call(value);\n return str === \"[object Function]\" || str === \"[object GeneratorFunction]\" || str === \"[object AsyncFunction]\";\n};\nconst isHash = function(value) {\n return Object.prototype.toString.call(value) === \"[object Object]\" && value.constructor === Object;\n};\nclass Texture {\n constructor(texture2, ratio) {\n if (typeof texture2 === \"object\") {\n this.src(texture2, ratio);\n }\n }\n pipe() {\n return new Texture(this);\n }\n /**\n * Signatures: (texture), (x, y, w, h), (w, h)\n */\n src(x, y, w, h) {\n if (typeof x === \"object\") {\n var drawable = x, ratio = y || 1;\n this._image = drawable;\n this._sx = this._dx = 0;\n this._sy = this._dy = 0;\n this._sw = this._dw = drawable.width / ratio;\n this._sh = this._dh = drawable.height / ratio;\n this.width = drawable.width / ratio;\n this.height = drawable.height / ratio;\n this.ratio = ratio;\n } else {\n if (typeof w === \"undefined\") {\n w = x, h = y;\n } else {\n this._sx = x, this._sy = y;\n }\n this._sw = this._dw = w;\n this._sh = this._dh = h;\n this.width = w;\n this.height = h;\n }\n return this;\n }\n /**\n * Signatures: (x, y, w, h), (x, y)\n */\n dest(x, y, w, h) {\n this._dx = x, this._dy = y;\n this._dx = x, this._dy = y;\n if (typeof w !== \"undefined\") {\n this._dw = w, this._dh = h;\n this.width = w, this.height = h;\n }\n return this;\n }\n draw(context, x1, y1, x2, y2, x3, y3, x4, y4) {\n var drawable = this._image;\n if (drawable === null || typeof drawable !== \"object\") {\n return;\n }\n var sx = this._sx, sy = this._sy;\n var sw = this._sw, sh = this._sh;\n var dx = this._dx, dy = this._dy;\n var dw = this._dw, dh = this._dh;\n if (typeof x3 !== \"undefined\") {\n x1 = math.clamp(x1, 0, this._sw), x2 = math.clamp(x2, 0, this._sw - x1);\n y1 = math.clamp(y1, 0, this._sh), y2 = math.clamp(y2, 0, this._sh - y1);\n sx += x1, sy += y1, sw = x2, sh = y2;\n dx = x3, dy = y3, dw = x4, dh = y4;\n } else if (typeof x2 !== \"undefined\") {\n dx = x1, dy = y1, dw = x2, dh = y2;\n } else if (typeof x1 !== \"undefined\") {\n dw = x1, dh = y1;\n }\n var ratio = this.ratio || 1;\n sx *= ratio, sy *= ratio, sw *= ratio, sh *= ratio;\n try {\n if (typeof drawable.draw === \"function\") {\n drawable.draw(context, sx, sy, sw, sh, dx, dy, dw, dh);\n } else {\n stats.draw++;\n context.drawImage(drawable, sx, sy, sw, sh, dx, dy, dw, dh);\n }\n } catch (ex) {\n if (!drawable._draw_failed) {\n console.log(\"Unable to draw: \", drawable);\n console.log(ex);\n drawable._draw_failed = true;\n }\n }\n }\n}\nvar NO_TEXTURE = new class extends Texture {\n constructor() {\n super();\n __publicField(this, \"pipe\", function() {\n return this;\n });\n __publicField(this, \"src\", function() {\n return this;\n });\n __publicField(this, \"dest\", function() {\n return this;\n });\n __publicField(this, \"draw\", function() {\n });\n this.x = this.y = this.width = this.height = 0;\n }\n}();\nvar NO_SELECTION = new Selection(NO_TEXTURE);\nfunction preloadImage(src) {\n console.log(\"Loading image: \" + src);\n return new Promise(function(resolve, reject) {\n const img = new Image();\n img.onload = function() {\n console.log(\"Image loaded: \" + src);\n resolve(img);\n };\n img.onerror = function(error) {\n console.log(\"Loading failed: \" + src);\n reject(error);\n };\n img.src = src;\n });\n}\nvar _atlases_map = {};\nvar _atlases_arr = [];\nconst atlas = async function(def) {\n var atlas2 = isFn(def.draw) ? def : new Atlas(def);\n if (def.name) {\n _atlases_map[def.name] = atlas2;\n }\n _atlases_arr.push(atlas2);\n deprecated(def, \"imagePath\");\n deprecated(def, \"imageRatio\");\n var url = def.imagePath;\n var ratio = def.imageRatio || 1;\n if (\"string\" === typeof def.image) {\n url = def.image;\n } else if (isHash(def.image)) {\n url = def.image.src || def.image.url;\n ratio = def.image.ratio || ratio;\n }\n if (url) {\n const image2 = await preloadImage(url);\n atlas2.src(image2, ratio);\n }\n return atlas2;\n};\nclass Atlas extends Texture {\n constructor(def) {\n super();\n var atlas2 = this;\n deprecated(def, \"filter\");\n deprecated(def, \"cutouts\");\n deprecated(def, \"sprites\");\n deprecated(def, \"factory\");\n var map = def.map || def.filter;\n var ppu = def.ppu || def.ratio || 1;\n var trim = def.trim || 0;\n var textures = def.textures;\n var factory = def.factory;\n var cutouts = def.cutouts || def.sprites;\n function make(def2) {\n if (!def2 || isFn(def2.draw)) {\n return def2;\n }\n def2 = Object.assign({}, def2);\n if (isFn(map)) {\n def2 = map(def2);\n }\n if (ppu != 1) {\n def2.x *= ppu, def2.y *= ppu;\n def2.width *= ppu, def2.height *= ppu;\n def2.top *= ppu, def2.bottom *= ppu;\n def2.left *= ppu, def2.right *= ppu;\n }\n if (trim != 0) {\n def2.x += trim, def2.y += trim;\n def2.width -= 2 * trim, def2.height -= 2 * trim;\n def2.top -= trim, def2.bottom -= trim;\n def2.left -= trim, def2.right -= trim;\n }\n var texture2 = atlas2.pipe();\n texture2.top = def2.top, texture2.bottom = def2.bottom;\n texture2.left = def2.left, texture2.right = def2.right;\n texture2.src(def2.x, def2.y, def2.width, def2.height);\n return texture2;\n }\n function find(query) {\n if (textures) {\n if (isFn(textures)) {\n return textures(query);\n } else if (isHash(textures)) {\n return textures[query];\n }\n }\n if (cutouts) {\n var result = null, n = 0;\n for (var i = 0; i < cutouts.length; i++) {\n if (string.startsWith(cutouts[i].name, query)) {\n if (n === 0) {\n result = cutouts[i];\n } else if (n === 1) {\n result = [result, cutouts[i]];\n } else {\n result.push(cutouts[i]);\n }\n n++;\n }\n }\n if (n === 0 && isFn(factory)) {\n result = function(subquery) {\n return factory(query + (subquery ? subquery : \"\"));\n };\n }\n return result;\n }\n }\n this.select = function(query) {\n if (!query) {\n return new Selection(this.pipe());\n }\n var found = find(query);\n if (found) {\n return new Selection(found, find, make);\n }\n };\n }\n}\nfunction Selection(result, find, make) {\n function link(result2, subquery) {\n if (!result2) {\n return NO_TEXTURE;\n } else if (isFn(result2.draw)) {\n return result2;\n } else if (isHash(result2) && \"number\" === typeof result2.width && \"number\" === typeof result2.height && isFn(make)) {\n return make(result2);\n } else if (isHash(result2) && \"undefined\" !== typeof subquery) {\n return link(result2[subquery]);\n } else if (isFn(result2)) {\n return link(result2(subquery));\n } else if (Array.isArray(result2)) {\n return link(result2[0]);\n } else if (\"string\" === typeof result2 && isFn(find)) {\n return link(find(result2));\n }\n }\n this.one = function(subquery) {\n return link(result, subquery);\n };\n this.array = function(arr) {\n var array = Array.isArray(arr) ? arr : [];\n if (Array.isArray(result)) {\n for (var i = 0; i < result.length; i++) {\n array[i] = link(result[i]);\n }\n } else {\n array[0] = link(result);\n }\n return array;\n };\n}\nconst texture = function(query) {\n if (!(\"string\" === typeof query)) {\n return new Selection(query);\n }\n var result = null, atlas2, i;\n if ((i = query.indexOf(\":\")) > 0 && query.length > i + 1) {\n atlas2 = _atlases_map[query.slice(0, i)];\n result = atlas2 && atlas2.select(query.slice(i + 1));\n }\n if (!result && (atlas2 = _atlases_map[query])) {\n result = atlas2.select();\n }\n for (i = 0; !result && i < _atlases_arr.length; i++) {\n result = _atlases_arr[i].select(query);\n }\n if (!result) {\n console.error(\"Texture not found: \" + query);\n result = NO_SELECTION;\n }\n return result;\n};\nfunction deprecated(hash, name, msg) {\n if (name in hash)\n console.log(msg ? msg.replace(\"%name\", name) : \"'\" + name + \"' field of texture atlas is deprecated.\");\n}\nconst canvas = function(type, attributes, plotter) {\n if (typeof type === \"string\") {\n if (typeof attributes === \"object\")\n ;\n else {\n if (typeof attributes === \"function\") {\n plotter = attributes;\n }\n attributes = {};\n }\n } else {\n if (typeof type === \"function\") {\n plotter = type;\n }\n attributes = {};\n type = \"2d\";\n }\n var canvas2 = document.createElement(\"canvas\");\n var context = canvas2.getContext(type, attributes);\n var texture2 = new Texture(canvas2);\n texture2.context = function() {\n return context;\n };\n texture2.size = function(width, height, ratio) {\n ratio = ratio || 1;\n canvas2.width = width * ratio;\n canvas2.height = height * ratio;\n this.src(canvas2, ratio);\n return this;\n };\n texture2.canvas = function(fn) {\n if (typeof fn === \"function\") {\n fn.call(this, context);\n } else if (typeof fn === \"undefined\" && typeof plotter === \"function\") {\n plotter.call(this, context);\n }\n return this;\n };\n if (typeof plotter === \"function\") {\n plotter.call(texture2, context);\n }\n return texture2;\n};\nconst PIXEL_RATIO = window.devicePixelRatio || 1;\nlet M;\nfunction memoizeDraw(callback, memoKey = () => null) {\n let lastRatio = 0;\n let lastSelection = void 0;\n let texture2 = Stage.canvas();\n let sprite2 = Stage.sprite();\n let first = true;\n sprite2.tick(function() {\n let m = this._parent.matrix();\n if (first) {\n first = false;\n if (!(m = M)) {\n return;\n }\n }\n M = m;\n let newRatio = Math.max(Math.abs(m.a), Math.abs(m.b));\n let rationChange = lastRatio / newRatio;\n if (lastRatio === 0 || rationChange > 1.25 || rationChange < 0.8) {\n const newSelection = memoKey();\n if (lastSelection !== newSelection) {\n lastRatio = newRatio;\n callback(2.5 * newRatio / PIXEL_RATIO, texture2, sprite2);\n sprite2.texture(texture2);\n sprite2.__timestamp = Date.now();\n }\n }\n }, false);\n return sprite2;\n}\nclass Mouse {\n constructor() {\n __publicField(this, \"x\", 0);\n __publicField(this, \"y\", 0);\n __publicField(this, \"ratio\", 1);\n __publicField(this, \"stage\");\n __publicField(this, \"elem\");\n __publicField(this, \"clicklist\", []);\n __publicField(this, \"cancellist\", []);\n __publicField(this, \"handleStart\", (event) => {\n event.preventDefault();\n this.locate(event);\n this.publish(event.type, event);\n this.lookup(\"click\", this.clicklist);\n this.lookup(\"mousecancel\", this.cancellist);\n });\n __publicField(this, \"handleMove\", (event) => {\n event.preventDefault();\n this.locate(event);\n this.publish(event.type, event);\n });\n __publicField(this, \"handleEnd\", (event) => {\n event.preventDefault();\n this.publish(event.type, event);\n if (this.clicklist.length) {\n this.publish(\"click\", event, this.clicklist);\n }\n this.cancellist.length = 0;\n });\n __publicField(this, \"handleCancel\", (event) => {\n if (this.cancellist.length) {\n this.publish(\"mousecancel\", event, this.cancellist);\n }\n this.clicklist.length = 0;\n });\n __publicField(this, \"toString\", function() {\n return (this.x | 0) + \"x\" + (this.y | 0);\n });\n __publicField(this, \"locate\", function(event) {\n const elem = this.elem;\n let x;\n let y;\n if (event.touches && event.touches.length) {\n x = event.touches[0].clientX;\n y = event.touches[0].clientY;\n } else {\n x = event.clientX;\n y = event.clientY;\n }\n var rect = elem.getBoundingClientRect();\n x -= rect.left;\n y -= rect.top;\n x -= elem.clientLeft | 0;\n y -= elem.clientTop | 0;\n this.x = x * this.ratio;\n this.y = y * this.ratio;\n });\n __publicField(this, \"lookup\", function(type, collect) {\n this.type = type;\n this.root = this.stage;\n this.event = null;\n collect.length = 0;\n this.collect = collect;\n this.root.visit({\n reverse: true,\n visible: true,\n start: this.visitStart,\n end: this.visitEnd\n }, this);\n });\n __publicField(this, \"publish\", function(type, event, targets) {\n this.type = type;\n this.root = this.stage;\n this.event = event;\n this.collect = false;\n this.timeStamp = Date.now();\n if (type !== \"mousemove\" && type !== \"touchmove\") {\n console.log(this.type + \" \" + this);\n }\n if (targets) {\n while (targets.length)\n if (this.visitEnd(targets.shift()))\n break;\n targets.length = 0;\n } else {\n this.root.visit({\n reverse: true,\n visible: true,\n start: this.visitStart,\n end: this.visitEnd\n }, this);\n }\n });\n __publicField(this, \"visitStart\", (node) => {\n return !node._flag(this.type);\n });\n __publicField(this, \"visitEnd\", (node) => {\n rel.raw = this.event;\n rel.type = this.type;\n rel.timeStamp = this.timeStamp;\n rel.abs.x = this.x;\n rel.abs.y = this.y;\n var listeners = node.listeners(this.type);\n if (!listeners) {\n return;\n }\n node.matrix().inverse().map(this, rel);\n if (!(node === this.root || node.attr(\"spy\") || node.hitTest(rel))) {\n return;\n }\n if (this.collect) {\n this.collect.push(node);\n }\n if (this.event) {\n var cancel = false;\n for (var l = 0; l < listeners.length; l++) {\n cancel = listeners[l].call(node, rel) ? true : cancel;\n }\n return cancel;\n }\n });\n }\n mount(stage, elem) {\n this.stage = stage;\n this.elem = elem;\n this.ratio = stage.viewport().ratio || 1;\n stage.on(\"viewport\", (size) => {\n this.ratio = size.ratio ?? this.ratio;\n });\n elem.addEventListener(\"touchstart\", this.handleStart);\n elem.addEventListener(\"touchend\", this.handleEnd);\n elem.addEventListener(\"touchmove\", this.handleMove);\n elem.addEventListener(\"touchcancel\", this.handleCancel);\n elem.addEventListener(\"mousedown\", this.handleStart);\n elem.addEventListener(\"mouseup\", this.handleEnd);\n elem.addEventListener(\"mousemove\", this.handleMove);\n document.addEventListener(\"mouseup\", this.handleCancel);\n window.addEventListener(\"blur\", this.handleCancel);\n return this;\n }\n unmount() {\n const elem = this.elem;\n elem.removeEventListener(\"touchstart\", this.handleStart);\n elem.removeEventListener(\"touchend\", this.handleEnd);\n elem.removeEventListener(\"touchmove\", this.handleMove);\n elem.removeEventListener(\"touchcancel\", this.handleCancel);\n elem.removeEventListener(\"mousedown\", this.handleStart);\n elem.removeEventListener(\"mouseup\", this.handleEnd);\n elem.removeEventListener(\"mousemove\", this.handleMove);\n document.removeEventListener(\"mouseup\", this.handleCancel);\n window.removeEventListener(\"blur\", this.handleCancel);\n return this;\n }\n}\n__publicField(Mouse, \"CLICK\", \"click\");\n__publicField(Mouse, \"START\", \"touchstart mousedown\");\n__publicField(Mouse, \"MOVE\", \"touchmove mousemove\");\n__publicField(Mouse, \"END\", \"touchend mouseup\");\n__publicField(Mouse, \"CANCEL\", \"touchcancel mousecancel\");\nvar rel = {}, abs = {};\ndefineValue(rel, \"clone\", function(obj) {\n obj = obj || {}, obj.x = this.x, obj.y = this.y;\n return obj;\n});\ndefineValue(rel, \"toString\", function() {\n return (this.x | 0) + \"x\" + (this.y | 0) + \" (\" + this.abs + \")\";\n});\ndefineValue(rel, \"abs\", abs);\ndefineValue(abs, \"clone\", function(obj) {\n obj = obj || {}, obj.x = this.x, obj.y = this.y;\n return obj;\n});\ndefineValue(abs, \"toString\", function() {\n return (this.x | 0) + \"x\" + (this.y | 0);\n});\nfunction defineValue(obj, name, value) {\n Object.defineProperty(obj, name, {\n value\n });\n}\nfunction IDENTITY(x) {\n return x;\n}\nvar _cache = {};\nvar _modes = {};\nvar _easings = {};\nclass Easing {\n static get(token, fallback = IDENTITY) {\n if (typeof token === \"function\") {\n return token;\n }\n if (typeof token !== \"string\") {\n return fallback;\n }\n var fn = _cache[token];\n if (fn) {\n return fn;\n }\n var match = /^(\\w+)(-(in|out|in-out|out-in))?(\\((.*)\\))?$/i.exec(token);\n if (!match || !match.length) {\n return fallback;\n }\n var easing = _easings[match[1]];\n var mode = _modes[match[3]];\n var params = match[5];\n if (easing && easing.fn) {\n fn = easing.fn;\n } else if (easing && easing.fc) {\n fn = easing.fc.apply(easing.fc, params && params.replace(/\\s+/, \"\").split(\",\"));\n } else {\n fn = fallback;\n }\n if (mode) {\n fn = mode.fn(fn);\n }\n _cache[token] = fn;\n return fn;\n }\n static add(data) {\n var names = (data.name || data.mode).split(/\\s+/);\n for (var i = 0; i < names.length; i++) {\n var name = names[i];\n if (name) {\n (data.name ? _easings : _modes)[name] = data;\n }\n }\n }\n}\nEasing.add({\n mode: \"in\",\n fn: function(f) {\n return f;\n }\n});\nEasing.add({\n mode: \"out\",\n fn: function(f) {\n return function(t) {\n return 1 - f(1 - t);\n };\n }\n});\nEasing.add({\n mode: \"in-out\",\n fn: function(f) {\n return function(t) {\n return t < 0.5 ? f(2 * t) / 2 : 1 - f(2 * (1 - t)) / 2;\n };\n }\n});\nEasing.add({\n mode: \"out-in\",\n fn: function(f) {\n return function(t) {\n return t < 0.5 ? 1 - f(2 * (1 - t)) / 2 : f(2 * t) / 2;\n };\n }\n});\nEasing.add({\n name: \"linear\",\n fn: function(t) {\n return t;\n }\n});\nEasing.add({\n name: \"quad\",\n fn: function(t) {\n return t * t;\n }\n});\nEasing.add({\n name: \"cubic\",\n fn: function(t) {\n return t * t * t;\n }\n});\nEasing.add({\n name: \"quart\",\n fn: function(t) {\n return t * t * t * t;\n }\n});\nEasing.add({\n name: \"quint\",\n fn: function(t) {\n return t * t * t * t * t;\n }\n});\nEasing.add({\n name: \"sin sine\",\n fn: function(t) {\n return 1 - Math.cos(t * Math.PI / 2);\n }\n});\nEasing.add({\n name: \"exp expo\",\n fn: function(t) {\n return t == 0 ? 0 : Math.pow(2, 10 * (t - 1));\n }\n});\nEasing.add({\n name: \"circle circ\",\n fn: function(t) {\n return 1 - Math.sqrt(1 - t * t);\n }\n});\nEasing.add({\n name: \"bounce\",\n fn: function(t) {\n return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + 0.75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375 : 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;\n }\n});\nEasing.add({\n name: \"poly\",\n fc: function(e) {\n return function(t) {\n return Math.pow(t, e);\n };\n }\n});\nEasing.add({\n name: \"elastic\",\n fc: function(a, p) {\n p = p || 0.45;\n a = a || 1;\n var s = p / (2 * Math.PI) * Math.asin(1 / a);\n return function(t) {\n return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p);\n };\n }\n});\nEasing.add({\n name: \"back\",\n fc: function(s) {\n s = typeof s !== \"undefined\" ? s : 1.70158;\n return function(t) {\n return t * t * ((s + 1) * t - s);\n };\n }\n});\nNode.prototype.tween = function(a, b, c) {\n let options;\n if (typeof a === \"object\" && a !== null) {\n options = a;\n } else if (typeof a === \"number\" && typeof b === \"number\") {\n options = {\n duration: a,\n delay: b,\n append: c\n };\n } else if (typeof a === \"number\") {\n options = {\n duration: a,\n delay: 0,\n append: b\n };\n } else {\n options = {\n duration: 400,\n delay: 0,\n append: a\n };\n }\n if (!this._tweens) {\n this._tweens = [];\n var ticktime = 0;\n this.tick(function(elapsed, now, last) {\n if (!this._tweens.length) {\n return false;\n }\n var ignore = ticktime != last;\n ticktime = now;\n if (ignore) {\n return true;\n }\n var head = this._tweens[0];\n var ended = head.tick(this, elapsed, now, last);\n if (ended) {\n if (head === this._tweens[0]) {\n this._tweens.shift();\n }\n var next = head.finish();\n if (next) {\n this._tweens.unshift(next);\n }\n }\n return true;\n }, true);\n }\n this.touch();\n if (!options.append) {\n this._tweens.length = 0;\n }\n var tween = new Tween(this, options);\n this._tweens.push(tween);\n return tween;\n};\nclass Tween {\n constructor(owner, options = {}) {\n __publicField(this, \"_ending\", []);\n this._end = {};\n this._duration = options.duration || 400;\n this._delay = options.delay || 0;\n this._owner = owner;\n this._time = 0;\n }\n // @internal\n tick(node, elapsed, now, last) {\n this._time += elapsed;\n if (this._time < this._delay) {\n return;\n }\n var time = this._time - this._delay;\n if (!this._start) {\n this._start = {};\n for (var key in this._end) {\n this._start[key] = this._owner.pin(key);\n }\n }\n var p = Math.min(time / this._duration, 1);\n var ended = p >= 1;\n if (typeof this._easing == \"function\") {\n p = this._easing(p);\n }\n var q = 1 - p;\n for (var key in this._end) {\n this._owner.pin(key, this._start[key] * q + this._end[key] * p);\n }\n return ended;\n }\n // @internal\n finish() {\n this._ending.forEach((callback) => {\n try {\n callback.call(this._owner);\n } catch (e) {\n console.error(e);\n }\n });\n return this._next;\n }\n tween(duration, delay) {\n return this._next = new Tween(this._owner, duration, delay);\n }\n duration(duration) {\n this._duration = duration;\n return this;\n }\n delay(delay) {\n this._delay = delay;\n return this;\n }\n ease(easing) {\n this._easing = Easing.get(easing);\n return this;\n }\n done(fn) {\n this._ending.push(fn);\n return this;\n }\n hide() {\n this._ending.push(function() {\n this.hide();\n });\n this._hide = true;\n return this;\n }\n remove() {\n this._ending.push(function() {\n this.remove();\n });\n this._remove = true;\n return this;\n }\n pin(a, b) {\n if (typeof a === \"object\") {\n for (var attr in a) {\n pinning(this._owner, this._end, attr, a[attr]);\n }\n } else if (typeof b !== \"undefined\") {\n pinning(this._owner, this._end, a, b);\n }\n return this;\n }\n /**\n * @deprecated Use .done(fn) instead.\n */\n then(fn) {\n this.done(fn);\n return this;\n }\n /**\n * @deprecated this doesn't do anything anymore, call tween on the node instead.\n */\n clear(forward) {\n return this;\n }\n}\nfunction pinning(node, map, key, value) {\n if (typeof node.pin(key) === \"number\") {\n map[key] = value;\n } else if (typeof node.pin(key + \"X\") === \"number\" && typeof node.pin(key + \"Y\") === \"number\") {\n map[key + \"X\"] = value;\n map[key + \"Y\"] = value;\n }\n}\nPin._add_shortcuts(Tween.prototype);\nconst _stages = [];\nconst pause = function() {\n for (let i = _stages.length - 1; i >= 0; i--) {\n _stages[i].pause();\n }\n};\nconst resume = function() {\n for (let i = _stages.length - 1; i >= 0; i--) {\n _stages[i].resume();\n }\n};\nconst mount = function(configs = {}) {\n let root = new Root();\n root.mount(configs);\n root.mouse = new Mouse().mount(root, root.dom);\n return root;\n};\nclass Root extends Node {\n constructor() {\n super();\n __publicField(this, \"canvas\", null);\n __publicField(this, \"dom\", null);\n __publicField(this, \"context\", null);\n __publicField(this, \"pixelWidth\", -1);\n __publicField(this, \"pixelHeight\", -1);\n __publicField(this, \"pixelRatio\", 1);\n __publicField(this, \"drawingWidth\", 0);\n __publicField(this, \"drawingHeight\", 0);\n __publicField(this, \"mounted\", false);\n __publicField(this, \"paused\", false);\n __publicField(this, \"sleep\", false);\n __publicField(this, \"mount\", (configs = {}) => {\n if (typeof configs.canvas === \"string\") {\n this.canvas = document.getElementById(configs.canvas);\n } else if (configs.canvas instanceof HTMLCanvasElement) {\n this.canvas = configs.canvas;\n } else if (configs.canvas)\n ;\n if (!this.canvas) {\n this.canvas = document.getElementById(\"cutjs\") || document.getElementById(\"stage\");\n }\n if (!this.canvas) {\n console.log(\"Creating Canvas...\");\n this.canvas = document.createElement(\"canvas\");\n Object.assign(this.canvas.style, {\n position: \"absolute\",\n display: \"block\",\n top: \"0\",\n left: \"0\",\n bottom: \"0\",\n right: \"0\",\n width: \"100%\",\n height: \"100%\"\n });\n let body = document.body;\n body.insertBefore(this.canvas, body.firstChild);\n }\n this.dom = this.canvas;\n this.context = this.canvas.getContext(\"2d\");\n this.devicePixelRatio = window.devicePixelRatio || 1;\n this.backingStoreRatio = this.context.webkitBackingStorePixelRatio || this.context.mozBackingStorePixelRatio || this.context.msBackingStorePixelRatio || this.context.oBackingStorePixelRatio || this.context.backingStorePixelRatio || 1;\n this.pixelRatio = this.devicePixelRatio / this.backingStoreRatio;\n this.mounted = true;\n _stages.push(this);\n this.requestFrame(this.onFrame);\n });\n __publicField(this, \"frameRequested\", false);\n __publicField(this, \"requestFrame\", () => {\n if (!this.frameRequested) {\n this.frameRequested = true;\n requestAnimationFrame(this.onFrame);\n }\n });\n __publicField(this, \"lastTime\", 0);\n __publicField(this, \"_mo_touch\", null);\n // monitor touch\n __publicField(this, \"onFrame\", (now) => {\n this.frameRequested = false;\n if (!this.mounted) {\n return;\n }\n this.requestFrame();\n const newPixelWidth = this.canvas.clientWidth;\n const newPixelHeight = this.canvas.clientHeight;\n if (this.pixelWidth !== newPixelWidth || this.pixelHeight !== newPixelHeight) {\n this.pixelWidth = newPixelWidth;\n this.pixelHeight = newPixelHeight;\n this.drawingWidth = newPixelWidth * this.pixelRatio;\n this.drawingHeight = newPixelHeight * this.pixelRatio;\n if (this.canvas.width !== this.drawingWidth || this.canvas.height !== this.drawingHeight) {\n this.canvas.width = this.drawingWidth;\n this.canvas.height = this.drawingHeight;\n console.log(\"Resize: [\" + this.drawingWidth + \", \" + this.drawingHeight + \"] = \" + this.pixelRatio + \" x [\" + this.pixelWidth + \", \" + this.pixelHeight + \"]\");\n this.viewport({\n width: this.drawingWidth,\n height: this.drawingHeight,\n ratio: this.pixelRatio\n });\n }\n }\n let last = this.lastTime || now;\n let elapsed = now - last;\n if (!this.mounted || this.paused || this.sleep) {\n return;\n }\n this.lastTime = now;\n let tickRequest = this._tick(elapsed, now, last);\n if (this._mo_touch != this._ts_touch) {\n this._mo_touch = this._ts_touch;\n this.sleep = false;\n if (this.drawingWidth > 0 && this.drawingHeight > 0) {\n this.context.setTransform(1, 0, 0, 1, 0, 0);\n this.context.clearRect(0, 0, this.drawingWidth, this.drawingHeight);\n this.render(this.context);\n }\n } else if (tickRequest) {\n this.sleep = false;\n } else {\n this.sleep = true;\n }\n stats.fps = elapsed ? 1e3 / elapsed : 0;\n });\n this.label(\"Root\");\n }\n resume() {\n if (this.sleep || this.paused) {\n this.requestFrame();\n }\n this.paused = false;\n this.sleep = false;\n this.publish(\"resume\");\n return this;\n }\n pause() {\n if (!this.paused) {\n this.publish(\"pause\");\n }\n this.paused = true;\n return this;\n }\n touch() {\n if (this.sleep || this.paused) {\n this.requestFrame();\n }\n this.sleep = false;\n return Node.prototype.touch();\n }\n unmount() {\n var _a;\n this.mounted = false;\n let index = _stages.indexOf(this);\n if (index >= 0) {\n _stages.splice(index, 1);\n }\n (_a = this.mouse) == null ? void 0 : _a.unmount();\n return this;\n }\n background(color) {\n this.dom.style.backgroundColor = color;\n return this;\n }\n /**\n * Set/Get viewport.\n * This is used along with viewbox to determine the scale and position of the viewbox within the viewport.\n * Viewport is the size of the container, for example size of the canvas element.\n * Viewbox is provided by the user, and is the ideal size of the content.\n */\n viewport(width, height, ratio) {\n if (typeof width === \"undefined\") {\n return Object.assign({}, this._viewport);\n }\n if (typeof width === \"object\") {\n const options = width;\n width = options.width;\n height = options.height;\n ratio = options.ratio;\n }\n this._viewport = {\n width,\n height,\n ratio: ratio || 1\n };\n this.viewbox();\n let data = Object.assign({}, this._viewport);\n this.visit({\n start: function(node) {\n if (!node._flag(\"viewport\")) {\n return true;\n }\n node.publish(\"viewport\", [data]);\n }\n });\n return this;\n }\n /**\n * Set viewbox.\n * \n * @param {mode} string - One of: 'in-pad' (like css object-fit: 'contain'), 'in', 'out-crop' (like css object-fit: 'cover'), 'out'\n */\n // TODO: static/fixed viewbox\n // TODO: use css object-fit values\n viewbox(width, height, mode) {\n if (typeof width === \"number\" && typeof height === \"number\") {\n this._viewbox = {\n width,\n height,\n mode\n };\n } else if (typeof width === \"object\" && width !== null) {\n this._viewbox = {\n ...width\n };\n }\n this.rescale();\n return this;\n }\n camera(matrix) {\n this._camera = matrix;\n this.rescale();\n return this;\n }\n rescale() {\n let viewbox = this._viewbox;\n let viewport = this._viewport;\n let camera = this._camera;\n if (viewport && viewbox) {\n const viewportWidth = viewport.width;\n const viewportHeight = viewport.height;\n const viewboxMode = /^(in|out|in-pad|out-crop)$/.test(viewbox.mode) ? viewbox.mode : \"in-pad\";\n const viewboxWidth = viewbox.width;\n const viewboxHeight = viewbox.height;\n this.pin({\n width: viewboxWidth,\n height: viewboxHeight\n });\n this.scaleTo(viewportWidth, viewportHeight, viewboxMode);\n const viewboxX = viewbox.x || 0;\n const viewboxY = viewbox.y || 0;\n const cameraZoom = (camera == null ? void 0 : camera.a) || 1;\n const cameraX = (camera == null ? void 0 : camera.e) || 0;\n const cameraY = (camera == null ? void 0 : camera.f) || 0;\n const scaleX = this.pin(\"scaleX\");\n const scaleY = this.pin(\"scaleY\");\n this.pin(\"scaleX\", scaleX * cameraZoom);\n this.pin(\"scaleY\", scaleY * cameraZoom);\n this.pin(\"offsetX\", cameraX - viewboxX * scaleX * cameraZoom);\n this.pin(\"offsetY\", cameraY - viewboxY * scaleY * cameraZoom);\n } else if (viewport) {\n this.pin({\n width: viewport.width,\n height: viewport.height\n });\n }\n return this;\n }\n}\nconst sprite = function(frame) {\n var sprite2 = new Sprite();\n frame && sprite2.texture(frame);\n return sprite2;\n};\nSprite._super = Node;\nSprite.prototype = Object.create(Sprite._super.prototype);\nfunction Sprite() {\n Sprite._super.call(this);\n this.label(\"Sprite\");\n this._textures = [];\n this._image = null;\n}\nSprite.prototype.texture = function(frame) {\n this._image = texture(frame).one();\n this.pin(\"width\", this._image ? this._image.width : 0);\n this.pin(\"height\", this._image ? this._image.height : 0);\n this._textures[0] = this._image.pipe();\n this._textures.length = 1;\n return this;\n};\nSprite.prototype.tile = function(inner) {\n this._repeat(false, inner);\n return this;\n};\nSprite.prototype.stretch = function(inner) {\n this._repeat(true, inner);\n return this;\n};\nSprite.prototype._repeat = function(stretch, inner) {\n var self = this;\n this.untick(this._repeatTicker);\n this.tick(this._repeatTicker = function() {\n if (this._mo_stretch == this._pin._ts_transform) {\n return;\n }\n this._mo_stretch = this._pin._ts_transform;\n var width = this.pin(\"width\");\n var height = this.pin(\"height\");\n this._textures.length = repeat(this._image, width, height, stretch, inner, insert);\n });\n function insert(i, sx, sy, sw, sh, dx, dy, dw, dh) {\n var repeat2 = self._textures.length > i ? self._textures[i] : self._textures[i] = self._image.pipe();\n repeat2.src(sx, sy, sw, sh);\n repeat2.dest(dx, dy, dw, dh);\n }\n};\nfunction repeat(img, owidth, oheight, stretch, inner, insert) {\n var width = img.width;\n var height = img.height;\n var left = img.left;\n var right = img.right;\n var top = img.top;\n var bottom = img.bottom;\n left = typeof left === \"number\" && left === left ? left : 0;\n right = typeof right === \"number\" && right === right ? right : 0;\n top = typeof top === \"number\" && top === top ? top : 0;\n bottom = typeof bottom === \"number\" && bottom === bottom ? bottom : 0;\n width = width - left - right;\n height = height - top - bottom;\n if (!inner) {\n owidth = Math.max(owidth - left - right, 0);\n oheight = Math.max(oheight - top - bottom, 0);\n }\n var i = 0;\n if (top > 0 && left > 0)\n insert(i++, 0, 0, left, top, 0, 0, left, top);\n if (bottom > 0 && left > 0)\n insert(i++, 0, height + top, left, bottom, 0, oheight + top, left, bottom);\n if (top > 0 && right > 0)\n insert(i++, width + left, 0, right, top, owidth + left, 0, right, top);\n if (bottom > 0 && right > 0)\n insert(\n i++,\n width + left,\n height + top,\n right,\n bottom,\n owidth + left,\n oheight + top,\n right,\n bottom\n );\n if (stretch) {\n if (top > 0)\n insert(i++, left, 0, width, top, left, 0, owidth, top);\n if (bottom > 0)\n insert(\n i++,\n left,\n height + top,\n width,\n bottom,\n left,\n oheight + top,\n owidth,\n bottom\n );\n if (left > 0)\n insert(i++, 0, top, left, height, 0, top, left, oheight);\n if (right > 0)\n insert(\n i++,\n width + left,\n top,\n right,\n height,\n owidth + left,\n top,\n right,\n oheight\n );\n insert(i++, left, top, width, height, left, top, owidth, oheight);\n } else {\n var l = left, r = owidth, w;\n while (r > 0) {\n w = Math.min(width, r), r -= width;\n var t = top, b = oheight, h;\n while (b > 0) {\n h = Math.min(height, b), b -= height;\n insert(i++, left, top, w, h, l, t, w, h);\n if (r <= 0) {\n if (left)\n insert(i++, 0, top, left, h, 0, t, left, h);\n if (right)\n insert(i++, width + left, top, right, h, l + w, t, right, h);\n }\n t += h;\n }\n if (top)\n insert(i++, left, 0, w, top, l, 0, w, top);\n if (bottom)\n insert(i++, left, height + top, w, bottom, l, t, w, bottom);\n l += w;\n }\n }\n return i;\n}\nSprite.prototype.image = Sprite.prototype.texture;\nconst image = sprite;\nconst Image$1 = Sprite;\nconst anim = function(frames, fps) {\n var anim2 = new Anim();\n anim2.frames(frames).gotoFrame(0);\n fps && anim2.fps(fps);\n return anim2;\n};\nAnim._super = Node;\nAnim.prototype = Object.create(Anim._super.prototype);\nconst FPS = 15;\nfunction Anim() {\n Anim._super.call(this);\n this.label(\"Anim\");\n this._textures = [];\n this._fps = FPS;\n this._ft = 1e3 / this._fps;\n this._time = -1;\n this._repeat = 0;\n this._index = 0;\n this._frames = [];\n var lastTime = 0;\n this.tick(function(t, now, last) {\n if (this._time < 0 || this._frames.length <= 1) {\n return;\n }\n var ignore = lastTime != last;\n lastTime = now;\n if (ignore) {\n return true;\n }\n this._time += t;\n if (this._time < this._ft) {\n return true;\n }\n var n = this._time / this._ft | 0;\n this._time -= n * this._ft;\n this.moveFrame(n);\n if (this._repeat > 0 && (this._repeat -= n) <= 0) {\n this.stop();\n this._callback && this._callback();\n return false;\n }\n return true;\n }, false);\n}\nAnim.prototype.fps = function(fps) {\n if (typeof fps === \"undefined\") {\n return this._fps;\n }\n this._fps = fps > 0 ? fps : FPS;\n this._ft = 1e3 / this._fps;\n return this;\n};\nAnim.prototype.setFrames = function(a, b, c) {\n return this.frames(a, b, c);\n};\nAnim.prototype.frames = function(frames) {\n this._index = 0;\n this._frames = texture(frames).array();\n this.touch();\n return this;\n};\nAnim.prototype.length = function() {\n return this._frames ? this._frames.length : 0;\n};\nAnim.prototype.gotoFrame = function(frame, resize) {\n this._index = math.wrap(frame, this._frames.length) | 0;\n resize = resize || !this._textures[0];\n this._textures[0] = this._frames[this._index];\n if (resize) {\n this.pin(\"width\", this._textures[0].width);\n this.pin(\"height\", this._textures[0].height);\n }\n this.touch();\n return this;\n};\nAnim.prototype.moveFrame = function(move) {\n return this.gotoFrame(this._index + move);\n};\nAnim.prototype.repeat = function(repeat2, callback) {\n this._repeat = repeat2 * this._frames.length - 1;\n this._callback = callback;\n this.play();\n return this;\n};\nAnim.prototype.play = function(frame) {\n if (typeof frame !== \"undefined\") {\n this.gotoFrame(frame);\n this._time = 0;\n } else if (this._time < 0) {\n this._time = 0;\n }\n this.touch();\n return this;\n};\nAnim.prototype.stop = function(frame) {\n this._time = -1;\n if (typeof frame !== \"undefined\") {\n this.gotoFrame(frame);\n }\n return this;\n};\nconst string$1 = function(frames) {\n return new Str().frames(frames);\n};\nStr._super = Node;\nStr.prototype = Object.create(Str._super.prototype);\nfunction Str() {\n Str._super.call(this);\n this.label(\"String\");\n this._textures = [];\n}\nStr.prototype.setFont = function(a, b, c) {\n return this.frames(a, b, c);\n};\nStr.prototype.frames = function(frames) {\n this._textures = [];\n if (typeof frames == \"string\") {\n frames = texture(frames);\n this._item = function(value) {\n return frames.one(value);\n };\n } else if (typeof frames === \"object\") {\n this._item = function(value) {\n return frames[value];\n };\n } else if (typeof frames === \"function\") {\n this._item = frames;\n }\n return this;\n};\nStr.prototype.setValue = function(a, b, c) {\n return this.value(a, b, c);\n};\nStr.prototype.value = function(value) {\n if (typeof value === \"undefined\") {\n return this._value;\n }\n if (this._value === value) {\n return this;\n }\n this._value = value;\n if (value === null) {\n value = \"\";\n } else if (typeof value !== \"string\" && !Array.isArray(value)) {\n value = value.toString();\n }\n this._spacing = this._spacing || 0;\n var width = 0, height = 0;\n for (var i = 0; i < value.length; i++) {\n var texture2 = this._textures[i] = this._item(value[i]);\n width += i > 0 ? this._spacing : 0;\n texture2.dest(width, 0);\n width = width + texture2.width;\n height = Math.max(height, texture2.height);\n }\n this.pin(\"width\", width);\n this.pin(\"height\", height);\n this._textures.length = value.length;\n return this;\n};\nconst row = function(align) {\n return create().row(align).label(\"Row\");\n};\nNode.prototype.row = function(align) {\n this.align(\"row\", align);\n return this;\n};\nconst column = function(align) {\n return create().column(align).label(\"Row\");\n};\nNode.prototype.column = function(align) {\n this.align(\"column\", align);\n return this;\n};\nNode.prototype.align = function(type, align) {\n this._padding = this._padding || 0;\n this._spacing = this._spacing || 0;\n this.untick(this._layoutTiker);\n this.tick(this._layoutTiker = function() {\n if (this._mo_seq == this._ts_touch) {\n return;\n }\n this._mo_seq = this._ts_touch;\n var alignChildren = this._mo_seqAlign != this._ts_children;\n this._mo_seqAlign = this._ts_children;\n var width = 0, height = 0;\n var child, next = this.first(true);\n var first = true;\n while (child = next) {\n next = child.next(true);\n child.matrix(true);\n var w = child.pin(\"boxWidth\");\n var h = child.pin(\"boxHeight\");\n if (type == \"column\") {\n !first && (height += this._spacing);\n child.pin(\"offsetY\") != height && child.pin(\"offsetY\", height);\n width = Math.max(width, w);\n height = height + h;\n alignChildren && child.pin(\"alignX\", align);\n } else if (type == \"row\") {\n !first && (width += this._spacing);\n child.pin(\"offsetX\") != width && child.pin(\"offsetX\", width);\n width = width + w;\n height = Math.max(height, h);\n alignChildren && child.pin(\"alignY\", align);\n }\n first = false;\n }\n width += 2 * this._padding;\n height += 2 * this._padding;\n this.pin(\"width\") != width && this.pin(\"width\", width);\n this.pin(\"height\") != height && this.pin(\"height\", height);\n });\n return this;\n};\nconst box = function() {\n return create().box().label(\"Box\");\n};\nNode.prototype.box = function() {\n this._padding = this._padding || 0;\n this.untick(this._layoutTiker);\n this.tick(this._layoutTiker = function() {\n if (this._mo_box == this._ts_touch) {\n return;\n }\n this._mo_box = this._ts_touch;\n var width = 0, height = 0;\n var child, next = this.first(true);\n while (child = next) {\n next = child.next(true);\n child.matrix(true);\n var w = child.pin(\"boxWidth\");\n var h = child.pin(\"boxHeight\");\n width = Math.max(width, w);\n height = Math.max(height, h);\n }\n width += 2 * this._padding;\n height += 2 * this._padding;\n this.pin(\"width\") != width && this.pin(\"width\", width);\n this.pin(\"height\") != height && this.pin(\"height\", height);\n });\n return this;\n};\nconst layer = function() {\n return create().layer().label(\"Layer\");\n};\nNode.prototype.layer = function() {\n this.untick(this._layoutTiker);\n this.tick(this._layoutTiker = function() {\n var parent = this.parent();\n if (parent) {\n var width = parent.pin(\"width\");\n if (this.pin(\"width\") != width) {\n this.pin(\"width\", width);\n }\n var height = parent.pin(\"height\");\n if (this.pin(\"height\") != height) {\n this.pin(\"height\", height);\n }\n }\n }, true);\n return this;\n};\nNode.prototype.padding = function(pad) {\n this._padding = pad;\n return this;\n};\nNode.prototype.spacing = function(space) {\n this._spacing = space;\n return this;\n};\nconst Stage$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n Anim,\n Atlas,\n Image: Image$1,\n Math: math,\n Matrix,\n Mouse,\n Node,\n Pin,\n Root,\n Sprite,\n Str,\n Texture,\n Tween,\n anim,\n atlas,\n box,\n canvas,\n column,\n create,\n image,\n layer,\n math,\n memoizeDraw,\n mount,\n pause,\n resume,\n row,\n sprite,\n string: string$1,\n texture\n}, Symbol.toStringTag, { value: \"Module\" }));\nexport {\n Anim,\n Atlas,\n Image$1 as Image,\n math as Math,\n Matrix,\n Mouse,\n Node,\n Pin,\n Root,\n Sprite,\n Str,\n Texture,\n Tween,\n anim,\n atlas,\n box,\n canvas,\n column,\n create,\n Stage$1 as default,\n image,\n layer,\n math,\n memoizeDraw,\n mount,\n pause,\n resume,\n row,\n sprite,\n string$1 as string,\n texture\n};\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","export const options = function(input: T, defaults: object): T {\n if (input === null || typeof input === 'undefined') {\n // tslint:disable-next-line:no-object-literal-type-assertion\n input = {} as T;\n }\n\n const output = {...input};\n\n // tslint:disable-next-line:no-for-in\n for (const key in defaults) {\n if (defaults.hasOwnProperty(key) && typeof input[key] === 'undefined') {\n output[key] = defaults[key];\n }\n }\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n const symbols = Object.getOwnPropertySymbols(defaults);\n for (let i = 0; i < symbols.length; i++) {\n const symbol = symbols[i];\n if (defaults.propertyIsEnumerable(symbol) && typeof input[symbol] === 'undefined') {\n output[symbol] = defaults[symbol];\n }\n }\n }\n\n return output;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\nexport const math = Object.assign(Object.create(Math) as typeof Math, {\n EPSILON: 1e-9, // TODO\n\n /**\n * This function is used to ensure that a floating point number is not a NaN or\n * infinity.\n */\n isFinite: function(x: unknown): boolean {\n return (typeof x === 'number') && isFinite(x) && !isNaN(x);\n },\n\n assert: function(x: any): void {\n _ASSERT && console.assert(!math.isFinite(x), 'Invalid Number!', x);\n },\n\n /**\n * Next Largest Power of 2 Given a binary integer value x, the next largest\n * power of 2 can be computed by a SWAR algorithm that recursively \"folds\" the\n * upper bits into the lower bits. This process yields a bit vector with the\n * same most significant 1 as x, but all 1's below it. Adding 1 to that value\n * yields the next largest power of 2. For a 32-bit value:\n */\n nextPowerOfTwo: function(x: number): number {\n // TODO\n x |= (x >> 1);\n x |= (x >> 2);\n x |= (x >> 4);\n x |= (x >> 8);\n x |= (x >> 16);\n return x + 1;\n },\n\n isPowerOfTwo: function(x: number): boolean {\n return x > 0 && (x & (x - 1)) === 0;\n },\n\n mod: function(num: number, min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n if (max > min) {\n num = (num - min) % (max - min);\n return num + (num < 0 ? max : min);\n } else {\n num = (num - max) % (min - max);\n return num + (num <= 0 ? min : max);\n }\n },\n /**\n * Returns a min if num is less than min, and max if more than max, otherwise returns num.\n */\n clamp: function(num: number, min: number, max: number): number {\n if (num < min) {\n return min;\n } else if (num > max) {\n return max;\n } else {\n return num;\n }\n },\n /**\n * Returns a random number between min and max when two arguments are provided.\n * If one arg is provided between 0 to max.\n * If one arg is passed between 0 to 1.\n */\n random: function(min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n return min === max ? min : Math.random() * (max - min) + min;\n }\n});\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport interface Vec2Value {\n x: number;\n y: number;\n}\n\nexport class Vec2 {\n x: number;\n y: number;\n\n constructor(x: number, y: number);\n constructor(obj: { x: number, y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Vec2)) {\n return new Vec2(x, y);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n } else {\n this.x = x;\n this.y = y;\n }\n _ASSERT && Vec2.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = data.x;\n obj.y = data.y;\n return obj;\n }\n\n static zero(): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = 0;\n obj.y = 0;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = x;\n obj.y = y;\n return obj;\n }\n\n static clone(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(v.x, v.y);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Vec2.isValid(o), 'Invalid Vec2!', o);\n }\n\n clone(): Vec2 {\n return Vec2.clone(this);\n }\n\n /**\n * Set this vector to all zeros.\n *\n * @returns this\n */\n setZero(): Vec2 {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n set(x: number, y: number): Vec2;\n set(value: Vec2Value): Vec2;\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n // tslint:disable-next-line:typedef\n set(x, y?) {\n if (typeof x === 'object') {\n _ASSERT && Vec2.assert(x);\n this.x = x.x;\n this.y = x.y;\n } else {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n }\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setNum(x: number, y: number) {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setVec2(value: Vec2Value) {\n _ASSERT && Vec2.assert(value);\n this.x = value.x;\n this.y = value.y;\n\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use setCombine or setMul\n */\n wSet(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.setCombine(a, v, b, w);\n } else {\n return this.setMul(a, v);\n }\n }\n\n /**\n * Set linear combination of v and w: `a * v + b * w`\n */\n setCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x = x;\n this.y = y;\n return this;\n }\n\n setMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Add a vector to this vector.\n *\n * @returns this\n */\n add(w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x += w.x;\n this.y += w.y;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use addCombine or addMul\n */\n wAdd(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.addCombine(a, v, b, w);\n } else {\n return this.addMul(a, v);\n }\n }\n\n /**\n * Add linear combination of v and w: `a * v + b * w`\n */\n addCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x += x;\n this.y += y;\n return this;\n }\n\n addMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x += x;\n this.y += y;\n return this;\n }\n\n /**\n * @deprecated Use subCombine or subMul\n */\n wSub(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.subCombine(a, v, b, w);\n } else {\n return this.subMul(a, v);\n }}\n\n /**\n * Subtract linear combination of v and w: `a * v + b * w`\n */\n subCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n subMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n /**\n * Subtract a vector from this vector\n *\n * @returns this\n */\n sub(w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x -= w.x;\n this.y -= w.y;\n return this;\n }\n\n /**\n * Multiply this vector by a scalar.\n *\n * @returns this\n */\n mul(m: number): Vec2 {\n _ASSERT && Math.assert(m);\n this.x *= m;\n this.y *= m;\n return this;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n length(): number {\n return Vec2.lengthOf(this);\n }\n\n /**\n * Get the length squared.\n */\n lengthSquared(): number {\n return Vec2.lengthSquared(this);\n }\n\n /**\n * Convert this vector into a unit vector.\n *\n * @returns old length\n */\n normalize(): number {\n const length = this.length();\n if (length < Math.EPSILON) {\n return 0.0;\n }\n const invLength = 1.0 / length;\n this.x *= invLength;\n this.y *= invLength;\n return length;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n static lengthOf(v: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n return Math.sqrt(v.x * v.x + v.y * v.y);\n }\n\n /**\n * Get the length squared.\n */\n static lengthSquared(v: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n return v.x * v.x + v.y * v.y;\n }\n\n static distance(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n static distanceSquared(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return dx * dx + dy * dy;\n }\n\n static areEqual(v: Vec2Value, w: Vec2Value): boolean {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v === w || typeof w === 'object' && w !== null && v.x === w.x && v.y === w.y;\n }\n\n /**\n * Get the skew vector such that dot(skew_vec, other) == cross(vec, other)\n */\n static skew(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.y, v.x);\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.x + v.y * w.y;\n }\n\n static cross(v: Vec2Value, w: Vec2Value): number;\n static cross(v: Vec2Value, w: number): Vec2;\n static cross(v: number, w: Vec2Value): Vec2;\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n *\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n // tslint:disable-next-line:typedef\n static cross(v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n\n } else {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static crossVec2Vec2(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossVec2Num(v: Vec2Value, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossNumVec2(v: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n }\n\n static addCross(a: Vec2Value, v: Vec2Value, w: number): Vec2;\n static addCross(a: Vec2Value, v: number, w: Vec2Value): Vec2;\n /**\n * Returns `a + (v x w)`\n */\n // tslint:disable-next-line:typedef\n static addCross(a, v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n _ASSERT && console.assert(false);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossVec2Num(a: Vec2Value, v: Vec2Value, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossNumVec2(a: Vec2Value, v: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n static add(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x + w.x, v.y + w.y);\n }\n\n /** @internal @deprecated */\n static wAdd(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return Vec2.combine(a, v, b, w);\n } else {\n return Vec2.mulNumVec2(a, v);\n }\n }\n\n static combine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n return Vec2.zero().setCombine(a, v, b, w);\n }\n\n static sub(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x - w.x, v.y - w.y);\n }\n\n static mul(a: Vec2Value, b: number): Vec2;\n static mul(a: number, b: Vec2Value): Vec2;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (typeof a === 'object') {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n\n } else if (typeof b === 'object') {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n }\n\n static mulVec2Num(a: Vec2Value, b: number): Vec2 {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n }\n\n static mulNumVec2(a: number, b: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n\n neg(): Vec2 {\n this.x = -this.x;\n this.y = -this.y;\n return this;\n }\n\n static neg(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.x, -v.y);\n }\n\n static abs(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Math.abs(v.x), Math.abs(v.y));\n }\n\n static mid(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo((v.x + w.x) * 0.5, (v.y + w.y) * 0.5);\n }\n\n static upper(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.max(v.x, w.x), Math.max(v.y, w.y));\n }\n\n static lower(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.min(v.x, w.x), Math.min(v.y, w.y));\n }\n\n clamp(max: number): Vec2 {\n const lengthSqr = this.x * this.x + this.y * this.y;\n if (lengthSqr > max * max) {\n const scale = max / Math.sqrt(lengthSqr);\n this.x *= scale;\n this.y *= scale;\n }\n return this;\n }\n\n static clamp(v: Vec2Value, max: number): Vec2 {\n const r = Vec2.neo(v.x, v.y);\n r.clamp(max);\n return r;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static scaleFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x * x, v.y * y);\n };\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static translateFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x + x, v.y + y);\n };\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../common/Math';\nimport { Vec2, Vec2Value } from '../common/Vec2';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n */\nexport interface RayCastInput {\n p1: Vec2;\n p2: Vec2;\n maxFraction: number;\n}\n\nexport type RayCastCallback = (subInput: RayCastInput, id: number) => number;\n\n/**\n * Ray-cast output data. The ray hits at `p1 + fraction * (p2 - p1)`,\n * where `p1` and `p2` come from RayCastInput.\n */\nexport interface RayCastOutput {\n normal: Vec2;\n fraction: number;\n}\n\nexport class AABB {\n lowerBound: Vec2;\n upperBound: Vec2;\n\n constructor(lower?: Vec2Value, upper?: Vec2Value) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof AABB)) {\n return new AABB(lower, upper);\n }\n\n this.lowerBound = Vec2.zero();\n this.upperBound = Vec2.zero();\n\n if (typeof lower === 'object') {\n this.lowerBound.setVec2(lower);\n }\n if (typeof upper === 'object') {\n this.upperBound.setVec2(upper);\n } else if (typeof lower === 'object') {\n this.upperBound.setVec2(lower);\n }\n }\n\n /**\n * Verify that the bounds are sorted.\n */\n isValid(): boolean {\n return AABB.isValid(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.lowerBound) && Vec2.isValid(obj.upperBound) && Vec2.sub(obj.upperBound, obj.lowerBound).lengthSquared() >= 0;\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!AABB.isValid(o), 'Invalid AABB!', o);\n }\n\n /**\n * Get the center of the AABB.\n */\n getCenter(): Vec2 {\n return Vec2.neo((this.lowerBound.x + this.upperBound.x) * 0.5, (this.lowerBound.y + this.upperBound.y) * 0.5);\n }\n\n /**\n * Get the extents of the AABB (half-widths).\n */\n getExtents(): Vec2 {\n return Vec2.neo((this.upperBound.x - this.lowerBound.x) * 0.5, (this.upperBound.y - this.lowerBound.y) * 0.5);\n }\n\n /**\n * Get the perimeter length.\n */\n getPerimeter(): number {\n return 2.0 * (this.upperBound.x - this.lowerBound.x + this.upperBound.y - this.lowerBound.y);\n }\n\n /**\n * Combine one or two AABB into this one.\n */\n combine(a: AABB, b?: AABB): void {\n b = b || this;\n\n const lowerA = a.lowerBound;\n const upperA = a.upperBound;\n const lowerB = b.lowerBound;\n const upperB = b.upperBound;\n\n const lowerX = Math.min(lowerA.x, lowerB.x);\n const lowerY = Math.min(lowerA.y, lowerB.y);\n const upperX = Math.max(upperB.x, upperA.x);\n const upperY = Math.max(upperB.y, upperA.y);\n\n this.lowerBound.setNum(lowerX, lowerY);\n this.upperBound.setNum(upperX, upperY);\n }\n\n combinePoints(a: Vec2Value, b: Vec2Value): void {\n this.lowerBound.setNum(Math.min(a.x, b.x), Math.min(a.y, b.y));\n this.upperBound.setNum(Math.max(a.x, b.x), Math.max(a.y, b.y));\n }\n\n set(aabb: AABB): void {\n this.lowerBound.setNum(aabb.lowerBound.x, aabb.lowerBound.y);\n this.upperBound.setNum(aabb.upperBound.x, aabb.upperBound.y);\n }\n\n contains(aabb: AABB): boolean {\n let result = true;\n result = result && this.lowerBound.x <= aabb.lowerBound.x;\n result = result && this.lowerBound.y <= aabb.lowerBound.y;\n result = result && aabb.upperBound.x <= this.upperBound.x;\n result = result && aabb.upperBound.y <= this.upperBound.y;\n return result;\n }\n\n extend(value: number): AABB {\n AABB.extend(this, value);\n return this;\n }\n\n static extend(aabb: AABB, value: number): void {\n aabb.lowerBound.x -= value;\n aabb.lowerBound.y -= value;\n aabb.upperBound.x += value;\n aabb.upperBound.y += value;\n }\n\n static testOverlap(a: AABB, b: AABB): boolean {\n const d1x = b.lowerBound.x - a.upperBound.x;\n const d2x = a.lowerBound.x - b.upperBound.x;\n\n const d1y = b.lowerBound.y - a.upperBound.y;\n const d2y = a.lowerBound.y - b.upperBound.y;\n\n if (d1x > 0 || d1y > 0 || d2x > 0 || d2y > 0) {\n return false;\n }\n return true;\n }\n\n static areEqual(a: AABB, b: AABB): boolean {\n return Vec2.areEqual(a.lowerBound, b.lowerBound) && Vec2.areEqual(a.upperBound, b.upperBound);\n }\n\n static diff(a: AABB, b: AABB): number {\n const wD = Math.max(0, Math.min(a.upperBound.x, b.upperBound.x) - Math.max(b.lowerBound.x, a.lowerBound.x));\n const hD = Math.max(0, Math.min(a.upperBound.y, b.upperBound.y) - Math.max(b.lowerBound.y, a.lowerBound.y));\n\n const wA = a.upperBound.x - a.lowerBound.x;\n const hA = a.upperBound.y - a.lowerBound.y;\n\n const wB = b.upperBound.x - b.lowerBound.x;\n const hB = b.upperBound.y - b.lowerBound.y;\n\n return wA * hA + wB * hB - wD * hD;\n }\n\n rayCast(output: RayCastOutput, input: RayCastInput): boolean {\n // From Real-time Collision Detection, p179.\n\n let tmin = -Infinity;\n let tmax = Infinity;\n\n const p = input.p1;\n const d = Vec2.sub(input.p2, input.p1);\n const absD = Vec2.abs(d);\n\n const normal = Vec2.zero();\n\n for (let f: 'x' | 'y' = 'x'; f !== null; f = (f === 'x' ? 'y' : null)) {\n if (absD.x < Math.EPSILON) {\n // Parallel.\n if (p[f] < this.lowerBound[f] || this.upperBound[f] < p[f]) {\n return false;\n }\n } else {\n const inv_d = 1.0 / d[f];\n let t1 = (this.lowerBound[f] - p[f]) * inv_d;\n let t2 = (this.upperBound[f] - p[f]) * inv_d;\n\n // Sign of the normal vector.\n let s = -1.0;\n\n if (t1 > t2) {\n const temp = t1;\n t1 = t2;\n t2 = temp;\n s = 1.0;\n }\n\n // Push the min up\n if (t1 > tmin) {\n normal.setZero();\n normal[f] = s;\n tmin = t1;\n }\n\n // Pull the max down\n tmax = Math.min(tmax, t2);\n\n if (tmin > tmax) {\n return false;\n }\n }\n }\n\n // Does the ray start inside the box?\n // Does the ray intersect beyond the max fraction?\n if (tmin < 0.0 || input.maxFraction < tmin) {\n return false;\n }\n\n // Intersection.\n output.fraction = tmin;\n output.normal = normal;\n return true;\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n// TODO merge with World options?\n\n/**\n * Tuning constants based on meters-kilograms-seconds (MKS) units.\n */\n// tslint:disable-next-line:no-unnecessary-class\nexport class Settings {\n // Collision\n /**\n * The maximum number of contact points between two convex shapes. Do not change\n * this value.\n */\n static maxManifoldPoints: number = 2;\n\n /**\n * The maximum number of vertices on a convex polygon. You cannot increase this\n * too much because BlockAllocator has a maximum object size.\n */\n static maxPolygonVertices: number = 12;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This allows proxies to move\n * by a small amount without triggering a tree adjustment. This is in meters.\n */\n static aabbExtension: number = 0.1;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This is used to predict the\n * future position based on the current displacement. This is a dimensionless\n * multiplier.\n */\n static aabbMultiplier: number = 2.0;\n\n /**\n * A small length used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static linearSlop: number = 0.005;\n static get linearSlopSquared(): number { return Settings.linearSlop * Settings.linearSlop; }\n\n /**\n * A small angle used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static angularSlop: number = (2.0 / 180.0 * Math.PI);\n\n /**\n * The radius of the polygon/edge shape skin. This should not be modified.\n * Making this smaller means polygons will have an insufficient buffer for\n * continuous collision. Making it larger may create artifacts for vertex\n * collision.\n */\n static get polygonRadius(): number { return 2.0 * Settings.linearSlop; }\n\n /**\n * Maximum number of sub-steps per contact in continuous physics simulation.\n */\n static maxSubSteps: number = 8;\n\n// Dynamics\n\n /**\n * Maximum number of contacts to be handled to solve a TOI impact.\n */\n static maxTOIContacts: number = 32;\n\n /**\n * Maximum iterations to solve a TOI.\n */\n static maxTOIIterations: number = 20;\n\n /**\n * Maximum iterations to find Distance.\n */\n static maxDistnceIterations: number = 20;\n\n /**\n * A velocity threshold for elastic collisions. Any collision with a relative\n * linear velocity below this threshold will be treated as inelastic.\n */\n static velocityThreshold: number = 1.0;\n\n /**\n * The maximum linear position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxLinearCorrection: number = 0.2;\n\n /**\n * The maximum angular position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxAngularCorrection: number = (8.0 / 180.0 * Math.PI);\n\n /**\n * The maximum linear velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxTranslation: number = 2.0;\n static get maxTranslationSquared(): number { return Settings.maxTranslation * Settings.maxTranslation; }\n\n /**\n * The maximum angular velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxRotation: number = (0.5 * Math.PI);\n static get maxRotationSquared(): number { return Settings.maxRotation * Settings.maxRotation; }\n\n /**\n * This scale factor controls how fast overlap is resolved. Ideally this would\n * be 1 so that overlap is removed in one time step. However using values close\n * to 1 often lead to overshoot.\n */\n static baumgarte: number = 0.2;\n static toiBaugarte: number = 0.75;\n\n // Sleep\n\n /**\n * The time that a body must be still before it will go to sleep.\n */\n static timeToSleep: number = 0.5;\n\n /**\n * A body cannot sleep if its linear velocity is above this tolerance.\n */\n static linearSleepTolerance: number = 0.01;\n static get linearSleepToleranceSqr(): number { return Math.pow(Settings.linearSleepTolerance, 2); }\n\n /**\n * A body cannot sleep if its angular velocity is above this tolerance.\n */\n static angularSleepTolerance: number = (2.0 / 180.0 * Math.PI);\n static get angularSleepToleranceSqr(): number { return Math.pow(Settings.angularSleepTolerance, 2); }\n\n}\n","/*\n * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js\n *\n * This software is provided 'as-is', without any express or implied\n * warranty. In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * 1. The origin of this software must not be misrepresented; you must not\n * claim that you wrote the original software. If you use this software\n * in a product, an acknowledgment in the product documentation would be\n * appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n * misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n */\n\nexport class Pool {\n _list: T[] = [];\n _max: number = Infinity;\n\n _createFn: () => T;\n _outFn: (item: T) => void;\n _inFn: (item: T) => void;\n _discardFn: (item: T) => T;\n\n _createCount: number = 0;\n _outCount: number = 0;\n _inCount: number = 0;\n _discardCount: number = 0;\n\n constructor(opts: {\n max?: number,\n create?: () => T,\n allocate?: (item: T) => void,\n release?: (item: T) => void,\n discard?: (item: T) => T,\n }) {\n this._list = [];\n this._max = opts.max || this._max;\n\n this._createFn = opts.create;\n this._outFn = opts.allocate;\n this._inFn = opts.release;\n this._discardFn = opts.discard;\n }\n\n max(n?: number): number | Pool {\n if (typeof n === 'number') {\n this._max = n;\n return this;\n }\n return this._max;\n }\n\n size(): number {\n return this._list.length;\n }\n\n allocate(): T {\n let item: T;\n if (this._list.length > 0) {\n item = this._list.shift();\n } else {\n this._createCount++;\n if (typeof this._createFn === 'function') {\n item = this._createFn();\n } else {\n // tslint:disable-next-line:no-object-literal-type-assertion\n item = {} as T;\n }\n }\n this._outCount++;\n if (typeof this._outFn === 'function') {\n this._outFn(item);\n }\n return item;\n }\n\n release(item: T): void {\n if (this._list.length < this._max) {\n this._inCount++;\n if (typeof this._inFn === 'function') {\n this._inFn(item);\n }\n this._list.push(item);\n } else {\n this._discardCount++;\n if (typeof this._discardFn === 'function') {\n item = this._discardFn(item);\n }\n }\n }\n\n /** @internal */\n toString(): string {\n return \" +\" + this._createCount + \" >\" + this._outCount + \" <\" + this._inCount + \" -\"\n + this._discardCount + \" =\" + this._list.length + \"/\" + this._max;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { Pool } from '../util/Pool';\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { AABB, RayCastCallback, RayCastInput } from './AABB';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport type DynamicTreeQueryCallback = (nodeId: number) => boolean;\n\n/**\n * A node in the dynamic tree. The client does not interact with this directly.\n */\nexport class TreeNode {\n id: number;\n /** Enlarged AABB */\n aabb: AABB = new AABB();\n userData: T = null;\n parent: TreeNode = null;\n child1: TreeNode = null;\n child2: TreeNode = null;\n /** 0: leaf, -1: free node */\n height: number = -1;\n\n constructor(id?: number) {\n this.id = id;\n }\n\n /** @internal */\n toString(): string {\n return this.id + \": \" + this.userData;\n }\n\n isLeaf(): boolean {\n return this.child1 == null;\n }\n}\n\n/**\n * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A\n * dynamic tree arranges data in a binary tree to accelerate queries such as\n * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we\n * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger\n * than the client object. This allows the client object to move by small\n * amounts without triggering a tree update.\n *\n * Nodes are pooled and relocatable, so we use node indices rather than\n * pointers.\n */\nexport class DynamicTree {\n m_root: TreeNode;\n m_lastProxyId: number;\n m_nodes: {\n [id: number]: TreeNode\n };\n m_pool: Pool>;\n\n constructor() {\n this.m_root = null;\n this.m_nodes = {};\n this.m_lastProxyId = 0;\n\n this.m_pool = new Pool>({\n create(): TreeNode {\n return new TreeNode();\n }\n });\n }\n\n /**\n * Get proxy user data.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getUserData(id: number): T {\n const node = this.m_nodes[id];\n _ASSERT && console.assert(!!node);\n return node.userData;\n }\n\n /**\n * Get the fat AABB for a node id.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getFatAABB(id: number): AABB {\n const node = this.m_nodes[id];\n _ASSERT && console.assert(!!node);\n return node.aabb;\n }\n\n allocateNode(): TreeNode {\n const node = this.m_pool.allocate();\n node.id = ++this.m_lastProxyId;\n node.userData = null;\n node.parent = null;\n node.child1 = null;\n node.child2 = null;\n node.height = -1;\n this.m_nodes[node.id] = node;\n return node;\n }\n\n freeNode(node: TreeNode): void {\n this.m_pool.release(node);\n node.height = -1;\n // tslint:disable-next-line:no-dynamic-delete\n delete this.m_nodes[node.id];\n }\n\n /**\n * Create a proxy in the tree as a leaf node. We return the index of the node\n * instead of a pointer so that we can grow the node pool.\n *\n * Create a proxy. Provide a tight fitting AABB and a userData pointer.\n */\n createProxy(aabb: AABB, userData: T): number {\n _ASSERT && console.assert(AABB.isValid(aabb));\n\n const node = this.allocateNode();\n\n node.aabb.set(aabb);\n\n // Fatten the aabb.\n AABB.extend(node.aabb, Settings.aabbExtension);\n\n node.userData = userData;\n node.height = 0;\n\n this.insertLeaf(node);\n\n return node.id;\n }\n\n /**\n * Destroy a proxy. This asserts if the id is invalid.\n */\n destroyProxy(id: number): void {\n const node = this.m_nodes[id];\n\n _ASSERT && console.assert(!!node);\n _ASSERT && console.assert(node.isLeaf());\n\n this.removeLeaf(node);\n this.freeNode(node);\n }\n\n /**\n * Move a proxy with a swepted AABB. If the proxy has moved outside of its\n * fattened AABB, then the proxy is removed from the tree and re-inserted.\n * Otherwise the function returns immediately.\n *\n * @param d Displacement\n *\n * @return true if the proxy was re-inserted.\n */\n moveProxy(id: number, aabb: AABB, d: Vec2): boolean {\n _ASSERT && console.assert(AABB.isValid(aabb));\n _ASSERT && console.assert(!d || Vec2.isValid(d));\n\n const node = this.m_nodes[id];\n\n _ASSERT && console.assert(!!node);\n _ASSERT && console.assert(node.isLeaf());\n\n if (node.aabb.contains(aabb)) {\n return false;\n }\n\n this.removeLeaf(node);\n\n node.aabb.set(aabb);\n\n // Extend AABB.\n aabb = node.aabb;\n AABB.extend(aabb, Settings.aabbExtension);\n\n // Predict AABB displacement.\n // const d = Vec2.mul(Settings.aabbMultiplier, displacement);\n\n if (d.x < 0.0) {\n aabb.lowerBound.x += d.x * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.x += d.x * Settings.aabbMultiplier;\n }\n\n if (d.y < 0.0) {\n aabb.lowerBound.y += d.y * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.y += d.y * Settings.aabbMultiplier;\n }\n\n this.insertLeaf(node);\n\n return true;\n }\n\n insertLeaf(leaf: TreeNode): void {\n _ASSERT && console.assert(AABB.isValid(leaf.aabb));\n\n if (this.m_root == null) {\n this.m_root = leaf;\n this.m_root.parent = null;\n return;\n }\n\n // Find the best sibling for this node\n const leafAABB = leaf.aabb;\n let index = this.m_root;\n while (!index.isLeaf()) {\n const child1 = index.child1;\n const child2 = index.child2;\n\n const area = index.aabb.getPerimeter();\n\n const combinedAABB = new AABB();\n combinedAABB.combine(index.aabb, leafAABB);\n const combinedArea = combinedAABB.getPerimeter();\n\n // Cost of creating a new parent for this node and the new leaf\n const cost = 2.0 * combinedArea;\n\n // Minimum cost of pushing the leaf further down the tree\n const inheritanceCost = 2.0 * (combinedArea - area);\n\n // Cost of descending into child1\n let cost1;\n if (child1.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n cost1 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n const oldArea = child1.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost1 = (newArea - oldArea) + inheritanceCost;\n }\n\n // Cost of descending into child2\n let cost2;\n if (child2.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n cost2 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n const oldArea = child2.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost2 = newArea - oldArea + inheritanceCost;\n }\n\n // Descend according to the minimum cost.\n if (cost < cost1 && cost < cost2) {\n break;\n }\n\n // Descend\n if (cost1 < cost2) {\n index = child1;\n } else {\n index = child2;\n }\n }\n\n const sibling = index;\n\n // Create a new parent.\n const oldParent = sibling.parent;\n const newParent = this.allocateNode();\n newParent.parent = oldParent;\n newParent.userData = null;\n newParent.aabb.combine(leafAABB, sibling.aabb);\n newParent.height = sibling.height + 1;\n\n if (oldParent != null) {\n // The sibling was not the root.\n if (oldParent.child1 === sibling) {\n oldParent.child1 = newParent;\n } else {\n oldParent.child2 = newParent;\n }\n\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n } else {\n // The sibling was the root.\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n this.m_root = newParent;\n }\n\n // Walk back up the tree fixing heights and AABBs\n index = leaf.parent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n _ASSERT && console.assert(child1 != null);\n _ASSERT && console.assert(child2 != null);\n\n index.height = 1 + Math.max(child1.height, child2.height);\n index.aabb.combine(child1.aabb, child2.aabb);\n\n index = index.parent;\n }\n\n // validate();\n }\n\n removeLeaf(leaf: TreeNode): void {\n if (leaf === this.m_root) {\n this.m_root = null;\n return;\n }\n\n const parent = leaf.parent;\n const grandParent = parent.parent;\n let sibling;\n if (parent.child1 === leaf) {\n sibling = parent.child2;\n } else {\n sibling = parent.child1;\n }\n\n if (grandParent != null) {\n // Destroy parent and connect sibling to grandParent.\n if (grandParent.child1 === parent) {\n grandParent.child1 = sibling;\n } else {\n grandParent.child2 = sibling;\n }\n sibling.parent = grandParent;\n this.freeNode(parent);\n\n // Adjust ancestor bounds.\n let index = grandParent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n index.aabb.combine(child1.aabb, child2.aabb);\n index.height = 1 + Math.max(child1.height, child2.height);\n\n index = index.parent;\n }\n } else {\n this.m_root = sibling;\n sibling.parent = null;\n this.freeNode(parent);\n }\n\n // validate();\n }\n\n /**\n * Perform a left or right rotation if node A is imbalanced. Returns the new\n * root index.\n */\n balance(iA: TreeNode): TreeNode {\n _ASSERT && console.assert(iA != null);\n\n const A = iA;\n if (A.isLeaf() || A.height < 2) {\n return iA;\n }\n\n const B = A.child1;\n const C = A.child2;\n\n const balance = C.height - B.height;\n\n // Rotate C up\n if (balance > 1) {\n const F = C.child1;\n const G = C.child2;\n\n // Swap A and C\n C.child1 = A;\n C.parent = A.parent;\n A.parent = C;\n\n // A's old parent should point to C\n if (C.parent != null) {\n if (C.parent.child1 === iA) {\n C.parent.child1 = C;\n } else {\n C.parent.child2 = C;\n }\n } else {\n this.m_root = C;\n }\n\n // Rotate\n if (F.height > G.height) {\n C.child2 = F;\n A.child2 = G;\n G.parent = A;\n A.aabb.combine(B.aabb, G.aabb);\n C.aabb.combine(A.aabb, F.aabb);\n\n A.height = 1 + Math.max(B.height, G.height);\n C.height = 1 + Math.max(A.height, F.height);\n } else {\n C.child2 = G;\n A.child2 = F;\n F.parent = A;\n A.aabb.combine(B.aabb, F.aabb);\n C.aabb.combine(A.aabb, G.aabb);\n\n A.height = 1 + Math.max(B.height, F.height);\n C.height = 1 + Math.max(A.height, G.height);\n }\n\n return C;\n }\n\n // Rotate B up\n if (balance < -1) {\n const D = B.child1;\n const E = B.child2;\n\n // Swap A and B\n B.child1 = A;\n B.parent = A.parent;\n A.parent = B;\n\n // A's old parent should point to B\n if (B.parent != null) {\n if (B.parent.child1 === A) {\n B.parent.child1 = B;\n } else {\n B.parent.child2 = B;\n }\n } else {\n this.m_root = B;\n }\n\n // Rotate\n if (D.height > E.height) {\n B.child2 = D;\n A.child1 = E;\n E.parent = A;\n A.aabb.combine(C.aabb, E.aabb);\n B.aabb.combine(A.aabb, D.aabb);\n\n A.height = 1 + Math.max(C.height, E.height);\n B.height = 1 + Math.max(A.height, D.height);\n } else {\n B.child2 = E;\n A.child1 = D;\n D.parent = A;\n A.aabb.combine(C.aabb, D.aabb);\n B.aabb.combine(A.aabb, E.aabb);\n\n A.height = 1 + Math.max(C.height, D.height);\n B.height = 1 + Math.max(A.height, E.height);\n }\n\n return B;\n }\n\n return A;\n }\n\n /**\n * Compute the height of the binary tree in O(N) time. Should not be called\n * often.\n */\n getHeight(): number {\n if (this.m_root == null) {\n return 0;\n }\n\n return this.m_root.height;\n }\n\n /**\n * Get the ratio of the sum of the node areas to the root area.\n */\n getAreaRatio(): number {\n if (this.m_root == null) {\n return 0.0;\n }\n\n const root = this.m_root;\n const rootArea = root.aabb.getPerimeter();\n\n let totalArea = 0.0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // Free node in pool\n continue;\n }\n\n totalArea += node.aabb.getPerimeter();\n }\n\n this.iteratorPool.release(it);\n\n return totalArea / rootArea;\n }\n\n /**\n * Compute the height of a sub-tree.\n */\n computeHeight(id?: number): number {\n let node;\n if (typeof id !== 'undefined') {\n node = this.m_nodes[id];\n } else {\n node = this.m_root;\n }\n\n // _ASSERT && console.assert(0 <= id && id < this.m_nodeCapacity);\n\n if (node.isLeaf()) {\n return 0;\n }\n\n const height1 = this.computeHeight(node.child1.id);\n const height2 = this.computeHeight(node.child2.id);\n return 1 + Math.max(height1, height2);\n }\n\n validateStructure(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n if (node === this.m_root) {\n _ASSERT && console.assert(node.parent == null);\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && console.assert(child1 == null);\n _ASSERT && console.assert(child2 == null);\n _ASSERT && console.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && console.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && console.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n _ASSERT && console.assert(child1.parent === node);\n _ASSERT && console.assert(child2.parent === node);\n\n this.validateStructure(child1);\n this.validateStructure(child2);\n }\n\n validateMetrics(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && console.assert(child1 == null);\n _ASSERT && console.assert(child2 == null);\n _ASSERT && console.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && console.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && console.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n const height1 = child1.height;\n const height2 = child2.height;\n const height = 1 + Math.max(height1, height2);\n _ASSERT && console.assert(node.height === height);\n\n const aabb = new AABB();\n aabb.combine(child1.aabb, child2.aabb);\n\n _ASSERT && console.assert(AABB.areEqual(aabb, node.aabb));\n\n this.validateMetrics(child1);\n this.validateMetrics(child2);\n }\n\n /**\n * Validate this tree. For testing.\n */\n validate(): void {\n this.validateStructure(this.m_root);\n this.validateMetrics(this.m_root);\n _ASSERT && console.assert(this.getHeight() === this.computeHeight());\n }\n\n /**\n * Get the maximum balance of an node in the tree. The balance is the difference\n * in height of the two children of a node.\n */\n getMaxBalance(): number {\n let maxBalance = 0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height <= 1) {\n continue;\n }\n\n _ASSERT && console.assert(!node.isLeaf());\n\n const balance = Math.abs(node.child2.height - node.child1.height);\n maxBalance = Math.max(maxBalance, balance);\n }\n this.iteratorPool.release(it);\n\n return maxBalance;\n }\n\n /**\n * Build an optimal tree. Very expensive. For testing.\n */\n rebuildBottomUp(): void {\n const nodes = [];\n let count = 0;\n\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // free node in pool\n continue;\n }\n\n if (node.isLeaf()) {\n node.parent = null;\n nodes[count] = node;\n ++count;\n } else {\n this.freeNode(node);\n }\n }\n this.iteratorPool.release(it);\n\n while (count > 1) {\n let minCost = Infinity;\n let iMin = -1;\n let jMin = -1;\n for (let i = 0; i < count; ++i) {\n const aabbi = nodes[i].aabb;\n for (let j = i + 1; j < count; ++j) {\n const aabbj = nodes[j].aabb;\n const b = new AABB();\n b.combine(aabbi, aabbj);\n const cost = b.getPerimeter();\n if (cost < minCost) {\n iMin = i;\n jMin = j;\n minCost = cost;\n }\n }\n }\n\n const child1 = nodes[iMin];\n const child2 = nodes[jMin];\n\n const parent = this.allocateNode();\n parent.child1 = child1;\n parent.child2 = child2;\n parent.height = 1 + Math.max(child1.height, child2.height);\n parent.aabb.combine(child1.aabb, child2.aabb);\n parent.parent = null;\n\n child1.parent = parent;\n child2.parent = parent;\n\n nodes[jMin] = nodes[count - 1];\n nodes[iMin] = parent;\n --count;\n }\n\n this.m_root = nodes[0];\n\n _ASSERT && this.validate();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n const aabb = node.aabb;\n aabb.lowerBound.x -= newOrigin.x;\n aabb.lowerBound.y -= newOrigin.y;\n aabb.upperBound.x -= newOrigin.x;\n aabb.upperBound.y -= newOrigin.y;\n }\n this.iteratorPool.release(it);\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query(aabb: AABB, queryCallback: DynamicTreeQueryCallback): void {\n _ASSERT && console.assert(typeof queryCallback === 'function');\n const stack = this.stackPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, aabb)) {\n if (node.isLeaf()) {\n const proceed = queryCallback(node.id);\n if (proceed === false) {\n return;\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n }\n\n this.stackPool.release(stack);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n // TODO: GC\n _ASSERT && console.assert(typeof rayCastCallback === 'function');\n const p1 = input.p1;\n const p2 = input.p2;\n const r = Vec2.sub(p2, p1);\n _ASSERT && console.assert(r.lengthSquared() > 0.0);\n r.normalize();\n\n // v is perpendicular to the segment.\n const v = Vec2.crossNumVec2(1.0, r);\n const abs_v = Vec2.abs(v);\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n\n let maxFraction = input.maxFraction;\n\n // Build a bounding box for the segment.\n const segmentAABB = new AABB();\n let t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n\n const stack = this.stackPool.allocate();\n const subInput = this.inputPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, segmentAABB) === false) {\n continue;\n }\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n const c = node.aabb.getCenter();\n const h = node.aabb.getExtents();\n const separation = Math.abs(Vec2.dot(v, Vec2.sub(p1, c))) - Vec2.dot(abs_v, h);\n if (separation > 0.0) {\n continue;\n }\n\n if (node.isLeaf()) {\n subInput.p1 = Vec2.clone(input.p1);\n subInput.p2 = Vec2.clone(input.p2);\n subInput.maxFraction = maxFraction;\n\n const value = rayCastCallback(subInput, node.id);\n\n if (value === 0.0) {\n // The client has terminated the ray cast.\n return;\n }\n\n if (value > 0.0) {\n // update segment bounding box.\n maxFraction = value;\n t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n this.stackPool.release(stack);\n this.inputPool.release(subInput);\n }\n\n private inputPool: Pool = new Pool({\n create(): RayCastInput {\n // tslint:disable-next-line:no-object-literal-type-assertion\n return {} as RayCastInput;\n },\n release(stack: RayCastInput): void {\n }\n });\n\n private stackPool: Pool>> = new Pool>>({\n create(): Array> {\n return [];\n },\n release(stack: Array>): void {\n stack.length = 0;\n }\n });\n\n private iteratorPool: Pool> = new Pool>({\n create(): Iterator {\n return new Iterator();\n },\n release(iterator: Iterator): void {\n iterator.close();\n }\n });\n\n}\n\nclass Iterator {\n parents: Array> = [];\n states: number[] = [];\n preorder(root: TreeNode): Iterator {\n this.parents.length = 0;\n this.parents.push(root);\n this.states.length = 0;\n this.states.push(0);\n return this;\n }\n next(): TreeNode {\n while (this.parents.length > 0) {\n const i = this.parents.length - 1;\n const node = this.parents[i];\n if (this.states[i] === 0) {\n this.states[i] = 1;\n return node;\n }\n if (this.states[i] === 1) {\n this.states[i] = 2;\n if (node.child1) {\n this.parents.push(node.child1);\n this.states.push(1);\n return node.child1;\n }\n }\n if (this.states[i] === 2) {\n this.states[i] = 3;\n if (node.child2) {\n this.parents.push(node.child2);\n this.states.push(1);\n return node.child2;\n }\n }\n this.parents.pop();\n this.states.pop();\n }\n }\n close(): void {\n this.parents.length = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { AABB, RayCastCallback, RayCastInput } from './AABB';\nimport { DynamicTree, DynamicTreeQueryCallback } from './DynamicTree';\nimport { FixtureProxy } from \"../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * The broad-phase wraps and extends a dynamic-tree to keep track of moved\n * objects and query them on update.\n */\nexport class BroadPhase {\n m_tree: DynamicTree = new DynamicTree();\n m_proxyCount: number = 0;\n m_moveBuffer: number[] = [];\n\n m_callback: (userDataA: any, userDataB: any) => void;\n m_queryProxyId: number;\n\n /**\n * Get user data from a proxy. Returns null if the id is invalid.\n */\n getUserData(proxyId: number): FixtureProxy {\n return this.m_tree.getUserData(proxyId);\n }\n\n /**\n * Test overlap of fat AABBs.\n */\n testOverlap(proxyIdA: number, proxyIdB: number): boolean {\n const aabbA = this.m_tree.getFatAABB(proxyIdA);\n const aabbB = this.m_tree.getFatAABB(proxyIdB);\n return AABB.testOverlap(aabbA, aabbB);\n }\n\n /**\n * Get the fat AABB for a proxy.\n */\n getFatAABB(proxyId: number): AABB {\n return this.m_tree.getFatAABB(proxyId);\n }\n\n /**\n * Get the number of proxies.\n */\n getProxyCount(): number {\n return this.m_proxyCount;\n }\n\n /**\n * Get the height of the embedded tree.\n */\n getTreeHeight(): number {\n return this.m_tree.getHeight();\n }\n\n /**\n * Get the balance (integer) of the embedded tree.\n */\n getTreeBalance(): number {\n return this.m_tree.getMaxBalance();\n }\n\n /**\n * Get the quality metric of the embedded tree.\n */\n getTreeQuality(): number {\n return this.m_tree.getAreaRatio();\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query = (aabb: AABB, queryCallback: DynamicTreeQueryCallback): void => {\n this.m_tree.query(aabb, queryCallback);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n this.m_tree.rayCast(input, rayCastCallback);\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_tree.shiftOrigin(newOrigin);\n }\n\n /**\n * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs\n * is called.\n */\n createProxy(aabb: AABB, userData: FixtureProxy): number {\n _ASSERT && console.assert(AABB.isValid(aabb));\n const proxyId = this.m_tree.createProxy(aabb, userData);\n this.m_proxyCount++;\n this.bufferMove(proxyId);\n return proxyId;\n }\n\n /**\n * Destroy a proxy. It is up to the client to remove any pairs.\n */\n destroyProxy(proxyId: number): void {\n this.unbufferMove(proxyId);\n this.m_proxyCount--;\n this.m_tree.destroyProxy(proxyId);\n }\n\n /**\n * Call moveProxy as many times as you like, then when you are done call\n * UpdatePairs to finalized the proxy pairs (for your time step).\n */\n moveProxy(proxyId: number, aabb: AABB, displacement: Vec2): void {\n _ASSERT && console.assert(AABB.isValid(aabb));\n const changed = this.m_tree.moveProxy(proxyId, aabb, displacement);\n if (changed) {\n this.bufferMove(proxyId);\n }\n }\n\n /**\n * Call to trigger a re-processing of it's pairs on the next call to\n * UpdatePairs.\n */\n touchProxy(proxyId: number): void {\n this.bufferMove(proxyId);\n }\n\n bufferMove(proxyId: number): void {\n this.m_moveBuffer.push(proxyId);\n }\n\n unbufferMove(proxyId: number): void {\n for (let i = 0; i < this.m_moveBuffer.length; ++i) {\n if (this.m_moveBuffer[i] === proxyId) {\n this.m_moveBuffer[i] = null;\n }\n }\n }\n\n /**\n * Update the pairs. This results in pair callbacks. This can only add pairs.\n */\n updatePairs(addPairCallback: (userDataA: FixtureProxy, userDataB: FixtureProxy) => void): void {\n _ASSERT && console.assert(typeof addPairCallback === 'function');\n this.m_callback = addPairCallback;\n\n // Perform tree queries for all moving proxies.\n while (this.m_moveBuffer.length > 0) {\n this.m_queryProxyId = this.m_moveBuffer.pop();\n if (this.m_queryProxyId === null) {\n continue;\n }\n\n // We have to query the tree with the fat AABB so that\n // we don't fail to create a pair that may touch later.\n const fatAABB = this.m_tree.getFatAABB(this.m_queryProxyId);\n\n // Query tree, create pairs and add them pair buffer.\n this.m_tree.query(fatAABB, this.queryCallback);\n }\n\n // Try to keep the tree balanced.\n // this.m_tree.rebalance(4);\n }\n\n queryCallback = (proxyId: number): boolean => {\n // A proxy cannot form a pair with itself.\n if (proxyId === this.m_queryProxyId) {\n return true;\n }\n\n const proxyIdA = Math.min(proxyId, this.m_queryProxyId);\n const proxyIdB = Math.max(proxyId, this.m_queryProxyId);\n\n // TODO: Skip any duplicate pairs.\n\n const userDataA = this.m_tree.getUserData(proxyIdA);\n const userDataB = this.m_tree.getUserData(proxyIdB);\n\n // Send the pairs back to the client.\n this.m_callback(userDataA, userDataB);\n\n return true;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2, Vec2Value } from './Vec2';\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class Rot {\n s: number;\n c: number;\n\n /** Initialize from an angle in radians. */\n constructor(angle?: number | Rot) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Rot)) {\n return new Rot(angle);\n }\n if (typeof angle === 'number') {\n this.setAngle(angle);\n } else if (typeof angle === 'object') {\n this.setRot(angle);\n } else {\n this.setIdentity();\n }\n }\n\n /** @internal */\n static neo(angle: number): Rot {\n const obj = Object.create(Rot.prototype);\n obj.setAngle(angle);\n return obj;\n }\n\n static clone(rot: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n const obj = Object.create(Rot.prototype);\n obj.s = rot.s;\n obj.c = rot.c;\n return obj;\n }\n\n static identity(): Rot {\n const obj = Object.create(Rot.prototype);\n obj.s = 0.0;\n obj.c = 1.0;\n return obj;\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.s) && Math.isFinite(obj.c);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Rot.isValid(o), 'Invalid Rot!', o);\n }\n\n /** Set to the identity rotation. */\n setIdentity(): void {\n this.s = 0.0;\n this.c = 1.0;\n }\n\n set(angle: number | Rot): void {\n if (typeof angle === 'object') {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n\n } else {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n }\n\n setRot(angle: Rot): void {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n }\n\n /** Set using an angle in radians. */\n setAngle(angle: number): void {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n\n /** Get the angle in radians. */\n getAngle(): number {\n return Math.atan2(this.s, this.c);\n }\n\n /** Get the x-axis. */\n getXAxis(): Vec2 {\n return Vec2.neo(this.c, this.s);\n }\n\n /** Get the u-axis. */\n getYAxis(): Vec2 {\n return Vec2.neo(-this.s, this.c);\n }\n\n /** Multiply two rotations: q * r */\n static mul(rot: Rot, m: Rot): Rot;\n /** Rotate a vector */\n static mul(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(rot, m) {\n _ASSERT && Rot.assert(rot);\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Multiply two rotations: q * r */\n static mulRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n }\n\n /** Rotate a vector */\n static mulVec2(rot: Rot, m: Vec2): Vec2 {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n\n static mulSub(rot: Rot, v: Vec2, w: Vec2): Vec2 {\n const x = rot.c * (v.x - w.x) - rot.s * (v.y - w.y);\n const y = rot.s * (v.x - w.x) + rot.c * (v.y - w.y);\n return Vec2.neo(x, y);\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulT(rot: Rot, m: Rot): Rot;\n /** Inverse rotate a vector */\n static mulT(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(rot, m) {\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulTRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n }\n\n /** Inverse rotate a vector */\n static mulTVec2(rot: Rot, m: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2, Vec2Value } from './Vec2';\nimport { Rot } from './Rot';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A transform contains translation and rotation. It is used to represent the\n * position and orientation of rigid frames. Initialize using a position vector\n * and a rotation.\n */\nexport class Transform {\n /** position */\n p: Vec2;\n\n /** rotation */\n q: Rot;\n\n constructor(position?: Vec2Value, rotation?: number) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Transform)) {\n return new Transform(position, rotation);\n }\n this.p = Vec2.zero();\n this.q = Rot.identity();\n if (typeof position !== 'undefined') {\n this.p.setVec2(position);\n }\n if (typeof rotation !== 'undefined') {\n this.q.setAngle(rotation);\n }\n }\n\n static clone(xf: Transform): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(xf.p);\n obj.q = Rot.clone(xf.q);\n return obj;\n }\n\n /** @internal */\n static neo(position: Vec2, rotation: Rot): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(position);\n obj.q = Rot.clone(rotation);\n return obj;\n }\n\n static identity(): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.zero();\n obj.q = Rot.identity();\n return obj;\n }\n\n /**\n * Set this to the identity transform.\n */\n setIdentity(): void {\n this.p.setZero();\n this.q.setIdentity();\n }\n\n set(position: Vec2, rotation: number): void;\n set(xf: Transform): void;\n /**\n * Set this based on the position and angle.\n */\n // tslint:disable-next-line:typedef\n set(a, b?) {\n if (typeof b === 'undefined') {\n this.p.set(a.p);\n this.q.set(a.q);\n } else {\n this.p.set(a);\n this.q.set(b);\n }\n }\n\n /**\n * Set this based on the position and angle.\n */\n setNum(position: Vec2, rotation: number) {\n this.p.setVec2(position);\n this.q.setAngle(rotation);\n }\n\n setTransform(xf: Transform): void {\n this.p.setVec2(xf.p);\n this.q.setRot(xf.q);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.p) && Rot.isValid(obj.q);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Transform.isValid(o), 'Invalid Transform!', o);\n }\n\n static mul(a: Transform, b: Vec2Value): Vec2;\n static mul(a: Transform, b: Transform): Transform;\n // static mul(a: Transform, b: Vec2Value[]): Vec2[];\n // static mul(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (Array.isArray(b)) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n\n } else if ('x' in b && 'y' in b) {\n return Transform.mulVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulXf(a, b);\n }\n }\n\n static mulAll(a: Transform, b: Vec2Value[]): Vec2[];\n static mulAll(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mulAll(a: Transform, b) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static mulFn(a: Transform) {\n _ASSERT && Transform.assert(a);\n return function(b: Vec2Value): Vec2 {\n return Transform.mul(a, b);\n };\n }\n\n static mulVec2(a: Transform, b: Vec2Value): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = (a.q.c * b.x - a.q.s * b.y) + a.p.x;\n const y = (a.q.s * b.x + a.q.c * b.y) + a.p.y;\n return Vec2.neo(x, y);\n }\n\n static mulXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p\n // = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p\n const xf = Transform.identity();\n xf.q = Rot.mulRot(a.q, b.q);\n xf.p = Vec2.add(Rot.mulVec2(a.q, b.p), a.p);\n return xf;\n }\n\n static mulT(a: Transform, b: Vec2Value): Vec2;\n static mulT(a: Transform, b: Transform): Transform;\n // tslint:disable-next-line:typedef\n static mulT(a, b) {\n if ('x' in b && 'y' in b) {\n return Transform.mulTVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulTXf(a, b);\n }\n }\n\n static mulTVec2(a: Transform, b: Vec2Value): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const px = b.x - a.p.x;\n const py = b.y - a.p.y;\n const x = (a.q.c * px + a.q.s * py);\n const y = (-a.q.s * px + a.q.c * py);\n return Vec2.neo(x, y);\n }\n\n static mulTXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q' * (B.q * v1 + B.p - A.p)\n // = A.q' * B.q * v1 + A.q' * (B.p - A.p)\n const xf = Transform.identity();\n xf.q.setRot(Rot.mulTRot(a.q, b.q));\n xf.p.setVec2(Rot.mulTVec2(a.q, Vec2.sub(b.p, a.p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\nimport { Vec2 } from './Vec2';\nimport { Rot } from './Rot';\nimport { Transform } from './Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * This describes the motion of a body/shape for TOI computation. Shapes are\n * defined with respect to the body origin, which may not coincide with the\n * center of mass. However, to support dynamics we must interpolate the center\n * of mass position.\n */\nexport class Sweep {\n /** Local center of mass position */\n localCenter: Vec2;\n\n /** World center position */\n c: Vec2;\n\n /** World angle */\n a: number;\n\n /** Fraction of the current time step in the range [0,1], c0 and a0 are c and a at alpha0. */\n alpha0: number;\n\n c0: Vec2;\n a0: number;\n\n constructor(c?: Vec2, a?: number) {\n _ASSERT && console.assert(typeof c === 'undefined');\n _ASSERT && console.assert(typeof a === 'undefined');\n this.localCenter = Vec2.zero();\n this.c = Vec2.zero();\n this.a = 0;\n this.alpha0 = 0;\n this.c0 = Vec2.zero();\n this.a0 = 0;\n }\n\n setTransform(xf: Transform): void {\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n\n this.a = xf.q.getAngle();\n this.a0 = xf.q.getAngle();\n }\n\n setLocalCenter(localCenter: Vec2, xf: Transform): void {\n this.localCenter.setVec2(localCenter);\n\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n }\n\n /**\n * Get the interpolated transform at a specific time.\n *\n * @param xf\n * @param beta A factor in [0,1], where 0 indicates alpha0\n */\n getTransform(xf: Transform, beta: number = 0): void {\n xf.q.setAngle((1.0 - beta) * this.a0 + beta * this.a);\n xf.p.setCombine((1.0 - beta), this.c0, beta, this.c);\n\n // shift to origin\n xf.p.sub(Rot.mulVec2(xf.q, this.localCenter));\n }\n\n /**\n * Advance the sweep forward, yielding a new initial state.\n *\n * @param alpha The new initial time\n */\n advance(alpha: number): void {\n _ASSERT && console.assert(this.alpha0 < 1.0);\n const beta = (alpha - this.alpha0) / (1.0 - this.alpha0);\n this.c0.setCombine(beta, this.c, 1 - beta, this.c0);\n this.a0 = beta * this.a + (1 - beta) * this.a0;\n this.alpha0 = alpha;\n }\n\n forward(): void {\n this.a0 = this.a;\n this.c0.setVec2(this.c);\n }\n\n /**\n * normalize the angles in radians to be between -pi and pi.\n */\n normalize(): void {\n const a0 = Math.mod(this.a0, -Math.PI, +Math.PI);\n this.a -= this.a0 - a0;\n this.a0 = a0;\n }\n\n clone(): Sweep {\n const clone = new Sweep();\n clone.localCenter.setVec2(this.localCenter);\n clone.alpha0 = this.alpha0;\n clone.a0 = this.a0;\n clone.a = this.a;\n clone.c0.setVec2(this.c0);\n clone.c.setVec2(this.c);\n return clone;\n }\n\n set(that: Sweep): void {\n this.localCenter.setVec2(that.localCenter);\n this.alpha0 = that.alpha0;\n this.a0 = that.a0;\n this.a = that.a;\n this.c0.setVec2(that.c0);\n this.c.setVec2(that.c);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\n\nexport class Velocity {\n /** linear */\n v: Vec2;\n\n /** angular */\n w: number;\n\n constructor() {\n this.v = Vec2.zero();\n this.w = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Transform } from '../common/Transform';\n\n\nexport class Position {\n /** location */\n c: Vec2;\n\n /** angle */\n a: number;\n\n constructor() {\n this.c = Vec2.zero();\n this.a = 0;\n }\n\n getTransform(xf: Transform, p: Vec2): Transform {\n xf.q.setAngle(this.a);\n xf.p.setVec2(Vec2.sub(this.c, Rot.mulVec2(xf.q, p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from './AABB';\nimport { DistanceProxy } from './Distance';\nimport type { Transform } from '../common/Transform';\nimport type { Vec2Value } from '../common/Vec2';\n\n// todo make shape an interface\n\n/**\n * A shape is used for collision detection. You can create a shape however you\n * like. Shapes used for simulation in World are created automatically when a\n * Fixture is created. Shapes may encapsulate one or more child shapes.\n */\nexport abstract class Shape {\n m_type: ShapeType;\n m_radius: number;\n\n /** @internal */\n abstract _reset(): void;\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return typeof obj.m_type === 'string' && typeof obj.m_radius === 'number';\n }\n\n abstract getRadius(): number;\n\n /**\n * Get the type of this shape. You can use this to down cast to the concrete\n * shape.\n *\n * @return the shape type.\n */\n abstract getType(): ShapeType;\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n abstract _clone(): Shape;\n\n /**\n * Get the number of child primitives.\n */\n abstract getChildCount(): number;\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n abstract testPoint(xf: Transform, p: Vec2Value): boolean;\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n abstract rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean;\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n abstract computeAABB(aabb: AABB, xf: Transform, childIndex: number): void;\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n abstract computeMass(massData: MassData, density?: number): void;\n\n abstract computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void;\n\n}\n\nexport type ShapeType = \"circle\" | \"edge\" | \"polygon\" | \"chain\";\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { math as Math } from '../common/Math';\nimport { Vec2, Vec2Value } from '../common/Vec2';\nimport { AABB, RayCastInput, RayCastOutput } from '../collision/AABB';\nimport { Shape, ShapeType } from '../collision/Shape';\nimport { Body, MassData } from \"./Body\";\nimport { BroadPhase } from \"../collision/BroadPhase\";\nimport { Transform } from \"../common/Transform\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A fixture definition is used to create a fixture. This class defines an\n * abstract fixture definition. You can reuse fixture definitions safely.\n */\nexport interface FixtureOpt {\n userData?: unknown;\n /**\n * The friction coefficient, usually in the range [0,1]\n */\n friction?: number;\n /**\n * The restitution (elasticity) usually in the range [0,1]\n */\n restitution?: number;\n /**\n * The density, usually in kg/m^2\n */\n density?: number;\n /**\n * A sensor shape collects contact information but never generates a collision response.\n */\n isSensor?: boolean;\n /**\n * Zero, positive or negative collision group.\n * Fixtures with same positive groupIndex always collide and fixtures with same negative groupIndex never collide.\n */\n filterGroupIndex?: number;\n /**\n * Collision category bit or bits that this fixture belongs to.\n * If groupIndex is zero or not matching, then at least one bit in this fixture categoryBits should match other fixture maskBits and vice versa.\n */\n filterCategoryBits?: number;\n /**\n * Collision category bit or bits that this fixture accept for collision.\n */\n filterMaskBits?: number;\n}\n\nexport interface FixtureDef extends FixtureOpt {\n shape: Shape;\n}\n\nconst FixtureDefDefault: FixtureOpt = {\n userData : null,\n friction : 0.2,\n restitution : 0.0,\n density : 0.0,\n isSensor : false,\n\n filterGroupIndex : 0,\n filterCategoryBits : 0x0001,\n filterMaskBits : 0xFFFF\n};\n\n/**\n * This proxy is used internally to connect shape children to the broad-phase.\n */\nexport class FixtureProxy {\n aabb: AABB;\n fixture: Fixture;\n childIndex: number;\n proxyId: number;\n constructor(fixture: Fixture, childIndex: number) {\n this.aabb = new AABB();\n this.fixture = fixture;\n this.childIndex = childIndex;\n this.proxyId;\n }\n}\n\n/**\n * A fixture is used to attach a shape to a body for collision detection. A\n * fixture inherits its transform from its parent. Fixtures hold additional\n * non-geometric data such as friction, collision filters, etc.\n *\n * To create a new Fixture use {@link Body.createFixture}.\n */\nexport class Fixture {\n /** @internal */ m_body: Body;\n /** @internal */ m_friction: number;\n /** @internal */ m_restitution: number;\n /** @internal */ m_density: number;\n /** @internal */ m_isSensor: boolean;\n /** @internal */ m_filterGroupIndex: number;\n /** @internal */ m_filterCategoryBits: number;\n /** @internal */ m_filterMaskBits: number;\n /** @internal */ m_shape: Shape;\n /** @internal */ m_next: Fixture | null;\n /** @internal */ m_proxies: FixtureProxy[];\n /** @internal */ m_proxyCount: number;\n /** @internal */ m_userData: unknown;\n\n constructor(body: Body, def: FixtureDef);\n constructor(body: Body, shape: Shape, def?: FixtureOpt);\n constructor(body: Body, shape: Shape, density?: number);\n // tslint:disable-next-line:typedef\n /** @internal */ constructor(body: Body, shape?, def?) {\n if (shape.shape) {\n def = shape;\n shape = shape.shape;\n\n } else if (typeof def === 'number') {\n def = {density : def};\n }\n\n def = options(def, FixtureDefDefault);\n\n this.m_body = body;\n\n this.m_friction = def.friction;\n this.m_restitution = def.restitution;\n this.m_density = def.density;\n this.m_isSensor = def.isSensor;\n\n this.m_filterGroupIndex = def.filterGroupIndex;\n this.m_filterCategoryBits = def.filterCategoryBits;\n this.m_filterMaskBits = def.filterMaskBits;\n\n // TODO validate shape\n this.m_shape = shape; // .clone();\n\n this.m_next = null;\n\n this.m_proxies = [];\n this.m_proxyCount = 0;\n\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n\n this.m_userData = def.userData;\n }\n\n /**\n * Re-setup fixture.\n * @internal\n */\n _reset(): void {\n const body = this.getBody();\n const broadPhase = body.m_world.m_broadPhase;\n this.destroyProxies(broadPhase);\n if (this.m_shape._reset) {\n this.m_shape._reset();\n }\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n this.createProxies(broadPhase, body.m_xf);\n body.resetMassData();\n }\n\n /** @internal */\n _serialize(): object {\n return {\n friction: this.m_friction,\n restitution: this.m_restitution,\n density: this.m_density,\n isSensor: this.m_isSensor,\n\n filterGroupIndex: this.m_filterGroupIndex,\n filterCategoryBits: this.m_filterCategoryBits,\n filterMaskBits: this.m_filterMaskBits,\n\n shape: this.m_shape,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, body: any, restore: any): Fixture {\n const shape = restore(Shape, data.shape);\n const fixture = shape && new Fixture(body, shape, data);\n return fixture;\n }\n\n /**\n * Get the type of the child shape. You can use this to down cast to the\n * concrete shape.\n */\n getType(): ShapeType {\n return this.m_shape.getType();\n }\n\n /**\n * Get the child shape. You can modify the child shape, however you should not\n * change the number of vertices because this will crash some collision caching\n * mechanisms. Manipulating the shape may lead to non-physical behavior.\n */\n getShape(): Shape {\n return this.m_shape;\n }\n\n /**\n * A sensor shape collects contact information but never generates a collision\n * response.\n */\n isSensor(): boolean {\n return this.m_isSensor;\n }\n\n /**\n * Set if this fixture is a sensor.\n */\n setSensor(sensor: boolean): void {\n if (sensor != this.m_isSensor) {\n this.m_body.setAwake(true);\n this.m_isSensor = sensor;\n }\n }\n\n // /**\n // * Get the contact filtering data.\n // */\n // getFilterData() {\n // return this.m_filter;\n // }\n\n /**\n * Get the user data that was assigned in the fixture definition. Use this to\n * store your application specific data.\n */\n getUserData(): unknown {\n return this.m_userData;\n }\n\n /**\n * Set the user data. Use this to store your application specific data.\n */\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get the parent body of this fixture. This is null if the fixture is not\n * attached.\n */\n getBody(): Body {\n return this.m_body;\n }\n\n /**\n * Get the next fixture in the parent body's fixture list.\n */\n getNext(): Fixture | null {\n return this.m_next;\n }\n\n /**\n * Get the density of this fixture.\n */\n getDensity(): number {\n return this.m_density;\n }\n\n /**\n * Set the density of this fixture. This will _not_ automatically adjust the\n * mass of the body. You must call Body.resetMassData to update the body's mass.\n */\n setDensity(density: number): void {\n _ASSERT && console.assert(Math.isFinite(density) && density >= 0.0);\n this.m_density = density;\n }\n\n /**\n * Get the coefficient of friction, usually in the range [0,1].\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Set the coefficient of friction. This will not change the friction of\n * existing contacts.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the coefficient of restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Set the coefficient of restitution. This will not change the restitution of\n * existing contacts.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Test a point in world coordinates for containment in this fixture.\n */\n testPoint(p: Vec2Value): boolean {\n return this.m_shape.testPoint(this.m_body.getTransform(), p);\n }\n\n /**\n * Cast a ray against this shape.\n */\n rayCast(output: RayCastOutput, input: RayCastInput, childIndex: number): boolean {\n return this.m_shape.rayCast(output, input, this.m_body.getTransform(), childIndex);\n }\n\n /**\n * Get the mass data for this fixture. The mass data is based on the density and\n * the shape. The rotational inertia is about the shape's origin. This operation\n * may be expensive.\n */\n getMassData(massData: MassData): void {\n this.m_shape.computeMass(massData, this.m_density);\n }\n\n /**\n * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a\n * more accurate AABB, compute it using the shape and the body transform.\n */\n getAABB(childIndex: number): AABB {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_proxies.length);\n return this.m_proxies[childIndex].aabb;\n }\n\n /**\n * These support body activation/deactivation.\n */\n createProxies(broadPhase: BroadPhase, xf: Transform): void {\n _ASSERT && console.assert(this.m_proxyCount == 0);\n\n // Create proxies in the broad-phase.\n this.m_proxyCount = this.m_shape.getChildCount();\n\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n this.m_shape.computeAABB(proxy.aabb, xf, i);\n proxy.proxyId = broadPhase.createProxy(proxy.aabb, proxy);\n }\n }\n\n destroyProxies(broadPhase: BroadPhase): void {\n // Destroy proxies in the broad-phase.\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n broadPhase.destroyProxy(proxy.proxyId);\n proxy.proxyId = null;\n }\n\n this.m_proxyCount = 0;\n }\n\n /**\n * Updates this fixture proxy in broad-phase (with combined AABB of current and\n * next transformation).\n */\n synchronize(broadPhase: BroadPhase, xf1: Transform, xf2: Transform): void {\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n // Compute an AABB that covers the swept shape (may miss some rotation\n // effect).\n const aabb1 = new AABB();\n const aabb2 = new AABB();\n this.m_shape.computeAABB(aabb1, xf1, proxy.childIndex);\n this.m_shape.computeAABB(aabb2, xf2, proxy.childIndex);\n\n proxy.aabb.combine(aabb1, aabb2);\n\n const displacement = Vec2.sub(xf2.p, xf1.p);\n\n broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement);\n }\n }\n\n /**\n * Set the contact filtering data. This will not update contacts until the next\n * time step when either parent body is active and awake. This automatically\n * calls refilter.\n */\n setFilterData(filter: { groupIndex: number, categoryBits: number, maskBits: number }): void {\n this.m_filterGroupIndex = filter.groupIndex;\n this.m_filterCategoryBits = filter.categoryBits;\n this.m_filterMaskBits = filter.maskBits;\n this.refilter();\n }\n\n getFilterGroupIndex(): number {\n return this.m_filterGroupIndex;\n }\n\n setFilterGroupIndex(groupIndex: number): void {\n this.m_filterGroupIndex = groupIndex;\n }\n\n getFilterCategoryBits(): number {\n return this.m_filterCategoryBits;\n }\n\n setFilterCategoryBits(categoryBits: number): void {\n this.m_filterCategoryBits = categoryBits;\n }\n\n getFilterMaskBits(): number {\n return this.m_filterMaskBits;\n }\n\n setFilterMaskBits(maskBits: number): void {\n this.m_filterMaskBits = maskBits;\n }\n\n /**\n * Call this if you want to establish collision that was previously disabled by\n * ContactFilter.\n */\n refilter(): void {\n if (this.m_body == null) {\n return;\n }\n\n // Flag associated contacts for filtering.\n let edge = this.m_body.getContactList();\n while (edge) {\n const contact = edge.contact;\n const fixtureA = contact.getFixtureA();\n const fixtureB = contact.getFixtureB();\n if (fixtureA == this || fixtureB == this) {\n contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n\n const world = this.m_body.getWorld();\n\n if (world == null) {\n return;\n }\n\n // Touch each proxy so that new pairs may be created\n const broadPhase = world.m_broadPhase;\n for (let i = 0; i < this.m_proxyCount; ++i) {\n broadPhase.touchProxy(this.m_proxies[i].proxyId);\n }\n }\n\n /**\n * Implement this method to provide collision filtering, if you want finer\n * control over contact creation.\n *\n * Return true if contact calculations should be performed between these two\n * fixtures.\n *\n * Warning: for performance reasons this is only called when the AABBs begin to\n * overlap.\n */\n shouldCollide(that: Fixture): boolean {\n\n if (that.m_filterGroupIndex === this.m_filterGroupIndex && that.m_filterGroupIndex !== 0) {\n return that.m_filterGroupIndex > 0;\n }\n\n const collideA = (that.m_filterMaskBits & this.m_filterCategoryBits) !== 0;\n const collideB = (that.m_filterCategoryBits & this.m_filterMaskBits) !== 0;\n const collide = collideA && collideB;\n return collide;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { Vec2, Vec2Value } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { math as Math } from '../common/Math';\nimport { Sweep } from '../common/Sweep';\nimport { Transform } from '../common/Transform';\nimport { Velocity } from './Velocity';\nimport { Position } from './Position';\nimport { Fixture, FixtureDef, FixtureOpt } from './Fixture';\nimport { Shape } from '../collision/Shape';\nimport { JointEdge } from \"./Joint\";\nimport { World } from \"./World\";\nimport { ContactEdge } from \"./Contact\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport type BodyType = 'static' | 'kinematic' | 'dynamic';\n\nconst STATIC = 'static';\nconst KINEMATIC = 'kinematic';\nconst DYNAMIC = 'dynamic';\n\nexport interface BodyDef {\n /**\n * Body types are static, kinematic, or dynamic. Note: if a dynamic\n * body would have zero mass, the mass is set to one.\n */\n type?: BodyType;\n /**\n * The world position of the body. Avoid creating bodies at the\n * origin since this can lead to many overlapping shapes.\n */\n position?: Vec2;\n /**\n * The world angle of the body in radians.\n */\n angle?: number;\n /**\n * The linear velocity of the body's origin in world co-ordinates.\n */\n linearVelocity?: Vec2;\n angularVelocity?: number;\n /**\n * Linear damping is use to reduce the linear velocity. The\n * damping parameter can be larger than 1.0 but the damping effect becomes\n * sensitive to the time step when the damping parameter is large.\n */\n linearDamping?: number;\n /**\n * Angular damping is use to reduce the angular velocity.\n * The damping parameter can be larger than 1.0 but the damping effect\n * becomes sensitive to the time step when the damping parameter is large.\n */\n angularDamping?: number;\n /**\n * Should this body be prevented from rotating? Useful for characters.\n */\n fixedRotation?: boolean;\n /**\n * Is this a fast moving body that should be prevented from\n * tunneling through other moving bodies? Note that all bodies are\n * prevented from tunneling through kinematic and static bodies. This\n * setting is only considered on dynamic bodies. Warning: You should use\n * this flag sparingly since it increases processing time.\n */\n bullet?: boolean;\n gravityScale?: number;\n /**\n * Set this flag to false if this body should never fall asleep. Note that this increases CPU usage.\n */\n allowSleep?: boolean;\n /**\n * Is this body initially awake or sleeping?\n */\n awake?: boolean;\n /**\n * Does this body start out active?\n */\n active?: boolean;\n userData?: any;\n}\n\nconst BodyDefDefault: BodyDef = {\n type : STATIC,\n position : Vec2.zero(),\n angle : 0.0,\n\n linearVelocity : Vec2.zero(),\n angularVelocity : 0.0,\n\n linearDamping : 0.0,\n angularDamping : 0.0,\n\n fixedRotation : false,\n bullet : false,\n gravityScale : 1.0,\n\n allowSleep : true,\n awake : true,\n active : true,\n\n userData : null\n};\n\n/**\n * MassData This holds the mass data computed for a shape.\n */\nexport class MassData {\n /** The mass of the shape, usually in kilograms. */\n mass: number = 0;\n /** The position of the shape's centroid relative to the shape's origin. */\n center: Vec2 = Vec2.zero();\n /** The rotational inertia of the shape about the local origin. */\n I: number = 0;\n}\n\n/**\n * A rigid body composed of one or more fixtures.\n *\n * To create a new Body use {@link World.createBody}.\n */\nexport class Body {\n /**\n * A static body does not move under simulation and behaves as if it has infinite mass.\n * Internally, zero is stored for the mass and the inverse mass.\n * Static bodies can be moved manually by the user.\n * A static body has zero velocity.\n * Static bodies do not collide with other static or kinematic bodies.\n */\n static readonly STATIC: BodyType = 'static';\n /**\n * A kinematic body moves under simulation according to its velocity.\n * Kinematic bodies do not respond to forces.\n * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity.\n * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass.\n * Kinematic bodies do not collide with other kinematic or static bodies.\n */\n static readonly KINEMATIC: BodyType = 'kinematic';\n\n /**\n * A dynamic body is fully simulated.\n * They can be moved manually by the user, but normally they move according to forces.\n * A dynamic body can collide with all body types.\n * A dynamic body always has finite, non-zero mass.\n * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate.\n */\n static readonly DYNAMIC: BodyType = 'dynamic';\n\n /** @internal */ m_world: World;\n /** @internal */ m_awakeFlag: boolean;\n /** @internal */ m_autoSleepFlag: boolean;\n /** @internal */ m_bulletFlag: boolean;\n /** @internal */ m_fixedRotationFlag: boolean;\n /** @internal */ m_activeFlag: boolean;\n /** @internal */ m_islandFlag: boolean;\n /** @internal */ m_toiFlag: boolean;\n /** @internal */ m_userData: unknown;\n /** @internal */ m_type: BodyType;\n /** @internal */ m_mass: number;\n /** @internal */ m_invMass: number;\n /** @internal Rotational inertia about the center of mass. */\n m_I: number;\n /** @internal */ m_invI: number;\n /** @internal the body origin transform */\n m_xf: Transform;\n /** @internal the swept motion for CCD */\n m_sweep: Sweep;\n // position and velocity correction\n /** @internal */ c_velocity: Velocity;\n /** @internal */ c_position: Position;\n /** @internal */ m_force: Vec2;\n /** @internal */ m_torque: number;\n /** @internal */ m_linearVelocity: Vec2;\n /** @internal */ m_angularVelocity: number;\n /** @internal */ m_linearDamping: number;\n /** @internal */ m_angularDamping: number;\n /** @internal */ m_gravityScale: number;\n /** @internal */ m_sleepTime: number;\n /** @internal */ m_jointList: JointEdge | null;\n /** @internal */ m_contactList: ContactEdge | null;\n /** @internal */ m_fixtureList: Fixture | null;\n /** @internal */ m_prev: Body | null;\n /** @internal */ m_next: Body | null;\n /** @internal */ m_destroyed: boolean;\n\n /** @internal */\n constructor(world: World, def: BodyDef) {\n def = options(def, BodyDefDefault);\n\n _ASSERT && console.assert(Vec2.isValid(def.position));\n _ASSERT && console.assert(Vec2.isValid(def.linearVelocity));\n _ASSERT && console.assert(Math.isFinite(def.angle));\n _ASSERT && console.assert(Math.isFinite(def.angularVelocity));\n _ASSERT && console.assert(Math.isFinite(def.angularDamping) && def.angularDamping >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.linearDamping) && def.linearDamping >= 0.0);\n\n this.m_world = world;\n\n this.m_awakeFlag = def.awake;\n this.m_autoSleepFlag = def.allowSleep;\n this.m_bulletFlag = def.bullet;\n this.m_fixedRotationFlag = def.fixedRotation;\n this.m_activeFlag = def.active;\n\n this.m_islandFlag = false;\n this.m_toiFlag = false;\n\n this.m_userData = def.userData;\n this.m_type = def.type;\n\n if (this.m_type == DYNAMIC) {\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n } else {\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n }\n\n // Rotational inertia about the center of mass.\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n // the body origin transform\n this.m_xf = Transform.identity();\n this.m_xf.p = Vec2.clone(def.position);\n this.m_xf.q.setAngle(def.angle);\n\n // the swept motion for CCD\n this.m_sweep = new Sweep();\n this.m_sweep.setTransform(this.m_xf);\n\n // position and velocity correction\n this.c_velocity = new Velocity();\n this.c_position = new Position();\n\n this.m_force = Vec2.zero();\n this.m_torque = 0.0;\n\n this.m_linearVelocity = Vec2.clone(def.linearVelocity);\n this.m_angularVelocity = def.angularVelocity;\n\n this.m_linearDamping = def.linearDamping;\n this.m_angularDamping = def.angularDamping;\n this.m_gravityScale = def.gravityScale;\n\n this.m_sleepTime = 0.0;\n\n this.m_jointList = null;\n this.m_contactList = null;\n this.m_fixtureList = null;\n\n this.m_prev = null;\n this.m_next = null;\n\n this.m_destroyed = false;\n }\n\n /** @internal */\n _serialize(): object {\n const fixtures = [];\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n fixtures.push(f);\n }\n return {\n type: this.m_type,\n bullet: this.m_bulletFlag,\n position: this.m_xf.p,\n angle: this.m_xf.q.getAngle(),\n linearVelocity: this.m_linearVelocity,\n angularVelocity: this.m_angularVelocity,\n fixtures,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): Body {\n const body = new Body(world, data);\n\n if (data.fixtures) {\n for (let i = data.fixtures.length - 1; i >= 0; i--) {\n const fixture = restore(Fixture, data.fixtures[i], body);\n body._addFixture(fixture);\n }\n }\n return body;\n }\n\n isWorldLocked(): boolean {\n return this.m_world && this.m_world.isLocked() ? true : false;\n }\n\n getWorld(): World {\n return this.m_world;\n }\n\n getNext(): Body | null {\n return this.m_next;\n }\n\n setUserData(data: any): void {\n this.m_userData = data;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n getFixtureList(): Fixture | null {\n return this.m_fixtureList;\n }\n\n getJointList(): JointEdge | null {\n return this.m_jointList;\n }\n\n /**\n * Warning: this list changes during the time step and you may miss some\n * collisions if you don't use ContactListener.\n */\n getContactList(): ContactEdge | null {\n return this.m_contactList;\n }\n\n isStatic(): boolean {\n return this.m_type == STATIC;\n }\n\n isDynamic(): boolean {\n return this.m_type == DYNAMIC;\n }\n\n isKinematic(): boolean {\n return this.m_type == KINEMATIC;\n }\n\n /**\n * This will alter the mass and velocity.\n */\n setStatic(): Body {\n this.setType(STATIC);\n return this;\n }\n\n setDynamic(): Body {\n this.setType(DYNAMIC);\n return this;\n }\n\n setKinematic(): Body {\n this.setType(KINEMATIC);\n return this;\n }\n\n /**\n * @internal\n */\n getType(): BodyType {\n return this.m_type;\n }\n\n /**\n * @internal\n */\n setType(type: BodyType): void {\n _ASSERT && console.assert(type === STATIC || type === KINEMATIC || type === DYNAMIC);\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type == type) {\n return;\n }\n\n this.m_type = type;\n\n this.resetMassData();\n\n if (this.m_type == STATIC) {\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_sweep.forward();\n this.synchronizeFixtures();\n }\n\n this.setAwake(true);\n\n this.m_force.setZero();\n this.m_torque = 0.0;\n\n // Delete the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n\n // Touch the proxies so that new contacts will be created (when appropriate)\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n const proxyCount = f.m_proxyCount;\n for (let i = 0; i < proxyCount; ++i) {\n broadPhase.touchProxy(f.m_proxies[i].proxyId);\n }\n }\n }\n\n isBullet(): boolean {\n return this.m_bulletFlag;\n }\n\n /**\n * Should this body be treated like a bullet for continuous collision detection?\n */\n setBullet(flag: boolean): void {\n this.m_bulletFlag = !!flag;\n }\n\n isSleepingAllowed(): boolean {\n return this.m_autoSleepFlag;\n }\n\n setSleepingAllowed(flag: boolean): void {\n this.m_autoSleepFlag = !!flag;\n if (this.m_autoSleepFlag == false) {\n this.setAwake(true);\n }\n }\n\n isAwake(): boolean {\n return this.m_awakeFlag;\n }\n\n /**\n * Set the sleep state of the body. A sleeping body has very low CPU cost.\n *\n * @param flag Set to true to wake the body, false to put it to sleep.\n */\n setAwake(flag: boolean): void {\n if (flag) {\n if (this.m_awakeFlag == false) {\n this.m_awakeFlag = true;\n this.m_sleepTime = 0.0;\n }\n } else {\n this.m_awakeFlag = false;\n this.m_sleepTime = 0.0;\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_force.setZero();\n this.m_torque = 0.0;\n }\n }\n\n isActive(): boolean {\n return this.m_activeFlag;\n }\n\n /**\n * Set the active state of the body. An inactive body is not simulated and\n * cannot be collided with or woken up. If you pass a flag of true, all fixtures\n * will be added to the broad-phase. If you pass a flag of false, all fixtures\n * will be removed from the broad-phase and all contacts will be destroyed.\n * Fixtures and joints are otherwise unaffected.\n *\n * You may continue to create/destroy fixtures and joints on inactive bodies.\n * Fixtures on an inactive body are implicitly inactive and will not participate\n * in collisions, ray-casts, or queries. Joints connected to an inactive body\n * are implicitly inactive. An inactive body is still owned by a World object\n * and remains\n */\n setActive(flag: boolean): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (flag == this.m_activeFlag) {\n return;\n }\n\n this.m_activeFlag = !!flag;\n\n if (this.m_activeFlag) {\n // Create all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.createProxies(broadPhase, this.m_xf);\n }\n // Contacts are created the next time step.\n\n } else {\n // Destroy all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.destroyProxies(broadPhase);\n }\n\n // Destroy the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n }\n }\n\n isFixedRotation(): boolean {\n return this.m_fixedRotationFlag;\n }\n\n /**\n * Set this body to have fixed rotation. This causes the mass to be reset.\n */\n setFixedRotation(flag: boolean): void {\n if (this.m_fixedRotationFlag == flag) {\n return;\n }\n\n this.m_fixedRotationFlag = !!flag;\n\n this.m_angularVelocity = 0.0;\n\n this.resetMassData();\n }\n\n /**\n * Get the world transform for the body's origin.\n */\n getTransform(): Transform {\n return this.m_xf;\n }\n\n /**\n * Set the position of the body's origin and rotation. Manipulating a body's\n * transform may cause non-physical behavior. Note: contacts are updated on the\n * next call to World.step.\n *\n * @param position The world position of the body's local origin.\n * @param angle The world rotation in radians.\n */\n setTransform(position: Vec2, angle: number): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n this.m_xf.setNum(position, angle);\n this.m_sweep.setTransform(this.m_xf);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, this.m_xf, this.m_xf);\n }\n }\n\n synchronizeTransform(): void {\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Update fixtures in broad-phase.\n */\n synchronizeFixtures(): void {\n const xf = Transform.identity();\n\n this.m_sweep.getTransform(xf, 0);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, xf, this.m_xf);\n }\n }\n\n /**\n * Used in TOI.\n */\n advance(alpha: number): void {\n // Advance to the new safe time. This doesn't sync the broad-phase.\n this.m_sweep.advance(alpha);\n this.m_sweep.c.setVec2(this.m_sweep.c0);\n this.m_sweep.a = this.m_sweep.a0;\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Get the world position for the body's origin.\n */\n getPosition(): Vec2 {\n return this.m_xf.p;\n }\n\n setPosition(p: Vec2): void {\n this.setTransform(p, this.m_sweep.a);\n }\n\n /**\n * Get the current world rotation angle in radians.\n */\n getAngle(): number {\n return this.m_sweep.a;\n }\n\n setAngle(angle: number): void {\n this.setTransform(this.m_xf.p, angle);\n }\n\n /**\n * Get the world position of the center of mass.\n */\n getWorldCenter(): Vec2 {\n return this.m_sweep.c;\n }\n\n /**\n * Get the local position of the center of mass.\n */\n getLocalCenter(): Vec2 {\n return this.m_sweep.localCenter;\n }\n\n /**\n * Get the linear velocity of the center of mass.\n *\n * @return the linear velocity of the center of mass.\n */\n getLinearVelocity(): Vec2 {\n return this.m_linearVelocity;\n }\n\n /**\n * Get the world linear velocity of a world point attached to this body.\n *\n * @param worldPoint A point in world coordinates.\n */\n getLinearVelocityFromWorldPoint(worldPoint: Vec2): Vec2 {\n const localCenter = Vec2.sub(worldPoint, this.m_sweep.c);\n return Vec2.add(this.m_linearVelocity, Vec2.crossNumVec2(this.m_angularVelocity,\n localCenter));\n }\n\n /**\n * Get the world velocity of a local point.\n *\n * @param localPoint A point in local coordinates.\n */\n getLinearVelocityFromLocalPoint(localPoint: Vec2): Vec2 {\n return this.getLinearVelocityFromWorldPoint(this.getWorldPoint(localPoint));\n }\n\n /**\n * Set the linear velocity of the center of mass.\n *\n * @param v The new linear velocity of the center of mass.\n */\n setLinearVelocity(v: Vec2): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (Vec2.dot(v, v) > 0.0) {\n this.setAwake(true);\n }\n this.m_linearVelocity.setVec2(v);\n }\n\n /**\n * Get the angular velocity.\n *\n * @returns the angular velocity in radians/second.\n */\n getAngularVelocity(): number {\n return this.m_angularVelocity;\n }\n\n /**\n * Set the angular velocity.\n *\n * @param omega The new angular velocity in radians/second.\n */\n setAngularVelocity(w: number): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (w * w > 0.0) {\n this.setAwake(true);\n }\n this.m_angularVelocity = w;\n }\n\n getLinearDamping(): number {\n return this.m_linearDamping;\n }\n\n setLinearDamping(linearDamping: number): void {\n this.m_linearDamping = linearDamping;\n }\n\n getAngularDamping(): number {\n return this.m_angularDamping;\n }\n\n setAngularDamping(angularDamping: number): void {\n this.m_angularDamping = angularDamping;\n }\n\n getGravityScale(): number {\n return this.m_gravityScale;\n }\n\n /**\n * Scale the gravity applied to this body.\n */\n setGravityScale(scale: number): void {\n this.m_gravityScale = scale;\n }\n\n /**\n * Get the total mass of the body.\n *\n * @returns The mass, usually in kilograms (kg).\n */\n getMass(): number {\n return this.m_mass;\n }\n\n /**\n * Get the rotational inertia of the body about the local origin.\n *\n * @return the rotational inertia, usually in kg-m^2.\n */\n getInertia(): number {\n return this.m_I + this.m_mass\n * Vec2.dot(this.m_sweep.localCenter, this.m_sweep.localCenter);\n }\n\n /**\n * Copy the mass data of the body to data.\n */\n getMassData(data: MassData): void {\n data.mass = this.m_mass;\n data.I = this.getInertia();\n data.center.setVec2(this.m_sweep.localCenter);\n }\n\n /**\n * This resets the mass properties to the sum of the mass properties of the\n * fixtures. This normally does not need to be called unless you called\n * SetMassData to override the mass and you later want to reset the mass.\n */\n resetMassData(): void {\n // Compute mass data from shapes. Each shape has its own density.\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n this.m_sweep.localCenter.setZero();\n\n // Static and kinematic bodies have zero mass.\n if (this.isStatic() || this.isKinematic()) {\n this.m_sweep.c0.setVec2(this.m_xf.p);\n this.m_sweep.c.setVec2(this.m_xf.p);\n this.m_sweep.a0 = this.m_sweep.a;\n return;\n }\n\n _ASSERT && console.assert(this.isDynamic());\n\n // Accumulate mass over all fixtures.\n const localCenter = Vec2.zero();\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n if (f.m_density == 0.0) {\n continue;\n }\n\n const massData = new MassData();\n f.getMassData(massData);\n this.m_mass += massData.mass;\n localCenter.addMul(massData.mass, massData.center);\n this.m_I += massData.I;\n }\n\n // Compute center of mass.\n if (this.m_mass > 0.0) {\n this.m_invMass = 1.0 / this.m_mass;\n localCenter.mul(this.m_invMass);\n\n } else {\n // Force all dynamic bodies to have a positive mass.\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n }\n\n if (this.m_I > 0.0 && this.m_fixedRotationFlag == false) {\n // Center the inertia about the center of mass.\n this.m_I -= this.m_mass * Vec2.dot(localCenter, localCenter);\n _ASSERT && console.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n\n } else {\n this.m_I = 0.0;\n this.m_invI = 0.0;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(localCenter, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Set the mass properties to override the mass properties of the fixtures. Note\n * that this changes the center of mass position. Note that creating or\n * destroying fixtures can also alter the mass. This function has no effect if\n * the body isn't dynamic.\n *\n * @param massData The mass properties.\n */\n setMassData(massData: MassData): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n this.m_mass = massData.mass;\n if (this.m_mass <= 0.0) {\n this.m_mass = 1.0;\n }\n\n this.m_invMass = 1.0 / this.m_mass;\n\n if (massData.I > 0.0 && this.m_fixedRotationFlag == false) {\n this.m_I = massData.I - this.m_mass\n * Vec2.dot(massData.center, massData.center);\n _ASSERT && console.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(massData.center, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Apply a force at a world point. If the force is not applied at the center of\n * mass, it will generate a torque and affect the angular velocity. This wakes\n * up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyForce(force: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping.\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n this.m_torque += Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), force);\n }\n }\n\n /**\n * Apply a force to the center of mass. This wakes up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param wake Also wake up the body\n */\n applyForceToCenter(force: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n }\n }\n\n /**\n * Apply a torque. This affects the angular velocity without affecting the\n * linear velocity of the center of mass. This wakes up the body.\n *\n * @param torque About the z-axis (out of the screen), usually in N-m.\n * @param wake Also wake up the body\n */\n applyTorque(torque: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_torque += torque;\n }\n }\n\n /**\n * Apply an impulse at a point. This immediately modifies the velocity. It also\n * modifies the angular velocity if the point of application is not at the\n * center of mass. This wakes up the body.\n *\n * @param impulse The world impulse vector, usually in N-seconds or kg-m/s.\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyLinearImpulse(impulse: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_linearVelocity.addMul(this.m_invMass, impulse);\n this.m_angularVelocity += this.m_invI * Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), impulse);\n }\n }\n\n /**\n * Apply an angular impulse.\n *\n * @param impulse The angular impulse in units of kg*m*m/s\n * @param wake Also wake up the body\n */\n applyAngularImpulse(impulse: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_angularVelocity += this.m_invI * impulse;\n }\n }\n\n /**\n * This is used to prevent connected bodies (by joints) from colliding,\n * depending on the joint's collideConnected flag.\n */\n shouldCollide(that: Body): boolean {\n // At least one body should be dynamic.\n if (this.m_type != DYNAMIC && that.m_type != DYNAMIC) {\n return false;\n }\n // Does a joint prevent collision?\n for (let jn = this.m_jointList; jn; jn = jn.next) {\n if (jn.other == that) {\n if (jn.joint.m_collideConnected == false) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addFixture(fixture: Fixture): Fixture {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.createProxies(broadPhase, this.m_xf);\n }\n\n fixture.m_next = this.m_fixtureList;\n this.m_fixtureList = fixture;\n\n // Adjust mass properties if needed.\n if (fixture.m_density > 0.0) {\n this.resetMassData();\n }\n\n // Let the world know we have a new fixture. This will cause new contacts\n // to be created at the beginning of the next time step.\n this.m_world.m_newFixture = true;\n\n return fixture;\n }\n\n /**\n * Creates a fixture and attach it to this body.\n *\n * If the density is non-zero, this function automatically updates the mass of\n * the body.\n *\n * Contacts are not created until the next time step.\n *\n * Warning: This function is locked during callbacks.\n */\n createFixture(def: FixtureDef): Fixture;\n createFixture(shape: Shape, opt?: FixtureOpt): Fixture;\n createFixture(shape: Shape, density?: number): Fixture;\n // tslint:disable-next-line:typedef\n createFixture(shape, fixdef?) {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n const fixture = new Fixture(this, shape, fixdef);\n this._addFixture(fixture);\n return fixture;\n }\n\n /**\n * Destroy a fixture. This removes the fixture from the broad-phase and destroys\n * all contacts associated with this fixture. This will automatically adjust the\n * mass of the body if the body is dynamic and the fixture has positive density.\n * All fixtures attached to a body are implicitly destroyed when the body is\n * destroyed.\n *\n * Warning: This function is locked during callbacks.\n *\n * @param fixture The fixture to be removed.\n */\n destroyFixture(fixture: Fixture): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n _ASSERT && console.assert(fixture.m_body == this);\n\n // Remove the fixture from this body's singly linked list.\n let found = false;\n if (this.m_fixtureList === fixture) {\n this.m_fixtureList = fixture.m_next;\n found = true;\n\n } else {\n let node = this.m_fixtureList;\n while (node != null) {\n if (node.m_next === fixture) {\n node.m_next = fixture.m_next;\n found = true;\n break;\n }\n node = node.m_next;\n }\n }\n\n // You tried to remove a shape that is not attached to this body.\n _ASSERT && console.assert(found);\n\n // Destroy any contacts associated with the fixture.\n let edge = this.m_contactList;\n while (edge) {\n const c = edge.contact;\n edge = edge.next;\n\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n\n if (fixture == fixtureA || fixture == fixtureB) {\n // This destroys the contact and removes it from\n // this body's contact list.\n this.m_world.destroyContact(c);\n }\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.destroyProxies(broadPhase);\n }\n\n fixture.m_body = null;\n fixture.m_next = null;\n\n this.m_world.publish('remove-fixture', fixture);\n\n // Reset the mass data.\n this.resetMassData();\n }\n\n /**\n * Get the corresponding world point of a local point.\n */\n getWorldPoint(localPoint: Vec2): Vec2 {\n return Transform.mulVec2(this.m_xf, localPoint);\n }\n\n /**\n * Get the corresponding world vector of a local vector.\n */\n getWorldVector(localVector: Vec2): Vec2 {\n return Rot.mulVec2(this.m_xf.q, localVector);\n }\n\n /**\n * Gets the corresponding local point of a world point.\n */\n getLocalPoint(worldPoint: Vec2Value): Vec2 {\n return Transform.mulTVec2(this.m_xf, worldPoint);\n }\n\n /**\n * Gets the corresponding local vector of a world vector.\n */\n getLocalVector(worldVector: Vec2Value): Vec2 {\n return Rot.mulTVec2(this.m_xf.q, worldVector);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { Vec2 } from '../common/Vec2';\nimport type { Body } from './Body';\nimport { TimeStep } from \"./Solver\";\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n/**\n * A joint edge is used to connect bodies and joints together in a joint graph\n * where each body is a node and each joint is an edge. A joint edge belongs to\n * a doubly linked list maintained in each attached body. Each joint has two\n * joint nodes, one for each attached body.\n */\nexport class JointEdge {\n /**\n * provides quick access to the other body attached.\n */\n other: Body | null = null;\n /**\n * the joint\n */\n joint: Joint | null = null;\n /**\n * prev the previous joint edge in the body's joint list\n */\n prev: JointEdge | null = null;\n /**\n * the next joint edge in the body's joint list\n */\n next: JointEdge | null = null;\n}\n\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointOpt {\n /**\n * Use this to attach application specific data to your joints.\n */\n userData?: any;\n /**\n * Set this flag to true if the attached bodies\n * should collide.\n */\n collideConnected?: boolean;\n}\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointDef extends JointOpt {\n /**\n * The first attached body.\n */\n bodyA: Body;\n /**\n * The second attached body.\n */\n bodyB: Body;\n}\n\nconst DEFAULTS = {\n userData : null,\n collideConnected : false\n};\n\n/**\n * The base joint class. Joints are used to constraint two bodies together in\n * various fashions. Some joints also feature limits and motors.\n */\nexport abstract class Joint {\n\n /** @internal */ m_type: string = 'unknown-joint';\n\n /** @internal */ m_bodyA: Body;\n /** @internal */ m_bodyB: Body;\n\n /** @internal */ m_collideConnected: boolean;\n\n /** @internal */ m_prev: Joint | null = null;\n /** @internal */ m_next: Joint | null = null;\n\n /** @internal */ m_edgeA: JointEdge = new JointEdge();\n /** @internal */ m_edgeB: JointEdge = new JointEdge();\n\n /** @internal */ m_islandFlag: boolean = false;\n /** @internal */ m_userData: unknown;\n\n constructor(def: JointDef);\n constructor(def: JointOpt, bodyA: Body, bodyB: Body);\n constructor(def: JointDef | JointOpt, bodyA?: Body, bodyB?: Body) {\n bodyA = 'bodyA' in def ? def.bodyA : bodyA;\n bodyB = 'bodyB' in def ? def.bodyB : bodyB;\n\n _ASSERT && console.assert(!!bodyA);\n _ASSERT && console.assert(!!bodyB);\n _ASSERT && console.assert(bodyA != bodyB);\n\n this.m_bodyA = bodyA!;\n this.m_bodyB = bodyB!;\n\n this.m_collideConnected = !!def.collideConnected;\n this.m_userData = def.userData;\n }\n\n /**\n * Short-cut function to determine if either body is inactive.\n */\n isActive(): boolean {\n return this.m_bodyA.isActive() && this.m_bodyB.isActive();\n }\n\n /**\n * Get the type of the concrete joint.\n */\n getType(): string {\n return this.m_type;\n }\n\n /**\n * Get the first body attached to this joint.\n */\n getBodyA(): Body {\n return this.m_bodyA;\n }\n\n /**\n * Get the second body attached to this joint.\n */\n getBodyB(): Body {\n return this.m_bodyB;\n }\n\n /**\n * Get the next joint the world joint list.\n */\n getNext(): Joint {\n return this.m_next;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get collide connected. Note: modifying the collide connect flag won't work\n * correctly because the flag is only checked when fixture AABBs begin to\n * overlap.\n */\n getCollideConnected(): boolean {\n return this.m_collideConnected;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n abstract getAnchorA(): Vec2;\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n abstract getAnchorB(): Vec2;\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n abstract getReactionForce(inv_dt: number): Vec2;\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n abstract getReactionTorque(inv_dt: number): number;\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2): void {}\n\n abstract initVelocityConstraints(step: TimeStep): void;\n\n abstract solveVelocityConstraints(step: TimeStep): void;\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n abstract solvePositionConstraints(step: TimeStep): boolean;\n\n}\n","export const stats = {\n gjkCalls: 0,\n gjkIters: 0,\n gjkMaxIters: 0,\n\n toiTime: 0,\n toiMaxTime: 0,\n toiCalls: 0,\n toiIters: 0,\n toiMaxIters: 0,\n toiRootIters: 0,\n toiMaxRootIters: 0,\n\n toString(newline?: string): string {\n newline = typeof newline === 'string' ? newline : '\\n';\n let string = \"\";\n // tslint:disable-next-line:no-for-in\n for (const name in this) {\n if (typeof this[name] !== 'function' && typeof this[name] !== 'object') {\n string += name + ': ' + this[name] + newline;\n }\n }\n return string;\n }\n};\n","export const now = function(): number {\n return Date.now();\n};\n\nexport const diff = function(time: number): number {\n return Date.now() - time;\n};\n\nexport default {\n now,\n diff,\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { stats } from '../util/stats';\nimport { Shape } from './Shape';\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Transform } from '../common/Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates.\n */\n\nstats.gjkCalls = 0;\nstats.gjkIters = 0;\nstats.gjkMaxIters = 0;\n\n/**\n * Input for Distance. You have to option to use the shape radii in the\n * computation. Even\n */\nexport class DistanceInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n transformA: Transform | null = null;\n transformB: Transform | null = null;\n useRadii: boolean = false;\n}\n\n/**\n * Output for Distance.\n *\n * @prop {Vec2} pointA closest point on shapeA\n * @prop {Vec2} pointB closest point on shapeB\n * @prop distance\n * @prop iterations number of GJK iterations used\n */\nexport class DistanceOutput {\n pointA: Vec2 = Vec2.zero();\n pointB: Vec2 = Vec2.zero();\n distance: number;\n iterations: number;\n}\n\n/**\n * Used to warm start Distance. Set count to zero on first call.\n *\n * @prop {number} metric length or area\n * @prop {array} indexA vertices on shape A\n * @prop {array} indexB vertices on shape B\n * @prop {number} count\n */\nexport class SimplexCache {\n metric: number = 0;\n indexA: number[] = [];\n indexB: number[] = [];\n count: number = 0;\n}\n\n/**\n * Compute the closest points between two shapes. Supports any combination of:\n * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On\n * the first call set SimplexCache.count to zero.\n */\nexport const Distance = function (output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void {\n ++stats.gjkCalls;\n\n const proxyA = input.proxyA;\n const proxyB = input.proxyB;\n const xfA = input.transformA;\n const xfB = input.transformB;\n\n // Initialize the simplex.\n const simplex = new Simplex();\n simplex.readCache(cache, proxyA, xfA, proxyB, xfB);\n\n // Get simplex vertices as an array.\n const vertices = simplex.m_v;\n const k_maxIters = Settings.maxDistnceIterations;\n\n // These store the vertices of the last simplex so that we\n // can check for duplicates and prevent cycling.\n const saveA = [];\n const saveB = []; // int[3]\n let saveCount = 0;\n\n let distanceSqr1 = Infinity;\n let distanceSqr2 = Infinity;\n\n // Main iteration loop.\n let iter = 0;\n while (iter < k_maxIters) {\n // Copy simplex so we can identify duplicates.\n saveCount = simplex.m_count;\n for (let i = 0; i < saveCount; ++i) {\n saveA[i] = vertices[i].indexA;\n saveB[i] = vertices[i].indexB;\n }\n\n simplex.solve();\n\n // If we have 3 points, then the origin is in the corresponding triangle.\n if (simplex.m_count === 3) {\n break;\n }\n\n // Compute closest point.\n const p = simplex.getClosestPoint();\n distanceSqr2 = p.lengthSquared();\n\n // Ensure progress\n if (distanceSqr2 >= distanceSqr1) {\n // break;\n }\n distanceSqr1 = distanceSqr2;\n\n // Get search direction.\n const d = simplex.getSearchDirection();\n\n // Ensure the search direction is numerically fit.\n if (d.lengthSquared() < Math.EPSILON * Math.EPSILON) {\n // The origin is probably contained by a line segment\n // or triangle. Thus the shapes are overlapped.\n\n // We can't return zero here even though there may be overlap.\n // In case the simplex is a point, segment, or triangle it is difficult\n // to determine if the origin is contained in the CSO or very close to it.\n break;\n }\n\n // Compute a tentative new simplex vertex using support points.\n const vertex = vertices[simplex.m_count]; // SimplexVertex\n\n vertex.indexA = proxyA.getSupport(Rot.mulTVec2(xfA.q, Vec2.neg(d)));\n vertex.wA = Transform.mulVec2(xfA, proxyA.getVertex(vertex.indexA));\n\n vertex.indexB = proxyB.getSupport(Rot.mulTVec2(xfB.q, d));\n vertex.wB = Transform.mulVec2(xfB, proxyB.getVertex(vertex.indexB));\n\n vertex.w = Vec2.sub(vertex.wB, vertex.wA);\n\n // Iteration count is equated to the number of support point calls.\n ++iter;\n ++stats.gjkIters;\n\n // Check for duplicate support points. This is the main termination\n // criteria.\n let duplicate = false;\n for (let i = 0; i < saveCount; ++i) {\n if (vertex.indexA === saveA[i] && vertex.indexB === saveB[i]) {\n duplicate = true;\n break;\n }\n }\n\n // If we found a duplicate support point we must exit to avoid cycling.\n if (duplicate) {\n break;\n }\n\n // New vertex is ok and needed.\n ++simplex.m_count;\n }\n\n stats.gjkMaxIters = Math.max(stats.gjkMaxIters, iter);\n\n // Prepare output.\n simplex.getWitnessPoints(output.pointA, output.pointB);\n output.distance = Vec2.distance(output.pointA, output.pointB);\n output.iterations = iter;\n\n // Cache the simplex.\n simplex.writeCache(cache);\n\n // Apply radii if requested.\n if (input.useRadii) {\n const rA = proxyA.m_radius;\n const rB = proxyB.m_radius;\n\n if (output.distance > rA + rB && output.distance > Math.EPSILON) {\n // Shapes are still no overlapped.\n // Move the witness points to the outer surface.\n output.distance -= rA + rB;\n const normal = Vec2.sub(output.pointB, output.pointA);\n normal.normalize();\n output.pointA.addMul(rA, normal);\n output.pointB.subMul(rB, normal);\n } else {\n // Shapes are overlapped when radii are considered.\n // Move the witness points to the middle.\n const p = Vec2.mid(output.pointA, output.pointB);\n output.pointA.setVec2(p);\n output.pointB.setVec2(p);\n output.distance = 0.0;\n }\n }\n}\n\n/**\n * A distance proxy is used by the GJK algorithm. It encapsulates any shape.\n */\nexport class DistanceProxy {\n /** internal */ m_buffer: Vec2[];\n /** internal */ m_vertices: Vec2[];\n /** internal */ m_count: number;\n /** internal */ m_radius: number;\n\n\n constructor() {\n this.m_buffer = []; // Vec2[2]\n this.m_vertices = []; // Vec2[]\n this.m_count = 0;\n this.m_radius = 0;\n }\n\n /**\n * Get the vertex count.\n */\n getVertexCount(): number {\n return this.m_count;\n }\n\n /**\n * Get a vertex by index. Used by Distance.\n */\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * Get the supporting vertex index in the given direction.\n */\n getSupport(d: Vec2): number {\n let bestIndex = 0;\n let bestValue = Vec2.dot(this.m_vertices[0], d);\n for (let i = 0; i < this.m_count; ++i) {\n const value = Vec2.dot(this.m_vertices[i], d);\n if (value > bestValue) {\n bestIndex = i;\n bestValue = value;\n }\n }\n return bestIndex;\n }\n\n /**\n * Get the supporting vertex in the given direction.\n */\n getSupportVertex(d: Vec2): Vec2 {\n return this.m_vertices[this.getSupport(d)];\n }\n\n /**\n * Initialize the proxy using the given shape. The shape must remain in scope\n * while the proxy is in use.\n */\n set(shape: Shape, index: number): void {\n // TODO remove, use shape instead\n _ASSERT && console.assert(typeof shape.computeDistanceProxy === 'function');\n shape.computeDistanceProxy(this, index);\n }\n}\n\nclass SimplexVertex {\n /** support point in proxyA */\n wA: Vec2 = Vec2.zero();\n /** wA index */\n indexA: number;\n\n /** support point in proxyB */\n wB: Vec2 = Vec2.zero();\n /** wB index */\n indexB: number;\n\n /** wB - wA; */\n w: Vec2 = Vec2.zero();\n /** barycentric coordinate for closest point */\n a: number;\n\n set(v: SimplexVertex): void {\n this.indexA = v.indexA;\n this.indexB = v.indexB;\n this.wA = Vec2.clone(v.wA);\n this.wB = Vec2.clone(v.wB);\n this.w = Vec2.clone(v.w);\n this.a = v.a;\n }\n}\n\nclass Simplex {\n m_v1: SimplexVertex;\n m_v2: SimplexVertex;\n m_v3: SimplexVertex;\n m_v: SimplexVertex[];\n m_count: number;\n\n constructor() {\n this.m_v1 = new SimplexVertex();\n this.m_v2 = new SimplexVertex();\n this.m_v3 = new SimplexVertex();\n this.m_v = [ this.m_v1, this.m_v2, this.m_v3 ];\n this.m_count;\n }\n\n /** @internal */\n toString(): string {\n if (this.m_count === 3) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y,\n this.m_v3.a, this.m_v3.wA.x, this.m_v3.wA.y, this.m_v3.wB.x, this.m_v3.wB.y\n ].toString();\n\n } else if (this.m_count === 2) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y\n ].toString();\n\n } else if (this.m_count === 1) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y\n ].toString();\n\n } else {\n return \"+\" + this.m_count;\n }\n }\n\n readCache(cache: SimplexCache, proxyA: DistanceProxy, transformA: Transform, proxyB: DistanceProxy, transformB: Transform): void {\n _ASSERT && console.assert(cache.count <= 3);\n\n // Copy data from cache.\n this.m_count = cache.count;\n for (let i = 0; i < this.m_count; ++i) {\n const v = this.m_v[i];\n v.indexA = cache.indexA[i];\n v.indexB = cache.indexB[i];\n const wALocal = proxyA.getVertex(v.indexA);\n const wBLocal = proxyB.getVertex(v.indexB);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 0.0;\n }\n\n // Compute the new simplex metric, if it is substantially different than\n // old metric then flush the simplex.\n if (this.m_count > 1) {\n const metric1 = cache.metric;\n const metric2 = this.getMetric();\n if (metric2 < 0.5 * metric1 || 2.0 * metric1 < metric2\n || metric2 < Math.EPSILON) {\n // Reset the simplex.\n this.m_count = 0;\n }\n }\n\n // If the cache is empty or invalid...\n if (this.m_count === 0) {\n const v = this.m_v[0];\n v.indexA = 0;\n v.indexB = 0;\n const wALocal = proxyA.getVertex(0);\n const wBLocal = proxyB.getVertex(0);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 1.0;\n this.m_count = 1;\n }\n }\n\n writeCache(cache: SimplexCache): void {\n cache.metric = this.getMetric();\n cache.count = this.m_count;\n for (let i = 0; i < this.m_count; ++i) {\n cache.indexA[i] = this.m_v[i].indexA;\n cache.indexB[i] = this.m_v[i].indexB;\n }\n }\n\n getSearchDirection(): Vec2 {\n switch (this.m_count) {\n case 1:\n return Vec2.neg(this.m_v1.w);\n\n case 2: {\n const e12 = Vec2.sub(this.m_v2.w, this.m_v1.w);\n const sgn = Vec2.crossVec2Vec2(e12, Vec2.neg(this.m_v1.w));\n if (sgn > 0.0) {\n // Origin is left of e12.\n return Vec2.crossNumVec2(1.0, e12);\n } else {\n // Origin is right of e12.\n return Vec2.crossVec2Num(e12, 1.0);\n }\n }\n\n default:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n }\n }\n\n getClosestPoint(): Vec2 {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n\n case 1:\n return Vec2.clone(this.m_v1.w);\n\n case 2:\n return Vec2.combine(this.m_v1.a, this.m_v1.w, this.m_v2.a, this.m_v2.w);\n\n case 3:\n return Vec2.zero();\n\n default:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n }\n }\n\n getWitnessPoints(pA: Vec2, pB: Vec2): void {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n break;\n\n case 1:\n pA.setVec2(this.m_v1.wA);\n pB.setVec2(this.m_v1.wB);\n break;\n\n case 2:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pB.setCombine(this.m_v1.a, this.m_v1.wB, this.m_v2.a, this.m_v2.wB);\n break;\n\n case 3:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pA.addMul(this.m_v3.a, this.m_v3.wA);\n pB.setVec2(pA);\n break;\n\n default:\n _ASSERT && console.assert(false);\n break;\n }\n }\n\n getMetric(): number {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n return 0.0;\n\n case 1:\n return 0.0;\n\n case 2:\n return Vec2.distance(this.m_v1.w, this.m_v2.w);\n\n case 3:\n return Vec2.crossVec2Vec2(Vec2.sub(this.m_v2.w, this.m_v1.w), Vec2.sub(this.m_v3.w,\n this.m_v1.w));\n\n default:\n _ASSERT && console.assert(false);\n return 0.0;\n }\n }\n\n solve(): void {\n switch (this.m_count) {\n case 1:\n break;\n\n case 2:\n this.solve2();\n break;\n\n case 3:\n this.solve3();\n break;\n\n default:\n _ASSERT && console.assert(false);\n }\n }\n\n// Solve a line segment using barycentric coordinates.\n//\n// p = a1 * w1 + a2 * w2\n// a1 + a2 = 1\n//\n// The vector from the origin to the closest point on the line is\n// perpendicular to the line.\n// e12 = w2 - w1\n// dot(p, e) = 0\n// a1 * dot(w1, e) + a2 * dot(w2, e) = 0\n//\n// 2-by-2 linear system\n// [1 1 ][a1] = [1]\n// [w1.e12 w2.e12][a2] = [0]\n//\n// Define\n// d12_1 = dot(w2, e12)\n// d12_2 = -dot(w1, e12)\n// d12 = d12_1 + d12_2\n//\n// Solution\n// a1 = d12_1 / d12\n// a2 = d12_2 / d12\n solve2(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const e12 = Vec2.sub(w2, w1);\n\n // w1 region\n const d12_2 = -Vec2.dot(w1, e12);\n if (d12_2 <= 0.0) {\n // a2 <= 0, so we clamp it to 0\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // w2 region\n const d12_1 = Vec2.dot(w2, e12);\n if (d12_1 <= 0.0) {\n // a1 <= 0, so we clamp it to 0\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // Must be in e12 region.\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n }\n\n// Possible regions:\n// - points[2]\n// - edge points[0]-points[2]\n// - edge points[1]-points[2]\n// - inside the triangle\n solve3(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const w3 = this.m_v3.w;\n\n // Edge12\n // [1 1 ][a1] = [1]\n // [w1.e12 w2.e12][a2] = [0]\n // a3 = 0\n const e12 = Vec2.sub(w2, w1);\n const w1e12 = Vec2.dot(w1, e12);\n const w2e12 = Vec2.dot(w2, e12);\n const d12_1 = w2e12;\n const d12_2 = -w1e12;\n\n // Edge13\n // [1 1 ][a1] = [1]\n // [w1.e13 w3.e13][a3] = [0]\n // a2 = 0\n const e13 = Vec2.sub(w3, w1);\n const w1e13 = Vec2.dot(w1, e13);\n const w3e13 = Vec2.dot(w3, e13);\n const d13_1 = w3e13;\n const d13_2 = -w1e13;\n\n // Edge23\n // [1 1 ][a2] = [1]\n // [w2.e23 w3.e23][a3] = [0]\n // a1 = 0\n const e23 = Vec2.sub(w3, w2);\n const w2e23 = Vec2.dot(w2, e23);\n const w3e23 = Vec2.dot(w3, e23);\n const d23_1 = w3e23;\n const d23_2 = -w2e23;\n\n // Triangle123\n const n123 = Vec2.crossVec2Vec2(e12, e13);\n\n const d123_1 = n123 * Vec2.crossVec2Vec2(w2, w3);\n const d123_2 = n123 * Vec2.crossVec2Vec2(w3, w1);\n const d123_3 = n123 * Vec2.crossVec2Vec2(w1, w2);\n\n // w1 region\n if (d12_2 <= 0.0 && d13_2 <= 0.0) {\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // e12\n if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) {\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n return;\n }\n\n // e13\n if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) {\n const inv_d13 = 1.0 / (d13_1 + d13_2);\n this.m_v1.a = d13_1 * inv_d13;\n this.m_v3.a = d13_2 * inv_d13;\n this.m_count = 2;\n this.m_v2.set(this.m_v3);\n return;\n }\n\n // w2 region\n if (d12_1 <= 0.0 && d23_2 <= 0.0) {\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // w3 region\n if (d13_1 <= 0.0 && d23_1 <= 0.0) {\n this.m_v3.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // e23\n if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) {\n const inv_d23 = 1.0 / (d23_1 + d23_2);\n this.m_v2.a = d23_1 * inv_d23;\n this.m_v3.a = d23_2 * inv_d23;\n this.m_count = 2;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // Must be in triangle123\n const inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3);\n this.m_v1.a = d123_1 * inv_d123;\n this.m_v2.a = d123_2 * inv_d123;\n this.m_v3.a = d123_3 * inv_d123;\n this.m_count = 3;\n }\n}\n\n/**\n * Determine if two generic shapes overlap.\n */\nexport const testOverlap = function (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform): boolean {\n const input = new DistanceInput();\n input.proxyA.set(shapeA, indexA);\n input.proxyB.set(shapeB, indexB);\n input.transformA = xfA;\n input.transformB = xfB;\n input.useRadii = true;\n\n const cache = new SimplexCache();\n const output = new DistanceOutput();\n\n Distance(output, cache, input);\n\n return output.distance < 10.0 * Math.EPSILON;\n}\n\n// legacy exports\nDistance.testOverlap = testOverlap;\nDistance.Input = DistanceInput;\nDistance.Output = DistanceOutput;\nDistance.Proxy = DistanceProxy;\nDistance.Cache = SimplexCache;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { stats } from '../util/stats';\nimport Timer from '../util/Timer';\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Sweep } from '../common/Sweep';\nimport { Transform } from '../common/Transform';\n\nimport { Distance, DistanceInput, DistanceOutput, DistanceProxy, SimplexCache } from './Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n/**\n * Input parameters for TimeOfImpact.\n */\nexport class TOIInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n sweepA: Sweep = new Sweep();\n sweepB: Sweep = new Sweep();\n /** defines sweep interval [0, tMax] */\n tMax: number | undefined;\n}\n\nexport enum TOIOutputState {\n e_unknown = 0,\n e_failed = 1,\n e_overlapped = 2,\n e_touching = 3,\n e_separated = 4,\n}\n\n/**\n * Output parameters for TimeOfImpact.\n */\nexport class TOIOutput {\n state: TOIOutputState | undefined;\n t: number | undefined;\n}\n\nstats.toiTime = 0;\nstats.toiMaxTime = 0;\nstats.toiCalls = 0;\nstats.toiIters = 0;\nstats.toiMaxIters = 0;\nstats.toiRootIters = 0;\nstats.toiMaxRootIters = 0;\n\n/**\n * Compute the upper bound on time before two shapes penetrate. Time is\n * represented as a fraction between [0,tMax]. This uses a swept separating axis\n * and may miss some intermediate, non-tunneling collision. If you change the\n * time interval, you should call this function again.\n *\n * Note: use Distance to compute the contact point and normal at the time of\n * impact.\n *\n * CCD via the local separating axis method. This seeks progression by computing\n * the largest time at which separation is maintained.\n */\nexport const TimeOfImpact = function (output: TOIOutput, input: TOIInput): void {\n const timer = Timer.now();\n\n ++stats.toiCalls;\n\n output.state = TOIOutputState.e_unknown;\n output.t = input.tMax;\n\n const proxyA = input.proxyA; // DistanceProxy\n const proxyB = input.proxyB; // DistanceProxy\n\n const sweepA = input.sweepA; // Sweep\n const sweepB = input.sweepB; // Sweep\n\n // Large rotations can make the root finder fail, so we normalize the\n // sweep angles.\n sweepA.normalize();\n sweepB.normalize();\n\n const tMax = input.tMax;\n\n const totalRadius = proxyA.m_radius + proxyB.m_radius;\n const target = Math.max(Settings.linearSlop, totalRadius - 3.0 * Settings.linearSlop);\n const tolerance = 0.25 * Settings.linearSlop;\n _ASSERT && console.assert(target > tolerance);\n\n let t1 = 0.0;\n const k_maxIterations = Settings.maxTOIIterations;\n let iter = 0;\n\n // Prepare input for distance query.\n const cache = new SimplexCache();\n\n const distanceInput = new DistanceInput();\n distanceInput.proxyA = input.proxyA;\n distanceInput.proxyB = input.proxyB;\n distanceInput.useRadii = false;\n\n // The outer loop progressively attempts to compute new separating axes.\n // This loop terminates when an axis is repeated (no progress is made).\n while (true) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n sweepA.getTransform(xfA, t1);\n sweepB.getTransform(xfB, t1);\n\n // Get the distance between shapes. We can also use the results\n // to get a separating axis.\n distanceInput.transformA = xfA;\n distanceInput.transformB = xfB;\n const distanceOutput = new DistanceOutput();\n Distance(distanceOutput, cache, distanceInput);\n\n // If the shapes are overlapped, we give up on continuous collision.\n if (distanceOutput.distance <= 0.0) {\n // Failure!\n output.state = TOIOutputState.e_overlapped;\n output.t = 0.0;\n break;\n }\n\n if (distanceOutput.distance < target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n break;\n }\n\n // Initialize the separating axis.\n const fcn = new SeparationFunction();\n fcn.initialize(cache, proxyA, sweepA, proxyB, sweepB, t1);\n\n // if (false) {\n // // Dump the curve seen by the root finder\n // const N = 100;\n // const dx = 1.0 / N;\n // const xs = []; // [ N + 1 ];\n // const fs = []; // [ N + 1 ];\n // const x = 0.0;\n // for (const i = 0; i <= N; ++i) {\n // sweepA.getTransform(xfA, x);\n // sweepB.getTransform(xfB, x);\n // const f = fcn.evaluate(xfA, xfB) - target;\n // printf(\"%g %g\\n\", x, f);\n // xs[i] = x;\n // fs[i] = f;\n // x += dx;\n // }\n // }\n\n // Compute the TOI on the separating axis. We do this by successively\n // resolving the deepest point. This loop is bounded by the number of\n // vertices.\n let done = false;\n let t2 = tMax;\n let pushBackIter = 0;\n while (true) {\n // Find the deepest point at t2. Store the witness point indices.\n let s2 = fcn.findMinSeparation(t2);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Is the final configuration separated?\n if (s2 > target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_separated;\n output.t = tMax;\n done = true;\n break;\n }\n\n // Has the separation reached tolerance?\n if (s2 > target - tolerance) {\n // Advance the sweeps\n t1 = t2;\n break;\n }\n\n // Compute the initial separation of the witness points.\n let s1 = fcn.evaluate(t1);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Check for initial overlap. This might happen if the root finder\n // runs out of iterations.\n if (s1 < target - tolerance) {\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n done = true;\n break;\n }\n\n // Check for touching\n if (s1 <= target + tolerance) {\n // Victory! t1 should hold the TOI (could be 0.0).\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n done = true;\n break;\n }\n\n // Compute 1D root of: f(x) - target = 0\n let rootIterCount = 0;\n let a1 = t1;\n let a2 = t2;\n while (true) {\n // Use a mix of the secant rule and bisection.\n let t;\n if (rootIterCount & 1) {\n // Secant rule to improve convergence.\n t = a1 + (target - s1) * (a2 - a1) / (s2 - s1);\n } else {\n // Bisection to guarantee progress.\n t = 0.5 * (a1 + a2);\n }\n\n ++rootIterCount;\n ++stats.toiRootIters;\n\n const s = fcn.evaluate(t);\n const indexA = fcn.indexA;\n const indexB = fcn.indexB;\n\n if (Math.abs(s - target) < tolerance) {\n // t2 holds a tentative value for t1\n t2 = t;\n break;\n }\n\n // Ensure we continue to bracket the root.\n if (s > target) {\n a1 = t;\n s1 = s;\n } else {\n a2 = t;\n s2 = s;\n }\n\n if (rootIterCount === 50) {\n break;\n }\n }\n\n stats.toiMaxRootIters = Math.max(stats.toiMaxRootIters, rootIterCount);\n\n ++pushBackIter;\n\n if (pushBackIter === Settings.maxPolygonVertices) {\n break;\n }\n }\n\n ++iter;\n ++stats.toiIters;\n\n if (done) {\n break;\n }\n\n if (iter === k_maxIterations) {\n // Root finder got stuck. Semi-victory.\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n break;\n }\n }\n\n stats.toiMaxIters = Math.max(stats.toiMaxIters, iter);\n\n const time = Timer.diff(timer);\n stats.toiMaxTime = Math.max(stats.toiMaxTime, time);\n stats.toiTime += time;\n}\n\nenum SeparationFunctionType {\n e_points = 1,\n e_faceA = 2,\n e_faceB = 3,\n}\n\nclass SeparationFunction {\n m_proxyA: DistanceProxy = new DistanceProxy();\n m_proxyB: DistanceProxy = new DistanceProxy();\n m_sweepA: Sweep;\n m_sweepB: Sweep;\n indexA: number;\n indexB: number;\n m_type: SeparationFunctionType;\n m_localPoint: Vec2 = Vec2.zero();\n m_axis: Vec2 = Vec2.zero();\n\n // TODO_ERIN might not need to return the separation\n\n initialize(cache: SimplexCache, proxyA: DistanceProxy, sweepA: Sweep, proxyB: DistanceProxy, sweepB: Sweep, t1: number): number {\n this.m_proxyA = proxyA;\n this.m_proxyB = proxyB;\n const count = cache.count;\n _ASSERT && console.assert(0 < count && count < 3);\n\n this.m_sweepA = sweepA;\n this.m_sweepB = sweepB;\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t1);\n this.m_sweepB.getTransform(xfB, t1);\n\n if (count === 1) {\n this.m_type = SeparationFunctionType.e_points;\n const localPointA = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n this.m_axis.setCombine(1, pointB, -1, pointA);\n const s = this.m_axis.normalize();\n return s;\n\n } else if (cache.indexA[0] === cache.indexA[1]) {\n // Two points on B and one on A.\n this.m_type = SeparationFunctionType.e_faceB;\n const localPointB1 = proxyB.getVertex(cache.indexB[0]);\n const localPointB2 = proxyB.getVertex(cache.indexB[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointB2, localPointB1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointB1, localPointB2);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n const localPointA = proxyA.getVertex(cache.indexA[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n let s = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n\n } else {\n // Two points on A and one or two points on B.\n this.m_type = SeparationFunctionType.e_faceA;\n const localPointA1 = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointA2 = this.m_proxyA.getVertex(cache.indexA[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointA2, localPointA1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointA1, localPointA2);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n let s = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n }\n }\n\n compute(find: boolean, t: number): number {\n // It was findMinSeparation and evaluate\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t);\n this.m_sweepB.getTransform(xfB, t);\n\n switch (this.m_type) {\n case SeparationFunctionType.e_points: {\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, this.m_axis);\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(this.m_axis));\n\n this.indexA = this.m_proxyA.getSupport(axisA);\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, this.m_axis) - Vec2.dot(pointA, this.m_axis);\n return sep;\n }\n\n case SeparationFunctionType.e_faceA: {\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n if (find) {\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(normal));\n\n this.indexA = -1;\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n return sep;\n }\n\n case SeparationFunctionType.e_faceB: {\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, Vec2.neg(normal));\n\n this.indexB = -1;\n this.indexA = this.m_proxyA.getSupport(axisA);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n const sep = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n return sep;\n }\n\n default:\n _ASSERT && console.assert(false);\n if (find) {\n this.indexA = -1;\n this.indexB = -1;\n }\n return 0.0;\n }\n }\n\n findMinSeparation(t: number): number {\n return this.compute(true, t);\n }\n\n evaluate(t: number): number {\n return this.compute(false, t);\n }\n}\n\nconst separationFunction_reuse = new SeparationFunction();\n\n// legacy exports\nTimeOfImpact.Input = TOIInput;\nTimeOfImpact.Output = TOIOutput;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { Body } from './Body';\nimport type { Contact } from './Contact';\nimport { Joint } from './Joint';\nimport { TimeOfImpact, TOIInput, TOIOutput, TOIOutputState } from '../collision/TimeOfImpact';\nimport { Distance, DistanceInput, DistanceOutput, SimplexCache } from '../collision/Distance';\nimport { World } from \"./World\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport class TimeStep {\n /** time step */\n dt: number = 0;\n /** inverse time step (0 if dt == 0) */\n inv_dt: number = 0;\n velocityIterations: number = 0;\n positionIterations: number = 0;\n warmStarting: boolean = false;\n blockSolve: boolean = true;\n\n /** timestep ratio for variable timestep */\n inv_dt0: number = 0.0;\n /** dt * inv_dt0 */\n dtRatio: number = 1;\n\n reset(dt: number): void {\n if (this.dt > 0.0) {\n this.inv_dt0 = this.inv_dt;\n }\n this.dt = dt;\n this.inv_dt = dt == 0 ? 0 : 1 / dt;\n this.dtRatio = dt * this.inv_dt0;\n }\n}\n\n// reuse\nconst s_subStep = new TimeStep();\n\n/**\n * Contact impulses for reporting. Impulses are used instead of forces because\n * sub-step forces may approach infinity for rigid body collisions. These match\n * up one-to-one with the contact points in Manifold.\n */\nexport class ContactImpulse {\n // TODO: merge with Contact class?\n\n private readonly contact: Contact;\n private readonly normals: number[];\n private readonly tangents: number[];\n\n constructor(contact: Contact) {\n this.contact = contact;\n this.normals = [];\n this.tangents = [];\n }\n\n get normalImpulses(): number[] {\n const contact = this.contact;\n const normals = this.normals;\n normals.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n normals.push(contact.v_points[p].normalImpulse);\n }\n return normals;\n }\n\n get tangentImpulses(): number[] {\n const contact = this.contact;\n const tangents = this.tangents;\n tangents.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n tangents.push(contact.v_points[p].tangentImpulse);\n }\n return tangents;\n }\n}\n\n/**\n * Finds and solves islands. An island is a connected subset of the world.\n */\nexport class Solver {\n m_world: World;\n m_stack: Body[];\n m_bodies: Body[];\n m_contacts: Contact[];\n m_joints: Joint[];\n\n constructor(world: World) {\n this.m_world = world;\n this.m_stack = [];\n this.m_bodies = [];\n this.m_contacts = [];\n this.m_joints = [];\n }\n\n clear(): void {\n this.m_stack.length = 0;\n this.m_bodies.length = 0;\n this.m_contacts.length = 0;\n this.m_joints.length = 0;\n }\n\n addBody(body: Body): void {\n _ASSERT && console.assert(body instanceof Body, 'Not a Body!', body);\n this.m_bodies.push(body);\n // why?\n // body.c_position.c.setZero();\n // body.c_position.a = 0;\n // body.c_velocity.v.setZero();\n // body.c_velocity.w = 0;\n }\n\n addContact(contact: Contact): void {\n // _ASSERT && console.assert(contact instanceof Contact, 'Not a Contact!', contact);\n this.m_contacts.push(contact);\n }\n\n addJoint(joint: Joint): void {\n _ASSERT && console.assert(joint instanceof Joint, 'Not a Joint!', joint);\n this.m_joints.push(joint);\n }\n\n solveWorld(step: TimeStep): void {\n const world = this.m_world;\n\n // Clear all the island flags.\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n }\n for (let c = world.m_contactList; c; c = c.m_next) {\n c.m_islandFlag = false;\n }\n for (let j = world.m_jointList; j; j = j.m_next) {\n j.m_islandFlag = false;\n }\n\n // Build and simulate all awake islands.\n const stack = this.m_stack;\n let loop = -1;\n for (let seed = world.m_bodyList; seed; seed = seed.m_next) {\n loop++;\n if (seed.m_islandFlag) {\n continue;\n }\n\n if (seed.isAwake() == false || seed.isActive() == false) {\n continue;\n }\n\n // The seed can be dynamic or kinematic.\n if (seed.isStatic()) {\n continue;\n }\n\n // Reset island and stack.\n this.clear();\n\n stack.push(seed);\n\n seed.m_islandFlag = true;\n\n // Perform a depth first search (DFS) on the constraint graph.\n while (stack.length > 0) {\n // Grab the next body off the stack and add it to the island.\n const b = stack.pop();\n _ASSERT && console.assert(b.isActive() == true);\n this.addBody(b);\n\n // Make sure the body is awake.\n b.setAwake(true);\n\n // To keep islands as small as possible, we don't\n // propagate islands across static bodies.\n if (b.isStatic()) {\n continue;\n }\n\n // Search all contacts connected to this body.\n for (let ce = b.m_contactList; ce; ce = ce.next) {\n const contact = ce.contact;\n\n // Has this contact already been added to an island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Is this contact solid and touching?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n this.addContact(contact);\n contact.m_islandFlag = true;\n\n const other = ce.other;\n\n // Was the other body already added to this island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && console.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n\n // Search all joints connect to this body.\n for (let je = b.m_jointList; je; je = je.next) {\n if (je.joint.m_islandFlag == true) {\n continue;\n }\n\n const other = je.other;\n\n // Don't simulate joints connected to inactive bodies.\n if (other.isActive() == false) {\n continue;\n }\n\n this.addJoint(je.joint);\n je.joint.m_islandFlag = true;\n\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && console.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n }\n\n this.solveIsland(step);\n\n // Post solve cleanup.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n // Allow static bodies to participate in other islands.\n // TODO: are they added at all?\n const b = this.m_bodies[i];\n if (b.isStatic()) {\n b.m_islandFlag = false;\n }\n }\n }\n }\n\n solveIsland(step: TimeStep): void {\n // B2: Island Solve\n const world = this.m_world;\n const gravity = world.m_gravity;\n const allowSleep = world.m_allowSleep;\n\n const h = step.dt;\n\n // Integrate velocities and apply damping. Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.m_sweep.c);\n const a = body.m_sweep.a;\n const v = Vec2.clone(body.m_linearVelocity);\n let w = body.m_angularVelocity;\n\n // Store positions for continuous collision.\n body.m_sweep.c0.setVec2(body.m_sweep.c);\n body.m_sweep.a0 = body.m_sweep.a;\n\n if (body.isDynamic()) {\n // Integrate velocities.\n v.addMul(h * body.m_gravityScale, gravity);\n v.addMul(h * body.m_invMass, body.m_force);\n w += h * body.m_invI * body.m_torque;\n /**\n *
\n         * Apply damping.\n         * ODE: dv/dt + c * v = 0\n         * Solution: v(t) = v0 * exp(-c * t)\n         * Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)\n         * v2 = exp(-c * dt) * v1\n         * Pade approximation:\n         * v2 = v1 * 1 / (1 + c * dt)\n         * 
\n */\n v.mul(1.0 / (1.0 + h * body.m_linearDamping));\n w *= 1.0 / (1.0 + h * body.m_angularDamping);\n }\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(step);\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(step);\n }\n\n if (step.warmStarting) {\n // Warm start.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.warmStartConstraint(step);\n }\n }\n\n for (let i = 0; i < this.m_joints.length; ++i) {\n const joint = this.m_joints[i];\n joint.initVelocityConstraints(step);\n }\n\n // Solve velocity constraints\n for (let i = 0; i < step.velocityIterations; ++i) {\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n joint.solveVelocityConstraints(step);\n }\n\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(step);\n }\n }\n\n // Store impulses for warm starting\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.storeConstraintImpulses(step);\n }\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.lengthSquared(translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c.setVec2(c);\n body.c_position.a = a;\n body.c_velocity.v.setVec2(v);\n body.c_velocity.w = w;\n }\n\n // Solve position constraints\n let positionSolved = false;\n for (let i = 0; i < step.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraint(step);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -3.0 * Settings.linearSlop;\n\n let jointsOkay = true;\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n const jointOkay = joint.solvePositionConstraints(step);\n jointsOkay = jointsOkay && jointOkay;\n }\n\n if (contactsOkay && jointsOkay) {\n // Exit early if the position errors are small.\n positionSolved = true;\n break;\n }\n }\n\n // Copy state buffers back to the bodies\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n body.m_sweep.c.setVec2(body.c_position.c);\n body.m_sweep.a = body.c_position.a;\n body.m_linearVelocity.setVec2(body.c_velocity.v);\n body.m_angularVelocity = body.c_velocity.w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n\n if (allowSleep) {\n let minSleepTime = Infinity;\n\n const linTolSqr = Settings.linearSleepToleranceSqr;\n const angTolSqr = Settings.angularSleepToleranceSqr;\n\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n if (body.isStatic()) {\n continue;\n }\n\n if ((body.m_autoSleepFlag == false)\n || (body.m_angularVelocity * body.m_angularVelocity > angTolSqr)\n || (Vec2.lengthSquared(body.m_linearVelocity) > linTolSqr)) {\n body.m_sleepTime = 0.0;\n minSleepTime = 0.0;\n } else {\n body.m_sleepTime += h;\n minSleepTime = Math.min(minSleepTime, body.m_sleepTime);\n }\n }\n\n if (minSleepTime >= Settings.timeToSleep && positionSolved) {\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.setAwake(false);\n }\n }\n }\n }\n\n /**\n * Find TOI contacts and solve them.\n */\n solveWorldTOI(step: TimeStep): void {\n const world = this.m_world;\n\n if (world.m_stepComplete) {\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n b.m_sweep.alpha0 = 0.0;\n }\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Invalidate TOI\n c.m_toiFlag = false;\n c.m_islandFlag = false;\n c.m_toiCount = 0;\n c.m_toi = 1.0;\n }\n }\n\n // Find TOI events and solve them.\n while (true) {\n // Find the first TOI.\n let minContact = null; // Contact\n let minAlpha = 1.0;\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Is this contact disabled?\n if (c.isEnabled() == false) {\n continue;\n }\n\n // Prevent excessive sub-stepping.\n if (c.m_toiCount > Settings.maxSubSteps) {\n continue;\n }\n\n let alpha = 1.0;\n if (c.m_toiFlag) {\n // This contact has a valid cached TOI.\n alpha = c.m_toi;\n } else {\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n // Is there a sensor?\n if (fA.isSensor() || fB.isSensor()) {\n continue;\n }\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n _ASSERT && console.assert(bA.isDynamic() || bB.isDynamic());\n\n const activeA = bA.isAwake() && !bA.isStatic();\n const activeB = bB.isAwake() && !bB.isStatic();\n\n // Is at least one body active (awake and dynamic or kinematic)?\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const collideA = bA.isBullet() || !bA.isDynamic();\n const collideB = bB.isBullet() || !bB.isDynamic();\n\n // Are these two non-bullet dynamic bodies?\n if (collideA == false && collideB == false) {\n continue;\n }\n\n // Compute the TOI for this contact.\n // Put the sweeps onto the same time interval.\n let alpha0 = bA.m_sweep.alpha0;\n\n if (bA.m_sweep.alpha0 < bB.m_sweep.alpha0) {\n alpha0 = bB.m_sweep.alpha0;\n bA.m_sweep.advance(alpha0);\n } else if (bB.m_sweep.alpha0 < bA.m_sweep.alpha0) {\n alpha0 = bA.m_sweep.alpha0;\n bB.m_sweep.advance(alpha0);\n }\n\n _ASSERT && console.assert(alpha0 < 1.0);\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const sweepA = bA.m_sweep;\n const sweepB = bB.m_sweep;\n\n // Compute the time of impact in interval [0, minTOI]\n const input = new TOIInput(); // TODO: reuse\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.sweepA.set(bA.m_sweep);\n input.sweepB.set(bB.m_sweep);\n input.tMax = 1.0;\n\n const output = new TOIOutput(); // TODO: reuse\n TimeOfImpact(output, input);\n\n // Beta is the fraction of the remaining portion of the [time?].\n const beta = output.t;\n if (output.state == TOIOutputState.e_touching) {\n alpha = Math.min(alpha0 + (1.0 - alpha0) * beta, 1.0);\n } else {\n alpha = 1.0;\n }\n\n c.m_toi = alpha;\n c.m_toiFlag = true;\n }\n\n if (alpha < minAlpha) {\n // This is the minimum TOI found so far.\n minContact = c;\n minAlpha = alpha;\n }\n }\n\n if (minContact == null || 1.0 - 10.0 * Math.EPSILON < minAlpha) {\n // No more TOI events. Done!\n world.m_stepComplete = true;\n break;\n }\n\n // Advance the bodies to the TOI.\n const fA = minContact.getFixtureA();\n const fB = minContact.getFixtureB();\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const backup1 = bA.m_sweep.clone();\n const backup2 = bB.m_sweep.clone();\n\n bA.advance(minAlpha);\n bB.advance(minAlpha);\n\n // The TOI contact likely has some new contact points.\n minContact.update(world);\n minContact.m_toiFlag = false;\n ++minContact.m_toiCount;\n\n // Is the contact solid?\n if (minContact.isEnabled() == false || minContact.isTouching() == false) {\n // Restore the sweeps.\n minContact.setEnabled(false);\n bA.m_sweep.set(backup1);\n bB.m_sweep.set(backup2);\n bA.synchronizeTransform();\n bB.synchronizeTransform();\n continue;\n }\n\n bA.setAwake(true);\n bB.setAwake(true);\n\n // Build the island\n this.clear();\n this.addBody(bA);\n this.addBody(bB);\n this.addContact(minContact);\n\n bA.m_islandFlag = true;\n bB.m_islandFlag = true;\n minContact.m_islandFlag = true;\n\n // Get contacts on bodyA and bodyB.\n const bodies = [ bA, bB ];\n for (let i = 0; i < bodies.length; ++i) {\n const body = bodies[i];\n if (body.isDynamic()) {\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n // if (this.m_bodyCount == this.m_bodyCapacity) { break; }\n // if (this.m_contactCount == this.m_contactCapacity) { break; }\n\n const contact = ce.contact;\n\n // Has this contact already been added to the island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Only add if either is static, kinematic or bullet.\n const other = ce.other;\n if (other.isDynamic() && !body.isBullet() && !other.isBullet()) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n // Tentatively advance the body to the TOI.\n const backup = other.m_sweep.clone();\n if (other.m_islandFlag == false) {\n other.advance(minAlpha);\n }\n\n // Update the contact points\n contact.update(world);\n\n // Was the contact disabled by the user?\n // Are there contact points?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n other.m_sweep.set(backup);\n other.synchronizeTransform();\n continue;\n }\n\n // Add the contact to the island\n contact.m_islandFlag = true;\n this.addContact(contact);\n\n // Has the other body already been added to the island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // Add the other body to the island.\n other.m_islandFlag = true;\n\n if (!other.isStatic()) {\n other.setAwake(true);\n }\n\n this.addBody(other);\n }\n }\n }\n\n s_subStep.reset((1.0 - minAlpha) * step.dt);\n s_subStep.dtRatio = 1.0;\n s_subStep.positionIterations = 20;\n s_subStep.velocityIterations = step.velocityIterations;\n s_subStep.warmStarting = false;\n\n this.solveIslandTOI(s_subStep, bA, bB);\n\n // Reset island flags and synchronize broad-phase proxies.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.m_islandFlag = false;\n\n if (!body.isDynamic()) {\n continue;\n }\n\n body.synchronizeFixtures();\n\n // Invalidate all contact TOIs on this displaced body.\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n ce.contact.m_toiFlag = false;\n ce.contact.m_islandFlag = false;\n }\n }\n\n // Commit fixture proxy movements to the broad-phase so that new contacts\n // are created.\n // Also, some contacts can be destroyed.\n world.findNewContacts();\n\n if (world.m_subStepping) {\n world.m_stepComplete = false;\n break;\n }\n }\n }\n\n solveIslandTOI(subStep: TimeStep, toiA: Body, toiB: Body): void {\n const world = this.m_world;\n\n // Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.c_position.c.setVec2(body.m_sweep.c);\n body.c_position.a = body.m_sweep.a;\n body.c_velocity.v.setVec2(body.m_linearVelocity);\n body.c_velocity.w = body.m_angularVelocity;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(subStep);\n }\n\n // Solve position constraints.\n for (let i = 0; i < subStep.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraintTOI(subStep, toiA, toiB);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -1.5 * Settings.linearSlop;\n if (contactsOkay) {\n break;\n }\n }\n\n if (false) {\n // Is the new position really safe?\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const c = this.m_contacts[i];\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const input = new DistanceInput();\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.transformA = bA.getTransform();\n input.transformB = bB.getTransform();\n input.useRadii = false;\n\n const output = new DistanceOutput();\n const cache = new SimplexCache();\n Distance(output, cache, input);\n\n if (output.distance == 0 || cache.count == 3) {\n cache.count += 0;\n }\n }\n }\n\n // Leap of faith to new safe state.\n toiA.m_sweep.c0.setVec2(toiA.c_position.c);\n toiA.m_sweep.a0 = toiA.c_position.a;\n toiB.m_sweep.c0.setVec2(toiB.c_position.c);\n toiB.m_sweep.a0 = toiB.c_position.a;\n\n // No warm starting is needed for TOI events because warm\n // starting impulses were applied in the discrete solver.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(subStep);\n }\n\n // Solve velocity constraints.\n for (let i = 0; i < subStep.velocityIterations; ++i) {\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(subStep);\n }\n }\n\n // Don't store the TOI contact forces for warm starting\n // because they can be quite large.\n\n const h = subStep.dt;\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.dot(translation, translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n\n // Sync bodies\n body.m_sweep.c = c;\n body.m_sweep.a = a;\n body.m_linearVelocity = v;\n body.m_angularVelocity = w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n }\n\n /** @internal */\n postSolveIsland(): void {\n for (let c = 0; c < this.m_contacts.length; ++c) {\n const contact = this.m_contacts[c];\n this.m_world.postSolve(contact, contact.m_impulse);\n }\n }\n}\n\n// @ts-ignore\nSolver.TimeStep = TimeStep;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from './Vec2';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 2-by-2 matrix. Stored in column-major order.\n */\nexport class Mat22 {\n ex: Vec2;\n ey: Vec2;\n\n constructor(a: number, b: number, c: number, d: number);\n constructor(a: { x: number; y: number }, b: { x: number; y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(a?, b?, c?, d?) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec2.clone(a);\n this.ey = Vec2.clone(b);\n } else if (typeof a === 'number') {\n this.ex = Vec2.neo(a, c);\n this.ey = Vec2.neo(b, d);\n } else {\n this.ex = Vec2.zero();\n this.ey = Vec2.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.ex) && Vec2.isValid(obj.ey);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Mat22.isValid(o), 'Invalid Mat22!', o);\n }\n\n set(a: Mat22): void;\n set(a: Vec2, b: Vec2): void;\n set(a: number, b: number, c: number, d: number): void;\n // tslint:disable-next-line:typedef\n set(a, b?, c?, d?): void {\n if (typeof a === 'number' && typeof b === 'number' && typeof c === 'number'\n && typeof d === 'number') {\n this.ex.setNum(a, c);\n this.ey.setNum(b, d);\n\n } else if (typeof a === 'object' && typeof b === 'object') {\n this.ex.setVec2(a);\n this.ey.setVec2(b);\n\n } else if (typeof a === 'object') {\n _ASSERT && Mat22.assert(a);\n this.ex.setVec2(a.ex);\n this.ey.setVec2(a.ey);\n\n } else {\n _ASSERT && console.assert(false);\n }\n }\n\n setIdentity(): void {\n this.ex.x = 1.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 1.0;\n }\n\n setZero(): void {\n this.ex.x = 0.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 0.0;\n }\n\n getInverse(): Mat22 {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const imx = new Mat22();\n imx.ex.x = det * d;\n imx.ey.x = -det * b;\n imx.ex.y = -det * c;\n imx.ey.y = det * a;\n return imx;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const w = Vec2.zero();\n w.x = det * (d * v.x - b * v.y);\n w.y = det * (a * v.y - c * v.x);\n return w;\n }\n\n /**\n * Multiply a matrix times a vector. If a rotation matrix is provided, then this\n * transforms the vector from one frame to another.\n */\n static mul(mx: Mat22, my: Mat22): Mat22;\n static mul(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(mx, v) {\n if (v && 'x' in v && 'y' in v) {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n }\n\n static mulMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n /**\n * Multiply a matrix transpose times a vector. If a rotation matrix is provided,\n * then this transforms the vector from one frame to another (inverse\n * transform).\n */\n static mulT(mx: Mat22, my: Mat22): Mat22;\n static mulT(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(mx, v) {\n if (v && 'x' in v && 'y' in v) { // Vec2\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulTVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n }\n\n static mulTMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n static abs(mx: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n return new Mat22(Vec2.abs(mx.ex), Vec2.abs(mx.ey));\n }\n\n static add(mx1: Mat22, mx2: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx1);\n _ASSERT && Mat22.assert(mx2);\n return new Mat22(Vec2.add(mx1.ex, mx2.ex), Vec2.add(mx1.ey, mx2.ey));\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { Transform } from '../common/Transform';\nimport { math as Math } from '../common/Math';\nimport { Rot } from '../common/Rot';\n\nexport enum ManifoldType {\n e_circles = 0,\n e_faceA = 1,\n e_faceB = 2\n}\n\nexport enum ContactFeatureType {\n e_vertex = 0,\n e_face = 1\n}\n\n/**\n * This is used for determining the state of contact points.\n */\n export enum PointState {\n /** Point does not exist */\n nullState = 0,\n /** Point was added in the update */\n addState = 1,\n /** Point persisted across the update */\n persistState = 2,\n /** Point was removed in the update */\n removeState = 3\n}\n\n/**\n * Used for computing contact manifolds.\n */\n export class ClipVertex {\n v: Vec2 = Vec2.zero();\n id: ContactID = new ContactID();\n\n set(o: ClipVertex): void {\n this.v.setVec2(o.v);\n this.id.set(o.id);\n }\n}\n\n/**\n * A manifold for two touching convex shapes. Manifolds are created in `evaluate`\n * method of Contact subclasses.\n *\n * Supported manifold types are e_faceA or e_faceB for clip point versus plane\n * with radius and e_circles point versus point with radius.\n *\n * We store contacts in this way so that position correction can account for\n * movement, which is critical for continuous physics. All contact scenarios\n * must be expressed in one of these types. This structure is stored across time\n * steps, so we keep it small.\n *\n * @prop type e_circle, e_faceA, e_faceB\n * @prop localPoint Usage depends on manifold type:
\n * e_circles: the local center of circleA
\n * e_faceA: the center of faceA
\n * e_faceB: the center of faceB\n * @prop localNormal Usage depends on manifold type:
\n * e_circles: not used
\n * e_faceA: the normal on polygonA
\n * e_faceB: the normal on polygonB\n * @prop points The points of contact {ManifoldPoint[]}\n * @prop pointCount The number of manifold points\n */\nexport class Manifold {\n type: ManifoldType;\n localNormal: Vec2 = Vec2.zero();\n localPoint: Vec2 = Vec2.zero();\n points: ManifoldPoint[] = [ new ManifoldPoint(), new ManifoldPoint() ];\n pointCount: number = 0;\n\n /**\n * Evaluate the manifold with supplied transforms. This assumes modest motion\n * from the original state. This does not change the point count, impulses, etc.\n * The radii must come from the shapes that generated the manifold.\n */\n getWorldManifold(wm: WorldManifold | undefined, xfA: Transform, radiusA: number, xfB: Transform, radiusB: number): WorldManifold {\n if (this.pointCount == 0) {\n return;\n }\n\n wm = wm || new WorldManifold();\n\n let normal = wm.normal;\n const points = wm.points;\n const separations = wm.separations;\n\n // TODO: improve\n switch (this.type) {\n case ManifoldType.e_circles: {\n normal = Vec2.neo(1.0, 0.0);\n const pointA = Transform.mulVec2(xfA, this.localPoint);\n const pointB = Transform.mulVec2(xfB, this.points[0].localPoint);\n const dist = Vec2.sub(pointB, pointA);\n if (Vec2.lengthSquared(dist) > Math.EPSILON * Math.EPSILON) {\n normal.setVec2(dist);\n normal.normalize();\n }\n const cA = pointA.clone().addMul(radiusA, normal);\n const cB = pointB.clone().addMul(-radiusB, normal);\n points[0] = Vec2.mid(cA, cB);\n separations[0] = Vec2.dot(Vec2.sub(cB, cA), normal);\n points.length = 1;\n separations.length = 1;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfA, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfB, this.points[i].localPoint);\n const cA = Vec2.clone(clipPoint).addMul(radiusA - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cB = Vec2.clone(clipPoint).subMul(radiusB, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cB, cA), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfB, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfA, this.points[i].localPoint);\n const cB = Vec2.combine(1, clipPoint, radiusB - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cA = Vec2.combine(1, clipPoint, -radiusA, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cA, cB), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n // Ensure normal points from A to B.\n normal.mul(-1);\n break;\n }\n }\n\n wm.normal = normal;\n wm.points = points;\n wm.separations = separations;\n return wm;\n }\n\n static clipSegmentToLine = clipSegmentToLine;\n static ClipVertex = ClipVertex;\n static getPointStates = getPointStates;\n static PointState = PointState;\n}\n\n/**\n * A manifold point is a contact point belonging to a contact manifold. It holds\n * details related to the geometry and dynamics of the contact points.\n *\n * This structure is stored across time steps, so we keep it small.\n *\n * Note: impulses are used for internal caching and may not provide reliable\n * contact forces, especially for high speed collisions.\n */\nexport class ManifoldPoint {\n /**\n * Usage depends on manifold type.\n * e_circles: the local center of circleB,\n * e_faceA: the local center of cirlceB or the clip point of polygonB,\n * e_faceB: the clip point of polygonA.\n */\n localPoint: Vec2 = Vec2.zero();\n /**\n * The non-penetration impulse\n */\n normalImpulse: number = 0;\n /**\n * The friction impulse\n */\n tangentImpulse: number = 0;\n /**\n * Uniquely identifies a contact point between two shapes to facilatate warm starting\n */\n id: ContactID = new ContactID();\n}\n\n/**\n * Contact ids to facilitate warm starting.\n */\nexport class ContactID {\n cf: ContactFeature = new ContactFeature();\n\n /**\n * Used to quickly compare contact ids.\n */\n get key(): number {\n return this.cf.indexA + this.cf.indexB * 4 + this.cf.typeA * 16 + this.cf.typeB * 64;\n }\n\n set(o: ContactID): void {\n // this.key = o.key;\n this.cf.set(o.cf);\n }\n}\n\n/**\n * The features that intersect to form the contact point.\n */\nexport class ContactFeature {\n /**\n * Feature index on shapeA\n */\n indexA: number;\n /**\n * Feature index on shapeB\n */\n indexB: number;\n /**\n * The feature type on shapeA\n */\n typeA: ContactFeatureType;\n /**\n * The feature type on shapeB\n */\n typeB: ContactFeatureType;\n set(o: ContactFeature): void {\n this.indexA = o.indexA;\n this.indexB = o.indexB;\n this.typeA = o.typeA;\n this.typeB = o.typeB;\n }\n}\n\n/**\n * This is used to compute the current state of a contact manifold.\n */\nexport class WorldManifold {\n /**\n * World vector pointing from A to B\n */\n normal: Vec2;\n /**\n * World contact point (point of intersection)\n */\n points: Vec2[] = []; // [maxManifoldPoints]\n /**\n * A negative value indicates overlap, in meters\n */\n separations: number[] = []; // [maxManifoldPoints]\n}\n\n/**\n * Compute the point states given two manifolds. The states pertain to the\n * transition from manifold1 to manifold2. So state1 is either persist or remove\n * while state2 is either add or persist.\n */\nexport function getPointStates(\n state1: PointState[],\n state2: PointState[],\n manifold1: Manifold,\n manifold2: Manifold\n): void {\n // state1, state2: PointState[Settings.maxManifoldPoints]\n\n // for (var i = 0; i < Settings.maxManifoldPoints; ++i) {\n // state1[i] = PointState.nullState;\n // state2[i] = PointState.nullState;\n // }\n\n // Detect persists and removes.\n for (let i = 0; i < manifold1.pointCount; ++i) {\n const id = manifold1.points[i].id;\n\n state1[i] = PointState.removeState;\n\n for (let j = 0; j < manifold2.pointCount; ++j) {\n if (manifold2.points[j].id.key == id.key) {\n state1[i] = PointState.persistState;\n break;\n }\n }\n }\n\n // Detect persists and adds.\n for (let i = 0; i < manifold2.pointCount; ++i) {\n const id = manifold2.points[i].id;\n\n state2[i] = PointState.addState;\n\n for (let j = 0; j < manifold1.pointCount; ++j) {\n if (manifold1.points[j].id.key == id.key) {\n state2[i] = PointState.persistState;\n break;\n }\n }\n }\n}\n\n/**\n * Clipping for contact manifolds. Sutherland-Hodgman clipping.\n */\nexport function clipSegmentToLine(\n vOut: ClipVertex[],\n vIn: ClipVertex[],\n normal: Vec2,\n offset: number,\n vertexIndexA: number\n): number {\n // Start with no output points\n let numOut = 0;\n\n // Calculate the distance of end points to the line\n const distance0 = Vec2.dot(normal, vIn[0].v) - offset;\n const distance1 = Vec2.dot(normal, vIn[1].v) - offset;\n\n // If the points are behind the plane\n if (distance0 <= 0.0)\n vOut[numOut++].set(vIn[0]);\n if (distance1 <= 0.0)\n vOut[numOut++].set(vIn[1]);\n\n // If the points are on different sides of the plane\n if (distance0 * distance1 < 0.0) {\n // Find intersection point of edge and plane\n const interp = distance0 / (distance0 - distance1);\n vOut[numOut].v.setCombine(1 - interp, vIn[0].v, interp, vIn[1].v);\n\n // VertexA is hitting edgeB.\n vOut[numOut].id.cf.indexA = vertexIndexA;\n vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB;\n vOut[numOut].id.cf.typeA = ContactFeatureType.e_vertex;\n vOut[numOut].id.cf.typeB = ContactFeatureType.e_face;\n ++numOut;\n }\n\n return numOut;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { ShapeType } from \"../collision/Shape\";\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Transform } from '../common/Transform';\nimport { Mat22 } from '../common/Mat22';\nimport { Rot } from '../common/Rot';\nimport { Settings } from '../Settings';\nimport { Manifold, ManifoldType, WorldManifold } from '../collision/Manifold';\nimport { testOverlap } from '../collision/Distance';\nimport { Fixture } from \"./Fixture\";\nimport { Body } from \"./Body\";\nimport { ContactImpulse, TimeStep } from \"./Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst DEBUG_SOLVER = false;\n\n/**\n * A contact edge is used to connect bodies and contacts together in a contact\n * graph where each body is a node and each contact is an edge. A contact edge\n * belongs to a doubly linked list maintained in each attached body. Each\n * contact has two contact nodes, one for each attached body.\n *\n * @prop {Contact} contact The contact\n * @prop {ContactEdge} prev The previous contact edge in the body's contact list\n * @prop {ContactEdge} next The next contact edge in the body's contact list\n * @prop {Body} other Provides quick access to the other body attached.\n */\nexport class ContactEdge {\n contact: Contact;\n prev: ContactEdge | undefined;\n next: ContactEdge | undefined;\n other: Body | undefined;\n constructor(contact: Contact) {\n this.contact = contact;\n }\n}\n\nexport type EvaluateFunction = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void;\n\nexport type ContactCallback = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void /* & { destroyFcn?: (contact: Contact) => void }*/;\n\n\n/**\n * Friction mixing law. The idea is to allow either fixture to drive the\n * restitution to zero. For example, anything slides on ice.\n */\nexport function mixFriction(friction1: number, friction2: number): number {\n return Math.sqrt(friction1 * friction2);\n}\n\n/**\n * Restitution mixing law. The idea is allow for anything to bounce off an\n * inelastic surface. For example, a superball bounces on anything.\n */\nexport function mixRestitution(restitution1: number, restitution2: number): number {\n return restitution1 > restitution2 ? restitution1 : restitution2;\n}\n\n// TODO: move this to Settings?\nconst s_registers = [];\n\n// TODO: merge with ManifoldPoint?\nexport class VelocityConstraintPoint {\n rA: Vec2 = Vec2.zero();\n rB: Vec2 = Vec2.zero();\n normalImpulse: number = 0;\n tangentImpulse: number = 0;\n normalMass: number = 0;\n tangentMass: number = 0;\n velocityBias: number = 0;\n}\n\n/**\n * The class manages contact between two shapes. A contact exists for each\n * overlapping AABB in the broad-phase (except if filtered). Therefore a contact\n * object may exist that has no contact points.\n */\nexport class Contact {\n /** @internal */\n m_nodeA: ContactEdge;\n /** @internal */\n m_nodeB: ContactEdge;\n /** @internal */\n m_fixtureA: Fixture;\n /** @internal */\n m_fixtureB: Fixture;\n /** @internal */\n m_indexA: number;\n /** @internal */\n m_indexB: number;\n /** @internal */\n m_evaluateFcn: EvaluateFunction;\n /** @internal */\n m_manifold: Manifold = new Manifold();\n /** @internal */\n m_prev: Contact | null = null;\n /** @internal */\n m_next: Contact | null = null;\n /** @internal */\n m_toi: number = 1.0;\n /** @internal */\n m_toiCount: number = 0;\n /** @internal This contact has a valid TOI in m_toi */\n m_toiFlag: boolean = false;\n /** @internal */\n m_friction: number;\n /** @internal */\n m_restitution: number;\n /** @internal */\n m_tangentSpeed: number = 0.0;\n /** @internal This contact can be disabled (by user) */\n m_enabledFlag: boolean = true;\n /** @internal Used when crawling contact graph when forming islands. */\n m_islandFlag: boolean = false;\n /** @internal Set when the shapes are touching. */\n m_touchingFlag: boolean = false;\n /** @internal This contact needs filtering because a fixture filter was changed. */\n m_filterFlag: boolean = false;\n /** @internal This bullet contact had a TOI event */\n m_bulletHitFlag: boolean = false;\n\n /** @internal Contact reporting impulse object cache */\n m_impulse: ContactImpulse = new ContactImpulse(this);\n\n // VelocityConstraint\n /** @internal */ v_points: VelocityConstraintPoint[] = []; // [maxManifoldPoints];\n /** @internal */ v_normal: Vec2 = Vec2.zero();\n /** @internal */ v_normalMass: Mat22 = new Mat22();\n /** @internal */ v_K: Mat22 = new Mat22();\n /** @internal */ v_pointCount: number;\n /** @internal */ v_tangentSpeed: number | undefined;\n /** @internal */ v_friction: number | undefined;\n /** @internal */ v_restitution: number | undefined;\n /** @internal */ v_invMassA: number | undefined;\n /** @internal */ v_invMassB: number | undefined;\n /** @internal */ v_invIA: number | undefined;\n /** @internal */ v_invIB: number | undefined;\n\n // PositionConstraint\n /** @internal */ p_localPoints: Vec2[] = []; // [maxManifoldPoints];\n /** @internal */ p_localNormal: Vec2 = Vec2.zero();\n /** @internal */ p_localPoint: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterA: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterB: Vec2 = Vec2.zero();\n /** @internal */ p_type: ManifoldType | undefined;\n /** @internal */ p_radiusA: number | undefined;\n /** @internal */ p_radiusB: number | undefined;\n /** @internal */ p_pointCount: number | undefined;\n /** @internal */ p_invMassA: number | undefined;\n /** @internal */ p_invMassB: number | undefined;\n /** @internal */ p_invIA: number | undefined;\n /** @internal */ p_invIB: number | undefined;\n\n constructor(fA: Fixture, indexA: number, fB: Fixture, indexB: number, evaluateFcn: EvaluateFunction) {\n // Nodes for connecting bodies.\n this.m_nodeA = new ContactEdge(this);\n this.m_nodeB = new ContactEdge(this);\n\n this.m_fixtureA = fA;\n this.m_fixtureB = fB;\n\n this.m_indexA = indexA;\n this.m_indexB = indexB;\n\n this.m_evaluateFcn = evaluateFcn;\n\n this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction);\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution);\n }\n\n initConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const shapeA = fixtureA.getShape();\n const shapeB = fixtureB.getShape();\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const manifold = this.getManifold();\n\n const pointCount = manifold.pointCount;\n _ASSERT && console.assert(pointCount > 0);\n\n this.v_invMassA = bodyA.m_invMass;\n this.v_invMassB = bodyB.m_invMass;\n this.v_invIA = bodyA.m_invI;\n this.v_invIB = bodyB.m_invI;\n\n this.v_friction = this.m_friction;\n this.v_restitution = this.m_restitution;\n this.v_tangentSpeed = this.m_tangentSpeed;\n\n this.v_pointCount = pointCount;\n\n this.v_K.setZero();\n this.v_normalMass.setZero();\n\n this.p_invMassA = bodyA.m_invMass;\n this.p_invMassB = bodyB.m_invMass;\n this.p_invIA = bodyA.m_invI;\n this.p_invIB = bodyB.m_invI;\n this.p_localCenterA = Vec2.clone(bodyA.m_sweep.localCenter);\n this.p_localCenterB = Vec2.clone(bodyB.m_sweep.localCenter);\n\n this.p_radiusA = shapeA.m_radius;\n this.p_radiusB = shapeB.m_radius;\n\n this.p_type = manifold.type;\n this.p_localNormal = Vec2.clone(manifold.localNormal);\n this.p_localPoint = Vec2.clone(manifold.localPoint);\n this.p_pointCount = pointCount;\n\n for (let j = 0; j < pointCount; ++j) {\n const cp = manifold.points[j];\n const vcp = this.v_points[j] = new VelocityConstraintPoint();\n\n if (step.warmStarting) {\n vcp.normalImpulse = step.dtRatio * cp.normalImpulse;\n vcp.tangentImpulse = step.dtRatio * cp.tangentImpulse;\n\n } else {\n vcp.normalImpulse = 0.0;\n vcp.tangentImpulse = 0.0;\n }\n\n vcp.rA.setZero();\n vcp.rB.setZero();\n vcp.normalMass = 0.0;\n vcp.tangentMass = 0.0;\n vcp.velocityBias = 0.0;\n\n this.p_localPoints[j] = Vec2.clone(cp.localPoint);\n\n }\n }\n\n /**\n * Get the contact manifold. Do not modify the manifold unless you understand\n * the internals of the library.\n */\n getManifold(): Manifold {\n return this.m_manifold;\n }\n\n /**\n * Get the world manifold.\n */\n getWorldManifold(worldManifold: WorldManifold | null | undefined): WorldManifold | undefined {\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n\n return this.m_manifold.getWorldManifold(worldManifold, bodyA.getTransform(),\n shapeA.m_radius, bodyB.getTransform(), shapeB.m_radius);\n }\n\n /**\n * Enable/disable this contact. This can be used inside the pre-solve contact\n * listener. The contact is only disabled for the current time step (or sub-step\n * in continuous collisions).\n */\n setEnabled(flag: boolean): void {\n this.m_enabledFlag = !!flag;\n }\n\n /**\n * Has this contact been disabled?\n */\n isEnabled(): boolean {\n return this.m_enabledFlag;\n }\n\n /**\n * Is this contact touching?\n */\n isTouching(): boolean {\n return this.m_touchingFlag;\n }\n\n /**\n * Get the next contact in the world's contact list.\n */\n getNext(): Contact | null {\n return this.m_next;\n }\n\n /**\n * Get fixture A in this contact.\n */\n getFixtureA(): Fixture {\n return this.m_fixtureA;\n }\n\n /**\n * Get fixture B in this contact.\n */\n getFixtureB(): Fixture {\n return this.m_fixtureB;\n }\n\n /**\n * Get the child primitive index for fixture A.\n */\n getChildIndexA(): number {\n return this.m_indexA;\n }\n\n /**\n * Get the child primitive index for fixture B.\n */\n getChildIndexB(): number {\n return this.m_indexB;\n }\n\n /**\n * Flag this contact for filtering. Filtering will occur the next time step.\n */\n flagForFiltering(): void {\n this.m_filterFlag = true;\n }\n\n /**\n * Override the default friction mixture. You can call this in\n * ContactListener.preSolve. This value persists until set or reset.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the friction.\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Reset the friction mixture to the default value.\n */\n resetFriction(): void {\n this.m_friction = mixFriction(this.m_fixtureA.m_friction,\n this.m_fixtureB.m_friction);\n }\n\n /**\n * Override the default restitution mixture. You can call this in\n * ContactListener.preSolve. The value persists until you set or reset.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Get the restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Reset the restitution to the default value.\n */\n resetRestitution(): void {\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution,\n this.m_fixtureB.m_restitution);\n }\n\n /**\n * Set the desired tangent speed for a conveyor belt behavior. In meters per\n * second.\n */\n setTangentSpeed(speed: number): void {\n this.m_tangentSpeed = speed;\n }\n\n /**\n * Get the desired tangent speed. In meters per second.\n */\n getTangentSpeed(): number {\n return this.m_tangentSpeed;\n }\n\n /**\n * Called by Update method, and implemented by subclasses.\n */\n evaluate(manifold: Manifold, xfA: Transform, xfB: Transform): void {\n this.m_evaluateFcn(manifold, xfA, this.m_fixtureA, this.m_indexA, xfB,\n this.m_fixtureB, this.m_indexB);\n }\n\n /**\n * Updates the contact manifold and touching status.\n *\n * Note: do not assume the fixture AABBs are overlapping or are valid.\n *\n * @param listener.beginContact\n * @param listener.endContact\n * @param listener.preSolve\n */\n update(listener?: {\n beginContact(contact: Contact): void,\n endContact(contact: Contact): void,\n preSolve(contact: Contact, oldManifold: Manifold): void\n }): void {\n\n // Re-enable this contact.\n this.m_enabledFlag = true;\n\n let touching = false;\n const wasTouching = this.m_touchingFlag;\n\n const sensorA = this.m_fixtureA.isSensor();\n const sensorB = this.m_fixtureB.isSensor();\n const sensor = sensorA || sensorB;\n\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const xfA = bodyA.getTransform();\n const xfB = bodyB.getTransform();\n\n let oldManifold;\n\n // Is this contact a sensor?\n if (sensor) {\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n touching = testOverlap(shapeA, this.m_indexA, shapeB, this.m_indexB, xfA, xfB);\n\n // Sensors don't generate manifolds.\n this.m_manifold.pointCount = 0;\n } else {\n\n // TODO reuse manifold\n oldManifold = this.m_manifold;\n this.m_manifold = new Manifold();\n\n this.evaluate(this.m_manifold, xfA, xfB);\n touching = this.m_manifold.pointCount > 0;\n\n // Match old contact ids to new contact ids and copy the\n // stored impulses to warm start the solver.\n for (let i = 0; i < this.m_manifold.pointCount; ++i) {\n const nmp = this.m_manifold.points[i];\n nmp.normalImpulse = 0.0;\n nmp.tangentImpulse = 0.0;\n\n for (let j = 0; j < oldManifold.pointCount; ++j) {\n const omp = oldManifold.points[j];\n if (omp.id.key == nmp.id.key) {\n nmp.normalImpulse = omp.normalImpulse;\n nmp.tangentImpulse = omp.tangentImpulse;\n break;\n }\n }\n }\n\n if (touching != wasTouching) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n }\n\n this.m_touchingFlag = touching;\n\n if (!wasTouching && touching && listener) {\n listener.beginContact(this);\n }\n\n if (wasTouching && !touching && listener) {\n listener.endContact(this);\n }\n\n if (!sensor && touching && listener) {\n listener.preSolve(this, oldManifold);\n }\n }\n\n solvePositionConstraint(step: TimeStep): number {\n return this._solvePositionConstraint(step);\n }\n\n solvePositionConstraintTOI(step: TimeStep, toiA: Body, toiB: Body): number {\n return this._solvePositionConstraint(step, toiA, toiB);\n }\n\n private _solvePositionConstraint(step: TimeStep, toiA?: Body, toiB?: Body): number {\n const toi: boolean = !!toiA && !!toiB;\n\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n let mA = 0.0;\n let iA = 0.0;\n if (!toi || (bodyA == toiA || bodyA == toiB)) {\n mA = this.p_invMassA;\n iA = this.p_invIA;\n }\n\n let mB = 0.0;\n let iB = 0.0;\n if (!toi || (bodyB == toiA || bodyB == toiB)) {\n mB = this.p_invMassB;\n iB = this.p_invIB;\n }\n\n const cA = Vec2.clone(positionA.c);\n let aA = positionA.a;\n\n const cB = Vec2.clone(positionB.c);\n let aB = positionB.a;\n\n let minSeparation = 0.0;\n\n // Solve normal constraints\n for (let j = 0; j < this.p_pointCount; ++j) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p = Vec2.sub(cA, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p = Vec2.sub(cB, Rot.mulVec2(xfB.q, localCenterB));\n\n // PositionSolverManifold\n let normal;\n let point;\n let separation;\n switch (this.p_type) {\n case ManifoldType.e_circles: {\n const pointA = Transform.mulVec2(xfA, this.p_localPoint);\n const pointB = Transform.mulVec2(xfB, this.p_localPoints[0]);\n normal = Vec2.sub(pointB, pointA);\n normal.normalize();\n point = Vec2.combine(0.5, pointA, 0.5, pointB);\n separation = Vec2.dot(Vec2.sub(pointB, pointA), normal) - this.p_radiusA - this.p_radiusB;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfA, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfB, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfB, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfA, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n\n // Ensure normal points from A to B\n normal.mul(-1);\n break;\n }\n }\n\n const rA = Vec2.sub(point, cA);\n const rB = Vec2.sub(point, cB);\n\n // Track max constraint error.\n minSeparation = Math.min(minSeparation, separation);\n\n const baumgarte = toi ? Settings.toiBaugarte : Settings.baumgarte;\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n // Prevent large corrections and allow slop.\n const C = Math.clamp(baumgarte * (separation + linearSlop), -maxLinearCorrection, 0.0);\n\n // Compute the effective mass.\n const rnA = Vec2.crossVec2Vec2(rA, normal);\n const rnB = Vec2.crossVec2Vec2(rB, normal);\n const K = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n // Compute normal impulse\n const impulse = K > 0.0 ? -C / K : 0.0;\n\n const P = Vec2.mulNumVec2(impulse, normal);\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n\n return minSeparation;\n }\n\n initVelocityConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const radiusA = this.p_radiusA;\n const radiusB = this.p_radiusB;\n const manifold = this.getManifold();\n\n const mA = this.v_invMassA;\n const mB = this.v_invMassB;\n const iA = this.v_invIA;\n const iB = this.v_invIB;\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n const cA = Vec2.clone(positionA.c);\n const aA = positionA.a;\n const vA = Vec2.clone(velocityA.v);\n const wA = velocityA.w;\n\n const cB = Vec2.clone(positionB.c);\n const aB = positionB.a;\n const vB = Vec2.clone(velocityB.v);\n const wB = velocityB.w;\n\n _ASSERT && console.assert(manifold.pointCount > 0);\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p.setCombine(1, cA, -1, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p.setCombine(1, cB, -1, Rot.mulVec2(xfB.q, localCenterB));\n\n const worldManifold = manifold.getWorldManifold(null, xfA, radiusA, xfB, radiusB);\n\n this.v_normal.setVec2(worldManifold.normal);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n vcp.rA.setVec2(Vec2.sub(worldManifold.points[j], cA));\n vcp.rB.setVec2(Vec2.sub(worldManifold.points[j], cB));\n\n const rnA = Vec2.crossVec2Vec2(vcp.rA, this.v_normal);\n const rnB = Vec2.crossVec2Vec2(vcp.rB, this.v_normal);\n\n const kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n vcp.normalMass = kNormal > 0.0 ? 1.0 / kNormal : 0.0;\n\n const tangent = Vec2.crossVec2Num(this.v_normal, 1.0);\n\n const rtA = Vec2.crossVec2Vec2(vcp.rA, tangent);\n const rtB = Vec2.crossVec2Vec2(vcp.rB, tangent);\n\n const kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB;\n\n vcp.tangentMass = kTangent > 0.0 ? 1.0 / kTangent : 0.0;\n\n // Setup a velocity bias for restitution.\n vcp.velocityBias = 0.0;\n const vRel = Vec2.dot(this.v_normal, vB)\n + Vec2.dot(this.v_normal, Vec2.crossNumVec2(wB, vcp.rB))\n - Vec2.dot(this.v_normal, vA)\n - Vec2.dot(this.v_normal, Vec2.crossNumVec2(wA, vcp.rA));\n if (vRel < -Settings.velocityThreshold) {\n vcp.velocityBias = -this.v_restitution * vRel;\n }\n }\n\n // If we have two points, then prepare the block solver.\n if (this.v_pointCount == 2 && step.blockSolve) {\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const rn1A = Vec2.crossVec2Vec2(vcp1.rA, this.v_normal);\n const rn1B = Vec2.crossVec2Vec2(vcp1.rB, this.v_normal);\n const rn2A = Vec2.crossVec2Vec2(vcp2.rA, this.v_normal);\n const rn2B = Vec2.crossVec2Vec2(vcp2.rB, this.v_normal);\n\n const k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B;\n const k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B;\n const k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B;\n\n // Ensure a reasonable condition number.\n const k_maxConditionNumber = 1000.0;\n if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) {\n // K is safe to invert.\n this.v_K.ex.setNum(k11, k12);\n this.v_K.ey.setNum(k12, k22);\n this.v_normalMass.set(this.v_K.getInverse());\n } else {\n // The constraints are redundant, just use one.\n // TODO_ERIN use deepest?\n this.v_pointCount = 1;\n }\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n warmStartConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n const P = Vec2.combine(vcp.normalImpulse, normal, vcp.tangentImpulse, tangent);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n vA.subMul(mA, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n vB.addMul(mB, P);\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n storeConstraintImpulses(step: TimeStep): void {\n const manifold = this.m_manifold;\n for (let j = 0; j < this.v_pointCount; ++j) {\n manifold.points[j].normalImpulse = this.v_points[j].normalImpulse;\n manifold.points[j].tangentImpulse = this.v_points[j].tangentImpulse;\n }\n }\n\n solveVelocityConstraint(step: TimeStep): void {\n const bodyA = this.m_fixtureA.m_body;\n const bodyB = this.m_fixtureB.m_body;\n\n const velocityA = bodyA.c_velocity;\n const positionA = bodyA.c_position;\n\n const velocityB = bodyB.c_velocity;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n const friction = this.v_friction;\n\n _ASSERT && console.assert(this.v_pointCount == 1 || this.v_pointCount == 2);\n\n // Solve tangent constraints first because non-penetration is more important\n // than friction.\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute tangent force\n const vt = Vec2.dot(dv, tangent) - this.v_tangentSpeed;\n let lambda = vcp.tangentMass * (-vt);\n\n // Clamp the accumulated force\n const maxFriction = friction * vcp.normalImpulse;\n const newImpulse = Math.clamp(vcp.tangentImpulse + lambda, -maxFriction, maxFriction);\n lambda = newImpulse - vcp.tangentImpulse;\n vcp.tangentImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, tangent);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n\n // Solve normal constraints\n if (this.v_pointCount == 1 || step.blockSolve == false) {\n for (let i = 0; i < this.v_pointCount; ++i) {\n const vcp = this.v_points[i]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute normal impulse\n const vn = Vec2.dot(dv, normal);\n let lambda = -vcp.normalMass * (vn - vcp.velocityBias);\n\n // Clamp the accumulated impulse\n const newImpulse = Math.max(vcp.normalImpulse + lambda, 0.0);\n lambda = newImpulse - vcp.normalImpulse;\n vcp.normalImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, normal);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n } else {\n // Block solver developed in collaboration with Dirk Gregorius (back in\n // 01/07 on Box2D_Lite).\n // Build the mini LCP for this contact patch\n //\n // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i =\n // 1..2\n //\n // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n )\n // b = vn0 - velocityBias\n //\n // The system is solved using the \"Total enumeration method\" (s. Murty).\n // The complementary constraint vn_i * x_i\n // implies that we must have in any solution either vn_i = 0 or x_i = 0.\n // So for the 2D contact problem the cases\n // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and\n // vn1 = 0 need to be tested. The first valid\n // solution that satisfies the problem is chosen.\n //\n // In order to account of the accumulated impulse 'a' (because of the\n // iterative nature of the solver which only requires\n // that the accumulated impulse is clamped and not the incremental\n // impulse) we change the impulse variable (x_i).\n //\n // Substitute:\n //\n // x = a + d\n //\n // a := old total impulse\n // x := new total impulse\n // d := incremental impulse\n //\n // For the current iteration we extend the formula for the incremental\n // impulse\n // to compute the new total impulse:\n //\n // vn = A * d + b\n // = A * (x - a) + b\n // = A * x + b - A * a\n // = A * x + b'\n // b' = b - A * a;\n\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const a = Vec2.neo(vcp1.normalImpulse, vcp2.normalImpulse);\n _ASSERT && console.assert(a.x >= 0.0 && a.y >= 0.0);\n\n // Relative velocity at contact\n let dv1 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp1.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp1.rA));\n let dv2 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp2.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp2.rA));\n\n // Compute normal velocity\n let vn1 = Vec2.dot(dv1, normal);\n let vn2 = Vec2.dot(dv2, normal);\n\n const b = Vec2.neo(vn1 - vcp1.velocityBias, vn2 - vcp2.velocityBias);\n\n // Compute b'\n b.sub(Mat22.mulVec2(this.v_K, a));\n\n const k_errorTol = 1e-3;\n // NOT_USED(k_errorTol);\n\n while (true) {\n //\n // Case 1: vn = 0\n //\n // 0 = A * x + b'\n //\n // Solve for x:\n //\n // x = - inv(A) * b'\n //\n const x = Mat22.mulVec2(this.v_normalMass, b).neg();\n\n if (x.x >= 0.0 && x.y >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n dv1 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA)));\n dv2 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA)));\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && console.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n _ASSERT && console.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 2: vn1 = 0 and x2 = 0\n //\n // 0 = a11 * x1 + a12 * 0 + b1'\n // vn2 = a21 * x1 + a22 * 0 + b2'\n //\n x.x = -vcp1.normalMass * b.x;\n x.y = 0.0;\n vn1 = 0.0;\n vn2 = this.v_K.ex.y * x.x + b.y;\n\n if (x.x >= 0.0 && vn2 >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv1B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB));\n const dv1A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA));\n const dv1 = Vec2.sub(dv1B, dv1A);\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n\n _ASSERT && console.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 3: vn2 = 0 and x1 = 0\n //\n // vn1 = a11 * 0 + a12 * x2 + b1'\n // 0 = a21 * 0 + a22 * x2 + b2'\n //\n x.x = 0.0;\n x.y = -vcp2.normalMass * b.y;\n vn1 = this.v_K.ey.x * x.y + b.x;\n vn2 = 0.0;\n\n if (x.y >= 0.0 && vn1 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv2B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB));\n const dv2A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA));\n const dv1 = Vec2.sub(dv2B, dv2A);\n\n // Compute normal velocity\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && console.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 4: x1 = 0 and x2 = 0\n //\n // vn1 = b1\n // vn2 = b2;\n //\n x.x = 0.0;\n x.y = 0.0;\n vn1 = b.x;\n vn2 = b.y;\n\n if (vn1 >= 0.0 && vn2 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n break;\n }\n\n // No solution, give up. This is hit sometimes, but it doesn't seem to\n // matter.\n break;\n }\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n /**\n * @internal\n */\n static addType(type1: ShapeType, type2: ShapeType, callback: ContactCallback): void {\n s_registers[type1] = s_registers[type1] || {};\n s_registers[type1][type2] = callback;\n }\n\n /**\n * @internal\n */\n static create(fixtureA: Fixture, indexA: number, fixtureB: Fixture, indexB: number): Contact | null {\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // TODO: pool contacts\n let contact;\n let evaluateFcn;\n if (evaluateFcn = s_registers[typeA] && s_registers[typeA][typeB]) {\n contact = new Contact(fixtureA, indexA, fixtureB, indexB, evaluateFcn);\n } else if (evaluateFcn = s_registers[typeB] && s_registers[typeB][typeA]) {\n contact = new Contact(fixtureB, indexB, fixtureA, indexA, evaluateFcn);\n } else {\n return null;\n }\n\n // Contact creation may swap fixtures.\n fixtureA = contact.getFixtureA();\n fixtureB = contact.getFixtureB();\n indexA = contact.getChildIndexA();\n indexB = contact.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Connect to body A\n contact.m_nodeA.contact = contact;\n contact.m_nodeA.other = bodyB;\n\n contact.m_nodeA.prev = null;\n contact.m_nodeA.next = bodyA.m_contactList;\n if (bodyA.m_contactList != null) {\n bodyA.m_contactList.prev = contact.m_nodeA;\n }\n bodyA.m_contactList = contact.m_nodeA;\n\n // Connect to body B\n contact.m_nodeB.contact = contact;\n contact.m_nodeB.other = bodyA;\n\n contact.m_nodeB.prev = null;\n contact.m_nodeB.next = bodyB.m_contactList;\n if (bodyB.m_contactList != null) {\n bodyB.m_contactList.prev = contact.m_nodeB;\n }\n bodyB.m_contactList = contact.m_nodeB;\n\n // Wake up the bodies\n if (fixtureA.isSensor() == false && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n return contact;\n }\n\n /**\n * @internal\n */\n static destroy(contact: Contact, listener: { endContact: (contact: Contact) => void }): void {\n const fixtureA = contact.m_fixtureA;\n const fixtureB = contact.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n if (contact.isTouching()) {\n listener.endContact(contact);\n }\n\n // Remove from body 1\n if (contact.m_nodeA.prev) {\n contact.m_nodeA.prev.next = contact.m_nodeA.next;\n }\n\n if (contact.m_nodeA.next) {\n contact.m_nodeA.next.prev = contact.m_nodeA.prev;\n }\n\n if (contact.m_nodeA == bodyA.m_contactList) {\n bodyA.m_contactList = contact.m_nodeA.next;\n }\n\n // Remove from body 2\n if (contact.m_nodeB.prev) {\n contact.m_nodeB.prev.next = contact.m_nodeB.next;\n }\n\n if (contact.m_nodeB.next) {\n contact.m_nodeB.next.prev = contact.m_nodeB.prev;\n }\n\n if (contact.m_nodeB == bodyB.m_contactList) {\n bodyB.m_contactList = contact.m_nodeB.next;\n }\n\n if (contact.m_manifold.pointCount > 0 && fixtureA.isSensor() == false\n && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // const destroyFcn = s_registers[typeA][typeB].destroyFcn;\n // if (typeof destroyFcn === 'function') {\n // destroyFcn(contact);\n // }\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { Vec2 } from '../common/Vec2';\nimport { BroadPhase } from '../collision/BroadPhase';\nimport { Solver, ContactImpulse, TimeStep } from './Solver';\nimport { Body, BodyDef } from './Body';\nimport { Joint } from './Joint';\nimport { Contact } from './Contact';\nimport { AABB, RayCastInput, RayCastOutput } from \"../collision/AABB\";\nimport { Fixture, FixtureProxy } from \"./Fixture\";\nimport { Manifold } from \"../collision/Manifold\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * @prop gravity [{ x : 0, y : 0}]\n * @prop allowSleep [true]\n * @prop warmStarting [true]\n * @prop continuousPhysics [true]\n * @prop subStepping [false]\n * @prop blockSolve [true]\n * @prop velocityIterations [8] For the velocity constraint solver.\n * @prop positionIterations [3] For the position constraint solver.\n */\nexport interface WorldDef {\n gravity?: Vec2;\n allowSleep?: boolean;\n warmStarting?: boolean;\n continuousPhysics?: boolean;\n subStepping?: boolean;\n blockSolve?: boolean;\n velocityIterations?: number;\n positionIterations?: number;\n}\n\nconst WorldDefDefault: WorldDef = {\n gravity : Vec2.zero(),\n allowSleep : true,\n warmStarting : true,\n continuousPhysics : true,\n subStepping : false,\n blockSolve : true,\n velocityIterations : 8,\n positionIterations : 3\n};\n\n/**\n * Callback function for ray casts, see {@link World.rayCast}.\n *\n * Called for each fixture found in the query. You control how the ray cast\n * proceeds by returning a float: return -1: ignore this fixture and continue\n * return 0: terminate the ray cast return fraction: clip the ray to this point\n * return 1: don't clip the ray and continue\n *\n * @param fixture The fixture hit by the ray\n * @param point The point of initial intersection\n * @param normal The normal vector at the point of intersection\n * @param fraction\n *\n * @return -1 to filter, 0 to terminate, fraction to clip the ray for closest hit, 1 to continue\n */\nexport type WorldRayCastCallback = (fixture: Fixture, point: Vec2, normal: Vec2, fraction: number) => number;\n\n/**\n * Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\nexport type WorldAABBQueryCallback = (fixture: Fixture) => boolean;\n\nexport class World {\n /** @internal */ m_solver: Solver;\n /** @internal */ m_broadPhase: BroadPhase;\n /** @internal */ m_contactList: Contact | null;\n /** @internal */ m_contactCount: number;\n /** @internal */ m_bodyList: Body | null;\n /** @internal */ m_bodyCount: number;\n /** @internal */ m_jointList: Joint | null;\n /** @internal */ m_jointCount: number;\n /** @internal */ m_stepComplete: boolean;\n /** @internal */ m_allowSleep: boolean;\n /** @internal */ m_gravity: Vec2;\n /** @internal */ m_clearForces: boolean;\n /** @internal */ m_newFixture: boolean;\n /** @internal */ m_locked: boolean;\n /** @internal */ m_warmStarting: boolean;\n /** @internal */ m_continuousPhysics: boolean;\n /** @internal */ m_subStepping: boolean;\n /** @internal */ m_blockSolve: boolean;\n /** @internal */ m_velocityIterations: number;\n /** @internal */ m_positionIterations: number;\n /** @internal */ m_t: number;\n\n // TODO\n /** @internal */ _listeners: {\n [key: string]: any[]\n };\n\n /**\n * @param def World definition or gravity vector.\n */\n constructor(def?: WorldDef | Vec2 | null) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof World)) {\n return new World(def);\n }\n\n this.s_step = new TimeStep();\n\n\n if (def && Vec2.isValid(def)) {\n def = { gravity: def as Vec2 };\n }\n\n def = options(def, WorldDefDefault) as WorldDef;\n\n this.m_solver = new Solver(this);\n\n this.m_broadPhase = new BroadPhase();\n\n this.m_contactList = null;\n this.m_contactCount = 0;\n\n this.m_bodyList = null;\n this.m_bodyCount = 0;\n\n this.m_jointList = null;\n this.m_jointCount = 0;\n\n this.m_stepComplete = true;\n\n this.m_allowSleep = def.allowSleep;\n this.m_gravity = Vec2.clone(def.gravity);\n\n this.m_clearForces = true;\n this.m_newFixture = false;\n this.m_locked = false;\n\n // These are for debugging the solver.\n this.m_warmStarting = def.warmStarting;\n this.m_continuousPhysics = def.continuousPhysics;\n this.m_subStepping = def.subStepping;\n\n this.m_blockSolve = def.blockSolve;\n this.m_velocityIterations = def.velocityIterations;\n this.m_positionIterations = def.positionIterations;\n\n this.m_t = 0;\n }\n\n /** @internal */\n _serialize(): object {\n const bodies = [];\n const joints = [];\n\n for (let b = this.getBodyList(); b; b = b.getNext()) {\n bodies.push(b);\n }\n\n for (let j = this.getJointList(); j; j = j.getNext()) {\n // @ts-ignore\n if (typeof j._serialize === 'function') {\n joints.push(j);\n }\n }\n\n return {\n gravity: this.m_gravity,\n bodies,\n joints,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, context: any, restore: any): World {\n if (!data) {\n return new World();\n }\n\n const world = new World(data.gravity);\n\n if (data.bodies) {\n for (let i = data.bodies.length - 1; i >= 0; i -= 1) {\n world._addBody(restore(Body, data.bodies[i], world));\n }\n }\n\n if (data.joints) {\n for (let i = data.joints.length - 1; i >= 0; i--) {\n world.createJoint(restore(Joint, data.joints[i], world));\n }\n }\n\n return world;\n }\n\n /**\n * Get the world body list. With the returned body, use Body.getNext to get the\n * next body in the world list. A null body indicates the end of the list.\n *\n * @return the head of the world body list.\n */\n getBodyList(): Body | null {\n return this.m_bodyList;\n }\n\n /**\n * Get the world joint list. With the returned joint, use Joint.getNext to get\n * the next joint in the world list. A null joint indicates the end of the list.\n *\n * @return the head of the world joint list.\n */\n getJointList(): Joint | null {\n return this.m_jointList;\n }\n\n /**\n * Get the world contact list. With the returned contact, use Contact.getNext to\n * get the next contact in the world list. A null contact indicates the end of\n * the list.\n *\n * Warning: contacts are created and destroyed in the middle of a time step.\n * Use ContactListener to avoid missing contacts.\n *\n * @return the head of the world contact list.\n */\n getContactList(): Contact | null {\n return this.m_contactList;\n }\n\n getBodyCount(): number {\n return this.m_bodyCount;\n }\n\n getJointCount(): number {\n return this.m_jointCount;\n }\n\n /**\n * Get the number of contacts (each may have 0 or more contact points).\n */\n getContactCount(): number {\n return this.m_contactCount;\n }\n\n /**\n * Change the global gravity vector.\n */\n setGravity(gravity: Vec2): void {\n this.m_gravity = gravity;\n }\n\n /**\n * Get the global gravity vector.\n */\n getGravity(): Vec2 {\n return this.m_gravity;\n }\n\n /**\n * Is the world locked (in the middle of a time step).\n */\n isLocked(): boolean {\n return this.m_locked;\n }\n\n /**\n * Enable/disable sleep.\n */\n setAllowSleeping(flag: boolean): void {\n if (flag == this.m_allowSleep) {\n return;\n }\n\n this.m_allowSleep = flag;\n if (this.m_allowSleep == false) {\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.setAwake(true);\n }\n }\n }\n\n getAllowSleeping(): boolean {\n return this.m_allowSleep;\n }\n\n /**\n * Enable/disable warm starting. For testing.\n */\n setWarmStarting(flag: boolean): void {\n this.m_warmStarting = flag;\n }\n\n getWarmStarting(): boolean {\n return this.m_warmStarting;\n }\n\n /**\n * Enable/disable continuous physics. For testing.\n */\n setContinuousPhysics(flag: boolean): void {\n this.m_continuousPhysics = flag;\n }\n\n getContinuousPhysics(): boolean {\n return this.m_continuousPhysics;\n }\n\n /**\n * Enable/disable single stepped continuous physics. For testing.\n */\n setSubStepping(flag: boolean): void {\n this.m_subStepping = flag;\n }\n\n getSubStepping(): boolean {\n return this.m_subStepping;\n }\n\n /**\n * Set flag to control automatic clearing of forces after each time step.\n */\n setAutoClearForces(flag: boolean): void {\n this.m_clearForces = flag;\n }\n\n /**\n * Get the flag that controls automatic clearing of forces after each time step.\n */\n getAutoClearForces(): boolean {\n return this.m_clearForces;\n }\n\n /**\n * Manually clear the force buffer on all bodies. By default, forces are cleared\n * automatically after each call to step. The default behavior is modified by\n * calling setAutoClearForces. The purpose of this function is to support\n * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step\n * under a variable frame-rate. When you perform sub-stepping you will disable\n * auto clearing of forces and instead call clearForces after all sub-steps are\n * complete in one pass of your game loop.\n *\n * See {@link World.setAutoClearForces}\n */\n clearForces(): void {\n for (let body = this.m_bodyList; body; body = body.getNext()) {\n body.m_force.setZero();\n body.m_torque = 0.0;\n }\n }\n\n /**\n * Query the world for all fixtures that potentially overlap the provided AABB.\n *\n * @param aabb The query box.\n * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\n queryAABB(aabb: AABB, callback: WorldAABBQueryCallback): void {\n _ASSERT && console.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n this.m_broadPhase.query(aabb, function(proxyId: number): boolean { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n return callback(proxy.fixture);\n });\n }\n\n /**\n * Ray-cast the world for all fixtures in the path of the ray. Your callback\n * controls whether you get the closest point, any point, or n-points. The\n * ray-cast ignores shapes that contain the starting point.\n *\n * @param point1 The ray starting point\n * @param point2 The ray ending point\n * @param callback A user implemented callback function.\n */\n rayCast(point1: Vec2, point2: Vec2, callback: WorldRayCastCallback): void {\n _ASSERT && console.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n\n this.m_broadPhase.rayCast({\n maxFraction : 1.0,\n p1 : point1,\n p2 : point2\n }, function(input: RayCastInput, proxyId: number): number { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n const fixture = proxy.fixture;\n const index = proxy.childIndex;\n // @ts-ignore\n const output: RayCastOutput = {}; // TODO GC\n const hit = fixture.rayCast(output, input, index);\n if (hit) {\n const fraction = output.fraction;\n const point = Vec2.add(Vec2.mulNumVec2((1.0 - fraction), input.p1), Vec2.mulNumVec2(fraction, input.p2));\n return callback(fixture, point, output.normal, fraction);\n }\n return input.maxFraction;\n });\n }\n\n /**\n * Get the number of broad-phase proxies.\n */\n getProxyCount(): number {\n return this.m_broadPhase.getProxyCount();\n }\n\n /**\n * Get the height of broad-phase dynamic tree.\n */\n getTreeHeight(): number {\n return this.m_broadPhase.getTreeHeight();\n }\n\n /**\n * Get the balance of broad-phase dynamic tree.\n */\n getTreeBalance(): number {\n return this.m_broadPhase.getTreeBalance();\n }\n\n /**\n * Get the quality metric of broad-phase dynamic tree. The smaller the better.\n * The minimum is 1.\n */\n getTreeQuality(): number {\n return this.m_broadPhase.getTreeQuality();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The body shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n _ASSERT && console.assert(this.m_locked == false);\n if (this.m_locked) {\n return;\n }\n\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.m_xf.p.sub(newOrigin);\n b.m_sweep.c0.sub(newOrigin);\n b.m_sweep.c.sub(newOrigin);\n }\n\n for (let j = this.m_jointList; j; j = j.m_next) {\n j.shiftOrigin(newOrigin);\n }\n\n this.m_broadPhase.shiftOrigin(newOrigin);\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addBody(body: Body): void {\n _ASSERT && console.assert(this.isLocked() === false);\n if (this.isLocked()) {\n return;\n }\n\n // Add to world doubly linked list.\n body.m_prev = null;\n body.m_next = this.m_bodyList;\n if (this.m_bodyList) {\n this.m_bodyList.m_prev = body;\n }\n this.m_bodyList = body;\n ++this.m_bodyCount;\n }\n\n /**\n * Create a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This function is locked during callbacks.\n */\n createBody(def?: BodyDef): Body;\n createBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createBody(arg1?, arg2?) {\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n\n const body = new Body(this, def);\n this._addBody(body);\n return body;\n }\n\n createDynamicBody(def?: BodyDef): Body;\n createDynamicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createDynamicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'dynamic';\n return this.createBody(def);\n }\n\n createKinematicBody(def?: BodyDef): Body;\n createKinematicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createKinematicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'kinematic';\n return this.createBody(def);\n }\n\n /**\n * Destroy a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This automatically deletes all associated shapes and joints.\n *\n * Warning: This function is locked during callbacks.\n */\n destroyBody(b: Body): boolean {\n _ASSERT && console.assert(this.m_bodyCount > 0);\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n if (b.m_destroyed) {\n return false;\n }\n\n // Delete the attached joints.\n let je = b.m_jointList;\n while (je) {\n const je0 = je;\n je = je.next;\n\n this.publish('remove-joint', je0.joint);\n this.destroyJoint(je0.joint);\n\n b.m_jointList = je;\n }\n b.m_jointList = null;\n\n // Delete the attached contacts.\n let ce = b.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n\n this.destroyContact(ce0.contact);\n\n b.m_contactList = ce;\n }\n b.m_contactList = null;\n\n // Delete the attached fixtures. This destroys broad-phase proxies.\n let f = b.m_fixtureList;\n while (f) {\n const f0 = f;\n f = f.m_next;\n\n this.publish('remove-fixture', f0);\n f0.destroyProxies(this.m_broadPhase);\n\n b.m_fixtureList = f;\n }\n b.m_fixtureList = null;\n\n // Remove world body list.\n if (b.m_prev) {\n b.m_prev.m_next = b.m_next;\n }\n\n if (b.m_next) {\n b.m_next.m_prev = b.m_prev;\n }\n\n if (b == this.m_bodyList) {\n this.m_bodyList = b.m_next;\n }\n\n b.m_destroyed = true;\n\n --this.m_bodyCount;\n\n this.publish('remove-body', b);\n\n return true;\n }\n\n /**\n * Create a joint to constrain bodies together. No reference to the definition\n * is retained. This may cause the connected bodies to cease colliding.\n *\n * Warning: This function is locked during callbacks.\n */\n createJoint(joint: T): T | null {\n _ASSERT && console.assert(!!joint.m_bodyA);\n _ASSERT && console.assert(!!joint.m_bodyB);\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n // Connect to the world list.\n joint.m_prev = null;\n joint.m_next = this.m_jointList;\n if (this.m_jointList) {\n this.m_jointList.m_prev = joint;\n }\n this.m_jointList = joint;\n ++this.m_jointCount;\n\n // Connect to the bodies' doubly linked lists.\n joint.m_edgeA.joint = joint;\n joint.m_edgeA.other = joint.m_bodyB;\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = joint.m_bodyA.m_jointList;\n if (joint.m_bodyA.m_jointList)\n joint.m_bodyA.m_jointList.prev = joint.m_edgeA;\n joint.m_bodyA.m_jointList = joint.m_edgeA;\n\n joint.m_edgeB.joint = joint;\n joint.m_edgeB.other = joint.m_bodyA;\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = joint.m_bodyB.m_jointList;\n if (joint.m_bodyB.m_jointList)\n joint.m_bodyB.m_jointList.prev = joint.m_edgeB;\n joint.m_bodyB.m_jointList = joint.m_edgeB;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n for (let edge = joint.m_bodyB.getContactList(); edge; edge = edge.next) {\n if (edge.other == joint.m_bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n }\n }\n\n // Note: creating a joint doesn't wake the bodies.\n\n return joint;\n }\n\n /**\n * Destroy a joint. This may cause the connected bodies to begin colliding.\n * Warning: This function is locked during callbacks.\n */\n destroyJoint(joint: Joint): void {\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n // Remove from the doubly linked list.\n if (joint.m_prev) {\n joint.m_prev.m_next = joint.m_next;\n }\n\n if (joint.m_next) {\n joint.m_next.m_prev = joint.m_prev;\n }\n\n if (joint == this.m_jointList) {\n this.m_jointList = joint.m_next;\n }\n\n // Disconnect from bodies.\n const bodyA = joint.m_bodyA;\n const bodyB = joint.m_bodyB;\n\n // Wake up connected bodies.\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n\n // Remove from body 1.\n if (joint.m_edgeA.prev) {\n joint.m_edgeA.prev.next = joint.m_edgeA.next;\n }\n\n if (joint.m_edgeA.next) {\n joint.m_edgeA.next.prev = joint.m_edgeA.prev;\n }\n\n if (joint.m_edgeA == bodyA.m_jointList) {\n bodyA.m_jointList = joint.m_edgeA.next;\n }\n\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = null;\n\n // Remove from body 2\n if (joint.m_edgeB.prev) {\n joint.m_edgeB.prev.next = joint.m_edgeB.next;\n }\n\n if (joint.m_edgeB.next) {\n joint.m_edgeB.next.prev = joint.m_edgeB.prev;\n }\n\n if (joint.m_edgeB == bodyB.m_jointList) {\n bodyB.m_jointList = joint.m_edgeB.next;\n }\n\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = null;\n\n _ASSERT && console.assert(this.m_jointCount > 0);\n --this.m_jointCount;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n let edge = bodyB.getContactList();\n while (edge) {\n if (edge.other == bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n }\n\n this.publish('remove-joint', joint);\n }\n\n /** @internal */\n s_step: TimeStep; // reuse\n\n /**\n * Take a time step. This performs collision detection, integration, and\n * constraint solution.\n *\n * Broad-phase, narrow-phase, solve and solve time of impacts.\n *\n * @param timeStep Time step, this should not vary.\n */\n step(timeStep: number, velocityIterations?: number, positionIterations?: number): void {\n this.publish('pre-step', timeStep);\n\n if ((velocityIterations | 0) !== velocityIterations) {\n // TODO: remove this in future\n velocityIterations = 0;\n }\n\n velocityIterations = velocityIterations || this.m_velocityIterations;\n positionIterations = positionIterations || this.m_positionIterations;\n\n // If new fixtures were added, we need to find the new contacts.\n if (this.m_newFixture) {\n this.findNewContacts();\n this.m_newFixture = false;\n }\n\n this.m_locked = true;\n\n this.s_step.reset(timeStep);\n this.s_step.velocityIterations = velocityIterations;\n this.s_step.positionIterations = positionIterations;\n this.s_step.warmStarting = this.m_warmStarting;\n this.s_step.blockSolve = this.m_blockSolve;\n\n // Update contacts. This is where some contacts are destroyed.\n this.updateContacts();\n\n // Integrate velocities, solve velocity constraints, and integrate positions.\n if (this.m_stepComplete && timeStep > 0.0) {\n this.m_solver.solveWorld(this.s_step);\n\n // Synchronize fixtures, check for out of range bodies.\n for (let b = this.m_bodyList; b; b = b.getNext()) {\n // If a body was not in an island then it did not move.\n if (b.m_islandFlag == false) {\n continue;\n }\n\n if (b.isStatic()) {\n continue;\n }\n\n // Update fixtures (for broad-phase).\n b.synchronizeFixtures();\n }\n // Look for new contacts.\n this.findNewContacts();\n }\n\n // Handle TOI events.\n if (this.m_continuousPhysics && timeStep > 0.0) {\n this.m_solver.solveWorldTOI(this.s_step);\n }\n\n if (this.m_clearForces) {\n this.clearForces();\n }\n\n this.m_locked = false;\n\n this.publish('post-step', timeStep);\n }\n\n /**\n * @internal\n * Call this method to find new contacts.\n */\n findNewContacts(): void {\n this.m_broadPhase.updatePairs(\n (proxyA: FixtureProxy, proxyB: FixtureProxy) => this.createContact(proxyA, proxyB)\n );\n }\n\n /**\n * @internal\n * Callback for broad-phase.\n */\n createContact(proxyA: FixtureProxy, proxyB: FixtureProxy): void {\n const fixtureA = proxyA.fixture;\n const fixtureB = proxyB.fixture;\n\n const indexA = proxyA.childIndex;\n const indexB = proxyB.childIndex;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Are the fixtures on the same body?\n if (bodyA == bodyB) {\n return;\n }\n\n // TODO_ERIN use a hash table to remove a potential bottleneck when both\n // bodies have a lot of contacts.\n // Does a contact already exist?\n let edge = bodyB.getContactList(); // ContactEdge\n while (edge) {\n if (edge.other == bodyA) {\n const fA = edge.contact.getFixtureA();\n const fB = edge.contact.getFixtureB();\n const iA = edge.contact.getChildIndexA();\n const iB = edge.contact.getChildIndexB();\n\n if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) {\n // A contact already exists.\n return;\n }\n\n if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) {\n // A contact already exists.\n return;\n }\n }\n\n edge = edge.next;\n }\n\n if (bodyB.shouldCollide(bodyA) == false) {\n return;\n }\n if (fixtureB.shouldCollide(fixtureA) == false) {\n return;\n }\n\n // Call the factory.\n const contact = Contact.create(fixtureA, indexA, fixtureB, indexB);\n if (contact == null) {\n return;\n }\n\n // Insert into the world.\n contact.m_prev = null;\n if (this.m_contactList != null) {\n contact.m_next = this.m_contactList;\n this.m_contactList.m_prev = contact;\n }\n this.m_contactList = contact;\n\n ++this.m_contactCount;\n }\n\n /**\n * @internal\n * Removes old non-overlapping contacts, applies filters and updates contacts.\n */\n updateContacts(): void {\n // Update awake contacts.\n let c;\n let next_c = this.m_contactList;\n while (c = next_c) {\n next_c = c.getNext();\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Is this contact flagged for filtering?\n if (c.m_filterFlag) {\n if (bodyB.shouldCollide(bodyA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n if (fixtureB.shouldCollide(fixtureA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n // Clear the filtering flag.\n c.m_filterFlag = false;\n }\n\n const activeA = bodyA.isAwake() && !bodyA.isStatic();\n const activeB = bodyB.isAwake() && !bodyB.isStatic();\n\n // At least one body must be awake and it must be dynamic or kinematic.\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const proxyIdA = fixtureA.m_proxies[indexA].proxyId;\n const proxyIdB = fixtureB.m_proxies[indexB].proxyId;\n const overlap = this.m_broadPhase.testOverlap(proxyIdA, proxyIdB);\n\n // Here we destroy contacts that cease to overlap in the broad-phase.\n if (overlap == false) {\n this.destroyContact(c);\n continue;\n }\n\n // The contact persists.\n c.update(this);\n }\n }\n\n /**\n * @internal\n */\n destroyContact(contact: Contact): void {\n Contact.destroy(contact, this);\n\n // Remove from the world.\n if (contact.m_prev) {\n contact.m_prev.m_next = contact.m_next;\n }\n if (contact.m_next) {\n contact.m_next.m_prev = contact.m_prev;\n }\n if (contact == this.m_contactList) {\n this.m_contactList = contact.m_next;\n }\n\n --this.m_contactCount;\n }\n\n\n /**\n * Called when two fixtures begin to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'begin-contact', listener: (contact: Contact) => void): World;\n /**\n * Called when two fixtures cease to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'end-contact', listener: (contact: Contact) => void): World;\n /**\n * This is called after a contact is updated. This allows you to inspect a\n * contact before it goes to the solver. If you are careful, you can modify the\n * contact manifold (e.g. disable contact). A copy of the old manifold is\n * provided so that you can detect changes. Note: this is called only for awake\n * bodies. Note: this is called even when the number of contact points is zero.\n * Note: this is not called for sensors. Note: if you set the number of contact\n * points to zero, you will not get an endContact callback. However, you may get\n * a beginContact callback the next step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n /**\n * This lets you inspect a contact after the solver is finished. This is useful\n * for inspecting impulses. Note: the contact manifold does not include time of\n * impact impulses, which can be arbitrarily large if the sub-step is small.\n * Hence the impulse is provided explicitly in a separate data structure. Note:\n * this is only called for contacts that are touching, solid, and awake.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n /** Listener is called whenever a body is removed. */\n on(name: 'remove-body', listener: (body: Body) => void): World;\n /** Listener is called whenever a joint is removed implicitly or explicitly. */\n on(name: 'remove-joint', listener: (joint: Joint) => void): World;\n /** Listener is called whenever a fixture is removed implicitly or explicitly. */\n on(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Register an event listener.\n */\n // tslint:disable-next-line:typedef\n on(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n if (!this._listeners) {\n this._listeners = {};\n }\n if (!this._listeners[name]) {\n this._listeners[name] = [];\n }\n this._listeners[name].push(listener);\n return this;\n }\n\n off(name: 'begin-contact', listener: (contact: Contact) => void): World;\n off(name: 'end-contact', listener: (contact: Contact) => void): World;\n off(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n off(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n off(name: 'remove-body', listener: (body: Body) => void): World;\n off(name: 'remove-joint', listener: (joint: Joint) => void): World;\n off(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Remove an event listener.\n */\n // tslint:disable-next-line:typedef\n off(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return this;\n }\n const index = listeners.indexOf(listener);\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n publish(name: string, arg1?: any, arg2?: any, arg3?: any): number {\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return 0;\n }\n for (let l = 0; l < listeners.length; l++) {\n listeners[l].call(this, arg1, arg2, arg3);\n }\n return listeners.length;\n }\n\n /**\n * @internal\n */\n beginContact(contact: Contact): void {\n this.publish('begin-contact', contact);\n }\n\n /**\n * @internal\n */\n endContact(contact: Contact): void {\n this.publish('end-contact', contact);\n }\n\n /**\n * @internal\n */\n preSolve(contact: Contact, oldManifold: Manifold): void {\n this.publish('pre-solve', contact, oldManifold);\n }\n\n /**\n * @internal\n */\n postSolve(contact: Contact, impulse: ContactImpulse): void {\n this.publish('post-solve', contact, impulse);\n }\n\n /**\n * Joints and fixtures are destroyed when their associated body is destroyed.\n * Register a destruction listener so that you may nullify references to these\n * joints and shapes.\n *\n * `function(object)` is called when any joint or fixture is about to\n * be destroyed due to the destruction of one of its attached or parent bodies.\n */\n\n /**\n * Register a contact filter to provide specific control over collision.\n * Otherwise the default filter is used (defaultFilter). The listener is owned\n * by you and must remain in scope.\n *\n * Moved to Fixture.\n */\n}","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class Vec3 {\n x: number;\n y: number;\n z: number;\n\n constructor(x: number, y: number, z: number);\n constructor(obj: { x: number, y: number, z: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?, z?) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Vec3)) {\n return new Vec3(x, y, z);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n this.z = x.z;\n } else {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n _ASSERT && Vec3.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y,\n z: this.z\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = data.x;\n obj.y = data.y;\n obj.z = data.z;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number, z: number): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = x;\n obj.y = y;\n obj.z = z;\n return obj;\n }\n\n static zero(): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = 0;\n obj.y = 0;\n obj.z = 0;\n return obj;\n }\n\n static clone(v: Vec3): Vec3 {\n _ASSERT && Vec3.assert(v);\n return Vec3.neo(v.x, v.y, v.z);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y) && Math.isFinite(obj.z);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Vec3.isValid(o), 'Invalid Vec3!', o);\n }\n\n setZero(): Vec3 {\n this.x = 0.0;\n this.y = 0.0;\n this.z = 0.0;\n return this;\n }\n\n set(x: number, y: number, z: number): Vec3 {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n\n add(w: Vec3): Vec3 {\n this.x += w.x;\n this.y += w.y;\n this.z += w.z;\n return this;\n }\n\n sub(w: Vec3): Vec3 {\n this.x -= w.x;\n this.y -= w.y;\n this.z -= w.z;\n return this;\n }\n\n mul(m: number): Vec3 {\n this.x *= m;\n this.y *= m;\n this.z *= m;\n return this;\n }\n\n static areEqual(v: Vec3, w: Vec3): boolean {\n _ASSERT && Vec3.assert(v);\n _ASSERT && Vec3.assert(w);\n return v === w ||\n typeof v === 'object' && v !== null &&\n typeof w === 'object' && w !== null &&\n v.x === w.x && v.y === w.y && v.z === w.z;\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec3, w: Vec3): number {\n return v.x * w.x + v.y * w.y + v.z * w.z;\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static cross(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(\n v.y * w.z - v.z * w.y,\n v.z * w.x - v.x * w.z,\n v.x * w.y - v.y * w.x\n );\n }\n\n static add(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x + w.x, v.y + w.y, v.z + w.z);\n }\n\n static sub(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x - w.x, v.y - w.y, v.z - w.z);\n }\n\n static mul(v: Vec3, m: number): Vec3 {\n return new Vec3(m * v.x, m * v.y, m * v.z);\n }\n\n neg(): Vec3 {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n }\n\n static neg(v: Vec3): Vec3 {\n return new Vec3(-v.x, -v.y, -v.z);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { AABB, RayCastInput, RayCastOutput } from '../AABB';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A line segment (edge) shape. These can be connected in chains or loops to\n * other edge shapes. The connectivity information is used to ensure correct\n * contact normals.\n */\nexport class EdgeShape extends Shape {\n static TYPE = 'edge' as const;\n m_type: 'edge';\n\n m_radius: number;\n\n // These are the edge vertices\n m_vertex1: Vec2;\n m_vertex2: Vec2;\n\n // Optional adjacent vertices. These are used for smooth collision.\n // Used by chain shape.\n m_vertex0: Vec2;\n m_vertex3: Vec2;\n m_hasVertex0: boolean;\n m_hasVertex3: boolean;\n\n constructor(v1?: Vec2Value, v2?: Vec2Value) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof EdgeShape)) {\n return new EdgeShape(v1, v2);\n }\n\n super();\n\n this.m_type = EdgeShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n\n this.m_vertex1 = v1 ? Vec2.clone(v1) : Vec2.zero();\n this.m_vertex2 = v2 ? Vec2.clone(v2) : Vec2.zero();\n\n this.m_vertex0 = Vec2.zero();\n this.m_vertex3 = Vec2.zero();\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertex1: this.m_vertex1,\n vertex2: this.m_vertex2,\n\n vertex0: this.m_vertex0,\n vertex3: this.m_vertex3,\n hasVertex0: this.m_hasVertex0,\n hasVertex3: this.m_hasVertex3,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): EdgeShape {\n const shape = new EdgeShape(data.vertex1, data.vertex2);\n if (shape.m_hasVertex0) {\n shape.setPrevVertex(data.vertex0);\n }\n if (shape.m_hasVertex3) {\n shape.setNextVertex(data.vertex3);\n }\n return shape;\n }\n\n /** @internal */\n _reset(): void {\n // noop\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getType(): 'edge' {\n return this.m_type;\n }\n\n /** @internal @deprecated */\n setNext(v?: Vec2): EdgeShape {\n return this.setNextVertex(v);\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n setNextVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex3.setVec2(v);\n this.m_hasVertex3 = true;\n } else {\n this.m_vertex3.setZero();\n this.m_hasVertex3 = false;\n }\n return this;\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n getNextVertex(): Vec2 {\n return this.m_vertex3;\n }\n\n /** @internal @deprecated */\n setPrev(v?: Vec2): EdgeShape {\n return this.setPrevVertex(v);\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n setPrevVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex0.setVec2(v);\n this.m_hasVertex0 = true;\n } else {\n this.m_vertex0.setZero();\n this.m_hasVertex0 = false;\n }\n return this;\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n getPrevVertex(): Vec2 {\n return this.m_vertex0;\n }\n\n /**\n * Set this as an isolated edge.\n */\n _set(v1: Vec2, v2: Vec2): EdgeShape {\n this.m_vertex1.setVec2(v1);\n this.m_vertex2.setVec2(v2);\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): EdgeShape {\n const clone = new EdgeShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_vertex1.setVec2(this.m_vertex1);\n clone.m_vertex2.setVec2(this.m_vertex2);\n clone.m_vertex0.setVec2(this.m_vertex0);\n clone.m_vertex3.setVec2(this.m_vertex3);\n clone.m_hasVertex0 = this.m_hasVertex0;\n clone.m_hasVertex3 = this.m_hasVertex3;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // p = p1 + t * d\n // v = v1 + s * e\n // p1 + t * d = v1 + s * e\n // s * e - t * d = p1 - v1\n\n // NOT_USED(childIndex);\n\n // Put the ray into the edge's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n const v1 = this.m_vertex1;\n const v2 = this.m_vertex2;\n const e = Vec2.sub(v2, v1);\n const normal = Vec2.neo(e.y, -e.x);\n normal.normalize();\n\n // q = p1 + t * d\n // dot(normal, q - v1) = 0\n // dot(normal, p1 - v1) + t * dot(normal, d) = 0\n const numerator = Vec2.dot(normal, Vec2.sub(v1, p1));\n const denominator = Vec2.dot(normal, d);\n\n if (denominator == 0.0) {\n return false;\n }\n\n const t = numerator / denominator;\n if (t < 0.0 || input.maxFraction < t) {\n return false;\n }\n\n const q = Vec2.add(p1, Vec2.mulNumVec2(t, d));\n\n // q = v1 + s * r\n // s = dot(q - v1, r) / dot(r, r)\n const r = Vec2.sub(v2, v1);\n const rr = Vec2.dot(r, r);\n if (rr == 0.0) {\n return false;\n }\n\n const s = Vec2.dot(Vec2.sub(q, v1), r) / rr;\n if (s < 0.0 || 1.0 < s) {\n return false;\n }\n\n output.fraction = t;\n if (numerator > 0.0) {\n output.normal = Rot.mulVec2(xf.q, normal).neg();\n } else {\n output.normal = Rot.mulVec2(xf.q, normal);\n }\n return true;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const v1 = Transform.mulVec2(xf, this.m_vertex1);\n const v2 = Transform.mulVec2(xf, this.m_vertex2);\n\n aabb.combinePoints(v1, v2);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center.setCombine(0.5, this.m_vertex1, 0.5, this.m_vertex2);\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_vertex1);\n proxy.m_vertices.push(this.m_vertex2);\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n}\n\nexport const Edge = EdgeShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport { Transform } from '../../common/Transform';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\nimport { EdgeShape } from './EdgeShape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A chain shape is a free form sequence of line segments. The chain has\n * two-sided collision, so you can use inside and outside collision. Therefore,\n * you may use any winding order. Connectivity information is used to create\n * smooth collisions.\n *\n * WARNING: The chain will not collide properly if there are self-intersections.\n */\nexport class ChainShape extends Shape {\n static TYPE = 'chain' as const;\n m_type: 'chain';\n\n m_radius: number;\n\n m_vertices: Vec2[];\n m_count: number;\n m_prevVertex: Vec2 | null;\n m_nextVertex: Vec2 | null;\n m_hasPrevVertex: boolean;\n m_hasNextVertex: boolean;\n\n m_isLoop: boolean;\n\n constructor(vertices?: Vec2Value[], loop?: boolean) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof ChainShape)) {\n return new ChainShape(vertices, loop);\n }\n\n super();\n\n this.m_type = ChainShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_vertices = [];\n this.m_count = 0;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n\n this.m_isLoop = !!loop;\n\n if (vertices && vertices.length) {\n if (loop) {\n this._createLoop(vertices);\n } else {\n this._createChain(vertices);\n }\n }\n }\n\n /** @internal */\n _serialize(): object {\n const data = {\n type: this.m_type,\n vertices: this.m_vertices,\n isLoop: this.m_isLoop,\n hasPrevVertex: this.m_hasPrevVertex,\n hasNextVertex: this.m_hasNextVertex,\n prevVertex: null as Vec2 | null,\n nextVertex: null as Vec2 | null,\n };\n if (this.m_prevVertex) {\n data.prevVertex = this.m_prevVertex;\n }\n if (this.m_nextVertex) {\n data.nextVertex = this.m_nextVertex;\n }\n return data;\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): ChainShape {\n const vertices: Vec2[] = [];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n const shape = new ChainShape(vertices, data.isLoop);\n if (data.prevVertex) {\n shape.setPrevVertex(data.prevVertex);\n }\n if (data.nextVertex) {\n shape.setNextVertex(data.nextVertex);\n }\n return shape;\n }\n\n // clear() {\n // this.m_vertices.length = 0;\n // this.m_count = 0;\n // }\n\n getType(): 'chain' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n /**\n * @internal\n * Create a loop. This automatically adjusts connectivity.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createLoop(vertices: Vec2Value[]): ChainShape {\n _ASSERT && console.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && console.assert(vertices.length >= 3);\n for (let i = 1; i < vertices.length; ++i) {\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n // If the code crashes here, it means your vertices are too close together.\n _ASSERT && console.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_vertices = [];\n this.m_count = vertices.length + 1;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n this.m_vertices[vertices.length] = Vec2.clone(vertices[0]);\n\n this.m_prevVertex = this.m_vertices[this.m_count - 2];\n this.m_nextVertex = this.m_vertices[1];\n this.m_hasPrevVertex = true;\n this.m_hasNextVertex = true;\n return this;\n }\n\n /**\n * @internal\n * Create a chain with isolated end vertices.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createChain(vertices: Vec2Value[]): ChainShape {\n _ASSERT && console.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && console.assert(vertices.length >= 2);\n for (let i = 1; i < vertices.length; ++i) {\n // If the code crashes here, it means your vertices are too close together.\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n _ASSERT && console.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_count = vertices.length;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n return this;\n }\n\n /** @internal */\n _reset(): void {\n if (this.m_isLoop) {\n this._createLoop(this.m_vertices);\n } else {\n this._createChain(this.m_vertices);\n }\n }\n\n /**\n * Establish connectivity to a vertex that precedes the first vertex. Don't call\n * this for loops.\n */\n setPrevVertex(prevVertex: Vec2): void {\n this.m_prevVertex = prevVertex;\n this.m_hasPrevVertex = true;\n }\n\n getPrevVertex(): Vec2 {\n return this.m_prevVertex;\n }\n\n /**\n * Establish connectivity to a vertex that follows the last vertex. Don't call\n * this for loops.\n */\n setNextVertex(nextVertex: Vec2): void {\n this.m_nextVertex = nextVertex;\n this.m_hasNextVertex = true;\n }\n\n getNextVertex(): Vec2 {\n return this.m_nextVertex;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): ChainShape {\n const clone = new ChainShape();\n clone._createChain(this.m_vertices);\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_prevVertex = this.m_prevVertex;\n clone.m_nextVertex = this.m_nextVertex;\n clone.m_hasPrevVertex = this.m_hasPrevVertex;\n clone.m_hasNextVertex = this.m_hasNextVertex;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): number {\n // edge count = vertex count - 1\n return this.m_count - 1;\n }\n\n // Get a child edge.\n getChildEdge(edge: EdgeShape, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count - 1);\n edge.m_type = EdgeShape.TYPE;\n edge.m_radius = this.m_radius;\n\n edge.m_vertex1 = this.m_vertices[childIndex];\n edge.m_vertex2 = this.m_vertices[childIndex + 1];\n\n if (childIndex > 0) {\n edge.m_vertex0 = this.m_vertices[childIndex - 1];\n edge.m_hasVertex0 = true;\n } else {\n edge.m_vertex0 = this.m_prevVertex;\n edge.m_hasVertex0 = this.m_hasPrevVertex;\n }\n\n if (childIndex < this.m_count - 2) {\n edge.m_vertex3 = this.m_vertices[childIndex + 2];\n edge.m_hasVertex3 = true;\n } else {\n edge.m_vertex3 = this.m_nextVertex;\n edge.m_hasVertex3 = this.m_hasNextVertex;\n }\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index <= this.m_count);\n if (index < this.m_count) {\n return this.m_vertices[index];\n } else {\n return this.m_vertices[0];\n }\n }\n\n isLoop(): boolean {\n return this.m_isLoop;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * This always return false.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n\n const edgeShape = new EdgeShape(this.getVertex(childIndex), this.getVertex(childIndex + 1));\n return edgeShape.rayCast(output, input, xf, 0);\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n\n const v1 = Transform.mulVec2(xf, this.getVertex(childIndex));\n const v2 = Transform.mulVec2(xf, this.getVertex(childIndex + 1));\n\n aabb.combinePoints(v1, v2);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * Chains have zero mass.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center = Vec2.zero();\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n proxy.m_buffer[0] = this.getVertex(childIndex);\n proxy.m_buffer[1] = this.getVertex(childIndex + 1);\n proxy.m_vertices = proxy.m_buffer;\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n}\n\nexport const Chain = ChainShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A convex polygon. It is assumed that the interior of the polygon is to the\n * left of each edge. Polygons have a maximum number of vertices equal to\n * Settings.maxPolygonVertices. In most cases you should not need many vertices\n * for a convex polygon. extends Shape\n */\nexport class PolygonShape extends Shape {\n static TYPE = 'polygon' as const;\n m_type: 'polygon';\n\n m_centroid: Vec2;\n m_vertices: Vec2[]; // [Settings.maxPolygonVertices]\n m_normals: Vec2[]; // [Settings.maxPolygonVertices]\n m_count: number;\n m_radius: number;\n\n // @ts-ignore\n constructor(vertices?: Vec2Value[]) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PolygonShape)) {\n return new PolygonShape(vertices);\n }\n\n super();\n\n this.m_type = PolygonShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_centroid = Vec2.zero();\n this.m_vertices = [];\n this.m_normals = [];\n this.m_count = 0;\n\n if (vertices && vertices.length) {\n this._set(vertices);\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertices: this.m_vertices,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): PolygonShape {\n const vertices: Vec2[] = [];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n\n const shape = new PolygonShape(vertices);\n return shape;\n }\n\n getType(): 'polygon' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): PolygonShape {\n const clone = new PolygonShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_count = this.m_count;\n clone.m_centroid.setVec2(this.m_centroid);\n for (let i = 0; i < this.m_count; i++) {\n clone.m_vertices.push(this.m_vertices[i].clone());\n }\n for (let i = 0; i < this.m_normals.length; i++) {\n clone.m_normals.push(this.m_normals[i].clone());\n }\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /** @internal */\n _reset(): void {\n this._set(this.m_vertices);\n }\n\n /**\n * @internal\n *\n * Create a convex hull from the given array of local points. The count must be\n * in the range [3, Settings.maxPolygonVertices].\n *\n * Warning: the points may be re-ordered, even if they form a convex polygon\n * Warning: collinear points are handled but not removed. Collinear points may\n * lead to poor stacking behavior.\n */\n _set(vertices: Vec2Value[]): void {\n _ASSERT && console.assert(3 <= vertices.length && vertices.length <= Settings.maxPolygonVertices);\n if (vertices.length < 3) {\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n let n = Math.min(vertices.length, Settings.maxPolygonVertices);\n\n // Perform welding and copy vertices into local buffer.\n const ps: Vec2[] = []; // [Settings.maxPolygonVertices];\n for (let i = 0; i < n; ++i) {\n const v = vertices[i];\n\n let unique = true;\n for (let j = 0; j < ps.length; ++j) {\n if (Vec2.distanceSquared(v, ps[j]) < 0.25 * Settings.linearSlopSquared) {\n unique = false;\n break;\n }\n }\n\n if (unique) {\n ps.push(Vec2.clone(v));\n }\n }\n\n n = ps.length;\n if (n < 3) {\n // Polygon is degenerate.\n _ASSERT && console.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n // Create the convex hull using the Gift wrapping algorithm\n // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm\n\n // Find the right most point on the hull (in case of multiple points bottom most is used)\n let i0 = 0;\n let x0 = ps[0].x;\n for (let i = 1; i < n; ++i) {\n const x = ps[i].x;\n if (x > x0 || (x === x0 && ps[i].y < ps[i0].y)) {\n i0 = i;\n x0 = x;\n }\n }\n\n const hull = [] as number[]; // [Settings.maxPolygonVertices];\n let m = 0;\n let ih = i0;\n\n while (true) {\n hull[m] = ih;\n\n let ie = 0;\n for (let j = 1; j < n; ++j) {\n if (ie === ih) {\n ie = j;\n continue;\n }\n\n const r = Vec2.sub(ps[ie], ps[hull[m]]);\n const v = Vec2.sub(ps[j], ps[hull[m]]);\n const c = Vec2.crossVec2Vec2(r, v);\n // c < 0 means counter-clockwise wrapping, c > 0 means clockwise wrapping\n if (c < 0.0) {\n ie = j;\n }\n\n // Collinearity check\n if (c === 0.0 && v.lengthSquared() > r.lengthSquared()) {\n ie = j;\n }\n }\n\n ++m;\n ih = ie;\n\n if (ie === i0) {\n break;\n }\n }\n\n if (m < 3) {\n // Polygon is degenerate.\n _ASSERT && console.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n this.m_count = m;\n\n // Copy vertices.\n this.m_vertices = [];\n for (let i = 0; i < m; ++i) {\n this.m_vertices[i] = ps[hull[i]];\n }\n\n // Compute normals. Ensure the edges have non-zero length.\n for (let i = 0; i < m; ++i) {\n const i1 = i;\n const i2 = i + 1 < m ? i + 1 : 0;\n const edge = Vec2.sub(this.m_vertices[i2], this.m_vertices[i1]);\n _ASSERT && console.assert(edge.lengthSquared() > Math.EPSILON * Math.EPSILON);\n this.m_normals[i] = Vec2.crossVec2Num(edge, 1.0);\n this.m_normals[i].normalize();\n }\n\n // Compute the polygon centroid.\n this.m_centroid = ComputeCentroid(this.m_vertices, m);\n }\n\n /** @internal */\n _setAsBox(hx: number, hy: number, center?: Vec2Value, angle?: number): void {\n // start with right-bottom, counter-clockwise, as in Gift wrapping algorithm in PolygonShape._set()\n this.m_vertices[0] = Vec2.neo(hx, -hy);\n this.m_vertices[1] = Vec2.neo(hx, hy);\n this.m_vertices[2] = Vec2.neo(-hx, hy);\n this.m_vertices[3] = Vec2.neo(-hx, -hy);\n\n this.m_normals[0] = Vec2.neo(1.0, 0.0);\n this.m_normals[1] = Vec2.neo(0.0, 1.0);\n this.m_normals[2] = Vec2.neo(-1.0, 0.0);\n this.m_normals[3] = Vec2.neo(0.0, -1.0);\n\n this.m_count = 4;\n\n if (Vec2.isValid(center)) {\n angle = angle || 0;\n\n this.m_centroid.setVec2(center);\n\n const xf = Transform.identity();\n xf.p.setVec2(center);\n xf.q.setAngle(angle);\n\n // Transform vertices and normals.\n for (let i = 0; i < this.m_count; ++i) {\n this.m_vertices[i] = Transform.mulVec2(xf, this.m_vertices[i]);\n this.m_normals[i] = Rot.mulVec2(xf.q, this.m_normals[i]);\n }\n }\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): boolean {\n const pLocal = Rot.mulTVec2(xf.q, Vec2.sub(p, xf.p));\n\n for (let i = 0; i < this.m_count; ++i) {\n const dot = Vec2.dot(this.m_normals[i], Vec2.sub(pLocal, this.m_vertices[i]));\n if (dot > 0.0) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n\n // Put the ray into the polygon's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n let lower = 0.0;\n let upper = input.maxFraction;\n\n let index = -1;\n\n for (let i = 0; i < this.m_count; ++i) {\n // p = p1 + a * d\n // dot(normal, p - v) = 0\n // dot(normal, p1 - v) + a * dot(normal, d) = 0\n const numerator = Vec2.dot(this.m_normals[i], Vec2.sub(this.m_vertices[i], p1));\n const denominator = Vec2.dot(this.m_normals[i], d);\n\n if (denominator == 0.0) {\n if (numerator < 0.0) {\n return false;\n }\n } else {\n // Note: we want this predicate without division:\n // lower < numerator / denominator, where denominator < 0\n // Since denominator < 0, we have to flip the inequality:\n // lower < numerator / denominator <==> denominator * lower > numerator.\n if (denominator < 0.0 && numerator < lower * denominator) {\n // Increase lower.\n // The segment enters this half-space.\n lower = numerator / denominator;\n index = i;\n } else if (denominator > 0.0 && numerator < upper * denominator) {\n // Decrease upper.\n // The segment exits this half-space.\n upper = numerator / denominator;\n }\n }\n\n // The use of epsilon here causes the assert on lower to trip\n // in some cases. Apparently the use of epsilon was to make edge\n // shapes work, but now those are handled separately.\n // if (upper < lower - Math.EPSILON)\n if (upper < lower) {\n return false;\n }\n }\n\n _ASSERT && console.assert(0.0 <= lower && lower <= input.maxFraction);\n\n if (index >= 0) {\n output.fraction = lower;\n output.normal = Rot.mulVec2(xf.q, this.m_normals[index]);\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < this.m_count; ++i) {\n const v = Transform.mulVec2(xf, this.m_vertices[i]);\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, v.y);\n maxY = Math.max(maxY, v.y);\n }\n\n aabb.lowerBound.setNum(minX, minY);\n aabb.upperBound.setNum(maxX, maxY);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n // Polygon mass, centroid, and inertia.\n // Let rho be the polygon density in mass per unit area.\n // Then:\n // mass = rho * int(dA)\n // centroid.x = (1/mass) * rho * int(x * dA)\n // centroid.y = (1/mass) * rho * int(y * dA)\n // I = rho * int((x*x + y*y) * dA)\n //\n // We can compute these integrals by summing all the integrals\n // for each triangle of the polygon. To evaluate the integral\n // for a single triangle, we make a change of variables to\n // the (u,v) coordinates of the triangle:\n // x = x0 + e1x * u + e2x * v\n // y = y0 + e1y * u + e2y * v\n // where 0 <= u && 0 <= v && u + v <= 1.\n //\n // We integrate u from [0,1-v] and then v from [0,1].\n // We also need to use the Jacobian of the transformation:\n // D = cross(e1, e2)\n //\n // Simplification: triangle centroid = (1/3) * (p1 + p2 + p3)\n //\n // The rest of the derivation is handled by computer algebra.\n\n _ASSERT && console.assert(this.m_count >= 3);\n\n const center = Vec2.zero();\n let area = 0.0;\n let I = 0.0;\n\n // s is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const s = Vec2.zero();\n\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < this.m_count; ++i) {\n s.add(this.m_vertices[i]);\n }\n s.mul(1.0 / this.m_count);\n\n const k_inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < this.m_count; ++i) {\n // Triangle vertices.\n const e1 = Vec2.sub(this.m_vertices[i], s);\n const e2 = i + 1 < this.m_count ? Vec2.sub(this.m_vertices[i + 1], s) : Vec2 .sub(this.m_vertices[0], s);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n center.addCombine(triangleArea * k_inv3, e1, triangleArea * k_inv3, e2);\n\n const ex1 = e1.x;\n const ey1 = e1.y;\n const ex2 = e2.x;\n const ey2 = e2.y;\n\n const intx2 = ex1 * ex1 + ex2 * ex1 + ex2 * ex2;\n const inty2 = ey1 * ey1 + ey2 * ey1 + ey2 * ey2;\n\n I += (0.25 * k_inv3 * D) * (intx2 + inty2);\n }\n\n // Total mass\n massData.mass = density * area;\n\n // Center of mass\n _ASSERT && console.assert(area > Math.EPSILON);\n center.mul(1.0 / area);\n massData.center.setCombine(1, center, 1, s);\n\n // Inertia tensor relative to the local origin (point s).\n massData.I = density * I;\n\n // Shift to center of mass then to original body origin.\n massData.I += massData.mass * (Vec2.dot(massData.center, massData.center) - Vec2.dot(center, center));\n }\n\n /**\n * Validate convexity. This is a very time consuming operation.\n * @returns true if valid\n */\n validate(): boolean {\n for (let i = 0; i < this.m_count; ++i) {\n const i1 = i;\n const i2 = i < this.m_count - 1 ? i1 + 1 : 0;\n const p = this.m_vertices[i1];\n const e = Vec2.sub(this.m_vertices[i2], p);\n\n for (let j = 0; j < this.m_count; ++j) {\n if (j == i1 || j == i2) {\n continue;\n }\n\n const v = Vec2.sub(this.m_vertices[j], p);\n const c = Vec2.crossVec2Vec2(e, v);\n if (c < 0.0) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices = this.m_vertices;\n proxy.m_count = this.m_count;\n proxy.m_radius = this.m_radius;\n }\n}\n\nfunction ComputeCentroid(vs: Vec2[], count: number): Vec2 {\n _ASSERT && console.assert(count >= 3);\n\n const c = Vec2.zero();\n let area = 0.0;\n\n // pRef is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const pRef = Vec2.zero();\n if (false) {\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < count; ++i) {\n pRef.add(vs[i]);\n }\n pRef.mul(1.0 / count);\n }\n\n const inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < count; ++i) {\n // Triangle vertices.\n const p1 = pRef;\n const p2 = vs[i];\n const p3 = i + 1 < count ? vs[i + 1] : vs[0];\n\n const e1 = Vec2.sub(p2, p1);\n const e2 = Vec2.sub(p3, p1);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n c.addMul(triangleArea * inv3, p1);\n c.addMul(triangleArea * inv3, p2);\n c.addMul(triangleArea * inv3, p3);\n }\n\n // Centroid\n _ASSERT && console.assert(area > Math.EPSILON);\n c.mul(1.0 / area);\n return c;\n}\n\nexport const Polygon = PolygonShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { Vec2Value } from '../../common/Vec2';\nimport { PolygonShape } from './PolygonShape';\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A rectangle polygon which extend PolygonShape.\n */\nexport class BoxShape extends PolygonShape {\n static TYPE = 'polygon' as const;\n\n constructor(hx: number, hy: number, center?: Vec2Value, angle?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof BoxShape)) {\n return new BoxShape(hx, hy, center, angle);\n }\n\n super();\n\n this._setAsBox(hx, hy, center, angle);\n }\n}\n\nexport const Box = BoxShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Shape } from '../Shape';\nimport { AABB, RayCastInput, RayCastOutput } from '../AABB';\nimport { Transform } from '../../common/Transform';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class CircleShape extends Shape {\n static TYPE = 'circle' as const;\n m_type: 'circle';\n\n m_p: Vec2;\n m_radius: number;\n\n constructor(position: Vec2Value, radius?: number);\n constructor(radius?: number);\n // tslint:disable-next-line:typedef\n constructor(a, b?) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof CircleShape)) {\n return new CircleShape(a, b);\n }\n\n super();\n\n this.m_type = CircleShape.TYPE;\n this.m_p = Vec2.zero();\n this.m_radius = 1;\n\n if (typeof a === 'object' && Vec2.isValid(a)) {\n this.m_p.setVec2(a);\n\n if (typeof b === 'number') {\n this.m_radius = b;\n }\n\n } else if (typeof a === 'number') {\n this.m_radius = a;\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n p: this.m_p,\n radius: this.m_radius,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): CircleShape {\n return new CircleShape(data.p, data.radius);\n }\n\n /** @internal */\n _reset(): void {\n // noop\n }\n\n getType(): 'circle' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getCenter(): Vec2 {\n return this.m_p;\n }\n\n getVertex(index: 0): Vec2 {\n _ASSERT && console.assert(index == 0);\n return this.m_p;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): CircleShape {\n const clone = new CircleShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_p = this.m_p.clone();\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): boolean {\n const center = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const d = Vec2.sub(p, center);\n return Vec2.dot(d, d) <= this.m_radius * this.m_radius;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // Collision Detection in Interactive 3D Environments by Gino van den Bergen\n // From Section 3.1.2\n // x = s + a * r\n // norm(x) = radius\n\n const position = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const s = Vec2.sub(input.p1, position);\n const b = Vec2.dot(s, s) - this.m_radius * this.m_radius;\n\n // Solve quadratic equation.\n const r = Vec2.sub(input.p2, input.p1);\n const c = Vec2.dot(s, r);\n const rr = Vec2.dot(r, r);\n const sigma = c * c - rr * b;\n\n // Check for negative discriminant and short segment.\n if (sigma < 0.0 || rr < Math.EPSILON) {\n return false;\n }\n\n // Find the point of intersection of the line with the circle.\n let a = -(c + Math.sqrt(sigma));\n\n // Is the intersection point on the segment?\n if (0.0 <= a && a <= input.maxFraction * rr) {\n a /= rr;\n output.fraction = a;\n output.normal = Vec2.add(s, Vec2.mulNumVec2(a, r));\n output.normal.normalize();\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const p = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n aabb.lowerBound.setNum(p.x - this.m_radius, p.y - this.m_radius);\n aabb.upperBound.setNum(p.x + this.m_radius, p.y + this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n massData.mass = density * Math.PI * this.m_radius * this.m_radius;\n massData.center = this.m_p;\n // inertia about the local origin\n massData.I = massData.mass\n * (0.5 * this.m_radius * this.m_radius + Vec2.dot(this.m_p, this.m_p));\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_p);\n proxy.m_count = 1;\n proxy.m_radius = this.m_radius;\n }\n\n}\n\nexport const Circle = CircleShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. A value of 0 disables softness.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * Distance length.\n */\n length?: number;\n}\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointDef extends JointDef, DistanceJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0\n};\n\n/**\n * A distance joint constrains two points on two bodies to remain at a fixed\n * distance from each other. You can view this as a massless, rigid rod.\n *\n * @param anchorA Anchor A in global coordination.\n * @param anchorB Anchor B in global coordination.\n */\nexport class DistanceJoint extends Joint {\n static TYPE = 'distance-joint' as const;\n\n // Solver shared\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_length: number;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_gamma: number;\n /** @internal */ m_bias: number;\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: DistanceJointDef);\n constructor(def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2);\n constructor(def: DistanceJointDef, bodyA?: Body, bodyB?: Body, anchorA?: Vec2, anchorB?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof DistanceJoint)) {\n return new DistanceJoint(def, bodyA, bodyB, anchorA, anchorB);\n }\n\n // order of constructor arguments is changed in v0.2\n if (bodyB && anchorA && ('m_type' in anchorA) && ('x' in bodyB) && ('y' in bodyB)) {\n const temp = bodyB;\n bodyB = anchorA as any as Body;\n anchorA = temp as any as Vec2;\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = DistanceJoint.TYPE;\n\n // Solver shared\n this.m_localAnchorA = Vec2.clone(anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.zero());\n this.m_length = Math.isFinite(def.length) ? def.length :\n Vec2.distance(bodyA.getWorldPoint(this.m_localAnchorA), bodyB.getWorldPoint(this.m_localAnchorB));\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n this.m_impulse = 0.0;\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n\n // 1-D constrained system\n // m (v2 - v1) = lambda\n // v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass.\n // x2 = x1 + h * v2\n\n // 1-D mass-damper-spring system\n // m (v2 - v1) + h * d * v2 + h * k *\n\n // C = norm(p2 - p1) - L\n // u = (p2 - p1) / norm(p2 - p1)\n // Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1))\n // J = [-u -cross(r1, u) u cross(r2, u)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n length: this.m_length,\n\n impulse: this.m_impulse,\n gamma: this.m_gamma,\n bias: this.m_bias,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): DistanceJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new DistanceJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n length?: number,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.length > 0) {\n this.m_length = +def.length;\n } else if (def.length < 0) { // don't change length\n } else if (def.anchorA || def.anchorA || def.anchorA || def.anchorA) {\n this.m_length = Vec2.distance(\n this.m_bodyA.getWorldPoint(this.m_localAnchorA),\n this.m_bodyB.getWorldPoint(this.m_localAnchorB)\n );\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the natural length. Manipulating the length can lead to non-physical\n * behavior when the frequency is zero.\n */\n setLength(length: number): void {\n this.m_length = length;\n }\n\n /**\n * Get the natural length.\n */\n getLength(): number {\n return this.m_length;\n }\n\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n this.m_u = Vec2.sub(Vec2.add(cB, this.m_rB), Vec2.add(cA, this.m_rA));\n\n // Handle singularity.\n const length = this.m_u.length();\n if (length > Settings.linearSlop) {\n this.m_u.mul(1.0 / length);\n } else {\n this.m_u.setNum(0.0, 0.0);\n }\n\n const crAu = Vec2.crossVec2Vec2(this.m_rA, this.m_u);\n const crBu = Vec2.crossVec2Vec2(this.m_rB, this.m_u);\n let invMass = this.m_invMassA + this.m_invIA * crAu * crAu + this.m_invMassB\n + this.m_invIB * crBu * crBu;\n\n // Compute the effective mass matrix.\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (this.m_frequencyHz > 0.0) {\n const C = length - this.m_length;\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * this.m_mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = this.m_mass * omega * omega;\n\n // magic formulas\n const h = step.dt;\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invMass += this.m_gamma;\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n } else {\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n const Cdot = Vec2.dot(this.m_u, vpB) - Vec2.dot(this.m_u, vpA);\n\n const impulse = -this.m_mass\n * (Cdot + this.m_bias + this.m_gamma * this.m_impulse);\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u);\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n if (this.m_frequencyHz > 0.0) {\n // There is no position correction for soft distance constraints.\n return true;\n }\n\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA));\n\n const length = u.normalize();\n let C = length - this.m_length;\n C = Math\n .clamp(C, -Settings.maxLinearCorrection, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C;\n const P = Vec2.mulNumVec2(impulse, u);\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointOpt extends JointOpt {\n /**\n * The maximum friction force in N.\n */\n maxForce?: number;\n /**\n * The maximum friction torque in N-m.\n */\n maxTorque?: number;\n}\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointDef extends JointDef, FrictionJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n maxTorque : 0.0,\n};\n\n/**\n * Friction joint. This is used for top-down friction. It provides 2D\n * translational friction and angular friction.\n *\n * @param anchor Anchor in global coordination.\n */\nexport class FrictionJoint extends Joint {\n static TYPE = 'friction-joint' as const;\n\n /** @internal */ m_type: 'friction-joint';\n\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n // Solver shared\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: FrictionJointDef);\n constructor(def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: FrictionJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof FrictionJoint)) {\n return new FrictionJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = FrictionJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n\n // Solver shared\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): FrictionJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new FrictionJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && console.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && console.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y\n * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x\n * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt; // float\n\n // Solve angular friction\n {\n const Cdot = wB - wA; // float\n let impulse = -this.m_angularMass * Cdot; // float\n\n const oldImpulse = this.m_angularImpulse; // float\n const maxImpulse = h * this.m_maxTorque; // float\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)), Vec2.add(vA,\n Vec2.crossNumVec2(wA, this.m_rA))); // Vec2\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); // Vec2\n const oldImpulse = this.m_linearImpulse; // Vec2\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce; // float\n\n if (this.m_linearImpulse.lengthSquared() > maxImpulse * maxImpulse) {\n this.m_linearImpulse.normalize();\n this.m_linearImpulse.mul(maxImpulse);\n }\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from './Vec2';\nimport { Vec3 } from './Vec3';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 3-by-3 matrix. Stored in column-major order.\n */\nexport class Mat33 {\n ex: Vec3;\n ey: Vec3;\n ez: Vec3;\n\n constructor(a: Vec3, b: Vec3, c: Vec3);\n constructor();\n constructor(a?: Vec3, b?: Vec3, c?: Vec3) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec3.clone(a);\n this.ey = Vec3.clone(b);\n this.ez = Vec3.clone(c);\n } else {\n this.ex = Vec3.zero();\n this.ey = Vec3.zero();\n this.ez = Vec3.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec3.isValid(obj.ex) && Vec3.isValid(obj.ey) && Vec3.isValid(obj.ez);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Mat33.isValid(o), 'Invalid Mat33!', o);\n }\n\n /**\n * Set this matrix to all zeros.\n */\n setZero(): Mat33 {\n this.ex.setZero();\n this.ey.setZero();\n this.ez.setZero();\n return this;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve33(v: Vec3): Vec3 {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = new Vec3();\n r.x = det * Vec3.dot(v, Vec3.cross(this.ey, this.ez));\n r.y = det * Vec3.dot(this.ex, Vec3.cross(v, this.ez));\n r.z = det * Vec3.dot(this.ex, Vec3.cross(this.ey, v));\n return r;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix\n * equation.\n */\n solve22(v: Vec2): Vec2 {\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a21 = this.ex.y;\n const a22 = this.ey.y;\n let det = a11 * a22 - a12 * a21;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = Vec2.zero();\n r.x = det * (a22 * v.x - a12 * v.y);\n r.y = det * (a11 * v.y - a21 * v.x);\n return r;\n }\n\n /**\n * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if\n * singular.\n */\n getInverse22(M: Mat33): void {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n M.ex.x = det * d;\n M.ey.x = -det * b;\n M.ex.z = 0.0;\n M.ex.y = -det * c;\n M.ey.y = det * a;\n M.ey.z = 0.0;\n M.ez.x = 0.0;\n M.ez.y = 0.0;\n M.ez.z = 0.0;\n }\n\n /**\n * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix\n * if singular.\n */\n getSymInverse33(M: Mat33): void {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a13 = this.ez.x;\n const a22 = this.ey.y;\n const a23 = this.ez.y;\n const a33 = this.ez.z;\n\n M.ex.x = det * (a22 * a33 - a23 * a23);\n M.ex.y = det * (a13 * a23 - a12 * a33);\n M.ex.z = det * (a12 * a23 - a13 * a22);\n\n M.ey.x = M.ex.y;\n M.ey.y = det * (a11 * a33 - a13 * a13);\n M.ey.z = det * (a13 * a12 - a11 * a23);\n\n M.ez.x = M.ex.z;\n M.ez.y = M.ey.z;\n M.ez.z = det * (a11 * a22 - a12 * a12);\n }\n\n /**\n * Multiply a matrix times a vector.\n */\n static mul(a: Mat33, b: Vec2): Vec2;\n static mul(a: Mat33, b: Vec3): Vec3;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n _ASSERT && Mat33.assert(a);\n if (b && 'z' in b && 'y' in b && 'x' in b) {\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n\n } else if (b && 'y' in b && 'x' in b) {\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulVec3(a: Mat33, b: Vec3): Vec3 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n }\n\n static mulVec2(a: Mat33, b: Vec2): Vec2 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n static add(a: Mat33, b: Mat33): Mat33 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Mat33.assert(b);\n return new Mat33(\n Vec3.add(a.ex, b.ex),\n Vec3.add(a.ey, b.ey),\n Vec3.add(a.ez, b.ez)\n );\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat22 } from '../../common/Mat22';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointOpt extends JointOpt {\n /**\n * The lower angle for the joint limit (radians).\n */\n lowerAngle?: number;\n /**\n * The upper angle for the joint limit (radians).\n */\n upperAngle?: number;\n /**\n * The maximum motor torque used to achieve the desired motor speed. Usually\n * in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed. Usually in radians per second.\n */\n motorSpeed?: number;\n /**\n * A flag to enable joint limits.\n */\n enableLimit?: boolean;\n /**\n * A flag to enable the joint motor.\n */\n enableMotor?: boolean;\n}\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointDef extends JointDef, RevoluteJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n lowerAngle : 0.0,\n upperAngle : 0.0,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n enableLimit : false,\n enableMotor : false\n};\n\n/**\n * A revolute joint constrains two bodies to share a common point while they are\n * free to rotate about the point. The relative rotation about the shared point\n * is the joint angle. You can limit the relative rotation with a joint limit\n * that specifies a lower and upper angle. You can use a motor to drive the\n * relative rotation about the shared point. A maximum motor torque is provided\n * so that infinite forces are not generated.\n */\nexport class RevoluteJoint extends Joint {\n static TYPE = 'revolute-joint' as const;\n\n /** @internal */ m_type: 'revolute-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerAngle: number;\n /** @internal */ m_upperAngle: number;\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n // effective mass for point-to-point constraint.\n /** @internal */ m_mass: Mat33 = new Mat33();\n // effective mass for motor/limit angular constraint.\n /** @internal */ m_motorMass: number;\n /** @internal */ m_limitState: number = inactiveLimit; // TODO enum\n\n constructor(def: RevoluteJointDef);\n constructor(def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n // @ts-ignore\n constructor(def: RevoluteJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof RevoluteJoint)) {\n return new RevoluteJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RevoluteJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorImpulse = 0.0;\n\n this.m_lowerAngle = def.lowerAngle;\n this.m_upperAngle = def.upperAngle;\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Motor constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerAngle: this.m_lowerAngle,\n upperAngle: this.m_upperAngle,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any):RevoluteJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RevoluteJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle in radians.\n */\n getJointAngle(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle speed in radians per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_angularVelocity - bA.m_angularVelocity;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Get the current motor torque given the inverse time step. Unit is N*m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set the motor speed in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set the maximum motor torque, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit in radians.\n */\n getLowerLimit(): number {\n return this.m_lowerAngle;\n }\n\n /**\n * Get the upper joint limit in radians.\n */\n getUpperLimit(): number {\n return this.m_upperAngle;\n }\n\n /**\n * Set the joint limits in radians.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && console.assert(lower <= upper);\n\n if (lower != this.m_lowerAngle || upper != this.m_upperAngle) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_impulse.z = 0.0;\n this.m_lowerAngle = lower;\n this.m_upperAngle = upper;\n }\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force given the inverse time step. Unit is N.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque due to the joint limit given the inverse time step.\n * Unit is N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n this.m_mass.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y\n * this.m_rB.y * iB;\n this.m_mass.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y\n * this.m_rB.x * iB;\n this.m_mass.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n this.m_mass.ex.y = this.m_mass.ey.x;\n this.m_mass.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x\n * this.m_rB.x * iB;\n this.m_mass.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n this.m_mass.ex.z = this.m_mass.ez.x;\n this.m_mass.ey.z = this.m_mass.ez.y;\n this.m_mass.ez.z = iA + iB;\n\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n\n if (this.m_enableMotor == false || fixedRotation) {\n this.m_motorImpulse = 0.0;\n }\n\n if (this.m_enableLimit && fixedRotation == false) {\n const jointAngle = aB - aA - this.m_referenceAngle; // float\n\n if (Math.abs(this.m_upperAngle - this.m_lowerAngle) < 2.0 * Settings.angularSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointAngle <= this.m_lowerAngle) {\n if (this.m_limitState != atLowerLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atLowerLimit;\n\n } else if (jointAngle >= this.m_upperAngle) {\n if (this.m_limitState != atUpperLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atUpperLimit;\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_motorImpulse + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_motorImpulse + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n // Solve motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits\n && fixedRotation == false) {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const impulse = Vec3.neg(this.m_mass.solve33(Cdot)); // Vec3\n\n if (this.m_limitState == equalLimits) {\n this.m_impulse.add(impulse);\n\n } else if (this.m_limitState == atLowerLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse < 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n\n } else if (this.m_limitState == atUpperLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse > 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n\n } else {\n // Solve point-to-point constraint\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const impulse = this.m_mass.solve22(Vec2.neg(Cdot)); // Vec2\n\n this.m_impulse.x += impulse.x;\n this.m_impulse.y += impulse.y;\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n let angularError = 0.0; // float\n let positionError = 0.0; // float\n\n const fixedRotation = (this.m_invIA + this.m_invIB == 0.0); // bool\n\n // Solve angular limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const angle = aB - aA - this.m_referenceAngle; // float\n let limitImpulse = 0.0; // float\n\n if (this.m_limitState == equalLimits) {\n // Prevent large angular corrections\n const C = Math.clamp(angle - this.m_lowerAngle,\n -Settings.maxAngularCorrection, Settings.maxAngularCorrection); // float\n limitImpulse = -this.m_motorMass * C;\n angularError = Math.abs(C);\n\n } else if (this.m_limitState == atLowerLimit) {\n let C = angle - this.m_lowerAngle; // float\n angularError = -C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C + Settings.angularSlop, -Settings.maxAngularCorrection,\n 0.0);\n limitImpulse = -this.m_motorMass * C;\n\n } else if (this.m_limitState == atUpperLimit) {\n let C = angle - this.m_upperAngle; // float\n angularError = C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C - Settings.angularSlop, 0.0,\n Settings.maxAngularCorrection);\n limitImpulse = -this.m_motorMass * C;\n }\n\n aA -= this.m_invIA * limitImpulse;\n aB += this.m_invIB * limitImpulse;\n }\n\n // Solve point-to-point constraint.\n {\n qA.setAngle(aA);\n qB.setAngle(aB);\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n\n const C = Vec2.zero();\n C.addCombine(1, cB, 1, rB);\n C.subCombine(1, cA, 1, rA);\n positionError = C.length();\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y;\n K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x;\n\n const impulse = Vec2.neg(K.solve(C)); // Vec2\n\n cA.subMul(mA, impulse);\n aA -= iA * Vec2.crossVec2Vec2(rA, impulse);\n\n cB.addMul(mB, impulse);\n aB += iB * Vec2.crossVec2Vec2(rB, impulse);\n }\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat22 } from '../../common/Mat22';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointOpt extends JointOpt {\n /**\n * Enable/disable the joint limit.\n */\n enableLimit?: boolean;\n /**\n * The lower translation limit, usually in meters.\n */\n lowerTranslation?: number;\n /**\n * The upper translation limit, usually in meters.\n */\n upperTranslation?: number;\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorForce?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n}\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointDef extends JointDef, PrismaticJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation unit axis in bodyA.\n */\n localAxisA: Vec2;\n /**\n * referenceAngle The constrained angle between the bodies:\n * bodyB_angle - bodyA_angle.\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n enableLimit : false,\n lowerTranslation : 0.0,\n upperTranslation : 0.0,\n enableMotor : false,\n maxMotorForce : 0.0,\n motorSpeed : 0.0\n};\n\n/**\n * A prismatic joint. This joint provides one degree of freedom: translation\n * along an axis fixed in bodyA. Relative rotation is prevented. You can use a\n * joint limit to restrict the range of motion and a joint motor to drive the\n * motion or to model joint friction.\n */\nexport class PrismaticJoint extends Joint {\n static TYPE = 'prismatic-joint' as const;\n\n /** @internal */ m_type: 'prismatic-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerTranslation: number;\n /** @internal */ m_upperTranslation: number;\n /** @internal */ m_maxMotorForce: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n /** @internal */ m_limitState: number; // TODO enum\n /** @internal */ m_axis: Vec2;\n /** @internal */ m_perp: Vec2;\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_s1: number;\n /** @internal */ m_s2: number;\n /** @internal */ m_a1: number;\n /** @internal */ m_a2: number;\n /** @internal */ m_K: Mat33;\n\n constructor(def: PrismaticJointDef);\n constructor(def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n constructor(def: PrismaticJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PrismaticJoint)) {\n return new PrismaticJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PrismaticJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || Vec2.neo(1.0, 0.0));\n this.m_localXAxisA.normalize();\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n\n this.m_lowerTranslation = def.lowerTranslation;\n this.m_upperTranslation = def.upperTranslation;\n this.m_maxMotorForce = def.maxMotorForce;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n this.m_limitState = inactiveLimit;\n\n this.m_axis = Vec2.zero();\n this.m_perp = Vec2.zero();\n\n this.m_K = new Mat33();\n\n // Linear constraint (point-to-line)\n // d = p2 - p1 = x2 + r2 - x1 - r1\n // C = dot(perp, d)\n // Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 -\n // cross(w1, r1))\n // = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) +\n // dot(cross(r2, perp), v2)\n // J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)]\n //\n // Angular constraint\n // C = a2 - a1 + a_initial\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n //\n // K = J * invM * JT\n //\n // J = [-a -s1 a s2]\n // [0 -1 0 1]\n // a = perp\n // s1 = cross(d + r1, a) = cross(p2 - x1, a)\n // s2 = cross(r2, a) = cross(p2 - x2, a)\n\n // Motor/Limit linear constraint\n // C = dot(ax1, d)\n // Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) +\n // dot(cross(r2, ax1), v2)\n // J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)]\n\n // Block Solver\n // We develop a block solver that includes the joint limit. This makes the\n // limit stiff (inelastic) even\n // when the mass has poor distribution (leading to large torques about the\n // joint anchor points).\n //\n // The Jacobian has 3 rows:\n // J = [-uT -s1 uT s2] // linear\n // [0 -1 0 1] // angular\n // [-vT -a1 vT a2] // limit\n //\n // u = perp\n // v = axis\n // s1 = cross(d + r1, u), s2 = cross(r2, u)\n // a1 = cross(d + r1, v), a2 = cross(r2, v)\n\n // M * (v2 - v1) = JT * df\n // J * v2 = bias\n //\n // v2 = v1 + invM * JT * df\n // J * (v1 + invM * JT * df) = bias\n // K * df = bias - J * v1 = -Cdot\n // K = J * invM * JT\n // Cdot = J * v1 - bias\n //\n // Now solve for f2.\n // df = f2 - f1\n // K * (f2 - f1) = -Cdot\n // f2 = invK * (-Cdot) + f1\n //\n // Clamp accumulated limit impulse.\n // lower: f2(3) = max(f2(3), 0)\n // upper: f2(3) = min(f2(3), 0)\n //\n // Solve for correct f2(1:2)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1\n // = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) +\n // K(1:2,1:2) * f1(1:2)\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n //\n // Now compute impulse to be applied:\n // df = f2 - f1\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerTranslation: this.m_lowerTranslation,\n upperTranslation: this.m_upperTranslation,\n maxMotorForce: this.m_maxMotorForce,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PrismaticJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.localAxisA = Vec2.clone(data.localAxisA);\n const joint = new PrismaticJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const pA = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const pB = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const d = Vec2.sub(pB, pA);\n const axis = this.m_bodyA.getWorldVector(this.m_localXAxisA);\n\n const translation = Vec2.dot(d, axis);\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const rA = Rot.mulVec2(bA.m_xf.q, Vec2.sub(this.m_localAnchorA, bA.m_sweep.localCenter)); // Vec2\n const rB = Rot.mulVec2(bB.m_xf.q, Vec2.sub(this.m_localAnchorB, bB.m_sweep.localCenter)); // Vec2\n const p1 = Vec2.add(bA.m_sweep.c, rA); // Vec2\n const p2 = Vec2.add(bB.m_sweep.c, rB); // Vec2\n const d = Vec2.sub(p2, p1); // Vec2\n const axis = Rot.mulVec2(bA.m_xf.q, this.m_localXAxisA); // Vec2\n\n const vA = bA.m_linearVelocity; // Vec2\n const vB = bB.m_linearVelocity; // Vec2\n const wA = bA.m_angularVelocity; // float\n const wB = bB.m_angularVelocity; // float\n\n const speed = Vec2.dot(d, Vec2.crossNumVec2(wA, axis))\n + Vec2.dot(axis, Vec2.sub(Vec2.addCrossNumVec2(vB, wB, rB), Vec2.addCrossNumVec2(vA, wA, rA))); // float\n return speed;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit, usually in meters.\n */\n getLowerLimit(): number {\n return this.m_lowerTranslation;\n }\n\n /**\n * Get the upper joint limit, usually in meters.\n */\n getUpperLimit(): number {\n return this.m_upperTranslation;\n }\n\n /**\n * Set the joint limits, usually in meters.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && console.assert(lower <= upper);\n if (lower != this.m_lowerTranslation || upper != this.m_upperTranslation) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_lowerTranslation = lower;\n this.m_upperTranslation = upper;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in meters per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Set the maximum motor force, usually in N.\n */\n setMaxMotorForce(force: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorForce = force;\n }\n\n getMaxMotorForce(): number {\n return this.m_maxMotorForce;\n }\n\n /**\n * Get the motor speed, usually in meters per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Get the current motor force given the inverse time step, usually in N.\n */\n getMotorForce(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + this.m_impulse.z, this.m_axis).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.y;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute motor Jacobian and effective mass.\n {\n this.m_axis = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_axis);\n this.m_a2 = Vec2.crossVec2Vec2(rB, this.m_axis);\n\n this.m_motorMass = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2\n * this.m_a2;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n }\n\n // Prismatic constraint.\n {\n this.m_perp = Rot.mulVec2(qA, this.m_localYAxisA);\n\n this.m_s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_perp);\n this.m_s2 = Vec2.crossVec2Vec2(rB, this.m_perp);\n\n const s1test = Vec2.crossVec2Vec2(rA, this.m_perp);\n\n const k11 = mA + mB + iA * this.m_s1 * this.m_s1 + iB * this.m_s2 * this.m_s2;\n const k12 = iA * this.m_s1 + iB * this.m_s2;\n const k13 = iA * this.m_s1 * this.m_a1 + iB * this.m_s2 * this.m_a2;\n let k22 = iA + iB;\n if (k22 == 0.0) {\n // For bodies with fixed rotation.\n k22 = 1.0;\n }\n const k23 = iA * this.m_a1 + iB * this.m_a2;\n const k33 = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 * this.m_a2;\n\n this.m_K.ex.set(k11, k12, k13);\n this.m_K.ey.set(k12, k22, k23);\n this.m_K.ez.set(k13, k23, k33);\n }\n\n // Compute motor and limit terms.\n if (this.m_enableLimit) {\n\n const jointTranslation = Vec2.dot(this.m_axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * Settings.linearSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointTranslation <= this.m_lowerTranslation) {\n if (this.m_limitState != atLowerLimit) {\n this.m_limitState = atLowerLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else if (jointTranslation >= this.m_upperTranslation) {\n if (this.m_limitState != atUpperLimit) {\n this.m_limitState = atUpperLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n if (this.m_enableMotor == false) {\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse\n + this.m_impulse.z, this.m_axis);\n const LA = this.m_impulse.x * this.m_s1 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1;\n const LB = this.m_impulse.x * this.m_s2 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Solve linear motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits) {\n const Cdot = Vec2.dot(this.m_axis, Vec2.sub(vB, vA)) + this.m_a2 * wB\n - this.m_a1 * wA;\n let impulse = this.m_motorMass * (this.m_motorSpeed - Cdot);\n const oldImpulse = this.m_motorImpulse;\n const maxImpulse = step.dt * this.m_maxMotorForce;\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_axis);\n const LA = impulse * this.m_a1;\n const LB = impulse * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n const Cdot1 = Vec2.zero();\n Cdot1.x += Vec2.dot(this.m_perp, vB) + this.m_s2 * wB;\n Cdot1.x -= Vec2.dot(this.m_perp, vA) + this.m_s1 * wA;\n Cdot1.y = wB - wA;\n\n if (this.m_enableLimit && this.m_limitState != inactiveLimit) {\n // Solve prismatic and limit constraint in block form.\n let Cdot2 = 0;\n Cdot2 += Vec2.dot(this.m_axis, vB) + this.m_a2 * wB;\n Cdot2 -= Vec2.dot(this.m_axis, vA) + this.m_a1 * wA;\n\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const f1 = Vec3.clone(this.m_impulse);\n let df = this.m_K.solve33(Vec3.neg(Cdot)); // Vec3\n this.m_impulse.add(df);\n\n if (this.m_limitState == atLowerLimit) {\n this.m_impulse.z = Math.max(this.m_impulse.z, 0.0);\n } else if (this.m_limitState == atUpperLimit) {\n this.m_impulse.z = Math.min(this.m_impulse.z, 0.0);\n }\n\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n const b = Vec2.combine(-1, Cdot1, -(this.m_impulse.z - f1.z), Vec2.neo(this.m_K.ez.x, this.m_K.ez.y)); // Vec2\n const f2r = Vec2.add(this.m_K.solve22(b), Vec2.neo(f1.x, f1.y)); // Vec2\n this.m_impulse.x = f2r.x;\n this.m_impulse.y = f2r.y;\n\n df = Vec3.sub(this.m_impulse, f1);\n\n const P = Vec2.combine(df.x, this.m_perp, df.z, this.m_axis); // Vec2\n const LA = df.x * this.m_s1 + df.y + df.z * this.m_a1; // float\n const LB = df.x * this.m_s2 + df.y + df.z * this.m_a2; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n // Limit is inactive, just solve the prismatic constraint in block form.\n const df = this.m_K.solve22(Vec2.neg(Cdot1)); // Vec2\n this.m_impulse.x += df.x;\n this.m_impulse.y += df.y;\n\n const P = Vec2.mulNumVec2(df.x, this.m_perp); // Vec2\n const LA = df.x * this.m_s1 + df.y; // float\n const LB = df.x * this.m_s2 + df.y; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute fresh Jacobians\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n const d = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); // Vec2\n\n const axis = Rot.mulVec2(qA, this.m_localXAxisA); // Vec2\n const a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), axis); // float\n const a2 = Vec2.crossVec2Vec2(rB, axis); // float\n const perp = Rot.mulVec2(qA, this.m_localYAxisA); // Vec2\n\n const s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), perp); // float\n const s2 = Vec2.crossVec2Vec2(rB, perp); // float\n\n let impulse = new Vec3();\n const C1 = Vec2.zero(); // Vec2\n C1.x = Vec2.dot(perp, d);\n C1.y = aB - aA - this.m_referenceAngle;\n\n let linearError = Math.abs(C1.x); // float\n const angularError = Math.abs(C1.y); // float\n\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n let active = false; // bool\n let C2 = 0.0; // float\n if (this.m_enableLimit) {\n\n const translation = Vec2.dot(axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * linearSlop) {\n // Prevent large angular corrections\n C2 = Math.clamp(translation, -maxLinearCorrection, maxLinearCorrection);\n linearError = Math.max(linearError, Math.abs(translation));\n active = true;\n\n } else if (translation <= this.m_lowerTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_lowerTranslation + linearSlop,\n -maxLinearCorrection, 0.0);\n linearError = Math\n .max(linearError, this.m_lowerTranslation - translation);\n active = true;\n\n } else if (translation >= this.m_upperTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_upperTranslation - linearSlop, 0.0,\n maxLinearCorrection);\n linearError = Math\n .max(linearError, translation - this.m_upperTranslation);\n active = true;\n }\n }\n\n if (active) {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n const k13 = iA * s1 * a1 + iB * s2 * a2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n // For fixed rotation\n k22 = 1.0;\n }\n const k23 = iA * a1 + iB * a2; // float\n const k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; // float\n\n const K = new Mat33();\n K.ex.set(k11, k12, k13);\n K.ey.set(k12, k22, k23);\n K.ez.set(k13, k23, k33);\n\n const C = new Vec3();\n C.x = C1.x;\n C.y = C1.y;\n C.z = C2;\n\n impulse = K.solve33(Vec3.neg(C));\n } else {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n k22 = 1.0;\n }\n\n const K = new Mat22();\n K.ex.setNum(k11, k12);\n K.ey.setNum(k12, k22);\n\n const impulse1 = K.solve(Vec2.neg(C1)); // Vec2\n impulse.x = impulse1.x;\n impulse.y = impulse1.y;\n impulse.z = 0.0;\n }\n\n const P = Vec2.combine(impulse.x, perp, impulse.z, axis); // Vec2\n const LA = impulse.x * s1 + impulse.y + impulse.z * a1; // float\n const LB = impulse.x * s2 + impulse.y + impulse.z * a2; // float\n\n cA.subMul(mA, P);\n aA -= iA * LA;\n cB.addMul(mB, P);\n aB += iB * LB;\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { RevoluteJoint } from './RevoluteJoint';\nimport { PrismaticJoint } from './PrismaticJoint';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Gear joint definition.\n */\nexport interface GearJointOpt extends JointOpt {\n /**\n * The gear ratio. See {@link GearJoint} for explanation.\n */\n ratio?: number;\n}\n/**\n * Gear joint definition.\n */\nexport interface GearJointDef extends JointDef, GearJointOpt {\n /**\n * The first revolute/prismatic joint attached to the gear joint.\n */\n joint1: RevoluteJoint | PrismaticJoint;\n /**\n * The second prismatic/revolute joint attached to the gear joint.\n */\n joint2: RevoluteJoint | PrismaticJoint;\n}\n\nconst DEFAULTS = {\n ratio : 1.0\n};\n\n/**\n * A gear joint is used to connect two joints together. Either joint can be a\n * revolute or prismatic joint. You specify a gear ratio to bind the motions\n * together: coordinate1 + ratio * coordinate2 = constant\n *\n * The ratio can be negative or positive. If one joint is a revolute joint and\n * the other joint is a prismatic joint, then the ratio will have units of\n * length or units of 1/length. Warning: You have to manually destroy the gear\n * joint if joint1 or joint2 is destroyed.\n *\n * This definition requires two existing revolute or prismatic joints (any\n * combination will work).\n */\nexport class GearJoint extends Joint {\n static TYPE = 'gear-joint' as const;\n\n /** @internal */ m_type: 'gear-joint';\n /** @internal */ m_joint1: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_joint2: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_type1: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_type2: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_bodyC: Body;\n /** @internal */ m_localAnchorC: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_referenceAngleA: number;\n /** @internal */ m_localAxisC: Vec2;\n /** @internal */ m_bodyD: Body;\n /** @internal */ m_localAnchorD: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngleB: number;\n /** @internal */ m_localAxisD: Vec2;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_lcA: Vec2;\n /** @internal */ m_lcB: Vec2;\n /** @internal */ m_lcC: Vec2;\n /** @internal */ m_lcD: Vec2;\n /** @internal */ m_mA: number;\n /** @internal */ m_mB: number;\n /** @internal */ m_mC: number;\n /** @internal */ m_mD: number;\n /** @internal */ m_iA: number;\n /** @internal */ m_iB: number;\n /** @internal */ m_iC: number;\n /** @internal */ m_iD: number;\n /** @internal */ m_JvAC: Vec2;\n /** @internal */ m_JvBD: Vec2;\n /** @internal */ m_JwA: number;\n /** @internal */ m_JwB: number;\n /** @internal */ m_JwC: number;\n /** @internal */ m_JwD: number;\n /** @internal */ m_mass: number;\n\n constructor(def: GearJointDef);\n constructor(def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number);\n constructor(def: GearJointDef, bodyA?: Body, bodyB?: Body, joint1?: RevoluteJoint | PrismaticJoint, joint2?: RevoluteJoint | PrismaticJoint, ratio?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof GearJoint)) {\n return new GearJoint(def, bodyA, bodyB, joint1, joint2, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = GearJoint.TYPE;\n\n _ASSERT && console.assert(joint1.m_type === RevoluteJoint.TYPE\n || joint1.m_type === PrismaticJoint.TYPE);\n _ASSERT && console.assert(joint2.m_type === RevoluteJoint.TYPE\n || joint2.m_type === PrismaticJoint.TYPE);\n\n this.m_joint1 = joint1 ? joint1 : def.joint1;\n this.m_joint2 = joint2 ? joint2 : def.joint2;\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n this.m_type1 = this.m_joint1.getType() as 'revolute-joint' | 'prismatic-joint';\n this.m_type2 = this.m_joint2.getType() as 'revolute-joint' | 'prismatic-joint';\n\n // joint1 connects body A to body C\n // joint2 connects body B to body D\n\n let coordinateA: number;\n let coordinateB: number;\n\n // TODO_ERIN there might be some problem with the joint edges in Joint.\n\n this.m_bodyC = this.m_joint1.getBodyA();\n this.m_bodyA = this.m_joint1.getBodyB();\n\n // Get geometry of joint1\n const xfA = this.m_bodyA.m_xf;\n const aA = this.m_bodyA.m_sweep.a;\n const xfC = this.m_bodyC.m_xf;\n const aC = this.m_bodyC.m_sweep.a;\n\n if (this.m_type1 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint1 as RevoluteJoint;\n this.m_localAnchorC = revolute.m_localAnchorA;\n this.m_localAnchorA = revolute.m_localAnchorB;\n this.m_referenceAngleA = revolute.m_referenceAngle;\n this.m_localAxisC = Vec2.zero();\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const prismatic = this.m_joint1 as PrismaticJoint;\n this.m_localAnchorC = prismatic.m_localAnchorA;\n this.m_localAnchorA = prismatic.m_localAnchorB;\n this.m_referenceAngleA = prismatic.m_referenceAngle;\n this.m_localAxisC = prismatic.m_localXAxisA;\n\n const pC = this.m_localAnchorC;\n const pA = Rot.mulTVec2(xfC.q, Vec2.add(Rot.mulVec2(xfA.q, this.m_localAnchorA), Vec2.sub(xfA.p, xfC.p)));\n coordinateA = Vec2.dot(pA, this.m_localAxisC) - Vec2.dot(pC, this.m_localAxisC);\n }\n\n this.m_bodyD = this.m_joint2.getBodyA();\n this.m_bodyB = this.m_joint2.getBodyB();\n\n // Get geometry of joint2\n const xfB = this.m_bodyB.m_xf;\n const aB = this.m_bodyB.m_sweep.a;\n const xfD = this.m_bodyD.m_xf;\n const aD = this.m_bodyD.m_sweep.a;\n\n if (this.m_type2 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint2 as RevoluteJoint;\n this.m_localAnchorD = revolute.m_localAnchorA;\n this.m_localAnchorB = revolute.m_localAnchorB;\n this.m_referenceAngleB = revolute.m_referenceAngle;\n this.m_localAxisD = Vec2.zero();\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const prismatic = this.m_joint2 as PrismaticJoint;\n this.m_localAnchorD = prismatic.m_localAnchorA;\n this.m_localAnchorB = prismatic.m_localAnchorB;\n this.m_referenceAngleB = prismatic.m_referenceAngle;\n this.m_localAxisD = prismatic.m_localXAxisA;\n\n const pD = this.m_localAnchorD;\n const pB = Rot.mulTVec2(xfD.q, Vec2.add(Rot.mulVec2(xfB.q, this.m_localAnchorB), Vec2.sub(xfB.p, xfD.p)));\n coordinateB = Vec2.dot(pB, this.m_localAxisD) - Vec2.dot(pD, this.m_localAxisD);\n }\n\n this.m_constant = coordinateA + this.m_ratio * coordinateB;\n\n this.m_impulse = 0.0;\n\n // Gear Joint:\n // C0 = (coordinate1 + ratio * coordinate2)_initial\n // C = (coordinate1 + ratio * coordinate2) - C0 = 0\n // J = [J1 ratio * J2]\n // K = J * invM * JT\n // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T\n //\n // Revolute:\n // coordinate = rotation\n // Cdot = angularVelocity\n // J = [0 0 1]\n // K = J * invM * JT = invI\n //\n // Prismatic:\n // coordinate = dot(p - pg, ug)\n // Cdot = dot(v + cross(w, r), ug)\n // J = [ug cross(r, ug)]\n // K = J * invM * JT = invMass + invI * cross(r, ug)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n joint1: this.m_joint1,\n joint2: this.m_joint2,\n ratio: this.m_ratio,\n\n // _constant: this.m_constant,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): GearJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.joint1 = restore(Joint, data.joint1, world);\n data.joint2 = restore(Joint, data.joint2, world);\n const joint = new GearJoint(data);\n // if (data._constant) joint.m_constant = data._constant;\n return joint;\n }\n\n /**\n * Get the first joint.\n */\n getJoint1(): Joint {\n return this.m_joint1;\n }\n\n /**\n * Get the second joint.\n */\n getJoint2(): Joint {\n return this.m_joint2;\n }\n\n /**\n * Set the gear ratio.\n */\n setRatio(ratio: number): void {\n _ASSERT && console.assert(Math.isFinite(ratio));\n this.m_ratio = ratio;\n }\n\n /**\n * Get the gear ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_JvAC).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n const L = this.m_impulse * this.m_JwA; // float\n return inv_dt * L;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_lcA = this.m_bodyA.m_sweep.localCenter;\n this.m_lcB = this.m_bodyB.m_sweep.localCenter;\n this.m_lcC = this.m_bodyC.m_sweep.localCenter;\n this.m_lcD = this.m_bodyD.m_sweep.localCenter;\n this.m_mA = this.m_bodyA.m_invMass;\n this.m_mB = this.m_bodyB.m_invMass;\n this.m_mC = this.m_bodyC.m_invMass;\n this.m_mD = this.m_bodyD.m_invMass;\n this.m_iA = this.m_bodyA.m_invI;\n this.m_iB = this.m_bodyB.m_invI;\n this.m_iC = this.m_bodyC.m_invI;\n this.m_iD = this.m_bodyD.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const aC = this.m_bodyC.c_position.a;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n\n const aD = this.m_bodyD.c_position.a;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n this.m_mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n this.m_JvAC = Vec2.zero();\n this.m_JwA = 1.0;\n this.m_JwC = 1.0;\n this.m_mass += this.m_iA + this.m_iC;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n this.m_JvAC = u;\n this.m_JwC = Vec2.crossVec2Vec2(rC, u);\n this.m_JwA = Vec2.crossVec2Vec2(rA, u);\n this.m_mass += this.m_mC + this.m_mA + this.m_iC * this.m_JwC * this.m_JwC + this.m_iA * this.m_JwA * this.m_JwA;\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n this.m_JvBD = Vec2.zero();\n this.m_JwB = this.m_ratio;\n this.m_JwD = this.m_ratio;\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD); // Vec2\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); // Vec2\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); // Vec2\n this.m_JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n this.m_JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n this.m_JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD * this.m_JwD * this.m_JwD + this.m_iB * this.m_JwB * this.m_JwB;\n }\n\n // Compute effective mass.\n this.m_mass = this.m_mass > 0.0 ? 1.0 / this.m_mass : 0.0;\n\n if (step.warmStarting) {\n vA.addMul(this.m_mA * this.m_impulse, this.m_JvAC);\n wA += this.m_iA * this.m_impulse * this.m_JwA;\n\n vB.addMul(this.m_mB * this.m_impulse, this.m_JvBD);\n wB += this.m_iB * this.m_impulse * this.m_JwB;\n\n vC.subMul(this.m_mC * this.m_impulse, this.m_JvAC);\n wC -= this.m_iC * this.m_impulse * this.m_JwC;\n\n vD.subMul(this.m_mD * this.m_impulse, this.m_JvBD);\n wD -= this.m_iD * this.m_impulse * this.m_JwD;\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n let Cdot = Vec2.dot(this.m_JvAC, vA) - Vec2.dot(this.m_JvAC, vC)\n + Vec2.dot(this.m_JvBD, vB) - Vec2.dot(this.m_JvBD, vD); // float\n Cdot += (this.m_JwA * wA - this.m_JwC * wC)\n + (this.m_JwB * wB - this.m_JwD * wD);\n\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n vA.addMul(this.m_mA * impulse, this.m_JvAC);\n wA += this.m_iA * impulse * this.m_JwA;\n vB.addMul(this.m_mB * impulse, this.m_JvBD);\n wB += this.m_iB * impulse * this.m_JwB;\n vC.subMul(this.m_mC * impulse, this.m_JvAC);\n wC -= this.m_iC * impulse * this.m_JwC;\n vD.subMul(this.m_mD * impulse, this.m_JvBD);\n wD -= this.m_iD * impulse * this.m_JwD;\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n const cC = this.m_bodyC.c_position.c;\n let aC = this.m_bodyC.c_position.a;\n const cD = this.m_bodyD.c_position.c;\n let aD = this.m_bodyD.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n const linearError = 0.0;\n\n let coordinateA: number;\n let coordinateB: number;\n\n let JvAC: Vec2;\n let JvBD: Vec2;\n let JwA: number;\n let JwB: number;\n let JwC: number;\n let JwD: number;\n let mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n JvAC = Vec2.zero();\n JwA = 1.0;\n JwC = 1.0;\n mass += this.m_iA + this.m_iC;\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n JvAC = u;\n JwC = Vec2.crossVec2Vec2(rC, u);\n JwA = Vec2.crossVec2Vec2(rA, u);\n mass += this.m_mC + this.m_mA + this.m_iC * JwC * JwC + this.m_iA * JwA * JwA;\n\n const pC = Vec2.sub(this.m_localAnchorC, this.m_lcC); // Vec2\n const pA = Rot.mulTVec2(qC, Vec2.add(rA, Vec2.sub(cA, cC))); // Vec2\n coordinateA = Vec2.dot(Vec2.sub(pA, pC), this.m_localAxisC);\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n JvBD = Vec2.zero();\n JwB = this.m_ratio;\n JwD = this.m_ratio;\n mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD);\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB);\n JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD\n * JwD * JwD + this.m_iB * JwB * JwB;\n\n const pD = Vec2.sub(this.m_localAnchorD, this.m_lcD); // Vec2\n const pB = Rot.mulTVec2(qD, Vec2.add(rB, Vec2.sub(cB, cD))); // Vec2\n coordinateB = Vec2.dot(pB, this.m_localAxisD)\n - Vec2.dot(pD, this.m_localAxisD);\n }\n\n const C = (coordinateA + this.m_ratio * coordinateB) - this.m_constant; // float\n\n let impulse = 0.0; // float\n if (mass > 0.0) {\n impulse = -C / mass;\n }\n\n cA.addMul(this.m_mA * impulse, JvAC);\n aA += this.m_iA * impulse * JwA;\n cB.addMul(this.m_mB * impulse, JvBD);\n aB += this.m_iB * impulse * JwB;\n cC.subMul(this.m_mC * impulse, JvAC);\n aC -= this.m_iC * impulse * JwC;\n cD.subMul(this.m_mD * impulse, JvBD);\n aD -= this.m_iD * impulse * JwD;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n this.m_bodyC.c_position.c.setVec2(cC);\n this.m_bodyC.c_position.a = aC;\n this.m_bodyD.c_position.c.setVec2(cD);\n this.m_bodyD.c_position.a = aD;\n\n // TODO_ERIN not implemented\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Motor joint definition.\n */\nexport interface MotorJointOpt extends JointOpt {\n /**\n * The bodyB angle minus bodyA angle in radians.\n */\n angularOffset?: number;\n /**\n * The maximum motor force in N.\n */\n maxForce?: number;\n /**\n * The maximum motor torque in N-m.\n */\n maxTorque?: number;\n /**\n * Position correction factor in the range [0,1].\n */\n correctionFactor?: number;\n /**\n * Position of bodyB minus the position of bodyA, in bodyA's frame, in meters.\n */\n linearOffset?: Vec2;\n}\n/**\n * Motor joint definition.\n */\nexport interface MotorJointDef extends JointDef, MotorJointOpt {\n}\n\nconst DEFAULTS = {\n maxForce : 1.0,\n maxTorque : 1.0,\n correctionFactor : 0.3\n};\n\n/**\n * A motor joint is used to control the relative motion between two bodies. A\n * typical usage is to control the movement of a dynamic body with respect to\n * the ground.\n */\nexport class MotorJoint extends Joint {\n static TYPE = 'motor-joint' as const;\n\n /** @internal */ m_type: 'motor-joint';\n /** @internal */ m_linearOffset: Vec2;\n /** @internal */ m_angularOffset: number;\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n /** @internal */ m_correctionFactor: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_linearError: Vec2;\n /** @internal */ m_angularError: number;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: MotorJointDef);\n constructor(def: MotorJointOpt, bodyA: Body, bodyB: Body);\n constructor(def: MotorJointDef | MotorJointOpt, bodyA?: Body, bodyB?: Body) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof MotorJoint)) {\n return new MotorJoint(def, bodyA, bodyB);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MotorJoint.TYPE;\n\n this.m_linearOffset = Math.isFinite(def.linearOffset) ? def.linearOffset : bodyA.getLocalPoint(bodyB.getPosition());\n this.m_angularOffset = Math.isFinite(def.angularOffset) ? def.angularOffset : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n this.m_correctionFactor = def.correctionFactor;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n correctionFactor: this.m_correctionFactor,\n\n linearOffset: this.m_linearOffset,\n angularOffset: this.m_angularOffset,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MotorJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new MotorJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {}): void {\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && console.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && console.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Set the position correction factor in the range [0,1].\n */\n setCorrectionFactor(factor: number): void {\n _ASSERT && console.assert(Math.isFinite(factor) && 0.0 <= factor && factor <= 1.0);\n this.m_correctionFactor = factor;\n }\n\n /**\n * Get the position correction factor in the range [0,1].\n */\n getCorrectionFactor(): number {\n return this.m_correctionFactor;\n }\n\n /**\n * Set/get the target linear offset, in frame A, in meters.\n */\n setLinearOffset(linearOffset: Vec2): void {\n if (linearOffset.x != this.m_linearOffset.x\n || linearOffset.y != this.m_linearOffset.y) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_linearOffset = linearOffset;\n }\n }\n\n getLinearOffset(): Vec2 {\n return this.m_linearOffset;\n }\n\n /**\n * Set/get the target angular offset, in radians.\n */\n setAngularOffset(angularOffset: number): void {\n if (angularOffset != this.m_angularOffset) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_angularOffset = angularOffset;\n }\n }\n\n getAngularOffset(): number {\n return this.m_angularOffset;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getPosition();\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getPosition();\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.neg(this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.neg(this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n this.m_linearError = Vec2.zero();\n this.m_linearError.addCombine(1, cB, 1, this.m_rB);\n this.m_linearError.subCombine(1, cA, 1, this.m_rA);\n this.m_linearError.sub(Rot.mulVec2(qA, this.m_linearOffset));\n\n this.m_angularError = aB - aA - this.m_angularOffset;\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt;\n const inv_h = step.inv_dt;\n\n // Solve angular friction\n {\n const Cdot = wB - wA + inv_h * this.m_correctionFactor * this.m_angularError;\n let impulse = -this.m_angularMass * Cdot;\n\n const oldImpulse = this.m_angularImpulse;\n const maxImpulse = h * this.m_maxTorque;\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n Cdot.addMul(inv_h * this.m_correctionFactor, this.m_linearError);\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot));\n const oldImpulse = Vec2.clone(this.m_linearImpulse);\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce;\n\n this.m_linearImpulse.clamp(maxImpulse);\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Transform } from '../../common/Transform';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointOpt extends JointOpt {\n /**\n * [maxForce = 0.0] The maximum constraint force that can be exerted to move\n * the candidate body. Usually you will express as some multiple of the\n * weight (multiplier * mass * gravity).\n */\n maxForce?: number;\n /**\n * [frequencyHz = 5.0] The response speed.\n */\n frequencyHz?: number;\n /**\n * [dampingRatio = 0.7] The damping ratio. 0 = no damping, 1 = critical\n * damping.\n */\n dampingRatio?: number;\n}\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointDef extends JointDef, MouseJointOpt {\n /**\n * The initial world target point. This is assumed to coincide with the body\n * anchor initially.\n */\n target: Vec2Value;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n frequencyHz : 5.0,\n dampingRatio : 0.7\n};\n\n/**\n * A mouse joint is used to make a point on a body track a specified world\n * point. This a soft constraint with a maximum force. This allows the\n * constraint to stretch and without applying huge forces.\n *\n * NOTE: this joint is not documented in the manual because it was developed to\n * be used in the testbed. If you want to learn how to use the mouse joint, look\n * at the testbed.\n */\nexport class MouseJoint extends Joint {\n static TYPE = 'mouse-joint' as const;\n\n /** @internal */ m_type: 'mouse-joint';\n /** @internal */ m_targetA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_impulse: Vec2;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_beta: number;\n /** @internal */ m_gamma: number;\n // Solver temp\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat22;\n /** @internal */ m_C: Vec2;\n\n constructor(def: MouseJointDef);\n constructor(def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2);\n constructor(def: MouseJointDef, bodyA?: Body, bodyB?: Body, target?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof MouseJoint)) {\n return new MouseJoint(def, bodyA, bodyB, target);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MouseJoint.TYPE;\n\n _ASSERT && console.assert(Math.isFinite(def.maxForce) && def.maxForce >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.frequencyHz) && def.frequencyHz >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.dampingRatio) && def.dampingRatio >= 0.0);\n\n if (Vec2.isValid(target)) {\n this.m_targetA = Vec2.clone(target);\n } else if (Vec2.isValid(def.target)) {\n this.m_targetA = Vec2.clone(def.target);\n } else {\n this.m_targetA = Vec2.zero();\n }\n\n this.m_localAnchorB = Transform.mulTVec2(bodyB.getTransform(), this.m_targetA);\n\n this.m_maxForce = def.maxForce;\n this.m_impulse = Vec2.zero();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_beta = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rB = Vec2.zero();\n this.m_localCenterB = Vec2.zero();\n this.m_invMassB = 0.0;\n this.m_invIB = 0.0;\n this.m_mass = new Mat22();\n this.m_C = Vec2.zero();\n\n // p = attached point, m = mouse point\n // C = p - m\n // Cdot = v\n // = v + cross(w, r)\n // J = [I r_skew]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n target: this.m_targetA,\n maxForce: this.m_maxForce,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n _localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MouseJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.target = Vec2.clone(data.target);\n const joint = new MouseJoint(data);\n if (data._localAnchorB) {\n joint.m_localAnchorB = data._localAnchorB;\n }\n return joint;\n }\n\n /**\n * Use this to update the target point.\n */\n setTarget(target: Vec2Value): void {\n if (this.m_bodyB.isAwake() == false) {\n this.m_bodyB.setAwake(true);\n }\n this.m_targetA = Vec2.clone(target);\n }\n\n getTarget(): Vec2 {\n return this.m_targetA;\n }\n\n /**\n * Set the maximum force in Newtons.\n */\n setMaxForce(force: number): void {\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum force in Newtons.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the frequency in Hertz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get the frequency in Hertz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set the damping ratio (dimensionless).\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get the damping ratio (dimensionless).\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return Vec2.clone(this.m_targetA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_impulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * 0.0;\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2Value): void {\n this.m_targetA.sub(newOrigin);\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const position = this.m_bodyB.c_position;\n const velocity = this.m_bodyB.c_velocity;\n\n const cB = position.c;\n const aB = position.a;\n const vB = velocity.v;\n let wB = velocity.w;\n\n const qB = Rot.neo(aB);\n\n const mass = this.m_bodyB.getMass();\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = mass * (omega * omega);\n\n // magic formulas\n // gamma has units of inverse mass.\n // beta has units of inverse time.\n const h = step.dt;\n _ASSERT && console.assert(d + h * k > Math.EPSILON);\n this.m_gamma = h * (d + h * k);\n if (this.m_gamma != 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n this.m_beta = h * k * this.m_gamma;\n\n // Compute the effective mass matrix.\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) *\n // invI2 * skew(r2)]\n // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y\n // -r1.x*r1.y]\n // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x]\n const K = new Mat22();\n K.ex.x = this.m_invMassB + this.m_invIB * this.m_rB.y * this.m_rB.y\n + this.m_gamma;\n K.ex.y = -this.m_invIB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = this.m_invMassB + this.m_invIB * this.m_rB.x * this.m_rB.x\n + this.m_gamma;\n\n this.m_mass = K.getInverse();\n\n this.m_C.setVec2(cB);\n this.m_C.addCombine(1, this.m_rB, -1, this.m_targetA);\n this.m_C.mul(this.m_beta);\n\n // Cheat with some damping\n wB *= 0.98;\n\n if (step.warmStarting) {\n this.m_impulse.mul(step.dtRatio);\n vB.addMul(this.m_invMassB, this.m_impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, this.m_impulse);\n\n } else {\n this.m_impulse.setZero();\n }\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const velocity = this.m_bodyB.c_velocity;\n const vB = Vec2.clone(velocity.v);\n let wB = velocity.w;\n\n // Cdot = v + cross(w, r)\n\n const Cdot = Vec2.crossNumVec2(wB, this.m_rB);\n Cdot.add(vB);\n\n Cdot.addCombine(1, this.m_C, this.m_gamma, this.m_impulse);\n Cdot.neg();\n\n let impulse = Mat22.mulVec2(this.m_mass, Cdot);\n\n const oldImpulse = Vec2.clone(this.m_impulse);\n this.m_impulse.add(impulse);\n const maxImpulse = step.dt * this.m_maxForce;\n this.m_impulse.clamp(maxImpulse);\n impulse = Vec2.sub(this.m_impulse, oldImpulse);\n\n vB.addMul(this.m_invMassB, impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\n// tslint:disable-next-line:no-empty-interface\nexport interface PulleyJointOpt extends JointOpt {\n}\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\nexport interface PulleyJointDef extends JointDef, PulleyJointOpt {\n /**\n * The first ground anchor in world coordinates. This point never moves.\n */\n groundAnchorA: Vec2;\n /**\n * The second ground anchor in world coordinates. This point never moves.\n */\n groundAnchorB: Vec2;\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The reference length for the segment attached to bodyA.\n */\n lengthA: number;\n /**\n * The reference length for the segment attached to bodyB.\n */\n lengthB: number;\n /**\n * The pulley ratio, used to simulate a block-and-tackle.\n */\n ratio: number;\n}\n\nconst DEFAULTS = {\n collideConnected : true\n};\n\n/**\n * The pulley joint is connected to two bodies and two fixed ground points. The\n * pulley supports a ratio such that: length1 + ratio * length2 <= constant\n *\n * Yes, the force transmitted is scaled by the ratio.\n *\n * Warning: the pulley joint can get a bit squirrelly by itself. They often work\n * better when combined with prismatic joints. You should also cover the the\n * anchor points with static shapes to prevent one side from going to zero\n * length.\n */\nexport class PulleyJoint extends Joint {\n static TYPE = 'pulley-joint' as const;\n // static MIN_PULLEY_LENGTH: number = 2.0; // TODO where this is used?\n\n /** @internal */ m_type: 'pulley-joint';\n /** @internal */ m_groundAnchorA: Vec2;\n /** @internal */ m_groundAnchorB: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_lengthA: number;\n /** @internal */ m_lengthB: number;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_uA: Vec2;\n /** @internal */ m_uB: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: PulleyJointDef);\n constructor(def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number);\n constructor(def: PulleyJointDef, bodyA?: Body, bodyB?: Body, groundA?: Vec2, groundB?: Vec2, anchorA?: Vec2, anchorB?: Vec2, ratio?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PulleyJoint)) {\n return new PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PulleyJoint.TYPE;\n this.m_groundAnchorA = groundA ? groundA : def.groundAnchorA || Vec2.neo(-1.0, 1.0);\n this.m_groundAnchorB = groundB ? groundB : def.groundAnchorB || Vec2.neo(1.0, 1.0);\n this.m_localAnchorA = anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n this.m_lengthA = Math.isFinite(def.lengthA) ? def.lengthA : Vec2.distance(anchorA, groundA);\n this.m_lengthB = Math.isFinite(def.lengthB) ? def.lengthB : Vec2.distance(anchorB, groundB);\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n _ASSERT && console.assert(ratio > Math.EPSILON);\n\n this.m_constant = this.m_lengthA + this.m_ratio * this.m_lengthB;\n\n this.m_impulse = 0.0;\n\n // Pulley:\n // length1 = norm(p1 - s1)\n // length2 = norm(p2 - s2)\n // C0 = (length1 + ratio * length2)_initial\n // C = C0 - (length1 + ratio * length2)\n // u1 = (p1 - s1) / norm(p1 - s1)\n // u2 = (p2 - s2) / norm(p2 - s2)\n // Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2))\n // J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 *\n // cross(r2, u2)^2)\n }\n\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n groundAnchorA: this.m_groundAnchorA,\n groundAnchorB: this.m_groundAnchorB,\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n lengthA: this.m_lengthA,\n lengthB: this.m_lengthB,\n ratio: this.m_ratio,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PulleyJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new PulleyJoint(data);\n return joint;\n }\n\n /**\n * Get the first ground anchor.\n */\n getGroundAnchorA(): Vec2 {\n return this.m_groundAnchorA;\n }\n\n /**\n * Get the second ground anchor.\n */\n getGroundAnchorB(): Vec2 {\n return this.m_groundAnchorB;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getLengthA(): number {\n return this.m_lengthA;\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getLengthB(): number {\n return this.m_lengthB;\n }\n\n /**\n * Get the pulley ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getCurrentLengthA(): number {\n const p = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const s = this.m_groundAnchorA;\n return Vec2.distance(p, s);\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getCurrentLengthB(): number {\n const p = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const s = this.m_groundAnchorB;\n return Vec2.distance(p, s);\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n *\n * @param newOrigin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_groundAnchorA.sub(newOrigin);\n this.m_groundAnchorB.sub(newOrigin);\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_uB).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n this.m_uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n this.m_uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = this.m_uA.length();\n const lengthB = this.m_uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n this.m_uA.mul(1.0 / lengthA);\n } else {\n this.m_uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n this.m_uB.mul(1.0 / lengthB);\n } else {\n this.m_uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(this.m_rA, this.m_uA); // float\n const ruB = Vec2.crossVec2Vec2(this.m_rB, this.m_uB); // float\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n this.m_mass = mA + this.m_ratio * this.m_ratio * mB;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support variable time steps.\n this.m_impulse *= step.dtRatio;\n\n // Warm starting.\n const PA = Vec2.mulNumVec2(-this.m_impulse, this.m_uA);\n const PB = Vec2.mulNumVec2(-this.m_ratio * this.m_impulse, this.m_uB);\n\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n\n const Cdot = -Vec2.dot(this.m_uA, vpA) - this.m_ratio\n * Vec2.dot(this.m_uB, vpB); // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const PA = Vec2.mulNumVec2(-impulse, this.m_uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, this.m_uB); // Vec2\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n const uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n const uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = uA.length();\n const lengthB = uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n uA.mul(1.0 / lengthA);\n } else {\n uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n uB.mul(1.0 / lengthB);\n } else {\n uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(rA, uA);\n const ruB = Vec2.crossVec2Vec2(rB, uB);\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n let mass = mA + this.m_ratio * this.m_ratio * mB; // float\n\n if (mass > 0.0) {\n mass = 1.0 / mass;\n }\n\n const C = this.m_constant - lengthA - this.m_ratio * lengthB; // float\n const linearError = Math.abs(C); // float\n\n const impulse = -mass * C; // float\n\n const PA = Vec2.mulNumVec2(-impulse, uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, uB); // Vec2\n\n cA.addMul(this.m_invMassA, PA);\n aA += this.m_invIA * Vec2.crossVec2Vec2(rA, PA);\n cB.addMul(this.m_invMassB, PB);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, PB);\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointOpt extends JointOpt {\n /**\n * The maximum length of the rope.\n * Warning: this must be larger than linearSlop or the joint will have no effect.\n */\n maxLength?: number;\n}\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointDef extends JointDef, RopeJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxLength : 0.0,\n};\n\n/**\n * A rope joint enforces a maximum distance between two points on two bodies. It\n * has no other effect.\n *\n * Warning: if you attempt to change the maximum length during the simulation\n * you will get some non-physical behavior.\n *\n * A model that would allow you to dynamically modify the length would have some\n * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you\n * want to dynamically control length.\n */\nexport class RopeJoint extends Joint {\n static TYPE = 'rope-joint' as const;\n\n /** @internal */ m_type: 'rope-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n /** @internal */ m_maxLength: number;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_length: number;\n /** @internal */ m_state: number; // TODO enum\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n constructor(def: RopeJointDef);\n constructor(def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: RopeJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof RopeJoint)) {\n return new RopeJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RopeJoint.TYPE;\n this.m_localAnchorA = anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n\n this.m_maxLength = def.maxLength;\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_length = 0.0;\n this.m_state = inactiveLimit;\n\n // Limit:\n // C = norm(pB - pA) - L\n // u = (pB - pA) / norm(pB - pA)\n // Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA))\n // J = [-u -cross(rA, u) u cross(rB, u)]\n // K = J * invM * JT\n // = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n maxLength: this.m_maxLength,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): RopeJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RopeJoint(data);\n return joint;\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum length of the rope.\n */\n setMaxLength(length: number): void {\n this.m_maxLength = length;\n }\n\n /**\n * Get the maximum length of the rope.\n */\n getMaxLength(): number {\n return this.m_maxLength;\n }\n\n getLimitState(): number {\n // TODO LimitState\n return this.m_state;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n this.m_rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n this.m_u = Vec2.zero();\n this.m_u.addCombine(1, cB, 1, this.m_rB);\n this.m_u.subCombine(1, cA, 1, this.m_rA); // Vec2\n\n this.m_length = this.m_u.length();\n\n const C = this.m_length - this.m_maxLength; // float\n if (C > 0.0) {\n this.m_state = atUpperLimit;\n } else {\n this.m_state = inactiveLimit;\n }\n\n if (this.m_length > Settings.linearSlop) {\n this.m_u.mul(1.0 / this.m_length);\n } else {\n this.m_u.setZero();\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n return;\n }\n\n // Compute effective mass.\n const crA = Vec2.crossVec2Vec2(this.m_rA, this.m_u); // float\n const crB = Vec2.crossVec2Vec2(this.m_rB, this.m_u); // float\n const invMass = this.m_invMassA + this.m_invIA * crA * crA + this.m_invMassB\n + this.m_invIB * crB * crB; // float\n\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.addCrossNumVec2(vA, wA, this.m_rA); // Vec2\n const vpB = Vec2.addCrossNumVec2(vB, wB, this.m_rB); // Vec2\n const C = this.m_length - this.m_maxLength; // float\n let Cdot = Vec2.dot(this.m_u, Vec2.sub(vpB, vpA)); // float\n\n // Predictive constraint.\n if (C < 0.0) {\n Cdot += step.inv_dt * C;\n }\n\n let impulse = -this.m_mass * Cdot; // float\n const oldImpulse = this.m_impulse; // float\n this.m_impulse = Math.min(0.0, this.m_impulse + impulse);\n impulse = this.m_impulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u); // Vec2\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c; // Vec2\n let aA = this.m_bodyA.c_position.a; // float\n const cB = this.m_bodyB.c_position.c; // Vec2\n let aB = this.m_bodyB.c_position.a; // float\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.zero();\n u.addCombine(1, cB, 1, rB);\n u.subCombine(1, cA, 1, rA); // Vec2\n\n const length = u.normalize(); // float\n let C = length - this.m_maxLength; // float\n\n C = Math.clamp(C, 0.0, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C; // float\n const P = Vec2.mulNumVec2(impulse, u); // Vec2\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return length - this.m_maxLength < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n *\n * @prop {float} frequencyHz\n * @prop {float} dampingRatio\n *\n * @prop {Vec2} localAnchorA\n * @prop {Vec2} localAnchorB\n * @prop {float} referenceAngle\n */\nexport interface WeldJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. Rotation only. Disable softness\n * with a value of 0.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle?: number;\n}\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n */\nexport interface WeldJointDef extends JointDef, WeldJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0,\n};\n\n/**\n * A weld joint essentially glues two bodies together. A weld joint may distort\n * somewhat because the island constraint solver is approximate.\n */\nexport class WeldJoint extends Joint {\n static TYPE = 'weld-joint' as const\n\n /** @internal */ m_type: 'weld-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_impulse: Vec3;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat33;\n\n constructor(def: WeldJointDef);\n constructor(def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: WeldJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof WeldJoint)) {\n return new WeldJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WeldJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_impulse = new Vec3();\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rA; // Vec2\n this.m_rB; // Vec2\n this.m_localCenterA; // Vec2\n this.m_localCenterB; // Vec2\n this.m_invMassA; // float\n this.m_invMassB; // float\n this.m_invIA; // float\n this.m_invIB; // float\n this.m_mass = new Mat33();\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // / = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // C = angle2 - angle1 - referenceAngle\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WeldJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WeldJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Set frequency in Hz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get frequency in Hz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set damping ratio.\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get damping ratio.\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat33();\n K.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y * this.m_rB.y\n * iB;\n K.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y * this.m_rB.x * iB;\n K.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x * this.m_rB.x\n * iB;\n K.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n K.getInverse22(this.m_mass);\n\n let invM = iA + iB; // float\n const m = invM > 0.0 ? 1.0 / invM : 0.0; // float\n\n const C = aB - aA - this.m_referenceAngle; // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const d = 2.0 * m * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = m * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invM += this.m_gamma;\n this.m_mass.ez.z = invM != 0.0 ? 1.0 / invM : 0.0;\n } else if (K.ez.z == 0.0) {\n K.getInverse22(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n } else {\n K.getSymInverse33(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n if (this.m_frequencyHz > 0.0) {\n const Cdot2 = wB - wA; // float\n\n const impulse2 = -this.m_mass.ez.z\n * (Cdot2 + this.m_bias + this.m_gamma * this.m_impulse.z); // float\n this.m_impulse.z += impulse2;\n\n wA -= iA * impulse2;\n wB += iB * impulse2;\n\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n\n const impulse1 = Vec2.neg(Mat33.mulVec2(this.m_mass, Cdot1)); // Vec2\n this.m_impulse.x += impulse1.x;\n this.m_impulse.y += impulse1.y;\n\n const P = Vec2.clone(impulse1); // Vec2\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, P);\n } else {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); // Vec3\n\n const impulse = Vec3.neg(Mat33.mulVec3(this.m_mass, Cdot)); // Vec3\n this.m_impulse.add(impulse);\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n let positionError: number;\n let angularError: number;\n\n const K = new Mat33();\n K.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB;\n K.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB;\n K.ez.x = -rA.y * iA - rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB;\n K.ez.y = rA.x * iA + rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA); // Vec2\n\n positionError = C1.length();\n angularError = 0.0;\n\n const P = Vec2.neg(K.solve22(C1)); // Vec2\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n } else {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA);\n\n const C2 = aB - aA - this.m_referenceAngle; // float\n\n positionError = C1.length();\n angularError = Math.abs(C2);\n\n const C = new Vec3(C1.x, C1.y, C2);\n\n let impulse = new Vec3();\n if (K.ez.z > 0.0) {\n impulse = Vec3.neg(K.solve33(C));\n } else {\n const impulse2 = Vec2.neg(K.solve22(C1));\n impulse.set(impulse2.x, impulse2.y, 0.0);\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n cA.subMul(mA, P);\n aA -= iA * (Vec2.crossVec2Vec2(rA, P) + impulse.z);\n\n cB.addMul(mB, P);\n aB += iB * (Vec2.crossVec2Vec2(rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointOpt extends JointOpt {\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n /**\n * Suspension frequency, zero indicates no suspension.\n */\n frequencyHz?: number;\n /**\n * Suspension damping ratio, one indicates critical damping.\n */\n dampingRatio?: number;\n}\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointDef extends JointDef, WheelJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation axis in bodyA.\n */\n localAxisA: Vec2;\n}\n\nconst DEFAULTS = {\n enableMotor : false,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n frequencyHz : 2.0,\n dampingRatio : 0.7,\n};\n\n/**\n * A wheel joint. This joint provides two degrees of freedom: translation along\n * an axis fixed in bodyA and rotation in the plane. In other words, it is a\n * point to line constraint with a rotational motor and a linear spring/damper.\n * This joint is designed for vehicle suspensions.\n */\nexport class WheelJoint extends Joint {\n static TYPE = 'wheel-joint' as const;\n\n /** @internal */ m_type: 'wheel-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_springMass: number;\n /** @internal */ m_springImpulse: number;\n\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableMotor: boolean;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n /** @internal */ m_ax: Vec2 = Vec2.zero();\n /** @internal */ m_ay: Vec2 = Vec2.zero();\n /** @internal */ m_sAx: number;\n /** @internal */ m_sBx: number;\n /** @internal */ m_sAy: number;\n /** @internal */ m_sBy: number;\n\n constructor(def: WheelJointDef);\n constructor(def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n // @ts-ignore\n constructor(def: WheelJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof WheelJoint)) {\n return new WheelJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WheelJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n // @ts-ignore localAxis\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || def.localAxis || Vec2.neo(1.0, 0.0));\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n this.m_springMass = 0.0;\n this.m_springImpulse = 0.0;\n\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableMotor = def.enableMotor;\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Linear constraint (point-to-line)\n // d = pB - pA = xB + rB - xA - rA\n // C = dot(ay, d)\n // Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA,\n // rA))\n // = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB,\n // ay), vB)\n // J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)]\n\n // Spring linear constraint\n // C = dot(ax, d)\n // Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) +\n // dot(cross(rB, ax), vB)\n // J = [-ax -cross(d+rA, ax) ax cross(rB, ax)]\n\n // Motor rotational constraint\n // Cdot = wB - wA\n // J = [0 0 -1 0 0 1]\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n enableMotor: this.m_enableMotor,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WheelJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WheelJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const pA = bA.getWorldPoint(this.m_localAnchorA); // Vec2\n const pB = bB.getWorldPoint(this.m_localAnchorB); // Vec2\n const d = Vec2.sub(pB, pA); // Vec2\n const axis = bA.getWorldVector(this.m_localXAxisA); // Vec2\n\n const translation = Vec2.dot(d, axis); // float\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const wA = this.m_bodyA.m_angularVelocity;\n const wB = this.m_bodyB.m_angularVelocity;\n return wB - wA;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed, usually in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set/Get the maximum motor force, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Get the current motor torque given the inverse time step, usually in N-m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set/Get the spring frequency in hertz. Setting the frequency to zero disables\n * the spring.\n */\n setSpringFrequencyHz(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getSpringFrequencyHz(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set/Get the spring damping ratio\n */\n setSpringDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getSpringDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA); // Vec2\n\n // Point to line constraint\n {\n this.m_ay = Rot.mulVec2(qA, this.m_localYAxisA);\n this.m_sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ay);\n this.m_sBy = Vec2.crossVec2Vec2(rB, this.m_ay);\n\n this.m_mass = mA + mB + iA * this.m_sAy * this.m_sAy + iB * this.m_sBy\n * this.m_sBy;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n }\n\n // Spring constraint\n this.m_springMass = 0.0;\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n if (this.m_frequencyHz > 0.0) {\n this.m_ax = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_sAx = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ax);\n this.m_sBx = Vec2.crossVec2Vec2(rB, this.m_ax);\n\n const invMass = mA + mB + iA * this.m_sAx * this.m_sAx + iB * this.m_sBx\n * this.m_sBx; // float\n\n if (invMass > 0.0) {\n this.m_springMass = 1.0 / invMass;\n\n const C = Vec2.dot(d, this.m_ax); // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const damp = 2.0 * this.m_springMass * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = this.m_springMass * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (damp + h * k);\n if (this.m_gamma > 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n\n this.m_bias = C * h * k * this.m_gamma;\n\n this.m_springMass = invMass + this.m_gamma;\n if (this.m_springMass > 0.0) {\n this.m_springMass = 1.0 / this.m_springMass;\n }\n }\n } else {\n this.m_springImpulse = 0.0;\n }\n\n // Rotational motor\n if (this.m_enableMotor) {\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n } else {\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse *= step.dtRatio;\n this.m_springImpulse *= step.dtRatio;\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax);\n const LA = this.m_impulse * this.m_sAy + this.m_springImpulse * this.m_sAx + this.m_motorImpulse;\n const LB = this.m_impulse * this.m_sBy + this.m_springImpulse * this.m_sBx + this.m_motorImpulse;\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * LA;\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * LB;\n\n } else {\n this.m_impulse = 0.0;\n this.m_springImpulse = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Solve spring constraint\n {\n const Cdot = Vec2.dot(this.m_ax, vB) - Vec2.dot(this.m_ax, vA) + this.m_sBx\n * wB - this.m_sAx * wA; // float\n const impulse = -this.m_springMass\n * (Cdot + this.m_bias + this.m_gamma * this.m_springImpulse); // float\n this.m_springImpulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ax); // Vec2\n const LA = impulse * this.m_sAx; // float\n const LB = impulse * this.m_sBx; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n // Solve rotational motor constraint\n {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve point to line constraint\n {\n const Cdot = Vec2.dot(this.m_ay, vB) - Vec2.dot(this.m_ay, vA) + this.m_sBy\n * wB - this.m_sAy * wA; // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ay); // Vec2\n const LA = impulse * this.m_sAy; // float\n const LB = impulse * this.m_sBy; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const ay = Rot.mulVec2(qA, this.m_localYAxisA);\n\n const sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), ay); // float\n const sBy = Vec2.crossVec2Vec2(rB, ay); // float\n\n const C = Vec2.dot(d, ay); // float\n\n const k = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_sAy\n * this.m_sAy + this.m_invIB * this.m_sBy * this.m_sBy; // float\n\n let impulse; // float\n if (k != 0.0) {\n impulse = -C / k;\n } else {\n impulse = 0.0;\n }\n\n const P = Vec2.mulNumVec2(impulse, ay); // Vec2\n const LA = impulse * sAy; // float\n const LB = impulse * sBy; // float\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * LA;\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * LB;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) <= Settings.linearSlop;\n }\n\n}\n","// tslint:disable:typedef\nimport { World } from '../dynamics/World';\nimport { Body } from '../dynamics/Body';\nimport { Joint } from '../dynamics/Joint';\nimport { Fixture } from '../dynamics/Fixture';\nimport { Shape } from '../collision/Shape';\nimport { Vec2 } from '../common/Vec2';\nimport { Vec3 } from '../common/Vec3';\nimport { ChainShape } from \"../collision/shape/ChainShape\";\nimport { BoxShape } from \"../collision/shape/BoxShape\";\nimport { EdgeShape } from \"../collision/shape/EdgeShape\";\nimport { PolygonShape } from \"../collision/shape/PolygonShape\";\nimport { CircleShape } from \"../collision/shape/CircleShape\";\nimport { DistanceJoint } from \"../dynamics/joint/DistanceJoint\";\nimport { FrictionJoint } from \"../dynamics/joint/FrictionJoint\";\nimport { GearJoint } from \"../dynamics/joint/GearJoint\";\nimport { MotorJoint } from \"../dynamics/joint/MotorJoint\";\nimport { MouseJoint } from \"../dynamics/joint/MouseJoint\";\nimport { PrismaticJoint } from \"../dynamics/joint/PrismaticJoint\";\nimport { PulleyJoint } from \"../dynamics/joint/PulleyJoint\";\nimport { RevoluteJoint } from \"../dynamics/joint/RevoluteJoint\";\nimport { RopeJoint } from \"../dynamics/joint/RopeJoint\";\nimport { WeldJoint } from \"../dynamics/joint/WeldJoint\";\nimport { WheelJoint } from \"../dynamics/joint/WheelJoint\";\n\nlet SID = 0;\n\nexport function Serializer(opts?) {\n opts = opts || {};\n\n const rootClass = opts.rootClass || World;\n\n const preSerialize = opts.preSerialize || function(obj) { return obj; };\n const postSerialize = opts.postSerialize || function(data, obj) { return data; };\n\n const preDeserialize = opts.preDeserialize || function(data) { return data; };\n const postDeserialize = opts.postDeserialize || function(obj, data) { return obj; };\n\n // This is used to create ref objects during serialize\n const refTypes = {\n World,\n Body,\n Joint,\n Fixture,\n Shape,\n };\n\n // This is used by restore to deserialize objects and refs\n const restoreTypes = {\n Vec2,\n Vec3,\n ...refTypes\n };\n\n const CLASS_BY_TYPE_PROP = {\n [Body.STATIC]: Body,\n [Body.DYNAMIC]: Body,\n [Body.KINEMATIC]: Body,\n [ChainShape.TYPE]: ChainShape,\n [BoxShape.TYPE]: BoxShape,\n [EdgeShape.TYPE]: EdgeShape,\n [PolygonShape.TYPE]: PolygonShape,\n [CircleShape.TYPE]: CircleShape,\n [DistanceJoint.TYPE]: DistanceJoint,\n [FrictionJoint.TYPE]: FrictionJoint,\n [GearJoint.TYPE]: GearJoint,\n [MotorJoint.TYPE]: MotorJoint,\n [MouseJoint.TYPE]: MouseJoint,\n [PrismaticJoint.TYPE]: PrismaticJoint,\n [PulleyJoint.TYPE]: PulleyJoint,\n [RevoluteJoint.TYPE]: RevoluteJoint,\n [RopeJoint.TYPE]: RopeJoint,\n [WeldJoint.TYPE]: WeldJoint,\n [WheelJoint.TYPE]: WheelJoint,\n }\n\n this.toJson = function(root) {\n const json = [];\n\n const queue = [root];\n const refMap = {};\n\n function storeRef(value, typeName) {\n value.__sid = value.__sid || ++SID;\n if (!refMap[value.__sid]) {\n queue.push(value);\n const index = json.length + queue.length;\n const ref = {\n refIndex: index,\n refType: typeName\n };\n refMap[value.__sid] = ref;\n }\n return refMap[value.__sid];\n }\n\n function serialize(obj) {\n obj = preSerialize(obj);\n let data = obj._serialize();\n data = postSerialize(data, obj);\n return data;\n }\n\n function toJson(value, top?) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (typeof value._serialize === 'function') {\n if (value !== top) {\n // tslint:disable-next-line:no-for-in\n for (const typeName in refTypes) {\n if (value instanceof refTypes[typeName]) {\n return storeRef(value, typeName);\n }\n }\n }\n value = serialize(value);\n }\n if (Array.isArray(value)) {\n const newValue = [];\n for (let key = 0; key < value.length; key++) {\n newValue[key] = toJson(value[key]);\n }\n value = newValue;\n\n } else {\n const newValue = {};\n // tslint:disable-next-line:no-for-in\n for (const key in value) {\n if (value.hasOwnProperty(key)) {\n newValue[key] = toJson(value[key]);\n }\n }\n value = newValue;\n }\n return value;\n }\n\n while (queue.length) {\n const obj = queue.shift();\n const str = toJson(obj, obj);\n json.push(str);\n }\n\n return json;\n };\n\n this.fromJson = function(json: object) {\n const refMap = {};\n\n function findDeserilizer(data, cls) {\n if (!cls || !cls._deserialize) {\n cls = CLASS_BY_TYPE_PROP[data.type]\n }\n return cls && cls._deserialize;\n }\n\n /**\n * Deserialize a data object.\n */\n function deserialize(cls, data, ctx) {\n const deserializer = findDeserilizer(data, cls);\n if (!deserializer) {\n return;\n }\n data = preDeserialize(data);\n let obj = deserializer(data, ctx, restoreRef);\n obj = postDeserialize(obj, data);\n return obj;\n }\n\n /**\n * Restore a ref object or deserialize a data object.\n *\n * This is passed as callback to class deserializers.\n */\n function restoreRef(cls, ref, ctx) {\n if (!ref.refIndex) {\n return cls && cls._deserialize && deserialize(cls, ref, ctx);\n }\n cls = restoreTypes[ref.refType] || cls;\n const index = ref.refIndex;\n if (!refMap[index]) {\n const data = json[index];\n const obj = deserialize(cls, data, ctx);\n refMap[index] = obj;\n }\n return refMap[index];\n }\n\n const root = rootClass._deserialize(json[0], null, restoreRef);\n\n return root;\n };\n}\n\nconst serializer = new Serializer();\n\nSerializer.toJson = serializer.toJson;\nSerializer.fromJson = serializer.fromJson;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { CircleShape } from './CircleShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact);\n\nfunction CircleCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == CircleShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n CollideCircles(manifold, fixtureA.getShape() as CircleShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport const CollideCircles = function (manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n const pA = Transform.mulVec2(xfA, circleA.m_p);\n const pB = Transform.mulVec2(xfB, circleB.m_p);\n\n const distSqr = Vec2.distanceSquared(pB, pA);\n const rA = circleA.m_radius;\n const rB = circleB.m_radius;\n const radius = rA + rB;\n if (distSqr > radius * radius) {\n return;\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localPoint.setVec2(circleA.m_p);\n manifold.localNormal.setZero();\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { EdgeShape } from './EdgeShape';\nimport { ChainShape } from './ChainShape';\nimport { CircleShape } from './CircleShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, CircleShape.TYPE, EdgeCircleContact);\nContact.addType(ChainShape.TYPE, CircleShape.TYPE, ChainCircleContact);\n\nfunction EdgeCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == EdgeShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const shapeA = fixtureA.getShape() as EdgeShape;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\nfunction ChainCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == ChainShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const chain = fixtureA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n const shapeA = edge;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\n// Compute contact points for edge versus circle.\n// This accounts for edge connectivity.\nexport const CollideEdgeCircle = function (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle in frame of edge\n const Q = Transform.mulTVec2(xfA, Transform.mulVec2(xfB, circleB.m_p));\n\n const A = edgeA.m_vertex1;\n const B = edgeA.m_vertex2;\n const e = Vec2.sub(B, A);\n\n // Barycentric coordinates\n const u = Vec2.dot(e, Vec2.sub(B, Q));\n const v = Vec2.dot(e, Vec2.sub(Q, A));\n\n const radius = edgeA.m_radius + circleB.m_radius;\n\n // Region A\n if (v <= 0.0) {\n const P = Vec2.clone(A);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to A?\n if (edgeA.m_hasVertex0) {\n const A1 = edgeA.m_vertex0;\n const B1 = A;\n const e1 = Vec2.sub(B1, A1);\n const u1 = Vec2.dot(e1, Vec2.sub(B1, Q));\n\n // Is the circle in Region AB of the previous edge?\n if (u1 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region B\n if (u <= 0.0) {\n const P = Vec2.clone(B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to B?\n if (edgeA.m_hasVertex3) {\n const B2 = edgeA.m_vertex3;\n const A2 = B;\n const e2 = Vec2.sub(B2, A2);\n const v2 = Vec2.dot(e2, Vec2.sub(Q, A2));\n\n // Is the circle in Region AB of the next edge?\n if (v2 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 1;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region AB\n const den = Vec2.dot(e, e);\n _ASSERT && console.assert(den > 0.0);\n const P = Vec2.combine(u / den, A, v / den, B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n const n = Vec2.neo(-e.y, e.x);\n if (Vec2.dot(n, Vec2.sub(Q, A)) < 0.0) {\n n.setNum(-n.x, -n.y);\n }\n n.normalize();\n\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal = n;\n manifold.localPoint.setVec2(A);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_face;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2 } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Manifold, clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport { Contact } from '../../dynamics/Contact';\nimport { PolygonShape } from './PolygonShape';\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, PolygonShape.TYPE, PolygonContact);\n\nfunction PolygonContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == PolygonShape.TYPE);\n CollidePolygons(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as PolygonShape, xfB);\n}\n\ninterface MaxSeparation {\n maxSeparation: number;\n bestIndex: number;\n}\n\n/**\n * Find the max separation between poly1 and poly2 using edge normals from\n * poly1.\n */\nfunction findMaxSeparation(poly1: PolygonShape, xf1: Transform, poly2: PolygonShape, xf2: Transform, output: MaxSeparation): void {\n const count1 = poly1.m_count;\n const count2 = poly2.m_count;\n const n1s = poly1.m_normals;\n const v1s = poly1.m_vertices;\n const v2s = poly2.m_vertices;\n const xf = Transform.mulTXf(xf2, xf1);\n\n let bestIndex = 0;\n let maxSeparation = -Infinity;\n for (let i = 0; i < count1; ++i) {\n // Get poly1 normal in frame2.\n const n = Rot.mulVec2(xf.q, n1s[i]);\n const v1 = Transform.mulVec2(xf, v1s[i]);\n\n // Find deepest point for normal i.\n let si = Infinity;\n for (let j = 0; j < count2; ++j) {\n const sij = Vec2.dot(n, v2s[j]) - Vec2.dot(n, v1);\n if (sij < si) {\n si = sij;\n }\n }\n\n if (si > maxSeparation) {\n maxSeparation = si;\n bestIndex = i;\n }\n }\n\n // used to keep last FindMaxSeparation call values\n output.maxSeparation = maxSeparation;\n output.bestIndex = bestIndex;\n}\n\nfunction findIncidentEdge(c: ClipVertex[], poly1: PolygonShape, xf1: Transform, edge1: number, poly2: PolygonShape, xf2: Transform): void {\n const normals1 = poly1.m_normals;\n\n const count2 = poly2.m_count;\n const vertices2 = poly2.m_vertices;\n const normals2 = poly2.m_normals;\n\n _ASSERT && console.assert(0 <= edge1 && edge1 < poly1.m_count);\n\n // Get the normal of the reference edge in poly2's frame.\n const normal1 = Rot.mulTVec2(xf2.q, Rot.mulVec2(xf1.q, normals1[edge1]));\n\n // Find the incident edge on poly2.\n let index = 0;\n let minDot = Infinity;\n for (let i = 0; i < count2; ++i) {\n const dot = Vec2.dot(normal1, normals2[i]);\n if (dot < minDot) {\n minDot = dot;\n index = i;\n }\n }\n\n // Build the clip vertices for the incident edge.\n const i1 = index;\n const i2 = i1 + 1 < count2 ? i1 + 1 : 0;\n\n c[0].v = Transform.mulVec2(xf2, vertices2[i1]);\n c[0].id.cf.indexA = edge1;\n c[0].id.cf.indexB = i1;\n c[0].id.cf.typeA = ContactFeatureType.e_face;\n c[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n c[1].v = Transform.mulVec2(xf2, vertices2[i2]);\n c[1].id.cf.indexA = edge1;\n c[1].id.cf.indexB = i2;\n c[1].id.cf.typeA = ContactFeatureType.e_face;\n c[1].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n\nconst maxSeparation = {\n maxSeparation: 0,\n bestIndex: 0,\n};\n\n/**\n *\n * Find edge normal of max separation on A - return if separating axis is found
\n * Find edge normal of max separation on B - return if separation axis is found
\n * Choose reference edge as min(minA, minB)
\n * Find incident edge
\n * Clip\n *\n * The normal points from 1 to 2\n */\nexport const CollidePolygons = function (manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform): void {\n manifold.pointCount = 0;\n const totalRadius = polyA.m_radius + polyB.m_radius;\n\n findMaxSeparation(polyA, xfA, polyB, xfB, maxSeparation);\n const edgeA = maxSeparation.bestIndex;\n const separationA = maxSeparation.maxSeparation;\n if (separationA > totalRadius)\n return;\n\n findMaxSeparation(polyB, xfB, polyA, xfA, maxSeparation);\n const edgeB = maxSeparation.bestIndex;\n const separationB = maxSeparation.maxSeparation;\n if (separationB > totalRadius)\n return;\n\n let poly1; // reference polygon\n let poly2; // incident polygon\n let xf1;\n let xf2;\n let edge1; // reference edge\n let flip;\n const k_tol = 0.1 * Settings.linearSlop;\n\n if (separationB > separationA + k_tol) {\n poly1 = polyB;\n poly2 = polyA;\n xf1 = xfB;\n xf2 = xfA;\n edge1 = edgeB;\n manifold.type = ManifoldType.e_faceB;\n flip = 1;\n } else {\n poly1 = polyA;\n poly2 = polyB;\n xf1 = xfA;\n xf2 = xfB;\n edge1 = edgeA;\n manifold.type = ManifoldType.e_faceA;\n flip = 0;\n }\n\n const incidentEdge = [ new ClipVertex(), new ClipVertex() ];\n findIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);\n\n const count1 = poly1.m_count;\n const vertices1 = poly1.m_vertices;\n\n const iv1 = edge1;\n const iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0;\n\n let v11 = vertices1[iv1];\n let v12 = vertices1[iv2];\n\n const localTangent = Vec2.sub(v12, v11);\n localTangent.normalize();\n\n const localNormal = Vec2.crossVec2Num(localTangent, 1.0);\n const planePoint = Vec2.combine(0.5, v11, 0.5, v12);\n\n const tangent = Rot.mulVec2(xf1.q, localTangent);\n const normal = Vec2.crossVec2Num(tangent, 1.0);\n\n v11 = Transform.mulVec2(xf1, v11);\n v12 = Transform.mulVec2(xf1, v12);\n\n // Face offset.\n const frontOffset = Vec2.dot(normal, v11);\n\n // Side offsets, extended by polytope skin thickness.\n const sideOffset1 = -Vec2.dot(tangent, v11) + totalRadius;\n const sideOffset2 = Vec2.dot(tangent, v12) + totalRadius;\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, incidentEdge, Vec2.neg(tangent), sideOffset1, iv1);\n\n if (np < 2) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2);\n\n if (np < 2) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n manifold.localNormal = localNormal;\n manifold.localPoint = planePoint;\n\n let pointCount = 0;\n for (let i = 0; i < clipPoints2.length/* maxManifoldPoints */; ++i) {\n const separation = Vec2.dot(normal, clipPoints2[i].v) - frontOffset;\n\n if (separation <= totalRadius) {\n const cp = manifold.points[pointCount];\n cp.localPoint.setVec2(Transform.mulTVec2(xf2, clipPoints2[i].v));\n cp.id = clipPoints2[i].id;\n if (flip) {\n // Swap features\n const cf = cp.id.cf;\n const indexA = cf.indexA;\n const indexB = cf.indexB;\n const typeA = cf.typeA;\n const typeB = cf.typeB;\n cf.indexA = indexB;\n cf.indexB = indexA;\n cf.typeA = typeB;\n cf.typeB = typeA;\n }\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { CircleShape } from './CircleShape';\nimport { PolygonShape } from './PolygonShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, CircleShape.TYPE, PolygonCircleContact);\n\nfunction PolygonCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n CollidePolygonCircle(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport const CollidePolygonCircle = function (manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle position in the frame of the polygon.\n const c = Transform.mulVec2(xfB, circleB.m_p);\n const cLocal = Transform.mulTVec2(xfA, c);\n\n // Find the min separating edge.\n let normalIndex = 0;\n let separation = -Infinity;\n const radius = polygonA.m_radius + circleB.m_radius;\n const vertexCount = polygonA.m_count;\n const vertices = polygonA.m_vertices;\n const normals = polygonA.m_normals;\n\n for (let i = 0; i < vertexCount; ++i) {\n const s = Vec2.dot(normals[i], Vec2.sub(cLocal, vertices[i]));\n\n if (s > radius) {\n // Early out.\n return;\n }\n\n if (s > separation) {\n separation = s;\n normalIndex = i;\n }\n }\n\n // Vertices that subtend the incident face.\n const vertIndex1 = normalIndex;\n const vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0;\n const v1 = vertices[vertIndex1];\n const v2 = vertices[vertIndex2];\n\n // If the center is inside the polygon ...\n if (separation < Math.EPSILON) {\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[normalIndex]);\n manifold.localPoint.setCombine(0.5, v1, 0.5, v2);\n manifold.points[0].localPoint = circleB.m_p;\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Compute barycentric coordinates\n const u1 = Vec2.dot(Vec2.sub(cLocal, v1), Vec2.sub(v2, v1));\n const u2 = Vec2.dot(Vec2.sub(cLocal, v2), Vec2.sub(v1, v2));\n if (u1 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v1) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v1);\n manifold.localNormal.normalize();\n manifold.localPoint = v1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else if (u2 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v2) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v2);\n manifold.localNormal.normalize();\n manifold.localPoint.setVec2(v2);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else {\n const faceCenter = Vec2.mid(v1, v2);\n const separation = Vec2.dot(cLocal, normals[vertIndex1]) - Vec2.dot(faceCenter, normals[vertIndex1]);\n if (separation > radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[vertIndex1]);\n manifold.localPoint.setVec2(faceCenter);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Settings } from '../../Settings';\nimport { Contact } from '../../dynamics/Contact';\nimport { Manifold, clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport { EdgeShape } from './EdgeShape';\nimport { ChainShape } from './ChainShape';\nimport { PolygonShape } from './PolygonShape';\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, PolygonShape.TYPE, EdgePolygonContact);\nContact.addType(ChainShape.TYPE, PolygonShape.TYPE, ChainPolygonContact);\n\nfunction EdgePolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fA.getType() == EdgeShape.TYPE);\n _ASSERT && console.assert(fB.getType() == PolygonShape.TYPE);\n\n CollideEdgePolygon(manifold, fA.getShape() as EdgeShape, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nfunction ChainPolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fA.getType() == ChainShape.TYPE);\n _ASSERT && console.assert(fB.getType() == PolygonShape.TYPE);\n\n const chain = fA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n CollideEdgePolygon(manifold, edge, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nenum EPAxisType {\n e_unknown = -1,\n e_edgeA = 1,\n e_edgeB = 2,\n}\n\n// unused?\nenum VertexType {\n e_isolated = 0,\n e_concave = 1,\n e_convex = 2,\n}\n\n/**\n * This structure is used to keep track of the best separating axis.\n */\nclass EPAxis {\n type: EPAxisType;\n index: number;\n separation: number;\n}\n\n/**\n * This holds polygon B expressed in frame A.\n */\nclass TempPolygon {\n vertices: Vec2[] = []; // [Settings.maxPolygonVertices]\n normals: Vec2[] = []; // [Settings.maxPolygonVertices];\n count: number = 0;\n}\n\n/**\n * Reference face used for clipping\n */\nclass ReferenceFace {\n i1: number;\n i2: number;\n v1: Vec2;\n v2: Vec2;\n normal: Vec2 = Vec2.zero();\n sideNormal1: Vec2 = Vec2.zero();\n sideOffset1: number;\n sideNormal2: Vec2 = Vec2.zero();\n sideOffset2: number;\n}\n\n// reused\nconst edgeAxis = new EPAxis();\nconst polygonAxis = new EPAxis();\nconst polygonBA = new TempPolygon();\nconst rf = new ReferenceFace();\n\n/**\n * This function collides and edge and a polygon, taking into account edge\n * adjacency.\n */\nexport const CollideEdgePolygon = function (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform): void {\n // Algorithm:\n // 1. Classify v1 and v2\n // 2. Classify polygon centroid as front or back\n // 3. Flip normal if necessary\n // 4. Initialize normal range to [-pi, pi] about face normal\n // 5. Adjust normal range according to adjacent edges\n // 6. Visit each separating axes, only accept axes within the range\n // 7. Return if _any_ axis indicates separation\n // 8. Clip\n\n // let m_type1: VertexType;\n // let m_type2: VertexType;\n\n const xf = Transform.mulTXf(xfA, xfB);\n\n const centroidB = Transform.mulVec2(xf, polygonB.m_centroid);\n\n const v0 = edgeA.m_vertex0;\n const v1 = edgeA.m_vertex1;\n const v2 = edgeA.m_vertex2;\n const v3 = edgeA.m_vertex3;\n\n const hasVertex0 = edgeA.m_hasVertex0;\n const hasVertex3 = edgeA.m_hasVertex3;\n\n const edge1 = Vec2.sub(v2, v1);\n edge1.normalize();\n const normal1 = Vec2.neo(edge1.y, -edge1.x);\n const offset1 = Vec2.dot(normal1, Vec2.sub(centroidB, v1));\n let offset0 = 0.0;\n let offset2 = 0.0;\n let convex1 = false;\n let convex2 = false;\n\n let normal0;\n let normal2;\n\n // Is there a preceding edge?\n if (hasVertex0) {\n const edge0 = Vec2.sub(v1, v0);\n edge0.normalize();\n normal0 = Vec2.neo(edge0.y, -edge0.x);\n convex1 = Vec2.crossVec2Vec2(edge0, edge1) >= 0.0;\n offset0 = Vec2.dot(normal0, centroidB) - Vec2.dot(normal0, v0);\n }\n\n // Is there a following edge?\n if (hasVertex3) {\n const edge2 = Vec2.sub(v3, v2);\n edge2.normalize();\n normal2 = Vec2.neo(edge2.y, -edge2.x);\n convex2 = Vec2.crossVec2Vec2(edge1, edge2) > 0.0;\n offset2 = Vec2.dot(normal2, centroidB) - Vec2.dot(normal2, v2);\n }\n\n let front;\n const normal = Vec2.zero();\n const lowerLimit = Vec2.zero();\n const upperLimit = Vec2.zero();\n\n // Determine front or back collision. Determine collision normal limits.\n if (hasVertex0 && hasVertex3) {\n if (convex1 && convex2) {\n front = offset0 >= 0.0 || offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex1) {\n front = offset0 >= 0.0 || (offset1 >= 0.0 && offset2 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex2) {\n front = offset2 >= 0.0 || (offset0 >= 0.0 && offset1 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal0);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex0) {\n if (convex1) {\n front = offset0 >= 0.0 || offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex3) {\n if (convex2) {\n front = offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n }\n } else {\n front = offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setVec2(normal1);\n }\n }\n } else {\n front = offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n }\n }\n\n // Get polygonB in frameA\n polygonBA.count = polygonB.m_count;\n for (let i = 0; i < polygonB.m_count; ++i) {\n polygonBA.vertices[i] = Transform.mulVec2(xf, polygonB.m_vertices[i]);\n polygonBA.normals[i] = Rot.mulVec2(xf.q, polygonB.m_normals[i]);\n }\n\n const radius = 2.0 * Settings.polygonRadius;\n\n manifold.pointCount = 0;\n\n { // ComputeEdgeSeparation\n edgeAxis.type = EPAxisType.e_edgeA;\n edgeAxis.index = front ? 0 : 1;\n edgeAxis.separation = Infinity;\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const s = Vec2.dot(normal, Vec2.sub(polygonBA.vertices[i], v1));\n if (s < edgeAxis.separation) {\n edgeAxis.separation = s;\n }\n }\n }\n\n // If no valid normal can be found than this edge should not collide.\n // @ts-ignore\n if (edgeAxis.type == EPAxisType.e_unknown) {\n return;\n }\n\n if (edgeAxis.separation > radius) {\n return;\n }\n\n { // ComputePolygonSeparation\n polygonAxis.type = EPAxisType.e_unknown;\n polygonAxis.index = -1;\n polygonAxis.separation = -Infinity;\n\n const perp = Vec2.neo(-normal.y, normal.x);\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const n = Vec2.neg(polygonBA.normals[i]);\n\n const s1 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v1));\n const s2 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v2));\n const s = Math.min(s1, s2);\n\n if (s > radius) {\n // No collision\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n break;\n }\n\n // Adjacency\n if (Vec2.dot(n, perp) >= 0.0) {\n if (Vec2.dot(Vec2.sub(n, upperLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n } else {\n if (Vec2.dot(Vec2.sub(n, lowerLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n }\n\n if (s > polygonAxis.separation) {\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n }\n }\n }\n\n if (polygonAxis.type != EPAxisType.e_unknown && polygonAxis.separation > radius) {\n return;\n }\n\n // Use hysteresis for jitter reduction.\n const k_relativeTol = 0.98;\n const k_absoluteTol = 0.001;\n\n let primaryAxis;\n if (polygonAxis.type == EPAxisType.e_unknown) {\n primaryAxis = edgeAxis;\n } else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) {\n primaryAxis = polygonAxis;\n } else {\n primaryAxis = edgeAxis;\n }\n\n const ie = [ new ClipVertex(), new ClipVertex() ];\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.type = ManifoldType.e_faceA;\n\n // Search for the polygon normal that is most anti-parallel to the edge\n // normal.\n let bestIndex = 0;\n let bestValue = Vec2.dot(normal, polygonBA.normals[0]);\n for (let i = 1; i < polygonBA.count; ++i) {\n const value = Vec2.dot(normal, polygonBA.normals[i]);\n if (value < bestValue) {\n bestValue = value;\n bestIndex = i;\n }\n }\n\n const i1 = bestIndex;\n const i2 = i1 + 1 < polygonBA.count ? i1 + 1 : 0;\n\n ie[0].v = polygonBA.vertices[i1];\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = i1;\n ie[0].id.cf.typeA = ContactFeatureType.e_face;\n ie[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n ie[1].v = polygonBA.vertices[i2];\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = i2;\n ie[1].id.cf.typeA = ContactFeatureType.e_face;\n ie[1].id.cf.typeB = ContactFeatureType.e_vertex;\n\n if (front) {\n rf.i1 = 0;\n rf.i2 = 1;\n rf.v1 = v1;\n rf.v2 = v2;\n rf.normal.setVec2(normal1);\n } else {\n rf.i1 = 1;\n rf.i2 = 0;\n rf.v1 = v2;\n rf.v2 = v1;\n rf.normal.setMul(-1, normal1);\n }\n } else {\n manifold.type = ManifoldType.e_faceB;\n\n ie[0].v = v1;\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = primaryAxis.index;\n ie[0].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[0].id.cf.typeB = ContactFeatureType.e_face;\n\n ie[1].v = v2;\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = primaryAxis.index;\n ie[1].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[1].id.cf.typeB = ContactFeatureType.e_face;\n\n rf.i1 = primaryAxis.index;\n rf.i2 = rf.i1 + 1 < polygonBA.count ? rf.i1 + 1 : 0;\n rf.v1 = polygonBA.vertices[rf.i1];\n rf.v2 = polygonBA.vertices[rf.i2];\n rf.normal.setVec2(polygonBA.normals[rf.i1]);\n }\n\n rf.sideNormal1.setNum(rf.normal.y, -rf.normal.x);\n rf.sideNormal2.setMul(-1, rf.sideNormal1);\n rf.sideOffset1 = Vec2.dot(rf.sideNormal1, rf.v1);\n rf.sideOffset2 = Vec2.dot(rf.sideNormal2, rf.v2);\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.localNormal = Vec2.clone(rf.normal);\n manifold.localPoint = Vec2.clone(rf.v1);\n } else {\n manifold.localNormal = Vec2.clone(polygonB.m_normals[rf.i1]);\n manifold.localPoint = Vec2.clone(polygonB.m_vertices[rf.i1]);\n }\n\n let pointCount = 0;\n for (let i = 0; i < Settings.maxManifoldPoints; ++i) {\n const separation = Vec2.dot(rf.normal, Vec2.sub(clipPoints2[i].v, rf.v1));\n\n if (separation <= radius) {\n const cp = manifold.points[pointCount]; // ManifoldPoint\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n cp.localPoint = Transform.mulTVec2(xf, clipPoints2[i].v);\n cp.id = clipPoints2[i].id;\n } else {\n cp.localPoint = clipPoints2[i].v;\n cp.id.cf.typeA = clipPoints2[i].id.cf.typeB;\n cp.id.cf.typeB = clipPoints2[i].id.cf.typeA;\n cp.id.cf.indexA = clipPoints2[i].id.cf.indexB;\n cp.id.cf.indexB = clipPoints2[i].id.cf.indexA;\n }\n\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","export * from './serializer/index';\n\nexport * from './common/Math';\n\nexport * from './common/Vec2';\nexport * from './common/Vec3';\nexport * from './common/Mat22';\nexport * from './common/Mat33';\nexport * from './common/Transform';\nexport * from './common/Rot';\n\nexport * from './collision/AABB';\n\nexport * from './collision/Shape';\nexport * from './dynamics/Fixture';\nexport * from './dynamics/Body';\nexport * from './dynamics/Contact';\nexport * from './dynamics/Joint';\nexport * from './dynamics/World';\n\nexport * from './collision/shape/CircleShape';\nexport * from './collision/shape/EdgeShape';\nexport * from './collision/shape/PolygonShape';\nexport * from './collision/shape/ChainShape';\nexport * from './collision/shape/BoxShape';\n\nexport * from './collision/shape/CollideCircle';\nexport * from './collision/shape/CollideEdgeCircle';\nexport * from './collision/shape/CollidePolygon';\nexport * from './collision/shape/CollideCirclePolygon';\nexport * from './collision/shape/CollideEdgePolygon';\n\nexport * from './dynamics/joint/DistanceJoint';\nexport * from './dynamics/joint/FrictionJoint';\nexport * from './dynamics/joint/GearJoint';\nexport * from './dynamics/joint/MotorJoint';\nexport * from './dynamics/joint/MouseJoint';\nexport * from './dynamics/joint/PrismaticJoint';\nexport * from './dynamics/joint/PulleyJoint';\nexport * from './dynamics/joint/RevoluteJoint';\nexport * from './dynamics/joint/RopeJoint';\nexport * from './dynamics/joint/WeldJoint';\nexport * from './dynamics/joint/WheelJoint';\n\nexport * from './Settings';\n\nexport * from './common/Sweep';\nexport * from './collision/Manifold';\nexport * from './collision/Distance';\nexport * from './collision/TimeOfImpact';\nexport * from './collision/DynamicTree';\nexport * from './util/stats';\n\nimport { CollidePolygons } from './collision/shape/CollidePolygon';\nimport { Settings } from './Settings';\nimport { Sweep } from './common/Sweep';\nimport { DynamicTree } from './collision/DynamicTree';\nimport { Manifold } from './collision/Manifold';\nimport { Distance } from './collision/Distance';\nimport { TimeOfImpact } from './collision/TimeOfImpact';\nimport { stats } from './util/stats';\n\n/** @deprecated Merged with main namespace */\nexport const internal = {\n CollidePolygons,\n Settings,\n Sweep,\n Manifold,\n Distance,\n TimeOfImpact,\n DynamicTree,\n stats\n};\n","import Stage from 'stage-js';\n\nexport * from '../src/index';\n\nimport {\n AABB,\n Body,\n Fixture,\n Joint,\n MouseJoint,\n Vec2,\n World\n} from '../src/index';\n\nexport interface ActiveKeys {\n 0?: boolean;\n 1?: boolean;\n 2?: boolean;\n 3?: boolean;\n 4?: boolean;\n 5?: boolean;\n 6?: boolean;\n 7?: boolean;\n 8?: boolean;\n 9?: boolean;\n A?: boolean;\n B?: boolean;\n C?: boolean;\n D?: boolean;\n E?: boolean;\n F?: boolean;\n G?: boolean;\n H?: boolean;\n I?: boolean;\n J?: boolean;\n K?: boolean;\n L?: boolean;\n M?: boolean;\n N?: boolean;\n O?: boolean;\n P?: boolean;\n Q?: boolean;\n R?: boolean;\n S?: boolean;\n T?: boolean;\n U?: boolean;\n V?: boolean;\n W?: boolean;\n X?: boolean;\n Y?: boolean;\n Z?: boolean;\n right?: boolean;\n left?: boolean;\n up?: boolean;\n down?: boolean;\n fire?: boolean;\n}\n\nexport interface Testbed {\n /** @private @internal */ _pause: any;\n /** @private @internal */ _resume: any;\n /** @private @internal */ _status: any;\n /** @private @internal */ _info: any;\n\n /** @private @internal */ resume: any;\n /** @private @internal */ pause: any;\n /** @private @internal */ isPaused: any;\n /** @private @internal */ togglePause: any;\n /** @private @internal */ canvas: any;\n /** @private @internal */ focus: () => void;\n\n // camera position\n /** World viewbox width. */\n width: number;\n /** World viewbox height. */\n height: number;\n /** World viewbox center vertical offset. */\n x: number;\n /** World viewbox center horizontal offset. */\n y: number;\n\n scaleY: number;\n ratio: number;\n\n /** World simulation step frequency */\n hz: number;\n /** World simulation speed, default is 1 */\n speed: number;\n\n activeKeys: ActiveKeys;\n background: string;\n\n mouseForce?: number;\n\n status(name: string, value: any): void;\n status(value: object | string): void;\n info(text: string): void;\n\n drawPoint(p: {x: number, y: number}, r: any, color: string): void;\n drawCircle(p: {x: number, y: number}, r: number, color: string): void;\n drawSegment(a: {x: number, y: number}, b: {x: number, y: number}, color: string): void;\n drawPolygon(points: Array<{x: number, y: number}>, color: string): void;\n drawAABB(aabb: AABB, color: string): void;\n color(r: number, g: number, b: number): string;\n\n // callbacks\n step?: (dt: number, t: number) => void;\n keydown?: (keyCode: number, label: string) => void;\n keyup?: (keyCode: number, label: string) => void;\n\n findOne: (query: string) => Body | Joint | Fixture | null;\n findAll: (query: string) => Body[] | Joint[] | Fixture[];\n}\n\nexport function testbed(opts: object, callback: (testbed: Testbed) => World);\nexport function testbed(callback: (testbed: Testbed) => World);\nexport function testbed(opts, callback?) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = null;\n }\n\n (function() {\n const stage = Stage.mount();\n const canvas = stage.dom;\n stage.on(Stage.Mouse.START, function() {\n window.focus();\n // @ts-ignore\n document.activeElement && document.activeElement.blur();\n canvas.focus();\n });\n\n (stage as any).MAX_ELAPSE = 1000 / 30;\n\n // @ts-ignore\n const testbed: Testbed = {};\n testbed.canvas = canvas;\n\n let paused = false;\n stage.on('resume', function() {\n paused = false;\n testbed._resume && testbed._resume();\n });\n stage.on('pause', function() {\n paused = true;\n testbed._pause && testbed._pause();\n });\n testbed.isPaused = function() {\n return paused;\n };\n testbed.togglePause = function() {\n paused ? testbed.resume() : testbed.pause();\n };\n testbed.pause = function() {\n // @ts-ignore\n stage.pause();\n };\n testbed.resume = function() {\n // @ts-ignore\n stage.resume();\n testbed.focus();\n };\n testbed.focus = function() {\n // @ts-ignore\n document.activeElement && document.activeElement.blur();\n canvas.focus();\n };\n\n testbed.width = 80;\n testbed.height = 60;\n testbed.x = 0;\n testbed.y = -10;\n testbed.scaleY = -1;\n testbed.ratio = 16;\n testbed.hz = 60;\n testbed.speed = 1;\n testbed.activeKeys = {};\n testbed.background = '#222222';\n\n testbed.findOne = function() {\n // todo: implement\n return null;\n };\n\n testbed.findAll = function() {\n // todo: implement\n return [];\n };\n\n let statusText = '';\n const statusMap = {};\n\n function statusSet(name, value) {\n if (typeof value !== 'function' && typeof value !== 'object') {\n statusMap[name] = value;\n }\n }\n\n function statusMerge(obj) {\n // tslint:disable-next-line:no-for-in\n for (const key in obj) {\n statusSet(key, obj[key]);\n }\n }\n\n testbed.status = function(a, b?) {\n if (typeof b !== 'undefined') {\n statusSet(a, b);\n } else if (a && typeof a === 'object') {\n statusMerge(a);\n } else if (typeof a === 'string') {\n statusText = a;\n }\n\n testbed._status && testbed._status(statusText, statusMap);\n };\n\n testbed.info = function(text) {\n testbed._info && testbed._info(text);\n };\n\n let lastDrawHash = \"\";\n let drawHash = \"\";\n\n (function() {\n const drawingTexture = new Stage.Texture();\n stage.append(Stage.image(drawingTexture));\n\n const buffer = [];\n stage.tick(function() {\n buffer.length = 0;\n }, true);\n\n drawingTexture.draw = function(ctx) {\n ctx.save();\n ctx.transform(1, 0, 0, testbed.scaleY, -testbed.x, -testbed.y);\n ctx.lineWidth = 2 / testbed.ratio;\n ctx.lineCap = 'round';\n for (let drawing = buffer.shift(); drawing; drawing = buffer.shift()) {\n drawing(ctx, testbed.ratio);\n }\n ctx.restore();\n };\n\n testbed.drawPoint = function(p, r, color) {\n buffer.push(function(ctx, ratio) {\n ctx.beginPath();\n ctx.arc(p.x, p.y, 5 / ratio, 0, 2 * Math.PI);\n ctx.strokeStyle = color;\n ctx.stroke();\n });\n drawHash += \"point\" + p.x + ',' + p.y + ',' + r + ',' + color;\n };\n\n testbed.drawCircle = function(p, r, color) {\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.arc(p.x, p.y, r, 0, 2 * Math.PI);\n ctx.strokeStyle = color;\n ctx.stroke();\n });\n drawHash += \"circle\" + p.x + ',' + p.y + ',' + r + ',' + color;\n };\n\n testbed.drawSegment = function(a, b, color) {\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.lineTo(b.x, b.y);\n ctx.strokeStyle = color;\n ctx.stroke();\n });\n drawHash += \"segment\" + a.x + ',' + a.y + ',' + b.x + ',' + b.y + ',' + color;\n };\n\n testbed.drawPolygon = function(points, color) {\n if (!points || !points.length) {\n return;\n }\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y);\n }\n ctx.strokeStyle = color;\n ctx.closePath();\n ctx.stroke();\n });\n drawHash += \"segment\";\n for (let i = 1; i < points.length; i++) {\n drawHash += points[i].x + ',' + points[i].y + ',';\n }\n drawHash += color;\n };\n\n testbed.drawAABB = function(aabb, color) {\n buffer.push(function(ctx) {\n ctx.beginPath();\n ctx.moveTo(aabb.lowerBound.x, aabb.lowerBound.y);\n ctx.lineTo(aabb.upperBound.x, aabb.lowerBound.y);\n ctx.lineTo(aabb.upperBound.x, aabb.upperBound.y);\n ctx.lineTo(aabb.lowerBound.x, aabb.upperBound.y);\n ctx.strokeStyle = color;\n ctx.closePath();\n ctx.stroke();\n });\n drawHash += \"aabb\";\n drawHash += aabb.lowerBound.x + ',' + aabb.lowerBound.y + ',';\n drawHash += aabb.upperBound.x + ',' + aabb.upperBound.y + ',';\n drawHash += color;\n };\n\n testbed.color = function(r, g, b) {\n r = r * 256 | 0;\n g = g * 256 | 0;\n b = b * 256 | 0;\n return 'rgb(' + r + ', ' + g + ', ' + b + ')';\n };\n\n })();\n\n const world = callback(testbed);\n\n const viewer = new Viewer(world, testbed);\n\n let lastX = 0;\n let lastY = 0;\n stage.tick(function(dt, t) {\n // update camera position\n if (lastX !== testbed.x || lastY !== testbed.y) {\n viewer.offset(-testbed.x, -testbed.y);\n lastX = testbed.x;\n lastY = testbed.y;\n }\n });\n\n viewer.tick(function(dt, t) {\n // call testbed step, if provided\n if (typeof testbed.step === 'function') {\n testbed.step(dt, t);\n }\n\n if (targetBody) {\n testbed.drawSegment(targetBody.getPosition(), mouseMove, 'rgba(255,255,255,0.2)');\n }\n\n if (lastDrawHash !== drawHash) {\n lastDrawHash = drawHash;\n stage.touch();\n }\n drawHash = \"\";\n\n return true;\n });\n\n // stage.empty();\n stage.background(testbed.background);\n stage.viewbox(testbed.width, testbed.height);\n stage.pin('alignX', -0.5);\n stage.pin('alignY', -0.5);\n stage.prepend(viewer);\n\n function findBody(point) {\n let body;\n const aabb = new AABB(point, point);\n world.queryAABB(aabb, function(fixture) {\n if (body) {\n return;\n }\n if (!fixture.getBody().isDynamic() || !fixture.testPoint(point)) {\n return;\n }\n body = fixture.getBody();\n return true;\n });\n return body;\n }\n\n const mouseGround = world.createBody();\n let mouseJoint;\n\n let targetBody;\n const mouseMove = {x: 0, y: 0};\n\n viewer.attr('spy', true).on(Stage.Mouse.START, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (targetBody) {\n return;\n }\n\n const body = findBody(point);\n if (!body) {\n return;\n }\n\n if (testbed.mouseForce) {\n targetBody = body;\n\n } else {\n mouseJoint = new MouseJoint({maxForce: 1000}, mouseGround, body, Vec2.clone(point));\n world.createJoint(mouseJoint);\n }\n\n }).on(Stage.Mouse.MOVE, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (mouseJoint) {\n mouseJoint.setTarget(point);\n }\n\n mouseMove.x = point.x;\n mouseMove.y = point.y;\n }).on(Stage.Mouse.END, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (mouseJoint) {\n world.destroyJoint(mouseJoint);\n mouseJoint = null;\n }\n if (targetBody) {\n const force = Vec2.sub(point, targetBody.getPosition());\n targetBody.applyForceToCenter(force.mul(testbed.mouseForce), true);\n targetBody = null;\n }\n\n }).on(Stage.Mouse.CANCEL, function(point) {\n point = { x: point.x, y: testbed.scaleY * point.y };\n if (mouseJoint) {\n world.destroyJoint(mouseJoint);\n mouseJoint = null;\n }\n if (targetBody) {\n targetBody = null;\n }\n });\n\n window.addEventListener(\"keydown\", function(e) {\n switch (e.keyCode) {\n case 'P'.charCodeAt(0):\n testbed.togglePause();\n break;\n }\n }, false);\n\n const downKeys = {};\n window.addEventListener(\"keydown\", function(e) {\n const keyCode = e.keyCode;\n downKeys[keyCode] = true;\n updateActiveKeys(keyCode, true);\n testbed.keydown && testbed.keydown(keyCode, String.fromCharCode(keyCode));\n });\n window.addEventListener(\"keyup\", function(e) {\n const keyCode = e.keyCode;\n downKeys[keyCode] = false;\n updateActiveKeys(keyCode, false);\n testbed.keyup && testbed.keyup(keyCode, String.fromCharCode(keyCode));\n });\n\n const activeKeys = testbed.activeKeys;\n function updateActiveKeys(keyCode, down) {\n const char = String.fromCharCode(keyCode);\n if (/\\w/.test(char)) {\n activeKeys[char] = down;\n }\n activeKeys.right = downKeys[39] || activeKeys['D'];\n activeKeys.left = downKeys[37] || activeKeys['A'];\n activeKeys.up = downKeys[38] || activeKeys['W'];\n activeKeys.down = downKeys[40] || activeKeys['S'];\n activeKeys.fire = downKeys[32] || downKeys[13] ;\n }\n })();\n}\n\nViewer._super = Stage.Node;\nViewer.prototype = Object.create(Viewer._super.prototype);\n\nfunction Viewer(world, opts) {\n Viewer._super.call(this);\n this.label('Planck');\n\n opts = opts || {};\n\n this._options = {};\n this._options.speed = opts.speed || 1;\n this._options.hz = opts.hz || 60;\n if (Math.abs(this._options.hz) < 1) {\n this._options.hz = 1 / this._options.hz;\n }\n this._options.scaleY = opts.scaleY || -1;\n this._options.ratio = opts.ratio || 16;\n this._options.lineWidth = 2 / this._options.ratio;\n\n this._world = world;\n\n const timeStep = 1 / this._options.hz;\n let elapsedTime = 0;\n this.tick((dt) => {\n dt = dt * 0.001 * this._options.speed;\n elapsedTime += dt;\n while (elapsedTime > timeStep) {\n world.step(timeStep);\n elapsedTime -= timeStep;\n }\n this.renderWorld();\n return true;\n }, true);\n\n world.on('remove-fixture', function(obj) {\n obj.ui && obj.ui.remove();\n });\n\n world.on('remove-joint', function(obj) {\n obj.ui && obj.ui.remove();\n });\n}\n\nViewer.prototype.renderWorld = function() {\n const world = this._world;\n const options = this._options;\n const viewer = this;\n\n for (let b = world.getBodyList(); b; b = b.getNext()) {\n for (let f = b.getFixtureList(); f; f = f.getNext()) {\n\n if (!f.ui) {\n if (f.render && f.render.stroke) {\n options.strokeStyle = f.render.stroke;\n } else if (b.render && b.render.stroke) {\n options.strokeStyle = b.render.stroke;\n } else if (b.isDynamic()) {\n options.strokeStyle = 'rgba(255,255,255,0.9)';\n } else if (b.isKinematic()) {\n options.strokeStyle = 'rgba(255,255,255,0.7)';\n } else if (b.isStatic()) {\n options.strokeStyle = 'rgba(255,255,255,0.5)';\n }\n\n if (f.render && f.render.fill) {\n options.fillStyle = f.render.fill;\n } else if (b.render && b.render.fill) {\n options.fillStyle = b.render.fill;\n } else {\n options.fillStyle = '';\n }\n\n const type = f.getType();\n const shape = f.getShape();\n if (type == 'circle') {\n f.ui = viewer.drawCircle(shape, options);\n }\n if (type == 'edge') {\n f.ui = viewer.drawEdge(shape, options);\n }\n if (type == 'polygon') {\n f.ui = viewer.drawPolygon(shape, options);\n }\n if (type == 'chain') {\n f.ui = viewer.drawChain(shape, options);\n }\n\n if (f.ui) {\n f.ui.appendTo(viewer);\n }\n }\n\n if (f.ui) {\n const p = b.getPosition();\n const r = b.getAngle();\n if (f.ui.__lastX !== p.x || f.ui.__lastY !== p.y || f.ui.__lastR !== r) {\n f.ui.__lastX = p.x;\n f.ui.__lastY = p.y;\n f.ui.__lastR = r;\n f.ui.offset(p.x, options.scaleY * p.y);\n f.ui.rotate(options.scaleY * r);\n }\n }\n\n }\n }\n\n for (let j = world.getJointList(); j; j = j.getNext()) {\n const type = j.getType();\n const a = j.getAnchorA();\n const b = j.getAnchorB();\n\n if (!j.ui) {\n options.strokeStyle = 'rgba(255,255,255,0.2)';\n\n j.ui = viewer.drawJoint(j, options);\n j.ui.pin('handle', 0.5);\n if (j.ui) {\n j.ui.appendTo(viewer);\n }\n }\n\n if (j.ui) {\n const cx = (a.x + b.x) * 0.5;\n const cy = options.scaleY * (a.y + b.y) * 0.5;\n const dx = a.x - b.x;\n const dy = options.scaleY * (a.y - b.y);\n const d = Math.sqrt(dx * dx + dy * dy);\n j.ui.width(d);\n j.ui.rotate(Math.atan2(dy, dx));\n j.ui.offset(cx, cy);\n }\n }\n\n};\n\nViewer.prototype.drawJoint = function(joint, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const length = 10;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(length + 2 * lw, 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n ctx.moveTo(lw, lw);\n ctx.lineTo(lw + length, lw);\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const image = Stage.image(texture).stretch();\n return image;\n};\n\nViewer.prototype.drawCircle = function(shape, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const r = shape.m_radius;\n const cx = r + lw;\n const cy = r + lw;\n const w = r * 2 + lw * 2;\n const h = r * 2 + lw * 2;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(w, h, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.arc(cx, cy, r, 0, 2 * Math.PI);\n if (options.fillStyle) {\n ctx.fillStyle = options.fillStyle;\n ctx.fill();\n }\n ctx.lineTo(cx, cy);\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n const image = Stage.image(texture)\n .offset(shape.m_p.x - cx, options.scaleY * shape.m_p.y - cy);\n const node = Stage.create().append(image);\n return node;\n};\n\nViewer.prototype.drawEdge = function(edge, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const v1 = edge.m_vertex1;\n const v2 = edge.m_vertex2;\n\n const dx = v2.x - v1.x;\n const dy = v2.y - v1.y;\n\n const length = Math.sqrt(dx * dx + dy * dy);\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(length + 2 * lw, 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n ctx.moveTo(lw, lw);\n ctx.lineTo(lw + length, lw);\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const minX = Math.min(v1.x, v2.x);\n const minY = Math.min(options.scaleY * v1.y, options.scaleY * v2.y);\n\n const image = Stage.image(texture);\n image.rotate(options.scaleY * Math.atan2(dy, dx));\n image.offset(minX - lw, minY - lw);\n const node = Stage.create().append(image);\n return node;\n};\n\nViewer.prototype.drawPolygon = function(shape, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const vertices = shape.m_vertices;\n\n if (!vertices.length) {\n return;\n }\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, options.scaleY * v.y);\n maxY = Math.max(maxY, options.scaleY * v.y);\n }\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(width + 2 * lw, height + 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n const x = v.x - minX + lw;\n const y = options.scaleY * v.y - minY + lw;\n if (i == 0)\n ctx.moveTo(x, y);\n else\n ctx.lineTo(x, y);\n }\n\n if (vertices.length > 2) {\n ctx.closePath();\n }\n\n if (options.fillStyle) {\n ctx.fillStyle = options.fillStyle;\n ctx.fill();\n ctx.closePath();\n }\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const image = Stage.image(texture);\n image.offset(minX - lw, minY - lw);\n const node = Stage.create().append(image);\n return node;\n};\n\nViewer.prototype.drawChain = function(shape, options) {\n const lw = options.lineWidth;\n const ratio = options.ratio;\n\n const vertices = shape.m_vertices;\n\n if (!vertices.length) {\n return;\n }\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, options.scaleY * v.y);\n maxY = Math.max(maxY, options.scaleY * v.y);\n }\n\n const width = maxX - minX;\n const height = maxY - minY;\n\n const texture = Stage.canvas(function(ctx) {\n\n this.size(width + 2 * lw, height + 2 * lw, ratio);\n\n ctx.scale(ratio, ratio);\n ctx.beginPath();\n for (let i = 0; i < vertices.length; ++i) {\n const v = vertices[i];\n const x = v.x - minX + lw;\n const y = options.scaleY * v.y - minY + lw;\n if (i == 0)\n ctx.moveTo(x, y);\n else\n ctx.lineTo(x, y);\n }\n\n // TODO: if loop\n if (vertices.length > 2) {\n // ctx.closePath();\n }\n\n if (options.fillStyle) {\n ctx.fillStyle = options.fillStyle;\n ctx.fill();\n ctx.closePath();\n }\n\n ctx.lineCap = 'round';\n ctx.lineWidth = options.lineWidth;\n ctx.strokeStyle = options.strokeStyle;\n ctx.stroke();\n });\n\n const image = Stage.image(texture);\n image.offset(minX - lw, minY - lw);\n const node = Stage.create().append(image);\n return node;\n};\n"],"names":["__defProp","Object","defineProperty","__publicField","obj","key","value","enumerable","configurable","writable","__defNormalProp","stats","create","tick","node","draw","fps","Matrix","[object Object]","a","b","c","d","e","f","this","reset","_dirty","angle","u","Math","cos","v","sin","x","y","m","n","inverted","z","p","q","iid$1","Pin","owner","_owner","_parent","_relativeMatrix","_absoluteMatrix","prototype","_textureAlpha","_alpha","_width","_height","_scaleX","_scaleY","_skewX","_skewY","_rotation","_pivoted","_pivotX","_pivotY","_handled","_handleX","_handleY","_aligned","_alignX","_alignY","_offsetX","_offsetY","_boxX","_boxY","_boxWidth","_boxHeight","_ts_translate","_ts_transform","_ts_matrix","_update","_pin","_mo_handle","_mo_align","toString","absoluteMatrix","ts","max","_mo_abs","abs2","relativeMatrix","concat","_mo_rel","rel2","identity","translate","scale","skew","rotate","_x","_y","get","getters","set","setters","_ts_pin","touch","alpha","pin","textureAlpha","width","height","boxWidth","boxHeight","scaleX","scaleY","skewX","skewY","rotation","pivotX","pivotY","offsetX","offsetY","alignX","alignY","handleX","handleY","_width_","_height_","pivot","offset","align","handle","resizeMode","all","scaleTo","resizeWidth","resizeHeight","scaleMode","scaleWidth","scaleHeight","matrix","mode","w","h","min","_add_shortcuts","size","ta","iid","assertType","Node","append","parent","child","remove","_last","_next","_prev","_first","_flag","_ts_parent","_ts_children","prepend","insertBefore","self","next","prev","insertAfter","relative","_label","_visible","_attrs","_flags","id","label","attr","name","visible","hide","show","first","last","visit","visitor","data","reverse","start","end","more","Array","isArray","i","length","arguments","appendTo","prependTo","insertNext","sibling","insertPrev","empty","_ts_touch","type","hitTest","hit","_textures","render","context","setTransform","globalAlpha","_tickBefore","_tickAfter","MAX_ELAPSE","Infinity","_tick","elapsed","now","ticked","call","ticker","before","push","untick","indexOf","splice","timeout","fn","time","setTimeout","timer","t","clearTimeout","_listeners","_event_callback","on","types","listener","join","match","off","index","listeners","publish","args","l","apply","trigger","native","math","random","math$1","wrap","num","clamp","sqrt","limit","isFn","str","isHash","constructor","Texture","texture2","ratio","src","drawable","_image","_sx","_dx","_sy","_dy","_sw","_dw","_sh","_dh","x1","y1","x2","y2","x3","y3","x4","y4","sx","sy","sw","sh","dx","dy","dw","dh","drawImage","ex","_draw_failed","console","log","NO_TEXTURE","super","NO_SELECTION","Selection","_atlases_map","_atlases_arr","Atlas","def","atlas2","deprecated","map","filter","ppu","trim","textures","factory","cutouts","sprites","make","def2","assign","top","bottom","left","right","pipe","find","query","result","string","startsWith","subquery","select","found","link","result2","one","array","arr","texture","slice","error","hash","msg","replace","PIXEL_RATIO","window","devicePixelRatio","M","Mouse","event","preventDefault","locate","lookup","clicklist","cancellist","elem","touches","clientX","clientY","rect","getBoundingClientRect","clientLeft","clientTop","collect","root","stage","visitStart","visitEnd","targets","timeStamp","Date","shift","rel","raw","abs","inverse","cancel","viewport","addEventListener","handleStart","handleEnd","handleMove","handleCancel","document","removeEventListener","defineValue","IDENTITY","_cache","_modes","_easings","Easing","token","fallback","exec","easing","params","fc","split","names","add","PI","pow","s","asin","tween","options","duration","delay","_tweens","ticktime","ignore","head","finish","unshift","Tween","_end","_duration","_delay","_time","_start","ended","_easing","_ending","forEach","callback","_hide","_remove","pinning","done","forward","_stages","Root","configs","canvas","getElementById","HTMLCanvasElement","createElement","style","position","display","body","firstChild","dom","getContext","backingStoreRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","pixelRatio","mounted","requestFrame","onFrame","frameRequested","requestAnimationFrame","newPixelWidth","clientWidth","newPixelHeight","clientHeight","pixelWidth","pixelHeight","drawingWidth","drawingHeight","lastTime","paused","sleep","tickRequest","_mo_touch","clearRect","_a","mouse","unmount","color","backgroundColor","_viewport","viewbox","_viewbox","rescale","_camera","camera","viewportWidth","viewportHeight","viewboxMode","test","viewboxWidth","viewboxHeight","viewboxX","viewboxY","cameraZoom","cameraX","cameraY","sprite","frame","sprite2","Sprite","_super","tile","inner","_repeat","stretch","insert","repeat2","dest","_repeatTicker","_mo_stretch","img","owidth","oheight","r","repeat","image","Image$1","Anim","_fps","_ft","_index","_frames","moveFrame","stop","_callback","setFrames","frames","gotoFrame","resize","move","play","Str","setFont","_item","setValue","_value","_spacing","row","column","_padding","_layoutTiker","_mo_seq","alignChildren","_mo_seqAlign","box","_mo_box","layer","padding","pad","spacing","space","Stage$1","freeze","__proto__","Image","anim","anim2","atlas","async","url","imagePath","imageRatio","image2","Promise","resolve","reject","onload","onerror","attributes","plotter","canvas2","memoizeDraw","memoKey","lastSelection","lastRatio","Stage","newRatio","rationChange","newSelection","__timestamp","mount","pause","resume","Symbol","toStringTag","extendStatics","setPrototypeOf","hasOwnProperty","__extends","TypeError","String","__","__assign","input","defaults","output","getOwnPropertySymbols","symbols","symbol","propertyIsEnumerable","EPSILON","isFinite","isNaN","assert","nextPowerOfTwo","isPowerOfTwo","mod","Vec2","_serialize","_deserialize","zero","neo","clone","JSON","stringify","isValid","o","setZero","setNum","setVec2","wSet","setCombine","setMul","wAdd","addCombine","addMul","wSub","subCombine","subMul","sub","mul","lengthOf","lengthSquared","normalize","invLength","distance","distanceSquared","areEqual","dot","cross","crossVec2Vec2","crossVec2Num","crossNumVec2","addCross","addCrossVec2Num","addCrossNumVec2","combine","mulNumVec2","mulVec2Num","neg","mid","upper","lower","lengthSqr","scaleFn","translateFn","AABB","lowerBound","upperBound","getCenter","getExtents","getPerimeter","lowerA","upperA","lowerB","upperB","lowerX","lowerY","upperX","upperY","combinePoints","aabb","contains","extend","testOverlap","d1x","d2x","d1y","d2y","diff","wD","hD","rayCast","tmin","tmax","p1","p2","absD","normal","inv_d","t1","t2","temp","maxFraction","fraction","Settings","linearSlop","maxTranslation","maxRotation","linearSleepTolerance","angularSleepTolerance","maxManifoldPoints","maxPolygonVertices","aabbExtension","aabbMultiplier","angularSlop","maxSubSteps","maxTOIContacts","maxTOIIterations","maxDistnceIterations","velocityThreshold","maxLinearCorrection","maxAngularCorrection","baumgarte","toiBaugarte","timeToSleep","Pool","opts","_list","_max","_createCount","_outCount","_inCount","_discardCount","_createFn","_outFn","allocate","_inFn","release","_discardFn","discard","item","TreeNode","userData","child1","child2","isLeaf","DynamicTree","inputPool","stack","stackPool","iteratorPool","Iterator","iterator","close","m_root","m_nodes","m_lastProxyId","m_pool","getUserData","getFatAABB","allocateNode","freeNode","createProxy","insertLeaf","destroyProxy","removeLeaf","moveProxy","leaf","leafAABB","area","combinedAABB","combinedArea","cost","inheritanceCost","cost1","oldArea","cost2","oldParent","newParent","balance","grandParent","iA","A","B","C","F","G","D","E","getHeight","getAreaRatio","rootArea","totalArea","it","preorder","computeHeight","height1","height2","validateStructure","validateMetrics","validate","getMaxBalance","maxBalance","rebuildBottomUp","nodes","count","minCost","iMin","jMin","aabbi","j","aabbj","parent_1","shiftOrigin","newOrigin","queryCallback","pop","rayCastCallback","abs_v","segmentAABB","subInput","parents","states","BroadPhase","_this","m_tree","m_proxyCount","m_moveBuffer","proxyId","m_queryProxyId","proxyIdA","proxyIdB","userDataA","userDataB","m_callback","aabbA","aabbB","getProxyCount","getTreeHeight","getTreeBalance","getTreeQuality","bufferMove","unbufferMove","displacement","touchProxy","updatePairs","addPairCallback","fatAABB","Rot","setAngle","setRot","setIdentity","rot","getAngle","atan2","getXAxis","getYAxis","qr","mulRot","mulVec2","mulSub","mulT","mulTRot","mulTVec2","Transform","xf","mulXf","mulAll","mulFn","mulTXf","px","py","Sweep","localCenter","alpha0","c0","a0","setLocalCenter","getTransform","beta","advance","that","Velocity","Position","Shape","m_type","m_radius","FixtureDefDefault","friction","restitution","density","isSensor","filterGroupIndex","filterCategoryBits","filterMaskBits","FixtureProxy","fixture","childIndex","Fixture","shape","m_body","m_friction","m_restitution","m_density","m_isSensor","m_filterGroupIndex","m_filterCategoryBits","m_filterMaskBits","m_shape","m_next","m_proxies","childCount","getChildCount","m_userData","_reset","getBody","broadPhase","m_world","m_broadPhase","destroyProxies","createProxies","m_xf","resetMassData","restore","getType","getShape","setSensor","sensor","setAwake","setUserData","getNext","getDensity","setDensity","getFriction","setFriction","getRestitution","setRestitution","testPoint","getMassData","massData","computeMass","getAABB","proxy","computeAABB","synchronize","xf1","xf2","aabb1","aabb2","setFilterData","groupIndex","categoryBits","maskBits","refilter","getFilterGroupIndex","setFilterGroupIndex","getFilterCategoryBits","setFilterCategoryBits","getFilterMaskBits","setFilterMaskBits","edge","getContactList","contact","fixtureA","getFixtureA","fixtureB","getFixtureB","flagForFiltering","world","getWorld","shouldCollide","collideA","collideB","STATIC","KINEMATIC","DYNAMIC","BodyDefDefault","linearVelocity","angularVelocity","linearDamping","angularDamping","fixedRotation","bullet","gravityScale","allowSleep","awake","active","MassData","mass","center","I","Body","m_awakeFlag","m_autoSleepFlag","m_bulletFlag","m_fixedRotationFlag","m_activeFlag","m_islandFlag","m_toiFlag","m_mass","m_invMass","m_I","m_invI","m_sweep","c_velocity","c_position","m_force","m_torque","m_linearVelocity","m_angularVelocity","m_linearDamping","m_angularDamping","m_gravityScale","m_sleepTime","m_jointList","m_contactList","m_fixtureList","m_prev","m_destroyed","fixtures","_addFixture","isWorldLocked","isLocked","getFixtureList","getJointList","isStatic","isDynamic","isKinematic","setStatic","setType","setDynamic","setKinematic","synchronizeFixtures","ce","ce0","destroyContact","proxyCount","isBullet","setBullet","flag","isSleepingAllowed","setSleepingAllowed","isAwake","isActive","setActive","isFixedRotation","setFixedRotation","synchronizeTransform","getPosition","setPosition","getWorldCenter","getLocalCenter","getLinearVelocity","getLinearVelocityFromWorldPoint","worldPoint","getLinearVelocityFromLocalPoint","localPoint","getWorldPoint","setLinearVelocity","getAngularVelocity","setAngularVelocity","getLinearDamping","setLinearDamping","getAngularDamping","setAngularDamping","getGravityScale","setGravityScale","getMass","getInertia","oldCenter","setMassData","applyForce","force","point","wake","applyForceToCenter","applyTorque","torque","applyLinearImpulse","impulse","applyAngularImpulse","jn","other","joint","m_collideConnected","m_newFixture","createFixture","fixdef","destroyFixture","getWorldVector","localVector","getLocalPoint","getLocalVector","worldVector","JointEdge","Joint","bodyA","bodyB","m_edgeA","m_edgeB","m_bodyA","m_bodyB","collideConnected","getBodyA","getBodyB","getCollideConnected","gjkCalls","gjkIters","gjkMaxIters","toiTime","toiMaxTime","toiCalls","toiIters","toiMaxIters","toiRootIters","toiMaxRootIters","newline","name_1","Timer","DistanceInput","proxyA","DistanceProxy","proxyB","transformA","transformB","useRadii","DistanceOutput","pointA","pointB","SimplexCache","metric","indexA","indexB","Distance","cache","xfA","xfB","simplex","Simplex","readCache","vertices","m_v","k_maxIters","saveA","saveB","saveCount","iter","m_count","solve","getClosestPoint","getSearchDirection","vertex","getSupport","wA","getVertex","wB","duplicate","getWitnessPoints","iterations","writeCache","rA","rB","m_buffer","m_vertices","getVertexCount","bestIndex","bestValue","getSupportVertex","computeDistanceProxy","SimplexVertex","m_v1","m_v2","m_v3","wALocal","wBLocal","metric1","metric2","getMetric","e12","pA","pB","solve2","solve3","w1","w2","d12_2","d12_1","inv_d12","w3","w1e12","e13","w1e13","d13_1","d13_2","e23","w2e23","d23_1","d23_2","n123","d123_1","d123_2","d123_3","inv_d13","inv_d23","inv_d123","shapeA","shapeB","Input","Output","Proxy","Cache","TOIOutputState","TOIInput","sweepA","sweepB","exports","TOIOutput","SeparationFunctionType","TimeOfImpact","state","e_unknown","tMax","totalRadius","target","tolerance","k_maxIterations","distanceInput","distanceOutput","e_overlapped","e_touching","fcn","SeparationFunction","initialize","pushBackIter","s2","findMinSeparation","e_separated","s1","evaluate","e_failed","rootIterCount","a1","a2","m_proxyA","m_proxyB","m_localPoint","m_axis","m_sweepA","m_sweepB","e_points","localPointA","localPointB","e_faceB","localPointB1","localPointB2","e_faceA","localPointA1","localPointA2","compute","axisA","axisB","TimeStep","dt","inv_dt","velocityIterations","positionIterations","warmStarting","blockSolve","inv_dt0","dtRatio","s_subStep","ContactImpulse","normals","tangents","v_points","normalImpulse","tangentImpulse","Solver","m_stack","m_bodies","m_contacts","m_joints","clear","addBody","addContact","addJoint","solveWorld","step","m_bodyList","seed","isEnabled","isTouching","sensorA","m_fixtureA","sensorB","m_fixtureB","je","solveIsland","gravity","m_gravity","m_allowSleep","initConstraint","initVelocityConstraint","warmStartConstraint","initVelocityConstraints","solveVelocityConstraints","solveVelocityConstraint","storeConstraintImpulses","translation","maxTranslationSquared","maxRotationSquared","positionSolved","minSeparation","separation","solvePositionConstraint","contactsOkay","jointsOkay","jointOkay","solvePositionConstraints","postSolveIsland","minSleepTime","linTolSqr","linearSleepToleranceSqr","angTolSqr","angularSleepToleranceSqr","solveWorldTOI","m_stepComplete","m_toiCount","m_toi","minContact","minAlpha","fA_1","fB_1","bA_1","bB_1","activeA","activeB","getChildIndexA","getChildIndexB","fA","fB","bA","bB","backup1","backup2","update","bodies","backup","solveIslandTOI","findNewContacts","m_subStepping","setEnabled","subStep","toiA","toiB","solvePositionConstraintTOI","postSolve","m_impulse","ManifoldType","ContactFeatureType","PointState","Mat22","ey","getInverse","det","imx","mx","mulMat22","mulTMat22","mx1","mx2","ClipVertex","ContactID","Manifold","localNormal","points","ManifoldPoint","pointCount","getWorldManifold","wm","radiusA","radiusB","WorldManifold","separations","e_circles","dist","cA","cB","planePoint","clipPoint","clipSegmentToLine","getPointStates","cf","ContactFeature","typeA","typeB","state1","state2","manifold1","manifold2","removeState","persistState","addState","vOut","vIn","vertexIndexA","numOut","distance0","distance1","interp","e_vertex","e_face","ContactEdge","mixFriction","friction1","friction2","mixRestitution","restitution1","restitution2","s_registers","VelocityConstraintPoint","normalMass","tangentMass","velocityBias","Contact","evaluateFcn","m_manifold","m_tangentSpeed","m_enabledFlag","m_touchingFlag","m_filterFlag","m_bulletHitFlag","v_normal","v_normalMass","v_K","p_localPoints","p_localNormal","p_localPoint","p_localCenterA","p_localCenterB","m_nodeA","m_nodeB","m_indexA","m_indexB","m_evaluateFcn","manifold","getManifold","v_invMassA","v_invMassB","v_invIA","v_invIB","v_friction","v_restitution","v_tangentSpeed","v_pointCount","p_invMassA","p_invMassB","p_invIA","p_invIB","p_radiusA","p_radiusB","p_type","p_pointCount","cp","vcp","worldManifold","resetFriction","resetRestitution","setTangentSpeed","speed","getTangentSpeed","oldManifold","touching","wasTouching","nmp","omp","beginContact","endContact","preSolve","_solvePositionConstraint","toi","positionA","positionB","localCenterA","localCenterB","mA","mB","iB","aA","aB","rnA","rnB","K","P","velocityA","velocityB","vA","vB","kNormal","tangent","rtA","rtB","kTangent","vRel","vcp1","vcp2","rn1A","rn1B","rn2A","rn2B","k11","k22","k12","dv","vt","lambda","maxFriction","newImpulse","vn","dv1","dv2","vn1","vn2","P1","P2","addType","type1","type2","destroy","WorldDefDefault","continuousPhysics","subStepping","World","s_step","m_solver","m_contactCount","m_bodyCount","m_jointCount","m_clearForces","m_locked","m_warmStarting","m_continuousPhysics","m_blockSolve","m_velocityIterations","m_positionIterations","m_t","joints","getBodyList","_addBody","createJoint","getBodyCount","getJointCount","getContactCount","setGravity","getGravity","setAllowSleeping","getAllowSleeping","setWarmStarting","getWarmStarting","setContinuousPhysics","getContinuousPhysics","setSubStepping","getSubStepping","setAutoClearForces","getAutoClearForces","clearForces","queryAABB","point1","point2","createBody","arg1","arg2","createDynamicBody","createKinematicBody","destroyBody","je0","destroyJoint","f0","timeStep","updateContacts","createContact","next_c","arg3","Vec3","EdgeShape","v1","v2","TYPE","polygonRadius","m_vertex1","m_vertex2","m_vertex0","m_vertex3","m_hasVertex0","m_hasVertex3","vertex1","vertex2","vertex0","vertex3","hasVertex0","hasVertex3","setPrevVertex","setNextVertex","getRadius","setNext","getNextVertex","setPrev","getPrevVertex","_set","_clone","numerator","denominator","rr","Edge","ChainShape","loop","m_prevVertex","m_nextVertex","m_hasPrevVertex","m_hasNextVertex","m_isLoop","_createLoop","_createChain","isLoop","hasPrevVertex","hasNextVertex","prevVertex","nextVertex","getChildEdge","Chain","PolygonShape","m_centroid","m_normals","_setAsBox","ps","unique","linearSlopSquared","i0","x0","hull","ih","ie","i1","i2","vs","pRef","inv3","p3","e1","e2","triangleArea","ComputeCentroid","hx","hy","pLocal","minX","minY","maxX","maxY","k_inv3","ex1","ey1","ex2","ey2","Polygon","BoxShape","Box","CircleShape","m_p","radius","sigma","Circle","DEFAULTS","frequencyHz","dampingRatio","DistanceJoint","anchorA","anchorB","m_localAnchorA","localAnchorA","m_localAnchorB","localAnchorB","m_length","m_frequencyHz","m_dampingRatio","m_gamma","m_bias","gamma","bias","_setAnchors","getLocalAnchorA","getLocalAnchorB","setLength","getLength","setFrequency","hz","getFrequency","setDampingRatio","getDampingRatio","getAnchorA","getAnchorB","getReactionForce","m_u","getReactionTorque","m_localCenterA","m_localCenterB","m_invMassA","m_invMassB","m_invIA","m_invIB","qA","qB","m_rA","m_rB","crAu","crBu","invMass","omega","k","vpA","vpB","Cdot","maxForce","maxTorque","FrictionJoint","anchor","m_linearImpulse","m_angularImpulse","m_maxForce","m_maxTorque","setMaxForce","getMaxForce","setMaxTorque","getMaxTorque","m_linearMass","m_angularMass","oldImpulse","maxImpulse","Mat33","ez","solve33","solve22","a11","a12","a21","a22","getInverse22","getSymInverse33","a13","a23","a33","mulVec3","lowerAngle","upperAngle","maxMotorTorque","motorSpeed","enableLimit","enableMotor","RevoluteJoint","m_limitState","m_referenceAngle","referenceAngle","m_motorImpulse","m_lowerAngle","m_upperAngle","m_maxMotorTorque","m_motorSpeed","m_enableLimit","m_enableMotor","getReferenceAngle","getJointAngle","getJointSpeed","isMotorEnabled","getMotorTorque","setMotorSpeed","getMotorSpeed","setMaxMotorTorque","getMaxMotorTorque","isLimitEnabled","getLowerLimit","getUpperLimit","setLimits","m_motorMass","jointAngle","Cdot1","Cdot2","rhs","reduced","positionError","angularError","limitImpulse","lowerTranslation","upperTranslation","maxMotorForce","PrismaticJoint","axis","m_localXAxisA","localAxisA","m_localYAxisA","m_lowerTranslation","m_upperTranslation","m_maxMotorForce","m_perp","m_K","getLocalAxisA","getJointTranslation","setMaxMotorForce","getMaxMotorForce","getMotorForce","m_a1","m_a2","m_s1","m_s2","k13","k23","k33","jointTranslation","LA","LB","f1","df","f2r","perp","C1","linearError","C2","impulse1","GearJoint","joint1","joint2","coordinateA","coordinateB","m_joint1","m_joint2","m_ratio","m_type1","m_type2","m_bodyC","xfC","aC","revolute","m_localAnchorC","m_referenceAngleA","m_localAxisC","prismatic","pC","m_bodyD","xfD","aD","m_localAnchorD","m_referenceAngleB","m_localAxisD","pD","m_constant","getJoint1","getJoint2","setRatio","getRatio","m_JvAC","m_JwA","m_lcA","m_lcB","m_lcC","m_lcD","m_mA","m_mB","m_mC","m_mD","m_iA","m_iB","m_iC","m_iD","vC","wC","vD","qC","qD","m_JwC","rC","m_JvBD","m_JwB","m_JwD","rD","JvAC","JvBD","JwA","JwB","JwC","JwD","cC","cD","correctionFactor","MotorJoint","m_linearOffset","linearOffset","m_angularOffset","angularOffset","m_correctionFactor","setCorrectionFactor","factor","getCorrectionFactor","setLinearOffset","getLinearOffset","setAngularOffset","getAngularOffset","m_linearError","m_angularError","inv_h","MouseJoint","m_targetA","m_beta","m_C","_localAnchorB","setTarget","getTarget","velocity","PulleyJoint","groundA","groundB","m_groundAnchorA","groundAnchorA","m_groundAnchorB","groundAnchorB","m_lengthA","lengthA","m_lengthB","lengthB","getGroundAnchorA","getGroundAnchorB","getLengthA","getLengthB","getCurrentLengthA","getCurrentLengthB","m_uB","m_uA","ruA","ruB","PA","PB","uA","uB","maxLength","RopeJoint","m_maxLength","m_state","setMaxLength","getMaxLength","getLimitState","crA","crB","WeldJoint","invM","impulse2","WheelJoint","m_ax","m_ay","localAxis","m_springMass","m_springImpulse","setSpringFrequencyHz","getSpringFrequencyHz","setSpringDampingRatio","getSpringDampingRatio","m_sAy","m_sBy","m_sAx","m_sBx","damp","ay","sAy","sBy","SID","Serializer","rootClass","preSerialize","postSerialize","preDeserialize","postDeserialize","refTypes","restoreTypes","CLASS_BY_TYPE_PROP","toJson","json","queue","refMap","storeRef","typeName","__sid","ref","refIndex","refType","serialize","newValue","fromJson","deserialize","cls","ctx","deserializer","findDeserilizer","restoreRef","serializer","CollideCircles","circleA","circleB","distSqr","CollideEdgeCircle","chain","edgeA","Q","P_1","d_1","A1","B1","P_2","d_2","B2","A2","den","findMaxSeparation","poly1","poly2","count1","count2","n1s","v1s","v2s","maxSeparation","si","sij","CollidePolygons","polyA","polyB","separationA","edgeB","separationB","edge1","flip","incidentEdge","normals1","vertices2","normals2","normal1","minDot","findIncidentEdge","vertices1","iv1","iv2","v11","v12","localTangent","frontOffset","sideOffset1","sideOffset2","clipPoints1","clipPoints2","CollidePolygonCircle","EPAxisType","VertexType","polygonA","cLocal","normalIndex","vertexCount","vertIndex1","vertIndex2","u1","u2","faceCenter","CollideEdgePolygon","EPAxis","TempPolygon","ReferenceFace","sideNormal1","sideNormal2","edgeAxis","polygonAxis","polygonBA","rf","polygonB","centroidB","v0","v3","normal0","normal2","front","offset1","offset0","offset2","convex1","convex2","edge0","edge2","lowerLimit","upperLimit","e_edgeA","e_edgeB","primaryAxis","internal","testbed","START","focus","activeElement","blur","_resume","_pause","isPaused","togglePause","activeKeys","background","findOne","findAll","statusText","statusMap","statusSet","status","statusMerge","_status","info","text","_info","lastDrawHash","drawHash","drawingTexture","buffer","save","transform","lineWidth","lineCap","drawing","drawPoint","beginPath","arc","strokeStyle","stroke","drawCircle","drawSegment","moveTo","lineTo","drawPolygon","closePath","drawAABB","g","viewer","Viewer","lastX","lastY","targetBody","mouseMove","mouseJoint","mouseGround","findBody","mouseForce","MOVE","END","CANCEL","keyCode","charCodeAt","downKeys","updateActiveKeys","keydown","fromCharCode","keyup","down","char","up","fire","_options","_world","elapsedTime","renderWorld","ui","fill","fillStyle","drawEdge","drawChain","__lastX","__lastY","__lastR","drawJoint","cx","cy","lw"],"mappings":"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"} \ No newline at end of file diff --git a/dist/planck.cjs b/dist/planck.cjs new file mode 100644 index 00000000..6ec6d31b --- /dev/null +++ b/dist/planck.cjs @@ -0,0 +1,14950 @@ +/** + * Planck.js v1.0.0-beta.0 + * @license The MIT license + * @copyright Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; + +var options = function (input, defaults) { + if (input === null || typeof input === 'undefined') { + // tslint:disable-next-line:no-object-literal-type-assertion + input = {}; + } + var output = __assign({}, input); + // tslint:disable-next-line:no-for-in + for (var key in defaults) { + if (defaults.hasOwnProperty(key) && typeof input[key] === 'undefined') { + output[key] = defaults[key]; + } + } + if (typeof Object.getOwnPropertySymbols === 'function') { + var symbols = Object.getOwnPropertySymbols(defaults); + for (var i = 0; i < symbols.length; i++) { + var symbol = symbols[i]; + if (defaults.propertyIsEnumerable(symbol) && typeof input[symbol] === 'undefined') { + output[symbol] = defaults[symbol]; + } + } + } + return output; +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var math = Object.assign(Object.create(Math), { + EPSILON: 1e-9, + /** + * This function is used to ensure that a floating point number is not a NaN or + * infinity. + */ + isFinite: function (x) { + return (typeof x === 'number') && isFinite(x) && !isNaN(x); + }, + assert: function (x) { + }, + /** + * Next Largest Power of 2 Given a binary integer value x, the next largest + * power of 2 can be computed by a SWAR algorithm that recursively "folds" the + * upper bits into the lower bits. This process yields a bit vector with the + * same most significant 1 as x, but all 1's below it. Adding 1 to that value + * yields the next largest power of 2. For a 32-bit value: + */ + nextPowerOfTwo: function (x) { + // TODO + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + return x + 1; + }, + isPowerOfTwo: function (x) { + return x > 0 && (x & (x - 1)) === 0; + }, + mod: function (num, min, max) { + if (typeof min === 'undefined') { + max = 1; + min = 0; + } + else if (typeof max === 'undefined') { + max = min; + min = 0; + } + if (max > min) { + num = (num - min) % (max - min); + return num + (num < 0 ? max : min); + } + else { + num = (num - max) % (min - max); + return num + (num <= 0 ? min : max); + } + }, + /** + * Returns a min if num is less than min, and max if more than max, otherwise returns num. + */ + clamp: function (num, min, max) { + if (num < min) { + return min; + } + else if (num > max) { + return max; + } + else { + return num; + } + }, + /** + * Returns a random number between min and max when two arguments are provided. + * If one arg is provided between 0 to max. + * If one arg is passed between 0 to 1. + */ + random: function (min, max) { + if (typeof min === 'undefined') { + max = 1; + min = 0; + } + else if (typeof max === 'undefined') { + max = min; + min = 0; + } + return min === max ? min : Math.random() * (max - min) + min; + } +}); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Vec2 = /** @class */ (function () { + // tslint:disable-next-line:typedef + function Vec2(x, y) { + if (!(this instanceof Vec2)) { + return new Vec2(x, y); + } + if (typeof x === 'undefined') { + this.x = 0; + this.y = 0; + } + else if (typeof x === 'object') { + this.x = x.x; + this.y = x.y; + } + else { + this.x = x; + this.y = y; + } + } + /** @internal */ + Vec2.prototype._serialize = function () { + return { + x: this.x, + y: this.y + }; + }; + /** @internal */ + Vec2._deserialize = function (data) { + var obj = Object.create(Vec2.prototype); + obj.x = data.x; + obj.y = data.y; + return obj; + }; + Vec2.zero = function () { + var obj = Object.create(Vec2.prototype); + obj.x = 0; + obj.y = 0; + return obj; + }; + /** @internal */ + Vec2.neo = function (x, y) { + var obj = Object.create(Vec2.prototype); + obj.x = x; + obj.y = y; + return obj; + }; + Vec2.clone = function (v) { + return Vec2.neo(v.x, v.y); + }; + /** @internal */ + Vec2.prototype.toString = function () { + return JSON.stringify(this); + }; + /** + * Does this vector contain finite coordinates? + */ + Vec2.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return math.isFinite(obj.x) && math.isFinite(obj.y); + }; + Vec2.assert = function (o) { + }; + Vec2.prototype.clone = function () { + return Vec2.clone(this); + }; + /** + * Set this vector to all zeros. + * + * @returns this + */ + Vec2.prototype.setZero = function () { + this.x = 0.0; + this.y = 0.0; + return this; + }; + /** + * Set this vector to some specified coordinates. + * + * @returns this + */ + // tslint:disable-next-line:typedef + Vec2.prototype.set = function (x, y) { + if (typeof x === 'object') { + this.x = x.x; + this.y = x.y; + } + else { + this.x = x; + this.y = y; + } + return this; + }; + /** + * Set this vector to some specified coordinates. + * + * @returns this + */ + Vec2.prototype.setNum = function (x, y) { + this.x = x; + this.y = y; + return this; + }; + /** + * Set this vector to some specified coordinates. + * + * @returns this + */ + Vec2.prototype.setVec2 = function (value) { + this.x = value.x; + this.y = value.y; + return this; + }; + /** + * @internal + * @deprecated Use setCombine or setMul + */ + Vec2.prototype.wSet = function (a, v, b, w) { + if (typeof b !== 'undefined' || typeof w !== 'undefined') { + return this.setCombine(a, v, b, w); + } + else { + return this.setMul(a, v); + } + }; + /** + * Set linear combination of v and w: `a * v + b * w` + */ + Vec2.prototype.setCombine = function (a, v, b, w) { + var x = a * v.x + b * w.x; + var y = a * v.y + b * w.y; + // `this` may be `w` + this.x = x; + this.y = y; + return this; + }; + Vec2.prototype.setMul = function (a, v) { + var x = a * v.x; + var y = a * v.y; + this.x = x; + this.y = y; + return this; + }; + /** + * Add a vector to this vector. + * + * @returns this + */ + Vec2.prototype.add = function (w) { + this.x += w.x; + this.y += w.y; + return this; + }; + /** + * @internal + * @deprecated Use addCombine or addMul + */ + Vec2.prototype.wAdd = function (a, v, b, w) { + if (typeof b !== 'undefined' || typeof w !== 'undefined') { + return this.addCombine(a, v, b, w); + } + else { + return this.addMul(a, v); + } + }; + /** + * Add linear combination of v and w: `a * v + b * w` + */ + Vec2.prototype.addCombine = function (a, v, b, w) { + var x = a * v.x + b * w.x; + var y = a * v.y + b * w.y; + // `this` may be `w` + this.x += x; + this.y += y; + return this; + }; + Vec2.prototype.addMul = function (a, v) { + var x = a * v.x; + var y = a * v.y; + this.x += x; + this.y += y; + return this; + }; + /** + * @deprecated Use subCombine or subMul + */ + Vec2.prototype.wSub = function (a, v, b, w) { + if (typeof b !== 'undefined' || typeof w !== 'undefined') { + return this.subCombine(a, v, b, w); + } + else { + return this.subMul(a, v); + } + }; + /** + * Subtract linear combination of v and w: `a * v + b * w` + */ + Vec2.prototype.subCombine = function (a, v, b, w) { + var x = a * v.x + b * w.x; + var y = a * v.y + b * w.y; + // `this` may be `w` + this.x -= x; + this.y -= y; + return this; + }; + Vec2.prototype.subMul = function (a, v) { + var x = a * v.x; + var y = a * v.y; + this.x -= x; + this.y -= y; + return this; + }; + /** + * Subtract a vector from this vector + * + * @returns this + */ + Vec2.prototype.sub = function (w) { + this.x -= w.x; + this.y -= w.y; + return this; + }; + /** + * Multiply this vector by a scalar. + * + * @returns this + */ + Vec2.prototype.mul = function (m) { + this.x *= m; + this.y *= m; + return this; + }; + /** + * Get the length of this vector (the norm). + * + * For performance, use this instead of lengthSquared (if possible). + */ + Vec2.prototype.length = function () { + return Vec2.lengthOf(this); + }; + /** + * Get the length squared. + */ + Vec2.prototype.lengthSquared = function () { + return Vec2.lengthSquared(this); + }; + /** + * Convert this vector into a unit vector. + * + * @returns old length + */ + Vec2.prototype.normalize = function () { + var length = this.length(); + if (length < math.EPSILON) { + return 0.0; + } + var invLength = 1.0 / length; + this.x *= invLength; + this.y *= invLength; + return length; + }; + /** + * Get the length of this vector (the norm). + * + * For performance, use this instead of lengthSquared (if possible). + */ + Vec2.lengthOf = function (v) { + return math.sqrt(v.x * v.x + v.y * v.y); + }; + /** + * Get the length squared. + */ + Vec2.lengthSquared = function (v) { + return v.x * v.x + v.y * v.y; + }; + Vec2.distance = function (v, w) { + var dx = v.x - w.x; + var dy = v.y - w.y; + return math.sqrt(dx * dx + dy * dy); + }; + Vec2.distanceSquared = function (v, w) { + var dx = v.x - w.x; + var dy = v.y - w.y; + return dx * dx + dy * dy; + }; + Vec2.areEqual = function (v, w) { + return v === w || typeof w === 'object' && w !== null && v.x === w.x && v.y === w.y; + }; + /** + * Get the skew vector such that dot(skew_vec, other) == cross(vec, other) + */ + Vec2.skew = function (v) { + return Vec2.neo(-v.y, v.x); + }; + /** + * Perform the dot product on two vectors. + */ + Vec2.dot = function (v, w) { + return v.x * w.x + v.y * w.y; + }; + /** + * Perform the cross product on two vectors. In 2D this produces a scalar. + * + * Perform the cross product on a vector and a scalar. In 2D this produces a + * vector. + */ + // tslint:disable-next-line:typedef + Vec2.cross = function (v, w) { + if (typeof w === 'number') { + return Vec2.neo(w * v.y, -w * v.x); + } + else if (typeof v === 'number') { + return Vec2.neo(-v * w.y, v * w.x); + } + else { + return v.x * w.y - v.y * w.x; + } + }; + /** + * Perform the cross product on two vectors. In 2D this produces a scalar. + */ + Vec2.crossVec2Vec2 = function (v, w) { + return v.x * w.y - v.y * w.x; + }; + /** + * Perform the cross product on a vector and a scalar. In 2D this produces a + * vector. + */ + Vec2.crossVec2Num = function (v, w) { + return Vec2.neo(w * v.y, -w * v.x); + }; + /** + * Perform the cross product on a vector and a scalar. In 2D this produces a + * vector. + */ + Vec2.crossNumVec2 = function (v, w) { + return Vec2.neo(-v * w.y, v * w.x); + }; + /** + * Returns `a + (v x w)` + */ + // tslint:disable-next-line:typedef + Vec2.addCross = function (a, v, w) { + if (typeof w === 'number') { + return Vec2.neo(w * v.y + a.x, -w * v.x + a.y); + } + else if (typeof v === 'number') { + return Vec2.neo(-v * w.y + a.x, v * w.x + a.y); + } + }; + /** + * Returns `a + (v x w)` + */ + Vec2.addCrossVec2Num = function (a, v, w) { + return Vec2.neo(w * v.y + a.x, -w * v.x + a.y); + }; + /** + * Returns `a + (v x w)` + */ + Vec2.addCrossNumVec2 = function (a, v, w) { + return Vec2.neo(-v * w.y + a.x, v * w.x + a.y); + }; + Vec2.add = function (v, w) { + return Vec2.neo(v.x + w.x, v.y + w.y); + }; + /** @internal @deprecated */ + Vec2.wAdd = function (a, v, b, w) { + if (typeof b !== 'undefined' || typeof w !== 'undefined') { + return Vec2.combine(a, v, b, w); + } + else { + return Vec2.mulNumVec2(a, v); + } + }; + Vec2.combine = function (a, v, b, w) { + return Vec2.zero().setCombine(a, v, b, w); + }; + Vec2.sub = function (v, w) { + return Vec2.neo(v.x - w.x, v.y - w.y); + }; + // tslint:disable-next-line:typedef + Vec2.mul = function (a, b) { + if (typeof a === 'object') { + return Vec2.neo(a.x * b, a.y * b); + } + else if (typeof b === 'object') { + return Vec2.neo(a * b.x, a * b.y); + } + }; + Vec2.mulVec2Num = function (a, b) { + return Vec2.neo(a.x * b, a.y * b); + }; + Vec2.mulNumVec2 = function (a, b) { + return Vec2.neo(a * b.x, a * b.y); + }; + Vec2.prototype.neg = function () { + this.x = -this.x; + this.y = -this.y; + return this; + }; + Vec2.neg = function (v) { + return Vec2.neo(-v.x, -v.y); + }; + Vec2.abs = function (v) { + return Vec2.neo(math.abs(v.x), math.abs(v.y)); + }; + Vec2.mid = function (v, w) { + return Vec2.neo((v.x + w.x) * 0.5, (v.y + w.y) * 0.5); + }; + Vec2.upper = function (v, w) { + return Vec2.neo(math.max(v.x, w.x), math.max(v.y, w.y)); + }; + Vec2.lower = function (v, w) { + return Vec2.neo(math.min(v.x, w.x), math.min(v.y, w.y)); + }; + Vec2.prototype.clamp = function (max) { + var lengthSqr = this.x * this.x + this.y * this.y; + if (lengthSqr > max * max) { + var scale = max / math.sqrt(lengthSqr); + this.x *= scale; + this.y *= scale; + } + return this; + }; + Vec2.clamp = function (v, max) { + var r = Vec2.neo(v.x, v.y); + r.clamp(max); + return r; + }; + /** @internal @deprecated */ + // tslint:disable-next-line:typedef + Vec2.scaleFn = function (x, y) { + return function (v) { + return Vec2.neo(v.x * x, v.y * y); + }; + }; + /** @internal @deprecated */ + // tslint:disable-next-line:typedef + Vec2.translateFn = function (x, y) { + return function (v) { + return Vec2.neo(v.x + x, v.y + y); + }; + }; + return Vec2; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var AABB = /** @class */ (function () { + function AABB(lower, upper) { + if (!(this instanceof AABB)) { + return new AABB(lower, upper); + } + this.lowerBound = Vec2.zero(); + this.upperBound = Vec2.zero(); + if (typeof lower === 'object') { + this.lowerBound.setVec2(lower); + } + if (typeof upper === 'object') { + this.upperBound.setVec2(upper); + } + else if (typeof lower === 'object') { + this.upperBound.setVec2(lower); + } + } + /** + * Verify that the bounds are sorted. + */ + AABB.prototype.isValid = function () { + return AABB.isValid(this); + }; + AABB.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return Vec2.isValid(obj.lowerBound) && Vec2.isValid(obj.upperBound) && Vec2.sub(obj.upperBound, obj.lowerBound).lengthSquared() >= 0; + }; + AABB.assert = function (o) { + }; + /** + * Get the center of the AABB. + */ + AABB.prototype.getCenter = function () { + return Vec2.neo((this.lowerBound.x + this.upperBound.x) * 0.5, (this.lowerBound.y + this.upperBound.y) * 0.5); + }; + /** + * Get the extents of the AABB (half-widths). + */ + AABB.prototype.getExtents = function () { + return Vec2.neo((this.upperBound.x - this.lowerBound.x) * 0.5, (this.upperBound.y - this.lowerBound.y) * 0.5); + }; + /** + * Get the perimeter length. + */ + AABB.prototype.getPerimeter = function () { + return 2.0 * (this.upperBound.x - this.lowerBound.x + this.upperBound.y - this.lowerBound.y); + }; + /** + * Combine one or two AABB into this one. + */ + AABB.prototype.combine = function (a, b) { + b = b || this; + var lowerA = a.lowerBound; + var upperA = a.upperBound; + var lowerB = b.lowerBound; + var upperB = b.upperBound; + var lowerX = math.min(lowerA.x, lowerB.x); + var lowerY = math.min(lowerA.y, lowerB.y); + var upperX = math.max(upperB.x, upperA.x); + var upperY = math.max(upperB.y, upperA.y); + this.lowerBound.setNum(lowerX, lowerY); + this.upperBound.setNum(upperX, upperY); + }; + AABB.prototype.combinePoints = function (a, b) { + this.lowerBound.setNum(math.min(a.x, b.x), math.min(a.y, b.y)); + this.upperBound.setNum(math.max(a.x, b.x), math.max(a.y, b.y)); + }; + AABB.prototype.set = function (aabb) { + this.lowerBound.setNum(aabb.lowerBound.x, aabb.lowerBound.y); + this.upperBound.setNum(aabb.upperBound.x, aabb.upperBound.y); + }; + AABB.prototype.contains = function (aabb) { + var result = true; + result = result && this.lowerBound.x <= aabb.lowerBound.x; + result = result && this.lowerBound.y <= aabb.lowerBound.y; + result = result && aabb.upperBound.x <= this.upperBound.x; + result = result && aabb.upperBound.y <= this.upperBound.y; + return result; + }; + AABB.prototype.extend = function (value) { + AABB.extend(this, value); + return this; + }; + AABB.extend = function (aabb, value) { + aabb.lowerBound.x -= value; + aabb.lowerBound.y -= value; + aabb.upperBound.x += value; + aabb.upperBound.y += value; + }; + AABB.testOverlap = function (a, b) { + var d1x = b.lowerBound.x - a.upperBound.x; + var d2x = a.lowerBound.x - b.upperBound.x; + var d1y = b.lowerBound.y - a.upperBound.y; + var d2y = a.lowerBound.y - b.upperBound.y; + if (d1x > 0 || d1y > 0 || d2x > 0 || d2y > 0) { + return false; + } + return true; + }; + AABB.areEqual = function (a, b) { + return Vec2.areEqual(a.lowerBound, b.lowerBound) && Vec2.areEqual(a.upperBound, b.upperBound); + }; + AABB.diff = function (a, b) { + var wD = math.max(0, math.min(a.upperBound.x, b.upperBound.x) - math.max(b.lowerBound.x, a.lowerBound.x)); + var hD = math.max(0, math.min(a.upperBound.y, b.upperBound.y) - math.max(b.lowerBound.y, a.lowerBound.y)); + var wA = a.upperBound.x - a.lowerBound.x; + var hA = a.upperBound.y - a.lowerBound.y; + var wB = b.upperBound.x - b.lowerBound.x; + var hB = b.upperBound.y - b.lowerBound.y; + return wA * hA + wB * hB - wD * hD; + }; + AABB.prototype.rayCast = function (output, input) { + // From Real-time Collision Detection, p179. + var tmin = -Infinity; + var tmax = Infinity; + var p = input.p1; + var d = Vec2.sub(input.p2, input.p1); + var absD = Vec2.abs(d); + var normal = Vec2.zero(); + for (var f = 'x'; f !== null; f = (f === 'x' ? 'y' : null)) { + if (absD.x < math.EPSILON) { + // Parallel. + if (p[f] < this.lowerBound[f] || this.upperBound[f] < p[f]) { + return false; + } + } + else { + var inv_d = 1.0 / d[f]; + var t1 = (this.lowerBound[f] - p[f]) * inv_d; + var t2 = (this.upperBound[f] - p[f]) * inv_d; + // Sign of the normal vector. + var s = -1.0; + if (t1 > t2) { + var temp = t1; + t1 = t2; + t2 = temp; + s = 1.0; + } + // Push the min up + if (t1 > tmin) { + normal.setZero(); + normal[f] = s; + tmin = t1; + } + // Pull the max down + tmax = math.min(tmax, t2); + if (tmin > tmax) { + return false; + } + } + } + // Does the ray start inside the box? + // Does the ray intersect beyond the max fraction? + if (tmin < 0.0 || input.maxFraction < tmin) { + return false; + } + // Intersection. + output.fraction = tmin; + output.normal = normal; + return true; + }; + /** @internal */ + AABB.prototype.toString = function () { + return JSON.stringify(this); + }; + return AABB; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +// TODO merge with World options? +/** + * Tuning constants based on meters-kilograms-seconds (MKS) units. + */ +// tslint:disable-next-line:no-unnecessary-class +var Settings = /** @class */ (function () { + function Settings() { + } + Object.defineProperty(Settings, "linearSlopSquared", { + get: function () { return Settings.linearSlop * Settings.linearSlop; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "polygonRadius", { + /** + * The radius of the polygon/edge shape skin. This should not be modified. + * Making this smaller means polygons will have an insufficient buffer for + * continuous collision. Making it larger may create artifacts for vertex + * collision. + */ + get: function () { return 2.0 * Settings.linearSlop; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "maxTranslationSquared", { + get: function () { return Settings.maxTranslation * Settings.maxTranslation; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "maxRotationSquared", { + get: function () { return Settings.maxRotation * Settings.maxRotation; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "linearSleepToleranceSqr", { + get: function () { return Math.pow(Settings.linearSleepTolerance, 2); }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "angularSleepToleranceSqr", { + get: function () { return Math.pow(Settings.angularSleepTolerance, 2); }, + enumerable: false, + configurable: true + }); + // Collision + /** + * The maximum number of contact points between two convex shapes. Do not change + * this value. + */ + Settings.maxManifoldPoints = 2; + /** + * The maximum number of vertices on a convex polygon. You cannot increase this + * too much because BlockAllocator has a maximum object size. + */ + Settings.maxPolygonVertices = 12; + /** + * This is used to fatten AABBs in the dynamic tree. This allows proxies to move + * by a small amount without triggering a tree adjustment. This is in meters. + */ + Settings.aabbExtension = 0.1; + /** + * This is used to fatten AABBs in the dynamic tree. This is used to predict the + * future position based on the current displacement. This is a dimensionless + * multiplier. + */ + Settings.aabbMultiplier = 2.0; + /** + * A small length used as a collision and constraint tolerance. Usually it is + * chosen to be numerically significant, but visually insignificant. + */ + Settings.linearSlop = 0.005; + /** + * A small angle used as a collision and constraint tolerance. Usually it is + * chosen to be numerically significant, but visually insignificant. + */ + Settings.angularSlop = (2.0 / 180.0 * Math.PI); + /** + * Maximum number of sub-steps per contact in continuous physics simulation. + */ + Settings.maxSubSteps = 8; + // Dynamics + /** + * Maximum number of contacts to be handled to solve a TOI impact. + */ + Settings.maxTOIContacts = 32; + /** + * Maximum iterations to solve a TOI. + */ + Settings.maxTOIIterations = 20; + /** + * Maximum iterations to find Distance. + */ + Settings.maxDistnceIterations = 20; + /** + * A velocity threshold for elastic collisions. Any collision with a relative + * linear velocity below this threshold will be treated as inelastic. + */ + Settings.velocityThreshold = 1.0; + /** + * The maximum linear position correction used when solving constraints. This + * helps to prevent overshoot. + */ + Settings.maxLinearCorrection = 0.2; + /** + * The maximum angular position correction used when solving constraints. This + * helps to prevent overshoot. + */ + Settings.maxAngularCorrection = (8.0 / 180.0 * Math.PI); + /** + * The maximum linear velocity of a body. This limit is very large and is used + * to prevent numerical problems. You shouldn't need to adjust Settings. + */ + Settings.maxTranslation = 2.0; + /** + * The maximum angular velocity of a body. This limit is very large and is used + * to prevent numerical problems. You shouldn't need to adjust Settings. + */ + Settings.maxRotation = (0.5 * Math.PI); + /** + * This scale factor controls how fast overlap is resolved. Ideally this would + * be 1 so that overlap is removed in one time step. However using values close + * to 1 often lead to overshoot. + */ + Settings.baumgarte = 0.2; + Settings.toiBaugarte = 0.75; + // Sleep + /** + * The time that a body must be still before it will go to sleep. + */ + Settings.timeToSleep = 0.5; + /** + * A body cannot sleep if its linear velocity is above this tolerance. + */ + Settings.linearSleepTolerance = 0.01; + /** + * A body cannot sleep if its angular velocity is above this tolerance. + */ + Settings.angularSleepTolerance = (2.0 / 180.0 * Math.PI); + return Settings; +}()); + +/* + * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + */ +var Pool = /** @class */ (function () { + function Pool(opts) { + this._list = []; + this._max = Infinity; + this._createCount = 0; + this._outCount = 0; + this._inCount = 0; + this._discardCount = 0; + this._list = []; + this._max = opts.max || this._max; + this._createFn = opts.create; + this._outFn = opts.allocate; + this._inFn = opts.release; + this._discardFn = opts.discard; + } + Pool.prototype.max = function (n) { + if (typeof n === 'number') { + this._max = n; + return this; + } + return this._max; + }; + Pool.prototype.size = function () { + return this._list.length; + }; + Pool.prototype.allocate = function () { + var item; + if (this._list.length > 0) { + item = this._list.shift(); + } + else { + this._createCount++; + if (typeof this._createFn === 'function') { + item = this._createFn(); + } + else { + // tslint:disable-next-line:no-object-literal-type-assertion + item = {}; + } + } + this._outCount++; + if (typeof this._outFn === 'function') { + this._outFn(item); + } + return item; + }; + Pool.prototype.release = function (item) { + if (this._list.length < this._max) { + this._inCount++; + if (typeof this._inFn === 'function') { + this._inFn(item); + } + this._list.push(item); + } + else { + this._discardCount++; + if (typeof this._discardFn === 'function') { + item = this._discardFn(item); + } + } + }; + /** @internal */ + Pool.prototype.toString = function () { + return " +" + this._createCount + " >" + this._outCount + " <" + this._inCount + " -" + + this._discardCount + " =" + this._list.length + "/" + this._max; + }; + return Pool; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A node in the dynamic tree. The client does not interact with this directly. + */ +var TreeNode = /** @class */ (function () { + function TreeNode(id) { + /** Enlarged AABB */ + this.aabb = new AABB(); + this.userData = null; + this.parent = null; + this.child1 = null; + this.child2 = null; + /** 0: leaf, -1: free node */ + this.height = -1; + this.id = id; + } + /** @internal */ + TreeNode.prototype.toString = function () { + return this.id + ": " + this.userData; + }; + TreeNode.prototype.isLeaf = function () { + return this.child1 == null; + }; + return TreeNode; +}()); +/** + * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A + * dynamic tree arranges data in a binary tree to accelerate queries such as + * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we + * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger + * than the client object. This allows the client object to move by small + * amounts without triggering a tree update. + * + * Nodes are pooled and relocatable, so we use node indices rather than + * pointers. + */ +var DynamicTree = /** @class */ (function () { + function DynamicTree() { + this.inputPool = new Pool({ + create: function () { + // tslint:disable-next-line:no-object-literal-type-assertion + return {}; + }, + release: function (stack) { + } + }); + this.stackPool = new Pool({ + create: function () { + return []; + }, + release: function (stack) { + stack.length = 0; + } + }); + this.iteratorPool = new Pool({ + create: function () { + return new Iterator(); + }, + release: function (iterator) { + iterator.close(); + } + }); + this.m_root = null; + this.m_nodes = {}; + this.m_lastProxyId = 0; + this.m_pool = new Pool({ + create: function () { + return new TreeNode(); + } + }); + } + /** + * Get proxy user data. + * + * @return the proxy user data or 0 if the id is invalid. + */ + DynamicTree.prototype.getUserData = function (id) { + var node = this.m_nodes[id]; + return node.userData; + }; + /** + * Get the fat AABB for a node id. + * + * @return the proxy user data or 0 if the id is invalid. + */ + DynamicTree.prototype.getFatAABB = function (id) { + var node = this.m_nodes[id]; + return node.aabb; + }; + DynamicTree.prototype.allocateNode = function () { + var node = this.m_pool.allocate(); + node.id = ++this.m_lastProxyId; + node.userData = null; + node.parent = null; + node.child1 = null; + node.child2 = null; + node.height = -1; + this.m_nodes[node.id] = node; + return node; + }; + DynamicTree.prototype.freeNode = function (node) { + this.m_pool.release(node); + node.height = -1; + // tslint:disable-next-line:no-dynamic-delete + delete this.m_nodes[node.id]; + }; + /** + * Create a proxy in the tree as a leaf node. We return the index of the node + * instead of a pointer so that we can grow the node pool. + * + * Create a proxy. Provide a tight fitting AABB and a userData pointer. + */ + DynamicTree.prototype.createProxy = function (aabb, userData) { + var node = this.allocateNode(); + node.aabb.set(aabb); + // Fatten the aabb. + AABB.extend(node.aabb, Settings.aabbExtension); + node.userData = userData; + node.height = 0; + this.insertLeaf(node); + return node.id; + }; + /** + * Destroy a proxy. This asserts if the id is invalid. + */ + DynamicTree.prototype.destroyProxy = function (id) { + var node = this.m_nodes[id]; + this.removeLeaf(node); + this.freeNode(node); + }; + /** + * Move a proxy with a swepted AABB. If the proxy has moved outside of its + * fattened AABB, then the proxy is removed from the tree and re-inserted. + * Otherwise the function returns immediately. + * + * @param d Displacement + * + * @return true if the proxy was re-inserted. + */ + DynamicTree.prototype.moveProxy = function (id, aabb, d) { + var node = this.m_nodes[id]; + if (node.aabb.contains(aabb)) { + return false; + } + this.removeLeaf(node); + node.aabb.set(aabb); + // Extend AABB. + aabb = node.aabb; + AABB.extend(aabb, Settings.aabbExtension); + // Predict AABB displacement. + // const d = Vec2.mul(Settings.aabbMultiplier, displacement); + if (d.x < 0.0) { + aabb.lowerBound.x += d.x * Settings.aabbMultiplier; + } + else { + aabb.upperBound.x += d.x * Settings.aabbMultiplier; + } + if (d.y < 0.0) { + aabb.lowerBound.y += d.y * Settings.aabbMultiplier; + } + else { + aabb.upperBound.y += d.y * Settings.aabbMultiplier; + } + this.insertLeaf(node); + return true; + }; + DynamicTree.prototype.insertLeaf = function (leaf) { + if (this.m_root == null) { + this.m_root = leaf; + this.m_root.parent = null; + return; + } + // Find the best sibling for this node + var leafAABB = leaf.aabb; + var index = this.m_root; + while (!index.isLeaf()) { + var child1 = index.child1; + var child2 = index.child2; + var area = index.aabb.getPerimeter(); + var combinedAABB = new AABB(); + combinedAABB.combine(index.aabb, leafAABB); + var combinedArea = combinedAABB.getPerimeter(); + // Cost of creating a new parent for this node and the new leaf + var cost = 2.0 * combinedArea; + // Minimum cost of pushing the leaf further down the tree + var inheritanceCost = 2.0 * (combinedArea - area); + // Cost of descending into child1 + var cost1 = void 0; + if (child1.isLeaf()) { + var aabb = new AABB(); + aabb.combine(leafAABB, child1.aabb); + cost1 = aabb.getPerimeter() + inheritanceCost; + } + else { + var aabb = new AABB(); + aabb.combine(leafAABB, child1.aabb); + var oldArea = child1.aabb.getPerimeter(); + var newArea = aabb.getPerimeter(); + cost1 = (newArea - oldArea) + inheritanceCost; + } + // Cost of descending into child2 + var cost2 = void 0; + if (child2.isLeaf()) { + var aabb = new AABB(); + aabb.combine(leafAABB, child2.aabb); + cost2 = aabb.getPerimeter() + inheritanceCost; + } + else { + var aabb = new AABB(); + aabb.combine(leafAABB, child2.aabb); + var oldArea = child2.aabb.getPerimeter(); + var newArea = aabb.getPerimeter(); + cost2 = newArea - oldArea + inheritanceCost; + } + // Descend according to the minimum cost. + if (cost < cost1 && cost < cost2) { + break; + } + // Descend + if (cost1 < cost2) { + index = child1; + } + else { + index = child2; + } + } + var sibling = index; + // Create a new parent. + var oldParent = sibling.parent; + var newParent = this.allocateNode(); + newParent.parent = oldParent; + newParent.userData = null; + newParent.aabb.combine(leafAABB, sibling.aabb); + newParent.height = sibling.height + 1; + if (oldParent != null) { + // The sibling was not the root. + if (oldParent.child1 === sibling) { + oldParent.child1 = newParent; + } + else { + oldParent.child2 = newParent; + } + newParent.child1 = sibling; + newParent.child2 = leaf; + sibling.parent = newParent; + leaf.parent = newParent; + } + else { + // The sibling was the root. + newParent.child1 = sibling; + newParent.child2 = leaf; + sibling.parent = newParent; + leaf.parent = newParent; + this.m_root = newParent; + } + // Walk back up the tree fixing heights and AABBs + index = leaf.parent; + while (index != null) { + index = this.balance(index); + var child1 = index.child1; + var child2 = index.child2; + index.height = 1 + math.max(child1.height, child2.height); + index.aabb.combine(child1.aabb, child2.aabb); + index = index.parent; + } + // validate(); + }; + DynamicTree.prototype.removeLeaf = function (leaf) { + if (leaf === this.m_root) { + this.m_root = null; + return; + } + var parent = leaf.parent; + var grandParent = parent.parent; + var sibling; + if (parent.child1 === leaf) { + sibling = parent.child2; + } + else { + sibling = parent.child1; + } + if (grandParent != null) { + // Destroy parent and connect sibling to grandParent. + if (grandParent.child1 === parent) { + grandParent.child1 = sibling; + } + else { + grandParent.child2 = sibling; + } + sibling.parent = grandParent; + this.freeNode(parent); + // Adjust ancestor bounds. + var index = grandParent; + while (index != null) { + index = this.balance(index); + var child1 = index.child1; + var child2 = index.child2; + index.aabb.combine(child1.aabb, child2.aabb); + index.height = 1 + math.max(child1.height, child2.height); + index = index.parent; + } + } + else { + this.m_root = sibling; + sibling.parent = null; + this.freeNode(parent); + } + // validate(); + }; + /** + * Perform a left or right rotation if node A is imbalanced. Returns the new + * root index. + */ + DynamicTree.prototype.balance = function (iA) { + var A = iA; + if (A.isLeaf() || A.height < 2) { + return iA; + } + var B = A.child1; + var C = A.child2; + var balance = C.height - B.height; + // Rotate C up + if (balance > 1) { + var F = C.child1; + var G = C.child2; + // Swap A and C + C.child1 = A; + C.parent = A.parent; + A.parent = C; + // A's old parent should point to C + if (C.parent != null) { + if (C.parent.child1 === iA) { + C.parent.child1 = C; + } + else { + C.parent.child2 = C; + } + } + else { + this.m_root = C; + } + // Rotate + if (F.height > G.height) { + C.child2 = F; + A.child2 = G; + G.parent = A; + A.aabb.combine(B.aabb, G.aabb); + C.aabb.combine(A.aabb, F.aabb); + A.height = 1 + math.max(B.height, G.height); + C.height = 1 + math.max(A.height, F.height); + } + else { + C.child2 = G; + A.child2 = F; + F.parent = A; + A.aabb.combine(B.aabb, F.aabb); + C.aabb.combine(A.aabb, G.aabb); + A.height = 1 + math.max(B.height, F.height); + C.height = 1 + math.max(A.height, G.height); + } + return C; + } + // Rotate B up + if (balance < -1) { + var D = B.child1; + var E = B.child2; + // Swap A and B + B.child1 = A; + B.parent = A.parent; + A.parent = B; + // A's old parent should point to B + if (B.parent != null) { + if (B.parent.child1 === A) { + B.parent.child1 = B; + } + else { + B.parent.child2 = B; + } + } + else { + this.m_root = B; + } + // Rotate + if (D.height > E.height) { + B.child2 = D; + A.child1 = E; + E.parent = A; + A.aabb.combine(C.aabb, E.aabb); + B.aabb.combine(A.aabb, D.aabb); + A.height = 1 + math.max(C.height, E.height); + B.height = 1 + math.max(A.height, D.height); + } + else { + B.child2 = E; + A.child1 = D; + D.parent = A; + A.aabb.combine(C.aabb, D.aabb); + B.aabb.combine(A.aabb, E.aabb); + A.height = 1 + math.max(C.height, D.height); + B.height = 1 + math.max(A.height, E.height); + } + return B; + } + return A; + }; + /** + * Compute the height of the binary tree in O(N) time. Should not be called + * often. + */ + DynamicTree.prototype.getHeight = function () { + if (this.m_root == null) { + return 0; + } + return this.m_root.height; + }; + /** + * Get the ratio of the sum of the node areas to the root area. + */ + DynamicTree.prototype.getAreaRatio = function () { + if (this.m_root == null) { + return 0.0; + } + var root = this.m_root; + var rootArea = root.aabb.getPerimeter(); + var totalArea = 0.0; + var node; + var it = this.iteratorPool.allocate().preorder(this.m_root); + while (node = it.next()) { + if (node.height < 0) { + // Free node in pool + continue; + } + totalArea += node.aabb.getPerimeter(); + } + this.iteratorPool.release(it); + return totalArea / rootArea; + }; + /** + * Compute the height of a sub-tree. + */ + DynamicTree.prototype.computeHeight = function (id) { + var node; + if (typeof id !== 'undefined') { + node = this.m_nodes[id]; + } + else { + node = this.m_root; + } + // false && console.assert(0 <= id && id < this.m_nodeCapacity); + if (node.isLeaf()) { + return 0; + } + var height1 = this.computeHeight(node.child1.id); + var height2 = this.computeHeight(node.child2.id); + return 1 + math.max(height1, height2); + }; + DynamicTree.prototype.validateStructure = function (node) { + if (node == null) { + return; + } + if (node === this.m_root) ; + var child1 = node.child1; + var child2 = node.child2; + if (node.isLeaf()) { + return; + } + this.validateStructure(child1); + this.validateStructure(child2); + }; + DynamicTree.prototype.validateMetrics = function (node) { + if (node == null) { + return; + } + var child1 = node.child1; + var child2 = node.child2; + if (node.isLeaf()) { + return; + } + // false && console.assert(0 <= child1 && child1 < this.m_nodeCapacity); + // false && console.assert(0 <= child2 && child2 < this.m_nodeCapacity); + var height1 = child1.height; + var height2 = child2.height; + 1 + math.max(height1, height2); + var aabb = new AABB(); + aabb.combine(child1.aabb, child2.aabb); + this.validateMetrics(child1); + this.validateMetrics(child2); + }; + /** + * Validate this tree. For testing. + */ + DynamicTree.prototype.validate = function () { + this.validateStructure(this.m_root); + this.validateMetrics(this.m_root); + }; + /** + * Get the maximum balance of an node in the tree. The balance is the difference + * in height of the two children of a node. + */ + DynamicTree.prototype.getMaxBalance = function () { + var maxBalance = 0; + var node; + var it = this.iteratorPool.allocate().preorder(this.m_root); + while (node = it.next()) { + if (node.height <= 1) { + continue; + } + var balance = math.abs(node.child2.height - node.child1.height); + maxBalance = math.max(maxBalance, balance); + } + this.iteratorPool.release(it); + return maxBalance; + }; + /** + * Build an optimal tree. Very expensive. For testing. + */ + DynamicTree.prototype.rebuildBottomUp = function () { + var nodes = []; + var count = 0; + // Build array of leaves. Free the rest. + var node; + var it = this.iteratorPool.allocate().preorder(this.m_root); + while (node = it.next()) { + if (node.height < 0) { + // free node in pool + continue; + } + if (node.isLeaf()) { + node.parent = null; + nodes[count] = node; + ++count; + } + else { + this.freeNode(node); + } + } + this.iteratorPool.release(it); + while (count > 1) { + var minCost = Infinity; + var iMin = -1; + var jMin = -1; + for (var i = 0; i < count; ++i) { + var aabbi = nodes[i].aabb; + for (var j = i + 1; j < count; ++j) { + var aabbj = nodes[j].aabb; + var b = new AABB(); + b.combine(aabbi, aabbj); + var cost = b.getPerimeter(); + if (cost < minCost) { + iMin = i; + jMin = j; + minCost = cost; + } + } + } + var child1 = nodes[iMin]; + var child2 = nodes[jMin]; + var parent_1 = this.allocateNode(); + parent_1.child1 = child1; + parent_1.child2 = child2; + parent_1.height = 1 + math.max(child1.height, child2.height); + parent_1.aabb.combine(child1.aabb, child2.aabb); + parent_1.parent = null; + child1.parent = parent_1; + child2.parent = parent_1; + nodes[jMin] = nodes[count - 1]; + nodes[iMin] = parent_1; + --count; + } + this.m_root = nodes[0]; + }; + /** + * Shift the world origin. Useful for large worlds. The shift formula is: + * position -= newOrigin + * + * @param newOrigin The new origin with respect to the old origin + */ + DynamicTree.prototype.shiftOrigin = function (newOrigin) { + // Build array of leaves. Free the rest. + var node; + var it = this.iteratorPool.allocate().preorder(this.m_root); + while (node = it.next()) { + var aabb = node.aabb; + aabb.lowerBound.x -= newOrigin.x; + aabb.lowerBound.y -= newOrigin.y; + aabb.upperBound.x -= newOrigin.x; + aabb.upperBound.y -= newOrigin.y; + } + this.iteratorPool.release(it); + }; + /** + * Query an AABB for overlapping proxies. The callback class is called for each + * proxy that overlaps the supplied AABB. + */ + DynamicTree.prototype.query = function (aabb, queryCallback) { + var stack = this.stackPool.allocate(); + stack.push(this.m_root); + while (stack.length > 0) { + var node = stack.pop(); + if (node == null) { + continue; + } + if (AABB.testOverlap(node.aabb, aabb)) { + if (node.isLeaf()) { + var proceed = queryCallback(node.id); + if (proceed === false) { + return; + } + } + else { + stack.push(node.child1); + stack.push(node.child2); + } + } + } + this.stackPool.release(stack); + }; + /** + * Ray-cast against the proxies in the tree. This relies on the callback to + * perform a exact ray-cast in the case were the proxy contains a shape. The + * callback also performs the any collision filtering. This has performance + * roughly equal to k * log(n), where k is the number of collisions and n is the + * number of proxies in the tree. + * + * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. + * @param rayCastCallback A function that is called for each proxy that is hit by the ray. + */ + DynamicTree.prototype.rayCast = function (input, rayCastCallback) { + var p1 = input.p1; + var p2 = input.p2; + var r = Vec2.sub(p2, p1); + r.normalize(); + // v is perpendicular to the segment. + var v = Vec2.crossNumVec2(1.0, r); + var abs_v = Vec2.abs(v); + // Separating axis for segment (Gino, p80). + // |dot(v, p1 - c)| > dot(|v|, h) + var maxFraction = input.maxFraction; + // Build a bounding box for the segment. + var segmentAABB = new AABB(); + var t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2); + segmentAABB.combinePoints(p1, t); + var stack = this.stackPool.allocate(); + var subInput = this.inputPool.allocate(); + stack.push(this.m_root); + while (stack.length > 0) { + var node = stack.pop(); + if (node == null) { + continue; + } + if (AABB.testOverlap(node.aabb, segmentAABB) === false) { + continue; + } + // Separating axis for segment (Gino, p80). + // |dot(v, p1 - c)| > dot(|v|, h) + var c = node.aabb.getCenter(); + var h = node.aabb.getExtents(); + var separation = math.abs(Vec2.dot(v, Vec2.sub(p1, c))) - Vec2.dot(abs_v, h); + if (separation > 0.0) { + continue; + } + if (node.isLeaf()) { + subInput.p1 = Vec2.clone(input.p1); + subInput.p2 = Vec2.clone(input.p2); + subInput.maxFraction = maxFraction; + var value = rayCastCallback(subInput, node.id); + if (value === 0.0) { + // The client has terminated the ray cast. + return; + } + if (value > 0.0) { + // update segment bounding box. + maxFraction = value; + t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2); + segmentAABB.combinePoints(p1, t); + } + } + else { + stack.push(node.child1); + stack.push(node.child2); + } + } + this.stackPool.release(stack); + this.inputPool.release(subInput); + }; + return DynamicTree; +}()); +var Iterator = /** @class */ (function () { + function Iterator() { + this.parents = []; + this.states = []; + } + Iterator.prototype.preorder = function (root) { + this.parents.length = 0; + this.parents.push(root); + this.states.length = 0; + this.states.push(0); + return this; + }; + Iterator.prototype.next = function () { + while (this.parents.length > 0) { + var i = this.parents.length - 1; + var node = this.parents[i]; + if (this.states[i] === 0) { + this.states[i] = 1; + return node; + } + if (this.states[i] === 1) { + this.states[i] = 2; + if (node.child1) { + this.parents.push(node.child1); + this.states.push(1); + return node.child1; + } + } + if (this.states[i] === 2) { + this.states[i] = 3; + if (node.child2) { + this.parents.push(node.child2); + this.states.push(1); + return node.child2; + } + } + this.parents.pop(); + this.states.pop(); + } + }; + Iterator.prototype.close = function () { + this.parents.length = 0; + }; + return Iterator; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * The broad-phase wraps and extends a dynamic-tree to keep track of moved + * objects and query them on update. + */ +var BroadPhase = /** @class */ (function () { + function BroadPhase() { + var _this = this; + this.m_tree = new DynamicTree(); + this.m_proxyCount = 0; + this.m_moveBuffer = []; + /** + * Query an AABB for overlapping proxies. The callback class is called for each + * proxy that overlaps the supplied AABB. + */ + this.query = function (aabb, queryCallback) { + _this.m_tree.query(aabb, queryCallback); + }; + this.queryCallback = function (proxyId) { + // A proxy cannot form a pair with itself. + if (proxyId === _this.m_queryProxyId) { + return true; + } + var proxyIdA = math.min(proxyId, _this.m_queryProxyId); + var proxyIdB = math.max(proxyId, _this.m_queryProxyId); + // TODO: Skip any duplicate pairs. + var userDataA = _this.m_tree.getUserData(proxyIdA); + var userDataB = _this.m_tree.getUserData(proxyIdB); + // Send the pairs back to the client. + _this.m_callback(userDataA, userDataB); + return true; + }; + } + /** + * Get user data from a proxy. Returns null if the id is invalid. + */ + BroadPhase.prototype.getUserData = function (proxyId) { + return this.m_tree.getUserData(proxyId); + }; + /** + * Test overlap of fat AABBs. + */ + BroadPhase.prototype.testOverlap = function (proxyIdA, proxyIdB) { + var aabbA = this.m_tree.getFatAABB(proxyIdA); + var aabbB = this.m_tree.getFatAABB(proxyIdB); + return AABB.testOverlap(aabbA, aabbB); + }; + /** + * Get the fat AABB for a proxy. + */ + BroadPhase.prototype.getFatAABB = function (proxyId) { + return this.m_tree.getFatAABB(proxyId); + }; + /** + * Get the number of proxies. + */ + BroadPhase.prototype.getProxyCount = function () { + return this.m_proxyCount; + }; + /** + * Get the height of the embedded tree. + */ + BroadPhase.prototype.getTreeHeight = function () { + return this.m_tree.getHeight(); + }; + /** + * Get the balance (integer) of the embedded tree. + */ + BroadPhase.prototype.getTreeBalance = function () { + return this.m_tree.getMaxBalance(); + }; + /** + * Get the quality metric of the embedded tree. + */ + BroadPhase.prototype.getTreeQuality = function () { + return this.m_tree.getAreaRatio(); + }; + /** + * Ray-cast against the proxies in the tree. This relies on the callback to + * perform a exact ray-cast in the case were the proxy contains a shape. The + * callback also performs the any collision filtering. This has performance + * roughly equal to k * log(n), where k is the number of collisions and n is the + * number of proxies in the tree. + * + * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. + * @param rayCastCallback A function that is called for each proxy that is hit by the ray. + */ + BroadPhase.prototype.rayCast = function (input, rayCastCallback) { + this.m_tree.rayCast(input, rayCastCallback); + }; + /** + * Shift the world origin. Useful for large worlds. The shift formula is: + * position -= newOrigin + * + * @param newOrigin The new origin with respect to the old origin + */ + BroadPhase.prototype.shiftOrigin = function (newOrigin) { + this.m_tree.shiftOrigin(newOrigin); + }; + /** + * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs + * is called. + */ + BroadPhase.prototype.createProxy = function (aabb, userData) { + var proxyId = this.m_tree.createProxy(aabb, userData); + this.m_proxyCount++; + this.bufferMove(proxyId); + return proxyId; + }; + /** + * Destroy a proxy. It is up to the client to remove any pairs. + */ + BroadPhase.prototype.destroyProxy = function (proxyId) { + this.unbufferMove(proxyId); + this.m_proxyCount--; + this.m_tree.destroyProxy(proxyId); + }; + /** + * Call moveProxy as many times as you like, then when you are done call + * UpdatePairs to finalized the proxy pairs (for your time step). + */ + BroadPhase.prototype.moveProxy = function (proxyId, aabb, displacement) { + var changed = this.m_tree.moveProxy(proxyId, aabb, displacement); + if (changed) { + this.bufferMove(proxyId); + } + }; + /** + * Call to trigger a re-processing of it's pairs on the next call to + * UpdatePairs. + */ + BroadPhase.prototype.touchProxy = function (proxyId) { + this.bufferMove(proxyId); + }; + BroadPhase.prototype.bufferMove = function (proxyId) { + this.m_moveBuffer.push(proxyId); + }; + BroadPhase.prototype.unbufferMove = function (proxyId) { + for (var i = 0; i < this.m_moveBuffer.length; ++i) { + if (this.m_moveBuffer[i] === proxyId) { + this.m_moveBuffer[i] = null; + } + } + }; + /** + * Update the pairs. This results in pair callbacks. This can only add pairs. + */ + BroadPhase.prototype.updatePairs = function (addPairCallback) { + this.m_callback = addPairCallback; + // Perform tree queries for all moving proxies. + while (this.m_moveBuffer.length > 0) { + this.m_queryProxyId = this.m_moveBuffer.pop(); + if (this.m_queryProxyId === null) { + continue; + } + // We have to query the tree with the fat AABB so that + // we don't fail to create a pair that may touch later. + var fatAABB = this.m_tree.getFatAABB(this.m_queryProxyId); + // Query tree, create pairs and add them pair buffer. + this.m_tree.query(fatAABB, this.queryCallback); + } + // Try to keep the tree balanced. + // this.m_tree.rebalance(4); + }; + return BroadPhase; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Rot = /** @class */ (function () { + /** Initialize from an angle in radians. */ + function Rot(angle) { + if (!(this instanceof Rot)) { + return new Rot(angle); + } + if (typeof angle === 'number') { + this.setAngle(angle); + } + else if (typeof angle === 'object') { + this.setRot(angle); + } + else { + this.setIdentity(); + } + } + /** @internal */ + Rot.neo = function (angle) { + var obj = Object.create(Rot.prototype); + obj.setAngle(angle); + return obj; + }; + Rot.clone = function (rot) { + var obj = Object.create(Rot.prototype); + obj.s = rot.s; + obj.c = rot.c; + return obj; + }; + Rot.identity = function () { + var obj = Object.create(Rot.prototype); + obj.s = 0.0; + obj.c = 1.0; + return obj; + }; + Rot.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return math.isFinite(obj.s) && math.isFinite(obj.c); + }; + Rot.assert = function (o) { + }; + /** Set to the identity rotation. */ + Rot.prototype.setIdentity = function () { + this.s = 0.0; + this.c = 1.0; + }; + Rot.prototype.set = function (angle) { + if (typeof angle === 'object') { + this.s = angle.s; + this.c = angle.c; + } + else { + // TODO_ERIN optimize + this.s = math.sin(angle); + this.c = math.cos(angle); + } + }; + Rot.prototype.setRot = function (angle) { + this.s = angle.s; + this.c = angle.c; + }; + /** Set using an angle in radians. */ + Rot.prototype.setAngle = function (angle) { + // TODO_ERIN optimize + this.s = math.sin(angle); + this.c = math.cos(angle); + }; + /** Get the angle in radians. */ + Rot.prototype.getAngle = function () { + return math.atan2(this.s, this.c); + }; + /** Get the x-axis. */ + Rot.prototype.getXAxis = function () { + return Vec2.neo(this.c, this.s); + }; + /** Get the u-axis. */ + Rot.prototype.getYAxis = function () { + return Vec2.neo(-this.s, this.c); + }; + // tslint:disable-next-line:typedef + Rot.mul = function (rot, m) { + if ('c' in m && 's' in m) { + // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc] + // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc] + // s = qs * rc + qc * rs + // c = qc * rc - qs * rs + var qr = Rot.identity(); + qr.s = rot.s * m.c + rot.c * m.s; + qr.c = rot.c * m.c - rot.s * m.s; + return qr; + } + else if ('x' in m && 'y' in m) { + return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y); + } + }; + /** Multiply two rotations: q * r */ + Rot.mulRot = function (rot, m) { + // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc] + // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc] + // s = qs * rc + qc * rs + // c = qc * rc - qs * rs + var qr = Rot.identity(); + qr.s = rot.s * m.c + rot.c * m.s; + qr.c = rot.c * m.c - rot.s * m.s; + return qr; + }; + /** Rotate a vector */ + Rot.mulVec2 = function (rot, m) { + return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y); + }; + Rot.mulSub = function (rot, v, w) { + var x = rot.c * (v.x - w.x) - rot.s * (v.y - w.y); + var y = rot.s * (v.x - w.x) + rot.c * (v.y - w.y); + return Vec2.neo(x, y); + }; + // tslint:disable-next-line:typedef + Rot.mulT = function (rot, m) { + if ('c' in m && 's' in m) { + // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc] + // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc] + // s = qc * rs - qs * rc + // c = qc * rc + qs * rs + var qr = Rot.identity(); + qr.s = rot.c * m.s - rot.s * m.c; + qr.c = rot.c * m.c + rot.s * m.s; + return qr; + } + else if ('x' in m && 'y' in m) { + return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y); + } + }; + /** Transpose multiply two rotations: qT * r */ + Rot.mulTRot = function (rot, m) { + // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc] + // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc] + // s = qc * rs - qs * rc + // c = qc * rc + qs * rs + var qr = Rot.identity(); + qr.s = rot.c * m.s - rot.s * m.c; + qr.c = rot.c * m.c + rot.s * m.s; + return qr; + }; + /** Inverse rotate a vector */ + Rot.mulTVec2 = function (rot, m) { + return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y); + }; + return Rot; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A transform contains translation and rotation. It is used to represent the + * position and orientation of rigid frames. Initialize using a position vector + * and a rotation. + */ +var Transform = /** @class */ (function () { + function Transform(position, rotation) { + if (!(this instanceof Transform)) { + return new Transform(position, rotation); + } + this.p = Vec2.zero(); + this.q = Rot.identity(); + if (typeof position !== 'undefined') { + this.p.setVec2(position); + } + if (typeof rotation !== 'undefined') { + this.q.setAngle(rotation); + } + } + Transform.clone = function (xf) { + var obj = Object.create(Transform.prototype); + obj.p = Vec2.clone(xf.p); + obj.q = Rot.clone(xf.q); + return obj; + }; + /** @internal */ + Transform.neo = function (position, rotation) { + var obj = Object.create(Transform.prototype); + obj.p = Vec2.clone(position); + obj.q = Rot.clone(rotation); + return obj; + }; + Transform.identity = function () { + var obj = Object.create(Transform.prototype); + obj.p = Vec2.zero(); + obj.q = Rot.identity(); + return obj; + }; + /** + * Set this to the identity transform. + */ + Transform.prototype.setIdentity = function () { + this.p.setZero(); + this.q.setIdentity(); + }; + /** + * Set this based on the position and angle. + */ + // tslint:disable-next-line:typedef + Transform.prototype.set = function (a, b) { + if (typeof b === 'undefined') { + this.p.set(a.p); + this.q.set(a.q); + } + else { + this.p.set(a); + this.q.set(b); + } + }; + /** + * Set this based on the position and angle. + */ + Transform.prototype.setNum = function (position, rotation) { + this.p.setVec2(position); + this.q.setAngle(rotation); + }; + Transform.prototype.setTransform = function (xf) { + this.p.setVec2(xf.p); + this.q.setRot(xf.q); + }; + Transform.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return Vec2.isValid(obj.p) && Rot.isValid(obj.q); + }; + Transform.assert = function (o) { + }; + // static mul(a: Transform, b: Vec2Value[]): Vec2[]; + // static mul(a: Transform, b: Transform[]): Transform[]; + // tslint:disable-next-line:typedef + Transform.mul = function (a, b) { + if (Array.isArray(b)) { + var arr = []; + for (var i = 0; i < b.length; i++) { + arr[i] = Transform.mul(a, b[i]); + } + return arr; + } + else if ('x' in b && 'y' in b) { + return Transform.mulVec2(a, b); + } + else if ('p' in b && 'q' in b) { + return Transform.mulXf(a, b); + } + }; + // tslint:disable-next-line:typedef + Transform.mulAll = function (a, b) { + var arr = []; + for (var i = 0; i < b.length; i++) { + arr[i] = Transform.mul(a, b[i]); + } + return arr; + }; + /** @internal @deprecated */ + // tslint:disable-next-line:typedef + Transform.mulFn = function (a) { + return function (b) { + return Transform.mul(a, b); + }; + }; + Transform.mulVec2 = function (a, b) { + var x = (a.q.c * b.x - a.q.s * b.y) + a.p.x; + var y = (a.q.s * b.x + a.q.c * b.y) + a.p.y; + return Vec2.neo(x, y); + }; + Transform.mulXf = function (a, b) { + // v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p + // = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p + var xf = Transform.identity(); + xf.q = Rot.mulRot(a.q, b.q); + xf.p = Vec2.add(Rot.mulVec2(a.q, b.p), a.p); + return xf; + }; + // tslint:disable-next-line:typedef + Transform.mulT = function (a, b) { + if ('x' in b && 'y' in b) { + return Transform.mulTVec2(a, b); + } + else if ('p' in b && 'q' in b) { + return Transform.mulTXf(a, b); + } + }; + Transform.mulTVec2 = function (a, b) { + var px = b.x - a.p.x; + var py = b.y - a.p.y; + var x = (a.q.c * px + a.q.s * py); + var y = (-a.q.s * px + a.q.c * py); + return Vec2.neo(x, y); + }; + Transform.mulTXf = function (a, b) { + // v2 = A.q' * (B.q * v1 + B.p - A.p) + // = A.q' * B.q * v1 + A.q' * (B.p - A.p) + var xf = Transform.identity(); + xf.q.setRot(Rot.mulTRot(a.q, b.q)); + xf.p.setVec2(Rot.mulTVec2(a.q, Vec2.sub(b.p, a.p))); + return xf; + }; + return Transform; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * This describes the motion of a body/shape for TOI computation. Shapes are + * defined with respect to the body origin, which may not coincide with the + * center of mass. However, to support dynamics we must interpolate the center + * of mass position. + */ +var Sweep = /** @class */ (function () { + function Sweep(c, a) { + this.localCenter = Vec2.zero(); + this.c = Vec2.zero(); + this.a = 0; + this.alpha0 = 0; + this.c0 = Vec2.zero(); + this.a0 = 0; + } + Sweep.prototype.setTransform = function (xf) { + var c = Transform.mulVec2(xf, this.localCenter); + this.c.setVec2(c); + this.c0.setVec2(c); + this.a = xf.q.getAngle(); + this.a0 = xf.q.getAngle(); + }; + Sweep.prototype.setLocalCenter = function (localCenter, xf) { + this.localCenter.setVec2(localCenter); + var c = Transform.mulVec2(xf, this.localCenter); + this.c.setVec2(c); + this.c0.setVec2(c); + }; + /** + * Get the interpolated transform at a specific time. + * + * @param xf + * @param beta A factor in [0,1], where 0 indicates alpha0 + */ + Sweep.prototype.getTransform = function (xf, beta) { + if (beta === void 0) { beta = 0; } + xf.q.setAngle((1.0 - beta) * this.a0 + beta * this.a); + xf.p.setCombine((1.0 - beta), this.c0, beta, this.c); + // shift to origin + xf.p.sub(Rot.mulVec2(xf.q, this.localCenter)); + }; + /** + * Advance the sweep forward, yielding a new initial state. + * + * @param alpha The new initial time + */ + Sweep.prototype.advance = function (alpha) { + var beta = (alpha - this.alpha0) / (1.0 - this.alpha0); + this.c0.setCombine(beta, this.c, 1 - beta, this.c0); + this.a0 = beta * this.a + (1 - beta) * this.a0; + this.alpha0 = alpha; + }; + Sweep.prototype.forward = function () { + this.a0 = this.a; + this.c0.setVec2(this.c); + }; + /** + * normalize the angles in radians to be between -pi and pi. + */ + Sweep.prototype.normalize = function () { + var a0 = math.mod(this.a0, -math.PI, +math.PI); + this.a -= this.a0 - a0; + this.a0 = a0; + }; + Sweep.prototype.clone = function () { + var clone = new Sweep(); + clone.localCenter.setVec2(this.localCenter); + clone.alpha0 = this.alpha0; + clone.a0 = this.a0; + clone.a = this.a; + clone.c0.setVec2(this.c0); + clone.c.setVec2(this.c); + return clone; + }; + Sweep.prototype.set = function (that) { + this.localCenter.setVec2(that.localCenter); + this.alpha0 = that.alpha0; + this.a0 = that.a0; + this.a = that.a; + this.c0.setVec2(that.c0); + this.c.setVec2(that.c); + }; + return Sweep; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Velocity = /** @class */ (function () { + function Velocity() { + this.v = Vec2.zero(); + this.w = 0; + } + return Velocity; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Position = /** @class */ (function () { + function Position() { + this.c = Vec2.zero(); + this.a = 0; + } + Position.prototype.getTransform = function (xf, p) { + xf.q.setAngle(this.a); + xf.p.setVec2(Vec2.sub(this.c, Rot.mulVec2(xf.q, p))); + return xf; + }; + return Position; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +// todo make shape an interface +/** + * A shape is used for collision detection. You can create a shape however you + * like. Shapes used for simulation in World are created automatically when a + * Fixture is created. Shapes may encapsulate one or more child shapes. + */ +var Shape = /** @class */ (function () { + function Shape() { + } + Shape.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return typeof obj.m_type === 'string' && typeof obj.m_radius === 'number'; + }; + return Shape; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var FixtureDefDefault = { + userData: null, + friction: 0.2, + restitution: 0.0, + density: 0.0, + isSensor: false, + filterGroupIndex: 0, + filterCategoryBits: 0x0001, + filterMaskBits: 0xFFFF +}; +/** + * This proxy is used internally to connect shape children to the broad-phase. + */ +var FixtureProxy = /** @class */ (function () { + function FixtureProxy(fixture, childIndex) { + this.aabb = new AABB(); + this.fixture = fixture; + this.childIndex = childIndex; + this.proxyId; + } + return FixtureProxy; +}()); +/** + * A fixture is used to attach a shape to a body for collision detection. A + * fixture inherits its transform from its parent. Fixtures hold additional + * non-geometric data such as friction, collision filters, etc. + * + * To create a new Fixture use {@link Body.createFixture}. + */ +var Fixture = /** @class */ (function () { + // tslint:disable-next-line:typedef + /** @internal */ function Fixture(body, shape, def) { + if (shape.shape) { + def = shape; + shape = shape.shape; + } + else if (typeof def === 'number') { + def = { density: def }; + } + def = options(def, FixtureDefDefault); + this.m_body = body; + this.m_friction = def.friction; + this.m_restitution = def.restitution; + this.m_density = def.density; + this.m_isSensor = def.isSensor; + this.m_filterGroupIndex = def.filterGroupIndex; + this.m_filterCategoryBits = def.filterCategoryBits; + this.m_filterMaskBits = def.filterMaskBits; + // TODO validate shape + this.m_shape = shape; // .clone(); + this.m_next = null; + this.m_proxies = []; + this.m_proxyCount = 0; + var childCount = this.m_shape.getChildCount(); + for (var i = 0; i < childCount; ++i) { + this.m_proxies[i] = new FixtureProxy(this, i); + } + this.m_userData = def.userData; + } + /** + * Re-setup fixture. + * @internal + */ + Fixture.prototype._reset = function () { + var body = this.getBody(); + var broadPhase = body.m_world.m_broadPhase; + this.destroyProxies(broadPhase); + if (this.m_shape._reset) { + this.m_shape._reset(); + } + var childCount = this.m_shape.getChildCount(); + for (var i = 0; i < childCount; ++i) { + this.m_proxies[i] = new FixtureProxy(this, i); + } + this.createProxies(broadPhase, body.m_xf); + body.resetMassData(); + }; + /** @internal */ + Fixture.prototype._serialize = function () { + return { + friction: this.m_friction, + restitution: this.m_restitution, + density: this.m_density, + isSensor: this.m_isSensor, + filterGroupIndex: this.m_filterGroupIndex, + filterCategoryBits: this.m_filterCategoryBits, + filterMaskBits: this.m_filterMaskBits, + shape: this.m_shape, + }; + }; + /** @internal */ + Fixture._deserialize = function (data, body, restore) { + var shape = restore(Shape, data.shape); + var fixture = shape && new Fixture(body, shape, data); + return fixture; + }; + /** + * Get the type of the child shape. You can use this to down cast to the + * concrete shape. + */ + Fixture.prototype.getType = function () { + return this.m_shape.getType(); + }; + /** + * Get the child shape. You can modify the child shape, however you should not + * change the number of vertices because this will crash some collision caching + * mechanisms. Manipulating the shape may lead to non-physical behavior. + */ + Fixture.prototype.getShape = function () { + return this.m_shape; + }; + /** + * A sensor shape collects contact information but never generates a collision + * response. + */ + Fixture.prototype.isSensor = function () { + return this.m_isSensor; + }; + /** + * Set if this fixture is a sensor. + */ + Fixture.prototype.setSensor = function (sensor) { + if (sensor != this.m_isSensor) { + this.m_body.setAwake(true); + this.m_isSensor = sensor; + } + }; + // /** + // * Get the contact filtering data. + // */ + // getFilterData() { + // return this.m_filter; + // } + /** + * Get the user data that was assigned in the fixture definition. Use this to + * store your application specific data. + */ + Fixture.prototype.getUserData = function () { + return this.m_userData; + }; + /** + * Set the user data. Use this to store your application specific data. + */ + Fixture.prototype.setUserData = function (data) { + this.m_userData = data; + }; + /** + * Get the parent body of this fixture. This is null if the fixture is not + * attached. + */ + Fixture.prototype.getBody = function () { + return this.m_body; + }; + /** + * Get the next fixture in the parent body's fixture list. + */ + Fixture.prototype.getNext = function () { + return this.m_next; + }; + /** + * Get the density of this fixture. + */ + Fixture.prototype.getDensity = function () { + return this.m_density; + }; + /** + * Set the density of this fixture. This will _not_ automatically adjust the + * mass of the body. You must call Body.resetMassData to update the body's mass. + */ + Fixture.prototype.setDensity = function (density) { + this.m_density = density; + }; + /** + * Get the coefficient of friction, usually in the range [0,1]. + */ + Fixture.prototype.getFriction = function () { + return this.m_friction; + }; + /** + * Set the coefficient of friction. This will not change the friction of + * existing contacts. + */ + Fixture.prototype.setFriction = function (friction) { + this.m_friction = friction; + }; + /** + * Get the coefficient of restitution. + */ + Fixture.prototype.getRestitution = function () { + return this.m_restitution; + }; + /** + * Set the coefficient of restitution. This will not change the restitution of + * existing contacts. + */ + Fixture.prototype.setRestitution = function (restitution) { + this.m_restitution = restitution; + }; + /** + * Test a point in world coordinates for containment in this fixture. + */ + Fixture.prototype.testPoint = function (p) { + return this.m_shape.testPoint(this.m_body.getTransform(), p); + }; + /** + * Cast a ray against this shape. + */ + Fixture.prototype.rayCast = function (output, input, childIndex) { + return this.m_shape.rayCast(output, input, this.m_body.getTransform(), childIndex); + }; + /** + * Get the mass data for this fixture. The mass data is based on the density and + * the shape. The rotational inertia is about the shape's origin. This operation + * may be expensive. + */ + Fixture.prototype.getMassData = function (massData) { + this.m_shape.computeMass(massData, this.m_density); + }; + /** + * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a + * more accurate AABB, compute it using the shape and the body transform. + */ + Fixture.prototype.getAABB = function (childIndex) { + return this.m_proxies[childIndex].aabb; + }; + /** + * These support body activation/deactivation. + */ + Fixture.prototype.createProxies = function (broadPhase, xf) { + // Create proxies in the broad-phase. + this.m_proxyCount = this.m_shape.getChildCount(); + for (var i = 0; i < this.m_proxyCount; ++i) { + var proxy = this.m_proxies[i]; + this.m_shape.computeAABB(proxy.aabb, xf, i); + proxy.proxyId = broadPhase.createProxy(proxy.aabb, proxy); + } + }; + Fixture.prototype.destroyProxies = function (broadPhase) { + // Destroy proxies in the broad-phase. + for (var i = 0; i < this.m_proxyCount; ++i) { + var proxy = this.m_proxies[i]; + broadPhase.destroyProxy(proxy.proxyId); + proxy.proxyId = null; + } + this.m_proxyCount = 0; + }; + /** + * Updates this fixture proxy in broad-phase (with combined AABB of current and + * next transformation). + */ + Fixture.prototype.synchronize = function (broadPhase, xf1, xf2) { + for (var i = 0; i < this.m_proxyCount; ++i) { + var proxy = this.m_proxies[i]; + // Compute an AABB that covers the swept shape (may miss some rotation + // effect). + var aabb1 = new AABB(); + var aabb2 = new AABB(); + this.m_shape.computeAABB(aabb1, xf1, proxy.childIndex); + this.m_shape.computeAABB(aabb2, xf2, proxy.childIndex); + proxy.aabb.combine(aabb1, aabb2); + var displacement = Vec2.sub(xf2.p, xf1.p); + broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement); + } + }; + /** + * Set the contact filtering data. This will not update contacts until the next + * time step when either parent body is active and awake. This automatically + * calls refilter. + */ + Fixture.prototype.setFilterData = function (filter) { + this.m_filterGroupIndex = filter.groupIndex; + this.m_filterCategoryBits = filter.categoryBits; + this.m_filterMaskBits = filter.maskBits; + this.refilter(); + }; + Fixture.prototype.getFilterGroupIndex = function () { + return this.m_filterGroupIndex; + }; + Fixture.prototype.setFilterGroupIndex = function (groupIndex) { + this.m_filterGroupIndex = groupIndex; + }; + Fixture.prototype.getFilterCategoryBits = function () { + return this.m_filterCategoryBits; + }; + Fixture.prototype.setFilterCategoryBits = function (categoryBits) { + this.m_filterCategoryBits = categoryBits; + }; + Fixture.prototype.getFilterMaskBits = function () { + return this.m_filterMaskBits; + }; + Fixture.prototype.setFilterMaskBits = function (maskBits) { + this.m_filterMaskBits = maskBits; + }; + /** + * Call this if you want to establish collision that was previously disabled by + * ContactFilter. + */ + Fixture.prototype.refilter = function () { + if (this.m_body == null) { + return; + } + // Flag associated contacts for filtering. + var edge = this.m_body.getContactList(); + while (edge) { + var contact = edge.contact; + var fixtureA = contact.getFixtureA(); + var fixtureB = contact.getFixtureB(); + if (fixtureA == this || fixtureB == this) { + contact.flagForFiltering(); + } + edge = edge.next; + } + var world = this.m_body.getWorld(); + if (world == null) { + return; + } + // Touch each proxy so that new pairs may be created + var broadPhase = world.m_broadPhase; + for (var i = 0; i < this.m_proxyCount; ++i) { + broadPhase.touchProxy(this.m_proxies[i].proxyId); + } + }; + /** + * Implement this method to provide collision filtering, if you want finer + * control over contact creation. + * + * Return true if contact calculations should be performed between these two + * fixtures. + * + * Warning: for performance reasons this is only called when the AABBs begin to + * overlap. + */ + Fixture.prototype.shouldCollide = function (that) { + if (that.m_filterGroupIndex === this.m_filterGroupIndex && that.m_filterGroupIndex !== 0) { + return that.m_filterGroupIndex > 0; + } + var collideA = (that.m_filterMaskBits & this.m_filterCategoryBits) !== 0; + var collideB = (that.m_filterCategoryBits & this.m_filterMaskBits) !== 0; + var collide = collideA && collideB; + return collide; + }; + return Fixture; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var STATIC = 'static'; +var KINEMATIC = 'kinematic'; +var DYNAMIC = 'dynamic'; +var BodyDefDefault = { + type: STATIC, + position: Vec2.zero(), + angle: 0.0, + linearVelocity: Vec2.zero(), + angularVelocity: 0.0, + linearDamping: 0.0, + angularDamping: 0.0, + fixedRotation: false, + bullet: false, + gravityScale: 1.0, + allowSleep: true, + awake: true, + active: true, + userData: null +}; +/** + * MassData This holds the mass data computed for a shape. + */ +var MassData = /** @class */ (function () { + function MassData() { + /** The mass of the shape, usually in kilograms. */ + this.mass = 0; + /** The position of the shape's centroid relative to the shape's origin. */ + this.center = Vec2.zero(); + /** The rotational inertia of the shape about the local origin. */ + this.I = 0; + } + return MassData; +}()); +/** + * A rigid body composed of one or more fixtures. + * + * To create a new Body use {@link World.createBody}. + */ +var Body = /** @class */ (function () { + /** @internal */ + function Body(world, def) { + def = options(def, BodyDefDefault); + this.m_world = world; + this.m_awakeFlag = def.awake; + this.m_autoSleepFlag = def.allowSleep; + this.m_bulletFlag = def.bullet; + this.m_fixedRotationFlag = def.fixedRotation; + this.m_activeFlag = def.active; + this.m_islandFlag = false; + this.m_toiFlag = false; + this.m_userData = def.userData; + this.m_type = def.type; + if (this.m_type == DYNAMIC) { + this.m_mass = 1.0; + this.m_invMass = 1.0; + } + else { + this.m_mass = 0.0; + this.m_invMass = 0.0; + } + // Rotational inertia about the center of mass. + this.m_I = 0.0; + this.m_invI = 0.0; + // the body origin transform + this.m_xf = Transform.identity(); + this.m_xf.p = Vec2.clone(def.position); + this.m_xf.q.setAngle(def.angle); + // the swept motion for CCD + this.m_sweep = new Sweep(); + this.m_sweep.setTransform(this.m_xf); + // position and velocity correction + this.c_velocity = new Velocity(); + this.c_position = new Position(); + this.m_force = Vec2.zero(); + this.m_torque = 0.0; + this.m_linearVelocity = Vec2.clone(def.linearVelocity); + this.m_angularVelocity = def.angularVelocity; + this.m_linearDamping = def.linearDamping; + this.m_angularDamping = def.angularDamping; + this.m_gravityScale = def.gravityScale; + this.m_sleepTime = 0.0; + this.m_jointList = null; + this.m_contactList = null; + this.m_fixtureList = null; + this.m_prev = null; + this.m_next = null; + this.m_destroyed = false; + } + /** @internal */ + Body.prototype._serialize = function () { + var fixtures = []; + for (var f = this.m_fixtureList; f; f = f.m_next) { + fixtures.push(f); + } + return { + type: this.m_type, + bullet: this.m_bulletFlag, + position: this.m_xf.p, + angle: this.m_xf.q.getAngle(), + linearVelocity: this.m_linearVelocity, + angularVelocity: this.m_angularVelocity, + fixtures: fixtures, + }; + }; + /** @internal */ + Body._deserialize = function (data, world, restore) { + var body = new Body(world, data); + if (data.fixtures) { + for (var i = data.fixtures.length - 1; i >= 0; i--) { + var fixture = restore(Fixture, data.fixtures[i], body); + body._addFixture(fixture); + } + } + return body; + }; + Body.prototype.isWorldLocked = function () { + return this.m_world && this.m_world.isLocked() ? true : false; + }; + Body.prototype.getWorld = function () { + return this.m_world; + }; + Body.prototype.getNext = function () { + return this.m_next; + }; + Body.prototype.setUserData = function (data) { + this.m_userData = data; + }; + Body.prototype.getUserData = function () { + return this.m_userData; + }; + Body.prototype.getFixtureList = function () { + return this.m_fixtureList; + }; + Body.prototype.getJointList = function () { + return this.m_jointList; + }; + /** + * Warning: this list changes during the time step and you may miss some + * collisions if you don't use ContactListener. + */ + Body.prototype.getContactList = function () { + return this.m_contactList; + }; + Body.prototype.isStatic = function () { + return this.m_type == STATIC; + }; + Body.prototype.isDynamic = function () { + return this.m_type == DYNAMIC; + }; + Body.prototype.isKinematic = function () { + return this.m_type == KINEMATIC; + }; + /** + * This will alter the mass and velocity. + */ + Body.prototype.setStatic = function () { + this.setType(STATIC); + return this; + }; + Body.prototype.setDynamic = function () { + this.setType(DYNAMIC); + return this; + }; + Body.prototype.setKinematic = function () { + this.setType(KINEMATIC); + return this; + }; + /** + * @internal + */ + Body.prototype.getType = function () { + return this.m_type; + }; + /** + * @internal + */ + Body.prototype.setType = function (type) { + if (this.isWorldLocked() == true) { + return; + } + if (this.m_type == type) { + return; + } + this.m_type = type; + this.resetMassData(); + if (this.m_type == STATIC) { + this.m_linearVelocity.setZero(); + this.m_angularVelocity = 0.0; + this.m_sweep.forward(); + this.synchronizeFixtures(); + } + this.setAwake(true); + this.m_force.setZero(); + this.m_torque = 0.0; + // Delete the attached contacts. + var ce = this.m_contactList; + while (ce) { + var ce0 = ce; + ce = ce.next; + this.m_world.destroyContact(ce0.contact); + } + this.m_contactList = null; + // Touch the proxies so that new contacts will be created (when appropriate) + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + var proxyCount = f.m_proxyCount; + for (var i = 0; i < proxyCount; ++i) { + broadPhase.touchProxy(f.m_proxies[i].proxyId); + } + } + }; + Body.prototype.isBullet = function () { + return this.m_bulletFlag; + }; + /** + * Should this body be treated like a bullet for continuous collision detection? + */ + Body.prototype.setBullet = function (flag) { + this.m_bulletFlag = !!flag; + }; + Body.prototype.isSleepingAllowed = function () { + return this.m_autoSleepFlag; + }; + Body.prototype.setSleepingAllowed = function (flag) { + this.m_autoSleepFlag = !!flag; + if (this.m_autoSleepFlag == false) { + this.setAwake(true); + } + }; + Body.prototype.isAwake = function () { + return this.m_awakeFlag; + }; + /** + * Set the sleep state of the body. A sleeping body has very low CPU cost. + * + * @param flag Set to true to wake the body, false to put it to sleep. + */ + Body.prototype.setAwake = function (flag) { + if (flag) { + if (this.m_awakeFlag == false) { + this.m_awakeFlag = true; + this.m_sleepTime = 0.0; + } + } + else { + this.m_awakeFlag = false; + this.m_sleepTime = 0.0; + this.m_linearVelocity.setZero(); + this.m_angularVelocity = 0.0; + this.m_force.setZero(); + this.m_torque = 0.0; + } + }; + Body.prototype.isActive = function () { + return this.m_activeFlag; + }; + /** + * Set the active state of the body. An inactive body is not simulated and + * cannot be collided with or woken up. If you pass a flag of true, all fixtures + * will be added to the broad-phase. If you pass a flag of false, all fixtures + * will be removed from the broad-phase and all contacts will be destroyed. + * Fixtures and joints are otherwise unaffected. + * + * You may continue to create/destroy fixtures and joints on inactive bodies. + * Fixtures on an inactive body are implicitly inactive and will not participate + * in collisions, ray-casts, or queries. Joints connected to an inactive body + * are implicitly inactive. An inactive body is still owned by a World object + * and remains + */ + Body.prototype.setActive = function (flag) { + if (flag == this.m_activeFlag) { + return; + } + this.m_activeFlag = !!flag; + if (this.m_activeFlag) { + // Create all proxies. + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + f.createProxies(broadPhase, this.m_xf); + } + // Contacts are created the next time step. + } + else { + // Destroy all proxies. + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + f.destroyProxies(broadPhase); + } + // Destroy the attached contacts. + var ce = this.m_contactList; + while (ce) { + var ce0 = ce; + ce = ce.next; + this.m_world.destroyContact(ce0.contact); + } + this.m_contactList = null; + } + }; + Body.prototype.isFixedRotation = function () { + return this.m_fixedRotationFlag; + }; + /** + * Set this body to have fixed rotation. This causes the mass to be reset. + */ + Body.prototype.setFixedRotation = function (flag) { + if (this.m_fixedRotationFlag == flag) { + return; + } + this.m_fixedRotationFlag = !!flag; + this.m_angularVelocity = 0.0; + this.resetMassData(); + }; + /** + * Get the world transform for the body's origin. + */ + Body.prototype.getTransform = function () { + return this.m_xf; + }; + /** + * Set the position of the body's origin and rotation. Manipulating a body's + * transform may cause non-physical behavior. Note: contacts are updated on the + * next call to World.step. + * + * @param position The world position of the body's local origin. + * @param angle The world rotation in radians. + */ + Body.prototype.setTransform = function (position, angle) { + if (this.isWorldLocked() == true) { + return; + } + this.m_xf.setNum(position, angle); + this.m_sweep.setTransform(this.m_xf); + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + f.synchronize(broadPhase, this.m_xf, this.m_xf); + } + }; + Body.prototype.synchronizeTransform = function () { + this.m_sweep.getTransform(this.m_xf, 1); + }; + /** + * Update fixtures in broad-phase. + */ + Body.prototype.synchronizeFixtures = function () { + var xf = Transform.identity(); + this.m_sweep.getTransform(xf, 0); + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + f.synchronize(broadPhase, xf, this.m_xf); + } + }; + /** + * Used in TOI. + */ + Body.prototype.advance = function (alpha) { + // Advance to the new safe time. This doesn't sync the broad-phase. + this.m_sweep.advance(alpha); + this.m_sweep.c.setVec2(this.m_sweep.c0); + this.m_sweep.a = this.m_sweep.a0; + this.m_sweep.getTransform(this.m_xf, 1); + }; + /** + * Get the world position for the body's origin. + */ + Body.prototype.getPosition = function () { + return this.m_xf.p; + }; + Body.prototype.setPosition = function (p) { + this.setTransform(p, this.m_sweep.a); + }; + /** + * Get the current world rotation angle in radians. + */ + Body.prototype.getAngle = function () { + return this.m_sweep.a; + }; + Body.prototype.setAngle = function (angle) { + this.setTransform(this.m_xf.p, angle); + }; + /** + * Get the world position of the center of mass. + */ + Body.prototype.getWorldCenter = function () { + return this.m_sweep.c; + }; + /** + * Get the local position of the center of mass. + */ + Body.prototype.getLocalCenter = function () { + return this.m_sweep.localCenter; + }; + /** + * Get the linear velocity of the center of mass. + * + * @return the linear velocity of the center of mass. + */ + Body.prototype.getLinearVelocity = function () { + return this.m_linearVelocity; + }; + /** + * Get the world linear velocity of a world point attached to this body. + * + * @param worldPoint A point in world coordinates. + */ + Body.prototype.getLinearVelocityFromWorldPoint = function (worldPoint) { + var localCenter = Vec2.sub(worldPoint, this.m_sweep.c); + return Vec2.add(this.m_linearVelocity, Vec2.crossNumVec2(this.m_angularVelocity, localCenter)); + }; + /** + * Get the world velocity of a local point. + * + * @param localPoint A point in local coordinates. + */ + Body.prototype.getLinearVelocityFromLocalPoint = function (localPoint) { + return this.getLinearVelocityFromWorldPoint(this.getWorldPoint(localPoint)); + }; + /** + * Set the linear velocity of the center of mass. + * + * @param v The new linear velocity of the center of mass. + */ + Body.prototype.setLinearVelocity = function (v) { + if (this.m_type == STATIC) { + return; + } + if (Vec2.dot(v, v) > 0.0) { + this.setAwake(true); + } + this.m_linearVelocity.setVec2(v); + }; + /** + * Get the angular velocity. + * + * @returns the angular velocity in radians/second. + */ + Body.prototype.getAngularVelocity = function () { + return this.m_angularVelocity; + }; + /** + * Set the angular velocity. + * + * @param omega The new angular velocity in radians/second. + */ + Body.prototype.setAngularVelocity = function (w) { + if (this.m_type == STATIC) { + return; + } + if (w * w > 0.0) { + this.setAwake(true); + } + this.m_angularVelocity = w; + }; + Body.prototype.getLinearDamping = function () { + return this.m_linearDamping; + }; + Body.prototype.setLinearDamping = function (linearDamping) { + this.m_linearDamping = linearDamping; + }; + Body.prototype.getAngularDamping = function () { + return this.m_angularDamping; + }; + Body.prototype.setAngularDamping = function (angularDamping) { + this.m_angularDamping = angularDamping; + }; + Body.prototype.getGravityScale = function () { + return this.m_gravityScale; + }; + /** + * Scale the gravity applied to this body. + */ + Body.prototype.setGravityScale = function (scale) { + this.m_gravityScale = scale; + }; + /** + * Get the total mass of the body. + * + * @returns The mass, usually in kilograms (kg). + */ + Body.prototype.getMass = function () { + return this.m_mass; + }; + /** + * Get the rotational inertia of the body about the local origin. + * + * @return the rotational inertia, usually in kg-m^2. + */ + Body.prototype.getInertia = function () { + return this.m_I + this.m_mass + * Vec2.dot(this.m_sweep.localCenter, this.m_sweep.localCenter); + }; + /** + * Copy the mass data of the body to data. + */ + Body.prototype.getMassData = function (data) { + data.mass = this.m_mass; + data.I = this.getInertia(); + data.center.setVec2(this.m_sweep.localCenter); + }; + /** + * This resets the mass properties to the sum of the mass properties of the + * fixtures. This normally does not need to be called unless you called + * SetMassData to override the mass and you later want to reset the mass. + */ + Body.prototype.resetMassData = function () { + // Compute mass data from shapes. Each shape has its own density. + this.m_mass = 0.0; + this.m_invMass = 0.0; + this.m_I = 0.0; + this.m_invI = 0.0; + this.m_sweep.localCenter.setZero(); + // Static and kinematic bodies have zero mass. + if (this.isStatic() || this.isKinematic()) { + this.m_sweep.c0.setVec2(this.m_xf.p); + this.m_sweep.c.setVec2(this.m_xf.p); + this.m_sweep.a0 = this.m_sweep.a; + return; + } + // Accumulate mass over all fixtures. + var localCenter = Vec2.zero(); + for (var f = this.m_fixtureList; f; f = f.m_next) { + if (f.m_density == 0.0) { + continue; + } + var massData = new MassData(); + f.getMassData(massData); + this.m_mass += massData.mass; + localCenter.addMul(massData.mass, massData.center); + this.m_I += massData.I; + } + // Compute center of mass. + if (this.m_mass > 0.0) { + this.m_invMass = 1.0 / this.m_mass; + localCenter.mul(this.m_invMass); + } + else { + // Force all dynamic bodies to have a positive mass. + this.m_mass = 1.0; + this.m_invMass = 1.0; + } + if (this.m_I > 0.0 && this.m_fixedRotationFlag == false) { + // Center the inertia about the center of mass. + this.m_I -= this.m_mass * Vec2.dot(localCenter, localCenter); + this.m_invI = 1.0 / this.m_I; + } + else { + this.m_I = 0.0; + this.m_invI = 0.0; + } + // Move center of mass. + var oldCenter = Vec2.clone(this.m_sweep.c); + this.m_sweep.setLocalCenter(localCenter, this.m_xf); + // Update center of mass velocity. + this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(this.m_sweep.c, oldCenter))); + }; + /** + * Set the mass properties to override the mass properties of the fixtures. Note + * that this changes the center of mass position. Note that creating or + * destroying fixtures can also alter the mass. This function has no effect if + * the body isn't dynamic. + * + * @param massData The mass properties. + */ + Body.prototype.setMassData = function (massData) { + if (this.isWorldLocked() == true) { + return; + } + if (this.m_type != DYNAMIC) { + return; + } + this.m_invMass = 0.0; + this.m_I = 0.0; + this.m_invI = 0.0; + this.m_mass = massData.mass; + if (this.m_mass <= 0.0) { + this.m_mass = 1.0; + } + this.m_invMass = 1.0 / this.m_mass; + if (massData.I > 0.0 && this.m_fixedRotationFlag == false) { + this.m_I = massData.I - this.m_mass + * Vec2.dot(massData.center, massData.center); + this.m_invI = 1.0 / this.m_I; + } + // Move center of mass. + var oldCenter = Vec2.clone(this.m_sweep.c); + this.m_sweep.setLocalCenter(massData.center, this.m_xf); + // Update center of mass velocity. + this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(this.m_sweep.c, oldCenter))); + }; + /** + * Apply a force at a world point. If the force is not applied at the center of + * mass, it will generate a torque and affect the angular velocity. This wakes + * up the body. + * + * @param force The world force vector, usually in Newtons (N). + * @param point The world position of the point of application. + * @param wake Also wake up the body + */ + Body.prototype.applyForce = function (force, point, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate a force if the body is sleeping. + if (this.m_awakeFlag) { + this.m_force.add(force); + this.m_torque += Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), force); + } + }; + /** + * Apply a force to the center of mass. This wakes up the body. + * + * @param force The world force vector, usually in Newtons (N). + * @param wake Also wake up the body + */ + Body.prototype.applyForceToCenter = function (force, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate a force if the body is sleeping + if (this.m_awakeFlag) { + this.m_force.add(force); + } + }; + /** + * Apply a torque. This affects the angular velocity without affecting the + * linear velocity of the center of mass. This wakes up the body. + * + * @param torque About the z-axis (out of the screen), usually in N-m. + * @param wake Also wake up the body + */ + Body.prototype.applyTorque = function (torque, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate a force if the body is sleeping + if (this.m_awakeFlag) { + this.m_torque += torque; + } + }; + /** + * Apply an impulse at a point. This immediately modifies the velocity. It also + * modifies the angular velocity if the point of application is not at the + * center of mass. This wakes up the body. + * + * @param impulse The world impulse vector, usually in N-seconds or kg-m/s. + * @param point The world position of the point of application. + * @param wake Also wake up the body + */ + Body.prototype.applyLinearImpulse = function (impulse, point, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate velocity if the body is sleeping + if (this.m_awakeFlag) { + this.m_linearVelocity.addMul(this.m_invMass, impulse); + this.m_angularVelocity += this.m_invI * Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), impulse); + } + }; + /** + * Apply an angular impulse. + * + * @param impulse The angular impulse in units of kg*m*m/s + * @param wake Also wake up the body + */ + Body.prototype.applyAngularImpulse = function (impulse, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate velocity if the body is sleeping + if (this.m_awakeFlag) { + this.m_angularVelocity += this.m_invI * impulse; + } + }; + /** + * This is used to prevent connected bodies (by joints) from colliding, + * depending on the joint's collideConnected flag. + */ + Body.prototype.shouldCollide = function (that) { + // At least one body should be dynamic. + if (this.m_type != DYNAMIC && that.m_type != DYNAMIC) { + return false; + } + // Does a joint prevent collision? + for (var jn = this.m_jointList; jn; jn = jn.next) { + if (jn.other == that) { + if (jn.joint.m_collideConnected == false) { + return false; + } + } + } + return true; + }; + /** + * @internal Used for deserialize. + */ + Body.prototype._addFixture = function (fixture) { + if (this.isWorldLocked() == true) { + return null; + } + if (this.m_activeFlag) { + var broadPhase = this.m_world.m_broadPhase; + fixture.createProxies(broadPhase, this.m_xf); + } + fixture.m_next = this.m_fixtureList; + this.m_fixtureList = fixture; + // Adjust mass properties if needed. + if (fixture.m_density > 0.0) { + this.resetMassData(); + } + // Let the world know we have a new fixture. This will cause new contacts + // to be created at the beginning of the next time step. + this.m_world.m_newFixture = true; + return fixture; + }; + // tslint:disable-next-line:typedef + Body.prototype.createFixture = function (shape, fixdef) { + if (this.isWorldLocked() == true) { + return null; + } + var fixture = new Fixture(this, shape, fixdef); + this._addFixture(fixture); + return fixture; + }; + /** + * Destroy a fixture. This removes the fixture from the broad-phase and destroys + * all contacts associated with this fixture. This will automatically adjust the + * mass of the body if the body is dynamic and the fixture has positive density. + * All fixtures attached to a body are implicitly destroyed when the body is + * destroyed. + * + * Warning: This function is locked during callbacks. + * + * @param fixture The fixture to be removed. + */ + Body.prototype.destroyFixture = function (fixture) { + if (this.isWorldLocked() == true) { + return; + } + if (this.m_fixtureList === fixture) { + this.m_fixtureList = fixture.m_next; + } + else { + var node = this.m_fixtureList; + while (node != null) { + if (node.m_next === fixture) { + node.m_next = fixture.m_next; + break; + } + node = node.m_next; + } + } + // Destroy any contacts associated with the fixture. + var edge = this.m_contactList; + while (edge) { + var c = edge.contact; + edge = edge.next; + var fixtureA = c.getFixtureA(); + var fixtureB = c.getFixtureB(); + if (fixture == fixtureA || fixture == fixtureB) { + // This destroys the contact and removes it from + // this body's contact list. + this.m_world.destroyContact(c); + } + } + if (this.m_activeFlag) { + var broadPhase = this.m_world.m_broadPhase; + fixture.destroyProxies(broadPhase); + } + fixture.m_body = null; + fixture.m_next = null; + this.m_world.publish('remove-fixture', fixture); + // Reset the mass data. + this.resetMassData(); + }; + /** + * Get the corresponding world point of a local point. + */ + Body.prototype.getWorldPoint = function (localPoint) { + return Transform.mulVec2(this.m_xf, localPoint); + }; + /** + * Get the corresponding world vector of a local vector. + */ + Body.prototype.getWorldVector = function (localVector) { + return Rot.mulVec2(this.m_xf.q, localVector); + }; + /** + * Gets the corresponding local point of a world point. + */ + Body.prototype.getLocalPoint = function (worldPoint) { + return Transform.mulTVec2(this.m_xf, worldPoint); + }; + /** + * Gets the corresponding local vector of a world vector. + */ + Body.prototype.getLocalVector = function (worldVector) { + return Rot.mulTVec2(this.m_xf.q, worldVector); + }; + /** + * A static body does not move under simulation and behaves as if it has infinite mass. + * Internally, zero is stored for the mass and the inverse mass. + * Static bodies can be moved manually by the user. + * A static body has zero velocity. + * Static bodies do not collide with other static or kinematic bodies. + */ + Body.STATIC = 'static'; + /** + * A kinematic body moves under simulation according to its velocity. + * Kinematic bodies do not respond to forces. + * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity. + * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass. + * Kinematic bodies do not collide with other kinematic or static bodies. + */ + Body.KINEMATIC = 'kinematic'; + /** + * A dynamic body is fully simulated. + * They can be moved manually by the user, but normally they move according to forces. + * A dynamic body can collide with all body types. + * A dynamic body always has finite, non-zero mass. + * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate. + */ + Body.DYNAMIC = 'dynamic'; + return Body; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A joint edge is used to connect bodies and joints together in a joint graph + * where each body is a node and each joint is an edge. A joint edge belongs to + * a doubly linked list maintained in each attached body. Each joint has two + * joint nodes, one for each attached body. + */ +var JointEdge = /** @class */ (function () { + function JointEdge() { + /** + * provides quick access to the other body attached. + */ + this.other = null; + /** + * the joint + */ + this.joint = null; + /** + * prev the previous joint edge in the body's joint list + */ + this.prev = null; + /** + * the next joint edge in the body's joint list + */ + this.next = null; + } + return JointEdge; +}()); +/** + * The base joint class. Joints are used to constraint two bodies together in + * various fashions. Some joints also feature limits and motors. + */ +var Joint = /** @class */ (function () { + function Joint(def, bodyA, bodyB) { + /** @internal */ this.m_type = 'unknown-joint'; + /** @internal */ this.m_prev = null; + /** @internal */ this.m_next = null; + /** @internal */ this.m_edgeA = new JointEdge(); + /** @internal */ this.m_edgeB = new JointEdge(); + /** @internal */ this.m_islandFlag = false; + bodyA = 'bodyA' in def ? def.bodyA : bodyA; + bodyB = 'bodyB' in def ? def.bodyB : bodyB; + this.m_bodyA = bodyA; + this.m_bodyB = bodyB; + this.m_collideConnected = !!def.collideConnected; + this.m_userData = def.userData; + } + /** + * Short-cut function to determine if either body is inactive. + */ + Joint.prototype.isActive = function () { + return this.m_bodyA.isActive() && this.m_bodyB.isActive(); + }; + /** + * Get the type of the concrete joint. + */ + Joint.prototype.getType = function () { + return this.m_type; + }; + /** + * Get the first body attached to this joint. + */ + Joint.prototype.getBodyA = function () { + return this.m_bodyA; + }; + /** + * Get the second body attached to this joint. + */ + Joint.prototype.getBodyB = function () { + return this.m_bodyB; + }; + /** + * Get the next joint the world joint list. + */ + Joint.prototype.getNext = function () { + return this.m_next; + }; + Joint.prototype.getUserData = function () { + return this.m_userData; + }; + Joint.prototype.setUserData = function (data) { + this.m_userData = data; + }; + /** + * Get collide connected. Note: modifying the collide connect flag won't work + * correctly because the flag is only checked when fixture AABBs begin to + * overlap. + */ + Joint.prototype.getCollideConnected = function () { + return this.m_collideConnected; + }; + /** + * Shift the origin for any points stored in world coordinates. + */ + Joint.prototype.shiftOrigin = function (newOrigin) { }; + return Joint; +}()); + +var stats = { + gjkCalls: 0, + gjkIters: 0, + gjkMaxIters: 0, + toiTime: 0, + toiMaxTime: 0, + toiCalls: 0, + toiIters: 0, + toiMaxIters: 0, + toiRootIters: 0, + toiMaxRootIters: 0, + toString: function (newline) { + newline = typeof newline === 'string' ? newline : '\n'; + var string = ""; + // tslint:disable-next-line:no-for-in + for (var name_1 in this) { + if (typeof this[name_1] !== 'function' && typeof this[name_1] !== 'object') { + string += name_1 + ': ' + this[name_1] + newline; + } + } + return string; + } +}; + +var now = function () { + return Date.now(); +}; +var diff = function (time) { + return Date.now() - time; +}; +var Timer = { + now: now, + diff: diff, +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates. + */ +stats.gjkCalls = 0; +stats.gjkIters = 0; +stats.gjkMaxIters = 0; +/** + * Input for Distance. You have to option to use the shape radii in the + * computation. Even + */ +var DistanceInput = /** @class */ (function () { + function DistanceInput() { + this.proxyA = new DistanceProxy(); + this.proxyB = new DistanceProxy(); + this.transformA = null; + this.transformB = null; + this.useRadii = false; + } + return DistanceInput; +}()); +/** + * Output for Distance. + * + * @prop {Vec2} pointA closest point on shapeA + * @prop {Vec2} pointB closest point on shapeB + * @prop distance + * @prop iterations number of GJK iterations used + */ +var DistanceOutput = /** @class */ (function () { + function DistanceOutput() { + this.pointA = Vec2.zero(); + this.pointB = Vec2.zero(); + } + return DistanceOutput; +}()); +/** + * Used to warm start Distance. Set count to zero on first call. + * + * @prop {number} metric length or area + * @prop {array} indexA vertices on shape A + * @prop {array} indexB vertices on shape B + * @prop {number} count + */ +var SimplexCache = /** @class */ (function () { + function SimplexCache() { + this.metric = 0; + this.indexA = []; + this.indexB = []; + this.count = 0; + } + return SimplexCache; +}()); +/** + * Compute the closest points between two shapes. Supports any combination of: + * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On + * the first call set SimplexCache.count to zero. + */ +var Distance = function (output, cache, input) { + ++stats.gjkCalls; + var proxyA = input.proxyA; + var proxyB = input.proxyB; + var xfA = input.transformA; + var xfB = input.transformB; + // Initialize the simplex. + var simplex = new Simplex(); + simplex.readCache(cache, proxyA, xfA, proxyB, xfB); + // Get simplex vertices as an array. + var vertices = simplex.m_v; + var k_maxIters = Settings.maxDistnceIterations; + // These store the vertices of the last simplex so that we + // can check for duplicates and prevent cycling. + var saveA = []; + var saveB = []; // int[3] + var saveCount = 0; + // Main iteration loop. + var iter = 0; + while (iter < k_maxIters) { + // Copy simplex so we can identify duplicates. + saveCount = simplex.m_count; + for (var i = 0; i < saveCount; ++i) { + saveA[i] = vertices[i].indexA; + saveB[i] = vertices[i].indexB; + } + simplex.solve(); + // If we have 3 points, then the origin is in the corresponding triangle. + if (simplex.m_count === 3) { + break; + } + // Compute closest point. + var p = simplex.getClosestPoint(); + p.lengthSquared(); + // Get search direction. + var d = simplex.getSearchDirection(); + // Ensure the search direction is numerically fit. + if (d.lengthSquared() < math.EPSILON * math.EPSILON) { + // The origin is probably contained by a line segment + // or triangle. Thus the shapes are overlapped. + // We can't return zero here even though there may be overlap. + // In case the simplex is a point, segment, or triangle it is difficult + // to determine if the origin is contained in the CSO or very close to it. + break; + } + // Compute a tentative new simplex vertex using support points. + var vertex = vertices[simplex.m_count]; // SimplexVertex + vertex.indexA = proxyA.getSupport(Rot.mulTVec2(xfA.q, Vec2.neg(d))); + vertex.wA = Transform.mulVec2(xfA, proxyA.getVertex(vertex.indexA)); + vertex.indexB = proxyB.getSupport(Rot.mulTVec2(xfB.q, d)); + vertex.wB = Transform.mulVec2(xfB, proxyB.getVertex(vertex.indexB)); + vertex.w = Vec2.sub(vertex.wB, vertex.wA); + // Iteration count is equated to the number of support point calls. + ++iter; + ++stats.gjkIters; + // Check for duplicate support points. This is the main termination + // criteria. + var duplicate = false; + for (var i = 0; i < saveCount; ++i) { + if (vertex.indexA === saveA[i] && vertex.indexB === saveB[i]) { + duplicate = true; + break; + } + } + // If we found a duplicate support point we must exit to avoid cycling. + if (duplicate) { + break; + } + // New vertex is ok and needed. + ++simplex.m_count; + } + stats.gjkMaxIters = math.max(stats.gjkMaxIters, iter); + // Prepare output. + simplex.getWitnessPoints(output.pointA, output.pointB); + output.distance = Vec2.distance(output.pointA, output.pointB); + output.iterations = iter; + // Cache the simplex. + simplex.writeCache(cache); + // Apply radii if requested. + if (input.useRadii) { + var rA = proxyA.m_radius; + var rB = proxyB.m_radius; + if (output.distance > rA + rB && output.distance > math.EPSILON) { + // Shapes are still no overlapped. + // Move the witness points to the outer surface. + output.distance -= rA + rB; + var normal = Vec2.sub(output.pointB, output.pointA); + normal.normalize(); + output.pointA.addMul(rA, normal); + output.pointB.subMul(rB, normal); + } + else { + // Shapes are overlapped when radii are considered. + // Move the witness points to the middle. + var p = Vec2.mid(output.pointA, output.pointB); + output.pointA.setVec2(p); + output.pointB.setVec2(p); + output.distance = 0.0; + } + } +}; +/** + * A distance proxy is used by the GJK algorithm. It encapsulates any shape. + */ +var DistanceProxy = /** @class */ (function () { + function DistanceProxy() { + this.m_buffer = []; // Vec2[2] + this.m_vertices = []; // Vec2[] + this.m_count = 0; + this.m_radius = 0; + } + /** + * Get the vertex count. + */ + DistanceProxy.prototype.getVertexCount = function () { + return this.m_count; + }; + /** + * Get a vertex by index. Used by Distance. + */ + DistanceProxy.prototype.getVertex = function (index) { + return this.m_vertices[index]; + }; + /** + * Get the supporting vertex index in the given direction. + */ + DistanceProxy.prototype.getSupport = function (d) { + var bestIndex = 0; + var bestValue = Vec2.dot(this.m_vertices[0], d); + for (var i = 0; i < this.m_count; ++i) { + var value = Vec2.dot(this.m_vertices[i], d); + if (value > bestValue) { + bestIndex = i; + bestValue = value; + } + } + return bestIndex; + }; + /** + * Get the supporting vertex in the given direction. + */ + DistanceProxy.prototype.getSupportVertex = function (d) { + return this.m_vertices[this.getSupport(d)]; + }; + /** + * Initialize the proxy using the given shape. The shape must remain in scope + * while the proxy is in use. + */ + DistanceProxy.prototype.set = function (shape, index) { + shape.computeDistanceProxy(this, index); + }; + return DistanceProxy; +}()); +var SimplexVertex = /** @class */ (function () { + function SimplexVertex() { + /** support point in proxyA */ + this.wA = Vec2.zero(); + /** support point in proxyB */ + this.wB = Vec2.zero(); + /** wB - wA; */ + this.w = Vec2.zero(); + } + SimplexVertex.prototype.set = function (v) { + this.indexA = v.indexA; + this.indexB = v.indexB; + this.wA = Vec2.clone(v.wA); + this.wB = Vec2.clone(v.wB); + this.w = Vec2.clone(v.w); + this.a = v.a; + }; + return SimplexVertex; +}()); +var Simplex = /** @class */ (function () { + function Simplex() { + this.m_v1 = new SimplexVertex(); + this.m_v2 = new SimplexVertex(); + this.m_v3 = new SimplexVertex(); + this.m_v = [this.m_v1, this.m_v2, this.m_v3]; + this.m_count; + } + /** @internal */ + Simplex.prototype.toString = function () { + if (this.m_count === 3) { + return ["+" + this.m_count, + this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y, + this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y, + this.m_v3.a, this.m_v3.wA.x, this.m_v3.wA.y, this.m_v3.wB.x, this.m_v3.wB.y + ].toString(); + } + else if (this.m_count === 2) { + return ["+" + this.m_count, + this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y, + this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y + ].toString(); + } + else if (this.m_count === 1) { + return ["+" + this.m_count, + this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y + ].toString(); + } + else { + return "+" + this.m_count; + } + }; + Simplex.prototype.readCache = function (cache, proxyA, transformA, proxyB, transformB) { + // Copy data from cache. + this.m_count = cache.count; + for (var i = 0; i < this.m_count; ++i) { + var v = this.m_v[i]; + v.indexA = cache.indexA[i]; + v.indexB = cache.indexB[i]; + var wALocal = proxyA.getVertex(v.indexA); + var wBLocal = proxyB.getVertex(v.indexB); + v.wA = Transform.mulVec2(transformA, wALocal); + v.wB = Transform.mulVec2(transformB, wBLocal); + v.w = Vec2.sub(v.wB, v.wA); + v.a = 0.0; + } + // Compute the new simplex metric, if it is substantially different than + // old metric then flush the simplex. + if (this.m_count > 1) { + var metric1 = cache.metric; + var metric2 = this.getMetric(); + if (metric2 < 0.5 * metric1 || 2.0 * metric1 < metric2 + || metric2 < math.EPSILON) { + // Reset the simplex. + this.m_count = 0; + } + } + // If the cache is empty or invalid... + if (this.m_count === 0) { + var v = this.m_v[0]; + v.indexA = 0; + v.indexB = 0; + var wALocal = proxyA.getVertex(0); + var wBLocal = proxyB.getVertex(0); + v.wA = Transform.mulVec2(transformA, wALocal); + v.wB = Transform.mulVec2(transformB, wBLocal); + v.w = Vec2.sub(v.wB, v.wA); + v.a = 1.0; + this.m_count = 1; + } + }; + Simplex.prototype.writeCache = function (cache) { + cache.metric = this.getMetric(); + cache.count = this.m_count; + for (var i = 0; i < this.m_count; ++i) { + cache.indexA[i] = this.m_v[i].indexA; + cache.indexB[i] = this.m_v[i].indexB; + } + }; + Simplex.prototype.getSearchDirection = function () { + switch (this.m_count) { + case 1: + return Vec2.neg(this.m_v1.w); + case 2: { + var e12 = Vec2.sub(this.m_v2.w, this.m_v1.w); + var sgn = Vec2.crossVec2Vec2(e12, Vec2.neg(this.m_v1.w)); + if (sgn > 0.0) { + // Origin is left of e12. + return Vec2.crossNumVec2(1.0, e12); + } + else { + // Origin is right of e12. + return Vec2.crossVec2Num(e12, 1.0); + } + } + default: + return Vec2.zero(); + } + }; + Simplex.prototype.getClosestPoint = function () { + switch (this.m_count) { + case 0: + return Vec2.zero(); + case 1: + return Vec2.clone(this.m_v1.w); + case 2: + return Vec2.combine(this.m_v1.a, this.m_v1.w, this.m_v2.a, this.m_v2.w); + case 3: + return Vec2.zero(); + default: + return Vec2.zero(); + } + }; + Simplex.prototype.getWitnessPoints = function (pA, pB) { + switch (this.m_count) { + case 0: + break; + case 1: + pA.setVec2(this.m_v1.wA); + pB.setVec2(this.m_v1.wB); + break; + case 2: + pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA); + pB.setCombine(this.m_v1.a, this.m_v1.wB, this.m_v2.a, this.m_v2.wB); + break; + case 3: + pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA); + pA.addMul(this.m_v3.a, this.m_v3.wA); + pB.setVec2(pA); + break; + } + }; + Simplex.prototype.getMetric = function () { + switch (this.m_count) { + case 0: + return 0.0; + case 1: + return 0.0; + case 2: + return Vec2.distance(this.m_v1.w, this.m_v2.w); + case 3: + return Vec2.crossVec2Vec2(Vec2.sub(this.m_v2.w, this.m_v1.w), Vec2.sub(this.m_v3.w, this.m_v1.w)); + default: + return 0.0; + } + }; + Simplex.prototype.solve = function () { + switch (this.m_count) { + case 1: + break; + case 2: + this.solve2(); + break; + case 3: + this.solve3(); + break; + } + }; + // Solve a line segment using barycentric coordinates. + // + // p = a1 * w1 + a2 * w2 + // a1 + a2 = 1 + // + // The vector from the origin to the closest point on the line is + // perpendicular to the line. + // e12 = w2 - w1 + // dot(p, e) = 0 + // a1 * dot(w1, e) + a2 * dot(w2, e) = 0 + // + // 2-by-2 linear system + // [1 1 ][a1] = [1] + // [w1.e12 w2.e12][a2] = [0] + // + // Define + // d12_1 = dot(w2, e12) + // d12_2 = -dot(w1, e12) + // d12 = d12_1 + d12_2 + // + // Solution + // a1 = d12_1 / d12 + // a2 = d12_2 / d12 + Simplex.prototype.solve2 = function () { + var w1 = this.m_v1.w; + var w2 = this.m_v2.w; + var e12 = Vec2.sub(w2, w1); + // w1 region + var d12_2 = -Vec2.dot(w1, e12); + if (d12_2 <= 0.0) { + // a2 <= 0, so we clamp it to 0 + this.m_v1.a = 1.0; + this.m_count = 1; + return; + } + // w2 region + var d12_1 = Vec2.dot(w2, e12); + if (d12_1 <= 0.0) { + // a1 <= 0, so we clamp it to 0 + this.m_v2.a = 1.0; + this.m_count = 1; + this.m_v1.set(this.m_v2); + return; + } + // Must be in e12 region. + var inv_d12 = 1.0 / (d12_1 + d12_2); + this.m_v1.a = d12_1 * inv_d12; + this.m_v2.a = d12_2 * inv_d12; + this.m_count = 2; + }; + // Possible regions: + // - points[2] + // - edge points[0]-points[2] + // - edge points[1]-points[2] + // - inside the triangle + Simplex.prototype.solve3 = function () { + var w1 = this.m_v1.w; + var w2 = this.m_v2.w; + var w3 = this.m_v3.w; + // Edge12 + // [1 1 ][a1] = [1] + // [w1.e12 w2.e12][a2] = [0] + // a3 = 0 + var e12 = Vec2.sub(w2, w1); + var w1e12 = Vec2.dot(w1, e12); + var w2e12 = Vec2.dot(w2, e12); + var d12_1 = w2e12; + var d12_2 = -w1e12; + // Edge13 + // [1 1 ][a1] = [1] + // [w1.e13 w3.e13][a3] = [0] + // a2 = 0 + var e13 = Vec2.sub(w3, w1); + var w1e13 = Vec2.dot(w1, e13); + var w3e13 = Vec2.dot(w3, e13); + var d13_1 = w3e13; + var d13_2 = -w1e13; + // Edge23 + // [1 1 ][a2] = [1] + // [w2.e23 w3.e23][a3] = [0] + // a1 = 0 + var e23 = Vec2.sub(w3, w2); + var w2e23 = Vec2.dot(w2, e23); + var w3e23 = Vec2.dot(w3, e23); + var d23_1 = w3e23; + var d23_2 = -w2e23; + // Triangle123 + var n123 = Vec2.crossVec2Vec2(e12, e13); + var d123_1 = n123 * Vec2.crossVec2Vec2(w2, w3); + var d123_2 = n123 * Vec2.crossVec2Vec2(w3, w1); + var d123_3 = n123 * Vec2.crossVec2Vec2(w1, w2); + // w1 region + if (d12_2 <= 0.0 && d13_2 <= 0.0) { + this.m_v1.a = 1.0; + this.m_count = 1; + return; + } + // e12 + if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) { + var inv_d12 = 1.0 / (d12_1 + d12_2); + this.m_v1.a = d12_1 * inv_d12; + this.m_v2.a = d12_2 * inv_d12; + this.m_count = 2; + return; + } + // e13 + if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) { + var inv_d13 = 1.0 / (d13_1 + d13_2); + this.m_v1.a = d13_1 * inv_d13; + this.m_v3.a = d13_2 * inv_d13; + this.m_count = 2; + this.m_v2.set(this.m_v3); + return; + } + // w2 region + if (d12_1 <= 0.0 && d23_2 <= 0.0) { + this.m_v2.a = 1.0; + this.m_count = 1; + this.m_v1.set(this.m_v2); + return; + } + // w3 region + if (d13_1 <= 0.0 && d23_1 <= 0.0) { + this.m_v3.a = 1.0; + this.m_count = 1; + this.m_v1.set(this.m_v3); + return; + } + // e23 + if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) { + var inv_d23 = 1.0 / (d23_1 + d23_2); + this.m_v2.a = d23_1 * inv_d23; + this.m_v3.a = d23_2 * inv_d23; + this.m_count = 2; + this.m_v1.set(this.m_v3); + return; + } + // Must be in triangle123 + var inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3); + this.m_v1.a = d123_1 * inv_d123; + this.m_v2.a = d123_2 * inv_d123; + this.m_v3.a = d123_3 * inv_d123; + this.m_count = 3; + }; + return Simplex; +}()); +/** + * Determine if two generic shapes overlap. + */ +var testOverlap = function (shapeA, indexA, shapeB, indexB, xfA, xfB) { + var input = new DistanceInput(); + input.proxyA.set(shapeA, indexA); + input.proxyB.set(shapeB, indexB); + input.transformA = xfA; + input.transformB = xfB; + input.useRadii = true; + var cache = new SimplexCache(); + var output = new DistanceOutput(); + Distance(output, cache, input); + return output.distance < 10.0 * math.EPSILON; +}; +// legacy exports +Distance.testOverlap = testOverlap; +Distance.Input = DistanceInput; +Distance.Output = DistanceOutput; +Distance.Proxy = DistanceProxy; +Distance.Cache = SimplexCache; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * Input parameters for TimeOfImpact. + */ +var TOIInput = /** @class */ (function () { + function TOIInput() { + this.proxyA = new DistanceProxy(); + this.proxyB = new DistanceProxy(); + this.sweepA = new Sweep(); + this.sweepB = new Sweep(); + } + return TOIInput; +}()); +exports.TOIOutputState = void 0; +(function (TOIOutputState) { + TOIOutputState[TOIOutputState["e_unknown"] = 0] = "e_unknown"; + TOIOutputState[TOIOutputState["e_failed"] = 1] = "e_failed"; + TOIOutputState[TOIOutputState["e_overlapped"] = 2] = "e_overlapped"; + TOIOutputState[TOIOutputState["e_touching"] = 3] = "e_touching"; + TOIOutputState[TOIOutputState["e_separated"] = 4] = "e_separated"; +})(exports.TOIOutputState || (exports.TOIOutputState = {})); +/** + * Output parameters for TimeOfImpact. + */ +var TOIOutput = /** @class */ (function () { + function TOIOutput() { + } + return TOIOutput; +}()); +stats.toiTime = 0; +stats.toiMaxTime = 0; +stats.toiCalls = 0; +stats.toiIters = 0; +stats.toiMaxIters = 0; +stats.toiRootIters = 0; +stats.toiMaxRootIters = 0; +/** + * Compute the upper bound on time before two shapes penetrate. Time is + * represented as a fraction between [0,tMax]. This uses a swept separating axis + * and may miss some intermediate, non-tunneling collision. If you change the + * time interval, you should call this function again. + * + * Note: use Distance to compute the contact point and normal at the time of + * impact. + * + * CCD via the local separating axis method. This seeks progression by computing + * the largest time at which separation is maintained. + */ +var TimeOfImpact = function (output, input) { + var timer = Timer.now(); + ++stats.toiCalls; + output.state = exports.TOIOutputState.e_unknown; + output.t = input.tMax; + var proxyA = input.proxyA; // DistanceProxy + var proxyB = input.proxyB; // DistanceProxy + var sweepA = input.sweepA; // Sweep + var sweepB = input.sweepB; // Sweep + // Large rotations can make the root finder fail, so we normalize the + // sweep angles. + sweepA.normalize(); + sweepB.normalize(); + var tMax = input.tMax; + var totalRadius = proxyA.m_radius + proxyB.m_radius; + var target = math.max(Settings.linearSlop, totalRadius - 3.0 * Settings.linearSlop); + var tolerance = 0.25 * Settings.linearSlop; + var t1 = 0.0; + var k_maxIterations = Settings.maxTOIIterations; + var iter = 0; + // Prepare input for distance query. + var cache = new SimplexCache(); + var distanceInput = new DistanceInput(); + distanceInput.proxyA = input.proxyA; + distanceInput.proxyB = input.proxyB; + distanceInput.useRadii = false; + // The outer loop progressively attempts to compute new separating axes. + // This loop terminates when an axis is repeated (no progress is made). + while (true) { + var xfA = Transform.identity(); + var xfB = Transform.identity(); + sweepA.getTransform(xfA, t1); + sweepB.getTransform(xfB, t1); + // Get the distance between shapes. We can also use the results + // to get a separating axis. + distanceInput.transformA = xfA; + distanceInput.transformB = xfB; + var distanceOutput = new DistanceOutput(); + Distance(distanceOutput, cache, distanceInput); + // If the shapes are overlapped, we give up on continuous collision. + if (distanceOutput.distance <= 0.0) { + // Failure! + output.state = exports.TOIOutputState.e_overlapped; + output.t = 0.0; + break; + } + if (distanceOutput.distance < target + tolerance) { + // Victory! + output.state = exports.TOIOutputState.e_touching; + output.t = t1; + break; + } + // Initialize the separating axis. + var fcn = new SeparationFunction(); + fcn.initialize(cache, proxyA, sweepA, proxyB, sweepB, t1); + // if (false) { + // // Dump the curve seen by the root finder + // const N = 100; + // const dx = 1.0 / N; + // const xs = []; // [ N + 1 ]; + // const fs = []; // [ N + 1 ]; + // const x = 0.0; + // for (const i = 0; i <= N; ++i) { + // sweepA.getTransform(xfA, x); + // sweepB.getTransform(xfB, x); + // const f = fcn.evaluate(xfA, xfB) - target; + // printf("%g %g\n", x, f); + // xs[i] = x; + // fs[i] = f; + // x += dx; + // } + // } + // Compute the TOI on the separating axis. We do this by successively + // resolving the deepest point. This loop is bounded by the number of + // vertices. + var done = false; + var t2 = tMax; + var pushBackIter = 0; + while (true) { + // Find the deepest point at t2. Store the witness point indices. + var s2 = fcn.findMinSeparation(t2); + // const indexA = fcn.indexA; + // const indexB = fcn.indexB; + // Is the final configuration separated? + if (s2 > target + tolerance) { + // Victory! + output.state = exports.TOIOutputState.e_separated; + output.t = tMax; + done = true; + break; + } + // Has the separation reached tolerance? + if (s2 > target - tolerance) { + // Advance the sweeps + t1 = t2; + break; + } + // Compute the initial separation of the witness points. + var s1 = fcn.evaluate(t1); + // const indexA = fcn.indexA; + // const indexB = fcn.indexB; + // Check for initial overlap. This might happen if the root finder + // runs out of iterations. + if (s1 < target - tolerance) { + output.state = exports.TOIOutputState.e_failed; + output.t = t1; + done = true; + break; + } + // Check for touching + if (s1 <= target + tolerance) { + // Victory! t1 should hold the TOI (could be 0.0). + output.state = exports.TOIOutputState.e_touching; + output.t = t1; + done = true; + break; + } + // Compute 1D root of: f(x) - target = 0 + var rootIterCount = 0; + var a1 = t1; + var a2 = t2; + while (true) { + // Use a mix of the secant rule and bisection. + var t = void 0; + if (rootIterCount & 1) { + // Secant rule to improve convergence. + t = a1 + (target - s1) * (a2 - a1) / (s2 - s1); + } + else { + // Bisection to guarantee progress. + t = 0.5 * (a1 + a2); + } + ++rootIterCount; + ++stats.toiRootIters; + var s = fcn.evaluate(t); + fcn.indexA; + fcn.indexB; + if (math.abs(s - target) < tolerance) { + // t2 holds a tentative value for t1 + t2 = t; + break; + } + // Ensure we continue to bracket the root. + if (s > target) { + a1 = t; + s1 = s; + } + else { + a2 = t; + s2 = s; + } + if (rootIterCount === 50) { + break; + } + } + stats.toiMaxRootIters = math.max(stats.toiMaxRootIters, rootIterCount); + ++pushBackIter; + if (pushBackIter === Settings.maxPolygonVertices) { + break; + } + } + ++iter; + ++stats.toiIters; + if (done) { + break; + } + if (iter === k_maxIterations) { + // Root finder got stuck. Semi-victory. + output.state = exports.TOIOutputState.e_failed; + output.t = t1; + break; + } + } + stats.toiMaxIters = math.max(stats.toiMaxIters, iter); + var time = Timer.diff(timer); + stats.toiMaxTime = math.max(stats.toiMaxTime, time); + stats.toiTime += time; +}; +var SeparationFunctionType; +(function (SeparationFunctionType) { + SeparationFunctionType[SeparationFunctionType["e_points"] = 1] = "e_points"; + SeparationFunctionType[SeparationFunctionType["e_faceA"] = 2] = "e_faceA"; + SeparationFunctionType[SeparationFunctionType["e_faceB"] = 3] = "e_faceB"; +})(SeparationFunctionType || (SeparationFunctionType = {})); +var SeparationFunction = /** @class */ (function () { + function SeparationFunction() { + this.m_proxyA = new DistanceProxy(); + this.m_proxyB = new DistanceProxy(); + this.m_localPoint = Vec2.zero(); + this.m_axis = Vec2.zero(); + } + // TODO_ERIN might not need to return the separation + SeparationFunction.prototype.initialize = function (cache, proxyA, sweepA, proxyB, sweepB, t1) { + this.m_proxyA = proxyA; + this.m_proxyB = proxyB; + var count = cache.count; + this.m_sweepA = sweepA; + this.m_sweepB = sweepB; + var xfA = Transform.identity(); + var xfB = Transform.identity(); + this.m_sweepA.getTransform(xfA, t1); + this.m_sweepB.getTransform(xfB, t1); + if (count === 1) { + this.m_type = SeparationFunctionType.e_points; + var localPointA = this.m_proxyA.getVertex(cache.indexA[0]); + var localPointB = this.m_proxyB.getVertex(cache.indexB[0]); + var pointA = Transform.mulVec2(xfA, localPointA); + var pointB = Transform.mulVec2(xfB, localPointB); + this.m_axis.setCombine(1, pointB, -1, pointA); + var s = this.m_axis.normalize(); + return s; + } + else if (cache.indexA[0] === cache.indexA[1]) { + // Two points on B and one on A. + this.m_type = SeparationFunctionType.e_faceB; + var localPointB1 = proxyB.getVertex(cache.indexB[0]); + var localPointB2 = proxyB.getVertex(cache.indexB[1]); + this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointB2, localPointB1), 1.0); + this.m_axis.normalize(); + var normal = Rot.mulVec2(xfB.q, this.m_axis); + this.m_localPoint = Vec2.mid(localPointB1, localPointB2); + var pointB = Transform.mulVec2(xfB, this.m_localPoint); + var localPointA = proxyA.getVertex(cache.indexA[0]); + var pointA = Transform.mulVec2(xfA, localPointA); + var s = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal); + if (s < 0.0) { + this.m_axis = Vec2.neg(this.m_axis); + s = -s; + } + return s; + } + else { + // Two points on A and one or two points on B. + this.m_type = SeparationFunctionType.e_faceA; + var localPointA1 = this.m_proxyA.getVertex(cache.indexA[0]); + var localPointA2 = this.m_proxyA.getVertex(cache.indexA[1]); + this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointA2, localPointA1), 1.0); + this.m_axis.normalize(); + var normal = Rot.mulVec2(xfA.q, this.m_axis); + this.m_localPoint = Vec2.mid(localPointA1, localPointA2); + var pointA = Transform.mulVec2(xfA, this.m_localPoint); + var localPointB = this.m_proxyB.getVertex(cache.indexB[0]); + var pointB = Transform.mulVec2(xfB, localPointB); + var s = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal); + if (s < 0.0) { + this.m_axis = Vec2.neg(this.m_axis); + s = -s; + } + return s; + } + }; + SeparationFunction.prototype.compute = function (find, t) { + // It was findMinSeparation and evaluate + var xfA = Transform.identity(); + var xfB = Transform.identity(); + this.m_sweepA.getTransform(xfA, t); + this.m_sweepB.getTransform(xfB, t); + switch (this.m_type) { + case SeparationFunctionType.e_points: { + if (find) { + var axisA = Rot.mulTVec2(xfA.q, this.m_axis); + var axisB = Rot.mulTVec2(xfB.q, Vec2.neg(this.m_axis)); + this.indexA = this.m_proxyA.getSupport(axisA); + this.indexB = this.m_proxyB.getSupport(axisB); + } + var localPointA = this.m_proxyA.getVertex(this.indexA); + var localPointB = this.m_proxyB.getVertex(this.indexB); + var pointA = Transform.mulVec2(xfA, localPointA); + var pointB = Transform.mulVec2(xfB, localPointB); + var sep = Vec2.dot(pointB, this.m_axis) - Vec2.dot(pointA, this.m_axis); + return sep; + } + case SeparationFunctionType.e_faceA: { + var normal = Rot.mulVec2(xfA.q, this.m_axis); + var pointA = Transform.mulVec2(xfA, this.m_localPoint); + if (find) { + var axisB = Rot.mulTVec2(xfB.q, Vec2.neg(normal)); + this.indexA = -1; + this.indexB = this.m_proxyB.getSupport(axisB); + } + var localPointB = this.m_proxyB.getVertex(this.indexB); + var pointB = Transform.mulVec2(xfB, localPointB); + var sep = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal); + return sep; + } + case SeparationFunctionType.e_faceB: { + var normal = Rot.mulVec2(xfB.q, this.m_axis); + var pointB = Transform.mulVec2(xfB, this.m_localPoint); + if (find) { + var axisA = Rot.mulTVec2(xfA.q, Vec2.neg(normal)); + this.indexB = -1; + this.indexA = this.m_proxyA.getSupport(axisA); + } + var localPointA = this.m_proxyA.getVertex(this.indexA); + var pointA = Transform.mulVec2(xfA, localPointA); + var sep = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal); + return sep; + } + default: + if (find) { + this.indexA = -1; + this.indexB = -1; + } + return 0.0; + } + }; + SeparationFunction.prototype.findMinSeparation = function (t) { + return this.compute(true, t); + }; + SeparationFunction.prototype.evaluate = function (t) { + return this.compute(false, t); + }; + return SeparationFunction; +}()); +new SeparationFunction(); +// legacy exports +TimeOfImpact.Input = TOIInput; +TimeOfImpact.Output = TOIOutput; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var TimeStep = /** @class */ (function () { + function TimeStep() { + /** time step */ + this.dt = 0; + /** inverse time step (0 if dt == 0) */ + this.inv_dt = 0; + this.velocityIterations = 0; + this.positionIterations = 0; + this.warmStarting = false; + this.blockSolve = true; + /** timestep ratio for variable timestep */ + this.inv_dt0 = 0.0; + /** dt * inv_dt0 */ + this.dtRatio = 1; + } + TimeStep.prototype.reset = function (dt) { + if (this.dt > 0.0) { + this.inv_dt0 = this.inv_dt; + } + this.dt = dt; + this.inv_dt = dt == 0 ? 0 : 1 / dt; + this.dtRatio = dt * this.inv_dt0; + }; + return TimeStep; +}()); +// reuse +var s_subStep = new TimeStep(); +/** + * Contact impulses for reporting. Impulses are used instead of forces because + * sub-step forces may approach infinity for rigid body collisions. These match + * up one-to-one with the contact points in Manifold. + */ +var ContactImpulse = /** @class */ (function () { + function ContactImpulse(contact) { + this.contact = contact; + this.normals = []; + this.tangents = []; + } + Object.defineProperty(ContactImpulse.prototype, "normalImpulses", { + get: function () { + var contact = this.contact; + var normals = this.normals; + normals.length = 0; + for (var p = 0; p < contact.v_points.length; ++p) { + normals.push(contact.v_points[p].normalImpulse); + } + return normals; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContactImpulse.prototype, "tangentImpulses", { + get: function () { + var contact = this.contact; + var tangents = this.tangents; + tangents.length = 0; + for (var p = 0; p < contact.v_points.length; ++p) { + tangents.push(contact.v_points[p].tangentImpulse); + } + return tangents; + }, + enumerable: false, + configurable: true + }); + return ContactImpulse; +}()); +/** + * Finds and solves islands. An island is a connected subset of the world. + */ +var Solver = /** @class */ (function () { + function Solver(world) { + this.m_world = world; + this.m_stack = []; + this.m_bodies = []; + this.m_contacts = []; + this.m_joints = []; + } + Solver.prototype.clear = function () { + this.m_stack.length = 0; + this.m_bodies.length = 0; + this.m_contacts.length = 0; + this.m_joints.length = 0; + }; + Solver.prototype.addBody = function (body) { + this.m_bodies.push(body); + // why? + // body.c_position.c.setZero(); + // body.c_position.a = 0; + // body.c_velocity.v.setZero(); + // body.c_velocity.w = 0; + }; + Solver.prototype.addContact = function (contact) { + // false && console.assert(contact instanceof Contact, 'Not a Contact!', contact); + this.m_contacts.push(contact); + }; + Solver.prototype.addJoint = function (joint) { + this.m_joints.push(joint); + }; + Solver.prototype.solveWorld = function (step) { + var world = this.m_world; + // Clear all the island flags. + for (var b = world.m_bodyList; b; b = b.m_next) { + b.m_islandFlag = false; + } + for (var c = world.m_contactList; c; c = c.m_next) { + c.m_islandFlag = false; + } + for (var j = world.m_jointList; j; j = j.m_next) { + j.m_islandFlag = false; + } + // Build and simulate all awake islands. + var stack = this.m_stack; + for (var seed = world.m_bodyList; seed; seed = seed.m_next) { + if (seed.m_islandFlag) { + continue; + } + if (seed.isAwake() == false || seed.isActive() == false) { + continue; + } + // The seed can be dynamic or kinematic. + if (seed.isStatic()) { + continue; + } + // Reset island and stack. + this.clear(); + stack.push(seed); + seed.m_islandFlag = true; + // Perform a depth first search (DFS) on the constraint graph. + while (stack.length > 0) { + // Grab the next body off the stack and add it to the island. + var b = stack.pop(); + this.addBody(b); + // Make sure the body is awake. + b.setAwake(true); + // To keep islands as small as possible, we don't + // propagate islands across static bodies. + if (b.isStatic()) { + continue; + } + // Search all contacts connected to this body. + for (var ce = b.m_contactList; ce; ce = ce.next) { + var contact = ce.contact; + // Has this contact already been added to an island? + if (contact.m_islandFlag) { + continue; + } + // Is this contact solid and touching? + if (contact.isEnabled() == false || contact.isTouching() == false) { + continue; + } + // Skip sensors. + var sensorA = contact.m_fixtureA.m_isSensor; + var sensorB = contact.m_fixtureB.m_isSensor; + if (sensorA || sensorB) { + continue; + } + this.addContact(contact); + contact.m_islandFlag = true; + var other = ce.other; + // Was the other body already added to this island? + if (other.m_islandFlag) { + continue; + } + // false && console.assert(stack.length < world.m_bodyCount); + stack.push(other); + other.m_islandFlag = true; + } + // Search all joints connect to this body. + for (var je = b.m_jointList; je; je = je.next) { + if (je.joint.m_islandFlag == true) { + continue; + } + var other = je.other; + // Don't simulate joints connected to inactive bodies. + if (other.isActive() == false) { + continue; + } + this.addJoint(je.joint); + je.joint.m_islandFlag = true; + if (other.m_islandFlag) { + continue; + } + // false && console.assert(stack.length < world.m_bodyCount); + stack.push(other); + other.m_islandFlag = true; + } + } + this.solveIsland(step); + // Post solve cleanup. + for (var i = 0; i < this.m_bodies.length; ++i) { + // Allow static bodies to participate in other islands. + // TODO: are they added at all? + var b = this.m_bodies[i]; + if (b.isStatic()) { + b.m_islandFlag = false; + } + } + } + }; + Solver.prototype.solveIsland = function (step) { + // B2: Island Solve + var world = this.m_world; + var gravity = world.m_gravity; + var allowSleep = world.m_allowSleep; + var h = step.dt; + // Integrate velocities and apply damping. Initialize the body state. + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + var c = Vec2.clone(body.m_sweep.c); + var a = body.m_sweep.a; + var v = Vec2.clone(body.m_linearVelocity); + var w = body.m_angularVelocity; + // Store positions for continuous collision. + body.m_sweep.c0.setVec2(body.m_sweep.c); + body.m_sweep.a0 = body.m_sweep.a; + if (body.isDynamic()) { + // Integrate velocities. + v.addMul(h * body.m_gravityScale, gravity); + v.addMul(h * body.m_invMass, body.m_force); + w += h * body.m_invI * body.m_torque; + /** + *
+                 * Apply damping.
+                 * ODE: dv/dt + c * v = 0
+                 * Solution: v(t) = v0 * exp(-c * t)
+                 * Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)
+                 * v2 = exp(-c * dt) * v1
+                 * Pade approximation:
+                 * v2 = v1 * 1 / (1 + c * dt)
+                 * 
+ */ + v.mul(1.0 / (1.0 + h * body.m_linearDamping)); + w *= 1.0 / (1.0 + h * body.m_angularDamping); + } + body.c_position.c = c; + body.c_position.a = a; + body.c_velocity.v = v; + body.c_velocity.w = w; + } + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.initConstraint(step); + } + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.initVelocityConstraint(step); + } + if (step.warmStarting) { + // Warm start. + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.warmStartConstraint(step); + } + } + for (var i = 0; i < this.m_joints.length; ++i) { + var joint = this.m_joints[i]; + joint.initVelocityConstraints(step); + } + // Solve velocity constraints + for (var i = 0; i < step.velocityIterations; ++i) { + for (var j = 0; j < this.m_joints.length; ++j) { + var joint = this.m_joints[j]; + joint.solveVelocityConstraints(step); + } + for (var j = 0; j < this.m_contacts.length; ++j) { + var contact = this.m_contacts[j]; + contact.solveVelocityConstraint(step); + } + } + // Store impulses for warm starting + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.storeConstraintImpulses(step); + } + // Integrate positions + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + var c = Vec2.clone(body.c_position.c); + var a = body.c_position.a; + var v = Vec2.clone(body.c_velocity.v); + var w = body.c_velocity.w; + // Check for large velocities + var translation = Vec2.mulNumVec2(h, v); + if (Vec2.lengthSquared(translation) > Settings.maxTranslationSquared) { + var ratio = Settings.maxTranslation / translation.length(); + v.mul(ratio); + } + var rotation = h * w; + if (rotation * rotation > Settings.maxRotationSquared) { + var ratio = Settings.maxRotation / math.abs(rotation); + w *= ratio; + } + // Integrate + c.addMul(h, v); + a += h * w; + body.c_position.c.setVec2(c); + body.c_position.a = a; + body.c_velocity.v.setVec2(v); + body.c_velocity.w = w; + } + // Solve position constraints + var positionSolved = false; + for (var i = 0; i < step.positionIterations; ++i) { + var minSeparation = 0.0; + for (var j = 0; j < this.m_contacts.length; ++j) { + var contact = this.m_contacts[j]; + var separation = contact.solvePositionConstraint(step); + minSeparation = math.min(minSeparation, separation); + } + // We can't expect minSpeparation >= -Settings.linearSlop because we don't + // push the separation above -Settings.linearSlop. + var contactsOkay = minSeparation >= -3.0 * Settings.linearSlop; + var jointsOkay = true; + for (var j = 0; j < this.m_joints.length; ++j) { + var joint = this.m_joints[j]; + var jointOkay = joint.solvePositionConstraints(step); + jointsOkay = jointsOkay && jointOkay; + } + if (contactsOkay && jointsOkay) { + // Exit early if the position errors are small. + positionSolved = true; + break; + } + } + // Copy state buffers back to the bodies + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + body.m_sweep.c.setVec2(body.c_position.c); + body.m_sweep.a = body.c_position.a; + body.m_linearVelocity.setVec2(body.c_velocity.v); + body.m_angularVelocity = body.c_velocity.w; + body.synchronizeTransform(); + } + this.postSolveIsland(); + if (allowSleep) { + var minSleepTime = Infinity; + var linTolSqr = Settings.linearSleepToleranceSqr; + var angTolSqr = Settings.angularSleepToleranceSqr; + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + if (body.isStatic()) { + continue; + } + if ((body.m_autoSleepFlag == false) + || (body.m_angularVelocity * body.m_angularVelocity > angTolSqr) + || (Vec2.lengthSquared(body.m_linearVelocity) > linTolSqr)) { + body.m_sleepTime = 0.0; + minSleepTime = 0.0; + } + else { + body.m_sleepTime += h; + minSleepTime = math.min(minSleepTime, body.m_sleepTime); + } + } + if (minSleepTime >= Settings.timeToSleep && positionSolved) { + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + body.setAwake(false); + } + } + } + }; + /** + * Find TOI contacts and solve them. + */ + Solver.prototype.solveWorldTOI = function (step) { + var world = this.m_world; + if (world.m_stepComplete) { + for (var b = world.m_bodyList; b; b = b.m_next) { + b.m_islandFlag = false; + b.m_sweep.alpha0 = 0.0; + } + for (var c = world.m_contactList; c; c = c.m_next) { + // Invalidate TOI + c.m_toiFlag = false; + c.m_islandFlag = false; + c.m_toiCount = 0; + c.m_toi = 1.0; + } + } + // Find TOI events and solve them. + while (true) { + // Find the first TOI. + var minContact = null; // Contact + var minAlpha = 1.0; + for (var c = world.m_contactList; c; c = c.m_next) { + // Is this contact disabled? + if (c.isEnabled() == false) { + continue; + } + // Prevent excessive sub-stepping. + if (c.m_toiCount > Settings.maxSubSteps) { + continue; + } + var alpha = 1.0; + if (c.m_toiFlag) { + // This contact has a valid cached TOI. + alpha = c.m_toi; + } + else { + var fA_1 = c.getFixtureA(); + var fB_1 = c.getFixtureB(); + // Is there a sensor? + if (fA_1.isSensor() || fB_1.isSensor()) { + continue; + } + var bA_1 = fA_1.getBody(); + var bB_1 = fB_1.getBody(); + var activeA = bA_1.isAwake() && !bA_1.isStatic(); + var activeB = bB_1.isAwake() && !bB_1.isStatic(); + // Is at least one body active (awake and dynamic or kinematic)? + if (activeA == false && activeB == false) { + continue; + } + var collideA = bA_1.isBullet() || !bA_1.isDynamic(); + var collideB = bB_1.isBullet() || !bB_1.isDynamic(); + // Are these two non-bullet dynamic bodies? + if (collideA == false && collideB == false) { + continue; + } + // Compute the TOI for this contact. + // Put the sweeps onto the same time interval. + var alpha0 = bA_1.m_sweep.alpha0; + if (bA_1.m_sweep.alpha0 < bB_1.m_sweep.alpha0) { + alpha0 = bB_1.m_sweep.alpha0; + bA_1.m_sweep.advance(alpha0); + } + else if (bB_1.m_sweep.alpha0 < bA_1.m_sweep.alpha0) { + alpha0 = bA_1.m_sweep.alpha0; + bB_1.m_sweep.advance(alpha0); + } + var indexA = c.getChildIndexA(); + var indexB = c.getChildIndexB(); + bA_1.m_sweep; + bB_1.m_sweep; + // Compute the time of impact in interval [0, minTOI] + var input = new TOIInput(); // TODO: reuse + input.proxyA.set(fA_1.getShape(), indexA); + input.proxyB.set(fB_1.getShape(), indexB); + input.sweepA.set(bA_1.m_sweep); + input.sweepB.set(bB_1.m_sweep); + input.tMax = 1.0; + var output = new TOIOutput(); // TODO: reuse + TimeOfImpact(output, input); + // Beta is the fraction of the remaining portion of the [time?]. + var beta = output.t; + if (output.state == exports.TOIOutputState.e_touching) { + alpha = math.min(alpha0 + (1.0 - alpha0) * beta, 1.0); + } + else { + alpha = 1.0; + } + c.m_toi = alpha; + c.m_toiFlag = true; + } + if (alpha < minAlpha) { + // This is the minimum TOI found so far. + minContact = c; + minAlpha = alpha; + } + } + if (minContact == null || 1.0 - 10.0 * math.EPSILON < minAlpha) { + // No more TOI events. Done! + world.m_stepComplete = true; + break; + } + // Advance the bodies to the TOI. + var fA = minContact.getFixtureA(); + var fB = minContact.getFixtureB(); + var bA = fA.getBody(); + var bB = fB.getBody(); + var backup1 = bA.m_sweep.clone(); + var backup2 = bB.m_sweep.clone(); + bA.advance(minAlpha); + bB.advance(minAlpha); + // The TOI contact likely has some new contact points. + minContact.update(world); + minContact.m_toiFlag = false; + ++minContact.m_toiCount; + // Is the contact solid? + if (minContact.isEnabled() == false || minContact.isTouching() == false) { + // Restore the sweeps. + minContact.setEnabled(false); + bA.m_sweep.set(backup1); + bB.m_sweep.set(backup2); + bA.synchronizeTransform(); + bB.synchronizeTransform(); + continue; + } + bA.setAwake(true); + bB.setAwake(true); + // Build the island + this.clear(); + this.addBody(bA); + this.addBody(bB); + this.addContact(minContact); + bA.m_islandFlag = true; + bB.m_islandFlag = true; + minContact.m_islandFlag = true; + // Get contacts on bodyA and bodyB. + var bodies = [bA, bB]; + for (var i = 0; i < bodies.length; ++i) { + var body = bodies[i]; + if (body.isDynamic()) { + for (var ce = body.m_contactList; ce; ce = ce.next) { + // if (this.m_bodyCount == this.m_bodyCapacity) { break; } + // if (this.m_contactCount == this.m_contactCapacity) { break; } + var contact = ce.contact; + // Has this contact already been added to the island? + if (contact.m_islandFlag) { + continue; + } + // Only add if either is static, kinematic or bullet. + var other = ce.other; + if (other.isDynamic() && !body.isBullet() && !other.isBullet()) { + continue; + } + // Skip sensors. + var sensorA = contact.m_fixtureA.m_isSensor; + var sensorB = contact.m_fixtureB.m_isSensor; + if (sensorA || sensorB) { + continue; + } + // Tentatively advance the body to the TOI. + var backup = other.m_sweep.clone(); + if (other.m_islandFlag == false) { + other.advance(minAlpha); + } + // Update the contact points + contact.update(world); + // Was the contact disabled by the user? + // Are there contact points? + if (contact.isEnabled() == false || contact.isTouching() == false) { + other.m_sweep.set(backup); + other.synchronizeTransform(); + continue; + } + // Add the contact to the island + contact.m_islandFlag = true; + this.addContact(contact); + // Has the other body already been added to the island? + if (other.m_islandFlag) { + continue; + } + // Add the other body to the island. + other.m_islandFlag = true; + if (!other.isStatic()) { + other.setAwake(true); + } + this.addBody(other); + } + } + } + s_subStep.reset((1.0 - minAlpha) * step.dt); + s_subStep.dtRatio = 1.0; + s_subStep.positionIterations = 20; + s_subStep.velocityIterations = step.velocityIterations; + s_subStep.warmStarting = false; + this.solveIslandTOI(s_subStep, bA, bB); + // Reset island flags and synchronize broad-phase proxies. + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + body.m_islandFlag = false; + if (!body.isDynamic()) { + continue; + } + body.synchronizeFixtures(); + // Invalidate all contact TOIs on this displaced body. + for (var ce = body.m_contactList; ce; ce = ce.next) { + ce.contact.m_toiFlag = false; + ce.contact.m_islandFlag = false; + } + } + // Commit fixture proxy movements to the broad-phase so that new contacts + // are created. + // Also, some contacts can be destroyed. + world.findNewContacts(); + if (world.m_subStepping) { + world.m_stepComplete = false; + break; + } + } + }; + Solver.prototype.solveIslandTOI = function (subStep, toiA, toiB) { + this.m_world; + // Initialize the body state. + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + body.c_position.c.setVec2(body.m_sweep.c); + body.c_position.a = body.m_sweep.a; + body.c_velocity.v.setVec2(body.m_linearVelocity); + body.c_velocity.w = body.m_angularVelocity; + } + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.initConstraint(subStep); + } + // Solve position constraints. + for (var i = 0; i < subStep.positionIterations; ++i) { + var minSeparation = 0.0; + for (var j = 0; j < this.m_contacts.length; ++j) { + var contact = this.m_contacts[j]; + var separation = contact.solvePositionConstraintTOI(subStep, toiA, toiB); + minSeparation = math.min(minSeparation, separation); + } + // We can't expect minSpeparation >= -Settings.linearSlop because we don't + // push the separation above -Settings.linearSlop. + var contactsOkay = minSeparation >= -1.5 * Settings.linearSlop; + if (contactsOkay) { + break; + } + } + var i, c; + // Leap of faith to new safe state. + toiA.m_sweep.c0.setVec2(toiA.c_position.c); + toiA.m_sweep.a0 = toiA.c_position.a; + toiB.m_sweep.c0.setVec2(toiB.c_position.c); + toiB.m_sweep.a0 = toiB.c_position.a; + // No warm starting is needed for TOI events because warm + // starting impulses were applied in the discrete solver. + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.initVelocityConstraint(subStep); + } + // Solve velocity constraints. + for (var i = 0; i < subStep.velocityIterations; ++i) { + for (var j = 0; j < this.m_contacts.length; ++j) { + var contact = this.m_contacts[j]; + contact.solveVelocityConstraint(subStep); + } + } + // Don't store the TOI contact forces for warm starting + // because they can be quite large. + var h = subStep.dt; + // Integrate positions + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + var c = Vec2.clone(body.c_position.c); + var a = body.c_position.a; + var v = Vec2.clone(body.c_velocity.v); + var w = body.c_velocity.w; + // Check for large velocities + var translation = Vec2.mulNumVec2(h, v); + if (Vec2.dot(translation, translation) > Settings.maxTranslationSquared) { + var ratio = Settings.maxTranslation / translation.length(); + v.mul(ratio); + } + var rotation = h * w; + if (rotation * rotation > Settings.maxRotationSquared) { + var ratio = Settings.maxRotation / math.abs(rotation); + w *= ratio; + } + // Integrate + c.addMul(h, v); + a += h * w; + body.c_position.c = c; + body.c_position.a = a; + body.c_velocity.v = v; + body.c_velocity.w = w; + // Sync bodies + body.m_sweep.c = c; + body.m_sweep.a = a; + body.m_linearVelocity = v; + body.m_angularVelocity = w; + body.synchronizeTransform(); + } + this.postSolveIsland(); + }; + /** @internal */ + Solver.prototype.postSolveIsland = function () { + for (var c = 0; c < this.m_contacts.length; ++c) { + var contact = this.m_contacts[c]; + this.m_world.postSolve(contact, contact.m_impulse); + } + }; + return Solver; +}()); +// @ts-ignore +Solver.TimeStep = TimeStep; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A 2-by-2 matrix. Stored in column-major order. + */ +var Mat22 = /** @class */ (function () { + // tslint:disable-next-line:typedef + function Mat22(a, b, c, d) { + if (typeof a === 'object' && a !== null) { + this.ex = Vec2.clone(a); + this.ey = Vec2.clone(b); + } + else if (typeof a === 'number') { + this.ex = Vec2.neo(a, c); + this.ey = Vec2.neo(b, d); + } + else { + this.ex = Vec2.zero(); + this.ey = Vec2.zero(); + } + } + /** @internal */ + Mat22.prototype.toString = function () { + return JSON.stringify(this); + }; + Mat22.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return Vec2.isValid(obj.ex) && Vec2.isValid(obj.ey); + }; + Mat22.assert = function (o) { + }; + // tslint:disable-next-line:typedef + Mat22.prototype.set = function (a, b, c, d) { + if (typeof a === 'number' && typeof b === 'number' && typeof c === 'number' + && typeof d === 'number') { + this.ex.setNum(a, c); + this.ey.setNum(b, d); + } + else if (typeof a === 'object' && typeof b === 'object') { + this.ex.setVec2(a); + this.ey.setVec2(b); + } + else if (typeof a === 'object') { + this.ex.setVec2(a.ex); + this.ey.setVec2(a.ey); + } + else ; + }; + Mat22.prototype.setIdentity = function () { + this.ex.x = 1.0; + this.ey.x = 0.0; + this.ex.y = 0.0; + this.ey.y = 1.0; + }; + Mat22.prototype.setZero = function () { + this.ex.x = 0.0; + this.ey.x = 0.0; + this.ex.y = 0.0; + this.ey.y = 0.0; + }; + Mat22.prototype.getInverse = function () { + var a = this.ex.x; + var b = this.ey.x; + var c = this.ex.y; + var d = this.ey.y; + var det = a * d - b * c; + if (det !== 0.0) { + det = 1.0 / det; + } + var imx = new Mat22(); + imx.ex.x = det * d; + imx.ey.x = -det * b; + imx.ex.y = -det * c; + imx.ey.y = det * a; + return imx; + }; + /** + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. + */ + Mat22.prototype.solve = function (v) { + var a = this.ex.x; + var b = this.ey.x; + var c = this.ex.y; + var d = this.ey.y; + var det = a * d - b * c; + if (det !== 0.0) { + det = 1.0 / det; + } + var w = Vec2.zero(); + w.x = det * (d * v.x - b * v.y); + w.y = det * (a * v.y - c * v.x); + return w; + }; + // tslint:disable-next-line:typedef + Mat22.mul = function (mx, v) { + if (v && 'x' in v && 'y' in v) { + var x = mx.ex.x * v.x + mx.ey.x * v.y; + var y = mx.ex.y * v.x + mx.ey.y * v.y; + return Vec2.neo(x, y); + } + else if (v && 'ex' in v && 'ey' in v) { // Mat22 + // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey)); + var a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y; + var b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y; + var c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y; + var d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y; + return new Mat22(a, b, c, d); + } + }; + Mat22.mulVec2 = function (mx, v) { + var x = mx.ex.x * v.x + mx.ey.x * v.y; + var y = mx.ex.y * v.x + mx.ey.y * v.y; + return Vec2.neo(x, y); + }; + Mat22.mulMat22 = function (mx, v) { + // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey)); + var a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y; + var b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y; + var c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y; + var d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y; + return new Mat22(a, b, c, d); + }; + // tslint:disable-next-line:typedef + Mat22.mulT = function (mx, v) { + if (v && 'x' in v && 'y' in v) { // Vec2 + return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey)); + } + else if (v && 'ex' in v && 'ey' in v) { // Mat22 + var c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex)); + var c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey)); + return new Mat22(c1, c2); + } + }; + Mat22.mulTVec2 = function (mx, v) { + return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey)); + }; + Mat22.mulTMat22 = function (mx, v) { + var c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex)); + var c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey)); + return new Mat22(c1, c2); + }; + Mat22.abs = function (mx) { + return new Mat22(Vec2.abs(mx.ex), Vec2.abs(mx.ey)); + }; + Mat22.add = function (mx1, mx2) { + return new Mat22(Vec2.add(mx1.ex, mx2.ex), Vec2.add(mx1.ey, mx2.ey)); + }; + return Mat22; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +exports.ManifoldType = void 0; +(function (ManifoldType) { + ManifoldType[ManifoldType["e_circles"] = 0] = "e_circles"; + ManifoldType[ManifoldType["e_faceA"] = 1] = "e_faceA"; + ManifoldType[ManifoldType["e_faceB"] = 2] = "e_faceB"; +})(exports.ManifoldType || (exports.ManifoldType = {})); +exports.ContactFeatureType = void 0; +(function (ContactFeatureType) { + ContactFeatureType[ContactFeatureType["e_vertex"] = 0] = "e_vertex"; + ContactFeatureType[ContactFeatureType["e_face"] = 1] = "e_face"; +})(exports.ContactFeatureType || (exports.ContactFeatureType = {})); +/** + * This is used for determining the state of contact points. + */ +exports.PointState = void 0; +(function (PointState) { + /** Point does not exist */ + PointState[PointState["nullState"] = 0] = "nullState"; + /** Point was added in the update */ + PointState[PointState["addState"] = 1] = "addState"; + /** Point persisted across the update */ + PointState[PointState["persistState"] = 2] = "persistState"; + /** Point was removed in the update */ + PointState[PointState["removeState"] = 3] = "removeState"; +})(exports.PointState || (exports.PointState = {})); +/** + * Used for computing contact manifolds. + */ +var ClipVertex = /** @class */ (function () { + function ClipVertex() { + this.v = Vec2.zero(); + this.id = new ContactID(); + } + ClipVertex.prototype.set = function (o) { + this.v.setVec2(o.v); + this.id.set(o.id); + }; + return ClipVertex; +}()); +/** + * A manifold for two touching convex shapes. Manifolds are created in `evaluate` + * method of Contact subclasses. + * + * Supported manifold types are e_faceA or e_faceB for clip point versus plane + * with radius and e_circles point versus point with radius. + * + * We store contacts in this way so that position correction can account for + * movement, which is critical for continuous physics. All contact scenarios + * must be expressed in one of these types. This structure is stored across time + * steps, so we keep it small. + * + * @prop type e_circle, e_faceA, e_faceB + * @prop localPoint Usage depends on manifold type:
+ * e_circles: the local center of circleA
+ * e_faceA: the center of faceA
+ * e_faceB: the center of faceB + * @prop localNormal Usage depends on manifold type:
+ * e_circles: not used
+ * e_faceA: the normal on polygonA
+ * e_faceB: the normal on polygonB + * @prop points The points of contact {ManifoldPoint[]} + * @prop pointCount The number of manifold points + */ +var Manifold = /** @class */ (function () { + function Manifold() { + this.localNormal = Vec2.zero(); + this.localPoint = Vec2.zero(); + this.points = [new ManifoldPoint(), new ManifoldPoint()]; + this.pointCount = 0; + } + /** + * Evaluate the manifold with supplied transforms. This assumes modest motion + * from the original state. This does not change the point count, impulses, etc. + * The radii must come from the shapes that generated the manifold. + */ + Manifold.prototype.getWorldManifold = function (wm, xfA, radiusA, xfB, radiusB) { + if (this.pointCount == 0) { + return; + } + wm = wm || new WorldManifold(); + var normal = wm.normal; + var points = wm.points; + var separations = wm.separations; + // TODO: improve + switch (this.type) { + case exports.ManifoldType.e_circles: { + normal = Vec2.neo(1.0, 0.0); + var pointA = Transform.mulVec2(xfA, this.localPoint); + var pointB = Transform.mulVec2(xfB, this.points[0].localPoint); + var dist = Vec2.sub(pointB, pointA); + if (Vec2.lengthSquared(dist) > math.EPSILON * math.EPSILON) { + normal.setVec2(dist); + normal.normalize(); + } + var cA = pointA.clone().addMul(radiusA, normal); + var cB = pointB.clone().addMul(-radiusB, normal); + points[0] = Vec2.mid(cA, cB); + separations[0] = Vec2.dot(Vec2.sub(cB, cA), normal); + points.length = 1; + separations.length = 1; + break; + } + case exports.ManifoldType.e_faceA: { + normal = Rot.mulVec2(xfA.q, this.localNormal); + var planePoint = Transform.mulVec2(xfA, this.localPoint); + for (var i = 0; i < this.pointCount; ++i) { + var clipPoint = Transform.mulVec2(xfB, this.points[i].localPoint); + var cA = Vec2.clone(clipPoint).addMul(radiusA - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal); + var cB = Vec2.clone(clipPoint).subMul(radiusB, normal); + points[i] = Vec2.mid(cA, cB); + separations[i] = Vec2.dot(Vec2.sub(cB, cA), normal); + } + points.length = this.pointCount; + separations.length = this.pointCount; + break; + } + case exports.ManifoldType.e_faceB: { + normal = Rot.mulVec2(xfB.q, this.localNormal); + var planePoint = Transform.mulVec2(xfB, this.localPoint); + for (var i = 0; i < this.pointCount; ++i) { + var clipPoint = Transform.mulVec2(xfA, this.points[i].localPoint); + var cB = Vec2.combine(1, clipPoint, radiusB - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal); + var cA = Vec2.combine(1, clipPoint, -radiusA, normal); + points[i] = Vec2.mid(cA, cB); + separations[i] = Vec2.dot(Vec2.sub(cA, cB), normal); + } + points.length = this.pointCount; + separations.length = this.pointCount; + // Ensure normal points from A to B. + normal.mul(-1); + break; + } + } + wm.normal = normal; + wm.points = points; + wm.separations = separations; + return wm; + }; + Manifold.clipSegmentToLine = clipSegmentToLine; + Manifold.ClipVertex = ClipVertex; + Manifold.getPointStates = getPointStates; + Manifold.PointState = exports.PointState; + return Manifold; +}()); +/** + * A manifold point is a contact point belonging to a contact manifold. It holds + * details related to the geometry and dynamics of the contact points. + * + * This structure is stored across time steps, so we keep it small. + * + * Note: impulses are used for internal caching and may not provide reliable + * contact forces, especially for high speed collisions. + */ +var ManifoldPoint = /** @class */ (function () { + function ManifoldPoint() { + /** + * Usage depends on manifold type. + * e_circles: the local center of circleB, + * e_faceA: the local center of cirlceB or the clip point of polygonB, + * e_faceB: the clip point of polygonA. + */ + this.localPoint = Vec2.zero(); + /** + * The non-penetration impulse + */ + this.normalImpulse = 0; + /** + * The friction impulse + */ + this.tangentImpulse = 0; + /** + * Uniquely identifies a contact point between two shapes to facilatate warm starting + */ + this.id = new ContactID(); + } + return ManifoldPoint; +}()); +/** + * Contact ids to facilitate warm starting. + */ +var ContactID = /** @class */ (function () { + function ContactID() { + this.cf = new ContactFeature(); + } + Object.defineProperty(ContactID.prototype, "key", { + /** + * Used to quickly compare contact ids. + */ + get: function () { + return this.cf.indexA + this.cf.indexB * 4 + this.cf.typeA * 16 + this.cf.typeB * 64; + }, + enumerable: false, + configurable: true + }); + ContactID.prototype.set = function (o) { + // this.key = o.key; + this.cf.set(o.cf); + }; + return ContactID; +}()); +/** + * The features that intersect to form the contact point. + */ +var ContactFeature = /** @class */ (function () { + function ContactFeature() { + } + ContactFeature.prototype.set = function (o) { + this.indexA = o.indexA; + this.indexB = o.indexB; + this.typeA = o.typeA; + this.typeB = o.typeB; + }; + return ContactFeature; +}()); +/** + * This is used to compute the current state of a contact manifold. + */ +var WorldManifold = /** @class */ (function () { + function WorldManifold() { + /** + * World contact point (point of intersection) + */ + this.points = []; // [maxManifoldPoints] + /** + * A negative value indicates overlap, in meters + */ + this.separations = []; // [maxManifoldPoints] + } + return WorldManifold; +}()); +/** + * Compute the point states given two manifolds. The states pertain to the + * transition from manifold1 to manifold2. So state1 is either persist or remove + * while state2 is either add or persist. + */ +function getPointStates(state1, state2, manifold1, manifold2) { + // state1, state2: PointState[Settings.maxManifoldPoints] + // for (var i = 0; i < Settings.maxManifoldPoints; ++i) { + // state1[i] = PointState.nullState; + // state2[i] = PointState.nullState; + // } + // Detect persists and removes. + for (var i = 0; i < manifold1.pointCount; ++i) { + var id = manifold1.points[i].id; + state1[i] = exports.PointState.removeState; + for (var j = 0; j < manifold2.pointCount; ++j) { + if (manifold2.points[j].id.key == id.key) { + state1[i] = exports.PointState.persistState; + break; + } + } + } + // Detect persists and adds. + for (var i = 0; i < manifold2.pointCount; ++i) { + var id = manifold2.points[i].id; + state2[i] = exports.PointState.addState; + for (var j = 0; j < manifold1.pointCount; ++j) { + if (manifold1.points[j].id.key == id.key) { + state2[i] = exports.PointState.persistState; + break; + } + } + } +} +/** + * Clipping for contact manifolds. Sutherland-Hodgman clipping. + */ +function clipSegmentToLine(vOut, vIn, normal, offset, vertexIndexA) { + // Start with no output points + var numOut = 0; + // Calculate the distance of end points to the line + var distance0 = Vec2.dot(normal, vIn[0].v) - offset; + var distance1 = Vec2.dot(normal, vIn[1].v) - offset; + // If the points are behind the plane + if (distance0 <= 0.0) + vOut[numOut++].set(vIn[0]); + if (distance1 <= 0.0) + vOut[numOut++].set(vIn[1]); + // If the points are on different sides of the plane + if (distance0 * distance1 < 0.0) { + // Find intersection point of edge and plane + var interp = distance0 / (distance0 - distance1); + vOut[numOut].v.setCombine(1 - interp, vIn[0].v, interp, vIn[1].v); + // VertexA is hitting edgeB. + vOut[numOut].id.cf.indexA = vertexIndexA; + vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB; + vOut[numOut].id.cf.typeA = exports.ContactFeatureType.e_vertex; + vOut[numOut].id.cf.typeB = exports.ContactFeatureType.e_face; + ++numOut; + } + return numOut; +} + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A contact edge is used to connect bodies and contacts together in a contact + * graph where each body is a node and each contact is an edge. A contact edge + * belongs to a doubly linked list maintained in each attached body. Each + * contact has two contact nodes, one for each attached body. + * + * @prop {Contact} contact The contact + * @prop {ContactEdge} prev The previous contact edge in the body's contact list + * @prop {ContactEdge} next The next contact edge in the body's contact list + * @prop {Body} other Provides quick access to the other body attached. + */ +var ContactEdge = /** @class */ (function () { + function ContactEdge(contact) { + this.contact = contact; + } + return ContactEdge; +}()); +/** + * Friction mixing law. The idea is to allow either fixture to drive the + * restitution to zero. For example, anything slides on ice. + */ +function mixFriction(friction1, friction2) { + return math.sqrt(friction1 * friction2); +} +/** + * Restitution mixing law. The idea is allow for anything to bounce off an + * inelastic surface. For example, a superball bounces on anything. + */ +function mixRestitution(restitution1, restitution2) { + return restitution1 > restitution2 ? restitution1 : restitution2; +} +// TODO: move this to Settings? +var s_registers = []; +// TODO: merge with ManifoldPoint? +var VelocityConstraintPoint = /** @class */ (function () { + function VelocityConstraintPoint() { + this.rA = Vec2.zero(); + this.rB = Vec2.zero(); + this.normalImpulse = 0; + this.tangentImpulse = 0; + this.normalMass = 0; + this.tangentMass = 0; + this.velocityBias = 0; + } + return VelocityConstraintPoint; +}()); +/** + * The class manages contact between two shapes. A contact exists for each + * overlapping AABB in the broad-phase (except if filtered). Therefore a contact + * object may exist that has no contact points. + */ +var Contact = /** @class */ (function () { + function Contact(fA, indexA, fB, indexB, evaluateFcn) { + /** @internal */ + this.m_manifold = new Manifold(); + /** @internal */ + this.m_prev = null; + /** @internal */ + this.m_next = null; + /** @internal */ + this.m_toi = 1.0; + /** @internal */ + this.m_toiCount = 0; + /** @internal This contact has a valid TOI in m_toi */ + this.m_toiFlag = false; + /** @internal */ + this.m_tangentSpeed = 0.0; + /** @internal This contact can be disabled (by user) */ + this.m_enabledFlag = true; + /** @internal Used when crawling contact graph when forming islands. */ + this.m_islandFlag = false; + /** @internal Set when the shapes are touching. */ + this.m_touchingFlag = false; + /** @internal This contact needs filtering because a fixture filter was changed. */ + this.m_filterFlag = false; + /** @internal This bullet contact had a TOI event */ + this.m_bulletHitFlag = false; + /** @internal Contact reporting impulse object cache */ + this.m_impulse = new ContactImpulse(this); + // VelocityConstraint + /** @internal */ this.v_points = []; // [maxManifoldPoints]; + /** @internal */ this.v_normal = Vec2.zero(); + /** @internal */ this.v_normalMass = new Mat22(); + /** @internal */ this.v_K = new Mat22(); + // PositionConstraint + /** @internal */ this.p_localPoints = []; // [maxManifoldPoints]; + /** @internal */ this.p_localNormal = Vec2.zero(); + /** @internal */ this.p_localPoint = Vec2.zero(); + /** @internal */ this.p_localCenterA = Vec2.zero(); + /** @internal */ this.p_localCenterB = Vec2.zero(); + // Nodes for connecting bodies. + this.m_nodeA = new ContactEdge(this); + this.m_nodeB = new ContactEdge(this); + this.m_fixtureA = fA; + this.m_fixtureB = fB; + this.m_indexA = indexA; + this.m_indexB = indexB; + this.m_evaluateFcn = evaluateFcn; + this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction); + this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution); + } + Contact.prototype.initConstraint = function (step) { + var fixtureA = this.m_fixtureA; + var fixtureB = this.m_fixtureB; + var shapeA = fixtureA.getShape(); + var shapeB = fixtureB.getShape(); + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + var manifold = this.getManifold(); + var pointCount = manifold.pointCount; + this.v_invMassA = bodyA.m_invMass; + this.v_invMassB = bodyB.m_invMass; + this.v_invIA = bodyA.m_invI; + this.v_invIB = bodyB.m_invI; + this.v_friction = this.m_friction; + this.v_restitution = this.m_restitution; + this.v_tangentSpeed = this.m_tangentSpeed; + this.v_pointCount = pointCount; + this.v_K.setZero(); + this.v_normalMass.setZero(); + this.p_invMassA = bodyA.m_invMass; + this.p_invMassB = bodyB.m_invMass; + this.p_invIA = bodyA.m_invI; + this.p_invIB = bodyB.m_invI; + this.p_localCenterA = Vec2.clone(bodyA.m_sweep.localCenter); + this.p_localCenterB = Vec2.clone(bodyB.m_sweep.localCenter); + this.p_radiusA = shapeA.m_radius; + this.p_radiusB = shapeB.m_radius; + this.p_type = manifold.type; + this.p_localNormal = Vec2.clone(manifold.localNormal); + this.p_localPoint = Vec2.clone(manifold.localPoint); + this.p_pointCount = pointCount; + for (var j = 0; j < pointCount; ++j) { + var cp = manifold.points[j]; + var vcp = this.v_points[j] = new VelocityConstraintPoint(); + if (step.warmStarting) { + vcp.normalImpulse = step.dtRatio * cp.normalImpulse; + vcp.tangentImpulse = step.dtRatio * cp.tangentImpulse; + } + else { + vcp.normalImpulse = 0.0; + vcp.tangentImpulse = 0.0; + } + vcp.rA.setZero(); + vcp.rB.setZero(); + vcp.normalMass = 0.0; + vcp.tangentMass = 0.0; + vcp.velocityBias = 0.0; + this.p_localPoints[j] = Vec2.clone(cp.localPoint); + } + }; + /** + * Get the contact manifold. Do not modify the manifold unless you understand + * the internals of the library. + */ + Contact.prototype.getManifold = function () { + return this.m_manifold; + }; + /** + * Get the world manifold. + */ + Contact.prototype.getWorldManifold = function (worldManifold) { + var bodyA = this.m_fixtureA.getBody(); + var bodyB = this.m_fixtureB.getBody(); + var shapeA = this.m_fixtureA.getShape(); + var shapeB = this.m_fixtureB.getShape(); + return this.m_manifold.getWorldManifold(worldManifold, bodyA.getTransform(), shapeA.m_radius, bodyB.getTransform(), shapeB.m_radius); + }; + /** + * Enable/disable this contact. This can be used inside the pre-solve contact + * listener. The contact is only disabled for the current time step (or sub-step + * in continuous collisions). + */ + Contact.prototype.setEnabled = function (flag) { + this.m_enabledFlag = !!flag; + }; + /** + * Has this contact been disabled? + */ + Contact.prototype.isEnabled = function () { + return this.m_enabledFlag; + }; + /** + * Is this contact touching? + */ + Contact.prototype.isTouching = function () { + return this.m_touchingFlag; + }; + /** + * Get the next contact in the world's contact list. + */ + Contact.prototype.getNext = function () { + return this.m_next; + }; + /** + * Get fixture A in this contact. + */ + Contact.prototype.getFixtureA = function () { + return this.m_fixtureA; + }; + /** + * Get fixture B in this contact. + */ + Contact.prototype.getFixtureB = function () { + return this.m_fixtureB; + }; + /** + * Get the child primitive index for fixture A. + */ + Contact.prototype.getChildIndexA = function () { + return this.m_indexA; + }; + /** + * Get the child primitive index for fixture B. + */ + Contact.prototype.getChildIndexB = function () { + return this.m_indexB; + }; + /** + * Flag this contact for filtering. Filtering will occur the next time step. + */ + Contact.prototype.flagForFiltering = function () { + this.m_filterFlag = true; + }; + /** + * Override the default friction mixture. You can call this in + * ContactListener.preSolve. This value persists until set or reset. + */ + Contact.prototype.setFriction = function (friction) { + this.m_friction = friction; + }; + /** + * Get the friction. + */ + Contact.prototype.getFriction = function () { + return this.m_friction; + }; + /** + * Reset the friction mixture to the default value. + */ + Contact.prototype.resetFriction = function () { + this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction); + }; + /** + * Override the default restitution mixture. You can call this in + * ContactListener.preSolve. The value persists until you set or reset. + */ + Contact.prototype.setRestitution = function (restitution) { + this.m_restitution = restitution; + }; + /** + * Get the restitution. + */ + Contact.prototype.getRestitution = function () { + return this.m_restitution; + }; + /** + * Reset the restitution to the default value. + */ + Contact.prototype.resetRestitution = function () { + this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution); + }; + /** + * Set the desired tangent speed for a conveyor belt behavior. In meters per + * second. + */ + Contact.prototype.setTangentSpeed = function (speed) { + this.m_tangentSpeed = speed; + }; + /** + * Get the desired tangent speed. In meters per second. + */ + Contact.prototype.getTangentSpeed = function () { + return this.m_tangentSpeed; + }; + /** + * Called by Update method, and implemented by subclasses. + */ + Contact.prototype.evaluate = function (manifold, xfA, xfB) { + this.m_evaluateFcn(manifold, xfA, this.m_fixtureA, this.m_indexA, xfB, this.m_fixtureB, this.m_indexB); + }; + /** + * Updates the contact manifold and touching status. + * + * Note: do not assume the fixture AABBs are overlapping or are valid. + * + * @param listener.beginContact + * @param listener.endContact + * @param listener.preSolve + */ + Contact.prototype.update = function (listener) { + // Re-enable this contact. + this.m_enabledFlag = true; + var touching = false; + var wasTouching = this.m_touchingFlag; + var sensorA = this.m_fixtureA.isSensor(); + var sensorB = this.m_fixtureB.isSensor(); + var sensor = sensorA || sensorB; + var bodyA = this.m_fixtureA.getBody(); + var bodyB = this.m_fixtureB.getBody(); + var xfA = bodyA.getTransform(); + var xfB = bodyB.getTransform(); + var oldManifold; + // Is this contact a sensor? + if (sensor) { + var shapeA = this.m_fixtureA.getShape(); + var shapeB = this.m_fixtureB.getShape(); + touching = testOverlap(shapeA, this.m_indexA, shapeB, this.m_indexB, xfA, xfB); + // Sensors don't generate manifolds. + this.m_manifold.pointCount = 0; + } + else { + // TODO reuse manifold + oldManifold = this.m_manifold; + this.m_manifold = new Manifold(); + this.evaluate(this.m_manifold, xfA, xfB); + touching = this.m_manifold.pointCount > 0; + // Match old contact ids to new contact ids and copy the + // stored impulses to warm start the solver. + for (var i = 0; i < this.m_manifold.pointCount; ++i) { + var nmp = this.m_manifold.points[i]; + nmp.normalImpulse = 0.0; + nmp.tangentImpulse = 0.0; + for (var j = 0; j < oldManifold.pointCount; ++j) { + var omp = oldManifold.points[j]; + if (omp.id.key == nmp.id.key) { + nmp.normalImpulse = omp.normalImpulse; + nmp.tangentImpulse = omp.tangentImpulse; + break; + } + } + } + if (touching != wasTouching) { + bodyA.setAwake(true); + bodyB.setAwake(true); + } + } + this.m_touchingFlag = touching; + if (!wasTouching && touching && listener) { + listener.beginContact(this); + } + if (wasTouching && !touching && listener) { + listener.endContact(this); + } + if (!sensor && touching && listener) { + listener.preSolve(this, oldManifold); + } + }; + Contact.prototype.solvePositionConstraint = function (step) { + return this._solvePositionConstraint(step); + }; + Contact.prototype.solvePositionConstraintTOI = function (step, toiA, toiB) { + return this._solvePositionConstraint(step, toiA, toiB); + }; + Contact.prototype._solvePositionConstraint = function (step, toiA, toiB) { + var toi = !!toiA && !!toiB; + var fixtureA = this.m_fixtureA; + var fixtureB = this.m_fixtureB; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + bodyA.c_velocity; + bodyB.c_velocity; + var positionA = bodyA.c_position; + var positionB = bodyB.c_position; + var localCenterA = Vec2.clone(this.p_localCenterA); + var localCenterB = Vec2.clone(this.p_localCenterB); + var mA = 0.0; + var iA = 0.0; + if (!toi || (bodyA == toiA || bodyA == toiB)) { + mA = this.p_invMassA; + iA = this.p_invIA; + } + var mB = 0.0; + var iB = 0.0; + if (!toi || (bodyB == toiA || bodyB == toiB)) { + mB = this.p_invMassB; + iB = this.p_invIB; + } + var cA = Vec2.clone(positionA.c); + var aA = positionA.a; + var cB = Vec2.clone(positionB.c); + var aB = positionB.a; + var minSeparation = 0.0; + // Solve normal constraints + for (var j = 0; j < this.p_pointCount; ++j) { + var xfA = Transform.identity(); + var xfB = Transform.identity(); + xfA.q.setAngle(aA); + xfB.q.setAngle(aB); + xfA.p = Vec2.sub(cA, Rot.mulVec2(xfA.q, localCenterA)); + xfB.p = Vec2.sub(cB, Rot.mulVec2(xfB.q, localCenterB)); + // PositionSolverManifold + var normal = void 0; + var point = void 0; + var separation = void 0; + switch (this.p_type) { + case exports.ManifoldType.e_circles: { + var pointA = Transform.mulVec2(xfA, this.p_localPoint); + var pointB = Transform.mulVec2(xfB, this.p_localPoints[0]); + normal = Vec2.sub(pointB, pointA); + normal.normalize(); + point = Vec2.combine(0.5, pointA, 0.5, pointB); + separation = Vec2.dot(Vec2.sub(pointB, pointA), normal) - this.p_radiusA - this.p_radiusB; + break; + } + case exports.ManifoldType.e_faceA: { + normal = Rot.mulVec2(xfA.q, this.p_localNormal); + var planePoint = Transform.mulVec2(xfA, this.p_localPoint); + var clipPoint = Transform.mulVec2(xfB, this.p_localPoints[j]); + separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB; + point = clipPoint; + break; + } + case exports.ManifoldType.e_faceB: { + normal = Rot.mulVec2(xfB.q, this.p_localNormal); + var planePoint = Transform.mulVec2(xfB, this.p_localPoint); + var clipPoint = Transform.mulVec2(xfA, this.p_localPoints[j]); + separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB; + point = clipPoint; + // Ensure normal points from A to B + normal.mul(-1); + break; + } + } + var rA = Vec2.sub(point, cA); + var rB = Vec2.sub(point, cB); + // Track max constraint error. + minSeparation = math.min(minSeparation, separation); + var baumgarte = toi ? Settings.toiBaugarte : Settings.baumgarte; + var linearSlop = Settings.linearSlop; + var maxLinearCorrection = Settings.maxLinearCorrection; + // Prevent large corrections and allow slop. + var C = math.clamp(baumgarte * (separation + linearSlop), -maxLinearCorrection, 0.0); + // Compute the effective mass. + var rnA = Vec2.crossVec2Vec2(rA, normal); + var rnB = Vec2.crossVec2Vec2(rB, normal); + var K = mA + mB + iA * rnA * rnA + iB * rnB * rnB; + // Compute normal impulse + var impulse = K > 0.0 ? -C / K : 0.0; + var P = Vec2.mulNumVec2(impulse, normal); + cA.subMul(mA, P); + aA -= iA * Vec2.crossVec2Vec2(rA, P); + cB.addMul(mB, P); + aB += iB * Vec2.crossVec2Vec2(rB, P); + } + positionA.c.setVec2(cA); + positionA.a = aA; + positionB.c.setVec2(cB); + positionB.a = aB; + return minSeparation; + }; + Contact.prototype.initVelocityConstraint = function (step) { + var fixtureA = this.m_fixtureA; + var fixtureB = this.m_fixtureB; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + var velocityA = bodyA.c_velocity; + var velocityB = bodyB.c_velocity; + var positionA = bodyA.c_position; + var positionB = bodyB.c_position; + var radiusA = this.p_radiusA; + var radiusB = this.p_radiusB; + var manifold = this.getManifold(); + var mA = this.v_invMassA; + var mB = this.v_invMassB; + var iA = this.v_invIA; + var iB = this.v_invIB; + var localCenterA = Vec2.clone(this.p_localCenterA); + var localCenterB = Vec2.clone(this.p_localCenterB); + var cA = Vec2.clone(positionA.c); + var aA = positionA.a; + var vA = Vec2.clone(velocityA.v); + var wA = velocityA.w; + var cB = Vec2.clone(positionB.c); + var aB = positionB.a; + var vB = Vec2.clone(velocityB.v); + var wB = velocityB.w; + var xfA = Transform.identity(); + var xfB = Transform.identity(); + xfA.q.setAngle(aA); + xfB.q.setAngle(aB); + xfA.p.setCombine(1, cA, -1, Rot.mulVec2(xfA.q, localCenterA)); + xfB.p.setCombine(1, cB, -1, Rot.mulVec2(xfB.q, localCenterB)); + var worldManifold = manifold.getWorldManifold(null, xfA, radiusA, xfB, radiusB); + this.v_normal.setVec2(worldManifold.normal); + for (var j = 0; j < this.v_pointCount; ++j) { + var vcp = this.v_points[j]; // VelocityConstraintPoint + vcp.rA.setVec2(Vec2.sub(worldManifold.points[j], cA)); + vcp.rB.setVec2(Vec2.sub(worldManifold.points[j], cB)); + var rnA = Vec2.crossVec2Vec2(vcp.rA, this.v_normal); + var rnB = Vec2.crossVec2Vec2(vcp.rB, this.v_normal); + var kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB; + vcp.normalMass = kNormal > 0.0 ? 1.0 / kNormal : 0.0; + var tangent = Vec2.crossVec2Num(this.v_normal, 1.0); + var rtA = Vec2.crossVec2Vec2(vcp.rA, tangent); + var rtB = Vec2.crossVec2Vec2(vcp.rB, tangent); + var kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB; + vcp.tangentMass = kTangent > 0.0 ? 1.0 / kTangent : 0.0; + // Setup a velocity bias for restitution. + vcp.velocityBias = 0.0; + var vRel = Vec2.dot(this.v_normal, vB) + + Vec2.dot(this.v_normal, Vec2.crossNumVec2(wB, vcp.rB)) + - Vec2.dot(this.v_normal, vA) + - Vec2.dot(this.v_normal, Vec2.crossNumVec2(wA, vcp.rA)); + if (vRel < -Settings.velocityThreshold) { + vcp.velocityBias = -this.v_restitution * vRel; + } + } + // If we have two points, then prepare the block solver. + if (this.v_pointCount == 2 && step.blockSolve) { + var vcp1 = this.v_points[0]; // VelocityConstraintPoint + var vcp2 = this.v_points[1]; // VelocityConstraintPoint + var rn1A = Vec2.crossVec2Vec2(vcp1.rA, this.v_normal); + var rn1B = Vec2.crossVec2Vec2(vcp1.rB, this.v_normal); + var rn2A = Vec2.crossVec2Vec2(vcp2.rA, this.v_normal); + var rn2B = Vec2.crossVec2Vec2(vcp2.rB, this.v_normal); + var k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B; + var k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B; + var k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B; + // Ensure a reasonable condition number. + var k_maxConditionNumber = 1000.0; + if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) { + // K is safe to invert. + this.v_K.ex.setNum(k11, k12); + this.v_K.ey.setNum(k12, k22); + this.v_normalMass.set(this.v_K.getInverse()); + } + else { + // The constraints are redundant, just use one. + // TODO_ERIN use deepest? + this.v_pointCount = 1; + } + } + positionA.c.setVec2(cA); + positionA.a = aA; + velocityA.v.setVec2(vA); + velocityA.w = wA; + positionB.c.setVec2(cB); + positionB.a = aB; + velocityB.v.setVec2(vB); + velocityB.w = wB; + }; + Contact.prototype.warmStartConstraint = function (step) { + var fixtureA = this.m_fixtureA; + var fixtureB = this.m_fixtureB; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + var velocityA = bodyA.c_velocity; + var velocityB = bodyB.c_velocity; + bodyA.c_position; + bodyB.c_position; + var mA = this.v_invMassA; + var iA = this.v_invIA; + var mB = this.v_invMassB; + var iB = this.v_invIB; + var vA = Vec2.clone(velocityA.v); + var wA = velocityA.w; + var vB = Vec2.clone(velocityB.v); + var wB = velocityB.w; + var normal = this.v_normal; + var tangent = Vec2.crossVec2Num(normal, 1.0); + for (var j = 0; j < this.v_pointCount; ++j) { + var vcp = this.v_points[j]; // VelocityConstraintPoint + var P = Vec2.combine(vcp.normalImpulse, normal, vcp.tangentImpulse, tangent); + wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); + vA.subMul(mA, P); + wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); + vB.addMul(mB, P); + } + velocityA.v.setVec2(vA); + velocityA.w = wA; + velocityB.v.setVec2(vB); + velocityB.w = wB; + }; + Contact.prototype.storeConstraintImpulses = function (step) { + var manifold = this.m_manifold; + for (var j = 0; j < this.v_pointCount; ++j) { + manifold.points[j].normalImpulse = this.v_points[j].normalImpulse; + manifold.points[j].tangentImpulse = this.v_points[j].tangentImpulse; + } + }; + Contact.prototype.solveVelocityConstraint = function (step) { + var bodyA = this.m_fixtureA.m_body; + var bodyB = this.m_fixtureB.m_body; + var velocityA = bodyA.c_velocity; + bodyA.c_position; + var velocityB = bodyB.c_velocity; + bodyB.c_position; + var mA = this.v_invMassA; + var iA = this.v_invIA; + var mB = this.v_invMassB; + var iB = this.v_invIB; + var vA = Vec2.clone(velocityA.v); + var wA = velocityA.w; + var vB = Vec2.clone(velocityB.v); + var wB = velocityB.w; + var normal = this.v_normal; + var tangent = Vec2.crossVec2Num(normal, 1.0); + var friction = this.v_friction; + // Solve tangent constraints first because non-penetration is more important + // than friction. + for (var j = 0; j < this.v_pointCount; ++j) { + var vcp = this.v_points[j]; // VelocityConstraintPoint + // Relative velocity at contact + var dv = Vec2.zero(); + dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB)); + dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA)); + // Compute tangent force + var vt = Vec2.dot(dv, tangent) - this.v_tangentSpeed; + var lambda = vcp.tangentMass * (-vt); + // Clamp the accumulated force + var maxFriction = friction * vcp.normalImpulse; + var newImpulse = math.clamp(vcp.tangentImpulse + lambda, -maxFriction, maxFriction); + lambda = newImpulse - vcp.tangentImpulse; + vcp.tangentImpulse = newImpulse; + // Apply contact impulse + var P = Vec2.mulNumVec2(lambda, tangent); + vA.subMul(mA, P); + wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); + vB.addMul(mB, P); + wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); + } + // Solve normal constraints + if (this.v_pointCount == 1 || step.blockSolve == false) { + for (var i = 0; i < this.v_pointCount; ++i) { + var vcp = this.v_points[i]; // VelocityConstraintPoint + // Relative velocity at contact + var dv = Vec2.zero(); + dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB)); + dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA)); + // Compute normal impulse + var vn = Vec2.dot(dv, normal); + var lambda = -vcp.normalMass * (vn - vcp.velocityBias); + // Clamp the accumulated impulse + var newImpulse = math.max(vcp.normalImpulse + lambda, 0.0); + lambda = newImpulse - vcp.normalImpulse; + vcp.normalImpulse = newImpulse; + // Apply contact impulse + var P = Vec2.mulNumVec2(lambda, normal); + vA.subMul(mA, P); + wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); + vB.addMul(mB, P); + wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); + } + } + else { + // Block solver developed in collaboration with Dirk Gregorius (back in + // 01/07 on Box2D_Lite). + // Build the mini LCP for this contact patch + // + // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i = + // 1..2 + // + // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n ) + // b = vn0 - velocityBias + // + // The system is solved using the "Total enumeration method" (s. Murty). + // The complementary constraint vn_i * x_i + // implies that we must have in any solution either vn_i = 0 or x_i = 0. + // So for the 2D contact problem the cases + // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and + // vn1 = 0 need to be tested. The first valid + // solution that satisfies the problem is chosen. + // + // In order to account of the accumulated impulse 'a' (because of the + // iterative nature of the solver which only requires + // that the accumulated impulse is clamped and not the incremental + // impulse) we change the impulse variable (x_i). + // + // Substitute: + // + // x = a + d + // + // a := old total impulse + // x := new total impulse + // d := incremental impulse + // + // For the current iteration we extend the formula for the incremental + // impulse + // to compute the new total impulse: + // + // vn = A * d + b + // = A * (x - a) + b + // = A * x + b - A * a + // = A * x + b' + // b' = b - A * a; + var vcp1 = this.v_points[0]; // VelocityConstraintPoint + var vcp2 = this.v_points[1]; // VelocityConstraintPoint + var a = Vec2.neo(vcp1.normalImpulse, vcp2.normalImpulse); + // Relative velocity at contact + var dv1 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp1.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp1.rA)); + var dv2 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp2.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp2.rA)); + // Compute normal velocity + var vn1 = Vec2.dot(dv1, normal); + var vn2 = Vec2.dot(dv2, normal); + var b = Vec2.neo(vn1 - vcp1.velocityBias, vn2 - vcp2.velocityBias); + // Compute b' + b.sub(Mat22.mulVec2(this.v_K, a)); + // NOT_USED(k_errorTol); + while (true) { + // + // Case 1: vn = 0 + // + // 0 = A * x + b' + // + // Solve for x: + // + // x = - inv(A) * b' + // + var x = Mat22.mulVec2(this.v_normalMass, b).neg(); + if (x.x >= 0.0 && x.y >= 0.0) { + // Get the incremental impulse + var d = Vec2.sub(x, a); + // Apply incremental impulse + var P1 = Vec2.mulNumVec2(d.x, normal); + var P2 = Vec2.mulNumVec2(d.y, normal); + vA.subCombine(mA, P1, mA, P2); + wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); + vB.addCombine(mB, P1, mB, P2); + wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); + // Accumulate + vcp1.normalImpulse = x.x; + vcp2.normalImpulse = x.y; + break; + } + // + // Case 2: vn1 = 0 and x2 = 0 + // + // 0 = a11 * x1 + a12 * 0 + b1' + // vn2 = a21 * x1 + a22 * 0 + b2' + // + x.x = -vcp1.normalMass * b.x; + x.y = 0.0; + vn1 = 0.0; + vn2 = this.v_K.ex.y * x.x + b.y; + if (x.x >= 0.0 && vn2 >= 0.0) { + // Get the incremental impulse + var d = Vec2.sub(x, a); + // Apply incremental impulse + var P1 = Vec2.mulNumVec2(d.x, normal); + var P2 = Vec2.mulNumVec2(d.y, normal); + vA.subCombine(mA, P1, mA, P2); + wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); + vB.addCombine(mB, P1, mB, P2); + wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); + // Accumulate + vcp1.normalImpulse = x.x; + vcp2.normalImpulse = x.y; + break; + } + // + // Case 3: vn2 = 0 and x1 = 0 + // + // vn1 = a11 * 0 + a12 * x2 + b1' + // 0 = a21 * 0 + a22 * x2 + b2' + // + x.x = 0.0; + x.y = -vcp2.normalMass * b.y; + vn1 = this.v_K.ey.x * x.y + b.x; + vn2 = 0.0; + if (x.y >= 0.0 && vn1 >= 0.0) { + // Resubstitute for the incremental impulse + var d = Vec2.sub(x, a); + // Apply incremental impulse + var P1 = Vec2.mulNumVec2(d.x, normal); + var P2 = Vec2.mulNumVec2(d.y, normal); + vA.subCombine(mA, P1, mA, P2); + wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); + vB.addCombine(mB, P1, mB, P2); + wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); + // Accumulate + vcp1.normalImpulse = x.x; + vcp2.normalImpulse = x.y; + break; + } + // + // Case 4: x1 = 0 and x2 = 0 + // + // vn1 = b1 + // vn2 = b2; + // + x.x = 0.0; + x.y = 0.0; + vn1 = b.x; + vn2 = b.y; + if (vn1 >= 0.0 && vn2 >= 0.0) { + // Resubstitute for the incremental impulse + var d = Vec2.sub(x, a); + // Apply incremental impulse + var P1 = Vec2.mulNumVec2(d.x, normal); + var P2 = Vec2.mulNumVec2(d.y, normal); + vA.subCombine(mA, P1, mA, P2); + wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); + vB.addCombine(mB, P1, mB, P2); + wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); + // Accumulate + vcp1.normalImpulse = x.x; + vcp2.normalImpulse = x.y; + break; + } + // No solution, give up. This is hit sometimes, but it doesn't seem to + // matter. + break; + } + } + velocityA.v.setVec2(vA); + velocityA.w = wA; + velocityB.v.setVec2(vB); + velocityB.w = wB; + }; + /** + * @internal + */ + Contact.addType = function (type1, type2, callback) { + s_registers[type1] = s_registers[type1] || {}; + s_registers[type1][type2] = callback; + }; + /** + * @internal + */ + Contact.create = function (fixtureA, indexA, fixtureB, indexB) { + var typeA = fixtureA.getType(); + var typeB = fixtureB.getType(); + // TODO: pool contacts + var contact; + var evaluateFcn; + if (evaluateFcn = s_registers[typeA] && s_registers[typeA][typeB]) { + contact = new Contact(fixtureA, indexA, fixtureB, indexB, evaluateFcn); + } + else if (evaluateFcn = s_registers[typeB] && s_registers[typeB][typeA]) { + contact = new Contact(fixtureB, indexB, fixtureA, indexA, evaluateFcn); + } + else { + return null; + } + // Contact creation may swap fixtures. + fixtureA = contact.getFixtureA(); + fixtureB = contact.getFixtureB(); + indexA = contact.getChildIndexA(); + indexB = contact.getChildIndexB(); + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + // Connect to body A + contact.m_nodeA.contact = contact; + contact.m_nodeA.other = bodyB; + contact.m_nodeA.prev = null; + contact.m_nodeA.next = bodyA.m_contactList; + if (bodyA.m_contactList != null) { + bodyA.m_contactList.prev = contact.m_nodeA; + } + bodyA.m_contactList = contact.m_nodeA; + // Connect to body B + contact.m_nodeB.contact = contact; + contact.m_nodeB.other = bodyA; + contact.m_nodeB.prev = null; + contact.m_nodeB.next = bodyB.m_contactList; + if (bodyB.m_contactList != null) { + bodyB.m_contactList.prev = contact.m_nodeB; + } + bodyB.m_contactList = contact.m_nodeB; + // Wake up the bodies + if (fixtureA.isSensor() == false && fixtureB.isSensor() == false) { + bodyA.setAwake(true); + bodyB.setAwake(true); + } + return contact; + }; + /** + * @internal + */ + Contact.destroy = function (contact, listener) { + var fixtureA = contact.m_fixtureA; + var fixtureB = contact.m_fixtureB; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + if (contact.isTouching()) { + listener.endContact(contact); + } + // Remove from body 1 + if (contact.m_nodeA.prev) { + contact.m_nodeA.prev.next = contact.m_nodeA.next; + } + if (contact.m_nodeA.next) { + contact.m_nodeA.next.prev = contact.m_nodeA.prev; + } + if (contact.m_nodeA == bodyA.m_contactList) { + bodyA.m_contactList = contact.m_nodeA.next; + } + // Remove from body 2 + if (contact.m_nodeB.prev) { + contact.m_nodeB.prev.next = contact.m_nodeB.next; + } + if (contact.m_nodeB.next) { + contact.m_nodeB.next.prev = contact.m_nodeB.prev; + } + if (contact.m_nodeB == bodyB.m_contactList) { + bodyB.m_contactList = contact.m_nodeB.next; + } + if (contact.m_manifold.pointCount > 0 && fixtureA.isSensor() == false + && fixtureB.isSensor() == false) { + bodyA.setAwake(true); + bodyB.setAwake(true); + } + fixtureA.getType(); + fixtureB.getType(); + // const destroyFcn = s_registers[typeA][typeB].destroyFcn; + // if (typeof destroyFcn === 'function') { + // destroyFcn(contact); + // } + }; + return Contact; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var WorldDefDefault = { + gravity: Vec2.zero(), + allowSleep: true, + warmStarting: true, + continuousPhysics: true, + subStepping: false, + blockSolve: true, + velocityIterations: 8, + positionIterations: 3 +}; +var World = /** @class */ (function () { + /** + * @param def World definition or gravity vector. + */ + function World(def) { + if (!(this instanceof World)) { + return new World(def); + } + this.s_step = new TimeStep(); + if (def && Vec2.isValid(def)) { + def = { gravity: def }; + } + def = options(def, WorldDefDefault); + this.m_solver = new Solver(this); + this.m_broadPhase = new BroadPhase(); + this.m_contactList = null; + this.m_contactCount = 0; + this.m_bodyList = null; + this.m_bodyCount = 0; + this.m_jointList = null; + this.m_jointCount = 0; + this.m_stepComplete = true; + this.m_allowSleep = def.allowSleep; + this.m_gravity = Vec2.clone(def.gravity); + this.m_clearForces = true; + this.m_newFixture = false; + this.m_locked = false; + // These are for debugging the solver. + this.m_warmStarting = def.warmStarting; + this.m_continuousPhysics = def.continuousPhysics; + this.m_subStepping = def.subStepping; + this.m_blockSolve = def.blockSolve; + this.m_velocityIterations = def.velocityIterations; + this.m_positionIterations = def.positionIterations; + this.m_t = 0; + } + /** @internal */ + World.prototype._serialize = function () { + var bodies = []; + var joints = []; + for (var b = this.getBodyList(); b; b = b.getNext()) { + bodies.push(b); + } + for (var j = this.getJointList(); j; j = j.getNext()) { + // @ts-ignore + if (typeof j._serialize === 'function') { + joints.push(j); + } + } + return { + gravity: this.m_gravity, + bodies: bodies, + joints: joints, + }; + }; + /** @internal */ + World._deserialize = function (data, context, restore) { + if (!data) { + return new World(); + } + var world = new World(data.gravity); + if (data.bodies) { + for (var i = data.bodies.length - 1; i >= 0; i -= 1) { + world._addBody(restore(Body, data.bodies[i], world)); + } + } + if (data.joints) { + for (var i = data.joints.length - 1; i >= 0; i--) { + world.createJoint(restore(Joint, data.joints[i], world)); + } + } + return world; + }; + /** + * Get the world body list. With the returned body, use Body.getNext to get the + * next body in the world list. A null body indicates the end of the list. + * + * @return the head of the world body list. + */ + World.prototype.getBodyList = function () { + return this.m_bodyList; + }; + /** + * Get the world joint list. With the returned joint, use Joint.getNext to get + * the next joint in the world list. A null joint indicates the end of the list. + * + * @return the head of the world joint list. + */ + World.prototype.getJointList = function () { + return this.m_jointList; + }; + /** + * Get the world contact list. With the returned contact, use Contact.getNext to + * get the next contact in the world list. A null contact indicates the end of + * the list. + * + * Warning: contacts are created and destroyed in the middle of a time step. + * Use ContactListener to avoid missing contacts. + * + * @return the head of the world contact list. + */ + World.prototype.getContactList = function () { + return this.m_contactList; + }; + World.prototype.getBodyCount = function () { + return this.m_bodyCount; + }; + World.prototype.getJointCount = function () { + return this.m_jointCount; + }; + /** + * Get the number of contacts (each may have 0 or more contact points). + */ + World.prototype.getContactCount = function () { + return this.m_contactCount; + }; + /** + * Change the global gravity vector. + */ + World.prototype.setGravity = function (gravity) { + this.m_gravity = gravity; + }; + /** + * Get the global gravity vector. + */ + World.prototype.getGravity = function () { + return this.m_gravity; + }; + /** + * Is the world locked (in the middle of a time step). + */ + World.prototype.isLocked = function () { + return this.m_locked; + }; + /** + * Enable/disable sleep. + */ + World.prototype.setAllowSleeping = function (flag) { + if (flag == this.m_allowSleep) { + return; + } + this.m_allowSleep = flag; + if (this.m_allowSleep == false) { + for (var b = this.m_bodyList; b; b = b.m_next) { + b.setAwake(true); + } + } + }; + World.prototype.getAllowSleeping = function () { + return this.m_allowSleep; + }; + /** + * Enable/disable warm starting. For testing. + */ + World.prototype.setWarmStarting = function (flag) { + this.m_warmStarting = flag; + }; + World.prototype.getWarmStarting = function () { + return this.m_warmStarting; + }; + /** + * Enable/disable continuous physics. For testing. + */ + World.prototype.setContinuousPhysics = function (flag) { + this.m_continuousPhysics = flag; + }; + World.prototype.getContinuousPhysics = function () { + return this.m_continuousPhysics; + }; + /** + * Enable/disable single stepped continuous physics. For testing. + */ + World.prototype.setSubStepping = function (flag) { + this.m_subStepping = flag; + }; + World.prototype.getSubStepping = function () { + return this.m_subStepping; + }; + /** + * Set flag to control automatic clearing of forces after each time step. + */ + World.prototype.setAutoClearForces = function (flag) { + this.m_clearForces = flag; + }; + /** + * Get the flag that controls automatic clearing of forces after each time step. + */ + World.prototype.getAutoClearForces = function () { + return this.m_clearForces; + }; + /** + * Manually clear the force buffer on all bodies. By default, forces are cleared + * automatically after each call to step. The default behavior is modified by + * calling setAutoClearForces. The purpose of this function is to support + * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step + * under a variable frame-rate. When you perform sub-stepping you will disable + * auto clearing of forces and instead call clearForces after all sub-steps are + * complete in one pass of your game loop. + * + * See {@link World.setAutoClearForces} + */ + World.prototype.clearForces = function () { + for (var body = this.m_bodyList; body; body = body.getNext()) { + body.m_force.setZero(); + body.m_torque = 0.0; + } + }; + /** + * Query the world for all fixtures that potentially overlap the provided AABB. + * + * @param aabb The query box. + * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query. + */ + World.prototype.queryAABB = function (aabb, callback) { + var broadPhase = this.m_broadPhase; + this.m_broadPhase.query(aabb, function (proxyId) { + var proxy = broadPhase.getUserData(proxyId); + return callback(proxy.fixture); + }); + }; + /** + * Ray-cast the world for all fixtures in the path of the ray. Your callback + * controls whether you get the closest point, any point, or n-points. The + * ray-cast ignores shapes that contain the starting point. + * + * @param point1 The ray starting point + * @param point2 The ray ending point + * @param callback A user implemented callback function. + */ + World.prototype.rayCast = function (point1, point2, callback) { + var broadPhase = this.m_broadPhase; + this.m_broadPhase.rayCast({ + maxFraction: 1.0, + p1: point1, + p2: point2 + }, function (input, proxyId) { + var proxy = broadPhase.getUserData(proxyId); + var fixture = proxy.fixture; + var index = proxy.childIndex; + // @ts-ignore + var output = {}; // TODO GC + var hit = fixture.rayCast(output, input, index); + if (hit) { + var fraction = output.fraction; + var point = Vec2.add(Vec2.mulNumVec2((1.0 - fraction), input.p1), Vec2.mulNumVec2(fraction, input.p2)); + return callback(fixture, point, output.normal, fraction); + } + return input.maxFraction; + }); + }; + /** + * Get the number of broad-phase proxies. + */ + World.prototype.getProxyCount = function () { + return this.m_broadPhase.getProxyCount(); + }; + /** + * Get the height of broad-phase dynamic tree. + */ + World.prototype.getTreeHeight = function () { + return this.m_broadPhase.getTreeHeight(); + }; + /** + * Get the balance of broad-phase dynamic tree. + */ + World.prototype.getTreeBalance = function () { + return this.m_broadPhase.getTreeBalance(); + }; + /** + * Get the quality metric of broad-phase dynamic tree. The smaller the better. + * The minimum is 1. + */ + World.prototype.getTreeQuality = function () { + return this.m_broadPhase.getTreeQuality(); + }; + /** + * Shift the world origin. Useful for large worlds. The body shift formula is: + * position -= newOrigin + * + * @param newOrigin The new origin with respect to the old origin + */ + World.prototype.shiftOrigin = function (newOrigin) { + if (this.m_locked) { + return; + } + for (var b = this.m_bodyList; b; b = b.m_next) { + b.m_xf.p.sub(newOrigin); + b.m_sweep.c0.sub(newOrigin); + b.m_sweep.c.sub(newOrigin); + } + for (var j = this.m_jointList; j; j = j.m_next) { + j.shiftOrigin(newOrigin); + } + this.m_broadPhase.shiftOrigin(newOrigin); + }; + /** + * @internal Used for deserialize. + */ + World.prototype._addBody = function (body) { + if (this.isLocked()) { + return; + } + // Add to world doubly linked list. + body.m_prev = null; + body.m_next = this.m_bodyList; + if (this.m_bodyList) { + this.m_bodyList.m_prev = body; + } + this.m_bodyList = body; + ++this.m_bodyCount; + }; + // tslint:disable-next-line:typedef + World.prototype.createBody = function (arg1, arg2) { + if (this.isLocked()) { + return null; + } + var def = {}; + if (!arg1) ; + else if (Vec2.isValid(arg1)) { + def = { position: arg1, angle: arg2 }; + } + else if (typeof arg1 === 'object') { + def = arg1; + } + var body = new Body(this, def); + this._addBody(body); + return body; + }; + // tslint:disable-next-line:typedef + World.prototype.createDynamicBody = function (arg1, arg2) { + var def = {}; + if (!arg1) ; + else if (Vec2.isValid(arg1)) { + def = { position: arg1, angle: arg2 }; + } + else if (typeof arg1 === 'object') { + def = arg1; + } + def.type = 'dynamic'; + return this.createBody(def); + }; + // tslint:disable-next-line:typedef + World.prototype.createKinematicBody = function (arg1, arg2) { + var def = {}; + if (!arg1) ; + else if (Vec2.isValid(arg1)) { + def = { position: arg1, angle: arg2 }; + } + else if (typeof arg1 === 'object') { + def = arg1; + } + def.type = 'kinematic'; + return this.createBody(def); + }; + /** + * Destroy a rigid body given a definition. No reference to the definition is + * retained. + * + * Warning: This automatically deletes all associated shapes and joints. + * + * Warning: This function is locked during callbacks. + */ + World.prototype.destroyBody = function (b) { + if (this.isLocked()) { + return; + } + if (b.m_destroyed) { + return false; + } + // Delete the attached joints. + var je = b.m_jointList; + while (je) { + var je0 = je; + je = je.next; + this.publish('remove-joint', je0.joint); + this.destroyJoint(je0.joint); + b.m_jointList = je; + } + b.m_jointList = null; + // Delete the attached contacts. + var ce = b.m_contactList; + while (ce) { + var ce0 = ce; + ce = ce.next; + this.destroyContact(ce0.contact); + b.m_contactList = ce; + } + b.m_contactList = null; + // Delete the attached fixtures. This destroys broad-phase proxies. + var f = b.m_fixtureList; + while (f) { + var f0 = f; + f = f.m_next; + this.publish('remove-fixture', f0); + f0.destroyProxies(this.m_broadPhase); + b.m_fixtureList = f; + } + b.m_fixtureList = null; + // Remove world body list. + if (b.m_prev) { + b.m_prev.m_next = b.m_next; + } + if (b.m_next) { + b.m_next.m_prev = b.m_prev; + } + if (b == this.m_bodyList) { + this.m_bodyList = b.m_next; + } + b.m_destroyed = true; + --this.m_bodyCount; + this.publish('remove-body', b); + return true; + }; + /** + * Create a joint to constrain bodies together. No reference to the definition + * is retained. This may cause the connected bodies to cease colliding. + * + * Warning: This function is locked during callbacks. + */ + World.prototype.createJoint = function (joint) { + if (this.isLocked()) { + return null; + } + // Connect to the world list. + joint.m_prev = null; + joint.m_next = this.m_jointList; + if (this.m_jointList) { + this.m_jointList.m_prev = joint; + } + this.m_jointList = joint; + ++this.m_jointCount; + // Connect to the bodies' doubly linked lists. + joint.m_edgeA.joint = joint; + joint.m_edgeA.other = joint.m_bodyB; + joint.m_edgeA.prev = null; + joint.m_edgeA.next = joint.m_bodyA.m_jointList; + if (joint.m_bodyA.m_jointList) + joint.m_bodyA.m_jointList.prev = joint.m_edgeA; + joint.m_bodyA.m_jointList = joint.m_edgeA; + joint.m_edgeB.joint = joint; + joint.m_edgeB.other = joint.m_bodyA; + joint.m_edgeB.prev = null; + joint.m_edgeB.next = joint.m_bodyB.m_jointList; + if (joint.m_bodyB.m_jointList) + joint.m_bodyB.m_jointList.prev = joint.m_edgeB; + joint.m_bodyB.m_jointList = joint.m_edgeB; + // If the joint prevents collisions, then flag any contacts for filtering. + if (joint.m_collideConnected == false) { + for (var edge = joint.m_bodyB.getContactList(); edge; edge = edge.next) { + if (edge.other == joint.m_bodyA) { + // Flag the contact for filtering at the next time step (where either + // body is awake). + edge.contact.flagForFiltering(); + } + } + } + // Note: creating a joint doesn't wake the bodies. + return joint; + }; + /** + * Destroy a joint. This may cause the connected bodies to begin colliding. + * Warning: This function is locked during callbacks. + */ + World.prototype.destroyJoint = function (joint) { + if (this.isLocked()) { + return; + } + // Remove from the doubly linked list. + if (joint.m_prev) { + joint.m_prev.m_next = joint.m_next; + } + if (joint.m_next) { + joint.m_next.m_prev = joint.m_prev; + } + if (joint == this.m_jointList) { + this.m_jointList = joint.m_next; + } + // Disconnect from bodies. + var bodyA = joint.m_bodyA; + var bodyB = joint.m_bodyB; + // Wake up connected bodies. + bodyA.setAwake(true); + bodyB.setAwake(true); + // Remove from body 1. + if (joint.m_edgeA.prev) { + joint.m_edgeA.prev.next = joint.m_edgeA.next; + } + if (joint.m_edgeA.next) { + joint.m_edgeA.next.prev = joint.m_edgeA.prev; + } + if (joint.m_edgeA == bodyA.m_jointList) { + bodyA.m_jointList = joint.m_edgeA.next; + } + joint.m_edgeA.prev = null; + joint.m_edgeA.next = null; + // Remove from body 2 + if (joint.m_edgeB.prev) { + joint.m_edgeB.prev.next = joint.m_edgeB.next; + } + if (joint.m_edgeB.next) { + joint.m_edgeB.next.prev = joint.m_edgeB.prev; + } + if (joint.m_edgeB == bodyB.m_jointList) { + bodyB.m_jointList = joint.m_edgeB.next; + } + joint.m_edgeB.prev = null; + joint.m_edgeB.next = null; + --this.m_jointCount; + // If the joint prevents collisions, then flag any contacts for filtering. + if (joint.m_collideConnected == false) { + var edge = bodyB.getContactList(); + while (edge) { + if (edge.other == bodyA) { + // Flag the contact for filtering at the next time step (where either + // body is awake). + edge.contact.flagForFiltering(); + } + edge = edge.next; + } + } + this.publish('remove-joint', joint); + }; + /** + * Take a time step. This performs collision detection, integration, and + * constraint solution. + * + * Broad-phase, narrow-phase, solve and solve time of impacts. + * + * @param timeStep Time step, this should not vary. + */ + World.prototype.step = function (timeStep, velocityIterations, positionIterations) { + this.publish('pre-step', timeStep); + if ((velocityIterations | 0) !== velocityIterations) { + // TODO: remove this in future + velocityIterations = 0; + } + velocityIterations = velocityIterations || this.m_velocityIterations; + positionIterations = positionIterations || this.m_positionIterations; + // If new fixtures were added, we need to find the new contacts. + if (this.m_newFixture) { + this.findNewContacts(); + this.m_newFixture = false; + } + this.m_locked = true; + this.s_step.reset(timeStep); + this.s_step.velocityIterations = velocityIterations; + this.s_step.positionIterations = positionIterations; + this.s_step.warmStarting = this.m_warmStarting; + this.s_step.blockSolve = this.m_blockSolve; + // Update contacts. This is where some contacts are destroyed. + this.updateContacts(); + // Integrate velocities, solve velocity constraints, and integrate positions. + if (this.m_stepComplete && timeStep > 0.0) { + this.m_solver.solveWorld(this.s_step); + // Synchronize fixtures, check for out of range bodies. + for (var b = this.m_bodyList; b; b = b.getNext()) { + // If a body was not in an island then it did not move. + if (b.m_islandFlag == false) { + continue; + } + if (b.isStatic()) { + continue; + } + // Update fixtures (for broad-phase). + b.synchronizeFixtures(); + } + // Look for new contacts. + this.findNewContacts(); + } + // Handle TOI events. + if (this.m_continuousPhysics && timeStep > 0.0) { + this.m_solver.solveWorldTOI(this.s_step); + } + if (this.m_clearForces) { + this.clearForces(); + } + this.m_locked = false; + this.publish('post-step', timeStep); + }; + /** + * @internal + * Call this method to find new contacts. + */ + World.prototype.findNewContacts = function () { + var _this = this; + this.m_broadPhase.updatePairs(function (proxyA, proxyB) { return _this.createContact(proxyA, proxyB); }); + }; + /** + * @internal + * Callback for broad-phase. + */ + World.prototype.createContact = function (proxyA, proxyB) { + var fixtureA = proxyA.fixture; + var fixtureB = proxyB.fixture; + var indexA = proxyA.childIndex; + var indexB = proxyB.childIndex; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + // Are the fixtures on the same body? + if (bodyA == bodyB) { + return; + } + // TODO_ERIN use a hash table to remove a potential bottleneck when both + // bodies have a lot of contacts. + // Does a contact already exist? + var edge = bodyB.getContactList(); // ContactEdge + while (edge) { + if (edge.other == bodyA) { + var fA = edge.contact.getFixtureA(); + var fB = edge.contact.getFixtureB(); + var iA = edge.contact.getChildIndexA(); + var iB = edge.contact.getChildIndexB(); + if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) { + // A contact already exists. + return; + } + if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) { + // A contact already exists. + return; + } + } + edge = edge.next; + } + if (bodyB.shouldCollide(bodyA) == false) { + return; + } + if (fixtureB.shouldCollide(fixtureA) == false) { + return; + } + // Call the factory. + var contact = Contact.create(fixtureA, indexA, fixtureB, indexB); + if (contact == null) { + return; + } + // Insert into the world. + contact.m_prev = null; + if (this.m_contactList != null) { + contact.m_next = this.m_contactList; + this.m_contactList.m_prev = contact; + } + this.m_contactList = contact; + ++this.m_contactCount; + }; + /** + * @internal + * Removes old non-overlapping contacts, applies filters and updates contacts. + */ + World.prototype.updateContacts = function () { + // Update awake contacts. + var c; + var next_c = this.m_contactList; + while (c = next_c) { + next_c = c.getNext(); + var fixtureA = c.getFixtureA(); + var fixtureB = c.getFixtureB(); + var indexA = c.getChildIndexA(); + var indexB = c.getChildIndexB(); + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + // Is this contact flagged for filtering? + if (c.m_filterFlag) { + if (bodyB.shouldCollide(bodyA) == false) { + this.destroyContact(c); + continue; + } + if (fixtureB.shouldCollide(fixtureA) == false) { + this.destroyContact(c); + continue; + } + // Clear the filtering flag. + c.m_filterFlag = false; + } + var activeA = bodyA.isAwake() && !bodyA.isStatic(); + var activeB = bodyB.isAwake() && !bodyB.isStatic(); + // At least one body must be awake and it must be dynamic or kinematic. + if (activeA == false && activeB == false) { + continue; + } + var proxyIdA = fixtureA.m_proxies[indexA].proxyId; + var proxyIdB = fixtureB.m_proxies[indexB].proxyId; + var overlap = this.m_broadPhase.testOverlap(proxyIdA, proxyIdB); + // Here we destroy contacts that cease to overlap in the broad-phase. + if (overlap == false) { + this.destroyContact(c); + continue; + } + // The contact persists. + c.update(this); + } + }; + /** + * @internal + */ + World.prototype.destroyContact = function (contact) { + Contact.destroy(contact, this); + // Remove from the world. + if (contact.m_prev) { + contact.m_prev.m_next = contact.m_next; + } + if (contact.m_next) { + contact.m_next.m_prev = contact.m_prev; + } + if (contact == this.m_contactList) { + this.m_contactList = contact.m_next; + } + --this.m_contactCount; + }; + /** + * Register an event listener. + */ + // tslint:disable-next-line:typedef + World.prototype.on = function (name, listener) { + if (typeof name !== 'string' || typeof listener !== 'function') { + return this; + } + if (!this._listeners) { + this._listeners = {}; + } + if (!this._listeners[name]) { + this._listeners[name] = []; + } + this._listeners[name].push(listener); + return this; + }; + /** + * Remove an event listener. + */ + // tslint:disable-next-line:typedef + World.prototype.off = function (name, listener) { + if (typeof name !== 'string' || typeof listener !== 'function') { + return this; + } + var listeners = this._listeners && this._listeners[name]; + if (!listeners || !listeners.length) { + return this; + } + var index = listeners.indexOf(listener); + if (index >= 0) { + listeners.splice(index, 1); + } + return this; + }; + World.prototype.publish = function (name, arg1, arg2, arg3) { + var listeners = this._listeners && this._listeners[name]; + if (!listeners || !listeners.length) { + return 0; + } + for (var l = 0; l < listeners.length; l++) { + listeners[l].call(this, arg1, arg2, arg3); + } + return listeners.length; + }; + /** + * @internal + */ + World.prototype.beginContact = function (contact) { + this.publish('begin-contact', contact); + }; + /** + * @internal + */ + World.prototype.endContact = function (contact) { + this.publish('end-contact', contact); + }; + /** + * @internal + */ + World.prototype.preSolve = function (contact, oldManifold) { + this.publish('pre-solve', contact, oldManifold); + }; + /** + * @internal + */ + World.prototype.postSolve = function (contact, impulse) { + this.publish('post-solve', contact, impulse); + }; + return World; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Vec3 = /** @class */ (function () { + // tslint:disable-next-line:typedef + function Vec3(x, y, z) { + if (!(this instanceof Vec3)) { + return new Vec3(x, y, z); + } + if (typeof x === 'undefined') { + this.x = 0; + this.y = 0; + this.z = 0; + } + else if (typeof x === 'object') { + this.x = x.x; + this.y = x.y; + this.z = x.z; + } + else { + this.x = x; + this.y = y; + this.z = z; + } + } + /** @internal */ + Vec3.prototype._serialize = function () { + return { + x: this.x, + y: this.y, + z: this.z + }; + }; + /** @internal */ + Vec3._deserialize = function (data) { + var obj = Object.create(Vec3.prototype); + obj.x = data.x; + obj.y = data.y; + obj.z = data.z; + return obj; + }; + /** @internal */ + Vec3.neo = function (x, y, z) { + var obj = Object.create(Vec3.prototype); + obj.x = x; + obj.y = y; + obj.z = z; + return obj; + }; + Vec3.zero = function () { + var obj = Object.create(Vec3.prototype); + obj.x = 0; + obj.y = 0; + obj.z = 0; + return obj; + }; + Vec3.clone = function (v) { + return Vec3.neo(v.x, v.y, v.z); + }; + /** @internal */ + Vec3.prototype.toString = function () { + return JSON.stringify(this); + }; + /** + * Does this vector contain finite coordinates? + */ + Vec3.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return math.isFinite(obj.x) && math.isFinite(obj.y) && math.isFinite(obj.z); + }; + Vec3.assert = function (o) { + }; + Vec3.prototype.setZero = function () { + this.x = 0.0; + this.y = 0.0; + this.z = 0.0; + return this; + }; + Vec3.prototype.set = function (x, y, z) { + this.x = x; + this.y = y; + this.z = z; + return this; + }; + Vec3.prototype.add = function (w) { + this.x += w.x; + this.y += w.y; + this.z += w.z; + return this; + }; + Vec3.prototype.sub = function (w) { + this.x -= w.x; + this.y -= w.y; + this.z -= w.z; + return this; + }; + Vec3.prototype.mul = function (m) { + this.x *= m; + this.y *= m; + this.z *= m; + return this; + }; + Vec3.areEqual = function (v, w) { + return v === w || + typeof v === 'object' && v !== null && + typeof w === 'object' && w !== null && + v.x === w.x && v.y === w.y && v.z === w.z; + }; + /** + * Perform the dot product on two vectors. + */ + Vec3.dot = function (v, w) { + return v.x * w.x + v.y * w.y + v.z * w.z; + }; + /** + * Perform the cross product on two vectors. In 2D this produces a scalar. + */ + Vec3.cross = function (v, w) { + return new Vec3(v.y * w.z - v.z * w.y, v.z * w.x - v.x * w.z, v.x * w.y - v.y * w.x); + }; + Vec3.add = function (v, w) { + return new Vec3(v.x + w.x, v.y + w.y, v.z + w.z); + }; + Vec3.sub = function (v, w) { + return new Vec3(v.x - w.x, v.y - w.y, v.z - w.z); + }; + Vec3.mul = function (v, m) { + return new Vec3(m * v.x, m * v.y, m * v.z); + }; + Vec3.prototype.neg = function () { + this.x = -this.x; + this.y = -this.y; + this.z = -this.z; + return this; + }; + Vec3.neg = function (v) { + return new Vec3(-v.x, -v.y, -v.z); + }; + return Vec3; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A line segment (edge) shape. These can be connected in chains or loops to + * other edge shapes. The connectivity information is used to ensure correct + * contact normals. + */ +var EdgeShape = /** @class */ (function (_super) { + __extends(EdgeShape, _super); + function EdgeShape(v1, v2) { + var _this = this; + // @ts-ignore + if (!(_this instanceof EdgeShape)) { + return new EdgeShape(v1, v2); + } + _this = _super.call(this) || this; + _this.m_type = EdgeShape.TYPE; + _this.m_radius = Settings.polygonRadius; + _this.m_vertex1 = v1 ? Vec2.clone(v1) : Vec2.zero(); + _this.m_vertex2 = v2 ? Vec2.clone(v2) : Vec2.zero(); + _this.m_vertex0 = Vec2.zero(); + _this.m_vertex3 = Vec2.zero(); + _this.m_hasVertex0 = false; + _this.m_hasVertex3 = false; + return _this; + } + /** @internal */ + EdgeShape.prototype._serialize = function () { + return { + type: this.m_type, + vertex1: this.m_vertex1, + vertex2: this.m_vertex2, + vertex0: this.m_vertex0, + vertex3: this.m_vertex3, + hasVertex0: this.m_hasVertex0, + hasVertex3: this.m_hasVertex3, + }; + }; + /** @internal */ + EdgeShape._deserialize = function (data) { + var shape = new EdgeShape(data.vertex1, data.vertex2); + if (shape.m_hasVertex0) { + shape.setPrevVertex(data.vertex0); + } + if (shape.m_hasVertex3) { + shape.setNextVertex(data.vertex3); + } + return shape; + }; + /** @internal */ + EdgeShape.prototype._reset = function () { + // noop + }; + EdgeShape.prototype.getRadius = function () { + return this.m_radius; + }; + EdgeShape.prototype.getType = function () { + return this.m_type; + }; + /** @internal @deprecated */ + EdgeShape.prototype.setNext = function (v) { + return this.setNextVertex(v); + }; + /** + * Optional next vertex, used for smooth collision. + */ + EdgeShape.prototype.setNextVertex = function (v) { + if (v) { + this.m_vertex3.setVec2(v); + this.m_hasVertex3 = true; + } + else { + this.m_vertex3.setZero(); + this.m_hasVertex3 = false; + } + return this; + }; + /** + * Optional next vertex, used for smooth collision. + */ + EdgeShape.prototype.getNextVertex = function () { + return this.m_vertex3; + }; + /** @internal @deprecated */ + EdgeShape.prototype.setPrev = function (v) { + return this.setPrevVertex(v); + }; + /** + * Optional prev vertex, used for smooth collision. + */ + EdgeShape.prototype.setPrevVertex = function (v) { + if (v) { + this.m_vertex0.setVec2(v); + this.m_hasVertex0 = true; + } + else { + this.m_vertex0.setZero(); + this.m_hasVertex0 = false; + } + return this; + }; + /** + * Optional prev vertex, used for smooth collision. + */ + EdgeShape.prototype.getPrevVertex = function () { + return this.m_vertex0; + }; + /** + * Set this as an isolated edge. + */ + EdgeShape.prototype._set = function (v1, v2) { + this.m_vertex1.setVec2(v1); + this.m_vertex2.setVec2(v2); + this.m_hasVertex0 = false; + this.m_hasVertex3 = false; + return this; + }; + /** + * @internal + * @deprecated Shapes should be treated as immutable. + * + * clone the concrete shape. + */ + EdgeShape.prototype._clone = function () { + var clone = new EdgeShape(); + clone.m_type = this.m_type; + clone.m_radius = this.m_radius; + clone.m_vertex1.setVec2(this.m_vertex1); + clone.m_vertex2.setVec2(this.m_vertex2); + clone.m_vertex0.setVec2(this.m_vertex0); + clone.m_vertex3.setVec2(this.m_vertex3); + clone.m_hasVertex0 = this.m_hasVertex0; + clone.m_hasVertex3 = this.m_hasVertex3; + return clone; + }; + /** + * Get the number of child primitives. + */ + EdgeShape.prototype.getChildCount = function () { + return 1; + }; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + EdgeShape.prototype.testPoint = function (xf, p) { + return false; + }; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + EdgeShape.prototype.rayCast = function (output, input, xf, childIndex) { + // p = p1 + t * d + // v = v1 + s * e + // p1 + t * d = v1 + s * e + // s * e - t * d = p1 - v1 + // NOT_USED(childIndex); + // Put the ray into the edge's frame of reference. + var p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p)); + var p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p)); + var d = Vec2.sub(p2, p1); + var v1 = this.m_vertex1; + var v2 = this.m_vertex2; + var e = Vec2.sub(v2, v1); + var normal = Vec2.neo(e.y, -e.x); + normal.normalize(); + // q = p1 + t * d + // dot(normal, q - v1) = 0 + // dot(normal, p1 - v1) + t * dot(normal, d) = 0 + var numerator = Vec2.dot(normal, Vec2.sub(v1, p1)); + var denominator = Vec2.dot(normal, d); + if (denominator == 0.0) { + return false; + } + var t = numerator / denominator; + if (t < 0.0 || input.maxFraction < t) { + return false; + } + var q = Vec2.add(p1, Vec2.mulNumVec2(t, d)); + // q = v1 + s * r + // s = dot(q - v1, r) / dot(r, r) + var r = Vec2.sub(v2, v1); + var rr = Vec2.dot(r, r); + if (rr == 0.0) { + return false; + } + var s = Vec2.dot(Vec2.sub(q, v1), r) / rr; + if (s < 0.0 || 1.0 < s) { + return false; + } + output.fraction = t; + if (numerator > 0.0) { + output.normal = Rot.mulVec2(xf.q, normal).neg(); + } + else { + output.normal = Rot.mulVec2(xf.q, normal); + } + return true; + }; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + EdgeShape.prototype.computeAABB = function (aabb, xf, childIndex) { + var v1 = Transform.mulVec2(xf, this.m_vertex1); + var v2 = Transform.mulVec2(xf, this.m_vertex2); + aabb.combinePoints(v1, v2); + aabb.extend(this.m_radius); + }; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + EdgeShape.prototype.computeMass = function (massData, density) { + massData.mass = 0.0; + massData.center.setCombine(0.5, this.m_vertex1, 0.5, this.m_vertex2); + massData.I = 0.0; + }; + EdgeShape.prototype.computeDistanceProxy = function (proxy) { + proxy.m_vertices.push(this.m_vertex1); + proxy.m_vertices.push(this.m_vertex2); + proxy.m_count = 2; + proxy.m_radius = this.m_radius; + }; + EdgeShape.TYPE = 'edge'; + return EdgeShape; +}(Shape)); +var Edge = EdgeShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A chain shape is a free form sequence of line segments. The chain has + * two-sided collision, so you can use inside and outside collision. Therefore, + * you may use any winding order. Connectivity information is used to create + * smooth collisions. + * + * WARNING: The chain will not collide properly if there are self-intersections. + */ +var ChainShape = /** @class */ (function (_super) { + __extends(ChainShape, _super); + function ChainShape(vertices, loop) { + var _this = this; + // @ts-ignore + if (!(_this instanceof ChainShape)) { + return new ChainShape(vertices, loop); + } + _this = _super.call(this) || this; + _this.m_type = ChainShape.TYPE; + _this.m_radius = Settings.polygonRadius; + _this.m_vertices = []; + _this.m_count = 0; + _this.m_prevVertex = null; + _this.m_nextVertex = null; + _this.m_hasPrevVertex = false; + _this.m_hasNextVertex = false; + _this.m_isLoop = !!loop; + if (vertices && vertices.length) { + if (loop) { + _this._createLoop(vertices); + } + else { + _this._createChain(vertices); + } + } + return _this; + } + /** @internal */ + ChainShape.prototype._serialize = function () { + var data = { + type: this.m_type, + vertices: this.m_vertices, + isLoop: this.m_isLoop, + hasPrevVertex: this.m_hasPrevVertex, + hasNextVertex: this.m_hasNextVertex, + prevVertex: null, + nextVertex: null, + }; + if (this.m_prevVertex) { + data.prevVertex = this.m_prevVertex; + } + if (this.m_nextVertex) { + data.nextVertex = this.m_nextVertex; + } + return data; + }; + /** @internal */ + ChainShape._deserialize = function (data, fixture, restore) { + var vertices = []; + if (data.vertices) { + for (var i = 0; i < data.vertices.length; i++) { + vertices.push(restore(Vec2, data.vertices[i])); + } + } + var shape = new ChainShape(vertices, data.isLoop); + if (data.prevVertex) { + shape.setPrevVertex(data.prevVertex); + } + if (data.nextVertex) { + shape.setNextVertex(data.nextVertex); + } + return shape; + }; + // clear() { + // this.m_vertices.length = 0; + // this.m_count = 0; + // } + ChainShape.prototype.getType = function () { + return this.m_type; + }; + ChainShape.prototype.getRadius = function () { + return this.m_radius; + }; + /** + * @internal + * Create a loop. This automatically adjusts connectivity. + * + * @param vertices an array of vertices, these are copied + * @param count the vertex count + */ + ChainShape.prototype._createLoop = function (vertices) { + for (var i = 1; i < vertices.length; ++i) { + vertices[i - 1]; + vertices[i]; + } + this.m_vertices = []; + this.m_count = vertices.length + 1; + for (var i = 0; i < vertices.length; ++i) { + this.m_vertices[i] = Vec2.clone(vertices[i]); + } + this.m_vertices[vertices.length] = Vec2.clone(vertices[0]); + this.m_prevVertex = this.m_vertices[this.m_count - 2]; + this.m_nextVertex = this.m_vertices[1]; + this.m_hasPrevVertex = true; + this.m_hasNextVertex = true; + return this; + }; + /** + * @internal + * Create a chain with isolated end vertices. + * + * @param vertices an array of vertices, these are copied + * @param count the vertex count + */ + ChainShape.prototype._createChain = function (vertices) { + for (var i = 1; i < vertices.length; ++i) { + // If the code crashes here, it means your vertices are too close together. + vertices[i - 1]; + vertices[i]; + } + this.m_count = vertices.length; + for (var i = 0; i < vertices.length; ++i) { + this.m_vertices[i] = Vec2.clone(vertices[i]); + } + this.m_hasPrevVertex = false; + this.m_hasNextVertex = false; + this.m_prevVertex = null; + this.m_nextVertex = null; + return this; + }; + /** @internal */ + ChainShape.prototype._reset = function () { + if (this.m_isLoop) { + this._createLoop(this.m_vertices); + } + else { + this._createChain(this.m_vertices); + } + }; + /** + * Establish connectivity to a vertex that precedes the first vertex. Don't call + * this for loops. + */ + ChainShape.prototype.setPrevVertex = function (prevVertex) { + this.m_prevVertex = prevVertex; + this.m_hasPrevVertex = true; + }; + ChainShape.prototype.getPrevVertex = function () { + return this.m_prevVertex; + }; + /** + * Establish connectivity to a vertex that follows the last vertex. Don't call + * this for loops. + */ + ChainShape.prototype.setNextVertex = function (nextVertex) { + this.m_nextVertex = nextVertex; + this.m_hasNextVertex = true; + }; + ChainShape.prototype.getNextVertex = function () { + return this.m_nextVertex; + }; + /** + * @internal + * @deprecated Shapes should be treated as immutable. + * + * clone the concrete shape. + */ + ChainShape.prototype._clone = function () { + var clone = new ChainShape(); + clone._createChain(this.m_vertices); + clone.m_type = this.m_type; + clone.m_radius = this.m_radius; + clone.m_prevVertex = this.m_prevVertex; + clone.m_nextVertex = this.m_nextVertex; + clone.m_hasPrevVertex = this.m_hasPrevVertex; + clone.m_hasNextVertex = this.m_hasNextVertex; + return clone; + }; + /** + * Get the number of child primitives. + */ + ChainShape.prototype.getChildCount = function () { + // edge count = vertex count - 1 + return this.m_count - 1; + }; + // Get a child edge. + ChainShape.prototype.getChildEdge = function (edge, childIndex) { + edge.m_type = EdgeShape.TYPE; + edge.m_radius = this.m_radius; + edge.m_vertex1 = this.m_vertices[childIndex]; + edge.m_vertex2 = this.m_vertices[childIndex + 1]; + if (childIndex > 0) { + edge.m_vertex0 = this.m_vertices[childIndex - 1]; + edge.m_hasVertex0 = true; + } + else { + edge.m_vertex0 = this.m_prevVertex; + edge.m_hasVertex0 = this.m_hasPrevVertex; + } + if (childIndex < this.m_count - 2) { + edge.m_vertex3 = this.m_vertices[childIndex + 2]; + edge.m_hasVertex3 = true; + } + else { + edge.m_vertex3 = this.m_nextVertex; + edge.m_hasVertex3 = this.m_hasNextVertex; + } + }; + ChainShape.prototype.getVertex = function (index) { + if (index < this.m_count) { + return this.m_vertices[index]; + } + else { + return this.m_vertices[0]; + } + }; + ChainShape.prototype.isLoop = function () { + return this.m_isLoop; + }; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * This always return false. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + ChainShape.prototype.testPoint = function (xf, p) { + return false; + }; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + ChainShape.prototype.rayCast = function (output, input, xf, childIndex) { + var edgeShape = new EdgeShape(this.getVertex(childIndex), this.getVertex(childIndex + 1)); + return edgeShape.rayCast(output, input, xf, 0); + }; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + ChainShape.prototype.computeAABB = function (aabb, xf, childIndex) { + var v1 = Transform.mulVec2(xf, this.getVertex(childIndex)); + var v2 = Transform.mulVec2(xf, this.getVertex(childIndex + 1)); + aabb.combinePoints(v1, v2); + }; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * Chains have zero mass. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + ChainShape.prototype.computeMass = function (massData, density) { + massData.mass = 0.0; + massData.center = Vec2.zero(); + massData.I = 0.0; + }; + ChainShape.prototype.computeDistanceProxy = function (proxy, childIndex) { + proxy.m_buffer[0] = this.getVertex(childIndex); + proxy.m_buffer[1] = this.getVertex(childIndex + 1); + proxy.m_vertices = proxy.m_buffer; + proxy.m_count = 2; + proxy.m_radius = this.m_radius; + }; + ChainShape.TYPE = 'chain'; + return ChainShape; +}(Shape)); +var Chain = ChainShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A convex polygon. It is assumed that the interior of the polygon is to the + * left of each edge. Polygons have a maximum number of vertices equal to + * Settings.maxPolygonVertices. In most cases you should not need many vertices + * for a convex polygon. extends Shape + */ +var PolygonShape = /** @class */ (function (_super) { + __extends(PolygonShape, _super); + // @ts-ignore + function PolygonShape(vertices) { + var _this = this; + // @ts-ignore + if (!(_this instanceof PolygonShape)) { + return new PolygonShape(vertices); + } + _this = _super.call(this) || this; + _this.m_type = PolygonShape.TYPE; + _this.m_radius = Settings.polygonRadius; + _this.m_centroid = Vec2.zero(); + _this.m_vertices = []; + _this.m_normals = []; + _this.m_count = 0; + if (vertices && vertices.length) { + _this._set(vertices); + } + return _this; + } + /** @internal */ + PolygonShape.prototype._serialize = function () { + return { + type: this.m_type, + vertices: this.m_vertices, + }; + }; + /** @internal */ + PolygonShape._deserialize = function (data, fixture, restore) { + var vertices = []; + if (data.vertices) { + for (var i = 0; i < data.vertices.length; i++) { + vertices.push(restore(Vec2, data.vertices[i])); + } + } + var shape = new PolygonShape(vertices); + return shape; + }; + PolygonShape.prototype.getType = function () { + return this.m_type; + }; + PolygonShape.prototype.getRadius = function () { + return this.m_radius; + }; + PolygonShape.prototype.getVertex = function (index) { + return this.m_vertices[index]; + }; + /** + * @internal + * @deprecated Shapes should be treated as immutable. + * + * clone the concrete shape. + */ + PolygonShape.prototype._clone = function () { + var clone = new PolygonShape(); + clone.m_type = this.m_type; + clone.m_radius = this.m_radius; + clone.m_count = this.m_count; + clone.m_centroid.setVec2(this.m_centroid); + for (var i = 0; i < this.m_count; i++) { + clone.m_vertices.push(this.m_vertices[i].clone()); + } + for (var i = 0; i < this.m_normals.length; i++) { + clone.m_normals.push(this.m_normals[i].clone()); + } + return clone; + }; + /** + * Get the number of child primitives. + */ + PolygonShape.prototype.getChildCount = function () { + return 1; + }; + /** @internal */ + PolygonShape.prototype._reset = function () { + this._set(this.m_vertices); + }; + /** + * @internal + * + * Create a convex hull from the given array of local points. The count must be + * in the range [3, Settings.maxPolygonVertices]. + * + * Warning: the points may be re-ordered, even if they form a convex polygon + * Warning: collinear points are handled but not removed. Collinear points may + * lead to poor stacking behavior. + */ + PolygonShape.prototype._set = function (vertices) { + if (vertices.length < 3) { + this._setAsBox(1.0, 1.0); + return; + } + var n = math.min(vertices.length, Settings.maxPolygonVertices); + // Perform welding and copy vertices into local buffer. + var ps = []; // [Settings.maxPolygonVertices]; + for (var i = 0; i < n; ++i) { + var v = vertices[i]; + var unique = true; + for (var j = 0; j < ps.length; ++j) { + if (Vec2.distanceSquared(v, ps[j]) < 0.25 * Settings.linearSlopSquared) { + unique = false; + break; + } + } + if (unique) { + ps.push(Vec2.clone(v)); + } + } + n = ps.length; + if (n < 3) { + this._setAsBox(1.0, 1.0); + return; + } + // Create the convex hull using the Gift wrapping algorithm + // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm + // Find the right most point on the hull (in case of multiple points bottom most is used) + var i0 = 0; + var x0 = ps[0].x; + for (var i = 1; i < n; ++i) { + var x = ps[i].x; + if (x > x0 || (x === x0 && ps[i].y < ps[i0].y)) { + i0 = i; + x0 = x; + } + } + var hull = []; // [Settings.maxPolygonVertices]; + var m = 0; + var ih = i0; + while (true) { + hull[m] = ih; + var ie = 0; + for (var j = 1; j < n; ++j) { + if (ie === ih) { + ie = j; + continue; + } + var r = Vec2.sub(ps[ie], ps[hull[m]]); + var v = Vec2.sub(ps[j], ps[hull[m]]); + var c = Vec2.crossVec2Vec2(r, v); + // c < 0 means counter-clockwise wrapping, c > 0 means clockwise wrapping + if (c < 0.0) { + ie = j; + } + // Collinearity check + if (c === 0.0 && v.lengthSquared() > r.lengthSquared()) { + ie = j; + } + } + ++m; + ih = ie; + if (ie === i0) { + break; + } + } + if (m < 3) { + this._setAsBox(1.0, 1.0); + return; + } + this.m_count = m; + // Copy vertices. + this.m_vertices = []; + for (var i = 0; i < m; ++i) { + this.m_vertices[i] = ps[hull[i]]; + } + // Compute normals. Ensure the edges have non-zero length. + for (var i = 0; i < m; ++i) { + var i1 = i; + var i2 = i + 1 < m ? i + 1 : 0; + var edge = Vec2.sub(this.m_vertices[i2], this.m_vertices[i1]); + this.m_normals[i] = Vec2.crossVec2Num(edge, 1.0); + this.m_normals[i].normalize(); + } + // Compute the polygon centroid. + this.m_centroid = ComputeCentroid(this.m_vertices, m); + }; + /** @internal */ + PolygonShape.prototype._setAsBox = function (hx, hy, center, angle) { + // start with right-bottom, counter-clockwise, as in Gift wrapping algorithm in PolygonShape._set() + this.m_vertices[0] = Vec2.neo(hx, -hy); + this.m_vertices[1] = Vec2.neo(hx, hy); + this.m_vertices[2] = Vec2.neo(-hx, hy); + this.m_vertices[3] = Vec2.neo(-hx, -hy); + this.m_normals[0] = Vec2.neo(1.0, 0.0); + this.m_normals[1] = Vec2.neo(0.0, 1.0); + this.m_normals[2] = Vec2.neo(-1.0, 0.0); + this.m_normals[3] = Vec2.neo(0.0, -1.0); + this.m_count = 4; + if (Vec2.isValid(center)) { + angle = angle || 0; + this.m_centroid.setVec2(center); + var xf = Transform.identity(); + xf.p.setVec2(center); + xf.q.setAngle(angle); + // Transform vertices and normals. + for (var i = 0; i < this.m_count; ++i) { + this.m_vertices[i] = Transform.mulVec2(xf, this.m_vertices[i]); + this.m_normals[i] = Rot.mulVec2(xf.q, this.m_normals[i]); + } + } + }; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + PolygonShape.prototype.testPoint = function (xf, p) { + var pLocal = Rot.mulTVec2(xf.q, Vec2.sub(p, xf.p)); + for (var i = 0; i < this.m_count; ++i) { + var dot = Vec2.dot(this.m_normals[i], Vec2.sub(pLocal, this.m_vertices[i])); + if (dot > 0.0) { + return false; + } + } + return true; + }; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + PolygonShape.prototype.rayCast = function (output, input, xf, childIndex) { + // Put the ray into the polygon's frame of reference. + var p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p)); + var p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p)); + var d = Vec2.sub(p2, p1); + var lower = 0.0; + var upper = input.maxFraction; + var index = -1; + for (var i = 0; i < this.m_count; ++i) { + // p = p1 + a * d + // dot(normal, p - v) = 0 + // dot(normal, p1 - v) + a * dot(normal, d) = 0 + var numerator = Vec2.dot(this.m_normals[i], Vec2.sub(this.m_vertices[i], p1)); + var denominator = Vec2.dot(this.m_normals[i], d); + if (denominator == 0.0) { + if (numerator < 0.0) { + return false; + } + } + else { + // Note: we want this predicate without division: + // lower < numerator / denominator, where denominator < 0 + // Since denominator < 0, we have to flip the inequality: + // lower < numerator / denominator <==> denominator * lower > numerator. + if (denominator < 0.0 && numerator < lower * denominator) { + // Increase lower. + // The segment enters this half-space. + lower = numerator / denominator; + index = i; + } + else if (denominator > 0.0 && numerator < upper * denominator) { + // Decrease upper. + // The segment exits this half-space. + upper = numerator / denominator; + } + } + // The use of epsilon here causes the assert on lower to trip + // in some cases. Apparently the use of epsilon was to make edge + // shapes work, but now those are handled separately. + // if (upper < lower - Math.EPSILON) + if (upper < lower) { + return false; + } + } + if (index >= 0) { + output.fraction = lower; + output.normal = Rot.mulVec2(xf.q, this.m_normals[index]); + return true; + } + return false; + }; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + PolygonShape.prototype.computeAABB = function (aabb, xf, childIndex) { + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + for (var i = 0; i < this.m_count; ++i) { + var v = Transform.mulVec2(xf, this.m_vertices[i]); + minX = math.min(minX, v.x); + maxX = math.max(maxX, v.x); + minY = math.min(minY, v.y); + maxY = math.max(maxY, v.y); + } + aabb.lowerBound.setNum(minX, minY); + aabb.upperBound.setNum(maxX, maxY); + aabb.extend(this.m_radius); + }; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + PolygonShape.prototype.computeMass = function (massData, density) { + var center = Vec2.zero(); + var area = 0.0; + var I = 0.0; + // s is the reference point for forming triangles. + // It's location doesn't change the result (except for rounding error). + var s = Vec2.zero(); + // This code would put the reference point inside the polygon. + for (var i = 0; i < this.m_count; ++i) { + s.add(this.m_vertices[i]); + } + s.mul(1.0 / this.m_count); + var k_inv3 = 1.0 / 3.0; + for (var i = 0; i < this.m_count; ++i) { + // Triangle vertices. + var e1 = Vec2.sub(this.m_vertices[i], s); + var e2 = i + 1 < this.m_count ? Vec2.sub(this.m_vertices[i + 1], s) : Vec2.sub(this.m_vertices[0], s); + var D = Vec2.crossVec2Vec2(e1, e2); + var triangleArea = 0.5 * D; + area += triangleArea; + // Area weighted centroid + center.addCombine(triangleArea * k_inv3, e1, triangleArea * k_inv3, e2); + var ex1 = e1.x; + var ey1 = e1.y; + var ex2 = e2.x; + var ey2 = e2.y; + var intx2 = ex1 * ex1 + ex2 * ex1 + ex2 * ex2; + var inty2 = ey1 * ey1 + ey2 * ey1 + ey2 * ey2; + I += (0.25 * k_inv3 * D) * (intx2 + inty2); + } + // Total mass + massData.mass = density * area; + center.mul(1.0 / area); + massData.center.setCombine(1, center, 1, s); + // Inertia tensor relative to the local origin (point s). + massData.I = density * I; + // Shift to center of mass then to original body origin. + massData.I += massData.mass * (Vec2.dot(massData.center, massData.center) - Vec2.dot(center, center)); + }; + /** + * Validate convexity. This is a very time consuming operation. + * @returns true if valid + */ + PolygonShape.prototype.validate = function () { + for (var i = 0; i < this.m_count; ++i) { + var i1 = i; + var i2 = i < this.m_count - 1 ? i1 + 1 : 0; + var p = this.m_vertices[i1]; + var e = Vec2.sub(this.m_vertices[i2], p); + for (var j = 0; j < this.m_count; ++j) { + if (j == i1 || j == i2) { + continue; + } + var v = Vec2.sub(this.m_vertices[j], p); + var c = Vec2.crossVec2Vec2(e, v); + if (c < 0.0) { + return false; + } + } + } + return true; + }; + PolygonShape.prototype.computeDistanceProxy = function (proxy) { + proxy.m_vertices = this.m_vertices; + proxy.m_count = this.m_count; + proxy.m_radius = this.m_radius; + }; + PolygonShape.TYPE = 'polygon'; + return PolygonShape; +}(Shape)); +function ComputeCentroid(vs, count) { + var c = Vec2.zero(); + var area = 0.0; + // pRef is the reference point for forming triangles. + // It's location doesn't change the result (except for rounding error). + var pRef = Vec2.zero(); + var i; + var inv3 = 1.0 / 3.0; + for (var i = 0; i < count; ++i) { + // Triangle vertices. + var p1 = pRef; + var p2 = vs[i]; + var p3 = i + 1 < count ? vs[i + 1] : vs[0]; + var e1 = Vec2.sub(p2, p1); + var e2 = Vec2.sub(p3, p1); + var D = Vec2.crossVec2Vec2(e1, e2); + var triangleArea = 0.5 * D; + area += triangleArea; + // Area weighted centroid + c.addMul(triangleArea * inv3, p1); + c.addMul(triangleArea * inv3, p2); + c.addMul(triangleArea * inv3, p3); + } + c.mul(1.0 / area); + return c; +} +var Polygon = PolygonShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A rectangle polygon which extend PolygonShape. + */ +var BoxShape = /** @class */ (function (_super) { + __extends(BoxShape, _super); + function BoxShape(hx, hy, center, angle) { + var _this = this; + // @ts-ignore + if (!(_this instanceof BoxShape)) { + return new BoxShape(hx, hy, center, angle); + } + _this = _super.call(this) || this; + _this._setAsBox(hx, hy, center, angle); + return _this; + } + BoxShape.TYPE = 'polygon'; + return BoxShape; +}(PolygonShape)); +var Box = BoxShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var CircleShape = /** @class */ (function (_super) { + __extends(CircleShape, _super); + // tslint:disable-next-line:typedef + function CircleShape(a, b) { + var _this = this; + // @ts-ignore + if (!(_this instanceof CircleShape)) { + return new CircleShape(a, b); + } + _this = _super.call(this) || this; + _this.m_type = CircleShape.TYPE; + _this.m_p = Vec2.zero(); + _this.m_radius = 1; + if (typeof a === 'object' && Vec2.isValid(a)) { + _this.m_p.setVec2(a); + if (typeof b === 'number') { + _this.m_radius = b; + } + } + else if (typeof a === 'number') { + _this.m_radius = a; + } + return _this; + } + /** @internal */ + CircleShape.prototype._serialize = function () { + return { + type: this.m_type, + p: this.m_p, + radius: this.m_radius, + }; + }; + /** @internal */ + CircleShape._deserialize = function (data) { + return new CircleShape(data.p, data.radius); + }; + /** @internal */ + CircleShape.prototype._reset = function () { + // noop + }; + CircleShape.prototype.getType = function () { + return this.m_type; + }; + CircleShape.prototype.getRadius = function () { + return this.m_radius; + }; + CircleShape.prototype.getCenter = function () { + return this.m_p; + }; + CircleShape.prototype.getVertex = function (index) { + return this.m_p; + }; + /** + * @internal + * @deprecated Shapes should be treated as immutable. + * + * clone the concrete shape. + */ + CircleShape.prototype._clone = function () { + var clone = new CircleShape(); + clone.m_type = this.m_type; + clone.m_radius = this.m_radius; + clone.m_p = this.m_p.clone(); + return clone; + }; + /** + * Get the number of child primitives. + */ + CircleShape.prototype.getChildCount = function () { + return 1; + }; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + CircleShape.prototype.testPoint = function (xf, p) { + var center = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); + var d = Vec2.sub(p, center); + return Vec2.dot(d, d) <= this.m_radius * this.m_radius; + }; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + CircleShape.prototype.rayCast = function (output, input, xf, childIndex) { + // Collision Detection in Interactive 3D Environments by Gino van den Bergen + // From Section 3.1.2 + // x = s + a * r + // norm(x) = radius + var position = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); + var s = Vec2.sub(input.p1, position); + var b = Vec2.dot(s, s) - this.m_radius * this.m_radius; + // Solve quadratic equation. + var r = Vec2.sub(input.p2, input.p1); + var c = Vec2.dot(s, r); + var rr = Vec2.dot(r, r); + var sigma = c * c - rr * b; + // Check for negative discriminant and short segment. + if (sigma < 0.0 || rr < math.EPSILON) { + return false; + } + // Find the point of intersection of the line with the circle. + var a = -(c + math.sqrt(sigma)); + // Is the intersection point on the segment? + if (0.0 <= a && a <= input.maxFraction * rr) { + a /= rr; + output.fraction = a; + output.normal = Vec2.add(s, Vec2.mulNumVec2(a, r)); + output.normal.normalize(); + return true; + } + return false; + }; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + CircleShape.prototype.computeAABB = function (aabb, xf, childIndex) { + var p = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); + aabb.lowerBound.setNum(p.x - this.m_radius, p.y - this.m_radius); + aabb.upperBound.setNum(p.x + this.m_radius, p.y + this.m_radius); + }; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + CircleShape.prototype.computeMass = function (massData, density) { + massData.mass = density * math.PI * this.m_radius * this.m_radius; + massData.center = this.m_p; + // inertia about the local origin + massData.I = massData.mass + * (0.5 * this.m_radius * this.m_radius + Vec2.dot(this.m_p, this.m_p)); + }; + CircleShape.prototype.computeDistanceProxy = function (proxy) { + proxy.m_vertices.push(this.m_p); + proxy.m_count = 1; + proxy.m_radius = this.m_radius; + }; + CircleShape.TYPE = 'circle'; + return CircleShape; +}(Shape)); +var Circle = CircleShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$a = { + frequencyHz: 0.0, + dampingRatio: 0.0 +}; +/** + * A distance joint constrains two points on two bodies to remain at a fixed + * distance from each other. You can view this as a massless, rigid rod. + * + * @param anchorA Anchor A in global coordination. + * @param anchorB Anchor B in global coordination. + */ +var DistanceJoint = /** @class */ (function (_super) { + __extends(DistanceJoint, _super); + function DistanceJoint(def, bodyA, bodyB, anchorA, anchorB) { + var _this = this; + // @ts-ignore + if (!(_this instanceof DistanceJoint)) { + return new DistanceJoint(def, bodyA, bodyB, anchorA, anchorB); + } + // order of constructor arguments is changed in v0.2 + if (bodyB && anchorA && ('m_type' in anchorA) && ('x' in bodyB) && ('y' in bodyB)) { + var temp = bodyB; + bodyB = anchorA; + anchorA = temp; + } + def = options(def, DEFAULTS$a); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = DistanceJoint.TYPE; + // Solver shared + _this.m_localAnchorA = Vec2.clone(anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.zero()); + _this.m_length = math.isFinite(def.length) ? def.length : + Vec2.distance(bodyA.getWorldPoint(_this.m_localAnchorA), bodyB.getWorldPoint(_this.m_localAnchorB)); + _this.m_frequencyHz = def.frequencyHz; + _this.m_dampingRatio = def.dampingRatio; + _this.m_impulse = 0.0; + _this.m_gamma = 0.0; + _this.m_bias = 0.0; + return _this; + // 1-D constrained system + // m (v2 - v1) = lambda + // v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass. + // x2 = x1 + h * v2 + // 1-D mass-damper-spring system + // m (v2 - v1) + h * d * v2 + h * k * + // C = norm(p2 - p1) - L + // u = (p2 - p1) / norm(p2 - p1) + // Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1)) + // J = [-u -cross(r1, u) u cross(r2, u)] + // K = J * invM * JT + // = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2 + } + /** @internal */ + DistanceJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + frequencyHz: this.m_frequencyHz, + dampingRatio: this.m_dampingRatio, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + length: this.m_length, + impulse: this.m_impulse, + gamma: this.m_gamma, + bias: this.m_bias, + }; + }; + /** @internal */ + DistanceJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new DistanceJoint(data); + return joint; + }; + /** @internal */ + DistanceJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + if (def.length > 0) { + this.m_length = +def.length; + } + else if (def.length < 0) ; + else if (def.anchorA || def.anchorA || def.anchorA || def.anchorA) { + this.m_length = Vec2.distance(this.m_bodyA.getWorldPoint(this.m_localAnchorA), this.m_bodyB.getWorldPoint(this.m_localAnchorB)); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + DistanceJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + DistanceJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * Set the natural length. Manipulating the length can lead to non-physical + * behavior when the frequency is zero. + */ + DistanceJoint.prototype.setLength = function (length) { + this.m_length = length; + }; + /** + * Get the natural length. + */ + DistanceJoint.prototype.getLength = function () { + return this.m_length; + }; + DistanceJoint.prototype.setFrequency = function (hz) { + this.m_frequencyHz = hz; + }; + DistanceJoint.prototype.getFrequency = function () { + return this.m_frequencyHz; + }; + DistanceJoint.prototype.setDampingRatio = function (ratio) { + this.m_dampingRatio = ratio; + }; + DistanceJoint.prototype.getDampingRatio = function () { + return this.m_dampingRatio; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + DistanceJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + DistanceJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + DistanceJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + DistanceJoint.prototype.getReactionTorque = function (inv_dt) { + return 0.0; + }; + DistanceJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + this.m_u = Vec2.sub(Vec2.add(cB, this.m_rB), Vec2.add(cA, this.m_rA)); + // Handle singularity. + var length = this.m_u.length(); + if (length > Settings.linearSlop) { + this.m_u.mul(1.0 / length); + } + else { + this.m_u.setNum(0.0, 0.0); + } + var crAu = Vec2.crossVec2Vec2(this.m_rA, this.m_u); + var crBu = Vec2.crossVec2Vec2(this.m_rB, this.m_u); + var invMass = this.m_invMassA + this.m_invIA * crAu * crAu + this.m_invMassB + + this.m_invIB * crBu * crBu; + // Compute the effective mass matrix. + this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0; + if (this.m_frequencyHz > 0.0) { + var C = length - this.m_length; + // Frequency + var omega = 2.0 * math.PI * this.m_frequencyHz; + // Damping coefficient + var d = 2.0 * this.m_mass * this.m_dampingRatio * omega; + // Spring stiffness + var k = this.m_mass * omega * omega; + // magic formulas + var h = step.dt; + this.m_gamma = h * (d + h * k); + this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0; + this.m_bias = C * h * k * this.m_gamma; + invMass += this.m_gamma; + this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0; + } + else { + this.m_gamma = 0.0; + this.m_bias = 0.0; + } + if (step.warmStarting) { + // Scale the impulse to support a variable time step. + this.m_impulse *= step.dtRatio; + var P = Vec2.mulNumVec2(this.m_impulse, this.m_u); + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); + } + else { + this.m_impulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + DistanceJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + // Cdot = dot(u, v + cross(w, r)) + var vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA)); + var vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)); + var Cdot = Vec2.dot(this.m_u, vpB) - Vec2.dot(this.m_u, vpA); + var impulse = -this.m_mass + * (Cdot + this.m_bias + this.m_gamma * this.m_impulse); + this.m_impulse += impulse; + var P = Vec2.mulNumVec2(impulse, this.m_u); + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + DistanceJoint.prototype.solvePositionConstraints = function (step) { + if (this.m_frequencyHz > 0.0) { + // There is no position correction for soft distance constraints. + return true; + } + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); + var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); + var u = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); + var length = u.normalize(); + var C = length - this.m_length; + C = math + .clamp(C, -Settings.maxLinearCorrection, Settings.maxLinearCorrection); + var impulse = -this.m_mass * C; + var P = Vec2.mulNumVec2(impulse, u); + cA.subMul(this.m_invMassA, P); + aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P); + cB.addMul(this.m_invMassB, P); + aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P); + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + return math.abs(C) < Settings.linearSlop; + }; + DistanceJoint.TYPE = 'distance-joint'; + return DistanceJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$9 = { + maxForce: 0.0, + maxTorque: 0.0, +}; +/** + * Friction joint. This is used for top-down friction. It provides 2D + * translational friction and angular friction. + * + * @param anchor Anchor in global coordination. + */ +var FrictionJoint = /** @class */ (function (_super) { + __extends(FrictionJoint, _super); + function FrictionJoint(def, bodyA, bodyB, anchor) { + var _this = this; + // @ts-ignore + if (!(_this instanceof FrictionJoint)) { + return new FrictionJoint(def, bodyA, bodyB, anchor); + } + def = options(def, DEFAULTS$9); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = FrictionJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + // Solver shared + _this.m_linearImpulse = Vec2.zero(); + _this.m_angularImpulse = 0.0; + _this.m_maxForce = def.maxForce; + _this.m_maxTorque = def.maxTorque; + return _this; + // Point-to-point constraint + // Cdot = v2 - v1 + // = v2 + cross(w2, r2) - v1 - cross(w1, r1) + // J = [-I -r1_skew I r2_skew ] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + // Angle constraint + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // K = invI1 + invI2 + } + /** @internal */ + FrictionJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + maxForce: this.m_maxForce, + maxTorque: this.m_maxTorque, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + }; + }; + /** @internal */ + FrictionJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new FrictionJoint(data); + return joint; + }; + /** @internal */ + FrictionJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + FrictionJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + FrictionJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * Set the maximum friction force in N. + */ + FrictionJoint.prototype.setMaxForce = function (force) { + this.m_maxForce = force; + }; + /** + * Get the maximum friction force in N. + */ + FrictionJoint.prototype.getMaxForce = function () { + return this.m_maxForce; + }; + /** + * Set the maximum friction torque in N*m. + */ + FrictionJoint.prototype.setMaxTorque = function (torque) { + this.m_maxTorque = torque; + }; + /** + * Get the maximum friction torque in N*m. + */ + FrictionJoint.prototype.getMaxTorque = function () { + return this.m_maxTorque; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + FrictionJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + FrictionJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + FrictionJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + FrictionJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_angularImpulse; + }; + FrictionJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + // Compute the effective mass matrix. + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var K = new Mat22(); + K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y + * this.m_rB.y; + K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y; + K.ey.x = K.ex.y; + K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x + * this.m_rB.x; + this.m_linearMass = K.getInverse(); + this.m_angularMass = iA + iB; + if (this.m_angularMass > 0.0) { + this.m_angularMass = 1.0 / this.m_angularMass; + } + if (step.warmStarting) { + // Scale impulses to support a variable time step. + this.m_linearImpulse.mul(step.dtRatio); + this.m_angularImpulse *= step.dtRatio; + var P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse); + } + else { + this.m_linearImpulse.setZero(); + this.m_angularImpulse = 0.0; + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + FrictionJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var h = step.dt; // float + // Solve angular friction + { + var Cdot = wB - wA; // float + var impulse = -this.m_angularMass * Cdot; // float + var oldImpulse = this.m_angularImpulse; // float + var maxImpulse = h * this.m_maxTorque; // float + this.m_angularImpulse = math.clamp(this.m_angularImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_angularImpulse - oldImpulse; + wA -= iA * impulse; + wB += iB * impulse; + } + // Solve linear friction + { + var Cdot = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA))); // Vec2 + var impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); // Vec2 + var oldImpulse = this.m_linearImpulse; // Vec2 + this.m_linearImpulse.add(impulse); + var maxImpulse = h * this.m_maxForce; // float + if (this.m_linearImpulse.lengthSquared() > maxImpulse * maxImpulse) { + this.m_linearImpulse.normalize(); + this.m_linearImpulse.mul(maxImpulse); + } + impulse = Vec2.sub(this.m_linearImpulse, oldImpulse); + vA.subMul(mA, impulse); + wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); + vB.addMul(mB, impulse); + wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + FrictionJoint.prototype.solvePositionConstraints = function (step) { + return true; + }; + FrictionJoint.TYPE = 'friction-joint'; + return FrictionJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A 3-by-3 matrix. Stored in column-major order. + */ +var Mat33 = /** @class */ (function () { + function Mat33(a, b, c) { + if (typeof a === 'object' && a !== null) { + this.ex = Vec3.clone(a); + this.ey = Vec3.clone(b); + this.ez = Vec3.clone(c); + } + else { + this.ex = Vec3.zero(); + this.ey = Vec3.zero(); + this.ez = Vec3.zero(); + } + } + /** @internal */ + Mat33.prototype.toString = function () { + return JSON.stringify(this); + }; + Mat33.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return Vec3.isValid(obj.ex) && Vec3.isValid(obj.ey) && Vec3.isValid(obj.ez); + }; + Mat33.assert = function (o) { + }; + /** + * Set this matrix to all zeros. + */ + Mat33.prototype.setZero = function () { + this.ex.setZero(); + this.ey.setZero(); + this.ez.setZero(); + return this; + }; + /** + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. + */ + Mat33.prototype.solve33 = function (v) { + var det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez)); + if (det !== 0.0) { + det = 1.0 / det; + } + var r = new Vec3(); + r.x = det * Vec3.dot(v, Vec3.cross(this.ey, this.ez)); + r.y = det * Vec3.dot(this.ex, Vec3.cross(v, this.ez)); + r.z = det * Vec3.dot(this.ex, Vec3.cross(this.ey, v)); + return r; + }; + /** + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix + * equation. + */ + Mat33.prototype.solve22 = function (v) { + var a11 = this.ex.x; + var a12 = this.ey.x; + var a21 = this.ex.y; + var a22 = this.ey.y; + var det = a11 * a22 - a12 * a21; + if (det !== 0.0) { + det = 1.0 / det; + } + var r = Vec2.zero(); + r.x = det * (a22 * v.x - a12 * v.y); + r.y = det * (a11 * v.y - a21 * v.x); + return r; + }; + /** + * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if + * singular. + */ + Mat33.prototype.getInverse22 = function (M) { + var a = this.ex.x; + var b = this.ey.x; + var c = this.ex.y; + var d = this.ey.y; + var det = a * d - b * c; + if (det !== 0.0) { + det = 1.0 / det; + } + M.ex.x = det * d; + M.ey.x = -det * b; + M.ex.z = 0.0; + M.ex.y = -det * c; + M.ey.y = det * a; + M.ey.z = 0.0; + M.ez.x = 0.0; + M.ez.y = 0.0; + M.ez.z = 0.0; + }; + /** + * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix + * if singular. + */ + Mat33.prototype.getSymInverse33 = function (M) { + var det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez)); + if (det !== 0.0) { + det = 1.0 / det; + } + var a11 = this.ex.x; + var a12 = this.ey.x; + var a13 = this.ez.x; + var a22 = this.ey.y; + var a23 = this.ez.y; + var a33 = this.ez.z; + M.ex.x = det * (a22 * a33 - a23 * a23); + M.ex.y = det * (a13 * a23 - a12 * a33); + M.ex.z = det * (a12 * a23 - a13 * a22); + M.ey.x = M.ex.y; + M.ey.y = det * (a11 * a33 - a13 * a13); + M.ey.z = det * (a13 * a12 - a11 * a23); + M.ez.x = M.ex.z; + M.ez.y = M.ey.z; + M.ez.z = det * (a11 * a22 - a12 * a12); + }; + // tslint:disable-next-line:typedef + Mat33.mul = function (a, b) { + if (b && 'z' in b && 'y' in b && 'x' in b) { + var x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z; + var y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z; + var z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z; + return new Vec3(x, y, z); + } + else if (b && 'y' in b && 'x' in b) { + var x = a.ex.x * b.x + a.ey.x * b.y; + var y = a.ex.y * b.x + a.ey.y * b.y; + return Vec2.neo(x, y); + } + }; + Mat33.mulVec3 = function (a, b) { + var x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z; + var y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z; + var z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z; + return new Vec3(x, y, z); + }; + Mat33.mulVec2 = function (a, b) { + var x = a.ex.x * b.x + a.ey.x * b.y; + var y = a.ex.y * b.x + a.ey.y * b.y; + return Vec2.neo(x, y); + }; + Mat33.add = function (a, b) { + return new Mat33(Vec3.add(a.ex, b.ex), Vec3.add(a.ey, b.ey), Vec3.add(a.ez, b.ez)); + }; + return Mat33; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var inactiveLimit$2 = 0; +var atLowerLimit$1 = 1; +var atUpperLimit$2 = 2; +var equalLimits$1 = 3; +var DEFAULTS$8 = { + lowerAngle: 0.0, + upperAngle: 0.0, + maxMotorTorque: 0.0, + motorSpeed: 0.0, + enableLimit: false, + enableMotor: false +}; +/** + * A revolute joint constrains two bodies to share a common point while they are + * free to rotate about the point. The relative rotation about the shared point + * is the joint angle. You can limit the relative rotation with a joint limit + * that specifies a lower and upper angle. You can use a motor to drive the + * relative rotation about the shared point. A maximum motor torque is provided + * so that infinite forces are not generated. + */ +var RevoluteJoint = /** @class */ (function (_super) { + __extends(RevoluteJoint, _super); + // @ts-ignore + function RevoluteJoint(def, bodyA, bodyB, anchor) { + var _this = this; + // @ts-ignore + if (!(_this instanceof RevoluteJoint)) { + return new RevoluteJoint(def, bodyA, bodyB, anchor); + } + def = options(def, DEFAULTS$8); + _this = _super.call(this, def, bodyA, bodyB) || this; + // effective mass for point-to-point constraint. + /** @internal */ _this.m_mass = new Mat33(); + /** @internal */ _this.m_limitState = inactiveLimit$2; // TODO enum + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = RevoluteJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + _this.m_referenceAngle = math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); + _this.m_impulse = new Vec3(); + _this.m_motorImpulse = 0.0; + _this.m_lowerAngle = def.lowerAngle; + _this.m_upperAngle = def.upperAngle; + _this.m_maxMotorTorque = def.maxMotorTorque; + _this.m_motorSpeed = def.motorSpeed; + _this.m_enableLimit = def.enableLimit; + _this.m_enableMotor = def.enableMotor; + return _this; + // Point-to-point constraint + // C = p2 - p1 + // Cdot = v2 - v1 + // = v2 + cross(w2, r2) - v1 - cross(w1, r1) + // J = [-I -r1_skew I r2_skew ] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + // Motor constraint + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // K = invI1 + invI2 + } + /** @internal */ + RevoluteJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + lowerAngle: this.m_lowerAngle, + upperAngle: this.m_upperAngle, + maxMotorTorque: this.m_maxMotorTorque, + motorSpeed: this.m_motorSpeed, + enableLimit: this.m_enableLimit, + enableMotor: this.m_enableMotor, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + referenceAngle: this.m_referenceAngle, + }; + }; + /** @internal */ + RevoluteJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new RevoluteJoint(data); + return joint; + }; + /** @internal */ + RevoluteJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + RevoluteJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + RevoluteJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * Get the reference angle. + */ + RevoluteJoint.prototype.getReferenceAngle = function () { + return this.m_referenceAngle; + }; + /** + * Get the current joint angle in radians. + */ + RevoluteJoint.prototype.getJointAngle = function () { + var bA = this.m_bodyA; + var bB = this.m_bodyB; + return bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle; + }; + /** + * Get the current joint angle speed in radians per second. + */ + RevoluteJoint.prototype.getJointSpeed = function () { + var bA = this.m_bodyA; + var bB = this.m_bodyB; + return bB.m_angularVelocity - bA.m_angularVelocity; + }; + /** + * Is the joint motor enabled? + */ + RevoluteJoint.prototype.isMotorEnabled = function () { + return this.m_enableMotor; + }; + /** + * Enable/disable the joint motor. + */ + RevoluteJoint.prototype.enableMotor = function (flag) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableMotor = flag; + }; + /** + * Get the current motor torque given the inverse time step. Unit is N*m. + */ + RevoluteJoint.prototype.getMotorTorque = function (inv_dt) { + return inv_dt * this.m_motorImpulse; + }; + /** + * Set the motor speed in radians per second. + */ + RevoluteJoint.prototype.setMotorSpeed = function (speed) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_motorSpeed = speed; + }; + /** + * Get the motor speed in radians per second. + */ + RevoluteJoint.prototype.getMotorSpeed = function () { + return this.m_motorSpeed; + }; + /** + * Set the maximum motor torque, usually in N-m. + */ + RevoluteJoint.prototype.setMaxMotorTorque = function (torque) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_maxMotorTorque = torque; + }; + RevoluteJoint.prototype.getMaxMotorTorque = function () { + return this.m_maxMotorTorque; + }; + /** + * Is the joint limit enabled? + */ + RevoluteJoint.prototype.isLimitEnabled = function () { + return this.m_enableLimit; + }; + /** + * Enable/disable the joint limit. + */ + RevoluteJoint.prototype.enableLimit = function (flag) { + if (flag != this.m_enableLimit) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableLimit = flag; + this.m_impulse.z = 0.0; + } + }; + /** + * Get the lower joint limit in radians. + */ + RevoluteJoint.prototype.getLowerLimit = function () { + return this.m_lowerAngle; + }; + /** + * Get the upper joint limit in radians. + */ + RevoluteJoint.prototype.getUpperLimit = function () { + return this.m_upperAngle; + }; + /** + * Set the joint limits in radians. + */ + RevoluteJoint.prototype.setLimits = function (lower, upper) { + if (lower != this.m_lowerAngle || upper != this.m_upperAngle) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_impulse.z = 0.0; + this.m_lowerAngle = lower; + this.m_upperAngle = upper; + } + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + RevoluteJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + RevoluteJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force given the inverse time step. Unit is N. + */ + RevoluteJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt); + }; + /** + * Get the reaction torque due to the joint limit given the inverse time step. + * Unit is N*m. + */ + RevoluteJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_impulse.z; + }; + RevoluteJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var fixedRotation = (iA + iB === 0.0); // bool + this.m_mass.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y + * this.m_rB.y * iB; + this.m_mass.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y + * this.m_rB.x * iB; + this.m_mass.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB; + this.m_mass.ex.y = this.m_mass.ey.x; + this.m_mass.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x + * this.m_rB.x * iB; + this.m_mass.ez.y = this.m_rA.x * iA + this.m_rB.x * iB; + this.m_mass.ex.z = this.m_mass.ez.x; + this.m_mass.ey.z = this.m_mass.ez.y; + this.m_mass.ez.z = iA + iB; + this.m_motorMass = iA + iB; + if (this.m_motorMass > 0.0) { + this.m_motorMass = 1.0 / this.m_motorMass; + } + if (this.m_enableMotor == false || fixedRotation) { + this.m_motorImpulse = 0.0; + } + if (this.m_enableLimit && fixedRotation == false) { + var jointAngle = aB - aA - this.m_referenceAngle; // float + if (math.abs(this.m_upperAngle - this.m_lowerAngle) < 2.0 * Settings.angularSlop) { + this.m_limitState = equalLimits$1; + } + else if (jointAngle <= this.m_lowerAngle) { + if (this.m_limitState != atLowerLimit$1) { + this.m_impulse.z = 0.0; + } + this.m_limitState = atLowerLimit$1; + } + else if (jointAngle >= this.m_upperAngle) { + if (this.m_limitState != atUpperLimit$2) { + this.m_impulse.z = 0.0; + } + this.m_limitState = atUpperLimit$2; + } + else { + this.m_limitState = inactiveLimit$2; + this.m_impulse.z = 0.0; + } + } + else { + this.m_limitState = inactiveLimit$2; + } + if (step.warmStarting) { + // Scale impulses to support a variable time step. + this.m_impulse.mul(step.dtRatio); + this.m_motorImpulse *= step.dtRatio; + var P = Vec2.neo(this.m_impulse.x, this.m_impulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_motorImpulse + this.m_impulse.z); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_motorImpulse + this.m_impulse.z); + } + else { + this.m_impulse.setZero(); + this.m_motorImpulse = 0.0; + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + RevoluteJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var fixedRotation = (iA + iB === 0.0); // bool + // Solve motor constraint. + if (this.m_enableMotor && this.m_limitState != equalLimits$1 + && fixedRotation == false) { + var Cdot = wB - wA - this.m_motorSpeed; // float + var impulse = -this.m_motorMass * Cdot; // float + var oldImpulse = this.m_motorImpulse; // float + var maxImpulse = step.dt * this.m_maxMotorTorque; // float + this.m_motorImpulse = math.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_motorImpulse - oldImpulse; + wA -= iA * impulse; + wB += iB * impulse; + } + // Solve limit constraint. + if (this.m_enableLimit && this.m_limitState != inactiveLimit$2 + && fixedRotation == false) { + var Cdot1 = Vec2.zero(); + Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); + var Cdot2 = wB - wA; // float + var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); + var impulse = Vec3.neg(this.m_mass.solve33(Cdot)); // Vec3 + if (this.m_limitState == equalLimits$1) { + this.m_impulse.add(impulse); + } + else if (this.m_limitState == atLowerLimit$1) { + var newImpulse = this.m_impulse.z + impulse.z; // float + if (newImpulse < 0.0) { + var rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2 + var reduced = this.m_mass.solve22(rhs); // Vec2 + impulse.x = reduced.x; + impulse.y = reduced.y; + impulse.z = -this.m_impulse.z; + this.m_impulse.x += reduced.x; + this.m_impulse.y += reduced.y; + this.m_impulse.z = 0.0; + } + else { + this.m_impulse.add(impulse); + } + } + else if (this.m_limitState == atUpperLimit$2) { + var newImpulse = this.m_impulse.z + impulse.z; // float + if (newImpulse > 0.0) { + var rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2 + var reduced = this.m_mass.solve22(rhs); // Vec2 + impulse.x = reduced.x; + impulse.y = reduced.y; + impulse.z = -this.m_impulse.z; + this.m_impulse.x += reduced.x; + this.m_impulse.y += reduced.y; + this.m_impulse.z = 0.0; + } + else { + this.m_impulse.add(impulse); + } + } + var P = Vec2.neo(impulse.x, impulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z); + } + else { + // Solve point-to-point constraint + var Cdot = Vec2.zero(); + Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); + var impulse = this.m_mass.solve22(Vec2.neg(Cdot)); // Vec2 + this.m_impulse.x += impulse.x; + this.m_impulse.y += impulse.y; + vA.subMul(mA, impulse); + wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); + vB.addMul(mB, impulse); + wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + RevoluteJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var angularError = 0.0; // float + var positionError = 0.0; // float + var fixedRotation = (this.m_invIA + this.m_invIB == 0.0); // bool + // Solve angular limit constraint. + if (this.m_enableLimit && this.m_limitState != inactiveLimit$2 + && fixedRotation == false) { + var angle = aB - aA - this.m_referenceAngle; // float + var limitImpulse = 0.0; // float + if (this.m_limitState == equalLimits$1) { + // Prevent large angular corrections + var C = math.clamp(angle - this.m_lowerAngle, -Settings.maxAngularCorrection, Settings.maxAngularCorrection); // float + limitImpulse = -this.m_motorMass * C; + angularError = math.abs(C); + } + else if (this.m_limitState == atLowerLimit$1) { + var C = angle - this.m_lowerAngle; // float + angularError = -C; + // Prevent large angular corrections and allow some slop. + C = math.clamp(C + Settings.angularSlop, -Settings.maxAngularCorrection, 0.0); + limitImpulse = -this.m_motorMass * C; + } + else if (this.m_limitState == atUpperLimit$2) { + var C = angle - this.m_upperAngle; // float + angularError = C; + // Prevent large angular corrections and allow some slop. + C = math.clamp(C - Settings.angularSlop, 0.0, Settings.maxAngularCorrection); + limitImpulse = -this.m_motorMass * C; + } + aA -= this.m_invIA * limitImpulse; + aB += this.m_invIB * limitImpulse; + } + // Solve point-to-point constraint. + { + qA.setAngle(aA); + qB.setAngle(aB); + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2 + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2 + var C = Vec2.zero(); + C.addCombine(1, cB, 1, rB); + C.subCombine(1, cA, 1, rA); + positionError = C.length(); + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var K = new Mat22(); + K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y; + K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y; + K.ey.x = K.ex.y; + K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x; + var impulse = Vec2.neg(K.solve(C)); // Vec2 + cA.subMul(mA, impulse); + aA -= iA * Vec2.crossVec2Vec2(rA, impulse); + cB.addMul(mB, impulse); + aB += iB * Vec2.crossVec2Vec2(rB, impulse); + } + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + return positionError <= Settings.linearSlop + && angularError <= Settings.angularSlop; + }; + RevoluteJoint.TYPE = 'revolute-joint'; + return RevoluteJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var inactiveLimit$1 = 0; +var atLowerLimit = 1; +var atUpperLimit$1 = 2; +var equalLimits = 3; +var DEFAULTS$7 = { + enableLimit: false, + lowerTranslation: 0.0, + upperTranslation: 0.0, + enableMotor: false, + maxMotorForce: 0.0, + motorSpeed: 0.0 +}; +/** + * A prismatic joint. This joint provides one degree of freedom: translation + * along an axis fixed in bodyA. Relative rotation is prevented. You can use a + * joint limit to restrict the range of motion and a joint motor to drive the + * motion or to model joint friction. + */ +var PrismaticJoint = /** @class */ (function (_super) { + __extends(PrismaticJoint, _super); + function PrismaticJoint(def, bodyA, bodyB, anchor, axis) { + var _this = this; + // @ts-ignore + if (!(_this instanceof PrismaticJoint)) { + return new PrismaticJoint(def, bodyA, bodyB, anchor, axis); + } + def = options(def, DEFAULTS$7); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = PrismaticJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + _this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || Vec2.neo(1.0, 0.0)); + _this.m_localXAxisA.normalize(); + _this.m_localYAxisA = Vec2.crossNumVec2(1.0, _this.m_localXAxisA); + _this.m_referenceAngle = math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); + _this.m_impulse = new Vec3(); + _this.m_motorMass = 0.0; + _this.m_motorImpulse = 0.0; + _this.m_lowerTranslation = def.lowerTranslation; + _this.m_upperTranslation = def.upperTranslation; + _this.m_maxMotorForce = def.maxMotorForce; + _this.m_motorSpeed = def.motorSpeed; + _this.m_enableLimit = def.enableLimit; + _this.m_enableMotor = def.enableMotor; + _this.m_limitState = inactiveLimit$1; + _this.m_axis = Vec2.zero(); + _this.m_perp = Vec2.zero(); + _this.m_K = new Mat33(); + return _this; + // Linear constraint (point-to-line) + // d = p2 - p1 = x2 + r2 - x1 - r1 + // C = dot(perp, d) + // Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 - + // cross(w1, r1)) + // = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) + + // dot(cross(r2, perp), v2) + // J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)] + // + // Angular constraint + // C = a2 - a1 + a_initial + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // + // K = J * invM * JT + // + // J = [-a -s1 a s2] + // [0 -1 0 1] + // a = perp + // s1 = cross(d + r1, a) = cross(p2 - x1, a) + // s2 = cross(r2, a) = cross(p2 - x2, a) + // Motor/Limit linear constraint + // C = dot(ax1, d) + // Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) + + // dot(cross(r2, ax1), v2) + // J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)] + // Block Solver + // We develop a block solver that includes the joint limit. This makes the + // limit stiff (inelastic) even + // when the mass has poor distribution (leading to large torques about the + // joint anchor points). + // + // The Jacobian has 3 rows: + // J = [-uT -s1 uT s2] // linear + // [0 -1 0 1] // angular + // [-vT -a1 vT a2] // limit + // + // u = perp + // v = axis + // s1 = cross(d + r1, u), s2 = cross(r2, u) + // a1 = cross(d + r1, v), a2 = cross(r2, v) + // M * (v2 - v1) = JT * df + // J * v2 = bias + // + // v2 = v1 + invM * JT * df + // J * (v1 + invM * JT * df) = bias + // K * df = bias - J * v1 = -Cdot + // K = J * invM * JT + // Cdot = J * v1 - bias + // + // Now solve for f2. + // df = f2 - f1 + // K * (f2 - f1) = -Cdot + // f2 = invK * (-Cdot) + f1 + // + // Clamp accumulated limit impulse. + // lower: f2(3) = max(f2(3), 0) + // upper: f2(3) = min(f2(3), 0) + // + // Solve for correct f2(1:2) + // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1 + // = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3) + // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) + + // K(1:2,1:2) * f1(1:2) + // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + + // f1(1:2) + // + // Now compute impulse to be applied: + // df = f2 - f1 + } + /** @internal */ + PrismaticJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + lowerTranslation: this.m_lowerTranslation, + upperTranslation: this.m_upperTranslation, + maxMotorForce: this.m_maxMotorForce, + motorSpeed: this.m_motorSpeed, + enableLimit: this.m_enableLimit, + enableMotor: this.m_enableMotor, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + localAxisA: this.m_localXAxisA, + referenceAngle: this.m_referenceAngle, + }; + }; + /** @internal */ + PrismaticJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + data.localAxisA = Vec2.clone(data.localAxisA); + var joint = new PrismaticJoint(data); + return joint; + }; + /** @internal */ + PrismaticJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + if (def.localAxisA) { + this.m_localXAxisA.setVec2(def.localAxisA); + this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA)); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + PrismaticJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + PrismaticJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * The local joint axis relative to bodyA. + */ + PrismaticJoint.prototype.getLocalAxisA = function () { + return this.m_localXAxisA; + }; + /** + * Get the reference angle. + */ + PrismaticJoint.prototype.getReferenceAngle = function () { + return this.m_referenceAngle; + }; + /** + * Get the current joint translation, usually in meters. + */ + PrismaticJoint.prototype.getJointTranslation = function () { + var pA = this.m_bodyA.getWorldPoint(this.m_localAnchorA); + var pB = this.m_bodyB.getWorldPoint(this.m_localAnchorB); + var d = Vec2.sub(pB, pA); + var axis = this.m_bodyA.getWorldVector(this.m_localXAxisA); + var translation = Vec2.dot(d, axis); + return translation; + }; + /** + * Get the current joint translation speed, usually in meters per second. + */ + PrismaticJoint.prototype.getJointSpeed = function () { + var bA = this.m_bodyA; + var bB = this.m_bodyB; + var rA = Rot.mulVec2(bA.m_xf.q, Vec2.sub(this.m_localAnchorA, bA.m_sweep.localCenter)); // Vec2 + var rB = Rot.mulVec2(bB.m_xf.q, Vec2.sub(this.m_localAnchorB, bB.m_sweep.localCenter)); // Vec2 + var p1 = Vec2.add(bA.m_sweep.c, rA); // Vec2 + var p2 = Vec2.add(bB.m_sweep.c, rB); // Vec2 + var d = Vec2.sub(p2, p1); // Vec2 + var axis = Rot.mulVec2(bA.m_xf.q, this.m_localXAxisA); // Vec2 + var vA = bA.m_linearVelocity; // Vec2 + var vB = bB.m_linearVelocity; // Vec2 + var wA = bA.m_angularVelocity; // float + var wB = bB.m_angularVelocity; // float + var speed = Vec2.dot(d, Vec2.crossNumVec2(wA, axis)) + + Vec2.dot(axis, Vec2.sub(Vec2.addCrossNumVec2(vB, wB, rB), Vec2.addCrossNumVec2(vA, wA, rA))); // float + return speed; + }; + /** + * Is the joint limit enabled? + */ + PrismaticJoint.prototype.isLimitEnabled = function () { + return this.m_enableLimit; + }; + /** + * Enable/disable the joint limit. + */ + PrismaticJoint.prototype.enableLimit = function (flag) { + if (flag != this.m_enableLimit) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableLimit = flag; + this.m_impulse.z = 0.0; + } + }; + /** + * Get the lower joint limit, usually in meters. + */ + PrismaticJoint.prototype.getLowerLimit = function () { + return this.m_lowerTranslation; + }; + /** + * Get the upper joint limit, usually in meters. + */ + PrismaticJoint.prototype.getUpperLimit = function () { + return this.m_upperTranslation; + }; + /** + * Set the joint limits, usually in meters. + */ + PrismaticJoint.prototype.setLimits = function (lower, upper) { + if (lower != this.m_lowerTranslation || upper != this.m_upperTranslation) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_lowerTranslation = lower; + this.m_upperTranslation = upper; + this.m_impulse.z = 0.0; + } + }; + /** + * Is the joint motor enabled? + */ + PrismaticJoint.prototype.isMotorEnabled = function () { + return this.m_enableMotor; + }; + /** + * Enable/disable the joint motor. + */ + PrismaticJoint.prototype.enableMotor = function (flag) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableMotor = flag; + }; + /** + * Set the motor speed, usually in meters per second. + */ + PrismaticJoint.prototype.setMotorSpeed = function (speed) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_motorSpeed = speed; + }; + /** + * Set the maximum motor force, usually in N. + */ + PrismaticJoint.prototype.setMaxMotorForce = function (force) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_maxMotorForce = force; + }; + PrismaticJoint.prototype.getMaxMotorForce = function () { + return this.m_maxMotorForce; + }; + /** + * Get the motor speed, usually in meters per second. + */ + PrismaticJoint.prototype.getMotorSpeed = function () { + return this.m_motorSpeed; + }; + /** + * Get the current motor force given the inverse time step, usually in N. + */ + PrismaticJoint.prototype.getMotorForce = function (inv_dt) { + return inv_dt * this.m_motorImpulse; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + PrismaticJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + PrismaticJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + PrismaticJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + this.m_impulse.z, this.m_axis).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + PrismaticJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_impulse.y; + }; + PrismaticJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + // Compute the effective masses. + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + var d = Vec2.zero(); + d.addCombine(1, cB, 1, rB); + d.subCombine(1, cA, 1, rA); + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + // Compute motor Jacobian and effective mass. + { + this.m_axis = Rot.mulVec2(qA, this.m_localXAxisA); + this.m_a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_axis); + this.m_a2 = Vec2.crossVec2Vec2(rB, this.m_axis); + this.m_motorMass = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 + * this.m_a2; + if (this.m_motorMass > 0.0) { + this.m_motorMass = 1.0 / this.m_motorMass; + } + } + // Prismatic constraint. + { + this.m_perp = Rot.mulVec2(qA, this.m_localYAxisA); + this.m_s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_perp); + this.m_s2 = Vec2.crossVec2Vec2(rB, this.m_perp); + Vec2.crossVec2Vec2(rA, this.m_perp); + var k11 = mA + mB + iA * this.m_s1 * this.m_s1 + iB * this.m_s2 * this.m_s2; + var k12 = iA * this.m_s1 + iB * this.m_s2; + var k13 = iA * this.m_s1 * this.m_a1 + iB * this.m_s2 * this.m_a2; + var k22 = iA + iB; + if (k22 == 0.0) { + // For bodies with fixed rotation. + k22 = 1.0; + } + var k23 = iA * this.m_a1 + iB * this.m_a2; + var k33 = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 * this.m_a2; + this.m_K.ex.set(k11, k12, k13); + this.m_K.ey.set(k12, k22, k23); + this.m_K.ez.set(k13, k23, k33); + } + // Compute motor and limit terms. + if (this.m_enableLimit) { + var jointTranslation = Vec2.dot(this.m_axis, d); // float + if (math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * Settings.linearSlop) { + this.m_limitState = equalLimits; + } + else if (jointTranslation <= this.m_lowerTranslation) { + if (this.m_limitState != atLowerLimit) { + this.m_limitState = atLowerLimit; + this.m_impulse.z = 0.0; + } + } + else if (jointTranslation >= this.m_upperTranslation) { + if (this.m_limitState != atUpperLimit$1) { + this.m_limitState = atUpperLimit$1; + this.m_impulse.z = 0.0; + } + } + else { + this.m_limitState = inactiveLimit$1; + this.m_impulse.z = 0.0; + } + } + else { + this.m_limitState = inactiveLimit$1; + this.m_impulse.z = 0.0; + } + if (this.m_enableMotor == false) { + this.m_motorImpulse = 0.0; + } + if (step.warmStarting) { + // Account for variable time step. + this.m_impulse.mul(step.dtRatio); + this.m_motorImpulse *= step.dtRatio; + var P = Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + + this.m_impulse.z, this.m_axis); + var LA = this.m_impulse.x * this.m_s1 + this.m_impulse.y + + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1; + var LB = this.m_impulse.x * this.m_s2 + this.m_impulse.y + + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2; + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + else { + this.m_impulse.setZero(); + this.m_motorImpulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + PrismaticJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + // Solve linear motor constraint. + if (this.m_enableMotor && this.m_limitState != equalLimits) { + var Cdot = Vec2.dot(this.m_axis, Vec2.sub(vB, vA)) + this.m_a2 * wB + - this.m_a1 * wA; + var impulse = this.m_motorMass * (this.m_motorSpeed - Cdot); + var oldImpulse = this.m_motorImpulse; + var maxImpulse = step.dt * this.m_maxMotorForce; + this.m_motorImpulse = math.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_motorImpulse - oldImpulse; + var P = Vec2.mulNumVec2(impulse, this.m_axis); + var LA = impulse * this.m_a1; + var LB = impulse * this.m_a2; + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + var Cdot1 = Vec2.zero(); + Cdot1.x += Vec2.dot(this.m_perp, vB) + this.m_s2 * wB; + Cdot1.x -= Vec2.dot(this.m_perp, vA) + this.m_s1 * wA; + Cdot1.y = wB - wA; + if (this.m_enableLimit && this.m_limitState != inactiveLimit$1) { + // Solve prismatic and limit constraint in block form. + var Cdot2 = 0; + Cdot2 += Vec2.dot(this.m_axis, vB) + this.m_a2 * wB; + Cdot2 -= Vec2.dot(this.m_axis, vA) + this.m_a1 * wA; + var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); + var f1 = Vec3.clone(this.m_impulse); + var df = this.m_K.solve33(Vec3.neg(Cdot)); // Vec3 + this.m_impulse.add(df); + if (this.m_limitState == atLowerLimit) { + this.m_impulse.z = math.max(this.m_impulse.z, 0.0); + } + else if (this.m_limitState == atUpperLimit$1) { + this.m_impulse.z = math.min(this.m_impulse.z, 0.0); + } + // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + + // f1(1:2) + var b = Vec2.combine(-1, Cdot1, -(this.m_impulse.z - f1.z), Vec2.neo(this.m_K.ez.x, this.m_K.ez.y)); // Vec2 + var f2r = Vec2.add(this.m_K.solve22(b), Vec2.neo(f1.x, f1.y)); // Vec2 + this.m_impulse.x = f2r.x; + this.m_impulse.y = f2r.y; + df = Vec3.sub(this.m_impulse, f1); + var P = Vec2.combine(df.x, this.m_perp, df.z, this.m_axis); // Vec2 + var LA = df.x * this.m_s1 + df.y + df.z * this.m_a1; // float + var LB = df.x * this.m_s2 + df.y + df.z * this.m_a2; // float + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + else { + // Limit is inactive, just solve the prismatic constraint in block form. + var df = this.m_K.solve22(Vec2.neg(Cdot1)); // Vec2 + this.m_impulse.x += df.x; + this.m_impulse.y += df.y; + var P = Vec2.mulNumVec2(df.x, this.m_perp); // Vec2 + var LA = df.x * this.m_s1 + df.y; // float + var LB = df.x * this.m_s2 + df.y; // float + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + PrismaticJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + // Compute fresh Jacobians + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2 + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2 + var d = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); // Vec2 + var axis = Rot.mulVec2(qA, this.m_localXAxisA); // Vec2 + var a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), axis); // float + var a2 = Vec2.crossVec2Vec2(rB, axis); // float + var perp = Rot.mulVec2(qA, this.m_localYAxisA); // Vec2 + var s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), perp); // float + var s2 = Vec2.crossVec2Vec2(rB, perp); // float + var impulse = new Vec3(); + var C1 = Vec2.zero(); // Vec2 + C1.x = Vec2.dot(perp, d); + C1.y = aB - aA - this.m_referenceAngle; + var linearError = math.abs(C1.x); // float + var angularError = math.abs(C1.y); // float + var linearSlop = Settings.linearSlop; + var maxLinearCorrection = Settings.maxLinearCorrection; + var active = false; // bool + var C2 = 0.0; // float + if (this.m_enableLimit) { + var translation = Vec2.dot(axis, d); // float + if (math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * linearSlop) { + // Prevent large angular corrections + C2 = math.clamp(translation, -maxLinearCorrection, maxLinearCorrection); + linearError = math.max(linearError, math.abs(translation)); + active = true; + } + else if (translation <= this.m_lowerTranslation) { + // Prevent large linear corrections and allow some slop. + C2 = math.clamp(translation - this.m_lowerTranslation + linearSlop, -maxLinearCorrection, 0.0); + linearError = math + .max(linearError, this.m_lowerTranslation - translation); + active = true; + } + else if (translation >= this.m_upperTranslation) { + // Prevent large linear corrections and allow some slop. + C2 = math.clamp(translation - this.m_upperTranslation - linearSlop, 0.0, maxLinearCorrection); + linearError = math + .max(linearError, translation - this.m_upperTranslation); + active = true; + } + } + if (active) { + var k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float + var k12 = iA * s1 + iB * s2; // float + var k13 = iA * s1 * a1 + iB * s2 * a2; // float + var k22 = iA + iB; // float + if (k22 == 0.0) { + // For fixed rotation + k22 = 1.0; + } + var k23 = iA * a1 + iB * a2; // float + var k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; // float + var K = new Mat33(); + K.ex.set(k11, k12, k13); + K.ey.set(k12, k22, k23); + K.ez.set(k13, k23, k33); + var C = new Vec3(); + C.x = C1.x; + C.y = C1.y; + C.z = C2; + impulse = K.solve33(Vec3.neg(C)); + } + else { + var k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float + var k12 = iA * s1 + iB * s2; // float + var k22 = iA + iB; // float + if (k22 == 0.0) { + k22 = 1.0; + } + var K = new Mat22(); + K.ex.setNum(k11, k12); + K.ey.setNum(k12, k22); + var impulse1 = K.solve(Vec2.neg(C1)); // Vec2 + impulse.x = impulse1.x; + impulse.y = impulse1.y; + impulse.z = 0.0; + } + var P = Vec2.combine(impulse.x, perp, impulse.z, axis); // Vec2 + var LA = impulse.x * s1 + impulse.y + impulse.z * a1; // float + var LB = impulse.x * s2 + impulse.y + impulse.z * a2; // float + cA.subMul(mA, P); + aA -= iA * LA; + cB.addMul(mB, P); + aB += iB * LB; + this.m_bodyA.c_position.c = cA; + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c = cB; + this.m_bodyB.c_position.a = aB; + return linearError <= Settings.linearSlop + && angularError <= Settings.angularSlop; + }; + PrismaticJoint.TYPE = 'prismatic-joint'; + return PrismaticJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$6 = { + ratio: 1.0 +}; +/** + * A gear joint is used to connect two joints together. Either joint can be a + * revolute or prismatic joint. You specify a gear ratio to bind the motions + * together: coordinate1 + ratio * coordinate2 = constant + * + * The ratio can be negative or positive. If one joint is a revolute joint and + * the other joint is a prismatic joint, then the ratio will have units of + * length or units of 1/length. Warning: You have to manually destroy the gear + * joint if joint1 or joint2 is destroyed. + * + * This definition requires two existing revolute or prismatic joints (any + * combination will work). + */ +var GearJoint = /** @class */ (function (_super) { + __extends(GearJoint, _super); + function GearJoint(def, bodyA, bodyB, joint1, joint2, ratio) { + var _this = this; + // @ts-ignore + if (!(_this instanceof GearJoint)) { + return new GearJoint(def, bodyA, bodyB, joint1, joint2, ratio); + } + def = options(def, DEFAULTS$6); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = GearJoint.TYPE; + _this.m_joint1 = joint1 ? joint1 : def.joint1; + _this.m_joint2 = joint2 ? joint2 : def.joint2; + _this.m_ratio = math.isFinite(ratio) ? ratio : def.ratio; + _this.m_type1 = _this.m_joint1.getType(); + _this.m_type2 = _this.m_joint2.getType(); + // joint1 connects body A to body C + // joint2 connects body B to body D + var coordinateA; + var coordinateB; + // TODO_ERIN there might be some problem with the joint edges in Joint. + _this.m_bodyC = _this.m_joint1.getBodyA(); + _this.m_bodyA = _this.m_joint1.getBodyB(); + // Get geometry of joint1 + var xfA = _this.m_bodyA.m_xf; + var aA = _this.m_bodyA.m_sweep.a; + var xfC = _this.m_bodyC.m_xf; + var aC = _this.m_bodyC.m_sweep.a; + if (_this.m_type1 === RevoluteJoint.TYPE) { + var revolute = _this.m_joint1; + _this.m_localAnchorC = revolute.m_localAnchorA; + _this.m_localAnchorA = revolute.m_localAnchorB; + _this.m_referenceAngleA = revolute.m_referenceAngle; + _this.m_localAxisC = Vec2.zero(); + coordinateA = aA - aC - _this.m_referenceAngleA; + } + else { + var prismatic = _this.m_joint1; + _this.m_localAnchorC = prismatic.m_localAnchorA; + _this.m_localAnchorA = prismatic.m_localAnchorB; + _this.m_referenceAngleA = prismatic.m_referenceAngle; + _this.m_localAxisC = prismatic.m_localXAxisA; + var pC = _this.m_localAnchorC; + var pA = Rot.mulTVec2(xfC.q, Vec2.add(Rot.mulVec2(xfA.q, _this.m_localAnchorA), Vec2.sub(xfA.p, xfC.p))); + coordinateA = Vec2.dot(pA, _this.m_localAxisC) - Vec2.dot(pC, _this.m_localAxisC); + } + _this.m_bodyD = _this.m_joint2.getBodyA(); + _this.m_bodyB = _this.m_joint2.getBodyB(); + // Get geometry of joint2 + var xfB = _this.m_bodyB.m_xf; + var aB = _this.m_bodyB.m_sweep.a; + var xfD = _this.m_bodyD.m_xf; + var aD = _this.m_bodyD.m_sweep.a; + if (_this.m_type2 === RevoluteJoint.TYPE) { + var revolute = _this.m_joint2; + _this.m_localAnchorD = revolute.m_localAnchorA; + _this.m_localAnchorB = revolute.m_localAnchorB; + _this.m_referenceAngleB = revolute.m_referenceAngle; + _this.m_localAxisD = Vec2.zero(); + coordinateB = aB - aD - _this.m_referenceAngleB; + } + else { + var prismatic = _this.m_joint2; + _this.m_localAnchorD = prismatic.m_localAnchorA; + _this.m_localAnchorB = prismatic.m_localAnchorB; + _this.m_referenceAngleB = prismatic.m_referenceAngle; + _this.m_localAxisD = prismatic.m_localXAxisA; + var pD = _this.m_localAnchorD; + var pB = Rot.mulTVec2(xfD.q, Vec2.add(Rot.mulVec2(xfB.q, _this.m_localAnchorB), Vec2.sub(xfB.p, xfD.p))); + coordinateB = Vec2.dot(pB, _this.m_localAxisD) - Vec2.dot(pD, _this.m_localAxisD); + } + _this.m_constant = coordinateA + _this.m_ratio * coordinateB; + _this.m_impulse = 0.0; + return _this; + // Gear Joint: + // C0 = (coordinate1 + ratio * coordinate2)_initial + // C = (coordinate1 + ratio * coordinate2) - C0 = 0 + // J = [J1 ratio * J2] + // K = J * invM * JT + // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T + // + // Revolute: + // coordinate = rotation + // Cdot = angularVelocity + // J = [0 0 1] + // K = J * invM * JT = invI + // + // Prismatic: + // coordinate = dot(p - pg, ug) + // Cdot = dot(v + cross(w, r), ug) + // J = [ug cross(r, ug)] + // K = J * invM * JT = invMass + invI * cross(r, ug)^2 + } + /** @internal */ + GearJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + joint1: this.m_joint1, + joint2: this.m_joint2, + ratio: this.m_ratio, + // _constant: this.m_constant, + }; + }; + /** @internal */ + GearJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + data.joint1 = restore(Joint, data.joint1, world); + data.joint2 = restore(Joint, data.joint2, world); + var joint = new GearJoint(data); + // if (data._constant) joint.m_constant = data._constant; + return joint; + }; + /** + * Get the first joint. + */ + GearJoint.prototype.getJoint1 = function () { + return this.m_joint1; + }; + /** + * Get the second joint. + */ + GearJoint.prototype.getJoint2 = function () { + return this.m_joint2; + }; + /** + * Set the gear ratio. + */ + GearJoint.prototype.setRatio = function (ratio) { + this.m_ratio = ratio; + }; + /** + * Get the gear ratio. + */ + GearJoint.prototype.getRatio = function () { + return this.m_ratio; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + GearJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + GearJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + GearJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(this.m_impulse, this.m_JvAC).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + GearJoint.prototype.getReactionTorque = function (inv_dt) { + var L = this.m_impulse * this.m_JwA; // float + return inv_dt * L; + }; + GearJoint.prototype.initVelocityConstraints = function (step) { + this.m_lcA = this.m_bodyA.m_sweep.localCenter; + this.m_lcB = this.m_bodyB.m_sweep.localCenter; + this.m_lcC = this.m_bodyC.m_sweep.localCenter; + this.m_lcD = this.m_bodyD.m_sweep.localCenter; + this.m_mA = this.m_bodyA.m_invMass; + this.m_mB = this.m_bodyB.m_invMass; + this.m_mC = this.m_bodyC.m_invMass; + this.m_mD = this.m_bodyD.m_invMass; + this.m_iA = this.m_bodyA.m_invI; + this.m_iB = this.m_bodyB.m_invI; + this.m_iC = this.m_bodyC.m_invI; + this.m_iD = this.m_bodyD.m_invI; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var aC = this.m_bodyC.c_position.a; + var vC = this.m_bodyC.c_velocity.v; + var wC = this.m_bodyC.c_velocity.w; + var aD = this.m_bodyD.c_position.a; + var vD = this.m_bodyD.c_velocity.v; + var wD = this.m_bodyD.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var qC = Rot.neo(aC); + var qD = Rot.neo(aD); + this.m_mass = 0.0; + if (this.m_type1 == RevoluteJoint.TYPE) { + this.m_JvAC = Vec2.zero(); + this.m_JwA = 1.0; + this.m_JwC = 1.0; + this.m_mass += this.m_iA + this.m_iC; + } + else { + var u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2 + var rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2 + var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2 + this.m_JvAC = u; + this.m_JwC = Vec2.crossVec2Vec2(rC, u); + this.m_JwA = Vec2.crossVec2Vec2(rA, u); + this.m_mass += this.m_mC + this.m_mA + this.m_iC * this.m_JwC * this.m_JwC + this.m_iA * this.m_JwA * this.m_JwA; + } + if (this.m_type2 == RevoluteJoint.TYPE) { + this.m_JvBD = Vec2.zero(); + this.m_JwB = this.m_ratio; + this.m_JwD = this.m_ratio; + this.m_mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD); + } + else { + var u = Rot.mulVec2(qD, this.m_localAxisD); // Vec2 + var rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); // Vec2 + var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); // Vec2 + this.m_JvBD = Vec2.mulNumVec2(this.m_ratio, u); + this.m_JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u); + this.m_JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u); + this.m_mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD * this.m_JwD * this.m_JwD + this.m_iB * this.m_JwB * this.m_JwB; + } + // Compute effective mass. + this.m_mass = this.m_mass > 0.0 ? 1.0 / this.m_mass : 0.0; + if (step.warmStarting) { + vA.addMul(this.m_mA * this.m_impulse, this.m_JvAC); + wA += this.m_iA * this.m_impulse * this.m_JwA; + vB.addMul(this.m_mB * this.m_impulse, this.m_JvBD); + wB += this.m_iB * this.m_impulse * this.m_JwB; + vC.subMul(this.m_mC * this.m_impulse, this.m_JvAC); + wC -= this.m_iC * this.m_impulse * this.m_JwC; + vD.subMul(this.m_mD * this.m_impulse, this.m_JvBD); + wD -= this.m_iD * this.m_impulse * this.m_JwD; + } + else { + this.m_impulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + this.m_bodyC.c_velocity.v.setVec2(vC); + this.m_bodyC.c_velocity.w = wC; + this.m_bodyD.c_velocity.v.setVec2(vD); + this.m_bodyD.c_velocity.w = wD; + }; + GearJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var vC = this.m_bodyC.c_velocity.v; + var wC = this.m_bodyC.c_velocity.w; + var vD = this.m_bodyD.c_velocity.v; + var wD = this.m_bodyD.c_velocity.w; + var Cdot = Vec2.dot(this.m_JvAC, vA) - Vec2.dot(this.m_JvAC, vC) + + Vec2.dot(this.m_JvBD, vB) - Vec2.dot(this.m_JvBD, vD); // float + Cdot += (this.m_JwA * wA - this.m_JwC * wC) + + (this.m_JwB * wB - this.m_JwD * wD); + var impulse = -this.m_mass * Cdot; // float + this.m_impulse += impulse; + vA.addMul(this.m_mA * impulse, this.m_JvAC); + wA += this.m_iA * impulse * this.m_JwA; + vB.addMul(this.m_mB * impulse, this.m_JvBD); + wB += this.m_iB * impulse * this.m_JwB; + vC.subMul(this.m_mC * impulse, this.m_JvAC); + wC -= this.m_iC * impulse * this.m_JwC; + vD.subMul(this.m_mD * impulse, this.m_JvBD); + wD -= this.m_iD * impulse * this.m_JwD; + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + this.m_bodyC.c_velocity.v.setVec2(vC); + this.m_bodyC.c_velocity.w = wC; + this.m_bodyD.c_velocity.v.setVec2(vD); + this.m_bodyD.c_velocity.w = wD; + }; + /** + * This returns true if the position errors are within tolerance. + */ + GearJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var cC = this.m_bodyC.c_position.c; + var aC = this.m_bodyC.c_position.a; + var cD = this.m_bodyD.c_position.c; + var aD = this.m_bodyD.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var qC = Rot.neo(aC); + var qD = Rot.neo(aD); + var linearError = 0.0; + var coordinateA; + var coordinateB; + var JvAC; + var JvBD; + var JwA; + var JwB; + var JwC; + var JwD; + var mass = 0.0; + if (this.m_type1 == RevoluteJoint.TYPE) { + JvAC = Vec2.zero(); + JwA = 1.0; + JwC = 1.0; + mass += this.m_iA + this.m_iC; + coordinateA = aA - aC - this.m_referenceAngleA; + } + else { + var u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2 + var rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2 + var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2 + JvAC = u; + JwC = Vec2.crossVec2Vec2(rC, u); + JwA = Vec2.crossVec2Vec2(rA, u); + mass += this.m_mC + this.m_mA + this.m_iC * JwC * JwC + this.m_iA * JwA * JwA; + var pC = Vec2.sub(this.m_localAnchorC, this.m_lcC); // Vec2 + var pA = Rot.mulTVec2(qC, Vec2.add(rA, Vec2.sub(cA, cC))); // Vec2 + coordinateA = Vec2.dot(Vec2.sub(pA, pC), this.m_localAxisC); + } + if (this.m_type2 == RevoluteJoint.TYPE) { + JvBD = Vec2.zero(); + JwB = this.m_ratio; + JwD = this.m_ratio; + mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD); + coordinateB = aB - aD - this.m_referenceAngleB; + } + else { + var u = Rot.mulVec2(qD, this.m_localAxisD); + var rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); + var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); + JvBD = Vec2.mulNumVec2(this.m_ratio, u); + JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u); + JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u); + mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD + * JwD * JwD + this.m_iB * JwB * JwB; + var pD = Vec2.sub(this.m_localAnchorD, this.m_lcD); // Vec2 + var pB = Rot.mulTVec2(qD, Vec2.add(rB, Vec2.sub(cB, cD))); // Vec2 + coordinateB = Vec2.dot(pB, this.m_localAxisD) + - Vec2.dot(pD, this.m_localAxisD); + } + var C = (coordinateA + this.m_ratio * coordinateB) - this.m_constant; // float + var impulse = 0.0; // float + if (mass > 0.0) { + impulse = -C / mass; + } + cA.addMul(this.m_mA * impulse, JvAC); + aA += this.m_iA * impulse * JwA; + cB.addMul(this.m_mB * impulse, JvBD); + aB += this.m_iB * impulse * JwB; + cC.subMul(this.m_mC * impulse, JvAC); + aC -= this.m_iC * impulse * JwC; + cD.subMul(this.m_mD * impulse, JvBD); + aD -= this.m_iD * impulse * JwD; + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + this.m_bodyC.c_position.c.setVec2(cC); + this.m_bodyC.c_position.a = aC; + this.m_bodyD.c_position.c.setVec2(cD); + this.m_bodyD.c_position.a = aD; + // TODO_ERIN not implemented + return linearError < Settings.linearSlop; + }; + GearJoint.TYPE = 'gear-joint'; + return GearJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$5 = { + maxForce: 1.0, + maxTorque: 1.0, + correctionFactor: 0.3 +}; +/** + * A motor joint is used to control the relative motion between two bodies. A + * typical usage is to control the movement of a dynamic body with respect to + * the ground. + */ +var MotorJoint = /** @class */ (function (_super) { + __extends(MotorJoint, _super); + function MotorJoint(def, bodyA, bodyB) { + var _this = this; + // @ts-ignore + if (!(_this instanceof MotorJoint)) { + return new MotorJoint(def, bodyA, bodyB); + } + def = options(def, DEFAULTS$5); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = MotorJoint.TYPE; + _this.m_linearOffset = math.isFinite(def.linearOffset) ? def.linearOffset : bodyA.getLocalPoint(bodyB.getPosition()); + _this.m_angularOffset = math.isFinite(def.angularOffset) ? def.angularOffset : bodyB.getAngle() - bodyA.getAngle(); + _this.m_linearImpulse = Vec2.zero(); + _this.m_angularImpulse = 0.0; + _this.m_maxForce = def.maxForce; + _this.m_maxTorque = def.maxTorque; + _this.m_correctionFactor = def.correctionFactor; + return _this; + // Point-to-point constraint + // Cdot = v2 - v1 + // = v2 + cross(w2, r2) - v1 - cross(w1, r1) + // J = [-I -r1_skew I r2_skew ] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + // Angle constraint + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // K = invI1 + invI2 + } + /** @internal */ + MotorJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + maxForce: this.m_maxForce, + maxTorque: this.m_maxTorque, + correctionFactor: this.m_correctionFactor, + linearOffset: this.m_linearOffset, + angularOffset: this.m_angularOffset, + }; + }; + /** @internal */ + MotorJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new MotorJoint(data); + return joint; + }; + /** @internal */ + MotorJoint.prototype._setAnchors = function (def) { + }; + /** + * Set the maximum friction force in N. + */ + MotorJoint.prototype.setMaxForce = function (force) { + this.m_maxForce = force; + }; + /** + * Get the maximum friction force in N. + */ + MotorJoint.prototype.getMaxForce = function () { + return this.m_maxForce; + }; + /** + * Set the maximum friction torque in N*m. + */ + MotorJoint.prototype.setMaxTorque = function (torque) { + this.m_maxTorque = torque; + }; + /** + * Get the maximum friction torque in N*m. + */ + MotorJoint.prototype.getMaxTorque = function () { + return this.m_maxTorque; + }; + /** + * Set the position correction factor in the range [0,1]. + */ + MotorJoint.prototype.setCorrectionFactor = function (factor) { + this.m_correctionFactor = factor; + }; + /** + * Get the position correction factor in the range [0,1]. + */ + MotorJoint.prototype.getCorrectionFactor = function () { + return this.m_correctionFactor; + }; + /** + * Set/get the target linear offset, in frame A, in meters. + */ + MotorJoint.prototype.setLinearOffset = function (linearOffset) { + if (linearOffset.x != this.m_linearOffset.x + || linearOffset.y != this.m_linearOffset.y) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_linearOffset = linearOffset; + } + }; + MotorJoint.prototype.getLinearOffset = function () { + return this.m_linearOffset; + }; + /** + * Set/get the target angular offset, in radians. + */ + MotorJoint.prototype.setAngularOffset = function (angularOffset) { + if (angularOffset != this.m_angularOffset) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_angularOffset = angularOffset; + } + }; + MotorJoint.prototype.getAngularOffset = function () { + return this.m_angularOffset; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + MotorJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getPosition(); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + MotorJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getPosition(); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + MotorJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + MotorJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_angularImpulse; + }; + MotorJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + // Compute the effective mass matrix. + this.m_rA = Rot.mulVec2(qA, Vec2.neg(this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.neg(this.m_localCenterB)); + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var K = new Mat22(); + K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y * this.m_rB.y; + K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y; + K.ey.x = K.ex.y; + K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x * this.m_rB.x; + this.m_linearMass = K.getInverse(); + this.m_angularMass = iA + iB; + if (this.m_angularMass > 0.0) { + this.m_angularMass = 1.0 / this.m_angularMass; + } + this.m_linearError = Vec2.zero(); + this.m_linearError.addCombine(1, cB, 1, this.m_rB); + this.m_linearError.subCombine(1, cA, 1, this.m_rA); + this.m_linearError.sub(Rot.mulVec2(qA, this.m_linearOffset)); + this.m_angularError = aB - aA - this.m_angularOffset; + if (step.warmStarting) { + // Scale impulses to support a variable time step. + this.m_linearImpulse.mul(step.dtRatio); + this.m_angularImpulse *= step.dtRatio; + var P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse); + } + else { + this.m_linearImpulse.setZero(); + this.m_angularImpulse = 0.0; + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + MotorJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var h = step.dt; + var inv_h = step.inv_dt; + // Solve angular friction + { + var Cdot = wB - wA + inv_h * this.m_correctionFactor * this.m_angularError; + var impulse = -this.m_angularMass * Cdot; + var oldImpulse = this.m_angularImpulse; + var maxImpulse = h * this.m_maxTorque; + this.m_angularImpulse = math.clamp(this.m_angularImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_angularImpulse - oldImpulse; + wA -= iA * impulse; + wB += iB * impulse; + } + // Solve linear friction + { + var Cdot = Vec2.zero(); + Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); + Cdot.addMul(inv_h * this.m_correctionFactor, this.m_linearError); + var impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); + var oldImpulse = Vec2.clone(this.m_linearImpulse); + this.m_linearImpulse.add(impulse); + var maxImpulse = h * this.m_maxForce; + this.m_linearImpulse.clamp(maxImpulse); + impulse = Vec2.sub(this.m_linearImpulse, oldImpulse); + vA.subMul(mA, impulse); + wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); + vB.addMul(mB, impulse); + wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + MotorJoint.prototype.solvePositionConstraints = function (step) { + return true; + }; + MotorJoint.TYPE = 'motor-joint'; + return MotorJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$4 = { + maxForce: 0.0, + frequencyHz: 5.0, + dampingRatio: 0.7 +}; +/** + * A mouse joint is used to make a point on a body track a specified world + * point. This a soft constraint with a maximum force. This allows the + * constraint to stretch and without applying huge forces. + * + * NOTE: this joint is not documented in the manual because it was developed to + * be used in the testbed. If you want to learn how to use the mouse joint, look + * at the testbed. + */ +var MouseJoint = /** @class */ (function (_super) { + __extends(MouseJoint, _super); + function MouseJoint(def, bodyA, bodyB, target) { + var _this = this; + // @ts-ignore + if (!(_this instanceof MouseJoint)) { + return new MouseJoint(def, bodyA, bodyB, target); + } + def = options(def, DEFAULTS$4); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = MouseJoint.TYPE; + if (Vec2.isValid(target)) { + _this.m_targetA = Vec2.clone(target); + } + else if (Vec2.isValid(def.target)) { + _this.m_targetA = Vec2.clone(def.target); + } + else { + _this.m_targetA = Vec2.zero(); + } + _this.m_localAnchorB = Transform.mulTVec2(bodyB.getTransform(), _this.m_targetA); + _this.m_maxForce = def.maxForce; + _this.m_impulse = Vec2.zero(); + _this.m_frequencyHz = def.frequencyHz; + _this.m_dampingRatio = def.dampingRatio; + _this.m_beta = 0.0; + _this.m_gamma = 0.0; + // Solver temp + _this.m_rB = Vec2.zero(); + _this.m_localCenterB = Vec2.zero(); + _this.m_invMassB = 0.0; + _this.m_invIB = 0.0; + _this.m_mass = new Mat22(); + _this.m_C = Vec2.zero(); + return _this; + // p = attached point, m = mouse point + // C = p - m + // Cdot = v + // = v + cross(w, r) + // J = [I r_skew] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + } + /** @internal */ + MouseJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + target: this.m_targetA, + maxForce: this.m_maxForce, + frequencyHz: this.m_frequencyHz, + dampingRatio: this.m_dampingRatio, + _localAnchorB: this.m_localAnchorB, + }; + }; + /** @internal */ + MouseJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + data.target = Vec2.clone(data.target); + var joint = new MouseJoint(data); + if (data._localAnchorB) { + joint.m_localAnchorB = data._localAnchorB; + } + return joint; + }; + /** + * Use this to update the target point. + */ + MouseJoint.prototype.setTarget = function (target) { + if (this.m_bodyB.isAwake() == false) { + this.m_bodyB.setAwake(true); + } + this.m_targetA = Vec2.clone(target); + }; + MouseJoint.prototype.getTarget = function () { + return this.m_targetA; + }; + /** + * Set the maximum force in Newtons. + */ + MouseJoint.prototype.setMaxForce = function (force) { + this.m_maxForce = force; + }; + /** + * Get the maximum force in Newtons. + */ + MouseJoint.prototype.getMaxForce = function () { + return this.m_maxForce; + }; + /** + * Set the frequency in Hertz. + */ + MouseJoint.prototype.setFrequency = function (hz) { + this.m_frequencyHz = hz; + }; + /** + * Get the frequency in Hertz. + */ + MouseJoint.prototype.getFrequency = function () { + return this.m_frequencyHz; + }; + /** + * Set the damping ratio (dimensionless). + */ + MouseJoint.prototype.setDampingRatio = function (ratio) { + this.m_dampingRatio = ratio; + }; + /** + * Get the damping ratio (dimensionless). + */ + MouseJoint.prototype.getDampingRatio = function () { + return this.m_dampingRatio; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + MouseJoint.prototype.getAnchorA = function () { + return Vec2.clone(this.m_targetA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + MouseJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + MouseJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(inv_dt, this.m_impulse); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + MouseJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * 0.0; + }; + /** + * Shift the origin for any points stored in world coordinates. + */ + MouseJoint.prototype.shiftOrigin = function (newOrigin) { + this.m_targetA.sub(newOrigin); + }; + MouseJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIB = this.m_bodyB.m_invI; + var position = this.m_bodyB.c_position; + var velocity = this.m_bodyB.c_velocity; + var cB = position.c; + var aB = position.a; + var vB = velocity.v; + var wB = velocity.w; + var qB = Rot.neo(aB); + var mass = this.m_bodyB.getMass(); + // Frequency + var omega = 2.0 * math.PI * this.m_frequencyHz; + // Damping coefficient + var d = 2.0 * mass * this.m_dampingRatio * omega; + // Spring stiffness + var k = mass * (omega * omega); + // magic formulas + // gamma has units of inverse mass. + // beta has units of inverse time. + var h = step.dt; + this.m_gamma = h * (d + h * k); + if (this.m_gamma != 0.0) { + this.m_gamma = 1.0 / this.m_gamma; + } + this.m_beta = h * k * this.m_gamma; + // Compute the effective mass matrix. + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) * + // invI2 * skew(r2)] + // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y + // -r1.x*r1.y] + // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x] + var K = new Mat22(); + K.ex.x = this.m_invMassB + this.m_invIB * this.m_rB.y * this.m_rB.y + + this.m_gamma; + K.ex.y = -this.m_invIB * this.m_rB.x * this.m_rB.y; + K.ey.x = K.ex.y; + K.ey.y = this.m_invMassB + this.m_invIB * this.m_rB.x * this.m_rB.x + + this.m_gamma; + this.m_mass = K.getInverse(); + this.m_C.setVec2(cB); + this.m_C.addCombine(1, this.m_rB, -1, this.m_targetA); + this.m_C.mul(this.m_beta); + // Cheat with some damping + wB *= 0.98; + if (step.warmStarting) { + this.m_impulse.mul(step.dtRatio); + vB.addMul(this.m_invMassB, this.m_impulse); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, this.m_impulse); + } + else { + this.m_impulse.setZero(); + } + velocity.v.setVec2(vB); + velocity.w = wB; + }; + MouseJoint.prototype.solveVelocityConstraints = function (step) { + var velocity = this.m_bodyB.c_velocity; + var vB = Vec2.clone(velocity.v); + var wB = velocity.w; + // Cdot = v + cross(w, r) + var Cdot = Vec2.crossNumVec2(wB, this.m_rB); + Cdot.add(vB); + Cdot.addCombine(1, this.m_C, this.m_gamma, this.m_impulse); + Cdot.neg(); + var impulse = Mat22.mulVec2(this.m_mass, Cdot); + var oldImpulse = Vec2.clone(this.m_impulse); + this.m_impulse.add(impulse); + var maxImpulse = step.dt * this.m_maxForce; + this.m_impulse.clamp(maxImpulse); + impulse = Vec2.sub(this.m_impulse, oldImpulse); + vB.addMul(this.m_invMassB, impulse); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, impulse); + velocity.v.setVec2(vB); + velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + MouseJoint.prototype.solvePositionConstraints = function (step) { + return true; + }; + MouseJoint.TYPE = 'mouse-joint'; + return MouseJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$3 = { + collideConnected: true +}; +/** + * The pulley joint is connected to two bodies and two fixed ground points. The + * pulley supports a ratio such that: length1 + ratio * length2 <= constant + * + * Yes, the force transmitted is scaled by the ratio. + * + * Warning: the pulley joint can get a bit squirrelly by itself. They often work + * better when combined with prismatic joints. You should also cover the the + * anchor points with static shapes to prevent one side from going to zero + * length. + */ +var PulleyJoint = /** @class */ (function (_super) { + __extends(PulleyJoint, _super); + function PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio) { + var _this = this; + // @ts-ignore + if (!(_this instanceof PulleyJoint)) { + return new PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio); + } + def = options(def, DEFAULTS$3); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = PulleyJoint.TYPE; + _this.m_groundAnchorA = groundA ? groundA : def.groundAnchorA || Vec2.neo(-1.0, 1.0); + _this.m_groundAnchorB = groundB ? groundB : def.groundAnchorB || Vec2.neo(1.0, 1.0); + _this.m_localAnchorA = anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.neo(-1.0, 0.0); + _this.m_localAnchorB = anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.neo(1.0, 0.0); + _this.m_lengthA = math.isFinite(def.lengthA) ? def.lengthA : Vec2.distance(anchorA, groundA); + _this.m_lengthB = math.isFinite(def.lengthB) ? def.lengthB : Vec2.distance(anchorB, groundB); + _this.m_ratio = math.isFinite(ratio) ? ratio : def.ratio; + _this.m_constant = _this.m_lengthA + _this.m_ratio * _this.m_lengthB; + _this.m_impulse = 0.0; + return _this; + // Pulley: + // length1 = norm(p1 - s1) + // length2 = norm(p2 - s2) + // C0 = (length1 + ratio * length2)_initial + // C = C0 - (length1 + ratio * length2) + // u1 = (p1 - s1) / norm(p1 - s1) + // u2 = (p2 - s2) / norm(p2 - s2) + // Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2)) + // J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)] + // K = J * invM * JT + // = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 * + // cross(r2, u2)^2) + } + PulleyJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + groundAnchorA: this.m_groundAnchorA, + groundAnchorB: this.m_groundAnchorB, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + lengthA: this.m_lengthA, + lengthB: this.m_lengthB, + ratio: this.m_ratio, + }; + }; + /** @internal */ + PulleyJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new PulleyJoint(data); + return joint; + }; + /** + * Get the first ground anchor. + */ + PulleyJoint.prototype.getGroundAnchorA = function () { + return this.m_groundAnchorA; + }; + /** + * Get the second ground anchor. + */ + PulleyJoint.prototype.getGroundAnchorB = function () { + return this.m_groundAnchorB; + }; + /** + * Get the current length of the segment attached to bodyA. + */ + PulleyJoint.prototype.getLengthA = function () { + return this.m_lengthA; + }; + /** + * Get the current length of the segment attached to bodyB. + */ + PulleyJoint.prototype.getLengthB = function () { + return this.m_lengthB; + }; + /** + * Get the pulley ratio. + */ + PulleyJoint.prototype.getRatio = function () { + return this.m_ratio; + }; + /** + * Get the current length of the segment attached to bodyA. + */ + PulleyJoint.prototype.getCurrentLengthA = function () { + var p = this.m_bodyA.getWorldPoint(this.m_localAnchorA); + var s = this.m_groundAnchorA; + return Vec2.distance(p, s); + }; + /** + * Get the current length of the segment attached to bodyB. + */ + PulleyJoint.prototype.getCurrentLengthB = function () { + var p = this.m_bodyB.getWorldPoint(this.m_localAnchorB); + var s = this.m_groundAnchorB; + return Vec2.distance(p, s); + }; + /** + * Shift the origin for any points stored in world coordinates. + * + * @param newOrigin + */ + PulleyJoint.prototype.shiftOrigin = function (newOrigin) { + this.m_groundAnchorA.sub(newOrigin); + this.m_groundAnchorB.sub(newOrigin); + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + PulleyJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + PulleyJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + PulleyJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(this.m_impulse, this.m_uB).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + PulleyJoint.prototype.getReactionTorque = function (inv_dt) { + return 0.0; + }; + PulleyJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // Get the pulley axes. + this.m_uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA); + this.m_uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB); + var lengthA = this.m_uA.length(); + var lengthB = this.m_uB.length(); + if (lengthA > 10.0 * Settings.linearSlop) { + this.m_uA.mul(1.0 / lengthA); + } + else { + this.m_uA.setZero(); + } + if (lengthB > 10.0 * Settings.linearSlop) { + this.m_uB.mul(1.0 / lengthB); + } + else { + this.m_uB.setZero(); + } + // Compute effective mass. + var ruA = Vec2.crossVec2Vec2(this.m_rA, this.m_uA); // float + var ruB = Vec2.crossVec2Vec2(this.m_rB, this.m_uB); // float + var mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float + var mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float + this.m_mass = mA + this.m_ratio * this.m_ratio * mB; + if (this.m_mass > 0.0) { + this.m_mass = 1.0 / this.m_mass; + } + if (step.warmStarting) { + // Scale impulses to support variable time steps. + this.m_impulse *= step.dtRatio; + // Warm starting. + var PA = Vec2.mulNumVec2(-this.m_impulse, this.m_uA); + var PB = Vec2.mulNumVec2(-this.m_ratio * this.m_impulse, this.m_uB); + vA.addMul(this.m_invMassA, PA); + wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA); + vB.addMul(this.m_invMassB, PB); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB); + } + else { + this.m_impulse = 0.0; + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + PulleyJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA)); + var vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)); + var Cdot = -Vec2.dot(this.m_uA, vpA) - this.m_ratio + * Vec2.dot(this.m_uB, vpB); // float + var impulse = -this.m_mass * Cdot; // float + this.m_impulse += impulse; + var PA = Vec2.mulNumVec2(-impulse, this.m_uA); // Vec2 + var PB = Vec2.mulNumVec2(-this.m_ratio * impulse, this.m_uB); // Vec2 + vA.addMul(this.m_invMassA, PA); + wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA); + vB.addMul(this.m_invMassB, PB); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB); + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + PulleyJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // Get the pulley axes. + var uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA); + var uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB); + var lengthA = uA.length(); + var lengthB = uB.length(); + if (lengthA > 10.0 * Settings.linearSlop) { + uA.mul(1.0 / lengthA); + } + else { + uA.setZero(); + } + if (lengthB > 10.0 * Settings.linearSlop) { + uB.mul(1.0 / lengthB); + } + else { + uB.setZero(); + } + // Compute effective mass. + var ruA = Vec2.crossVec2Vec2(rA, uA); + var ruB = Vec2.crossVec2Vec2(rB, uB); + var mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float + var mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float + var mass = mA + this.m_ratio * this.m_ratio * mB; // float + if (mass > 0.0) { + mass = 1.0 / mass; + } + var C = this.m_constant - lengthA - this.m_ratio * lengthB; // float + var linearError = math.abs(C); // float + var impulse = -mass * C; // float + var PA = Vec2.mulNumVec2(-impulse, uA); // Vec2 + var PB = Vec2.mulNumVec2(-this.m_ratio * impulse, uB); // Vec2 + cA.addMul(this.m_invMassA, PA); + aA += this.m_invIA * Vec2.crossVec2Vec2(rA, PA); + cB.addMul(this.m_invMassB, PB); + aB += this.m_invIB * Vec2.crossVec2Vec2(rB, PB); + this.m_bodyA.c_position.c = cA; + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c = cB; + this.m_bodyB.c_position.a = aB; + return linearError < Settings.linearSlop; + }; + PulleyJoint.TYPE = 'pulley-joint'; + return PulleyJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var inactiveLimit = 0; +var atUpperLimit = 2; +var DEFAULTS$2 = { + maxLength: 0.0, +}; +/** + * A rope joint enforces a maximum distance between two points on two bodies. It + * has no other effect. + * + * Warning: if you attempt to change the maximum length during the simulation + * you will get some non-physical behavior. + * + * A model that would allow you to dynamically modify the length would have some + * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you + * want to dynamically control length. + */ +var RopeJoint = /** @class */ (function (_super) { + __extends(RopeJoint, _super); + function RopeJoint(def, bodyA, bodyB, anchor) { + var _this = this; + // @ts-ignore + if (!(_this instanceof RopeJoint)) { + return new RopeJoint(def, bodyA, bodyB, anchor); + } + def = options(def, DEFAULTS$2); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = RopeJoint.TYPE; + _this.m_localAnchorA = anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.neo(-1.0, 0.0); + _this.m_localAnchorB = anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.neo(1.0, 0.0); + _this.m_maxLength = def.maxLength; + _this.m_mass = 0.0; + _this.m_impulse = 0.0; + _this.m_length = 0.0; + _this.m_state = inactiveLimit; + return _this; + // Limit: + // C = norm(pB - pA) - L + // u = (pB - pA) / norm(pB - pA) + // Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA)) + // J = [-u -cross(rA, u) u cross(rB, u)] + // K = J * invM * JT + // = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2 + } + /** @internal */ + RopeJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + maxLength: this.m_maxLength, + }; + }; + /** @internal */ + RopeJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new RopeJoint(data); + return joint; + }; + /** + * The local anchor point relative to bodyA's origin. + */ + RopeJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + RopeJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * Set the maximum length of the rope. + */ + RopeJoint.prototype.setMaxLength = function (length) { + this.m_maxLength = length; + }; + /** + * Get the maximum length of the rope. + */ + RopeJoint.prototype.getMaxLength = function () { + return this.m_maxLength; + }; + RopeJoint.prototype.getLimitState = function () { + // TODO LimitState + return this.m_state; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + RopeJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + RopeJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + RopeJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + RopeJoint.prototype.getReactionTorque = function (inv_dt) { + return 0.0; + }; + RopeJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); + this.m_rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); + this.m_u = Vec2.zero(); + this.m_u.addCombine(1, cB, 1, this.m_rB); + this.m_u.subCombine(1, cA, 1, this.m_rA); // Vec2 + this.m_length = this.m_u.length(); + var C = this.m_length - this.m_maxLength; // float + if (C > 0.0) { + this.m_state = atUpperLimit; + } + else { + this.m_state = inactiveLimit; + } + if (this.m_length > Settings.linearSlop) { + this.m_u.mul(1.0 / this.m_length); + } + else { + this.m_u.setZero(); + this.m_mass = 0.0; + this.m_impulse = 0.0; + return; + } + // Compute effective mass. + var crA = Vec2.crossVec2Vec2(this.m_rA, this.m_u); // float + var crB = Vec2.crossVec2Vec2(this.m_rB, this.m_u); // float + var invMass = this.m_invMassA + this.m_invIA * crA * crA + this.m_invMassB + + this.m_invIB * crB * crB; // float + this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0; + if (step.warmStarting) { + // Scale the impulse to support a variable time step. + this.m_impulse *= step.dtRatio; + var P = Vec2.mulNumVec2(this.m_impulse, this.m_u); + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); + } + else { + this.m_impulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + RopeJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + // Cdot = dot(u, v + cross(w, r)) + var vpA = Vec2.addCrossNumVec2(vA, wA, this.m_rA); // Vec2 + var vpB = Vec2.addCrossNumVec2(vB, wB, this.m_rB); // Vec2 + var C = this.m_length - this.m_maxLength; // float + var Cdot = Vec2.dot(this.m_u, Vec2.sub(vpB, vpA)); // float + // Predictive constraint. + if (C < 0.0) { + Cdot += step.inv_dt * C; + } + var impulse = -this.m_mass * Cdot; // float + var oldImpulse = this.m_impulse; // float + this.m_impulse = math.min(0.0, this.m_impulse + impulse); + impulse = this.m_impulse - oldImpulse; + var P = Vec2.mulNumVec2(impulse, this.m_u); // Vec2 + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + RopeJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; // Vec2 + var aA = this.m_bodyA.c_position.a; // float + var cB = this.m_bodyB.c_position.c; // Vec2 + var aB = this.m_bodyB.c_position.a; // float + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); + var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); + var u = Vec2.zero(); + u.addCombine(1, cB, 1, rB); + u.subCombine(1, cA, 1, rA); // Vec2 + var length = u.normalize(); // float + var C = length - this.m_maxLength; // float + C = math.clamp(C, 0.0, Settings.maxLinearCorrection); + var impulse = -this.m_mass * C; // float + var P = Vec2.mulNumVec2(impulse, u); // Vec2 + cA.subMul(this.m_invMassA, P); + aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P); + cB.addMul(this.m_invMassB, P); + aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P); + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + return length - this.m_maxLength < Settings.linearSlop; + }; + RopeJoint.TYPE = 'rope-joint'; + return RopeJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$1 = { + frequencyHz: 0.0, + dampingRatio: 0.0, +}; +/** + * A weld joint essentially glues two bodies together. A weld joint may distort + * somewhat because the island constraint solver is approximate. + */ +var WeldJoint = /** @class */ (function (_super) { + __extends(WeldJoint, _super); + function WeldJoint(def, bodyA, bodyB, anchor) { + var _this = this; + // @ts-ignore + if (!(_this instanceof WeldJoint)) { + return new WeldJoint(def, bodyA, bodyB, anchor); + } + def = options(def, DEFAULTS$1); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = WeldJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + _this.m_referenceAngle = math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); + _this.m_frequencyHz = def.frequencyHz; + _this.m_dampingRatio = def.dampingRatio; + _this.m_impulse = new Vec3(); + _this.m_bias = 0.0; + _this.m_gamma = 0.0; + // Solver temp + _this.m_rA; // Vec2 + _this.m_rB; // Vec2 + _this.m_localCenterA; // Vec2 + _this.m_localCenterB; // Vec2 + _this.m_invMassA; // float + _this.m_invMassB; // float + _this.m_invIA; // float + _this.m_invIB; // float + _this.m_mass = new Mat33(); + return _this; + // Point-to-point constraint + // C = p2 - p1 + // Cdot = v2 - v1 + // / = v2 + cross(w2, r2) - v1 - cross(w1, r1) + // J = [-I -r1_skew I r2_skew ] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + // Angle constraint + // C = angle2 - angle1 - referenceAngle + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // K = invI1 + invI2 + } + /** @internal */ + WeldJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + frequencyHz: this.m_frequencyHz, + dampingRatio: this.m_dampingRatio, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + referenceAngle: this.m_referenceAngle, + }; + }; + /** @internal */ + WeldJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new WeldJoint(data); + return joint; + }; + /** @internal */ + WeldJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + WeldJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + WeldJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * Get the reference angle. + */ + WeldJoint.prototype.getReferenceAngle = function () { + return this.m_referenceAngle; + }; + /** + * Set frequency in Hz. + */ + WeldJoint.prototype.setFrequency = function (hz) { + this.m_frequencyHz = hz; + }; + /** + * Get frequency in Hz. + */ + WeldJoint.prototype.getFrequency = function () { + return this.m_frequencyHz; + }; + /** + * Set damping ratio. + */ + WeldJoint.prototype.setDampingRatio = function (ratio) { + this.m_dampingRatio = ratio; + }; + /** + * Get damping ratio. + */ + WeldJoint.prototype.getDampingRatio = function () { + return this.m_dampingRatio; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + WeldJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + WeldJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + WeldJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + WeldJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_impulse.z; + }; + WeldJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var K = new Mat33(); + K.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y * this.m_rB.y + * iB; + K.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y * this.m_rB.x * iB; + K.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB; + K.ex.y = K.ey.x; + K.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x * this.m_rB.x + * iB; + K.ez.y = this.m_rA.x * iA + this.m_rB.x * iB; + K.ex.z = K.ez.x; + K.ey.z = K.ez.y; + K.ez.z = iA + iB; + if (this.m_frequencyHz > 0.0) { + K.getInverse22(this.m_mass); + var invM = iA + iB; // float + var m = invM > 0.0 ? 1.0 / invM : 0.0; // float + var C = aB - aA - this.m_referenceAngle; // float + // Frequency + var omega = 2.0 * math.PI * this.m_frequencyHz; // float + // Damping coefficient + var d = 2.0 * m * this.m_dampingRatio * omega; // float + // Spring stiffness + var k = m * omega * omega; // float + // magic formulas + var h = step.dt; // float + this.m_gamma = h * (d + h * k); + this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0; + this.m_bias = C * h * k * this.m_gamma; + invM += this.m_gamma; + this.m_mass.ez.z = invM != 0.0 ? 1.0 / invM : 0.0; + } + else if (K.ez.z == 0.0) { + K.getInverse22(this.m_mass); + this.m_gamma = 0.0; + this.m_bias = 0.0; + } + else { + K.getSymInverse33(this.m_mass); + this.m_gamma = 0.0; + this.m_bias = 0.0; + } + if (step.warmStarting) { + // Scale impulses to support a variable time step. + this.m_impulse.mul(step.dtRatio); + var P = Vec2.neo(this.m_impulse.x, this.m_impulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_impulse.z); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_impulse.z); + } + else { + this.m_impulse.setZero(); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + WeldJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + if (this.m_frequencyHz > 0.0) { + var Cdot2 = wB - wA; // float + var impulse2 = -this.m_mass.ez.z + * (Cdot2 + this.m_bias + this.m_gamma * this.m_impulse.z); // float + this.m_impulse.z += impulse2; + wA -= iA * impulse2; + wB += iB * impulse2; + var Cdot1 = Vec2.zero(); + Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2 + var impulse1 = Vec2.neg(Mat33.mulVec2(this.m_mass, Cdot1)); // Vec2 + this.m_impulse.x += impulse1.x; + this.m_impulse.y += impulse1.y; + var P = Vec2.clone(impulse1); // Vec2 + vA.subMul(mA, P); + wA -= iA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(mB, P); + wB += iB * Vec2.crossVec2Vec2(this.m_rB, P); + } + else { + var Cdot1 = Vec2.zero(); + Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2 + var Cdot2 = wB - wA; // float + var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); // Vec3 + var impulse = Vec3.neg(Mat33.mulVec3(this.m_mass, Cdot)); // Vec3 + this.m_impulse.add(impulse); + var P = Vec2.neo(impulse.x, impulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + WeldJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + var positionError; + var angularError; + var K = new Mat33(); + K.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB; + K.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB; + K.ez.x = -rA.y * iA - rB.y * iB; + K.ex.y = K.ey.x; + K.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB; + K.ez.y = rA.x * iA + rB.x * iB; + K.ex.z = K.ez.x; + K.ey.z = K.ez.y; + K.ez.z = iA + iB; + if (this.m_frequencyHz > 0.0) { + var C1 = Vec2.zero(); + C1.addCombine(1, cB, 1, rB); + C1.subCombine(1, cA, 1, rA); // Vec2 + positionError = C1.length(); + angularError = 0.0; + var P = Vec2.neg(K.solve22(C1)); // Vec2 + cA.subMul(mA, P); + aA -= iA * Vec2.crossVec2Vec2(rA, P); + cB.addMul(mB, P); + aB += iB * Vec2.crossVec2Vec2(rB, P); + } + else { + var C1 = Vec2.zero(); + C1.addCombine(1, cB, 1, rB); + C1.subCombine(1, cA, 1, rA); + var C2 = aB - aA - this.m_referenceAngle; // float + positionError = C1.length(); + angularError = math.abs(C2); + var C = new Vec3(C1.x, C1.y, C2); + var impulse = new Vec3(); + if (K.ez.z > 0.0) { + impulse = Vec3.neg(K.solve33(C)); + } + else { + var impulse2 = Vec2.neg(K.solve22(C1)); + impulse.set(impulse2.x, impulse2.y, 0.0); + } + var P = Vec2.neo(impulse.x, impulse.y); + cA.subMul(mA, P); + aA -= iA * (Vec2.crossVec2Vec2(rA, P) + impulse.z); + cB.addMul(mB, P); + aB += iB * (Vec2.crossVec2Vec2(rB, P) + impulse.z); + } + this.m_bodyA.c_position.c = cA; + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c = cB; + this.m_bodyB.c_position.a = aB; + return positionError <= Settings.linearSlop && angularError <= Settings.angularSlop; + }; + WeldJoint.TYPE = 'weld-joint'; + return WeldJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS = { + enableMotor: false, + maxMotorTorque: 0.0, + motorSpeed: 0.0, + frequencyHz: 2.0, + dampingRatio: 0.7, +}; +/** + * A wheel joint. This joint provides two degrees of freedom: translation along + * an axis fixed in bodyA and rotation in the plane. In other words, it is a + * point to line constraint with a rotational motor and a linear spring/damper. + * This joint is designed for vehicle suspensions. + */ +var WheelJoint = /** @class */ (function (_super) { + __extends(WheelJoint, _super); + // @ts-ignore + function WheelJoint(def, bodyA, bodyB, anchor, axis) { + var _this = this; + // @ts-ignore + if (!(_this instanceof WheelJoint)) { + return new WheelJoint(def, bodyA, bodyB, anchor, axis); + } + def = options(def, DEFAULTS); + _this = _super.call(this, def, bodyA, bodyB) || this; + /** @internal */ _this.m_ax = Vec2.zero(); + /** @internal */ _this.m_ay = Vec2.zero(); + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = WheelJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + // @ts-ignore localAxis + _this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || def.localAxis || Vec2.neo(1.0, 0.0)); + _this.m_localYAxisA = Vec2.crossNumVec2(1.0, _this.m_localXAxisA); + _this.m_mass = 0.0; + _this.m_impulse = 0.0; + _this.m_motorMass = 0.0; + _this.m_motorImpulse = 0.0; + _this.m_springMass = 0.0; + _this.m_springImpulse = 0.0; + _this.m_maxMotorTorque = def.maxMotorTorque; + _this.m_motorSpeed = def.motorSpeed; + _this.m_enableMotor = def.enableMotor; + _this.m_frequencyHz = def.frequencyHz; + _this.m_dampingRatio = def.dampingRatio; + _this.m_bias = 0.0; + _this.m_gamma = 0.0; + return _this; + // Linear constraint (point-to-line) + // d = pB - pA = xB + rB - xA - rA + // C = dot(ay, d) + // Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA, + // rA)) + // = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB, + // ay), vB) + // J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)] + // Spring linear constraint + // C = dot(ax, d) + // Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) + + // dot(cross(rB, ax), vB) + // J = [-ax -cross(d+rA, ax) ax cross(rB, ax)] + // Motor rotational constraint + // Cdot = wB - wA + // J = [0 0 -1 0 0 1] + } + /** @internal */ + WheelJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + enableMotor: this.m_enableMotor, + maxMotorTorque: this.m_maxMotorTorque, + motorSpeed: this.m_motorSpeed, + frequencyHz: this.m_frequencyHz, + dampingRatio: this.m_dampingRatio, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + localAxisA: this.m_localXAxisA, + }; + }; + /** @internal */ + WheelJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new WheelJoint(data); + return joint; + }; + /** @internal */ + WheelJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + if (def.localAxisA) { + this.m_localXAxisA.setVec2(def.localAxisA); + this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA)); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + WheelJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + WheelJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * The local joint axis relative to bodyA. + */ + WheelJoint.prototype.getLocalAxisA = function () { + return this.m_localXAxisA; + }; + /** + * Get the current joint translation, usually in meters. + */ + WheelJoint.prototype.getJointTranslation = function () { + var bA = this.m_bodyA; + var bB = this.m_bodyB; + var pA = bA.getWorldPoint(this.m_localAnchorA); // Vec2 + var pB = bB.getWorldPoint(this.m_localAnchorB); // Vec2 + var d = Vec2.sub(pB, pA); // Vec2 + var axis = bA.getWorldVector(this.m_localXAxisA); // Vec2 + var translation = Vec2.dot(d, axis); // float + return translation; + }; + /** + * Get the current joint translation speed, usually in meters per second. + */ + WheelJoint.prototype.getJointSpeed = function () { + var wA = this.m_bodyA.m_angularVelocity; + var wB = this.m_bodyB.m_angularVelocity; + return wB - wA; + }; + /** + * Is the joint motor enabled? + */ + WheelJoint.prototype.isMotorEnabled = function () { + return this.m_enableMotor; + }; + /** + * Enable/disable the joint motor. + */ + WheelJoint.prototype.enableMotor = function (flag) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableMotor = flag; + }; + /** + * Set the motor speed, usually in radians per second. + */ + WheelJoint.prototype.setMotorSpeed = function (speed) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_motorSpeed = speed; + }; + /** + * Get the motor speed, usually in radians per second. + */ + WheelJoint.prototype.getMotorSpeed = function () { + return this.m_motorSpeed; + }; + /** + * Set/Get the maximum motor force, usually in N-m. + */ + WheelJoint.prototype.setMaxMotorTorque = function (torque) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_maxMotorTorque = torque; + }; + WheelJoint.prototype.getMaxMotorTorque = function () { + return this.m_maxMotorTorque; + }; + /** + * Get the current motor torque given the inverse time step, usually in N-m. + */ + WheelJoint.prototype.getMotorTorque = function (inv_dt) { + return inv_dt * this.m_motorImpulse; + }; + /** + * Set/Get the spring frequency in hertz. Setting the frequency to zero disables + * the spring. + */ + WheelJoint.prototype.setSpringFrequencyHz = function (hz) { + this.m_frequencyHz = hz; + }; + WheelJoint.prototype.getSpringFrequencyHz = function () { + return this.m_frequencyHz; + }; + /** + * Set/Get the spring damping ratio + */ + WheelJoint.prototype.setSpringDampingRatio = function (ratio) { + this.m_dampingRatio = ratio; + }; + WheelJoint.prototype.getSpringDampingRatio = function () { + return this.m_dampingRatio; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + WheelJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + WheelJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + WheelJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + WheelJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_motorImpulse; + }; + WheelJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + // Compute the effective masses. + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + var d = Vec2.zero(); + d.addCombine(1, cB, 1, rB); + d.subCombine(1, cA, 1, rA); // Vec2 + // Point to line constraint + { + this.m_ay = Rot.mulVec2(qA, this.m_localYAxisA); + this.m_sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ay); + this.m_sBy = Vec2.crossVec2Vec2(rB, this.m_ay); + this.m_mass = mA + mB + iA * this.m_sAy * this.m_sAy + iB * this.m_sBy + * this.m_sBy; + if (this.m_mass > 0.0) { + this.m_mass = 1.0 / this.m_mass; + } + } + // Spring constraint + this.m_springMass = 0.0; + this.m_bias = 0.0; + this.m_gamma = 0.0; + if (this.m_frequencyHz > 0.0) { + this.m_ax = Rot.mulVec2(qA, this.m_localXAxisA); + this.m_sAx = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ax); + this.m_sBx = Vec2.crossVec2Vec2(rB, this.m_ax); + var invMass = mA + mB + iA * this.m_sAx * this.m_sAx + iB * this.m_sBx + * this.m_sBx; // float + if (invMass > 0.0) { + this.m_springMass = 1.0 / invMass; + var C = Vec2.dot(d, this.m_ax); // float + // Frequency + var omega = 2.0 * math.PI * this.m_frequencyHz; // float + // Damping coefficient + var damp = 2.0 * this.m_springMass * this.m_dampingRatio * omega; // float + // Spring stiffness + var k = this.m_springMass * omega * omega; // float + // magic formulas + var h = step.dt; // float + this.m_gamma = h * (damp + h * k); + if (this.m_gamma > 0.0) { + this.m_gamma = 1.0 / this.m_gamma; + } + this.m_bias = C * h * k * this.m_gamma; + this.m_springMass = invMass + this.m_gamma; + if (this.m_springMass > 0.0) { + this.m_springMass = 1.0 / this.m_springMass; + } + } + } + else { + this.m_springImpulse = 0.0; + } + // Rotational motor + if (this.m_enableMotor) { + this.m_motorMass = iA + iB; + if (this.m_motorMass > 0.0) { + this.m_motorMass = 1.0 / this.m_motorMass; + } + } + else { + this.m_motorMass = 0.0; + this.m_motorImpulse = 0.0; + } + if (step.warmStarting) { + // Account for variable time step. + this.m_impulse *= step.dtRatio; + this.m_springImpulse *= step.dtRatio; + this.m_motorImpulse *= step.dtRatio; + var P = Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax); + var LA = this.m_impulse * this.m_sAy + this.m_springImpulse * this.m_sAx + this.m_motorImpulse; + var LB = this.m_impulse * this.m_sBy + this.m_springImpulse * this.m_sBx + this.m_motorImpulse; + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * LA; + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * LB; + } + else { + this.m_impulse = 0.0; + this.m_springImpulse = 0.0; + this.m_motorImpulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + WheelJoint.prototype.solveVelocityConstraints = function (step) { + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + // Solve spring constraint + { + var Cdot = Vec2.dot(this.m_ax, vB) - Vec2.dot(this.m_ax, vA) + this.m_sBx + * wB - this.m_sAx * wA; // float + var impulse = -this.m_springMass + * (Cdot + this.m_bias + this.m_gamma * this.m_springImpulse); // float + this.m_springImpulse += impulse; + var P = Vec2.mulNumVec2(impulse, this.m_ax); // Vec2 + var LA = impulse * this.m_sAx; // float + var LB = impulse * this.m_sBx; // float + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + // Solve rotational motor constraint + { + var Cdot = wB - wA - this.m_motorSpeed; // float + var impulse = -this.m_motorMass * Cdot; // float + var oldImpulse = this.m_motorImpulse; // float + var maxImpulse = step.dt * this.m_maxMotorTorque; // float + this.m_motorImpulse = math.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_motorImpulse - oldImpulse; + wA -= iA * impulse; + wB += iB * impulse; + } + // Solve point to line constraint + { + var Cdot = Vec2.dot(this.m_ay, vB) - Vec2.dot(this.m_ay, vA) + this.m_sBy + * wB - this.m_sAy * wA; // float + var impulse = -this.m_mass * Cdot; // float + this.m_impulse += impulse; + var P = Vec2.mulNumVec2(impulse, this.m_ay); // Vec2 + var LA = impulse * this.m_sAy; // float + var LB = impulse * this.m_sBy; // float + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + WheelJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + var d = Vec2.zero(); + d.addCombine(1, cB, 1, rB); + d.subCombine(1, cA, 1, rA); + var ay = Rot.mulVec2(qA, this.m_localYAxisA); + var sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), ay); // float + var sBy = Vec2.crossVec2Vec2(rB, ay); // float + var C = Vec2.dot(d, ay); // float + var k = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_sAy + * this.m_sAy + this.m_invIB * this.m_sBy * this.m_sBy; // float + var impulse; // float + if (k != 0.0) { + impulse = -C / k; + } + else { + impulse = 0.0; + } + var P = Vec2.mulNumVec2(impulse, ay); // Vec2 + var LA = impulse * sAy; // float + var LB = impulse * sBy; // float + cA.subMul(this.m_invMassA, P); + aA -= this.m_invIA * LA; + cB.addMul(this.m_invMassB, P); + aB += this.m_invIB * LB; + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + return math.abs(C) <= Settings.linearSlop; + }; + WheelJoint.TYPE = 'wheel-joint'; + return WheelJoint; +}(Joint)); + +var SID = 0; +function Serializer(opts) { + var _a; + opts = opts || {}; + var rootClass = opts.rootClass || World; + var preSerialize = opts.preSerialize || function (obj) { return obj; }; + var postSerialize = opts.postSerialize || function (data, obj) { return data; }; + var preDeserialize = opts.preDeserialize || function (data) { return data; }; + var postDeserialize = opts.postDeserialize || function (obj, data) { return obj; }; + // This is used to create ref objects during serialize + var refTypes = { + World: World, + Body: Body, + Joint: Joint, + Fixture: Fixture, + Shape: Shape, + }; + // This is used by restore to deserialize objects and refs + var restoreTypes = __assign({ Vec2: Vec2, + Vec3: Vec3 }, refTypes); + var CLASS_BY_TYPE_PROP = (_a = {}, + _a[Body.STATIC] = Body, + _a[Body.DYNAMIC] = Body, + _a[Body.KINEMATIC] = Body, + _a[ChainShape.TYPE] = ChainShape, + _a[BoxShape.TYPE] = BoxShape, + _a[EdgeShape.TYPE] = EdgeShape, + _a[PolygonShape.TYPE] = PolygonShape, + _a[CircleShape.TYPE] = CircleShape, + _a[DistanceJoint.TYPE] = DistanceJoint, + _a[FrictionJoint.TYPE] = FrictionJoint, + _a[GearJoint.TYPE] = GearJoint, + _a[MotorJoint.TYPE] = MotorJoint, + _a[MouseJoint.TYPE] = MouseJoint, + _a[PrismaticJoint.TYPE] = PrismaticJoint, + _a[PulleyJoint.TYPE] = PulleyJoint, + _a[RevoluteJoint.TYPE] = RevoluteJoint, + _a[RopeJoint.TYPE] = RopeJoint, + _a[WeldJoint.TYPE] = WeldJoint, + _a[WheelJoint.TYPE] = WheelJoint, + _a); + this.toJson = function (root) { + var json = []; + var queue = [root]; + var refMap = {}; + function storeRef(value, typeName) { + value.__sid = value.__sid || ++SID; + if (!refMap[value.__sid]) { + queue.push(value); + var index = json.length + queue.length; + var ref = { + refIndex: index, + refType: typeName + }; + refMap[value.__sid] = ref; + } + return refMap[value.__sid]; + } + function serialize(obj) { + obj = preSerialize(obj); + var data = obj._serialize(); + data = postSerialize(data, obj); + return data; + } + function toJson(value, top) { + if (typeof value !== 'object' || value === null) { + return value; + } + if (typeof value._serialize === 'function') { + if (value !== top) { + // tslint:disable-next-line:no-for-in + for (var typeName in refTypes) { + if (value instanceof refTypes[typeName]) { + return storeRef(value, typeName); + } + } + } + value = serialize(value); + } + if (Array.isArray(value)) { + var newValue = []; + for (var key = 0; key < value.length; key++) { + newValue[key] = toJson(value[key]); + } + value = newValue; + } + else { + var newValue = {}; + // tslint:disable-next-line:no-for-in + for (var key in value) { + if (value.hasOwnProperty(key)) { + newValue[key] = toJson(value[key]); + } + } + value = newValue; + } + return value; + } + while (queue.length) { + var obj = queue.shift(); + var str = toJson(obj, obj); + json.push(str); + } + return json; + }; + this.fromJson = function (json) { + var refMap = {}; + function findDeserilizer(data, cls) { + if (!cls || !cls._deserialize) { + cls = CLASS_BY_TYPE_PROP[data.type]; + } + return cls && cls._deserialize; + } + /** + * Deserialize a data object. + */ + function deserialize(cls, data, ctx) { + var deserializer = findDeserilizer(data, cls); + if (!deserializer) { + return; + } + data = preDeserialize(data); + var obj = deserializer(data, ctx, restoreRef); + obj = postDeserialize(obj, data); + return obj; + } + /** + * Restore a ref object or deserialize a data object. + * + * This is passed as callback to class deserializers. + */ + function restoreRef(cls, ref, ctx) { + if (!ref.refIndex) { + return cls && cls._deserialize && deserialize(cls, ref, ctx); + } + cls = restoreTypes[ref.refType] || cls; + var index = ref.refIndex; + if (!refMap[index]) { + var data = json[index]; + var obj = deserialize(cls, data, ctx); + refMap[index] = obj; + } + return refMap[index]; + } + var root = rootClass._deserialize(json[0], null, restoreRef); + return root; + }; +} +var serializer = new Serializer(); +Serializer.toJson = serializer.toJson; +Serializer.fromJson = serializer.fromJson; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact); +function CircleCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + CollideCircles(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); +} +var CollideCircles = function (manifold, circleA, xfA, circleB, xfB) { + manifold.pointCount = 0; + var pA = Transform.mulVec2(xfA, circleA.m_p); + var pB = Transform.mulVec2(xfB, circleB.m_p); + var distSqr = Vec2.distanceSquared(pB, pA); + var rA = circleA.m_radius; + var rB = circleB.m_radius; + var radius = rA + rB; + if (distSqr > radius * radius) { + return; + } + manifold.type = exports.ManifoldType.e_circles; + manifold.localPoint.setVec2(circleA.m_p); + manifold.localNormal.setZero(); + manifold.pointCount = 1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = exports.ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(EdgeShape.TYPE, CircleShape.TYPE, EdgeCircleContact); +Contact.addType(ChainShape.TYPE, CircleShape.TYPE, ChainCircleContact); +function EdgeCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + var shapeA = fixtureA.getShape(); + var shapeB = fixtureB.getShape(); + CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB); +} +function ChainCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + var chain = fixtureA.getShape(); + var edge = new EdgeShape(); + chain.getChildEdge(edge, indexA); + var shapeA = edge; + var shapeB = fixtureB.getShape(); + CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB); +} +// Compute contact points for edge versus circle. +// This accounts for edge connectivity. +var CollideEdgeCircle = function (manifold, edgeA, xfA, circleB, xfB) { + manifold.pointCount = 0; + // Compute circle in frame of edge + var Q = Transform.mulTVec2(xfA, Transform.mulVec2(xfB, circleB.m_p)); + var A = edgeA.m_vertex1; + var B = edgeA.m_vertex2; + var e = Vec2.sub(B, A); + // Barycentric coordinates + var u = Vec2.dot(e, Vec2.sub(B, Q)); + var v = Vec2.dot(e, Vec2.sub(Q, A)); + var radius = edgeA.m_radius + circleB.m_radius; + // Region A + if (v <= 0.0) { + var P_1 = Vec2.clone(A); + var d_1 = Vec2.sub(Q, P_1); + var dd_1 = Vec2.dot(d_1, d_1); + if (dd_1 > radius * radius) { + return; + } + // Is there an edge connected to A? + if (edgeA.m_hasVertex0) { + var A1 = edgeA.m_vertex0; + var B1 = A; + var e1 = Vec2.sub(B1, A1); + var u1 = Vec2.dot(e1, Vec2.sub(B1, Q)); + // Is the circle in Region AB of the previous edge? + if (u1 > 0.0) { + return; + } + } + manifold.type = exports.ManifoldType.e_circles; + manifold.localNormal.setZero(); + manifold.localPoint.setVec2(P_1); + manifold.pointCount = 1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = exports.ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; + return; + } + // Region B + if (u <= 0.0) { + var P_2 = Vec2.clone(B); + var d_2 = Vec2.sub(Q, P_2); + var dd_2 = Vec2.dot(d_2, d_2); + if (dd_2 > radius * radius) { + return; + } + // Is there an edge connected to B? + if (edgeA.m_hasVertex3) { + var B2 = edgeA.m_vertex3; + var A2 = B; + var e2 = Vec2.sub(B2, A2); + var v2 = Vec2.dot(e2, Vec2.sub(Q, A2)); + // Is the circle in Region AB of the next edge? + if (v2 > 0.0) { + return; + } + } + manifold.type = exports.ManifoldType.e_circles; + manifold.localNormal.setZero(); + manifold.localPoint.setVec2(P_2); + manifold.pointCount = 1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 1; + manifold.points[0].id.cf.typeA = exports.ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; + return; + } + // Region AB + var den = Vec2.dot(e, e); + var P = Vec2.combine(u / den, A, v / den, B); + var d = Vec2.sub(Q, P); + var dd = Vec2.dot(d, d); + if (dd > radius * radius) { + return; + } + var n = Vec2.neo(-e.y, e.x); + if (Vec2.dot(n, Vec2.sub(Q, A)) < 0.0) { + n.setNum(-n.x, -n.y); + } + n.normalize(); + manifold.type = exports.ManifoldType.e_faceA; + manifold.localNormal = n; + manifold.localPoint.setVec2(A); + manifold.pointCount = 1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = exports.ContactFeatureType.e_face; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(PolygonShape.TYPE, PolygonShape.TYPE, PolygonContact); +function PolygonContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + CollidePolygons(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); +} +/** + * Find the max separation between poly1 and poly2 using edge normals from + * poly1. + */ +function findMaxSeparation(poly1, xf1, poly2, xf2, output) { + var count1 = poly1.m_count; + var count2 = poly2.m_count; + var n1s = poly1.m_normals; + var v1s = poly1.m_vertices; + var v2s = poly2.m_vertices; + var xf = Transform.mulTXf(xf2, xf1); + var bestIndex = 0; + var maxSeparation = -Infinity; + for (var i = 0; i < count1; ++i) { + // Get poly1 normal in frame2. + var n = Rot.mulVec2(xf.q, n1s[i]); + var v1 = Transform.mulVec2(xf, v1s[i]); + // Find deepest point for normal i. + var si = Infinity; + for (var j = 0; j < count2; ++j) { + var sij = Vec2.dot(n, v2s[j]) - Vec2.dot(n, v1); + if (sij < si) { + si = sij; + } + } + if (si > maxSeparation) { + maxSeparation = si; + bestIndex = i; + } + } + // used to keep last FindMaxSeparation call values + output.maxSeparation = maxSeparation; + output.bestIndex = bestIndex; +} +function findIncidentEdge(c, poly1, xf1, edge1, poly2, xf2) { + var normals1 = poly1.m_normals; + var count2 = poly2.m_count; + var vertices2 = poly2.m_vertices; + var normals2 = poly2.m_normals; + // Get the normal of the reference edge in poly2's frame. + var normal1 = Rot.mulTVec2(xf2.q, Rot.mulVec2(xf1.q, normals1[edge1])); + // Find the incident edge on poly2. + var index = 0; + var minDot = Infinity; + for (var i = 0; i < count2; ++i) { + var dot = Vec2.dot(normal1, normals2[i]); + if (dot < minDot) { + minDot = dot; + index = i; + } + } + // Build the clip vertices for the incident edge. + var i1 = index; + var i2 = i1 + 1 < count2 ? i1 + 1 : 0; + c[0].v = Transform.mulVec2(xf2, vertices2[i1]); + c[0].id.cf.indexA = edge1; + c[0].id.cf.indexB = i1; + c[0].id.cf.typeA = exports.ContactFeatureType.e_face; + c[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; + c[1].v = Transform.mulVec2(xf2, vertices2[i2]); + c[1].id.cf.indexA = edge1; + c[1].id.cf.indexB = i2; + c[1].id.cf.typeA = exports.ContactFeatureType.e_face; + c[1].id.cf.typeB = exports.ContactFeatureType.e_vertex; +} +var maxSeparation = { + maxSeparation: 0, + bestIndex: 0, +}; +/** + * + * Find edge normal of max separation on A - return if separating axis is found
+ * Find edge normal of max separation on B - return if separation axis is found
+ * Choose reference edge as min(minA, minB)
+ * Find incident edge
+ * Clip + * + * The normal points from 1 to 2 + */ +var CollidePolygons = function (manifold, polyA, xfA, polyB, xfB) { + manifold.pointCount = 0; + var totalRadius = polyA.m_radius + polyB.m_radius; + findMaxSeparation(polyA, xfA, polyB, xfB, maxSeparation); + var edgeA = maxSeparation.bestIndex; + var separationA = maxSeparation.maxSeparation; + if (separationA > totalRadius) + return; + findMaxSeparation(polyB, xfB, polyA, xfA, maxSeparation); + var edgeB = maxSeparation.bestIndex; + var separationB = maxSeparation.maxSeparation; + if (separationB > totalRadius) + return; + var poly1; // reference polygon + var poly2; // incident polygon + var xf1; + var xf2; + var edge1; // reference edge + var flip; + var k_tol = 0.1 * Settings.linearSlop; + if (separationB > separationA + k_tol) { + poly1 = polyB; + poly2 = polyA; + xf1 = xfB; + xf2 = xfA; + edge1 = edgeB; + manifold.type = exports.ManifoldType.e_faceB; + flip = 1; + } + else { + poly1 = polyA; + poly2 = polyB; + xf1 = xfA; + xf2 = xfB; + edge1 = edgeA; + manifold.type = exports.ManifoldType.e_faceA; + flip = 0; + } + var incidentEdge = [new ClipVertex(), new ClipVertex()]; + findIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2); + var count1 = poly1.m_count; + var vertices1 = poly1.m_vertices; + var iv1 = edge1; + var iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0; + var v11 = vertices1[iv1]; + var v12 = vertices1[iv2]; + var localTangent = Vec2.sub(v12, v11); + localTangent.normalize(); + var localNormal = Vec2.crossVec2Num(localTangent, 1.0); + var planePoint = Vec2.combine(0.5, v11, 0.5, v12); + var tangent = Rot.mulVec2(xf1.q, localTangent); + var normal = Vec2.crossVec2Num(tangent, 1.0); + v11 = Transform.mulVec2(xf1, v11); + v12 = Transform.mulVec2(xf1, v12); + // Face offset. + var frontOffset = Vec2.dot(normal, v11); + // Side offsets, extended by polytope skin thickness. + var sideOffset1 = -Vec2.dot(tangent, v11) + totalRadius; + var sideOffset2 = Vec2.dot(tangent, v12) + totalRadius; + // Clip incident edge against extruded edge1 side edges. + var clipPoints1 = [new ClipVertex(), new ClipVertex()]; + var clipPoints2 = [new ClipVertex(), new ClipVertex()]; + var np; + // Clip to box side 1 + np = clipSegmentToLine(clipPoints1, incidentEdge, Vec2.neg(tangent), sideOffset1, iv1); + if (np < 2) { + return; + } + // Clip to negative box side 1 + np = clipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2); + if (np < 2) { + return; + } + // Now clipPoints2 contains the clipped points. + manifold.localNormal = localNormal; + manifold.localPoint = planePoint; + var pointCount = 0; + for (var i = 0; i < clipPoints2.length /* maxManifoldPoints */; ++i) { + var separation = Vec2.dot(normal, clipPoints2[i].v) - frontOffset; + if (separation <= totalRadius) { + var cp = manifold.points[pointCount]; + cp.localPoint.setVec2(Transform.mulTVec2(xf2, clipPoints2[i].v)); + cp.id = clipPoints2[i].id; + if (flip) { + // Swap features + var cf = cp.id.cf; + var indexA = cf.indexA; + var indexB = cf.indexB; + var typeA = cf.typeA; + var typeB = cf.typeB; + cf.indexA = indexB; + cf.indexB = indexA; + cf.typeA = typeB; + cf.typeB = typeA; + } + ++pointCount; + } + } + manifold.pointCount = pointCount; +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(PolygonShape.TYPE, CircleShape.TYPE, PolygonCircleContact); +function PolygonCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + CollidePolygonCircle(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); +} +var CollidePolygonCircle = function (manifold, polygonA, xfA, circleB, xfB) { + manifold.pointCount = 0; + // Compute circle position in the frame of the polygon. + var c = Transform.mulVec2(xfB, circleB.m_p); + var cLocal = Transform.mulTVec2(xfA, c); + // Find the min separating edge. + var normalIndex = 0; + var separation = -Infinity; + var radius = polygonA.m_radius + circleB.m_radius; + var vertexCount = polygonA.m_count; + var vertices = polygonA.m_vertices; + var normals = polygonA.m_normals; + for (var i = 0; i < vertexCount; ++i) { + var s = Vec2.dot(normals[i], Vec2.sub(cLocal, vertices[i])); + if (s > radius) { + // Early out. + return; + } + if (s > separation) { + separation = s; + normalIndex = i; + } + } + // Vertices that subtend the incident face. + var vertIndex1 = normalIndex; + var vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0; + var v1 = vertices[vertIndex1]; + var v2 = vertices[vertIndex2]; + // If the center is inside the polygon ... + if (separation < math.EPSILON) { + manifold.pointCount = 1; + manifold.type = exports.ManifoldType.e_faceA; + manifold.localNormal.setVec2(normals[normalIndex]); + manifold.localPoint.setCombine(0.5, v1, 0.5, v2); + manifold.points[0].localPoint = circleB.m_p; + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = exports.ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; + return; + } + // Compute barycentric coordinates + var u1 = Vec2.dot(Vec2.sub(cLocal, v1), Vec2.sub(v2, v1)); + var u2 = Vec2.dot(Vec2.sub(cLocal, v2), Vec2.sub(v1, v2)); + if (u1 <= 0.0) { + if (Vec2.distanceSquared(cLocal, v1) > radius * radius) { + return; + } + manifold.pointCount = 1; + manifold.type = exports.ManifoldType.e_faceA; + manifold.localNormal.setCombine(1, cLocal, -1, v1); + manifold.localNormal.normalize(); + manifold.localPoint = v1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = exports.ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; + } + else if (u2 <= 0.0) { + if (Vec2.distanceSquared(cLocal, v2) > radius * radius) { + return; + } + manifold.pointCount = 1; + manifold.type = exports.ManifoldType.e_faceA; + manifold.localNormal.setCombine(1, cLocal, -1, v2); + manifold.localNormal.normalize(); + manifold.localPoint.setVec2(v2); + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = exports.ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; + } + else { + var faceCenter = Vec2.mid(v1, v2); + var separation_1 = Vec2.dot(cLocal, normals[vertIndex1]) - Vec2.dot(faceCenter, normals[vertIndex1]); + if (separation_1 > radius) { + return; + } + manifold.pointCount = 1; + manifold.type = exports.ManifoldType.e_faceA; + manifold.localNormal.setVec2(normals[vertIndex1]); + manifold.localPoint.setVec2(faceCenter); + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = exports.ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; + } +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(EdgeShape.TYPE, PolygonShape.TYPE, EdgePolygonContact); +Contact.addType(ChainShape.TYPE, PolygonShape.TYPE, ChainPolygonContact); +function EdgePolygonContact(manifold, xfA, fA, indexA, xfB, fB, indexB) { + CollideEdgePolygon(manifold, fA.getShape(), xfA, fB.getShape(), xfB); +} +function ChainPolygonContact(manifold, xfA, fA, indexA, xfB, fB, indexB) { + var chain = fA.getShape(); + var edge = new EdgeShape(); + chain.getChildEdge(edge, indexA); + CollideEdgePolygon(manifold, edge, xfA, fB.getShape(), xfB); +} +var EPAxisType; +(function (EPAxisType) { + EPAxisType[EPAxisType["e_unknown"] = -1] = "e_unknown"; + EPAxisType[EPAxisType["e_edgeA"] = 1] = "e_edgeA"; + EPAxisType[EPAxisType["e_edgeB"] = 2] = "e_edgeB"; +})(EPAxisType || (EPAxisType = {})); +// unused? +var VertexType; +(function (VertexType) { + VertexType[VertexType["e_isolated"] = 0] = "e_isolated"; + VertexType[VertexType["e_concave"] = 1] = "e_concave"; + VertexType[VertexType["e_convex"] = 2] = "e_convex"; +})(VertexType || (VertexType = {})); +/** + * This structure is used to keep track of the best separating axis. + */ +var EPAxis = /** @class */ (function () { + function EPAxis() { + } + return EPAxis; +}()); +/** + * This holds polygon B expressed in frame A. + */ +var TempPolygon = /** @class */ (function () { + function TempPolygon() { + this.vertices = []; // [Settings.maxPolygonVertices] + this.normals = []; // [Settings.maxPolygonVertices]; + this.count = 0; + } + return TempPolygon; +}()); +/** + * Reference face used for clipping + */ +var ReferenceFace = /** @class */ (function () { + function ReferenceFace() { + this.normal = Vec2.zero(); + this.sideNormal1 = Vec2.zero(); + this.sideNormal2 = Vec2.zero(); + } + return ReferenceFace; +}()); +// reused +var edgeAxis = new EPAxis(); +var polygonAxis = new EPAxis(); +var polygonBA = new TempPolygon(); +var rf = new ReferenceFace(); +/** + * This function collides and edge and a polygon, taking into account edge + * adjacency. + */ +var CollideEdgePolygon = function (manifold, edgeA, xfA, polygonB, xfB) { + // Algorithm: + // 1. Classify v1 and v2 + // 2. Classify polygon centroid as front or back + // 3. Flip normal if necessary + // 4. Initialize normal range to [-pi, pi] about face normal + // 5. Adjust normal range according to adjacent edges + // 6. Visit each separating axes, only accept axes within the range + // 7. Return if _any_ axis indicates separation + // 8. Clip + // let m_type1: VertexType; + // let m_type2: VertexType; + var xf = Transform.mulTXf(xfA, xfB); + var centroidB = Transform.mulVec2(xf, polygonB.m_centroid); + var v0 = edgeA.m_vertex0; + var v1 = edgeA.m_vertex1; + var v2 = edgeA.m_vertex2; + var v3 = edgeA.m_vertex3; + var hasVertex0 = edgeA.m_hasVertex0; + var hasVertex3 = edgeA.m_hasVertex3; + var edge1 = Vec2.sub(v2, v1); + edge1.normalize(); + var normal1 = Vec2.neo(edge1.y, -edge1.x); + var offset1 = Vec2.dot(normal1, Vec2.sub(centroidB, v1)); + var offset0 = 0.0; + var offset2 = 0.0; + var convex1 = false; + var convex2 = false; + var normal0; + var normal2; + // Is there a preceding edge? + if (hasVertex0) { + var edge0 = Vec2.sub(v1, v0); + edge0.normalize(); + normal0 = Vec2.neo(edge0.y, -edge0.x); + convex1 = Vec2.crossVec2Vec2(edge0, edge1) >= 0.0; + offset0 = Vec2.dot(normal0, centroidB) - Vec2.dot(normal0, v0); + } + // Is there a following edge? + if (hasVertex3) { + var edge2 = Vec2.sub(v3, v2); + edge2.normalize(); + normal2 = Vec2.neo(edge2.y, -edge2.x); + convex2 = Vec2.crossVec2Vec2(edge1, edge2) > 0.0; + offset2 = Vec2.dot(normal2, centroidB) - Vec2.dot(normal2, v2); + } + var front; + var normal = Vec2.zero(); + var lowerLimit = Vec2.zero(); + var upperLimit = Vec2.zero(); + // Determine front or back collision. Determine collision normal limits. + if (hasVertex0 && hasVertex3) { + if (convex1 && convex2) { + front = offset0 >= 0.0 || offset1 >= 0.0 || offset2 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal0); + upperLimit.setVec2(normal2); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setMul(-1, normal1); + } + } + else if (convex1) { + front = offset0 >= 0.0 || (offset1 >= 0.0 && offset2 >= 0.0); + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal0); + upperLimit.setVec2(normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal2); + upperLimit.setMul(-1, normal1); + } + } + else if (convex2) { + front = offset2 >= 0.0 || (offset0 >= 0.0 && offset1 >= 0.0); + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal1); + upperLimit.setVec2(normal2); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setMul(-1, normal0); + } + } + else { + front = offset0 >= 0.0 && offset1 >= 0.0 && offset2 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal1); + upperLimit.setVec2(normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal2); + upperLimit.setMul(-1, normal0); + } + } + } + else if (hasVertex0) { + if (convex1) { + front = offset0 >= 0.0 || offset1 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal0); + upperLimit.setMul(-1, normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setVec2(normal1); + upperLimit.setMul(-1, normal1); + } + } + else { + front = offset0 >= 0.0 && offset1 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal1); + upperLimit.setMul(-1, normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setVec2(normal1); + upperLimit.setMul(-1, normal0); + } + } + } + else if (hasVertex3) { + if (convex2) { + front = offset1 >= 0.0 || offset2 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setVec2(normal2); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setVec2(normal1); + } + } + else { + front = offset1 >= 0.0 && offset2 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setVec2(normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal2); + upperLimit.setVec2(normal1); + } + } + } + else { + front = offset1 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setMul(-1, normal1); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setVec2(normal1); + upperLimit.setVec2(normal1); + } + } + // Get polygonB in frameA + polygonBA.count = polygonB.m_count; + for (var i = 0; i < polygonB.m_count; ++i) { + polygonBA.vertices[i] = Transform.mulVec2(xf, polygonB.m_vertices[i]); + polygonBA.normals[i] = Rot.mulVec2(xf.q, polygonB.m_normals[i]); + } + var radius = 2.0 * Settings.polygonRadius; + manifold.pointCount = 0; + { // ComputeEdgeSeparation + edgeAxis.type = EPAxisType.e_edgeA; + edgeAxis.index = front ? 0 : 1; + edgeAxis.separation = Infinity; + for (var i = 0; i < polygonBA.count; ++i) { + var s = Vec2.dot(normal, Vec2.sub(polygonBA.vertices[i], v1)); + if (s < edgeAxis.separation) { + edgeAxis.separation = s; + } + } + } + // If no valid normal can be found than this edge should not collide. + // @ts-ignore + if (edgeAxis.type == EPAxisType.e_unknown) { + return; + } + if (edgeAxis.separation > radius) { + return; + } + { // ComputePolygonSeparation + polygonAxis.type = EPAxisType.e_unknown; + polygonAxis.index = -1; + polygonAxis.separation = -Infinity; + var perp = Vec2.neo(-normal.y, normal.x); + for (var i = 0; i < polygonBA.count; ++i) { + var n = Vec2.neg(polygonBA.normals[i]); + var s1 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v1)); + var s2 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v2)); + var s = math.min(s1, s2); + if (s > radius) { + // No collision + polygonAxis.type = EPAxisType.e_edgeB; + polygonAxis.index = i; + polygonAxis.separation = s; + break; + } + // Adjacency + if (Vec2.dot(n, perp) >= 0.0) { + if (Vec2.dot(Vec2.sub(n, upperLimit), normal) < -Settings.angularSlop) { + continue; + } + } + else { + if (Vec2.dot(Vec2.sub(n, lowerLimit), normal) < -Settings.angularSlop) { + continue; + } + } + if (s > polygonAxis.separation) { + polygonAxis.type = EPAxisType.e_edgeB; + polygonAxis.index = i; + polygonAxis.separation = s; + } + } + } + if (polygonAxis.type != EPAxisType.e_unknown && polygonAxis.separation > radius) { + return; + } + // Use hysteresis for jitter reduction. + var k_relativeTol = 0.98; + var k_absoluteTol = 0.001; + var primaryAxis; + if (polygonAxis.type == EPAxisType.e_unknown) { + primaryAxis = edgeAxis; + } + else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) { + primaryAxis = polygonAxis; + } + else { + primaryAxis = edgeAxis; + } + var ie = [new ClipVertex(), new ClipVertex()]; + if (primaryAxis.type == EPAxisType.e_edgeA) { + manifold.type = exports.ManifoldType.e_faceA; + // Search for the polygon normal that is most anti-parallel to the edge + // normal. + var bestIndex = 0; + var bestValue = Vec2.dot(normal, polygonBA.normals[0]); + for (var i = 1; i < polygonBA.count; ++i) { + var value = Vec2.dot(normal, polygonBA.normals[i]); + if (value < bestValue) { + bestValue = value; + bestIndex = i; + } + } + var i1 = bestIndex; + var i2 = i1 + 1 < polygonBA.count ? i1 + 1 : 0; + ie[0].v = polygonBA.vertices[i1]; + ie[0].id.cf.indexA = 0; + ie[0].id.cf.indexB = i1; + ie[0].id.cf.typeA = exports.ContactFeatureType.e_face; + ie[0].id.cf.typeB = exports.ContactFeatureType.e_vertex; + ie[1].v = polygonBA.vertices[i2]; + ie[1].id.cf.indexA = 0; + ie[1].id.cf.indexB = i2; + ie[1].id.cf.typeA = exports.ContactFeatureType.e_face; + ie[1].id.cf.typeB = exports.ContactFeatureType.e_vertex; + if (front) { + rf.i1 = 0; + rf.i2 = 1; + rf.v1 = v1; + rf.v2 = v2; + rf.normal.setVec2(normal1); + } + else { + rf.i1 = 1; + rf.i2 = 0; + rf.v1 = v2; + rf.v2 = v1; + rf.normal.setMul(-1, normal1); + } + } + else { + manifold.type = exports.ManifoldType.e_faceB; + ie[0].v = v1; + ie[0].id.cf.indexA = 0; + ie[0].id.cf.indexB = primaryAxis.index; + ie[0].id.cf.typeA = exports.ContactFeatureType.e_vertex; + ie[0].id.cf.typeB = exports.ContactFeatureType.e_face; + ie[1].v = v2; + ie[1].id.cf.indexA = 0; + ie[1].id.cf.indexB = primaryAxis.index; + ie[1].id.cf.typeA = exports.ContactFeatureType.e_vertex; + ie[1].id.cf.typeB = exports.ContactFeatureType.e_face; + rf.i1 = primaryAxis.index; + rf.i2 = rf.i1 + 1 < polygonBA.count ? rf.i1 + 1 : 0; + rf.v1 = polygonBA.vertices[rf.i1]; + rf.v2 = polygonBA.vertices[rf.i2]; + rf.normal.setVec2(polygonBA.normals[rf.i1]); + } + rf.sideNormal1.setNum(rf.normal.y, -rf.normal.x); + rf.sideNormal2.setMul(-1, rf.sideNormal1); + rf.sideOffset1 = Vec2.dot(rf.sideNormal1, rf.v1); + rf.sideOffset2 = Vec2.dot(rf.sideNormal2, rf.v2); + // Clip incident edge against extruded edge1 side edges. + var clipPoints1 = [new ClipVertex(), new ClipVertex()]; + var clipPoints2 = [new ClipVertex(), new ClipVertex()]; + var np; + // Clip to box side 1 + np = clipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1); + if (np < Settings.maxManifoldPoints) { + return; + } + // Clip to negative box side 1 + np = clipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2); + if (np < Settings.maxManifoldPoints) { + return; + } + // Now clipPoints2 contains the clipped points. + if (primaryAxis.type == EPAxisType.e_edgeA) { + manifold.localNormal = Vec2.clone(rf.normal); + manifold.localPoint = Vec2.clone(rf.v1); + } + else { + manifold.localNormal = Vec2.clone(polygonB.m_normals[rf.i1]); + manifold.localPoint = Vec2.clone(polygonB.m_vertices[rf.i1]); + } + var pointCount = 0; + for (var i = 0; i < Settings.maxManifoldPoints; ++i) { + var separation = Vec2.dot(rf.normal, Vec2.sub(clipPoints2[i].v, rf.v1)); + if (separation <= radius) { + var cp = manifold.points[pointCount]; // ManifoldPoint + if (primaryAxis.type == EPAxisType.e_edgeA) { + cp.localPoint = Transform.mulTVec2(xf, clipPoints2[i].v); + cp.id = clipPoints2[i].id; + } + else { + cp.localPoint = clipPoints2[i].v; + cp.id.cf.typeA = clipPoints2[i].id.cf.typeB; + cp.id.cf.typeB = clipPoints2[i].id.cf.typeA; + cp.id.cf.indexA = clipPoints2[i].id.cf.indexB; + cp.id.cf.indexB = clipPoints2[i].id.cf.indexA; + } + ++pointCount; + } + } + manifold.pointCount = pointCount; +}; + +/** @deprecated Merged with main namespace */ +var internal = { + CollidePolygons: CollidePolygons, + Settings: Settings, + Sweep: Sweep, + Manifold: Manifold, + Distance: Distance, + TimeOfImpact: TimeOfImpact, + DynamicTree: DynamicTree, + stats: stats +}; + +var planck = /*#__PURE__*/Object.freeze({ + __proto__: null, + internal: internal, + Serializer: Serializer, + math: math, + Vec2: Vec2, + Vec3: Vec3, + Mat22: Mat22, + Mat33: Mat33, + Transform: Transform, + Rot: Rot, + AABB: AABB, + Shape: Shape, + FixtureProxy: FixtureProxy, + Fixture: Fixture, + MassData: MassData, + Body: Body, + ContactEdge: ContactEdge, + mixFriction: mixFriction, + mixRestitution: mixRestitution, + VelocityConstraintPoint: VelocityConstraintPoint, + Contact: Contact, + JointEdge: JointEdge, + Joint: Joint, + World: World, + CircleShape: CircleShape, + Circle: Circle, + EdgeShape: EdgeShape, + Edge: Edge, + PolygonShape: PolygonShape, + Polygon: Polygon, + ChainShape: ChainShape, + Chain: Chain, + BoxShape: BoxShape, + Box: Box, + CollideCircles: CollideCircles, + CollideEdgeCircle: CollideEdgeCircle, + CollidePolygons: CollidePolygons, + CollidePolygonCircle: CollidePolygonCircle, + CollideEdgePolygon: CollideEdgePolygon, + DistanceJoint: DistanceJoint, + FrictionJoint: FrictionJoint, + GearJoint: GearJoint, + MotorJoint: MotorJoint, + MouseJoint: MouseJoint, + PrismaticJoint: PrismaticJoint, + PulleyJoint: PulleyJoint, + RevoluteJoint: RevoluteJoint, + RopeJoint: RopeJoint, + WeldJoint: WeldJoint, + WheelJoint: WheelJoint, + Settings: Settings, + Sweep: Sweep, + get ManifoldType () { return exports.ManifoldType; }, + get ContactFeatureType () { return exports.ContactFeatureType; }, + get PointState () { return exports.PointState; }, + ClipVertex: ClipVertex, + Manifold: Manifold, + ManifoldPoint: ManifoldPoint, + ContactID: ContactID, + ContactFeature: ContactFeature, + WorldManifold: WorldManifold, + getPointStates: getPointStates, + clipSegmentToLine: clipSegmentToLine, + DistanceInput: DistanceInput, + DistanceOutput: DistanceOutput, + SimplexCache: SimplexCache, + Distance: Distance, + DistanceProxy: DistanceProxy, + testOverlap: testOverlap, + TOIInput: TOIInput, + get TOIOutputState () { return exports.TOIOutputState; }, + TOIOutput: TOIOutput, + TimeOfImpact: TimeOfImpact, + TreeNode: TreeNode, + DynamicTree: DynamicTree, + stats: stats +}); + +exports.AABB = AABB; +exports.Body = Body; +exports.Box = Box; +exports.BoxShape = BoxShape; +exports.Chain = Chain; +exports.ChainShape = ChainShape; +exports.Circle = Circle; +exports.CircleShape = CircleShape; +exports.ClipVertex = ClipVertex; +exports.CollideCircles = CollideCircles; +exports.CollideEdgeCircle = CollideEdgeCircle; +exports.CollideEdgePolygon = CollideEdgePolygon; +exports.CollidePolygonCircle = CollidePolygonCircle; +exports.CollidePolygons = CollidePolygons; +exports.Contact = Contact; +exports.ContactEdge = ContactEdge; +exports.ContactFeature = ContactFeature; +exports.ContactID = ContactID; +exports.Distance = Distance; +exports.DistanceInput = DistanceInput; +exports.DistanceJoint = DistanceJoint; +exports.DistanceOutput = DistanceOutput; +exports.DistanceProxy = DistanceProxy; +exports.DynamicTree = DynamicTree; +exports.Edge = Edge; +exports.EdgeShape = EdgeShape; +exports.Fixture = Fixture; +exports.FixtureProxy = FixtureProxy; +exports.FrictionJoint = FrictionJoint; +exports.GearJoint = GearJoint; +exports.Joint = Joint; +exports.JointEdge = JointEdge; +exports.Manifold = Manifold; +exports.ManifoldPoint = ManifoldPoint; +exports.MassData = MassData; +exports.Mat22 = Mat22; +exports.Mat33 = Mat33; +exports.MotorJoint = MotorJoint; +exports.MouseJoint = MouseJoint; +exports.Polygon = Polygon; +exports.PolygonShape = PolygonShape; +exports.PrismaticJoint = PrismaticJoint; +exports.PulleyJoint = PulleyJoint; +exports.RevoluteJoint = RevoluteJoint; +exports.RopeJoint = RopeJoint; +exports.Rot = Rot; +exports.Serializer = Serializer; +exports.Settings = Settings; +exports.Shape = Shape; +exports.SimplexCache = SimplexCache; +exports.Sweep = Sweep; +exports.TOIInput = TOIInput; +exports.TOIOutput = TOIOutput; +exports.TimeOfImpact = TimeOfImpact; +exports.Transform = Transform; +exports.TreeNode = TreeNode; +exports.Vec2 = Vec2; +exports.Vec3 = Vec3; +exports.VelocityConstraintPoint = VelocityConstraintPoint; +exports.WeldJoint = WeldJoint; +exports.WheelJoint = WheelJoint; +exports.World = World; +exports.WorldManifold = WorldManifold; +exports.clipSegmentToLine = clipSegmentToLine; +exports["default"] = planck; +exports.getPointStates = getPointStates; +exports.internal = internal; +exports.math = math; +exports.mixFriction = mixFriction; +exports.mixRestitution = mixRestitution; +exports.stats = stats; +exports.testOverlap = testOverlap; +//# sourceMappingURL=planck.cjs.map diff --git a/dist/planck.cjs.map b/dist/planck.cjs.map new file mode 100644 index 00000000..34ca98f0 --- /dev/null +++ b/dist/planck.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"planck.cjs","sources":["../node_modules/tslib/tslib.es6.js","../src/util/options.ts","../src/common/Math.ts","../src/common/Vec2.ts","../src/collision/AABB.ts","../src/Settings.ts","../src/util/Pool.ts","../src/collision/DynamicTree.ts","../src/collision/BroadPhase.ts","../src/common/Rot.ts","../src/common/Transform.ts","../src/common/Sweep.ts","../src/dynamics/Velocity.ts","../src/dynamics/Position.ts","../src/collision/Shape.ts","../src/dynamics/Fixture.ts","../src/dynamics/Body.ts","../src/dynamics/Joint.ts","../src/util/stats.ts","../src/util/Timer.ts","../src/collision/Distance.ts","../src/collision/TimeOfImpact.ts","../src/dynamics/Solver.ts","../src/common/Mat22.ts","../src/collision/Manifold.ts","../src/dynamics/Contact.ts","../src/dynamics/World.ts","../src/common/Vec3.ts","../src/collision/shape/EdgeShape.ts","../src/collision/shape/ChainShape.ts","../src/collision/shape/PolygonShape.ts","../src/collision/shape/BoxShape.ts","../src/collision/shape/CircleShape.ts","../src/dynamics/joint/DistanceJoint.ts","../src/dynamics/joint/FrictionJoint.ts","../src/common/Mat33.ts","../src/dynamics/joint/RevoluteJoint.ts","../src/dynamics/joint/PrismaticJoint.ts","../src/dynamics/joint/GearJoint.ts","../src/dynamics/joint/MotorJoint.ts","../src/dynamics/joint/MouseJoint.ts","../src/dynamics/joint/PulleyJoint.ts","../src/dynamics/joint/RopeJoint.ts","../src/dynamics/joint/WeldJoint.ts","../src/dynamics/joint/WheelJoint.ts","../src/serializer/index.ts","../src/collision/shape/CollideCircle.ts","../src/collision/shape/CollideEdgeCircle.ts","../src/collision/shape/CollidePolygon.ts","../src/collision/shape/CollideCirclePolygon.ts","../src/collision/shape/CollideEdgePolygon.ts","../src/index.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","export const options = function(input: T, defaults: object): T {\n if (input === null || typeof input === 'undefined') {\n // tslint:disable-next-line:no-object-literal-type-assertion\n input = {} as T;\n }\n\n const output = {...input};\n\n // tslint:disable-next-line:no-for-in\n for (const key in defaults) {\n if (defaults.hasOwnProperty(key) && typeof input[key] === 'undefined') {\n output[key] = defaults[key];\n }\n }\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n const symbols = Object.getOwnPropertySymbols(defaults);\n for (let i = 0; i < symbols.length; i++) {\n const symbol = symbols[i];\n if (defaults.propertyIsEnumerable(symbol) && typeof input[symbol] === 'undefined') {\n output[symbol] = defaults[symbol];\n }\n }\n }\n\n return output;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\nexport const math = Object.assign(Object.create(Math) as typeof Math, {\n EPSILON: 1e-9, // TODO\n\n /**\n * This function is used to ensure that a floating point number is not a NaN or\n * infinity.\n */\n isFinite: function(x: unknown): boolean {\n return (typeof x === 'number') && isFinite(x) && !isNaN(x);\n },\n\n assert: function(x: any): void {\n _ASSERT && console.assert(!math.isFinite(x), 'Invalid Number!', x);\n },\n\n /**\n * Next Largest Power of 2 Given a binary integer value x, the next largest\n * power of 2 can be computed by a SWAR algorithm that recursively \"folds\" the\n * upper bits into the lower bits. This process yields a bit vector with the\n * same most significant 1 as x, but all 1's below it. Adding 1 to that value\n * yields the next largest power of 2. For a 32-bit value:\n */\n nextPowerOfTwo: function(x: number): number {\n // TODO\n x |= (x >> 1);\n x |= (x >> 2);\n x |= (x >> 4);\n x |= (x >> 8);\n x |= (x >> 16);\n return x + 1;\n },\n\n isPowerOfTwo: function(x: number): boolean {\n return x > 0 && (x & (x - 1)) === 0;\n },\n\n mod: function(num: number, min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n if (max > min) {\n num = (num - min) % (max - min);\n return num + (num < 0 ? max : min);\n } else {\n num = (num - max) % (min - max);\n return num + (num <= 0 ? min : max);\n }\n },\n /**\n * Returns a min if num is less than min, and max if more than max, otherwise returns num.\n */\n clamp: function(num: number, min: number, max: number): number {\n if (num < min) {\n return min;\n } else if (num > max) {\n return max;\n } else {\n return num;\n }\n },\n /**\n * Returns a random number between min and max when two arguments are provided.\n * If one arg is provided between 0 to max.\n * If one arg is passed between 0 to 1.\n */\n random: function(min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n return min === max ? min : Math.random() * (max - min) + min;\n }\n});\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport interface Vec2Value {\n x: number;\n y: number;\n}\n\nexport class Vec2 {\n x: number;\n y: number;\n\n constructor(x: number, y: number);\n constructor(obj: { x: number, y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Vec2)) {\n return new Vec2(x, y);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n } else {\n this.x = x;\n this.y = y;\n }\n _ASSERT && Vec2.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = data.x;\n obj.y = data.y;\n return obj;\n }\n\n static zero(): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = 0;\n obj.y = 0;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = x;\n obj.y = y;\n return obj;\n }\n\n static clone(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(v.x, v.y);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Vec2.isValid(o), 'Invalid Vec2!', o);\n }\n\n clone(): Vec2 {\n return Vec2.clone(this);\n }\n\n /**\n * Set this vector to all zeros.\n *\n * @returns this\n */\n setZero(): Vec2 {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n set(x: number, y: number): Vec2;\n set(value: Vec2Value): Vec2;\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n // tslint:disable-next-line:typedef\n set(x, y?) {\n if (typeof x === 'object') {\n _ASSERT && Vec2.assert(x);\n this.x = x.x;\n this.y = x.y;\n } else {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n }\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setNum(x: number, y: number) {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setVec2(value: Vec2Value) {\n _ASSERT && Vec2.assert(value);\n this.x = value.x;\n this.y = value.y;\n\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use setCombine or setMul\n */\n wSet(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.setCombine(a, v, b, w);\n } else {\n return this.setMul(a, v);\n }\n }\n\n /**\n * Set linear combination of v and w: `a * v + b * w`\n */\n setCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x = x;\n this.y = y;\n return this;\n }\n\n setMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Add a vector to this vector.\n *\n * @returns this\n */\n add(w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x += w.x;\n this.y += w.y;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use addCombine or addMul\n */\n wAdd(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.addCombine(a, v, b, w);\n } else {\n return this.addMul(a, v);\n }\n }\n\n /**\n * Add linear combination of v and w: `a * v + b * w`\n */\n addCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x += x;\n this.y += y;\n return this;\n }\n\n addMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x += x;\n this.y += y;\n return this;\n }\n\n /**\n * @deprecated Use subCombine or subMul\n */\n wSub(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.subCombine(a, v, b, w);\n } else {\n return this.subMul(a, v);\n }}\n\n /**\n * Subtract linear combination of v and w: `a * v + b * w`\n */\n subCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n subMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n /**\n * Subtract a vector from this vector\n *\n * @returns this\n */\n sub(w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x -= w.x;\n this.y -= w.y;\n return this;\n }\n\n /**\n * Multiply this vector by a scalar.\n *\n * @returns this\n */\n mul(m: number): Vec2 {\n _ASSERT && Math.assert(m);\n this.x *= m;\n this.y *= m;\n return this;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n length(): number {\n return Vec2.lengthOf(this);\n }\n\n /**\n * Get the length squared.\n */\n lengthSquared(): number {\n return Vec2.lengthSquared(this);\n }\n\n /**\n * Convert this vector into a unit vector.\n *\n * @returns old length\n */\n normalize(): number {\n const length = this.length();\n if (length < Math.EPSILON) {\n return 0.0;\n }\n const invLength = 1.0 / length;\n this.x *= invLength;\n this.y *= invLength;\n return length;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n static lengthOf(v: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n return Math.sqrt(v.x * v.x + v.y * v.y);\n }\n\n /**\n * Get the length squared.\n */\n static lengthSquared(v: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n return v.x * v.x + v.y * v.y;\n }\n\n static distance(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n static distanceSquared(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return dx * dx + dy * dy;\n }\n\n static areEqual(v: Vec2Value, w: Vec2Value): boolean {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v === w || typeof w === 'object' && w !== null && v.x === w.x && v.y === w.y;\n }\n\n /**\n * Get the skew vector such that dot(skew_vec, other) == cross(vec, other)\n */\n static skew(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.y, v.x);\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.x + v.y * w.y;\n }\n\n static cross(v: Vec2Value, w: Vec2Value): number;\n static cross(v: Vec2Value, w: number): Vec2;\n static cross(v: number, w: Vec2Value): Vec2;\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n *\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n // tslint:disable-next-line:typedef\n static cross(v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n\n } else {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static crossVec2Vec2(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossVec2Num(v: Vec2Value, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossNumVec2(v: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n }\n\n static addCross(a: Vec2Value, v: Vec2Value, w: number): Vec2;\n static addCross(a: Vec2Value, v: number, w: Vec2Value): Vec2;\n /**\n * Returns `a + (v x w)`\n */\n // tslint:disable-next-line:typedef\n static addCross(a, v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n _ASSERT && console.assert(false);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossVec2Num(a: Vec2Value, v: Vec2Value, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossNumVec2(a: Vec2Value, v: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n static add(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x + w.x, v.y + w.y);\n }\n\n /** @internal @deprecated */\n static wAdd(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return Vec2.combine(a, v, b, w);\n } else {\n return Vec2.mulNumVec2(a, v);\n }\n }\n\n static combine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n return Vec2.zero().setCombine(a, v, b, w);\n }\n\n static sub(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x - w.x, v.y - w.y);\n }\n\n static mul(a: Vec2Value, b: number): Vec2;\n static mul(a: number, b: Vec2Value): Vec2;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (typeof a === 'object') {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n\n } else if (typeof b === 'object') {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n }\n\n static mulVec2Num(a: Vec2Value, b: number): Vec2 {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n }\n\n static mulNumVec2(a: number, b: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n\n neg(): Vec2 {\n this.x = -this.x;\n this.y = -this.y;\n return this;\n }\n\n static neg(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.x, -v.y);\n }\n\n static abs(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Math.abs(v.x), Math.abs(v.y));\n }\n\n static mid(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo((v.x + w.x) * 0.5, (v.y + w.y) * 0.5);\n }\n\n static upper(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.max(v.x, w.x), Math.max(v.y, w.y));\n }\n\n static lower(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.min(v.x, w.x), Math.min(v.y, w.y));\n }\n\n clamp(max: number): Vec2 {\n const lengthSqr = this.x * this.x + this.y * this.y;\n if (lengthSqr > max * max) {\n const scale = max / Math.sqrt(lengthSqr);\n this.x *= scale;\n this.y *= scale;\n }\n return this;\n }\n\n static clamp(v: Vec2Value, max: number): Vec2 {\n const r = Vec2.neo(v.x, v.y);\n r.clamp(max);\n return r;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static scaleFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x * x, v.y * y);\n };\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static translateFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x + x, v.y + y);\n };\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../common/Math';\nimport { Vec2, Vec2Value } from '../common/Vec2';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n */\nexport interface RayCastInput {\n p1: Vec2;\n p2: Vec2;\n maxFraction: number;\n}\n\nexport type RayCastCallback = (subInput: RayCastInput, id: number) => number;\n\n/**\n * Ray-cast output data. The ray hits at `p1 + fraction * (p2 - p1)`,\n * where `p1` and `p2` come from RayCastInput.\n */\nexport interface RayCastOutput {\n normal: Vec2;\n fraction: number;\n}\n\nexport class AABB {\n lowerBound: Vec2;\n upperBound: Vec2;\n\n constructor(lower?: Vec2Value, upper?: Vec2Value) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof AABB)) {\n return new AABB(lower, upper);\n }\n\n this.lowerBound = Vec2.zero();\n this.upperBound = Vec2.zero();\n\n if (typeof lower === 'object') {\n this.lowerBound.setVec2(lower);\n }\n if (typeof upper === 'object') {\n this.upperBound.setVec2(upper);\n } else if (typeof lower === 'object') {\n this.upperBound.setVec2(lower);\n }\n }\n\n /**\n * Verify that the bounds are sorted.\n */\n isValid(): boolean {\n return AABB.isValid(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.lowerBound) && Vec2.isValid(obj.upperBound) && Vec2.sub(obj.upperBound, obj.lowerBound).lengthSquared() >= 0;\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!AABB.isValid(o), 'Invalid AABB!', o);\n }\n\n /**\n * Get the center of the AABB.\n */\n getCenter(): Vec2 {\n return Vec2.neo((this.lowerBound.x + this.upperBound.x) * 0.5, (this.lowerBound.y + this.upperBound.y) * 0.5);\n }\n\n /**\n * Get the extents of the AABB (half-widths).\n */\n getExtents(): Vec2 {\n return Vec2.neo((this.upperBound.x - this.lowerBound.x) * 0.5, (this.upperBound.y - this.lowerBound.y) * 0.5);\n }\n\n /**\n * Get the perimeter length.\n */\n getPerimeter(): number {\n return 2.0 * (this.upperBound.x - this.lowerBound.x + this.upperBound.y - this.lowerBound.y);\n }\n\n /**\n * Combine one or two AABB into this one.\n */\n combine(a: AABB, b?: AABB): void {\n b = b || this;\n\n const lowerA = a.lowerBound;\n const upperA = a.upperBound;\n const lowerB = b.lowerBound;\n const upperB = b.upperBound;\n\n const lowerX = Math.min(lowerA.x, lowerB.x);\n const lowerY = Math.min(lowerA.y, lowerB.y);\n const upperX = Math.max(upperB.x, upperA.x);\n const upperY = Math.max(upperB.y, upperA.y);\n\n this.lowerBound.setNum(lowerX, lowerY);\n this.upperBound.setNum(upperX, upperY);\n }\n\n combinePoints(a: Vec2Value, b: Vec2Value): void {\n this.lowerBound.setNum(Math.min(a.x, b.x), Math.min(a.y, b.y));\n this.upperBound.setNum(Math.max(a.x, b.x), Math.max(a.y, b.y));\n }\n\n set(aabb: AABB): void {\n this.lowerBound.setNum(aabb.lowerBound.x, aabb.lowerBound.y);\n this.upperBound.setNum(aabb.upperBound.x, aabb.upperBound.y);\n }\n\n contains(aabb: AABB): boolean {\n let result = true;\n result = result && this.lowerBound.x <= aabb.lowerBound.x;\n result = result && this.lowerBound.y <= aabb.lowerBound.y;\n result = result && aabb.upperBound.x <= this.upperBound.x;\n result = result && aabb.upperBound.y <= this.upperBound.y;\n return result;\n }\n\n extend(value: number): AABB {\n AABB.extend(this, value);\n return this;\n }\n\n static extend(aabb: AABB, value: number): void {\n aabb.lowerBound.x -= value;\n aabb.lowerBound.y -= value;\n aabb.upperBound.x += value;\n aabb.upperBound.y += value;\n }\n\n static testOverlap(a: AABB, b: AABB): boolean {\n const d1x = b.lowerBound.x - a.upperBound.x;\n const d2x = a.lowerBound.x - b.upperBound.x;\n\n const d1y = b.lowerBound.y - a.upperBound.y;\n const d2y = a.lowerBound.y - b.upperBound.y;\n\n if (d1x > 0 || d1y > 0 || d2x > 0 || d2y > 0) {\n return false;\n }\n return true;\n }\n\n static areEqual(a: AABB, b: AABB): boolean {\n return Vec2.areEqual(a.lowerBound, b.lowerBound) && Vec2.areEqual(a.upperBound, b.upperBound);\n }\n\n static diff(a: AABB, b: AABB): number {\n const wD = Math.max(0, Math.min(a.upperBound.x, b.upperBound.x) - Math.max(b.lowerBound.x, a.lowerBound.x));\n const hD = Math.max(0, Math.min(a.upperBound.y, b.upperBound.y) - Math.max(b.lowerBound.y, a.lowerBound.y));\n\n const wA = a.upperBound.x - a.lowerBound.x;\n const hA = a.upperBound.y - a.lowerBound.y;\n\n const wB = b.upperBound.x - b.lowerBound.x;\n const hB = b.upperBound.y - b.lowerBound.y;\n\n return wA * hA + wB * hB - wD * hD;\n }\n\n rayCast(output: RayCastOutput, input: RayCastInput): boolean {\n // From Real-time Collision Detection, p179.\n\n let tmin = -Infinity;\n let tmax = Infinity;\n\n const p = input.p1;\n const d = Vec2.sub(input.p2, input.p1);\n const absD = Vec2.abs(d);\n\n const normal = Vec2.zero();\n\n for (let f: 'x' | 'y' = 'x'; f !== null; f = (f === 'x' ? 'y' : null)) {\n if (absD.x < Math.EPSILON) {\n // Parallel.\n if (p[f] < this.lowerBound[f] || this.upperBound[f] < p[f]) {\n return false;\n }\n } else {\n const inv_d = 1.0 / d[f];\n let t1 = (this.lowerBound[f] - p[f]) * inv_d;\n let t2 = (this.upperBound[f] - p[f]) * inv_d;\n\n // Sign of the normal vector.\n let s = -1.0;\n\n if (t1 > t2) {\n const temp = t1;\n t1 = t2;\n t2 = temp;\n s = 1.0;\n }\n\n // Push the min up\n if (t1 > tmin) {\n normal.setZero();\n normal[f] = s;\n tmin = t1;\n }\n\n // Pull the max down\n tmax = Math.min(tmax, t2);\n\n if (tmin > tmax) {\n return false;\n }\n }\n }\n\n // Does the ray start inside the box?\n // Does the ray intersect beyond the max fraction?\n if (tmin < 0.0 || input.maxFraction < tmin) {\n return false;\n }\n\n // Intersection.\n output.fraction = tmin;\n output.normal = normal;\n return true;\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n// TODO merge with World options?\n\n/**\n * Tuning constants based on meters-kilograms-seconds (MKS) units.\n */\n// tslint:disable-next-line:no-unnecessary-class\nexport class Settings {\n // Collision\n /**\n * The maximum number of contact points between two convex shapes. Do not change\n * this value.\n */\n static maxManifoldPoints: number = 2;\n\n /**\n * The maximum number of vertices on a convex polygon. You cannot increase this\n * too much because BlockAllocator has a maximum object size.\n */\n static maxPolygonVertices: number = 12;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This allows proxies to move\n * by a small amount without triggering a tree adjustment. This is in meters.\n */\n static aabbExtension: number = 0.1;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This is used to predict the\n * future position based on the current displacement. This is a dimensionless\n * multiplier.\n */\n static aabbMultiplier: number = 2.0;\n\n /**\n * A small length used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static linearSlop: number = 0.005;\n static get linearSlopSquared(): number { return Settings.linearSlop * Settings.linearSlop; }\n\n /**\n * A small angle used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static angularSlop: number = (2.0 / 180.0 * Math.PI);\n\n /**\n * The radius of the polygon/edge shape skin. This should not be modified.\n * Making this smaller means polygons will have an insufficient buffer for\n * continuous collision. Making it larger may create artifacts for vertex\n * collision.\n */\n static get polygonRadius(): number { return 2.0 * Settings.linearSlop; }\n\n /**\n * Maximum number of sub-steps per contact in continuous physics simulation.\n */\n static maxSubSteps: number = 8;\n\n// Dynamics\n\n /**\n * Maximum number of contacts to be handled to solve a TOI impact.\n */\n static maxTOIContacts: number = 32;\n\n /**\n * Maximum iterations to solve a TOI.\n */\n static maxTOIIterations: number = 20;\n\n /**\n * Maximum iterations to find Distance.\n */\n static maxDistnceIterations: number = 20;\n\n /**\n * A velocity threshold for elastic collisions. Any collision with a relative\n * linear velocity below this threshold will be treated as inelastic.\n */\n static velocityThreshold: number = 1.0;\n\n /**\n * The maximum linear position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxLinearCorrection: number = 0.2;\n\n /**\n * The maximum angular position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxAngularCorrection: number = (8.0 / 180.0 * Math.PI);\n\n /**\n * The maximum linear velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxTranslation: number = 2.0;\n static get maxTranslationSquared(): number { return Settings.maxTranslation * Settings.maxTranslation; }\n\n /**\n * The maximum angular velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxRotation: number = (0.5 * Math.PI);\n static get maxRotationSquared(): number { return Settings.maxRotation * Settings.maxRotation; }\n\n /**\n * This scale factor controls how fast overlap is resolved. Ideally this would\n * be 1 so that overlap is removed in one time step. However using values close\n * to 1 often lead to overshoot.\n */\n static baumgarte: number = 0.2;\n static toiBaugarte: number = 0.75;\n\n // Sleep\n\n /**\n * The time that a body must be still before it will go to sleep.\n */\n static timeToSleep: number = 0.5;\n\n /**\n * A body cannot sleep if its linear velocity is above this tolerance.\n */\n static linearSleepTolerance: number = 0.01;\n static get linearSleepToleranceSqr(): number { return Math.pow(Settings.linearSleepTolerance, 2); }\n\n /**\n * A body cannot sleep if its angular velocity is above this tolerance.\n */\n static angularSleepTolerance: number = (2.0 / 180.0 * Math.PI);\n static get angularSleepToleranceSqr(): number { return Math.pow(Settings.angularSleepTolerance, 2); }\n\n}\n","/*\n * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js\n *\n * This software is provided 'as-is', without any express or implied\n * warranty. In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * 1. The origin of this software must not be misrepresented; you must not\n * claim that you wrote the original software. If you use this software\n * in a product, an acknowledgment in the product documentation would be\n * appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n * misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n */\n\nexport class Pool {\n _list: T[] = [];\n _max: number = Infinity;\n\n _createFn: () => T;\n _outFn: (item: T) => void;\n _inFn: (item: T) => void;\n _discardFn: (item: T) => T;\n\n _createCount: number = 0;\n _outCount: number = 0;\n _inCount: number = 0;\n _discardCount: number = 0;\n\n constructor(opts: {\n max?: number,\n create?: () => T,\n allocate?: (item: T) => void,\n release?: (item: T) => void,\n discard?: (item: T) => T,\n }) {\n this._list = [];\n this._max = opts.max || this._max;\n\n this._createFn = opts.create;\n this._outFn = opts.allocate;\n this._inFn = opts.release;\n this._discardFn = opts.discard;\n }\n\n max(n?: number): number | Pool {\n if (typeof n === 'number') {\n this._max = n;\n return this;\n }\n return this._max;\n }\n\n size(): number {\n return this._list.length;\n }\n\n allocate(): T {\n let item: T;\n if (this._list.length > 0) {\n item = this._list.shift();\n } else {\n this._createCount++;\n if (typeof this._createFn === 'function') {\n item = this._createFn();\n } else {\n // tslint:disable-next-line:no-object-literal-type-assertion\n item = {} as T;\n }\n }\n this._outCount++;\n if (typeof this._outFn === 'function') {\n this._outFn(item);\n }\n return item;\n }\n\n release(item: T): void {\n if (this._list.length < this._max) {\n this._inCount++;\n if (typeof this._inFn === 'function') {\n this._inFn(item);\n }\n this._list.push(item);\n } else {\n this._discardCount++;\n if (typeof this._discardFn === 'function') {\n item = this._discardFn(item);\n }\n }\n }\n\n /** @internal */\n toString(): string {\n return \" +\" + this._createCount + \" >\" + this._outCount + \" <\" + this._inCount + \" -\"\n + this._discardCount + \" =\" + this._list.length + \"/\" + this._max;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { Pool } from '../util/Pool';\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { AABB, RayCastCallback, RayCastInput } from './AABB';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport type DynamicTreeQueryCallback = (nodeId: number) => boolean;\n\n/**\n * A node in the dynamic tree. The client does not interact with this directly.\n */\nexport class TreeNode {\n id: number;\n /** Enlarged AABB */\n aabb: AABB = new AABB();\n userData: T = null;\n parent: TreeNode = null;\n child1: TreeNode = null;\n child2: TreeNode = null;\n /** 0: leaf, -1: free node */\n height: number = -1;\n\n constructor(id?: number) {\n this.id = id;\n }\n\n /** @internal */\n toString(): string {\n return this.id + \": \" + this.userData;\n }\n\n isLeaf(): boolean {\n return this.child1 == null;\n }\n}\n\n/**\n * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A\n * dynamic tree arranges data in a binary tree to accelerate queries such as\n * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we\n * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger\n * than the client object. This allows the client object to move by small\n * amounts without triggering a tree update.\n *\n * Nodes are pooled and relocatable, so we use node indices rather than\n * pointers.\n */\nexport class DynamicTree {\n m_root: TreeNode;\n m_lastProxyId: number;\n m_nodes: {\n [id: number]: TreeNode\n };\n m_pool: Pool>;\n\n constructor() {\n this.m_root = null;\n this.m_nodes = {};\n this.m_lastProxyId = 0;\n\n this.m_pool = new Pool>({\n create(): TreeNode {\n return new TreeNode();\n }\n });\n }\n\n /**\n * Get proxy user data.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getUserData(id: number): T {\n const node = this.m_nodes[id];\n _ASSERT && console.assert(!!node);\n return node.userData;\n }\n\n /**\n * Get the fat AABB for a node id.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getFatAABB(id: number): AABB {\n const node = this.m_nodes[id];\n _ASSERT && console.assert(!!node);\n return node.aabb;\n }\n\n allocateNode(): TreeNode {\n const node = this.m_pool.allocate();\n node.id = ++this.m_lastProxyId;\n node.userData = null;\n node.parent = null;\n node.child1 = null;\n node.child2 = null;\n node.height = -1;\n this.m_nodes[node.id] = node;\n return node;\n }\n\n freeNode(node: TreeNode): void {\n this.m_pool.release(node);\n node.height = -1;\n // tslint:disable-next-line:no-dynamic-delete\n delete this.m_nodes[node.id];\n }\n\n /**\n * Create a proxy in the tree as a leaf node. We return the index of the node\n * instead of a pointer so that we can grow the node pool.\n *\n * Create a proxy. Provide a tight fitting AABB and a userData pointer.\n */\n createProxy(aabb: AABB, userData: T): number {\n _ASSERT && console.assert(AABB.isValid(aabb));\n\n const node = this.allocateNode();\n\n node.aabb.set(aabb);\n\n // Fatten the aabb.\n AABB.extend(node.aabb, Settings.aabbExtension);\n\n node.userData = userData;\n node.height = 0;\n\n this.insertLeaf(node);\n\n return node.id;\n }\n\n /**\n * Destroy a proxy. This asserts if the id is invalid.\n */\n destroyProxy(id: number): void {\n const node = this.m_nodes[id];\n\n _ASSERT && console.assert(!!node);\n _ASSERT && console.assert(node.isLeaf());\n\n this.removeLeaf(node);\n this.freeNode(node);\n }\n\n /**\n * Move a proxy with a swepted AABB. If the proxy has moved outside of its\n * fattened AABB, then the proxy is removed from the tree and re-inserted.\n * Otherwise the function returns immediately.\n *\n * @param d Displacement\n *\n * @return true if the proxy was re-inserted.\n */\n moveProxy(id: number, aabb: AABB, d: Vec2): boolean {\n _ASSERT && console.assert(AABB.isValid(aabb));\n _ASSERT && console.assert(!d || Vec2.isValid(d));\n\n const node = this.m_nodes[id];\n\n _ASSERT && console.assert(!!node);\n _ASSERT && console.assert(node.isLeaf());\n\n if (node.aabb.contains(aabb)) {\n return false;\n }\n\n this.removeLeaf(node);\n\n node.aabb.set(aabb);\n\n // Extend AABB.\n aabb = node.aabb;\n AABB.extend(aabb, Settings.aabbExtension);\n\n // Predict AABB displacement.\n // const d = Vec2.mul(Settings.aabbMultiplier, displacement);\n\n if (d.x < 0.0) {\n aabb.lowerBound.x += d.x * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.x += d.x * Settings.aabbMultiplier;\n }\n\n if (d.y < 0.0) {\n aabb.lowerBound.y += d.y * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.y += d.y * Settings.aabbMultiplier;\n }\n\n this.insertLeaf(node);\n\n return true;\n }\n\n insertLeaf(leaf: TreeNode): void {\n _ASSERT && console.assert(AABB.isValid(leaf.aabb));\n\n if (this.m_root == null) {\n this.m_root = leaf;\n this.m_root.parent = null;\n return;\n }\n\n // Find the best sibling for this node\n const leafAABB = leaf.aabb;\n let index = this.m_root;\n while (!index.isLeaf()) {\n const child1 = index.child1;\n const child2 = index.child2;\n\n const area = index.aabb.getPerimeter();\n\n const combinedAABB = new AABB();\n combinedAABB.combine(index.aabb, leafAABB);\n const combinedArea = combinedAABB.getPerimeter();\n\n // Cost of creating a new parent for this node and the new leaf\n const cost = 2.0 * combinedArea;\n\n // Minimum cost of pushing the leaf further down the tree\n const inheritanceCost = 2.0 * (combinedArea - area);\n\n // Cost of descending into child1\n let cost1;\n if (child1.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n cost1 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n const oldArea = child1.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost1 = (newArea - oldArea) + inheritanceCost;\n }\n\n // Cost of descending into child2\n let cost2;\n if (child2.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n cost2 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n const oldArea = child2.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost2 = newArea - oldArea + inheritanceCost;\n }\n\n // Descend according to the minimum cost.\n if (cost < cost1 && cost < cost2) {\n break;\n }\n\n // Descend\n if (cost1 < cost2) {\n index = child1;\n } else {\n index = child2;\n }\n }\n\n const sibling = index;\n\n // Create a new parent.\n const oldParent = sibling.parent;\n const newParent = this.allocateNode();\n newParent.parent = oldParent;\n newParent.userData = null;\n newParent.aabb.combine(leafAABB, sibling.aabb);\n newParent.height = sibling.height + 1;\n\n if (oldParent != null) {\n // The sibling was not the root.\n if (oldParent.child1 === sibling) {\n oldParent.child1 = newParent;\n } else {\n oldParent.child2 = newParent;\n }\n\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n } else {\n // The sibling was the root.\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n this.m_root = newParent;\n }\n\n // Walk back up the tree fixing heights and AABBs\n index = leaf.parent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n _ASSERT && console.assert(child1 != null);\n _ASSERT && console.assert(child2 != null);\n\n index.height = 1 + Math.max(child1.height, child2.height);\n index.aabb.combine(child1.aabb, child2.aabb);\n\n index = index.parent;\n }\n\n // validate();\n }\n\n removeLeaf(leaf: TreeNode): void {\n if (leaf === this.m_root) {\n this.m_root = null;\n return;\n }\n\n const parent = leaf.parent;\n const grandParent = parent.parent;\n let sibling;\n if (parent.child1 === leaf) {\n sibling = parent.child2;\n } else {\n sibling = parent.child1;\n }\n\n if (grandParent != null) {\n // Destroy parent and connect sibling to grandParent.\n if (grandParent.child1 === parent) {\n grandParent.child1 = sibling;\n } else {\n grandParent.child2 = sibling;\n }\n sibling.parent = grandParent;\n this.freeNode(parent);\n\n // Adjust ancestor bounds.\n let index = grandParent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n index.aabb.combine(child1.aabb, child2.aabb);\n index.height = 1 + Math.max(child1.height, child2.height);\n\n index = index.parent;\n }\n } else {\n this.m_root = sibling;\n sibling.parent = null;\n this.freeNode(parent);\n }\n\n // validate();\n }\n\n /**\n * Perform a left or right rotation if node A is imbalanced. Returns the new\n * root index.\n */\n balance(iA: TreeNode): TreeNode {\n _ASSERT && console.assert(iA != null);\n\n const A = iA;\n if (A.isLeaf() || A.height < 2) {\n return iA;\n }\n\n const B = A.child1;\n const C = A.child2;\n\n const balance = C.height - B.height;\n\n // Rotate C up\n if (balance > 1) {\n const F = C.child1;\n const G = C.child2;\n\n // Swap A and C\n C.child1 = A;\n C.parent = A.parent;\n A.parent = C;\n\n // A's old parent should point to C\n if (C.parent != null) {\n if (C.parent.child1 === iA) {\n C.parent.child1 = C;\n } else {\n C.parent.child2 = C;\n }\n } else {\n this.m_root = C;\n }\n\n // Rotate\n if (F.height > G.height) {\n C.child2 = F;\n A.child2 = G;\n G.parent = A;\n A.aabb.combine(B.aabb, G.aabb);\n C.aabb.combine(A.aabb, F.aabb);\n\n A.height = 1 + Math.max(B.height, G.height);\n C.height = 1 + Math.max(A.height, F.height);\n } else {\n C.child2 = G;\n A.child2 = F;\n F.parent = A;\n A.aabb.combine(B.aabb, F.aabb);\n C.aabb.combine(A.aabb, G.aabb);\n\n A.height = 1 + Math.max(B.height, F.height);\n C.height = 1 + Math.max(A.height, G.height);\n }\n\n return C;\n }\n\n // Rotate B up\n if (balance < -1) {\n const D = B.child1;\n const E = B.child2;\n\n // Swap A and B\n B.child1 = A;\n B.parent = A.parent;\n A.parent = B;\n\n // A's old parent should point to B\n if (B.parent != null) {\n if (B.parent.child1 === A) {\n B.parent.child1 = B;\n } else {\n B.parent.child2 = B;\n }\n } else {\n this.m_root = B;\n }\n\n // Rotate\n if (D.height > E.height) {\n B.child2 = D;\n A.child1 = E;\n E.parent = A;\n A.aabb.combine(C.aabb, E.aabb);\n B.aabb.combine(A.aabb, D.aabb);\n\n A.height = 1 + Math.max(C.height, E.height);\n B.height = 1 + Math.max(A.height, D.height);\n } else {\n B.child2 = E;\n A.child1 = D;\n D.parent = A;\n A.aabb.combine(C.aabb, D.aabb);\n B.aabb.combine(A.aabb, E.aabb);\n\n A.height = 1 + Math.max(C.height, D.height);\n B.height = 1 + Math.max(A.height, E.height);\n }\n\n return B;\n }\n\n return A;\n }\n\n /**\n * Compute the height of the binary tree in O(N) time. Should not be called\n * often.\n */\n getHeight(): number {\n if (this.m_root == null) {\n return 0;\n }\n\n return this.m_root.height;\n }\n\n /**\n * Get the ratio of the sum of the node areas to the root area.\n */\n getAreaRatio(): number {\n if (this.m_root == null) {\n return 0.0;\n }\n\n const root = this.m_root;\n const rootArea = root.aabb.getPerimeter();\n\n let totalArea = 0.0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // Free node in pool\n continue;\n }\n\n totalArea += node.aabb.getPerimeter();\n }\n\n this.iteratorPool.release(it);\n\n return totalArea / rootArea;\n }\n\n /**\n * Compute the height of a sub-tree.\n */\n computeHeight(id?: number): number {\n let node;\n if (typeof id !== 'undefined') {\n node = this.m_nodes[id];\n } else {\n node = this.m_root;\n }\n\n // _ASSERT && console.assert(0 <= id && id < this.m_nodeCapacity);\n\n if (node.isLeaf()) {\n return 0;\n }\n\n const height1 = this.computeHeight(node.child1.id);\n const height2 = this.computeHeight(node.child2.id);\n return 1 + Math.max(height1, height2);\n }\n\n validateStructure(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n if (node === this.m_root) {\n _ASSERT && console.assert(node.parent == null);\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && console.assert(child1 == null);\n _ASSERT && console.assert(child2 == null);\n _ASSERT && console.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && console.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && console.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n _ASSERT && console.assert(child1.parent === node);\n _ASSERT && console.assert(child2.parent === node);\n\n this.validateStructure(child1);\n this.validateStructure(child2);\n }\n\n validateMetrics(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && console.assert(child1 == null);\n _ASSERT && console.assert(child2 == null);\n _ASSERT && console.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && console.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && console.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n const height1 = child1.height;\n const height2 = child2.height;\n const height = 1 + Math.max(height1, height2);\n _ASSERT && console.assert(node.height === height);\n\n const aabb = new AABB();\n aabb.combine(child1.aabb, child2.aabb);\n\n _ASSERT && console.assert(AABB.areEqual(aabb, node.aabb));\n\n this.validateMetrics(child1);\n this.validateMetrics(child2);\n }\n\n /**\n * Validate this tree. For testing.\n */\n validate(): void {\n this.validateStructure(this.m_root);\n this.validateMetrics(this.m_root);\n _ASSERT && console.assert(this.getHeight() === this.computeHeight());\n }\n\n /**\n * Get the maximum balance of an node in the tree. The balance is the difference\n * in height of the two children of a node.\n */\n getMaxBalance(): number {\n let maxBalance = 0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height <= 1) {\n continue;\n }\n\n _ASSERT && console.assert(!node.isLeaf());\n\n const balance = Math.abs(node.child2.height - node.child1.height);\n maxBalance = Math.max(maxBalance, balance);\n }\n this.iteratorPool.release(it);\n\n return maxBalance;\n }\n\n /**\n * Build an optimal tree. Very expensive. For testing.\n */\n rebuildBottomUp(): void {\n const nodes = [];\n let count = 0;\n\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // free node in pool\n continue;\n }\n\n if (node.isLeaf()) {\n node.parent = null;\n nodes[count] = node;\n ++count;\n } else {\n this.freeNode(node);\n }\n }\n this.iteratorPool.release(it);\n\n while (count > 1) {\n let minCost = Infinity;\n let iMin = -1;\n let jMin = -1;\n for (let i = 0; i < count; ++i) {\n const aabbi = nodes[i].aabb;\n for (let j = i + 1; j < count; ++j) {\n const aabbj = nodes[j].aabb;\n const b = new AABB();\n b.combine(aabbi, aabbj);\n const cost = b.getPerimeter();\n if (cost < minCost) {\n iMin = i;\n jMin = j;\n minCost = cost;\n }\n }\n }\n\n const child1 = nodes[iMin];\n const child2 = nodes[jMin];\n\n const parent = this.allocateNode();\n parent.child1 = child1;\n parent.child2 = child2;\n parent.height = 1 + Math.max(child1.height, child2.height);\n parent.aabb.combine(child1.aabb, child2.aabb);\n parent.parent = null;\n\n child1.parent = parent;\n child2.parent = parent;\n\n nodes[jMin] = nodes[count - 1];\n nodes[iMin] = parent;\n --count;\n }\n\n this.m_root = nodes[0];\n\n _ASSERT && this.validate();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n const aabb = node.aabb;\n aabb.lowerBound.x -= newOrigin.x;\n aabb.lowerBound.y -= newOrigin.y;\n aabb.upperBound.x -= newOrigin.x;\n aabb.upperBound.y -= newOrigin.y;\n }\n this.iteratorPool.release(it);\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query(aabb: AABB, queryCallback: DynamicTreeQueryCallback): void {\n _ASSERT && console.assert(typeof queryCallback === 'function');\n const stack = this.stackPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, aabb)) {\n if (node.isLeaf()) {\n const proceed = queryCallback(node.id);\n if (proceed === false) {\n return;\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n }\n\n this.stackPool.release(stack);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n // TODO: GC\n _ASSERT && console.assert(typeof rayCastCallback === 'function');\n const p1 = input.p1;\n const p2 = input.p2;\n const r = Vec2.sub(p2, p1);\n _ASSERT && console.assert(r.lengthSquared() > 0.0);\n r.normalize();\n\n // v is perpendicular to the segment.\n const v = Vec2.crossNumVec2(1.0, r);\n const abs_v = Vec2.abs(v);\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n\n let maxFraction = input.maxFraction;\n\n // Build a bounding box for the segment.\n const segmentAABB = new AABB();\n let t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n\n const stack = this.stackPool.allocate();\n const subInput = this.inputPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, segmentAABB) === false) {\n continue;\n }\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n const c = node.aabb.getCenter();\n const h = node.aabb.getExtents();\n const separation = Math.abs(Vec2.dot(v, Vec2.sub(p1, c))) - Vec2.dot(abs_v, h);\n if (separation > 0.0) {\n continue;\n }\n\n if (node.isLeaf()) {\n subInput.p1 = Vec2.clone(input.p1);\n subInput.p2 = Vec2.clone(input.p2);\n subInput.maxFraction = maxFraction;\n\n const value = rayCastCallback(subInput, node.id);\n\n if (value === 0.0) {\n // The client has terminated the ray cast.\n return;\n }\n\n if (value > 0.0) {\n // update segment bounding box.\n maxFraction = value;\n t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n this.stackPool.release(stack);\n this.inputPool.release(subInput);\n }\n\n private inputPool: Pool = new Pool({\n create(): RayCastInput {\n // tslint:disable-next-line:no-object-literal-type-assertion\n return {} as RayCastInput;\n },\n release(stack: RayCastInput): void {\n }\n });\n\n private stackPool: Pool>> = new Pool>>({\n create(): Array> {\n return [];\n },\n release(stack: Array>): void {\n stack.length = 0;\n }\n });\n\n private iteratorPool: Pool> = new Pool>({\n create(): Iterator {\n return new Iterator();\n },\n release(iterator: Iterator): void {\n iterator.close();\n }\n });\n\n}\n\nclass Iterator {\n parents: Array> = [];\n states: number[] = [];\n preorder(root: TreeNode): Iterator {\n this.parents.length = 0;\n this.parents.push(root);\n this.states.length = 0;\n this.states.push(0);\n return this;\n }\n next(): TreeNode {\n while (this.parents.length > 0) {\n const i = this.parents.length - 1;\n const node = this.parents[i];\n if (this.states[i] === 0) {\n this.states[i] = 1;\n return node;\n }\n if (this.states[i] === 1) {\n this.states[i] = 2;\n if (node.child1) {\n this.parents.push(node.child1);\n this.states.push(1);\n return node.child1;\n }\n }\n if (this.states[i] === 2) {\n this.states[i] = 3;\n if (node.child2) {\n this.parents.push(node.child2);\n this.states.push(1);\n return node.child2;\n }\n }\n this.parents.pop();\n this.states.pop();\n }\n }\n close(): void {\n this.parents.length = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { AABB, RayCastCallback, RayCastInput } from './AABB';\nimport { DynamicTree, DynamicTreeQueryCallback } from './DynamicTree';\nimport { FixtureProxy } from \"../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * The broad-phase wraps and extends a dynamic-tree to keep track of moved\n * objects and query them on update.\n */\nexport class BroadPhase {\n m_tree: DynamicTree = new DynamicTree();\n m_proxyCount: number = 0;\n m_moveBuffer: number[] = [];\n\n m_callback: (userDataA: any, userDataB: any) => void;\n m_queryProxyId: number;\n\n /**\n * Get user data from a proxy. Returns null if the id is invalid.\n */\n getUserData(proxyId: number): FixtureProxy {\n return this.m_tree.getUserData(proxyId);\n }\n\n /**\n * Test overlap of fat AABBs.\n */\n testOverlap(proxyIdA: number, proxyIdB: number): boolean {\n const aabbA = this.m_tree.getFatAABB(proxyIdA);\n const aabbB = this.m_tree.getFatAABB(proxyIdB);\n return AABB.testOverlap(aabbA, aabbB);\n }\n\n /**\n * Get the fat AABB for a proxy.\n */\n getFatAABB(proxyId: number): AABB {\n return this.m_tree.getFatAABB(proxyId);\n }\n\n /**\n * Get the number of proxies.\n */\n getProxyCount(): number {\n return this.m_proxyCount;\n }\n\n /**\n * Get the height of the embedded tree.\n */\n getTreeHeight(): number {\n return this.m_tree.getHeight();\n }\n\n /**\n * Get the balance (integer) of the embedded tree.\n */\n getTreeBalance(): number {\n return this.m_tree.getMaxBalance();\n }\n\n /**\n * Get the quality metric of the embedded tree.\n */\n getTreeQuality(): number {\n return this.m_tree.getAreaRatio();\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query = (aabb: AABB, queryCallback: DynamicTreeQueryCallback): void => {\n this.m_tree.query(aabb, queryCallback);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n this.m_tree.rayCast(input, rayCastCallback);\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_tree.shiftOrigin(newOrigin);\n }\n\n /**\n * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs\n * is called.\n */\n createProxy(aabb: AABB, userData: FixtureProxy): number {\n _ASSERT && console.assert(AABB.isValid(aabb));\n const proxyId = this.m_tree.createProxy(aabb, userData);\n this.m_proxyCount++;\n this.bufferMove(proxyId);\n return proxyId;\n }\n\n /**\n * Destroy a proxy. It is up to the client to remove any pairs.\n */\n destroyProxy(proxyId: number): void {\n this.unbufferMove(proxyId);\n this.m_proxyCount--;\n this.m_tree.destroyProxy(proxyId);\n }\n\n /**\n * Call moveProxy as many times as you like, then when you are done call\n * UpdatePairs to finalized the proxy pairs (for your time step).\n */\n moveProxy(proxyId: number, aabb: AABB, displacement: Vec2): void {\n _ASSERT && console.assert(AABB.isValid(aabb));\n const changed = this.m_tree.moveProxy(proxyId, aabb, displacement);\n if (changed) {\n this.bufferMove(proxyId);\n }\n }\n\n /**\n * Call to trigger a re-processing of it's pairs on the next call to\n * UpdatePairs.\n */\n touchProxy(proxyId: number): void {\n this.bufferMove(proxyId);\n }\n\n bufferMove(proxyId: number): void {\n this.m_moveBuffer.push(proxyId);\n }\n\n unbufferMove(proxyId: number): void {\n for (let i = 0; i < this.m_moveBuffer.length; ++i) {\n if (this.m_moveBuffer[i] === proxyId) {\n this.m_moveBuffer[i] = null;\n }\n }\n }\n\n /**\n * Update the pairs. This results in pair callbacks. This can only add pairs.\n */\n updatePairs(addPairCallback: (userDataA: FixtureProxy, userDataB: FixtureProxy) => void): void {\n _ASSERT && console.assert(typeof addPairCallback === 'function');\n this.m_callback = addPairCallback;\n\n // Perform tree queries for all moving proxies.\n while (this.m_moveBuffer.length > 0) {\n this.m_queryProxyId = this.m_moveBuffer.pop();\n if (this.m_queryProxyId === null) {\n continue;\n }\n\n // We have to query the tree with the fat AABB so that\n // we don't fail to create a pair that may touch later.\n const fatAABB = this.m_tree.getFatAABB(this.m_queryProxyId);\n\n // Query tree, create pairs and add them pair buffer.\n this.m_tree.query(fatAABB, this.queryCallback);\n }\n\n // Try to keep the tree balanced.\n // this.m_tree.rebalance(4);\n }\n\n queryCallback = (proxyId: number): boolean => {\n // A proxy cannot form a pair with itself.\n if (proxyId === this.m_queryProxyId) {\n return true;\n }\n\n const proxyIdA = Math.min(proxyId, this.m_queryProxyId);\n const proxyIdB = Math.max(proxyId, this.m_queryProxyId);\n\n // TODO: Skip any duplicate pairs.\n\n const userDataA = this.m_tree.getUserData(proxyIdA);\n const userDataB = this.m_tree.getUserData(proxyIdB);\n\n // Send the pairs back to the client.\n this.m_callback(userDataA, userDataB);\n\n return true;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2, Vec2Value } from './Vec2';\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class Rot {\n s: number;\n c: number;\n\n /** Initialize from an angle in radians. */\n constructor(angle?: number | Rot) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Rot)) {\n return new Rot(angle);\n }\n if (typeof angle === 'number') {\n this.setAngle(angle);\n } else if (typeof angle === 'object') {\n this.setRot(angle);\n } else {\n this.setIdentity();\n }\n }\n\n /** @internal */\n static neo(angle: number): Rot {\n const obj = Object.create(Rot.prototype);\n obj.setAngle(angle);\n return obj;\n }\n\n static clone(rot: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n const obj = Object.create(Rot.prototype);\n obj.s = rot.s;\n obj.c = rot.c;\n return obj;\n }\n\n static identity(): Rot {\n const obj = Object.create(Rot.prototype);\n obj.s = 0.0;\n obj.c = 1.0;\n return obj;\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.s) && Math.isFinite(obj.c);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Rot.isValid(o), 'Invalid Rot!', o);\n }\n\n /** Set to the identity rotation. */\n setIdentity(): void {\n this.s = 0.0;\n this.c = 1.0;\n }\n\n set(angle: number | Rot): void {\n if (typeof angle === 'object') {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n\n } else {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n }\n\n setRot(angle: Rot): void {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n }\n\n /** Set using an angle in radians. */\n setAngle(angle: number): void {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n\n /** Get the angle in radians. */\n getAngle(): number {\n return Math.atan2(this.s, this.c);\n }\n\n /** Get the x-axis. */\n getXAxis(): Vec2 {\n return Vec2.neo(this.c, this.s);\n }\n\n /** Get the u-axis. */\n getYAxis(): Vec2 {\n return Vec2.neo(-this.s, this.c);\n }\n\n /** Multiply two rotations: q * r */\n static mul(rot: Rot, m: Rot): Rot;\n /** Rotate a vector */\n static mul(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(rot, m) {\n _ASSERT && Rot.assert(rot);\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Multiply two rotations: q * r */\n static mulRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n }\n\n /** Rotate a vector */\n static mulVec2(rot: Rot, m: Vec2): Vec2 {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n\n static mulSub(rot: Rot, v: Vec2, w: Vec2): Vec2 {\n const x = rot.c * (v.x - w.x) - rot.s * (v.y - w.y);\n const y = rot.s * (v.x - w.x) + rot.c * (v.y - w.y);\n return Vec2.neo(x, y);\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulT(rot: Rot, m: Rot): Rot;\n /** Inverse rotate a vector */\n static mulT(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(rot, m) {\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulTRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n }\n\n /** Inverse rotate a vector */\n static mulTVec2(rot: Rot, m: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2, Vec2Value } from './Vec2';\nimport { Rot } from './Rot';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A transform contains translation and rotation. It is used to represent the\n * position and orientation of rigid frames. Initialize using a position vector\n * and a rotation.\n */\nexport class Transform {\n /** position */\n p: Vec2;\n\n /** rotation */\n q: Rot;\n\n constructor(position?: Vec2Value, rotation?: number) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Transform)) {\n return new Transform(position, rotation);\n }\n this.p = Vec2.zero();\n this.q = Rot.identity();\n if (typeof position !== 'undefined') {\n this.p.setVec2(position);\n }\n if (typeof rotation !== 'undefined') {\n this.q.setAngle(rotation);\n }\n }\n\n static clone(xf: Transform): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(xf.p);\n obj.q = Rot.clone(xf.q);\n return obj;\n }\n\n /** @internal */\n static neo(position: Vec2, rotation: Rot): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(position);\n obj.q = Rot.clone(rotation);\n return obj;\n }\n\n static identity(): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.zero();\n obj.q = Rot.identity();\n return obj;\n }\n\n /**\n * Set this to the identity transform.\n */\n setIdentity(): void {\n this.p.setZero();\n this.q.setIdentity();\n }\n\n set(position: Vec2, rotation: number): void;\n set(xf: Transform): void;\n /**\n * Set this based on the position and angle.\n */\n // tslint:disable-next-line:typedef\n set(a, b?) {\n if (typeof b === 'undefined') {\n this.p.set(a.p);\n this.q.set(a.q);\n } else {\n this.p.set(a);\n this.q.set(b);\n }\n }\n\n /**\n * Set this based on the position and angle.\n */\n setNum(position: Vec2, rotation: number) {\n this.p.setVec2(position);\n this.q.setAngle(rotation);\n }\n\n setTransform(xf: Transform): void {\n this.p.setVec2(xf.p);\n this.q.setRot(xf.q);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.p) && Rot.isValid(obj.q);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Transform.isValid(o), 'Invalid Transform!', o);\n }\n\n static mul(a: Transform, b: Vec2Value): Vec2;\n static mul(a: Transform, b: Transform): Transform;\n // static mul(a: Transform, b: Vec2Value[]): Vec2[];\n // static mul(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (Array.isArray(b)) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n\n } else if ('x' in b && 'y' in b) {\n return Transform.mulVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulXf(a, b);\n }\n }\n\n static mulAll(a: Transform, b: Vec2Value[]): Vec2[];\n static mulAll(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mulAll(a: Transform, b) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static mulFn(a: Transform) {\n _ASSERT && Transform.assert(a);\n return function(b: Vec2Value): Vec2 {\n return Transform.mul(a, b);\n };\n }\n\n static mulVec2(a: Transform, b: Vec2Value): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = (a.q.c * b.x - a.q.s * b.y) + a.p.x;\n const y = (a.q.s * b.x + a.q.c * b.y) + a.p.y;\n return Vec2.neo(x, y);\n }\n\n static mulXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p\n // = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p\n const xf = Transform.identity();\n xf.q = Rot.mulRot(a.q, b.q);\n xf.p = Vec2.add(Rot.mulVec2(a.q, b.p), a.p);\n return xf;\n }\n\n static mulT(a: Transform, b: Vec2Value): Vec2;\n static mulT(a: Transform, b: Transform): Transform;\n // tslint:disable-next-line:typedef\n static mulT(a, b) {\n if ('x' in b && 'y' in b) {\n return Transform.mulTVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulTXf(a, b);\n }\n }\n\n static mulTVec2(a: Transform, b: Vec2Value): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const px = b.x - a.p.x;\n const py = b.y - a.p.y;\n const x = (a.q.c * px + a.q.s * py);\n const y = (-a.q.s * px + a.q.c * py);\n return Vec2.neo(x, y);\n }\n\n static mulTXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q' * (B.q * v1 + B.p - A.p)\n // = A.q' * B.q * v1 + A.q' * (B.p - A.p)\n const xf = Transform.identity();\n xf.q.setRot(Rot.mulTRot(a.q, b.q));\n xf.p.setVec2(Rot.mulTVec2(a.q, Vec2.sub(b.p, a.p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\nimport { Vec2 } from './Vec2';\nimport { Rot } from './Rot';\nimport { Transform } from './Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * This describes the motion of a body/shape for TOI computation. Shapes are\n * defined with respect to the body origin, which may not coincide with the\n * center of mass. However, to support dynamics we must interpolate the center\n * of mass position.\n */\nexport class Sweep {\n /** Local center of mass position */\n localCenter: Vec2;\n\n /** World center position */\n c: Vec2;\n\n /** World angle */\n a: number;\n\n /** Fraction of the current time step in the range [0,1], c0 and a0 are c and a at alpha0. */\n alpha0: number;\n\n c0: Vec2;\n a0: number;\n\n constructor(c?: Vec2, a?: number) {\n _ASSERT && console.assert(typeof c === 'undefined');\n _ASSERT && console.assert(typeof a === 'undefined');\n this.localCenter = Vec2.zero();\n this.c = Vec2.zero();\n this.a = 0;\n this.alpha0 = 0;\n this.c0 = Vec2.zero();\n this.a0 = 0;\n }\n\n setTransform(xf: Transform): void {\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n\n this.a = xf.q.getAngle();\n this.a0 = xf.q.getAngle();\n }\n\n setLocalCenter(localCenter: Vec2, xf: Transform): void {\n this.localCenter.setVec2(localCenter);\n\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n }\n\n /**\n * Get the interpolated transform at a specific time.\n *\n * @param xf\n * @param beta A factor in [0,1], where 0 indicates alpha0\n */\n getTransform(xf: Transform, beta: number = 0): void {\n xf.q.setAngle((1.0 - beta) * this.a0 + beta * this.a);\n xf.p.setCombine((1.0 - beta), this.c0, beta, this.c);\n\n // shift to origin\n xf.p.sub(Rot.mulVec2(xf.q, this.localCenter));\n }\n\n /**\n * Advance the sweep forward, yielding a new initial state.\n *\n * @param alpha The new initial time\n */\n advance(alpha: number): void {\n _ASSERT && console.assert(this.alpha0 < 1.0);\n const beta = (alpha - this.alpha0) / (1.0 - this.alpha0);\n this.c0.setCombine(beta, this.c, 1 - beta, this.c0);\n this.a0 = beta * this.a + (1 - beta) * this.a0;\n this.alpha0 = alpha;\n }\n\n forward(): void {\n this.a0 = this.a;\n this.c0.setVec2(this.c);\n }\n\n /**\n * normalize the angles in radians to be between -pi and pi.\n */\n normalize(): void {\n const a0 = Math.mod(this.a0, -Math.PI, +Math.PI);\n this.a -= this.a0 - a0;\n this.a0 = a0;\n }\n\n clone(): Sweep {\n const clone = new Sweep();\n clone.localCenter.setVec2(this.localCenter);\n clone.alpha0 = this.alpha0;\n clone.a0 = this.a0;\n clone.a = this.a;\n clone.c0.setVec2(this.c0);\n clone.c.setVec2(this.c);\n return clone;\n }\n\n set(that: Sweep): void {\n this.localCenter.setVec2(that.localCenter);\n this.alpha0 = that.alpha0;\n this.a0 = that.a0;\n this.a = that.a;\n this.c0.setVec2(that.c0);\n this.c.setVec2(that.c);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\n\nexport class Velocity {\n /** linear */\n v: Vec2;\n\n /** angular */\n w: number;\n\n constructor() {\n this.v = Vec2.zero();\n this.w = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Transform } from '../common/Transform';\n\n\nexport class Position {\n /** location */\n c: Vec2;\n\n /** angle */\n a: number;\n\n constructor() {\n this.c = Vec2.zero();\n this.a = 0;\n }\n\n getTransform(xf: Transform, p: Vec2): Transform {\n xf.q.setAngle(this.a);\n xf.p.setVec2(Vec2.sub(this.c, Rot.mulVec2(xf.q, p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from './AABB';\nimport { DistanceProxy } from './Distance';\nimport type { Transform } from '../common/Transform';\nimport type { Vec2Value } from '../common/Vec2';\n\n// todo make shape an interface\n\n/**\n * A shape is used for collision detection. You can create a shape however you\n * like. Shapes used for simulation in World are created automatically when a\n * Fixture is created. Shapes may encapsulate one or more child shapes.\n */\nexport abstract class Shape {\n m_type: ShapeType;\n m_radius: number;\n\n /** @internal */\n abstract _reset(): void;\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return typeof obj.m_type === 'string' && typeof obj.m_radius === 'number';\n }\n\n abstract getRadius(): number;\n\n /**\n * Get the type of this shape. You can use this to down cast to the concrete\n * shape.\n *\n * @return the shape type.\n */\n abstract getType(): ShapeType;\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n abstract _clone(): Shape;\n\n /**\n * Get the number of child primitives.\n */\n abstract getChildCount(): number;\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n abstract testPoint(xf: Transform, p: Vec2Value): boolean;\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n abstract rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean;\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n abstract computeAABB(aabb: AABB, xf: Transform, childIndex: number): void;\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n abstract computeMass(massData: MassData, density?: number): void;\n\n abstract computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void;\n\n}\n\nexport type ShapeType = \"circle\" | \"edge\" | \"polygon\" | \"chain\";\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { math as Math } from '../common/Math';\nimport { Vec2, Vec2Value } from '../common/Vec2';\nimport { AABB, RayCastInput, RayCastOutput } from '../collision/AABB';\nimport { Shape, ShapeType } from '../collision/Shape';\nimport { Body, MassData } from \"./Body\";\nimport { BroadPhase } from \"../collision/BroadPhase\";\nimport { Transform } from \"../common/Transform\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A fixture definition is used to create a fixture. This class defines an\n * abstract fixture definition. You can reuse fixture definitions safely.\n */\nexport interface FixtureOpt {\n userData?: unknown;\n /**\n * The friction coefficient, usually in the range [0,1]\n */\n friction?: number;\n /**\n * The restitution (elasticity) usually in the range [0,1]\n */\n restitution?: number;\n /**\n * The density, usually in kg/m^2\n */\n density?: number;\n /**\n * A sensor shape collects contact information but never generates a collision response.\n */\n isSensor?: boolean;\n /**\n * Zero, positive or negative collision group.\n * Fixtures with same positive groupIndex always collide and fixtures with same negative groupIndex never collide.\n */\n filterGroupIndex?: number;\n /**\n * Collision category bit or bits that this fixture belongs to.\n * If groupIndex is zero or not matching, then at least one bit in this fixture categoryBits should match other fixture maskBits and vice versa.\n */\n filterCategoryBits?: number;\n /**\n * Collision category bit or bits that this fixture accept for collision.\n */\n filterMaskBits?: number;\n}\n\nexport interface FixtureDef extends FixtureOpt {\n shape: Shape;\n}\n\nconst FixtureDefDefault: FixtureOpt = {\n userData : null,\n friction : 0.2,\n restitution : 0.0,\n density : 0.0,\n isSensor : false,\n\n filterGroupIndex : 0,\n filterCategoryBits : 0x0001,\n filterMaskBits : 0xFFFF\n};\n\n/**\n * This proxy is used internally to connect shape children to the broad-phase.\n */\nexport class FixtureProxy {\n aabb: AABB;\n fixture: Fixture;\n childIndex: number;\n proxyId: number;\n constructor(fixture: Fixture, childIndex: number) {\n this.aabb = new AABB();\n this.fixture = fixture;\n this.childIndex = childIndex;\n this.proxyId;\n }\n}\n\n/**\n * A fixture is used to attach a shape to a body for collision detection. A\n * fixture inherits its transform from its parent. Fixtures hold additional\n * non-geometric data such as friction, collision filters, etc.\n *\n * To create a new Fixture use {@link Body.createFixture}.\n */\nexport class Fixture {\n /** @internal */ m_body: Body;\n /** @internal */ m_friction: number;\n /** @internal */ m_restitution: number;\n /** @internal */ m_density: number;\n /** @internal */ m_isSensor: boolean;\n /** @internal */ m_filterGroupIndex: number;\n /** @internal */ m_filterCategoryBits: number;\n /** @internal */ m_filterMaskBits: number;\n /** @internal */ m_shape: Shape;\n /** @internal */ m_next: Fixture | null;\n /** @internal */ m_proxies: FixtureProxy[];\n /** @internal */ m_proxyCount: number;\n /** @internal */ m_userData: unknown;\n\n constructor(body: Body, def: FixtureDef);\n constructor(body: Body, shape: Shape, def?: FixtureOpt);\n constructor(body: Body, shape: Shape, density?: number);\n // tslint:disable-next-line:typedef\n /** @internal */ constructor(body: Body, shape?, def?) {\n if (shape.shape) {\n def = shape;\n shape = shape.shape;\n\n } else if (typeof def === 'number') {\n def = {density : def};\n }\n\n def = options(def, FixtureDefDefault);\n\n this.m_body = body;\n\n this.m_friction = def.friction;\n this.m_restitution = def.restitution;\n this.m_density = def.density;\n this.m_isSensor = def.isSensor;\n\n this.m_filterGroupIndex = def.filterGroupIndex;\n this.m_filterCategoryBits = def.filterCategoryBits;\n this.m_filterMaskBits = def.filterMaskBits;\n\n // TODO validate shape\n this.m_shape = shape; // .clone();\n\n this.m_next = null;\n\n this.m_proxies = [];\n this.m_proxyCount = 0;\n\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n\n this.m_userData = def.userData;\n }\n\n /**\n * Re-setup fixture.\n * @internal\n */\n _reset(): void {\n const body = this.getBody();\n const broadPhase = body.m_world.m_broadPhase;\n this.destroyProxies(broadPhase);\n if (this.m_shape._reset) {\n this.m_shape._reset();\n }\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n this.createProxies(broadPhase, body.m_xf);\n body.resetMassData();\n }\n\n /** @internal */\n _serialize(): object {\n return {\n friction: this.m_friction,\n restitution: this.m_restitution,\n density: this.m_density,\n isSensor: this.m_isSensor,\n\n filterGroupIndex: this.m_filterGroupIndex,\n filterCategoryBits: this.m_filterCategoryBits,\n filterMaskBits: this.m_filterMaskBits,\n\n shape: this.m_shape,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, body: any, restore: any): Fixture {\n const shape = restore(Shape, data.shape);\n const fixture = shape && new Fixture(body, shape, data);\n return fixture;\n }\n\n /**\n * Get the type of the child shape. You can use this to down cast to the\n * concrete shape.\n */\n getType(): ShapeType {\n return this.m_shape.getType();\n }\n\n /**\n * Get the child shape. You can modify the child shape, however you should not\n * change the number of vertices because this will crash some collision caching\n * mechanisms. Manipulating the shape may lead to non-physical behavior.\n */\n getShape(): Shape {\n return this.m_shape;\n }\n\n /**\n * A sensor shape collects contact information but never generates a collision\n * response.\n */\n isSensor(): boolean {\n return this.m_isSensor;\n }\n\n /**\n * Set if this fixture is a sensor.\n */\n setSensor(sensor: boolean): void {\n if (sensor != this.m_isSensor) {\n this.m_body.setAwake(true);\n this.m_isSensor = sensor;\n }\n }\n\n // /**\n // * Get the contact filtering data.\n // */\n // getFilterData() {\n // return this.m_filter;\n // }\n\n /**\n * Get the user data that was assigned in the fixture definition. Use this to\n * store your application specific data.\n */\n getUserData(): unknown {\n return this.m_userData;\n }\n\n /**\n * Set the user data. Use this to store your application specific data.\n */\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get the parent body of this fixture. This is null if the fixture is not\n * attached.\n */\n getBody(): Body {\n return this.m_body;\n }\n\n /**\n * Get the next fixture in the parent body's fixture list.\n */\n getNext(): Fixture | null {\n return this.m_next;\n }\n\n /**\n * Get the density of this fixture.\n */\n getDensity(): number {\n return this.m_density;\n }\n\n /**\n * Set the density of this fixture. This will _not_ automatically adjust the\n * mass of the body. You must call Body.resetMassData to update the body's mass.\n */\n setDensity(density: number): void {\n _ASSERT && console.assert(Math.isFinite(density) && density >= 0.0);\n this.m_density = density;\n }\n\n /**\n * Get the coefficient of friction, usually in the range [0,1].\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Set the coefficient of friction. This will not change the friction of\n * existing contacts.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the coefficient of restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Set the coefficient of restitution. This will not change the restitution of\n * existing contacts.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Test a point in world coordinates for containment in this fixture.\n */\n testPoint(p: Vec2Value): boolean {\n return this.m_shape.testPoint(this.m_body.getTransform(), p);\n }\n\n /**\n * Cast a ray against this shape.\n */\n rayCast(output: RayCastOutput, input: RayCastInput, childIndex: number): boolean {\n return this.m_shape.rayCast(output, input, this.m_body.getTransform(), childIndex);\n }\n\n /**\n * Get the mass data for this fixture. The mass data is based on the density and\n * the shape. The rotational inertia is about the shape's origin. This operation\n * may be expensive.\n */\n getMassData(massData: MassData): void {\n this.m_shape.computeMass(massData, this.m_density);\n }\n\n /**\n * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a\n * more accurate AABB, compute it using the shape and the body transform.\n */\n getAABB(childIndex: number): AABB {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_proxies.length);\n return this.m_proxies[childIndex].aabb;\n }\n\n /**\n * These support body activation/deactivation.\n */\n createProxies(broadPhase: BroadPhase, xf: Transform): void {\n _ASSERT && console.assert(this.m_proxyCount == 0);\n\n // Create proxies in the broad-phase.\n this.m_proxyCount = this.m_shape.getChildCount();\n\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n this.m_shape.computeAABB(proxy.aabb, xf, i);\n proxy.proxyId = broadPhase.createProxy(proxy.aabb, proxy);\n }\n }\n\n destroyProxies(broadPhase: BroadPhase): void {\n // Destroy proxies in the broad-phase.\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n broadPhase.destroyProxy(proxy.proxyId);\n proxy.proxyId = null;\n }\n\n this.m_proxyCount = 0;\n }\n\n /**\n * Updates this fixture proxy in broad-phase (with combined AABB of current and\n * next transformation).\n */\n synchronize(broadPhase: BroadPhase, xf1: Transform, xf2: Transform): void {\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n // Compute an AABB that covers the swept shape (may miss some rotation\n // effect).\n const aabb1 = new AABB();\n const aabb2 = new AABB();\n this.m_shape.computeAABB(aabb1, xf1, proxy.childIndex);\n this.m_shape.computeAABB(aabb2, xf2, proxy.childIndex);\n\n proxy.aabb.combine(aabb1, aabb2);\n\n const displacement = Vec2.sub(xf2.p, xf1.p);\n\n broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement);\n }\n }\n\n /**\n * Set the contact filtering data. This will not update contacts until the next\n * time step when either parent body is active and awake. This automatically\n * calls refilter.\n */\n setFilterData(filter: { groupIndex: number, categoryBits: number, maskBits: number }): void {\n this.m_filterGroupIndex = filter.groupIndex;\n this.m_filterCategoryBits = filter.categoryBits;\n this.m_filterMaskBits = filter.maskBits;\n this.refilter();\n }\n\n getFilterGroupIndex(): number {\n return this.m_filterGroupIndex;\n }\n\n setFilterGroupIndex(groupIndex: number): void {\n this.m_filterGroupIndex = groupIndex;\n }\n\n getFilterCategoryBits(): number {\n return this.m_filterCategoryBits;\n }\n\n setFilterCategoryBits(categoryBits: number): void {\n this.m_filterCategoryBits = categoryBits;\n }\n\n getFilterMaskBits(): number {\n return this.m_filterMaskBits;\n }\n\n setFilterMaskBits(maskBits: number): void {\n this.m_filterMaskBits = maskBits;\n }\n\n /**\n * Call this if you want to establish collision that was previously disabled by\n * ContactFilter.\n */\n refilter(): void {\n if (this.m_body == null) {\n return;\n }\n\n // Flag associated contacts for filtering.\n let edge = this.m_body.getContactList();\n while (edge) {\n const contact = edge.contact;\n const fixtureA = contact.getFixtureA();\n const fixtureB = contact.getFixtureB();\n if (fixtureA == this || fixtureB == this) {\n contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n\n const world = this.m_body.getWorld();\n\n if (world == null) {\n return;\n }\n\n // Touch each proxy so that new pairs may be created\n const broadPhase = world.m_broadPhase;\n for (let i = 0; i < this.m_proxyCount; ++i) {\n broadPhase.touchProxy(this.m_proxies[i].proxyId);\n }\n }\n\n /**\n * Implement this method to provide collision filtering, if you want finer\n * control over contact creation.\n *\n * Return true if contact calculations should be performed between these two\n * fixtures.\n *\n * Warning: for performance reasons this is only called when the AABBs begin to\n * overlap.\n */\n shouldCollide(that: Fixture): boolean {\n\n if (that.m_filterGroupIndex === this.m_filterGroupIndex && that.m_filterGroupIndex !== 0) {\n return that.m_filterGroupIndex > 0;\n }\n\n const collideA = (that.m_filterMaskBits & this.m_filterCategoryBits) !== 0;\n const collideB = (that.m_filterCategoryBits & this.m_filterMaskBits) !== 0;\n const collide = collideA && collideB;\n return collide;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { Vec2, Vec2Value } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { math as Math } from '../common/Math';\nimport { Sweep } from '../common/Sweep';\nimport { Transform } from '../common/Transform';\nimport { Velocity } from './Velocity';\nimport { Position } from './Position';\nimport { Fixture, FixtureDef, FixtureOpt } from './Fixture';\nimport { Shape } from '../collision/Shape';\nimport { JointEdge } from \"./Joint\";\nimport { World } from \"./World\";\nimport { ContactEdge } from \"./Contact\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport type BodyType = 'static' | 'kinematic' | 'dynamic';\n\nconst STATIC = 'static';\nconst KINEMATIC = 'kinematic';\nconst DYNAMIC = 'dynamic';\n\nexport interface BodyDef {\n /**\n * Body types are static, kinematic, or dynamic. Note: if a dynamic\n * body would have zero mass, the mass is set to one.\n */\n type?: BodyType;\n /**\n * The world position of the body. Avoid creating bodies at the\n * origin since this can lead to many overlapping shapes.\n */\n position?: Vec2;\n /**\n * The world angle of the body in radians.\n */\n angle?: number;\n /**\n * The linear velocity of the body's origin in world co-ordinates.\n */\n linearVelocity?: Vec2;\n angularVelocity?: number;\n /**\n * Linear damping is use to reduce the linear velocity. The\n * damping parameter can be larger than 1.0 but the damping effect becomes\n * sensitive to the time step when the damping parameter is large.\n */\n linearDamping?: number;\n /**\n * Angular damping is use to reduce the angular velocity.\n * The damping parameter can be larger than 1.0 but the damping effect\n * becomes sensitive to the time step when the damping parameter is large.\n */\n angularDamping?: number;\n /**\n * Should this body be prevented from rotating? Useful for characters.\n */\n fixedRotation?: boolean;\n /**\n * Is this a fast moving body that should be prevented from\n * tunneling through other moving bodies? Note that all bodies are\n * prevented from tunneling through kinematic and static bodies. This\n * setting is only considered on dynamic bodies. Warning: You should use\n * this flag sparingly since it increases processing time.\n */\n bullet?: boolean;\n gravityScale?: number;\n /**\n * Set this flag to false if this body should never fall asleep. Note that this increases CPU usage.\n */\n allowSleep?: boolean;\n /**\n * Is this body initially awake or sleeping?\n */\n awake?: boolean;\n /**\n * Does this body start out active?\n */\n active?: boolean;\n userData?: any;\n}\n\nconst BodyDefDefault: BodyDef = {\n type : STATIC,\n position : Vec2.zero(),\n angle : 0.0,\n\n linearVelocity : Vec2.zero(),\n angularVelocity : 0.0,\n\n linearDamping : 0.0,\n angularDamping : 0.0,\n\n fixedRotation : false,\n bullet : false,\n gravityScale : 1.0,\n\n allowSleep : true,\n awake : true,\n active : true,\n\n userData : null\n};\n\n/**\n * MassData This holds the mass data computed for a shape.\n */\nexport class MassData {\n /** The mass of the shape, usually in kilograms. */\n mass: number = 0;\n /** The position of the shape's centroid relative to the shape's origin. */\n center: Vec2 = Vec2.zero();\n /** The rotational inertia of the shape about the local origin. */\n I: number = 0;\n}\n\n/**\n * A rigid body composed of one or more fixtures.\n *\n * To create a new Body use {@link World.createBody}.\n */\nexport class Body {\n /**\n * A static body does not move under simulation and behaves as if it has infinite mass.\n * Internally, zero is stored for the mass and the inverse mass.\n * Static bodies can be moved manually by the user.\n * A static body has zero velocity.\n * Static bodies do not collide with other static or kinematic bodies.\n */\n static readonly STATIC: BodyType = 'static';\n /**\n * A kinematic body moves under simulation according to its velocity.\n * Kinematic bodies do not respond to forces.\n * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity.\n * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass.\n * Kinematic bodies do not collide with other kinematic or static bodies.\n */\n static readonly KINEMATIC: BodyType = 'kinematic';\n\n /**\n * A dynamic body is fully simulated.\n * They can be moved manually by the user, but normally they move according to forces.\n * A dynamic body can collide with all body types.\n * A dynamic body always has finite, non-zero mass.\n * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate.\n */\n static readonly DYNAMIC: BodyType = 'dynamic';\n\n /** @internal */ m_world: World;\n /** @internal */ m_awakeFlag: boolean;\n /** @internal */ m_autoSleepFlag: boolean;\n /** @internal */ m_bulletFlag: boolean;\n /** @internal */ m_fixedRotationFlag: boolean;\n /** @internal */ m_activeFlag: boolean;\n /** @internal */ m_islandFlag: boolean;\n /** @internal */ m_toiFlag: boolean;\n /** @internal */ m_userData: unknown;\n /** @internal */ m_type: BodyType;\n /** @internal */ m_mass: number;\n /** @internal */ m_invMass: number;\n /** @internal Rotational inertia about the center of mass. */\n m_I: number;\n /** @internal */ m_invI: number;\n /** @internal the body origin transform */\n m_xf: Transform;\n /** @internal the swept motion for CCD */\n m_sweep: Sweep;\n // position and velocity correction\n /** @internal */ c_velocity: Velocity;\n /** @internal */ c_position: Position;\n /** @internal */ m_force: Vec2;\n /** @internal */ m_torque: number;\n /** @internal */ m_linearVelocity: Vec2;\n /** @internal */ m_angularVelocity: number;\n /** @internal */ m_linearDamping: number;\n /** @internal */ m_angularDamping: number;\n /** @internal */ m_gravityScale: number;\n /** @internal */ m_sleepTime: number;\n /** @internal */ m_jointList: JointEdge | null;\n /** @internal */ m_contactList: ContactEdge | null;\n /** @internal */ m_fixtureList: Fixture | null;\n /** @internal */ m_prev: Body | null;\n /** @internal */ m_next: Body | null;\n /** @internal */ m_destroyed: boolean;\n\n /** @internal */\n constructor(world: World, def: BodyDef) {\n def = options(def, BodyDefDefault);\n\n _ASSERT && console.assert(Vec2.isValid(def.position));\n _ASSERT && console.assert(Vec2.isValid(def.linearVelocity));\n _ASSERT && console.assert(Math.isFinite(def.angle));\n _ASSERT && console.assert(Math.isFinite(def.angularVelocity));\n _ASSERT && console.assert(Math.isFinite(def.angularDamping) && def.angularDamping >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.linearDamping) && def.linearDamping >= 0.0);\n\n this.m_world = world;\n\n this.m_awakeFlag = def.awake;\n this.m_autoSleepFlag = def.allowSleep;\n this.m_bulletFlag = def.bullet;\n this.m_fixedRotationFlag = def.fixedRotation;\n this.m_activeFlag = def.active;\n\n this.m_islandFlag = false;\n this.m_toiFlag = false;\n\n this.m_userData = def.userData;\n this.m_type = def.type;\n\n if (this.m_type == DYNAMIC) {\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n } else {\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n }\n\n // Rotational inertia about the center of mass.\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n // the body origin transform\n this.m_xf = Transform.identity();\n this.m_xf.p = Vec2.clone(def.position);\n this.m_xf.q.setAngle(def.angle);\n\n // the swept motion for CCD\n this.m_sweep = new Sweep();\n this.m_sweep.setTransform(this.m_xf);\n\n // position and velocity correction\n this.c_velocity = new Velocity();\n this.c_position = new Position();\n\n this.m_force = Vec2.zero();\n this.m_torque = 0.0;\n\n this.m_linearVelocity = Vec2.clone(def.linearVelocity);\n this.m_angularVelocity = def.angularVelocity;\n\n this.m_linearDamping = def.linearDamping;\n this.m_angularDamping = def.angularDamping;\n this.m_gravityScale = def.gravityScale;\n\n this.m_sleepTime = 0.0;\n\n this.m_jointList = null;\n this.m_contactList = null;\n this.m_fixtureList = null;\n\n this.m_prev = null;\n this.m_next = null;\n\n this.m_destroyed = false;\n }\n\n /** @internal */\n _serialize(): object {\n const fixtures = [];\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n fixtures.push(f);\n }\n return {\n type: this.m_type,\n bullet: this.m_bulletFlag,\n position: this.m_xf.p,\n angle: this.m_xf.q.getAngle(),\n linearVelocity: this.m_linearVelocity,\n angularVelocity: this.m_angularVelocity,\n fixtures,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): Body {\n const body = new Body(world, data);\n\n if (data.fixtures) {\n for (let i = data.fixtures.length - 1; i >= 0; i--) {\n const fixture = restore(Fixture, data.fixtures[i], body);\n body._addFixture(fixture);\n }\n }\n return body;\n }\n\n isWorldLocked(): boolean {\n return this.m_world && this.m_world.isLocked() ? true : false;\n }\n\n getWorld(): World {\n return this.m_world;\n }\n\n getNext(): Body | null {\n return this.m_next;\n }\n\n setUserData(data: any): void {\n this.m_userData = data;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n getFixtureList(): Fixture | null {\n return this.m_fixtureList;\n }\n\n getJointList(): JointEdge | null {\n return this.m_jointList;\n }\n\n /**\n * Warning: this list changes during the time step and you may miss some\n * collisions if you don't use ContactListener.\n */\n getContactList(): ContactEdge | null {\n return this.m_contactList;\n }\n\n isStatic(): boolean {\n return this.m_type == STATIC;\n }\n\n isDynamic(): boolean {\n return this.m_type == DYNAMIC;\n }\n\n isKinematic(): boolean {\n return this.m_type == KINEMATIC;\n }\n\n /**\n * This will alter the mass and velocity.\n */\n setStatic(): Body {\n this.setType(STATIC);\n return this;\n }\n\n setDynamic(): Body {\n this.setType(DYNAMIC);\n return this;\n }\n\n setKinematic(): Body {\n this.setType(KINEMATIC);\n return this;\n }\n\n /**\n * @internal\n */\n getType(): BodyType {\n return this.m_type;\n }\n\n /**\n * @internal\n */\n setType(type: BodyType): void {\n _ASSERT && console.assert(type === STATIC || type === KINEMATIC || type === DYNAMIC);\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type == type) {\n return;\n }\n\n this.m_type = type;\n\n this.resetMassData();\n\n if (this.m_type == STATIC) {\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_sweep.forward();\n this.synchronizeFixtures();\n }\n\n this.setAwake(true);\n\n this.m_force.setZero();\n this.m_torque = 0.0;\n\n // Delete the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n\n // Touch the proxies so that new contacts will be created (when appropriate)\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n const proxyCount = f.m_proxyCount;\n for (let i = 0; i < proxyCount; ++i) {\n broadPhase.touchProxy(f.m_proxies[i].proxyId);\n }\n }\n }\n\n isBullet(): boolean {\n return this.m_bulletFlag;\n }\n\n /**\n * Should this body be treated like a bullet for continuous collision detection?\n */\n setBullet(flag: boolean): void {\n this.m_bulletFlag = !!flag;\n }\n\n isSleepingAllowed(): boolean {\n return this.m_autoSleepFlag;\n }\n\n setSleepingAllowed(flag: boolean): void {\n this.m_autoSleepFlag = !!flag;\n if (this.m_autoSleepFlag == false) {\n this.setAwake(true);\n }\n }\n\n isAwake(): boolean {\n return this.m_awakeFlag;\n }\n\n /**\n * Set the sleep state of the body. A sleeping body has very low CPU cost.\n *\n * @param flag Set to true to wake the body, false to put it to sleep.\n */\n setAwake(flag: boolean): void {\n if (flag) {\n if (this.m_awakeFlag == false) {\n this.m_awakeFlag = true;\n this.m_sleepTime = 0.0;\n }\n } else {\n this.m_awakeFlag = false;\n this.m_sleepTime = 0.0;\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_force.setZero();\n this.m_torque = 0.0;\n }\n }\n\n isActive(): boolean {\n return this.m_activeFlag;\n }\n\n /**\n * Set the active state of the body. An inactive body is not simulated and\n * cannot be collided with or woken up. If you pass a flag of true, all fixtures\n * will be added to the broad-phase. If you pass a flag of false, all fixtures\n * will be removed from the broad-phase and all contacts will be destroyed.\n * Fixtures and joints are otherwise unaffected.\n *\n * You may continue to create/destroy fixtures and joints on inactive bodies.\n * Fixtures on an inactive body are implicitly inactive and will not participate\n * in collisions, ray-casts, or queries. Joints connected to an inactive body\n * are implicitly inactive. An inactive body is still owned by a World object\n * and remains\n */\n setActive(flag: boolean): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (flag == this.m_activeFlag) {\n return;\n }\n\n this.m_activeFlag = !!flag;\n\n if (this.m_activeFlag) {\n // Create all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.createProxies(broadPhase, this.m_xf);\n }\n // Contacts are created the next time step.\n\n } else {\n // Destroy all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.destroyProxies(broadPhase);\n }\n\n // Destroy the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n }\n }\n\n isFixedRotation(): boolean {\n return this.m_fixedRotationFlag;\n }\n\n /**\n * Set this body to have fixed rotation. This causes the mass to be reset.\n */\n setFixedRotation(flag: boolean): void {\n if (this.m_fixedRotationFlag == flag) {\n return;\n }\n\n this.m_fixedRotationFlag = !!flag;\n\n this.m_angularVelocity = 0.0;\n\n this.resetMassData();\n }\n\n /**\n * Get the world transform for the body's origin.\n */\n getTransform(): Transform {\n return this.m_xf;\n }\n\n /**\n * Set the position of the body's origin and rotation. Manipulating a body's\n * transform may cause non-physical behavior. Note: contacts are updated on the\n * next call to World.step.\n *\n * @param position The world position of the body's local origin.\n * @param angle The world rotation in radians.\n */\n setTransform(position: Vec2, angle: number): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n this.m_xf.setNum(position, angle);\n this.m_sweep.setTransform(this.m_xf);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, this.m_xf, this.m_xf);\n }\n }\n\n synchronizeTransform(): void {\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Update fixtures in broad-phase.\n */\n synchronizeFixtures(): void {\n const xf = Transform.identity();\n\n this.m_sweep.getTransform(xf, 0);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, xf, this.m_xf);\n }\n }\n\n /**\n * Used in TOI.\n */\n advance(alpha: number): void {\n // Advance to the new safe time. This doesn't sync the broad-phase.\n this.m_sweep.advance(alpha);\n this.m_sweep.c.setVec2(this.m_sweep.c0);\n this.m_sweep.a = this.m_sweep.a0;\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Get the world position for the body's origin.\n */\n getPosition(): Vec2 {\n return this.m_xf.p;\n }\n\n setPosition(p: Vec2): void {\n this.setTransform(p, this.m_sweep.a);\n }\n\n /**\n * Get the current world rotation angle in radians.\n */\n getAngle(): number {\n return this.m_sweep.a;\n }\n\n setAngle(angle: number): void {\n this.setTransform(this.m_xf.p, angle);\n }\n\n /**\n * Get the world position of the center of mass.\n */\n getWorldCenter(): Vec2 {\n return this.m_sweep.c;\n }\n\n /**\n * Get the local position of the center of mass.\n */\n getLocalCenter(): Vec2 {\n return this.m_sweep.localCenter;\n }\n\n /**\n * Get the linear velocity of the center of mass.\n *\n * @return the linear velocity of the center of mass.\n */\n getLinearVelocity(): Vec2 {\n return this.m_linearVelocity;\n }\n\n /**\n * Get the world linear velocity of a world point attached to this body.\n *\n * @param worldPoint A point in world coordinates.\n */\n getLinearVelocityFromWorldPoint(worldPoint: Vec2): Vec2 {\n const localCenter = Vec2.sub(worldPoint, this.m_sweep.c);\n return Vec2.add(this.m_linearVelocity, Vec2.crossNumVec2(this.m_angularVelocity,\n localCenter));\n }\n\n /**\n * Get the world velocity of a local point.\n *\n * @param localPoint A point in local coordinates.\n */\n getLinearVelocityFromLocalPoint(localPoint: Vec2): Vec2 {\n return this.getLinearVelocityFromWorldPoint(this.getWorldPoint(localPoint));\n }\n\n /**\n * Set the linear velocity of the center of mass.\n *\n * @param v The new linear velocity of the center of mass.\n */\n setLinearVelocity(v: Vec2): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (Vec2.dot(v, v) > 0.0) {\n this.setAwake(true);\n }\n this.m_linearVelocity.setVec2(v);\n }\n\n /**\n * Get the angular velocity.\n *\n * @returns the angular velocity in radians/second.\n */\n getAngularVelocity(): number {\n return this.m_angularVelocity;\n }\n\n /**\n * Set the angular velocity.\n *\n * @param omega The new angular velocity in radians/second.\n */\n setAngularVelocity(w: number): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (w * w > 0.0) {\n this.setAwake(true);\n }\n this.m_angularVelocity = w;\n }\n\n getLinearDamping(): number {\n return this.m_linearDamping;\n }\n\n setLinearDamping(linearDamping: number): void {\n this.m_linearDamping = linearDamping;\n }\n\n getAngularDamping(): number {\n return this.m_angularDamping;\n }\n\n setAngularDamping(angularDamping: number): void {\n this.m_angularDamping = angularDamping;\n }\n\n getGravityScale(): number {\n return this.m_gravityScale;\n }\n\n /**\n * Scale the gravity applied to this body.\n */\n setGravityScale(scale: number): void {\n this.m_gravityScale = scale;\n }\n\n /**\n * Get the total mass of the body.\n *\n * @returns The mass, usually in kilograms (kg).\n */\n getMass(): number {\n return this.m_mass;\n }\n\n /**\n * Get the rotational inertia of the body about the local origin.\n *\n * @return the rotational inertia, usually in kg-m^2.\n */\n getInertia(): number {\n return this.m_I + this.m_mass\n * Vec2.dot(this.m_sweep.localCenter, this.m_sweep.localCenter);\n }\n\n /**\n * Copy the mass data of the body to data.\n */\n getMassData(data: MassData): void {\n data.mass = this.m_mass;\n data.I = this.getInertia();\n data.center.setVec2(this.m_sweep.localCenter);\n }\n\n /**\n * This resets the mass properties to the sum of the mass properties of the\n * fixtures. This normally does not need to be called unless you called\n * SetMassData to override the mass and you later want to reset the mass.\n */\n resetMassData(): void {\n // Compute mass data from shapes. Each shape has its own density.\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n this.m_sweep.localCenter.setZero();\n\n // Static and kinematic bodies have zero mass.\n if (this.isStatic() || this.isKinematic()) {\n this.m_sweep.c0.setVec2(this.m_xf.p);\n this.m_sweep.c.setVec2(this.m_xf.p);\n this.m_sweep.a0 = this.m_sweep.a;\n return;\n }\n\n _ASSERT && console.assert(this.isDynamic());\n\n // Accumulate mass over all fixtures.\n const localCenter = Vec2.zero();\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n if (f.m_density == 0.0) {\n continue;\n }\n\n const massData = new MassData();\n f.getMassData(massData);\n this.m_mass += massData.mass;\n localCenter.addMul(massData.mass, massData.center);\n this.m_I += massData.I;\n }\n\n // Compute center of mass.\n if (this.m_mass > 0.0) {\n this.m_invMass = 1.0 / this.m_mass;\n localCenter.mul(this.m_invMass);\n\n } else {\n // Force all dynamic bodies to have a positive mass.\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n }\n\n if (this.m_I > 0.0 && this.m_fixedRotationFlag == false) {\n // Center the inertia about the center of mass.\n this.m_I -= this.m_mass * Vec2.dot(localCenter, localCenter);\n _ASSERT && console.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n\n } else {\n this.m_I = 0.0;\n this.m_invI = 0.0;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(localCenter, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Set the mass properties to override the mass properties of the fixtures. Note\n * that this changes the center of mass position. Note that creating or\n * destroying fixtures can also alter the mass. This function has no effect if\n * the body isn't dynamic.\n *\n * @param massData The mass properties.\n */\n setMassData(massData: MassData): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n this.m_mass = massData.mass;\n if (this.m_mass <= 0.0) {\n this.m_mass = 1.0;\n }\n\n this.m_invMass = 1.0 / this.m_mass;\n\n if (massData.I > 0.0 && this.m_fixedRotationFlag == false) {\n this.m_I = massData.I - this.m_mass\n * Vec2.dot(massData.center, massData.center);\n _ASSERT && console.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(massData.center, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Apply a force at a world point. If the force is not applied at the center of\n * mass, it will generate a torque and affect the angular velocity. This wakes\n * up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyForce(force: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping.\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n this.m_torque += Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), force);\n }\n }\n\n /**\n * Apply a force to the center of mass. This wakes up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param wake Also wake up the body\n */\n applyForceToCenter(force: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n }\n }\n\n /**\n * Apply a torque. This affects the angular velocity without affecting the\n * linear velocity of the center of mass. This wakes up the body.\n *\n * @param torque About the z-axis (out of the screen), usually in N-m.\n * @param wake Also wake up the body\n */\n applyTorque(torque: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_torque += torque;\n }\n }\n\n /**\n * Apply an impulse at a point. This immediately modifies the velocity. It also\n * modifies the angular velocity if the point of application is not at the\n * center of mass. This wakes up the body.\n *\n * @param impulse The world impulse vector, usually in N-seconds or kg-m/s.\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyLinearImpulse(impulse: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_linearVelocity.addMul(this.m_invMass, impulse);\n this.m_angularVelocity += this.m_invI * Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), impulse);\n }\n }\n\n /**\n * Apply an angular impulse.\n *\n * @param impulse The angular impulse in units of kg*m*m/s\n * @param wake Also wake up the body\n */\n applyAngularImpulse(impulse: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_angularVelocity += this.m_invI * impulse;\n }\n }\n\n /**\n * This is used to prevent connected bodies (by joints) from colliding,\n * depending on the joint's collideConnected flag.\n */\n shouldCollide(that: Body): boolean {\n // At least one body should be dynamic.\n if (this.m_type != DYNAMIC && that.m_type != DYNAMIC) {\n return false;\n }\n // Does a joint prevent collision?\n for (let jn = this.m_jointList; jn; jn = jn.next) {\n if (jn.other == that) {\n if (jn.joint.m_collideConnected == false) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addFixture(fixture: Fixture): Fixture {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.createProxies(broadPhase, this.m_xf);\n }\n\n fixture.m_next = this.m_fixtureList;\n this.m_fixtureList = fixture;\n\n // Adjust mass properties if needed.\n if (fixture.m_density > 0.0) {\n this.resetMassData();\n }\n\n // Let the world know we have a new fixture. This will cause new contacts\n // to be created at the beginning of the next time step.\n this.m_world.m_newFixture = true;\n\n return fixture;\n }\n\n /**\n * Creates a fixture and attach it to this body.\n *\n * If the density is non-zero, this function automatically updates the mass of\n * the body.\n *\n * Contacts are not created until the next time step.\n *\n * Warning: This function is locked during callbacks.\n */\n createFixture(def: FixtureDef): Fixture;\n createFixture(shape: Shape, opt?: FixtureOpt): Fixture;\n createFixture(shape: Shape, density?: number): Fixture;\n // tslint:disable-next-line:typedef\n createFixture(shape, fixdef?) {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n const fixture = new Fixture(this, shape, fixdef);\n this._addFixture(fixture);\n return fixture;\n }\n\n /**\n * Destroy a fixture. This removes the fixture from the broad-phase and destroys\n * all contacts associated with this fixture. This will automatically adjust the\n * mass of the body if the body is dynamic and the fixture has positive density.\n * All fixtures attached to a body are implicitly destroyed when the body is\n * destroyed.\n *\n * Warning: This function is locked during callbacks.\n *\n * @param fixture The fixture to be removed.\n */\n destroyFixture(fixture: Fixture): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n _ASSERT && console.assert(fixture.m_body == this);\n\n // Remove the fixture from this body's singly linked list.\n let found = false;\n if (this.m_fixtureList === fixture) {\n this.m_fixtureList = fixture.m_next;\n found = true;\n\n } else {\n let node = this.m_fixtureList;\n while (node != null) {\n if (node.m_next === fixture) {\n node.m_next = fixture.m_next;\n found = true;\n break;\n }\n node = node.m_next;\n }\n }\n\n // You tried to remove a shape that is not attached to this body.\n _ASSERT && console.assert(found);\n\n // Destroy any contacts associated with the fixture.\n let edge = this.m_contactList;\n while (edge) {\n const c = edge.contact;\n edge = edge.next;\n\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n\n if (fixture == fixtureA || fixture == fixtureB) {\n // This destroys the contact and removes it from\n // this body's contact list.\n this.m_world.destroyContact(c);\n }\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.destroyProxies(broadPhase);\n }\n\n fixture.m_body = null;\n fixture.m_next = null;\n\n this.m_world.publish('remove-fixture', fixture);\n\n // Reset the mass data.\n this.resetMassData();\n }\n\n /**\n * Get the corresponding world point of a local point.\n */\n getWorldPoint(localPoint: Vec2): Vec2 {\n return Transform.mulVec2(this.m_xf, localPoint);\n }\n\n /**\n * Get the corresponding world vector of a local vector.\n */\n getWorldVector(localVector: Vec2): Vec2 {\n return Rot.mulVec2(this.m_xf.q, localVector);\n }\n\n /**\n * Gets the corresponding local point of a world point.\n */\n getLocalPoint(worldPoint: Vec2Value): Vec2 {\n return Transform.mulTVec2(this.m_xf, worldPoint);\n }\n\n /**\n * Gets the corresponding local vector of a world vector.\n */\n getLocalVector(worldVector: Vec2Value): Vec2 {\n return Rot.mulTVec2(this.m_xf.q, worldVector);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { Vec2 } from '../common/Vec2';\nimport type { Body } from './Body';\nimport { TimeStep } from \"./Solver\";\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n/**\n * A joint edge is used to connect bodies and joints together in a joint graph\n * where each body is a node and each joint is an edge. A joint edge belongs to\n * a doubly linked list maintained in each attached body. Each joint has two\n * joint nodes, one for each attached body.\n */\nexport class JointEdge {\n /**\n * provides quick access to the other body attached.\n */\n other: Body | null = null;\n /**\n * the joint\n */\n joint: Joint | null = null;\n /**\n * prev the previous joint edge in the body's joint list\n */\n prev: JointEdge | null = null;\n /**\n * the next joint edge in the body's joint list\n */\n next: JointEdge | null = null;\n}\n\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointOpt {\n /**\n * Use this to attach application specific data to your joints.\n */\n userData?: any;\n /**\n * Set this flag to true if the attached bodies\n * should collide.\n */\n collideConnected?: boolean;\n}\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointDef extends JointOpt {\n /**\n * The first attached body.\n */\n bodyA: Body;\n /**\n * The second attached body.\n */\n bodyB: Body;\n}\n\nconst DEFAULTS = {\n userData : null,\n collideConnected : false\n};\n\n/**\n * The base joint class. Joints are used to constraint two bodies together in\n * various fashions. Some joints also feature limits and motors.\n */\nexport abstract class Joint {\n\n /** @internal */ m_type: string = 'unknown-joint';\n\n /** @internal */ m_bodyA: Body;\n /** @internal */ m_bodyB: Body;\n\n /** @internal */ m_collideConnected: boolean;\n\n /** @internal */ m_prev: Joint | null = null;\n /** @internal */ m_next: Joint | null = null;\n\n /** @internal */ m_edgeA: JointEdge = new JointEdge();\n /** @internal */ m_edgeB: JointEdge = new JointEdge();\n\n /** @internal */ m_islandFlag: boolean = false;\n /** @internal */ m_userData: unknown;\n\n constructor(def: JointDef);\n constructor(def: JointOpt, bodyA: Body, bodyB: Body);\n constructor(def: JointDef | JointOpt, bodyA?: Body, bodyB?: Body) {\n bodyA = 'bodyA' in def ? def.bodyA : bodyA;\n bodyB = 'bodyB' in def ? def.bodyB : bodyB;\n\n _ASSERT && console.assert(!!bodyA);\n _ASSERT && console.assert(!!bodyB);\n _ASSERT && console.assert(bodyA != bodyB);\n\n this.m_bodyA = bodyA!;\n this.m_bodyB = bodyB!;\n\n this.m_collideConnected = !!def.collideConnected;\n this.m_userData = def.userData;\n }\n\n /**\n * Short-cut function to determine if either body is inactive.\n */\n isActive(): boolean {\n return this.m_bodyA.isActive() && this.m_bodyB.isActive();\n }\n\n /**\n * Get the type of the concrete joint.\n */\n getType(): string {\n return this.m_type;\n }\n\n /**\n * Get the first body attached to this joint.\n */\n getBodyA(): Body {\n return this.m_bodyA;\n }\n\n /**\n * Get the second body attached to this joint.\n */\n getBodyB(): Body {\n return this.m_bodyB;\n }\n\n /**\n * Get the next joint the world joint list.\n */\n getNext(): Joint {\n return this.m_next;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get collide connected. Note: modifying the collide connect flag won't work\n * correctly because the flag is only checked when fixture AABBs begin to\n * overlap.\n */\n getCollideConnected(): boolean {\n return this.m_collideConnected;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n abstract getAnchorA(): Vec2;\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n abstract getAnchorB(): Vec2;\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n abstract getReactionForce(inv_dt: number): Vec2;\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n abstract getReactionTorque(inv_dt: number): number;\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2): void {}\n\n abstract initVelocityConstraints(step: TimeStep): void;\n\n abstract solveVelocityConstraints(step: TimeStep): void;\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n abstract solvePositionConstraints(step: TimeStep): boolean;\n\n}\n","export const stats = {\n gjkCalls: 0,\n gjkIters: 0,\n gjkMaxIters: 0,\n\n toiTime: 0,\n toiMaxTime: 0,\n toiCalls: 0,\n toiIters: 0,\n toiMaxIters: 0,\n toiRootIters: 0,\n toiMaxRootIters: 0,\n\n toString(newline?: string): string {\n newline = typeof newline === 'string' ? newline : '\\n';\n let string = \"\";\n // tslint:disable-next-line:no-for-in\n for (const name in this) {\n if (typeof this[name] !== 'function' && typeof this[name] !== 'object') {\n string += name + ': ' + this[name] + newline;\n }\n }\n return string;\n }\n};\n","export const now = function(): number {\n return Date.now();\n};\n\nexport const diff = function(time: number): number {\n return Date.now() - time;\n};\n\nexport default {\n now,\n diff,\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { stats } from '../util/stats';\nimport { Shape } from './Shape';\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Transform } from '../common/Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates.\n */\n\nstats.gjkCalls = 0;\nstats.gjkIters = 0;\nstats.gjkMaxIters = 0;\n\n/**\n * Input for Distance. You have to option to use the shape radii in the\n * computation. Even\n */\nexport class DistanceInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n transformA: Transform | null = null;\n transformB: Transform | null = null;\n useRadii: boolean = false;\n}\n\n/**\n * Output for Distance.\n *\n * @prop {Vec2} pointA closest point on shapeA\n * @prop {Vec2} pointB closest point on shapeB\n * @prop distance\n * @prop iterations number of GJK iterations used\n */\nexport class DistanceOutput {\n pointA: Vec2 = Vec2.zero();\n pointB: Vec2 = Vec2.zero();\n distance: number;\n iterations: number;\n}\n\n/**\n * Used to warm start Distance. Set count to zero on first call.\n *\n * @prop {number} metric length or area\n * @prop {array} indexA vertices on shape A\n * @prop {array} indexB vertices on shape B\n * @prop {number} count\n */\nexport class SimplexCache {\n metric: number = 0;\n indexA: number[] = [];\n indexB: number[] = [];\n count: number = 0;\n}\n\n/**\n * Compute the closest points between two shapes. Supports any combination of:\n * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On\n * the first call set SimplexCache.count to zero.\n */\nexport const Distance = function (output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void {\n ++stats.gjkCalls;\n\n const proxyA = input.proxyA;\n const proxyB = input.proxyB;\n const xfA = input.transformA;\n const xfB = input.transformB;\n\n // Initialize the simplex.\n const simplex = new Simplex();\n simplex.readCache(cache, proxyA, xfA, proxyB, xfB);\n\n // Get simplex vertices as an array.\n const vertices = simplex.m_v;\n const k_maxIters = Settings.maxDistnceIterations;\n\n // These store the vertices of the last simplex so that we\n // can check for duplicates and prevent cycling.\n const saveA = [];\n const saveB = []; // int[3]\n let saveCount = 0;\n\n let distanceSqr1 = Infinity;\n let distanceSqr2 = Infinity;\n\n // Main iteration loop.\n let iter = 0;\n while (iter < k_maxIters) {\n // Copy simplex so we can identify duplicates.\n saveCount = simplex.m_count;\n for (let i = 0; i < saveCount; ++i) {\n saveA[i] = vertices[i].indexA;\n saveB[i] = vertices[i].indexB;\n }\n\n simplex.solve();\n\n // If we have 3 points, then the origin is in the corresponding triangle.\n if (simplex.m_count === 3) {\n break;\n }\n\n // Compute closest point.\n const p = simplex.getClosestPoint();\n distanceSqr2 = p.lengthSquared();\n\n // Ensure progress\n if (distanceSqr2 >= distanceSqr1) {\n // break;\n }\n distanceSqr1 = distanceSqr2;\n\n // Get search direction.\n const d = simplex.getSearchDirection();\n\n // Ensure the search direction is numerically fit.\n if (d.lengthSquared() < Math.EPSILON * Math.EPSILON) {\n // The origin is probably contained by a line segment\n // or triangle. Thus the shapes are overlapped.\n\n // We can't return zero here even though there may be overlap.\n // In case the simplex is a point, segment, or triangle it is difficult\n // to determine if the origin is contained in the CSO or very close to it.\n break;\n }\n\n // Compute a tentative new simplex vertex using support points.\n const vertex = vertices[simplex.m_count]; // SimplexVertex\n\n vertex.indexA = proxyA.getSupport(Rot.mulTVec2(xfA.q, Vec2.neg(d)));\n vertex.wA = Transform.mulVec2(xfA, proxyA.getVertex(vertex.indexA));\n\n vertex.indexB = proxyB.getSupport(Rot.mulTVec2(xfB.q, d));\n vertex.wB = Transform.mulVec2(xfB, proxyB.getVertex(vertex.indexB));\n\n vertex.w = Vec2.sub(vertex.wB, vertex.wA);\n\n // Iteration count is equated to the number of support point calls.\n ++iter;\n ++stats.gjkIters;\n\n // Check for duplicate support points. This is the main termination\n // criteria.\n let duplicate = false;\n for (let i = 0; i < saveCount; ++i) {\n if (vertex.indexA === saveA[i] && vertex.indexB === saveB[i]) {\n duplicate = true;\n break;\n }\n }\n\n // If we found a duplicate support point we must exit to avoid cycling.\n if (duplicate) {\n break;\n }\n\n // New vertex is ok and needed.\n ++simplex.m_count;\n }\n\n stats.gjkMaxIters = Math.max(stats.gjkMaxIters, iter);\n\n // Prepare output.\n simplex.getWitnessPoints(output.pointA, output.pointB);\n output.distance = Vec2.distance(output.pointA, output.pointB);\n output.iterations = iter;\n\n // Cache the simplex.\n simplex.writeCache(cache);\n\n // Apply radii if requested.\n if (input.useRadii) {\n const rA = proxyA.m_radius;\n const rB = proxyB.m_radius;\n\n if (output.distance > rA + rB && output.distance > Math.EPSILON) {\n // Shapes are still no overlapped.\n // Move the witness points to the outer surface.\n output.distance -= rA + rB;\n const normal = Vec2.sub(output.pointB, output.pointA);\n normal.normalize();\n output.pointA.addMul(rA, normal);\n output.pointB.subMul(rB, normal);\n } else {\n // Shapes are overlapped when radii are considered.\n // Move the witness points to the middle.\n const p = Vec2.mid(output.pointA, output.pointB);\n output.pointA.setVec2(p);\n output.pointB.setVec2(p);\n output.distance = 0.0;\n }\n }\n}\n\n/**\n * A distance proxy is used by the GJK algorithm. It encapsulates any shape.\n */\nexport class DistanceProxy {\n /** internal */ m_buffer: Vec2[];\n /** internal */ m_vertices: Vec2[];\n /** internal */ m_count: number;\n /** internal */ m_radius: number;\n\n\n constructor() {\n this.m_buffer = []; // Vec2[2]\n this.m_vertices = []; // Vec2[]\n this.m_count = 0;\n this.m_radius = 0;\n }\n\n /**\n * Get the vertex count.\n */\n getVertexCount(): number {\n return this.m_count;\n }\n\n /**\n * Get a vertex by index. Used by Distance.\n */\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * Get the supporting vertex index in the given direction.\n */\n getSupport(d: Vec2): number {\n let bestIndex = 0;\n let bestValue = Vec2.dot(this.m_vertices[0], d);\n for (let i = 0; i < this.m_count; ++i) {\n const value = Vec2.dot(this.m_vertices[i], d);\n if (value > bestValue) {\n bestIndex = i;\n bestValue = value;\n }\n }\n return bestIndex;\n }\n\n /**\n * Get the supporting vertex in the given direction.\n */\n getSupportVertex(d: Vec2): Vec2 {\n return this.m_vertices[this.getSupport(d)];\n }\n\n /**\n * Initialize the proxy using the given shape. The shape must remain in scope\n * while the proxy is in use.\n */\n set(shape: Shape, index: number): void {\n // TODO remove, use shape instead\n _ASSERT && console.assert(typeof shape.computeDistanceProxy === 'function');\n shape.computeDistanceProxy(this, index);\n }\n}\n\nclass SimplexVertex {\n /** support point in proxyA */\n wA: Vec2 = Vec2.zero();\n /** wA index */\n indexA: number;\n\n /** support point in proxyB */\n wB: Vec2 = Vec2.zero();\n /** wB index */\n indexB: number;\n\n /** wB - wA; */\n w: Vec2 = Vec2.zero();\n /** barycentric coordinate for closest point */\n a: number;\n\n set(v: SimplexVertex): void {\n this.indexA = v.indexA;\n this.indexB = v.indexB;\n this.wA = Vec2.clone(v.wA);\n this.wB = Vec2.clone(v.wB);\n this.w = Vec2.clone(v.w);\n this.a = v.a;\n }\n}\n\nclass Simplex {\n m_v1: SimplexVertex;\n m_v2: SimplexVertex;\n m_v3: SimplexVertex;\n m_v: SimplexVertex[];\n m_count: number;\n\n constructor() {\n this.m_v1 = new SimplexVertex();\n this.m_v2 = new SimplexVertex();\n this.m_v3 = new SimplexVertex();\n this.m_v = [ this.m_v1, this.m_v2, this.m_v3 ];\n this.m_count;\n }\n\n /** @internal */\n toString(): string {\n if (this.m_count === 3) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y,\n this.m_v3.a, this.m_v3.wA.x, this.m_v3.wA.y, this.m_v3.wB.x, this.m_v3.wB.y\n ].toString();\n\n } else if (this.m_count === 2) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y\n ].toString();\n\n } else if (this.m_count === 1) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y\n ].toString();\n\n } else {\n return \"+\" + this.m_count;\n }\n }\n\n readCache(cache: SimplexCache, proxyA: DistanceProxy, transformA: Transform, proxyB: DistanceProxy, transformB: Transform): void {\n _ASSERT && console.assert(cache.count <= 3);\n\n // Copy data from cache.\n this.m_count = cache.count;\n for (let i = 0; i < this.m_count; ++i) {\n const v = this.m_v[i];\n v.indexA = cache.indexA[i];\n v.indexB = cache.indexB[i];\n const wALocal = proxyA.getVertex(v.indexA);\n const wBLocal = proxyB.getVertex(v.indexB);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 0.0;\n }\n\n // Compute the new simplex metric, if it is substantially different than\n // old metric then flush the simplex.\n if (this.m_count > 1) {\n const metric1 = cache.metric;\n const metric2 = this.getMetric();\n if (metric2 < 0.5 * metric1 || 2.0 * metric1 < metric2\n || metric2 < Math.EPSILON) {\n // Reset the simplex.\n this.m_count = 0;\n }\n }\n\n // If the cache is empty or invalid...\n if (this.m_count === 0) {\n const v = this.m_v[0];\n v.indexA = 0;\n v.indexB = 0;\n const wALocal = proxyA.getVertex(0);\n const wBLocal = proxyB.getVertex(0);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 1.0;\n this.m_count = 1;\n }\n }\n\n writeCache(cache: SimplexCache): void {\n cache.metric = this.getMetric();\n cache.count = this.m_count;\n for (let i = 0; i < this.m_count; ++i) {\n cache.indexA[i] = this.m_v[i].indexA;\n cache.indexB[i] = this.m_v[i].indexB;\n }\n }\n\n getSearchDirection(): Vec2 {\n switch (this.m_count) {\n case 1:\n return Vec2.neg(this.m_v1.w);\n\n case 2: {\n const e12 = Vec2.sub(this.m_v2.w, this.m_v1.w);\n const sgn = Vec2.crossVec2Vec2(e12, Vec2.neg(this.m_v1.w));\n if (sgn > 0.0) {\n // Origin is left of e12.\n return Vec2.crossNumVec2(1.0, e12);\n } else {\n // Origin is right of e12.\n return Vec2.crossVec2Num(e12, 1.0);\n }\n }\n\n default:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n }\n }\n\n getClosestPoint(): Vec2 {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n\n case 1:\n return Vec2.clone(this.m_v1.w);\n\n case 2:\n return Vec2.combine(this.m_v1.a, this.m_v1.w, this.m_v2.a, this.m_v2.w);\n\n case 3:\n return Vec2.zero();\n\n default:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n }\n }\n\n getWitnessPoints(pA: Vec2, pB: Vec2): void {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n break;\n\n case 1:\n pA.setVec2(this.m_v1.wA);\n pB.setVec2(this.m_v1.wB);\n break;\n\n case 2:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pB.setCombine(this.m_v1.a, this.m_v1.wB, this.m_v2.a, this.m_v2.wB);\n break;\n\n case 3:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pA.addMul(this.m_v3.a, this.m_v3.wA);\n pB.setVec2(pA);\n break;\n\n default:\n _ASSERT && console.assert(false);\n break;\n }\n }\n\n getMetric(): number {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n return 0.0;\n\n case 1:\n return 0.0;\n\n case 2:\n return Vec2.distance(this.m_v1.w, this.m_v2.w);\n\n case 3:\n return Vec2.crossVec2Vec2(Vec2.sub(this.m_v2.w, this.m_v1.w), Vec2.sub(this.m_v3.w,\n this.m_v1.w));\n\n default:\n _ASSERT && console.assert(false);\n return 0.0;\n }\n }\n\n solve(): void {\n switch (this.m_count) {\n case 1:\n break;\n\n case 2:\n this.solve2();\n break;\n\n case 3:\n this.solve3();\n break;\n\n default:\n _ASSERT && console.assert(false);\n }\n }\n\n// Solve a line segment using barycentric coordinates.\n//\n// p = a1 * w1 + a2 * w2\n// a1 + a2 = 1\n//\n// The vector from the origin to the closest point on the line is\n// perpendicular to the line.\n// e12 = w2 - w1\n// dot(p, e) = 0\n// a1 * dot(w1, e) + a2 * dot(w2, e) = 0\n//\n// 2-by-2 linear system\n// [1 1 ][a1] = [1]\n// [w1.e12 w2.e12][a2] = [0]\n//\n// Define\n// d12_1 = dot(w2, e12)\n// d12_2 = -dot(w1, e12)\n// d12 = d12_1 + d12_2\n//\n// Solution\n// a1 = d12_1 / d12\n// a2 = d12_2 / d12\n solve2(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const e12 = Vec2.sub(w2, w1);\n\n // w1 region\n const d12_2 = -Vec2.dot(w1, e12);\n if (d12_2 <= 0.0) {\n // a2 <= 0, so we clamp it to 0\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // w2 region\n const d12_1 = Vec2.dot(w2, e12);\n if (d12_1 <= 0.0) {\n // a1 <= 0, so we clamp it to 0\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // Must be in e12 region.\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n }\n\n// Possible regions:\n// - points[2]\n// - edge points[0]-points[2]\n// - edge points[1]-points[2]\n// - inside the triangle\n solve3(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const w3 = this.m_v3.w;\n\n // Edge12\n // [1 1 ][a1] = [1]\n // [w1.e12 w2.e12][a2] = [0]\n // a3 = 0\n const e12 = Vec2.sub(w2, w1);\n const w1e12 = Vec2.dot(w1, e12);\n const w2e12 = Vec2.dot(w2, e12);\n const d12_1 = w2e12;\n const d12_2 = -w1e12;\n\n // Edge13\n // [1 1 ][a1] = [1]\n // [w1.e13 w3.e13][a3] = [0]\n // a2 = 0\n const e13 = Vec2.sub(w3, w1);\n const w1e13 = Vec2.dot(w1, e13);\n const w3e13 = Vec2.dot(w3, e13);\n const d13_1 = w3e13;\n const d13_2 = -w1e13;\n\n // Edge23\n // [1 1 ][a2] = [1]\n // [w2.e23 w3.e23][a3] = [0]\n // a1 = 0\n const e23 = Vec2.sub(w3, w2);\n const w2e23 = Vec2.dot(w2, e23);\n const w3e23 = Vec2.dot(w3, e23);\n const d23_1 = w3e23;\n const d23_2 = -w2e23;\n\n // Triangle123\n const n123 = Vec2.crossVec2Vec2(e12, e13);\n\n const d123_1 = n123 * Vec2.crossVec2Vec2(w2, w3);\n const d123_2 = n123 * Vec2.crossVec2Vec2(w3, w1);\n const d123_3 = n123 * Vec2.crossVec2Vec2(w1, w2);\n\n // w1 region\n if (d12_2 <= 0.0 && d13_2 <= 0.0) {\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // e12\n if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) {\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n return;\n }\n\n // e13\n if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) {\n const inv_d13 = 1.0 / (d13_1 + d13_2);\n this.m_v1.a = d13_1 * inv_d13;\n this.m_v3.a = d13_2 * inv_d13;\n this.m_count = 2;\n this.m_v2.set(this.m_v3);\n return;\n }\n\n // w2 region\n if (d12_1 <= 0.0 && d23_2 <= 0.0) {\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // w3 region\n if (d13_1 <= 0.0 && d23_1 <= 0.0) {\n this.m_v3.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // e23\n if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) {\n const inv_d23 = 1.0 / (d23_1 + d23_2);\n this.m_v2.a = d23_1 * inv_d23;\n this.m_v3.a = d23_2 * inv_d23;\n this.m_count = 2;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // Must be in triangle123\n const inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3);\n this.m_v1.a = d123_1 * inv_d123;\n this.m_v2.a = d123_2 * inv_d123;\n this.m_v3.a = d123_3 * inv_d123;\n this.m_count = 3;\n }\n}\n\n/**\n * Determine if two generic shapes overlap.\n */\nexport const testOverlap = function (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform): boolean {\n const input = new DistanceInput();\n input.proxyA.set(shapeA, indexA);\n input.proxyB.set(shapeB, indexB);\n input.transformA = xfA;\n input.transformB = xfB;\n input.useRadii = true;\n\n const cache = new SimplexCache();\n const output = new DistanceOutput();\n\n Distance(output, cache, input);\n\n return output.distance < 10.0 * Math.EPSILON;\n}\n\n// legacy exports\nDistance.testOverlap = testOverlap;\nDistance.Input = DistanceInput;\nDistance.Output = DistanceOutput;\nDistance.Proxy = DistanceProxy;\nDistance.Cache = SimplexCache;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { stats } from '../util/stats';\nimport Timer from '../util/Timer';\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Sweep } from '../common/Sweep';\nimport { Transform } from '../common/Transform';\n\nimport { Distance, DistanceInput, DistanceOutput, DistanceProxy, SimplexCache } from './Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n/**\n * Input parameters for TimeOfImpact.\n */\nexport class TOIInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n sweepA: Sweep = new Sweep();\n sweepB: Sweep = new Sweep();\n /** defines sweep interval [0, tMax] */\n tMax: number | undefined;\n}\n\nexport enum TOIOutputState {\n e_unknown = 0,\n e_failed = 1,\n e_overlapped = 2,\n e_touching = 3,\n e_separated = 4,\n}\n\n/**\n * Output parameters for TimeOfImpact.\n */\nexport class TOIOutput {\n state: TOIOutputState | undefined;\n t: number | undefined;\n}\n\nstats.toiTime = 0;\nstats.toiMaxTime = 0;\nstats.toiCalls = 0;\nstats.toiIters = 0;\nstats.toiMaxIters = 0;\nstats.toiRootIters = 0;\nstats.toiMaxRootIters = 0;\n\n/**\n * Compute the upper bound on time before two shapes penetrate. Time is\n * represented as a fraction between [0,tMax]. This uses a swept separating axis\n * and may miss some intermediate, non-tunneling collision. If you change the\n * time interval, you should call this function again.\n *\n * Note: use Distance to compute the contact point and normal at the time of\n * impact.\n *\n * CCD via the local separating axis method. This seeks progression by computing\n * the largest time at which separation is maintained.\n */\nexport const TimeOfImpact = function (output: TOIOutput, input: TOIInput): void {\n const timer = Timer.now();\n\n ++stats.toiCalls;\n\n output.state = TOIOutputState.e_unknown;\n output.t = input.tMax;\n\n const proxyA = input.proxyA; // DistanceProxy\n const proxyB = input.proxyB; // DistanceProxy\n\n const sweepA = input.sweepA; // Sweep\n const sweepB = input.sweepB; // Sweep\n\n // Large rotations can make the root finder fail, so we normalize the\n // sweep angles.\n sweepA.normalize();\n sweepB.normalize();\n\n const tMax = input.tMax;\n\n const totalRadius = proxyA.m_radius + proxyB.m_radius;\n const target = Math.max(Settings.linearSlop, totalRadius - 3.0 * Settings.linearSlop);\n const tolerance = 0.25 * Settings.linearSlop;\n _ASSERT && console.assert(target > tolerance);\n\n let t1 = 0.0;\n const k_maxIterations = Settings.maxTOIIterations;\n let iter = 0;\n\n // Prepare input for distance query.\n const cache = new SimplexCache();\n\n const distanceInput = new DistanceInput();\n distanceInput.proxyA = input.proxyA;\n distanceInput.proxyB = input.proxyB;\n distanceInput.useRadii = false;\n\n // The outer loop progressively attempts to compute new separating axes.\n // This loop terminates when an axis is repeated (no progress is made).\n while (true) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n sweepA.getTransform(xfA, t1);\n sweepB.getTransform(xfB, t1);\n\n // Get the distance between shapes. We can also use the results\n // to get a separating axis.\n distanceInput.transformA = xfA;\n distanceInput.transformB = xfB;\n const distanceOutput = new DistanceOutput();\n Distance(distanceOutput, cache, distanceInput);\n\n // If the shapes are overlapped, we give up on continuous collision.\n if (distanceOutput.distance <= 0.0) {\n // Failure!\n output.state = TOIOutputState.e_overlapped;\n output.t = 0.0;\n break;\n }\n\n if (distanceOutput.distance < target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n break;\n }\n\n // Initialize the separating axis.\n const fcn = new SeparationFunction();\n fcn.initialize(cache, proxyA, sweepA, proxyB, sweepB, t1);\n\n // if (false) {\n // // Dump the curve seen by the root finder\n // const N = 100;\n // const dx = 1.0 / N;\n // const xs = []; // [ N + 1 ];\n // const fs = []; // [ N + 1 ];\n // const x = 0.0;\n // for (const i = 0; i <= N; ++i) {\n // sweepA.getTransform(xfA, x);\n // sweepB.getTransform(xfB, x);\n // const f = fcn.evaluate(xfA, xfB) - target;\n // printf(\"%g %g\\n\", x, f);\n // xs[i] = x;\n // fs[i] = f;\n // x += dx;\n // }\n // }\n\n // Compute the TOI on the separating axis. We do this by successively\n // resolving the deepest point. This loop is bounded by the number of\n // vertices.\n let done = false;\n let t2 = tMax;\n let pushBackIter = 0;\n while (true) {\n // Find the deepest point at t2. Store the witness point indices.\n let s2 = fcn.findMinSeparation(t2);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Is the final configuration separated?\n if (s2 > target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_separated;\n output.t = tMax;\n done = true;\n break;\n }\n\n // Has the separation reached tolerance?\n if (s2 > target - tolerance) {\n // Advance the sweeps\n t1 = t2;\n break;\n }\n\n // Compute the initial separation of the witness points.\n let s1 = fcn.evaluate(t1);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Check for initial overlap. This might happen if the root finder\n // runs out of iterations.\n if (s1 < target - tolerance) {\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n done = true;\n break;\n }\n\n // Check for touching\n if (s1 <= target + tolerance) {\n // Victory! t1 should hold the TOI (could be 0.0).\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n done = true;\n break;\n }\n\n // Compute 1D root of: f(x) - target = 0\n let rootIterCount = 0;\n let a1 = t1;\n let a2 = t2;\n while (true) {\n // Use a mix of the secant rule and bisection.\n let t;\n if (rootIterCount & 1) {\n // Secant rule to improve convergence.\n t = a1 + (target - s1) * (a2 - a1) / (s2 - s1);\n } else {\n // Bisection to guarantee progress.\n t = 0.5 * (a1 + a2);\n }\n\n ++rootIterCount;\n ++stats.toiRootIters;\n\n const s = fcn.evaluate(t);\n const indexA = fcn.indexA;\n const indexB = fcn.indexB;\n\n if (Math.abs(s - target) < tolerance) {\n // t2 holds a tentative value for t1\n t2 = t;\n break;\n }\n\n // Ensure we continue to bracket the root.\n if (s > target) {\n a1 = t;\n s1 = s;\n } else {\n a2 = t;\n s2 = s;\n }\n\n if (rootIterCount === 50) {\n break;\n }\n }\n\n stats.toiMaxRootIters = Math.max(stats.toiMaxRootIters, rootIterCount);\n\n ++pushBackIter;\n\n if (pushBackIter === Settings.maxPolygonVertices) {\n break;\n }\n }\n\n ++iter;\n ++stats.toiIters;\n\n if (done) {\n break;\n }\n\n if (iter === k_maxIterations) {\n // Root finder got stuck. Semi-victory.\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n break;\n }\n }\n\n stats.toiMaxIters = Math.max(stats.toiMaxIters, iter);\n\n const time = Timer.diff(timer);\n stats.toiMaxTime = Math.max(stats.toiMaxTime, time);\n stats.toiTime += time;\n}\n\nenum SeparationFunctionType {\n e_points = 1,\n e_faceA = 2,\n e_faceB = 3,\n}\n\nclass SeparationFunction {\n m_proxyA: DistanceProxy = new DistanceProxy();\n m_proxyB: DistanceProxy = new DistanceProxy();\n m_sweepA: Sweep;\n m_sweepB: Sweep;\n indexA: number;\n indexB: number;\n m_type: SeparationFunctionType;\n m_localPoint: Vec2 = Vec2.zero();\n m_axis: Vec2 = Vec2.zero();\n\n // TODO_ERIN might not need to return the separation\n\n initialize(cache: SimplexCache, proxyA: DistanceProxy, sweepA: Sweep, proxyB: DistanceProxy, sweepB: Sweep, t1: number): number {\n this.m_proxyA = proxyA;\n this.m_proxyB = proxyB;\n const count = cache.count;\n _ASSERT && console.assert(0 < count && count < 3);\n\n this.m_sweepA = sweepA;\n this.m_sweepB = sweepB;\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t1);\n this.m_sweepB.getTransform(xfB, t1);\n\n if (count === 1) {\n this.m_type = SeparationFunctionType.e_points;\n const localPointA = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n this.m_axis.setCombine(1, pointB, -1, pointA);\n const s = this.m_axis.normalize();\n return s;\n\n } else if (cache.indexA[0] === cache.indexA[1]) {\n // Two points on B and one on A.\n this.m_type = SeparationFunctionType.e_faceB;\n const localPointB1 = proxyB.getVertex(cache.indexB[0]);\n const localPointB2 = proxyB.getVertex(cache.indexB[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointB2, localPointB1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointB1, localPointB2);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n const localPointA = proxyA.getVertex(cache.indexA[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n let s = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n\n } else {\n // Two points on A and one or two points on B.\n this.m_type = SeparationFunctionType.e_faceA;\n const localPointA1 = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointA2 = this.m_proxyA.getVertex(cache.indexA[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointA2, localPointA1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointA1, localPointA2);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n let s = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n }\n }\n\n compute(find: boolean, t: number): number {\n // It was findMinSeparation and evaluate\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t);\n this.m_sweepB.getTransform(xfB, t);\n\n switch (this.m_type) {\n case SeparationFunctionType.e_points: {\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, this.m_axis);\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(this.m_axis));\n\n this.indexA = this.m_proxyA.getSupport(axisA);\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, this.m_axis) - Vec2.dot(pointA, this.m_axis);\n return sep;\n }\n\n case SeparationFunctionType.e_faceA: {\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n if (find) {\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(normal));\n\n this.indexA = -1;\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n return sep;\n }\n\n case SeparationFunctionType.e_faceB: {\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, Vec2.neg(normal));\n\n this.indexB = -1;\n this.indexA = this.m_proxyA.getSupport(axisA);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n const sep = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n return sep;\n }\n\n default:\n _ASSERT && console.assert(false);\n if (find) {\n this.indexA = -1;\n this.indexB = -1;\n }\n return 0.0;\n }\n }\n\n findMinSeparation(t: number): number {\n return this.compute(true, t);\n }\n\n evaluate(t: number): number {\n return this.compute(false, t);\n }\n}\n\nconst separationFunction_reuse = new SeparationFunction();\n\n// legacy exports\nTimeOfImpact.Input = TOIInput;\nTimeOfImpact.Output = TOIOutput;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { Body } from './Body';\nimport type { Contact } from './Contact';\nimport { Joint } from './Joint';\nimport { TimeOfImpact, TOIInput, TOIOutput, TOIOutputState } from '../collision/TimeOfImpact';\nimport { Distance, DistanceInput, DistanceOutput, SimplexCache } from '../collision/Distance';\nimport { World } from \"./World\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport class TimeStep {\n /** time step */\n dt: number = 0;\n /** inverse time step (0 if dt == 0) */\n inv_dt: number = 0;\n velocityIterations: number = 0;\n positionIterations: number = 0;\n warmStarting: boolean = false;\n blockSolve: boolean = true;\n\n /** timestep ratio for variable timestep */\n inv_dt0: number = 0.0;\n /** dt * inv_dt0 */\n dtRatio: number = 1;\n\n reset(dt: number): void {\n if (this.dt > 0.0) {\n this.inv_dt0 = this.inv_dt;\n }\n this.dt = dt;\n this.inv_dt = dt == 0 ? 0 : 1 / dt;\n this.dtRatio = dt * this.inv_dt0;\n }\n}\n\n// reuse\nconst s_subStep = new TimeStep();\n\n/**\n * Contact impulses for reporting. Impulses are used instead of forces because\n * sub-step forces may approach infinity for rigid body collisions. These match\n * up one-to-one with the contact points in Manifold.\n */\nexport class ContactImpulse {\n // TODO: merge with Contact class?\n\n private readonly contact: Contact;\n private readonly normals: number[];\n private readonly tangents: number[];\n\n constructor(contact: Contact) {\n this.contact = contact;\n this.normals = [];\n this.tangents = [];\n }\n\n get normalImpulses(): number[] {\n const contact = this.contact;\n const normals = this.normals;\n normals.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n normals.push(contact.v_points[p].normalImpulse);\n }\n return normals;\n }\n\n get tangentImpulses(): number[] {\n const contact = this.contact;\n const tangents = this.tangents;\n tangents.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n tangents.push(contact.v_points[p].tangentImpulse);\n }\n return tangents;\n }\n}\n\n/**\n * Finds and solves islands. An island is a connected subset of the world.\n */\nexport class Solver {\n m_world: World;\n m_stack: Body[];\n m_bodies: Body[];\n m_contacts: Contact[];\n m_joints: Joint[];\n\n constructor(world: World) {\n this.m_world = world;\n this.m_stack = [];\n this.m_bodies = [];\n this.m_contacts = [];\n this.m_joints = [];\n }\n\n clear(): void {\n this.m_stack.length = 0;\n this.m_bodies.length = 0;\n this.m_contacts.length = 0;\n this.m_joints.length = 0;\n }\n\n addBody(body: Body): void {\n _ASSERT && console.assert(body instanceof Body, 'Not a Body!', body);\n this.m_bodies.push(body);\n // why?\n // body.c_position.c.setZero();\n // body.c_position.a = 0;\n // body.c_velocity.v.setZero();\n // body.c_velocity.w = 0;\n }\n\n addContact(contact: Contact): void {\n // _ASSERT && console.assert(contact instanceof Contact, 'Not a Contact!', contact);\n this.m_contacts.push(contact);\n }\n\n addJoint(joint: Joint): void {\n _ASSERT && console.assert(joint instanceof Joint, 'Not a Joint!', joint);\n this.m_joints.push(joint);\n }\n\n solveWorld(step: TimeStep): void {\n const world = this.m_world;\n\n // Clear all the island flags.\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n }\n for (let c = world.m_contactList; c; c = c.m_next) {\n c.m_islandFlag = false;\n }\n for (let j = world.m_jointList; j; j = j.m_next) {\n j.m_islandFlag = false;\n }\n\n // Build and simulate all awake islands.\n const stack = this.m_stack;\n let loop = -1;\n for (let seed = world.m_bodyList; seed; seed = seed.m_next) {\n loop++;\n if (seed.m_islandFlag) {\n continue;\n }\n\n if (seed.isAwake() == false || seed.isActive() == false) {\n continue;\n }\n\n // The seed can be dynamic or kinematic.\n if (seed.isStatic()) {\n continue;\n }\n\n // Reset island and stack.\n this.clear();\n\n stack.push(seed);\n\n seed.m_islandFlag = true;\n\n // Perform a depth first search (DFS) on the constraint graph.\n while (stack.length > 0) {\n // Grab the next body off the stack and add it to the island.\n const b = stack.pop();\n _ASSERT && console.assert(b.isActive() == true);\n this.addBody(b);\n\n // Make sure the body is awake.\n b.setAwake(true);\n\n // To keep islands as small as possible, we don't\n // propagate islands across static bodies.\n if (b.isStatic()) {\n continue;\n }\n\n // Search all contacts connected to this body.\n for (let ce = b.m_contactList; ce; ce = ce.next) {\n const contact = ce.contact;\n\n // Has this contact already been added to an island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Is this contact solid and touching?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n this.addContact(contact);\n contact.m_islandFlag = true;\n\n const other = ce.other;\n\n // Was the other body already added to this island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && console.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n\n // Search all joints connect to this body.\n for (let je = b.m_jointList; je; je = je.next) {\n if (je.joint.m_islandFlag == true) {\n continue;\n }\n\n const other = je.other;\n\n // Don't simulate joints connected to inactive bodies.\n if (other.isActive() == false) {\n continue;\n }\n\n this.addJoint(je.joint);\n je.joint.m_islandFlag = true;\n\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && console.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n }\n\n this.solveIsland(step);\n\n // Post solve cleanup.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n // Allow static bodies to participate in other islands.\n // TODO: are they added at all?\n const b = this.m_bodies[i];\n if (b.isStatic()) {\n b.m_islandFlag = false;\n }\n }\n }\n }\n\n solveIsland(step: TimeStep): void {\n // B2: Island Solve\n const world = this.m_world;\n const gravity = world.m_gravity;\n const allowSleep = world.m_allowSleep;\n\n const h = step.dt;\n\n // Integrate velocities and apply damping. Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.m_sweep.c);\n const a = body.m_sweep.a;\n const v = Vec2.clone(body.m_linearVelocity);\n let w = body.m_angularVelocity;\n\n // Store positions for continuous collision.\n body.m_sweep.c0.setVec2(body.m_sweep.c);\n body.m_sweep.a0 = body.m_sweep.a;\n\n if (body.isDynamic()) {\n // Integrate velocities.\n v.addMul(h * body.m_gravityScale, gravity);\n v.addMul(h * body.m_invMass, body.m_force);\n w += h * body.m_invI * body.m_torque;\n /**\n *
\n         * Apply damping.\n         * ODE: dv/dt + c * v = 0\n         * Solution: v(t) = v0 * exp(-c * t)\n         * Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)\n         * v2 = exp(-c * dt) * v1\n         * Pade approximation:\n         * v2 = v1 * 1 / (1 + c * dt)\n         * 
\n */\n v.mul(1.0 / (1.0 + h * body.m_linearDamping));\n w *= 1.0 / (1.0 + h * body.m_angularDamping);\n }\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(step);\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(step);\n }\n\n if (step.warmStarting) {\n // Warm start.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.warmStartConstraint(step);\n }\n }\n\n for (let i = 0; i < this.m_joints.length; ++i) {\n const joint = this.m_joints[i];\n joint.initVelocityConstraints(step);\n }\n\n // Solve velocity constraints\n for (let i = 0; i < step.velocityIterations; ++i) {\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n joint.solveVelocityConstraints(step);\n }\n\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(step);\n }\n }\n\n // Store impulses for warm starting\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.storeConstraintImpulses(step);\n }\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.lengthSquared(translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c.setVec2(c);\n body.c_position.a = a;\n body.c_velocity.v.setVec2(v);\n body.c_velocity.w = w;\n }\n\n // Solve position constraints\n let positionSolved = false;\n for (let i = 0; i < step.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraint(step);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -3.0 * Settings.linearSlop;\n\n let jointsOkay = true;\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n const jointOkay = joint.solvePositionConstraints(step);\n jointsOkay = jointsOkay && jointOkay;\n }\n\n if (contactsOkay && jointsOkay) {\n // Exit early if the position errors are small.\n positionSolved = true;\n break;\n }\n }\n\n // Copy state buffers back to the bodies\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n body.m_sweep.c.setVec2(body.c_position.c);\n body.m_sweep.a = body.c_position.a;\n body.m_linearVelocity.setVec2(body.c_velocity.v);\n body.m_angularVelocity = body.c_velocity.w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n\n if (allowSleep) {\n let minSleepTime = Infinity;\n\n const linTolSqr = Settings.linearSleepToleranceSqr;\n const angTolSqr = Settings.angularSleepToleranceSqr;\n\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n if (body.isStatic()) {\n continue;\n }\n\n if ((body.m_autoSleepFlag == false)\n || (body.m_angularVelocity * body.m_angularVelocity > angTolSqr)\n || (Vec2.lengthSquared(body.m_linearVelocity) > linTolSqr)) {\n body.m_sleepTime = 0.0;\n minSleepTime = 0.0;\n } else {\n body.m_sleepTime += h;\n minSleepTime = Math.min(minSleepTime, body.m_sleepTime);\n }\n }\n\n if (minSleepTime >= Settings.timeToSleep && positionSolved) {\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.setAwake(false);\n }\n }\n }\n }\n\n /**\n * Find TOI contacts and solve them.\n */\n solveWorldTOI(step: TimeStep): void {\n const world = this.m_world;\n\n if (world.m_stepComplete) {\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n b.m_sweep.alpha0 = 0.0;\n }\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Invalidate TOI\n c.m_toiFlag = false;\n c.m_islandFlag = false;\n c.m_toiCount = 0;\n c.m_toi = 1.0;\n }\n }\n\n // Find TOI events and solve them.\n while (true) {\n // Find the first TOI.\n let minContact = null; // Contact\n let minAlpha = 1.0;\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Is this contact disabled?\n if (c.isEnabled() == false) {\n continue;\n }\n\n // Prevent excessive sub-stepping.\n if (c.m_toiCount > Settings.maxSubSteps) {\n continue;\n }\n\n let alpha = 1.0;\n if (c.m_toiFlag) {\n // This contact has a valid cached TOI.\n alpha = c.m_toi;\n } else {\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n // Is there a sensor?\n if (fA.isSensor() || fB.isSensor()) {\n continue;\n }\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n _ASSERT && console.assert(bA.isDynamic() || bB.isDynamic());\n\n const activeA = bA.isAwake() && !bA.isStatic();\n const activeB = bB.isAwake() && !bB.isStatic();\n\n // Is at least one body active (awake and dynamic or kinematic)?\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const collideA = bA.isBullet() || !bA.isDynamic();\n const collideB = bB.isBullet() || !bB.isDynamic();\n\n // Are these two non-bullet dynamic bodies?\n if (collideA == false && collideB == false) {\n continue;\n }\n\n // Compute the TOI for this contact.\n // Put the sweeps onto the same time interval.\n let alpha0 = bA.m_sweep.alpha0;\n\n if (bA.m_sweep.alpha0 < bB.m_sweep.alpha0) {\n alpha0 = bB.m_sweep.alpha0;\n bA.m_sweep.advance(alpha0);\n } else if (bB.m_sweep.alpha0 < bA.m_sweep.alpha0) {\n alpha0 = bA.m_sweep.alpha0;\n bB.m_sweep.advance(alpha0);\n }\n\n _ASSERT && console.assert(alpha0 < 1.0);\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const sweepA = bA.m_sweep;\n const sweepB = bB.m_sweep;\n\n // Compute the time of impact in interval [0, minTOI]\n const input = new TOIInput(); // TODO: reuse\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.sweepA.set(bA.m_sweep);\n input.sweepB.set(bB.m_sweep);\n input.tMax = 1.0;\n\n const output = new TOIOutput(); // TODO: reuse\n TimeOfImpact(output, input);\n\n // Beta is the fraction of the remaining portion of the [time?].\n const beta = output.t;\n if (output.state == TOIOutputState.e_touching) {\n alpha = Math.min(alpha0 + (1.0 - alpha0) * beta, 1.0);\n } else {\n alpha = 1.0;\n }\n\n c.m_toi = alpha;\n c.m_toiFlag = true;\n }\n\n if (alpha < minAlpha) {\n // This is the minimum TOI found so far.\n minContact = c;\n minAlpha = alpha;\n }\n }\n\n if (minContact == null || 1.0 - 10.0 * Math.EPSILON < minAlpha) {\n // No more TOI events. Done!\n world.m_stepComplete = true;\n break;\n }\n\n // Advance the bodies to the TOI.\n const fA = minContact.getFixtureA();\n const fB = minContact.getFixtureB();\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const backup1 = bA.m_sweep.clone();\n const backup2 = bB.m_sweep.clone();\n\n bA.advance(minAlpha);\n bB.advance(minAlpha);\n\n // The TOI contact likely has some new contact points.\n minContact.update(world);\n minContact.m_toiFlag = false;\n ++minContact.m_toiCount;\n\n // Is the contact solid?\n if (minContact.isEnabled() == false || minContact.isTouching() == false) {\n // Restore the sweeps.\n minContact.setEnabled(false);\n bA.m_sweep.set(backup1);\n bB.m_sweep.set(backup2);\n bA.synchronizeTransform();\n bB.synchronizeTransform();\n continue;\n }\n\n bA.setAwake(true);\n bB.setAwake(true);\n\n // Build the island\n this.clear();\n this.addBody(bA);\n this.addBody(bB);\n this.addContact(minContact);\n\n bA.m_islandFlag = true;\n bB.m_islandFlag = true;\n minContact.m_islandFlag = true;\n\n // Get contacts on bodyA and bodyB.\n const bodies = [ bA, bB ];\n for (let i = 0; i < bodies.length; ++i) {\n const body = bodies[i];\n if (body.isDynamic()) {\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n // if (this.m_bodyCount == this.m_bodyCapacity) { break; }\n // if (this.m_contactCount == this.m_contactCapacity) { break; }\n\n const contact = ce.contact;\n\n // Has this contact already been added to the island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Only add if either is static, kinematic or bullet.\n const other = ce.other;\n if (other.isDynamic() && !body.isBullet() && !other.isBullet()) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n // Tentatively advance the body to the TOI.\n const backup = other.m_sweep.clone();\n if (other.m_islandFlag == false) {\n other.advance(minAlpha);\n }\n\n // Update the contact points\n contact.update(world);\n\n // Was the contact disabled by the user?\n // Are there contact points?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n other.m_sweep.set(backup);\n other.synchronizeTransform();\n continue;\n }\n\n // Add the contact to the island\n contact.m_islandFlag = true;\n this.addContact(contact);\n\n // Has the other body already been added to the island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // Add the other body to the island.\n other.m_islandFlag = true;\n\n if (!other.isStatic()) {\n other.setAwake(true);\n }\n\n this.addBody(other);\n }\n }\n }\n\n s_subStep.reset((1.0 - minAlpha) * step.dt);\n s_subStep.dtRatio = 1.0;\n s_subStep.positionIterations = 20;\n s_subStep.velocityIterations = step.velocityIterations;\n s_subStep.warmStarting = false;\n\n this.solveIslandTOI(s_subStep, bA, bB);\n\n // Reset island flags and synchronize broad-phase proxies.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.m_islandFlag = false;\n\n if (!body.isDynamic()) {\n continue;\n }\n\n body.synchronizeFixtures();\n\n // Invalidate all contact TOIs on this displaced body.\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n ce.contact.m_toiFlag = false;\n ce.contact.m_islandFlag = false;\n }\n }\n\n // Commit fixture proxy movements to the broad-phase so that new contacts\n // are created.\n // Also, some contacts can be destroyed.\n world.findNewContacts();\n\n if (world.m_subStepping) {\n world.m_stepComplete = false;\n break;\n }\n }\n }\n\n solveIslandTOI(subStep: TimeStep, toiA: Body, toiB: Body): void {\n const world = this.m_world;\n\n // Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.c_position.c.setVec2(body.m_sweep.c);\n body.c_position.a = body.m_sweep.a;\n body.c_velocity.v.setVec2(body.m_linearVelocity);\n body.c_velocity.w = body.m_angularVelocity;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(subStep);\n }\n\n // Solve position constraints.\n for (let i = 0; i < subStep.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraintTOI(subStep, toiA, toiB);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -1.5 * Settings.linearSlop;\n if (contactsOkay) {\n break;\n }\n }\n\n if (false) {\n // Is the new position really safe?\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const c = this.m_contacts[i];\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const input = new DistanceInput();\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.transformA = bA.getTransform();\n input.transformB = bB.getTransform();\n input.useRadii = false;\n\n const output = new DistanceOutput();\n const cache = new SimplexCache();\n Distance(output, cache, input);\n\n if (output.distance == 0 || cache.count == 3) {\n cache.count += 0;\n }\n }\n }\n\n // Leap of faith to new safe state.\n toiA.m_sweep.c0.setVec2(toiA.c_position.c);\n toiA.m_sweep.a0 = toiA.c_position.a;\n toiB.m_sweep.c0.setVec2(toiB.c_position.c);\n toiB.m_sweep.a0 = toiB.c_position.a;\n\n // No warm starting is needed for TOI events because warm\n // starting impulses were applied in the discrete solver.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(subStep);\n }\n\n // Solve velocity constraints.\n for (let i = 0; i < subStep.velocityIterations; ++i) {\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(subStep);\n }\n }\n\n // Don't store the TOI contact forces for warm starting\n // because they can be quite large.\n\n const h = subStep.dt;\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.dot(translation, translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n\n // Sync bodies\n body.m_sweep.c = c;\n body.m_sweep.a = a;\n body.m_linearVelocity = v;\n body.m_angularVelocity = w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n }\n\n /** @internal */\n postSolveIsland(): void {\n for (let c = 0; c < this.m_contacts.length; ++c) {\n const contact = this.m_contacts[c];\n this.m_world.postSolve(contact, contact.m_impulse);\n }\n }\n}\n\n// @ts-ignore\nSolver.TimeStep = TimeStep;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from './Vec2';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 2-by-2 matrix. Stored in column-major order.\n */\nexport class Mat22 {\n ex: Vec2;\n ey: Vec2;\n\n constructor(a: number, b: number, c: number, d: number);\n constructor(a: { x: number; y: number }, b: { x: number; y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(a?, b?, c?, d?) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec2.clone(a);\n this.ey = Vec2.clone(b);\n } else if (typeof a === 'number') {\n this.ex = Vec2.neo(a, c);\n this.ey = Vec2.neo(b, d);\n } else {\n this.ex = Vec2.zero();\n this.ey = Vec2.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.ex) && Vec2.isValid(obj.ey);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Mat22.isValid(o), 'Invalid Mat22!', o);\n }\n\n set(a: Mat22): void;\n set(a: Vec2, b: Vec2): void;\n set(a: number, b: number, c: number, d: number): void;\n // tslint:disable-next-line:typedef\n set(a, b?, c?, d?): void {\n if (typeof a === 'number' && typeof b === 'number' && typeof c === 'number'\n && typeof d === 'number') {\n this.ex.setNum(a, c);\n this.ey.setNum(b, d);\n\n } else if (typeof a === 'object' && typeof b === 'object') {\n this.ex.setVec2(a);\n this.ey.setVec2(b);\n\n } else if (typeof a === 'object') {\n _ASSERT && Mat22.assert(a);\n this.ex.setVec2(a.ex);\n this.ey.setVec2(a.ey);\n\n } else {\n _ASSERT && console.assert(false);\n }\n }\n\n setIdentity(): void {\n this.ex.x = 1.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 1.0;\n }\n\n setZero(): void {\n this.ex.x = 0.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 0.0;\n }\n\n getInverse(): Mat22 {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const imx = new Mat22();\n imx.ex.x = det * d;\n imx.ey.x = -det * b;\n imx.ex.y = -det * c;\n imx.ey.y = det * a;\n return imx;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const w = Vec2.zero();\n w.x = det * (d * v.x - b * v.y);\n w.y = det * (a * v.y - c * v.x);\n return w;\n }\n\n /**\n * Multiply a matrix times a vector. If a rotation matrix is provided, then this\n * transforms the vector from one frame to another.\n */\n static mul(mx: Mat22, my: Mat22): Mat22;\n static mul(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(mx, v) {\n if (v && 'x' in v && 'y' in v) {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n }\n\n static mulMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n /**\n * Multiply a matrix transpose times a vector. If a rotation matrix is provided,\n * then this transforms the vector from one frame to another (inverse\n * transform).\n */\n static mulT(mx: Mat22, my: Mat22): Mat22;\n static mulT(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(mx, v) {\n if (v && 'x' in v && 'y' in v) { // Vec2\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulTVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n }\n\n static mulTMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n static abs(mx: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n return new Mat22(Vec2.abs(mx.ex), Vec2.abs(mx.ey));\n }\n\n static add(mx1: Mat22, mx2: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx1);\n _ASSERT && Mat22.assert(mx2);\n return new Mat22(Vec2.add(mx1.ex, mx2.ex), Vec2.add(mx1.ey, mx2.ey));\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { Transform } from '../common/Transform';\nimport { math as Math } from '../common/Math';\nimport { Rot } from '../common/Rot';\n\nexport enum ManifoldType {\n e_circles = 0,\n e_faceA = 1,\n e_faceB = 2\n}\n\nexport enum ContactFeatureType {\n e_vertex = 0,\n e_face = 1\n}\n\n/**\n * This is used for determining the state of contact points.\n */\n export enum PointState {\n /** Point does not exist */\n nullState = 0,\n /** Point was added in the update */\n addState = 1,\n /** Point persisted across the update */\n persistState = 2,\n /** Point was removed in the update */\n removeState = 3\n}\n\n/**\n * Used for computing contact manifolds.\n */\n export class ClipVertex {\n v: Vec2 = Vec2.zero();\n id: ContactID = new ContactID();\n\n set(o: ClipVertex): void {\n this.v.setVec2(o.v);\n this.id.set(o.id);\n }\n}\n\n/**\n * A manifold for two touching convex shapes. Manifolds are created in `evaluate`\n * method of Contact subclasses.\n *\n * Supported manifold types are e_faceA or e_faceB for clip point versus plane\n * with radius and e_circles point versus point with radius.\n *\n * We store contacts in this way so that position correction can account for\n * movement, which is critical for continuous physics. All contact scenarios\n * must be expressed in one of these types. This structure is stored across time\n * steps, so we keep it small.\n *\n * @prop type e_circle, e_faceA, e_faceB\n * @prop localPoint Usage depends on manifold type:
\n * e_circles: the local center of circleA
\n * e_faceA: the center of faceA
\n * e_faceB: the center of faceB\n * @prop localNormal Usage depends on manifold type:
\n * e_circles: not used
\n * e_faceA: the normal on polygonA
\n * e_faceB: the normal on polygonB\n * @prop points The points of contact {ManifoldPoint[]}\n * @prop pointCount The number of manifold points\n */\nexport class Manifold {\n type: ManifoldType;\n localNormal: Vec2 = Vec2.zero();\n localPoint: Vec2 = Vec2.zero();\n points: ManifoldPoint[] = [ new ManifoldPoint(), new ManifoldPoint() ];\n pointCount: number = 0;\n\n /**\n * Evaluate the manifold with supplied transforms. This assumes modest motion\n * from the original state. This does not change the point count, impulses, etc.\n * The radii must come from the shapes that generated the manifold.\n */\n getWorldManifold(wm: WorldManifold | undefined, xfA: Transform, radiusA: number, xfB: Transform, radiusB: number): WorldManifold {\n if (this.pointCount == 0) {\n return;\n }\n\n wm = wm || new WorldManifold();\n\n let normal = wm.normal;\n const points = wm.points;\n const separations = wm.separations;\n\n // TODO: improve\n switch (this.type) {\n case ManifoldType.e_circles: {\n normal = Vec2.neo(1.0, 0.0);\n const pointA = Transform.mulVec2(xfA, this.localPoint);\n const pointB = Transform.mulVec2(xfB, this.points[0].localPoint);\n const dist = Vec2.sub(pointB, pointA);\n if (Vec2.lengthSquared(dist) > Math.EPSILON * Math.EPSILON) {\n normal.setVec2(dist);\n normal.normalize();\n }\n const cA = pointA.clone().addMul(radiusA, normal);\n const cB = pointB.clone().addMul(-radiusB, normal);\n points[0] = Vec2.mid(cA, cB);\n separations[0] = Vec2.dot(Vec2.sub(cB, cA), normal);\n points.length = 1;\n separations.length = 1;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfA, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfB, this.points[i].localPoint);\n const cA = Vec2.clone(clipPoint).addMul(radiusA - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cB = Vec2.clone(clipPoint).subMul(radiusB, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cB, cA), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfB, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfA, this.points[i].localPoint);\n const cB = Vec2.combine(1, clipPoint, radiusB - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cA = Vec2.combine(1, clipPoint, -radiusA, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cA, cB), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n // Ensure normal points from A to B.\n normal.mul(-1);\n break;\n }\n }\n\n wm.normal = normal;\n wm.points = points;\n wm.separations = separations;\n return wm;\n }\n\n static clipSegmentToLine = clipSegmentToLine;\n static ClipVertex = ClipVertex;\n static getPointStates = getPointStates;\n static PointState = PointState;\n}\n\n/**\n * A manifold point is a contact point belonging to a contact manifold. It holds\n * details related to the geometry and dynamics of the contact points.\n *\n * This structure is stored across time steps, so we keep it small.\n *\n * Note: impulses are used for internal caching and may not provide reliable\n * contact forces, especially for high speed collisions.\n */\nexport class ManifoldPoint {\n /**\n * Usage depends on manifold type.\n * e_circles: the local center of circleB,\n * e_faceA: the local center of cirlceB or the clip point of polygonB,\n * e_faceB: the clip point of polygonA.\n */\n localPoint: Vec2 = Vec2.zero();\n /**\n * The non-penetration impulse\n */\n normalImpulse: number = 0;\n /**\n * The friction impulse\n */\n tangentImpulse: number = 0;\n /**\n * Uniquely identifies a contact point between two shapes to facilatate warm starting\n */\n id: ContactID = new ContactID();\n}\n\n/**\n * Contact ids to facilitate warm starting.\n */\nexport class ContactID {\n cf: ContactFeature = new ContactFeature();\n\n /**\n * Used to quickly compare contact ids.\n */\n get key(): number {\n return this.cf.indexA + this.cf.indexB * 4 + this.cf.typeA * 16 + this.cf.typeB * 64;\n }\n\n set(o: ContactID): void {\n // this.key = o.key;\n this.cf.set(o.cf);\n }\n}\n\n/**\n * The features that intersect to form the contact point.\n */\nexport class ContactFeature {\n /**\n * Feature index on shapeA\n */\n indexA: number;\n /**\n * Feature index on shapeB\n */\n indexB: number;\n /**\n * The feature type on shapeA\n */\n typeA: ContactFeatureType;\n /**\n * The feature type on shapeB\n */\n typeB: ContactFeatureType;\n set(o: ContactFeature): void {\n this.indexA = o.indexA;\n this.indexB = o.indexB;\n this.typeA = o.typeA;\n this.typeB = o.typeB;\n }\n}\n\n/**\n * This is used to compute the current state of a contact manifold.\n */\nexport class WorldManifold {\n /**\n * World vector pointing from A to B\n */\n normal: Vec2;\n /**\n * World contact point (point of intersection)\n */\n points: Vec2[] = []; // [maxManifoldPoints]\n /**\n * A negative value indicates overlap, in meters\n */\n separations: number[] = []; // [maxManifoldPoints]\n}\n\n/**\n * Compute the point states given two manifolds. The states pertain to the\n * transition from manifold1 to manifold2. So state1 is either persist or remove\n * while state2 is either add or persist.\n */\nexport function getPointStates(\n state1: PointState[],\n state2: PointState[],\n manifold1: Manifold,\n manifold2: Manifold\n): void {\n // state1, state2: PointState[Settings.maxManifoldPoints]\n\n // for (var i = 0; i < Settings.maxManifoldPoints; ++i) {\n // state1[i] = PointState.nullState;\n // state2[i] = PointState.nullState;\n // }\n\n // Detect persists and removes.\n for (let i = 0; i < manifold1.pointCount; ++i) {\n const id = manifold1.points[i].id;\n\n state1[i] = PointState.removeState;\n\n for (let j = 0; j < manifold2.pointCount; ++j) {\n if (manifold2.points[j].id.key == id.key) {\n state1[i] = PointState.persistState;\n break;\n }\n }\n }\n\n // Detect persists and adds.\n for (let i = 0; i < manifold2.pointCount; ++i) {\n const id = manifold2.points[i].id;\n\n state2[i] = PointState.addState;\n\n for (let j = 0; j < manifold1.pointCount; ++j) {\n if (manifold1.points[j].id.key == id.key) {\n state2[i] = PointState.persistState;\n break;\n }\n }\n }\n}\n\n/**\n * Clipping for contact manifolds. Sutherland-Hodgman clipping.\n */\nexport function clipSegmentToLine(\n vOut: ClipVertex[],\n vIn: ClipVertex[],\n normal: Vec2,\n offset: number,\n vertexIndexA: number\n): number {\n // Start with no output points\n let numOut = 0;\n\n // Calculate the distance of end points to the line\n const distance0 = Vec2.dot(normal, vIn[0].v) - offset;\n const distance1 = Vec2.dot(normal, vIn[1].v) - offset;\n\n // If the points are behind the plane\n if (distance0 <= 0.0)\n vOut[numOut++].set(vIn[0]);\n if (distance1 <= 0.0)\n vOut[numOut++].set(vIn[1]);\n\n // If the points are on different sides of the plane\n if (distance0 * distance1 < 0.0) {\n // Find intersection point of edge and plane\n const interp = distance0 / (distance0 - distance1);\n vOut[numOut].v.setCombine(1 - interp, vIn[0].v, interp, vIn[1].v);\n\n // VertexA is hitting edgeB.\n vOut[numOut].id.cf.indexA = vertexIndexA;\n vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB;\n vOut[numOut].id.cf.typeA = ContactFeatureType.e_vertex;\n vOut[numOut].id.cf.typeB = ContactFeatureType.e_face;\n ++numOut;\n }\n\n return numOut;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { ShapeType } from \"../collision/Shape\";\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Transform } from '../common/Transform';\nimport { Mat22 } from '../common/Mat22';\nimport { Rot } from '../common/Rot';\nimport { Settings } from '../Settings';\nimport { Manifold, ManifoldType, WorldManifold } from '../collision/Manifold';\nimport { testOverlap } from '../collision/Distance';\nimport { Fixture } from \"./Fixture\";\nimport { Body } from \"./Body\";\nimport { ContactImpulse, TimeStep } from \"./Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst DEBUG_SOLVER = false;\n\n/**\n * A contact edge is used to connect bodies and contacts together in a contact\n * graph where each body is a node and each contact is an edge. A contact edge\n * belongs to a doubly linked list maintained in each attached body. Each\n * contact has two contact nodes, one for each attached body.\n *\n * @prop {Contact} contact The contact\n * @prop {ContactEdge} prev The previous contact edge in the body's contact list\n * @prop {ContactEdge} next The next contact edge in the body's contact list\n * @prop {Body} other Provides quick access to the other body attached.\n */\nexport class ContactEdge {\n contact: Contact;\n prev: ContactEdge | undefined;\n next: ContactEdge | undefined;\n other: Body | undefined;\n constructor(contact: Contact) {\n this.contact = contact;\n }\n}\n\nexport type EvaluateFunction = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void;\n\nexport type ContactCallback = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void /* & { destroyFcn?: (contact: Contact) => void }*/;\n\n\n/**\n * Friction mixing law. The idea is to allow either fixture to drive the\n * restitution to zero. For example, anything slides on ice.\n */\nexport function mixFriction(friction1: number, friction2: number): number {\n return Math.sqrt(friction1 * friction2);\n}\n\n/**\n * Restitution mixing law. The idea is allow for anything to bounce off an\n * inelastic surface. For example, a superball bounces on anything.\n */\nexport function mixRestitution(restitution1: number, restitution2: number): number {\n return restitution1 > restitution2 ? restitution1 : restitution2;\n}\n\n// TODO: move this to Settings?\nconst s_registers = [];\n\n// TODO: merge with ManifoldPoint?\nexport class VelocityConstraintPoint {\n rA: Vec2 = Vec2.zero();\n rB: Vec2 = Vec2.zero();\n normalImpulse: number = 0;\n tangentImpulse: number = 0;\n normalMass: number = 0;\n tangentMass: number = 0;\n velocityBias: number = 0;\n}\n\n/**\n * The class manages contact between two shapes. A contact exists for each\n * overlapping AABB in the broad-phase (except if filtered). Therefore a contact\n * object may exist that has no contact points.\n */\nexport class Contact {\n /** @internal */\n m_nodeA: ContactEdge;\n /** @internal */\n m_nodeB: ContactEdge;\n /** @internal */\n m_fixtureA: Fixture;\n /** @internal */\n m_fixtureB: Fixture;\n /** @internal */\n m_indexA: number;\n /** @internal */\n m_indexB: number;\n /** @internal */\n m_evaluateFcn: EvaluateFunction;\n /** @internal */\n m_manifold: Manifold = new Manifold();\n /** @internal */\n m_prev: Contact | null = null;\n /** @internal */\n m_next: Contact | null = null;\n /** @internal */\n m_toi: number = 1.0;\n /** @internal */\n m_toiCount: number = 0;\n /** @internal This contact has a valid TOI in m_toi */\n m_toiFlag: boolean = false;\n /** @internal */\n m_friction: number;\n /** @internal */\n m_restitution: number;\n /** @internal */\n m_tangentSpeed: number = 0.0;\n /** @internal This contact can be disabled (by user) */\n m_enabledFlag: boolean = true;\n /** @internal Used when crawling contact graph when forming islands. */\n m_islandFlag: boolean = false;\n /** @internal Set when the shapes are touching. */\n m_touchingFlag: boolean = false;\n /** @internal This contact needs filtering because a fixture filter was changed. */\n m_filterFlag: boolean = false;\n /** @internal This bullet contact had a TOI event */\n m_bulletHitFlag: boolean = false;\n\n /** @internal Contact reporting impulse object cache */\n m_impulse: ContactImpulse = new ContactImpulse(this);\n\n // VelocityConstraint\n /** @internal */ v_points: VelocityConstraintPoint[] = []; // [maxManifoldPoints];\n /** @internal */ v_normal: Vec2 = Vec2.zero();\n /** @internal */ v_normalMass: Mat22 = new Mat22();\n /** @internal */ v_K: Mat22 = new Mat22();\n /** @internal */ v_pointCount: number;\n /** @internal */ v_tangentSpeed: number | undefined;\n /** @internal */ v_friction: number | undefined;\n /** @internal */ v_restitution: number | undefined;\n /** @internal */ v_invMassA: number | undefined;\n /** @internal */ v_invMassB: number | undefined;\n /** @internal */ v_invIA: number | undefined;\n /** @internal */ v_invIB: number | undefined;\n\n // PositionConstraint\n /** @internal */ p_localPoints: Vec2[] = []; // [maxManifoldPoints];\n /** @internal */ p_localNormal: Vec2 = Vec2.zero();\n /** @internal */ p_localPoint: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterA: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterB: Vec2 = Vec2.zero();\n /** @internal */ p_type: ManifoldType | undefined;\n /** @internal */ p_radiusA: number | undefined;\n /** @internal */ p_radiusB: number | undefined;\n /** @internal */ p_pointCount: number | undefined;\n /** @internal */ p_invMassA: number | undefined;\n /** @internal */ p_invMassB: number | undefined;\n /** @internal */ p_invIA: number | undefined;\n /** @internal */ p_invIB: number | undefined;\n\n constructor(fA: Fixture, indexA: number, fB: Fixture, indexB: number, evaluateFcn: EvaluateFunction) {\n // Nodes for connecting bodies.\n this.m_nodeA = new ContactEdge(this);\n this.m_nodeB = new ContactEdge(this);\n\n this.m_fixtureA = fA;\n this.m_fixtureB = fB;\n\n this.m_indexA = indexA;\n this.m_indexB = indexB;\n\n this.m_evaluateFcn = evaluateFcn;\n\n this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction);\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution);\n }\n\n initConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const shapeA = fixtureA.getShape();\n const shapeB = fixtureB.getShape();\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const manifold = this.getManifold();\n\n const pointCount = manifold.pointCount;\n _ASSERT && console.assert(pointCount > 0);\n\n this.v_invMassA = bodyA.m_invMass;\n this.v_invMassB = bodyB.m_invMass;\n this.v_invIA = bodyA.m_invI;\n this.v_invIB = bodyB.m_invI;\n\n this.v_friction = this.m_friction;\n this.v_restitution = this.m_restitution;\n this.v_tangentSpeed = this.m_tangentSpeed;\n\n this.v_pointCount = pointCount;\n\n this.v_K.setZero();\n this.v_normalMass.setZero();\n\n this.p_invMassA = bodyA.m_invMass;\n this.p_invMassB = bodyB.m_invMass;\n this.p_invIA = bodyA.m_invI;\n this.p_invIB = bodyB.m_invI;\n this.p_localCenterA = Vec2.clone(bodyA.m_sweep.localCenter);\n this.p_localCenterB = Vec2.clone(bodyB.m_sweep.localCenter);\n\n this.p_radiusA = shapeA.m_radius;\n this.p_radiusB = shapeB.m_radius;\n\n this.p_type = manifold.type;\n this.p_localNormal = Vec2.clone(manifold.localNormal);\n this.p_localPoint = Vec2.clone(manifold.localPoint);\n this.p_pointCount = pointCount;\n\n for (let j = 0; j < pointCount; ++j) {\n const cp = manifold.points[j];\n const vcp = this.v_points[j] = new VelocityConstraintPoint();\n\n if (step.warmStarting) {\n vcp.normalImpulse = step.dtRatio * cp.normalImpulse;\n vcp.tangentImpulse = step.dtRatio * cp.tangentImpulse;\n\n } else {\n vcp.normalImpulse = 0.0;\n vcp.tangentImpulse = 0.0;\n }\n\n vcp.rA.setZero();\n vcp.rB.setZero();\n vcp.normalMass = 0.0;\n vcp.tangentMass = 0.0;\n vcp.velocityBias = 0.0;\n\n this.p_localPoints[j] = Vec2.clone(cp.localPoint);\n\n }\n }\n\n /**\n * Get the contact manifold. Do not modify the manifold unless you understand\n * the internals of the library.\n */\n getManifold(): Manifold {\n return this.m_manifold;\n }\n\n /**\n * Get the world manifold.\n */\n getWorldManifold(worldManifold: WorldManifold | null | undefined): WorldManifold | undefined {\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n\n return this.m_manifold.getWorldManifold(worldManifold, bodyA.getTransform(),\n shapeA.m_radius, bodyB.getTransform(), shapeB.m_radius);\n }\n\n /**\n * Enable/disable this contact. This can be used inside the pre-solve contact\n * listener. The contact is only disabled for the current time step (or sub-step\n * in continuous collisions).\n */\n setEnabled(flag: boolean): void {\n this.m_enabledFlag = !!flag;\n }\n\n /**\n * Has this contact been disabled?\n */\n isEnabled(): boolean {\n return this.m_enabledFlag;\n }\n\n /**\n * Is this contact touching?\n */\n isTouching(): boolean {\n return this.m_touchingFlag;\n }\n\n /**\n * Get the next contact in the world's contact list.\n */\n getNext(): Contact | null {\n return this.m_next;\n }\n\n /**\n * Get fixture A in this contact.\n */\n getFixtureA(): Fixture {\n return this.m_fixtureA;\n }\n\n /**\n * Get fixture B in this contact.\n */\n getFixtureB(): Fixture {\n return this.m_fixtureB;\n }\n\n /**\n * Get the child primitive index for fixture A.\n */\n getChildIndexA(): number {\n return this.m_indexA;\n }\n\n /**\n * Get the child primitive index for fixture B.\n */\n getChildIndexB(): number {\n return this.m_indexB;\n }\n\n /**\n * Flag this contact for filtering. Filtering will occur the next time step.\n */\n flagForFiltering(): void {\n this.m_filterFlag = true;\n }\n\n /**\n * Override the default friction mixture. You can call this in\n * ContactListener.preSolve. This value persists until set or reset.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the friction.\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Reset the friction mixture to the default value.\n */\n resetFriction(): void {\n this.m_friction = mixFriction(this.m_fixtureA.m_friction,\n this.m_fixtureB.m_friction);\n }\n\n /**\n * Override the default restitution mixture. You can call this in\n * ContactListener.preSolve. The value persists until you set or reset.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Get the restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Reset the restitution to the default value.\n */\n resetRestitution(): void {\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution,\n this.m_fixtureB.m_restitution);\n }\n\n /**\n * Set the desired tangent speed for a conveyor belt behavior. In meters per\n * second.\n */\n setTangentSpeed(speed: number): void {\n this.m_tangentSpeed = speed;\n }\n\n /**\n * Get the desired tangent speed. In meters per second.\n */\n getTangentSpeed(): number {\n return this.m_tangentSpeed;\n }\n\n /**\n * Called by Update method, and implemented by subclasses.\n */\n evaluate(manifold: Manifold, xfA: Transform, xfB: Transform): void {\n this.m_evaluateFcn(manifold, xfA, this.m_fixtureA, this.m_indexA, xfB,\n this.m_fixtureB, this.m_indexB);\n }\n\n /**\n * Updates the contact manifold and touching status.\n *\n * Note: do not assume the fixture AABBs are overlapping or are valid.\n *\n * @param listener.beginContact\n * @param listener.endContact\n * @param listener.preSolve\n */\n update(listener?: {\n beginContact(contact: Contact): void,\n endContact(contact: Contact): void,\n preSolve(contact: Contact, oldManifold: Manifold): void\n }): void {\n\n // Re-enable this contact.\n this.m_enabledFlag = true;\n\n let touching = false;\n const wasTouching = this.m_touchingFlag;\n\n const sensorA = this.m_fixtureA.isSensor();\n const sensorB = this.m_fixtureB.isSensor();\n const sensor = sensorA || sensorB;\n\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const xfA = bodyA.getTransform();\n const xfB = bodyB.getTransform();\n\n let oldManifold;\n\n // Is this contact a sensor?\n if (sensor) {\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n touching = testOverlap(shapeA, this.m_indexA, shapeB, this.m_indexB, xfA, xfB);\n\n // Sensors don't generate manifolds.\n this.m_manifold.pointCount = 0;\n } else {\n\n // TODO reuse manifold\n oldManifold = this.m_manifold;\n this.m_manifold = new Manifold();\n\n this.evaluate(this.m_manifold, xfA, xfB);\n touching = this.m_manifold.pointCount > 0;\n\n // Match old contact ids to new contact ids and copy the\n // stored impulses to warm start the solver.\n for (let i = 0; i < this.m_manifold.pointCount; ++i) {\n const nmp = this.m_manifold.points[i];\n nmp.normalImpulse = 0.0;\n nmp.tangentImpulse = 0.0;\n\n for (let j = 0; j < oldManifold.pointCount; ++j) {\n const omp = oldManifold.points[j];\n if (omp.id.key == nmp.id.key) {\n nmp.normalImpulse = omp.normalImpulse;\n nmp.tangentImpulse = omp.tangentImpulse;\n break;\n }\n }\n }\n\n if (touching != wasTouching) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n }\n\n this.m_touchingFlag = touching;\n\n if (!wasTouching && touching && listener) {\n listener.beginContact(this);\n }\n\n if (wasTouching && !touching && listener) {\n listener.endContact(this);\n }\n\n if (!sensor && touching && listener) {\n listener.preSolve(this, oldManifold);\n }\n }\n\n solvePositionConstraint(step: TimeStep): number {\n return this._solvePositionConstraint(step);\n }\n\n solvePositionConstraintTOI(step: TimeStep, toiA: Body, toiB: Body): number {\n return this._solvePositionConstraint(step, toiA, toiB);\n }\n\n private _solvePositionConstraint(step: TimeStep, toiA?: Body, toiB?: Body): number {\n const toi: boolean = !!toiA && !!toiB;\n\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n let mA = 0.0;\n let iA = 0.0;\n if (!toi || (bodyA == toiA || bodyA == toiB)) {\n mA = this.p_invMassA;\n iA = this.p_invIA;\n }\n\n let mB = 0.0;\n let iB = 0.0;\n if (!toi || (bodyB == toiA || bodyB == toiB)) {\n mB = this.p_invMassB;\n iB = this.p_invIB;\n }\n\n const cA = Vec2.clone(positionA.c);\n let aA = positionA.a;\n\n const cB = Vec2.clone(positionB.c);\n let aB = positionB.a;\n\n let minSeparation = 0.0;\n\n // Solve normal constraints\n for (let j = 0; j < this.p_pointCount; ++j) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p = Vec2.sub(cA, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p = Vec2.sub(cB, Rot.mulVec2(xfB.q, localCenterB));\n\n // PositionSolverManifold\n let normal;\n let point;\n let separation;\n switch (this.p_type) {\n case ManifoldType.e_circles: {\n const pointA = Transform.mulVec2(xfA, this.p_localPoint);\n const pointB = Transform.mulVec2(xfB, this.p_localPoints[0]);\n normal = Vec2.sub(pointB, pointA);\n normal.normalize();\n point = Vec2.combine(0.5, pointA, 0.5, pointB);\n separation = Vec2.dot(Vec2.sub(pointB, pointA), normal) - this.p_radiusA - this.p_radiusB;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfA, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfB, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfB, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfA, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n\n // Ensure normal points from A to B\n normal.mul(-1);\n break;\n }\n }\n\n const rA = Vec2.sub(point, cA);\n const rB = Vec2.sub(point, cB);\n\n // Track max constraint error.\n minSeparation = Math.min(minSeparation, separation);\n\n const baumgarte = toi ? Settings.toiBaugarte : Settings.baumgarte;\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n // Prevent large corrections and allow slop.\n const C = Math.clamp(baumgarte * (separation + linearSlop), -maxLinearCorrection, 0.0);\n\n // Compute the effective mass.\n const rnA = Vec2.crossVec2Vec2(rA, normal);\n const rnB = Vec2.crossVec2Vec2(rB, normal);\n const K = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n // Compute normal impulse\n const impulse = K > 0.0 ? -C / K : 0.0;\n\n const P = Vec2.mulNumVec2(impulse, normal);\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n\n return minSeparation;\n }\n\n initVelocityConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const radiusA = this.p_radiusA;\n const radiusB = this.p_radiusB;\n const manifold = this.getManifold();\n\n const mA = this.v_invMassA;\n const mB = this.v_invMassB;\n const iA = this.v_invIA;\n const iB = this.v_invIB;\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n const cA = Vec2.clone(positionA.c);\n const aA = positionA.a;\n const vA = Vec2.clone(velocityA.v);\n const wA = velocityA.w;\n\n const cB = Vec2.clone(positionB.c);\n const aB = positionB.a;\n const vB = Vec2.clone(velocityB.v);\n const wB = velocityB.w;\n\n _ASSERT && console.assert(manifold.pointCount > 0);\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p.setCombine(1, cA, -1, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p.setCombine(1, cB, -1, Rot.mulVec2(xfB.q, localCenterB));\n\n const worldManifold = manifold.getWorldManifold(null, xfA, radiusA, xfB, radiusB);\n\n this.v_normal.setVec2(worldManifold.normal);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n vcp.rA.setVec2(Vec2.sub(worldManifold.points[j], cA));\n vcp.rB.setVec2(Vec2.sub(worldManifold.points[j], cB));\n\n const rnA = Vec2.crossVec2Vec2(vcp.rA, this.v_normal);\n const rnB = Vec2.crossVec2Vec2(vcp.rB, this.v_normal);\n\n const kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n vcp.normalMass = kNormal > 0.0 ? 1.0 / kNormal : 0.0;\n\n const tangent = Vec2.crossVec2Num(this.v_normal, 1.0);\n\n const rtA = Vec2.crossVec2Vec2(vcp.rA, tangent);\n const rtB = Vec2.crossVec2Vec2(vcp.rB, tangent);\n\n const kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB;\n\n vcp.tangentMass = kTangent > 0.0 ? 1.0 / kTangent : 0.0;\n\n // Setup a velocity bias for restitution.\n vcp.velocityBias = 0.0;\n const vRel = Vec2.dot(this.v_normal, vB)\n + Vec2.dot(this.v_normal, Vec2.crossNumVec2(wB, vcp.rB))\n - Vec2.dot(this.v_normal, vA)\n - Vec2.dot(this.v_normal, Vec2.crossNumVec2(wA, vcp.rA));\n if (vRel < -Settings.velocityThreshold) {\n vcp.velocityBias = -this.v_restitution * vRel;\n }\n }\n\n // If we have two points, then prepare the block solver.\n if (this.v_pointCount == 2 && step.blockSolve) {\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const rn1A = Vec2.crossVec2Vec2(vcp1.rA, this.v_normal);\n const rn1B = Vec2.crossVec2Vec2(vcp1.rB, this.v_normal);\n const rn2A = Vec2.crossVec2Vec2(vcp2.rA, this.v_normal);\n const rn2B = Vec2.crossVec2Vec2(vcp2.rB, this.v_normal);\n\n const k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B;\n const k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B;\n const k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B;\n\n // Ensure a reasonable condition number.\n const k_maxConditionNumber = 1000.0;\n if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) {\n // K is safe to invert.\n this.v_K.ex.setNum(k11, k12);\n this.v_K.ey.setNum(k12, k22);\n this.v_normalMass.set(this.v_K.getInverse());\n } else {\n // The constraints are redundant, just use one.\n // TODO_ERIN use deepest?\n this.v_pointCount = 1;\n }\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n warmStartConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n const P = Vec2.combine(vcp.normalImpulse, normal, vcp.tangentImpulse, tangent);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n vA.subMul(mA, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n vB.addMul(mB, P);\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n storeConstraintImpulses(step: TimeStep): void {\n const manifold = this.m_manifold;\n for (let j = 0; j < this.v_pointCount; ++j) {\n manifold.points[j].normalImpulse = this.v_points[j].normalImpulse;\n manifold.points[j].tangentImpulse = this.v_points[j].tangentImpulse;\n }\n }\n\n solveVelocityConstraint(step: TimeStep): void {\n const bodyA = this.m_fixtureA.m_body;\n const bodyB = this.m_fixtureB.m_body;\n\n const velocityA = bodyA.c_velocity;\n const positionA = bodyA.c_position;\n\n const velocityB = bodyB.c_velocity;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n const friction = this.v_friction;\n\n _ASSERT && console.assert(this.v_pointCount == 1 || this.v_pointCount == 2);\n\n // Solve tangent constraints first because non-penetration is more important\n // than friction.\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute tangent force\n const vt = Vec2.dot(dv, tangent) - this.v_tangentSpeed;\n let lambda = vcp.tangentMass * (-vt);\n\n // Clamp the accumulated force\n const maxFriction = friction * vcp.normalImpulse;\n const newImpulse = Math.clamp(vcp.tangentImpulse + lambda, -maxFriction, maxFriction);\n lambda = newImpulse - vcp.tangentImpulse;\n vcp.tangentImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, tangent);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n\n // Solve normal constraints\n if (this.v_pointCount == 1 || step.blockSolve == false) {\n for (let i = 0; i < this.v_pointCount; ++i) {\n const vcp = this.v_points[i]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute normal impulse\n const vn = Vec2.dot(dv, normal);\n let lambda = -vcp.normalMass * (vn - vcp.velocityBias);\n\n // Clamp the accumulated impulse\n const newImpulse = Math.max(vcp.normalImpulse + lambda, 0.0);\n lambda = newImpulse - vcp.normalImpulse;\n vcp.normalImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, normal);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n } else {\n // Block solver developed in collaboration with Dirk Gregorius (back in\n // 01/07 on Box2D_Lite).\n // Build the mini LCP for this contact patch\n //\n // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i =\n // 1..2\n //\n // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n )\n // b = vn0 - velocityBias\n //\n // The system is solved using the \"Total enumeration method\" (s. Murty).\n // The complementary constraint vn_i * x_i\n // implies that we must have in any solution either vn_i = 0 or x_i = 0.\n // So for the 2D contact problem the cases\n // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and\n // vn1 = 0 need to be tested. The first valid\n // solution that satisfies the problem is chosen.\n //\n // In order to account of the accumulated impulse 'a' (because of the\n // iterative nature of the solver which only requires\n // that the accumulated impulse is clamped and not the incremental\n // impulse) we change the impulse variable (x_i).\n //\n // Substitute:\n //\n // x = a + d\n //\n // a := old total impulse\n // x := new total impulse\n // d := incremental impulse\n //\n // For the current iteration we extend the formula for the incremental\n // impulse\n // to compute the new total impulse:\n //\n // vn = A * d + b\n // = A * (x - a) + b\n // = A * x + b - A * a\n // = A * x + b'\n // b' = b - A * a;\n\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const a = Vec2.neo(vcp1.normalImpulse, vcp2.normalImpulse);\n _ASSERT && console.assert(a.x >= 0.0 && a.y >= 0.0);\n\n // Relative velocity at contact\n let dv1 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp1.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp1.rA));\n let dv2 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp2.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp2.rA));\n\n // Compute normal velocity\n let vn1 = Vec2.dot(dv1, normal);\n let vn2 = Vec2.dot(dv2, normal);\n\n const b = Vec2.neo(vn1 - vcp1.velocityBias, vn2 - vcp2.velocityBias);\n\n // Compute b'\n b.sub(Mat22.mulVec2(this.v_K, a));\n\n const k_errorTol = 1e-3;\n // NOT_USED(k_errorTol);\n\n while (true) {\n //\n // Case 1: vn = 0\n //\n // 0 = A * x + b'\n //\n // Solve for x:\n //\n // x = - inv(A) * b'\n //\n const x = Mat22.mulVec2(this.v_normalMass, b).neg();\n\n if (x.x >= 0.0 && x.y >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n dv1 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA)));\n dv2 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA)));\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && console.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n _ASSERT && console.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 2: vn1 = 0 and x2 = 0\n //\n // 0 = a11 * x1 + a12 * 0 + b1'\n // vn2 = a21 * x1 + a22 * 0 + b2'\n //\n x.x = -vcp1.normalMass * b.x;\n x.y = 0.0;\n vn1 = 0.0;\n vn2 = this.v_K.ex.y * x.x + b.y;\n\n if (x.x >= 0.0 && vn2 >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv1B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB));\n const dv1A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA));\n const dv1 = Vec2.sub(dv1B, dv1A);\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n\n _ASSERT && console.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 3: vn2 = 0 and x1 = 0\n //\n // vn1 = a11 * 0 + a12 * x2 + b1'\n // 0 = a21 * 0 + a22 * x2 + b2'\n //\n x.x = 0.0;\n x.y = -vcp2.normalMass * b.y;\n vn1 = this.v_K.ey.x * x.y + b.x;\n vn2 = 0.0;\n\n if (x.y >= 0.0 && vn1 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv2B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB));\n const dv2A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA));\n const dv1 = Vec2.sub(dv2B, dv2A);\n\n // Compute normal velocity\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && console.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 4: x1 = 0 and x2 = 0\n //\n // vn1 = b1\n // vn2 = b2;\n //\n x.x = 0.0;\n x.y = 0.0;\n vn1 = b.x;\n vn2 = b.y;\n\n if (vn1 >= 0.0 && vn2 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n break;\n }\n\n // No solution, give up. This is hit sometimes, but it doesn't seem to\n // matter.\n break;\n }\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n /**\n * @internal\n */\n static addType(type1: ShapeType, type2: ShapeType, callback: ContactCallback): void {\n s_registers[type1] = s_registers[type1] || {};\n s_registers[type1][type2] = callback;\n }\n\n /**\n * @internal\n */\n static create(fixtureA: Fixture, indexA: number, fixtureB: Fixture, indexB: number): Contact | null {\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // TODO: pool contacts\n let contact;\n let evaluateFcn;\n if (evaluateFcn = s_registers[typeA] && s_registers[typeA][typeB]) {\n contact = new Contact(fixtureA, indexA, fixtureB, indexB, evaluateFcn);\n } else if (evaluateFcn = s_registers[typeB] && s_registers[typeB][typeA]) {\n contact = new Contact(fixtureB, indexB, fixtureA, indexA, evaluateFcn);\n } else {\n return null;\n }\n\n // Contact creation may swap fixtures.\n fixtureA = contact.getFixtureA();\n fixtureB = contact.getFixtureB();\n indexA = contact.getChildIndexA();\n indexB = contact.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Connect to body A\n contact.m_nodeA.contact = contact;\n contact.m_nodeA.other = bodyB;\n\n contact.m_nodeA.prev = null;\n contact.m_nodeA.next = bodyA.m_contactList;\n if (bodyA.m_contactList != null) {\n bodyA.m_contactList.prev = contact.m_nodeA;\n }\n bodyA.m_contactList = contact.m_nodeA;\n\n // Connect to body B\n contact.m_nodeB.contact = contact;\n contact.m_nodeB.other = bodyA;\n\n contact.m_nodeB.prev = null;\n contact.m_nodeB.next = bodyB.m_contactList;\n if (bodyB.m_contactList != null) {\n bodyB.m_contactList.prev = contact.m_nodeB;\n }\n bodyB.m_contactList = contact.m_nodeB;\n\n // Wake up the bodies\n if (fixtureA.isSensor() == false && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n return contact;\n }\n\n /**\n * @internal\n */\n static destroy(contact: Contact, listener: { endContact: (contact: Contact) => void }): void {\n const fixtureA = contact.m_fixtureA;\n const fixtureB = contact.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n if (contact.isTouching()) {\n listener.endContact(contact);\n }\n\n // Remove from body 1\n if (contact.m_nodeA.prev) {\n contact.m_nodeA.prev.next = contact.m_nodeA.next;\n }\n\n if (contact.m_nodeA.next) {\n contact.m_nodeA.next.prev = contact.m_nodeA.prev;\n }\n\n if (contact.m_nodeA == bodyA.m_contactList) {\n bodyA.m_contactList = contact.m_nodeA.next;\n }\n\n // Remove from body 2\n if (contact.m_nodeB.prev) {\n contact.m_nodeB.prev.next = contact.m_nodeB.next;\n }\n\n if (contact.m_nodeB.next) {\n contact.m_nodeB.next.prev = contact.m_nodeB.prev;\n }\n\n if (contact.m_nodeB == bodyB.m_contactList) {\n bodyB.m_contactList = contact.m_nodeB.next;\n }\n\n if (contact.m_manifold.pointCount > 0 && fixtureA.isSensor() == false\n && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // const destroyFcn = s_registers[typeA][typeB].destroyFcn;\n // if (typeof destroyFcn === 'function') {\n // destroyFcn(contact);\n // }\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { Vec2 } from '../common/Vec2';\nimport { BroadPhase } from '../collision/BroadPhase';\nimport { Solver, ContactImpulse, TimeStep } from './Solver';\nimport { Body, BodyDef } from './Body';\nimport { Joint } from './Joint';\nimport { Contact } from './Contact';\nimport { AABB, RayCastInput, RayCastOutput } from \"../collision/AABB\";\nimport { Fixture, FixtureProxy } from \"./Fixture\";\nimport { Manifold } from \"../collision/Manifold\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * @prop gravity [{ x : 0, y : 0}]\n * @prop allowSleep [true]\n * @prop warmStarting [true]\n * @prop continuousPhysics [true]\n * @prop subStepping [false]\n * @prop blockSolve [true]\n * @prop velocityIterations [8] For the velocity constraint solver.\n * @prop positionIterations [3] For the position constraint solver.\n */\nexport interface WorldDef {\n gravity?: Vec2;\n allowSleep?: boolean;\n warmStarting?: boolean;\n continuousPhysics?: boolean;\n subStepping?: boolean;\n blockSolve?: boolean;\n velocityIterations?: number;\n positionIterations?: number;\n}\n\nconst WorldDefDefault: WorldDef = {\n gravity : Vec2.zero(),\n allowSleep : true,\n warmStarting : true,\n continuousPhysics : true,\n subStepping : false,\n blockSolve : true,\n velocityIterations : 8,\n positionIterations : 3\n};\n\n/**\n * Callback function for ray casts, see {@link World.rayCast}.\n *\n * Called for each fixture found in the query. You control how the ray cast\n * proceeds by returning a float: return -1: ignore this fixture and continue\n * return 0: terminate the ray cast return fraction: clip the ray to this point\n * return 1: don't clip the ray and continue\n *\n * @param fixture The fixture hit by the ray\n * @param point The point of initial intersection\n * @param normal The normal vector at the point of intersection\n * @param fraction\n *\n * @return -1 to filter, 0 to terminate, fraction to clip the ray for closest hit, 1 to continue\n */\nexport type WorldRayCastCallback = (fixture: Fixture, point: Vec2, normal: Vec2, fraction: number) => number;\n\n/**\n * Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\nexport type WorldAABBQueryCallback = (fixture: Fixture) => boolean;\n\nexport class World {\n /** @internal */ m_solver: Solver;\n /** @internal */ m_broadPhase: BroadPhase;\n /** @internal */ m_contactList: Contact | null;\n /** @internal */ m_contactCount: number;\n /** @internal */ m_bodyList: Body | null;\n /** @internal */ m_bodyCount: number;\n /** @internal */ m_jointList: Joint | null;\n /** @internal */ m_jointCount: number;\n /** @internal */ m_stepComplete: boolean;\n /** @internal */ m_allowSleep: boolean;\n /** @internal */ m_gravity: Vec2;\n /** @internal */ m_clearForces: boolean;\n /** @internal */ m_newFixture: boolean;\n /** @internal */ m_locked: boolean;\n /** @internal */ m_warmStarting: boolean;\n /** @internal */ m_continuousPhysics: boolean;\n /** @internal */ m_subStepping: boolean;\n /** @internal */ m_blockSolve: boolean;\n /** @internal */ m_velocityIterations: number;\n /** @internal */ m_positionIterations: number;\n /** @internal */ m_t: number;\n\n // TODO\n /** @internal */ _listeners: {\n [key: string]: any[]\n };\n\n /**\n * @param def World definition or gravity vector.\n */\n constructor(def?: WorldDef | Vec2 | null) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof World)) {\n return new World(def);\n }\n\n this.s_step = new TimeStep();\n\n\n if (def && Vec2.isValid(def)) {\n def = { gravity: def as Vec2 };\n }\n\n def = options(def, WorldDefDefault) as WorldDef;\n\n this.m_solver = new Solver(this);\n\n this.m_broadPhase = new BroadPhase();\n\n this.m_contactList = null;\n this.m_contactCount = 0;\n\n this.m_bodyList = null;\n this.m_bodyCount = 0;\n\n this.m_jointList = null;\n this.m_jointCount = 0;\n\n this.m_stepComplete = true;\n\n this.m_allowSleep = def.allowSleep;\n this.m_gravity = Vec2.clone(def.gravity);\n\n this.m_clearForces = true;\n this.m_newFixture = false;\n this.m_locked = false;\n\n // These are for debugging the solver.\n this.m_warmStarting = def.warmStarting;\n this.m_continuousPhysics = def.continuousPhysics;\n this.m_subStepping = def.subStepping;\n\n this.m_blockSolve = def.blockSolve;\n this.m_velocityIterations = def.velocityIterations;\n this.m_positionIterations = def.positionIterations;\n\n this.m_t = 0;\n }\n\n /** @internal */\n _serialize(): object {\n const bodies = [];\n const joints = [];\n\n for (let b = this.getBodyList(); b; b = b.getNext()) {\n bodies.push(b);\n }\n\n for (let j = this.getJointList(); j; j = j.getNext()) {\n // @ts-ignore\n if (typeof j._serialize === 'function') {\n joints.push(j);\n }\n }\n\n return {\n gravity: this.m_gravity,\n bodies,\n joints,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, context: any, restore: any): World {\n if (!data) {\n return new World();\n }\n\n const world = new World(data.gravity);\n\n if (data.bodies) {\n for (let i = data.bodies.length - 1; i >= 0; i -= 1) {\n world._addBody(restore(Body, data.bodies[i], world));\n }\n }\n\n if (data.joints) {\n for (let i = data.joints.length - 1; i >= 0; i--) {\n world.createJoint(restore(Joint, data.joints[i], world));\n }\n }\n\n return world;\n }\n\n /**\n * Get the world body list. With the returned body, use Body.getNext to get the\n * next body in the world list. A null body indicates the end of the list.\n *\n * @return the head of the world body list.\n */\n getBodyList(): Body | null {\n return this.m_bodyList;\n }\n\n /**\n * Get the world joint list. With the returned joint, use Joint.getNext to get\n * the next joint in the world list. A null joint indicates the end of the list.\n *\n * @return the head of the world joint list.\n */\n getJointList(): Joint | null {\n return this.m_jointList;\n }\n\n /**\n * Get the world contact list. With the returned contact, use Contact.getNext to\n * get the next contact in the world list. A null contact indicates the end of\n * the list.\n *\n * Warning: contacts are created and destroyed in the middle of a time step.\n * Use ContactListener to avoid missing contacts.\n *\n * @return the head of the world contact list.\n */\n getContactList(): Contact | null {\n return this.m_contactList;\n }\n\n getBodyCount(): number {\n return this.m_bodyCount;\n }\n\n getJointCount(): number {\n return this.m_jointCount;\n }\n\n /**\n * Get the number of contacts (each may have 0 or more contact points).\n */\n getContactCount(): number {\n return this.m_contactCount;\n }\n\n /**\n * Change the global gravity vector.\n */\n setGravity(gravity: Vec2): void {\n this.m_gravity = gravity;\n }\n\n /**\n * Get the global gravity vector.\n */\n getGravity(): Vec2 {\n return this.m_gravity;\n }\n\n /**\n * Is the world locked (in the middle of a time step).\n */\n isLocked(): boolean {\n return this.m_locked;\n }\n\n /**\n * Enable/disable sleep.\n */\n setAllowSleeping(flag: boolean): void {\n if (flag == this.m_allowSleep) {\n return;\n }\n\n this.m_allowSleep = flag;\n if (this.m_allowSleep == false) {\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.setAwake(true);\n }\n }\n }\n\n getAllowSleeping(): boolean {\n return this.m_allowSleep;\n }\n\n /**\n * Enable/disable warm starting. For testing.\n */\n setWarmStarting(flag: boolean): void {\n this.m_warmStarting = flag;\n }\n\n getWarmStarting(): boolean {\n return this.m_warmStarting;\n }\n\n /**\n * Enable/disable continuous physics. For testing.\n */\n setContinuousPhysics(flag: boolean): void {\n this.m_continuousPhysics = flag;\n }\n\n getContinuousPhysics(): boolean {\n return this.m_continuousPhysics;\n }\n\n /**\n * Enable/disable single stepped continuous physics. For testing.\n */\n setSubStepping(flag: boolean): void {\n this.m_subStepping = flag;\n }\n\n getSubStepping(): boolean {\n return this.m_subStepping;\n }\n\n /**\n * Set flag to control automatic clearing of forces after each time step.\n */\n setAutoClearForces(flag: boolean): void {\n this.m_clearForces = flag;\n }\n\n /**\n * Get the flag that controls automatic clearing of forces after each time step.\n */\n getAutoClearForces(): boolean {\n return this.m_clearForces;\n }\n\n /**\n * Manually clear the force buffer on all bodies. By default, forces are cleared\n * automatically after each call to step. The default behavior is modified by\n * calling setAutoClearForces. The purpose of this function is to support\n * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step\n * under a variable frame-rate. When you perform sub-stepping you will disable\n * auto clearing of forces and instead call clearForces after all sub-steps are\n * complete in one pass of your game loop.\n *\n * See {@link World.setAutoClearForces}\n */\n clearForces(): void {\n for (let body = this.m_bodyList; body; body = body.getNext()) {\n body.m_force.setZero();\n body.m_torque = 0.0;\n }\n }\n\n /**\n * Query the world for all fixtures that potentially overlap the provided AABB.\n *\n * @param aabb The query box.\n * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\n queryAABB(aabb: AABB, callback: WorldAABBQueryCallback): void {\n _ASSERT && console.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n this.m_broadPhase.query(aabb, function(proxyId: number): boolean { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n return callback(proxy.fixture);\n });\n }\n\n /**\n * Ray-cast the world for all fixtures in the path of the ray. Your callback\n * controls whether you get the closest point, any point, or n-points. The\n * ray-cast ignores shapes that contain the starting point.\n *\n * @param point1 The ray starting point\n * @param point2 The ray ending point\n * @param callback A user implemented callback function.\n */\n rayCast(point1: Vec2, point2: Vec2, callback: WorldRayCastCallback): void {\n _ASSERT && console.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n\n this.m_broadPhase.rayCast({\n maxFraction : 1.0,\n p1 : point1,\n p2 : point2\n }, function(input: RayCastInput, proxyId: number): number { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n const fixture = proxy.fixture;\n const index = proxy.childIndex;\n // @ts-ignore\n const output: RayCastOutput = {}; // TODO GC\n const hit = fixture.rayCast(output, input, index);\n if (hit) {\n const fraction = output.fraction;\n const point = Vec2.add(Vec2.mulNumVec2((1.0 - fraction), input.p1), Vec2.mulNumVec2(fraction, input.p2));\n return callback(fixture, point, output.normal, fraction);\n }\n return input.maxFraction;\n });\n }\n\n /**\n * Get the number of broad-phase proxies.\n */\n getProxyCount(): number {\n return this.m_broadPhase.getProxyCount();\n }\n\n /**\n * Get the height of broad-phase dynamic tree.\n */\n getTreeHeight(): number {\n return this.m_broadPhase.getTreeHeight();\n }\n\n /**\n * Get the balance of broad-phase dynamic tree.\n */\n getTreeBalance(): number {\n return this.m_broadPhase.getTreeBalance();\n }\n\n /**\n * Get the quality metric of broad-phase dynamic tree. The smaller the better.\n * The minimum is 1.\n */\n getTreeQuality(): number {\n return this.m_broadPhase.getTreeQuality();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The body shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n _ASSERT && console.assert(this.m_locked == false);\n if (this.m_locked) {\n return;\n }\n\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.m_xf.p.sub(newOrigin);\n b.m_sweep.c0.sub(newOrigin);\n b.m_sweep.c.sub(newOrigin);\n }\n\n for (let j = this.m_jointList; j; j = j.m_next) {\n j.shiftOrigin(newOrigin);\n }\n\n this.m_broadPhase.shiftOrigin(newOrigin);\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addBody(body: Body): void {\n _ASSERT && console.assert(this.isLocked() === false);\n if (this.isLocked()) {\n return;\n }\n\n // Add to world doubly linked list.\n body.m_prev = null;\n body.m_next = this.m_bodyList;\n if (this.m_bodyList) {\n this.m_bodyList.m_prev = body;\n }\n this.m_bodyList = body;\n ++this.m_bodyCount;\n }\n\n /**\n * Create a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This function is locked during callbacks.\n */\n createBody(def?: BodyDef): Body;\n createBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createBody(arg1?, arg2?) {\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n\n const body = new Body(this, def);\n this._addBody(body);\n return body;\n }\n\n createDynamicBody(def?: BodyDef): Body;\n createDynamicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createDynamicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'dynamic';\n return this.createBody(def);\n }\n\n createKinematicBody(def?: BodyDef): Body;\n createKinematicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createKinematicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'kinematic';\n return this.createBody(def);\n }\n\n /**\n * Destroy a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This automatically deletes all associated shapes and joints.\n *\n * Warning: This function is locked during callbacks.\n */\n destroyBody(b: Body): boolean {\n _ASSERT && console.assert(this.m_bodyCount > 0);\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n if (b.m_destroyed) {\n return false;\n }\n\n // Delete the attached joints.\n let je = b.m_jointList;\n while (je) {\n const je0 = je;\n je = je.next;\n\n this.publish('remove-joint', je0.joint);\n this.destroyJoint(je0.joint);\n\n b.m_jointList = je;\n }\n b.m_jointList = null;\n\n // Delete the attached contacts.\n let ce = b.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n\n this.destroyContact(ce0.contact);\n\n b.m_contactList = ce;\n }\n b.m_contactList = null;\n\n // Delete the attached fixtures. This destroys broad-phase proxies.\n let f = b.m_fixtureList;\n while (f) {\n const f0 = f;\n f = f.m_next;\n\n this.publish('remove-fixture', f0);\n f0.destroyProxies(this.m_broadPhase);\n\n b.m_fixtureList = f;\n }\n b.m_fixtureList = null;\n\n // Remove world body list.\n if (b.m_prev) {\n b.m_prev.m_next = b.m_next;\n }\n\n if (b.m_next) {\n b.m_next.m_prev = b.m_prev;\n }\n\n if (b == this.m_bodyList) {\n this.m_bodyList = b.m_next;\n }\n\n b.m_destroyed = true;\n\n --this.m_bodyCount;\n\n this.publish('remove-body', b);\n\n return true;\n }\n\n /**\n * Create a joint to constrain bodies together. No reference to the definition\n * is retained. This may cause the connected bodies to cease colliding.\n *\n * Warning: This function is locked during callbacks.\n */\n createJoint(joint: T): T | null {\n _ASSERT && console.assert(!!joint.m_bodyA);\n _ASSERT && console.assert(!!joint.m_bodyB);\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n // Connect to the world list.\n joint.m_prev = null;\n joint.m_next = this.m_jointList;\n if (this.m_jointList) {\n this.m_jointList.m_prev = joint;\n }\n this.m_jointList = joint;\n ++this.m_jointCount;\n\n // Connect to the bodies' doubly linked lists.\n joint.m_edgeA.joint = joint;\n joint.m_edgeA.other = joint.m_bodyB;\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = joint.m_bodyA.m_jointList;\n if (joint.m_bodyA.m_jointList)\n joint.m_bodyA.m_jointList.prev = joint.m_edgeA;\n joint.m_bodyA.m_jointList = joint.m_edgeA;\n\n joint.m_edgeB.joint = joint;\n joint.m_edgeB.other = joint.m_bodyA;\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = joint.m_bodyB.m_jointList;\n if (joint.m_bodyB.m_jointList)\n joint.m_bodyB.m_jointList.prev = joint.m_edgeB;\n joint.m_bodyB.m_jointList = joint.m_edgeB;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n for (let edge = joint.m_bodyB.getContactList(); edge; edge = edge.next) {\n if (edge.other == joint.m_bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n }\n }\n\n // Note: creating a joint doesn't wake the bodies.\n\n return joint;\n }\n\n /**\n * Destroy a joint. This may cause the connected bodies to begin colliding.\n * Warning: This function is locked during callbacks.\n */\n destroyJoint(joint: Joint): void {\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n // Remove from the doubly linked list.\n if (joint.m_prev) {\n joint.m_prev.m_next = joint.m_next;\n }\n\n if (joint.m_next) {\n joint.m_next.m_prev = joint.m_prev;\n }\n\n if (joint == this.m_jointList) {\n this.m_jointList = joint.m_next;\n }\n\n // Disconnect from bodies.\n const bodyA = joint.m_bodyA;\n const bodyB = joint.m_bodyB;\n\n // Wake up connected bodies.\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n\n // Remove from body 1.\n if (joint.m_edgeA.prev) {\n joint.m_edgeA.prev.next = joint.m_edgeA.next;\n }\n\n if (joint.m_edgeA.next) {\n joint.m_edgeA.next.prev = joint.m_edgeA.prev;\n }\n\n if (joint.m_edgeA == bodyA.m_jointList) {\n bodyA.m_jointList = joint.m_edgeA.next;\n }\n\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = null;\n\n // Remove from body 2\n if (joint.m_edgeB.prev) {\n joint.m_edgeB.prev.next = joint.m_edgeB.next;\n }\n\n if (joint.m_edgeB.next) {\n joint.m_edgeB.next.prev = joint.m_edgeB.prev;\n }\n\n if (joint.m_edgeB == bodyB.m_jointList) {\n bodyB.m_jointList = joint.m_edgeB.next;\n }\n\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = null;\n\n _ASSERT && console.assert(this.m_jointCount > 0);\n --this.m_jointCount;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n let edge = bodyB.getContactList();\n while (edge) {\n if (edge.other == bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n }\n\n this.publish('remove-joint', joint);\n }\n\n /** @internal */\n s_step: TimeStep; // reuse\n\n /**\n * Take a time step. This performs collision detection, integration, and\n * constraint solution.\n *\n * Broad-phase, narrow-phase, solve and solve time of impacts.\n *\n * @param timeStep Time step, this should not vary.\n */\n step(timeStep: number, velocityIterations?: number, positionIterations?: number): void {\n this.publish('pre-step', timeStep);\n\n if ((velocityIterations | 0) !== velocityIterations) {\n // TODO: remove this in future\n velocityIterations = 0;\n }\n\n velocityIterations = velocityIterations || this.m_velocityIterations;\n positionIterations = positionIterations || this.m_positionIterations;\n\n // If new fixtures were added, we need to find the new contacts.\n if (this.m_newFixture) {\n this.findNewContacts();\n this.m_newFixture = false;\n }\n\n this.m_locked = true;\n\n this.s_step.reset(timeStep);\n this.s_step.velocityIterations = velocityIterations;\n this.s_step.positionIterations = positionIterations;\n this.s_step.warmStarting = this.m_warmStarting;\n this.s_step.blockSolve = this.m_blockSolve;\n\n // Update contacts. This is where some contacts are destroyed.\n this.updateContacts();\n\n // Integrate velocities, solve velocity constraints, and integrate positions.\n if (this.m_stepComplete && timeStep > 0.0) {\n this.m_solver.solveWorld(this.s_step);\n\n // Synchronize fixtures, check for out of range bodies.\n for (let b = this.m_bodyList; b; b = b.getNext()) {\n // If a body was not in an island then it did not move.\n if (b.m_islandFlag == false) {\n continue;\n }\n\n if (b.isStatic()) {\n continue;\n }\n\n // Update fixtures (for broad-phase).\n b.synchronizeFixtures();\n }\n // Look for new contacts.\n this.findNewContacts();\n }\n\n // Handle TOI events.\n if (this.m_continuousPhysics && timeStep > 0.0) {\n this.m_solver.solveWorldTOI(this.s_step);\n }\n\n if (this.m_clearForces) {\n this.clearForces();\n }\n\n this.m_locked = false;\n\n this.publish('post-step', timeStep);\n }\n\n /**\n * @internal\n * Call this method to find new contacts.\n */\n findNewContacts(): void {\n this.m_broadPhase.updatePairs(\n (proxyA: FixtureProxy, proxyB: FixtureProxy) => this.createContact(proxyA, proxyB)\n );\n }\n\n /**\n * @internal\n * Callback for broad-phase.\n */\n createContact(proxyA: FixtureProxy, proxyB: FixtureProxy): void {\n const fixtureA = proxyA.fixture;\n const fixtureB = proxyB.fixture;\n\n const indexA = proxyA.childIndex;\n const indexB = proxyB.childIndex;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Are the fixtures on the same body?\n if (bodyA == bodyB) {\n return;\n }\n\n // TODO_ERIN use a hash table to remove a potential bottleneck when both\n // bodies have a lot of contacts.\n // Does a contact already exist?\n let edge = bodyB.getContactList(); // ContactEdge\n while (edge) {\n if (edge.other == bodyA) {\n const fA = edge.contact.getFixtureA();\n const fB = edge.contact.getFixtureB();\n const iA = edge.contact.getChildIndexA();\n const iB = edge.contact.getChildIndexB();\n\n if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) {\n // A contact already exists.\n return;\n }\n\n if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) {\n // A contact already exists.\n return;\n }\n }\n\n edge = edge.next;\n }\n\n if (bodyB.shouldCollide(bodyA) == false) {\n return;\n }\n if (fixtureB.shouldCollide(fixtureA) == false) {\n return;\n }\n\n // Call the factory.\n const contact = Contact.create(fixtureA, indexA, fixtureB, indexB);\n if (contact == null) {\n return;\n }\n\n // Insert into the world.\n contact.m_prev = null;\n if (this.m_contactList != null) {\n contact.m_next = this.m_contactList;\n this.m_contactList.m_prev = contact;\n }\n this.m_contactList = contact;\n\n ++this.m_contactCount;\n }\n\n /**\n * @internal\n * Removes old non-overlapping contacts, applies filters and updates contacts.\n */\n updateContacts(): void {\n // Update awake contacts.\n let c;\n let next_c = this.m_contactList;\n while (c = next_c) {\n next_c = c.getNext();\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Is this contact flagged for filtering?\n if (c.m_filterFlag) {\n if (bodyB.shouldCollide(bodyA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n if (fixtureB.shouldCollide(fixtureA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n // Clear the filtering flag.\n c.m_filterFlag = false;\n }\n\n const activeA = bodyA.isAwake() && !bodyA.isStatic();\n const activeB = bodyB.isAwake() && !bodyB.isStatic();\n\n // At least one body must be awake and it must be dynamic or kinematic.\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const proxyIdA = fixtureA.m_proxies[indexA].proxyId;\n const proxyIdB = fixtureB.m_proxies[indexB].proxyId;\n const overlap = this.m_broadPhase.testOverlap(proxyIdA, proxyIdB);\n\n // Here we destroy contacts that cease to overlap in the broad-phase.\n if (overlap == false) {\n this.destroyContact(c);\n continue;\n }\n\n // The contact persists.\n c.update(this);\n }\n }\n\n /**\n * @internal\n */\n destroyContact(contact: Contact): void {\n Contact.destroy(contact, this);\n\n // Remove from the world.\n if (contact.m_prev) {\n contact.m_prev.m_next = contact.m_next;\n }\n if (contact.m_next) {\n contact.m_next.m_prev = contact.m_prev;\n }\n if (contact == this.m_contactList) {\n this.m_contactList = contact.m_next;\n }\n\n --this.m_contactCount;\n }\n\n\n /**\n * Called when two fixtures begin to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'begin-contact', listener: (contact: Contact) => void): World;\n /**\n * Called when two fixtures cease to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'end-contact', listener: (contact: Contact) => void): World;\n /**\n * This is called after a contact is updated. This allows you to inspect a\n * contact before it goes to the solver. If you are careful, you can modify the\n * contact manifold (e.g. disable contact). A copy of the old manifold is\n * provided so that you can detect changes. Note: this is called only for awake\n * bodies. Note: this is called even when the number of contact points is zero.\n * Note: this is not called for sensors. Note: if you set the number of contact\n * points to zero, you will not get an endContact callback. However, you may get\n * a beginContact callback the next step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n /**\n * This lets you inspect a contact after the solver is finished. This is useful\n * for inspecting impulses. Note: the contact manifold does not include time of\n * impact impulses, which can be arbitrarily large if the sub-step is small.\n * Hence the impulse is provided explicitly in a separate data structure. Note:\n * this is only called for contacts that are touching, solid, and awake.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n /** Listener is called whenever a body is removed. */\n on(name: 'remove-body', listener: (body: Body) => void): World;\n /** Listener is called whenever a joint is removed implicitly or explicitly. */\n on(name: 'remove-joint', listener: (joint: Joint) => void): World;\n /** Listener is called whenever a fixture is removed implicitly or explicitly. */\n on(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Register an event listener.\n */\n // tslint:disable-next-line:typedef\n on(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n if (!this._listeners) {\n this._listeners = {};\n }\n if (!this._listeners[name]) {\n this._listeners[name] = [];\n }\n this._listeners[name].push(listener);\n return this;\n }\n\n off(name: 'begin-contact', listener: (contact: Contact) => void): World;\n off(name: 'end-contact', listener: (contact: Contact) => void): World;\n off(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n off(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n off(name: 'remove-body', listener: (body: Body) => void): World;\n off(name: 'remove-joint', listener: (joint: Joint) => void): World;\n off(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Remove an event listener.\n */\n // tslint:disable-next-line:typedef\n off(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return this;\n }\n const index = listeners.indexOf(listener);\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n publish(name: string, arg1?: any, arg2?: any, arg3?: any): number {\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return 0;\n }\n for (let l = 0; l < listeners.length; l++) {\n listeners[l].call(this, arg1, arg2, arg3);\n }\n return listeners.length;\n }\n\n /**\n * @internal\n */\n beginContact(contact: Contact): void {\n this.publish('begin-contact', contact);\n }\n\n /**\n * @internal\n */\n endContact(contact: Contact): void {\n this.publish('end-contact', contact);\n }\n\n /**\n * @internal\n */\n preSolve(contact: Contact, oldManifold: Manifold): void {\n this.publish('pre-solve', contact, oldManifold);\n }\n\n /**\n * @internal\n */\n postSolve(contact: Contact, impulse: ContactImpulse): void {\n this.publish('post-solve', contact, impulse);\n }\n\n /**\n * Joints and fixtures are destroyed when their associated body is destroyed.\n * Register a destruction listener so that you may nullify references to these\n * joints and shapes.\n *\n * `function(object)` is called when any joint or fixture is about to\n * be destroyed due to the destruction of one of its attached or parent bodies.\n */\n\n /**\n * Register a contact filter to provide specific control over collision.\n * Otherwise the default filter is used (defaultFilter). The listener is owned\n * by you and must remain in scope.\n *\n * Moved to Fixture.\n */\n}","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class Vec3 {\n x: number;\n y: number;\n z: number;\n\n constructor(x: number, y: number, z: number);\n constructor(obj: { x: number, y: number, z: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?, z?) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Vec3)) {\n return new Vec3(x, y, z);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n this.z = x.z;\n } else {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n _ASSERT && Vec3.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y,\n z: this.z\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = data.x;\n obj.y = data.y;\n obj.z = data.z;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number, z: number): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = x;\n obj.y = y;\n obj.z = z;\n return obj;\n }\n\n static zero(): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = 0;\n obj.y = 0;\n obj.z = 0;\n return obj;\n }\n\n static clone(v: Vec3): Vec3 {\n _ASSERT && Vec3.assert(v);\n return Vec3.neo(v.x, v.y, v.z);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y) && Math.isFinite(obj.z);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Vec3.isValid(o), 'Invalid Vec3!', o);\n }\n\n setZero(): Vec3 {\n this.x = 0.0;\n this.y = 0.0;\n this.z = 0.0;\n return this;\n }\n\n set(x: number, y: number, z: number): Vec3 {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n\n add(w: Vec3): Vec3 {\n this.x += w.x;\n this.y += w.y;\n this.z += w.z;\n return this;\n }\n\n sub(w: Vec3): Vec3 {\n this.x -= w.x;\n this.y -= w.y;\n this.z -= w.z;\n return this;\n }\n\n mul(m: number): Vec3 {\n this.x *= m;\n this.y *= m;\n this.z *= m;\n return this;\n }\n\n static areEqual(v: Vec3, w: Vec3): boolean {\n _ASSERT && Vec3.assert(v);\n _ASSERT && Vec3.assert(w);\n return v === w ||\n typeof v === 'object' && v !== null &&\n typeof w === 'object' && w !== null &&\n v.x === w.x && v.y === w.y && v.z === w.z;\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec3, w: Vec3): number {\n return v.x * w.x + v.y * w.y + v.z * w.z;\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static cross(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(\n v.y * w.z - v.z * w.y,\n v.z * w.x - v.x * w.z,\n v.x * w.y - v.y * w.x\n );\n }\n\n static add(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x + w.x, v.y + w.y, v.z + w.z);\n }\n\n static sub(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x - w.x, v.y - w.y, v.z - w.z);\n }\n\n static mul(v: Vec3, m: number): Vec3 {\n return new Vec3(m * v.x, m * v.y, m * v.z);\n }\n\n neg(): Vec3 {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n }\n\n static neg(v: Vec3): Vec3 {\n return new Vec3(-v.x, -v.y, -v.z);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { AABB, RayCastInput, RayCastOutput } from '../AABB';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A line segment (edge) shape. These can be connected in chains or loops to\n * other edge shapes. The connectivity information is used to ensure correct\n * contact normals.\n */\nexport class EdgeShape extends Shape {\n static TYPE = 'edge' as const;\n m_type: 'edge';\n\n m_radius: number;\n\n // These are the edge vertices\n m_vertex1: Vec2;\n m_vertex2: Vec2;\n\n // Optional adjacent vertices. These are used for smooth collision.\n // Used by chain shape.\n m_vertex0: Vec2;\n m_vertex3: Vec2;\n m_hasVertex0: boolean;\n m_hasVertex3: boolean;\n\n constructor(v1?: Vec2Value, v2?: Vec2Value) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof EdgeShape)) {\n return new EdgeShape(v1, v2);\n }\n\n super();\n\n this.m_type = EdgeShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n\n this.m_vertex1 = v1 ? Vec2.clone(v1) : Vec2.zero();\n this.m_vertex2 = v2 ? Vec2.clone(v2) : Vec2.zero();\n\n this.m_vertex0 = Vec2.zero();\n this.m_vertex3 = Vec2.zero();\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertex1: this.m_vertex1,\n vertex2: this.m_vertex2,\n\n vertex0: this.m_vertex0,\n vertex3: this.m_vertex3,\n hasVertex0: this.m_hasVertex0,\n hasVertex3: this.m_hasVertex3,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): EdgeShape {\n const shape = new EdgeShape(data.vertex1, data.vertex2);\n if (shape.m_hasVertex0) {\n shape.setPrevVertex(data.vertex0);\n }\n if (shape.m_hasVertex3) {\n shape.setNextVertex(data.vertex3);\n }\n return shape;\n }\n\n /** @internal */\n _reset(): void {\n // noop\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getType(): 'edge' {\n return this.m_type;\n }\n\n /** @internal @deprecated */\n setNext(v?: Vec2): EdgeShape {\n return this.setNextVertex(v);\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n setNextVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex3.setVec2(v);\n this.m_hasVertex3 = true;\n } else {\n this.m_vertex3.setZero();\n this.m_hasVertex3 = false;\n }\n return this;\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n getNextVertex(): Vec2 {\n return this.m_vertex3;\n }\n\n /** @internal @deprecated */\n setPrev(v?: Vec2): EdgeShape {\n return this.setPrevVertex(v);\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n setPrevVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex0.setVec2(v);\n this.m_hasVertex0 = true;\n } else {\n this.m_vertex0.setZero();\n this.m_hasVertex0 = false;\n }\n return this;\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n getPrevVertex(): Vec2 {\n return this.m_vertex0;\n }\n\n /**\n * Set this as an isolated edge.\n */\n _set(v1: Vec2, v2: Vec2): EdgeShape {\n this.m_vertex1.setVec2(v1);\n this.m_vertex2.setVec2(v2);\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): EdgeShape {\n const clone = new EdgeShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_vertex1.setVec2(this.m_vertex1);\n clone.m_vertex2.setVec2(this.m_vertex2);\n clone.m_vertex0.setVec2(this.m_vertex0);\n clone.m_vertex3.setVec2(this.m_vertex3);\n clone.m_hasVertex0 = this.m_hasVertex0;\n clone.m_hasVertex3 = this.m_hasVertex3;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // p = p1 + t * d\n // v = v1 + s * e\n // p1 + t * d = v1 + s * e\n // s * e - t * d = p1 - v1\n\n // NOT_USED(childIndex);\n\n // Put the ray into the edge's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n const v1 = this.m_vertex1;\n const v2 = this.m_vertex2;\n const e = Vec2.sub(v2, v1);\n const normal = Vec2.neo(e.y, -e.x);\n normal.normalize();\n\n // q = p1 + t * d\n // dot(normal, q - v1) = 0\n // dot(normal, p1 - v1) + t * dot(normal, d) = 0\n const numerator = Vec2.dot(normal, Vec2.sub(v1, p1));\n const denominator = Vec2.dot(normal, d);\n\n if (denominator == 0.0) {\n return false;\n }\n\n const t = numerator / denominator;\n if (t < 0.0 || input.maxFraction < t) {\n return false;\n }\n\n const q = Vec2.add(p1, Vec2.mulNumVec2(t, d));\n\n // q = v1 + s * r\n // s = dot(q - v1, r) / dot(r, r)\n const r = Vec2.sub(v2, v1);\n const rr = Vec2.dot(r, r);\n if (rr == 0.0) {\n return false;\n }\n\n const s = Vec2.dot(Vec2.sub(q, v1), r) / rr;\n if (s < 0.0 || 1.0 < s) {\n return false;\n }\n\n output.fraction = t;\n if (numerator > 0.0) {\n output.normal = Rot.mulVec2(xf.q, normal).neg();\n } else {\n output.normal = Rot.mulVec2(xf.q, normal);\n }\n return true;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const v1 = Transform.mulVec2(xf, this.m_vertex1);\n const v2 = Transform.mulVec2(xf, this.m_vertex2);\n\n aabb.combinePoints(v1, v2);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center.setCombine(0.5, this.m_vertex1, 0.5, this.m_vertex2);\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_vertex1);\n proxy.m_vertices.push(this.m_vertex2);\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n}\n\nexport const Edge = EdgeShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport { Transform } from '../../common/Transform';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\nimport { EdgeShape } from './EdgeShape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A chain shape is a free form sequence of line segments. The chain has\n * two-sided collision, so you can use inside and outside collision. Therefore,\n * you may use any winding order. Connectivity information is used to create\n * smooth collisions.\n *\n * WARNING: The chain will not collide properly if there are self-intersections.\n */\nexport class ChainShape extends Shape {\n static TYPE = 'chain' as const;\n m_type: 'chain';\n\n m_radius: number;\n\n m_vertices: Vec2[];\n m_count: number;\n m_prevVertex: Vec2 | null;\n m_nextVertex: Vec2 | null;\n m_hasPrevVertex: boolean;\n m_hasNextVertex: boolean;\n\n m_isLoop: boolean;\n\n constructor(vertices?: Vec2Value[], loop?: boolean) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof ChainShape)) {\n return new ChainShape(vertices, loop);\n }\n\n super();\n\n this.m_type = ChainShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_vertices = [];\n this.m_count = 0;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n\n this.m_isLoop = !!loop;\n\n if (vertices && vertices.length) {\n if (loop) {\n this._createLoop(vertices);\n } else {\n this._createChain(vertices);\n }\n }\n }\n\n /** @internal */\n _serialize(): object {\n const data = {\n type: this.m_type,\n vertices: this.m_vertices,\n isLoop: this.m_isLoop,\n hasPrevVertex: this.m_hasPrevVertex,\n hasNextVertex: this.m_hasNextVertex,\n prevVertex: null as Vec2 | null,\n nextVertex: null as Vec2 | null,\n };\n if (this.m_prevVertex) {\n data.prevVertex = this.m_prevVertex;\n }\n if (this.m_nextVertex) {\n data.nextVertex = this.m_nextVertex;\n }\n return data;\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): ChainShape {\n const vertices: Vec2[] = [];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n const shape = new ChainShape(vertices, data.isLoop);\n if (data.prevVertex) {\n shape.setPrevVertex(data.prevVertex);\n }\n if (data.nextVertex) {\n shape.setNextVertex(data.nextVertex);\n }\n return shape;\n }\n\n // clear() {\n // this.m_vertices.length = 0;\n // this.m_count = 0;\n // }\n\n getType(): 'chain' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n /**\n * @internal\n * Create a loop. This automatically adjusts connectivity.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createLoop(vertices: Vec2Value[]): ChainShape {\n _ASSERT && console.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && console.assert(vertices.length >= 3);\n for (let i = 1; i < vertices.length; ++i) {\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n // If the code crashes here, it means your vertices are too close together.\n _ASSERT && console.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_vertices = [];\n this.m_count = vertices.length + 1;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n this.m_vertices[vertices.length] = Vec2.clone(vertices[0]);\n\n this.m_prevVertex = this.m_vertices[this.m_count - 2];\n this.m_nextVertex = this.m_vertices[1];\n this.m_hasPrevVertex = true;\n this.m_hasNextVertex = true;\n return this;\n }\n\n /**\n * @internal\n * Create a chain with isolated end vertices.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createChain(vertices: Vec2Value[]): ChainShape {\n _ASSERT && console.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && console.assert(vertices.length >= 2);\n for (let i = 1; i < vertices.length; ++i) {\n // If the code crashes here, it means your vertices are too close together.\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n _ASSERT && console.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_count = vertices.length;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n return this;\n }\n\n /** @internal */\n _reset(): void {\n if (this.m_isLoop) {\n this._createLoop(this.m_vertices);\n } else {\n this._createChain(this.m_vertices);\n }\n }\n\n /**\n * Establish connectivity to a vertex that precedes the first vertex. Don't call\n * this for loops.\n */\n setPrevVertex(prevVertex: Vec2): void {\n this.m_prevVertex = prevVertex;\n this.m_hasPrevVertex = true;\n }\n\n getPrevVertex(): Vec2 {\n return this.m_prevVertex;\n }\n\n /**\n * Establish connectivity to a vertex that follows the last vertex. Don't call\n * this for loops.\n */\n setNextVertex(nextVertex: Vec2): void {\n this.m_nextVertex = nextVertex;\n this.m_hasNextVertex = true;\n }\n\n getNextVertex(): Vec2 {\n return this.m_nextVertex;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): ChainShape {\n const clone = new ChainShape();\n clone._createChain(this.m_vertices);\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_prevVertex = this.m_prevVertex;\n clone.m_nextVertex = this.m_nextVertex;\n clone.m_hasPrevVertex = this.m_hasPrevVertex;\n clone.m_hasNextVertex = this.m_hasNextVertex;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): number {\n // edge count = vertex count - 1\n return this.m_count - 1;\n }\n\n // Get a child edge.\n getChildEdge(edge: EdgeShape, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count - 1);\n edge.m_type = EdgeShape.TYPE;\n edge.m_radius = this.m_radius;\n\n edge.m_vertex1 = this.m_vertices[childIndex];\n edge.m_vertex2 = this.m_vertices[childIndex + 1];\n\n if (childIndex > 0) {\n edge.m_vertex0 = this.m_vertices[childIndex - 1];\n edge.m_hasVertex0 = true;\n } else {\n edge.m_vertex0 = this.m_prevVertex;\n edge.m_hasVertex0 = this.m_hasPrevVertex;\n }\n\n if (childIndex < this.m_count - 2) {\n edge.m_vertex3 = this.m_vertices[childIndex + 2];\n edge.m_hasVertex3 = true;\n } else {\n edge.m_vertex3 = this.m_nextVertex;\n edge.m_hasVertex3 = this.m_hasNextVertex;\n }\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index <= this.m_count);\n if (index < this.m_count) {\n return this.m_vertices[index];\n } else {\n return this.m_vertices[0];\n }\n }\n\n isLoop(): boolean {\n return this.m_isLoop;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * This always return false.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n\n const edgeShape = new EdgeShape(this.getVertex(childIndex), this.getVertex(childIndex + 1));\n return edgeShape.rayCast(output, input, xf, 0);\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n\n const v1 = Transform.mulVec2(xf, this.getVertex(childIndex));\n const v2 = Transform.mulVec2(xf, this.getVertex(childIndex + 1));\n\n aabb.combinePoints(v1, v2);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * Chains have zero mass.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center = Vec2.zero();\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n proxy.m_buffer[0] = this.getVertex(childIndex);\n proxy.m_buffer[1] = this.getVertex(childIndex + 1);\n proxy.m_vertices = proxy.m_buffer;\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n}\n\nexport const Chain = ChainShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A convex polygon. It is assumed that the interior of the polygon is to the\n * left of each edge. Polygons have a maximum number of vertices equal to\n * Settings.maxPolygonVertices. In most cases you should not need many vertices\n * for a convex polygon. extends Shape\n */\nexport class PolygonShape extends Shape {\n static TYPE = 'polygon' as const;\n m_type: 'polygon';\n\n m_centroid: Vec2;\n m_vertices: Vec2[]; // [Settings.maxPolygonVertices]\n m_normals: Vec2[]; // [Settings.maxPolygonVertices]\n m_count: number;\n m_radius: number;\n\n // @ts-ignore\n constructor(vertices?: Vec2Value[]) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PolygonShape)) {\n return new PolygonShape(vertices);\n }\n\n super();\n\n this.m_type = PolygonShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_centroid = Vec2.zero();\n this.m_vertices = [];\n this.m_normals = [];\n this.m_count = 0;\n\n if (vertices && vertices.length) {\n this._set(vertices);\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertices: this.m_vertices,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): PolygonShape {\n const vertices: Vec2[] = [];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n\n const shape = new PolygonShape(vertices);\n return shape;\n }\n\n getType(): 'polygon' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): PolygonShape {\n const clone = new PolygonShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_count = this.m_count;\n clone.m_centroid.setVec2(this.m_centroid);\n for (let i = 0; i < this.m_count; i++) {\n clone.m_vertices.push(this.m_vertices[i].clone());\n }\n for (let i = 0; i < this.m_normals.length; i++) {\n clone.m_normals.push(this.m_normals[i].clone());\n }\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /** @internal */\n _reset(): void {\n this._set(this.m_vertices);\n }\n\n /**\n * @internal\n *\n * Create a convex hull from the given array of local points. The count must be\n * in the range [3, Settings.maxPolygonVertices].\n *\n * Warning: the points may be re-ordered, even if they form a convex polygon\n * Warning: collinear points are handled but not removed. Collinear points may\n * lead to poor stacking behavior.\n */\n _set(vertices: Vec2Value[]): void {\n _ASSERT && console.assert(3 <= vertices.length && vertices.length <= Settings.maxPolygonVertices);\n if (vertices.length < 3) {\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n let n = Math.min(vertices.length, Settings.maxPolygonVertices);\n\n // Perform welding and copy vertices into local buffer.\n const ps: Vec2[] = []; // [Settings.maxPolygonVertices];\n for (let i = 0; i < n; ++i) {\n const v = vertices[i];\n\n let unique = true;\n for (let j = 0; j < ps.length; ++j) {\n if (Vec2.distanceSquared(v, ps[j]) < 0.25 * Settings.linearSlopSquared) {\n unique = false;\n break;\n }\n }\n\n if (unique) {\n ps.push(Vec2.clone(v));\n }\n }\n\n n = ps.length;\n if (n < 3) {\n // Polygon is degenerate.\n _ASSERT && console.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n // Create the convex hull using the Gift wrapping algorithm\n // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm\n\n // Find the right most point on the hull (in case of multiple points bottom most is used)\n let i0 = 0;\n let x0 = ps[0].x;\n for (let i = 1; i < n; ++i) {\n const x = ps[i].x;\n if (x > x0 || (x === x0 && ps[i].y < ps[i0].y)) {\n i0 = i;\n x0 = x;\n }\n }\n\n const hull = [] as number[]; // [Settings.maxPolygonVertices];\n let m = 0;\n let ih = i0;\n\n while (true) {\n hull[m] = ih;\n\n let ie = 0;\n for (let j = 1; j < n; ++j) {\n if (ie === ih) {\n ie = j;\n continue;\n }\n\n const r = Vec2.sub(ps[ie], ps[hull[m]]);\n const v = Vec2.sub(ps[j], ps[hull[m]]);\n const c = Vec2.crossVec2Vec2(r, v);\n // c < 0 means counter-clockwise wrapping, c > 0 means clockwise wrapping\n if (c < 0.0) {\n ie = j;\n }\n\n // Collinearity check\n if (c === 0.0 && v.lengthSquared() > r.lengthSquared()) {\n ie = j;\n }\n }\n\n ++m;\n ih = ie;\n\n if (ie === i0) {\n break;\n }\n }\n\n if (m < 3) {\n // Polygon is degenerate.\n _ASSERT && console.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n this.m_count = m;\n\n // Copy vertices.\n this.m_vertices = [];\n for (let i = 0; i < m; ++i) {\n this.m_vertices[i] = ps[hull[i]];\n }\n\n // Compute normals. Ensure the edges have non-zero length.\n for (let i = 0; i < m; ++i) {\n const i1 = i;\n const i2 = i + 1 < m ? i + 1 : 0;\n const edge = Vec2.sub(this.m_vertices[i2], this.m_vertices[i1]);\n _ASSERT && console.assert(edge.lengthSquared() > Math.EPSILON * Math.EPSILON);\n this.m_normals[i] = Vec2.crossVec2Num(edge, 1.0);\n this.m_normals[i].normalize();\n }\n\n // Compute the polygon centroid.\n this.m_centroid = ComputeCentroid(this.m_vertices, m);\n }\n\n /** @internal */\n _setAsBox(hx: number, hy: number, center?: Vec2Value, angle?: number): void {\n // start with right-bottom, counter-clockwise, as in Gift wrapping algorithm in PolygonShape._set()\n this.m_vertices[0] = Vec2.neo(hx, -hy);\n this.m_vertices[1] = Vec2.neo(hx, hy);\n this.m_vertices[2] = Vec2.neo(-hx, hy);\n this.m_vertices[3] = Vec2.neo(-hx, -hy);\n\n this.m_normals[0] = Vec2.neo(1.0, 0.0);\n this.m_normals[1] = Vec2.neo(0.0, 1.0);\n this.m_normals[2] = Vec2.neo(-1.0, 0.0);\n this.m_normals[3] = Vec2.neo(0.0, -1.0);\n\n this.m_count = 4;\n\n if (Vec2.isValid(center)) {\n angle = angle || 0;\n\n this.m_centroid.setVec2(center);\n\n const xf = Transform.identity();\n xf.p.setVec2(center);\n xf.q.setAngle(angle);\n\n // Transform vertices and normals.\n for (let i = 0; i < this.m_count; ++i) {\n this.m_vertices[i] = Transform.mulVec2(xf, this.m_vertices[i]);\n this.m_normals[i] = Rot.mulVec2(xf.q, this.m_normals[i]);\n }\n }\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): boolean {\n const pLocal = Rot.mulTVec2(xf.q, Vec2.sub(p, xf.p));\n\n for (let i = 0; i < this.m_count; ++i) {\n const dot = Vec2.dot(this.m_normals[i], Vec2.sub(pLocal, this.m_vertices[i]));\n if (dot > 0.0) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n\n // Put the ray into the polygon's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n let lower = 0.0;\n let upper = input.maxFraction;\n\n let index = -1;\n\n for (let i = 0; i < this.m_count; ++i) {\n // p = p1 + a * d\n // dot(normal, p - v) = 0\n // dot(normal, p1 - v) + a * dot(normal, d) = 0\n const numerator = Vec2.dot(this.m_normals[i], Vec2.sub(this.m_vertices[i], p1));\n const denominator = Vec2.dot(this.m_normals[i], d);\n\n if (denominator == 0.0) {\n if (numerator < 0.0) {\n return false;\n }\n } else {\n // Note: we want this predicate without division:\n // lower < numerator / denominator, where denominator < 0\n // Since denominator < 0, we have to flip the inequality:\n // lower < numerator / denominator <==> denominator * lower > numerator.\n if (denominator < 0.0 && numerator < lower * denominator) {\n // Increase lower.\n // The segment enters this half-space.\n lower = numerator / denominator;\n index = i;\n } else if (denominator > 0.0 && numerator < upper * denominator) {\n // Decrease upper.\n // The segment exits this half-space.\n upper = numerator / denominator;\n }\n }\n\n // The use of epsilon here causes the assert on lower to trip\n // in some cases. Apparently the use of epsilon was to make edge\n // shapes work, but now those are handled separately.\n // if (upper < lower - Math.EPSILON)\n if (upper < lower) {\n return false;\n }\n }\n\n _ASSERT && console.assert(0.0 <= lower && lower <= input.maxFraction);\n\n if (index >= 0) {\n output.fraction = lower;\n output.normal = Rot.mulVec2(xf.q, this.m_normals[index]);\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < this.m_count; ++i) {\n const v = Transform.mulVec2(xf, this.m_vertices[i]);\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, v.y);\n maxY = Math.max(maxY, v.y);\n }\n\n aabb.lowerBound.setNum(minX, minY);\n aabb.upperBound.setNum(maxX, maxY);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n // Polygon mass, centroid, and inertia.\n // Let rho be the polygon density in mass per unit area.\n // Then:\n // mass = rho * int(dA)\n // centroid.x = (1/mass) * rho * int(x * dA)\n // centroid.y = (1/mass) * rho * int(y * dA)\n // I = rho * int((x*x + y*y) * dA)\n //\n // We can compute these integrals by summing all the integrals\n // for each triangle of the polygon. To evaluate the integral\n // for a single triangle, we make a change of variables to\n // the (u,v) coordinates of the triangle:\n // x = x0 + e1x * u + e2x * v\n // y = y0 + e1y * u + e2y * v\n // where 0 <= u && 0 <= v && u + v <= 1.\n //\n // We integrate u from [0,1-v] and then v from [0,1].\n // We also need to use the Jacobian of the transformation:\n // D = cross(e1, e2)\n //\n // Simplification: triangle centroid = (1/3) * (p1 + p2 + p3)\n //\n // The rest of the derivation is handled by computer algebra.\n\n _ASSERT && console.assert(this.m_count >= 3);\n\n const center = Vec2.zero();\n let area = 0.0;\n let I = 0.0;\n\n // s is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const s = Vec2.zero();\n\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < this.m_count; ++i) {\n s.add(this.m_vertices[i]);\n }\n s.mul(1.0 / this.m_count);\n\n const k_inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < this.m_count; ++i) {\n // Triangle vertices.\n const e1 = Vec2.sub(this.m_vertices[i], s);\n const e2 = i + 1 < this.m_count ? Vec2.sub(this.m_vertices[i + 1], s) : Vec2 .sub(this.m_vertices[0], s);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n center.addCombine(triangleArea * k_inv3, e1, triangleArea * k_inv3, e2);\n\n const ex1 = e1.x;\n const ey1 = e1.y;\n const ex2 = e2.x;\n const ey2 = e2.y;\n\n const intx2 = ex1 * ex1 + ex2 * ex1 + ex2 * ex2;\n const inty2 = ey1 * ey1 + ey2 * ey1 + ey2 * ey2;\n\n I += (0.25 * k_inv3 * D) * (intx2 + inty2);\n }\n\n // Total mass\n massData.mass = density * area;\n\n // Center of mass\n _ASSERT && console.assert(area > Math.EPSILON);\n center.mul(1.0 / area);\n massData.center.setCombine(1, center, 1, s);\n\n // Inertia tensor relative to the local origin (point s).\n massData.I = density * I;\n\n // Shift to center of mass then to original body origin.\n massData.I += massData.mass * (Vec2.dot(massData.center, massData.center) - Vec2.dot(center, center));\n }\n\n /**\n * Validate convexity. This is a very time consuming operation.\n * @returns true if valid\n */\n validate(): boolean {\n for (let i = 0; i < this.m_count; ++i) {\n const i1 = i;\n const i2 = i < this.m_count - 1 ? i1 + 1 : 0;\n const p = this.m_vertices[i1];\n const e = Vec2.sub(this.m_vertices[i2], p);\n\n for (let j = 0; j < this.m_count; ++j) {\n if (j == i1 || j == i2) {\n continue;\n }\n\n const v = Vec2.sub(this.m_vertices[j], p);\n const c = Vec2.crossVec2Vec2(e, v);\n if (c < 0.0) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices = this.m_vertices;\n proxy.m_count = this.m_count;\n proxy.m_radius = this.m_radius;\n }\n}\n\nfunction ComputeCentroid(vs: Vec2[], count: number): Vec2 {\n _ASSERT && console.assert(count >= 3);\n\n const c = Vec2.zero();\n let area = 0.0;\n\n // pRef is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const pRef = Vec2.zero();\n if (false) {\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < count; ++i) {\n pRef.add(vs[i]);\n }\n pRef.mul(1.0 / count);\n }\n\n const inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < count; ++i) {\n // Triangle vertices.\n const p1 = pRef;\n const p2 = vs[i];\n const p3 = i + 1 < count ? vs[i + 1] : vs[0];\n\n const e1 = Vec2.sub(p2, p1);\n const e2 = Vec2.sub(p3, p1);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n c.addMul(triangleArea * inv3, p1);\n c.addMul(triangleArea * inv3, p2);\n c.addMul(triangleArea * inv3, p3);\n }\n\n // Centroid\n _ASSERT && console.assert(area > Math.EPSILON);\n c.mul(1.0 / area);\n return c;\n}\n\nexport const Polygon = PolygonShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { Vec2Value } from '../../common/Vec2';\nimport { PolygonShape } from './PolygonShape';\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A rectangle polygon which extend PolygonShape.\n */\nexport class BoxShape extends PolygonShape {\n static TYPE = 'polygon' as const;\n\n constructor(hx: number, hy: number, center?: Vec2Value, angle?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof BoxShape)) {\n return new BoxShape(hx, hy, center, angle);\n }\n\n super();\n\n this._setAsBox(hx, hy, center, angle);\n }\n}\n\nexport const Box = BoxShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Shape } from '../Shape';\nimport { AABB, RayCastInput, RayCastOutput } from '../AABB';\nimport { Transform } from '../../common/Transform';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class CircleShape extends Shape {\n static TYPE = 'circle' as const;\n m_type: 'circle';\n\n m_p: Vec2;\n m_radius: number;\n\n constructor(position: Vec2Value, radius?: number);\n constructor(radius?: number);\n // tslint:disable-next-line:typedef\n constructor(a, b?) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof CircleShape)) {\n return new CircleShape(a, b);\n }\n\n super();\n\n this.m_type = CircleShape.TYPE;\n this.m_p = Vec2.zero();\n this.m_radius = 1;\n\n if (typeof a === 'object' && Vec2.isValid(a)) {\n this.m_p.setVec2(a);\n\n if (typeof b === 'number') {\n this.m_radius = b;\n }\n\n } else if (typeof a === 'number') {\n this.m_radius = a;\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n p: this.m_p,\n radius: this.m_radius,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): CircleShape {\n return new CircleShape(data.p, data.radius);\n }\n\n /** @internal */\n _reset(): void {\n // noop\n }\n\n getType(): 'circle' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getCenter(): Vec2 {\n return this.m_p;\n }\n\n getVertex(index: 0): Vec2 {\n _ASSERT && console.assert(index == 0);\n return this.m_p;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): CircleShape {\n const clone = new CircleShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_p = this.m_p.clone();\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): boolean {\n const center = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const d = Vec2.sub(p, center);\n return Vec2.dot(d, d) <= this.m_radius * this.m_radius;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // Collision Detection in Interactive 3D Environments by Gino van den Bergen\n // From Section 3.1.2\n // x = s + a * r\n // norm(x) = radius\n\n const position = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const s = Vec2.sub(input.p1, position);\n const b = Vec2.dot(s, s) - this.m_radius * this.m_radius;\n\n // Solve quadratic equation.\n const r = Vec2.sub(input.p2, input.p1);\n const c = Vec2.dot(s, r);\n const rr = Vec2.dot(r, r);\n const sigma = c * c - rr * b;\n\n // Check for negative discriminant and short segment.\n if (sigma < 0.0 || rr < Math.EPSILON) {\n return false;\n }\n\n // Find the point of intersection of the line with the circle.\n let a = -(c + Math.sqrt(sigma));\n\n // Is the intersection point on the segment?\n if (0.0 <= a && a <= input.maxFraction * rr) {\n a /= rr;\n output.fraction = a;\n output.normal = Vec2.add(s, Vec2.mulNumVec2(a, r));\n output.normal.normalize();\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const p = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n aabb.lowerBound.setNum(p.x - this.m_radius, p.y - this.m_radius);\n aabb.upperBound.setNum(p.x + this.m_radius, p.y + this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n massData.mass = density * Math.PI * this.m_radius * this.m_radius;\n massData.center = this.m_p;\n // inertia about the local origin\n massData.I = massData.mass\n * (0.5 * this.m_radius * this.m_radius + Vec2.dot(this.m_p, this.m_p));\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_p);\n proxy.m_count = 1;\n proxy.m_radius = this.m_radius;\n }\n\n}\n\nexport const Circle = CircleShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. A value of 0 disables softness.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * Distance length.\n */\n length?: number;\n}\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointDef extends JointDef, DistanceJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0\n};\n\n/**\n * A distance joint constrains two points on two bodies to remain at a fixed\n * distance from each other. You can view this as a massless, rigid rod.\n *\n * @param anchorA Anchor A in global coordination.\n * @param anchorB Anchor B in global coordination.\n */\nexport class DistanceJoint extends Joint {\n static TYPE = 'distance-joint' as const;\n\n // Solver shared\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_length: number;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_gamma: number;\n /** @internal */ m_bias: number;\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: DistanceJointDef);\n constructor(def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2);\n constructor(def: DistanceJointDef, bodyA?: Body, bodyB?: Body, anchorA?: Vec2, anchorB?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof DistanceJoint)) {\n return new DistanceJoint(def, bodyA, bodyB, anchorA, anchorB);\n }\n\n // order of constructor arguments is changed in v0.2\n if (bodyB && anchorA && ('m_type' in anchorA) && ('x' in bodyB) && ('y' in bodyB)) {\n const temp = bodyB;\n bodyB = anchorA as any as Body;\n anchorA = temp as any as Vec2;\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = DistanceJoint.TYPE;\n\n // Solver shared\n this.m_localAnchorA = Vec2.clone(anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.zero());\n this.m_length = Math.isFinite(def.length) ? def.length :\n Vec2.distance(bodyA.getWorldPoint(this.m_localAnchorA), bodyB.getWorldPoint(this.m_localAnchorB));\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n this.m_impulse = 0.0;\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n\n // 1-D constrained system\n // m (v2 - v1) = lambda\n // v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass.\n // x2 = x1 + h * v2\n\n // 1-D mass-damper-spring system\n // m (v2 - v1) + h * d * v2 + h * k *\n\n // C = norm(p2 - p1) - L\n // u = (p2 - p1) / norm(p2 - p1)\n // Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1))\n // J = [-u -cross(r1, u) u cross(r2, u)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n length: this.m_length,\n\n impulse: this.m_impulse,\n gamma: this.m_gamma,\n bias: this.m_bias,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): DistanceJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new DistanceJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n length?: number,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.length > 0) {\n this.m_length = +def.length;\n } else if (def.length < 0) { // don't change length\n } else if (def.anchorA || def.anchorA || def.anchorA || def.anchorA) {\n this.m_length = Vec2.distance(\n this.m_bodyA.getWorldPoint(this.m_localAnchorA),\n this.m_bodyB.getWorldPoint(this.m_localAnchorB)\n );\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the natural length. Manipulating the length can lead to non-physical\n * behavior when the frequency is zero.\n */\n setLength(length: number): void {\n this.m_length = length;\n }\n\n /**\n * Get the natural length.\n */\n getLength(): number {\n return this.m_length;\n }\n\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n this.m_u = Vec2.sub(Vec2.add(cB, this.m_rB), Vec2.add(cA, this.m_rA));\n\n // Handle singularity.\n const length = this.m_u.length();\n if (length > Settings.linearSlop) {\n this.m_u.mul(1.0 / length);\n } else {\n this.m_u.setNum(0.0, 0.0);\n }\n\n const crAu = Vec2.crossVec2Vec2(this.m_rA, this.m_u);\n const crBu = Vec2.crossVec2Vec2(this.m_rB, this.m_u);\n let invMass = this.m_invMassA + this.m_invIA * crAu * crAu + this.m_invMassB\n + this.m_invIB * crBu * crBu;\n\n // Compute the effective mass matrix.\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (this.m_frequencyHz > 0.0) {\n const C = length - this.m_length;\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * this.m_mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = this.m_mass * omega * omega;\n\n // magic formulas\n const h = step.dt;\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invMass += this.m_gamma;\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n } else {\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n const Cdot = Vec2.dot(this.m_u, vpB) - Vec2.dot(this.m_u, vpA);\n\n const impulse = -this.m_mass\n * (Cdot + this.m_bias + this.m_gamma * this.m_impulse);\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u);\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n if (this.m_frequencyHz > 0.0) {\n // There is no position correction for soft distance constraints.\n return true;\n }\n\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA));\n\n const length = u.normalize();\n let C = length - this.m_length;\n C = Math\n .clamp(C, -Settings.maxLinearCorrection, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C;\n const P = Vec2.mulNumVec2(impulse, u);\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointOpt extends JointOpt {\n /**\n * The maximum friction force in N.\n */\n maxForce?: number;\n /**\n * The maximum friction torque in N-m.\n */\n maxTorque?: number;\n}\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointDef extends JointDef, FrictionJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n maxTorque : 0.0,\n};\n\n/**\n * Friction joint. This is used for top-down friction. It provides 2D\n * translational friction and angular friction.\n *\n * @param anchor Anchor in global coordination.\n */\nexport class FrictionJoint extends Joint {\n static TYPE = 'friction-joint' as const;\n\n /** @internal */ m_type: 'friction-joint';\n\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n // Solver shared\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: FrictionJointDef);\n constructor(def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: FrictionJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof FrictionJoint)) {\n return new FrictionJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = FrictionJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n\n // Solver shared\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): FrictionJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new FrictionJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && console.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && console.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y\n * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x\n * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt; // float\n\n // Solve angular friction\n {\n const Cdot = wB - wA; // float\n let impulse = -this.m_angularMass * Cdot; // float\n\n const oldImpulse = this.m_angularImpulse; // float\n const maxImpulse = h * this.m_maxTorque; // float\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)), Vec2.add(vA,\n Vec2.crossNumVec2(wA, this.m_rA))); // Vec2\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); // Vec2\n const oldImpulse = this.m_linearImpulse; // Vec2\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce; // float\n\n if (this.m_linearImpulse.lengthSquared() > maxImpulse * maxImpulse) {\n this.m_linearImpulse.normalize();\n this.m_linearImpulse.mul(maxImpulse);\n }\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from './Vec2';\nimport { Vec3 } from './Vec3';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 3-by-3 matrix. Stored in column-major order.\n */\nexport class Mat33 {\n ex: Vec3;\n ey: Vec3;\n ez: Vec3;\n\n constructor(a: Vec3, b: Vec3, c: Vec3);\n constructor();\n constructor(a?: Vec3, b?: Vec3, c?: Vec3) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec3.clone(a);\n this.ey = Vec3.clone(b);\n this.ez = Vec3.clone(c);\n } else {\n this.ex = Vec3.zero();\n this.ey = Vec3.zero();\n this.ez = Vec3.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec3.isValid(obj.ex) && Vec3.isValid(obj.ey) && Vec3.isValid(obj.ez);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Mat33.isValid(o), 'Invalid Mat33!', o);\n }\n\n /**\n * Set this matrix to all zeros.\n */\n setZero(): Mat33 {\n this.ex.setZero();\n this.ey.setZero();\n this.ez.setZero();\n return this;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve33(v: Vec3): Vec3 {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = new Vec3();\n r.x = det * Vec3.dot(v, Vec3.cross(this.ey, this.ez));\n r.y = det * Vec3.dot(this.ex, Vec3.cross(v, this.ez));\n r.z = det * Vec3.dot(this.ex, Vec3.cross(this.ey, v));\n return r;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix\n * equation.\n */\n solve22(v: Vec2): Vec2 {\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a21 = this.ex.y;\n const a22 = this.ey.y;\n let det = a11 * a22 - a12 * a21;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = Vec2.zero();\n r.x = det * (a22 * v.x - a12 * v.y);\n r.y = det * (a11 * v.y - a21 * v.x);\n return r;\n }\n\n /**\n * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if\n * singular.\n */\n getInverse22(M: Mat33): void {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n M.ex.x = det * d;\n M.ey.x = -det * b;\n M.ex.z = 0.0;\n M.ex.y = -det * c;\n M.ey.y = det * a;\n M.ey.z = 0.0;\n M.ez.x = 0.0;\n M.ez.y = 0.0;\n M.ez.z = 0.0;\n }\n\n /**\n * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix\n * if singular.\n */\n getSymInverse33(M: Mat33): void {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a13 = this.ez.x;\n const a22 = this.ey.y;\n const a23 = this.ez.y;\n const a33 = this.ez.z;\n\n M.ex.x = det * (a22 * a33 - a23 * a23);\n M.ex.y = det * (a13 * a23 - a12 * a33);\n M.ex.z = det * (a12 * a23 - a13 * a22);\n\n M.ey.x = M.ex.y;\n M.ey.y = det * (a11 * a33 - a13 * a13);\n M.ey.z = det * (a13 * a12 - a11 * a23);\n\n M.ez.x = M.ex.z;\n M.ez.y = M.ey.z;\n M.ez.z = det * (a11 * a22 - a12 * a12);\n }\n\n /**\n * Multiply a matrix times a vector.\n */\n static mul(a: Mat33, b: Vec2): Vec2;\n static mul(a: Mat33, b: Vec3): Vec3;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n _ASSERT && Mat33.assert(a);\n if (b && 'z' in b && 'y' in b && 'x' in b) {\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n\n } else if (b && 'y' in b && 'x' in b) {\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulVec3(a: Mat33, b: Vec3): Vec3 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n }\n\n static mulVec2(a: Mat33, b: Vec2): Vec2 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n static add(a: Mat33, b: Mat33): Mat33 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Mat33.assert(b);\n return new Mat33(\n Vec3.add(a.ex, b.ex),\n Vec3.add(a.ey, b.ey),\n Vec3.add(a.ez, b.ez)\n );\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat22 } from '../../common/Mat22';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointOpt extends JointOpt {\n /**\n * The lower angle for the joint limit (radians).\n */\n lowerAngle?: number;\n /**\n * The upper angle for the joint limit (radians).\n */\n upperAngle?: number;\n /**\n * The maximum motor torque used to achieve the desired motor speed. Usually\n * in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed. Usually in radians per second.\n */\n motorSpeed?: number;\n /**\n * A flag to enable joint limits.\n */\n enableLimit?: boolean;\n /**\n * A flag to enable the joint motor.\n */\n enableMotor?: boolean;\n}\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointDef extends JointDef, RevoluteJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n lowerAngle : 0.0,\n upperAngle : 0.0,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n enableLimit : false,\n enableMotor : false\n};\n\n/**\n * A revolute joint constrains two bodies to share a common point while they are\n * free to rotate about the point. The relative rotation about the shared point\n * is the joint angle. You can limit the relative rotation with a joint limit\n * that specifies a lower and upper angle. You can use a motor to drive the\n * relative rotation about the shared point. A maximum motor torque is provided\n * so that infinite forces are not generated.\n */\nexport class RevoluteJoint extends Joint {\n static TYPE = 'revolute-joint' as const;\n\n /** @internal */ m_type: 'revolute-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerAngle: number;\n /** @internal */ m_upperAngle: number;\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n // effective mass for point-to-point constraint.\n /** @internal */ m_mass: Mat33 = new Mat33();\n // effective mass for motor/limit angular constraint.\n /** @internal */ m_motorMass: number;\n /** @internal */ m_limitState: number = inactiveLimit; // TODO enum\n\n constructor(def: RevoluteJointDef);\n constructor(def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n // @ts-ignore\n constructor(def: RevoluteJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof RevoluteJoint)) {\n return new RevoluteJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RevoluteJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorImpulse = 0.0;\n\n this.m_lowerAngle = def.lowerAngle;\n this.m_upperAngle = def.upperAngle;\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Motor constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerAngle: this.m_lowerAngle,\n upperAngle: this.m_upperAngle,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any):RevoluteJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RevoluteJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle in radians.\n */\n getJointAngle(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle speed in radians per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_angularVelocity - bA.m_angularVelocity;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Get the current motor torque given the inverse time step. Unit is N*m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set the motor speed in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set the maximum motor torque, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit in radians.\n */\n getLowerLimit(): number {\n return this.m_lowerAngle;\n }\n\n /**\n * Get the upper joint limit in radians.\n */\n getUpperLimit(): number {\n return this.m_upperAngle;\n }\n\n /**\n * Set the joint limits in radians.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && console.assert(lower <= upper);\n\n if (lower != this.m_lowerAngle || upper != this.m_upperAngle) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_impulse.z = 0.0;\n this.m_lowerAngle = lower;\n this.m_upperAngle = upper;\n }\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force given the inverse time step. Unit is N.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque due to the joint limit given the inverse time step.\n * Unit is N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n this.m_mass.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y\n * this.m_rB.y * iB;\n this.m_mass.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y\n * this.m_rB.x * iB;\n this.m_mass.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n this.m_mass.ex.y = this.m_mass.ey.x;\n this.m_mass.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x\n * this.m_rB.x * iB;\n this.m_mass.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n this.m_mass.ex.z = this.m_mass.ez.x;\n this.m_mass.ey.z = this.m_mass.ez.y;\n this.m_mass.ez.z = iA + iB;\n\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n\n if (this.m_enableMotor == false || fixedRotation) {\n this.m_motorImpulse = 0.0;\n }\n\n if (this.m_enableLimit && fixedRotation == false) {\n const jointAngle = aB - aA - this.m_referenceAngle; // float\n\n if (Math.abs(this.m_upperAngle - this.m_lowerAngle) < 2.0 * Settings.angularSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointAngle <= this.m_lowerAngle) {\n if (this.m_limitState != atLowerLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atLowerLimit;\n\n } else if (jointAngle >= this.m_upperAngle) {\n if (this.m_limitState != atUpperLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atUpperLimit;\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_motorImpulse + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_motorImpulse + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n // Solve motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits\n && fixedRotation == false) {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const impulse = Vec3.neg(this.m_mass.solve33(Cdot)); // Vec3\n\n if (this.m_limitState == equalLimits) {\n this.m_impulse.add(impulse);\n\n } else if (this.m_limitState == atLowerLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse < 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n\n } else if (this.m_limitState == atUpperLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse > 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n\n } else {\n // Solve point-to-point constraint\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const impulse = this.m_mass.solve22(Vec2.neg(Cdot)); // Vec2\n\n this.m_impulse.x += impulse.x;\n this.m_impulse.y += impulse.y;\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n let angularError = 0.0; // float\n let positionError = 0.0; // float\n\n const fixedRotation = (this.m_invIA + this.m_invIB == 0.0); // bool\n\n // Solve angular limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const angle = aB - aA - this.m_referenceAngle; // float\n let limitImpulse = 0.0; // float\n\n if (this.m_limitState == equalLimits) {\n // Prevent large angular corrections\n const C = Math.clamp(angle - this.m_lowerAngle,\n -Settings.maxAngularCorrection, Settings.maxAngularCorrection); // float\n limitImpulse = -this.m_motorMass * C;\n angularError = Math.abs(C);\n\n } else if (this.m_limitState == atLowerLimit) {\n let C = angle - this.m_lowerAngle; // float\n angularError = -C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C + Settings.angularSlop, -Settings.maxAngularCorrection,\n 0.0);\n limitImpulse = -this.m_motorMass * C;\n\n } else if (this.m_limitState == atUpperLimit) {\n let C = angle - this.m_upperAngle; // float\n angularError = C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C - Settings.angularSlop, 0.0,\n Settings.maxAngularCorrection);\n limitImpulse = -this.m_motorMass * C;\n }\n\n aA -= this.m_invIA * limitImpulse;\n aB += this.m_invIB * limitImpulse;\n }\n\n // Solve point-to-point constraint.\n {\n qA.setAngle(aA);\n qB.setAngle(aB);\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n\n const C = Vec2.zero();\n C.addCombine(1, cB, 1, rB);\n C.subCombine(1, cA, 1, rA);\n positionError = C.length();\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y;\n K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x;\n\n const impulse = Vec2.neg(K.solve(C)); // Vec2\n\n cA.subMul(mA, impulse);\n aA -= iA * Vec2.crossVec2Vec2(rA, impulse);\n\n cB.addMul(mB, impulse);\n aB += iB * Vec2.crossVec2Vec2(rB, impulse);\n }\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat22 } from '../../common/Mat22';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointOpt extends JointOpt {\n /**\n * Enable/disable the joint limit.\n */\n enableLimit?: boolean;\n /**\n * The lower translation limit, usually in meters.\n */\n lowerTranslation?: number;\n /**\n * The upper translation limit, usually in meters.\n */\n upperTranslation?: number;\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorForce?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n}\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointDef extends JointDef, PrismaticJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation unit axis in bodyA.\n */\n localAxisA: Vec2;\n /**\n * referenceAngle The constrained angle between the bodies:\n * bodyB_angle - bodyA_angle.\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n enableLimit : false,\n lowerTranslation : 0.0,\n upperTranslation : 0.0,\n enableMotor : false,\n maxMotorForce : 0.0,\n motorSpeed : 0.0\n};\n\n/**\n * A prismatic joint. This joint provides one degree of freedom: translation\n * along an axis fixed in bodyA. Relative rotation is prevented. You can use a\n * joint limit to restrict the range of motion and a joint motor to drive the\n * motion or to model joint friction.\n */\nexport class PrismaticJoint extends Joint {\n static TYPE = 'prismatic-joint' as const;\n\n /** @internal */ m_type: 'prismatic-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerTranslation: number;\n /** @internal */ m_upperTranslation: number;\n /** @internal */ m_maxMotorForce: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n /** @internal */ m_limitState: number; // TODO enum\n /** @internal */ m_axis: Vec2;\n /** @internal */ m_perp: Vec2;\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_s1: number;\n /** @internal */ m_s2: number;\n /** @internal */ m_a1: number;\n /** @internal */ m_a2: number;\n /** @internal */ m_K: Mat33;\n\n constructor(def: PrismaticJointDef);\n constructor(def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n constructor(def: PrismaticJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PrismaticJoint)) {\n return new PrismaticJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PrismaticJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || Vec2.neo(1.0, 0.0));\n this.m_localXAxisA.normalize();\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n\n this.m_lowerTranslation = def.lowerTranslation;\n this.m_upperTranslation = def.upperTranslation;\n this.m_maxMotorForce = def.maxMotorForce;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n this.m_limitState = inactiveLimit;\n\n this.m_axis = Vec2.zero();\n this.m_perp = Vec2.zero();\n\n this.m_K = new Mat33();\n\n // Linear constraint (point-to-line)\n // d = p2 - p1 = x2 + r2 - x1 - r1\n // C = dot(perp, d)\n // Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 -\n // cross(w1, r1))\n // = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) +\n // dot(cross(r2, perp), v2)\n // J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)]\n //\n // Angular constraint\n // C = a2 - a1 + a_initial\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n //\n // K = J * invM * JT\n //\n // J = [-a -s1 a s2]\n // [0 -1 0 1]\n // a = perp\n // s1 = cross(d + r1, a) = cross(p2 - x1, a)\n // s2 = cross(r2, a) = cross(p2 - x2, a)\n\n // Motor/Limit linear constraint\n // C = dot(ax1, d)\n // Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) +\n // dot(cross(r2, ax1), v2)\n // J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)]\n\n // Block Solver\n // We develop a block solver that includes the joint limit. This makes the\n // limit stiff (inelastic) even\n // when the mass has poor distribution (leading to large torques about the\n // joint anchor points).\n //\n // The Jacobian has 3 rows:\n // J = [-uT -s1 uT s2] // linear\n // [0 -1 0 1] // angular\n // [-vT -a1 vT a2] // limit\n //\n // u = perp\n // v = axis\n // s1 = cross(d + r1, u), s2 = cross(r2, u)\n // a1 = cross(d + r1, v), a2 = cross(r2, v)\n\n // M * (v2 - v1) = JT * df\n // J * v2 = bias\n //\n // v2 = v1 + invM * JT * df\n // J * (v1 + invM * JT * df) = bias\n // K * df = bias - J * v1 = -Cdot\n // K = J * invM * JT\n // Cdot = J * v1 - bias\n //\n // Now solve for f2.\n // df = f2 - f1\n // K * (f2 - f1) = -Cdot\n // f2 = invK * (-Cdot) + f1\n //\n // Clamp accumulated limit impulse.\n // lower: f2(3) = max(f2(3), 0)\n // upper: f2(3) = min(f2(3), 0)\n //\n // Solve for correct f2(1:2)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1\n // = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) +\n // K(1:2,1:2) * f1(1:2)\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n //\n // Now compute impulse to be applied:\n // df = f2 - f1\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerTranslation: this.m_lowerTranslation,\n upperTranslation: this.m_upperTranslation,\n maxMotorForce: this.m_maxMotorForce,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PrismaticJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.localAxisA = Vec2.clone(data.localAxisA);\n const joint = new PrismaticJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const pA = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const pB = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const d = Vec2.sub(pB, pA);\n const axis = this.m_bodyA.getWorldVector(this.m_localXAxisA);\n\n const translation = Vec2.dot(d, axis);\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const rA = Rot.mulVec2(bA.m_xf.q, Vec2.sub(this.m_localAnchorA, bA.m_sweep.localCenter)); // Vec2\n const rB = Rot.mulVec2(bB.m_xf.q, Vec2.sub(this.m_localAnchorB, bB.m_sweep.localCenter)); // Vec2\n const p1 = Vec2.add(bA.m_sweep.c, rA); // Vec2\n const p2 = Vec2.add(bB.m_sweep.c, rB); // Vec2\n const d = Vec2.sub(p2, p1); // Vec2\n const axis = Rot.mulVec2(bA.m_xf.q, this.m_localXAxisA); // Vec2\n\n const vA = bA.m_linearVelocity; // Vec2\n const vB = bB.m_linearVelocity; // Vec2\n const wA = bA.m_angularVelocity; // float\n const wB = bB.m_angularVelocity; // float\n\n const speed = Vec2.dot(d, Vec2.crossNumVec2(wA, axis))\n + Vec2.dot(axis, Vec2.sub(Vec2.addCrossNumVec2(vB, wB, rB), Vec2.addCrossNumVec2(vA, wA, rA))); // float\n return speed;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit, usually in meters.\n */\n getLowerLimit(): number {\n return this.m_lowerTranslation;\n }\n\n /**\n * Get the upper joint limit, usually in meters.\n */\n getUpperLimit(): number {\n return this.m_upperTranslation;\n }\n\n /**\n * Set the joint limits, usually in meters.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && console.assert(lower <= upper);\n if (lower != this.m_lowerTranslation || upper != this.m_upperTranslation) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_lowerTranslation = lower;\n this.m_upperTranslation = upper;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in meters per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Set the maximum motor force, usually in N.\n */\n setMaxMotorForce(force: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorForce = force;\n }\n\n getMaxMotorForce(): number {\n return this.m_maxMotorForce;\n }\n\n /**\n * Get the motor speed, usually in meters per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Get the current motor force given the inverse time step, usually in N.\n */\n getMotorForce(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + this.m_impulse.z, this.m_axis).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.y;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute motor Jacobian and effective mass.\n {\n this.m_axis = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_axis);\n this.m_a2 = Vec2.crossVec2Vec2(rB, this.m_axis);\n\n this.m_motorMass = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2\n * this.m_a2;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n }\n\n // Prismatic constraint.\n {\n this.m_perp = Rot.mulVec2(qA, this.m_localYAxisA);\n\n this.m_s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_perp);\n this.m_s2 = Vec2.crossVec2Vec2(rB, this.m_perp);\n\n const s1test = Vec2.crossVec2Vec2(rA, this.m_perp);\n\n const k11 = mA + mB + iA * this.m_s1 * this.m_s1 + iB * this.m_s2 * this.m_s2;\n const k12 = iA * this.m_s1 + iB * this.m_s2;\n const k13 = iA * this.m_s1 * this.m_a1 + iB * this.m_s2 * this.m_a2;\n let k22 = iA + iB;\n if (k22 == 0.0) {\n // For bodies with fixed rotation.\n k22 = 1.0;\n }\n const k23 = iA * this.m_a1 + iB * this.m_a2;\n const k33 = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 * this.m_a2;\n\n this.m_K.ex.set(k11, k12, k13);\n this.m_K.ey.set(k12, k22, k23);\n this.m_K.ez.set(k13, k23, k33);\n }\n\n // Compute motor and limit terms.\n if (this.m_enableLimit) {\n\n const jointTranslation = Vec2.dot(this.m_axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * Settings.linearSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointTranslation <= this.m_lowerTranslation) {\n if (this.m_limitState != atLowerLimit) {\n this.m_limitState = atLowerLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else if (jointTranslation >= this.m_upperTranslation) {\n if (this.m_limitState != atUpperLimit) {\n this.m_limitState = atUpperLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n if (this.m_enableMotor == false) {\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse\n + this.m_impulse.z, this.m_axis);\n const LA = this.m_impulse.x * this.m_s1 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1;\n const LB = this.m_impulse.x * this.m_s2 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Solve linear motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits) {\n const Cdot = Vec2.dot(this.m_axis, Vec2.sub(vB, vA)) + this.m_a2 * wB\n - this.m_a1 * wA;\n let impulse = this.m_motorMass * (this.m_motorSpeed - Cdot);\n const oldImpulse = this.m_motorImpulse;\n const maxImpulse = step.dt * this.m_maxMotorForce;\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_axis);\n const LA = impulse * this.m_a1;\n const LB = impulse * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n const Cdot1 = Vec2.zero();\n Cdot1.x += Vec2.dot(this.m_perp, vB) + this.m_s2 * wB;\n Cdot1.x -= Vec2.dot(this.m_perp, vA) + this.m_s1 * wA;\n Cdot1.y = wB - wA;\n\n if (this.m_enableLimit && this.m_limitState != inactiveLimit) {\n // Solve prismatic and limit constraint in block form.\n let Cdot2 = 0;\n Cdot2 += Vec2.dot(this.m_axis, vB) + this.m_a2 * wB;\n Cdot2 -= Vec2.dot(this.m_axis, vA) + this.m_a1 * wA;\n\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const f1 = Vec3.clone(this.m_impulse);\n let df = this.m_K.solve33(Vec3.neg(Cdot)); // Vec3\n this.m_impulse.add(df);\n\n if (this.m_limitState == atLowerLimit) {\n this.m_impulse.z = Math.max(this.m_impulse.z, 0.0);\n } else if (this.m_limitState == atUpperLimit) {\n this.m_impulse.z = Math.min(this.m_impulse.z, 0.0);\n }\n\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n const b = Vec2.combine(-1, Cdot1, -(this.m_impulse.z - f1.z), Vec2.neo(this.m_K.ez.x, this.m_K.ez.y)); // Vec2\n const f2r = Vec2.add(this.m_K.solve22(b), Vec2.neo(f1.x, f1.y)); // Vec2\n this.m_impulse.x = f2r.x;\n this.m_impulse.y = f2r.y;\n\n df = Vec3.sub(this.m_impulse, f1);\n\n const P = Vec2.combine(df.x, this.m_perp, df.z, this.m_axis); // Vec2\n const LA = df.x * this.m_s1 + df.y + df.z * this.m_a1; // float\n const LB = df.x * this.m_s2 + df.y + df.z * this.m_a2; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n // Limit is inactive, just solve the prismatic constraint in block form.\n const df = this.m_K.solve22(Vec2.neg(Cdot1)); // Vec2\n this.m_impulse.x += df.x;\n this.m_impulse.y += df.y;\n\n const P = Vec2.mulNumVec2(df.x, this.m_perp); // Vec2\n const LA = df.x * this.m_s1 + df.y; // float\n const LB = df.x * this.m_s2 + df.y; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute fresh Jacobians\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n const d = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); // Vec2\n\n const axis = Rot.mulVec2(qA, this.m_localXAxisA); // Vec2\n const a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), axis); // float\n const a2 = Vec2.crossVec2Vec2(rB, axis); // float\n const perp = Rot.mulVec2(qA, this.m_localYAxisA); // Vec2\n\n const s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), perp); // float\n const s2 = Vec2.crossVec2Vec2(rB, perp); // float\n\n let impulse = new Vec3();\n const C1 = Vec2.zero(); // Vec2\n C1.x = Vec2.dot(perp, d);\n C1.y = aB - aA - this.m_referenceAngle;\n\n let linearError = Math.abs(C1.x); // float\n const angularError = Math.abs(C1.y); // float\n\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n let active = false; // bool\n let C2 = 0.0; // float\n if (this.m_enableLimit) {\n\n const translation = Vec2.dot(axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * linearSlop) {\n // Prevent large angular corrections\n C2 = Math.clamp(translation, -maxLinearCorrection, maxLinearCorrection);\n linearError = Math.max(linearError, Math.abs(translation));\n active = true;\n\n } else if (translation <= this.m_lowerTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_lowerTranslation + linearSlop,\n -maxLinearCorrection, 0.0);\n linearError = Math\n .max(linearError, this.m_lowerTranslation - translation);\n active = true;\n\n } else if (translation >= this.m_upperTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_upperTranslation - linearSlop, 0.0,\n maxLinearCorrection);\n linearError = Math\n .max(linearError, translation - this.m_upperTranslation);\n active = true;\n }\n }\n\n if (active) {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n const k13 = iA * s1 * a1 + iB * s2 * a2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n // For fixed rotation\n k22 = 1.0;\n }\n const k23 = iA * a1 + iB * a2; // float\n const k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; // float\n\n const K = new Mat33();\n K.ex.set(k11, k12, k13);\n K.ey.set(k12, k22, k23);\n K.ez.set(k13, k23, k33);\n\n const C = new Vec3();\n C.x = C1.x;\n C.y = C1.y;\n C.z = C2;\n\n impulse = K.solve33(Vec3.neg(C));\n } else {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n k22 = 1.0;\n }\n\n const K = new Mat22();\n K.ex.setNum(k11, k12);\n K.ey.setNum(k12, k22);\n\n const impulse1 = K.solve(Vec2.neg(C1)); // Vec2\n impulse.x = impulse1.x;\n impulse.y = impulse1.y;\n impulse.z = 0.0;\n }\n\n const P = Vec2.combine(impulse.x, perp, impulse.z, axis); // Vec2\n const LA = impulse.x * s1 + impulse.y + impulse.z * a1; // float\n const LB = impulse.x * s2 + impulse.y + impulse.z * a2; // float\n\n cA.subMul(mA, P);\n aA -= iA * LA;\n cB.addMul(mB, P);\n aB += iB * LB;\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { RevoluteJoint } from './RevoluteJoint';\nimport { PrismaticJoint } from './PrismaticJoint';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Gear joint definition.\n */\nexport interface GearJointOpt extends JointOpt {\n /**\n * The gear ratio. See {@link GearJoint} for explanation.\n */\n ratio?: number;\n}\n/**\n * Gear joint definition.\n */\nexport interface GearJointDef extends JointDef, GearJointOpt {\n /**\n * The first revolute/prismatic joint attached to the gear joint.\n */\n joint1: RevoluteJoint | PrismaticJoint;\n /**\n * The second prismatic/revolute joint attached to the gear joint.\n */\n joint2: RevoluteJoint | PrismaticJoint;\n}\n\nconst DEFAULTS = {\n ratio : 1.0\n};\n\n/**\n * A gear joint is used to connect two joints together. Either joint can be a\n * revolute or prismatic joint. You specify a gear ratio to bind the motions\n * together: coordinate1 + ratio * coordinate2 = constant\n *\n * The ratio can be negative or positive. If one joint is a revolute joint and\n * the other joint is a prismatic joint, then the ratio will have units of\n * length or units of 1/length. Warning: You have to manually destroy the gear\n * joint if joint1 or joint2 is destroyed.\n *\n * This definition requires two existing revolute or prismatic joints (any\n * combination will work).\n */\nexport class GearJoint extends Joint {\n static TYPE = 'gear-joint' as const;\n\n /** @internal */ m_type: 'gear-joint';\n /** @internal */ m_joint1: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_joint2: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_type1: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_type2: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_bodyC: Body;\n /** @internal */ m_localAnchorC: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_referenceAngleA: number;\n /** @internal */ m_localAxisC: Vec2;\n /** @internal */ m_bodyD: Body;\n /** @internal */ m_localAnchorD: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngleB: number;\n /** @internal */ m_localAxisD: Vec2;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_lcA: Vec2;\n /** @internal */ m_lcB: Vec2;\n /** @internal */ m_lcC: Vec2;\n /** @internal */ m_lcD: Vec2;\n /** @internal */ m_mA: number;\n /** @internal */ m_mB: number;\n /** @internal */ m_mC: number;\n /** @internal */ m_mD: number;\n /** @internal */ m_iA: number;\n /** @internal */ m_iB: number;\n /** @internal */ m_iC: number;\n /** @internal */ m_iD: number;\n /** @internal */ m_JvAC: Vec2;\n /** @internal */ m_JvBD: Vec2;\n /** @internal */ m_JwA: number;\n /** @internal */ m_JwB: number;\n /** @internal */ m_JwC: number;\n /** @internal */ m_JwD: number;\n /** @internal */ m_mass: number;\n\n constructor(def: GearJointDef);\n constructor(def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number);\n constructor(def: GearJointDef, bodyA?: Body, bodyB?: Body, joint1?: RevoluteJoint | PrismaticJoint, joint2?: RevoluteJoint | PrismaticJoint, ratio?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof GearJoint)) {\n return new GearJoint(def, bodyA, bodyB, joint1, joint2, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = GearJoint.TYPE;\n\n _ASSERT && console.assert(joint1.m_type === RevoluteJoint.TYPE\n || joint1.m_type === PrismaticJoint.TYPE);\n _ASSERT && console.assert(joint2.m_type === RevoluteJoint.TYPE\n || joint2.m_type === PrismaticJoint.TYPE);\n\n this.m_joint1 = joint1 ? joint1 : def.joint1;\n this.m_joint2 = joint2 ? joint2 : def.joint2;\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n this.m_type1 = this.m_joint1.getType() as 'revolute-joint' | 'prismatic-joint';\n this.m_type2 = this.m_joint2.getType() as 'revolute-joint' | 'prismatic-joint';\n\n // joint1 connects body A to body C\n // joint2 connects body B to body D\n\n let coordinateA: number;\n let coordinateB: number;\n\n // TODO_ERIN there might be some problem with the joint edges in Joint.\n\n this.m_bodyC = this.m_joint1.getBodyA();\n this.m_bodyA = this.m_joint1.getBodyB();\n\n // Get geometry of joint1\n const xfA = this.m_bodyA.m_xf;\n const aA = this.m_bodyA.m_sweep.a;\n const xfC = this.m_bodyC.m_xf;\n const aC = this.m_bodyC.m_sweep.a;\n\n if (this.m_type1 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint1 as RevoluteJoint;\n this.m_localAnchorC = revolute.m_localAnchorA;\n this.m_localAnchorA = revolute.m_localAnchorB;\n this.m_referenceAngleA = revolute.m_referenceAngle;\n this.m_localAxisC = Vec2.zero();\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const prismatic = this.m_joint1 as PrismaticJoint;\n this.m_localAnchorC = prismatic.m_localAnchorA;\n this.m_localAnchorA = prismatic.m_localAnchorB;\n this.m_referenceAngleA = prismatic.m_referenceAngle;\n this.m_localAxisC = prismatic.m_localXAxisA;\n\n const pC = this.m_localAnchorC;\n const pA = Rot.mulTVec2(xfC.q, Vec2.add(Rot.mulVec2(xfA.q, this.m_localAnchorA), Vec2.sub(xfA.p, xfC.p)));\n coordinateA = Vec2.dot(pA, this.m_localAxisC) - Vec2.dot(pC, this.m_localAxisC);\n }\n\n this.m_bodyD = this.m_joint2.getBodyA();\n this.m_bodyB = this.m_joint2.getBodyB();\n\n // Get geometry of joint2\n const xfB = this.m_bodyB.m_xf;\n const aB = this.m_bodyB.m_sweep.a;\n const xfD = this.m_bodyD.m_xf;\n const aD = this.m_bodyD.m_sweep.a;\n\n if (this.m_type2 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint2 as RevoluteJoint;\n this.m_localAnchorD = revolute.m_localAnchorA;\n this.m_localAnchorB = revolute.m_localAnchorB;\n this.m_referenceAngleB = revolute.m_referenceAngle;\n this.m_localAxisD = Vec2.zero();\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const prismatic = this.m_joint2 as PrismaticJoint;\n this.m_localAnchorD = prismatic.m_localAnchorA;\n this.m_localAnchorB = prismatic.m_localAnchorB;\n this.m_referenceAngleB = prismatic.m_referenceAngle;\n this.m_localAxisD = prismatic.m_localXAxisA;\n\n const pD = this.m_localAnchorD;\n const pB = Rot.mulTVec2(xfD.q, Vec2.add(Rot.mulVec2(xfB.q, this.m_localAnchorB), Vec2.sub(xfB.p, xfD.p)));\n coordinateB = Vec2.dot(pB, this.m_localAxisD) - Vec2.dot(pD, this.m_localAxisD);\n }\n\n this.m_constant = coordinateA + this.m_ratio * coordinateB;\n\n this.m_impulse = 0.0;\n\n // Gear Joint:\n // C0 = (coordinate1 + ratio * coordinate2)_initial\n // C = (coordinate1 + ratio * coordinate2) - C0 = 0\n // J = [J1 ratio * J2]\n // K = J * invM * JT\n // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T\n //\n // Revolute:\n // coordinate = rotation\n // Cdot = angularVelocity\n // J = [0 0 1]\n // K = J * invM * JT = invI\n //\n // Prismatic:\n // coordinate = dot(p - pg, ug)\n // Cdot = dot(v + cross(w, r), ug)\n // J = [ug cross(r, ug)]\n // K = J * invM * JT = invMass + invI * cross(r, ug)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n joint1: this.m_joint1,\n joint2: this.m_joint2,\n ratio: this.m_ratio,\n\n // _constant: this.m_constant,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): GearJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.joint1 = restore(Joint, data.joint1, world);\n data.joint2 = restore(Joint, data.joint2, world);\n const joint = new GearJoint(data);\n // if (data._constant) joint.m_constant = data._constant;\n return joint;\n }\n\n /**\n * Get the first joint.\n */\n getJoint1(): Joint {\n return this.m_joint1;\n }\n\n /**\n * Get the second joint.\n */\n getJoint2(): Joint {\n return this.m_joint2;\n }\n\n /**\n * Set the gear ratio.\n */\n setRatio(ratio: number): void {\n _ASSERT && console.assert(Math.isFinite(ratio));\n this.m_ratio = ratio;\n }\n\n /**\n * Get the gear ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_JvAC).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n const L = this.m_impulse * this.m_JwA; // float\n return inv_dt * L;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_lcA = this.m_bodyA.m_sweep.localCenter;\n this.m_lcB = this.m_bodyB.m_sweep.localCenter;\n this.m_lcC = this.m_bodyC.m_sweep.localCenter;\n this.m_lcD = this.m_bodyD.m_sweep.localCenter;\n this.m_mA = this.m_bodyA.m_invMass;\n this.m_mB = this.m_bodyB.m_invMass;\n this.m_mC = this.m_bodyC.m_invMass;\n this.m_mD = this.m_bodyD.m_invMass;\n this.m_iA = this.m_bodyA.m_invI;\n this.m_iB = this.m_bodyB.m_invI;\n this.m_iC = this.m_bodyC.m_invI;\n this.m_iD = this.m_bodyD.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const aC = this.m_bodyC.c_position.a;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n\n const aD = this.m_bodyD.c_position.a;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n this.m_mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n this.m_JvAC = Vec2.zero();\n this.m_JwA = 1.0;\n this.m_JwC = 1.0;\n this.m_mass += this.m_iA + this.m_iC;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n this.m_JvAC = u;\n this.m_JwC = Vec2.crossVec2Vec2(rC, u);\n this.m_JwA = Vec2.crossVec2Vec2(rA, u);\n this.m_mass += this.m_mC + this.m_mA + this.m_iC * this.m_JwC * this.m_JwC + this.m_iA * this.m_JwA * this.m_JwA;\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n this.m_JvBD = Vec2.zero();\n this.m_JwB = this.m_ratio;\n this.m_JwD = this.m_ratio;\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD); // Vec2\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); // Vec2\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); // Vec2\n this.m_JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n this.m_JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n this.m_JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD * this.m_JwD * this.m_JwD + this.m_iB * this.m_JwB * this.m_JwB;\n }\n\n // Compute effective mass.\n this.m_mass = this.m_mass > 0.0 ? 1.0 / this.m_mass : 0.0;\n\n if (step.warmStarting) {\n vA.addMul(this.m_mA * this.m_impulse, this.m_JvAC);\n wA += this.m_iA * this.m_impulse * this.m_JwA;\n\n vB.addMul(this.m_mB * this.m_impulse, this.m_JvBD);\n wB += this.m_iB * this.m_impulse * this.m_JwB;\n\n vC.subMul(this.m_mC * this.m_impulse, this.m_JvAC);\n wC -= this.m_iC * this.m_impulse * this.m_JwC;\n\n vD.subMul(this.m_mD * this.m_impulse, this.m_JvBD);\n wD -= this.m_iD * this.m_impulse * this.m_JwD;\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n let Cdot = Vec2.dot(this.m_JvAC, vA) - Vec2.dot(this.m_JvAC, vC)\n + Vec2.dot(this.m_JvBD, vB) - Vec2.dot(this.m_JvBD, vD); // float\n Cdot += (this.m_JwA * wA - this.m_JwC * wC)\n + (this.m_JwB * wB - this.m_JwD * wD);\n\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n vA.addMul(this.m_mA * impulse, this.m_JvAC);\n wA += this.m_iA * impulse * this.m_JwA;\n vB.addMul(this.m_mB * impulse, this.m_JvBD);\n wB += this.m_iB * impulse * this.m_JwB;\n vC.subMul(this.m_mC * impulse, this.m_JvAC);\n wC -= this.m_iC * impulse * this.m_JwC;\n vD.subMul(this.m_mD * impulse, this.m_JvBD);\n wD -= this.m_iD * impulse * this.m_JwD;\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n const cC = this.m_bodyC.c_position.c;\n let aC = this.m_bodyC.c_position.a;\n const cD = this.m_bodyD.c_position.c;\n let aD = this.m_bodyD.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n const linearError = 0.0;\n\n let coordinateA: number;\n let coordinateB: number;\n\n let JvAC: Vec2;\n let JvBD: Vec2;\n let JwA: number;\n let JwB: number;\n let JwC: number;\n let JwD: number;\n let mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n JvAC = Vec2.zero();\n JwA = 1.0;\n JwC = 1.0;\n mass += this.m_iA + this.m_iC;\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n JvAC = u;\n JwC = Vec2.crossVec2Vec2(rC, u);\n JwA = Vec2.crossVec2Vec2(rA, u);\n mass += this.m_mC + this.m_mA + this.m_iC * JwC * JwC + this.m_iA * JwA * JwA;\n\n const pC = Vec2.sub(this.m_localAnchorC, this.m_lcC); // Vec2\n const pA = Rot.mulTVec2(qC, Vec2.add(rA, Vec2.sub(cA, cC))); // Vec2\n coordinateA = Vec2.dot(Vec2.sub(pA, pC), this.m_localAxisC);\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n JvBD = Vec2.zero();\n JwB = this.m_ratio;\n JwD = this.m_ratio;\n mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD);\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB);\n JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD\n * JwD * JwD + this.m_iB * JwB * JwB;\n\n const pD = Vec2.sub(this.m_localAnchorD, this.m_lcD); // Vec2\n const pB = Rot.mulTVec2(qD, Vec2.add(rB, Vec2.sub(cB, cD))); // Vec2\n coordinateB = Vec2.dot(pB, this.m_localAxisD)\n - Vec2.dot(pD, this.m_localAxisD);\n }\n\n const C = (coordinateA + this.m_ratio * coordinateB) - this.m_constant; // float\n\n let impulse = 0.0; // float\n if (mass > 0.0) {\n impulse = -C / mass;\n }\n\n cA.addMul(this.m_mA * impulse, JvAC);\n aA += this.m_iA * impulse * JwA;\n cB.addMul(this.m_mB * impulse, JvBD);\n aB += this.m_iB * impulse * JwB;\n cC.subMul(this.m_mC * impulse, JvAC);\n aC -= this.m_iC * impulse * JwC;\n cD.subMul(this.m_mD * impulse, JvBD);\n aD -= this.m_iD * impulse * JwD;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n this.m_bodyC.c_position.c.setVec2(cC);\n this.m_bodyC.c_position.a = aC;\n this.m_bodyD.c_position.c.setVec2(cD);\n this.m_bodyD.c_position.a = aD;\n\n // TODO_ERIN not implemented\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Motor joint definition.\n */\nexport interface MotorJointOpt extends JointOpt {\n /**\n * The bodyB angle minus bodyA angle in radians.\n */\n angularOffset?: number;\n /**\n * The maximum motor force in N.\n */\n maxForce?: number;\n /**\n * The maximum motor torque in N-m.\n */\n maxTorque?: number;\n /**\n * Position correction factor in the range [0,1].\n */\n correctionFactor?: number;\n /**\n * Position of bodyB minus the position of bodyA, in bodyA's frame, in meters.\n */\n linearOffset?: Vec2;\n}\n/**\n * Motor joint definition.\n */\nexport interface MotorJointDef extends JointDef, MotorJointOpt {\n}\n\nconst DEFAULTS = {\n maxForce : 1.0,\n maxTorque : 1.0,\n correctionFactor : 0.3\n};\n\n/**\n * A motor joint is used to control the relative motion between two bodies. A\n * typical usage is to control the movement of a dynamic body with respect to\n * the ground.\n */\nexport class MotorJoint extends Joint {\n static TYPE = 'motor-joint' as const;\n\n /** @internal */ m_type: 'motor-joint';\n /** @internal */ m_linearOffset: Vec2;\n /** @internal */ m_angularOffset: number;\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n /** @internal */ m_correctionFactor: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_linearError: Vec2;\n /** @internal */ m_angularError: number;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: MotorJointDef);\n constructor(def: MotorJointOpt, bodyA: Body, bodyB: Body);\n constructor(def: MotorJointDef | MotorJointOpt, bodyA?: Body, bodyB?: Body) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof MotorJoint)) {\n return new MotorJoint(def, bodyA, bodyB);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MotorJoint.TYPE;\n\n this.m_linearOffset = Math.isFinite(def.linearOffset) ? def.linearOffset : bodyA.getLocalPoint(bodyB.getPosition());\n this.m_angularOffset = Math.isFinite(def.angularOffset) ? def.angularOffset : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n this.m_correctionFactor = def.correctionFactor;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n correctionFactor: this.m_correctionFactor,\n\n linearOffset: this.m_linearOffset,\n angularOffset: this.m_angularOffset,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MotorJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new MotorJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {}): void {\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && console.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && console.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Set the position correction factor in the range [0,1].\n */\n setCorrectionFactor(factor: number): void {\n _ASSERT && console.assert(Math.isFinite(factor) && 0.0 <= factor && factor <= 1.0);\n this.m_correctionFactor = factor;\n }\n\n /**\n * Get the position correction factor in the range [0,1].\n */\n getCorrectionFactor(): number {\n return this.m_correctionFactor;\n }\n\n /**\n * Set/get the target linear offset, in frame A, in meters.\n */\n setLinearOffset(linearOffset: Vec2): void {\n if (linearOffset.x != this.m_linearOffset.x\n || linearOffset.y != this.m_linearOffset.y) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_linearOffset = linearOffset;\n }\n }\n\n getLinearOffset(): Vec2 {\n return this.m_linearOffset;\n }\n\n /**\n * Set/get the target angular offset, in radians.\n */\n setAngularOffset(angularOffset: number): void {\n if (angularOffset != this.m_angularOffset) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_angularOffset = angularOffset;\n }\n }\n\n getAngularOffset(): number {\n return this.m_angularOffset;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getPosition();\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getPosition();\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.neg(this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.neg(this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n this.m_linearError = Vec2.zero();\n this.m_linearError.addCombine(1, cB, 1, this.m_rB);\n this.m_linearError.subCombine(1, cA, 1, this.m_rA);\n this.m_linearError.sub(Rot.mulVec2(qA, this.m_linearOffset));\n\n this.m_angularError = aB - aA - this.m_angularOffset;\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt;\n const inv_h = step.inv_dt;\n\n // Solve angular friction\n {\n const Cdot = wB - wA + inv_h * this.m_correctionFactor * this.m_angularError;\n let impulse = -this.m_angularMass * Cdot;\n\n const oldImpulse = this.m_angularImpulse;\n const maxImpulse = h * this.m_maxTorque;\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n Cdot.addMul(inv_h * this.m_correctionFactor, this.m_linearError);\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot));\n const oldImpulse = Vec2.clone(this.m_linearImpulse);\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce;\n\n this.m_linearImpulse.clamp(maxImpulse);\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Transform } from '../../common/Transform';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointOpt extends JointOpt {\n /**\n * [maxForce = 0.0] The maximum constraint force that can be exerted to move\n * the candidate body. Usually you will express as some multiple of the\n * weight (multiplier * mass * gravity).\n */\n maxForce?: number;\n /**\n * [frequencyHz = 5.0] The response speed.\n */\n frequencyHz?: number;\n /**\n * [dampingRatio = 0.7] The damping ratio. 0 = no damping, 1 = critical\n * damping.\n */\n dampingRatio?: number;\n}\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointDef extends JointDef, MouseJointOpt {\n /**\n * The initial world target point. This is assumed to coincide with the body\n * anchor initially.\n */\n target: Vec2Value;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n frequencyHz : 5.0,\n dampingRatio : 0.7\n};\n\n/**\n * A mouse joint is used to make a point on a body track a specified world\n * point. This a soft constraint with a maximum force. This allows the\n * constraint to stretch and without applying huge forces.\n *\n * NOTE: this joint is not documented in the manual because it was developed to\n * be used in the testbed. If you want to learn how to use the mouse joint, look\n * at the testbed.\n */\nexport class MouseJoint extends Joint {\n static TYPE = 'mouse-joint' as const;\n\n /** @internal */ m_type: 'mouse-joint';\n /** @internal */ m_targetA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_impulse: Vec2;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_beta: number;\n /** @internal */ m_gamma: number;\n // Solver temp\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat22;\n /** @internal */ m_C: Vec2;\n\n constructor(def: MouseJointDef);\n constructor(def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2);\n constructor(def: MouseJointDef, bodyA?: Body, bodyB?: Body, target?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof MouseJoint)) {\n return new MouseJoint(def, bodyA, bodyB, target);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MouseJoint.TYPE;\n\n _ASSERT && console.assert(Math.isFinite(def.maxForce) && def.maxForce >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.frequencyHz) && def.frequencyHz >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.dampingRatio) && def.dampingRatio >= 0.0);\n\n if (Vec2.isValid(target)) {\n this.m_targetA = Vec2.clone(target);\n } else if (Vec2.isValid(def.target)) {\n this.m_targetA = Vec2.clone(def.target);\n } else {\n this.m_targetA = Vec2.zero();\n }\n\n this.m_localAnchorB = Transform.mulTVec2(bodyB.getTransform(), this.m_targetA);\n\n this.m_maxForce = def.maxForce;\n this.m_impulse = Vec2.zero();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_beta = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rB = Vec2.zero();\n this.m_localCenterB = Vec2.zero();\n this.m_invMassB = 0.0;\n this.m_invIB = 0.0;\n this.m_mass = new Mat22();\n this.m_C = Vec2.zero();\n\n // p = attached point, m = mouse point\n // C = p - m\n // Cdot = v\n // = v + cross(w, r)\n // J = [I r_skew]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n target: this.m_targetA,\n maxForce: this.m_maxForce,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n _localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MouseJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.target = Vec2.clone(data.target);\n const joint = new MouseJoint(data);\n if (data._localAnchorB) {\n joint.m_localAnchorB = data._localAnchorB;\n }\n return joint;\n }\n\n /**\n * Use this to update the target point.\n */\n setTarget(target: Vec2Value): void {\n if (this.m_bodyB.isAwake() == false) {\n this.m_bodyB.setAwake(true);\n }\n this.m_targetA = Vec2.clone(target);\n }\n\n getTarget(): Vec2 {\n return this.m_targetA;\n }\n\n /**\n * Set the maximum force in Newtons.\n */\n setMaxForce(force: number): void {\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum force in Newtons.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the frequency in Hertz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get the frequency in Hertz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set the damping ratio (dimensionless).\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get the damping ratio (dimensionless).\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return Vec2.clone(this.m_targetA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_impulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * 0.0;\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2Value): void {\n this.m_targetA.sub(newOrigin);\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const position = this.m_bodyB.c_position;\n const velocity = this.m_bodyB.c_velocity;\n\n const cB = position.c;\n const aB = position.a;\n const vB = velocity.v;\n let wB = velocity.w;\n\n const qB = Rot.neo(aB);\n\n const mass = this.m_bodyB.getMass();\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = mass * (omega * omega);\n\n // magic formulas\n // gamma has units of inverse mass.\n // beta has units of inverse time.\n const h = step.dt;\n _ASSERT && console.assert(d + h * k > Math.EPSILON);\n this.m_gamma = h * (d + h * k);\n if (this.m_gamma != 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n this.m_beta = h * k * this.m_gamma;\n\n // Compute the effective mass matrix.\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) *\n // invI2 * skew(r2)]\n // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y\n // -r1.x*r1.y]\n // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x]\n const K = new Mat22();\n K.ex.x = this.m_invMassB + this.m_invIB * this.m_rB.y * this.m_rB.y\n + this.m_gamma;\n K.ex.y = -this.m_invIB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = this.m_invMassB + this.m_invIB * this.m_rB.x * this.m_rB.x\n + this.m_gamma;\n\n this.m_mass = K.getInverse();\n\n this.m_C.setVec2(cB);\n this.m_C.addCombine(1, this.m_rB, -1, this.m_targetA);\n this.m_C.mul(this.m_beta);\n\n // Cheat with some damping\n wB *= 0.98;\n\n if (step.warmStarting) {\n this.m_impulse.mul(step.dtRatio);\n vB.addMul(this.m_invMassB, this.m_impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, this.m_impulse);\n\n } else {\n this.m_impulse.setZero();\n }\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const velocity = this.m_bodyB.c_velocity;\n const vB = Vec2.clone(velocity.v);\n let wB = velocity.w;\n\n // Cdot = v + cross(w, r)\n\n const Cdot = Vec2.crossNumVec2(wB, this.m_rB);\n Cdot.add(vB);\n\n Cdot.addCombine(1, this.m_C, this.m_gamma, this.m_impulse);\n Cdot.neg();\n\n let impulse = Mat22.mulVec2(this.m_mass, Cdot);\n\n const oldImpulse = Vec2.clone(this.m_impulse);\n this.m_impulse.add(impulse);\n const maxImpulse = step.dt * this.m_maxForce;\n this.m_impulse.clamp(maxImpulse);\n impulse = Vec2.sub(this.m_impulse, oldImpulse);\n\n vB.addMul(this.m_invMassB, impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\n// tslint:disable-next-line:no-empty-interface\nexport interface PulleyJointOpt extends JointOpt {\n}\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\nexport interface PulleyJointDef extends JointDef, PulleyJointOpt {\n /**\n * The first ground anchor in world coordinates. This point never moves.\n */\n groundAnchorA: Vec2;\n /**\n * The second ground anchor in world coordinates. This point never moves.\n */\n groundAnchorB: Vec2;\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The reference length for the segment attached to bodyA.\n */\n lengthA: number;\n /**\n * The reference length for the segment attached to bodyB.\n */\n lengthB: number;\n /**\n * The pulley ratio, used to simulate a block-and-tackle.\n */\n ratio: number;\n}\n\nconst DEFAULTS = {\n collideConnected : true\n};\n\n/**\n * The pulley joint is connected to two bodies and two fixed ground points. The\n * pulley supports a ratio such that: length1 + ratio * length2 <= constant\n *\n * Yes, the force transmitted is scaled by the ratio.\n *\n * Warning: the pulley joint can get a bit squirrelly by itself. They often work\n * better when combined with prismatic joints. You should also cover the the\n * anchor points with static shapes to prevent one side from going to zero\n * length.\n */\nexport class PulleyJoint extends Joint {\n static TYPE = 'pulley-joint' as const;\n // static MIN_PULLEY_LENGTH: number = 2.0; // TODO where this is used?\n\n /** @internal */ m_type: 'pulley-joint';\n /** @internal */ m_groundAnchorA: Vec2;\n /** @internal */ m_groundAnchorB: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_lengthA: number;\n /** @internal */ m_lengthB: number;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_uA: Vec2;\n /** @internal */ m_uB: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: PulleyJointDef);\n constructor(def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number);\n constructor(def: PulleyJointDef, bodyA?: Body, bodyB?: Body, groundA?: Vec2, groundB?: Vec2, anchorA?: Vec2, anchorB?: Vec2, ratio?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PulleyJoint)) {\n return new PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PulleyJoint.TYPE;\n this.m_groundAnchorA = groundA ? groundA : def.groundAnchorA || Vec2.neo(-1.0, 1.0);\n this.m_groundAnchorB = groundB ? groundB : def.groundAnchorB || Vec2.neo(1.0, 1.0);\n this.m_localAnchorA = anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n this.m_lengthA = Math.isFinite(def.lengthA) ? def.lengthA : Vec2.distance(anchorA, groundA);\n this.m_lengthB = Math.isFinite(def.lengthB) ? def.lengthB : Vec2.distance(anchorB, groundB);\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n _ASSERT && console.assert(ratio > Math.EPSILON);\n\n this.m_constant = this.m_lengthA + this.m_ratio * this.m_lengthB;\n\n this.m_impulse = 0.0;\n\n // Pulley:\n // length1 = norm(p1 - s1)\n // length2 = norm(p2 - s2)\n // C0 = (length1 + ratio * length2)_initial\n // C = C0 - (length1 + ratio * length2)\n // u1 = (p1 - s1) / norm(p1 - s1)\n // u2 = (p2 - s2) / norm(p2 - s2)\n // Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2))\n // J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 *\n // cross(r2, u2)^2)\n }\n\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n groundAnchorA: this.m_groundAnchorA,\n groundAnchorB: this.m_groundAnchorB,\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n lengthA: this.m_lengthA,\n lengthB: this.m_lengthB,\n ratio: this.m_ratio,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PulleyJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new PulleyJoint(data);\n return joint;\n }\n\n /**\n * Get the first ground anchor.\n */\n getGroundAnchorA(): Vec2 {\n return this.m_groundAnchorA;\n }\n\n /**\n * Get the second ground anchor.\n */\n getGroundAnchorB(): Vec2 {\n return this.m_groundAnchorB;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getLengthA(): number {\n return this.m_lengthA;\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getLengthB(): number {\n return this.m_lengthB;\n }\n\n /**\n * Get the pulley ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getCurrentLengthA(): number {\n const p = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const s = this.m_groundAnchorA;\n return Vec2.distance(p, s);\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getCurrentLengthB(): number {\n const p = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const s = this.m_groundAnchorB;\n return Vec2.distance(p, s);\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n *\n * @param newOrigin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_groundAnchorA.sub(newOrigin);\n this.m_groundAnchorB.sub(newOrigin);\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_uB).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n this.m_uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n this.m_uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = this.m_uA.length();\n const lengthB = this.m_uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n this.m_uA.mul(1.0 / lengthA);\n } else {\n this.m_uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n this.m_uB.mul(1.0 / lengthB);\n } else {\n this.m_uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(this.m_rA, this.m_uA); // float\n const ruB = Vec2.crossVec2Vec2(this.m_rB, this.m_uB); // float\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n this.m_mass = mA + this.m_ratio * this.m_ratio * mB;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support variable time steps.\n this.m_impulse *= step.dtRatio;\n\n // Warm starting.\n const PA = Vec2.mulNumVec2(-this.m_impulse, this.m_uA);\n const PB = Vec2.mulNumVec2(-this.m_ratio * this.m_impulse, this.m_uB);\n\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n\n const Cdot = -Vec2.dot(this.m_uA, vpA) - this.m_ratio\n * Vec2.dot(this.m_uB, vpB); // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const PA = Vec2.mulNumVec2(-impulse, this.m_uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, this.m_uB); // Vec2\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n const uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n const uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = uA.length();\n const lengthB = uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n uA.mul(1.0 / lengthA);\n } else {\n uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n uB.mul(1.0 / lengthB);\n } else {\n uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(rA, uA);\n const ruB = Vec2.crossVec2Vec2(rB, uB);\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n let mass = mA + this.m_ratio * this.m_ratio * mB; // float\n\n if (mass > 0.0) {\n mass = 1.0 / mass;\n }\n\n const C = this.m_constant - lengthA - this.m_ratio * lengthB; // float\n const linearError = Math.abs(C); // float\n\n const impulse = -mass * C; // float\n\n const PA = Vec2.mulNumVec2(-impulse, uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, uB); // Vec2\n\n cA.addMul(this.m_invMassA, PA);\n aA += this.m_invIA * Vec2.crossVec2Vec2(rA, PA);\n cB.addMul(this.m_invMassB, PB);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, PB);\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointOpt extends JointOpt {\n /**\n * The maximum length of the rope.\n * Warning: this must be larger than linearSlop or the joint will have no effect.\n */\n maxLength?: number;\n}\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointDef extends JointDef, RopeJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxLength : 0.0,\n};\n\n/**\n * A rope joint enforces a maximum distance between two points on two bodies. It\n * has no other effect.\n *\n * Warning: if you attempt to change the maximum length during the simulation\n * you will get some non-physical behavior.\n *\n * A model that would allow you to dynamically modify the length would have some\n * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you\n * want to dynamically control length.\n */\nexport class RopeJoint extends Joint {\n static TYPE = 'rope-joint' as const;\n\n /** @internal */ m_type: 'rope-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n /** @internal */ m_maxLength: number;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_length: number;\n /** @internal */ m_state: number; // TODO enum\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n constructor(def: RopeJointDef);\n constructor(def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: RopeJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof RopeJoint)) {\n return new RopeJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RopeJoint.TYPE;\n this.m_localAnchorA = anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n\n this.m_maxLength = def.maxLength;\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_length = 0.0;\n this.m_state = inactiveLimit;\n\n // Limit:\n // C = norm(pB - pA) - L\n // u = (pB - pA) / norm(pB - pA)\n // Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA))\n // J = [-u -cross(rA, u) u cross(rB, u)]\n // K = J * invM * JT\n // = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n maxLength: this.m_maxLength,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): RopeJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RopeJoint(data);\n return joint;\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum length of the rope.\n */\n setMaxLength(length: number): void {\n this.m_maxLength = length;\n }\n\n /**\n * Get the maximum length of the rope.\n */\n getMaxLength(): number {\n return this.m_maxLength;\n }\n\n getLimitState(): number {\n // TODO LimitState\n return this.m_state;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n this.m_rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n this.m_u = Vec2.zero();\n this.m_u.addCombine(1, cB, 1, this.m_rB);\n this.m_u.subCombine(1, cA, 1, this.m_rA); // Vec2\n\n this.m_length = this.m_u.length();\n\n const C = this.m_length - this.m_maxLength; // float\n if (C > 0.0) {\n this.m_state = atUpperLimit;\n } else {\n this.m_state = inactiveLimit;\n }\n\n if (this.m_length > Settings.linearSlop) {\n this.m_u.mul(1.0 / this.m_length);\n } else {\n this.m_u.setZero();\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n return;\n }\n\n // Compute effective mass.\n const crA = Vec2.crossVec2Vec2(this.m_rA, this.m_u); // float\n const crB = Vec2.crossVec2Vec2(this.m_rB, this.m_u); // float\n const invMass = this.m_invMassA + this.m_invIA * crA * crA + this.m_invMassB\n + this.m_invIB * crB * crB; // float\n\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.addCrossNumVec2(vA, wA, this.m_rA); // Vec2\n const vpB = Vec2.addCrossNumVec2(vB, wB, this.m_rB); // Vec2\n const C = this.m_length - this.m_maxLength; // float\n let Cdot = Vec2.dot(this.m_u, Vec2.sub(vpB, vpA)); // float\n\n // Predictive constraint.\n if (C < 0.0) {\n Cdot += step.inv_dt * C;\n }\n\n let impulse = -this.m_mass * Cdot; // float\n const oldImpulse = this.m_impulse; // float\n this.m_impulse = Math.min(0.0, this.m_impulse + impulse);\n impulse = this.m_impulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u); // Vec2\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c; // Vec2\n let aA = this.m_bodyA.c_position.a; // float\n const cB = this.m_bodyB.c_position.c; // Vec2\n let aB = this.m_bodyB.c_position.a; // float\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.zero();\n u.addCombine(1, cB, 1, rB);\n u.subCombine(1, cA, 1, rA); // Vec2\n\n const length = u.normalize(); // float\n let C = length - this.m_maxLength; // float\n\n C = Math.clamp(C, 0.0, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C; // float\n const P = Vec2.mulNumVec2(impulse, u); // Vec2\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return length - this.m_maxLength < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n *\n * @prop {float} frequencyHz\n * @prop {float} dampingRatio\n *\n * @prop {Vec2} localAnchorA\n * @prop {Vec2} localAnchorB\n * @prop {float} referenceAngle\n */\nexport interface WeldJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. Rotation only. Disable softness\n * with a value of 0.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle?: number;\n}\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n */\nexport interface WeldJointDef extends JointDef, WeldJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0,\n};\n\n/**\n * A weld joint essentially glues two bodies together. A weld joint may distort\n * somewhat because the island constraint solver is approximate.\n */\nexport class WeldJoint extends Joint {\n static TYPE = 'weld-joint' as const\n\n /** @internal */ m_type: 'weld-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_impulse: Vec3;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat33;\n\n constructor(def: WeldJointDef);\n constructor(def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: WeldJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof WeldJoint)) {\n return new WeldJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WeldJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_impulse = new Vec3();\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rA; // Vec2\n this.m_rB; // Vec2\n this.m_localCenterA; // Vec2\n this.m_localCenterB; // Vec2\n this.m_invMassA; // float\n this.m_invMassB; // float\n this.m_invIA; // float\n this.m_invIB; // float\n this.m_mass = new Mat33();\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // / = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // C = angle2 - angle1 - referenceAngle\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WeldJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WeldJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Set frequency in Hz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get frequency in Hz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set damping ratio.\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get damping ratio.\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat33();\n K.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y * this.m_rB.y\n * iB;\n K.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y * this.m_rB.x * iB;\n K.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x * this.m_rB.x\n * iB;\n K.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n K.getInverse22(this.m_mass);\n\n let invM = iA + iB; // float\n const m = invM > 0.0 ? 1.0 / invM : 0.0; // float\n\n const C = aB - aA - this.m_referenceAngle; // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const d = 2.0 * m * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = m * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invM += this.m_gamma;\n this.m_mass.ez.z = invM != 0.0 ? 1.0 / invM : 0.0;\n } else if (K.ez.z == 0.0) {\n K.getInverse22(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n } else {\n K.getSymInverse33(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n if (this.m_frequencyHz > 0.0) {\n const Cdot2 = wB - wA; // float\n\n const impulse2 = -this.m_mass.ez.z\n * (Cdot2 + this.m_bias + this.m_gamma * this.m_impulse.z); // float\n this.m_impulse.z += impulse2;\n\n wA -= iA * impulse2;\n wB += iB * impulse2;\n\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n\n const impulse1 = Vec2.neg(Mat33.mulVec2(this.m_mass, Cdot1)); // Vec2\n this.m_impulse.x += impulse1.x;\n this.m_impulse.y += impulse1.y;\n\n const P = Vec2.clone(impulse1); // Vec2\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, P);\n } else {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); // Vec3\n\n const impulse = Vec3.neg(Mat33.mulVec3(this.m_mass, Cdot)); // Vec3\n this.m_impulse.add(impulse);\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n let positionError: number;\n let angularError: number;\n\n const K = new Mat33();\n K.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB;\n K.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB;\n K.ez.x = -rA.y * iA - rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB;\n K.ez.y = rA.x * iA + rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA); // Vec2\n\n positionError = C1.length();\n angularError = 0.0;\n\n const P = Vec2.neg(K.solve22(C1)); // Vec2\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n } else {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA);\n\n const C2 = aB - aA - this.m_referenceAngle; // float\n\n positionError = C1.length();\n angularError = Math.abs(C2);\n\n const C = new Vec3(C1.x, C1.y, C2);\n\n let impulse = new Vec3();\n if (K.ez.z > 0.0) {\n impulse = Vec3.neg(K.solve33(C));\n } else {\n const impulse2 = Vec2.neg(K.solve22(C1));\n impulse.set(impulse2.x, impulse2.y, 0.0);\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n cA.subMul(mA, P);\n aA -= iA * (Vec2.crossVec2Vec2(rA, P) + impulse.z);\n\n cB.addMul(mB, P);\n aB += iB * (Vec2.crossVec2Vec2(rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointOpt extends JointOpt {\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n /**\n * Suspension frequency, zero indicates no suspension.\n */\n frequencyHz?: number;\n /**\n * Suspension damping ratio, one indicates critical damping.\n */\n dampingRatio?: number;\n}\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointDef extends JointDef, WheelJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation axis in bodyA.\n */\n localAxisA: Vec2;\n}\n\nconst DEFAULTS = {\n enableMotor : false,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n frequencyHz : 2.0,\n dampingRatio : 0.7,\n};\n\n/**\n * A wheel joint. This joint provides two degrees of freedom: translation along\n * an axis fixed in bodyA and rotation in the plane. In other words, it is a\n * point to line constraint with a rotational motor and a linear spring/damper.\n * This joint is designed for vehicle suspensions.\n */\nexport class WheelJoint extends Joint {\n static TYPE = 'wheel-joint' as const;\n\n /** @internal */ m_type: 'wheel-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_springMass: number;\n /** @internal */ m_springImpulse: number;\n\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableMotor: boolean;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n /** @internal */ m_ax: Vec2 = Vec2.zero();\n /** @internal */ m_ay: Vec2 = Vec2.zero();\n /** @internal */ m_sAx: number;\n /** @internal */ m_sBx: number;\n /** @internal */ m_sAy: number;\n /** @internal */ m_sBy: number;\n\n constructor(def: WheelJointDef);\n constructor(def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n // @ts-ignore\n constructor(def: WheelJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof WheelJoint)) {\n return new WheelJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WheelJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n // @ts-ignore localAxis\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || def.localAxis || Vec2.neo(1.0, 0.0));\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n this.m_springMass = 0.0;\n this.m_springImpulse = 0.0;\n\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableMotor = def.enableMotor;\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Linear constraint (point-to-line)\n // d = pB - pA = xB + rB - xA - rA\n // C = dot(ay, d)\n // Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA,\n // rA))\n // = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB,\n // ay), vB)\n // J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)]\n\n // Spring linear constraint\n // C = dot(ax, d)\n // Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) +\n // dot(cross(rB, ax), vB)\n // J = [-ax -cross(d+rA, ax) ax cross(rB, ax)]\n\n // Motor rotational constraint\n // Cdot = wB - wA\n // J = [0 0 -1 0 0 1]\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n enableMotor: this.m_enableMotor,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WheelJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WheelJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const pA = bA.getWorldPoint(this.m_localAnchorA); // Vec2\n const pB = bB.getWorldPoint(this.m_localAnchorB); // Vec2\n const d = Vec2.sub(pB, pA); // Vec2\n const axis = bA.getWorldVector(this.m_localXAxisA); // Vec2\n\n const translation = Vec2.dot(d, axis); // float\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const wA = this.m_bodyA.m_angularVelocity;\n const wB = this.m_bodyB.m_angularVelocity;\n return wB - wA;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed, usually in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set/Get the maximum motor force, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Get the current motor torque given the inverse time step, usually in N-m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set/Get the spring frequency in hertz. Setting the frequency to zero disables\n * the spring.\n */\n setSpringFrequencyHz(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getSpringFrequencyHz(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set/Get the spring damping ratio\n */\n setSpringDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getSpringDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA); // Vec2\n\n // Point to line constraint\n {\n this.m_ay = Rot.mulVec2(qA, this.m_localYAxisA);\n this.m_sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ay);\n this.m_sBy = Vec2.crossVec2Vec2(rB, this.m_ay);\n\n this.m_mass = mA + mB + iA * this.m_sAy * this.m_sAy + iB * this.m_sBy\n * this.m_sBy;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n }\n\n // Spring constraint\n this.m_springMass = 0.0;\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n if (this.m_frequencyHz > 0.0) {\n this.m_ax = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_sAx = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ax);\n this.m_sBx = Vec2.crossVec2Vec2(rB, this.m_ax);\n\n const invMass = mA + mB + iA * this.m_sAx * this.m_sAx + iB * this.m_sBx\n * this.m_sBx; // float\n\n if (invMass > 0.0) {\n this.m_springMass = 1.0 / invMass;\n\n const C = Vec2.dot(d, this.m_ax); // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const damp = 2.0 * this.m_springMass * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = this.m_springMass * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (damp + h * k);\n if (this.m_gamma > 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n\n this.m_bias = C * h * k * this.m_gamma;\n\n this.m_springMass = invMass + this.m_gamma;\n if (this.m_springMass > 0.0) {\n this.m_springMass = 1.0 / this.m_springMass;\n }\n }\n } else {\n this.m_springImpulse = 0.0;\n }\n\n // Rotational motor\n if (this.m_enableMotor) {\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n } else {\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse *= step.dtRatio;\n this.m_springImpulse *= step.dtRatio;\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax);\n const LA = this.m_impulse * this.m_sAy + this.m_springImpulse * this.m_sAx + this.m_motorImpulse;\n const LB = this.m_impulse * this.m_sBy + this.m_springImpulse * this.m_sBx + this.m_motorImpulse;\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * LA;\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * LB;\n\n } else {\n this.m_impulse = 0.0;\n this.m_springImpulse = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Solve spring constraint\n {\n const Cdot = Vec2.dot(this.m_ax, vB) - Vec2.dot(this.m_ax, vA) + this.m_sBx\n * wB - this.m_sAx * wA; // float\n const impulse = -this.m_springMass\n * (Cdot + this.m_bias + this.m_gamma * this.m_springImpulse); // float\n this.m_springImpulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ax); // Vec2\n const LA = impulse * this.m_sAx; // float\n const LB = impulse * this.m_sBx; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n // Solve rotational motor constraint\n {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve point to line constraint\n {\n const Cdot = Vec2.dot(this.m_ay, vB) - Vec2.dot(this.m_ay, vA) + this.m_sBy\n * wB - this.m_sAy * wA; // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ay); // Vec2\n const LA = impulse * this.m_sAy; // float\n const LB = impulse * this.m_sBy; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const ay = Rot.mulVec2(qA, this.m_localYAxisA);\n\n const sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), ay); // float\n const sBy = Vec2.crossVec2Vec2(rB, ay); // float\n\n const C = Vec2.dot(d, ay); // float\n\n const k = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_sAy\n * this.m_sAy + this.m_invIB * this.m_sBy * this.m_sBy; // float\n\n let impulse; // float\n if (k != 0.0) {\n impulse = -C / k;\n } else {\n impulse = 0.0;\n }\n\n const P = Vec2.mulNumVec2(impulse, ay); // Vec2\n const LA = impulse * sAy; // float\n const LB = impulse * sBy; // float\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * LA;\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * LB;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) <= Settings.linearSlop;\n }\n\n}\n","// tslint:disable:typedef\nimport { World } from '../dynamics/World';\nimport { Body } from '../dynamics/Body';\nimport { Joint } from '../dynamics/Joint';\nimport { Fixture } from '../dynamics/Fixture';\nimport { Shape } from '../collision/Shape';\nimport { Vec2 } from '../common/Vec2';\nimport { Vec3 } from '../common/Vec3';\nimport { ChainShape } from \"../collision/shape/ChainShape\";\nimport { BoxShape } from \"../collision/shape/BoxShape\";\nimport { EdgeShape } from \"../collision/shape/EdgeShape\";\nimport { PolygonShape } from \"../collision/shape/PolygonShape\";\nimport { CircleShape } from \"../collision/shape/CircleShape\";\nimport { DistanceJoint } from \"../dynamics/joint/DistanceJoint\";\nimport { FrictionJoint } from \"../dynamics/joint/FrictionJoint\";\nimport { GearJoint } from \"../dynamics/joint/GearJoint\";\nimport { MotorJoint } from \"../dynamics/joint/MotorJoint\";\nimport { MouseJoint } from \"../dynamics/joint/MouseJoint\";\nimport { PrismaticJoint } from \"../dynamics/joint/PrismaticJoint\";\nimport { PulleyJoint } from \"../dynamics/joint/PulleyJoint\";\nimport { RevoluteJoint } from \"../dynamics/joint/RevoluteJoint\";\nimport { RopeJoint } from \"../dynamics/joint/RopeJoint\";\nimport { WeldJoint } from \"../dynamics/joint/WeldJoint\";\nimport { WheelJoint } from \"../dynamics/joint/WheelJoint\";\n\nlet SID = 0;\n\nexport function Serializer(opts?) {\n opts = opts || {};\n\n const rootClass = opts.rootClass || World;\n\n const preSerialize = opts.preSerialize || function(obj) { return obj; };\n const postSerialize = opts.postSerialize || function(data, obj) { return data; };\n\n const preDeserialize = opts.preDeserialize || function(data) { return data; };\n const postDeserialize = opts.postDeserialize || function(obj, data) { return obj; };\n\n // This is used to create ref objects during serialize\n const refTypes = {\n World,\n Body,\n Joint,\n Fixture,\n Shape,\n };\n\n // This is used by restore to deserialize objects and refs\n const restoreTypes = {\n Vec2,\n Vec3,\n ...refTypes\n };\n\n const CLASS_BY_TYPE_PROP = {\n [Body.STATIC]: Body,\n [Body.DYNAMIC]: Body,\n [Body.KINEMATIC]: Body,\n [ChainShape.TYPE]: ChainShape,\n [BoxShape.TYPE]: BoxShape,\n [EdgeShape.TYPE]: EdgeShape,\n [PolygonShape.TYPE]: PolygonShape,\n [CircleShape.TYPE]: CircleShape,\n [DistanceJoint.TYPE]: DistanceJoint,\n [FrictionJoint.TYPE]: FrictionJoint,\n [GearJoint.TYPE]: GearJoint,\n [MotorJoint.TYPE]: MotorJoint,\n [MouseJoint.TYPE]: MouseJoint,\n [PrismaticJoint.TYPE]: PrismaticJoint,\n [PulleyJoint.TYPE]: PulleyJoint,\n [RevoluteJoint.TYPE]: RevoluteJoint,\n [RopeJoint.TYPE]: RopeJoint,\n [WeldJoint.TYPE]: WeldJoint,\n [WheelJoint.TYPE]: WheelJoint,\n }\n\n this.toJson = function(root) {\n const json = [];\n\n const queue = [root];\n const refMap = {};\n\n function storeRef(value, typeName) {\n value.__sid = value.__sid || ++SID;\n if (!refMap[value.__sid]) {\n queue.push(value);\n const index = json.length + queue.length;\n const ref = {\n refIndex: index,\n refType: typeName\n };\n refMap[value.__sid] = ref;\n }\n return refMap[value.__sid];\n }\n\n function serialize(obj) {\n obj = preSerialize(obj);\n let data = obj._serialize();\n data = postSerialize(data, obj);\n return data;\n }\n\n function toJson(value, top?) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (typeof value._serialize === 'function') {\n if (value !== top) {\n // tslint:disable-next-line:no-for-in\n for (const typeName in refTypes) {\n if (value instanceof refTypes[typeName]) {\n return storeRef(value, typeName);\n }\n }\n }\n value = serialize(value);\n }\n if (Array.isArray(value)) {\n const newValue = [];\n for (let key = 0; key < value.length; key++) {\n newValue[key] = toJson(value[key]);\n }\n value = newValue;\n\n } else {\n const newValue = {};\n // tslint:disable-next-line:no-for-in\n for (const key in value) {\n if (value.hasOwnProperty(key)) {\n newValue[key] = toJson(value[key]);\n }\n }\n value = newValue;\n }\n return value;\n }\n\n while (queue.length) {\n const obj = queue.shift();\n const str = toJson(obj, obj);\n json.push(str);\n }\n\n return json;\n };\n\n this.fromJson = function(json: object) {\n const refMap = {};\n\n function findDeserilizer(data, cls) {\n if (!cls || !cls._deserialize) {\n cls = CLASS_BY_TYPE_PROP[data.type]\n }\n return cls && cls._deserialize;\n }\n\n /**\n * Deserialize a data object.\n */\n function deserialize(cls, data, ctx) {\n const deserializer = findDeserilizer(data, cls);\n if (!deserializer) {\n return;\n }\n data = preDeserialize(data);\n let obj = deserializer(data, ctx, restoreRef);\n obj = postDeserialize(obj, data);\n return obj;\n }\n\n /**\n * Restore a ref object or deserialize a data object.\n *\n * This is passed as callback to class deserializers.\n */\n function restoreRef(cls, ref, ctx) {\n if (!ref.refIndex) {\n return cls && cls._deserialize && deserialize(cls, ref, ctx);\n }\n cls = restoreTypes[ref.refType] || cls;\n const index = ref.refIndex;\n if (!refMap[index]) {\n const data = json[index];\n const obj = deserialize(cls, data, ctx);\n refMap[index] = obj;\n }\n return refMap[index];\n }\n\n const root = rootClass._deserialize(json[0], null, restoreRef);\n\n return root;\n };\n}\n\nconst serializer = new Serializer();\n\nSerializer.toJson = serializer.toJson;\nSerializer.fromJson = serializer.fromJson;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { CircleShape } from './CircleShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact);\n\nfunction CircleCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == CircleShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n CollideCircles(manifold, fixtureA.getShape() as CircleShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport const CollideCircles = function (manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n const pA = Transform.mulVec2(xfA, circleA.m_p);\n const pB = Transform.mulVec2(xfB, circleB.m_p);\n\n const distSqr = Vec2.distanceSquared(pB, pA);\n const rA = circleA.m_radius;\n const rB = circleB.m_radius;\n const radius = rA + rB;\n if (distSqr > radius * radius) {\n return;\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localPoint.setVec2(circleA.m_p);\n manifold.localNormal.setZero();\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { EdgeShape } from './EdgeShape';\nimport { ChainShape } from './ChainShape';\nimport { CircleShape } from './CircleShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, CircleShape.TYPE, EdgeCircleContact);\nContact.addType(ChainShape.TYPE, CircleShape.TYPE, ChainCircleContact);\n\nfunction EdgeCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == EdgeShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const shapeA = fixtureA.getShape() as EdgeShape;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\nfunction ChainCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == ChainShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const chain = fixtureA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n const shapeA = edge;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\n// Compute contact points for edge versus circle.\n// This accounts for edge connectivity.\nexport const CollideEdgeCircle = function (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle in frame of edge\n const Q = Transform.mulTVec2(xfA, Transform.mulVec2(xfB, circleB.m_p));\n\n const A = edgeA.m_vertex1;\n const B = edgeA.m_vertex2;\n const e = Vec2.sub(B, A);\n\n // Barycentric coordinates\n const u = Vec2.dot(e, Vec2.sub(B, Q));\n const v = Vec2.dot(e, Vec2.sub(Q, A));\n\n const radius = edgeA.m_radius + circleB.m_radius;\n\n // Region A\n if (v <= 0.0) {\n const P = Vec2.clone(A);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to A?\n if (edgeA.m_hasVertex0) {\n const A1 = edgeA.m_vertex0;\n const B1 = A;\n const e1 = Vec2.sub(B1, A1);\n const u1 = Vec2.dot(e1, Vec2.sub(B1, Q));\n\n // Is the circle in Region AB of the previous edge?\n if (u1 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region B\n if (u <= 0.0) {\n const P = Vec2.clone(B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to B?\n if (edgeA.m_hasVertex3) {\n const B2 = edgeA.m_vertex3;\n const A2 = B;\n const e2 = Vec2.sub(B2, A2);\n const v2 = Vec2.dot(e2, Vec2.sub(Q, A2));\n\n // Is the circle in Region AB of the next edge?\n if (v2 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 1;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region AB\n const den = Vec2.dot(e, e);\n _ASSERT && console.assert(den > 0.0);\n const P = Vec2.combine(u / den, A, v / den, B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n const n = Vec2.neo(-e.y, e.x);\n if (Vec2.dot(n, Vec2.sub(Q, A)) < 0.0) {\n n.setNum(-n.x, -n.y);\n }\n n.normalize();\n\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal = n;\n manifold.localPoint.setVec2(A);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_face;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2 } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Manifold, clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport { Contact } from '../../dynamics/Contact';\nimport { PolygonShape } from './PolygonShape';\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, PolygonShape.TYPE, PolygonContact);\n\nfunction PolygonContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == PolygonShape.TYPE);\n CollidePolygons(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as PolygonShape, xfB);\n}\n\ninterface MaxSeparation {\n maxSeparation: number;\n bestIndex: number;\n}\n\n/**\n * Find the max separation between poly1 and poly2 using edge normals from\n * poly1.\n */\nfunction findMaxSeparation(poly1: PolygonShape, xf1: Transform, poly2: PolygonShape, xf2: Transform, output: MaxSeparation): void {\n const count1 = poly1.m_count;\n const count2 = poly2.m_count;\n const n1s = poly1.m_normals;\n const v1s = poly1.m_vertices;\n const v2s = poly2.m_vertices;\n const xf = Transform.mulTXf(xf2, xf1);\n\n let bestIndex = 0;\n let maxSeparation = -Infinity;\n for (let i = 0; i < count1; ++i) {\n // Get poly1 normal in frame2.\n const n = Rot.mulVec2(xf.q, n1s[i]);\n const v1 = Transform.mulVec2(xf, v1s[i]);\n\n // Find deepest point for normal i.\n let si = Infinity;\n for (let j = 0; j < count2; ++j) {\n const sij = Vec2.dot(n, v2s[j]) - Vec2.dot(n, v1);\n if (sij < si) {\n si = sij;\n }\n }\n\n if (si > maxSeparation) {\n maxSeparation = si;\n bestIndex = i;\n }\n }\n\n // used to keep last FindMaxSeparation call values\n output.maxSeparation = maxSeparation;\n output.bestIndex = bestIndex;\n}\n\nfunction findIncidentEdge(c: ClipVertex[], poly1: PolygonShape, xf1: Transform, edge1: number, poly2: PolygonShape, xf2: Transform): void {\n const normals1 = poly1.m_normals;\n\n const count2 = poly2.m_count;\n const vertices2 = poly2.m_vertices;\n const normals2 = poly2.m_normals;\n\n _ASSERT && console.assert(0 <= edge1 && edge1 < poly1.m_count);\n\n // Get the normal of the reference edge in poly2's frame.\n const normal1 = Rot.mulTVec2(xf2.q, Rot.mulVec2(xf1.q, normals1[edge1]));\n\n // Find the incident edge on poly2.\n let index = 0;\n let minDot = Infinity;\n for (let i = 0; i < count2; ++i) {\n const dot = Vec2.dot(normal1, normals2[i]);\n if (dot < minDot) {\n minDot = dot;\n index = i;\n }\n }\n\n // Build the clip vertices for the incident edge.\n const i1 = index;\n const i2 = i1 + 1 < count2 ? i1 + 1 : 0;\n\n c[0].v = Transform.mulVec2(xf2, vertices2[i1]);\n c[0].id.cf.indexA = edge1;\n c[0].id.cf.indexB = i1;\n c[0].id.cf.typeA = ContactFeatureType.e_face;\n c[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n c[1].v = Transform.mulVec2(xf2, vertices2[i2]);\n c[1].id.cf.indexA = edge1;\n c[1].id.cf.indexB = i2;\n c[1].id.cf.typeA = ContactFeatureType.e_face;\n c[1].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n\nconst maxSeparation = {\n maxSeparation: 0,\n bestIndex: 0,\n};\n\n/**\n *\n * Find edge normal of max separation on A - return if separating axis is found
\n * Find edge normal of max separation on B - return if separation axis is found
\n * Choose reference edge as min(minA, minB)
\n * Find incident edge
\n * Clip\n *\n * The normal points from 1 to 2\n */\nexport const CollidePolygons = function (manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform): void {\n manifold.pointCount = 0;\n const totalRadius = polyA.m_radius + polyB.m_radius;\n\n findMaxSeparation(polyA, xfA, polyB, xfB, maxSeparation);\n const edgeA = maxSeparation.bestIndex;\n const separationA = maxSeparation.maxSeparation;\n if (separationA > totalRadius)\n return;\n\n findMaxSeparation(polyB, xfB, polyA, xfA, maxSeparation);\n const edgeB = maxSeparation.bestIndex;\n const separationB = maxSeparation.maxSeparation;\n if (separationB > totalRadius)\n return;\n\n let poly1; // reference polygon\n let poly2; // incident polygon\n let xf1;\n let xf2;\n let edge1; // reference edge\n let flip;\n const k_tol = 0.1 * Settings.linearSlop;\n\n if (separationB > separationA + k_tol) {\n poly1 = polyB;\n poly2 = polyA;\n xf1 = xfB;\n xf2 = xfA;\n edge1 = edgeB;\n manifold.type = ManifoldType.e_faceB;\n flip = 1;\n } else {\n poly1 = polyA;\n poly2 = polyB;\n xf1 = xfA;\n xf2 = xfB;\n edge1 = edgeA;\n manifold.type = ManifoldType.e_faceA;\n flip = 0;\n }\n\n const incidentEdge = [ new ClipVertex(), new ClipVertex() ];\n findIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);\n\n const count1 = poly1.m_count;\n const vertices1 = poly1.m_vertices;\n\n const iv1 = edge1;\n const iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0;\n\n let v11 = vertices1[iv1];\n let v12 = vertices1[iv2];\n\n const localTangent = Vec2.sub(v12, v11);\n localTangent.normalize();\n\n const localNormal = Vec2.crossVec2Num(localTangent, 1.0);\n const planePoint = Vec2.combine(0.5, v11, 0.5, v12);\n\n const tangent = Rot.mulVec2(xf1.q, localTangent);\n const normal = Vec2.crossVec2Num(tangent, 1.0);\n\n v11 = Transform.mulVec2(xf1, v11);\n v12 = Transform.mulVec2(xf1, v12);\n\n // Face offset.\n const frontOffset = Vec2.dot(normal, v11);\n\n // Side offsets, extended by polytope skin thickness.\n const sideOffset1 = -Vec2.dot(tangent, v11) + totalRadius;\n const sideOffset2 = Vec2.dot(tangent, v12) + totalRadius;\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, incidentEdge, Vec2.neg(tangent), sideOffset1, iv1);\n\n if (np < 2) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2);\n\n if (np < 2) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n manifold.localNormal = localNormal;\n manifold.localPoint = planePoint;\n\n let pointCount = 0;\n for (let i = 0; i < clipPoints2.length/* maxManifoldPoints */; ++i) {\n const separation = Vec2.dot(normal, clipPoints2[i].v) - frontOffset;\n\n if (separation <= totalRadius) {\n const cp = manifold.points[pointCount];\n cp.localPoint.setVec2(Transform.mulTVec2(xf2, clipPoints2[i].v));\n cp.id = clipPoints2[i].id;\n if (flip) {\n // Swap features\n const cf = cp.id.cf;\n const indexA = cf.indexA;\n const indexB = cf.indexB;\n const typeA = cf.typeA;\n const typeB = cf.typeB;\n cf.indexA = indexB;\n cf.indexB = indexA;\n cf.typeA = typeB;\n cf.typeB = typeA;\n }\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { CircleShape } from './CircleShape';\nimport { PolygonShape } from './PolygonShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, CircleShape.TYPE, PolygonCircleContact);\n\nfunction PolygonCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n CollidePolygonCircle(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport const CollidePolygonCircle = function (manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle position in the frame of the polygon.\n const c = Transform.mulVec2(xfB, circleB.m_p);\n const cLocal = Transform.mulTVec2(xfA, c);\n\n // Find the min separating edge.\n let normalIndex = 0;\n let separation = -Infinity;\n const radius = polygonA.m_radius + circleB.m_radius;\n const vertexCount = polygonA.m_count;\n const vertices = polygonA.m_vertices;\n const normals = polygonA.m_normals;\n\n for (let i = 0; i < vertexCount; ++i) {\n const s = Vec2.dot(normals[i], Vec2.sub(cLocal, vertices[i]));\n\n if (s > radius) {\n // Early out.\n return;\n }\n\n if (s > separation) {\n separation = s;\n normalIndex = i;\n }\n }\n\n // Vertices that subtend the incident face.\n const vertIndex1 = normalIndex;\n const vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0;\n const v1 = vertices[vertIndex1];\n const v2 = vertices[vertIndex2];\n\n // If the center is inside the polygon ...\n if (separation < Math.EPSILON) {\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[normalIndex]);\n manifold.localPoint.setCombine(0.5, v1, 0.5, v2);\n manifold.points[0].localPoint = circleB.m_p;\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Compute barycentric coordinates\n const u1 = Vec2.dot(Vec2.sub(cLocal, v1), Vec2.sub(v2, v1));\n const u2 = Vec2.dot(Vec2.sub(cLocal, v2), Vec2.sub(v1, v2));\n if (u1 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v1) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v1);\n manifold.localNormal.normalize();\n manifold.localPoint = v1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else if (u2 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v2) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v2);\n manifold.localNormal.normalize();\n manifold.localPoint.setVec2(v2);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else {\n const faceCenter = Vec2.mid(v1, v2);\n const separation = Vec2.dot(cLocal, normals[vertIndex1]) - Vec2.dot(faceCenter, normals[vertIndex1]);\n if (separation > radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[vertIndex1]);\n manifold.localPoint.setVec2(faceCenter);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Settings } from '../../Settings';\nimport { Contact } from '../../dynamics/Contact';\nimport { Manifold, clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport { EdgeShape } from './EdgeShape';\nimport { ChainShape } from './ChainShape';\nimport { PolygonShape } from './PolygonShape';\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, PolygonShape.TYPE, EdgePolygonContact);\nContact.addType(ChainShape.TYPE, PolygonShape.TYPE, ChainPolygonContact);\n\nfunction EdgePolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fA.getType() == EdgeShape.TYPE);\n _ASSERT && console.assert(fB.getType() == PolygonShape.TYPE);\n\n CollideEdgePolygon(manifold, fA.getShape() as EdgeShape, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nfunction ChainPolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fA.getType() == ChainShape.TYPE);\n _ASSERT && console.assert(fB.getType() == PolygonShape.TYPE);\n\n const chain = fA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n CollideEdgePolygon(manifold, edge, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nenum EPAxisType {\n e_unknown = -1,\n e_edgeA = 1,\n e_edgeB = 2,\n}\n\n// unused?\nenum VertexType {\n e_isolated = 0,\n e_concave = 1,\n e_convex = 2,\n}\n\n/**\n * This structure is used to keep track of the best separating axis.\n */\nclass EPAxis {\n type: EPAxisType;\n index: number;\n separation: number;\n}\n\n/**\n * This holds polygon B expressed in frame A.\n */\nclass TempPolygon {\n vertices: Vec2[] = []; // [Settings.maxPolygonVertices]\n normals: Vec2[] = []; // [Settings.maxPolygonVertices];\n count: number = 0;\n}\n\n/**\n * Reference face used for clipping\n */\nclass ReferenceFace {\n i1: number;\n i2: number;\n v1: Vec2;\n v2: Vec2;\n normal: Vec2 = Vec2.zero();\n sideNormal1: Vec2 = Vec2.zero();\n sideOffset1: number;\n sideNormal2: Vec2 = Vec2.zero();\n sideOffset2: number;\n}\n\n// reused\nconst edgeAxis = new EPAxis();\nconst polygonAxis = new EPAxis();\nconst polygonBA = new TempPolygon();\nconst rf = new ReferenceFace();\n\n/**\n * This function collides and edge and a polygon, taking into account edge\n * adjacency.\n */\nexport const CollideEdgePolygon = function (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform): void {\n // Algorithm:\n // 1. Classify v1 and v2\n // 2. Classify polygon centroid as front or back\n // 3. Flip normal if necessary\n // 4. Initialize normal range to [-pi, pi] about face normal\n // 5. Adjust normal range according to adjacent edges\n // 6. Visit each separating axes, only accept axes within the range\n // 7. Return if _any_ axis indicates separation\n // 8. Clip\n\n // let m_type1: VertexType;\n // let m_type2: VertexType;\n\n const xf = Transform.mulTXf(xfA, xfB);\n\n const centroidB = Transform.mulVec2(xf, polygonB.m_centroid);\n\n const v0 = edgeA.m_vertex0;\n const v1 = edgeA.m_vertex1;\n const v2 = edgeA.m_vertex2;\n const v3 = edgeA.m_vertex3;\n\n const hasVertex0 = edgeA.m_hasVertex0;\n const hasVertex3 = edgeA.m_hasVertex3;\n\n const edge1 = Vec2.sub(v2, v1);\n edge1.normalize();\n const normal1 = Vec2.neo(edge1.y, -edge1.x);\n const offset1 = Vec2.dot(normal1, Vec2.sub(centroidB, v1));\n let offset0 = 0.0;\n let offset2 = 0.0;\n let convex1 = false;\n let convex2 = false;\n\n let normal0;\n let normal2;\n\n // Is there a preceding edge?\n if (hasVertex0) {\n const edge0 = Vec2.sub(v1, v0);\n edge0.normalize();\n normal0 = Vec2.neo(edge0.y, -edge0.x);\n convex1 = Vec2.crossVec2Vec2(edge0, edge1) >= 0.0;\n offset0 = Vec2.dot(normal0, centroidB) - Vec2.dot(normal0, v0);\n }\n\n // Is there a following edge?\n if (hasVertex3) {\n const edge2 = Vec2.sub(v3, v2);\n edge2.normalize();\n normal2 = Vec2.neo(edge2.y, -edge2.x);\n convex2 = Vec2.crossVec2Vec2(edge1, edge2) > 0.0;\n offset2 = Vec2.dot(normal2, centroidB) - Vec2.dot(normal2, v2);\n }\n\n let front;\n const normal = Vec2.zero();\n const lowerLimit = Vec2.zero();\n const upperLimit = Vec2.zero();\n\n // Determine front or back collision. Determine collision normal limits.\n if (hasVertex0 && hasVertex3) {\n if (convex1 && convex2) {\n front = offset0 >= 0.0 || offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex1) {\n front = offset0 >= 0.0 || (offset1 >= 0.0 && offset2 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex2) {\n front = offset2 >= 0.0 || (offset0 >= 0.0 && offset1 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal0);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex0) {\n if (convex1) {\n front = offset0 >= 0.0 || offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex3) {\n if (convex2) {\n front = offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n }\n } else {\n front = offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setVec2(normal1);\n }\n }\n } else {\n front = offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n }\n }\n\n // Get polygonB in frameA\n polygonBA.count = polygonB.m_count;\n for (let i = 0; i < polygonB.m_count; ++i) {\n polygonBA.vertices[i] = Transform.mulVec2(xf, polygonB.m_vertices[i]);\n polygonBA.normals[i] = Rot.mulVec2(xf.q, polygonB.m_normals[i]);\n }\n\n const radius = 2.0 * Settings.polygonRadius;\n\n manifold.pointCount = 0;\n\n { // ComputeEdgeSeparation\n edgeAxis.type = EPAxisType.e_edgeA;\n edgeAxis.index = front ? 0 : 1;\n edgeAxis.separation = Infinity;\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const s = Vec2.dot(normal, Vec2.sub(polygonBA.vertices[i], v1));\n if (s < edgeAxis.separation) {\n edgeAxis.separation = s;\n }\n }\n }\n\n // If no valid normal can be found than this edge should not collide.\n // @ts-ignore\n if (edgeAxis.type == EPAxisType.e_unknown) {\n return;\n }\n\n if (edgeAxis.separation > radius) {\n return;\n }\n\n { // ComputePolygonSeparation\n polygonAxis.type = EPAxisType.e_unknown;\n polygonAxis.index = -1;\n polygonAxis.separation = -Infinity;\n\n const perp = Vec2.neo(-normal.y, normal.x);\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const n = Vec2.neg(polygonBA.normals[i]);\n\n const s1 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v1));\n const s2 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v2));\n const s = Math.min(s1, s2);\n\n if (s > radius) {\n // No collision\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n break;\n }\n\n // Adjacency\n if (Vec2.dot(n, perp) >= 0.0) {\n if (Vec2.dot(Vec2.sub(n, upperLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n } else {\n if (Vec2.dot(Vec2.sub(n, lowerLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n }\n\n if (s > polygonAxis.separation) {\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n }\n }\n }\n\n if (polygonAxis.type != EPAxisType.e_unknown && polygonAxis.separation > radius) {\n return;\n }\n\n // Use hysteresis for jitter reduction.\n const k_relativeTol = 0.98;\n const k_absoluteTol = 0.001;\n\n let primaryAxis;\n if (polygonAxis.type == EPAxisType.e_unknown) {\n primaryAxis = edgeAxis;\n } else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) {\n primaryAxis = polygonAxis;\n } else {\n primaryAxis = edgeAxis;\n }\n\n const ie = [ new ClipVertex(), new ClipVertex() ];\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.type = ManifoldType.e_faceA;\n\n // Search for the polygon normal that is most anti-parallel to the edge\n // normal.\n let bestIndex = 0;\n let bestValue = Vec2.dot(normal, polygonBA.normals[0]);\n for (let i = 1; i < polygonBA.count; ++i) {\n const value = Vec2.dot(normal, polygonBA.normals[i]);\n if (value < bestValue) {\n bestValue = value;\n bestIndex = i;\n }\n }\n\n const i1 = bestIndex;\n const i2 = i1 + 1 < polygonBA.count ? i1 + 1 : 0;\n\n ie[0].v = polygonBA.vertices[i1];\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = i1;\n ie[0].id.cf.typeA = ContactFeatureType.e_face;\n ie[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n ie[1].v = polygonBA.vertices[i2];\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = i2;\n ie[1].id.cf.typeA = ContactFeatureType.e_face;\n ie[1].id.cf.typeB = ContactFeatureType.e_vertex;\n\n if (front) {\n rf.i1 = 0;\n rf.i2 = 1;\n rf.v1 = v1;\n rf.v2 = v2;\n rf.normal.setVec2(normal1);\n } else {\n rf.i1 = 1;\n rf.i2 = 0;\n rf.v1 = v2;\n rf.v2 = v1;\n rf.normal.setMul(-1, normal1);\n }\n } else {\n manifold.type = ManifoldType.e_faceB;\n\n ie[0].v = v1;\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = primaryAxis.index;\n ie[0].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[0].id.cf.typeB = ContactFeatureType.e_face;\n\n ie[1].v = v2;\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = primaryAxis.index;\n ie[1].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[1].id.cf.typeB = ContactFeatureType.e_face;\n\n rf.i1 = primaryAxis.index;\n rf.i2 = rf.i1 + 1 < polygonBA.count ? rf.i1 + 1 : 0;\n rf.v1 = polygonBA.vertices[rf.i1];\n rf.v2 = polygonBA.vertices[rf.i2];\n rf.normal.setVec2(polygonBA.normals[rf.i1]);\n }\n\n rf.sideNormal1.setNum(rf.normal.y, -rf.normal.x);\n rf.sideNormal2.setMul(-1, rf.sideNormal1);\n rf.sideOffset1 = Vec2.dot(rf.sideNormal1, rf.v1);\n rf.sideOffset2 = Vec2.dot(rf.sideNormal2, rf.v2);\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.localNormal = Vec2.clone(rf.normal);\n manifold.localPoint = Vec2.clone(rf.v1);\n } else {\n manifold.localNormal = Vec2.clone(polygonB.m_normals[rf.i1]);\n manifold.localPoint = Vec2.clone(polygonB.m_vertices[rf.i1]);\n }\n\n let pointCount = 0;\n for (let i = 0; i < Settings.maxManifoldPoints; ++i) {\n const separation = Vec2.dot(rf.normal, Vec2.sub(clipPoints2[i].v, rf.v1));\n\n if (separation <= radius) {\n const cp = manifold.points[pointCount]; // ManifoldPoint\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n cp.localPoint = Transform.mulTVec2(xf, clipPoints2[i].v);\n cp.id = clipPoints2[i].id;\n } else {\n cp.localPoint = clipPoints2[i].v;\n cp.id.cf.typeA = clipPoints2[i].id.cf.typeB;\n cp.id.cf.typeB = clipPoints2[i].id.cf.typeA;\n cp.id.cf.indexA = clipPoints2[i].id.cf.indexB;\n cp.id.cf.indexB = clipPoints2[i].id.cf.indexA;\n }\n\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","export * from './serializer/index';\n\nexport * from './common/Math';\n\nexport * from './common/Vec2';\nexport * from './common/Vec3';\nexport * from './common/Mat22';\nexport * from './common/Mat33';\nexport * from './common/Transform';\nexport * from './common/Rot';\n\nexport * from './collision/AABB';\n\nexport * from './collision/Shape';\nexport * from './dynamics/Fixture';\nexport * from './dynamics/Body';\nexport * from './dynamics/Contact';\nexport * from './dynamics/Joint';\nexport * from './dynamics/World';\n\nexport * from './collision/shape/CircleShape';\nexport * from './collision/shape/EdgeShape';\nexport * from './collision/shape/PolygonShape';\nexport * from './collision/shape/ChainShape';\nexport * from './collision/shape/BoxShape';\n\nexport * from './collision/shape/CollideCircle';\nexport * from './collision/shape/CollideEdgeCircle';\nexport * from './collision/shape/CollidePolygon';\nexport * from './collision/shape/CollideCirclePolygon';\nexport * from './collision/shape/CollideEdgePolygon';\n\nexport * from './dynamics/joint/DistanceJoint';\nexport * from './dynamics/joint/FrictionJoint';\nexport * from './dynamics/joint/GearJoint';\nexport * from './dynamics/joint/MotorJoint';\nexport * from './dynamics/joint/MouseJoint';\nexport * from './dynamics/joint/PrismaticJoint';\nexport * from './dynamics/joint/PulleyJoint';\nexport * from './dynamics/joint/RevoluteJoint';\nexport * from './dynamics/joint/RopeJoint';\nexport * from './dynamics/joint/WeldJoint';\nexport * from './dynamics/joint/WheelJoint';\n\nexport * from './Settings';\n\nexport * from './common/Sweep';\nexport * from './collision/Manifold';\nexport * from './collision/Distance';\nexport * from './collision/TimeOfImpact';\nexport * from './collision/DynamicTree';\nexport * from './util/stats';\n\nimport { CollidePolygons } from './collision/shape/CollidePolygon';\nimport { Settings } from './Settings';\nimport { Sweep } from './common/Sweep';\nimport { DynamicTree } from './collision/DynamicTree';\nimport { Manifold } from './collision/Manifold';\nimport { Distance } from './collision/Distance';\nimport { TimeOfImpact } from './collision/TimeOfImpact';\nimport { stats } from './util/stats';\n\n/** @deprecated Merged with main namespace */\nexport const internal = {\n CollidePolygons,\n Settings,\n Sweep,\n Manifold,\n Distance,\n TimeOfImpact,\n DynamicTree,\n stats\n};\n"],"names":["Math","TOIOutputState","ManifoldType","ContactFeatureType","PointState","DEFAULTS","inactiveLimit","atLowerLimit","atUpperLimit","equalLimits"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA;AACA,CAAA,CAAA,CAAA,CAAI,aAAa,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA,CAAA;AACnC,CAAA,CAAA,CAAA,CAAI,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACzC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,SAAS,CAAE,CAAA,CAAA,CAAE,EAAE,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,IAAI,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAE,EAAE,CAAC,CAAC,SAAS,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA;AACpF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,UAAU,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,EAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AAC1G,CAAA,CAAA,CAAA,CAAI,OAAO,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC,CAAA;AAC/B,CAAC,CAAC,CAAA;AACF,CAAA;AACO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA,CAAA;AAChC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAI,CAAA,CAAA,CAAA,CAAC,KAAK,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA;AAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA+B,CAAC,CAAC,CAAA;AAClG,CAAA,CAAA,CAAA,CAAI,aAAa,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC,CAAA;AACxB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAA;AAC3C,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAG,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC,CAAA;AACzF,CAAC,CAAA;AACD,CAAA;AACO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACjC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA;AACrD,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA;AAC7D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,CAAC,CAAA;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACzF,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACT,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAA;AACjB,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA;AAC3C,CAAA,CAAA;;ACxCO,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,QAAgB,CAAA,CAAA,CAAA;CAC3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA;;CAElD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAO,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,MAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;;AAG1B,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,QAAQ,CAAE,CAAA,CAAA;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,WAAW,CAAE,CAAA,CAAA;CACrE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAqB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAE,CAAA,CAAA;CACtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAqB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,WAAW,CAAE,CAAA,CAAA;CACjF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,MAAM,CAAC;AAChB,CAAC,CAAA;;AC1BD,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA,CAAA;AAEH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;CAC9D,CAAA,CAAA,CAAA,CAAA,CAAA;IACD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAEA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;AAMC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACD,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA;;AAE/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC;QACf,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACN,CAAA,CAAA,CAAA,CAAA,CAAA;IACD,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACb,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA;CACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,WAAQ,CAAA,CAAA,CAAA;CACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACJ,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,EAAE,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE,CAAQ,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA;QACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA;AACC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;aACQ,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACJ,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;AAIC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAY,CAAA,CAAA,CAAA,CAAE,GAAY,CAAA,CAAA,CAAA;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,WAAW,CAAE,CAAA,CAAA;CAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,CAAC;CACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,WAAK,CAAA,CAAA,CAAA;CACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACD,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA;CACX,CAAA,CAAA,CAAA,CAAA;AACJ,CAAA,CAAA,CAAA;;ACvGD,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA,CAAA;AAcH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;IAQE,SAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA;QAChB,IAA4B,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAA;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,WAAW,CAAE,CAAA,CAAA;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAEF,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACL,CAAC,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA;YACT,CAAC,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC;SACV,CAAC;KACH,CAAA;;IAGM,IAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,IAAS,CAAA,CAAA,CAAA;CAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAG,CAAC,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAG,CAAC,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAC;KACZ,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAC;KACZ,CAAA;;AAGM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAV,UAAW,CAAS,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA;CAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAC;KACZ,CAAA;IAEM,IAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAY,CAAA,CAAA,CAAA;AAEvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;KAC3B,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;KAC7B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACI,IAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,GAAQ,CAAA,CAAA,CAAA;CACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAOA,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAIA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KACrD,CAAA;IAEM,IAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAM,CAAA,CAAA,CAAA;KAEnB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,KAAK,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;KACzB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAID,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAH,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAE,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;AAEzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAGL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAN,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAA,CAAS,CAAA,CAAA,CAAA;AAG1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AAEX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,KAAgB,CAAA,CAAA,CAAA;AAEtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAEjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACH,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAS,CAAA,CAAE,CAAY,CAAA,CAAE,CAAU,CAAA,CAAE,CAAa,CAAA,CAAA,CAAA;CACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA;AACxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACH,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAS,CAAA,CAAE,CAAY,CAAA,CAAE,CAAS,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA;AAKzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC;;AAG5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAN,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAA,CAAY,CAAA,CAAA,CAAA;AAG5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAElB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAY,CAAA,CAAA,CAAA;AAEd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACH,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAS,CAAA,CAAE,CAAY,CAAA,CAAE,CAAU,CAAA,CAAE,CAAa,CAAA,CAAA,CAAA;CACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA;AACxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACH,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAS,CAAA,CAAE,CAAY,CAAA,CAAE,CAAS,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA;AAMzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC;;AAG5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAN,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAA,CAAY,CAAA,CAAA,CAAA;AAG5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAElB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACH,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAS,CAAA,CAAE,CAAY,CAAA,CAAE,CAAU,CAAA,CAAE,CAAa,CAAA,CAAA,CAAA;CACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA;AACxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KAAC,CAAA;AAEJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACH,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAS,CAAA,CAAE,CAAY,CAAA,CAAE,CAAS,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA;AAKzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC;;AAG5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAN,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAA,CAAY,CAAA,CAAA,CAAA;AAG5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAElB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAY,CAAA,CAAA,CAAA;AAEd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAS,CAAA,CAAA,CAAA;AAEX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAN,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;KAC5B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,aAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;KACjC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGA,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAE,CAAA,CAAA;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,MAAM,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,SAAS,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,SAAS,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,MAAM,CAAC;KACf,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACI,IAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAY,CAAA,CAAA,CAAA;CAE1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KACzC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACI,IAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAApB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAqB,CAAY,CAAA,CAAA,CAAA;AAE/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC;KAC9B,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAf,UAAgB,CAAY,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA;CAGxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;CACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC;KACrC,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAtB,UAAuB,CAAY,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA;CAG/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;CACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;KAC1B,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAf,UAAgB,CAAY,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA;AAGxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC,CAAC,CAAC;KACrF,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACI,IAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAY,CAAA,CAAA,CAAA;AAEtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;KAC5B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAV,UAAW,CAAY,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA;AAGnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC;KAC9B,CAAA;AAKD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAZ,UAAa,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;AAGzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAEpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;AAGhC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAEpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAGL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAApB,UAAqB,CAAY,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA;AAG7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC;KAC9B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAnB,UAAoB,CAAY,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA;AAGzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KACpC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAnB,UAAoB,CAAS,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA;AAGzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KACpC,CAAA;AAID,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAA,CAAA,CAAA;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;CAGzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;CAGhC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KAGF,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAY,CAAE,CAAA,CAAY,CAAE,CAAA,CAAS,CAAA,CAAA,CAAA;CAG1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KAChD,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAY,CAAE,CAAA,CAAS,CAAE,CAAA,CAAY,CAAA,CAAA,CAAA;CAG1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KAChD,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAV,UAAW,CAAY,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA;CAGnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KACvC,CAAA;;IAGM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAX,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAA,CAAO,CAAE,CAAA,CAAS,CAAE,CAAA,CAAO,CAAA,CAAA,CAAA;CAChD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA;AACxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;IAEM,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAd,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAA,CAAO,CAAE,CAAA,CAAS,CAAE,CAAA,CAAO,CAAA,CAAA,CAAA;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;KAC3C,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAV,UAAW,CAAY,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA;CAGnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KACvC,CAAA;;AAKM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAV,UAAW,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;AAGzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC;AAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;AAGhC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAjB,UAAkB,CAAY,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA;AAGvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC;KACnC,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAjB,UAAkB,CAAS,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA;AAGvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KACnC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;IAEM,IAAG,CAAA,CAAA,CAAA,CAAA,CAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAY,CAAA,CAAA,CAAA;AAErB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAC7B,CAAA;IAEM,IAAG,CAAA,CAAA,CAAA,CAAA,CAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAY,CAAA,CAAA,CAAA;CAErB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC,CAAA,CAAA,CAAG,CAACA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAEA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAC/C,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAV,UAAW,CAAY,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA;AAGnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAC,CAAC;KACvD,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAZ,UAAa,CAAY,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA;AAGrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAACA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAEA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACzD,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAZ,UAAa,CAAY,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA;AAGrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAACA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAEA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACzD,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAA,CAAL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAW,CAAA,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAE,CAAA,CAAA;CACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAGA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,KAAK,CAAC;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,KAAK,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAZ,UAAa,CAAY,CAAA,CAAE,GAAW,CAAA,CAAA,CAAA;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;KACV,CAAA;;;AAIM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAd,UAAe,CAAS,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;KACH,CAAA;;;AAIM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAlB,UAAmB,CAAS,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;KACH,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAA,CAAA;AAAD,CAAC,CAAA,CAAA,CAAA,CAAA;;AC9nBD,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA,CAAA;AA8BH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IAIE,SAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,KAAiB,CAAA,CAAA,CAAA;QAC9C,IAA4B,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAA;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,KAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AAE9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACF,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;KAC3B,CAAA;IAEM,IAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,GAAQ,CAAA,CAAA,CAAA;CACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,UAAU,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;KACtI,CAAA;IAEM,IAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAM,CAAA,CAAA,CAAA;KAEnB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;KAC/G,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;KAC/G,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;KAC9F,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAP,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAQ,CAAA,CAAA,CAAA;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC;AAEd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,UAAU,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,UAAU,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,UAAU,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,UAAU,CAAC;AAE5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAGA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAGA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAGA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAGA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,CAAC;CAE5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;KACxC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAb,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAY,CAAA,CAAA,CAAA;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAACA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAEA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAACA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAEA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAChE,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAU,CAAA,CAAA,CAAA;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;KAC9D,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAA,CAAR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAU,CAAA,CAAA,CAAA;QACjB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA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CAAA,CAAA,CAAA,CAAA;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA;AAC3E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA;AAC3E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CA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AAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,sBAAsB,CAAA,CAAA,CAAA;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA;AACb,CAAC,CAAA,CAJI,sBAAsB,CAAtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAsB,GAI1B,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAkB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,EAAE,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAkB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,EAAE,CAAC;AAM9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;CA4J5B,CAAA,CAAA,CAAA,CAAA;;AAxJC,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAV,UAAW,CAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAqB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,MAAa,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAqB,EAAE,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,EAAU,CAAA,CAAA,CAAA;AACpH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,MAAM,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,MAAM,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,KAAK,CAAC;AAG1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,MAAM,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,MAAM,CAAC;AAEvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;CACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;CACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;QAEpC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;CAC7D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;CAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AAEV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,CAAE,CAAA,CAAA;;AAE9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;AAEvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,YAAY,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AAC3E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;YAE/C,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAC;AAEzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;CACtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAEnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;YAC5D,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;gBACX,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;gBACpC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AAEV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,YAAY,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AAC3E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;YAE/C,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAC;AAEzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;CAC7D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAEnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;YAC5D,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;gBACX,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;gBACpC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAP,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAE,CAAA,CAAS,CAAA,CAAA,CAAA;;AAE9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;CACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;CAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAsB,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAE,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;oBAEzD,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;oBAC9C,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AACzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;CAEzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CAEnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC1E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAsB,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAC;AAEzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAE,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAEpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC;oBACjB,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;CACzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAEnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AAChE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAsB,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAC;AAEzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAE,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAEpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC;oBACjB,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;CACzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAEnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AAChE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAE,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,iBAAA,CAAjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAS,CAAA,CAAA,CAAA;CACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;KAC9B,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAA,CAAR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAS,CAAA,CAAA,CAAA;CAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;KAC/B,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,kBAAA,CAAA;AAAD,CAAC,CAAA,CAAA,CAAA,CAAA;AAEgC,CAAA,CAAA,CAAA,CAAI,kBAAkB,CAAG,CAAA,CAAA;AAE1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC;AAC9B,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AC7d/B,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA,CAAA;AAgBH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAA,CAAA,CAAA,CAAA,CAAA;;QAEE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;;QAEf,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;QACnB,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;QAC/B,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;QAC/B,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,KAAK,CAAC;QAC9B,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,IAAI,CAAC;;QAG3B,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,GAAG,CAAC;;QAEtB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;CAUrB,CAAA,CAAA,CAAA,CAAA;CARC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAA,CAAL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAU,CAAA,CAAA,CAAA;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,GAAG,CAAE,CAAA,CAAA;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC;CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC;KAClC,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,QAAA,CAAA;AAAD,CAAC,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;AAEjC,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAOE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAA,CAAA,CAAA;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,OAAO,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;CACpB,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,cAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAlB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AAChD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAC;AACjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,OAAO,CAAC;CAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,cAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AAChD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAC;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,QAAQ,CAAC;CACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,cAAA,CAAA;AAAD,CAAC,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAOE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;CACpB,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;KAC1B,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,IAAU,CAAA,CAAA,CAAA;AAEhB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;;;;;;KAM1B,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,OAAgB,CAAA,CAAA,CAAA;;AAEzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;KAC/B,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAA,CAAR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,KAAY,CAAA,CAAA,CAAA;AAEnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;KAC3B,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,IAAc,CAAA,CAAA,CAAA;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;;AAG3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,MAAM,CAAE,CAAA,CAAA;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAE,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,MAAM,CAAE,CAAA,CAAA;AACjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,MAAM,CAAE,CAAA,CAAA;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAE3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA;YAE1D,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;gBACrB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;gBACvD,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAE,CAAA,CAAA;gBACnB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;YAGD,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AAEb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AAEjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;;AAGzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAA;;AAEvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,KAAK,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC;AAEtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAC,CAAC;;AAGhB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;;;AAIjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAE,CAAA,CAAA;oBAChB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAE,CAAA,CAAA,CAAE,EAAE,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,OAAO,CAAC;;oBAG3B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;wBACxB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;wBACjE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;oBAC9C,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA;wBACtB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAE5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,KAAK,CAAC;;oBAGvB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;wBACtB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA,CAAE,EAAE,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA;AAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAE,CAAA,CAAA;wBACjC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,KAAK,CAAC;;AAGvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;wBAC7B,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;oBAE7B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;wBACtB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;;AAGvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;;;CAG7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAE,CAAA,CAAA;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAAA,CAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,IAAc,CAAA,CAAA,CAAA;;AAExB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC;AAEtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC;;AAGlB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAE9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAC,CAAC;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;CACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,iBAAiB,CAAC;;AAG/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAC,CAAC;CACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAC;AAEjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAE,CAAA,CAAA;;gBAEpB,CAAC,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;CAC3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;;;;AAUG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAsB,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;;AAErB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AAChD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwB,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAE9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;;CAG1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAqB,CAAE,CAAA,CAAA;CACpE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AAC7D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,QAAQ,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,kBAAkB,CAAE,CAAA,CAAA;AACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAGA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;CACxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;CAEX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;CACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;QAGD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;YAChD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,UAAU,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAuB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC;CACzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAGA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;CAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC;YAEjE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;CAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,SAAS,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAwB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC;AACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,SAAS,CAAC;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAED,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA;;CAE9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC;gBACtB,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAE9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAC;CAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;YACnC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;CACjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;YAC3C,CAAI,CAAA,CAAA,CAAA,CAAC,CAAoB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAI,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AAEvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,UAAU,CAAE,CAAA,CAAA;YACd,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC;AAE5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,uBAAuB,CAAC;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,wBAAwB,CAAC;AAEpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAE,CAAA,CAAA;oBACnB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;CAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC;CAC5D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAC,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA;AAC5D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;CACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;oBACtB,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,YAAY,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,cAAc,CAAE,CAAA,CAAA;AAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,aAAA,CAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,IAAc,CAAA,CAAA,CAAA;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;QAE3B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAE,CAAA,CAAA;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,MAAM,CAAE,CAAA,CAAA;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAE,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,MAAM,CAAE,CAAA,CAAA;;AAEjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAE,CAAA,CAAA;;AAEX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACtB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;AAEnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAE,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,MAAM,CAAE,CAAA,CAAA;;AAEjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,SAAS,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;oBAC1B,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,WAAW,CAAE,CAAA,CAAA;oBACvC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;gBAED,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;gBAChB,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAA,CAAA;;AAEf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,KAAK,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE,CAAC;;CAG3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAE,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA;wBAClC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AAIxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;;AAG/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,OAAO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;wBACxC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAC;AAClD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAC;;AAGlD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,QAAQ,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,IAAI,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;wBAC1C,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAID,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;oBAE/B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA;AACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;yBAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA;AAChD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAID,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,EAAE,CAAC;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,EAAE,CAAC;AAElC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAC1B,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAG1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;CACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AAEjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,YAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;;AAG5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,MAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,IAAIC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAE,CAAA,CAAA;AAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAGD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,GAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;gBAED,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA;;CAEpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAC,CAAC;CACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAE,CAAA,CAAA;;AAE9D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;gBAC5B,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;CAExB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;;AAGrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;YAC7B,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC;;AAGxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;;AAEvE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;gBACxB,CAAE,CAAA,CAAC,CAAoB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;gBAC1B,CAAE,CAAA,CAAC,CAAoB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;gBAC1B,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;;YAGlB,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;AAE5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;;AAG/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,MAAM,CAAG,CAAA,CAAA,CAAE,EAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAE,CAAA,CAAA;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAE,CAAA,CAAA,CAAE,EAAE,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA;;;AAIlD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,OAAO,CAAC;;wBAG3B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;4BACxB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,KAAK,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAE,CAAA,CAAA;4BAC9D,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;wBAC9C,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA;4BACtB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;CAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;;;AAItB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;AACjE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;4BAC1B,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAoB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;4BAC7B,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;;wBAGzB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;4BACtB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAE1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAE,CAAA,CAAA;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAC;AAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,kBAAkB,CAAC;AACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;CAE/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;;AAGvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AAE1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAE,CAAA,CAAA;oBACrB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;gBAED,CAAI,CAAA,CAAA,CAAA,CAAC,CAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;;AAG3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAE,CAAA,CAAA,CAAE,EAAE,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA;AAClD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;YAKD,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;YAExB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAE,CAAA,CAAA;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;gBAC7B,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAd,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA;AACtD,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAG3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAC,CAAC;CAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAC;YACnC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CACjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,CAAC;AAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;YACnD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA0B,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;CAC3E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAGA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;CAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC;AACjE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,YAAY,CAAE,CAAA,CAAA;gBAChB,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CA4BC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAC;CAC3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAC;CAC3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;;;AAIpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAsB,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAKD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC;;AAGrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAE9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;;CAG1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAA,CAAA,CAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,qBAAqB,CAAE,CAAA,CAAA;CACvE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AAC7D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,QAAQ,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,kBAAkB,CAAE,CAAA,CAAA;AACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAGA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;CACxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AAEX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;;AAGtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;YAC3B,CAAI,CAAA,CAAA,CAAA,CAAC,CAAoB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAI,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;KACxB,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,GAAf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;YACnC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAA,CAAA;AAAD,CAAC,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;ACz3B1B,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA,CAAA;AAQH,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAQE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAE,CAAE,CAAE,CAAA,CAAE,CAAE,CAAA,CAAE,CAAA,CAAA,CAAA;CACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA;CACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;CACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;YAChC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;YACzB,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACF,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;KAC7B,CAAA;IAEM,KAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,GAAQ,CAAA,CAAA,CAAA;CACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC,CAAC;KACrD,CAAA;IAEM,KAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAM,CAAA,CAAA,CAAA;KAEnB,CAAA;;IAMD,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAE,CAAE,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,KAAK,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;eACtE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA;CAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AAEtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA;AACzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAEpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;CAEhC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC;CACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC;AAEvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAEN;KACF,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,GAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;KACjB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;KACjB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;CACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC;QACxB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,EAAE,CAAC;CACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,CAAC;CACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,CAAC;CACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,CAAC;CACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAC;KACZ,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAA,CAAL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAO,CAAA,CAAA,CAAA;AAEX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;CACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC;QACxB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;KACV,CAAA;;AASM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAV,UAAW,CAAE,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA;CACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA;CAE7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;CACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;CACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AAEvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;CAGtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;YAC9C,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KAGF,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAd,UAAe,CAAS,CAAA,CAAA,CAAE,CAAO,CAAA,CAAA,CAAA;CAE/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;CACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;CACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;KACvB,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAf,UAAgB,CAAS,CAAA,CAAA,CAAE,CAAQ,CAAA,CAAA,CAAA;;CAGjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;QAC9C,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;KAC9B,CAAA;;AAUM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAX,UAAY,CAAE,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA;CACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAE7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AAEzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,EAAE,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AAClE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,EAAE,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AAClE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KAGF,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAf,UAAgB,CAAS,CAAA,CAAA,CAAE,CAAO,CAAA,CAAA,CAAA;CAGhC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;KACzD,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAhB,UAAiB,CAAS,CAAA,CAAA,CAAE,CAAQ,CAAA,CAAA,CAAA;AAGlC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,EAAE,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AAClE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,EAAE,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AAClE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC;KAC1B,CAAA;IAEM,KAAG,CAAA,CAAA,CAAA,CAAA,CAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAS,CAAA,CAAA,CAAA;CAElB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;KACpD,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAV,UAAW,CAAU,CAAA,CAAA,CAAA,CAAE,GAAU,CAAA,CAAA,CAAA;AAG/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,GAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;KACtE,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,KAAA,CAAA;AAAD,CAAC,CAAA,CAAA,CAAA,CAAA;;AC5OD,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA,CAAA;AAOSE,CAIX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAJD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,YAAY,CAAA,CAAA,CAAA;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA;AACb,CAAC,CAAA,CAJWA,oBAAY,CAAZA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY,GAIvB,CAAA,CAAA,CAAA,CAAA,CAAA;AAEWC,CAGX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAHD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,kBAAkB,CAAA,CAAA,CAAA;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA;AACZ,CAAC,CAAA,CAHWA,0BAAkB,CAAlBA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAkB,GAG7B,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA;AACUC,CASZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AATA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,UAAU,CAAA,CAAA,CAAA;;AAErB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA;;AAEb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA;;AAEZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAA;;AAEhB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAA;AACjB,CAAC,CAAA,CATYA,kBAAU,CAAVA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAU,GAStB,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,CAAA;AACC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA,CAAA,CAAS,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAE,GAAc,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAC;CAMjC,CAAA,CAAA,CAAA,CAAA;CAJC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAa,CAAA,CAAA,CAAA;CACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC;KACnB,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAA,CAAA;AAAD,CAAC,EAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;AAuBG,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAA,CAAA,CAAA,CAAA,CAAA;AAEE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;QAC/B,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,CAAE,CAAA,CAAA,CAAA,CAAI,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAC;QACvE,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;CAmFxB,CAAA,CAAA,CAAA,CAAA;AAjFC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACH,QAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAhB,CAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA6B,CAAE,CAAA,CAAA,CAAA,CAAc,EAAE,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAc,CAAA,CAAA,CAAA,CAAE,OAAe,CAAA,CAAA,CAAA;AAC9G,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAA;YACxB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAE,CAAG,CAAA,CAAA,CAAA,CAAE,IAAI,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,EAAE,CAAC;AAE/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,MAAM,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,MAAM,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,WAAW,CAAC;;CAGnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAKF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAA,CAAA;CAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;AACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;CACjE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAGF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGA,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAE,CAAA,CAAA;AAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;oBACrB,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AAClD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AACpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;gBACvB,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAKE,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;AAE3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;AACpE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,SAAS,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AAC7G,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,MAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AACzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAAW,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;gBACrC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAKA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;AAE3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;AACpE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,SAAS,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AAC3G,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AACxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAAW,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;;AAErC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACf,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,MAAM,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,MAAM,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,WAAW,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;KACX,CAAA;IAEM,CAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,iBAAiB,CAAC;IACtC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,UAAU,CAAC;IACxB,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,cAAc,CAAC;IAChC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGE,kBAAU,CAAC;CACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,QAAA,CAAA;AAAA,CAxFD,EAwFC,CAAA,CAAA;AAED,CAAA,CAAA,CAAA;;;;;;;;AAQG,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACH,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACH,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAE,GAAc,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAC;CACjC,CAAA,CAAA,CAAA,CAAA;CAAD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,aAAA,CAAA;AAAD,CAAC,EAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAE,GAAmB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,EAAE,CAAC;CAa3C,CAAA,CAAA,CAAA,CAAA;AARC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,SAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAHP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;CACtF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAY,CAAA,CAAA,CAAA;;CAEd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC;KACnB,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,SAAA,CAAA;AAAD,CAAC,EAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,cAAA,CAAA,CAAA,CAAA,CAAA;CAuBC,CAAA,CAAA,CAAA,CAAA;CANC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAiB,CAAA,CAAA,CAAA;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAC,CAAC,MAAM,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAC,CAAC,MAAM,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,GAAG,CAAC,CAAC,KAAK,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,GAAG,CAAC,CAAC,KAAK,CAAC;KACtB,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,cAAA,CAAA;AAAD,CAAC,EAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA;AAKE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAC5B,CAAA,CAAA,CAAA,CAAA;CAAD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,aAAA,CAAA;AAAD,CAAC,EAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA;AACG,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAC5B,CAAoB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACpB,MAAoB,CACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,CACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,CAAA,CAAA,CAAA;;;;;;;AAUnB,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC;AAElC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,GAAGA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,WAAW,CAAC;AAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAC,GAAG,CAAE,CAAA,CAAA;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,GAAGA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC;gBACpC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC;AAElC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,GAAGA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;AAEhC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAC,GAAG,CAAE,CAAA,CAAA;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,GAAGA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC;gBACpC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAC;AAED,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA;AACG,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,CAC/B,CAAA,CAAA,CAAA,CAAkB,CAClB,CAAA,CAAA,CAAA,CAAiB,CACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,CAAA,CAAA,CAAA;;IAGpB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAC,CAAC;;AAGf,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,MAAM,CAAC;AACtD,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,MAAM,CAAC;;CAGtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;CAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;;AAG7B,CAAA,CAAA,CAAA,CAAA,IAAI,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAE,CAAA,CAAA;;CAE/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAI,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;QAGlE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC;CACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;AAChD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGD,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;AACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGA,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;AACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,MAAM,CAAC;AACV,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,MAAM,CAAC;AAChB,CAAA;;AC1WA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA,CAAA;AAqBH,CAAA,CAAA,CAAA;;;;;;;;;;AAUG,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAKE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAA,CAAA,CAAA;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,OAAO,CAAC;CACxB,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,WAAA,CAAA;AAAD,CAAC,EAAA,CAAA,CAAA;AAuBD,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA;AACa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,SAAiB,CAAA,CAAA,CAAA;CAC9D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOH,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC1C,CAAC;AAED,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA;AACa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAoB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,YAAoB,CAAA,CAAA,CAAA;CACvE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,YAAY,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,YAAY,CAAC;AACnE,CAAC;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;AAEvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,uBAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAS,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAS,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;QACvB,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;QAC1B,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;QAC3B,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;QACvB,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;QACxB,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;CAC1B,CAAA,CAAA,CAAA,CAAA;CAAD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,uBAAA,CAAA;AAAD,CAAC,EAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IA4EE,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAE,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA6B,CAAA,CAAA,CAAA;;AA5DnG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAa,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;;QAEtC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,IAAI,CAAC;;QAE9B,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,IAAI,CAAC;;QAE9B,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,GAAG,CAAC;;QAEpB,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;;QAEvB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,KAAK,CAAC;;QAM3B,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,GAAG,CAAC;;QAE7B,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,IAAI,CAAC;;QAE9B,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,KAAK,CAAC;;QAE9B,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,KAAK,CAAC;;QAEhC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,KAAK,CAAC;;QAE9B,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,KAAK,CAAC;;AAGjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,IAAI,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC;;AAGrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA8B,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAC1D,CAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,IAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAU,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,EAAE,CAAC;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,IAAG,CAAA,CAAA,CAAA,CAAA,GAAU,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,EAAE,CAAC;;AAW1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAC5C,CAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AACnD,CAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AAClD,CAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AACpD,CAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;;CAYlD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC;AAErC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;AAErB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,MAAM,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,MAAM,CAAC;AAEvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,WAAW,CAAC;AAEjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;AACtF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAC;CACnG,CAAA,CAAA,CAAA,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,cAAA,CAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,IAAc,CAAA,CAAA,CAAA;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAEjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;AAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AAEjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE,CAAC;AAEpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAGvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;AAE5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,aAAa,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,cAAc,CAAC;AAE1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,UAAU,CAAC;AAE/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AAE5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;AAC5D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;AAE5D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;AAEjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;QAC5B,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;QACtD,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,UAAU,CAAC;QAE/B,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAE,CAAA,CAAA;CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,EAAE,CAAC;YAE7D,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;CACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC;CACpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC;AAEvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AAEvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,KAAK,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;AAEnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,GAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC;KACxB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,gBAAA,CAAhB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,aAA+C,CAAA,CAAA,CAAA;CAC9D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;CACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;CACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;CAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;CAE1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CACzE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;KAC3D,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,IAAa,CAAA,CAAA,CAAA;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAC,CAAC,IAAI,CAAC;KAC7B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC;KAC3B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC;KAC5B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;KACpB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,GAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC;KACxB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,GAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC;KACxB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,GAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC;KACtB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,GAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC;KACtB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,GAAhB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;KAC1B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAAA,CAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,QAAgB,CAAA,CAAA,CAAA;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC;KAC5B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,GAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC;KACxB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,EACtD,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;KAC/B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,cAAA,CAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,WAAmB,CAAA,CAAA,CAAA;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,WAAW,CAAC;KAClC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,GAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC;KAC3B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,GAAhB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,EAC/D,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAC;KAClC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,eAAA,CAAf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,KAAa,CAAA,CAAA,CAAA;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;KAC7B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,GAAf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC;KAC5B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAR,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAE,CAAA,CAAA,CAAA,CAAc,CAAE,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAA;CACzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CACnE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;KACnC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;;AAQG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAN,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,QAIN,CAAA,CAAA,CAAA;;AAGC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;QAE1B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,cAAc,CAAC;CAExC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;CAC3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AAC3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,OAAO,CAAC;CAElC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;CACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,EAAE,CAAC;AAEjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,WAAW,CAAC;;AAGhB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,MAAM,CAAE,CAAA,CAAA;CACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;CAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;;AAG/E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;YAEjC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;CACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAC,CAAC;;;AAI1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AAEzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;oBAClC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAG,CAAA,CAAA,CAAC,aAAa,CAAC;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,GAAG,CAAG,CAAA,CAAA,CAAC,cAAc,CAAC;wBACxC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAED,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC;AAE/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,IAAI,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,QAAQ,CAAE,CAAA,CAAA;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,QAAQ,CAAE,CAAA,CAAA;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,QAAQ,CAAE,CAAA,CAAA;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,uBAAA,CAAvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwB,IAAc,CAAA,CAAA,CAAA;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,wBAAwB,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;KAC5C,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA0B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA1B,CAA2B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAE,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA;CAC/D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAwB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC;KACxD,CAAA;AAEO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAhC,CAAiC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAE,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA;CACvE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAC,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC;AAEtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAEjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AAEjC,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACnC,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;CAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;QAErD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;QACb,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA;AAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;QACb,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA;AAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;CAErB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;QAErB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;;AAGxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA,CAAE,CAAC,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA,CAAE,CAAC,CAAC;CACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAA,CAAE,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAC,CAAC;CACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAA,CAAE,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAC,CAAC;;YAGvD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,SAAA,CAAC;YACX,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,SAAA,CAAC;YACV,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,SAAA,CAAC;CACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAKE,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAA,CAAA;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAC;AACzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;CAC7D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;oBAClC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;CAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC;oBAC1F,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAKA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAC;AAChD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAC;AAC7D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;CAChE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,UAAU,CAAC,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC;CACjG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC;oBAClB,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAKA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAC;AAChD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAC;AAC7D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;CAChE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,UAAU,CAAC,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC;CACjG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC;;AAGlB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBACf,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;CAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;;CAG/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAGF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAEpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC;AAClE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,mBAAmB,CAAC;;AAGzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAGA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,UAAU,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAE,CAAA,CAAC,mBAAmB,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;;CAGvF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CAC3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,EAAE,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;;AAGpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;CAEvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAE3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC,CAAC;YACjB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;AAErC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC,CAAC;YACjB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC;AAEjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC;AAEjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,aAAa,CAAC;KACtB,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,sBAAA,CAAtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,IAAc,CAAA,CAAA,CAAA;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAEjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AAEjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE,CAAC;AAEpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;CACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CAErD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;CACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;CAEvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;CACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAIvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA,CAAE,CAAC,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA,CAAE,CAAC,CAAC;CACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC,EAAE,CAAG,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAC,CAAC;CAC9D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC,EAAE,CAAG,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAC,CAAC;AAE9D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,gBAAgB,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,EAAE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;CAElF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAE5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAE7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,aAAa,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC,CAAC;AACtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,aAAa,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC,CAAC;AAEtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;AACtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;AAEtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AAE1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AAErD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AAEtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AAChD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AAEhD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AAE3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;;AAGxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;YACvB,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAE,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAE,CAAA,CAAA,CAAE,GAAG,CAAC,CAAA,CAAE,CAAC,CAAC;CACtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAE,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AAC3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,iBAAiB,CAAE,CAAA,CAAA;CACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAG,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;CAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA;CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAE9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;AACxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;AACxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;AACxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;AAExD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;;YAG1D,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAoB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAA;;gBAE9D,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;gBAC7B,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC;AAEjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC;KAClB,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,mBAAA,CAAnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,IAAc,CAAA,CAAA,CAAA;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAEjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AAEjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACnC,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACnC,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;CAExB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;CACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAErB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;CAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;AAE/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAE7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAG,CAAA,CAAA,CAAC,aAAa,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAC,cAAc,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AAC/E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC,CAAC;AACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC,CAAC;AACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC;KAClB,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,uBAAA,CAAvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwB,IAAc,CAAA,CAAA,CAAA;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;AAClE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;AACrE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,uBAAA,CAAvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwB,IAAc,CAAA,CAAA,CAAA;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;AAErC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACnC,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACnC,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;CAExB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;CACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAErB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;CAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;;;AAMjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAG7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;CACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAE,EAAE,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAE,CAAA,CAAA,CAAE,GAAG,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAE,EAAE,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAE,CAAA,CAAA,CAAE,GAAG,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;;AAGvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,OAAO,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,cAAc,CAAC;CACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,WAAW,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC;;AAGrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,WAAW,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAG,CAAA,CAAA,CAAC,aAAa,CAAC;AACjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAG,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,MAAM,CAAE,CAAA,CAAC,WAAW,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;AACtF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAG,CAAA,CAAA,CAAC,cAAc,CAAC;AACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,UAAU,CAAC;;CAGhC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAE3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC,CAAC;AAEzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC,CAAC;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;QAGD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA;AACtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAG7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;CACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAE,EAAE,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAE,CAAA,CAAA,CAAE,GAAG,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAE,EAAE,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAE,CAAA,CAAA,CAAE,GAAG,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;;CAGvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAC;;AAGvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAGA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,aAAa,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AAC7D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAG,CAAA,CAAA,CAAC,aAAa,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,UAAU,CAAC;;CAG/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAE1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC,CAAC;AAEzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC,CAAC;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAE9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,aAAa,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAC;;CAI3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAE,CAAA,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CAC9G,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAE,CAAA,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;;CAG9G,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAEhC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,EAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAC;;AAGrE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC;;AAKlC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAE,CAAA,CAAA;;;;;;;;;;AAUX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,EAAE,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC;gBAEpD,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;;CAE5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;;AAGzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;oBAExC,CAAE,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;CAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;oBAE/E,CAAE,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;CAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;;AAG/E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAC,CAAC,CAAC,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAC,CAAC,CAAC,CAAC;oBAczB,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;gBAQD,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;CACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAEhC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;;CAE5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;;AAGzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;oBACxC,CAAE,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;CAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;oBAE/E,CAAE,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;CAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;;AAG/E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAC,CAAC,CAAC,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAC,CAAC,CAAC,CAAC;oBAazB,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;AAQD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;gBACV,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;CAEV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;;CAE5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;;AAGzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;oBACxC,CAAE,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;CAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;oBAE/E,CAAE,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;CAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;;AAG/E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAC,CAAC,CAAC,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAC,CAAC,CAAC,CAAC;oBAazB,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;AAQD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC;AAEV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAG,CAAE,CAAA,CAAA;;CAE5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;;AAGzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;oBACxC,CAAE,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;CAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;oBAE/E,CAAE,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;CAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;;AAG/E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAC,CAAC,CAAC,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAC,CAAC,CAAC,CAAC;oBAEzB,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;gBAID,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC;AAEjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC;KAClB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,KAAgB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAyB,CAAA,CAAA,CAAA;CAC1E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;CAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC;KACtC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAb,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAA;AAChF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;;AAGjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,OAAO,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,WAAW,CAAC;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAE,CAAA,CAAA;AACjE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,QAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;AACxE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAE,CAAA,CAAA;AACxE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,QAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC;AACxE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAQ,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAQ,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,EAAE,CAAC;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,EAAE,CAAC;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;;AAGjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,OAAO,CAAC;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AAE9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;CAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC;AAC3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAE,CAAA,CAAA;CAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC;AAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;;AAGtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,OAAO,CAAC;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AAE9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;CAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC;AAC3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAE,CAAA,CAAA;CAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC;AAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;;AAGtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;AAChE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,OAAO,CAAC;KAChB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAd,UAAe,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,QAAoD,CAAA,CAAA,CAAA;AACnF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAEpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AAEjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,EAAE,CAAE,CAAA,CAAA;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;AAClD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;AAClD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,aAAa,CAAE,CAAA,CAAA;CAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC;AAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;AAClD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;AAClD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,aAAa,CAAE,CAAA,CAAA;CAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC;AAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA;AAChE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA;AACjC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA;;;;;KAMlC,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAA,CAAA;AAAD,CAAC,CAAA,CAAA,CAAA,CAAA;;AC/uCD,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA,CAAA;AAuCH,CAAA,CAAA,CAAA,CAAM,eAAe,CAAa,CAAA,CAAA,CAAA;AAChC,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,EAAG,CAAI,CAAA,CAAA,CAAA,CAAA;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,EAAG,CAAI,CAAA,CAAA,CAAA,CAAA;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,EAAG,CAAI,CAAA,CAAA,CAAA,CAAA;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,EAAG,CAAI,CAAA,CAAA,CAAA,CAAA;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,EAAG,CAAC,CAAA;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,EAAG,CAAC;CACvB,CAAC;AAwBF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AA4BE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAA4B,CAAA,CAAA,CAAA;QACtC,IAA4B,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAE,CAAA,CAAA;AACpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;CAG7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAG,CAAG,CAAA,CAAA,CAAA,CAAE,OAAO,CAAE,CAAA,CAAA,CAAA,CAAW,EAAE,CAAC;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAa,CAAC;CAEhD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC;AAEjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,EAAE,CAAC;AAErC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AAExB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AAErB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AAEtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAE3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAG,CAAG,CAAA,CAAA,CAAC,UAAU,CAAC;QACnC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAEzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;;AAGtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,GAAG,CAAG,CAAA,CAAA,CAAC,YAAY,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,GAAG,CAAG,CAAA,CAAA,CAAC,iBAAiB,CAAC;AACjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAG,CAAA,CAAA,CAAC,WAAW,CAAC;AAErC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAG,CAAG,CAAA,CAAA,CAAC,UAAU,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,GAAG,CAAG,CAAA,CAAA,CAAC,kBAAkB,CAAC;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,GAAG,CAAG,CAAA,CAAA,CAAC,kBAAkB,CAAC;AAEnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;CACd,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;QAClB,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;AAElB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAE,CAAA,CAAA;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAC,CAAC;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAE,CAAA,CAAA;;AAEpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAE,CAAA,CAAA;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAC,CAAC;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACL,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACN,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;SACP,CAAC;KACH,CAAA;;AAGM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,IAAS,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA;CACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA;YACT,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;QAEtC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAC,CAAA,CAAE,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAA;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,EAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA;AAChD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,KAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAC,EAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;KACd,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,GAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC;KACxB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC;KACzB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;;;AASG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,GAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC;KAC3B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC;KACzB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC;KAC1B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,GAAf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC;KAC5B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,OAAa,CAAA,CAAA,CAAA;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,OAAO,CAAC;KAC1B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC;KACvB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC;KACtB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,gBAAA,CAAhB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,IAAa,CAAA,CAAA,CAAA;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAE,CAAA,CAAA;YAC7B,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,MAAM,CAAE,CAAA,CAAA;AAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,GAAhB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC;KAC1B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,eAAA,CAAf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,IAAa,CAAA,CAAA,CAAA;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;KAC5B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,GAAf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC;KAC5B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,oBAAA,CAApB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAqB,IAAa,CAAA,CAAA,CAAA;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;KACjC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,GAApB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,CAAC;KACjC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,cAAA,CAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,IAAa,CAAA,CAAA,CAAA;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;KAC3B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,GAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC;KAC3B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAlB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,IAAa,CAAA,CAAA,CAAA;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;KAC3B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,GAAlB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC;KAC3B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;;;;AAUG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,GAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAE,CAAA,CAAA;AAC5D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAT,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgC,CAAA,CAAA,CAAA;AAEpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAA,CAAA,CAAA;CACpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;KACJ,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;;AAQG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAP,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA8B,CAAA,CAAA,CAAA;AAEhE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC;AAErC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAG,CAAG,CAAA,CAAA,CAAA;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,EAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,EAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;SACZ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,OAAe,CAAA,CAAA,CAAA;CAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;;AAE/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAkB,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AAClD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAG,CAAE,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAA,CAAG,GAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACzG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;AAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACD,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;KACJ,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,EAAE,CAAC;KAC1C,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,EAAE,CAAC;KAC1C,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,GAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,EAAE,CAAC;KAC3C,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,GAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,EAAE,CAAC;KAC3C,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAAA,CAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,SAAe,CAAA,CAAA,CAAA;QAEzB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA;YACjB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,MAAM,CAAE,CAAA,CAAA;CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,MAAM,CAAE,CAAA,CAAA;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,WAAW,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC;KAC1C,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAA,CAAR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAU,CAAA,CAAA,CAAA;AAEjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAE,CAAA,CAAA;YACnB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;QAC9B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;QACvB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC;KACpB,CAAA;;AAWD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA;AAErB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAE,CAAA,CAAA;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAY,CAAA,CAAA,CAAA,CAAE,CAAC;QACtB,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CACV;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAA;CAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAE,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;;AAKD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,GAAjB,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA;QAC5B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAY,CAAA,CAAA,CAAA,CAAE,CAAC;QACtB,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CACV;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAA;CAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAE,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,SAAS,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;KAC7B,CAAA;;AAKD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,GAAnB,CAAoB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA;QAC9B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAY,CAAA,CAAA,CAAA,CAAE,CAAC;QACtB,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CACV;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAA;CAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAE,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,WAAW,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;KAC7B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;AAOG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAAA,CAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAO,CAAA,CAAA,CAAA;AAGjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAE,CAAA,CAAA;YACnB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,WAAW,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAE,CAAA,CAAA;YACT,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,IAAI,CAAC;CAEb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,EAAE,CAAG,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AAE7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;;AAGrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,aAAa,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAE,CAAA,CAAA;YACT,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,IAAI,CAAC;AAEb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AAEjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;;AAGvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,aAAa,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAE,CAAA,CAAA;YACR,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,MAAM,CAAC;AAEb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,gBAAgB,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAC;AAErC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;;QAGvB,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA;CACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA;CACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAE,CAAA,CAAA;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAC,CAAC,MAAM,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;QAErB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC;AAEnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,aAAa,CAAE,CAAA,CAAC,CAAC,CAAC;AAE/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAAA,CAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA6B,KAAQ,CAAA,CAAA,CAAA;AAInC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAE,CAAA,CAAA;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,WAAW,CAAC;QAChC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;QACzB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC;;AAGpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;CAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;CAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC;CACjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,WAAW,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC;AAE1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;CAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;CAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC;CACjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,WAAW,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC;;AAG1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAE,CAAA,CAAA,CAAE,IAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA;AACtE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAE,CAAA,CAAA;;;AAG/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAID,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;KACd,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,YAAA,CAAZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,KAAY,CAAA,CAAA,CAAA;AAEvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAE,CAAA,CAAA;YACnB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;QAGD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA;CAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA;CAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,WAAW,CAAE,CAAA,CAAA;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;;AAG5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;;AAGrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,WAAW,CAAE,CAAA,CAAA;CACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;;AAG1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,WAAW,CAAE,CAAA,CAAA;CACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;QAG1B,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC;;AAGpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,EAAE,CAAC;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAE,CAAA,CAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;;;AAGvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,cAAc,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;KACrC,CAAA;AAKD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;AAOG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAJ,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA2B,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA2B,CAAA,CAAA,CAAA;AAC7E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;AAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,kBAAkB,CAAE,CAAA,CAAA;;CAEnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAG,CAAA,CAAA,CAAC,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAkB,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,oBAAoB,CAAC;AACrE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAkB,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,oBAAoB,CAAC;;QAGrE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;YACrB,CAAI,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAErB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,kBAAkB,CAAC;AACpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,kBAAkB,CAAC;CACpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,YAAY,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC;CAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC;;QAG3C,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;;AAGtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,IAAI,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAE,CAAA,CAAA;CACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;;AAGtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAE,CAAA,CAAA;;AAEhD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;oBAC3B,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAE,CAAA,CAAA;oBAChB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;gBAGD,CAAC,CAAC,CAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;YAED,CAAI,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,IAAI,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAE,CAAA,CAAA;CAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAE,CAAA,CAAA;YACtB,CAAI,CAAA,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AAEtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,WAAW,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;KACrC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,GAAf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAAA,CAIC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAHC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAC3B,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,CAAK,CAAA,CAAA,CAAA,OAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,MAAM,CAAC,CAAA,CAAA,CAAA,CACnF,CAAC;KACH,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAb,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,CAAA,CAAA,CAAA;AACtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAEhC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAEjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;;QAGjC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA;YAClB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;QAKD,IAAI,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAE,CAAA,CAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;CACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;CACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;CACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;CACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AAEzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,MAAM,CAAE,CAAA,CAAA;;oBAEpE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,MAAM,CAAE,CAAA,CAAA;;oBAEpE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA;YACvC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA;YAC7C,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;QACnE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA;YACnB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAE,CAAA,CAAA;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,aAAa,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,OAAO,CAAC;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,OAAO,CAAC;QAE7B,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC;KACvB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,GAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACN,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,aAAa,CAAC;QAChC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,EAAE,CAAC;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,EAAE,CAAC;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;;YAGjC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;CAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAC,CAAC,CAAC;oBACvB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA;AAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAC,CAAC,CAAC;oBACvB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;AACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;;AAGrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,OAAO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAE,CAAA,CAAA;gBACxC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC;CACpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC;AACpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;;YAGlE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAC,CAAC,CAAC;gBACvB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,cAAA,CAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,OAAgB,CAAA,CAAA,CAAA;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;;QAG/B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA;CAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA;CAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,aAAa,CAAE,CAAA,CAAA;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC;KACvB,CAAA;AA4DD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,GAAF,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA;CACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA;AAC9D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAE,CAAA,CAAA;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAA;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AASD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAH,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA;CAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA;AAC9D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AAC3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;QAC1C,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,KAAK,CAAE,CAAA,CAAC,CAAC,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;IAED,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAY,CAAA,CAAA,CAAA,CAAA,CAAE,CAAU,CAAA,CAAA,CAAA,CAAA,CAAE,CAAU,CAAA,CAAA,CAAA,CAAA,CAAE,IAAU,CAAA,CAAA,CAAA;AACtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AAC3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA;AACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AAC3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACD,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;KACzB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,YAAA,CAAZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,OAAgB,CAAA,CAAA,CAAA;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,eAAe,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;KACxC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,UAAA,CAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,OAAgB,CAAA,CAAA,CAAA;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,aAAa,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;KACtC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAR,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAqB,CAAA,CAAA,CAAA;CAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;KACjD,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAT,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAA,CAAA,CAAA;CACjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,EAAE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;KAC9C,CAAA;CAkBH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;ACroCA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA,CAAA;AASH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AASE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAY,CAAE,EAAE,CAAE,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA;QACpB,IAA4B,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAA;CACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,EAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,WAAW,CAAE,CAAA,CAAA;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAEF,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACL,CAAC,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA;YACT,CAAC,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA;YACT,CAAC,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC;SACV,CAAC;KACH,CAAA;;IAGM,IAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,IAAS,CAAA,CAAA,CAAA;CAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAG,CAAC,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAG,CAAC,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAG,CAAC,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAC;KACZ,CAAA;;AAGM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAS,CAAE,CAAA,CAAS,CAAE,CAAA,CAAS,CAAA,CAAA,CAAA;CACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAC;KACZ,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAC;KACZ,CAAA;IAEM,IAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAO,CAAA,CAAA,CAAA;AAElB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAChC,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;KAC7B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACI,IAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,GAAQ,CAAA,CAAA,CAAA;CACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAIA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAIA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;KAC7E,CAAA;IAEM,IAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAM,CAAA,CAAA,CAAA;KAEnB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAH,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAA,CAAS,CAAE,CAAA,CAAS,CAAA,CAAA,CAAA;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAO,CAAA,CAAA,CAAA;AACT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAO,CAAA,CAAA,CAAA;AACT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAS,CAAA,CAAA,CAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAf,UAAgB,CAAO,CAAA,CAAE,CAAO,CAAA,CAAA,CAAA;CAG9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA;AACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAI,CAAA,CAAA,CAAA,CAAC,KAAK,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAI,CAAA,CAAA,CAAA,CAAC,KAAK,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;KAC7C,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAV,UAAW,CAAO,CAAA,CAAE,CAAO,CAAA,CAAA,CAAA;CACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;KAC1C,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAZ,UAAa,CAAO,CAAA,CAAE,CAAO,CAAA,CAAA,CAAA;CAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CACb,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,EACrB,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CACrB,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CACtB,CAAC;KACH,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAV,UAAW,CAAO,CAAA,CAAE,CAAO,CAAA,CAAA,CAAA;QACzB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KAClD,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAV,UAAW,CAAO,CAAA,CAAE,CAAO,CAAA,CAAA,CAAA;QACzB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KAClD,CAAA;AAEM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAV,UAAW,CAAO,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA;CAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KAC5C,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;IAEM,IAAG,CAAA,CAAA,CAAA,CAAA,CAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAO,CAAA,CAAA,CAAA;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACnC,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAA,CAAA;AAAD,CAAC,CAAA,CAAA,CAAA,CAAA;;AC3MD,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA,CAAA;AAeH,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IAA+B,SAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IAiBlC,SAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAE,EAAc,CAAA,CAAA,CAAA;QAA1C,CAkBC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;QAhBC,IAA4B,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAE,CAAA,CAAA;AACxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,YAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAER,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,aAAa,CAAC;QAEvC,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;QACnD,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AAEnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;;CAC3B,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACL,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAEjB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACvB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAEvB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACvB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACvB,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAC7B,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;SAC9B,CAAC;KACH,CAAA;;IAGM,SAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,IAAS,CAAA,CAAA,CAAA;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,SAAS,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;QACxD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;KACd,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAN,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;KAEC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC;KACtB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;KACpB,CAAA;;CAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAQ,CAAA,CAAA,CAAA;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;KAC9B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,aAAA,CAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAQ,CAAA,CAAA,CAAA;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC;KACvB,CAAA;;CAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAQ,CAAA,CAAA,CAAA;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;KAC9B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,aAAA,CAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAQ,CAAA,CAAA,CAAA;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC;KACvB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAJ,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAN,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;CAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;KACd,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;KACV,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;AAMG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAT,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAE,CAAA,CAAY,CAAA,CAAA,CAAA;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;KACd,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;AAOG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACH,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAqB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAa,CAAA,CAAA,CAAE,UAAkB,CAAA,CAAA,CAAA;;;;;;;CASnF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAE,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;CACxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAE,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;CACxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;AAE3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC;CAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;;;;AAKnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAE,EAAE,CAAE,CAAA,CAAC,CAAC,CAAC;CACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;QAExC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,WAAW,CAAC;CAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;;;CAI9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;CAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;QAC1B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAE,EAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC;AAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAA;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;QACpB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC;AACjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AAC3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;AAOG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAX,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAa,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAA,CAAA,CAAA;AACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC;AACjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC;AAEjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;KAC5B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;AAMG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,GAAX,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAA,CAAA,CAAA;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAG,CAAA,CAAA,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC;AACrE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;KAClB,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,oBAAA,CAApB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAqB,KAAoB,CAAA,CAAA,CAAA;CACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;KAChC,CAAA;IApRM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,MAAe,CAAC;CAqRhC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,SAAA,CAAA;CAAA,CAtR8B,CAAK,CAAA,CAAA,CAAA,CAAA,CAsRnC,CAAA,CAAA;AAEM,CAAA,CAAA,CAAA,CAAM,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AClUpB,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA,CAAA;AAgBH,CAAA,CAAA,CAAA;;;;;;;AAOG,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IAAgC,SAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IAenC,SAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAc,CAAA,CAAA,CAAA;QAAlD,CA0BC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;QAxBC,IAA4B,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAE,CAAA,CAAA;AACzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,YAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAER,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,aAAa,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AAE7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAC,CAAC,IAAI,CAAC;AAEvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAE,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;CACF,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAG,CAAA,CAAA,CAAA;YACX,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACjB,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACzB,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACrB,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACnC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,EAAE,CAAmB,CAAA,CAAA,CAAA,CAAA;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,EAAE,CAAmB,CAAA,CAAA,CAAA,CAAA;SAChC,CAAC;QACF,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;;AAGM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,IAAS,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA;QACvD,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAW,CAAA,CAAA,CAAA,CAAE,CAAC;QAC5B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA;AAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACD,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;QACpD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;KACd,CAAA;;;;;AAOD,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;KACpB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC;KACtB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;AAMG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAAA,CAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,QAAqB,CAAA,CAAA,CAAA;AAG/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;YAC7B,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA;AAC3B,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC,CAAE,CAAA;AAGxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;CACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAE3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC;CACtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;AAMG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,YAAA,CAAZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,QAAqB,CAAA,CAAA,CAAA;AAGhC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;;YAE7B,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA;AAC3B,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC,CAAE,CAAA;AAExB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAN,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,aAAA,CAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,UAAgB,CAAA,CAAA,CAAA;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,UAAU,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;KAC7B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC;KAC1B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,aAAA,CAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,UAAgB,CAAA,CAAA,CAAA;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,UAAU,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;KAC7B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC;KAC1B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAN,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,EAAE,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,eAAe,CAAC;AAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,eAAe,CAAC;AAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;KACd,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;KACzB,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAZ,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAA,CAAA,CAAA;AAE9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;CAE9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;QAC7C,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC;QAEjD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA;YAClB,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC;AACjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,eAAe,CAAC;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,UAAU,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAA;YACjC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC;AACjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,eAAe,CAAC;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,KAAa,CAAA,CAAA,CAAA;AAErB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAE,CAAA,CAAA;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAN,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC;KACtB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;;AAQG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAT,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAE,CAAA,CAAY,CAAA,CAAA,CAAA;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;KACd,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;AAOG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACH,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAqB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAa,CAAA,CAAA,CAAE,UAAkB,CAAA,CAAA,CAAA;CAGnF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,SAAS,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,SAAS,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAC5F,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC,CAAC;KAChD,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;AAOG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAX,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAa,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAA,CAAA,CAAA;AAGvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAC7D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAE,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAC,CAAC,CAAC,CAAC;AAEjE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC;KAC5B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;;AAQG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,GAAX,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAA,CAAA,CAAA;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;KAClB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,GAApB,CAAqB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAA,CAAA,CAAA;AAE3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;KAChC,CAAA;IAhUM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,OAAgB,CAAC;CAiUjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAA,CAAA;CAAA,CAlU+B,CAAK,CAAA,CAAA,CAAA,CAAA,CAkUpC,CAAA,CAAA;AAEM,CAAA,CAAA,CAAA,CAAM,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AClXrB,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA,CAAA;AAiBH,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IAAkC,SAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAWrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAsB,CAAA,CAAA,CAAA;QAAlC,CAkBC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;QAhBC,IAA4B,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAE,CAAA,CAAA;AAC3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,YAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAER,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,aAAa,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AAEjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;CACF,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,YAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACL,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAEjB,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;SAC1B,CAAC;KACH,CAAA;;AAGM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,IAAS,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA;QACvD,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAW,CAAA,CAAA,CAAA,CAAE,CAAC;QAC5B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA;AAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,YAAY,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;AACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;KACd,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,YAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;KACpB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,YAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC;KACtB,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,KAAa,CAAA,CAAA,CAAA;AAErB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;KAC/B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,YAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAN,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;CAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC;AACjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;KACd,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,YAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;KACV,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,YAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAN,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;KAC5B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;;;AASG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,QAAqB,CAAA,CAAA,CAAA;AAExB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAA;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;YACzB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAGA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAC,CAAC;;AAG/D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAW,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACtB,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAC,CAAE,CAAA,CAAA;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAEtB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,eAAe,CAAC,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,iBAAiB,CAAE,CAAA,CAAA;CACtE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC;oBACf,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,MAAM,CAAE,CAAA,CAAA;CACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,MAAM,CAAC;QACd,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA;AAGT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;YACzB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;QAMD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;CACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,EAAE,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjB,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAC,CAAE,CAAA,CAAA;CAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAA;CAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;CACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAc,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAC5B,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC;QACV,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;AAEZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAE,CAAA,CAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC;YAEb,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;YACX,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAC,CAAE,CAAA,CAAA;gBAC1B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA;CACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;oBACP,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA,CAAE,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAA,CAAA,CAAE,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;;gBAEnC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;CACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,EAAE,CAAE,CAAA,CAAA;CACtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC;CACJ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;YAER,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA;gBACb,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA;AAGT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;YACzB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;;AAGjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;QACrB,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAC,CAAE,CAAA,CAAA;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;QAGD,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAC,CAAE,CAAA,CAAA;YAC1B,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;CACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAE,CAAA,CAAC,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AAEhE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;CACjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;QAGD,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;KACvD,CAAA;;IAGD,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAU,CAAA,CAAA,CAAE,CAAU,CAAA,CAAA,CAAE,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,KAAc,CAAA,CAAA,CAAA;;AAElE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAE,EAAE,CAAC,CAAA,CAAE,CAAC,CAAC;AAExC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AAExC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AAEjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAE,CAAA,CAAA;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AAEnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AAEhC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAC;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;;AAGrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,SAAS,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAE,CAAA,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC,CAAC,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;AAMG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAT,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAE,CAAA,CAAO,CAAA,CAAA,CAAA;CAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAErD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;YACrC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9E,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;AAOG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACH,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAqB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAa,CAAA,CAAA,CAAE,UAAkB,CAAA,CAAA,CAAA;;CAGnF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAE,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;CACxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAE,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;CACxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;QAE3B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,WAAW,CAAC;AAE9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC;AAEf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;;;;YAIrC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;AAChF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;YAEnD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;gBACtB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;CAKL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,SAAS,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA;;;AAGxD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,WAAW,CAAC;CAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAC,CAAC;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,SAAS,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA;;;AAG/D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,WAAW,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;YAMD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAID,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;KACd,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;AAOG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAX,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAa,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAA,CAAA,CAAA;QACvD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC;QACpB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAC,QAAQ,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAC,QAAQ,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC;CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;KAC5B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;AAMG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,GAAX,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAA,CAAA,CAAA;AA2B7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;QAC3B,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;QACf,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;;;AAIZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;;AAGtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAE1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AAEzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;;AAErC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AAC3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;CAEzG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;AAErC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;CAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC;;AAGrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,YAAY,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC;AAExE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAC,CAAC,CAAC;AAEjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AAChD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AAEhD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,GAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;AAI/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;;AAG5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAQ,CAAC,CAAC,GAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;;AAGzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;KACvG,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,YAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;YACrC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAC,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AAE3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAE,CAAA,CAAA;oBACtB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;CAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;gBACnC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;AACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,oBAAA,CAApB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAqB,KAAoB,CAAA,CAAA,CAAA;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;KAChC,CAAA;IAxeM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,SAAkB,CAAC;CAyenC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,YAAA,CAAA;CAAA,CA1eiC,CAAK,CAAA,CAAA,CAAA,CAAA,CA0etC,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAE,KAAa,CAAA,CAAA,CAAA;AAGhD,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;IACtB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;;;AAIf,CAAA,CAAA,CAAA,CAAA,IAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AACzB,CAMC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,IAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;IAEvB,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAE,CAAA,CAAA;;QAE9B,CAAM,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC,CAAC,CAAC,CAAC;CACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,KAAK,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC,CAAC,CAAC,CAAC;CAE7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;CAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;CAE5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;AAErC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;CAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAC;;CAGrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;CAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;CAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA;AAID,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AACX,CAAC;AAEM,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;ACtkBvB,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA,CAAA;AASH,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IAA8B,SAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAGxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAU,CAAA,CAAA,CAAE,EAAU,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAA;QAAtE,CASC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;QAPC,IAA4B,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAE,CAAA,CAAA;YACvD,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,YAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAER,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;;CACvC,CAAA,CAAA,CAAA,CAAA;IAXM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,SAAkB,CAAC;CAYnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,QAAA,CAAA;CAAA,CAb6B,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAazC,CAAA,CAAA;AAEM,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;ACjDnB,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA,CAAA;AAgBH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IAAiC,SAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;IAUpC,SAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA;QAAjB,CAsBC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;QApBC,IAA4B,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAE,CAAA,CAAA;AAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,YAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAER,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;QAElB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAE,CAAA,CAAA;AAC5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAEpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;CACF,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACL,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAEjB,CAAC,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA;YACX,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;SACtB,CAAC;KACH,CAAA;;IAGM,WAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,IAAS,CAAA,CAAA,CAAA;QAC3B,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;KAC7C,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAN,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;KAEC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;KACpB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC;KACtB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC;KACjB,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,KAAQ,CAAA,CAAA,CAAA;QAEhB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC;KACjB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAN,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAE,CAAC;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;CAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;KACd,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;KACV,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;AAMG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAT,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAE,CAAA,CAAY,CAAA,CAAA,CAAA;CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC;CAC3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;KACxD,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;AAOG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACH,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAqB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAa,CAAA,CAAA,CAAE,UAAkB,CAAA,CAAA,CAAA;;;;;CAMnF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC;AAC7D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;;AAGzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAE,CAAC,CAAC;CACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;;CAG7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,EAAE,CAAGA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAGA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;;QAGhC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAG,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA;CAC3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAC;AAC1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;KACd,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;AAOG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAX,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAa,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAA,CAAA,CAAA;CACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC;CACtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;CACjE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;KAClE,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;;;AAMG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,GAAX,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAA,CAAA,CAAA;AAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAGA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;AAClE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC;;AAE3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAQ,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAI,CAAA,CAAA,CAAA;CACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC;KAC5E,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,oBAAA,CAApB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAqB,KAAoB,CAAA,CAAA,CAAA;CACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC;AAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;KAChC,CAAA;IArLM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAiB,CAAC;CAuLlC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,WAAA,CAAA;CAAA,CAxLgC,CAAK,CAAA,CAAA,CAAA,CAAA,CAwLrC,CAAA,CAAA;AAEM,CAAA,CAAA,CAAA,CAAM,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AChOtB,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA,CAAA;AAsDH,CAAA,CAAA,CAAA,CAAMK,UAAQ,CAAG,CAAA,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,EAAG,CAAG,CAAA,CAAA,CAAA;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,EAAG,CAAG,CAAA,CAAA;CACnB,CAAC;AAEF,CAAA,CAAA,CAAA;;;;;;AAMG,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IAAmC,SAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IA2BtC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAqB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA,CAAA;QAA7F,CA6CC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;QA3CC,IAA4B,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAE,CAAA,CAAA;AAC5D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AAC/D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;QAGD,IAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,OAAO,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAE,CAAA,CAAA;YACjF,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC;CACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAsB,CAAC;CAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAEA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAAC,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,aAAM,CAAG,CAAA,CAAA,CAAA,CAAE,KAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAC,IAAA,CAAA;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAErB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;;AAGjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAC,CAAC;AAC3G,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAC,CAAC;AAC3G,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAGL,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAG,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAC,CAAC;AACpG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAG,CAAA,CAAA,CAAC,WAAW,CAAC;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,GAAG,CAAG,CAAA,CAAA,CAAC,YAAY,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;;;;;;;;;;;;;;CAgBnB,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACL,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACjB,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACnB,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACnB,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAEzC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAC/B,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAEjC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACjC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACjC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAErB,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACvB,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACnB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;SAClB,CAAC;KACH,CAAA;;AAGM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,IAAS,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA;CACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,OAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,OAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,aAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;KACd,CAAA;;CAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAAA,CAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAMX,CAAA,CAAA,CAAA;QACC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,aAAa,CAAC,CAAA,CAAA,CAAG,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACtE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;aAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;CAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAG,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,aAAa,CAAC,CAAA,CAAA,CAAG,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACtE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;aAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;CAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAG,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAG,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAA;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAC,MAAM,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAG,CAAA,CAAA,CAAC,MAAM,CAAG,CAAA,CAAA,CAAC,EAAE,CAC1B;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAG,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAC,OAAO,CAAE,CAAA,CAAA;AACnE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACzB,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,aAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAA,CAC/C,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAClD,CAAC;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,GAAf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC;KAC5B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,GAAf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC;KAC5B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,SAAA,CAAT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,MAAc,CAAA,CAAA,CAAA;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,MAAM,CAAC;KACxB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,GAAT,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC;KACtB,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,YAAA,CAAZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,EAAU,CAAA,CAAA,CAAA;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;KACzB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC;KAC3B,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,eAAA,CAAf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,KAAa,CAAA,CAAA,CAAA;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;KAC7B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,GAAf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC;KAC5B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;KACxD,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;KACxD,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,gBAAA,CAAhB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,MAAc,CAAA,CAAA,CAAA;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC;KAC9D,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,iBAAA,CAAjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,MAAc,CAAA,CAAA,CAAA;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAC;KACZ,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,uBAAA,CAAvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwB,IAAc,CAAA,CAAA,CAAA;CACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC;CACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC;CACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC;CACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC;CACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;CAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC;CACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC;CAEvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAC,CAAC;CAChF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAC,CAAC;AAChF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;;CAGtE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAE,CAAA,CAAA;CAChC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,IAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACtE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC;;AAGjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AAEnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAE,CAAA,CAAA;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;;YAGjC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAGA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC;;AAGjD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;;CAG1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC;;AAGtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AAC9D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAEvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;;AAErB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAE/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,SAAS,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;CAEpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAC,CAAC,CAAC;CAEtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAC,CAAC,CAAC;AAEvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC;CACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;QAC/B,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC;CACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;KAChC,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,wBAAA,CAAxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAyB,IAAc,CAAA,CAAA,CAAA;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;;AAGnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAC3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;CAC3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAC,CAAC;AAE/D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC;AAC3D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,OAAO,CAAC;AAE1B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;CAC7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAC,CAAC,CAAC;CACtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAC,CAAC,CAAC;QAEtD,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC;CACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;QAC/B,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC;CACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;KAChC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,wBAAA,CAAxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAyB,IAAc,CAAA,CAAA,CAAA;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAE,CAAA,CAAA;;AAE5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC;CACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC;AAEvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,MAAM,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAC;AACpE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,MAAM,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAC;CACpE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,EAAE,CAAE,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;AAEvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,QAAQ,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAGA,CAAI,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,CAAC,CAAC;CAE3E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAG,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAC,CAAC;CACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;CAEtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC,CAAC;CAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAC;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC,CAAC;QAE/C,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC;CACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;QAC/B,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC;CACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;CAE/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC;KAC1C,CAAA;IA1WM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,gBAAyB,CAAC;CA4W1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,aAAA,CAAA;CAAA,CA7WkC,KAAK,CA6WvC,CAAA,CAAA;;ACrcD,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA,CAAA;AA2CH,CAAA,CAAA,CAAA,CAAMK,UAAQ,CAAG,CAAA,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAG,CAAG,CAAA,CAAA,CAAA;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAG,CAAG,CAAA,CAAA,CAAA;CAChB,CAAC;AAEF,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IAAmC,SAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AA4BtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAqB,CAAA,CAAA,CAAA,CAAE,KAAY,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA,CAAA,CAAA;QAA5E,CAiCC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;QA/BC,IAA4B,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAE,CAAA,CAAA;YAC5D,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAEA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAAC,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,aAAM,CAAG,CAAA,CAAA,CAAA,CAAE,KAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAC,IAAA,CAAA;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAErB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC;AAEjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAC,CAAC;AACzG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAC,CAAC;;AAGzG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAC,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAG,CAAG,CAAA,CAAA,CAAC,QAAQ,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,GAAG,CAAG,CAAA,CAAA,CAAC,SAAS,CAAC;;;;;;;;;;;;CAalC,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACL,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACjB,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACnB,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACnB,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAEzC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACzB,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAE3B,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACjC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;SAClC,CAAC;KACH,CAAA;;AAGM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,IAAS,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA;CACrD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,OAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,OAAO,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,aAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;KACd,CAAA;;CAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAAA,CAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAKX,CAAA,CAAA,CAAA;QACC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,aAAa,CAAC,CAAA,CAAA,CAAG,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACtE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;aAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;CAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAG,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAE,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,aAAa,CAAC,CAAA,CAAA,CAAG,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AACtE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;aAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;CAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAG,CAAA,CAAA,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;KACF,CAAA;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,GAAf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC;KAC5B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,GAAf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC;KAC5B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,WAAA,CAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,KAAa,CAAA,CAAA,CAAA;AAEvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAC;KACzB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,GAAX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC;KACxB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,YAAA,CAAZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,MAAc,CAAA,CAAA,CAAA;AAEzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,MAAM,CAAC;KAC3B,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QACE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC;KACzB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;KACxD,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,GAAV,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;KACxD,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,gBAAA,CAAhB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,MAAc,CAAA,CAAA,CAAA;CAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;KACtD,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,iBAAA,CAAjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,MAAc,CAAA,CAAA,CAAA;AAC9B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,gBAAgB,CAAC;KACvC,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,uBAAA,CAAvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwB,IAAc,CAAA,CAAA,CAAA;CACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC;CACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC;CACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC;CACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC;CACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC;CAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC;CACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,EAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC;;CAGvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAC,CAAC;CAChF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAC,CAAC;;;;;;;;AAWhF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAExB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,EAAE,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AAC9D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;CAC1E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;AAC9D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAElB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,EAAE,CAAC;AAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAE,CAAA,CAAA;CAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC;AAC/C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;QAED,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAE,CAAA,CAAA;;CAErB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAC,CAAA,CAAA,CAAG,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAEtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,eAAe,CAAC,CAAC,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;AAEnE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,aAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAC,CAAC;AAEtE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAC,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,aAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAC,CAAC;AAEvE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;CAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;CAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;CAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;KAChC,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,wBAAA,CAAxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAyB,IAAc,CAAA,CAAA,CAAA;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,CAAC;AAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC;AAC3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAE,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,OAAO,CAAC;AAExB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGlB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,OAAO,CAAG,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,gBAAgB,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,UAAU,CAAG,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,WAAW,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,GAAGL,CAAI,CAAA,CAAA,CAAA,CAAC,KAAK,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,OAAO,CAC9D,CAAA,CAAC,UAAU,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,UAAU,CAAC;AAE7C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,OAAO,CAAC;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,OAAO,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YACE,IAAM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAE,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC,CAAA,CAAE,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAC,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAE,EAC7E,CAAI,CAAA,CAAA,CAAA,CAAC,YAAY,CAAC,CAAA,CAAE,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAC/D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,eAAe,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;CAElC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,UAAU,CAAG,CAAA,CAAA,CAAC,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAEvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAE,CAAA,CAAA;AAClE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAC;AACjC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC;AACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;YAED,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC;AAErD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AAElD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;AACnD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;CAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;CAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;CAC/B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,UAAU,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAE,CAAC;KAChC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,wBAAA,CAAxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAyB,IAAc,CAAA,CAAA,CAAA;AACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;IAhUM,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,gBAAyB,CAAC;CAkU1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,aAAA,CAAA;CAAA,CAnUkC,KAAK,CAmUvC,CAAA,CAAA;;AC/YD,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA,CAAA;AASH,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAOE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,KAAA,CAAY,CAAQ,EAAE,CAAQ,CAAA,CAAE,CAAQ,CAAA,CAAA,CAAA;CACtC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,OAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,QAAQ,CAAI,CAAA,CAAA,CAAA,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA;CACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;CACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;CACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AACvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACF,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAO,CAAI,CAAA,CAAA,CAAA,CAAC,SAAS,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC;KAC7B,CAAA;IAEM,KAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,GAAQ,CAAA,CAAA,CAAA;CACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAE,CAAA,CAAA;AAC9C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,KAAK,CAAC;AACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC;KAC7E,CAAA;IAEM,KAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAM,CAAA,CAAA,CAAA;KAEnB,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAEG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAE,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC;KACb,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAO,CAAA,CAAA,CAAA;CACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;QAC1D,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;CACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CACtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;CACtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,EAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAC,CAAC,CAAC,CAAC;AACtD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;KACV,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;;AAIG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAO,CAAA,CAAA,CAAA;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;CACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC;QAChC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAM,CAAC,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,EAAE,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAG,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,GAAG,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC;KACV,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,YAAA,CAAZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAQ,CAAA,CAAA,CAAA;AACnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;CACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC;QACxB,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,CAAC;CACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,CAAC;AAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;CACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,CAAC;CAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAC,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;AACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,CAAC;KACd,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAGG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,eAAA,CAAf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAQ,CAAA,CAAA,CAAA;CACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;QAC1D,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA;AACf,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAC;AACjB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC;AAEtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;CAEvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;AACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC;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"} \ No newline at end of file diff --git a/dist/planck.d.ts b/dist/planck.d.ts index 09cdb2a4..fc57042f 100644 --- a/dist/planck.d.ts +++ b/dist/planck.d.ts @@ -4,38 +4,19 @@ declare namespace Serializer { var fromJson: any; } declare const math: Math & { - readonly EPSILON: number; - /** - * This function is used to ensure that a floating point number is not a NaN or - * infinity. - */ - isFinite(x: any): boolean; - assert(x: any): void; - /** - * This is a approximate yet fast inverse square-root (todo). - */ - invSqrt(x: number): number; - /** - * Next Largest Power of 2 Given a binary integer value x, the next largest - * power of 2 can be computed by a SWAR algorithm that recursively "folds" the - * upper bits into the lower bits. This process yields a bit vector with the - * same most significant 1 as x, but all 1's below it. Adding 1 to that value - * yields the next largest power of 2. For a 32-bit value: - */ - nextPowerOfTwo(x: number): number; - isPowerOfTwo(x: number): boolean; - mod(num: number, min?: number, max?: number): number; - /** - * Returns a min if num is less than min, and max if more than max, otherwise returns num. - */ - clamp(num: number, min: number, max: number): number; - /** - * Returns a random number between min and max when two arguments are provided. - * If one arg is provided between 0 to max. - * If one arg is passed between 0 to 1. - */ - random(min?: number, max?: number): number; + EPSILON: number; + isFinite: (x: unknown) => boolean; + assert: (x: any) => void; + nextPowerOfTwo: (x: number) => number; + isPowerOfTwo: (x: number) => boolean; + mod: (num: number, min?: number, max?: number) => number; + clamp: (num: number, min: number, max: number) => number; + random: (min?: number, max?: number) => number; }; +interface Vec2Value { + x: number; + y: number; +} declare function Vec2(x: number, y: number): Vec2; declare function Vec2(obj: { x: number; @@ -52,7 +33,7 @@ declare class Vec2 { }); constructor(); static zero(): Vec2; - static clone(v: Vec2): Vec2; + static clone(v: Vec2Value): Vec2; /** * Does this vector contain finite coordinates? */ @@ -66,7 +47,7 @@ declare class Vec2 { */ setZero(): Vec2; set(x: number, y: number): Vec2; - set(value: Vec2): Vec2; + set(value: Vec2Value): Vec2; /** * Set this vector to some specified coordinates. * @@ -78,38 +59,38 @@ declare class Vec2 { * * @returns this */ - setVec2(value: Vec2): this; + setVec2(value: Vec2Value): this; /** * Set linear combination of v and w: `a * v + b * w` */ - setCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2; - setMul(a: number, v: Vec2): Vec2; + setCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2; + setMul(a: number, v: Vec2Value): Vec2; /** * Add a vector to this vector. * * @returns this */ - add(w: Vec2): Vec2; + add(w: Vec2Value): Vec2; /** * Add linear combination of v and w: `a * v + b * w` */ - addCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2; - addMul(a: number, v: Vec2): Vec2; + addCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2; + addMul(a: number, v: Vec2Value): Vec2; /** * @deprecated Use subCombine or subMul */ - wSub(a: number, v: Vec2, b?: number, w?: Vec2): Vec2; + wSub(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2; /** * Subtract linear combination of v and w: `a * v + b * w` */ - subCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2; - subMul(a: number, v: Vec2): Vec2; + subCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2; + subMul(a: number, v: Vec2Value): Vec2; /** * Subtract a vector from this vector * * @returns this */ - sub(w: Vec2): Vec2; + sub(w: Vec2Value): Vec2; /** * Multiply this vector by a scalar. * @@ -137,64 +118,64 @@ declare class Vec2 { * * For performance, use this instead of lengthSquared (if possible). */ - static lengthOf(v: Vec2): number; + static lengthOf(v: Vec2Value): number; /** * Get the length squared. */ - static lengthSquared(v: Vec2): number; - static distance(v: Vec2, w: Vec2): number; - static distanceSquared(v: Vec2, w: Vec2): number; - static areEqual(v: Vec2, w: Vec2): boolean; + static lengthSquared(v: Vec2Value): number; + static distance(v: Vec2Value, w: Vec2Value): number; + static distanceSquared(v: Vec2Value, w: Vec2Value): number; + static areEqual(v: Vec2Value, w: Vec2Value): boolean; /** * Get the skew vector such that dot(skew_vec, other) == cross(vec, other) */ - static skew(v: Vec2): Vec2; + static skew(v: Vec2Value): Vec2; /** * Perform the dot product on two vectors. */ - static dot(v: Vec2, w: Vec2): number; - static cross(v: Vec2, w: Vec2): number; - static cross(v: Vec2, w: number): Vec2; - static cross(v: number, w: Vec2): Vec2; + static dot(v: Vec2Value, w: Vec2Value): number; + static cross(v: Vec2Value, w: Vec2Value): number; + static cross(v: Vec2Value, w: number): Vec2; + static cross(v: number, w: Vec2Value): Vec2; /** * Perform the cross product on two vectors. In 2D this produces a scalar. */ - static crossVec2Vec2(v: Vec2, w: Vec2): number; + static crossVec2Vec2(v: Vec2Value, w: Vec2Value): number; /** * Perform the cross product on a vector and a scalar. In 2D this produces a * vector. */ - static crossVec2Num(v: Vec2, w: number): Vec2; + static crossVec2Num(v: Vec2Value, w: number): Vec2; /** * Perform the cross product on a vector and a scalar. In 2D this produces a * vector. */ - static crossNumVec2(v: number, w: Vec2): Vec2; - static addCross(a: Vec2, v: Vec2, w: number): Vec2; - static addCross(a: Vec2, v: number, w: Vec2): Vec2; + static crossNumVec2(v: number, w: Vec2Value): Vec2; + static addCross(a: Vec2Value, v: Vec2Value, w: number): Vec2; + static addCross(a: Vec2Value, v: number, w: Vec2Value): Vec2; /** * Returns `a + (v x w)` */ - static addCrossVec2Num(a: Vec2, v: Vec2, w: number): Vec2; + static addCrossVec2Num(a: Vec2Value, v: Vec2Value, w: number): Vec2; /** * Returns `a + (v x w)` */ - static addCrossNumVec2(a: Vec2, v: number, w: Vec2): Vec2; - static add(v: Vec2, w: Vec2): Vec2; + static addCrossNumVec2(a: Vec2Value, v: number, w: Vec2Value): Vec2; + static add(v: Vec2Value, w: Vec2Value): Vec2; static combine(a: number, v: Vec2, b: number, w: Vec2): Vec2; - static sub(v: Vec2, w: Vec2): Vec2; - static mul(a: Vec2, b: number): Vec2; - static mul(a: number, b: Vec2): Vec2; - static mulVec2Num(a: Vec2, b: number): Vec2; - static mulNumVec2(a: number, b: Vec2): Vec2; + static sub(v: Vec2Value, w: Vec2Value): Vec2; + static mul(a: Vec2Value, b: number): Vec2; + static mul(a: number, b: Vec2Value): Vec2; + static mulVec2Num(a: Vec2Value, b: number): Vec2; + static mulNumVec2(a: number, b: Vec2Value): Vec2; neg(): Vec2; - static neg(v: Vec2): Vec2; - static abs(v: Vec2): Vec2; - static mid(v: Vec2, w: Vec2): Vec2; - static upper(v: Vec2, w: Vec2): Vec2; - static lower(v: Vec2, w: Vec2): Vec2; + static neg(v: Vec2Value): Vec2; + static abs(v: Vec2Value): Vec2; + static mid(v: Vec2Value, w: Vec2Value): Vec2; + static upper(v: Vec2Value, w: Vec2Value): Vec2; + static lower(v: Vec2Value, w: Vec2Value): Vec2; clamp(max: number): Vec2; - static clamp(v: Vec2, max: number): Vec2; + static clamp(v: Vec2Value, max: number): Vec2; } declare function Vec3(x: number, y: number, z: number): Vec3; declare function Vec3(obj: { @@ -372,14 +353,14 @@ declare class Rot { /** Transpose multiply two rotations: qT * r */ static mulTRot(rot: Rot, m: Rot): Rot; /** Inverse rotate a vector */ - static mulTVec2(rot: Rot, m: Vec2): Vec2; + static mulTVec2(rot: Rot, m: Vec2Value): Vec2; } /** * A transform contains translation and rotation. It is used to represent the * position and orientation of rigid frames. Initialize using a position vector * and a rotation. */ -declare function Transform(position?: Vec2, rotation?: number): Transform; +declare function Transform(position?: Vec2Value, rotation?: number): Transform; /** * A transform contains translation and rotation. It is used to represent the * position and orientation of rigid frames. Initialize using a position vector @@ -390,7 +371,7 @@ declare class Transform { p: Vec2; /** rotation */ q: Rot; - constructor(position?: Vec2, rotation?: number); + constructor(position?: Vec2Value, rotation?: number); static clone(xf: Transform): Transform; static identity(): Transform; /** @@ -406,15 +387,15 @@ declare class Transform { setTransform(xf: Transform): void; static isValid(obj: any): boolean; static assert(o: any): void; - static mul(a: Transform, b: Vec2): Vec2; + static mul(a: Transform, b: Vec2Value): Vec2; static mul(a: Transform, b: Transform): Transform; - static mulAll(a: Transform, b: Vec2[]): Vec2[]; + static mulAll(a: Transform, b: Vec2Value[]): Vec2[]; static mulAll(a: Transform, b: Transform[]): Transform[]; - static mulVec2(a: Transform, b: Vec2): Vec2; + static mulVec2(a: Transform, b: Vec2Value): Vec2; static mulXf(a: Transform, b: Transform): Transform; - static mulT(a: Transform, b: Vec2): Vec2; + static mulT(a: Transform, b: Vec2Value): Vec2; static mulT(a: Transform, b: Transform): Transform; - static mulTVec2(a: Transform, b: Vec2): Vec2; + static mulTVec2(a: Transform, b: Vec2Value): Vec2; static mulTXf(a: Transform, b: Transform): Transform; } /** @@ -434,11 +415,11 @@ interface RayCastOutput { normal: Vec2; fraction: number; } -declare function AABB(lower?: Vec2, upper?: Vec2): AABB; +declare function AABB(lower?: Vec2Value, upper?: Vec2Value): AABB; declare class AABB { lowerBound: Vec2; upperBound: Vec2; - constructor(lower?: Vec2, upper?: Vec2); + constructor(lower?: Vec2Value, upper?: Vec2Value); /** * Verify that the bounds are sorted. */ @@ -461,7 +442,7 @@ declare class AABB { * Combine one or two AABB into this one. */ combine(a: AABB, b?: AABB): void; - combinePoints(a: Vec2, b: Vec2): void; + combinePoints(a: Vec2Value, b: Vec2Value): void; set(aabb: AABB): void; contains(aabb: AABB): boolean; extend(value: number): AABB; @@ -867,7 +848,7 @@ declare class Fixture { /** * Test a point in world coordinates for containment in this fixture. */ - testPoint(p: Vec2): boolean; + testPoint(p: Vec2Value): boolean; /** * Cast a ray against this shape. */ @@ -1106,6 +1087,27 @@ declare class ContactEdge { constructor(contact: Contact); } type EvaluateFunction = (manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number) => void; +type ContactCallback = (manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number) => void /* & { destroyFcn?: (contact: Contact) => void }*/; +/** + * Friction mixing law. The idea is to allow either fixture to drive the + * restitution to zero. For example, anything slides on ice. + */ +declare function mixFriction(friction1: number, friction2: number): number; +/** + * Restitution mixing law. The idea is allow for anything to bounce off an + * inelastic surface. For example, a superball bounces on anything. + */ +declare function mixRestitution(restitution1: number, restitution2: number): number; +// TODO: merge with ManifoldPoint? +declare class VelocityConstraintPoint { + rA: Vec2; + rB: Vec2; + normalImpulse: number; + tangentImpulse: number; + normalMass: number; + tangentMass: number; + velocityBias: number; +} /** * The class manages contact between two shapes. A contact exists for each * overlapping AABB in the broad-phase (except if filtered). Therefore a contact @@ -1997,11 +1999,11 @@ declare class Body { /** * Gets the corresponding local point of a world point. */ - getLocalPoint(worldPoint: Vec2): Vec2; + getLocalPoint(worldPoint: Vec2Value): Vec2; /** * Gets the corresponding local vector of a world vector. */ - getLocalVector(worldVector: Vec2): Vec2; + getLocalVector(worldVector: Vec2Value): Vec2; } /** * Input for Distance. You have to option to use the shape radii in the @@ -2047,7 +2049,14 @@ declare class SimplexCache { * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On * the first call set SimplexCache.count to zero. */ -declare function Distance(output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void; +declare const Distance: { + (output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void; + testOverlap: (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform) => boolean; + Input: typeof DistanceInput; + Output: typeof DistanceOutput; + Proxy: typeof DistanceProxy; + Cache: typeof SimplexCache; +}; /** * A distance proxy is used by the GJK algorithm. It encapsulates any shape. */ @@ -2079,6 +2088,11 @@ declare class DistanceProxy { */ set(shape: Shape, index: number): void; } +/** + * Determine if two generic shapes overlap. + */ +declare const testOverlap: (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform) => boolean; +// todo make shape an interface /** * A shape is used for collision detection. You can create a shape however you * like. Shapes used for simulation in World are created automatically when a @@ -2088,14 +2102,14 @@ declare abstract class Shape { m_type: ShapeType; m_radius: number; static isValid(obj: any): boolean; - getRadius(): number; + abstract getRadius(): number; /** * Get the type of this shape. You can use this to down cast to the concrete * shape. * * @return the shape type. */ - getType(): ShapeType; + abstract getType(): ShapeType; /** * Get the number of child primitives. */ @@ -2107,7 +2121,7 @@ declare abstract class Shape { * @param xf The shape world transform. * @param p A point in world coordinates. */ - abstract testPoint(xf: Transform, p: Vec2): boolean; + abstract testPoint(xf: Transform, p: Vec2Value): boolean; /** * Cast a ray against a child shape. * @@ -2137,16 +2151,16 @@ declare abstract class Shape { abstract computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void; } type ShapeType = "circle" | "edge" | "polygon" | "chain"; -declare const CircleShape: { - new (position: Vec2, radius?: number): CircleShape; - (position: Vec2, radius?: number): CircleShape; - new (radius?: number): CircleShape; - (radius?: number): CircleShape; - TYPE: "circle"; -}; -declare interface CircleShape extends Shape { +declare function CircleShape(position: Vec2Value, radius?: number): CircleShape; +declare function CircleShape(radius?: number): CircleShape; +declare class CircleShape extends Shape { + static TYPE: "circle"; + m_type: "circle"; m_p: Vec2; - // TODO: already defined in Shape + m_radius: number; + constructor(position: Vec2Value, radius?: number); + constructor(radius?: number); + getType(): "circle"; getRadius(): number; getCenter(): Vec2; getVertex(index: 0): Vec2; @@ -2161,7 +2175,7 @@ declare interface CircleShape extends Shape { * @param xf The shape world transform. * @param p A point in world coordinates. */ - testPoint(xf: Transform, p: Vec2): boolean; + testPoint(xf: Transform, p: Vec2Value): boolean; /** * Cast a ray against a child shape. * @@ -2190,17 +2204,22 @@ declare interface CircleShape extends Shape { computeMass(massData: MassData, density: number): void; computeDistanceProxy(proxy: DistanceProxy): void; } -declare const EdgeShape: { - new (v1?: Vec2, v2?: Vec2): EdgeShape; - (v1?: Vec2, v2?: Vec2): EdgeShape; - TYPE: "edge"; -}; +declare const Circle: typeof CircleShape; /** * A line segment (edge) shape. These can be connected in chains or loops to * other edge shapes. The connectivity information is used to ensure correct * contact normals. */ -declare interface EdgeShape extends Shape { +declare function EdgeShape(v1?: Vec2Value, v2?: Vec2Value): EdgeShape; +/** + * A line segment (edge) shape. These can be connected in chains or loops to + * other edge shapes. The connectivity information is used to ensure correct + * contact normals. + */ +declare class EdgeShape extends Shape { + static TYPE: "edge"; + m_type: "edge"; + m_radius: number; // These are the edge vertices m_vertex1: Vec2; m_vertex2: Vec2; @@ -2210,6 +2229,9 @@ declare interface EdgeShape extends Shape { m_vertex3: Vec2; m_hasVertex0: boolean; m_hasVertex3: boolean; + constructor(v1?: Vec2Value, v2?: Vec2Value); + getRadius(): number; + getType(): "edge"; /** * Optional next vertex, used for smooth collision. */ @@ -2241,7 +2263,7 @@ declare interface EdgeShape extends Shape { * @param xf The shape world transform. * @param p A point in world coordinates. */ - testPoint(xf: Transform, p: Vec2): false; + testPoint(xf: Transform, p: Vec2Value): false; /** * Cast a ray against a child shape. * @@ -2270,24 +2292,32 @@ declare interface EdgeShape extends Shape { computeMass(massData: MassData, density?: number): void; computeDistanceProxy(proxy: DistanceProxy): void; } -declare const PolygonShape: { - // @ts-ignore - new (vertices?: Vec2[]): PolygonShape; - // @ts-ignore - (vertices?: Vec2[]): PolygonShape; - TYPE: "polygon"; -}; +declare const Edge: typeof EdgeShape; /** * A convex polygon. It is assumed that the interior of the polygon is to the * left of each edge. Polygons have a maximum number of vertices equal to * Settings.maxPolygonVertices. In most cases you should not need many vertices * for a convex polygon. extends Shape */ -declare interface PolygonShape extends Shape { +declare function PolygonShape(vertices?: Vec2Value[]): PolygonShape; +/** + * A convex polygon. It is assumed that the interior of the polygon is to the + * left of each edge. Polygons have a maximum number of vertices equal to + * Settings.maxPolygonVertices. In most cases you should not need many vertices + * for a convex polygon. extends Shape + */ +declare class PolygonShape extends Shape { + static TYPE: "polygon"; + m_type: "polygon"; m_centroid: Vec2; m_vertices: Vec2[]; // [Settings.maxPolygonVertices] m_normals: Vec2[]; // [Settings.maxPolygonVertices] m_count: number; + m_radius: number; + // @ts-ignore + constructor(vertices?: Vec2Value[]); + getType(): "polygon"; + getRadius(): number; getVertex(index: number): Vec2; /** * Get the number of child primitives. @@ -2334,11 +2364,7 @@ declare interface PolygonShape extends Shape { validate(): boolean; computeDistanceProxy(proxy: DistanceProxy): void; } -declare const ChainShape: { - new (vertices?: Vec2[], loop?: boolean): ChainShape; - (vertices?: Vec2[], loop?: boolean): ChainShape; - TYPE: "chain"; -}; +declare const Polygon: typeof PolygonShape; /** * A chain shape is a free form sequence of line segments. The chain has * two-sided collision, so you can use inside and outside collision. Therefore, @@ -2347,7 +2373,19 @@ declare const ChainShape: { * * WARNING: The chain will not collide properly if there are self-intersections. */ -declare interface ChainShape extends Shape { +declare function ChainShape(vertices?: Vec2Value[], loop?: boolean): ChainShape; +/** + * A chain shape is a free form sequence of line segments. The chain has + * two-sided collision, so you can use inside and outside collision. Therefore, + * you may use any winding order. Connectivity information is used to create + * smooth collisions. + * + * WARNING: The chain will not collide properly if there are self-intersections. + */ +declare class ChainShape extends Shape { + static TYPE: "chain"; + m_type: "chain"; + m_radius: number; m_vertices: Vec2[]; m_count: number; m_prevVertex: Vec2 | null; @@ -2355,6 +2393,13 @@ declare interface ChainShape extends Shape { m_hasPrevVertex: boolean; m_hasNextVertex: boolean; m_isLoop: boolean; + constructor(vertices?: Vec2Value[], loop?: boolean); + // clear() { + // this.m_vertices.length = 0; + // this.m_count = 0; + // } + getType(): "chain"; + getRadius(): number; /** * Establish connectivity to a vertex that precedes the first vertex. Don't call * this for loops. @@ -2384,7 +2429,7 @@ declare interface ChainShape extends Shape { * @param xf The shape world transform. * @param p A point in world coordinates. */ - testPoint(xf: Transform, p: Vec2): false; + testPoint(xf: Transform, p: Vec2Value): false; /** * Cast a ray against a child shape. * @@ -2415,20 +2460,23 @@ declare interface ChainShape extends Shape { computeMass(massData: MassData, density?: number): void; computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void; } -declare const BoxShape: { - new (hx: number, hy: number, center?: Vec2, angle?: number): BoxShape; - (hx: number, hy: number, center?: Vec2, angle?: number): BoxShape; - TYPE: "polygon"; -}; +declare const Chain: typeof ChainShape; +/** + * A rectangle polygon which extend PolygonShape. + */ +declare function BoxShape(hx: number, hy: number, center?: Vec2Value, angle?: number): BoxShape; /** * A rectangle polygon which extend PolygonShape. */ -declare interface BoxShape extends PolygonShape { +declare class BoxShape extends PolygonShape { + static TYPE: "polygon"; + constructor(hx: number, hy: number, center?: Vec2Value, angle?: number); } -declare function CollideCircles(manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void; +declare const Box: typeof BoxShape; +declare const CollideCircles: (manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform) => void; // Compute contact points for edge versus circle. // This accounts for edge connectivity. -declare function CollideEdgeCircle(manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void; +declare const CollideEdgeCircle: (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform) => void; /** * * Find edge normal of max separation on A - return if separating axis is found
@@ -2439,13 +2487,13 @@ declare function CollideEdgeCircle(manifold: Manifold, edgeA: EdgeShape, xfA: Tr * * The normal points from 1 to 2 */ -declare function CollidePolygons(manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform): void; -declare function CollidePolygonCircle(manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void; +declare const CollidePolygons: (manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform) => void; +declare const CollidePolygonCircle: (manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform) => void; /** * This function collides and edge and a polygon, taking into account edge * adjacency. */ -declare function CollideEdgePolygon(manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform): void; +declare const CollideEdgePolygon: (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform) => void; /** * Distance joint definition. This requires defining an anchor point on both * bodies and the non-zero length of the distance joint. The definition uses @@ -2484,13 +2532,6 @@ interface DistanceJointDef extends JointDef, DistanceJointOpt { */ localAnchorB: Vec2; } -declare const DistanceJoint: { - new (def: DistanceJointDef): DistanceJoint; - (def: DistanceJointDef): DistanceJoint; - new (def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2): DistanceJoint; - (def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2): DistanceJoint; - TYPE: "distance-joint"; -}; /** * A distance joint constrains two points on two bodies to remain at a fixed * distance from each other. You can view this as a massless, rigid rod. @@ -2498,7 +2539,26 @@ declare const DistanceJoint: { * @param anchorA Anchor A in global coordination. * @param anchorB Anchor B in global coordination. */ -declare interface DistanceJoint extends Joint { +declare function DistanceJoint(def: DistanceJointDef): DistanceJoint; +/** + * A distance joint constrains two points on two bodies to remain at a fixed + * distance from each other. You can view this as a massless, rigid rod. + * + * @param anchorA Anchor A in global coordination. + * @param anchorB Anchor B in global coordination. + */ +declare function DistanceJoint(def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2): DistanceJoint; +/** + * A distance joint constrains two points on two bodies to remain at a fixed + * distance from each other. You can view this as a massless, rigid rod. + * + * @param anchorA Anchor A in global coordination. + * @param anchorB Anchor B in global coordination. + */ +declare class DistanceJoint extends Joint { + static TYPE: "distance-joint"; + constructor(def: DistanceJointDef); + constructor(def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2); /** * The local anchor point relative to bodyA's origin. */ @@ -2569,20 +2629,30 @@ interface FrictionJointDef extends JointDef, FrictionJointOpt { */ localAnchorB: Vec2; } -declare const FrictionJoint: { - new (def: FrictionJointDef): FrictionJoint; - (def: FrictionJointDef): FrictionJoint; - new (def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): FrictionJoint; - (def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): FrictionJoint; - TYPE: "friction-joint"; -}; /** * Friction joint. This is used for top-down friction. It provides 2D * translational friction and angular friction. * * @param anchor Anchor in global coordination. */ -declare interface FrictionJoint extends Joint { +declare function FrictionJoint(def: FrictionJointDef): FrictionJoint; +/** + * Friction joint. This is used for top-down friction. It provides 2D + * translational friction and angular friction. + * + * @param anchor Anchor in global coordination. + */ +declare function FrictionJoint(def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): FrictionJoint; +/** + * Friction joint. This is used for top-down friction. It provides 2D + * translational friction and angular friction. + * + * @param anchor Anchor in global coordination. + */ +declare class FrictionJoint extends Joint { + static TYPE: "friction-joint"; + constructor(def: FrictionJointDef); + constructor(def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); /** * The local anchor point relative to bodyA's origin. */ @@ -2695,15 +2765,6 @@ interface RevoluteJointDef extends JointDef, RevoluteJointOpt { */ referenceAngle: number; } -declare const RevoluteJoint: { - // TODO enum - new (def: RevoluteJointDef): RevoluteJoint; - // TODO enum - (def: RevoluteJointDef): RevoluteJoint; - new (def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): RevoluteJoint; - (def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): RevoluteJoint; - TYPE: "revolute-joint"; -}; /** * A revolute joint constrains two bodies to share a common point while they are * free to rotate about the point. The relative rotation about the shared point @@ -2712,7 +2773,29 @@ declare const RevoluteJoint: { * relative rotation about the shared point. A maximum motor torque is provided * so that infinite forces are not generated. */ -declare interface RevoluteJoint extends Joint { +declare function RevoluteJoint(def: RevoluteJointDef): RevoluteJoint; +/** + * A revolute joint constrains two bodies to share a common point while they are + * free to rotate about the point. The relative rotation about the shared point + * is the joint angle. You can limit the relative rotation with a joint limit + * that specifies a lower and upper angle. You can use a motor to drive the + * relative rotation about the shared point. A maximum motor torque is provided + * so that infinite forces are not generated. + */ +declare function RevoluteJoint(def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): RevoluteJoint; +/** + * A revolute joint constrains two bodies to share a common point while they are + * free to rotate about the point. The relative rotation about the shared point + * is the joint angle. You can limit the relative rotation with a joint limit + * that specifies a lower and upper angle. You can use a motor to drive the + * relative rotation about the shared point. A maximum motor torque is provided + * so that infinite forces are not generated. + */ +declare class RevoluteJoint extends Joint { + static TYPE: "revolute-joint"; + // TODO enum + constructor(def: RevoluteJointDef); + constructor(def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); /** * The local anchor point relative to bodyA's origin. */ @@ -2863,20 +2946,30 @@ interface PrismaticJointDef extends JointDef, PrismaticJointOpt { */ referenceAngle: number; } -declare const PrismaticJoint: { - new (def: PrismaticJointDef): PrismaticJoint; - (def: PrismaticJointDef): PrismaticJoint; - new (def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2): PrismaticJoint; - (def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2): PrismaticJoint; - TYPE: "prismatic-joint"; -}; /** * A prismatic joint. This joint provides one degree of freedom: translation * along an axis fixed in bodyA. Relative rotation is prevented. You can use a * joint limit to restrict the range of motion and a joint motor to drive the * motion or to model joint friction. */ -declare interface PrismaticJoint extends Joint { +declare function PrismaticJoint(def: PrismaticJointDef): PrismaticJoint; +/** + * A prismatic joint. This joint provides one degree of freedom: translation + * along an axis fixed in bodyA. Relative rotation is prevented. You can use a + * joint limit to restrict the range of motion and a joint motor to drive the + * motion or to model joint friction. + */ +declare function PrismaticJoint(def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2): PrismaticJoint; +/** + * A prismatic joint. This joint provides one degree of freedom: translation + * along an axis fixed in bodyA. Relative rotation is prevented. You can use a + * joint limit to restrict the range of motion and a joint motor to drive the + * motion or to model joint friction. + */ +declare class PrismaticJoint extends Joint { + static TYPE: "prismatic-joint"; + constructor(def: PrismaticJointDef); + constructor(def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2); /** * The local anchor point relative to bodyA's origin. */ @@ -2991,13 +3084,6 @@ interface GearJointDef extends JointDef, GearJointOpt { */ joint2: RevoluteJoint | PrismaticJoint; } -declare const GearJoint: { - new (def: GearJointDef): GearJoint; - (def: GearJointDef): GearJoint; - new (def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number): GearJoint; - (def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number): GearJoint; - TYPE: "gear-joint"; -}; /** * A gear joint is used to connect two joints together. Either joint can be a * revolute or prismatic joint. You specify a gear ratio to bind the motions @@ -3011,7 +3097,38 @@ declare const GearJoint: { * This definition requires two existing revolute or prismatic joints (any * combination will work). */ -declare interface GearJoint extends Joint { +declare function GearJoint(def: GearJointDef): GearJoint; +/** + * A gear joint is used to connect two joints together. Either joint can be a + * revolute or prismatic joint. You specify a gear ratio to bind the motions + * together: coordinate1 + ratio * coordinate2 = constant + * + * The ratio can be negative or positive. If one joint is a revolute joint and + * the other joint is a prismatic joint, then the ratio will have units of + * length or units of 1/length. Warning: You have to manually destroy the gear + * joint if joint1 or joint2 is destroyed. + * + * This definition requires two existing revolute or prismatic joints (any + * combination will work). + */ +declare function GearJoint(def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number): GearJoint; +/** + * A gear joint is used to connect two joints together. Either joint can be a + * revolute or prismatic joint. You specify a gear ratio to bind the motions + * together: coordinate1 + ratio * coordinate2 = constant + * + * The ratio can be negative or positive. If one joint is a revolute joint and + * the other joint is a prismatic joint, then the ratio will have units of + * length or units of 1/length. Warning: You have to manually destroy the gear + * joint if joint1 or joint2 is destroyed. + * + * This definition requires two existing revolute or prismatic joints (any + * combination will work). + */ +declare class GearJoint extends Joint { + static TYPE: "gear-joint"; + constructor(def: GearJointDef); + constructor(def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number); /** * Get the first joint. */ @@ -3081,19 +3198,27 @@ interface MotorJointOpt extends JointOpt { */ interface MotorJointDef extends JointDef, MotorJointOpt { } -declare const MotorJoint: { - new (def: MotorJointDef): MotorJoint; - (def: MotorJointDef): MotorJoint; - new (def: MotorJointOpt, bodyA: Body, bodyB: Body): MotorJoint; - (def: MotorJointOpt, bodyA: Body, bodyB: Body): MotorJoint; - TYPE: "motor-joint"; -}; /** * A motor joint is used to control the relative motion between two bodies. A * typical usage is to control the movement of a dynamic body with respect to * the ground. */ -declare interface MotorJoint extends Joint { +declare function MotorJoint(def: MotorJointDef): MotorJoint; +/** + * A motor joint is used to control the relative motion between two bodies. A + * typical usage is to control the movement of a dynamic body with respect to + * the ground. + */ +declare function MotorJoint(def: MotorJointOpt, bodyA: Body, bodyB: Body): MotorJoint; +/** + * A motor joint is used to control the relative motion between two bodies. A + * typical usage is to control the movement of a dynamic body with respect to + * the ground. + */ +declare class MotorJoint extends Joint { + static TYPE: "motor-joint"; + constructor(def: MotorJointDef); + constructor(def: MotorJointOpt, bodyA: Body, bodyB: Body); /** * Set the maximum friction force in N. */ @@ -3181,15 +3306,8 @@ interface MouseJointDef extends JointDef, MouseJointOpt { * The initial world target point. This is assumed to coincide with the body * anchor initially. */ - target: Vec2; + target: Vec2Value; } -declare const MouseJoint: { - new (def: MouseJointDef): MouseJoint; - (def: MouseJointDef): MouseJoint; - new (def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2): MouseJoint; - (def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2): MouseJoint; - TYPE: "mouse-joint"; -}; /** * A mouse joint is used to make a point on a body track a specified world * point. This a soft constraint with a maximum force. This allows the @@ -3199,11 +3317,34 @@ declare const MouseJoint: { * be used in the testbed. If you want to learn how to use the mouse joint, look * at the testbed. */ -declare interface MouseJoint extends Joint { +declare function MouseJoint(def: MouseJointDef): MouseJoint; +/** + * A mouse joint is used to make a point on a body track a specified world + * point. This a soft constraint with a maximum force. This allows the + * constraint to stretch and without applying huge forces. + * + * NOTE: this joint is not documented in the manual because it was developed to + * be used in the testbed. If you want to learn how to use the mouse joint, look + * at the testbed. + */ +declare function MouseJoint(def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2): MouseJoint; +/** + * A mouse joint is used to make a point on a body track a specified world + * point. This a soft constraint with a maximum force. This allows the + * constraint to stretch and without applying huge forces. + * + * NOTE: this joint is not documented in the manual because it was developed to + * be used in the testbed. If you want to learn how to use the mouse joint, look + * at the testbed. + */ +declare class MouseJoint extends Joint { + static TYPE: "mouse-joint"; + constructor(def: MouseJointDef); + constructor(def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2); /** * Use this to update the target point. */ - setTarget(target: Vec2): void; + setTarget(target: Vec2Value): void; getTarget(): Vec2; /** * Set the maximum force in Newtons. @@ -3248,7 +3389,7 @@ declare interface MouseJoint extends Joint { /** * Shift the origin for any points stored in world coordinates. */ - shiftOrigin(newOrigin: Vec2): void; + shiftOrigin(newOrigin: Vec2Value): void; initVelocityConstraints(step: TimeStep): void; solveVelocityConstraints(step: TimeStep): void; /** @@ -3297,13 +3438,6 @@ interface PulleyJointDef extends JointDef, PulleyJointOpt { */ ratio: number; } -declare const PulleyJoint: { - new (def: PulleyJointDef): PulleyJoint; - (def: PulleyJointDef): PulleyJoint; - new (def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number): PulleyJoint; - (def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number): PulleyJoint; - TYPE: "pulley-joint"; -}; /** * The pulley joint is connected to two bodies and two fixed ground points. The * pulley supports a ratio such that: length1 + ratio * length2 <= constant @@ -3315,7 +3449,34 @@ declare const PulleyJoint: { * anchor points with static shapes to prevent one side from going to zero * length. */ -declare interface PulleyJoint extends Joint { +declare function PulleyJoint(def: PulleyJointDef): PulleyJoint; +/** + * The pulley joint is connected to two bodies and two fixed ground points. The + * pulley supports a ratio such that: length1 + ratio * length2 <= constant + * + * Yes, the force transmitted is scaled by the ratio. + * + * Warning: the pulley joint can get a bit squirrelly by itself. They often work + * better when combined with prismatic joints. You should also cover the the + * anchor points with static shapes to prevent one side from going to zero + * length. + */ +declare function PulleyJoint(def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number): PulleyJoint; +/** + * The pulley joint is connected to two bodies and two fixed ground points. The + * pulley supports a ratio such that: length1 + ratio * length2 <= constant + * + * Yes, the force transmitted is scaled by the ratio. + * + * Warning: the pulley joint can get a bit squirrelly by itself. They often work + * better when combined with prismatic joints. You should also cover the the + * anchor points with static shapes to prevent one side from going to zero + * length. + */ +declare class PulleyJoint extends Joint { + static TYPE: "pulley-joint"; + constructor(def: PulleyJointDef); + constructor(def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number); _serialize(): object; /** * Get the first ground anchor. @@ -3401,13 +3562,6 @@ interface RopeJointDef extends JointDef, RopeJointOpt { */ localAnchorB: Vec2; } -declare const RopeJoint: { - new (def: RopeJointDef): RopeJoint; - (def: RopeJointDef): RopeJoint; - new (def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): RopeJoint; - (def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): RopeJoint; - TYPE: "rope-joint"; -}; /** * A rope joint enforces a maximum distance between two points on two bodies. It * has no other effect. @@ -3419,7 +3573,34 @@ declare const RopeJoint: { * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you * want to dynamically control length. */ -declare interface RopeJoint extends Joint { +declare function RopeJoint(def: RopeJointDef): RopeJoint; +/** + * A rope joint enforces a maximum distance between two points on two bodies. It + * has no other effect. + * + * Warning: if you attempt to change the maximum length during the simulation + * you will get some non-physical behavior. + * + * A model that would allow you to dynamically modify the length would have some + * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you + * want to dynamically control length. + */ +declare function RopeJoint(def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): RopeJoint; +/** + * A rope joint enforces a maximum distance between two points on two bodies. It + * has no other effect. + * + * Warning: if you attempt to change the maximum length during the simulation + * you will get some non-physical behavior. + * + * A model that would allow you to dynamically modify the length would have some + * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you + * want to dynamically control length. + */ +declare class RopeJoint extends Joint { + static TYPE: "rope-joint"; + constructor(def: RopeJointDef); + constructor(def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); /** * The local anchor point relative to bodyA's origin. */ @@ -3502,18 +3683,24 @@ interface WeldJointDef extends JointDef, WeldJointOpt { */ localAnchorB: Vec2; } -declare const WeldJoint: { - new (def: WeldJointDef): WeldJoint; - (def: WeldJointDef): WeldJoint; - new (def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): WeldJoint; - (def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): WeldJoint; - TYPE: "weld-joint"; -}; /** * A weld joint essentially glues two bodies together. A weld joint may distort * somewhat because the island constraint solver is approximate. */ -declare interface WeldJoint extends Joint { +declare function WeldJoint(def: WeldJointDef): WeldJoint; +/** + * A weld joint essentially glues two bodies together. A weld joint may distort + * somewhat because the island constraint solver is approximate. + */ +declare function WeldJoint(def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2): WeldJoint; +/** + * A weld joint essentially glues two bodies together. A weld joint may distort + * somewhat because the island constraint solver is approximate. + */ +declare class WeldJoint extends Joint { + static TYPE: "weld-joint"; + constructor(def: WeldJointDef); + constructor(def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); /** * The local anchor point relative to bodyA's origin. */ @@ -3617,20 +3804,30 @@ interface WheelJointDef extends JointDef, WheelJointOpt { */ localAxisA: Vec2; } -declare const WheelJoint: { - new (def: WheelJointDef): WheelJoint; - (def: WheelJointDef): WheelJoint; - new (def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2): WheelJoint; - (def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2): WheelJoint; - TYPE: "wheel-joint"; -}; /** * A wheel joint. This joint provides two degrees of freedom: translation along * an axis fixed in bodyA and rotation in the plane. In other words, it is a * point to line constraint with a rotational motor and a linear spring/damper. * This joint is designed for vehicle suspensions. */ -declare interface WheelJoint extends Joint { +declare function WheelJoint(def: WheelJointDef): WheelJoint; +/** + * A wheel joint. This joint provides two degrees of freedom: translation along + * an axis fixed in bodyA and rotation in the plane. In other words, it is a + * point to line constraint with a rotational motor and a linear spring/damper. + * This joint is designed for vehicle suspensions. + */ +declare function WheelJoint(def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2): WheelJoint; +/** + * A wheel joint. This joint provides two degrees of freedom: translation along + * an axis fixed in bodyA and rotation in the plane. In other words, it is a + * point to line constraint with a rotational motor and a linear spring/damper. + * This joint is designed for vehicle suspensions. + */ +declare class WheelJoint extends Joint { + static TYPE: "wheel-joint"; + constructor(def: WheelJointDef); + constructor(def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2); /** * The local anchor point relative to bodyA's origin. */ @@ -3924,8 +4121,4012 @@ declare class TOIOutput { * CCD via the local separating axis method. This seeks progression by computing * the largest time at which separation is maintained. */ -declare function TimeOfImpact(output: TOIOutput, input: TOIInput): void; -type _ContactImpulse = InstanceType; +declare const TimeOfImpact: { + (output: TOIOutput, input: TOIInput): void; + Input: typeof TOIInput; + Output: typeof TOIOutput; +}; +declare const stats: { + gjkCalls: number; + gjkIters: number; + gjkMaxIters: number; + toiTime: number; + toiMaxTime: number; + toiCalls: number; + toiIters: number; + toiMaxIters: number; + toiRootIters: number; + toiMaxRootIters: number; + toString(newline?: string): string; +}; /** @deprecated Merged with main namespace */ -declare const internal: {}; -export { Serializer, math as Math, Vec2, Vec3, Mat22, Mat33, Transform, Rot, AABB, Shape, Fixture, Body, Contact, Joint, World, CircleShape as Circle, EdgeShape as Edge, PolygonShape as Polygon, ChainShape as Chain, BoxShape as Box, CollideCircles, CollideEdgeCircle, CollidePolygons, CollidePolygonCircle, CollideEdgePolygon, DistanceJoint, FrictionJoint, GearJoint, MotorJoint, MouseJoint, PrismaticJoint, PulleyJoint, RevoluteJoint, RopeJoint, WeldJoint, WheelJoint, Settings, Sweep, Manifold, Distance, TimeOfImpact, DynamicTree, _ContactImpulse as ContactImpulse, internal }; +declare const internal: { + CollidePolygons: (manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform) => void; + Settings: typeof Settings; + Sweep: typeof Sweep; + Manifold: typeof Manifold; + Distance: { + (output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void; + testOverlap: (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform) => boolean; + Input: typeof DistanceInput; + Output: typeof DistanceOutput; + Proxy: typeof DistanceProxy; + Cache: typeof SimplexCache; + }; + TimeOfImpact: { + (output: TOIOutput, input: TOIInput): void; + Input: typeof TOIInput; + Output: typeof TOIOutput; + }; + DynamicTree: typeof DynamicTree; + stats: { + gjkCalls: number; + gjkIters: number; + gjkMaxIters: number; + toiTime: number; + toiMaxTime: number; + toiCalls: number; + toiIters: number; + toiMaxIters: number; + toiRootIters: number; + toiMaxRootIters: number; + toString(newline?: string): string; + }; +}; +declare namespace planck { + function Serializer(opts?: any): void; + namespace Serializer { + var toJson: any; + var fromJson: any; + } + const math: Math & { + EPSILON: number; + isFinite: (x: unknown) => boolean; + assert: (x: any) => void; + nextPowerOfTwo: (x: number) => number; + isPowerOfTwo: (x: number) => boolean; + mod: (num: number, min?: number, max?: number) => number; + clamp: (num: number, min: number, max: number) => number; + random: (min?: number, max?: number) => number; + }; + interface Vec2Value { + x: number; + y: number; + } + class Vec2 { + x: number; + y: number; + constructor(x: number, y: number); + constructor(obj: { + x: number; + y: number; + }); + constructor(); + static zero(): Vec2; + static clone(v: Vec2Value): Vec2; + /** + * Does this vector contain finite coordinates? + */ + static isValid(obj: any): boolean; + static assert(o: any): void; + clone(): Vec2; + /** + * Set this vector to all zeros. + * + * @returns this + */ + setZero(): Vec2; + set(x: number, y: number): Vec2; + set(value: Vec2Value): Vec2; + /** + * Set this vector to some specified coordinates. + * + * @returns this + */ + setNum(x: number, y: number): this; + /** + * Set this vector to some specified coordinates. + * + * @returns this + */ + setVec2(value: Vec2Value): this; + /** + * Set linear combination of v and w: `a * v + b * w` + */ + setCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2; + setMul(a: number, v: Vec2Value): Vec2; + /** + * Add a vector to this vector. + * + * @returns this + */ + add(w: Vec2Value): Vec2; + /** + * Add linear combination of v and w: `a * v + b * w` + */ + addCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2; + addMul(a: number, v: Vec2Value): Vec2; + /** + * @deprecated Use subCombine or subMul + */ + wSub(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2; + /** + * Subtract linear combination of v and w: `a * v + b * w` + */ + subCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2; + subMul(a: number, v: Vec2Value): Vec2; + /** + * Subtract a vector from this vector + * + * @returns this + */ + sub(w: Vec2Value): Vec2; + /** + * Multiply this vector by a scalar. + * + * @returns this + */ + mul(m: number): Vec2; + /** + * Get the length of this vector (the norm). + * + * For performance, use this instead of lengthSquared (if possible). + */ + length(): number; + /** + * Get the length squared. + */ + lengthSquared(): number; + /** + * Convert this vector into a unit vector. + * + * @returns old length + */ + normalize(): number; + /** + * Get the length of this vector (the norm). + * + * For performance, use this instead of lengthSquared (if possible). + */ + static lengthOf(v: Vec2Value): number; + /** + * Get the length squared. + */ + static lengthSquared(v: Vec2Value): number; + static distance(v: Vec2Value, w: Vec2Value): number; + static distanceSquared(v: Vec2Value, w: Vec2Value): number; + static areEqual(v: Vec2Value, w: Vec2Value): boolean; + /** + * Get the skew vector such that dot(skew_vec, other) == cross(vec, other) + */ + static skew(v: Vec2Value): Vec2; + /** + * Perform the dot product on two vectors. + */ + static dot(v: Vec2Value, w: Vec2Value): number; + static cross(v: Vec2Value, w: Vec2Value): number; + static cross(v: Vec2Value, w: number): Vec2; + static cross(v: number, w: Vec2Value): Vec2; + /** + * Perform the cross product on two vectors. In 2D this produces a scalar. + */ + static crossVec2Vec2(v: Vec2Value, w: Vec2Value): number; + /** + * Perform the cross product on a vector and a scalar. In 2D this produces a + * vector. + */ + static crossVec2Num(v: Vec2Value, w: number): Vec2; + /** + * Perform the cross product on a vector and a scalar. In 2D this produces a + * vector. + */ + static crossNumVec2(v: number, w: Vec2Value): Vec2; + static addCross(a: Vec2Value, v: Vec2Value, w: number): Vec2; + static addCross(a: Vec2Value, v: number, w: Vec2Value): Vec2; + /** + * Returns `a + (v x w)` + */ + static addCrossVec2Num(a: Vec2Value, v: Vec2Value, w: number): Vec2; + /** + * Returns `a + (v x w)` + */ + static addCrossNumVec2(a: Vec2Value, v: number, w: Vec2Value): Vec2; + static add(v: Vec2Value, w: Vec2Value): Vec2; + static combine(a: number, v: Vec2, b: number, w: Vec2): Vec2; + static sub(v: Vec2Value, w: Vec2Value): Vec2; + static mul(a: Vec2Value, b: number): Vec2; + static mul(a: number, b: Vec2Value): Vec2; + static mulVec2Num(a: Vec2Value, b: number): Vec2; + static mulNumVec2(a: number, b: Vec2Value): Vec2; + neg(): Vec2; + static neg(v: Vec2Value): Vec2; + static abs(v: Vec2Value): Vec2; + static mid(v: Vec2Value, w: Vec2Value): Vec2; + static upper(v: Vec2Value, w: Vec2Value): Vec2; + static lower(v: Vec2Value, w: Vec2Value): Vec2; + clamp(max: number): Vec2; + static clamp(v: Vec2Value, max: number): Vec2; + } + class Vec3 { + x: number; + y: number; + z: number; + constructor(x: number, y: number, z: number); + constructor(obj: { + x: number; + y: number; + z: number; + }); + constructor(); + static zero(): Vec3; + static clone(v: Vec3): Vec3; + /** + * Does this vector contain finite coordinates? + */ + static isValid(obj: any): boolean; + static assert(o: any): void; + setZero(): Vec3; + set(x: number, y: number, z: number): Vec3; + add(w: Vec3): Vec3; + sub(w: Vec3): Vec3; + mul(m: number): Vec3; + static areEqual(v: Vec3, w: Vec3): boolean; + /** + * Perform the dot product on two vectors. + */ + static dot(v: Vec3, w: Vec3): number; + /** + * Perform the cross product on two vectors. In 2D this produces a scalar. + */ + static cross(v: Vec3, w: Vec3): Vec3; + static add(v: Vec3, w: Vec3): Vec3; + static sub(v: Vec3, w: Vec3): Vec3; + static mul(v: Vec3, m: number): Vec3; + neg(): Vec3; + static neg(v: Vec3): Vec3; + } + /** + * A 2-by-2 matrix. Stored in column-major order. + */ + class Mat22 { + ex: Vec2; + ey: Vec2; + constructor(a: number, b: number, c: number, d: number); + constructor(a: { + x: number; + y: number; + }, b: { + x: number; + y: number; + }); + constructor(); + static isValid(obj: any): boolean; + static assert(o: any): void; + set(a: Mat22): void; + set(a: Vec2, b: Vec2): void; + set(a: number, b: number, c: number, d: number): void; + setIdentity(): void; + setZero(): void; + getInverse(): Mat22; + /** + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. + */ + solve(v: Vec2): Vec2; + /** + * Multiply a matrix times a vector. If a rotation matrix is provided, then this + * transforms the vector from one frame to another. + */ + static mul(mx: Mat22, my: Mat22): Mat22; + static mul(mx: Mat22, v: Vec2): Vec2; + static mulVec2(mx: Mat22, v: Vec2): Vec2; + static mulMat22(mx: Mat22, v: Mat22): Mat22; + /** + * Multiply a matrix transpose times a vector. If a rotation matrix is provided, + * then this transforms the vector from one frame to another (inverse + * transform). + */ + static mulT(mx: Mat22, my: Mat22): Mat22; + static mulT(mx: Mat22, v: Vec2): Vec2; + static mulTVec2(mx: Mat22, v: Vec2): Vec2; + static mulTMat22(mx: Mat22, v: Mat22): Mat22; + static abs(mx: Mat22): Mat22; + static add(mx1: Mat22, mx2: Mat22): Mat22; + } + /** + * A 3-by-3 matrix. Stored in column-major order. + */ + class Mat33 { + ex: Vec3; + ey: Vec3; + ez: Vec3; + constructor(a: Vec3, b: Vec3, c: Vec3); + constructor(); + static isValid(obj: any): boolean; + static assert(o: any): void; + /** + * Set this matrix to all zeros. + */ + setZero(): Mat33; + /** + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. + */ + solve33(v: Vec3): Vec3; + /** + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix + * equation. + */ + solve22(v: Vec2): Vec2; + /** + * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if + * singular. + */ + getInverse22(M: Mat33): void; + /** + * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix + * if singular. + */ + getSymInverse33(M: Mat33): void; + /** + * Multiply a matrix times a vector. + */ + static mul(a: Mat33, b: Vec2): Vec2; + static mul(a: Mat33, b: Vec3): Vec3; + static mulVec3(a: Mat33, b: Vec3): Vec3; + static mulVec2(a: Mat33, b: Vec2): Vec2; + static add(a: Mat33, b: Mat33): Mat33; + } + class Rot { + s: number; + c: number; + /** Initialize from an angle in radians. */ + constructor(angle?: number | Rot); + static clone(rot: Rot): Rot; + static identity(): Rot; + static isValid(obj: any): boolean; + static assert(o: any): void; + /** Set to the identity rotation. */ + setIdentity(): void; + set(angle: number | Rot): void; + setRot(angle: Rot): void; + /** Set using an angle in radians. */ + setAngle(angle: number): void; + /** Get the angle in radians. */ + getAngle(): number; + /** Get the x-axis. */ + getXAxis(): Vec2; + /** Get the u-axis. */ + getYAxis(): Vec2; + /** Multiply two rotations: q * r */ + static mul(rot: Rot, m: Rot): Rot; + /** Rotate a vector */ + static mul(rot: Rot, m: Vec2): Vec2; + /** Multiply two rotations: q * r */ + static mulRot(rot: Rot, m: Rot): Rot; + /** Rotate a vector */ + static mulVec2(rot: Rot, m: Vec2): Vec2; + static mulSub(rot: Rot, v: Vec2, w: Vec2): Vec2; + /** Transpose multiply two rotations: qT * r */ + static mulT(rot: Rot, m: Rot): Rot; + /** Inverse rotate a vector */ + static mulT(rot: Rot, m: Vec2): Vec2; + /** Transpose multiply two rotations: qT * r */ + static mulTRot(rot: Rot, m: Rot): Rot; + /** Inverse rotate a vector */ + static mulTVec2(rot: Rot, m: Vec2Value): Vec2; + } + /** + * A transform contains translation and rotation. It is used to represent the + * position and orientation of rigid frames. Initialize using a position vector + * and a rotation. + */ + class Transform { + /** position */ + p: Vec2; + /** rotation */ + q: Rot; + constructor(position?: Vec2Value, rotation?: number); + static clone(xf: Transform): Transform; + static identity(): Transform; + /** + * Set this to the identity transform. + */ + setIdentity(): void; + set(position: Vec2, rotation: number): void; + set(xf: Transform): void; + /** + * Set this based on the position and angle. + */ + setNum(position: Vec2, rotation: number): void; + setTransform(xf: Transform): void; + static isValid(obj: any): boolean; + static assert(o: any): void; + static mul(a: Transform, b: Vec2Value): Vec2; + static mul(a: Transform, b: Transform): Transform; + static mulAll(a: Transform, b: Vec2Value[]): Vec2[]; + static mulAll(a: Transform, b: Transform[]): Transform[]; + static mulVec2(a: Transform, b: Vec2Value): Vec2; + static mulXf(a: Transform, b: Transform): Transform; + static mulT(a: Transform, b: Vec2Value): Vec2; + static mulT(a: Transform, b: Transform): Transform; + static mulTVec2(a: Transform, b: Vec2Value): Vec2; + static mulTXf(a: Transform, b: Transform): Transform; + } + /** + * Ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. + */ + interface RayCastInput { + p1: Vec2; + p2: Vec2; + maxFraction: number; + } + type RayCastCallback = (subInput: RayCastInput, id: number) => number; + /** + * Ray-cast output data. The ray hits at `p1 + fraction * (p2 - p1)`, + * where `p1` and `p2` come from RayCastInput. + */ + interface RayCastOutput { + normal: Vec2; + fraction: number; + } + class AABB { + lowerBound: Vec2; + upperBound: Vec2; + constructor(lower?: Vec2Value, upper?: Vec2Value); + /** + * Verify that the bounds are sorted. + */ + isValid(): boolean; + static isValid(obj: any): boolean; + static assert(o: any): void; + /** + * Get the center of the AABB. + */ + getCenter(): Vec2; + /** + * Get the extents of the AABB (half-widths). + */ + getExtents(): Vec2; + /** + * Get the perimeter length. + */ + getPerimeter(): number; + /** + * Combine one or two AABB into this one. + */ + combine(a: AABB, b?: AABB): void; + combinePoints(a: Vec2Value, b: Vec2Value): void; + set(aabb: AABB): void; + contains(aabb: AABB): boolean; + extend(value: number): AABB; + static extend(aabb: AABB, value: number): void; + static testOverlap(a: AABB, b: AABB): boolean; + static areEqual(a: AABB, b: AABB): boolean; + static diff(a: AABB, b: AABB): number; + rayCast(output: RayCastOutput, input: RayCastInput): boolean; + } + /* + * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + */ + class Pool { + _list: T[]; + _max: number; + _createFn: () => T; + _outFn: (item: T) => void; + _inFn: (item: T) => void; + _discardFn: (item: T) => T; + _createCount: number; + _outCount: number; + _inCount: number; + _discardCount: number; + constructor(opts: { + max?: number; + create?: () => T; + allocate?: (item: T) => void; + release?: (item: T) => void; + discard?: (item: T) => T; + }); + max(n?: number): number | Pool; + size(): number; + allocate(): T; + release(item: T): void; + } + type DynamicTreeQueryCallback = (nodeId: number) => boolean; + /** + * A node in the dynamic tree. The client does not interact with this directly. + */ + class TreeNode { + id: number; + /** Enlarged AABB */ + aabb: AABB; + userData: T; + parent: TreeNode; + child1: TreeNode; + child2: TreeNode; + /** 0: leaf, -1: free node */ + height: number; + constructor(id?: number); + isLeaf(): boolean; + } + /** + * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A + * dynamic tree arranges data in a binary tree to accelerate queries such as + * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we + * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger + * than the client object. This allows the client object to move by small + * amounts without triggering a tree update. + * + * Nodes are pooled and relocatable, so we use node indices rather than + * pointers. + */ + class DynamicTree { + m_root: TreeNode; + m_lastProxyId: number; + m_nodes: { + [id: number]: TreeNode; + }; + m_pool: Pool>; + constructor(); + /** + * Get proxy user data. + * + * @return the proxy user data or 0 if the id is invalid. + */ + getUserData(id: number): T; + /** + * Get the fat AABB for a node id. + * + * @return the proxy user data or 0 if the id is invalid. + */ + getFatAABB(id: number): AABB; + allocateNode(): TreeNode; + freeNode(node: TreeNode): void; + /** + * Create a proxy in the tree as a leaf node. We return the index of the node + * instead of a pointer so that we can grow the node pool. + * + * Create a proxy. Provide a tight fitting AABB and a userData pointer. + */ + createProxy(aabb: AABB, userData: T): number; + /** + * Destroy a proxy. This asserts if the id is invalid. + */ + destroyProxy(id: number): void; + /** + * Move a proxy with a swepted AABB. If the proxy has moved outside of its + * fattened AABB, then the proxy is removed from the tree and re-inserted. + * Otherwise the function returns immediately. + * + * @param d Displacement + * + * @return true if the proxy was re-inserted. + */ + moveProxy(id: number, aabb: AABB, d: Vec2): boolean; + insertLeaf(leaf: TreeNode): void; + removeLeaf(leaf: TreeNode): void; + /** + * Perform a left or right rotation if node A is imbalanced. Returns the new + * root index. + */ + balance(iA: TreeNode): TreeNode; + /** + * Compute the height of the binary tree in O(N) time. Should not be called + * often. + */ + getHeight(): number; + /** + * Get the ratio of the sum of the node areas to the root area. + */ + getAreaRatio(): number; + /** + * Compute the height of a sub-tree. + */ + computeHeight(id?: number): number; + validateStructure(node: TreeNode): void; + validateMetrics(node: TreeNode): void; + /** + * Validate this tree. For testing. + */ + validate(): void; + /** + * Get the maximum balance of an node in the tree. The balance is the difference + * in height of the two children of a node. + */ + getMaxBalance(): number; + /** + * Build an optimal tree. Very expensive. For testing. + */ + rebuildBottomUp(): void; + /** + * Shift the world origin. Useful for large worlds. The shift formula is: + * position -= newOrigin + * + * @param newOrigin The new origin with respect to the old origin + */ + shiftOrigin(newOrigin: Vec2): void; + /** + * Query an AABB for overlapping proxies. The callback class is called for each + * proxy that overlaps the supplied AABB. + */ + query(aabb: AABB, queryCallback: DynamicTreeQueryCallback): void; + /** + * Ray-cast against the proxies in the tree. This relies on the callback to + * perform a exact ray-cast in the case were the proxy contains a shape. The + * callback also performs the any collision filtering. This has performance + * roughly equal to k * log(n), where k is the number of collisions and n is the + * number of proxies in the tree. + * + * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. + * @param rayCastCallback A function that is called for each proxy that is hit by the ray. + */ + rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void; + private inputPool; + private stackPool; + private iteratorPool; + } + /** + * The broad-phase wraps and extends a dynamic-tree to keep track of moved + * objects and query them on update. + */ + class BroadPhase { + m_tree: DynamicTree; + m_proxyCount: number; + m_moveBuffer: number[]; + m_callback: (userDataA: any, userDataB: any) => void; + m_queryProxyId: number; + /** + * Get user data from a proxy. Returns null if the id is invalid. + */ + getUserData(proxyId: number): FixtureProxy; + /** + * Test overlap of fat AABBs. + */ + testOverlap(proxyIdA: number, proxyIdB: number): boolean; + /** + * Get the fat AABB for a proxy. + */ + getFatAABB(proxyId: number): AABB; + /** + * Get the number of proxies. + */ + getProxyCount(): number; + /** + * Get the height of the embedded tree. + */ + getTreeHeight(): number; + /** + * Get the balance (integer) of the embedded tree. + */ + getTreeBalance(): number; + /** + * Get the quality metric of the embedded tree. + */ + getTreeQuality(): number; + /** + * Query an AABB for overlapping proxies. The callback class is called for each + * proxy that overlaps the supplied AABB. + */ + query: (aabb: AABB, queryCallback: DynamicTreeQueryCallback) => void; + /** + * Ray-cast against the proxies in the tree. This relies on the callback to + * perform a exact ray-cast in the case were the proxy contains a shape. The + * callback also performs the any collision filtering. This has performance + * roughly equal to k * log(n), where k is the number of collisions and n is the + * number of proxies in the tree. + * + * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. + * @param rayCastCallback A function that is called for each proxy that is hit by the ray. + */ + rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void; + /** + * Shift the world origin. Useful for large worlds. The shift formula is: + * position -= newOrigin + * + * @param newOrigin The new origin with respect to the old origin + */ + shiftOrigin(newOrigin: Vec2): void; + /** + * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs + * is called. + */ + createProxy(aabb: AABB, userData: FixtureProxy): number; + /** + * Destroy a proxy. It is up to the client to remove any pairs. + */ + destroyProxy(proxyId: number): void; + /** + * Call moveProxy as many times as you like, then when you are done call + * UpdatePairs to finalized the proxy pairs (for your time step). + */ + moveProxy(proxyId: number, aabb: AABB, displacement: Vec2): void; + /** + * Call to trigger a re-processing of it's pairs on the next call to + * UpdatePairs. + */ + touchProxy(proxyId: number): void; + bufferMove(proxyId: number): void; + unbufferMove(proxyId: number): void; + /** + * Update the pairs. This results in pair callbacks. This can only add pairs. + */ + updatePairs(addPairCallback: (userDataA: FixtureProxy, userDataB: FixtureProxy) => void): void; + queryCallback: (proxyId: number) => boolean; + } + /** + * A fixture definition is used to create a fixture. This class defines an + * abstract fixture definition. You can reuse fixture definitions safely. + */ + interface FixtureOpt { + userData?: unknown; + /** + * The friction coefficient, usually in the range [0,1] + */ + friction?: number; + /** + * The restitution (elasticity) usually in the range [0,1] + */ + restitution?: number; + /** + * The density, usually in kg/m^2 + */ + density?: number; + /** + * A sensor shape collects contact information but never generates a collision response. + */ + isSensor?: boolean; + /** + * Zero, positive or negative collision group. + * Fixtures with same positive groupIndex always collide and fixtures with same negative groupIndex never collide. + */ + filterGroupIndex?: number; + /** + * Collision category bit or bits that this fixture belongs to. + * If groupIndex is zero or not matching, then at least one bit in this fixture categoryBits should match other fixture maskBits and vice versa. + */ + filterCategoryBits?: number; + /** + * Collision category bit or bits that this fixture accept for collision. + */ + filterMaskBits?: number; + } + interface FixtureDef extends FixtureOpt { + shape: Shape; + } + /** + * This proxy is used internally to connect shape children to the broad-phase. + */ + class FixtureProxy { + aabb: AABB; + fixture: Fixture; + childIndex: number; + proxyId: number; + constructor(fixture: Fixture, childIndex: number); + } + /** + * A fixture is used to attach a shape to a body for collision detection. A + * fixture inherits its transform from its parent. Fixtures hold additional + * non-geometric data such as friction, collision filters, etc. + * + * To create a new Fixture use {@link Body.createFixture}. + */ + class Fixture { + constructor(body: Body, def: FixtureDef); + constructor(body: Body, shape: Shape, def?: FixtureOpt); + constructor(body: Body, shape: Shape, density?: number); + /** + * Get the type of the child shape. You can use this to down cast to the + * concrete shape. + */ + getType(): ShapeType; + /** + * Get the child shape. You can modify the child shape, however you should not + * change the number of vertices because this will crash some collision caching + * mechanisms. Manipulating the shape may lead to non-physical behavior. + */ + getShape(): Shape; + /** + * A sensor shape collects contact information but never generates a collision + * response. + */ + isSensor(): boolean; + /** + * Set if this fixture is a sensor. + */ + setSensor(sensor: boolean): void; + // /** + // * Get the contact filtering data. + // */ + // getFilterData() { + // return this.m_filter; + // } + /** + * Get the user data that was assigned in the fixture definition. Use this to + * store your application specific data. + */ + getUserData(): unknown; + /** + * Set the user data. Use this to store your application specific data. + */ + setUserData(data: unknown): void; + /** + * Get the parent body of this fixture. This is null if the fixture is not + * attached. + */ + getBody(): Body; + /** + * Get the next fixture in the parent body's fixture list. + */ + getNext(): Fixture | null; + /** + * Get the density of this fixture. + */ + getDensity(): number; + /** + * Set the density of this fixture. This will _not_ automatically adjust the + * mass of the body. You must call Body.resetMassData to update the body's mass. + */ + setDensity(density: number): void; + /** + * Get the coefficient of friction, usually in the range [0,1]. + */ + getFriction(): number; + /** + * Set the coefficient of friction. This will not change the friction of + * existing contacts. + */ + setFriction(friction: number): void; + /** + * Get the coefficient of restitution. + */ + getRestitution(): number; + /** + * Set the coefficient of restitution. This will not change the restitution of + * existing contacts. + */ + setRestitution(restitution: number): void; + /** + * Test a point in world coordinates for containment in this fixture. + */ + testPoint(p: Vec2Value): boolean; + /** + * Cast a ray against this shape. + */ + rayCast(output: RayCastOutput, input: RayCastInput, childIndex: number): boolean; + /** + * Get the mass data for this fixture. The mass data is based on the density and + * the shape. The rotational inertia is about the shape's origin. This operation + * may be expensive. + */ + getMassData(massData: MassData): void; + /** + * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a + * more accurate AABB, compute it using the shape and the body transform. + */ + getAABB(childIndex: number): AABB; + /** + * These support body activation/deactivation. + */ + createProxies(broadPhase: BroadPhase, xf: Transform): void; + destroyProxies(broadPhase: BroadPhase): void; + /** + * Updates this fixture proxy in broad-phase (with combined AABB of current and + * next transformation). + */ + synchronize(broadPhase: BroadPhase, xf1: Transform, xf2: Transform): void; + /** + * Set the contact filtering data. This will not update contacts until the next + * time step when either parent body is active and awake. This automatically + * calls refilter. + */ + setFilterData(filter: { + groupIndex: number; + categoryBits: number; + maskBits: number; + }): void; + getFilterGroupIndex(): number; + setFilterGroupIndex(groupIndex: number): void; + getFilterCategoryBits(): number; + setFilterCategoryBits(categoryBits: number): void; + getFilterMaskBits(): number; + setFilterMaskBits(maskBits: number): void; + /** + * Call this if you want to establish collision that was previously disabled by + * ContactFilter. + */ + refilter(): void; + /** + * Implement this method to provide collision filtering, if you want finer + * control over contact creation. + * + * Return true if contact calculations should be performed between these two + * fixtures. + * + * Warning: for performance reasons this is only called when the AABBs begin to + * overlap. + */ + shouldCollide(that: Fixture): boolean; + } + enum ManifoldType { + e_circles = 0, + e_faceA = 1, + e_faceB = 2 + } + enum ContactFeatureType { + e_vertex = 0, + e_face = 1 + } + /** + * This is used for determining the state of contact points. + */ + enum PointState { + /** Point does not exist */ + nullState = 0, + /** Point was added in the update */ + addState = 1, + /** Point persisted across the update */ + persistState = 2, + /** Point was removed in the update */ + removeState = 3 + } + /** + * Used for computing contact manifolds. + */ + class ClipVertex { + v: Vec2; + id: ContactID; + set(o: ClipVertex): void; + } + /** + * A manifold for two touching convex shapes. Manifolds are created in `evaluate` + * method of Contact subclasses. + * + * Supported manifold types are e_faceA or e_faceB for clip point versus plane + * with radius and e_circles point versus point with radius. + * + * We store contacts in this way so that position correction can account for + * movement, which is critical for continuous physics. All contact scenarios + * must be expressed in one of these types. This structure is stored across time + * steps, so we keep it small. + * + * @prop type e_circle, e_faceA, e_faceB + * @prop localPoint Usage depends on manifold type:
+ * e_circles: the local center of circleA
+ * e_faceA: the center of faceA
+ * e_faceB: the center of faceB + * @prop localNormal Usage depends on manifold type:
+ * e_circles: not used
+ * e_faceA: the normal on polygonA
+ * e_faceB: the normal on polygonB + * @prop points The points of contact {ManifoldPoint[]} + * @prop pointCount The number of manifold points + */ + class Manifold { + type: ManifoldType; + localNormal: Vec2; + localPoint: Vec2; + points: ManifoldPoint[]; + pointCount: number; + /** + * Evaluate the manifold with supplied transforms. This assumes modest motion + * from the original state. This does not change the point count, impulses, etc. + * The radii must come from the shapes that generated the manifold. + */ + getWorldManifold(wm: WorldManifold | undefined, xfA: Transform, radiusA: number, xfB: Transform, radiusB: number): WorldManifold; + static clipSegmentToLine: typeof clipSegmentToLine; + static ClipVertex: typeof ClipVertex; + static getPointStates: typeof getPointStates; + static PointState: typeof PointState; + } + /** + * A manifold point is a contact point belonging to a contact manifold. It holds + * details related to the geometry and dynamics of the contact points. + * + * This structure is stored across time steps, so we keep it small. + * + * Note: impulses are used for internal caching and may not provide reliable + * contact forces, especially for high speed collisions. + */ + class ManifoldPoint { + /** + * Usage depends on manifold type. + * e_circles: the local center of circleB, + * e_faceA: the local center of cirlceB or the clip point of polygonB, + * e_faceB: the clip point of polygonA. + */ + localPoint: Vec2; + /** + * The non-penetration impulse + */ + normalImpulse: number; + /** + * The friction impulse + */ + tangentImpulse: number; + /** + * Uniquely identifies a contact point between two shapes to facilatate warm starting + */ + id: ContactID; + } + /** + * Contact ids to facilitate warm starting. + */ + class ContactID { + cf: ContactFeature; + /** + * Used to quickly compare contact ids. + */ + get key(): number; + set(o: ContactID): void; + } + /** + * The features that intersect to form the contact point. + */ + class ContactFeature { + /** + * Feature index on shapeA + */ + indexA: number; + /** + * Feature index on shapeB + */ + indexB: number; + /** + * The feature type on shapeA + */ + typeA: ContactFeatureType; + /** + * The feature type on shapeB + */ + typeB: ContactFeatureType; + set(o: ContactFeature): void; + } + /** + * This is used to compute the current state of a contact manifold. + */ + class WorldManifold { + /** + * World vector pointing from A to B + */ + normal: Vec2; + /** + * World contact point (point of intersection) + */ + points: Vec2[]; // [maxManifoldPoints] + /** + * A negative value indicates overlap, in meters + */ + separations: number[]; // [maxManifoldPoints] + } + /** + * Compute the point states given two manifolds. The states pertain to the + * transition from manifold1 to manifold2. So state1 is either persist or remove + * while state2 is either add or persist. + */ + function getPointStates(state1: PointState[], state2: PointState[], manifold1: Manifold, manifold2: Manifold): void; + /** + * Clipping for contact manifolds. Sutherland-Hodgman clipping. + */ + function clipSegmentToLine(vOut: ClipVertex[], vIn: ClipVertex[], normal: Vec2, offset: number, vertexIndexA: number): number; + /** + * A contact edge is used to connect bodies and contacts together in a contact + * graph where each body is a node and each contact is an edge. A contact edge + * belongs to a doubly linked list maintained in each attached body. Each + * contact has two contact nodes, one for each attached body. + * + * @prop {Contact} contact The contact + * @prop {ContactEdge} prev The previous contact edge in the body's contact list + * @prop {ContactEdge} next The next contact edge in the body's contact list + * @prop {Body} other Provides quick access to the other body attached. + */ + class ContactEdge { + contact: Contact; + prev: ContactEdge | undefined; + next: ContactEdge | undefined; + other: Body | undefined; + constructor(contact: Contact); + } + type EvaluateFunction = (manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number) => void; + type ContactCallback = (manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number) => void /* & { destroyFcn?: (contact: Contact) => void }*/; + /** + * Friction mixing law. The idea is to allow either fixture to drive the + * restitution to zero. For example, anything slides on ice. + */ + function mixFriction(friction1: number, friction2: number): number; + /** + * Restitution mixing law. The idea is allow for anything to bounce off an + * inelastic surface. For example, a superball bounces on anything. + */ + function mixRestitution(restitution1: number, restitution2: number): number; + // TODO: merge with ManifoldPoint? + class VelocityConstraintPoint { + rA: Vec2; + rB: Vec2; + normalImpulse: number; + tangentImpulse: number; + normalMass: number; + tangentMass: number; + velocityBias: number; + } + /** + * The class manages contact between two shapes. A contact exists for each + * overlapping AABB in the broad-phase (except if filtered). Therefore a contact + * object may exist that has no contact points. + */ + class Contact { + constructor(fA: Fixture, indexA: number, fB: Fixture, indexB: number, evaluateFcn: EvaluateFunction); + initConstraint(step: TimeStep): void; + /** + * Get the contact manifold. Do not modify the manifold unless you understand + * the internals of the library. + */ + getManifold(): Manifold; + /** + * Get the world manifold. + */ + getWorldManifold(worldManifold: WorldManifold | null | undefined): WorldManifold | undefined; + /** + * Enable/disable this contact. This can be used inside the pre-solve contact + * listener. The contact is only disabled for the current time step (or sub-step + * in continuous collisions). + */ + setEnabled(flag: boolean): void; + /** + * Has this contact been disabled? + */ + isEnabled(): boolean; + /** + * Is this contact touching? + */ + isTouching(): boolean; + /** + * Get the next contact in the world's contact list. + */ + getNext(): Contact | null; + /** + * Get fixture A in this contact. + */ + getFixtureA(): Fixture; + /** + * Get fixture B in this contact. + */ + getFixtureB(): Fixture; + /** + * Get the child primitive index for fixture A. + */ + getChildIndexA(): number; + /** + * Get the child primitive index for fixture B. + */ + getChildIndexB(): number; + /** + * Flag this contact for filtering. Filtering will occur the next time step. + */ + flagForFiltering(): void; + /** + * Override the default friction mixture. You can call this in + * ContactListener.preSolve. This value persists until set or reset. + */ + setFriction(friction: number): void; + /** + * Get the friction. + */ + getFriction(): number; + /** + * Reset the friction mixture to the default value. + */ + resetFriction(): void; + /** + * Override the default restitution mixture. You can call this in + * ContactListener.preSolve. The value persists until you set or reset. + */ + setRestitution(restitution: number): void; + /** + * Get the restitution. + */ + getRestitution(): number; + /** + * Reset the restitution to the default value. + */ + resetRestitution(): void; + /** + * Set the desired tangent speed for a conveyor belt behavior. In meters per + * second. + */ + setTangentSpeed(speed: number): void; + /** + * Get the desired tangent speed. In meters per second. + */ + getTangentSpeed(): number; + /** + * Called by Update method, and implemented by subclasses. + */ + evaluate(manifold: Manifold, xfA: Transform, xfB: Transform): void; + /** + * Updates the contact manifold and touching status. + * + * Note: do not assume the fixture AABBs are overlapping or are valid. + * + * @param listener.beginContact + * @param listener.endContact + * @param listener.preSolve + */ + update(listener?: { + beginContact(contact: Contact): void; + endContact(contact: Contact): void; + preSolve(contact: Contact, oldManifold: Manifold): void; + }): void; + solvePositionConstraint(step: TimeStep): number; + solvePositionConstraintTOI(step: TimeStep, toiA: Body, toiB: Body): number; + private _solvePositionConstraint; + initVelocityConstraint(step: TimeStep): void; + warmStartConstraint(step: TimeStep): void; + storeConstraintImpulses(step: TimeStep): void; + solveVelocityConstraint(step: TimeStep): void; + } + /** + * @prop gravity [{ x : 0, y : 0}] + * @prop allowSleep [true] + * @prop warmStarting [true] + * @prop continuousPhysics [true] + * @prop subStepping [false] + * @prop blockSolve [true] + * @prop velocityIterations [8] For the velocity constraint solver. + * @prop positionIterations [3] For the position constraint solver. + */ + interface WorldDef { + gravity?: Vec2; + allowSleep?: boolean; + warmStarting?: boolean; + continuousPhysics?: boolean; + subStepping?: boolean; + blockSolve?: boolean; + velocityIterations?: number; + positionIterations?: number; + } + /** + * Callback function for ray casts, see {@link World.rayCast}. + * + * Called for each fixture found in the query. You control how the ray cast + * proceeds by returning a float: return -1: ignore this fixture and continue + * return 0: terminate the ray cast return fraction: clip the ray to this point + * return 1: don't clip the ray and continue + * + * @param fixture The fixture hit by the ray + * @param point The point of initial intersection + * @param normal The normal vector at the point of intersection + * @param fraction + * + * @return -1 to filter, 0 to terminate, fraction to clip the ray for closest hit, 1 to continue + */ + type WorldRayCastCallback = (fixture: Fixture, point: Vec2, normal: Vec2, fraction: number) => number; + /** + * Called for each fixture found in the query AABB. It may return `false` to terminate the query. + */ + type WorldAABBQueryCallback = (fixture: Fixture) => boolean; + class World { + /** + * @param def World definition or gravity vector. + */ + constructor(def?: WorldDef | Vec2 | null); + /** + * Get the world body list. With the returned body, use Body.getNext to get the + * next body in the world list. A null body indicates the end of the list. + * + * @return the head of the world body list. + */ + getBodyList(): Body | null; + /** + * Get the world joint list. With the returned joint, use Joint.getNext to get + * the next joint in the world list. A null joint indicates the end of the list. + * + * @return the head of the world joint list. + */ + getJointList(): Joint | null; + /** + * Get the world contact list. With the returned contact, use Contact.getNext to + * get the next contact in the world list. A null contact indicates the end of + * the list. + * + * Warning: contacts are created and destroyed in the middle of a time step. + * Use ContactListener to avoid missing contacts. + * + * @return the head of the world contact list. + */ + getContactList(): Contact | null; + getBodyCount(): number; + getJointCount(): number; + /** + * Get the number of contacts (each may have 0 or more contact points). + */ + getContactCount(): number; + /** + * Change the global gravity vector. + */ + setGravity(gravity: Vec2): void; + /** + * Get the global gravity vector. + */ + getGravity(): Vec2; + /** + * Is the world locked (in the middle of a time step). + */ + isLocked(): boolean; + /** + * Enable/disable sleep. + */ + setAllowSleeping(flag: boolean): void; + getAllowSleeping(): boolean; + /** + * Enable/disable warm starting. For testing. + */ + setWarmStarting(flag: boolean): void; + getWarmStarting(): boolean; + /** + * Enable/disable continuous physics. For testing. + */ + setContinuousPhysics(flag: boolean): void; + getContinuousPhysics(): boolean; + /** + * Enable/disable single stepped continuous physics. For testing. + */ + setSubStepping(flag: boolean): void; + getSubStepping(): boolean; + /** + * Set flag to control automatic clearing of forces after each time step. + */ + setAutoClearForces(flag: boolean): void; + /** + * Get the flag that controls automatic clearing of forces after each time step. + */ + getAutoClearForces(): boolean; + /** + * Manually clear the force buffer on all bodies. By default, forces are cleared + * automatically after each call to step. The default behavior is modified by + * calling setAutoClearForces. The purpose of this function is to support + * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step + * under a variable frame-rate. When you perform sub-stepping you will disable + * auto clearing of forces and instead call clearForces after all sub-steps are + * complete in one pass of your game loop. + * + * See {@link World.setAutoClearForces} + */ + clearForces(): void; + /** + * Query the world for all fixtures that potentially overlap the provided AABB. + * + * @param aabb The query box. + * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query. + */ + queryAABB(aabb: AABB, callback: WorldAABBQueryCallback): void; + /** + * Ray-cast the world for all fixtures in the path of the ray. Your callback + * controls whether you get the closest point, any point, or n-points. The + * ray-cast ignores shapes that contain the starting point. + * + * @param point1 The ray starting point + * @param point2 The ray ending point + * @param callback A user implemented callback function. + */ + rayCast(point1: Vec2, point2: Vec2, callback: WorldRayCastCallback): void; + /** + * Get the number of broad-phase proxies. + */ + getProxyCount(): number; + /** + * Get the height of broad-phase dynamic tree. + */ + getTreeHeight(): number; + /** + * Get the balance of broad-phase dynamic tree. + */ + getTreeBalance(): number; + /** + * Get the quality metric of broad-phase dynamic tree. The smaller the better. + * The minimum is 1. + */ + getTreeQuality(): number; + /** + * Shift the world origin. Useful for large worlds. The body shift formula is: + * position -= newOrigin + * + * @param newOrigin The new origin with respect to the old origin + */ + shiftOrigin(newOrigin: Vec2): void; + /** + * Create a rigid body given a definition. No reference to the definition is + * retained. + * + * Warning: This function is locked during callbacks. + */ + createBody(def?: BodyDef): Body; + createBody(position: Vec2, angle?: number): Body; + createDynamicBody(def?: BodyDef): Body; + createDynamicBody(position: Vec2, angle?: number): Body; + createKinematicBody(def?: BodyDef): Body; + createKinematicBody(position: Vec2, angle?: number): Body; + /** + * Destroy a rigid body given a definition. No reference to the definition is + * retained. + * + * Warning: This automatically deletes all associated shapes and joints. + * + * Warning: This function is locked during callbacks. + */ + destroyBody(b: Body): boolean; + /** + * Create a joint to constrain bodies together. No reference to the definition + * is retained. This may cause the connected bodies to cease colliding. + * + * Warning: This function is locked during callbacks. + */ + createJoint(joint: T): T | null; + /** + * Destroy a joint. This may cause the connected bodies to begin colliding. + * Warning: This function is locked during callbacks. + */ + destroyJoint(joint: Joint): void; + /** + * Take a time step. This performs collision detection, integration, and + * constraint solution. + * + * Broad-phase, narrow-phase, solve and solve time of impacts. + * + * @param timeStep Time step, this should not vary. + */ + step(timeStep: number, velocityIterations?: number, positionIterations?: number): void; + /** + * Called when two fixtures begin to touch. + * + * Implement contact callbacks to get contact information. You can use these + * results for things like sounds and game logic. You can also get contact + * results by traversing the contact lists after the time step. However, you + * might miss some contacts because continuous physics leads to sub-stepping. + * Additionally you may receive multiple callbacks for the same contact in a + * single time step. You should strive to make your callbacks efficient because + * there may be many callbacks per time step. + * + * Warning: You cannot create/destroy world entities inside these callbacks. + */ + on(name: "begin-contact", listener: (contact: Contact) => void): World; + /** + * Called when two fixtures cease to touch. + * + * Implement contact callbacks to get contact information. You can use these + * results for things like sounds and game logic. You can also get contact + * results by traversing the contact lists after the time step. However, you + * might miss some contacts because continuous physics leads to sub-stepping. + * Additionally you may receive multiple callbacks for the same contact in a + * single time step. You should strive to make your callbacks efficient because + * there may be many callbacks per time step. + * + * Warning: You cannot create/destroy world entities inside these callbacks. + */ + on(name: "end-contact", listener: (contact: Contact) => void): World; + /** + * This is called after a contact is updated. This allows you to inspect a + * contact before it goes to the solver. If you are careful, you can modify the + * contact manifold (e.g. disable contact). A copy of the old manifold is + * provided so that you can detect changes. Note: this is called only for awake + * bodies. Note: this is called even when the number of contact points is zero. + * Note: this is not called for sensors. Note: if you set the number of contact + * points to zero, you will not get an endContact callback. However, you may get + * a beginContact callback the next step. + * + * Warning: You cannot create/destroy world entities inside these callbacks. + */ + on(name: "pre-solve", listener: (contact: Contact, oldManifold: Manifold) => void): World; + /** + * This lets you inspect a contact after the solver is finished. This is useful + * for inspecting impulses. Note: the contact manifold does not include time of + * impact impulses, which can be arbitrarily large if the sub-step is small. + * Hence the impulse is provided explicitly in a separate data structure. Note: + * this is only called for contacts that are touching, solid, and awake. + * + * Warning: You cannot create/destroy world entities inside these callbacks. + */ + on(name: "post-solve", listener: (contact: Contact, impulse: ContactImpulse) => void): World; + /** Listener is called whenever a body is removed. */ + on(name: "remove-body", listener: (body: Body) => void): World; + /** Listener is called whenever a joint is removed implicitly or explicitly. */ + on(name: "remove-joint", listener: (joint: Joint) => void): World; + /** Listener is called whenever a fixture is removed implicitly or explicitly. */ + on(name: "remove-fixture", listener: (fixture: Fixture) => void): World; + off(name: "begin-contact", listener: (contact: Contact) => void): World; + off(name: "end-contact", listener: (contact: Contact) => void): World; + off(name: "pre-solve", listener: (contact: Contact, oldManifold: Manifold) => void): World; + off(name: "post-solve", listener: (contact: Contact, impulse: ContactImpulse) => void): World; + off(name: "remove-body", listener: (body: Body) => void): World; + off(name: "remove-joint", listener: (joint: Joint) => void): World; + off(name: "remove-fixture", listener: (fixture: Fixture) => void): World; + publish(name: string, arg1?: any, arg2?: any, arg3?: any): number; + } + class TimeStep { + /** time step */ + dt: number; + /** inverse time step (0 if dt == 0) */ + inv_dt: number; + velocityIterations: number; + positionIterations: number; + warmStarting: boolean; + blockSolve: boolean; + /** timestep ratio for variable timestep */ + inv_dt0: number; + /** dt * inv_dt0 */ + dtRatio: number; + reset(dt: number): void; + } + /** + * Contact impulses for reporting. Impulses are used instead of forces because + * sub-step forces may approach infinity for rigid body collisions. These match + * up one-to-one with the contact points in Manifold. + */ + class ContactImpulse { + // TODO: merge with Contact class? + private readonly contact; + private readonly normals; + private readonly tangents; + constructor(contact: Contact); + get normalImpulses(): number[]; + get tangentImpulses(): number[]; + } + /** + * Finds and solves islands. An island is a connected subset of the world. + */ + class Solver { + m_world: World; + m_stack: Body[]; + m_bodies: Body[]; + m_contacts: Contact[]; + m_joints: Joint[]; + constructor(world: World); + clear(): void; + addBody(body: Body): void; + addContact(contact: Contact): void; + addJoint(joint: Joint): void; + solveWorld(step: TimeStep): void; + solveIsland(step: TimeStep): void; + /** + * Find TOI contacts and solve them. + */ + solveWorldTOI(step: TimeStep): void; + solveIslandTOI(subStep: TimeStep, toiA: Body, toiB: Body): void; + } + /** + * A joint edge is used to connect bodies and joints together in a joint graph + * where each body is a node and each joint is an edge. A joint edge belongs to + * a doubly linked list maintained in each attached body. Each joint has two + * joint nodes, one for each attached body. + */ + class JointEdge { + /** + * provides quick access to the other body attached. + */ + other: Body | null; + /** + * the joint + */ + joint: Joint | null; + /** + * prev the previous joint edge in the body's joint list + */ + prev: JointEdge | null; + /** + * the next joint edge in the body's joint list + */ + next: JointEdge | null; + } + /** + * Joint definitions are used to construct joints. + */ + interface JointOpt { + /** + * Use this to attach application specific data to your joints. + */ + userData?: any; + /** + * Set this flag to true if the attached bodies + * should collide. + */ + collideConnected?: boolean; + } + /** + * Joint definitions are used to construct joints. + */ + interface JointDef extends JointOpt { + /** + * The first attached body. + */ + bodyA: Body; + /** + * The second attached body. + */ + bodyB: Body; + } + /** + * The base joint class. Joints are used to constraint two bodies together in + * various fashions. Some joints also feature limits and motors. + */ + abstract class Joint { + constructor(def: JointDef); + constructor(def: JointOpt, bodyA: Body, bodyB: Body); + /** + * Short-cut function to determine if either body is inactive. + */ + isActive(): boolean; + /** + * Get the type of the concrete joint. + */ + getType(): string; + /** + * Get the first body attached to this joint. + */ + getBodyA(): Body; + /** + * Get the second body attached to this joint. + */ + getBodyB(): Body; + /** + * Get the next joint the world joint list. + */ + getNext(): Joint; + getUserData(): unknown; + setUserData(data: unknown): void; + /** + * Get collide connected. Note: modifying the collide connect flag won't work + * correctly because the flag is only checked when fixture AABBs begin to + * overlap. + */ + getCollideConnected(): boolean; + /** + * Get the anchor point on bodyA in world coordinates. + */ + abstract getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + abstract getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + abstract getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + abstract getReactionTorque(inv_dt: number): number; + /** + * Shift the origin for any points stored in world coordinates. + */ + shiftOrigin(newOrigin: Vec2): void; + abstract initVelocityConstraints(step: TimeStep): void; + abstract solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + abstract solvePositionConstraints(step: TimeStep): boolean; + } + type BodyType = "static" | "kinematic" | "dynamic"; + interface BodyDef { + /** + * Body types are static, kinematic, or dynamic. Note: if a dynamic + * body would have zero mass, the mass is set to one. + */ + type?: BodyType; + /** + * The world position of the body. Avoid creating bodies at the + * origin since this can lead to many overlapping shapes. + */ + position?: Vec2; + /** + * The world angle of the body in radians. + */ + angle?: number; + /** + * The linear velocity of the body's origin in world co-ordinates. + */ + linearVelocity?: Vec2; + angularVelocity?: number; + /** + * Linear damping is use to reduce the linear velocity. The + * damping parameter can be larger than 1.0 but the damping effect becomes + * sensitive to the time step when the damping parameter is large. + */ + linearDamping?: number; + /** + * Angular damping is use to reduce the angular velocity. + * The damping parameter can be larger than 1.0 but the damping effect + * becomes sensitive to the time step when the damping parameter is large. + */ + angularDamping?: number; + /** + * Should this body be prevented from rotating? Useful for characters. + */ + fixedRotation?: boolean; + /** + * Is this a fast moving body that should be prevented from + * tunneling through other moving bodies? Note that all bodies are + * prevented from tunneling through kinematic and static bodies. This + * setting is only considered on dynamic bodies. Warning: You should use + * this flag sparingly since it increases processing time. + */ + bullet?: boolean; + gravityScale?: number; + /** + * Set this flag to false if this body should never fall asleep. Note that this increases CPU usage. + */ + allowSleep?: boolean; + /** + * Is this body initially awake or sleeping? + */ + awake?: boolean; + /** + * Does this body start out active? + */ + active?: boolean; + userData?: any; + } + /** + * MassData This holds the mass data computed for a shape. + */ + class MassData { + /** The mass of the shape, usually in kilograms. */ + mass: number; + /** The position of the shape's centroid relative to the shape's origin. */ + center: Vec2; + /** The rotational inertia of the shape about the local origin. */ + I: number; + } + /** + * A rigid body composed of one or more fixtures. + * + * To create a new Body use {@link World.createBody}. + */ + class Body { + /** + * A static body does not move under simulation and behaves as if it has infinite mass. + * Internally, zero is stored for the mass and the inverse mass. + * Static bodies can be moved manually by the user. + * A static body has zero velocity. + * Static bodies do not collide with other static or kinematic bodies. + */ + static readonly STATIC: BodyType; + /** + * A kinematic body moves under simulation according to its velocity. + * Kinematic bodies do not respond to forces. + * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity. + * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass. + * Kinematic bodies do not collide with other kinematic or static bodies. + */ + static readonly KINEMATIC: BodyType; + /** + * A dynamic body is fully simulated. + * They can be moved manually by the user, but normally they move according to forces. + * A dynamic body can collide with all body types. + * A dynamic body always has finite, non-zero mass. + * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate. + */ + static readonly DYNAMIC: BodyType; + isWorldLocked(): boolean; + getWorld(): World; + getNext(): Body | null; + setUserData(data: any): void; + getUserData(): unknown; + getFixtureList(): Fixture | null; + getJointList(): JointEdge | null; + /** + * Warning: this list changes during the time step and you may miss some + * collisions if you don't use ContactListener. + */ + getContactList(): ContactEdge | null; + isStatic(): boolean; + isDynamic(): boolean; + isKinematic(): boolean; + /** + * This will alter the mass and velocity. + */ + setStatic(): Body; + setDynamic(): Body; + setKinematic(): Body; + isBullet(): boolean; + /** + * Should this body be treated like a bullet for continuous collision detection? + */ + setBullet(flag: boolean): void; + isSleepingAllowed(): boolean; + setSleepingAllowed(flag: boolean): void; + isAwake(): boolean; + /** + * Set the sleep state of the body. A sleeping body has very low CPU cost. + * + * @param flag Set to true to wake the body, false to put it to sleep. + */ + setAwake(flag: boolean): void; + isActive(): boolean; + /** + * Set the active state of the body. An inactive body is not simulated and + * cannot be collided with or woken up. If you pass a flag of true, all fixtures + * will be added to the broad-phase. If you pass a flag of false, all fixtures + * will be removed from the broad-phase and all contacts will be destroyed. + * Fixtures and joints are otherwise unaffected. + * + * You may continue to create/destroy fixtures and joints on inactive bodies. + * Fixtures on an inactive body are implicitly inactive and will not participate + * in collisions, ray-casts, or queries. Joints connected to an inactive body + * are implicitly inactive. An inactive body is still owned by a World object + * and remains + */ + setActive(flag: boolean): void; + isFixedRotation(): boolean; + /** + * Set this body to have fixed rotation. This causes the mass to be reset. + */ + setFixedRotation(flag: boolean): void; + /** + * Get the world transform for the body's origin. + */ + getTransform(): Transform; + /** + * Set the position of the body's origin and rotation. Manipulating a body's + * transform may cause non-physical behavior. Note: contacts are updated on the + * next call to World.step. + * + * @param position The world position of the body's local origin. + * @param angle The world rotation in radians. + */ + setTransform(position: Vec2, angle: number): void; + synchronizeTransform(): void; + /** + * Update fixtures in broad-phase. + */ + synchronizeFixtures(): void; + /** + * Used in TOI. + */ + advance(alpha: number): void; + /** + * Get the world position for the body's origin. + */ + getPosition(): Vec2; + setPosition(p: Vec2): void; + /** + * Get the current world rotation angle in radians. + */ + getAngle(): number; + setAngle(angle: number): void; + /** + * Get the world position of the center of mass. + */ + getWorldCenter(): Vec2; + /** + * Get the local position of the center of mass. + */ + getLocalCenter(): Vec2; + /** + * Get the linear velocity of the center of mass. + * + * @return the linear velocity of the center of mass. + */ + getLinearVelocity(): Vec2; + /** + * Get the world linear velocity of a world point attached to this body. + * + * @param worldPoint A point in world coordinates. + */ + getLinearVelocityFromWorldPoint(worldPoint: Vec2): Vec2; + /** + * Get the world velocity of a local point. + * + * @param localPoint A point in local coordinates. + */ + getLinearVelocityFromLocalPoint(localPoint: Vec2): Vec2; + /** + * Set the linear velocity of the center of mass. + * + * @param v The new linear velocity of the center of mass. + */ + setLinearVelocity(v: Vec2): void; + /** + * Get the angular velocity. + * + * @returns the angular velocity in radians/second. + */ + getAngularVelocity(): number; + /** + * Set the angular velocity. + * + * @param omega The new angular velocity in radians/second. + */ + setAngularVelocity(w: number): void; + getLinearDamping(): number; + setLinearDamping(linearDamping: number): void; + getAngularDamping(): number; + setAngularDamping(angularDamping: number): void; + getGravityScale(): number; + /** + * Scale the gravity applied to this body. + */ + setGravityScale(scale: number): void; + /** + * Get the total mass of the body. + * + * @returns The mass, usually in kilograms (kg). + */ + getMass(): number; + /** + * Get the rotational inertia of the body about the local origin. + * + * @return the rotational inertia, usually in kg-m^2. + */ + getInertia(): number; + /** + * Copy the mass data of the body to data. + */ + getMassData(data: MassData): void; + /** + * This resets the mass properties to the sum of the mass properties of the + * fixtures. This normally does not need to be called unless you called + * SetMassData to override the mass and you later want to reset the mass. + */ + resetMassData(): void; + /** + * Set the mass properties to override the mass properties of the fixtures. Note + * that this changes the center of mass position. Note that creating or + * destroying fixtures can also alter the mass. This function has no effect if + * the body isn't dynamic. + * + * @param massData The mass properties. + */ + setMassData(massData: MassData): void; + /** + * Apply a force at a world point. If the force is not applied at the center of + * mass, it will generate a torque and affect the angular velocity. This wakes + * up the body. + * + * @param force The world force vector, usually in Newtons (N). + * @param point The world position of the point of application. + * @param wake Also wake up the body + */ + applyForce(force: Vec2, point: Vec2, wake?: boolean): void; + /** + * Apply a force to the center of mass. This wakes up the body. + * + * @param force The world force vector, usually in Newtons (N). + * @param wake Also wake up the body + */ + applyForceToCenter(force: Vec2, wake?: boolean): void; + /** + * Apply a torque. This affects the angular velocity without affecting the + * linear velocity of the center of mass. This wakes up the body. + * + * @param torque About the z-axis (out of the screen), usually in N-m. + * @param wake Also wake up the body + */ + applyTorque(torque: number, wake?: boolean): void; + /** + * Apply an impulse at a point. This immediately modifies the velocity. It also + * modifies the angular velocity if the point of application is not at the + * center of mass. This wakes up the body. + * + * @param impulse The world impulse vector, usually in N-seconds or kg-m/s. + * @param point The world position of the point of application. + * @param wake Also wake up the body + */ + applyLinearImpulse(impulse: Vec2, point: Vec2, wake?: boolean): void; + /** + * Apply an angular impulse. + * + * @param impulse The angular impulse in units of kg*m*m/s + * @param wake Also wake up the body + */ + applyAngularImpulse(impulse: number, wake?: boolean): void; + /** + * This is used to prevent connected bodies (by joints) from colliding, + * depending on the joint's collideConnected flag. + */ + shouldCollide(that: Body): boolean; + /** + * Creates a fixture and attach it to this body. + * + * If the density is non-zero, this function automatically updates the mass of + * the body. + * + * Contacts are not created until the next time step. + * + * Warning: This function is locked during callbacks. + */ + createFixture(def: FixtureDef): Fixture; + createFixture(shape: Shape, opt?: FixtureOpt): Fixture; + createFixture(shape: Shape, density?: number): Fixture; + /** + * Destroy a fixture. This removes the fixture from the broad-phase and destroys + * all contacts associated with this fixture. This will automatically adjust the + * mass of the body if the body is dynamic and the fixture has positive density. + * All fixtures attached to a body are implicitly destroyed when the body is + * destroyed. + * + * Warning: This function is locked during callbacks. + * + * @param fixture The fixture to be removed. + */ + destroyFixture(fixture: Fixture): void; + /** + * Get the corresponding world point of a local point. + */ + getWorldPoint(localPoint: Vec2): Vec2; + /** + * Get the corresponding world vector of a local vector. + */ + getWorldVector(localVector: Vec2): Vec2; + /** + * Gets the corresponding local point of a world point. + */ + getLocalPoint(worldPoint: Vec2Value): Vec2; + /** + * Gets the corresponding local vector of a world vector. + */ + getLocalVector(worldVector: Vec2Value): Vec2; + } + /** + * Input for Distance. You have to option to use the shape radii in the + * computation. Even + */ + class DistanceInput { + proxyA: DistanceProxy; + proxyB: DistanceProxy; + transformA: Transform | null; + transformB: Transform | null; + useRadii: boolean; + } + /** + * Output for Distance. + * + * @prop {Vec2} pointA closest point on shapeA + * @prop {Vec2} pointB closest point on shapeB + * @prop distance + * @prop iterations number of GJK iterations used + */ + class DistanceOutput { + pointA: Vec2; + pointB: Vec2; + distance: number; + iterations: number; + } + /** + * Used to warm start Distance. Set count to zero on first call. + * + * @prop {number} metric length or area + * @prop {array} indexA vertices on shape A + * @prop {array} indexB vertices on shape B + * @prop {number} count + */ + class SimplexCache { + metric: number; + indexA: number[]; + indexB: number[]; + count: number; + } + /** + * Compute the closest points between two shapes. Supports any combination of: + * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On + * the first call set SimplexCache.count to zero. + */ + const Distance: { + (output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void; + testOverlap: (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform) => boolean; + Input: typeof DistanceInput; + Output: typeof DistanceOutput; + Proxy: typeof DistanceProxy; + Cache: typeof SimplexCache; + }; + /** + * A distance proxy is used by the GJK algorithm. It encapsulates any shape. + */ + class DistanceProxy { + /** internal */ m_buffer: Vec2[]; + /** internal */ m_vertices: Vec2[]; + /** internal */ m_count: number; + /** internal */ m_radius: number; + constructor(); + /** + * Get the vertex count. + */ + getVertexCount(): number; + /** + * Get a vertex by index. Used by Distance. + */ + getVertex(index: number): Vec2; + /** + * Get the supporting vertex index in the given direction. + */ + getSupport(d: Vec2): number; + /** + * Get the supporting vertex in the given direction. + */ + getSupportVertex(d: Vec2): Vec2; + /** + * Initialize the proxy using the given shape. The shape must remain in scope + * while the proxy is in use. + */ + set(shape: Shape, index: number): void; + } + /** + * Determine if two generic shapes overlap. + */ + const testOverlap: (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform) => boolean; + // todo make shape an interface + /** + * A shape is used for collision detection. You can create a shape however you + * like. Shapes used for simulation in World are created automatically when a + * Fixture is created. Shapes may encapsulate one or more child shapes. + */ + abstract class Shape { + m_type: ShapeType; + m_radius: number; + static isValid(obj: any): boolean; + abstract getRadius(): number; + /** + * Get the type of this shape. You can use this to down cast to the concrete + * shape. + * + * @return the shape type. + */ + abstract getType(): ShapeType; + /** + * Get the number of child primitives. + */ + abstract getChildCount(): number; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + abstract testPoint(xf: Transform, p: Vec2Value): boolean; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + abstract rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + abstract computeAABB(aabb: AABB, xf: Transform, childIndex: number): void; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + abstract computeMass(massData: MassData, density?: number): void; + abstract computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void; + } + type ShapeType = "circle" | "edge" | "polygon" | "chain"; + class CircleShape extends Shape { + static TYPE: "circle"; + m_type: "circle"; + m_p: Vec2; + m_radius: number; + constructor(position: Vec2Value, radius?: number); + constructor(radius?: number); + getType(): "circle"; + getRadius(): number; + getCenter(): Vec2; + getVertex(index: 0): Vec2; + /** + * Get the number of child primitives. + */ + getChildCount(): 1; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + testPoint(xf: Transform, p: Vec2Value): boolean; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + computeAABB(aabb: AABB, xf: Transform, childIndex: number): void; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + computeMass(massData: MassData, density: number): void; + computeDistanceProxy(proxy: DistanceProxy): void; + } + const Circle: typeof CircleShape; + /** + * A line segment (edge) shape. These can be connected in chains or loops to + * other edge shapes. The connectivity information is used to ensure correct + * contact normals. + */ + class EdgeShape extends Shape { + static TYPE: "edge"; + m_type: "edge"; + m_radius: number; + // These are the edge vertices + m_vertex1: Vec2; + m_vertex2: Vec2; + // Optional adjacent vertices. These are used for smooth collision. + // Used by chain shape. + m_vertex0: Vec2; + m_vertex3: Vec2; + m_hasVertex0: boolean; + m_hasVertex3: boolean; + constructor(v1?: Vec2Value, v2?: Vec2Value); + getRadius(): number; + getType(): "edge"; + /** + * Optional next vertex, used for smooth collision. + */ + setNextVertex(v?: Vec2): EdgeShape; + /** + * Optional next vertex, used for smooth collision. + */ + getNextVertex(): Vec2; + /** + * Optional prev vertex, used for smooth collision. + */ + setPrevVertex(v?: Vec2): EdgeShape; + /** + * Optional prev vertex, used for smooth collision. + */ + getPrevVertex(): Vec2; + /** + * Set this as an isolated edge. + */ + _set(v1: Vec2, v2: Vec2): EdgeShape; + /** + * Get the number of child primitives. + */ + getChildCount(): 1; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + testPoint(xf: Transform, p: Vec2Value): false; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + computeAABB(aabb: AABB, xf: Transform, childIndex: number): void; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + computeMass(massData: MassData, density?: number): void; + computeDistanceProxy(proxy: DistanceProxy): void; + } + const Edge: typeof EdgeShape; + /** + * A convex polygon. It is assumed that the interior of the polygon is to the + * left of each edge. Polygons have a maximum number of vertices equal to + * Settings.maxPolygonVertices. In most cases you should not need many vertices + * for a convex polygon. extends Shape + */ + class PolygonShape extends Shape { + static TYPE: "polygon"; + m_type: "polygon"; + m_centroid: Vec2; + m_vertices: Vec2[]; // [Settings.maxPolygonVertices] + m_normals: Vec2[]; // [Settings.maxPolygonVertices] + m_count: number; + m_radius: number; + // @ts-ignore + constructor(vertices?: Vec2Value[]); + getType(): "polygon"; + getRadius(): number; + getVertex(index: number): Vec2; + /** + * Get the number of child primitives. + */ + getChildCount(): 1; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + testPoint(xf: Transform, p: Vec2): boolean; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + computeAABB(aabb: AABB, xf: Transform, childIndex: number): void; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + computeMass(massData: MassData, density: number): void; + /** + * Validate convexity. This is a very time consuming operation. + * @returns true if valid + */ + validate(): boolean; + computeDistanceProxy(proxy: DistanceProxy): void; + } + const Polygon: typeof PolygonShape; + /** + * A chain shape is a free form sequence of line segments. The chain has + * two-sided collision, so you can use inside and outside collision. Therefore, + * you may use any winding order. Connectivity information is used to create + * smooth collisions. + * + * WARNING: The chain will not collide properly if there are self-intersections. + */ + class ChainShape extends Shape { + static TYPE: "chain"; + m_type: "chain"; + m_radius: number; + m_vertices: Vec2[]; + m_count: number; + m_prevVertex: Vec2 | null; + m_nextVertex: Vec2 | null; + m_hasPrevVertex: boolean; + m_hasNextVertex: boolean; + m_isLoop: boolean; + constructor(vertices?: Vec2Value[], loop?: boolean); + // clear() { + // this.m_vertices.length = 0; + // this.m_count = 0; + // } + getType(): "chain"; + getRadius(): number; + /** + * Establish connectivity to a vertex that precedes the first vertex. Don't call + * this for loops. + */ + setPrevVertex(prevVertex: Vec2): void; + getPrevVertex(): Vec2; + /** + * Establish connectivity to a vertex that follows the last vertex. Don't call + * this for loops. + */ + setNextVertex(nextVertex: Vec2): void; + getNextVertex(): Vec2; + /** + * Get the number of child primitives. + */ + getChildCount(): number; + // Get a child edge. + getChildEdge(edge: EdgeShape, childIndex: number): void; + getVertex(index: number): Vec2; + isLoop(): boolean; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * This always return false. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + testPoint(xf: Transform, p: Vec2Value): false; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + computeAABB(aabb: AABB, xf: Transform, childIndex: number): void; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * Chains have zero mass. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + computeMass(massData: MassData, density?: number): void; + computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void; + } + const Chain: typeof ChainShape; + /** + * A rectangle polygon which extend PolygonShape. + */ + class BoxShape extends PolygonShape { + static TYPE: "polygon"; + constructor(hx: number, hy: number, center?: Vec2Value, angle?: number); + } + const Box: typeof BoxShape; + const CollideCircles: (manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform) => void; + // Compute contact points for edge versus circle. + // This accounts for edge connectivity. + const CollideEdgeCircle: (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform) => void; + /** + * + * Find edge normal of max separation on A - return if separating axis is found
+ * Find edge normal of max separation on B - return if separation axis is found
+ * Choose reference edge as min(minA, minB)
+ * Find incident edge
+ * Clip + * + * The normal points from 1 to 2 + */ + const CollidePolygons: (manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform) => void; + const CollidePolygonCircle: (manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform) => void; + /** + * This function collides and edge and a polygon, taking into account edge + * adjacency. + */ + const CollideEdgePolygon: (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform) => void; + /** + * Distance joint definition. This requires defining an anchor point on both + * bodies and the non-zero length of the distance joint. The definition uses + * local anchor points so that the initial configuration can violate the + * constraint slightly. This helps when saving and loading a game. Warning: Do + * not use a zero or short length. + */ + interface DistanceJointOpt extends JointOpt { + /** + * The mass-spring-damper frequency in Hertz. A value of 0 disables softness. + */ + frequencyHz?: number; + /** + * The damping ratio. 0 = no damping, 1 = critical damping. + */ + dampingRatio?: number; + /** + * Distance length. + */ + length?: number; + } + /** + * Distance joint definition. This requires defining an anchor point on both + * bodies and the non-zero length of the distance joint. The definition uses + * local anchor points so that the initial configuration can violate the + * constraint slightly. This helps when saving and loading a game. Warning: Do + * not use a zero or short length. + */ + interface DistanceJointDef extends JointDef, DistanceJointOpt { + /** + * The local anchor point relative to bodyA's origin. + */ + localAnchorA: Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + localAnchorB: Vec2; + } + /** + * A distance joint constrains two points on two bodies to remain at a fixed + * distance from each other. You can view this as a massless, rigid rod. + * + * @param anchorA Anchor A in global coordination. + * @param anchorB Anchor B in global coordination. + */ + class DistanceJoint extends Joint { + static TYPE: "distance-joint"; + constructor(def: DistanceJointDef); + constructor(def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2); + /** + * The local anchor point relative to bodyA's origin. + */ + getLocalAnchorA(): Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + getLocalAnchorB(): Vec2; + /** + * Set the natural length. Manipulating the length can lead to non-physical + * behavior when the frequency is zero. + */ + setLength(length: number): void; + /** + * Get the natural length. + */ + getLength(): number; + setFrequency(hz: number): void; + getFrequency(): number; + setDampingRatio(ratio: number): void; + getDampingRatio(): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Friction joint definition. + */ + interface FrictionJointOpt extends JointOpt { + /** + * The maximum friction force in N. + */ + maxForce?: number; + /** + * The maximum friction torque in N-m. + */ + maxTorque?: number; + } + /** + * Friction joint definition. + */ + interface FrictionJointDef extends JointDef, FrictionJointOpt { + /** + * The local anchor point relative to bodyA's origin. + */ + localAnchorA: Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + localAnchorB: Vec2; + } + /** + * Friction joint. This is used for top-down friction. It provides 2D + * translational friction and angular friction. + * + * @param anchor Anchor in global coordination. + */ + class FrictionJoint extends Joint { + static TYPE: "friction-joint"; + constructor(def: FrictionJointDef); + constructor(def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); + /** + * The local anchor point relative to bodyA's origin. + */ + getLocalAnchorA(): Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + getLocalAnchorB(): Vec2; + /** + * Set the maximum friction force in N. + */ + setMaxForce(force: number): void; + /** + * Get the maximum friction force in N. + */ + getMaxForce(): number; + /** + * Set the maximum friction torque in N*m. + */ + setMaxTorque(torque: number): void; + /** + * Get the maximum friction torque in N*m. + */ + getMaxTorque(): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Revolute joint definition. This requires defining an anchor point where the + * bodies are joined. The definition uses local anchor points so that the + * initial configuration can violate the constraint slightly. You also need to + * specify the initial relative angle for joint limits. This helps when saving + * and loading a game. + * + * The local anchor points are measured from the body's origin rather than the + * center of mass because: 1. you might not know where the center of mass will + * be. 2. if you add/remove shapes from a body and recompute the mass, the + * joints will be broken. + */ + interface RevoluteJointOpt extends JointOpt { + /** + * The lower angle for the joint limit (radians). + */ + lowerAngle?: number; + /** + * The upper angle for the joint limit (radians). + */ + upperAngle?: number; + /** + * The maximum motor torque used to achieve the desired motor speed. Usually + * in N-m. + */ + maxMotorTorque?: number; + /** + * The desired motor speed. Usually in radians per second. + */ + motorSpeed?: number; + /** + * A flag to enable joint limits. + */ + enableLimit?: boolean; + /** + * A flag to enable the joint motor. + */ + enableMotor?: boolean; + } + /** + * Revolute joint definition. This requires defining an anchor point where the + * bodies are joined. The definition uses local anchor points so that the + * initial configuration can violate the constraint slightly. You also need to + * specify the initial relative angle for joint limits. This helps when saving + * and loading a game. + * + * The local anchor points are measured from the body's origin rather than the + * center of mass because: 1. you might not know where the center of mass will + * be. 2. if you add/remove shapes from a body and recompute the mass, the + * joints will be broken. + */ + interface RevoluteJointDef extends JointDef, RevoluteJointOpt { + /** + * The local anchor point relative to bodyA's origin. + */ + localAnchorA: Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + localAnchorB: Vec2; + /** + * The bodyB angle minus bodyA angle in the reference state (radians). + */ + referenceAngle: number; + } + /** + * A revolute joint constrains two bodies to share a common point while they are + * free to rotate about the point. The relative rotation about the shared point + * is the joint angle. You can limit the relative rotation with a joint limit + * that specifies a lower and upper angle. You can use a motor to drive the + * relative rotation about the shared point. A maximum motor torque is provided + * so that infinite forces are not generated. + */ + class RevoluteJoint extends Joint { + static TYPE: "revolute-joint"; + // TODO enum + constructor(def: RevoluteJointDef); + constructor(def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); + /** + * The local anchor point relative to bodyA's origin. + */ + getLocalAnchorA(): Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + getLocalAnchorB(): Vec2; + /** + * Get the reference angle. + */ + getReferenceAngle(): number; + /** + * Get the current joint angle in radians. + */ + getJointAngle(): number; + /** + * Get the current joint angle speed in radians per second. + */ + getJointSpeed(): number; + /** + * Is the joint motor enabled? + */ + isMotorEnabled(): boolean; + /** + * Enable/disable the joint motor. + */ + enableMotor(flag: boolean): void; + /** + * Get the current motor torque given the inverse time step. Unit is N*m. + */ + getMotorTorque(inv_dt: number): number; + /** + * Set the motor speed in radians per second. + */ + setMotorSpeed(speed: number): void; + /** + * Get the motor speed in radians per second. + */ + getMotorSpeed(): number; + /** + * Set the maximum motor torque, usually in N-m. + */ + setMaxMotorTorque(torque: number): void; + getMaxMotorTorque(): number; + /** + * Is the joint limit enabled? + */ + isLimitEnabled(): boolean; + /** + * Enable/disable the joint limit. + */ + enableLimit(flag: boolean): void; + /** + * Get the lower joint limit in radians. + */ + getLowerLimit(): number; + /** + * Get the upper joint limit in radians. + */ + getUpperLimit(): number; + /** + * Set the joint limits in radians. + */ + setLimits(lower: number, upper: number): void; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force given the inverse time step. Unit is N. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque due to the joint limit given the inverse time step. + * Unit is N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Prismatic joint definition. This requires defining a line of motion using an + * axis and an anchor point. The definition uses local anchor points and a local + * axis so that the initial configuration can violate the constraint slightly. + * The joint translation is zero when the local anchor points coincide in world + * space. Using local anchors and a local axis helps when saving and loading a + * game. + */ + interface PrismaticJointOpt extends JointOpt { + /** + * Enable/disable the joint limit. + */ + enableLimit?: boolean; + /** + * The lower translation limit, usually in meters. + */ + lowerTranslation?: number; + /** + * The upper translation limit, usually in meters. + */ + upperTranslation?: number; + /** + * Enable/disable the joint motor. + */ + enableMotor?: boolean; + /** + * The maximum motor torque, usually in N-m. + */ + maxMotorForce?: number; + /** + * The desired motor speed in radians per second. + */ + motorSpeed?: number; + } + /** + * Prismatic joint definition. This requires defining a line of motion using an + * axis and an anchor point. The definition uses local anchor points and a local + * axis so that the initial configuration can violate the constraint slightly. + * The joint translation is zero when the local anchor points coincide in world + * space. Using local anchors and a local axis helps when saving and loading a + * game. + */ + interface PrismaticJointDef extends JointDef, PrismaticJointOpt { + /** + * The local anchor point relative to bodyA's origin. + */ + localAnchorA: Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + localAnchorB: Vec2; + /** + * The local translation unit axis in bodyA. + */ + localAxisA: Vec2; + /** + * referenceAngle The constrained angle between the bodies: + * bodyB_angle - bodyA_angle. + */ + referenceAngle: number; + } + /** + * A prismatic joint. This joint provides one degree of freedom: translation + * along an axis fixed in bodyA. Relative rotation is prevented. You can use a + * joint limit to restrict the range of motion and a joint motor to drive the + * motion or to model joint friction. + */ + class PrismaticJoint extends Joint { + static TYPE: "prismatic-joint"; + constructor(def: PrismaticJointDef); + constructor(def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2); + /** + * The local anchor point relative to bodyA's origin. + */ + getLocalAnchorA(): Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + getLocalAnchorB(): Vec2; + /** + * The local joint axis relative to bodyA. + */ + getLocalAxisA(): Vec2; + /** + * Get the reference angle. + */ + getReferenceAngle(): number; + /** + * Get the current joint translation, usually in meters. + */ + getJointTranslation(): number; + /** + * Get the current joint translation speed, usually in meters per second. + */ + getJointSpeed(): number; + /** + * Is the joint limit enabled? + */ + isLimitEnabled(): boolean; + /** + * Enable/disable the joint limit. + */ + enableLimit(flag: boolean): void; + /** + * Get the lower joint limit, usually in meters. + */ + getLowerLimit(): number; + /** + * Get the upper joint limit, usually in meters. + */ + getUpperLimit(): number; + /** + * Set the joint limits, usually in meters. + */ + setLimits(lower: number, upper: number): void; + /** + * Is the joint motor enabled? + */ + isMotorEnabled(): boolean; + /** + * Enable/disable the joint motor. + */ + enableMotor(flag: boolean): void; + /** + * Set the motor speed, usually in meters per second. + */ + setMotorSpeed(speed: number): void; + /** + * Set the maximum motor force, usually in N. + */ + setMaxMotorForce(force: number): void; + getMaxMotorForce(): number; + /** + * Get the motor speed, usually in meters per second. + */ + getMotorSpeed(): number; + /** + * Get the current motor force given the inverse time step, usually in N. + */ + getMotorForce(inv_dt: number): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Gear joint definition. + */ + interface GearJointOpt extends JointOpt { + /** + * The gear ratio. See {@link GearJoint} for explanation. + */ + ratio?: number; + } + /** + * Gear joint definition. + */ + interface GearJointDef extends JointDef, GearJointOpt { + /** + * The first revolute/prismatic joint attached to the gear joint. + */ + joint1: RevoluteJoint | PrismaticJoint; + /** + * The second prismatic/revolute joint attached to the gear joint. + */ + joint2: RevoluteJoint | PrismaticJoint; + } + /** + * A gear joint is used to connect two joints together. Either joint can be a + * revolute or prismatic joint. You specify a gear ratio to bind the motions + * together: coordinate1 + ratio * coordinate2 = constant + * + * The ratio can be negative or positive. If one joint is a revolute joint and + * the other joint is a prismatic joint, then the ratio will have units of + * length or units of 1/length. Warning: You have to manually destroy the gear + * joint if joint1 or joint2 is destroyed. + * + * This definition requires two existing revolute or prismatic joints (any + * combination will work). + */ + class GearJoint extends Joint { + static TYPE: "gear-joint"; + constructor(def: GearJointDef); + constructor(def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number); + /** + * Get the first joint. + */ + getJoint1(): Joint; + /** + * Get the second joint. + */ + getJoint2(): Joint; + /** + * Set the gear ratio. + */ + setRatio(ratio: number): void; + /** + * Get the gear ratio. + */ + getRatio(): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Motor joint definition. + */ + interface MotorJointOpt extends JointOpt { + /** + * The bodyB angle minus bodyA angle in radians. + */ + angularOffset?: number; + /** + * The maximum motor force in N. + */ + maxForce?: number; + /** + * The maximum motor torque in N-m. + */ + maxTorque?: number; + /** + * Position correction factor in the range [0,1]. + */ + correctionFactor?: number; + /** + * Position of bodyB minus the position of bodyA, in bodyA's frame, in meters. + */ + linearOffset?: Vec2; + } + /** + * Motor joint definition. + */ + interface MotorJointDef extends JointDef, MotorJointOpt { + } + /** + * A motor joint is used to control the relative motion between two bodies. A + * typical usage is to control the movement of a dynamic body with respect to + * the ground. + */ + class MotorJoint extends Joint { + static TYPE: "motor-joint"; + constructor(def: MotorJointDef); + constructor(def: MotorJointOpt, bodyA: Body, bodyB: Body); + /** + * Set the maximum friction force in N. + */ + setMaxForce(force: number): void; + /** + * Get the maximum friction force in N. + */ + getMaxForce(): number; + /** + * Set the maximum friction torque in N*m. + */ + setMaxTorque(torque: number): void; + /** + * Get the maximum friction torque in N*m. + */ + getMaxTorque(): number; + /** + * Set the position correction factor in the range [0,1]. + */ + setCorrectionFactor(factor: number): void; + /** + * Get the position correction factor in the range [0,1]. + */ + getCorrectionFactor(): number; + /** + * Set/get the target linear offset, in frame A, in meters. + */ + setLinearOffset(linearOffset: Vec2): void; + getLinearOffset(): Vec2; + /** + * Set/get the target angular offset, in radians. + */ + setAngularOffset(angularOffset: number): void; + getAngularOffset(): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Mouse joint definition. This requires a world target point, tuning + * parameters, and the time step. + */ + interface MouseJointOpt extends JointOpt { + /** + * [maxForce = 0.0] The maximum constraint force that can be exerted to move + * the candidate body. Usually you will express as some multiple of the + * weight (multiplier * mass * gravity). + */ + maxForce?: number; + /** + * [frequencyHz = 5.0] The response speed. + */ + frequencyHz?: number; + /** + * [dampingRatio = 0.7] The damping ratio. 0 = no damping, 1 = critical + * damping. + */ + dampingRatio?: number; + } + /** + * Mouse joint definition. This requires a world target point, tuning + * parameters, and the time step. + */ + interface MouseJointDef extends JointDef, MouseJointOpt { + /** + * The initial world target point. This is assumed to coincide with the body + * anchor initially. + */ + target: Vec2Value; + } + /** + * A mouse joint is used to make a point on a body track a specified world + * point. This a soft constraint with a maximum force. This allows the + * constraint to stretch and without applying huge forces. + * + * NOTE: this joint is not documented in the manual because it was developed to + * be used in the testbed. If you want to learn how to use the mouse joint, look + * at the testbed. + */ + class MouseJoint extends Joint { + static TYPE: "mouse-joint"; + constructor(def: MouseJointDef); + constructor(def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2); + /** + * Use this to update the target point. + */ + setTarget(target: Vec2Value): void; + getTarget(): Vec2; + /** + * Set the maximum force in Newtons. + */ + setMaxForce(force: number): void; + /** + * Get the maximum force in Newtons. + */ + getMaxForce(): number; + /** + * Set the frequency in Hertz. + */ + setFrequency(hz: number): void; + /** + * Get the frequency in Hertz. + */ + getFrequency(): number; + /** + * Set the damping ratio (dimensionless). + */ + setDampingRatio(ratio: number): void; + /** + * Get the damping ratio (dimensionless). + */ + getDampingRatio(): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + /** + * Shift the origin for any points stored in world coordinates. + */ + shiftOrigin(newOrigin: Vec2Value): void; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Pulley joint definition. This requires two ground anchors, two dynamic body + * anchor points, and a pulley ratio. + */ + // tslint:disable-next-line:no-empty-interface + interface PulleyJointOpt extends JointOpt { + } + /** + * Pulley joint definition. This requires two ground anchors, two dynamic body + * anchor points, and a pulley ratio. + */ + interface PulleyJointDef extends JointDef, PulleyJointOpt { + /** + * The first ground anchor in world coordinates. This point never moves. + */ + groundAnchorA: Vec2; + /** + * The second ground anchor in world coordinates. This point never moves. + */ + groundAnchorB: Vec2; + /** + * The local anchor point relative to bodyA's origin. + */ + localAnchorA: Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + localAnchorB: Vec2; + /** + * The reference length for the segment attached to bodyA. + */ + lengthA: number; + /** + * The reference length for the segment attached to bodyB. + */ + lengthB: number; + /** + * The pulley ratio, used to simulate a block-and-tackle. + */ + ratio: number; + } + /** + * The pulley joint is connected to two bodies and two fixed ground points. The + * pulley supports a ratio such that: length1 + ratio * length2 <= constant + * + * Yes, the force transmitted is scaled by the ratio. + * + * Warning: the pulley joint can get a bit squirrelly by itself. They often work + * better when combined with prismatic joints. You should also cover the the + * anchor points with static shapes to prevent one side from going to zero + * length. + */ + class PulleyJoint extends Joint { + static TYPE: "pulley-joint"; + constructor(def: PulleyJointDef); + constructor(def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number); + _serialize(): object; + /** + * Get the first ground anchor. + */ + getGroundAnchorA(): Vec2; + /** + * Get the second ground anchor. + */ + getGroundAnchorB(): Vec2; + /** + * Get the current length of the segment attached to bodyA. + */ + getLengthA(): number; + /** + * Get the current length of the segment attached to bodyB. + */ + getLengthB(): number; + /** + * Get the pulley ratio. + */ + getRatio(): number; + /** + * Get the current length of the segment attached to bodyA. + */ + getCurrentLengthA(): number; + /** + * Get the current length of the segment attached to bodyB. + */ + getCurrentLengthB(): number; + /** + * Shift the origin for any points stored in world coordinates. + * + * @param newOrigin + */ + shiftOrigin(newOrigin: Vec2): void; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Rope joint definition. This requires two body anchor points and a maximum + * lengths. Note: by default the connected objects will not collide. see + * collideConnected in JointDef. + */ + interface RopeJointOpt extends JointOpt { + /** + * The maximum length of the rope. + * Warning: this must be larger than linearSlop or the joint will have no effect. + */ + maxLength?: number; + } + /** + * Rope joint definition. This requires two body anchor points and a maximum + * lengths. Note: by default the connected objects will not collide. see + * collideConnected in JointDef. + */ + interface RopeJointDef extends JointDef, RopeJointOpt { + /** + * The local anchor point relative to bodyA's origin. + */ + localAnchorA: Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + localAnchorB: Vec2; + } + /** + * A rope joint enforces a maximum distance between two points on two bodies. It + * has no other effect. + * + * Warning: if you attempt to change the maximum length during the simulation + * you will get some non-physical behavior. + * + * A model that would allow you to dynamically modify the length would have some + * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you + * want to dynamically control length. + */ + class RopeJoint extends Joint { + static TYPE: "rope-joint"; + constructor(def: RopeJointDef); + constructor(def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); + /** + * The local anchor point relative to bodyA's origin. + */ + getLocalAnchorA(): Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + getLocalAnchorB(): Vec2; + /** + * Set the maximum length of the rope. + */ + setMaxLength(length: number): void; + /** + * Get the maximum length of the rope. + */ + getMaxLength(): number; + getLimitState(): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Weld joint definition. You need to specify local anchor points where they are + * attached and the relative body angle. The position of the anchor points is + * important for computing the reaction torque. + * + * @prop {float} frequencyHz + * @prop {float} dampingRatio + * + * @prop {Vec2} localAnchorA + * @prop {Vec2} localAnchorB + * @prop {float} referenceAngle + */ + interface WeldJointOpt extends JointOpt { + /** + * The mass-spring-damper frequency in Hertz. Rotation only. Disable softness + * with a value of 0. + */ + frequencyHz?: number; + /** + * The damping ratio. 0 = no damping, 1 = critical damping. + */ + dampingRatio?: number; + /** + * The bodyB angle minus bodyA angle in the reference state (radians). + */ + referenceAngle?: number; + } + /** + * Weld joint definition. You need to specify local anchor points where they are + * attached and the relative body angle. The position of the anchor points is + * important for computing the reaction torque. + */ + interface WeldJointDef extends JointDef, WeldJointOpt { + /** + * The local anchor point relative to bodyA's origin. + */ + localAnchorA: Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + localAnchorB: Vec2; + } + /** + * A weld joint essentially glues two bodies together. A weld joint may distort + * somewhat because the island constraint solver is approximate. + */ + class WeldJoint extends Joint { + static TYPE: "weld-joint"; + constructor(def: WeldJointDef); + constructor(def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); + /** + * The local anchor point relative to bodyA's origin. + */ + getLocalAnchorA(): Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + getLocalAnchorB(): Vec2; + /** + * Get the reference angle. + */ + getReferenceAngle(): number; + /** + * Set frequency in Hz. + */ + setFrequency(hz: number): void; + /** + * Get frequency in Hz. + */ + getFrequency(): number; + /** + * Set damping ratio. + */ + setDampingRatio(ratio: number): void; + /** + * Get damping ratio. + */ + getDampingRatio(): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /** + * Wheel joint definition. This requires defining a line of motion using an axis + * and an anchor point. The definition uses local anchor points and a local axis + * so that the initial configuration can violate the constraint slightly. The + * joint translation is zero when the local anchor points coincide in world + * space. Using local anchors and a local axis helps when saving and loading a + * game. + */ + interface WheelJointOpt extends JointOpt { + /** + * Enable/disable the joint motor. + */ + enableMotor?: boolean; + /** + * The maximum motor torque, usually in N-m. + */ + maxMotorTorque?: number; + /** + * The desired motor speed in radians per second. + */ + motorSpeed?: number; + /** + * Suspension frequency, zero indicates no suspension. + */ + frequencyHz?: number; + /** + * Suspension damping ratio, one indicates critical damping. + */ + dampingRatio?: number; + } + /** + * Wheel joint definition. This requires defining a line of motion using an axis + * and an anchor point. The definition uses local anchor points and a local axis + * so that the initial configuration can violate the constraint slightly. The + * joint translation is zero when the local anchor points coincide in world + * space. Using local anchors and a local axis helps when saving and loading a + * game. + */ + interface WheelJointDef extends JointDef, WheelJointOpt { + /** + * The local anchor point relative to bodyA's origin. + */ + localAnchorA: Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + localAnchorB: Vec2; + /** + * The local translation axis in bodyA. + */ + localAxisA: Vec2; + } + /** + * A wheel joint. This joint provides two degrees of freedom: translation along + * an axis fixed in bodyA and rotation in the plane. In other words, it is a + * point to line constraint with a rotational motor and a linear spring/damper. + * This joint is designed for vehicle suspensions. + */ + class WheelJoint extends Joint { + static TYPE: "wheel-joint"; + constructor(def: WheelJointDef); + constructor(def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2); + /** + * The local anchor point relative to bodyA's origin. + */ + getLocalAnchorA(): Vec2; + /** + * The local anchor point relative to bodyB's origin. + */ + getLocalAnchorB(): Vec2; + /** + * The local joint axis relative to bodyA. + */ + getLocalAxisA(): Vec2; + /** + * Get the current joint translation, usually in meters. + */ + getJointTranslation(): number; + /** + * Get the current joint translation speed, usually in meters per second. + */ + getJointSpeed(): number; + /** + * Is the joint motor enabled? + */ + isMotorEnabled(): boolean; + /** + * Enable/disable the joint motor. + */ + enableMotor(flag: boolean): void; + /** + * Set the motor speed, usually in radians per second. + */ + setMotorSpeed(speed: number): void; + /** + * Get the motor speed, usually in radians per second. + */ + getMotorSpeed(): number; + /** + * Set/Get the maximum motor force, usually in N-m. + */ + setMaxMotorTorque(torque: number): void; + getMaxMotorTorque(): number; + /** + * Get the current motor torque given the inverse time step, usually in N-m. + */ + getMotorTorque(inv_dt: number): number; + /** + * Set/Get the spring frequency in hertz. Setting the frequency to zero disables + * the spring. + */ + setSpringFrequencyHz(hz: number): void; + getSpringFrequencyHz(): number; + /** + * Set/Get the spring damping ratio + */ + setSpringDampingRatio(ratio: number): void; + getSpringDampingRatio(): number; + /** + * Get the anchor point on bodyA in world coordinates. + */ + getAnchorA(): Vec2; + /** + * Get the anchor point on bodyB in world coordinates. + */ + getAnchorB(): Vec2; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + getReactionForce(inv_dt: number): Vec2; + /** + * Get the reaction torque on bodyB in N*m. + */ + getReactionTorque(inv_dt: number): number; + initVelocityConstraints(step: TimeStep): void; + solveVelocityConstraints(step: TimeStep): void; + /** + * This returns true if the position errors are within tolerance. + */ + solvePositionConstraints(step: TimeStep): boolean; + } + /* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + // TODO merge with World options? + /** + * Tuning constants based on meters-kilograms-seconds (MKS) units. + */ + // tslint:disable-next-line:no-unnecessary-class + class Settings { + // Collision + /** + * The maximum number of contact points between two convex shapes. Do not change + * this value. + */ + static maxManifoldPoints: number; + /** + * The maximum number of vertices on a convex polygon. You cannot increase this + * too much because BlockAllocator has a maximum object size. + */ + static maxPolygonVertices: number; + /** + * This is used to fatten AABBs in the dynamic tree. This allows proxies to move + * by a small amount without triggering a tree adjustment. This is in meters. + */ + static aabbExtension: number; + /** + * This is used to fatten AABBs in the dynamic tree. This is used to predict the + * future position based on the current displacement. This is a dimensionless + * multiplier. + */ + static aabbMultiplier: number; + /** + * A small length used as a collision and constraint tolerance. Usually it is + * chosen to be numerically significant, but visually insignificant. + */ + static linearSlop: number; + static get linearSlopSquared(): number; + /** + * A small angle used as a collision and constraint tolerance. Usually it is + * chosen to be numerically significant, but visually insignificant. + */ + static angularSlop: number; + /** + * The radius of the polygon/edge shape skin. This should not be modified. + * Making this smaller means polygons will have an insufficient buffer for + * continuous collision. Making it larger may create artifacts for vertex + * collision. + */ + static get polygonRadius(): number; + /** + * Maximum number of sub-steps per contact in continuous physics simulation. + */ + static maxSubSteps: number; + // Dynamics + /** + * Maximum number of contacts to be handled to solve a TOI impact. + */ + static maxTOIContacts: number; + /** + * Maximum iterations to solve a TOI. + */ + static maxTOIIterations: number; + /** + * Maximum iterations to find Distance. + */ + static maxDistnceIterations: number; + /** + * A velocity threshold for elastic collisions. Any collision with a relative + * linear velocity below this threshold will be treated as inelastic. + */ + static velocityThreshold: number; + /** + * The maximum linear position correction used when solving constraints. This + * helps to prevent overshoot. + */ + static maxLinearCorrection: number; + /** + * The maximum angular position correction used when solving constraints. This + * helps to prevent overshoot. + */ + static maxAngularCorrection: number; + /** + * The maximum linear velocity of a body. This limit is very large and is used + * to prevent numerical problems. You shouldn't need to adjust Settings. + */ + static maxTranslation: number; + static get maxTranslationSquared(): number; + /** + * The maximum angular velocity of a body. This limit is very large and is used + * to prevent numerical problems. You shouldn't need to adjust Settings. + */ + static maxRotation: number; + static get maxRotationSquared(): number; + /** + * This scale factor controls how fast overlap is resolved. Ideally this would + * be 1 so that overlap is removed in one time step. However using values close + * to 1 often lead to overshoot. + */ + static baumgarte: number; + static toiBaugarte: number; + // Sleep + /** + * The time that a body must be still before it will go to sleep. + */ + static timeToSleep: number; + /** + * A body cannot sleep if its linear velocity is above this tolerance. + */ + static linearSleepTolerance: number; + static get linearSleepToleranceSqr(): number; + /** + * A body cannot sleep if its angular velocity is above this tolerance. + */ + static angularSleepTolerance: number; + static get angularSleepToleranceSqr(): number; + } + /** + * This describes the motion of a body/shape for TOI computation. Shapes are + * defined with respect to the body origin, which may not coincide with the + * center of mass. However, to support dynamics we must interpolate the center + * of mass position. + */ + class Sweep { + /** Local center of mass position */ + localCenter: Vec2; + /** World center position */ + c: Vec2; + /** World angle */ + a: number; + /** Fraction of the current time step in the range [0,1], c0 and a0 are c and a at alpha0. */ + alpha0: number; + c0: Vec2; + a0: number; + constructor(c?: Vec2, a?: number); + setTransform(xf: Transform): void; + setLocalCenter(localCenter: Vec2, xf: Transform): void; + /** + * Get the interpolated transform at a specific time. + * + * @param xf + * @param beta A factor in [0,1], where 0 indicates alpha0 + */ + getTransform(xf: Transform, beta?: number): void; + /** + * Advance the sweep forward, yielding a new initial state. + * + * @param alpha The new initial time + */ + advance(alpha: number): void; + forward(): void; + /** + * normalize the angles in radians to be between -pi and pi. + */ + normalize(): void; + clone(): Sweep; + set(that: Sweep): void; + } + /** + * Input parameters for TimeOfImpact. + */ + class TOIInput { + proxyA: DistanceProxy; + proxyB: DistanceProxy; + sweepA: Sweep; + sweepB: Sweep; + /** defines sweep interval [0, tMax] */ + tMax: number | undefined; + } + enum TOIOutputState { + e_unknown = 0, + e_failed = 1, + e_overlapped = 2, + e_touching = 3, + e_separated = 4 + } + /** + * Output parameters for TimeOfImpact. + */ + class TOIOutput { + state: TOIOutputState | undefined; + t: number | undefined; + } + /** + * Compute the upper bound on time before two shapes penetrate. Time is + * represented as a fraction between [0,tMax]. This uses a swept separating axis + * and may miss some intermediate, non-tunneling collision. If you change the + * time interval, you should call this function again. + * + * Note: use Distance to compute the contact point and normal at the time of + * impact. + * + * CCD via the local separating axis method. This seeks progression by computing + * the largest time at which separation is maintained. + */ + const TimeOfImpact: { + (output: TOIOutput, input: TOIInput): void; + Input: typeof TOIInput; + Output: typeof TOIOutput; + }; + const stats: { + gjkCalls: number; + gjkIters: number; + gjkMaxIters: number; + toiTime: number; + toiMaxTime: number; + toiCalls: number; + toiIters: number; + toiMaxIters: number; + toiRootIters: number; + toiMaxRootIters: number; + toString(newline?: string): string; + }; + /** @deprecated Merged with main namespace */ + const internal: { + CollidePolygons: (manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform) => void; + Settings: typeof Settings; + Sweep: typeof Sweep; + Manifold: typeof Manifold; + Distance: { + (output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void; + testOverlap: (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform) => boolean; + Input: typeof DistanceInput; + Output: typeof DistanceOutput; + Proxy: typeof DistanceProxy; + Cache: typeof SimplexCache; + }; + TimeOfImpact: { + (output: TOIOutput, input: TOIInput): void; + Input: typeof TOIInput; + Output: typeof TOIOutput; + }; + DynamicTree: typeof DynamicTree; + stats: { + gjkCalls: number; + gjkIters: number; + gjkMaxIters: number; + toiTime: number; + toiMaxTime: number; + toiCalls: number; + toiIters: number; + toiMaxIters: number; + toiRootIters: number; + toiMaxRootIters: number; + toString(newline?: string): string; + }; + }; +} +export { planck as default, Serializer, math, Vec2Value, Vec2, Vec3, Mat22, Mat33, Transform, Rot, RayCastInput, RayCastCallback, RayCastOutput, AABB, Shape, ShapeType, FixtureOpt, FixtureDef, FixtureProxy, Fixture, BodyType, BodyDef, MassData, Body, ContactEdge, EvaluateFunction, ContactCallback, mixFriction, mixRestitution, VelocityConstraintPoint, Contact, JointEdge, JointOpt, JointDef, Joint, WorldDef, WorldRayCastCallback, WorldAABBQueryCallback, World, CircleShape, Circle, EdgeShape, Edge, PolygonShape, Polygon, ChainShape, Chain, BoxShape, Box, CollideCircles, CollideEdgeCircle, CollidePolygons, CollidePolygonCircle, CollideEdgePolygon, DistanceJointOpt, DistanceJointDef, DistanceJoint, FrictionJointOpt, FrictionJointDef, FrictionJoint, GearJointOpt, GearJointDef, GearJoint, MotorJointOpt, MotorJointDef, MotorJoint, MouseJointOpt, MouseJointDef, MouseJoint, PrismaticJointOpt, PrismaticJointDef, PrismaticJoint, PulleyJointOpt, PulleyJointDef, PulleyJoint, RevoluteJointOpt, RevoluteJointDef, RevoluteJoint, RopeJointOpt, RopeJointDef, RopeJoint, WeldJointOpt, WeldJointDef, WeldJoint, WheelJointOpt, WheelJointDef, WheelJoint, Settings, Sweep, ManifoldType, ContactFeatureType, PointState, ClipVertex, Manifold, ManifoldPoint, ContactID, ContactFeature, WorldManifold, getPointStates, clipSegmentToLine, DistanceInput, DistanceOutput, SimplexCache, Distance, DistanceProxy, testOverlap, TOIInput, TOIOutputState, TOIOutput, TimeOfImpact, DynamicTreeQueryCallback, TreeNode, DynamicTree, stats, internal }; +//# sourceMappingURL=planck.d.ts.map \ No newline at end of file diff --git a/dist/planck.d.ts.map b/dist/planck.d.ts.map new file mode 100644 index 00000000..a09cc84b --- /dev/null +++ b/dist/planck.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"planck.d.ts","sourceRoot":"","sources":["../src/main.ts","../src/util/options.ts","../src/common/Math.ts","../src/common/Vec2.ts","../src/collision/AABB.ts","../src/Settings.ts","../src/util/Pool.ts","../src/collision/DynamicTree.ts","../src/common/Rot.ts","../src/common/Transform.ts","../src/common/Sweep.ts","../src/dynamics/Velocity.ts","../src/dynamics/Position.ts","../src/common/Mat22.ts","../src/collision/Manifold.ts","../src/util/stats.ts","../src/collision/Distance.ts","../src/dynamics/Contact.ts","../src/util/Timer.ts","../src/collision/TimeOfImpact.ts","../src/dynamics/Solver.ts","../src/dynamics/Joint.ts","../src/dynamics/Body.ts","../src/collision/Shape.ts","../src/dynamics/Fixture.ts","../src/collision/BroadPhase.ts","../src/dynamics/World.ts","../src/common/Vec3.ts","../src/collision/shape/EdgeShape.ts","../src/collision/shape/ChainShape.ts","../src/collision/shape/PolygonShape.ts","../src/collision/shape/BoxShape.ts","../src/collision/shape/CircleShape.ts","../src/dynamics/joint/DistanceJoint.ts","../src/dynamics/joint/FrictionJoint.ts","../src/common/Mat33.ts","../src/dynamics/joint/RevoluteJoint.ts","../src/dynamics/joint/PrismaticJoint.ts","../src/dynamics/joint/GearJoint.ts","../src/dynamics/joint/MotorJoint.ts","../src/dynamics/joint/MouseJoint.ts","../src/dynamics/joint/PulleyJoint.ts","../src/dynamics/joint/RopeJoint.ts","../src/dynamics/joint/WeldJoint.ts","../src/dynamics/joint/WheelJoint.ts","../src/serializer/index.ts","../src/collision/shape/CollideCircle.ts","../src/collision/shape/CollideEdgeCircle.ts","../src/collision/shape/CollidePolygon.ts","../src/collision/shape/CollideCirclePolygon.ts","../src/collision/shape/CollideEdgePolygon.ts","../src/index.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yCAAvsJ,SAAU;;;;;;;;;;;gBAA1L,IAAK;eAAiD,IAAK;;;;2BAAqH,SAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uCAAc,SAAU;;;;;;;;;;;;;gBAAvM,IAAK;;;;;;;2BAAwL,SAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"} \ No newline at end of file diff --git a/dist/planck.js b/dist/planck.js index 5386887f..ab6f2a6b 100644 --- a/dist/planck.js +++ b/dist/planck.js @@ -1,5 +1,5 @@ /** - * Planck.js v1.0.0-alpha.4 + * Planck.js v1.0.0-beta.0 * @license The MIT license * @copyright Copyright (c) 2021 Erin Catto, Ali Shakiba * @@ -22,131 +22,114 @@ * SOFTWARE. */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.planck = {})); -}(this, (function (exports) { 'use strict'; +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ - /* global Reflect, Promise */ +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; - var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - - function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - } +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} - var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; }; + return __assign.apply(this, arguments); +}; - function options (input, defaults) { - if (input === null || typeof input === 'undefined') { - // tslint:disable-next-line:no-object-literal-type-assertion - input = {}; - } - var output = __assign({}, input); - // tslint:disable-next-line:no-for-in - for (var key in defaults) { - if (defaults.hasOwnProperty(key) && typeof input[key] === 'undefined') { - output[key] = defaults[key]; - } +var options = function (input, defaults) { + if (input === null || typeof input === 'undefined') { + // tslint:disable-next-line:no-object-literal-type-assertion + input = {}; + } + var output = __assign({}, input); + // tslint:disable-next-line:no-for-in + for (var key in defaults) { + if (defaults.hasOwnProperty(key) && typeof input[key] === 'undefined') { + output[key] = defaults[key]; } - if (typeof Object.getOwnPropertySymbols === 'function') { - var symbols = Object.getOwnPropertySymbols(defaults); - for (var i = 0; i < symbols.length; i++) { - var symbol = symbols[i]; - if (defaults.propertyIsEnumerable(symbol) && typeof input[symbol] === 'undefined') { - output[symbol] = defaults[symbol]; - } + } + if (typeof Object.getOwnPropertySymbols === 'function') { + var symbols = Object.getOwnPropertySymbols(defaults); + for (var i = 0; i < symbols.length; i++) { + var symbol = symbols[i]; + if (defaults.propertyIsEnumerable(symbol) && typeof input[symbol] === 'undefined') { + output[symbol] = defaults[symbol]; } } - return output; } + return output; +}; - var debug = function () { - var rest = []; - for (var _i = 0; _i < arguments.length; _i++) { - rest[_i] = arguments[_i]; - } - return; - }; - var assert = function (statement, err, log) { - return; - }; - var common = { - assert: assert, - debug: debug, - }; - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var math = Object.create(Math); - // @ts-ignore - // noinspection JSConstantReassignment - math.EPSILON = 1e-9; // TODO - math.isFinite = function (x) { +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var math = Object.assign(Object.create(Math), { + EPSILON: 1e-9, + /** + * This function is used to ensure that a floating point number is not a NaN or + * infinity. + */ + isFinite: function (x) { return (typeof x === 'number') && isFinite(x) && !isNaN(x); - }; - math.assert = function (x) { - return; - }; - math.invSqrt = function (x) { - // TODO: - return 1 / Math.sqrt(x); - }; - math.nextPowerOfTwo = function (x) { + }, + assert: function (x) { + }, + /** + * Next Largest Power of 2 Given a binary integer value x, the next largest + * power of 2 can be computed by a SWAR algorithm that recursively "folds" the + * upper bits into the lower bits. This process yields a bit vector with the + * same most significant 1 as x, but all 1's below it. Adding 1 to that value + * yields the next largest power of 2. For a 32-bit value: + */ + nextPowerOfTwo: function (x) { // TODO x |= (x >> 1); x |= (x >> 2); @@ -154,11 +137,11 @@ x |= (x >> 8); x |= (x >> 16); return x + 1; - }; - math.isPowerOfTwo = function (x) { + }, + isPowerOfTwo: function (x) { return x > 0 && (x & (x - 1)) === 0; - }; - math.mod = function (num, min, max) { + }, + mod: function (num, min, max) { if (typeof min === 'undefined') { max = 1; min = 0; @@ -175,8 +158,11 @@ num = (num - max) % (min - max); return num + (num <= 0 ? min : max); } - }; - math.clamp = function (num, min, max) { + }, + /** + * Returns a min if num is less than min, and max if more than max, otherwise returns num. + */ + clamp: function (num, min, max) { if (num < min) { return min; } @@ -186,8 +172,13 @@ else { return num; } - }; - math.random = function (min, max) { + }, + /** + * Returns a random number between min and max when two arguments are provided. + * If one arg is provided between 0 to max. + * If one arg is passed between 0 to 1. + */ + random: function (min, max) { if (typeof min === 'undefined') { max = 1; min = 0; @@ -197,1990 +188,1972 @@ min = 0; } return min === max ? min : Math.random() * (max - min) + min; - }; + } +}); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var Vec2 = /** @class */ (function () { - // tslint:disable-next-line:typedef - function Vec2(x, y) { - if (!(this instanceof Vec2)) { - return new Vec2(x, y); - } - if (typeof x === 'undefined') { - this.x = 0; - this.y = 0; - } - else if (typeof x === 'object') { - this.x = x.x; - this.y = x.y; - } - else { - this.x = x; - this.y = y; - } +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Vec2 = /** @class */ (function () { + // tslint:disable-next-line:typedef + function Vec2(x, y) { + if (!(this instanceof Vec2)) { + return new Vec2(x, y); } - /** @internal */ - Vec2.prototype._serialize = function () { - return { - x: this.x, - y: this.y - }; - }; - /** @internal */ - Vec2._deserialize = function (data) { - var obj = Object.create(Vec2.prototype); - obj.x = data.x; - obj.y = data.y; - return obj; - }; - Vec2.zero = function () { - var obj = Object.create(Vec2.prototype); - obj.x = 0; - obj.y = 0; - return obj; - }; - /** @internal */ - Vec2.neo = function (x, y) { - var obj = Object.create(Vec2.prototype); - obj.x = x; - obj.y = y; - return obj; - }; - Vec2.clone = function (v) { - return Vec2.neo(v.x, v.y); - }; - /** @internal */ - Vec2.prototype.toString = function () { - return JSON.stringify(this); - }; - /** - * Does this vector contain finite coordinates? - */ - Vec2.isValid = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - return math.isFinite(obj.x) && math.isFinite(obj.y); - }; - Vec2.assert = function (o) { - return; - }; - Vec2.prototype.clone = function () { - return Vec2.clone(this); - }; - /** - * Set this vector to all zeros. - * - * @returns this - */ - Vec2.prototype.setZero = function () { - this.x = 0.0; - this.y = 0.0; - return this; - }; - /** - * Set this vector to some specified coordinates. - * - * @returns this - */ - // tslint:disable-next-line:typedef - Vec2.prototype.set = function (x, y) { - if (typeof x === 'object') { - this.x = x.x; - this.y = x.y; - } - else { - this.x = x; - this.y = y; - } - return this; - }; - /** - * Set this vector to some specified coordinates. - * - * @returns this - */ - Vec2.prototype.setNum = function (x, y) { - this.x = x; - this.y = y; - return this; - }; - /** - * Set this vector to some specified coordinates. - * - * @returns this - */ - Vec2.prototype.setVec2 = function (value) { - this.x = value.x; - this.y = value.y; - return this; - }; - /** - * @internal - * @deprecated Use setCombine or setMul - */ - Vec2.prototype.wSet = function (a, v, b, w) { - if (typeof b !== 'undefined' || typeof w !== 'undefined') { - return this.setCombine(a, v, b, w); - } - else { - return this.setMul(a, v); - } - }; - /** - * Set linear combination of v and w: `a * v + b * w` - */ - Vec2.prototype.setCombine = function (a, v, b, w) { - var x = a * v.x + b * w.x; - var y = a * v.y + b * w.y; - // `this` may be `w` + if (typeof x === 'undefined') { + this.x = 0; + this.y = 0; + } + else if (typeof x === 'object') { + this.x = x.x; + this.y = x.y; + } + else { this.x = x; this.y = y; - return this; + } + } + /** @internal */ + Vec2.prototype._serialize = function () { + return { + x: this.x, + y: this.y }; - Vec2.prototype.setMul = function (a, v) { - var x = a * v.x; - var y = a * v.y; + }; + /** @internal */ + Vec2._deserialize = function (data) { + var obj = Object.create(Vec2.prototype); + obj.x = data.x; + obj.y = data.y; + return obj; + }; + Vec2.zero = function () { + var obj = Object.create(Vec2.prototype); + obj.x = 0; + obj.y = 0; + return obj; + }; + /** @internal */ + Vec2.neo = function (x, y) { + var obj = Object.create(Vec2.prototype); + obj.x = x; + obj.y = y; + return obj; + }; + Vec2.clone = function (v) { + return Vec2.neo(v.x, v.y); + }; + /** @internal */ + Vec2.prototype.toString = function () { + return JSON.stringify(this); + }; + /** + * Does this vector contain finite coordinates? + */ + Vec2.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return math.isFinite(obj.x) && math.isFinite(obj.y); + }; + Vec2.assert = function (o) { + }; + Vec2.prototype.clone = function () { + return Vec2.clone(this); + }; + /** + * Set this vector to all zeros. + * + * @returns this + */ + Vec2.prototype.setZero = function () { + this.x = 0.0; + this.y = 0.0; + return this; + }; + /** + * Set this vector to some specified coordinates. + * + * @returns this + */ + // tslint:disable-next-line:typedef + Vec2.prototype.set = function (x, y) { + if (typeof x === 'object') { + this.x = x.x; + this.y = x.y; + } + else { this.x = x; this.y = y; - return this; - }; - /** - * Add a vector to this vector. - * - * @returns this - */ - Vec2.prototype.add = function (w) { - this.x += w.x; - this.y += w.y; - return this; - }; - /** - * @internal - * @deprecated Use addCombine or addMul - */ - Vec2.prototype.wAdd = function (a, v, b, w) { - if (typeof b !== 'undefined' || typeof w !== 'undefined') { - return this.addCombine(a, v, b, w); - } - else { - return this.addMul(a, v); - } - }; - /** - * Add linear combination of v and w: `a * v + b * w` - */ - Vec2.prototype.addCombine = function (a, v, b, w) { - var x = a * v.x + b * w.x; - var y = a * v.y + b * w.y; - // `this` may be `w` - this.x += x; - this.y += y; - return this; - }; - Vec2.prototype.addMul = function (a, v) { - var x = a * v.x; - var y = a * v.y; - this.x += x; - this.y += y; - return this; - }; - /** - * @deprecated Use subCombine or subMul - */ - Vec2.prototype.wSub = function (a, v, b, w) { - if (typeof b !== 'undefined' || typeof w !== 'undefined') { - return this.subCombine(a, v, b, w); - } - else { - return this.subMul(a, v); - } - }; - /** - * Subtract linear combination of v and w: `a * v + b * w` - */ - Vec2.prototype.subCombine = function (a, v, b, w) { - var x = a * v.x + b * w.x; - var y = a * v.y + b * w.y; - // `this` may be `w` - this.x -= x; - this.y -= y; - return this; - }; - Vec2.prototype.subMul = function (a, v) { - var x = a * v.x; - var y = a * v.y; - this.x -= x; - this.y -= y; - return this; - }; - /** - * Subtract a vector from this vector - * - * @returns this - */ - Vec2.prototype.sub = function (w) { - this.x -= w.x; - this.y -= w.y; - return this; - }; - /** - * Multiply this vector by a scalar. - * - * @returns this - */ - Vec2.prototype.mul = function (m) { - this.x *= m; - this.y *= m; - return this; - }; - /** - * Get the length of this vector (the norm). - * - * For performance, use this instead of lengthSquared (if possible). - */ - Vec2.prototype.length = function () { - return Vec2.lengthOf(this); - }; - /** - * Get the length squared. - */ - Vec2.prototype.lengthSquared = function () { - return Vec2.lengthSquared(this); - }; - /** - * Convert this vector into a unit vector. - * - * @returns old length - */ - Vec2.prototype.normalize = function () { - var length = this.length(); - if (length < math.EPSILON) { - return 0.0; - } - var invLength = 1.0 / length; - this.x *= invLength; - this.y *= invLength; - return length; - }; - /** - * Get the length of this vector (the norm). - * - * For performance, use this instead of lengthSquared (if possible). - */ - Vec2.lengthOf = function (v) { - return math.sqrt(v.x * v.x + v.y * v.y); - }; - /** - * Get the length squared. - */ - Vec2.lengthSquared = function (v) { - return v.x * v.x + v.y * v.y; - }; - Vec2.distance = function (v, w) { - var dx = v.x - w.x; - var dy = v.y - w.y; - return math.sqrt(dx * dx + dy * dy); - }; - Vec2.distanceSquared = function (v, w) { - var dx = v.x - w.x; - var dy = v.y - w.y; - return dx * dx + dy * dy; - }; - Vec2.areEqual = function (v, w) { - return v === w || typeof w === 'object' && w !== null && v.x === w.x && v.y === w.y; - }; - /** - * Get the skew vector such that dot(skew_vec, other) == cross(vec, other) - */ - Vec2.skew = function (v) { - return Vec2.neo(-v.y, v.x); - }; - /** - * Perform the dot product on two vectors. - */ - Vec2.dot = function (v, w) { - return v.x * w.x + v.y * w.y; - }; - /** - * Perform the cross product on two vectors. In 2D this produces a scalar. - * - * Perform the cross product on a vector and a scalar. In 2D this produces a - * vector. - */ - // tslint:disable-next-line:typedef - Vec2.cross = function (v, w) { - if (typeof w === 'number') { - return Vec2.neo(w * v.y, -w * v.x); - } - else if (typeof v === 'number') { - return Vec2.neo(-v * w.y, v * w.x); - } - else { - return v.x * w.y - v.y * w.x; - } - }; - /** - * Perform the cross product on two vectors. In 2D this produces a scalar. - */ - Vec2.crossVec2Vec2 = function (v, w) { - return v.x * w.y - v.y * w.x; - }; - /** - * Perform the cross product on a vector and a scalar. In 2D this produces a - * vector. - */ - Vec2.crossVec2Num = function (v, w) { - return Vec2.neo(w * v.y, -w * v.x); - }; - /** - * Perform the cross product on a vector and a scalar. In 2D this produces a - * vector. - */ - Vec2.crossNumVec2 = function (v, w) { - return Vec2.neo(-v * w.y, v * w.x); - }; - /** - * Returns `a + (v x w)` - */ - // tslint:disable-next-line:typedef - Vec2.addCross = function (a, v, w) { - if (typeof w === 'number') { - return Vec2.neo(w * v.y + a.x, -w * v.x + a.y); - } - else if (typeof v === 'number') { - return Vec2.neo(-v * w.y + a.x, v * w.x + a.y); - } - }; - /** - * Returns `a + (v x w)` - */ - Vec2.addCrossVec2Num = function (a, v, w) { - return Vec2.neo(w * v.y + a.x, -w * v.x + a.y); - }; - /** - * Returns `a + (v x w)` - */ - Vec2.addCrossNumVec2 = function (a, v, w) { - return Vec2.neo(-v * w.y + a.x, v * w.x + a.y); - }; - Vec2.add = function (v, w) { - return Vec2.neo(v.x + w.x, v.y + w.y); - }; - /** @internal @deprecated */ - Vec2.wAdd = function (a, v, b, w) { - if (typeof b !== 'undefined' || typeof w !== 'undefined') { - return Vec2.combine(a, v, b, w); - } - else { - return Vec2.mulNumVec2(a, v); - } - }; - Vec2.combine = function (a, v, b, w) { - return Vec2.zero().setCombine(a, v, b, w); - }; - Vec2.sub = function (v, w) { - return Vec2.neo(v.x - w.x, v.y - w.y); - }; - // tslint:disable-next-line:typedef - Vec2.mul = function (a, b) { - if (typeof a === 'object') { - return Vec2.neo(a.x * b, a.y * b); - } - else if (typeof b === 'object') { - return Vec2.neo(a * b.x, a * b.y); - } - }; - Vec2.mulVec2Num = function (a, b) { - return Vec2.neo(a.x * b, a.y * b); - }; - Vec2.mulNumVec2 = function (a, b) { - return Vec2.neo(a * b.x, a * b.y); - }; - Vec2.prototype.neg = function () { - this.x = -this.x; - this.y = -this.y; - return this; - }; - Vec2.neg = function (v) { - return Vec2.neo(-v.x, -v.y); - }; - Vec2.abs = function (v) { - return Vec2.neo(math.abs(v.x), math.abs(v.y)); - }; - Vec2.mid = function (v, w) { - return Vec2.neo((v.x + w.x) * 0.5, (v.y + w.y) * 0.5); - }; - Vec2.upper = function (v, w) { - return Vec2.neo(math.max(v.x, w.x), math.max(v.y, w.y)); - }; - Vec2.lower = function (v, w) { - return Vec2.neo(math.min(v.x, w.x), math.min(v.y, w.y)); - }; - Vec2.prototype.clamp = function (max) { - var lengthSqr = this.x * this.x + this.y * this.y; - if (lengthSqr > max * max) { - var invLength = math.invSqrt(lengthSqr); - this.x *= invLength * max; - this.y *= invLength * max; - } - return this; - }; - Vec2.clamp = function (v, max) { - v = Vec2.neo(v.x, v.y); - v.clamp(max); - return v; - }; - /** @internal @deprecated */ - // tslint:disable-next-line:typedef - Vec2.scaleFn = function (x, y) { - return function (v) { - return Vec2.neo(v.x * x, v.y * y); - }; - }; - /** @internal @deprecated */ - // tslint:disable-next-line:typedef - Vec2.translateFn = function (x, y) { - return function (v) { - return Vec2.neo(v.x + x, v.y + y); - }; - }; - return Vec2; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + } + return this; + }; + /** + * Set this vector to some specified coordinates. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * @returns this + */ + Vec2.prototype.setNum = function (x, y) { + this.x = x; + this.y = y; + return this; + }; + /** + * Set this vector to some specified coordinates. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * @returns this */ - var AABB = /** @class */ (function () { - function AABB(lower, upper) { - if (!(this instanceof AABB)) { - return new AABB(lower, upper); - } - this.lowerBound = Vec2.zero(); - this.upperBound = Vec2.zero(); - if (typeof lower === 'object') { - this.lowerBound.setVec2(lower); - } - if (typeof upper === 'object') { - this.upperBound.setVec2(upper); - } - else if (typeof lower === 'object') { - this.upperBound.setVec2(lower); - } + Vec2.prototype.setVec2 = function (value) { + this.x = value.x; + this.y = value.y; + return this; + }; + /** + * @internal + * @deprecated Use setCombine or setMul + */ + Vec2.prototype.wSet = function (a, v, b, w) { + if (typeof b !== 'undefined' || typeof w !== 'undefined') { + return this.setCombine(a, v, b, w); } - /** - * Verify that the bounds are sorted. - */ - AABB.prototype.isValid = function () { - return AABB.isValid(this); - }; - AABB.isValid = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - return Vec2.isValid(obj.lowerBound) && Vec2.isValid(obj.upperBound) && Vec2.sub(obj.upperBound, obj.lowerBound).lengthSquared() >= 0; - }; - AABB.assert = function (o) { - return; - }; - /** - * Get the center of the AABB. - */ - AABB.prototype.getCenter = function () { - return Vec2.neo((this.lowerBound.x + this.upperBound.x) * 0.5, (this.lowerBound.y + this.upperBound.y) * 0.5); - }; - /** - * Get the extents of the AABB (half-widths). - */ - AABB.prototype.getExtents = function () { - return Vec2.neo((this.upperBound.x - this.lowerBound.x) * 0.5, (this.upperBound.y - this.lowerBound.y) * 0.5); - }; - /** - * Get the perimeter length. - */ - AABB.prototype.getPerimeter = function () { - return 2.0 * (this.upperBound.x - this.lowerBound.x + this.upperBound.y - this.lowerBound.y); - }; - /** - * Combine one or two AABB into this one. - */ - AABB.prototype.combine = function (a, b) { - b = b || this; - var lowerA = a.lowerBound; - var upperA = a.upperBound; - var lowerB = b.lowerBound; - var upperB = b.upperBound; - var lowerX = math.min(lowerA.x, lowerB.x); - var lowerY = math.min(lowerA.y, lowerB.y); - var upperX = math.max(upperB.x, upperA.x); - var upperY = math.max(upperB.y, upperA.y); - this.lowerBound.setNum(lowerX, lowerY); - this.upperBound.setNum(upperX, upperY); - }; - AABB.prototype.combinePoints = function (a, b) { - this.lowerBound.setNum(math.min(a.x, b.x), math.min(a.y, b.y)); - this.upperBound.setNum(math.max(a.x, b.x), math.max(a.y, b.y)); - }; - AABB.prototype.set = function (aabb) { - this.lowerBound.setNum(aabb.lowerBound.x, aabb.lowerBound.y); - this.upperBound.setNum(aabb.upperBound.x, aabb.upperBound.y); - }; - AABB.prototype.contains = function (aabb) { - var result = true; - result = result && this.lowerBound.x <= aabb.lowerBound.x; - result = result && this.lowerBound.y <= aabb.lowerBound.y; - result = result && aabb.upperBound.x <= this.upperBound.x; - result = result && aabb.upperBound.y <= this.upperBound.y; - return result; - }; - AABB.prototype.extend = function (value) { - AABB.extend(this, value); - return this; - }; - AABB.extend = function (aabb, value) { - aabb.lowerBound.x -= value; - aabb.lowerBound.y -= value; - aabb.upperBound.x += value; - aabb.upperBound.y += value; - }; - AABB.testOverlap = function (a, b) { - var d1x = b.lowerBound.x - a.upperBound.x; - var d2x = a.lowerBound.x - b.upperBound.x; - var d1y = b.lowerBound.y - a.upperBound.y; - var d2y = a.lowerBound.y - b.upperBound.y; - if (d1x > 0 || d1y > 0 || d2x > 0 || d2y > 0) { - return false; - } - return true; - }; - AABB.areEqual = function (a, b) { - return Vec2.areEqual(a.lowerBound, b.lowerBound) && Vec2.areEqual(a.upperBound, b.upperBound); - }; - AABB.diff = function (a, b) { - var wD = math.max(0, math.min(a.upperBound.x, b.upperBound.x) - math.max(b.lowerBound.x, a.lowerBound.x)); - var hD = math.max(0, math.min(a.upperBound.y, b.upperBound.y) - math.max(b.lowerBound.y, a.lowerBound.y)); - var wA = a.upperBound.x - a.lowerBound.x; - var hA = a.upperBound.y - a.lowerBound.y; - var wB = b.upperBound.x - b.lowerBound.x; - var hB = b.upperBound.y - b.lowerBound.y; - return wA * hA + wB * hB - wD * hD; - }; - AABB.prototype.rayCast = function (output, input) { - // From Real-time Collision Detection, p179. - var tmin = -Infinity; - var tmax = Infinity; - var p = input.p1; - var d = Vec2.sub(input.p2, input.p1); - var absD = Vec2.abs(d); - var normal = Vec2.zero(); - for (var f = 'x'; f !== null; f = (f === 'x' ? 'y' : null)) { - if (absD.x < math.EPSILON) { - // Parallel. - if (p[f] < this.lowerBound[f] || this.upperBound[f] < p[f]) { - return false; - } - } - else { - var inv_d = 1.0 / d[f]; - var t1 = (this.lowerBound[f] - p[f]) * inv_d; - var t2 = (this.upperBound[f] - p[f]) * inv_d; - // Sign of the normal vector. - var s = -1.0; - if (t1 > t2) { - var temp = t1; - t1 = t2; - t2 = temp; - s = 1.0; - } - // Push the min up - if (t1 > tmin) { - normal.setZero(); - normal[f] = s; - tmin = t1; - } - // Pull the max down - tmax = math.min(tmax, t2); - if (tmin > tmax) { - return false; - } - } - } - // Does the ray start inside the box? - // Does the ray intersect beyond the max fraction? - if (tmin < 0.0 || input.maxFraction < tmin) { - return false; - } - // Intersection. - output.fraction = tmin; - output.normal = normal; - return true; - }; - /** @internal */ - AABB.prototype.toString = function () { - return JSON.stringify(this); - }; - return AABB; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba + else { + return this.setMul(a, v); + } + }; + /** + * Set linear combination of v and w: `a * v + b * w` + */ + Vec2.prototype.setCombine = function (a, v, b, w) { + var x = a * v.x + b * w.x; + var y = a * v.y + b * w.y; + // `this` may be `w` + this.x = x; + this.y = y; + return this; + }; + Vec2.prototype.setMul = function (a, v) { + var x = a * v.x; + var y = a * v.y; + this.x = x; + this.y = y; + return this; + }; + /** + * Add a vector to this vector. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * @returns this + */ + Vec2.prototype.add = function (w) { + this.x += w.x; + this.y += w.y; + return this; + }; + /** + * @internal + * @deprecated Use addCombine or addMul + */ + Vec2.prototype.wAdd = function (a, v, b, w) { + if (typeof b !== 'undefined' || typeof w !== 'undefined') { + return this.addCombine(a, v, b, w); + } + else { + return this.addMul(a, v); + } + }; + /** + * Add linear combination of v and w: `a * v + b * w` + */ + Vec2.prototype.addCombine = function (a, v, b, w) { + var x = a * v.x + b * w.x; + var y = a * v.y + b * w.y; + // `this` may be `w` + this.x += x; + this.y += y; + return this; + }; + Vec2.prototype.addMul = function (a, v) { + var x = a * v.x; + var y = a * v.y; + this.x += x; + this.y += y; + return this; + }; + /** + * @deprecated Use subCombine or subMul + */ + Vec2.prototype.wSub = function (a, v, b, w) { + if (typeof b !== 'undefined' || typeof w !== 'undefined') { + return this.subCombine(a, v, b, w); + } + else { + return this.subMul(a, v); + } + }; + /** + * Subtract linear combination of v and w: `a * v + b * w` + */ + Vec2.prototype.subCombine = function (a, v, b, w) { + var x = a * v.x + b * w.x; + var y = a * v.y + b * w.y; + // `this` may be `w` + this.x -= x; + this.y -= y; + return this; + }; + Vec2.prototype.subMul = function (a, v) { + var x = a * v.x; + var y = a * v.y; + this.x -= x; + this.y -= y; + return this; + }; + /** + * Subtract a vector from this vector * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * @returns this + */ + Vec2.prototype.sub = function (w) { + this.x -= w.x; + this.y -= w.y; + return this; + }; + /** + * Multiply this vector by a scalar. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - // TODO merge with World options? - /** - * Tuning constants based on meters-kilograms-seconds (MKS) units. - */ - // tslint:disable-next-line:no-unnecessary-class - var Settings = /** @class */ (function () { - function Settings() { - } - Object.defineProperty(Settings, "linearSlopSquared", { - get: function () { return Settings.linearSlop * Settings.linearSlop; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Settings, "polygonRadius", { - /** - * The radius of the polygon/edge shape skin. This should not be modified. - * Making this smaller means polygons will have an insufficient buffer for - * continuous collision. Making it larger may create artifacts for vertex - * collision. - */ - get: function () { return 2.0 * Settings.linearSlop; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Settings, "maxTranslationSquared", { - get: function () { return Settings.maxTranslation * Settings.maxTranslation; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Settings, "maxRotationSquared", { - get: function () { return Settings.maxRotation * Settings.maxRotation; }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Settings, "linearSleepToleranceSqr", { - get: function () { return Math.pow(Settings.linearSleepTolerance, 2); }, - enumerable: false, - configurable: true - }); - Object.defineProperty(Settings, "angularSleepToleranceSqr", { - get: function () { return Math.pow(Settings.angularSleepTolerance, 2); }, - enumerable: false, - configurable: true - }); - // Collision - /** - * The maximum number of contact points between two convex shapes. Do not change - * this value. - */ - Settings.maxManifoldPoints = 2; - /** - * The maximum number of vertices on a convex polygon. You cannot increase this - * too much because BlockAllocator has a maximum object size. - */ - Settings.maxPolygonVertices = 12; - /** - * This is used to fatten AABBs in the dynamic tree. This allows proxies to move - * by a small amount without triggering a tree adjustment. This is in meters. - */ - Settings.aabbExtension = 0.1; - /** - * This is used to fatten AABBs in the dynamic tree. This is used to predict the - * future position based on the current displacement. This is a dimensionless - * multiplier. - */ - Settings.aabbMultiplier = 2.0; - /** - * A small length used as a collision and constraint tolerance. Usually it is - * chosen to be numerically significant, but visually insignificant. - */ - Settings.linearSlop = 0.005; - /** - * A small angle used as a collision and constraint tolerance. Usually it is - * chosen to be numerically significant, but visually insignificant. - */ - Settings.angularSlop = (2.0 / 180.0 * Math.PI); - /** - * Maximum number of sub-steps per contact in continuous physics simulation. - */ - Settings.maxSubSteps = 8; - // Dynamics - /** - * Maximum number of contacts to be handled to solve a TOI impact. - */ - Settings.maxTOIContacts = 32; - /** - * Maximum iterations to solve a TOI. - */ - Settings.maxTOIIterations = 20; - /** - * Maximum iterations to find Distance. - */ - Settings.maxDistnceIterations = 20; - /** - * A velocity threshold for elastic collisions. Any collision with a relative - * linear velocity below this threshold will be treated as inelastic. - */ - Settings.velocityThreshold = 1.0; - /** - * The maximum linear position correction used when solving constraints. This - * helps to prevent overshoot. - */ - Settings.maxLinearCorrection = 0.2; - /** - * The maximum angular position correction used when solving constraints. This - * helps to prevent overshoot. - */ - Settings.maxAngularCorrection = (8.0 / 180.0 * Math.PI); - /** - * The maximum linear velocity of a body. This limit is very large and is used - * to prevent numerical problems. You shouldn't need to adjust Settings. - */ - Settings.maxTranslation = 2.0; - /** - * The maximum angular velocity of a body. This limit is very large and is used - * to prevent numerical problems. You shouldn't need to adjust Settings. - */ - Settings.maxRotation = (0.5 * Math.PI); - /** - * This scale factor controls how fast overlap is resolved. Ideally this would - * be 1 so that overlap is removed in one time step. However using values close - * to 1 often lead to overshoot. - */ - Settings.baumgarte = 0.2; - Settings.toiBaugarte = 0.75; - // Sleep - /** - * The time that a body must be still before it will go to sleep. - */ - Settings.timeToSleep = 0.5; - /** - * A body cannot sleep if its linear velocity is above this tolerance. - */ - Settings.linearSleepTolerance = 0.01; - /** - * A body cannot sleep if its angular velocity is above this tolerance. - */ - Settings.angularSleepTolerance = (2.0 / 180.0 * Math.PI); - return Settings; - }()); - - /* - * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js + * @returns this + */ + Vec2.prototype.mul = function (m) { + this.x *= m; + this.y *= m; + return this; + }; + /** + * Get the length of this vector (the norm). * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - */ - var Pool = /** @class */ (function () { - function Pool(opts) { - this._list = []; - this._max = Infinity; - this._createCount = 0; - this._outCount = 0; - this._inCount = 0; - this._discardCount = 0; - this._list = []; - this._max = opts.max || this._max; - this._createFn = opts.create; - this._outFn = opts.allocate; - this._inFn = opts.release; - this._discardFn = opts.discard; - } - Pool.prototype.max = function (n) { - if (typeof n === 'number') { - this._max = n; - return this; - } - return this._max; - }; - Pool.prototype.size = function () { - return this._list.length; - }; - Pool.prototype.allocate = function () { - var item; - if (this._list.length > 0) { - item = this._list.shift(); - } - else { - this._createCount++; - if (typeof this._createFn === 'function') { - item = this._createFn(); - } - else { - // tslint:disable-next-line:no-object-literal-type-assertion - item = {}; - } - } - this._outCount++; - if (typeof this._outFn === 'function') { - this._outFn(item); - } - return item; - }; - Pool.prototype.release = function (item) { - if (this._list.length < this._max) { - this._inCount++; - if (typeof this._inFn === 'function') { - this._inFn(item); - } - this._list.push(item); - } - else { - this._discardCount++; - if (typeof this._discardFn === 'function') { - item = this._discardFn(item); - } - } - }; - /** @internal */ - Pool.prototype.toString = function () { - return " +" + this._createCount + " >" + this._outCount + " <" + this._inCount + " -" - + this._discardCount + " =" + this._list.length + "/" + this._max; - }; - return Pool; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba + * For performance, use this instead of lengthSquared (if possible). + */ + Vec2.prototype.length = function () { + return Vec2.lengthOf(this); + }; + /** + * Get the length squared. + */ + Vec2.prototype.lengthSquared = function () { + return Vec2.lengthSquared(this); + }; + /** + * Convert this vector into a unit vector. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * @returns old length + */ + Vec2.prototype.normalize = function () { + var length = this.length(); + if (length < math.EPSILON) { + return 0.0; + } + var invLength = 1.0 / length; + this.x *= invLength; + this.y *= invLength; + return length; + }; + /** + * Get the length of this vector (the norm). * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * For performance, use this instead of lengthSquared (if possible). + */ + Vec2.lengthOf = function (v) { + return math.sqrt(v.x * v.x + v.y * v.y); + }; + /** + * Get the length squared. + */ + Vec2.lengthSquared = function (v) { + return v.x * v.x + v.y * v.y; + }; + Vec2.distance = function (v, w) { + var dx = v.x - w.x; + var dy = v.y - w.y; + return math.sqrt(dx * dx + dy * dy); + }; + Vec2.distanceSquared = function (v, w) { + var dx = v.x - w.x; + var dy = v.y - w.y; + return dx * dx + dy * dy; + }; + Vec2.areEqual = function (v, w) { + return v === w || typeof w === 'object' && w !== null && v.x === w.x && v.y === w.y; + }; + /** + * Get the skew vector such that dot(skew_vec, other) == cross(vec, other) + */ + Vec2.skew = function (v) { + return Vec2.neo(-v.y, v.x); + }; + /** + * Perform the dot product on two vectors. + */ + Vec2.dot = function (v, w) { + return v.x * w.x + v.y * w.y; + }; + /** + * Perform the cross product on two vectors. In 2D this produces a scalar. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * A node in the dynamic tree. The client does not interact with this directly. - */ - var TreeNode = /** @class */ (function () { - function TreeNode(id) { - /** Enlarged AABB */ - this.aabb = new AABB(); - this.userData = null; - this.parent = null; - this.child1 = null; - this.child2 = null; - /** 0: leaf, -1: free node */ - this.height = -1; - this.id = id; + * Perform the cross product on a vector and a scalar. In 2D this produces a + * vector. + */ + // tslint:disable-next-line:typedef + Vec2.cross = function (v, w) { + if (typeof w === 'number') { + return Vec2.neo(w * v.y, -w * v.x); } - /** @internal */ - TreeNode.prototype.toString = function () { - return this.id + ": " + this.userData; - }; - TreeNode.prototype.isLeaf = function () { - return this.child1 == null; - }; - return TreeNode; - }()); - /** - * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A - * dynamic tree arranges data in a binary tree to accelerate queries such as - * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we - * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger - * than the client object. This allows the client object to move by small - * amounts without triggering a tree update. - * - * Nodes are pooled and relocatable, so we use node indices rather than - * pointers. - */ - var DynamicTree = /** @class */ (function () { - function DynamicTree() { - this.inputPool = new Pool({ - create: function () { - // tslint:disable-next-line:no-object-literal-type-assertion - return {}; - }, - release: function (stack) { - } - }); - this.stackPool = new Pool({ - create: function () { - return []; - }, - release: function (stack) { - stack.length = 0; - } - }); - this.iteratorPool = new Pool({ - create: function () { - return new Iterator(); - }, - release: function (iterator) { - iterator.close(); - } - }); - this.m_root = null; - this.m_nodes = {}; - this.m_lastProxyId = 0; - this.m_pool = new Pool({ - create: function () { - return new TreeNode(); - } - }); + else if (typeof v === 'number') { + return Vec2.neo(-v * w.y, v * w.x); } - /** - * Get proxy user data. - * - * @return the proxy user data or 0 if the id is invalid. - */ - DynamicTree.prototype.getUserData = function (id) { - var node = this.m_nodes[id]; - return node.userData; - }; - /** - * Get the fat AABB for a node id. - * - * @return the proxy user data or 0 if the id is invalid. - */ - DynamicTree.prototype.getFatAABB = function (id) { - var node = this.m_nodes[id]; - return node.aabb; - }; - DynamicTree.prototype.allocateNode = function () { - var node = this.m_pool.allocate(); - node.id = ++this.m_lastProxyId; - node.userData = null; - node.parent = null; - node.child1 = null; - node.child2 = null; - node.height = -1; - this.m_nodes[node.id] = node; - return node; - }; - DynamicTree.prototype.freeNode = function (node) { - this.m_pool.release(node); - node.height = -1; - // tslint:disable-next-line:no-dynamic-delete - delete this.m_nodes[node.id]; - }; - /** - * Create a proxy in the tree as a leaf node. We return the index of the node - * instead of a pointer so that we can grow the node pool. - * - * Create a proxy. Provide a tight fitting AABB and a userData pointer. - */ - DynamicTree.prototype.createProxy = function (aabb, userData) { - var node = this.allocateNode(); - node.aabb.set(aabb); - // Fatten the aabb. - AABB.extend(node.aabb, Settings.aabbExtension); - node.userData = userData; - node.height = 0; - this.insertLeaf(node); - return node.id; - }; - /** - * Destroy a proxy. This asserts if the id is invalid. - */ - DynamicTree.prototype.destroyProxy = function (id) { - var node = this.m_nodes[id]; - this.removeLeaf(node); - this.freeNode(node); + else { + return v.x * w.y - v.y * w.x; + } + }; + /** + * Perform the cross product on two vectors. In 2D this produces a scalar. + */ + Vec2.crossVec2Vec2 = function (v, w) { + return v.x * w.y - v.y * w.x; + }; + /** + * Perform the cross product on a vector and a scalar. In 2D this produces a + * vector. + */ + Vec2.crossVec2Num = function (v, w) { + return Vec2.neo(w * v.y, -w * v.x); + }; + /** + * Perform the cross product on a vector and a scalar. In 2D this produces a + * vector. + */ + Vec2.crossNumVec2 = function (v, w) { + return Vec2.neo(-v * w.y, v * w.x); + }; + /** + * Returns `a + (v x w)` + */ + // tslint:disable-next-line:typedef + Vec2.addCross = function (a, v, w) { + if (typeof w === 'number') { + return Vec2.neo(w * v.y + a.x, -w * v.x + a.y); + } + else if (typeof v === 'number') { + return Vec2.neo(-v * w.y + a.x, v * w.x + a.y); + } + }; + /** + * Returns `a + (v x w)` + */ + Vec2.addCrossVec2Num = function (a, v, w) { + return Vec2.neo(w * v.y + a.x, -w * v.x + a.y); + }; + /** + * Returns `a + (v x w)` + */ + Vec2.addCrossNumVec2 = function (a, v, w) { + return Vec2.neo(-v * w.y + a.x, v * w.x + a.y); + }; + Vec2.add = function (v, w) { + return Vec2.neo(v.x + w.x, v.y + w.y); + }; + /** @internal @deprecated */ + Vec2.wAdd = function (a, v, b, w) { + if (typeof b !== 'undefined' || typeof w !== 'undefined') { + return Vec2.combine(a, v, b, w); + } + else { + return Vec2.mulNumVec2(a, v); + } + }; + Vec2.combine = function (a, v, b, w) { + return Vec2.zero().setCombine(a, v, b, w); + }; + Vec2.sub = function (v, w) { + return Vec2.neo(v.x - w.x, v.y - w.y); + }; + // tslint:disable-next-line:typedef + Vec2.mul = function (a, b) { + if (typeof a === 'object') { + return Vec2.neo(a.x * b, a.y * b); + } + else if (typeof b === 'object') { + return Vec2.neo(a * b.x, a * b.y); + } + }; + Vec2.mulVec2Num = function (a, b) { + return Vec2.neo(a.x * b, a.y * b); + }; + Vec2.mulNumVec2 = function (a, b) { + return Vec2.neo(a * b.x, a * b.y); + }; + Vec2.prototype.neg = function () { + this.x = -this.x; + this.y = -this.y; + return this; + }; + Vec2.neg = function (v) { + return Vec2.neo(-v.x, -v.y); + }; + Vec2.abs = function (v) { + return Vec2.neo(math.abs(v.x), math.abs(v.y)); + }; + Vec2.mid = function (v, w) { + return Vec2.neo((v.x + w.x) * 0.5, (v.y + w.y) * 0.5); + }; + Vec2.upper = function (v, w) { + return Vec2.neo(math.max(v.x, w.x), math.max(v.y, w.y)); + }; + Vec2.lower = function (v, w) { + return Vec2.neo(math.min(v.x, w.x), math.min(v.y, w.y)); + }; + Vec2.prototype.clamp = function (max) { + var lengthSqr = this.x * this.x + this.y * this.y; + if (lengthSqr > max * max) { + var scale = max / math.sqrt(lengthSqr); + this.x *= scale; + this.y *= scale; + } + return this; + }; + Vec2.clamp = function (v, max) { + var r = Vec2.neo(v.x, v.y); + r.clamp(max); + return r; + }; + /** @internal @deprecated */ + // tslint:disable-next-line:typedef + Vec2.scaleFn = function (x, y) { + return function (v) { + return Vec2.neo(v.x * x, v.y * y); }; - /** - * Move a proxy with a swepted AABB. If the proxy has moved outside of its - * fattened AABB, then the proxy is removed from the tree and re-inserted. - * Otherwise the function returns immediately. - * - * @param d Displacement - * - * @return true if the proxy was re-inserted. - */ - DynamicTree.prototype.moveProxy = function (id, aabb, d) { - var node = this.m_nodes[id]; - if (node.aabb.contains(aabb)) { - return false; - } - this.removeLeaf(node); - node.aabb.set(aabb); - // Extend AABB. - aabb = node.aabb; - AABB.extend(aabb, Settings.aabbExtension); - // Predict AABB displacement. - // const d = Vec2.mul(Settings.aabbMultiplier, displacement); - if (d.x < 0.0) { - aabb.lowerBound.x += d.x * Settings.aabbMultiplier; - } - else { - aabb.upperBound.x += d.x * Settings.aabbMultiplier; - } - if (d.y < 0.0) { - aabb.lowerBound.y += d.y * Settings.aabbMultiplier; - } - else { - aabb.upperBound.y += d.y * Settings.aabbMultiplier; - } - this.insertLeaf(node); - return true; + }; + /** @internal @deprecated */ + // tslint:disable-next-line:typedef + Vec2.translateFn = function (x, y) { + return function (v) { + return Vec2.neo(v.x + x, v.y + y); }; - DynamicTree.prototype.insertLeaf = function (leaf) { - if (this.m_root == null) { - this.m_root = leaf; - this.m_root.parent = null; - return; - } - // Find the best sibling for this node - var leafAABB = leaf.aabb; - var index = this.m_root; - while (!index.isLeaf()) { - var child1 = index.child1; - var child2 = index.child2; - var area = index.aabb.getPerimeter(); - var combinedAABB = new AABB(); - combinedAABB.combine(index.aabb, leafAABB); - var combinedArea = combinedAABB.getPerimeter(); - // Cost of creating a new parent for this node and the new leaf - var cost = 2.0 * combinedArea; - // Minimum cost of pushing the leaf further down the tree - var inheritanceCost = 2.0 * (combinedArea - area); - // Cost of descending into child1 - var cost1 = void 0; - if (child1.isLeaf()) { - var aabb = new AABB(); - aabb.combine(leafAABB, child1.aabb); - cost1 = aabb.getPerimeter() + inheritanceCost; - } - else { - var aabb = new AABB(); - aabb.combine(leafAABB, child1.aabb); - var oldArea = child1.aabb.getPerimeter(); - var newArea = aabb.getPerimeter(); - cost1 = (newArea - oldArea) + inheritanceCost; - } - // Cost of descending into child2 - var cost2 = void 0; - if (child2.isLeaf()) { - var aabb = new AABB(); - aabb.combine(leafAABB, child2.aabb); - cost2 = aabb.getPerimeter() + inheritanceCost; - } - else { - var aabb = new AABB(); - aabb.combine(leafAABB, child2.aabb); - var oldArea = child2.aabb.getPerimeter(); - var newArea = aabb.getPerimeter(); - cost2 = newArea - oldArea + inheritanceCost; - } - // Descend according to the minimum cost. - if (cost < cost1 && cost < cost2) { - break; - } - // Descend - if (cost1 < cost2) { - index = child1; - } - else { - index = child2; - } - } - var sibling = index; - // Create a new parent. - var oldParent = sibling.parent; - var newParent = this.allocateNode(); - newParent.parent = oldParent; - newParent.userData = null; - newParent.aabb.combine(leafAABB, sibling.aabb); - newParent.height = sibling.height + 1; - if (oldParent != null) { - // The sibling was not the root. - if (oldParent.child1 === sibling) { - oldParent.child1 = newParent; - } - else { - oldParent.child2 = newParent; + }; + return Vec2; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var AABB = /** @class */ (function () { + function AABB(lower, upper) { + if (!(this instanceof AABB)) { + return new AABB(lower, upper); + } + this.lowerBound = Vec2.zero(); + this.upperBound = Vec2.zero(); + if (typeof lower === 'object') { + this.lowerBound.setVec2(lower); + } + if (typeof upper === 'object') { + this.upperBound.setVec2(upper); + } + else if (typeof lower === 'object') { + this.upperBound.setVec2(lower); + } + } + /** + * Verify that the bounds are sorted. + */ + AABB.prototype.isValid = function () { + return AABB.isValid(this); + }; + AABB.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return Vec2.isValid(obj.lowerBound) && Vec2.isValid(obj.upperBound) && Vec2.sub(obj.upperBound, obj.lowerBound).lengthSquared() >= 0; + }; + AABB.assert = function (o) { + }; + /** + * Get the center of the AABB. + */ + AABB.prototype.getCenter = function () { + return Vec2.neo((this.lowerBound.x + this.upperBound.x) * 0.5, (this.lowerBound.y + this.upperBound.y) * 0.5); + }; + /** + * Get the extents of the AABB (half-widths). + */ + AABB.prototype.getExtents = function () { + return Vec2.neo((this.upperBound.x - this.lowerBound.x) * 0.5, (this.upperBound.y - this.lowerBound.y) * 0.5); + }; + /** + * Get the perimeter length. + */ + AABB.prototype.getPerimeter = function () { + return 2.0 * (this.upperBound.x - this.lowerBound.x + this.upperBound.y - this.lowerBound.y); + }; + /** + * Combine one or two AABB into this one. + */ + AABB.prototype.combine = function (a, b) { + b = b || this; + var lowerA = a.lowerBound; + var upperA = a.upperBound; + var lowerB = b.lowerBound; + var upperB = b.upperBound; + var lowerX = math.min(lowerA.x, lowerB.x); + var lowerY = math.min(lowerA.y, lowerB.y); + var upperX = math.max(upperB.x, upperA.x); + var upperY = math.max(upperB.y, upperA.y); + this.lowerBound.setNum(lowerX, lowerY); + this.upperBound.setNum(upperX, upperY); + }; + AABB.prototype.combinePoints = function (a, b) { + this.lowerBound.setNum(math.min(a.x, b.x), math.min(a.y, b.y)); + this.upperBound.setNum(math.max(a.x, b.x), math.max(a.y, b.y)); + }; + AABB.prototype.set = function (aabb) { + this.lowerBound.setNum(aabb.lowerBound.x, aabb.lowerBound.y); + this.upperBound.setNum(aabb.upperBound.x, aabb.upperBound.y); + }; + AABB.prototype.contains = function (aabb) { + var result = true; + result = result && this.lowerBound.x <= aabb.lowerBound.x; + result = result && this.lowerBound.y <= aabb.lowerBound.y; + result = result && aabb.upperBound.x <= this.upperBound.x; + result = result && aabb.upperBound.y <= this.upperBound.y; + return result; + }; + AABB.prototype.extend = function (value) { + AABB.extend(this, value); + return this; + }; + AABB.extend = function (aabb, value) { + aabb.lowerBound.x -= value; + aabb.lowerBound.y -= value; + aabb.upperBound.x += value; + aabb.upperBound.y += value; + }; + AABB.testOverlap = function (a, b) { + var d1x = b.lowerBound.x - a.upperBound.x; + var d2x = a.lowerBound.x - b.upperBound.x; + var d1y = b.lowerBound.y - a.upperBound.y; + var d2y = a.lowerBound.y - b.upperBound.y; + if (d1x > 0 || d1y > 0 || d2x > 0 || d2y > 0) { + return false; + } + return true; + }; + AABB.areEqual = function (a, b) { + return Vec2.areEqual(a.lowerBound, b.lowerBound) && Vec2.areEqual(a.upperBound, b.upperBound); + }; + AABB.diff = function (a, b) { + var wD = math.max(0, math.min(a.upperBound.x, b.upperBound.x) - math.max(b.lowerBound.x, a.lowerBound.x)); + var hD = math.max(0, math.min(a.upperBound.y, b.upperBound.y) - math.max(b.lowerBound.y, a.lowerBound.y)); + var wA = a.upperBound.x - a.lowerBound.x; + var hA = a.upperBound.y - a.lowerBound.y; + var wB = b.upperBound.x - b.lowerBound.x; + var hB = b.upperBound.y - b.lowerBound.y; + return wA * hA + wB * hB - wD * hD; + }; + AABB.prototype.rayCast = function (output, input) { + // From Real-time Collision Detection, p179. + var tmin = -Infinity; + var tmax = Infinity; + var p = input.p1; + var d = Vec2.sub(input.p2, input.p1); + var absD = Vec2.abs(d); + var normal = Vec2.zero(); + for (var f = 'x'; f !== null; f = (f === 'x' ? 'y' : null)) { + if (absD.x < math.EPSILON) { + // Parallel. + if (p[f] < this.lowerBound[f] || this.upperBound[f] < p[f]) { + return false; } - newParent.child1 = sibling; - newParent.child2 = leaf; - sibling.parent = newParent; - leaf.parent = newParent; } else { - // The sibling was the root. - newParent.child1 = sibling; - newParent.child2 = leaf; - sibling.parent = newParent; - leaf.parent = newParent; - this.m_root = newParent; - } - // Walk back up the tree fixing heights and AABBs - index = leaf.parent; - while (index != null) { - index = this.balance(index); - var child1 = index.child1; - var child2 = index.child2; - index.height = 1 + math.max(child1.height, child2.height); - index.aabb.combine(child1.aabb, child2.aabb); - index = index.parent; - } - // validate(); - }; - DynamicTree.prototype.removeLeaf = function (leaf) { - if (leaf === this.m_root) { - this.m_root = null; - return; + var inv_d = 1.0 / d[f]; + var t1 = (this.lowerBound[f] - p[f]) * inv_d; + var t2 = (this.upperBound[f] - p[f]) * inv_d; + // Sign of the normal vector. + var s = -1.0; + if (t1 > t2) { + var temp = t1; + t1 = t2; + t2 = temp; + s = 1.0; + } + // Push the min up + if (t1 > tmin) { + normal.setZero(); + normal[f] = s; + tmin = t1; + } + // Pull the max down + tmax = math.min(tmax, t2); + if (tmin > tmax) { + return false; + } } - var parent = leaf.parent; - var grandParent = parent.parent; - var sibling; - if (parent.child1 === leaf) { - sibling = parent.child2; + } + // Does the ray start inside the box? + // Does the ray intersect beyond the max fraction? + if (tmin < 0.0 || input.maxFraction < tmin) { + return false; + } + // Intersection. + output.fraction = tmin; + output.normal = normal; + return true; + }; + /** @internal */ + AABB.prototype.toString = function () { + return JSON.stringify(this); + }; + return AABB; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +// TODO merge with World options? +/** + * Tuning constants based on meters-kilograms-seconds (MKS) units. + */ +// tslint:disable-next-line:no-unnecessary-class +var Settings = /** @class */ (function () { + function Settings() { + } + Object.defineProperty(Settings, "linearSlopSquared", { + get: function () { return Settings.linearSlop * Settings.linearSlop; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "polygonRadius", { + /** + * The radius of the polygon/edge shape skin. This should not be modified. + * Making this smaller means polygons will have an insufficient buffer for + * continuous collision. Making it larger may create artifacts for vertex + * collision. + */ + get: function () { return 2.0 * Settings.linearSlop; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "maxTranslationSquared", { + get: function () { return Settings.maxTranslation * Settings.maxTranslation; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "maxRotationSquared", { + get: function () { return Settings.maxRotation * Settings.maxRotation; }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "linearSleepToleranceSqr", { + get: function () { return Math.pow(Settings.linearSleepTolerance, 2); }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Settings, "angularSleepToleranceSqr", { + get: function () { return Math.pow(Settings.angularSleepTolerance, 2); }, + enumerable: false, + configurable: true + }); + // Collision + /** + * The maximum number of contact points between two convex shapes. Do not change + * this value. + */ + Settings.maxManifoldPoints = 2; + /** + * The maximum number of vertices on a convex polygon. You cannot increase this + * too much because BlockAllocator has a maximum object size. + */ + Settings.maxPolygonVertices = 12; + /** + * This is used to fatten AABBs in the dynamic tree. This allows proxies to move + * by a small amount without triggering a tree adjustment. This is in meters. + */ + Settings.aabbExtension = 0.1; + /** + * This is used to fatten AABBs in the dynamic tree. This is used to predict the + * future position based on the current displacement. This is a dimensionless + * multiplier. + */ + Settings.aabbMultiplier = 2.0; + /** + * A small length used as a collision and constraint tolerance. Usually it is + * chosen to be numerically significant, but visually insignificant. + */ + Settings.linearSlop = 0.005; + /** + * A small angle used as a collision and constraint tolerance. Usually it is + * chosen to be numerically significant, but visually insignificant. + */ + Settings.angularSlop = (2.0 / 180.0 * Math.PI); + /** + * Maximum number of sub-steps per contact in continuous physics simulation. + */ + Settings.maxSubSteps = 8; + // Dynamics + /** + * Maximum number of contacts to be handled to solve a TOI impact. + */ + Settings.maxTOIContacts = 32; + /** + * Maximum iterations to solve a TOI. + */ + Settings.maxTOIIterations = 20; + /** + * Maximum iterations to find Distance. + */ + Settings.maxDistnceIterations = 20; + /** + * A velocity threshold for elastic collisions. Any collision with a relative + * linear velocity below this threshold will be treated as inelastic. + */ + Settings.velocityThreshold = 1.0; + /** + * The maximum linear position correction used when solving constraints. This + * helps to prevent overshoot. + */ + Settings.maxLinearCorrection = 0.2; + /** + * The maximum angular position correction used when solving constraints. This + * helps to prevent overshoot. + */ + Settings.maxAngularCorrection = (8.0 / 180.0 * Math.PI); + /** + * The maximum linear velocity of a body. This limit is very large and is used + * to prevent numerical problems. You shouldn't need to adjust Settings. + */ + Settings.maxTranslation = 2.0; + /** + * The maximum angular velocity of a body. This limit is very large and is used + * to prevent numerical problems. You shouldn't need to adjust Settings. + */ + Settings.maxRotation = (0.5 * Math.PI); + /** + * This scale factor controls how fast overlap is resolved. Ideally this would + * be 1 so that overlap is removed in one time step. However using values close + * to 1 often lead to overshoot. + */ + Settings.baumgarte = 0.2; + Settings.toiBaugarte = 0.75; + // Sleep + /** + * The time that a body must be still before it will go to sleep. + */ + Settings.timeToSleep = 0.5; + /** + * A body cannot sleep if its linear velocity is above this tolerance. + */ + Settings.linearSleepTolerance = 0.01; + /** + * A body cannot sleep if its angular velocity is above this tolerance. + */ + Settings.angularSleepTolerance = (2.0 / 180.0 * Math.PI); + return Settings; +}()); + +/* + * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + */ +var Pool = /** @class */ (function () { + function Pool(opts) { + this._list = []; + this._max = Infinity; + this._createCount = 0; + this._outCount = 0; + this._inCount = 0; + this._discardCount = 0; + this._list = []; + this._max = opts.max || this._max; + this._createFn = opts.create; + this._outFn = opts.allocate; + this._inFn = opts.release; + this._discardFn = opts.discard; + } + Pool.prototype.max = function (n) { + if (typeof n === 'number') { + this._max = n; + return this; + } + return this._max; + }; + Pool.prototype.size = function () { + return this._list.length; + }; + Pool.prototype.allocate = function () { + var item; + if (this._list.length > 0) { + item = this._list.shift(); + } + else { + this._createCount++; + if (typeof this._createFn === 'function') { + item = this._createFn(); } else { - sibling = parent.child1; + // tslint:disable-next-line:no-object-literal-type-assertion + item = {}; } - if (grandParent != null) { - // Destroy parent and connect sibling to grandParent. - if (grandParent.child1 === parent) { - grandParent.child1 = sibling; - } - else { - grandParent.child2 = sibling; - } - sibling.parent = grandParent; - this.freeNode(parent); - // Adjust ancestor bounds. - var index = grandParent; - while (index != null) { - index = this.balance(index); - var child1 = index.child1; - var child2 = index.child2; - index.aabb.combine(child1.aabb, child2.aabb); - index.height = 1 + math.max(child1.height, child2.height); - index = index.parent; - } + } + this._outCount++; + if (typeof this._outFn === 'function') { + this._outFn(item); + } + return item; + }; + Pool.prototype.release = function (item) { + if (this._list.length < this._max) { + this._inCount++; + if (typeof this._inFn === 'function') { + this._inFn(item); } - else { - this.m_root = sibling; - sibling.parent = null; - this.freeNode(parent); + this._list.push(item); + } + else { + this._discardCount++; + if (typeof this._discardFn === 'function') { + item = this._discardFn(item); } - // validate(); - }; - /** - * Perform a left or right rotation if node A is imbalanced. Returns the new - * root index. - */ - DynamicTree.prototype.balance = function (iA) { - var A = iA; - if (A.isLeaf() || A.height < 2) { - return iA; - } - var B = A.child1; - var C = A.child2; - var balance = C.height - B.height; - // Rotate C up - if (balance > 1) { - var F = C.child1; - var G = C.child2; - // Swap A and C - C.child1 = A; - C.parent = A.parent; - A.parent = C; - // A's old parent should point to C - if (C.parent != null) { - if (C.parent.child1 === iA) { - C.parent.child1 = C; - } - else { - C.parent.child2 = C; - } - } - else { - this.m_root = C; - } - // Rotate - if (F.height > G.height) { - C.child2 = F; - A.child2 = G; - G.parent = A; - A.aabb.combine(B.aabb, G.aabb); - C.aabb.combine(A.aabb, F.aabb); - A.height = 1 + math.max(B.height, G.height); - C.height = 1 + math.max(A.height, F.height); - } - else { - C.child2 = G; - A.child2 = F; - F.parent = A; - A.aabb.combine(B.aabb, F.aabb); - C.aabb.combine(A.aabb, G.aabb); - A.height = 1 + math.max(B.height, F.height); - C.height = 1 + math.max(A.height, G.height); - } - return C; - } - // Rotate B up - if (balance < -1) { - var D = B.child1; - var E = B.child2; - // Swap A and B - B.child1 = A; - B.parent = A.parent; - A.parent = B; - // A's old parent should point to B - if (B.parent != null) { - if (B.parent.child1 === A) { - B.parent.child1 = B; - } - else { - B.parent.child2 = B; - } - } - else { - this.m_root = B; - } - // Rotate - if (D.height > E.height) { - B.child2 = D; - A.child1 = E; - E.parent = A; - A.aabb.combine(C.aabb, E.aabb); - B.aabb.combine(A.aabb, D.aabb); - A.height = 1 + math.max(C.height, E.height); - B.height = 1 + math.max(A.height, D.height); - } - else { - B.child2 = E; - A.child1 = D; - D.parent = A; - A.aabb.combine(C.aabb, D.aabb); - B.aabb.combine(A.aabb, E.aabb); - A.height = 1 + math.max(C.height, D.height); - B.height = 1 + math.max(A.height, E.height); - } - return B; + } + }; + /** @internal */ + Pool.prototype.toString = function () { + return " +" + this._createCount + " >" + this._outCount + " <" + this._inCount + " -" + + this._discardCount + " =" + this._list.length + "/" + this._max; + }; + return Pool; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A node in the dynamic tree. The client does not interact with this directly. + */ +var TreeNode = /** @class */ (function () { + function TreeNode(id) { + /** Enlarged AABB */ + this.aabb = new AABB(); + this.userData = null; + this.parent = null; + this.child1 = null; + this.child2 = null; + /** 0: leaf, -1: free node */ + this.height = -1; + this.id = id; + } + /** @internal */ + TreeNode.prototype.toString = function () { + return this.id + ": " + this.userData; + }; + TreeNode.prototype.isLeaf = function () { + return this.child1 == null; + }; + return TreeNode; +}()); +/** + * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A + * dynamic tree arranges data in a binary tree to accelerate queries such as + * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we + * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger + * than the client object. This allows the client object to move by small + * amounts without triggering a tree update. + * + * Nodes are pooled and relocatable, so we use node indices rather than + * pointers. + */ +var DynamicTree = /** @class */ (function () { + function DynamicTree() { + this.inputPool = new Pool({ + create: function () { + // tslint:disable-next-line:no-object-literal-type-assertion + return {}; + }, + release: function (stack) { } - return A; - }; - /** - * Compute the height of the binary tree in O(N) time. Should not be called - * often. - */ - DynamicTree.prototype.getHeight = function () { - if (this.m_root == null) { - return 0; + }); + this.stackPool = new Pool({ + create: function () { + return []; + }, + release: function (stack) { + stack.length = 0; } - return this.m_root.height; - }; - /** - * Get the ratio of the sum of the node areas to the root area. - */ - DynamicTree.prototype.getAreaRatio = function () { - if (this.m_root == null) { - return 0.0; + }); + this.iteratorPool = new Pool({ + create: function () { + return new Iterator(); + }, + release: function (iterator) { + iterator.close(); } - var root = this.m_root; - var rootArea = root.aabb.getPerimeter(); - var totalArea = 0.0; - var node; - var it = this.iteratorPool.allocate().preorder(this.m_root); - while (node = it.next()) { - if (node.height < 0) { - // Free node in pool - continue; - } - totalArea += node.aabb.getPerimeter(); + }); + this.m_root = null; + this.m_nodes = {}; + this.m_lastProxyId = 0; + this.m_pool = new Pool({ + create: function () { + return new TreeNode(); } - this.iteratorPool.release(it); - return totalArea / rootArea; - }; - /** - * Compute the height of a sub-tree. - */ - DynamicTree.prototype.computeHeight = function (id) { - var node; - if (typeof id !== 'undefined') { - node = this.m_nodes[id]; + }); + } + /** + * Get proxy user data. + * + * @return the proxy user data or 0 if the id is invalid. + */ + DynamicTree.prototype.getUserData = function (id) { + var node = this.m_nodes[id]; + return node.userData; + }; + /** + * Get the fat AABB for a node id. + * + * @return the proxy user data or 0 if the id is invalid. + */ + DynamicTree.prototype.getFatAABB = function (id) { + var node = this.m_nodes[id]; + return node.aabb; + }; + DynamicTree.prototype.allocateNode = function () { + var node = this.m_pool.allocate(); + node.id = ++this.m_lastProxyId; + node.userData = null; + node.parent = null; + node.child1 = null; + node.child2 = null; + node.height = -1; + this.m_nodes[node.id] = node; + return node; + }; + DynamicTree.prototype.freeNode = function (node) { + this.m_pool.release(node); + node.height = -1; + // tslint:disable-next-line:no-dynamic-delete + delete this.m_nodes[node.id]; + }; + /** + * Create a proxy in the tree as a leaf node. We return the index of the node + * instead of a pointer so that we can grow the node pool. + * + * Create a proxy. Provide a tight fitting AABB and a userData pointer. + */ + DynamicTree.prototype.createProxy = function (aabb, userData) { + var node = this.allocateNode(); + node.aabb.set(aabb); + // Fatten the aabb. + AABB.extend(node.aabb, Settings.aabbExtension); + node.userData = userData; + node.height = 0; + this.insertLeaf(node); + return node.id; + }; + /** + * Destroy a proxy. This asserts if the id is invalid. + */ + DynamicTree.prototype.destroyProxy = function (id) { + var node = this.m_nodes[id]; + this.removeLeaf(node); + this.freeNode(node); + }; + /** + * Move a proxy with a swepted AABB. If the proxy has moved outside of its + * fattened AABB, then the proxy is removed from the tree and re-inserted. + * Otherwise the function returns immediately. + * + * @param d Displacement + * + * @return true if the proxy was re-inserted. + */ + DynamicTree.prototype.moveProxy = function (id, aabb, d) { + var node = this.m_nodes[id]; + if (node.aabb.contains(aabb)) { + return false; + } + this.removeLeaf(node); + node.aabb.set(aabb); + // Extend AABB. + aabb = node.aabb; + AABB.extend(aabb, Settings.aabbExtension); + // Predict AABB displacement. + // const d = Vec2.mul(Settings.aabbMultiplier, displacement); + if (d.x < 0.0) { + aabb.lowerBound.x += d.x * Settings.aabbMultiplier; + } + else { + aabb.upperBound.x += d.x * Settings.aabbMultiplier; + } + if (d.y < 0.0) { + aabb.lowerBound.y += d.y * Settings.aabbMultiplier; + } + else { + aabb.upperBound.y += d.y * Settings.aabbMultiplier; + } + this.insertLeaf(node); + return true; + }; + DynamicTree.prototype.insertLeaf = function (leaf) { + if (this.m_root == null) { + this.m_root = leaf; + this.m_root.parent = null; + return; + } + // Find the best sibling for this node + var leafAABB = leaf.aabb; + var index = this.m_root; + while (!index.isLeaf()) { + var child1 = index.child1; + var child2 = index.child2; + var area = index.aabb.getPerimeter(); + var combinedAABB = new AABB(); + combinedAABB.combine(index.aabb, leafAABB); + var combinedArea = combinedAABB.getPerimeter(); + // Cost of creating a new parent for this node and the new leaf + var cost = 2.0 * combinedArea; + // Minimum cost of pushing the leaf further down the tree + var inheritanceCost = 2.0 * (combinedArea - area); + // Cost of descending into child1 + var cost1 = void 0; + if (child1.isLeaf()) { + var aabb = new AABB(); + aabb.combine(leafAABB, child1.aabb); + cost1 = aabb.getPerimeter() + inheritanceCost; } else { - node = this.m_root; + var aabb = new AABB(); + aabb.combine(leafAABB, child1.aabb); + var oldArea = child1.aabb.getPerimeter(); + var newArea = aabb.getPerimeter(); + cost1 = (newArea - oldArea) + inheritanceCost; + } + // Cost of descending into child2 + var cost2 = void 0; + if (child2.isLeaf()) { + var aabb = new AABB(); + aabb.combine(leafAABB, child2.aabb); + cost2 = aabb.getPerimeter() + inheritanceCost; } - // _ASSERT && common.assert(0 <= id && id < this.m_nodeCapacity); - if (node.isLeaf()) { - return 0; + else { + var aabb = new AABB(); + aabb.combine(leafAABB, child2.aabb); + var oldArea = child2.aabb.getPerimeter(); + var newArea = aabb.getPerimeter(); + cost2 = newArea - oldArea + inheritanceCost; + } + // Descend according to the minimum cost. + if (cost < cost1 && cost < cost2) { + break; } - var height1 = this.computeHeight(node.child1.id); - var height2 = this.computeHeight(node.child2.id); - return 1 + math.max(height1, height2); - }; - DynamicTree.prototype.validateStructure = function (node) { - if (node == null) { - return; + // Descend + if (cost1 < cost2) { + index = child1; } - if (node === this.m_root) ; - var child1 = node.child1; - var child2 = node.child2; - if (node.isLeaf()) { - return; + else { + index = child2; } - this.validateStructure(child1); - this.validateStructure(child2); - }; - DynamicTree.prototype.validateMetrics = function (node) { - if (node == null) { - return; + } + var sibling = index; + // Create a new parent. + var oldParent = sibling.parent; + var newParent = this.allocateNode(); + newParent.parent = oldParent; + newParent.userData = null; + newParent.aabb.combine(leafAABB, sibling.aabb); + newParent.height = sibling.height + 1; + if (oldParent != null) { + // The sibling was not the root. + if (oldParent.child1 === sibling) { + oldParent.child1 = newParent; } - var child1 = node.child1; - var child2 = node.child2; - if (node.isLeaf()) { - return; + else { + oldParent.child2 = newParent; } - // _ASSERT && common.assert(0 <= child1 && child1 < this.m_nodeCapacity); - // _ASSERT && common.assert(0 <= child2 && child2 < this.m_nodeCapacity); - var height1 = child1.height; - var height2 = child2.height; - 1 + math.max(height1, height2); - var aabb = new AABB(); - aabb.combine(child1.aabb, child2.aabb); - this.validateMetrics(child1); - this.validateMetrics(child2); - }; - /** - * Validate this tree. For testing. - */ - DynamicTree.prototype.validate = function () { - this.validateStructure(this.m_root); - this.validateMetrics(this.m_root); - }; - /** - * Get the maximum balance of an node in the tree. The balance is the difference - * in height of the two children of a node. - */ - DynamicTree.prototype.getMaxBalance = function () { - var maxBalance = 0; - var node; - var it = this.iteratorPool.allocate().preorder(this.m_root); - while (node = it.next()) { - if (node.height <= 1) { - continue; - } - var balance = math.abs(node.child2.height - node.child1.height); - maxBalance = math.max(maxBalance, balance); + newParent.child1 = sibling; + newParent.child2 = leaf; + sibling.parent = newParent; + leaf.parent = newParent; + } + else { + // The sibling was the root. + newParent.child1 = sibling; + newParent.child2 = leaf; + sibling.parent = newParent; + leaf.parent = newParent; + this.m_root = newParent; + } + // Walk back up the tree fixing heights and AABBs + index = leaf.parent; + while (index != null) { + index = this.balance(index); + var child1 = index.child1; + var child2 = index.child2; + index.height = 1 + math.max(child1.height, child2.height); + index.aabb.combine(child1.aabb, child2.aabb); + index = index.parent; + } + // validate(); + }; + DynamicTree.prototype.removeLeaf = function (leaf) { + if (leaf === this.m_root) { + this.m_root = null; + return; + } + var parent = leaf.parent; + var grandParent = parent.parent; + var sibling; + if (parent.child1 === leaf) { + sibling = parent.child2; + } + else { + sibling = parent.child1; + } + if (grandParent != null) { + // Destroy parent and connect sibling to grandParent. + if (grandParent.child1 === parent) { + grandParent.child1 = sibling; } - this.iteratorPool.release(it); - return maxBalance; - }; - /** - * Build an optimal tree. Very expensive. For testing. - */ - DynamicTree.prototype.rebuildBottomUp = function () { - var nodes = []; - var count = 0; - // Build array of leaves. Free the rest. - var node; - var it = this.iteratorPool.allocate().preorder(this.m_root); - while (node = it.next()) { - if (node.height < 0) { - // free node in pool - continue; - } - if (node.isLeaf()) { - node.parent = null; - nodes[count] = node; - ++count; + else { + grandParent.child2 = sibling; + } + sibling.parent = grandParent; + this.freeNode(parent); + // Adjust ancestor bounds. + var index = grandParent; + while (index != null) { + index = this.balance(index); + var child1 = index.child1; + var child2 = index.child2; + index.aabb.combine(child1.aabb, child2.aabb); + index.height = 1 + math.max(child1.height, child2.height); + index = index.parent; + } + } + else { + this.m_root = sibling; + sibling.parent = null; + this.freeNode(parent); + } + // validate(); + }; + /** + * Perform a left or right rotation if node A is imbalanced. Returns the new + * root index. + */ + DynamicTree.prototype.balance = function (iA) { + var A = iA; + if (A.isLeaf() || A.height < 2) { + return iA; + } + var B = A.child1; + var C = A.child2; + var balance = C.height - B.height; + // Rotate C up + if (balance > 1) { + var F = C.child1; + var G = C.child2; + // Swap A and C + C.child1 = A; + C.parent = A.parent; + A.parent = C; + // A's old parent should point to C + if (C.parent != null) { + if (C.parent.child1 === iA) { + C.parent.child1 = C; } else { - this.freeNode(node); + C.parent.child2 = C; } } - this.iteratorPool.release(it); - while (count > 1) { - var minCost = Infinity; - var iMin = -1; - var jMin = -1; - for (var i = 0; i < count; ++i) { - var aabbi = nodes[i].aabb; - for (var j = i + 1; j < count; ++j) { - var aabbj = nodes[j].aabb; - var b = new AABB(); - b.combine(aabbi, aabbj); - var cost = b.getPerimeter(); - if (cost < minCost) { - iMin = i; - jMin = j; - minCost = cost; - } - } + else { + this.m_root = C; + } + // Rotate + if (F.height > G.height) { + C.child2 = F; + A.child2 = G; + G.parent = A; + A.aabb.combine(B.aabb, G.aabb); + C.aabb.combine(A.aabb, F.aabb); + A.height = 1 + math.max(B.height, G.height); + C.height = 1 + math.max(A.height, F.height); + } + else { + C.child2 = G; + A.child2 = F; + F.parent = A; + A.aabb.combine(B.aabb, F.aabb); + C.aabb.combine(A.aabb, G.aabb); + A.height = 1 + math.max(B.height, F.height); + C.height = 1 + math.max(A.height, G.height); + } + return C; + } + // Rotate B up + if (balance < -1) { + var D = B.child1; + var E = B.child2; + // Swap A and B + B.child1 = A; + B.parent = A.parent; + A.parent = B; + // A's old parent should point to B + if (B.parent != null) { + if (B.parent.child1 === A) { + B.parent.child1 = B; } - var child1 = nodes[iMin]; - var child2 = nodes[jMin]; - var parent_1 = this.allocateNode(); - parent_1.child1 = child1; - parent_1.child2 = child2; - parent_1.height = 1 + math.max(child1.height, child2.height); - parent_1.aabb.combine(child1.aabb, child2.aabb); - parent_1.parent = null; - child1.parent = parent_1; - child2.parent = parent_1; - nodes[jMin] = nodes[count - 1]; - nodes[iMin] = parent_1; - --count; - } - this.m_root = nodes[0]; - this.validate(); - }; - /** - * Shift the world origin. Useful for large worlds. The shift formula is: - * position -= newOrigin - * - * @param newOrigin The new origin with respect to the old origin - */ - DynamicTree.prototype.shiftOrigin = function (newOrigin) { - // Build array of leaves. Free the rest. - var node; - var it = this.iteratorPool.allocate().preorder(this.m_root); - while (node = it.next()) { - var aabb = node.aabb; - aabb.lowerBound.x -= newOrigin.x; - aabb.lowerBound.y -= newOrigin.y; - aabb.upperBound.x -= newOrigin.x; - aabb.upperBound.y -= newOrigin.y; - } - this.iteratorPool.release(it); - }; - /** - * Query an AABB for overlapping proxies. The callback class is called for each - * proxy that overlaps the supplied AABB. - */ - DynamicTree.prototype.query = function (aabb, queryCallback) { - var stack = this.stackPool.allocate(); - stack.push(this.m_root); - while (stack.length > 0) { - var node = stack.pop(); - if (node == null) { - continue; + else { + B.parent.child2 = B; } - if (AABB.testOverlap(node.aabb, aabb)) { - if (node.isLeaf()) { - var proceed = queryCallback(node.id); - if (proceed === false) { - return; - } - } - else { - stack.push(node.child1); - stack.push(node.child2); + } + else { + this.m_root = B; + } + // Rotate + if (D.height > E.height) { + B.child2 = D; + A.child1 = E; + E.parent = A; + A.aabb.combine(C.aabb, E.aabb); + B.aabb.combine(A.aabb, D.aabb); + A.height = 1 + math.max(C.height, E.height); + B.height = 1 + math.max(A.height, D.height); + } + else { + B.child2 = E; + A.child1 = D; + D.parent = A; + A.aabb.combine(C.aabb, D.aabb); + B.aabb.combine(A.aabb, E.aabb); + A.height = 1 + math.max(C.height, D.height); + B.height = 1 + math.max(A.height, E.height); + } + return B; + } + return A; + }; + /** + * Compute the height of the binary tree in O(N) time. Should not be called + * often. + */ + DynamicTree.prototype.getHeight = function () { + if (this.m_root == null) { + return 0; + } + return this.m_root.height; + }; + /** + * Get the ratio of the sum of the node areas to the root area. + */ + DynamicTree.prototype.getAreaRatio = function () { + if (this.m_root == null) { + return 0.0; + } + var root = this.m_root; + var rootArea = root.aabb.getPerimeter(); + var totalArea = 0.0; + var node; + var it = this.iteratorPool.allocate().preorder(this.m_root); + while (node = it.next()) { + if (node.height < 0) { + // Free node in pool + continue; + } + totalArea += node.aabb.getPerimeter(); + } + this.iteratorPool.release(it); + return totalArea / rootArea; + }; + /** + * Compute the height of a sub-tree. + */ + DynamicTree.prototype.computeHeight = function (id) { + var node; + if (typeof id !== 'undefined') { + node = this.m_nodes[id]; + } + else { + node = this.m_root; + } + // false && console.assert(0 <= id && id < this.m_nodeCapacity); + if (node.isLeaf()) { + return 0; + } + var height1 = this.computeHeight(node.child1.id); + var height2 = this.computeHeight(node.child2.id); + return 1 + math.max(height1, height2); + }; + DynamicTree.prototype.validateStructure = function (node) { + if (node == null) { + return; + } + if (node === this.m_root) ; + var child1 = node.child1; + var child2 = node.child2; + if (node.isLeaf()) { + return; + } + this.validateStructure(child1); + this.validateStructure(child2); + }; + DynamicTree.prototype.validateMetrics = function (node) { + if (node == null) { + return; + } + var child1 = node.child1; + var child2 = node.child2; + if (node.isLeaf()) { + return; + } + // false && console.assert(0 <= child1 && child1 < this.m_nodeCapacity); + // false && console.assert(0 <= child2 && child2 < this.m_nodeCapacity); + var height1 = child1.height; + var height2 = child2.height; + 1 + math.max(height1, height2); + var aabb = new AABB(); + aabb.combine(child1.aabb, child2.aabb); + this.validateMetrics(child1); + this.validateMetrics(child2); + }; + /** + * Validate this tree. For testing. + */ + DynamicTree.prototype.validate = function () { + this.validateStructure(this.m_root); + this.validateMetrics(this.m_root); + }; + /** + * Get the maximum balance of an node in the tree. The balance is the difference + * in height of the two children of a node. + */ + DynamicTree.prototype.getMaxBalance = function () { + var maxBalance = 0; + var node; + var it = this.iteratorPool.allocate().preorder(this.m_root); + while (node = it.next()) { + if (node.height <= 1) { + continue; + } + var balance = math.abs(node.child2.height - node.child1.height); + maxBalance = math.max(maxBalance, balance); + } + this.iteratorPool.release(it); + return maxBalance; + }; + /** + * Build an optimal tree. Very expensive. For testing. + */ + DynamicTree.prototype.rebuildBottomUp = function () { + var nodes = []; + var count = 0; + // Build array of leaves. Free the rest. + var node; + var it = this.iteratorPool.allocate().preorder(this.m_root); + while (node = it.next()) { + if (node.height < 0) { + // free node in pool + continue; + } + if (node.isLeaf()) { + node.parent = null; + nodes[count] = node; + ++count; + } + else { + this.freeNode(node); + } + } + this.iteratorPool.release(it); + while (count > 1) { + var minCost = Infinity; + var iMin = -1; + var jMin = -1; + for (var i = 0; i < count; ++i) { + var aabbi = nodes[i].aabb; + for (var j = i + 1; j < count; ++j) { + var aabbj = nodes[j].aabb; + var b = new AABB(); + b.combine(aabbi, aabbj); + var cost = b.getPerimeter(); + if (cost < minCost) { + iMin = i; + jMin = j; + minCost = cost; } } } - this.stackPool.release(stack); - }; - /** - * Ray-cast against the proxies in the tree. This relies on the callback to - * perform a exact ray-cast in the case were the proxy contains a shape. The - * callback also performs the any collision filtering. This has performance - * roughly equal to k * log(n), where k is the number of collisions and n is the - * number of proxies in the tree. - * - * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. - * @param rayCastCallback A function that is called for each proxy that is hit by the ray. - */ - DynamicTree.prototype.rayCast = function (input, rayCastCallback) { - var p1 = input.p1; - var p2 = input.p2; - var r = Vec2.sub(p2, p1); - r.normalize(); - // v is perpendicular to the segment. - var v = Vec2.crossNumVec2(1.0, r); - var abs_v = Vec2.abs(v); - // Separating axis for segment (Gino, p80). - // |dot(v, p1 - c)| > dot(|v|, h) - var maxFraction = input.maxFraction; - // Build a bounding box for the segment. - var segmentAABB = new AABB(); - var t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2); - segmentAABB.combinePoints(p1, t); - var stack = this.stackPool.allocate(); - var subInput = this.inputPool.allocate(); - stack.push(this.m_root); - while (stack.length > 0) { - var node = stack.pop(); - if (node == null) { - continue; - } - if (AABB.testOverlap(node.aabb, segmentAABB) === false) { - continue; - } - // Separating axis for segment (Gino, p80). - // |dot(v, p1 - c)| > dot(|v|, h) - var c = node.aabb.getCenter(); - var h = node.aabb.getExtents(); - var separation = math.abs(Vec2.dot(v, Vec2.sub(p1, c))) - Vec2.dot(abs_v, h); - if (separation > 0.0) { - continue; - } + var child1 = nodes[iMin]; + var child2 = nodes[jMin]; + var parent_1 = this.allocateNode(); + parent_1.child1 = child1; + parent_1.child2 = child2; + parent_1.height = 1 + math.max(child1.height, child2.height); + parent_1.aabb.combine(child1.aabb, child2.aabb); + parent_1.parent = null; + child1.parent = parent_1; + child2.parent = parent_1; + nodes[jMin] = nodes[count - 1]; + nodes[iMin] = parent_1; + --count; + } + this.m_root = nodes[0]; + }; + /** + * Shift the world origin. Useful for large worlds. The shift formula is: + * position -= newOrigin + * + * @param newOrigin The new origin with respect to the old origin + */ + DynamicTree.prototype.shiftOrigin = function (newOrigin) { + // Build array of leaves. Free the rest. + var node; + var it = this.iteratorPool.allocate().preorder(this.m_root); + while (node = it.next()) { + var aabb = node.aabb; + aabb.lowerBound.x -= newOrigin.x; + aabb.lowerBound.y -= newOrigin.y; + aabb.upperBound.x -= newOrigin.x; + aabb.upperBound.y -= newOrigin.y; + } + this.iteratorPool.release(it); + }; + /** + * Query an AABB for overlapping proxies. The callback class is called for each + * proxy that overlaps the supplied AABB. + */ + DynamicTree.prototype.query = function (aabb, queryCallback) { + var stack = this.stackPool.allocate(); + stack.push(this.m_root); + while (stack.length > 0) { + var node = stack.pop(); + if (node == null) { + continue; + } + if (AABB.testOverlap(node.aabb, aabb)) { if (node.isLeaf()) { - subInput.p1 = Vec2.clone(input.p1); - subInput.p2 = Vec2.clone(input.p2); - subInput.maxFraction = maxFraction; - var value = rayCastCallback(subInput, node.id); - if (value === 0.0) { - // The client has terminated the ray cast. + var proceed = queryCallback(node.id); + if (proceed === false) { return; } - if (value > 0.0) { - // update segment bounding box. - maxFraction = value; - t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2); - segmentAABB.combinePoints(p1, t); - } } else { stack.push(node.child1); stack.push(node.child2); } } - this.stackPool.release(stack); - this.inputPool.release(subInput); - }; - return DynamicTree; - }()); - var Iterator = /** @class */ (function () { - function Iterator() { - this.parents = []; - this.states = []; - } - Iterator.prototype.preorder = function (root) { - this.parents.length = 0; - this.parents.push(root); - this.states.length = 0; - this.states.push(0); - return this; - }; - Iterator.prototype.next = function () { - while (this.parents.length > 0) { - var i = this.parents.length - 1; - var node = this.parents[i]; - if (this.states[i] === 0) { - this.states[i] = 1; - return node; + } + this.stackPool.release(stack); + }; + /** + * Ray-cast against the proxies in the tree. This relies on the callback to + * perform a exact ray-cast in the case were the proxy contains a shape. The + * callback also performs the any collision filtering. This has performance + * roughly equal to k * log(n), where k is the number of collisions and n is the + * number of proxies in the tree. + * + * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. + * @param rayCastCallback A function that is called for each proxy that is hit by the ray. + */ + DynamicTree.prototype.rayCast = function (input, rayCastCallback) { + var p1 = input.p1; + var p2 = input.p2; + var r = Vec2.sub(p2, p1); + r.normalize(); + // v is perpendicular to the segment. + var v = Vec2.crossNumVec2(1.0, r); + var abs_v = Vec2.abs(v); + // Separating axis for segment (Gino, p80). + // |dot(v, p1 - c)| > dot(|v|, h) + var maxFraction = input.maxFraction; + // Build a bounding box for the segment. + var segmentAABB = new AABB(); + var t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2); + segmentAABB.combinePoints(p1, t); + var stack = this.stackPool.allocate(); + var subInput = this.inputPool.allocate(); + stack.push(this.m_root); + while (stack.length > 0) { + var node = stack.pop(); + if (node == null) { + continue; + } + if (AABB.testOverlap(node.aabb, segmentAABB) === false) { + continue; + } + // Separating axis for segment (Gino, p80). + // |dot(v, p1 - c)| > dot(|v|, h) + var c = node.aabb.getCenter(); + var h = node.aabb.getExtents(); + var separation = math.abs(Vec2.dot(v, Vec2.sub(p1, c))) - Vec2.dot(abs_v, h); + if (separation > 0.0) { + continue; + } + if (node.isLeaf()) { + subInput.p1 = Vec2.clone(input.p1); + subInput.p2 = Vec2.clone(input.p2); + subInput.maxFraction = maxFraction; + var value = rayCastCallback(subInput, node.id); + if (value === 0.0) { + // The client has terminated the ray cast. + return; } - if (this.states[i] === 1) { - this.states[i] = 2; - if (node.child1) { - this.parents.push(node.child1); - this.states.push(1); - return node.child1; - } + if (value > 0.0) { + // update segment bounding box. + maxFraction = value; + t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2); + segmentAABB.combinePoints(p1, t); } - if (this.states[i] === 2) { - this.states[i] = 3; - if (node.child2) { - this.parents.push(node.child2); - this.states.push(1); - return node.child2; - } - } - this.parents.pop(); - this.states.pop(); } - }; - Iterator.prototype.close = function () { - this.parents.length = 0; - }; - return Iterator; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * The broad-phase wraps and extends a dynamic-tree to keep track of moved - * objects and query them on update. - */ - var BroadPhase = /** @class */ (function () { - function BroadPhase() { - var _this = this; - this.m_tree = new DynamicTree(); - this.m_proxyCount = 0; - this.m_moveBuffer = []; - /** - * Query an AABB for overlapping proxies. The callback class is called for each - * proxy that overlaps the supplied AABB. - */ - this.query = function (aabb, queryCallback) { - _this.m_tree.query(aabb, queryCallback); - }; - this.queryCallback = function (proxyId) { - // A proxy cannot form a pair with itself. - if (proxyId === _this.m_queryProxyId) { - return true; - } - var proxyIdA = math.min(proxyId, _this.m_queryProxyId); - var proxyIdB = math.max(proxyId, _this.m_queryProxyId); - // TODO: Skip any duplicate pairs. - var userDataA = _this.m_tree.getUserData(proxyIdA); - var userDataB = _this.m_tree.getUserData(proxyIdB); - // Send the pairs back to the client. - _this.m_callback(userDataA, userDataB); - return true; - }; + else { + stack.push(node.child1); + stack.push(node.child2); + } } + this.stackPool.release(stack); + this.inputPool.release(subInput); + }; + return DynamicTree; +}()); +var Iterator = /** @class */ (function () { + function Iterator() { + this.parents = []; + this.states = []; + } + Iterator.prototype.preorder = function (root) { + this.parents.length = 0; + this.parents.push(root); + this.states.length = 0; + this.states.push(0); + return this; + }; + Iterator.prototype.next = function () { + while (this.parents.length > 0) { + var i = this.parents.length - 1; + var node = this.parents[i]; + if (this.states[i] === 0) { + this.states[i] = 1; + return node; + } + if (this.states[i] === 1) { + this.states[i] = 2; + if (node.child1) { + this.parents.push(node.child1); + this.states.push(1); + return node.child1; + } + } + if (this.states[i] === 2) { + this.states[i] = 3; + if (node.child2) { + this.parents.push(node.child2); + this.states.push(1); + return node.child2; + } + } + this.parents.pop(); + this.states.pop(); + } + }; + Iterator.prototype.close = function () { + this.parents.length = 0; + }; + return Iterator; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * The broad-phase wraps and extends a dynamic-tree to keep track of moved + * objects and query them on update. + */ +var BroadPhase = /** @class */ (function () { + function BroadPhase() { + var _this = this; + this.m_tree = new DynamicTree(); + this.m_proxyCount = 0; + this.m_moveBuffer = []; /** - * Get user data from a proxy. Returns null if the id is invalid. - */ - BroadPhase.prototype.getUserData = function (proxyId) { - return this.m_tree.getUserData(proxyId); - }; - /** - * Test overlap of fat AABBs. - */ - BroadPhase.prototype.testOverlap = function (proxyIdA, proxyIdB) { - var aabbA = this.m_tree.getFatAABB(proxyIdA); - var aabbB = this.m_tree.getFatAABB(proxyIdB); - return AABB.testOverlap(aabbA, aabbB); - }; - /** - * Get the fat AABB for a proxy. - */ - BroadPhase.prototype.getFatAABB = function (proxyId) { - return this.m_tree.getFatAABB(proxyId); - }; - /** - * Get the number of proxies. - */ - BroadPhase.prototype.getProxyCount = function () { - return this.m_proxyCount; - }; - /** - * Get the height of the embedded tree. - */ - BroadPhase.prototype.getTreeHeight = function () { - return this.m_tree.getHeight(); - }; - /** - * Get the balance (integer) of the embedded tree. - */ - BroadPhase.prototype.getTreeBalance = function () { - return this.m_tree.getMaxBalance(); - }; - /** - * Get the quality metric of the embedded tree. - */ - BroadPhase.prototype.getTreeQuality = function () { - return this.m_tree.getAreaRatio(); - }; - /** - * Ray-cast against the proxies in the tree. This relies on the callback to - * perform a exact ray-cast in the case were the proxy contains a shape. The - * callback also performs the any collision filtering. This has performance - * roughly equal to k * log(n), where k is the number of collisions and n is the - * number of proxies in the tree. - * - * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. - * @param rayCastCallback A function that is called for each proxy that is hit by the ray. - */ - BroadPhase.prototype.rayCast = function (input, rayCastCallback) { - this.m_tree.rayCast(input, rayCastCallback); - }; - /** - * Shift the world origin. Useful for large worlds. The shift formula is: - * position -= newOrigin - * - * @param newOrigin The new origin with respect to the old origin - */ - BroadPhase.prototype.shiftOrigin = function (newOrigin) { - this.m_tree.shiftOrigin(newOrigin); - }; - /** - * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs - * is called. - */ - BroadPhase.prototype.createProxy = function (aabb, userData) { - var proxyId = this.m_tree.createProxy(aabb, userData); - this.m_proxyCount++; - this.bufferMove(proxyId); - return proxyId; - }; - /** - * Destroy a proxy. It is up to the client to remove any pairs. + * Query an AABB for overlapping proxies. The callback class is called for each + * proxy that overlaps the supplied AABB. */ - BroadPhase.prototype.destroyProxy = function (proxyId) { - this.unbufferMove(proxyId); - this.m_proxyCount--; - this.m_tree.destroyProxy(proxyId); + this.query = function (aabb, queryCallback) { + _this.m_tree.query(aabb, queryCallback); }; - /** - * Call moveProxy as many times as you like, then when you are done call - * UpdatePairs to finalized the proxy pairs (for your time step). - */ - BroadPhase.prototype.moveProxy = function (proxyId, aabb, displacement) { - var changed = this.m_tree.moveProxy(proxyId, aabb, displacement); - if (changed) { - this.bufferMove(proxyId); + this.queryCallback = function (proxyId) { + // A proxy cannot form a pair with itself. + if (proxyId === _this.m_queryProxyId) { + return true; } + var proxyIdA = math.min(proxyId, _this.m_queryProxyId); + var proxyIdB = math.max(proxyId, _this.m_queryProxyId); + // TODO: Skip any duplicate pairs. + var userDataA = _this.m_tree.getUserData(proxyIdA); + var userDataB = _this.m_tree.getUserData(proxyIdB); + // Send the pairs back to the client. + _this.m_callback(userDataA, userDataB); + return true; }; - /** - * Call to trigger a re-processing of it's pairs on the next call to - * UpdatePairs. - */ - BroadPhase.prototype.touchProxy = function (proxyId) { + } + /** + * Get user data from a proxy. Returns null if the id is invalid. + */ + BroadPhase.prototype.getUserData = function (proxyId) { + return this.m_tree.getUserData(proxyId); + }; + /** + * Test overlap of fat AABBs. + */ + BroadPhase.prototype.testOverlap = function (proxyIdA, proxyIdB) { + var aabbA = this.m_tree.getFatAABB(proxyIdA); + var aabbB = this.m_tree.getFatAABB(proxyIdB); + return AABB.testOverlap(aabbA, aabbB); + }; + /** + * Get the fat AABB for a proxy. + */ + BroadPhase.prototype.getFatAABB = function (proxyId) { + return this.m_tree.getFatAABB(proxyId); + }; + /** + * Get the number of proxies. + */ + BroadPhase.prototype.getProxyCount = function () { + return this.m_proxyCount; + }; + /** + * Get the height of the embedded tree. + */ + BroadPhase.prototype.getTreeHeight = function () { + return this.m_tree.getHeight(); + }; + /** + * Get the balance (integer) of the embedded tree. + */ + BroadPhase.prototype.getTreeBalance = function () { + return this.m_tree.getMaxBalance(); + }; + /** + * Get the quality metric of the embedded tree. + */ + BroadPhase.prototype.getTreeQuality = function () { + return this.m_tree.getAreaRatio(); + }; + /** + * Ray-cast against the proxies in the tree. This relies on the callback to + * perform a exact ray-cast in the case were the proxy contains a shape. The + * callback also performs the any collision filtering. This has performance + * roughly equal to k * log(n), where k is the number of collisions and n is the + * number of proxies in the tree. + * + * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`. + * @param rayCastCallback A function that is called for each proxy that is hit by the ray. + */ + BroadPhase.prototype.rayCast = function (input, rayCastCallback) { + this.m_tree.rayCast(input, rayCastCallback); + }; + /** + * Shift the world origin. Useful for large worlds. The shift formula is: + * position -= newOrigin + * + * @param newOrigin The new origin with respect to the old origin + */ + BroadPhase.prototype.shiftOrigin = function (newOrigin) { + this.m_tree.shiftOrigin(newOrigin); + }; + /** + * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs + * is called. + */ + BroadPhase.prototype.createProxy = function (aabb, userData) { + var proxyId = this.m_tree.createProxy(aabb, userData); + this.m_proxyCount++; + this.bufferMove(proxyId); + return proxyId; + }; + /** + * Destroy a proxy. It is up to the client to remove any pairs. + */ + BroadPhase.prototype.destroyProxy = function (proxyId) { + this.unbufferMove(proxyId); + this.m_proxyCount--; + this.m_tree.destroyProxy(proxyId); + }; + /** + * Call moveProxy as many times as you like, then when you are done call + * UpdatePairs to finalized the proxy pairs (for your time step). + */ + BroadPhase.prototype.moveProxy = function (proxyId, aabb, displacement) { + var changed = this.m_tree.moveProxy(proxyId, aabb, displacement); + if (changed) { this.bufferMove(proxyId); - }; - BroadPhase.prototype.bufferMove = function (proxyId) { - this.m_moveBuffer.push(proxyId); - }; - BroadPhase.prototype.unbufferMove = function (proxyId) { - for (var i = 0; i < this.m_moveBuffer.length; ++i) { - if (this.m_moveBuffer[i] === proxyId) { - this.m_moveBuffer[i] = null; - } + } + }; + /** + * Call to trigger a re-processing of it's pairs on the next call to + * UpdatePairs. + */ + BroadPhase.prototype.touchProxy = function (proxyId) { + this.bufferMove(proxyId); + }; + BroadPhase.prototype.bufferMove = function (proxyId) { + this.m_moveBuffer.push(proxyId); + }; + BroadPhase.prototype.unbufferMove = function (proxyId) { + for (var i = 0; i < this.m_moveBuffer.length; ++i) { + if (this.m_moveBuffer[i] === proxyId) { + this.m_moveBuffer[i] = null; } - }; - /** - * Update the pairs. This results in pair callbacks. This can only add pairs. - */ - BroadPhase.prototype.updatePairs = function (addPairCallback) { - this.m_callback = addPairCallback; - // Perform tree queries for all moving proxies. - while (this.m_moveBuffer.length > 0) { - this.m_queryProxyId = this.m_moveBuffer.pop(); - if (this.m_queryProxyId === null) { - continue; - } - // We have to query the tree with the fat AABB so that - // we don't fail to create a pair that may touch later. - var fatAABB = this.m_tree.getFatAABB(this.m_queryProxyId); - // Query tree, create pairs and add them pair buffer. - this.m_tree.query(fatAABB, this.queryCallback); - } - // Try to keep the tree balanced. - // this.m_tree.rebalance(4); - }; - return BroadPhase; - }()); + } + }; + /** + * Update the pairs. This results in pair callbacks. This can only add pairs. + */ + BroadPhase.prototype.updatePairs = function (addPairCallback) { + this.m_callback = addPairCallback; + // Perform tree queries for all moving proxies. + while (this.m_moveBuffer.length > 0) { + this.m_queryProxyId = this.m_moveBuffer.pop(); + if (this.m_queryProxyId === null) { + continue; + } + // We have to query the tree with the fat AABB so that + // we don't fail to create a pair that may touch later. + var fatAABB = this.m_tree.getFatAABB(this.m_queryProxyId); + // Query tree, create pairs and add them pair buffer. + this.m_tree.query(fatAABB, this.queryCallback); + } + // Try to keep the tree balanced. + // this.m_tree.rebalance(4); + }; + return BroadPhase; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var Rot = /** @class */ (function () { - /** Initialize from an angle in radians. */ - function Rot(angle) { - if (!(this instanceof Rot)) { - return new Rot(angle); - } - if (typeof angle === 'number') { - this.setAngle(angle); - } - else if (typeof angle === 'object') { - this.setRot(angle); - } - else { - this.setIdentity(); - } +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Rot = /** @class */ (function () { + /** Initialize from an angle in radians. */ + function Rot(angle) { + if (!(this instanceof Rot)) { + return new Rot(angle); } - /** @internal */ - Rot.neo = function (angle) { - var obj = Object.create(Rot.prototype); - obj.setAngle(angle); - return obj; - }; - Rot.clone = function (rot) { - var obj = Object.create(Rot.prototype); - obj.s = rot.s; - obj.c = rot.c; - return obj; - }; - Rot.identity = function () { - var obj = Object.create(Rot.prototype); - obj.s = 0.0; - obj.c = 1.0; - return obj; - }; - Rot.isValid = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - return math.isFinite(obj.s) && math.isFinite(obj.c); - }; - Rot.assert = function (o) { - return; - }; - /** Set to the identity rotation. */ - Rot.prototype.setIdentity = function () { - this.s = 0.0; - this.c = 1.0; - }; - Rot.prototype.set = function (angle) { - if (typeof angle === 'object') { - this.s = angle.s; - this.c = angle.c; - } - else { - // TODO_ERIN optimize - this.s = math.sin(angle); - this.c = math.cos(angle); - } - }; - Rot.prototype.setRot = function (angle) { + if (typeof angle === 'number') { + this.setAngle(angle); + } + else if (typeof angle === 'object') { + this.setRot(angle); + } + else { + this.setIdentity(); + } + } + /** @internal */ + Rot.neo = function (angle) { + var obj = Object.create(Rot.prototype); + obj.setAngle(angle); + return obj; + }; + Rot.clone = function (rot) { + var obj = Object.create(Rot.prototype); + obj.s = rot.s; + obj.c = rot.c; + return obj; + }; + Rot.identity = function () { + var obj = Object.create(Rot.prototype); + obj.s = 0.0; + obj.c = 1.0; + return obj; + }; + Rot.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return math.isFinite(obj.s) && math.isFinite(obj.c); + }; + Rot.assert = function (o) { + }; + /** Set to the identity rotation. */ + Rot.prototype.setIdentity = function () { + this.s = 0.0; + this.c = 1.0; + }; + Rot.prototype.set = function (angle) { + if (typeof angle === 'object') { this.s = angle.s; this.c = angle.c; - }; - /** Set using an angle in radians. */ - Rot.prototype.setAngle = function (angle) { + } + else { // TODO_ERIN optimize this.s = math.sin(angle); this.c = math.cos(angle); - }; - /** Get the angle in radians. */ - Rot.prototype.getAngle = function () { - return math.atan2(this.s, this.c); - }; - /** Get the x-axis. */ - Rot.prototype.getXAxis = function () { - return Vec2.neo(this.c, this.s); - }; - /** Get the u-axis. */ - Rot.prototype.getYAxis = function () { - return Vec2.neo(-this.s, this.c); - }; - // tslint:disable-next-line:typedef - Rot.mul = function (rot, m) { - if ('c' in m && 's' in m) { - // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc] - // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc] - // s = qs * rc + qc * rs - // c = qc * rc - qs * rs - var qr = Rot.identity(); - qr.s = rot.s * m.c + rot.c * m.s; - qr.c = rot.c * m.c - rot.s * m.s; - return qr; - } - else if ('x' in m && 'y' in m) { - return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y); - } - }; - /** Multiply two rotations: q * r */ - Rot.mulRot = function (rot, m) { + } + }; + Rot.prototype.setRot = function (angle) { + this.s = angle.s; + this.c = angle.c; + }; + /** Set using an angle in radians. */ + Rot.prototype.setAngle = function (angle) { + // TODO_ERIN optimize + this.s = math.sin(angle); + this.c = math.cos(angle); + }; + /** Get the angle in radians. */ + Rot.prototype.getAngle = function () { + return math.atan2(this.s, this.c); + }; + /** Get the x-axis. */ + Rot.prototype.getXAxis = function () { + return Vec2.neo(this.c, this.s); + }; + /** Get the u-axis. */ + Rot.prototype.getYAxis = function () { + return Vec2.neo(-this.s, this.c); + }; + // tslint:disable-next-line:typedef + Rot.mul = function (rot, m) { + if ('c' in m && 's' in m) { // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc] // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc] // s = qs * rc + qc * rs @@ -2189,34 +2162,34 @@ qr.s = rot.s * m.c + rot.c * m.s; qr.c = rot.c * m.c - rot.s * m.s; return qr; - }; - /** Rotate a vector */ - Rot.mulVec2 = function (rot, m) { + } + else if ('x' in m && 'y' in m) { return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y); - }; - Rot.mulSub = function (rot, v, w) { - var x = rot.c * (v.x - w.x) - rot.s * (v.y - w.y); - var y = rot.s * (v.x - w.x) + rot.c * (v.y - w.y); - return Vec2.neo(x, y); - }; - // tslint:disable-next-line:typedef - Rot.mulT = function (rot, m) { - if ('c' in m && 's' in m) { - // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc] - // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc] - // s = qc * rs - qs * rc - // c = qc * rc + qs * rs - var qr = Rot.identity(); - qr.s = rot.c * m.s - rot.s * m.c; - qr.c = rot.c * m.c + rot.s * m.s; - return qr; - } - else if ('x' in m && 'y' in m) { - return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y); - } - }; - /** Transpose multiply two rotations: qT * r */ - Rot.mulTRot = function (rot, m) { + } + }; + /** Multiply two rotations: q * r */ + Rot.mulRot = function (rot, m) { + // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc] + // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc] + // s = qs * rc + qc * rs + // c = qc * rc - qs * rs + var qr = Rot.identity(); + qr.s = rot.s * m.c + rot.c * m.s; + qr.c = rot.c * m.c - rot.s * m.s; + return qr; + }; + /** Rotate a vector */ + Rot.mulVec2 = function (rot, m) { + return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y); + }; + Rot.mulSub = function (rot, v, w) { + var x = rot.c * (v.x - w.x) - rot.s * (v.y - w.y); + var y = rot.s * (v.x - w.x) + rot.c * (v.y - w.y); + return Vec2.neo(x, y); + }; + // tslint:disable-next-line:typedef + Rot.mulT = function (rot, m) { + if ('c' in m && 's' in m) { // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc] // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc] // s = qc * rs - qs * rc @@ -2225,11623 +2198,11747 @@ qr.s = rot.c * m.s - rot.s * m.c; qr.c = rot.c * m.c + rot.s * m.s; return qr; - }; - /** Inverse rotate a vector */ - Rot.mulTVec2 = function (rot, m) { + } + else if ('x' in m && 'y' in m) { return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y); - }; - return Rot; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * A transform contains translation and rotation. It is used to represent the - * position and orientation of rigid frames. Initialize using a position vector - * and a rotation. - */ - var Transform = /** @class */ (function () { - function Transform(position, rotation) { - if (!(this instanceof Transform)) { - return new Transform(position, rotation); - } - this.p = Vec2.zero(); - this.q = Rot.identity(); - if (typeof position !== 'undefined') { - this.p.setVec2(position); - } - if (typeof rotation !== 'undefined') { - this.q.setAngle(rotation); - } } - Transform.clone = function (xf) { - var obj = Object.create(Transform.prototype); - obj.p = Vec2.clone(xf.p); - obj.q = Rot.clone(xf.q); - return obj; - }; - /** @internal */ - Transform.neo = function (position, rotation) { - var obj = Object.create(Transform.prototype); - obj.p = Vec2.clone(position); - obj.q = Rot.clone(rotation); - return obj; - }; - Transform.identity = function () { - var obj = Object.create(Transform.prototype); - obj.p = Vec2.zero(); - obj.q = Rot.identity(); - return obj; - }; - /** - * Set this to the identity transform. - */ - Transform.prototype.setIdentity = function () { - this.p.setZero(); - this.q.setIdentity(); - }; - /** - * Set this based on the position and angle. - */ - // tslint:disable-next-line:typedef - Transform.prototype.set = function (a, b) { - if (typeof b === 'undefined') { - this.p.set(a.p); - this.q.set(a.q); - } - else { - this.p.set(a); - this.q.set(b); - } - }; - /** - * Set this based on the position and angle. - */ - Transform.prototype.setNum = function (position, rotation) { - this.p.setVec2(position); - this.q.setAngle(rotation); - }; - Transform.prototype.setTransform = function (xf) { - this.p.setVec2(xf.p); - this.q.setRot(xf.q); - }; - Transform.isValid = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - return Vec2.isValid(obj.p) && Rot.isValid(obj.q); - }; - Transform.assert = function (o) { - return; - }; - // static mul(a: Transform, b: Vec2[]): Vec2[]; - // static mul(a: Transform, b: Transform[]): Transform[]; - // tslint:disable-next-line:typedef - Transform.mul = function (a, b) { - if (Array.isArray(b)) { - var arr = []; - for (var i = 0; i < b.length; i++) { - arr[i] = Transform.mul(a, b[i]); - } - return arr; - } - else if ('x' in b && 'y' in b) { - return Transform.mulVec2(a, b); - } - else if ('p' in b && 'q' in b) { - return Transform.mulXf(a, b); - } - }; - // tslint:disable-next-line:typedef - Transform.mulAll = function (a, b) { + }; + /** Transpose multiply two rotations: qT * r */ + Rot.mulTRot = function (rot, m) { + // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc] + // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc] + // s = qc * rs - qs * rc + // c = qc * rc + qs * rs + var qr = Rot.identity(); + qr.s = rot.c * m.s - rot.s * m.c; + qr.c = rot.c * m.c + rot.s * m.s; + return qr; + }; + /** Inverse rotate a vector */ + Rot.mulTVec2 = function (rot, m) { + return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y); + }; + return Rot; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A transform contains translation and rotation. It is used to represent the + * position and orientation of rigid frames. Initialize using a position vector + * and a rotation. + */ +var Transform = /** @class */ (function () { + function Transform(position, rotation) { + if (!(this instanceof Transform)) { + return new Transform(position, rotation); + } + this.p = Vec2.zero(); + this.q = Rot.identity(); + if (typeof position !== 'undefined') { + this.p.setVec2(position); + } + if (typeof rotation !== 'undefined') { + this.q.setAngle(rotation); + } + } + Transform.clone = function (xf) { + var obj = Object.create(Transform.prototype); + obj.p = Vec2.clone(xf.p); + obj.q = Rot.clone(xf.q); + return obj; + }; + /** @internal */ + Transform.neo = function (position, rotation) { + var obj = Object.create(Transform.prototype); + obj.p = Vec2.clone(position); + obj.q = Rot.clone(rotation); + return obj; + }; + Transform.identity = function () { + var obj = Object.create(Transform.prototype); + obj.p = Vec2.zero(); + obj.q = Rot.identity(); + return obj; + }; + /** + * Set this to the identity transform. + */ + Transform.prototype.setIdentity = function () { + this.p.setZero(); + this.q.setIdentity(); + }; + /** + * Set this based on the position and angle. + */ + // tslint:disable-next-line:typedef + Transform.prototype.set = function (a, b) { + if (typeof b === 'undefined') { + this.p.set(a.p); + this.q.set(a.q); + } + else { + this.p.set(a); + this.q.set(b); + } + }; + /** + * Set this based on the position and angle. + */ + Transform.prototype.setNum = function (position, rotation) { + this.p.setVec2(position); + this.q.setAngle(rotation); + }; + Transform.prototype.setTransform = function (xf) { + this.p.setVec2(xf.p); + this.q.setRot(xf.q); + }; + Transform.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return Vec2.isValid(obj.p) && Rot.isValid(obj.q); + }; + Transform.assert = function (o) { + }; + // static mul(a: Transform, b: Vec2Value[]): Vec2[]; + // static mul(a: Transform, b: Transform[]): Transform[]; + // tslint:disable-next-line:typedef + Transform.mul = function (a, b) { + if (Array.isArray(b)) { var arr = []; for (var i = 0; i < b.length; i++) { arr[i] = Transform.mul(a, b[i]); } return arr; + } + else if ('x' in b && 'y' in b) { + return Transform.mulVec2(a, b); + } + else if ('p' in b && 'q' in b) { + return Transform.mulXf(a, b); + } + }; + // tslint:disable-next-line:typedef + Transform.mulAll = function (a, b) { + var arr = []; + for (var i = 0; i < b.length; i++) { + arr[i] = Transform.mul(a, b[i]); + } + return arr; + }; + /** @internal @deprecated */ + // tslint:disable-next-line:typedef + Transform.mulFn = function (a) { + return function (b) { + return Transform.mul(a, b); }; - /** @internal @deprecated */ - // tslint:disable-next-line:typedef - Transform.mulFn = function (a) { - return function (b) { - return Transform.mul(a, b); - }; - }; - Transform.mulVec2 = function (a, b) { - var x = (a.q.c * b.x - a.q.s * b.y) + a.p.x; - var y = (a.q.s * b.x + a.q.c * b.y) + a.p.y; - return Vec2.neo(x, y); - }; - Transform.mulXf = function (a, b) { - // v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p - // = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p - var xf = Transform.identity(); - xf.q = Rot.mulRot(a.q, b.q); - xf.p = Vec2.add(Rot.mulVec2(a.q, b.p), a.p); - return xf; - }; - // tslint:disable-next-line:typedef - Transform.mulT = function (a, b) { - if ('x' in b && 'y' in b) { - return Transform.mulTVec2(a, b); - } - else if ('p' in b && 'q' in b) { - return Transform.mulTXf(a, b); - } - }; - Transform.mulTVec2 = function (a, b) { - var px = b.x - a.p.x; - var py = b.y - a.p.y; - var x = (a.q.c * px + a.q.s * py); - var y = (-a.q.s * px + a.q.c * py); - return Vec2.neo(x, y); - }; - Transform.mulTXf = function (a, b) { - // v2 = A.q' * (B.q * v1 + B.p - A.p) - // = A.q' * B.q * v1 + A.q' * (B.p - A.p) - var xf = Transform.identity(); - xf.q.setRot(Rot.mulTRot(a.q, b.q)); - xf.p.setVec2(Rot.mulTVec2(a.q, Vec2.sub(b.p, a.p))); - return xf; - }; - return Transform; - }()); + }; + Transform.mulVec2 = function (a, b) { + var x = (a.q.c * b.x - a.q.s * b.y) + a.p.x; + var y = (a.q.s * b.x + a.q.c * b.y) + a.p.y; + return Vec2.neo(x, y); + }; + Transform.mulXf = function (a, b) { + // v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p + // = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p + var xf = Transform.identity(); + xf.q = Rot.mulRot(a.q, b.q); + xf.p = Vec2.add(Rot.mulVec2(a.q, b.p), a.p); + return xf; + }; + // tslint:disable-next-line:typedef + Transform.mulT = function (a, b) { + if ('x' in b && 'y' in b) { + return Transform.mulTVec2(a, b); + } + else if ('p' in b && 'q' in b) { + return Transform.mulTXf(a, b); + } + }; + Transform.mulTVec2 = function (a, b) { + var px = b.x - a.p.x; + var py = b.y - a.p.y; + var x = (a.q.c * px + a.q.s * py); + var y = (-a.q.s * px + a.q.c * py); + return Vec2.neo(x, y); + }; + Transform.mulTXf = function (a, b) { + // v2 = A.q' * (B.q * v1 + B.p - A.p) + // = A.q' * B.q * v1 + A.q' * (B.p - A.p) + var xf = Transform.identity(); + xf.q.setRot(Rot.mulTRot(a.q, b.q)); + xf.p.setVec2(Rot.mulTVec2(a.q, Vec2.sub(b.p, a.p))); + return xf; + }; + return Transform; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * This describes the motion of a body/shape for TOI computation. Shapes are + * defined with respect to the body origin, which may not coincide with the + * center of mass. However, to support dynamics we must interpolate the center + * of mass position. + */ +var Sweep = /** @class */ (function () { + function Sweep(c, a) { + this.localCenter = Vec2.zero(); + this.c = Vec2.zero(); + this.a = 0; + this.alpha0 = 0; + this.c0 = Vec2.zero(); + this.a0 = 0; + } + Sweep.prototype.setTransform = function (xf) { + var c = Transform.mulVec2(xf, this.localCenter); + this.c.setVec2(c); + this.c0.setVec2(c); + this.a = xf.q.getAngle(); + this.a0 = xf.q.getAngle(); + }; + Sweep.prototype.setLocalCenter = function (localCenter, xf) { + this.localCenter.setVec2(localCenter); + var c = Transform.mulVec2(xf, this.localCenter); + this.c.setVec2(c); + this.c0.setVec2(c); + }; + /** + * Get the interpolated transform at a specific time. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * @param xf + * @param beta A factor in [0,1], where 0 indicates alpha0 + */ + Sweep.prototype.getTransform = function (xf, beta) { + if (beta === void 0) { beta = 0; } + xf.q.setAngle((1.0 - beta) * this.a0 + beta * this.a); + xf.p.setCombine((1.0 - beta), this.c0, beta, this.c); + // shift to origin + xf.p.sub(Rot.mulVec2(xf.q, this.localCenter)); + }; + /** + * Advance the sweep forward, yielding a new initial state. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * This describes the motion of a body/shape for TOI computation. Shapes are - * defined with respect to the body origin, which may not coincide with the - * center of mass. However, to support dynamics we must interpolate the center - * of mass position. - */ - var Sweep = /** @class */ (function () { - function Sweep(c, a) { - this.localCenter = Vec2.zero(); - this.c = Vec2.zero(); - this.a = 0; - this.alpha0 = 0; - this.c0 = Vec2.zero(); - this.a0 = 0; - } - Sweep.prototype.setTransform = function (xf) { - var c = Transform.mulVec2(xf, this.localCenter); - this.c.setVec2(c); - this.c0.setVec2(c); - this.a = xf.q.getAngle(); - this.a0 = xf.q.getAngle(); - }; - Sweep.prototype.setLocalCenter = function (localCenter, xf) { - this.localCenter.setVec2(localCenter); - var c = Transform.mulVec2(xf, this.localCenter); - this.c.setVec2(c); - this.c0.setVec2(c); - }; - /** - * Get the interpolated transform at a specific time. - * - * @param xf - * @param beta A factor in [0,1], where 0 indicates alpha0 - */ - Sweep.prototype.getTransform = function (xf, beta) { - if (beta === void 0) { beta = 0; } - xf.q.setAngle((1.0 - beta) * this.a0 + beta * this.a); - xf.p.setCombine((1.0 - beta), this.c0, beta, this.c); - // shift to origin - xf.p.sub(Rot.mulVec2(xf.q, this.localCenter)); - }; - /** - * Advance the sweep forward, yielding a new initial state. - * - * @param alpha The new initial time - */ - Sweep.prototype.advance = function (alpha) { - var beta = (alpha - this.alpha0) / (1.0 - this.alpha0); - this.c0.setCombine(beta, this.c, 1 - beta, this.c0); - this.a0 = beta * this.a + (1 - beta) * this.a0; - this.alpha0 = alpha; - }; - Sweep.prototype.forward = function () { - this.a0 = this.a; - this.c0.setVec2(this.c); - }; - /** - * normalize the angles in radians to be between -pi and pi. - */ - Sweep.prototype.normalize = function () { - var a0 = math.mod(this.a0, -math.PI, +math.PI); - this.a -= this.a0 - a0; - this.a0 = a0; - }; - Sweep.prototype.clone = function () { - var clone = new Sweep(); - clone.localCenter.setVec2(this.localCenter); - clone.alpha0 = this.alpha0; - clone.a0 = this.a0; - clone.a = this.a; - clone.c0.setVec2(this.c0); - clone.c.setVec2(this.c); - return clone; - }; - Sweep.prototype.set = function (that) { - this.localCenter.setVec2(that.localCenter); - this.alpha0 = that.alpha0; - this.a0 = that.a0; - this.a = that.a; - this.c0.setVec2(that.c0); - this.c.setVec2(that.c); - }; - return Sweep; - }()); + * @param alpha The new initial time + */ + Sweep.prototype.advance = function (alpha) { + var beta = (alpha - this.alpha0) / (1.0 - this.alpha0); + this.c0.setCombine(beta, this.c, 1 - beta, this.c0); + this.a0 = beta * this.a + (1 - beta) * this.a0; + this.alpha0 = alpha; + }; + Sweep.prototype.forward = function () { + this.a0 = this.a; + this.c0.setVec2(this.c); + }; + /** + * normalize the angles in radians to be between -pi and pi. + */ + Sweep.prototype.normalize = function () { + var a0 = math.mod(this.a0, -math.PI, +math.PI); + this.a -= this.a0 - a0; + this.a0 = a0; + }; + Sweep.prototype.clone = function () { + var clone = new Sweep(); + clone.localCenter.setVec2(this.localCenter); + clone.alpha0 = this.alpha0; + clone.a0 = this.a0; + clone.a = this.a; + clone.c0.setVec2(this.c0); + clone.c.setVec2(this.c); + return clone; + }; + Sweep.prototype.set = function (that) { + this.localCenter.setVec2(that.localCenter); + this.alpha0 = that.alpha0; + this.a0 = that.a0; + this.a = that.a; + this.c0.setVec2(that.c0); + this.c.setVec2(that.c); + }; + return Sweep; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var Velocity = /** @class */ (function () { - function Velocity() { - this.v = Vec2.zero(); - this.w = 0; - } - return Velocity; - }()); +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Velocity = /** @class */ (function () { + function Velocity() { + this.v = Vec2.zero(); + this.w = 0; + } + return Velocity; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var Position = /** @class */ (function () { - function Position() { - this.c = Vec2.zero(); - this.a = 0; - } - Position.prototype.getTransform = function (xf, p) { - xf.q.setAngle(this.a); - xf.p.setVec2(Vec2.sub(this.c, Rot.mulVec2(xf.q, p))); - return xf; - }; - return Position; - }()); +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Position = /** @class */ (function () { + function Position() { + this.c = Vec2.zero(); + this.a = 0; + } + Position.prototype.getTransform = function (xf, p) { + xf.q.setAngle(this.a); + xf.p.setVec2(Vec2.sub(this.c, Rot.mulVec2(xf.q, p))); + return xf; + }; + return Position; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +// todo make shape an interface +/** + * A shape is used for collision detection. You can create a shape however you + * like. Shapes used for simulation in World are created automatically when a + * Fixture is created. Shapes may encapsulate one or more child shapes. + */ +var Shape = /** @class */ (function () { + function Shape() { + } + Shape.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return typeof obj.m_type === 'string' && typeof obj.m_radius === 'number'; + }; + return Shape; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var FixtureDefDefault = { + userData: null, + friction: 0.2, + restitution: 0.0, + density: 0.0, + isSensor: false, + filterGroupIndex: 0, + filterCategoryBits: 0x0001, + filterMaskBits: 0xFFFF +}; +/** + * This proxy is used internally to connect shape children to the broad-phase. + */ +var FixtureProxy = /** @class */ (function () { + function FixtureProxy(fixture, childIndex) { + this.aabb = new AABB(); + this.fixture = fixture; + this.childIndex = childIndex; + this.proxyId; + } + return FixtureProxy; +}()); +/** + * A fixture is used to attach a shape to a body for collision detection. A + * fixture inherits its transform from its parent. Fixtures hold additional + * non-geometric data such as friction, collision filters, etc. + * + * To create a new Fixture use {@link Body.createFixture}. + */ +var Fixture = /** @class */ (function () { + // tslint:disable-next-line:typedef + /** @internal */ function Fixture(body, shape, def) { + if (shape.shape) { + def = shape; + shape = shape.shape; + } + else if (typeof def === 'number') { + def = { density: def }; + } + def = options(def, FixtureDefDefault); + this.m_body = body; + this.m_friction = def.friction; + this.m_restitution = def.restitution; + this.m_density = def.density; + this.m_isSensor = def.isSensor; + this.m_filterGroupIndex = def.filterGroupIndex; + this.m_filterCategoryBits = def.filterCategoryBits; + this.m_filterMaskBits = def.filterMaskBits; + // TODO validate shape + this.m_shape = shape; // .clone(); + this.m_next = null; + this.m_proxies = []; + this.m_proxyCount = 0; + var childCount = this.m_shape.getChildCount(); + for (var i = 0; i < childCount; ++i) { + this.m_proxies[i] = new FixtureProxy(this, i); + } + this.m_userData = def.userData; + } /** - * A shape is used for collision detection. You can create a shape however you - * like. Shapes used for simulation in World are created automatically when a - * Fixture is created. Shapes may encapsulate one or more child shapes. + * Re-setup fixture. + * @internal */ - var Shape = /** @class */ (function () { - function Shape() { + Fixture.prototype._reset = function () { + var body = this.getBody(); + var broadPhase = body.m_world.m_broadPhase; + this.destroyProxies(broadPhase); + if (this.m_shape._reset) { + this.m_shape._reset(); } - /** @internal */ - Shape.prototype._reset = function () { - }; - Shape.isValid = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - return typeof obj.m_type === 'string' && typeof obj.m_radius === 'number'; - }; - Shape.prototype.getRadius = function () { - return this.m_radius; + var childCount = this.m_shape.getChildCount(); + for (var i = 0; i < childCount; ++i) { + this.m_proxies[i] = new FixtureProxy(this, i); + } + this.createProxies(broadPhase, body.m_xf); + body.resetMassData(); + }; + /** @internal */ + Fixture.prototype._serialize = function () { + return { + friction: this.m_friction, + restitution: this.m_restitution, + density: this.m_density, + isSensor: this.m_isSensor, + filterGroupIndex: this.m_filterGroupIndex, + filterCategoryBits: this.m_filterCategoryBits, + filterMaskBits: this.m_filterMaskBits, + shape: this.m_shape, }; - /** - * Get the type of this shape. You can use this to down cast to the concrete - * shape. - * - * @return the shape type. - */ - Shape.prototype.getType = function () { - return this.m_type; - }; - return Shape; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var FixtureDefDefault = { - userData: null, - friction: 0.2, - restitution: 0.0, - density: 0.0, - isSensor: false, - filterGroupIndex: 0, - filterCategoryBits: 0x0001, - filterMaskBits: 0xFFFF - }; - /** - * This proxy is used internally to connect shape children to the broad-phase. - */ - var FixtureProxy = /** @class */ (function () { - function FixtureProxy(fixture, childIndex) { - this.aabb = new AABB(); - this.fixture = fixture; - this.childIndex = childIndex; - this.proxyId; - } - return FixtureProxy; - }()); - /** - * A fixture is used to attach a shape to a body for collision detection. A - * fixture inherits its transform from its parent. Fixtures hold additional - * non-geometric data such as friction, collision filters, etc. - * - * To create a new Fixture use {@link Body.createFixture}. - */ - var Fixture = /** @class */ (function () { - // tslint:disable-next-line:typedef - /** @internal */ function Fixture(body, shape, def) { - if (shape.shape) { - def = shape; - shape = shape.shape; - } - else if (typeof def === 'number') { - def = { density: def }; - } - def = options(def, FixtureDefDefault); - this.m_body = body; - this.m_friction = def.friction; - this.m_restitution = def.restitution; - this.m_density = def.density; - this.m_isSensor = def.isSensor; - this.m_filterGroupIndex = def.filterGroupIndex; - this.m_filterCategoryBits = def.filterCategoryBits; - this.m_filterMaskBits = def.filterMaskBits; - // TODO validate shape - this.m_shape = shape; // .clone(); - this.m_next = null; - this.m_proxies = []; - this.m_proxyCount = 0; - var childCount = this.m_shape.getChildCount(); - for (var i = 0; i < childCount; ++i) { - this.m_proxies[i] = new FixtureProxy(this, i); - } - this.m_userData = def.userData; + }; + /** @internal */ + Fixture._deserialize = function (data, body, restore) { + var shape = restore(Shape, data.shape); + var fixture = shape && new Fixture(body, shape, data); + return fixture; + }; + /** + * Get the type of the child shape. You can use this to down cast to the + * concrete shape. + */ + Fixture.prototype.getType = function () { + return this.m_shape.getType(); + }; + /** + * Get the child shape. You can modify the child shape, however you should not + * change the number of vertices because this will crash some collision caching + * mechanisms. Manipulating the shape may lead to non-physical behavior. + */ + Fixture.prototype.getShape = function () { + return this.m_shape; + }; + /** + * A sensor shape collects contact information but never generates a collision + * response. + */ + Fixture.prototype.isSensor = function () { + return this.m_isSensor; + }; + /** + * Set if this fixture is a sensor. + */ + Fixture.prototype.setSensor = function (sensor) { + if (sensor != this.m_isSensor) { + this.m_body.setAwake(true); + this.m_isSensor = sensor; } - /** - * Re-setup fixture. - * @internal - */ - Fixture.prototype._reset = function () { - var body = this.getBody(); - var broadPhase = body.m_world.m_broadPhase; - this.destroyProxies(broadPhase); - if (this.m_shape._reset) { - this.m_shape._reset(); - } - var childCount = this.m_shape.getChildCount(); - for (var i = 0; i < childCount; ++i) { - this.m_proxies[i] = new FixtureProxy(this, i); - } - this.createProxies(broadPhase, body.m_xf); - body.resetMassData(); - }; - /** @internal */ - Fixture.prototype._serialize = function () { - return { - friction: this.m_friction, - restitution: this.m_restitution, - density: this.m_density, - isSensor: this.m_isSensor, - filterGroupIndex: this.m_filterGroupIndex, - filterCategoryBits: this.m_filterCategoryBits, - filterMaskBits: this.m_filterMaskBits, - shape: this.m_shape, - }; - }; - /** @internal */ - Fixture._deserialize = function (data, body, restore) { - var shape = restore(Shape, data.shape); - var fixture = shape && new Fixture(body, shape, data); - return fixture; - }; - /** - * Get the type of the child shape. You can use this to down cast to the - * concrete shape. - */ - Fixture.prototype.getType = function () { - return this.m_shape.getType(); - }; - /** - * Get the child shape. You can modify the child shape, however you should not - * change the number of vertices because this will crash some collision caching - * mechanisms. Manipulating the shape may lead to non-physical behavior. - */ - Fixture.prototype.getShape = function () { - return this.m_shape; - }; - /** - * A sensor shape collects contact information but never generates a collision - * response. - */ - Fixture.prototype.isSensor = function () { - return this.m_isSensor; - }; - /** - * Set if this fixture is a sensor. - */ - Fixture.prototype.setSensor = function (sensor) { - if (sensor != this.m_isSensor) { - this.m_body.setAwake(true); - this.m_isSensor = sensor; - } - }; - // /** - // * Get the contact filtering data. - // */ - // getFilterData() { - // return this.m_filter; - // } - /** - * Get the user data that was assigned in the fixture definition. Use this to - * store your application specific data. - */ - Fixture.prototype.getUserData = function () { - return this.m_userData; - }; - /** - * Set the user data. Use this to store your application specific data. - */ - Fixture.prototype.setUserData = function (data) { - this.m_userData = data; - }; - /** - * Get the parent body of this fixture. This is null if the fixture is not - * attached. - */ - Fixture.prototype.getBody = function () { - return this.m_body; - }; - /** - * Get the next fixture in the parent body's fixture list. - */ - Fixture.prototype.getNext = function () { - return this.m_next; - }; - /** - * Get the density of this fixture. - */ - Fixture.prototype.getDensity = function () { - return this.m_density; - }; - /** - * Set the density of this fixture. This will _not_ automatically adjust the - * mass of the body. You must call Body.resetMassData to update the body's mass. - */ - Fixture.prototype.setDensity = function (density) { - this.m_density = density; - }; - /** - * Get the coefficient of friction, usually in the range [0,1]. - */ - Fixture.prototype.getFriction = function () { - return this.m_friction; - }; - /** - * Set the coefficient of friction. This will not change the friction of - * existing contacts. - */ - Fixture.prototype.setFriction = function (friction) { - this.m_friction = friction; - }; - /** - * Get the coefficient of restitution. - */ - Fixture.prototype.getRestitution = function () { - return this.m_restitution; - }; - /** - * Set the coefficient of restitution. This will not change the restitution of - * existing contacts. - */ - Fixture.prototype.setRestitution = function (restitution) { - this.m_restitution = restitution; - }; - /** - * Test a point in world coordinates for containment in this fixture. - */ - Fixture.prototype.testPoint = function (p) { - return this.m_shape.testPoint(this.m_body.getTransform(), p); - }; - /** - * Cast a ray against this shape. - */ - Fixture.prototype.rayCast = function (output, input, childIndex) { - return this.m_shape.rayCast(output, input, this.m_body.getTransform(), childIndex); - }; - /** - * Get the mass data for this fixture. The mass data is based on the density and - * the shape. The rotational inertia is about the shape's origin. This operation - * may be expensive. - */ - Fixture.prototype.getMassData = function (massData) { - this.m_shape.computeMass(massData, this.m_density); - }; - /** - * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a - * more accurate AABB, compute it using the shape and the body transform. - */ - Fixture.prototype.getAABB = function (childIndex) { - return this.m_proxies[childIndex].aabb; - }; - /** - * These support body activation/deactivation. - */ - Fixture.prototype.createProxies = function (broadPhase, xf) { - // Create proxies in the broad-phase. - this.m_proxyCount = this.m_shape.getChildCount(); - for (var i = 0; i < this.m_proxyCount; ++i) { - var proxy = this.m_proxies[i]; - this.m_shape.computeAABB(proxy.aabb, xf, i); - proxy.proxyId = broadPhase.createProxy(proxy.aabb, proxy); - } - }; - Fixture.prototype.destroyProxies = function (broadPhase) { - // Destroy proxies in the broad-phase. - for (var i = 0; i < this.m_proxyCount; ++i) { - var proxy = this.m_proxies[i]; - broadPhase.destroyProxy(proxy.proxyId); - proxy.proxyId = null; - } - this.m_proxyCount = 0; - }; - /** - * Updates this fixture proxy in broad-phase (with combined AABB of current and - * next transformation). - */ - Fixture.prototype.synchronize = function (broadPhase, xf1, xf2) { - for (var i = 0; i < this.m_proxyCount; ++i) { - var proxy = this.m_proxies[i]; - // Compute an AABB that covers the swept shape (may miss some rotation - // effect). - var aabb1 = new AABB(); - var aabb2 = new AABB(); - this.m_shape.computeAABB(aabb1, xf1, proxy.childIndex); - this.m_shape.computeAABB(aabb2, xf2, proxy.childIndex); - proxy.aabb.combine(aabb1, aabb2); - var displacement = Vec2.sub(xf2.p, xf1.p); - broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement); - } - }; - /** - * Set the contact filtering data. This will not update contacts until the next - * time step when either parent body is active and awake. This automatically - * calls refilter. - */ - Fixture.prototype.setFilterData = function (filter) { - this.m_filterGroupIndex = filter.groupIndex; - this.m_filterCategoryBits = filter.categoryBits; - this.m_filterMaskBits = filter.maskBits; - this.refilter(); - }; - Fixture.prototype.getFilterGroupIndex = function () { - return this.m_filterGroupIndex; - }; - Fixture.prototype.setFilterGroupIndex = function (groupIndex) { - this.m_filterGroupIndex = groupIndex; - }; - Fixture.prototype.getFilterCategoryBits = function () { - return this.m_filterCategoryBits; - }; - Fixture.prototype.setFilterCategoryBits = function (categoryBits) { - this.m_filterCategoryBits = categoryBits; - }; - Fixture.prototype.getFilterMaskBits = function () { - return this.m_filterMaskBits; - }; - Fixture.prototype.setFilterMaskBits = function (maskBits) { - this.m_filterMaskBits = maskBits; - }; - /** - * Call this if you want to establish collision that was previously disabled by - * ContactFilter. - */ - Fixture.prototype.refilter = function () { - if (this.m_body == null) { - return; - } - // Flag associated contacts for filtering. - var edge = this.m_body.getContactList(); - while (edge) { - var contact = edge.contact; - var fixtureA = contact.getFixtureA(); - var fixtureB = contact.getFixtureB(); - if (fixtureA == this || fixtureB == this) { - contact.flagForFiltering(); - } - edge = edge.next; - } - var world = this.m_body.getWorld(); - if (world == null) { - return; - } - // Touch each proxy so that new pairs may be created - var broadPhase = world.m_broadPhase; - for (var i = 0; i < this.m_proxyCount; ++i) { - broadPhase.touchProxy(this.m_proxies[i].proxyId); - } - }; - /** - * Implement this method to provide collision filtering, if you want finer - * control over contact creation. - * - * Return true if contact calculations should be performed between these two - * fixtures. - * - * Warning: for performance reasons this is only called when the AABBs begin to - * overlap. - */ - Fixture.prototype.shouldCollide = function (that) { - if (that.m_filterGroupIndex === this.m_filterGroupIndex && that.m_filterGroupIndex !== 0) { - return that.m_filterGroupIndex > 0; - } - var collideA = (that.m_filterMaskBits & this.m_filterCategoryBits) !== 0; - var collideB = (that.m_filterCategoryBits & this.m_filterMaskBits) !== 0; - var collide = collideA && collideB; - return collide; - }; - return Fixture; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + }; + // /** + // * Get the contact filtering data. + // */ + // getFilterData() { + // return this.m_filter; + // } + /** + * Get the user data that was assigned in the fixture definition. Use this to + * store your application specific data. + */ + Fixture.prototype.getUserData = function () { + return this.m_userData; + }; + /** + * Set the user data. Use this to store your application specific data. + */ + Fixture.prototype.setUserData = function (data) { + this.m_userData = data; + }; + /** + * Get the parent body of this fixture. This is null if the fixture is not + * attached. + */ + Fixture.prototype.getBody = function () { + return this.m_body; + }; + /** + * Get the next fixture in the parent body's fixture list. + */ + Fixture.prototype.getNext = function () { + return this.m_next; + }; + /** + * Get the density of this fixture. + */ + Fixture.prototype.getDensity = function () { + return this.m_density; + }; + /** + * Set the density of this fixture. This will _not_ automatically adjust the + * mass of the body. You must call Body.resetMassData to update the body's mass. + */ + Fixture.prototype.setDensity = function (density) { + this.m_density = density; + }; + /** + * Get the coefficient of friction, usually in the range [0,1]. + */ + Fixture.prototype.getFriction = function () { + return this.m_friction; + }; + /** + * Set the coefficient of friction. This will not change the friction of + * existing contacts. + */ + Fixture.prototype.setFriction = function (friction) { + this.m_friction = friction; + }; + /** + * Get the coefficient of restitution. + */ + Fixture.prototype.getRestitution = function () { + return this.m_restitution; + }; + /** + * Set the coefficient of restitution. This will not change the restitution of + * existing contacts. + */ + Fixture.prototype.setRestitution = function (restitution) { + this.m_restitution = restitution; + }; + /** + * Test a point in world coordinates for containment in this fixture. + */ + Fixture.prototype.testPoint = function (p) { + return this.m_shape.testPoint(this.m_body.getTransform(), p); + }; + /** + * Cast a ray against this shape. + */ + Fixture.prototype.rayCast = function (output, input, childIndex) { + return this.m_shape.rayCast(output, input, this.m_body.getTransform(), childIndex); + }; + /** + * Get the mass data for this fixture. The mass data is based on the density and + * the shape. The rotational inertia is about the shape's origin. This operation + * may be expensive. + */ + Fixture.prototype.getMassData = function (massData) { + this.m_shape.computeMass(massData, this.m_density); + }; + /** + * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a + * more accurate AABB, compute it using the shape and the body transform. + */ + Fixture.prototype.getAABB = function (childIndex) { + return this.m_proxies[childIndex].aabb; + }; + /** + * These support body activation/deactivation. + */ + Fixture.prototype.createProxies = function (broadPhase, xf) { + // Create proxies in the broad-phase. + this.m_proxyCount = this.m_shape.getChildCount(); + for (var i = 0; i < this.m_proxyCount; ++i) { + var proxy = this.m_proxies[i]; + this.m_shape.computeAABB(proxy.aabb, xf, i); + proxy.proxyId = broadPhase.createProxy(proxy.aabb, proxy); + } + }; + Fixture.prototype.destroyProxies = function (broadPhase) { + // Destroy proxies in the broad-phase. + for (var i = 0; i < this.m_proxyCount; ++i) { + var proxy = this.m_proxies[i]; + broadPhase.destroyProxy(proxy.proxyId); + proxy.proxyId = null; + } + this.m_proxyCount = 0; + }; + /** + * Updates this fixture proxy in broad-phase (with combined AABB of current and + * next transformation). + */ + Fixture.prototype.synchronize = function (broadPhase, xf1, xf2) { + for (var i = 0; i < this.m_proxyCount; ++i) { + var proxy = this.m_proxies[i]; + // Compute an AABB that covers the swept shape (may miss some rotation + // effect). + var aabb1 = new AABB(); + var aabb2 = new AABB(); + this.m_shape.computeAABB(aabb1, xf1, proxy.childIndex); + this.m_shape.computeAABB(aabb2, xf2, proxy.childIndex); + proxy.aabb.combine(aabb1, aabb2); + var displacement = Vec2.sub(xf2.p, xf1.p); + broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement); + } + }; + /** + * Set the contact filtering data. This will not update contacts until the next + * time step when either parent body is active and awake. This automatically + * calls refilter. + */ + Fixture.prototype.setFilterData = function (filter) { + this.m_filterGroupIndex = filter.groupIndex; + this.m_filterCategoryBits = filter.categoryBits; + this.m_filterMaskBits = filter.maskBits; + this.refilter(); + }; + Fixture.prototype.getFilterGroupIndex = function () { + return this.m_filterGroupIndex; + }; + Fixture.prototype.setFilterGroupIndex = function (groupIndex) { + this.m_filterGroupIndex = groupIndex; + }; + Fixture.prototype.getFilterCategoryBits = function () { + return this.m_filterCategoryBits; + }; + Fixture.prototype.setFilterCategoryBits = function (categoryBits) { + this.m_filterCategoryBits = categoryBits; + }; + Fixture.prototype.getFilterMaskBits = function () { + return this.m_filterMaskBits; + }; + Fixture.prototype.setFilterMaskBits = function (maskBits) { + this.m_filterMaskBits = maskBits; + }; + /** + * Call this if you want to establish collision that was previously disabled by + * ContactFilter. + */ + Fixture.prototype.refilter = function () { + if (this.m_body == null) { + return; + } + // Flag associated contacts for filtering. + var edge = this.m_body.getContactList(); + while (edge) { + var contact = edge.contact; + var fixtureA = contact.getFixtureA(); + var fixtureB = contact.getFixtureB(); + if (fixtureA == this || fixtureB == this) { + contact.flagForFiltering(); + } + edge = edge.next; + } + var world = this.m_body.getWorld(); + if (world == null) { + return; + } + // Touch each proxy so that new pairs may be created + var broadPhase = world.m_broadPhase; + for (var i = 0; i < this.m_proxyCount; ++i) { + broadPhase.touchProxy(this.m_proxies[i].proxyId); + } + }; + /** + * Implement this method to provide collision filtering, if you want finer + * control over contact creation. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var STATIC = 'static'; - var KINEMATIC = 'kinematic'; - var DYNAMIC = 'dynamic'; - var BodyDefDefault = { - type: STATIC, - position: Vec2.zero(), - angle: 0.0, - linearVelocity: Vec2.zero(), - angularVelocity: 0.0, - linearDamping: 0.0, - angularDamping: 0.0, - fixedRotation: false, - bullet: false, - gravityScale: 1.0, - allowSleep: true, - awake: true, - active: true, - userData: null - }; - /** - * MassData This holds the mass data computed for a shape. - */ - var MassData = /** @class */ (function () { - function MassData() { - /** The mass of the shape, usually in kilograms. */ - this.mass = 0; - /** The position of the shape's centroid relative to the shape's origin. */ - this.center = Vec2.zero(); - /** The rotational inertia of the shape about the local origin. */ - this.I = 0; - } - return MassData; - }()); - /** - * A rigid body composed of one or more fixtures. + * Return true if contact calculations should be performed between these two + * fixtures. * - * To create a new Body use {@link World.createBody}. + * Warning: for performance reasons this is only called when the AABBs begin to + * overlap. */ - var Body = /** @class */ (function () { - /** @internal */ - function Body(world, def) { - def = options(def, BodyDefDefault); - this.m_world = world; - this.m_awakeFlag = def.awake; - this.m_autoSleepFlag = def.allowSleep; - this.m_bulletFlag = def.bullet; - this.m_fixedRotationFlag = def.fixedRotation; - this.m_activeFlag = def.active; - this.m_islandFlag = false; - this.m_toiFlag = false; - this.m_userData = def.userData; - this.m_type = def.type; - if (this.m_type == DYNAMIC) { - this.m_mass = 1.0; - this.m_invMass = 1.0; - } - else { - this.m_mass = 0.0; - this.m_invMass = 0.0; - } - // Rotational inertia about the center of mass. - this.m_I = 0.0; - this.m_invI = 0.0; - // the body origin transform - this.m_xf = Transform.identity(); - this.m_xf.p = Vec2.clone(def.position); - this.m_xf.q.setAngle(def.angle); - // the swept motion for CCD - this.m_sweep = new Sweep(); - this.m_sweep.setTransform(this.m_xf); - // position and velocity correction - this.c_velocity = new Velocity(); - this.c_position = new Position(); - this.m_force = Vec2.zero(); - this.m_torque = 0.0; - this.m_linearVelocity = Vec2.clone(def.linearVelocity); - this.m_angularVelocity = def.angularVelocity; - this.m_linearDamping = def.linearDamping; - this.m_angularDamping = def.angularDamping; - this.m_gravityScale = def.gravityScale; - this.m_sleepTime = 0.0; - this.m_jointList = null; - this.m_contactList = null; - this.m_fixtureList = null; - this.m_prev = null; - this.m_next = null; - this.m_destroyed = false; + Fixture.prototype.shouldCollide = function (that) { + if (that.m_filterGroupIndex === this.m_filterGroupIndex && that.m_filterGroupIndex !== 0) { + return that.m_filterGroupIndex > 0; } - /** @internal */ - Body.prototype._serialize = function () { - var fixtures = []; - for (var f = this.m_fixtureList; f; f = f.m_next) { - fixtures.push(f); - } - return { - type: this.m_type, - bullet: this.m_bulletFlag, - position: this.m_xf.p, - angle: this.m_xf.q.getAngle(), - linearVelocity: this.m_linearVelocity, - angularVelocity: this.m_angularVelocity, - fixtures: fixtures, - }; - }; - /** @internal */ - Body._deserialize = function (data, world, restore) { - var body = new Body(world, data); - if (data.fixtures) { - for (var i = data.fixtures.length - 1; i >= 0; i--) { - var fixture = restore(Fixture, data.fixtures[i], body); - body._addFixture(fixture); - } - } - return body; - }; - Body.prototype.isWorldLocked = function () { - return this.m_world && this.m_world.isLocked() ? true : false; - }; - Body.prototype.getWorld = function () { - return this.m_world; - }; - Body.prototype.getNext = function () { - return this.m_next; - }; - Body.prototype.setUserData = function (data) { - this.m_userData = data; - }; - Body.prototype.getUserData = function () { - return this.m_userData; - }; - Body.prototype.getFixtureList = function () { - return this.m_fixtureList; - }; - Body.prototype.getJointList = function () { - return this.m_jointList; - }; - /** - * Warning: this list changes during the time step and you may miss some - * collisions if you don't use ContactListener. - */ - Body.prototype.getContactList = function () { - return this.m_contactList; - }; - Body.prototype.isStatic = function () { - return this.m_type == STATIC; - }; - Body.prototype.isDynamic = function () { - return this.m_type == DYNAMIC; - }; - Body.prototype.isKinematic = function () { - return this.m_type == KINEMATIC; - }; - /** - * This will alter the mass and velocity. - */ - Body.prototype.setStatic = function () { - this.setType(STATIC); - return this; - }; - Body.prototype.setDynamic = function () { - this.setType(DYNAMIC); - return this; - }; - Body.prototype.setKinematic = function () { - this.setType(KINEMATIC); - return this; - }; - /** - * @internal - */ - Body.prototype.getType = function () { - return this.m_type; - }; - /** - * @internal - */ - Body.prototype.setType = function (type) { - if (this.isWorldLocked() == true) { - return; - } - if (this.m_type == type) { - return; - } - this.m_type = type; - this.resetMassData(); - if (this.m_type == STATIC) { - this.m_linearVelocity.setZero(); - this.m_angularVelocity = 0.0; - this.m_sweep.forward(); - this.synchronizeFixtures(); - } - this.setAwake(true); - this.m_force.setZero(); - this.m_torque = 0.0; - // Delete the attached contacts. - var ce = this.m_contactList; - while (ce) { - var ce0 = ce; - ce = ce.next; - this.m_world.destroyContact(ce0.contact); - } - this.m_contactList = null; - // Touch the proxies so that new contacts will be created (when appropriate) - var broadPhase = this.m_world.m_broadPhase; - for (var f = this.m_fixtureList; f; f = f.m_next) { - var proxyCount = f.m_proxyCount; - for (var i = 0; i < proxyCount; ++i) { - broadPhase.touchProxy(f.m_proxies[i].proxyId); - } - } - }; - Body.prototype.isBullet = function () { - return this.m_bulletFlag; - }; - /** - * Should this body be treated like a bullet for continuous collision detection? - */ - Body.prototype.setBullet = function (flag) { - this.m_bulletFlag = !!flag; - }; - Body.prototype.isSleepingAllowed = function () { - return this.m_autoSleepFlag; - }; - Body.prototype.setSleepingAllowed = function (flag) { - this.m_autoSleepFlag = !!flag; - if (this.m_autoSleepFlag == false) { - this.setAwake(true); - } - }; - Body.prototype.isAwake = function () { - return this.m_awakeFlag; - }; - /** - * Set the sleep state of the body. A sleeping body has very low CPU cost. - * - * @param flag Set to true to wake the body, false to put it to sleep. - */ - Body.prototype.setAwake = function (flag) { - if (flag) { - if (this.m_awakeFlag == false) { - this.m_awakeFlag = true; - this.m_sleepTime = 0.0; - } - } - else { - this.m_awakeFlag = false; - this.m_sleepTime = 0.0; - this.m_linearVelocity.setZero(); - this.m_angularVelocity = 0.0; - this.m_force.setZero(); - this.m_torque = 0.0; - } - }; - Body.prototype.isActive = function () { - return this.m_activeFlag; - }; - /** - * Set the active state of the body. An inactive body is not simulated and - * cannot be collided with or woken up. If you pass a flag of true, all fixtures - * will be added to the broad-phase. If you pass a flag of false, all fixtures - * will be removed from the broad-phase and all contacts will be destroyed. - * Fixtures and joints are otherwise unaffected. - * - * You may continue to create/destroy fixtures and joints on inactive bodies. - * Fixtures on an inactive body are implicitly inactive and will not participate - * in collisions, ray-casts, or queries. Joints connected to an inactive body - * are implicitly inactive. An inactive body is still owned by a World object - * and remains - */ - Body.prototype.setActive = function (flag) { - if (flag == this.m_activeFlag) { - return; - } - this.m_activeFlag = !!flag; - if (this.m_activeFlag) { - // Create all proxies. - var broadPhase = this.m_world.m_broadPhase; - for (var f = this.m_fixtureList; f; f = f.m_next) { - f.createProxies(broadPhase, this.m_xf); - } - // Contacts are created the next time step. - } - else { - // Destroy all proxies. - var broadPhase = this.m_world.m_broadPhase; - for (var f = this.m_fixtureList; f; f = f.m_next) { - f.destroyProxies(broadPhase); - } - // Destroy the attached contacts. - var ce = this.m_contactList; - while (ce) { - var ce0 = ce; - ce = ce.next; - this.m_world.destroyContact(ce0.contact); - } - this.m_contactList = null; - } - }; - Body.prototype.isFixedRotation = function () { - return this.m_fixedRotationFlag; - }; - /** - * Set this body to have fixed rotation. This causes the mass to be reset. - */ - Body.prototype.setFixedRotation = function (flag) { - if (this.m_fixedRotationFlag == flag) { - return; - } - this.m_fixedRotationFlag = !!flag; - this.m_angularVelocity = 0.0; - this.resetMassData(); - }; - /** - * Get the world transform for the body's origin. - */ - Body.prototype.getTransform = function () { - return this.m_xf; - }; - /** - * Set the position of the body's origin and rotation. Manipulating a body's - * transform may cause non-physical behavior. Note: contacts are updated on the - * next call to World.step. - * - * @param position The world position of the body's local origin. - * @param angle The world rotation in radians. - */ - Body.prototype.setTransform = function (position, angle) { - if (this.isWorldLocked() == true) { - return; - } - this.m_xf.setNum(position, angle); - this.m_sweep.setTransform(this.m_xf); - var broadPhase = this.m_world.m_broadPhase; - for (var f = this.m_fixtureList; f; f = f.m_next) { - f.synchronize(broadPhase, this.m_xf, this.m_xf); - } - }; - Body.prototype.synchronizeTransform = function () { - this.m_sweep.getTransform(this.m_xf, 1); - }; - /** - * Update fixtures in broad-phase. - */ - Body.prototype.synchronizeFixtures = function () { - var xf = Transform.identity(); - this.m_sweep.getTransform(xf, 0); - var broadPhase = this.m_world.m_broadPhase; - for (var f = this.m_fixtureList; f; f = f.m_next) { - f.synchronize(broadPhase, xf, this.m_xf); - } - }; - /** - * Used in TOI. - */ - Body.prototype.advance = function (alpha) { - // Advance to the new safe time. This doesn't sync the broad-phase. - this.m_sweep.advance(alpha); - this.m_sweep.c.setVec2(this.m_sweep.c0); - this.m_sweep.a = this.m_sweep.a0; - this.m_sweep.getTransform(this.m_xf, 1); - }; - /** - * Get the world position for the body's origin. - */ - Body.prototype.getPosition = function () { - return this.m_xf.p; - }; - Body.prototype.setPosition = function (p) { - this.setTransform(p, this.m_sweep.a); - }; - /** - * Get the current world rotation angle in radians. - */ - Body.prototype.getAngle = function () { - return this.m_sweep.a; - }; - Body.prototype.setAngle = function (angle) { - this.setTransform(this.m_xf.p, angle); - }; - /** - * Get the world position of the center of mass. - */ - Body.prototype.getWorldCenter = function () { - return this.m_sweep.c; - }; - /** - * Get the local position of the center of mass. - */ - Body.prototype.getLocalCenter = function () { - return this.m_sweep.localCenter; - }; - /** - * Get the linear velocity of the center of mass. - * - * @return the linear velocity of the center of mass. - */ - Body.prototype.getLinearVelocity = function () { - return this.m_linearVelocity; - }; - /** - * Get the world linear velocity of a world point attached to this body. - * - * @param worldPoint A point in world coordinates. - */ - Body.prototype.getLinearVelocityFromWorldPoint = function (worldPoint) { - var localCenter = Vec2.sub(worldPoint, this.m_sweep.c); - return Vec2.add(this.m_linearVelocity, Vec2.crossNumVec2(this.m_angularVelocity, localCenter)); - }; - /** - * Get the world velocity of a local point. - * - * @param localPoint A point in local coordinates. - */ - Body.prototype.getLinearVelocityFromLocalPoint = function (localPoint) { - return this.getLinearVelocityFromWorldPoint(this.getWorldPoint(localPoint)); - }; - /** - * Set the linear velocity of the center of mass. - * - * @param v The new linear velocity of the center of mass. - */ - Body.prototype.setLinearVelocity = function (v) { - if (this.m_type == STATIC) { - return; - } - if (Vec2.dot(v, v) > 0.0) { - this.setAwake(true); - } - this.m_linearVelocity.setVec2(v); - }; - /** - * Get the angular velocity. - * - * @returns the angular velocity in radians/second. - */ - Body.prototype.getAngularVelocity = function () { - return this.m_angularVelocity; - }; - /** - * Set the angular velocity. - * - * @param omega The new angular velocity in radians/second. - */ - Body.prototype.setAngularVelocity = function (w) { - if (this.m_type == STATIC) { - return; - } - if (w * w > 0.0) { - this.setAwake(true); - } - this.m_angularVelocity = w; - }; - Body.prototype.getLinearDamping = function () { - return this.m_linearDamping; - }; - Body.prototype.setLinearDamping = function (linearDamping) { - this.m_linearDamping = linearDamping; - }; - Body.prototype.getAngularDamping = function () { - return this.m_angularDamping; - }; - Body.prototype.setAngularDamping = function (angularDamping) { - this.m_angularDamping = angularDamping; - }; - Body.prototype.getGravityScale = function () { - return this.m_gravityScale; - }; - /** - * Scale the gravity applied to this body. - */ - Body.prototype.setGravityScale = function (scale) { - this.m_gravityScale = scale; - }; - /** - * Get the total mass of the body. - * - * @returns The mass, usually in kilograms (kg). - */ - Body.prototype.getMass = function () { - return this.m_mass; - }; - /** - * Get the rotational inertia of the body about the local origin. - * - * @return the rotational inertia, usually in kg-m^2. - */ - Body.prototype.getInertia = function () { - return this.m_I + this.m_mass - * Vec2.dot(this.m_sweep.localCenter, this.m_sweep.localCenter); - }; - /** - * Copy the mass data of the body to data. - */ - Body.prototype.getMassData = function (data) { - data.mass = this.m_mass; - data.I = this.getInertia(); - data.center.setVec2(this.m_sweep.localCenter); - }; - /** - * This resets the mass properties to the sum of the mass properties of the - * fixtures. This normally does not need to be called unless you called - * SetMassData to override the mass and you later want to reset the mass. - */ - Body.prototype.resetMassData = function () { - // Compute mass data from shapes. Each shape has its own density. + var collideA = (that.m_filterMaskBits & this.m_filterCategoryBits) !== 0; + var collideB = (that.m_filterCategoryBits & this.m_filterMaskBits) !== 0; + var collide = collideA && collideB; + return collide; + }; + return Fixture; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var STATIC = 'static'; +var KINEMATIC = 'kinematic'; +var DYNAMIC = 'dynamic'; +var BodyDefDefault = { + type: STATIC, + position: Vec2.zero(), + angle: 0.0, + linearVelocity: Vec2.zero(), + angularVelocity: 0.0, + linearDamping: 0.0, + angularDamping: 0.0, + fixedRotation: false, + bullet: false, + gravityScale: 1.0, + allowSleep: true, + awake: true, + active: true, + userData: null +}; +/** + * MassData This holds the mass data computed for a shape. + */ +var MassData = /** @class */ (function () { + function MassData() { + /** The mass of the shape, usually in kilograms. */ + this.mass = 0; + /** The position of the shape's centroid relative to the shape's origin. */ + this.center = Vec2.zero(); + /** The rotational inertia of the shape about the local origin. */ + this.I = 0; + } + return MassData; +}()); +/** + * A rigid body composed of one or more fixtures. + * + * To create a new Body use {@link World.createBody}. + */ +var Body = /** @class */ (function () { + /** @internal */ + function Body(world, def) { + def = options(def, BodyDefDefault); + this.m_world = world; + this.m_awakeFlag = def.awake; + this.m_autoSleepFlag = def.allowSleep; + this.m_bulletFlag = def.bullet; + this.m_fixedRotationFlag = def.fixedRotation; + this.m_activeFlag = def.active; + this.m_islandFlag = false; + this.m_toiFlag = false; + this.m_userData = def.userData; + this.m_type = def.type; + if (this.m_type == DYNAMIC) { + this.m_mass = 1.0; + this.m_invMass = 1.0; + } + else { this.m_mass = 0.0; this.m_invMass = 0.0; - this.m_I = 0.0; - this.m_invI = 0.0; - this.m_sweep.localCenter.setZero(); - // Static and kinematic bodies have zero mass. - if (this.isStatic() || this.isKinematic()) { - this.m_sweep.c0.setVec2(this.m_xf.p); - this.m_sweep.c.setVec2(this.m_xf.p); - this.m_sweep.a0 = this.m_sweep.a; - return; - } - // Accumulate mass over all fixtures. - var localCenter = Vec2.zero(); - for (var f = this.m_fixtureList; f; f = f.m_next) { - if (f.m_density == 0.0) { - continue; - } - var massData = new MassData(); - f.getMassData(massData); - this.m_mass += massData.mass; - localCenter.addMul(massData.mass, massData.center); - this.m_I += massData.I; - } - // Compute center of mass. - if (this.m_mass > 0.0) { - this.m_invMass = 1.0 / this.m_mass; - localCenter.mul(this.m_invMass); - } - else { - // Force all dynamic bodies to have a positive mass. - this.m_mass = 1.0; - this.m_invMass = 1.0; - } - if (this.m_I > 0.0 && this.m_fixedRotationFlag == false) { - // Center the inertia about the center of mass. - this.m_I -= this.m_mass * Vec2.dot(localCenter, localCenter); - this.m_invI = 1.0 / this.m_I; - } - else { - this.m_I = 0.0; - this.m_invI = 0.0; - } - // Move center of mass. - var oldCenter = Vec2.clone(this.m_sweep.c); - this.m_sweep.setLocalCenter(localCenter, this.m_xf); - // Update center of mass velocity. - this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(this.m_sweep.c, oldCenter))); - }; - /** - * Set the mass properties to override the mass properties of the fixtures. Note - * that this changes the center of mass position. Note that creating or - * destroying fixtures can also alter the mass. This function has no effect if - * the body isn't dynamic. - * - * @param massData The mass properties. - */ - Body.prototype.setMassData = function (massData) { - if (this.isWorldLocked() == true) { - return; - } - if (this.m_type != DYNAMIC) { - return; - } - this.m_invMass = 0.0; - this.m_I = 0.0; - this.m_invI = 0.0; - this.m_mass = massData.mass; - if (this.m_mass <= 0.0) { - this.m_mass = 1.0; - } - this.m_invMass = 1.0 / this.m_mass; - if (massData.I > 0.0 && this.m_fixedRotationFlag == false) { - this.m_I = massData.I - this.m_mass - * Vec2.dot(massData.center, massData.center); - this.m_invI = 1.0 / this.m_I; - } - // Move center of mass. - var oldCenter = Vec2.clone(this.m_sweep.c); - this.m_sweep.setLocalCenter(massData.center, this.m_xf); - // Update center of mass velocity. - this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(this.m_sweep.c, oldCenter))); - }; - /** - * Apply a force at a world point. If the force is not applied at the center of - * mass, it will generate a torque and affect the angular velocity. This wakes - * up the body. - * - * @param force The world force vector, usually in Newtons (N). - * @param point The world position of the point of application. - * @param wake Also wake up the body - */ - Body.prototype.applyForce = function (force, point, wake) { - if (wake === void 0) { wake = true; } - if (this.m_type != DYNAMIC) { - return; - } - if (wake && this.m_awakeFlag == false) { - this.setAwake(true); - } - // Don't accumulate a force if the body is sleeping. - if (this.m_awakeFlag) { - this.m_force.add(force); - this.m_torque += Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), force); - } - }; - /** - * Apply a force to the center of mass. This wakes up the body. - * - * @param force The world force vector, usually in Newtons (N). - * @param wake Also wake up the body - */ - Body.prototype.applyForceToCenter = function (force, wake) { - if (wake === void 0) { wake = true; } - if (this.m_type != DYNAMIC) { - return; - } - if (wake && this.m_awakeFlag == false) { - this.setAwake(true); - } - // Don't accumulate a force if the body is sleeping - if (this.m_awakeFlag) { - this.m_force.add(force); - } - }; - /** - * Apply a torque. This affects the angular velocity without affecting the - * linear velocity of the center of mass. This wakes up the body. - * - * @param torque About the z-axis (out of the screen), usually in N-m. - * @param wake Also wake up the body - */ - Body.prototype.applyTorque = function (torque, wake) { - if (wake === void 0) { wake = true; } - if (this.m_type != DYNAMIC) { - return; - } - if (wake && this.m_awakeFlag == false) { - this.setAwake(true); - } - // Don't accumulate a force if the body is sleeping - if (this.m_awakeFlag) { - this.m_torque += torque; - } - }; - /** - * Apply an impulse at a point. This immediately modifies the velocity. It also - * modifies the angular velocity if the point of application is not at the - * center of mass. This wakes up the body. - * - * @param impulse The world impulse vector, usually in N-seconds or kg-m/s. - * @param point The world position of the point of application. - * @param wake Also wake up the body - */ - Body.prototype.applyLinearImpulse = function (impulse, point, wake) { - if (wake === void 0) { wake = true; } - if (this.m_type != DYNAMIC) { - return; - } - if (wake && this.m_awakeFlag == false) { - this.setAwake(true); - } - // Don't accumulate velocity if the body is sleeping - if (this.m_awakeFlag) { - this.m_linearVelocity.addMul(this.m_invMass, impulse); - this.m_angularVelocity += this.m_invI * Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), impulse); - } + } + // Rotational inertia about the center of mass. + this.m_I = 0.0; + this.m_invI = 0.0; + // the body origin transform + this.m_xf = Transform.identity(); + this.m_xf.p = Vec2.clone(def.position); + this.m_xf.q.setAngle(def.angle); + // the swept motion for CCD + this.m_sweep = new Sweep(); + this.m_sweep.setTransform(this.m_xf); + // position and velocity correction + this.c_velocity = new Velocity(); + this.c_position = new Position(); + this.m_force = Vec2.zero(); + this.m_torque = 0.0; + this.m_linearVelocity = Vec2.clone(def.linearVelocity); + this.m_angularVelocity = def.angularVelocity; + this.m_linearDamping = def.linearDamping; + this.m_angularDamping = def.angularDamping; + this.m_gravityScale = def.gravityScale; + this.m_sleepTime = 0.0; + this.m_jointList = null; + this.m_contactList = null; + this.m_fixtureList = null; + this.m_prev = null; + this.m_next = null; + this.m_destroyed = false; + } + /** @internal */ + Body.prototype._serialize = function () { + var fixtures = []; + for (var f = this.m_fixtureList; f; f = f.m_next) { + fixtures.push(f); + } + return { + type: this.m_type, + bullet: this.m_bulletFlag, + position: this.m_xf.p, + angle: this.m_xf.q.getAngle(), + linearVelocity: this.m_linearVelocity, + angularVelocity: this.m_angularVelocity, + fixtures: fixtures, }; - /** - * Apply an angular impulse. - * - * @param impulse The angular impulse in units of kg*m*m/s - * @param wake Also wake up the body - */ - Body.prototype.applyAngularImpulse = function (impulse, wake) { - if (wake === void 0) { wake = true; } - if (this.m_type != DYNAMIC) { - return; - } - if (wake && this.m_awakeFlag == false) { - this.setAwake(true); + }; + /** @internal */ + Body._deserialize = function (data, world, restore) { + var body = new Body(world, data); + if (data.fixtures) { + for (var i = data.fixtures.length - 1; i >= 0; i--) { + var fixture = restore(Fixture, data.fixtures[i], body); + body._addFixture(fixture); } - // Don't accumulate velocity if the body is sleeping - if (this.m_awakeFlag) { - this.m_angularVelocity += this.m_invI * impulse; + } + return body; + }; + Body.prototype.isWorldLocked = function () { + return this.m_world && this.m_world.isLocked() ? true : false; + }; + Body.prototype.getWorld = function () { + return this.m_world; + }; + Body.prototype.getNext = function () { + return this.m_next; + }; + Body.prototype.setUserData = function (data) { + this.m_userData = data; + }; + Body.prototype.getUserData = function () { + return this.m_userData; + }; + Body.prototype.getFixtureList = function () { + return this.m_fixtureList; + }; + Body.prototype.getJointList = function () { + return this.m_jointList; + }; + /** + * Warning: this list changes during the time step and you may miss some + * collisions if you don't use ContactListener. + */ + Body.prototype.getContactList = function () { + return this.m_contactList; + }; + Body.prototype.isStatic = function () { + return this.m_type == STATIC; + }; + Body.prototype.isDynamic = function () { + return this.m_type == DYNAMIC; + }; + Body.prototype.isKinematic = function () { + return this.m_type == KINEMATIC; + }; + /** + * This will alter the mass and velocity. + */ + Body.prototype.setStatic = function () { + this.setType(STATIC); + return this; + }; + Body.prototype.setDynamic = function () { + this.setType(DYNAMIC); + return this; + }; + Body.prototype.setKinematic = function () { + this.setType(KINEMATIC); + return this; + }; + /** + * @internal + */ + Body.prototype.getType = function () { + return this.m_type; + }; + /** + * @internal + */ + Body.prototype.setType = function (type) { + if (this.isWorldLocked() == true) { + return; + } + if (this.m_type == type) { + return; + } + this.m_type = type; + this.resetMassData(); + if (this.m_type == STATIC) { + this.m_linearVelocity.setZero(); + this.m_angularVelocity = 0.0; + this.m_sweep.forward(); + this.synchronizeFixtures(); + } + this.setAwake(true); + this.m_force.setZero(); + this.m_torque = 0.0; + // Delete the attached contacts. + var ce = this.m_contactList; + while (ce) { + var ce0 = ce; + ce = ce.next; + this.m_world.destroyContact(ce0.contact); + } + this.m_contactList = null; + // Touch the proxies so that new contacts will be created (when appropriate) + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + var proxyCount = f.m_proxyCount; + for (var i = 0; i < proxyCount; ++i) { + broadPhase.touchProxy(f.m_proxies[i].proxyId); } - }; - /** - * This is used to prevent connected bodies (by joints) from colliding, - * depending on the joint's collideConnected flag. - */ - Body.prototype.shouldCollide = function (that) { - // At least one body should be dynamic. - if (this.m_type != DYNAMIC && that.m_type != DYNAMIC) { - return false; + } + }; + Body.prototype.isBullet = function () { + return this.m_bulletFlag; + }; + /** + * Should this body be treated like a bullet for continuous collision detection? + */ + Body.prototype.setBullet = function (flag) { + this.m_bulletFlag = !!flag; + }; + Body.prototype.isSleepingAllowed = function () { + return this.m_autoSleepFlag; + }; + Body.prototype.setSleepingAllowed = function (flag) { + this.m_autoSleepFlag = !!flag; + if (this.m_autoSleepFlag == false) { + this.setAwake(true); + } + }; + Body.prototype.isAwake = function () { + return this.m_awakeFlag; + }; + /** + * Set the sleep state of the body. A sleeping body has very low CPU cost. + * + * @param flag Set to true to wake the body, false to put it to sleep. + */ + Body.prototype.setAwake = function (flag) { + if (flag) { + if (this.m_awakeFlag == false) { + this.m_awakeFlag = true; + this.m_sleepTime = 0.0; } - // Does a joint prevent collision? - for (var jn = this.m_jointList; jn; jn = jn.next) { - if (jn.other == that) { - if (jn.joint.m_collideConnected == false) { - return false; - } - } + } + else { + this.m_awakeFlag = false; + this.m_sleepTime = 0.0; + this.m_linearVelocity.setZero(); + this.m_angularVelocity = 0.0; + this.m_force.setZero(); + this.m_torque = 0.0; + } + }; + Body.prototype.isActive = function () { + return this.m_activeFlag; + }; + /** + * Set the active state of the body. An inactive body is not simulated and + * cannot be collided with or woken up. If you pass a flag of true, all fixtures + * will be added to the broad-phase. If you pass a flag of false, all fixtures + * will be removed from the broad-phase and all contacts will be destroyed. + * Fixtures and joints are otherwise unaffected. + * + * You may continue to create/destroy fixtures and joints on inactive bodies. + * Fixtures on an inactive body are implicitly inactive and will not participate + * in collisions, ray-casts, or queries. Joints connected to an inactive body + * are implicitly inactive. An inactive body is still owned by a World object + * and remains + */ + Body.prototype.setActive = function (flag) { + if (flag == this.m_activeFlag) { + return; + } + this.m_activeFlag = !!flag; + if (this.m_activeFlag) { + // Create all proxies. + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + f.createProxies(broadPhase, this.m_xf); } - return true; - }; - /** - * @internal Used for deserialize. - */ - Body.prototype._addFixture = function (fixture) { - if (this.isWorldLocked() == true) { - return null; - } - if (this.m_activeFlag) { - var broadPhase = this.m_world.m_broadPhase; - fixture.createProxies(broadPhase, this.m_xf); - } - fixture.m_next = this.m_fixtureList; - this.m_fixtureList = fixture; - // Adjust mass properties if needed. - if (fixture.m_density > 0.0) { - this.resetMassData(); - } - // Let the world know we have a new fixture. This will cause new contacts - // to be created at the beginning of the next time step. - this.m_world.m_newFixture = true; - return fixture; - }; - // tslint:disable-next-line:typedef - Body.prototype.createFixture = function (shape, fixdef) { - if (this.isWorldLocked() == true) { - return null; - } - var fixture = new Fixture(this, shape, fixdef); - this._addFixture(fixture); - return fixture; - }; - /** - * Destroy a fixture. This removes the fixture from the broad-phase and destroys - * all contacts associated with this fixture. This will automatically adjust the - * mass of the body if the body is dynamic and the fixture has positive density. - * All fixtures attached to a body are implicitly destroyed when the body is - * destroyed. - * - * Warning: This function is locked during callbacks. - * - * @param fixture The fixture to be removed. - */ - Body.prototype.destroyFixture = function (fixture) { - if (this.isWorldLocked() == true) { - return; + // Contacts are created the next time step. + } + else { + // Destroy all proxies. + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + f.destroyProxies(broadPhase); } - if (this.m_fixtureList === fixture) { - this.m_fixtureList = fixture.m_next; + // Destroy the attached contacts. + var ce = this.m_contactList; + while (ce) { + var ce0 = ce; + ce = ce.next; + this.m_world.destroyContact(ce0.contact); } - else { - var node = this.m_fixtureList; - while (node != null) { - if (node.m_next === fixture) { - node.m_next = fixture.m_next; - break; - } - node = node.m_next; + this.m_contactList = null; + } + }; + Body.prototype.isFixedRotation = function () { + return this.m_fixedRotationFlag; + }; + /** + * Set this body to have fixed rotation. This causes the mass to be reset. + */ + Body.prototype.setFixedRotation = function (flag) { + if (this.m_fixedRotationFlag == flag) { + return; + } + this.m_fixedRotationFlag = !!flag; + this.m_angularVelocity = 0.0; + this.resetMassData(); + }; + /** + * Get the world transform for the body's origin. + */ + Body.prototype.getTransform = function () { + return this.m_xf; + }; + /** + * Set the position of the body's origin and rotation. Manipulating a body's + * transform may cause non-physical behavior. Note: contacts are updated on the + * next call to World.step. + * + * @param position The world position of the body's local origin. + * @param angle The world rotation in radians. + */ + Body.prototype.setTransform = function (position, angle) { + if (this.isWorldLocked() == true) { + return; + } + this.m_xf.setNum(position, angle); + this.m_sweep.setTransform(this.m_xf); + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + f.synchronize(broadPhase, this.m_xf, this.m_xf); + } + }; + Body.prototype.synchronizeTransform = function () { + this.m_sweep.getTransform(this.m_xf, 1); + }; + /** + * Update fixtures in broad-phase. + */ + Body.prototype.synchronizeFixtures = function () { + var xf = Transform.identity(); + this.m_sweep.getTransform(xf, 0); + var broadPhase = this.m_world.m_broadPhase; + for (var f = this.m_fixtureList; f; f = f.m_next) { + f.synchronize(broadPhase, xf, this.m_xf); + } + }; + /** + * Used in TOI. + */ + Body.prototype.advance = function (alpha) { + // Advance to the new safe time. This doesn't sync the broad-phase. + this.m_sweep.advance(alpha); + this.m_sweep.c.setVec2(this.m_sweep.c0); + this.m_sweep.a = this.m_sweep.a0; + this.m_sweep.getTransform(this.m_xf, 1); + }; + /** + * Get the world position for the body's origin. + */ + Body.prototype.getPosition = function () { + return this.m_xf.p; + }; + Body.prototype.setPosition = function (p) { + this.setTransform(p, this.m_sweep.a); + }; + /** + * Get the current world rotation angle in radians. + */ + Body.prototype.getAngle = function () { + return this.m_sweep.a; + }; + Body.prototype.setAngle = function (angle) { + this.setTransform(this.m_xf.p, angle); + }; + /** + * Get the world position of the center of mass. + */ + Body.prototype.getWorldCenter = function () { + return this.m_sweep.c; + }; + /** + * Get the local position of the center of mass. + */ + Body.prototype.getLocalCenter = function () { + return this.m_sweep.localCenter; + }; + /** + * Get the linear velocity of the center of mass. + * + * @return the linear velocity of the center of mass. + */ + Body.prototype.getLinearVelocity = function () { + return this.m_linearVelocity; + }; + /** + * Get the world linear velocity of a world point attached to this body. + * + * @param worldPoint A point in world coordinates. + */ + Body.prototype.getLinearVelocityFromWorldPoint = function (worldPoint) { + var localCenter = Vec2.sub(worldPoint, this.m_sweep.c); + return Vec2.add(this.m_linearVelocity, Vec2.crossNumVec2(this.m_angularVelocity, localCenter)); + }; + /** + * Get the world velocity of a local point. + * + * @param localPoint A point in local coordinates. + */ + Body.prototype.getLinearVelocityFromLocalPoint = function (localPoint) { + return this.getLinearVelocityFromWorldPoint(this.getWorldPoint(localPoint)); + }; + /** + * Set the linear velocity of the center of mass. + * + * @param v The new linear velocity of the center of mass. + */ + Body.prototype.setLinearVelocity = function (v) { + if (this.m_type == STATIC) { + return; + } + if (Vec2.dot(v, v) > 0.0) { + this.setAwake(true); + } + this.m_linearVelocity.setVec2(v); + }; + /** + * Get the angular velocity. + * + * @returns the angular velocity in radians/second. + */ + Body.prototype.getAngularVelocity = function () { + return this.m_angularVelocity; + }; + /** + * Set the angular velocity. + * + * @param omega The new angular velocity in radians/second. + */ + Body.prototype.setAngularVelocity = function (w) { + if (this.m_type == STATIC) { + return; + } + if (w * w > 0.0) { + this.setAwake(true); + } + this.m_angularVelocity = w; + }; + Body.prototype.getLinearDamping = function () { + return this.m_linearDamping; + }; + Body.prototype.setLinearDamping = function (linearDamping) { + this.m_linearDamping = linearDamping; + }; + Body.prototype.getAngularDamping = function () { + return this.m_angularDamping; + }; + Body.prototype.setAngularDamping = function (angularDamping) { + this.m_angularDamping = angularDamping; + }; + Body.prototype.getGravityScale = function () { + return this.m_gravityScale; + }; + /** + * Scale the gravity applied to this body. + */ + Body.prototype.setGravityScale = function (scale) { + this.m_gravityScale = scale; + }; + /** + * Get the total mass of the body. + * + * @returns The mass, usually in kilograms (kg). + */ + Body.prototype.getMass = function () { + return this.m_mass; + }; + /** + * Get the rotational inertia of the body about the local origin. + * + * @return the rotational inertia, usually in kg-m^2. + */ + Body.prototype.getInertia = function () { + return this.m_I + this.m_mass + * Vec2.dot(this.m_sweep.localCenter, this.m_sweep.localCenter); + }; + /** + * Copy the mass data of the body to data. + */ + Body.prototype.getMassData = function (data) { + data.mass = this.m_mass; + data.I = this.getInertia(); + data.center.setVec2(this.m_sweep.localCenter); + }; + /** + * This resets the mass properties to the sum of the mass properties of the + * fixtures. This normally does not need to be called unless you called + * SetMassData to override the mass and you later want to reset the mass. + */ + Body.prototype.resetMassData = function () { + // Compute mass data from shapes. Each shape has its own density. + this.m_mass = 0.0; + this.m_invMass = 0.0; + this.m_I = 0.0; + this.m_invI = 0.0; + this.m_sweep.localCenter.setZero(); + // Static and kinematic bodies have zero mass. + if (this.isStatic() || this.isKinematic()) { + this.m_sweep.c0.setVec2(this.m_xf.p); + this.m_sweep.c.setVec2(this.m_xf.p); + this.m_sweep.a0 = this.m_sweep.a; + return; + } + // Accumulate mass over all fixtures. + var localCenter = Vec2.zero(); + for (var f = this.m_fixtureList; f; f = f.m_next) { + if (f.m_density == 0.0) { + continue; + } + var massData = new MassData(); + f.getMassData(massData); + this.m_mass += massData.mass; + localCenter.addMul(massData.mass, massData.center); + this.m_I += massData.I; + } + // Compute center of mass. + if (this.m_mass > 0.0) { + this.m_invMass = 1.0 / this.m_mass; + localCenter.mul(this.m_invMass); + } + else { + // Force all dynamic bodies to have a positive mass. + this.m_mass = 1.0; + this.m_invMass = 1.0; + } + if (this.m_I > 0.0 && this.m_fixedRotationFlag == false) { + // Center the inertia about the center of mass. + this.m_I -= this.m_mass * Vec2.dot(localCenter, localCenter); + this.m_invI = 1.0 / this.m_I; + } + else { + this.m_I = 0.0; + this.m_invI = 0.0; + } + // Move center of mass. + var oldCenter = Vec2.clone(this.m_sweep.c); + this.m_sweep.setLocalCenter(localCenter, this.m_xf); + // Update center of mass velocity. + this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(this.m_sweep.c, oldCenter))); + }; + /** + * Set the mass properties to override the mass properties of the fixtures. Note + * that this changes the center of mass position. Note that creating or + * destroying fixtures can also alter the mass. This function has no effect if + * the body isn't dynamic. + * + * @param massData The mass properties. + */ + Body.prototype.setMassData = function (massData) { + if (this.isWorldLocked() == true) { + return; + } + if (this.m_type != DYNAMIC) { + return; + } + this.m_invMass = 0.0; + this.m_I = 0.0; + this.m_invI = 0.0; + this.m_mass = massData.mass; + if (this.m_mass <= 0.0) { + this.m_mass = 1.0; + } + this.m_invMass = 1.0 / this.m_mass; + if (massData.I > 0.0 && this.m_fixedRotationFlag == false) { + this.m_I = massData.I - this.m_mass + * Vec2.dot(massData.center, massData.center); + this.m_invI = 1.0 / this.m_I; + } + // Move center of mass. + var oldCenter = Vec2.clone(this.m_sweep.c); + this.m_sweep.setLocalCenter(massData.center, this.m_xf); + // Update center of mass velocity. + this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(this.m_sweep.c, oldCenter))); + }; + /** + * Apply a force at a world point. If the force is not applied at the center of + * mass, it will generate a torque and affect the angular velocity. This wakes + * up the body. + * + * @param force The world force vector, usually in Newtons (N). + * @param point The world position of the point of application. + * @param wake Also wake up the body + */ + Body.prototype.applyForce = function (force, point, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate a force if the body is sleeping. + if (this.m_awakeFlag) { + this.m_force.add(force); + this.m_torque += Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), force); + } + }; + /** + * Apply a force to the center of mass. This wakes up the body. + * + * @param force The world force vector, usually in Newtons (N). + * @param wake Also wake up the body + */ + Body.prototype.applyForceToCenter = function (force, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate a force if the body is sleeping + if (this.m_awakeFlag) { + this.m_force.add(force); + } + }; + /** + * Apply a torque. This affects the angular velocity without affecting the + * linear velocity of the center of mass. This wakes up the body. + * + * @param torque About the z-axis (out of the screen), usually in N-m. + * @param wake Also wake up the body + */ + Body.prototype.applyTorque = function (torque, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate a force if the body is sleeping + if (this.m_awakeFlag) { + this.m_torque += torque; + } + }; + /** + * Apply an impulse at a point. This immediately modifies the velocity. It also + * modifies the angular velocity if the point of application is not at the + * center of mass. This wakes up the body. + * + * @param impulse The world impulse vector, usually in N-seconds or kg-m/s. + * @param point The world position of the point of application. + * @param wake Also wake up the body + */ + Body.prototype.applyLinearImpulse = function (impulse, point, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate velocity if the body is sleeping + if (this.m_awakeFlag) { + this.m_linearVelocity.addMul(this.m_invMass, impulse); + this.m_angularVelocity += this.m_invI * Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), impulse); + } + }; + /** + * Apply an angular impulse. + * + * @param impulse The angular impulse in units of kg*m*m/s + * @param wake Also wake up the body + */ + Body.prototype.applyAngularImpulse = function (impulse, wake) { + if (wake === void 0) { wake = true; } + if (this.m_type != DYNAMIC) { + return; + } + if (wake && this.m_awakeFlag == false) { + this.setAwake(true); + } + // Don't accumulate velocity if the body is sleeping + if (this.m_awakeFlag) { + this.m_angularVelocity += this.m_invI * impulse; + } + }; + /** + * This is used to prevent connected bodies (by joints) from colliding, + * depending on the joint's collideConnected flag. + */ + Body.prototype.shouldCollide = function (that) { + // At least one body should be dynamic. + if (this.m_type != DYNAMIC && that.m_type != DYNAMIC) { + return false; + } + // Does a joint prevent collision? + for (var jn = this.m_jointList; jn; jn = jn.next) { + if (jn.other == that) { + if (jn.joint.m_collideConnected == false) { + return false; } } - // Destroy any contacts associated with the fixture. - var edge = this.m_contactList; - while (edge) { - var c = edge.contact; - edge = edge.next; - var fixtureA = c.getFixtureA(); - var fixtureB = c.getFixtureB(); - if (fixture == fixtureA || fixture == fixtureB) { - // This destroys the contact and removes it from - // this body's contact list. - this.m_world.destroyContact(c); + } + return true; + }; + /** + * @internal Used for deserialize. + */ + Body.prototype._addFixture = function (fixture) { + if (this.isWorldLocked() == true) { + return null; + } + if (this.m_activeFlag) { + var broadPhase = this.m_world.m_broadPhase; + fixture.createProxies(broadPhase, this.m_xf); + } + fixture.m_next = this.m_fixtureList; + this.m_fixtureList = fixture; + // Adjust mass properties if needed. + if (fixture.m_density > 0.0) { + this.resetMassData(); + } + // Let the world know we have a new fixture. This will cause new contacts + // to be created at the beginning of the next time step. + this.m_world.m_newFixture = true; + return fixture; + }; + // tslint:disable-next-line:typedef + Body.prototype.createFixture = function (shape, fixdef) { + if (this.isWorldLocked() == true) { + return null; + } + var fixture = new Fixture(this, shape, fixdef); + this._addFixture(fixture); + return fixture; + }; + /** + * Destroy a fixture. This removes the fixture from the broad-phase and destroys + * all contacts associated with this fixture. This will automatically adjust the + * mass of the body if the body is dynamic and the fixture has positive density. + * All fixtures attached to a body are implicitly destroyed when the body is + * destroyed. + * + * Warning: This function is locked during callbacks. + * + * @param fixture The fixture to be removed. + */ + Body.prototype.destroyFixture = function (fixture) { + if (this.isWorldLocked() == true) { + return; + } + if (this.m_fixtureList === fixture) { + this.m_fixtureList = fixture.m_next; + } + else { + var node = this.m_fixtureList; + while (node != null) { + if (node.m_next === fixture) { + node.m_next = fixture.m_next; + break; } + node = node.m_next; } - if (this.m_activeFlag) { - var broadPhase = this.m_world.m_broadPhase; - fixture.destroyProxies(broadPhase); + } + // Destroy any contacts associated with the fixture. + var edge = this.m_contactList; + while (edge) { + var c = edge.contact; + edge = edge.next; + var fixtureA = c.getFixtureA(); + var fixtureB = c.getFixtureB(); + if (fixture == fixtureA || fixture == fixtureB) { + // This destroys the contact and removes it from + // this body's contact list. + this.m_world.destroyContact(c); } - fixture.m_body = null; - fixture.m_next = null; - this.m_world.publish('remove-fixture', fixture); - // Reset the mass data. - this.resetMassData(); - }; - /** - * Get the corresponding world point of a local point. - */ - Body.prototype.getWorldPoint = function (localPoint) { - return Transform.mulVec2(this.m_xf, localPoint); - }; - /** - * Get the corresponding world vector of a local vector. - */ - Body.prototype.getWorldVector = function (localVector) { - return Rot.mulVec2(this.m_xf.q, localVector); - }; - /** - * Gets the corresponding local point of a world point. - */ - Body.prototype.getLocalPoint = function (worldPoint) { - return Transform.mulTVec2(this.m_xf, worldPoint); - }; + } + if (this.m_activeFlag) { + var broadPhase = this.m_world.m_broadPhase; + fixture.destroyProxies(broadPhase); + } + fixture.m_body = null; + fixture.m_next = null; + this.m_world.publish('remove-fixture', fixture); + // Reset the mass data. + this.resetMassData(); + }; + /** + * Get the corresponding world point of a local point. + */ + Body.prototype.getWorldPoint = function (localPoint) { + return Transform.mulVec2(this.m_xf, localPoint); + }; + /** + * Get the corresponding world vector of a local vector. + */ + Body.prototype.getWorldVector = function (localVector) { + return Rot.mulVec2(this.m_xf.q, localVector); + }; + /** + * Gets the corresponding local point of a world point. + */ + Body.prototype.getLocalPoint = function (worldPoint) { + return Transform.mulTVec2(this.m_xf, worldPoint); + }; + /** + * Gets the corresponding local vector of a world vector. + */ + Body.prototype.getLocalVector = function (worldVector) { + return Rot.mulTVec2(this.m_xf.q, worldVector); + }; + /** + * A static body does not move under simulation and behaves as if it has infinite mass. + * Internally, zero is stored for the mass and the inverse mass. + * Static bodies can be moved manually by the user. + * A static body has zero velocity. + * Static bodies do not collide with other static or kinematic bodies. + */ + Body.STATIC = 'static'; + /** + * A kinematic body moves under simulation according to its velocity. + * Kinematic bodies do not respond to forces. + * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity. + * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass. + * Kinematic bodies do not collide with other kinematic or static bodies. + */ + Body.KINEMATIC = 'kinematic'; + /** + * A dynamic body is fully simulated. + * They can be moved manually by the user, but normally they move according to forces. + * A dynamic body can collide with all body types. + * A dynamic body always has finite, non-zero mass. + * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate. + */ + Body.DYNAMIC = 'dynamic'; + return Body; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A joint edge is used to connect bodies and joints together in a joint graph + * where each body is a node and each joint is an edge. A joint edge belongs to + * a doubly linked list maintained in each attached body. Each joint has two + * joint nodes, one for each attached body. + */ +var JointEdge = /** @class */ (function () { + function JointEdge() { /** - * Gets the corresponding local vector of a world vector. + * provides quick access to the other body attached. */ - Body.prototype.getLocalVector = function (worldVector) { - return Rot.mulTVec2(this.m_xf.q, worldVector); - }; + this.other = null; /** - * A static body does not move under simulation and behaves as if it has infinite mass. - * Internally, zero is stored for the mass and the inverse mass. - * Static bodies can be moved manually by the user. - * A static body has zero velocity. - * Static bodies do not collide with other static or kinematic bodies. + * the joint */ - Body.STATIC = 'static'; + this.joint = null; /** - * A kinematic body moves under simulation according to its velocity. - * Kinematic bodies do not respond to forces. - * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity. - * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass. - * Kinematic bodies do not collide with other kinematic or static bodies. + * prev the previous joint edge in the body's joint list */ - Body.KINEMATIC = 'kinematic'; + this.prev = null; /** - * A dynamic body is fully simulated. - * They can be moved manually by the user, but normally they move according to forces. - * A dynamic body can collide with all body types. - * A dynamic body always has finite, non-zero mass. - * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate. + * the next joint edge in the body's joint list */ - Body.DYNAMIC = 'dynamic'; - return Body; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + this.next = null; + } + return JointEdge; +}()); +/** + * The base joint class. Joints are used to constraint two bodies together in + * various fashions. Some joints also feature limits and motors. + */ +var Joint = /** @class */ (function () { + function Joint(def, bodyA, bodyB) { + /** @internal */ this.m_type = 'unknown-joint'; + /** @internal */ this.m_prev = null; + /** @internal */ this.m_next = null; + /** @internal */ this.m_edgeA = new JointEdge(); + /** @internal */ this.m_edgeB = new JointEdge(); + /** @internal */ this.m_islandFlag = false; + bodyA = 'bodyA' in def ? def.bodyA : bodyA; + bodyB = 'bodyB' in def ? def.bodyB : bodyB; + this.m_bodyA = bodyA; + this.m_bodyB = bodyB; + this.m_collideConnected = !!def.collideConnected; + this.m_userData = def.userData; + } + /** + * Short-cut function to determine if either body is inactive. */ + Joint.prototype.isActive = function () { + return this.m_bodyA.isActive() && this.m_bodyB.isActive(); + }; /** - * A 2-by-2 matrix. Stored in column-major order. + * Get the type of the concrete joint. */ - var Mat22 = /** @class */ (function () { - // tslint:disable-next-line:typedef - function Mat22(a, b, c, d) { - if (typeof a === 'object' && a !== null) { - this.ex = Vec2.clone(a); - this.ey = Vec2.clone(b); - } - else if (typeof a === 'number') { - this.ex = Vec2.neo(a, c); - this.ey = Vec2.neo(b, d); - } - else { - this.ex = Vec2.zero(); - this.ey = Vec2.zero(); + Joint.prototype.getType = function () { + return this.m_type; + }; + /** + * Get the first body attached to this joint. + */ + Joint.prototype.getBodyA = function () { + return this.m_bodyA; + }; + /** + * Get the second body attached to this joint. + */ + Joint.prototype.getBodyB = function () { + return this.m_bodyB; + }; + /** + * Get the next joint the world joint list. + */ + Joint.prototype.getNext = function () { + return this.m_next; + }; + Joint.prototype.getUserData = function () { + return this.m_userData; + }; + Joint.prototype.setUserData = function (data) { + this.m_userData = data; + }; + /** + * Get collide connected. Note: modifying the collide connect flag won't work + * correctly because the flag is only checked when fixture AABBs begin to + * overlap. + */ + Joint.prototype.getCollideConnected = function () { + return this.m_collideConnected; + }; + /** + * Shift the origin for any points stored in world coordinates. + */ + Joint.prototype.shiftOrigin = function (newOrigin) { }; + return Joint; +}()); + +var stats = { + gjkCalls: 0, + gjkIters: 0, + gjkMaxIters: 0, + toiTime: 0, + toiMaxTime: 0, + toiCalls: 0, + toiIters: 0, + toiMaxIters: 0, + toiRootIters: 0, + toiMaxRootIters: 0, + toString: function (newline) { + newline = typeof newline === 'string' ? newline : '\n'; + var string = ""; + // tslint:disable-next-line:no-for-in + for (var name_1 in this) { + if (typeof this[name_1] !== 'function' && typeof this[name_1] !== 'object') { + string += name_1 + ': ' + this[name_1] + newline; } } - /** @internal */ - Mat22.prototype.toString = function () { - return JSON.stringify(this); - }; - Mat22.isValid = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - return Vec2.isValid(obj.ex) && Vec2.isValid(obj.ey); - }; - Mat22.assert = function (o) { - return; - }; - // tslint:disable-next-line:typedef - Mat22.prototype.set = function (a, b, c, d) { - if (typeof a === 'number' && typeof b === 'number' && typeof c === 'number' - && typeof d === 'number') { - this.ex.setNum(a, c); - this.ey.setNum(b, d); - } - else if (typeof a === 'object' && typeof b === 'object') { - this.ex.setVec2(a); - this.ey.setVec2(b); - } - else if (typeof a === 'object') { - this.ex.setVec2(a.ex); - this.ey.setVec2(a.ey); - } - else ; - }; - Mat22.prototype.setIdentity = function () { - this.ex.x = 1.0; - this.ey.x = 0.0; - this.ex.y = 0.0; - this.ey.y = 1.0; - }; - Mat22.prototype.setZero = function () { - this.ex.x = 0.0; - this.ey.x = 0.0; - this.ex.y = 0.0; - this.ey.y = 0.0; - }; - Mat22.prototype.getInverse = function () { - var a = this.ex.x; - var b = this.ey.x; - var c = this.ex.y; - var d = this.ey.y; - var det = a * d - b * c; - if (det !== 0.0) { - det = 1.0 / det; - } - var imx = new Mat22(); - imx.ex.x = det * d; - imx.ey.x = -det * b; - imx.ex.y = -det * c; - imx.ey.y = det * a; - return imx; - }; - /** - * Solve A * x = b, where b is a column vector. This is more efficient than - * computing the inverse in one-shot cases. - */ - Mat22.prototype.solve = function (v) { - var a = this.ex.x; - var b = this.ey.x; - var c = this.ex.y; - var d = this.ey.y; - var det = a * d - b * c; - if (det !== 0.0) { - det = 1.0 / det; - } - var w = Vec2.zero(); - w.x = det * (d * v.x - b * v.y); - w.y = det * (a * v.y - c * v.x); - return w; - }; - // tslint:disable-next-line:typedef - Mat22.mul = function (mx, v) { - if (v && 'x' in v && 'y' in v) { - var x = mx.ex.x * v.x + mx.ey.x * v.y; - var y = mx.ex.y * v.x + mx.ey.y * v.y; - return Vec2.neo(x, y); - } - else if (v && 'ex' in v && 'ey' in v) { // Mat22 - // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey)); - var a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y; - var b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y; - var c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y; - var d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y; - return new Mat22(a, b, c, d); - } - }; - Mat22.mulVec2 = function (mx, v) { - var x = mx.ex.x * v.x + mx.ey.x * v.y; - var y = mx.ex.y * v.x + mx.ey.y * v.y; - return Vec2.neo(x, y); - }; - Mat22.mulMat22 = function (mx, v) { - // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey)); - var a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y; - var b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y; - var c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y; - var d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y; - return new Mat22(a, b, c, d); - }; - // tslint:disable-next-line:typedef - Mat22.mulT = function (mx, v) { - if (v && 'x' in v && 'y' in v) { // Vec2 - return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey)); - } - else if (v && 'ex' in v && 'ey' in v) { // Mat22 - var c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex)); - var c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey)); - return new Mat22(c1, c2); - } - }; - Mat22.mulTVec2 = function (mx, v) { - return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey)); - }; - Mat22.mulTMat22 = function (mx, v) { - var c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex)); - var c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey)); - return new Mat22(c1, c2); - }; - Mat22.abs = function (mx) { - return new Mat22(Vec2.abs(mx.ex), Vec2.abs(mx.ey)); - }; - Mat22.add = function (mx1, mx2) { - return new Mat22(Vec2.add(mx1.ex, mx2.ex), Vec2.add(mx1.ey, mx2.ey)); - }; - return Mat22; - }()); + return string; + } +}; - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var ManifoldType; - (function (ManifoldType) { - ManifoldType[ManifoldType["e_circles"] = 0] = "e_circles"; - ManifoldType[ManifoldType["e_faceA"] = 1] = "e_faceA"; - ManifoldType[ManifoldType["e_faceB"] = 2] = "e_faceB"; - })(ManifoldType || (ManifoldType = {})); - var ContactFeatureType; - (function (ContactFeatureType) { - ContactFeatureType[ContactFeatureType["e_vertex"] = 0] = "e_vertex"; - ContactFeatureType[ContactFeatureType["e_face"] = 1] = "e_face"; - })(ContactFeatureType || (ContactFeatureType = {})); - /** - * This is used for determining the state of contact points. - */ - var PointState; - (function (PointState) { - /** Point does not exist */ - PointState[PointState["nullState"] = 0] = "nullState"; - /** Point was added in the update */ - PointState[PointState["addState"] = 1] = "addState"; - /** Point persisted across the update */ - PointState[PointState["persistState"] = 2] = "persistState"; - /** Point was removed in the update */ - PointState[PointState["removeState"] = 3] = "removeState"; - })(PointState || (PointState = {})); - /** - * Used for computing contact manifolds. - */ - var ClipVertex = /** @class */ (function () { - function ClipVertex() { - this.v = Vec2.zero(); - this.id = new ContactID(); - } - ClipVertex.prototype.set = function (o) { - this.v.setVec2(o.v); - this.id.set(o.id); - }; - return ClipVertex; - }()); - /** - * A manifold for two touching convex shapes. Manifolds are created in `evaluate` - * method of Contact subclasses. - * - * Supported manifold types are e_faceA or e_faceB for clip point versus plane - * with radius and e_circles point versus point with radius. - * - * We store contacts in this way so that position correction can account for - * movement, which is critical for continuous physics. All contact scenarios - * must be expressed in one of these types. This structure is stored across time - * steps, so we keep it small. - * - * @prop type e_circle, e_faceA, e_faceB - * @prop localPoint Usage depends on manifold type:
- * e_circles: the local center of circleA
- * e_faceA: the center of faceA
- * e_faceB: the center of faceB - * @prop localNormal Usage depends on manifold type:
- * e_circles: not used
- * e_faceA: the normal on polygonA
- * e_faceB: the normal on polygonB - * @prop points The points of contact {ManifoldPoint[]} - * @prop pointCount The number of manifold points - */ - var Manifold = /** @class */ (function () { - function Manifold() { - this.localNormal = Vec2.zero(); - this.localPoint = Vec2.zero(); - this.points = [new ManifoldPoint(), new ManifoldPoint()]; - this.pointCount = 0; +var now = function () { + return Date.now(); +}; +var diff = function (time) { + return Date.now() - time; +}; +var Timer = { + now: now, + diff: diff, +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates. + */ +stats.gjkCalls = 0; +stats.gjkIters = 0; +stats.gjkMaxIters = 0; +/** + * Input for Distance. You have to option to use the shape radii in the + * computation. Even + */ +var DistanceInput = /** @class */ (function () { + function DistanceInput() { + this.proxyA = new DistanceProxy(); + this.proxyB = new DistanceProxy(); + this.transformA = null; + this.transformB = null; + this.useRadii = false; + } + return DistanceInput; +}()); +/** + * Output for Distance. + * + * @prop {Vec2} pointA closest point on shapeA + * @prop {Vec2} pointB closest point on shapeB + * @prop distance + * @prop iterations number of GJK iterations used + */ +var DistanceOutput = /** @class */ (function () { + function DistanceOutput() { + this.pointA = Vec2.zero(); + this.pointB = Vec2.zero(); + } + return DistanceOutput; +}()); +/** + * Used to warm start Distance. Set count to zero on first call. + * + * @prop {number} metric length or area + * @prop {array} indexA vertices on shape A + * @prop {array} indexB vertices on shape B + * @prop {number} count + */ +var SimplexCache = /** @class */ (function () { + function SimplexCache() { + this.metric = 0; + this.indexA = []; + this.indexB = []; + this.count = 0; + } + return SimplexCache; +}()); +/** + * Compute the closest points between two shapes. Supports any combination of: + * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On + * the first call set SimplexCache.count to zero. + */ +var Distance = function (output, cache, input) { + ++stats.gjkCalls; + var proxyA = input.proxyA; + var proxyB = input.proxyB; + var xfA = input.transformA; + var xfB = input.transformB; + // Initialize the simplex. + var simplex = new Simplex(); + simplex.readCache(cache, proxyA, xfA, proxyB, xfB); + // Get simplex vertices as an array. + var vertices = simplex.m_v; + var k_maxIters = Settings.maxDistnceIterations; + // These store the vertices of the last simplex so that we + // can check for duplicates and prevent cycling. + var saveA = []; + var saveB = []; // int[3] + var saveCount = 0; + // Main iteration loop. + var iter = 0; + while (iter < k_maxIters) { + // Copy simplex so we can identify duplicates. + saveCount = simplex.m_count; + for (var i = 0; i < saveCount; ++i) { + saveA[i] = vertices[i].indexA; + saveB[i] = vertices[i].indexB; } - /** - * Evaluate the manifold with supplied transforms. This assumes modest motion - * from the original state. This does not change the point count, impulses, etc. - * The radii must come from the shapes that generated the manifold. - */ - Manifold.prototype.getWorldManifold = function (wm, xfA, radiusA, xfB, radiusB) { - if (this.pointCount == 0) { - return; + simplex.solve(); + // If we have 3 points, then the origin is in the corresponding triangle. + if (simplex.m_count === 3) { + break; + } + // Compute closest point. + var p = simplex.getClosestPoint(); + p.lengthSquared(); + // Get search direction. + var d = simplex.getSearchDirection(); + // Ensure the search direction is numerically fit. + if (d.lengthSquared() < math.EPSILON * math.EPSILON) { + // The origin is probably contained by a line segment + // or triangle. Thus the shapes are overlapped. + // We can't return zero here even though there may be overlap. + // In case the simplex is a point, segment, or triangle it is difficult + // to determine if the origin is contained in the CSO or very close to it. + break; + } + // Compute a tentative new simplex vertex using support points. + var vertex = vertices[simplex.m_count]; // SimplexVertex + vertex.indexA = proxyA.getSupport(Rot.mulTVec2(xfA.q, Vec2.neg(d))); + vertex.wA = Transform.mulVec2(xfA, proxyA.getVertex(vertex.indexA)); + vertex.indexB = proxyB.getSupport(Rot.mulTVec2(xfB.q, d)); + vertex.wB = Transform.mulVec2(xfB, proxyB.getVertex(vertex.indexB)); + vertex.w = Vec2.sub(vertex.wB, vertex.wA); + // Iteration count is equated to the number of support point calls. + ++iter; + ++stats.gjkIters; + // Check for duplicate support points. This is the main termination + // criteria. + var duplicate = false; + for (var i = 0; i < saveCount; ++i) { + if (vertex.indexA === saveA[i] && vertex.indexB === saveB[i]) { + duplicate = true; + break; } - wm = wm || new WorldManifold(); - var normal = wm.normal; - var points = wm.points; - var separations = wm.separations; - // TODO: improve - switch (this.type) { - case ManifoldType.e_circles: { - normal = Vec2.neo(1.0, 0.0); - var pointA = Transform.mulVec2(xfA, this.localPoint); - var pointB = Transform.mulVec2(xfB, this.points[0].localPoint); - var dist = Vec2.sub(pointB, pointA); - if (Vec2.lengthSquared(dist) > math.EPSILON * math.EPSILON) { - normal.setVec2(dist); - normal.normalize(); - } - var cA = pointA.clone().addMul(radiusA, normal); - var cB = pointB.clone().addMul(-radiusB, normal); - points[0] = Vec2.mid(cA, cB); - separations[0] = Vec2.dot(Vec2.sub(cB, cA), normal); - points.length = 1; - separations.length = 1; - break; - } - case ManifoldType.e_faceA: { - normal = Rot.mulVec2(xfA.q, this.localNormal); - var planePoint = Transform.mulVec2(xfA, this.localPoint); - for (var i = 0; i < this.pointCount; ++i) { - var clipPoint = Transform.mulVec2(xfB, this.points[i].localPoint); - var cA = Vec2.clone(clipPoint).addMul(radiusA - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal); - var cB = Vec2.clone(clipPoint).subMul(radiusB, normal); - points[i] = Vec2.mid(cA, cB); - separations[i] = Vec2.dot(Vec2.sub(cB, cA), normal); - } - points.length = this.pointCount; - separations.length = this.pointCount; - break; - } - case ManifoldType.e_faceB: { - normal = Rot.mulVec2(xfB.q, this.localNormal); - var planePoint = Transform.mulVec2(xfB, this.localPoint); - for (var i = 0; i < this.pointCount; ++i) { - var clipPoint = Transform.mulVec2(xfA, this.points[i].localPoint); - var cB = Vec2.combine(1, clipPoint, radiusB - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal); - var cA = Vec2.combine(1, clipPoint, -radiusA, normal); - points[i] = Vec2.mid(cA, cB); - separations[i] = Vec2.dot(Vec2.sub(cA, cB), normal); - } - points.length = this.pointCount; - separations.length = this.pointCount; - // Ensure normal points from A to B. - normal.mul(-1); - break; - } + } + // If we found a duplicate support point we must exit to avoid cycling. + if (duplicate) { + break; + } + // New vertex is ok and needed. + ++simplex.m_count; + } + stats.gjkMaxIters = math.max(stats.gjkMaxIters, iter); + // Prepare output. + simplex.getWitnessPoints(output.pointA, output.pointB); + output.distance = Vec2.distance(output.pointA, output.pointB); + output.iterations = iter; + // Cache the simplex. + simplex.writeCache(cache); + // Apply radii if requested. + if (input.useRadii) { + var rA = proxyA.m_radius; + var rB = proxyB.m_radius; + if (output.distance > rA + rB && output.distance > math.EPSILON) { + // Shapes are still no overlapped. + // Move the witness points to the outer surface. + output.distance -= rA + rB; + var normal = Vec2.sub(output.pointB, output.pointA); + normal.normalize(); + output.pointA.addMul(rA, normal); + output.pointB.subMul(rB, normal); + } + else { + // Shapes are overlapped when radii are considered. + // Move the witness points to the middle. + var p = Vec2.mid(output.pointA, output.pointB); + output.pointA.setVec2(p); + output.pointB.setVec2(p); + output.distance = 0.0; + } + } +}; +/** + * A distance proxy is used by the GJK algorithm. It encapsulates any shape. + */ +var DistanceProxy = /** @class */ (function () { + function DistanceProxy() { + this.m_buffer = []; // Vec2[2] + this.m_vertices = []; // Vec2[] + this.m_count = 0; + this.m_radius = 0; + } + /** + * Get the vertex count. + */ + DistanceProxy.prototype.getVertexCount = function () { + return this.m_count; + }; + /** + * Get a vertex by index. Used by Distance. + */ + DistanceProxy.prototype.getVertex = function (index) { + return this.m_vertices[index]; + }; + /** + * Get the supporting vertex index in the given direction. + */ + DistanceProxy.prototype.getSupport = function (d) { + var bestIndex = 0; + var bestValue = Vec2.dot(this.m_vertices[0], d); + for (var i = 0; i < this.m_count; ++i) { + var value = Vec2.dot(this.m_vertices[i], d); + if (value > bestValue) { + bestIndex = i; + bestValue = value; } - wm.normal = normal; - wm.points = points; - wm.separations = separations; - return wm; - }; - Manifold.clipSegmentToLine = clipSegmentToLine; - Manifold.ClipVertex = ClipVertex; - Manifold.getPointStates = getPointStates; - Manifold.PointState = PointState; - return Manifold; - }()); - /** - * A manifold point is a contact point belonging to a contact manifold. It holds - * details related to the geometry and dynamics of the contact points. - * - * This structure is stored across time steps, so we keep it small. - * - * Note: impulses are used for internal caching and may not provide reliable - * contact forces, especially for high speed collisions. - */ - var ManifoldPoint = /** @class */ (function () { - function ManifoldPoint() { - /** - * Usage depends on manifold type. - * e_circles: the local center of circleB, - * e_faceA: the local center of cirlceB or the clip point of polygonB, - * e_faceB: the clip point of polygonA. - */ - this.localPoint = Vec2.zero(); - /** - * The non-penetration impulse - */ - this.normalImpulse = 0; - /** - * The friction impulse - */ - this.tangentImpulse = 0; - /** - * Uniquely identifies a contact point between two shapes to facilatate warm starting - */ - this.id = new ContactID(); - } - return ManifoldPoint; - }()); - /** - * Contact ids to facilitate warm starting. - */ - var ContactID = /** @class */ (function () { - function ContactID() { - this.cf = new ContactFeature(); - } - Object.defineProperty(ContactID.prototype, "key", { - /** - * Used to quickly compare contact ids. - */ - get: function () { - return this.cf.indexA + this.cf.indexB * 4 + this.cf.typeA * 16 + this.cf.typeB * 64; - }, - enumerable: false, - configurable: true - }); - ContactID.prototype.set = function (o) { - // this.key = o.key; - this.cf.set(o.cf); - }; - return ContactID; - }()); + } + return bestIndex; + }; + /** + * Get the supporting vertex in the given direction. + */ + DistanceProxy.prototype.getSupportVertex = function (d) { + return this.m_vertices[this.getSupport(d)]; + }; /** - * The features that intersect to form the contact point. + * Initialize the proxy using the given shape. The shape must remain in scope + * while the proxy is in use. */ - var ContactFeature = /** @class */ (function () { - function ContactFeature() { + DistanceProxy.prototype.set = function (shape, index) { + shape.computeDistanceProxy(this, index); + }; + return DistanceProxy; +}()); +var SimplexVertex = /** @class */ (function () { + function SimplexVertex() { + /** support point in proxyA */ + this.wA = Vec2.zero(); + /** support point in proxyB */ + this.wB = Vec2.zero(); + /** wB - wA; */ + this.w = Vec2.zero(); + } + SimplexVertex.prototype.set = function (v) { + this.indexA = v.indexA; + this.indexB = v.indexB; + this.wA = Vec2.clone(v.wA); + this.wB = Vec2.clone(v.wB); + this.w = Vec2.clone(v.w); + this.a = v.a; + }; + return SimplexVertex; +}()); +var Simplex = /** @class */ (function () { + function Simplex() { + this.m_v1 = new SimplexVertex(); + this.m_v2 = new SimplexVertex(); + this.m_v3 = new SimplexVertex(); + this.m_v = [this.m_v1, this.m_v2, this.m_v3]; + this.m_count; + } + /** @internal */ + Simplex.prototype.toString = function () { + if (this.m_count === 3) { + return ["+" + this.m_count, + this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y, + this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y, + this.m_v3.a, this.m_v3.wA.x, this.m_v3.wA.y, this.m_v3.wB.x, this.m_v3.wB.y + ].toString(); } - ContactFeature.prototype.set = function (o) { - this.indexA = o.indexA; - this.indexB = o.indexB; - this.typeA = o.typeA; - this.typeB = o.typeB; - }; - return ContactFeature; - }()); - /** - * This is used to compute the current state of a contact manifold. - */ - var WorldManifold = /** @class */ (function () { - function WorldManifold() { - /** - * World contact point (point of intersection) - */ - this.points = []; // [maxManifoldPoints] - /** - * A negative value indicates overlap, in meters - */ - this.separations = []; // [maxManifoldPoints] - } - return WorldManifold; - }()); - /** - * Compute the point states given two manifolds. The states pertain to the - * transition from manifold1 to manifold2. So state1 is either persist or remove - * while state2 is either add or persist. - */ - function getPointStates(state1, state2, manifold1, manifold2) { - // state1, state2: PointState[Settings.maxManifoldPoints] - // for (var i = 0; i < Settings.maxManifoldPoints; ++i) { - // state1[i] = PointState.nullState; - // state2[i] = PointState.nullState; - // } - // Detect persists and removes. - for (var i = 0; i < manifold1.pointCount; ++i) { - var id = manifold1.points[i].id; - state1[i] = PointState.removeState; - for (var j = 0; j < manifold2.pointCount; ++j) { - if (manifold2.points[j].id.key == id.key) { - state1[i] = PointState.persistState; - break; - } - } + else if (this.m_count === 2) { + return ["+" + this.m_count, + this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y, + this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y + ].toString(); } - // Detect persists and adds. - for (var i = 0; i < manifold2.pointCount; ++i) { - var id = manifold2.points[i].id; - state2[i] = PointState.addState; - for (var j = 0; j < manifold1.pointCount; ++j) { - if (manifold1.points[j].id.key == id.key) { - state2[i] = PointState.persistState; - break; - } + else if (this.m_count === 1) { + return ["+" + this.m_count, + this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y + ].toString(); + } + else { + return "+" + this.m_count; + } + }; + Simplex.prototype.readCache = function (cache, proxyA, transformA, proxyB, transformB) { + // Copy data from cache. + this.m_count = cache.count; + for (var i = 0; i < this.m_count; ++i) { + var v = this.m_v[i]; + v.indexA = cache.indexA[i]; + v.indexB = cache.indexB[i]; + var wALocal = proxyA.getVertex(v.indexA); + var wBLocal = proxyB.getVertex(v.indexB); + v.wA = Transform.mulVec2(transformA, wALocal); + v.wB = Transform.mulVec2(transformB, wBLocal); + v.w = Vec2.sub(v.wB, v.wA); + v.a = 0.0; + } + // Compute the new simplex metric, if it is substantially different than + // old metric then flush the simplex. + if (this.m_count > 1) { + var metric1 = cache.metric; + var metric2 = this.getMetric(); + if (metric2 < 0.5 * metric1 || 2.0 * metric1 < metric2 + || metric2 < math.EPSILON) { + // Reset the simplex. + this.m_count = 0; } } - } - /** - * Clipping for contact manifolds. Sutherland-Hodgman clipping. - */ - function clipSegmentToLine(vOut, vIn, normal, offset, vertexIndexA) { - // Start with no output points - var numOut = 0; - // Calculate the distance of end points to the line - var distance0 = Vec2.dot(normal, vIn[0].v) - offset; - var distance1 = Vec2.dot(normal, vIn[1].v) - offset; - // If the points are behind the plane - if (distance0 <= 0.0) - vOut[numOut++].set(vIn[0]); - if (distance1 <= 0.0) - vOut[numOut++].set(vIn[1]); - // If the points are on different sides of the plane - if (distance0 * distance1 < 0.0) { - // Find intersection point of edge and plane - var interp = distance0 / (distance0 - distance1); - vOut[numOut].v.setCombine(1 - interp, vIn[0].v, interp, vIn[1].v); - // VertexA is hitting edgeB. - vOut[numOut].id.cf.indexA = vertexIndexA; - vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB; - vOut[numOut].id.cf.typeA = ContactFeatureType.e_vertex; - vOut[numOut].id.cf.typeB = ContactFeatureType.e_face; - ++numOut; - } - return numOut; - } - - var stats = { - gjkCalls: 0, - gjkIters: 0, - gjkMaxIters: 0, - toiTime: 0, - toiMaxTime: 0, - toiCalls: 0, - toiIters: 0, - toiMaxIters: 0, - toiRootIters: 0, - toiMaxRootIters: 0, - toString: function (newline) { - newline = typeof newline === 'string' ? newline : '\n'; - var string = ""; - // tslint:disable-next-line:no-for-in - for (var name_1 in this) { - if (typeof this[name_1] !== 'function' && typeof this[name_1] !== 'object') { - string += name_1 + ': ' + this[name_1] + newline; + // If the cache is empty or invalid... + if (this.m_count === 0) { + var v = this.m_v[0]; + v.indexA = 0; + v.indexB = 0; + var wALocal = proxyA.getVertex(0); + var wBLocal = proxyB.getVertex(0); + v.wA = Transform.mulVec2(transformA, wALocal); + v.wB = Transform.mulVec2(transformB, wBLocal); + v.w = Vec2.sub(v.wB, v.wA); + v.a = 1.0; + this.m_count = 1; + } + }; + Simplex.prototype.writeCache = function (cache) { + cache.metric = this.getMetric(); + cache.count = this.m_count; + for (var i = 0; i < this.m_count; ++i) { + cache.indexA[i] = this.m_v[i].indexA; + cache.indexB[i] = this.m_v[i].indexB; + } + }; + Simplex.prototype.getSearchDirection = function () { + switch (this.m_count) { + case 1: + return Vec2.neg(this.m_v1.w); + case 2: { + var e12 = Vec2.sub(this.m_v2.w, this.m_v1.w); + var sgn = Vec2.crossVec2Vec2(e12, Vec2.neg(this.m_v1.w)); + if (sgn > 0.0) { + // Origin is left of e12. + return Vec2.crossNumVec2(1.0, e12); + } + else { + // Origin is right of e12. + return Vec2.crossVec2Num(e12, 1.0); } } - return string; + default: + return Vec2.zero(); } }; - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates. - */ - stats.gjkCalls = 0; - stats.gjkIters = 0; - stats.gjkMaxIters = 0; - /** - * Input for Distance. You have to option to use the shape radii in the - * computation. Even - */ - var DistanceInput = /** @class */ (function () { - function DistanceInput() { - this.proxyA = new DistanceProxy(); - this.proxyB = new DistanceProxy(); - this.transformA = null; - this.transformB = null; - this.useRadii = false; + Simplex.prototype.getClosestPoint = function () { + switch (this.m_count) { + case 0: + return Vec2.zero(); + case 1: + return Vec2.clone(this.m_v1.w); + case 2: + return Vec2.combine(this.m_v1.a, this.m_v1.w, this.m_v2.a, this.m_v2.w); + case 3: + return Vec2.zero(); + default: + return Vec2.zero(); } - return DistanceInput; - }()); - /** - * Output for Distance. - * - * @prop {Vec2} pointA closest point on shapeA - * @prop {Vec2} pointB closest point on shapeB - * @prop distance - * @prop iterations number of GJK iterations used - */ - var DistanceOutput = /** @class */ (function () { - function DistanceOutput() { - this.pointA = Vec2.zero(); - this.pointB = Vec2.zero(); + }; + Simplex.prototype.getWitnessPoints = function (pA, pB) { + switch (this.m_count) { + case 0: + break; + case 1: + pA.setVec2(this.m_v1.wA); + pB.setVec2(this.m_v1.wB); + break; + case 2: + pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA); + pB.setCombine(this.m_v1.a, this.m_v1.wB, this.m_v2.a, this.m_v2.wB); + break; + case 3: + pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA); + pA.addMul(this.m_v3.a, this.m_v3.wA); + pB.setVec2(pA); + break; } - return DistanceOutput; - }()); - /** - * Used to warm start Distance. Set count to zero on first call. - * - * @prop {number} metric length or area - * @prop {array} indexA vertices on shape A - * @prop {array} indexB vertices on shape B - * @prop {number} count - */ - var SimplexCache = /** @class */ (function () { - function SimplexCache() { - this.metric = 0; - this.indexA = []; - this.indexB = []; - this.count = 0; - } - return SimplexCache; - }()); - /** - * Compute the closest points between two shapes. Supports any combination of: - * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On - * the first call set SimplexCache.count to zero. - */ - function Distance(output, cache, input) { - ++stats.gjkCalls; - var proxyA = input.proxyA; - var proxyB = input.proxyB; - var xfA = input.transformA; - var xfB = input.transformB; - // Initialize the simplex. - var simplex = new Simplex(); - simplex.readCache(cache, proxyA, xfA, proxyB, xfB); - // Get simplex vertices as an array. - var vertices = simplex.m_v; - var k_maxIters = Settings.maxDistnceIterations; - // These store the vertices of the last simplex so that we - // can check for duplicates and prevent cycling. - var saveA = []; - var saveB = []; // int[3] - var saveCount = 0; - // Main iteration loop. - var iter = 0; - while (iter < k_maxIters) { - // Copy simplex so we can identify duplicates. - saveCount = simplex.m_count; - for (var i = 0; i < saveCount; ++i) { - saveA[i] = vertices[i].indexA; - saveB[i] = vertices[i].indexB; - } - simplex.solve(); - // If we have 3 points, then the origin is in the corresponding triangle. - if (simplex.m_count === 3) { + }; + Simplex.prototype.getMetric = function () { + switch (this.m_count) { + case 0: + return 0.0; + case 1: + return 0.0; + case 2: + return Vec2.distance(this.m_v1.w, this.m_v2.w); + case 3: + return Vec2.crossVec2Vec2(Vec2.sub(this.m_v2.w, this.m_v1.w), Vec2.sub(this.m_v3.w, this.m_v1.w)); + default: + return 0.0; + } + }; + Simplex.prototype.solve = function () { + switch (this.m_count) { + case 1: break; - } - // Compute closest point. - var p = simplex.getClosestPoint(); - p.lengthSquared(); - // Get search direction. - var d = simplex.getSearchDirection(); - // Ensure the search direction is numerically fit. - if (d.lengthSquared() < math.EPSILON * math.EPSILON) { - // The origin is probably contained by a line segment - // or triangle. Thus the shapes are overlapped. - // We can't return zero here even though there may be overlap. - // In case the simplex is a point, segment, or triangle it is difficult - // to determine if the origin is contained in the CSO or very close to it. + case 2: + this.solve2(); break; - } - // Compute a tentative new simplex vertex using support points. - var vertex = vertices[simplex.m_count]; // SimplexVertex - vertex.indexA = proxyA.getSupport(Rot.mulTVec2(xfA.q, Vec2.neg(d))); - vertex.wA = Transform.mulVec2(xfA, proxyA.getVertex(vertex.indexA)); - vertex.indexB = proxyB.getSupport(Rot.mulTVec2(xfB.q, d)); - vertex.wB = Transform.mulVec2(xfB, proxyB.getVertex(vertex.indexB)); - vertex.w = Vec2.sub(vertex.wB, vertex.wA); - // Iteration count is equated to the number of support point calls. - ++iter; - ++stats.gjkIters; - // Check for duplicate support points. This is the main termination - // criteria. - var duplicate = false; - for (var i = 0; i < saveCount; ++i) { - if (vertex.indexA === saveA[i] && vertex.indexB === saveB[i]) { - duplicate = true; - break; - } - } - // If we found a duplicate support point we must exit to avoid cycling. - if (duplicate) { + case 3: + this.solve3(); break; - } - // New vertex is ok and needed. - ++simplex.m_count; - } - stats.gjkMaxIters = math.max(stats.gjkMaxIters, iter); - // Prepare output. - simplex.getWitnessPoints(output.pointA, output.pointB); - output.distance = Vec2.distance(output.pointA, output.pointB); - output.iterations = iter; - // Cache the simplex. - simplex.writeCache(cache); - // Apply radii if requested. - if (input.useRadii) { - var rA = proxyA.m_radius; - var rB = proxyB.m_radius; - if (output.distance > rA + rB && output.distance > math.EPSILON) { - // Shapes are still no overlapped. - // Move the witness points to the outer surface. - output.distance -= rA + rB; - var normal = Vec2.sub(output.pointB, output.pointA); - normal.normalize(); - output.pointA.addMul(rA, normal); - output.pointB.subMul(rB, normal); - } - else { - // Shapes are overlapped when radii are considered. - // Move the witness points to the middle. - var p = Vec2.mid(output.pointA, output.pointB); - output.pointA.setVec2(p); - output.pointB.setVec2(p); - output.distance = 0.0; - } } + }; + // Solve a line segment using barycentric coordinates. + // + // p = a1 * w1 + a2 * w2 + // a1 + a2 = 1 + // + // The vector from the origin to the closest point on the line is + // perpendicular to the line. + // e12 = w2 - w1 + // dot(p, e) = 0 + // a1 * dot(w1, e) + a2 * dot(w2, e) = 0 + // + // 2-by-2 linear system + // [1 1 ][a1] = [1] + // [w1.e12 w2.e12][a2] = [0] + // + // Define + // d12_1 = dot(w2, e12) + // d12_2 = -dot(w1, e12) + // d12 = d12_1 + d12_2 + // + // Solution + // a1 = d12_1 / d12 + // a2 = d12_2 / d12 + Simplex.prototype.solve2 = function () { + var w1 = this.m_v1.w; + var w2 = this.m_v2.w; + var e12 = Vec2.sub(w2, w1); + // w1 region + var d12_2 = -Vec2.dot(w1, e12); + if (d12_2 <= 0.0) { + // a2 <= 0, so we clamp it to 0 + this.m_v1.a = 1.0; + this.m_count = 1; + return; + } + // w2 region + var d12_1 = Vec2.dot(w2, e12); + if (d12_1 <= 0.0) { + // a1 <= 0, so we clamp it to 0 + this.m_v2.a = 1.0; + this.m_count = 1; + this.m_v1.set(this.m_v2); + return; + } + // Must be in e12 region. + var inv_d12 = 1.0 / (d12_1 + d12_2); + this.m_v1.a = d12_1 * inv_d12; + this.m_v2.a = d12_2 * inv_d12; + this.m_count = 2; + }; + // Possible regions: + // - points[2] + // - edge points[0]-points[2] + // - edge points[1]-points[2] + // - inside the triangle + Simplex.prototype.solve3 = function () { + var w1 = this.m_v1.w; + var w2 = this.m_v2.w; + var w3 = this.m_v3.w; + // Edge12 + // [1 1 ][a1] = [1] + // [w1.e12 w2.e12][a2] = [0] + // a3 = 0 + var e12 = Vec2.sub(w2, w1); + var w1e12 = Vec2.dot(w1, e12); + var w2e12 = Vec2.dot(w2, e12); + var d12_1 = w2e12; + var d12_2 = -w1e12; + // Edge13 + // [1 1 ][a1] = [1] + // [w1.e13 w3.e13][a3] = [0] + // a2 = 0 + var e13 = Vec2.sub(w3, w1); + var w1e13 = Vec2.dot(w1, e13); + var w3e13 = Vec2.dot(w3, e13); + var d13_1 = w3e13; + var d13_2 = -w1e13; + // Edge23 + // [1 1 ][a2] = [1] + // [w2.e23 w3.e23][a3] = [0] + // a1 = 0 + var e23 = Vec2.sub(w3, w2); + var w2e23 = Vec2.dot(w2, e23); + var w3e23 = Vec2.dot(w3, e23); + var d23_1 = w3e23; + var d23_2 = -w2e23; + // Triangle123 + var n123 = Vec2.crossVec2Vec2(e12, e13); + var d123_1 = n123 * Vec2.crossVec2Vec2(w2, w3); + var d123_2 = n123 * Vec2.crossVec2Vec2(w3, w1); + var d123_3 = n123 * Vec2.crossVec2Vec2(w1, w2); + // w1 region + if (d12_2 <= 0.0 && d13_2 <= 0.0) { + this.m_v1.a = 1.0; + this.m_count = 1; + return; + } + // e12 + if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) { + var inv_d12 = 1.0 / (d12_1 + d12_2); + this.m_v1.a = d12_1 * inv_d12; + this.m_v2.a = d12_2 * inv_d12; + this.m_count = 2; + return; + } + // e13 + if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) { + var inv_d13 = 1.0 / (d13_1 + d13_2); + this.m_v1.a = d13_1 * inv_d13; + this.m_v3.a = d13_2 * inv_d13; + this.m_count = 2; + this.m_v2.set(this.m_v3); + return; + } + // w2 region + if (d12_1 <= 0.0 && d23_2 <= 0.0) { + this.m_v2.a = 1.0; + this.m_count = 1; + this.m_v1.set(this.m_v2); + return; + } + // w3 region + if (d13_1 <= 0.0 && d23_1 <= 0.0) { + this.m_v3.a = 1.0; + this.m_count = 1; + this.m_v1.set(this.m_v3); + return; + } + // e23 + if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) { + var inv_d23 = 1.0 / (d23_1 + d23_2); + this.m_v2.a = d23_1 * inv_d23; + this.m_v3.a = d23_2 * inv_d23; + this.m_count = 2; + this.m_v1.set(this.m_v3); + return; + } + // Must be in triangle123 + var inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3); + this.m_v1.a = d123_1 * inv_d123; + this.m_v2.a = d123_2 * inv_d123; + this.m_v3.a = d123_3 * inv_d123; + this.m_count = 3; + }; + return Simplex; +}()); +/** + * Determine if two generic shapes overlap. + */ +var testOverlap = function (shapeA, indexA, shapeB, indexB, xfA, xfB) { + var input = new DistanceInput(); + input.proxyA.set(shapeA, indexA); + input.proxyB.set(shapeB, indexB); + input.transformA = xfA; + input.transformB = xfB; + input.useRadii = true; + var cache = new SimplexCache(); + var output = new DistanceOutput(); + Distance(output, cache, input); + return output.distance < 10.0 * math.EPSILON; +}; +// legacy exports +Distance.testOverlap = testOverlap; +Distance.Input = DistanceInput; +Distance.Output = DistanceOutput; +Distance.Proxy = DistanceProxy; +Distance.Cache = SimplexCache; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * Input parameters for TimeOfImpact. + */ +var TOIInput = /** @class */ (function () { + function TOIInput() { + this.proxyA = new DistanceProxy(); + this.proxyB = new DistanceProxy(); + this.sweepA = new Sweep(); + this.sweepB = new Sweep(); } - /** - * A distance proxy is used by the GJK algorithm. It encapsulates any shape. - */ - var DistanceProxy = /** @class */ (function () { - function DistanceProxy() { - this.m_buffer = []; // Vec2[2] - this.m_vertices = []; // Vec2[] - this.m_count = 0; - this.m_radius = 0; + return TOIInput; +}()); +var TOIOutputState; +(function (TOIOutputState) { + TOIOutputState[TOIOutputState["e_unknown"] = 0] = "e_unknown"; + TOIOutputState[TOIOutputState["e_failed"] = 1] = "e_failed"; + TOIOutputState[TOIOutputState["e_overlapped"] = 2] = "e_overlapped"; + TOIOutputState[TOIOutputState["e_touching"] = 3] = "e_touching"; + TOIOutputState[TOIOutputState["e_separated"] = 4] = "e_separated"; +})(TOIOutputState || (TOIOutputState = {})); +/** + * Output parameters for TimeOfImpact. + */ +var TOIOutput = /** @class */ (function () { + function TOIOutput() { + } + return TOIOutput; +}()); +stats.toiTime = 0; +stats.toiMaxTime = 0; +stats.toiCalls = 0; +stats.toiIters = 0; +stats.toiMaxIters = 0; +stats.toiRootIters = 0; +stats.toiMaxRootIters = 0; +/** + * Compute the upper bound on time before two shapes penetrate. Time is + * represented as a fraction between [0,tMax]. This uses a swept separating axis + * and may miss some intermediate, non-tunneling collision. If you change the + * time interval, you should call this function again. + * + * Note: use Distance to compute the contact point and normal at the time of + * impact. + * + * CCD via the local separating axis method. This seeks progression by computing + * the largest time at which separation is maintained. + */ +var TimeOfImpact = function (output, input) { + var timer = Timer.now(); + ++stats.toiCalls; + output.state = TOIOutputState.e_unknown; + output.t = input.tMax; + var proxyA = input.proxyA; // DistanceProxy + var proxyB = input.proxyB; // DistanceProxy + var sweepA = input.sweepA; // Sweep + var sweepB = input.sweepB; // Sweep + // Large rotations can make the root finder fail, so we normalize the + // sweep angles. + sweepA.normalize(); + sweepB.normalize(); + var tMax = input.tMax; + var totalRadius = proxyA.m_radius + proxyB.m_radius; + var target = math.max(Settings.linearSlop, totalRadius - 3.0 * Settings.linearSlop); + var tolerance = 0.25 * Settings.linearSlop; + var t1 = 0.0; + var k_maxIterations = Settings.maxTOIIterations; + var iter = 0; + // Prepare input for distance query. + var cache = new SimplexCache(); + var distanceInput = new DistanceInput(); + distanceInput.proxyA = input.proxyA; + distanceInput.proxyB = input.proxyB; + distanceInput.useRadii = false; + // The outer loop progressively attempts to compute new separating axes. + // This loop terminates when an axis is repeated (no progress is made). + while (true) { + var xfA = Transform.identity(); + var xfB = Transform.identity(); + sweepA.getTransform(xfA, t1); + sweepB.getTransform(xfB, t1); + // Get the distance between shapes. We can also use the results + // to get a separating axis. + distanceInput.transformA = xfA; + distanceInput.transformB = xfB; + var distanceOutput = new DistanceOutput(); + Distance(distanceOutput, cache, distanceInput); + // If the shapes are overlapped, we give up on continuous collision. + if (distanceOutput.distance <= 0.0) { + // Failure! + output.state = TOIOutputState.e_overlapped; + output.t = 0.0; + break; } - /** - * Get the vertex count. - */ - DistanceProxy.prototype.getVertexCount = function () { - return this.m_count; - }; - /** - * Get a vertex by index. Used by Distance. - */ - DistanceProxy.prototype.getVertex = function (index) { - return this.m_vertices[index]; - }; - /** - * Get the supporting vertex index in the given direction. - */ - DistanceProxy.prototype.getSupport = function (d) { - var bestIndex = 0; - var bestValue = Vec2.dot(this.m_vertices[0], d); - for (var i = 0; i < this.m_count; ++i) { - var value = Vec2.dot(this.m_vertices[i], d); - if (value > bestValue) { - bestIndex = i; - bestValue = value; - } - } - return bestIndex; - }; - /** - * Get the supporting vertex in the given direction. - */ - DistanceProxy.prototype.getSupportVertex = function (d) { - return this.m_vertices[this.getSupport(d)]; - }; - /** - * Initialize the proxy using the given shape. The shape must remain in scope - * while the proxy is in use. - */ - DistanceProxy.prototype.set = function (shape, index) { - shape.computeDistanceProxy(this, index); - }; - return DistanceProxy; - }()); - var SimplexVertex = /** @class */ (function () { - function SimplexVertex() { - /** support point in proxyA */ - this.wA = Vec2.zero(); - /** support point in proxyB */ - this.wB = Vec2.zero(); - /** wB - wA; */ - this.w = Vec2.zero(); - } - SimplexVertex.prototype.set = function (v) { - this.indexA = v.indexA; - this.indexB = v.indexB; - this.wA = Vec2.clone(v.wA); - this.wB = Vec2.clone(v.wB); - this.w = Vec2.clone(v.w); - this.a = v.a; - }; - return SimplexVertex; - }()); - var Simplex = /** @class */ (function () { - function Simplex() { - this.m_v1 = new SimplexVertex(); - this.m_v2 = new SimplexVertex(); - this.m_v3 = new SimplexVertex(); - this.m_v = [this.m_v1, this.m_v2, this.m_v3]; - this.m_count; + if (distanceOutput.distance < target + tolerance) { + // Victory! + output.state = TOIOutputState.e_touching; + output.t = t1; + break; } - /** @internal */ - Simplex.prototype.toString = function () { - if (this.m_count === 3) { - return ["+" + this.m_count, - this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y, - this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y, - this.m_v3.a, this.m_v3.wA.x, this.m_v3.wA.y, this.m_v3.wB.x, this.m_v3.wB.y - ].toString(); - } - else if (this.m_count === 2) { - return ["+" + this.m_count, - this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y, - this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y - ].toString(); - } - else if (this.m_count === 1) { - return ["+" + this.m_count, - this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y - ].toString(); - } - else { - return "+" + this.m_count; + // Initialize the separating axis. + var fcn = new SeparationFunction(); + fcn.initialize(cache, proxyA, sweepA, proxyB, sweepB, t1); + // if (false) { + // // Dump the curve seen by the root finder + // const N = 100; + // const dx = 1.0 / N; + // const xs = []; // [ N + 1 ]; + // const fs = []; // [ N + 1 ]; + // const x = 0.0; + // for (const i = 0; i <= N; ++i) { + // sweepA.getTransform(xfA, x); + // sweepB.getTransform(xfB, x); + // const f = fcn.evaluate(xfA, xfB) - target; + // printf("%g %g\n", x, f); + // xs[i] = x; + // fs[i] = f; + // x += dx; + // } + // } + // Compute the TOI on the separating axis. We do this by successively + // resolving the deepest point. This loop is bounded by the number of + // vertices. + var done = false; + var t2 = tMax; + var pushBackIter = 0; + while (true) { + // Find the deepest point at t2. Store the witness point indices. + var s2 = fcn.findMinSeparation(t2); + // const indexA = fcn.indexA; + // const indexB = fcn.indexB; + // Is the final configuration separated? + if (s2 > target + tolerance) { + // Victory! + output.state = TOIOutputState.e_separated; + output.t = tMax; + done = true; + break; } - }; - Simplex.prototype.readCache = function (cache, proxyA, transformA, proxyB, transformB) { - // Copy data from cache. - this.m_count = cache.count; - for (var i = 0; i < this.m_count; ++i) { - var v = this.m_v[i]; - v.indexA = cache.indexA[i]; - v.indexB = cache.indexB[i]; - var wALocal = proxyA.getVertex(v.indexA); - var wBLocal = proxyB.getVertex(v.indexB); - v.wA = Transform.mulVec2(transformA, wALocal); - v.wB = Transform.mulVec2(transformB, wBLocal); - v.w = Vec2.sub(v.wB, v.wA); - v.a = 0.0; - } - // Compute the new simplex metric, if it is substantially different than - // old metric then flush the simplex. - if (this.m_count > 1) { - var metric1 = cache.metric; - var metric2 = this.getMetric(); - if (metric2 < 0.5 * metric1 || 2.0 * metric1 < metric2 - || metric2 < math.EPSILON) { - // Reset the simplex. - this.m_count = 0; - } + // Has the separation reached tolerance? + if (s2 > target - tolerance) { + // Advance the sweeps + t1 = t2; + break; } - // If the cache is empty or invalid... - if (this.m_count === 0) { - var v = this.m_v[0]; - v.indexA = 0; - v.indexB = 0; - var wALocal = proxyA.getVertex(0); - var wBLocal = proxyB.getVertex(0); - v.wA = Transform.mulVec2(transformA, wALocal); - v.wB = Transform.mulVec2(transformB, wBLocal); - v.w = Vec2.sub(v.wB, v.wA); - v.a = 1.0; - this.m_count = 1; + // Compute the initial separation of the witness points. + var s1 = fcn.evaluate(t1); + // const indexA = fcn.indexA; + // const indexB = fcn.indexB; + // Check for initial overlap. This might happen if the root finder + // runs out of iterations. + if (s1 < target - tolerance) { + output.state = TOIOutputState.e_failed; + output.t = t1; + done = true; + break; } - }; - Simplex.prototype.writeCache = function (cache) { - cache.metric = this.getMetric(); - cache.count = this.m_count; - for (var i = 0; i < this.m_count; ++i) { - cache.indexA[i] = this.m_v[i].indexA; - cache.indexB[i] = this.m_v[i].indexB; + // Check for touching + if (s1 <= target + tolerance) { + // Victory! t1 should hold the TOI (could be 0.0). + output.state = TOIOutputState.e_touching; + output.t = t1; + done = true; + break; } - }; - Simplex.prototype.getSearchDirection = function () { - switch (this.m_count) { - case 1: - return Vec2.neg(this.m_v1.w); - case 2: { - var e12 = Vec2.sub(this.m_v2.w, this.m_v1.w); - var sgn = Vec2.crossVec2Vec2(e12, Vec2.neg(this.m_v1.w)); - if (sgn > 0.0) { - // Origin is left of e12. - return Vec2.crossNumVec2(1.0, e12); - } - else { - // Origin is right of e12. - return Vec2.crossVec2Num(e12, 1.0); - } + // Compute 1D root of: f(x) - target = 0 + var rootIterCount = 0; + var a1 = t1; + var a2 = t2; + while (true) { + // Use a mix of the secant rule and bisection. + var t = void 0; + if (rootIterCount & 1) { + // Secant rule to improve convergence. + t = a1 + (target - s1) * (a2 - a1) / (s2 - s1); } - default: - return Vec2.zero(); - } - }; - Simplex.prototype.getClosestPoint = function () { - switch (this.m_count) { - case 0: - return Vec2.zero(); - case 1: - return Vec2.clone(this.m_v1.w); - case 2: - return Vec2.combine(this.m_v1.a, this.m_v1.w, this.m_v2.a, this.m_v2.w); - case 3: - return Vec2.zero(); - default: - return Vec2.zero(); - } - }; - Simplex.prototype.getWitnessPoints = function (pA, pB) { - switch (this.m_count) { - case 0: - break; - case 1: - pA.setVec2(this.m_v1.wA); - pB.setVec2(this.m_v1.wB); - break; - case 2: - pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA); - pB.setCombine(this.m_v1.a, this.m_v1.wB, this.m_v2.a, this.m_v2.wB); - break; - case 3: - pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA); - pA.addMul(this.m_v3.a, this.m_v3.wA); - pB.setVec2(pA); - break; - } - }; - Simplex.prototype.getMetric = function () { - switch (this.m_count) { - case 0: - return 0.0; - case 1: - return 0.0; - case 2: - return Vec2.distance(this.m_v1.w, this.m_v2.w); - case 3: - return Vec2.crossVec2Vec2(Vec2.sub(this.m_v2.w, this.m_v1.w), Vec2.sub(this.m_v3.w, this.m_v1.w)); - default: - return 0.0; - } - }; - Simplex.prototype.solve = function () { - switch (this.m_count) { - case 1: - break; - case 2: - this.solve2(); + else { + // Bisection to guarantee progress. + t = 0.5 * (a1 + a2); + } + ++rootIterCount; + ++stats.toiRootIters; + var s = fcn.evaluate(t); + fcn.indexA; + fcn.indexB; + if (math.abs(s - target) < tolerance) { + // t2 holds a tentative value for t1 + t2 = t; break; - case 3: - this.solve3(); + } + // Ensure we continue to bracket the root. + if (s > target) { + a1 = t; + s1 = s; + } + else { + a2 = t; + s2 = s; + } + if (rootIterCount === 50) { break; + } } - }; - // Solve a line segment using barycentric coordinates. - // - // p = a1 * w1 + a2 * w2 - // a1 + a2 = 1 - // - // The vector from the origin to the closest point on the line is - // perpendicular to the line. - // e12 = w2 - w1 - // dot(p, e) = 0 - // a1 * dot(w1, e) + a2 * dot(w2, e) = 0 - // - // 2-by-2 linear system - // [1 1 ][a1] = [1] - // [w1.e12 w2.e12][a2] = [0] - // - // Define - // d12_1 = dot(w2, e12) - // d12_2 = -dot(w1, e12) - // d12 = d12_1 + d12_2 - // - // Solution - // a1 = d12_1 / d12 - // a2 = d12_2 / d12 - Simplex.prototype.solve2 = function () { - var w1 = this.m_v1.w; - var w2 = this.m_v2.w; - var e12 = Vec2.sub(w2, w1); - // w1 region - var d12_2 = -Vec2.dot(w1, e12); - if (d12_2 <= 0.0) { - // a2 <= 0, so we clamp it to 0 - this.m_v1.a = 1.0; - this.m_count = 1; - return; - } - // w2 region - var d12_1 = Vec2.dot(w2, e12); - if (d12_1 <= 0.0) { - // a1 <= 0, so we clamp it to 0 - this.m_v2.a = 1.0; - this.m_count = 1; - this.m_v1.set(this.m_v2); - return; - } - // Must be in e12 region. - var inv_d12 = 1.0 / (d12_1 + d12_2); - this.m_v1.a = d12_1 * inv_d12; - this.m_v2.a = d12_2 * inv_d12; - this.m_count = 2; - }; - // Possible regions: - // - points[2] - // - edge points[0]-points[2] - // - edge points[1]-points[2] - // - inside the triangle - Simplex.prototype.solve3 = function () { - var w1 = this.m_v1.w; - var w2 = this.m_v2.w; - var w3 = this.m_v3.w; - // Edge12 - // [1 1 ][a1] = [1] - // [w1.e12 w2.e12][a2] = [0] - // a3 = 0 - var e12 = Vec2.sub(w2, w1); - var w1e12 = Vec2.dot(w1, e12); - var w2e12 = Vec2.dot(w2, e12); - var d12_1 = w2e12; - var d12_2 = -w1e12; - // Edge13 - // [1 1 ][a1] = [1] - // [w1.e13 w3.e13][a3] = [0] - // a2 = 0 - var e13 = Vec2.sub(w3, w1); - var w1e13 = Vec2.dot(w1, e13); - var w3e13 = Vec2.dot(w3, e13); - var d13_1 = w3e13; - var d13_2 = -w1e13; - // Edge23 - // [1 1 ][a2] = [1] - // [w2.e23 w3.e23][a3] = [0] - // a1 = 0 - var e23 = Vec2.sub(w3, w2); - var w2e23 = Vec2.dot(w2, e23); - var w3e23 = Vec2.dot(w3, e23); - var d23_1 = w3e23; - var d23_2 = -w2e23; - // Triangle123 - var n123 = Vec2.crossVec2Vec2(e12, e13); - var d123_1 = n123 * Vec2.crossVec2Vec2(w2, w3); - var d123_2 = n123 * Vec2.crossVec2Vec2(w3, w1); - var d123_3 = n123 * Vec2.crossVec2Vec2(w1, w2); - // w1 region - if (d12_2 <= 0.0 && d13_2 <= 0.0) { - this.m_v1.a = 1.0; - this.m_count = 1; - return; - } - // e12 - if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) { - var inv_d12 = 1.0 / (d12_1 + d12_2); - this.m_v1.a = d12_1 * inv_d12; - this.m_v2.a = d12_2 * inv_d12; - this.m_count = 2; - return; - } - // e13 - if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) { - var inv_d13 = 1.0 / (d13_1 + d13_2); - this.m_v1.a = d13_1 * inv_d13; - this.m_v3.a = d13_2 * inv_d13; - this.m_count = 2; - this.m_v2.set(this.m_v3); - return; + stats.toiMaxRootIters = math.max(stats.toiMaxRootIters, rootIterCount); + ++pushBackIter; + if (pushBackIter === Settings.maxPolygonVertices) { + break; } - // w2 region - if (d12_1 <= 0.0 && d23_2 <= 0.0) { - this.m_v2.a = 1.0; - this.m_count = 1; - this.m_v1.set(this.m_v2); - return; + } + ++iter; + ++stats.toiIters; + if (done) { + break; + } + if (iter === k_maxIterations) { + // Root finder got stuck. Semi-victory. + output.state = TOIOutputState.e_failed; + output.t = t1; + break; + } + } + stats.toiMaxIters = math.max(stats.toiMaxIters, iter); + var time = Timer.diff(timer); + stats.toiMaxTime = math.max(stats.toiMaxTime, time); + stats.toiTime += time; +}; +var SeparationFunctionType; +(function (SeparationFunctionType) { + SeparationFunctionType[SeparationFunctionType["e_points"] = 1] = "e_points"; + SeparationFunctionType[SeparationFunctionType["e_faceA"] = 2] = "e_faceA"; + SeparationFunctionType[SeparationFunctionType["e_faceB"] = 3] = "e_faceB"; +})(SeparationFunctionType || (SeparationFunctionType = {})); +var SeparationFunction = /** @class */ (function () { + function SeparationFunction() { + this.m_proxyA = new DistanceProxy(); + this.m_proxyB = new DistanceProxy(); + this.m_localPoint = Vec2.zero(); + this.m_axis = Vec2.zero(); + } + // TODO_ERIN might not need to return the separation + SeparationFunction.prototype.initialize = function (cache, proxyA, sweepA, proxyB, sweepB, t1) { + this.m_proxyA = proxyA; + this.m_proxyB = proxyB; + var count = cache.count; + this.m_sweepA = sweepA; + this.m_sweepB = sweepB; + var xfA = Transform.identity(); + var xfB = Transform.identity(); + this.m_sweepA.getTransform(xfA, t1); + this.m_sweepB.getTransform(xfB, t1); + if (count === 1) { + this.m_type = SeparationFunctionType.e_points; + var localPointA = this.m_proxyA.getVertex(cache.indexA[0]); + var localPointB = this.m_proxyB.getVertex(cache.indexB[0]); + var pointA = Transform.mulVec2(xfA, localPointA); + var pointB = Transform.mulVec2(xfB, localPointB); + this.m_axis.setCombine(1, pointB, -1, pointA); + var s = this.m_axis.normalize(); + return s; + } + else if (cache.indexA[0] === cache.indexA[1]) { + // Two points on B and one on A. + this.m_type = SeparationFunctionType.e_faceB; + var localPointB1 = proxyB.getVertex(cache.indexB[0]); + var localPointB2 = proxyB.getVertex(cache.indexB[1]); + this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointB2, localPointB1), 1.0); + this.m_axis.normalize(); + var normal = Rot.mulVec2(xfB.q, this.m_axis); + this.m_localPoint = Vec2.mid(localPointB1, localPointB2); + var pointB = Transform.mulVec2(xfB, this.m_localPoint); + var localPointA = proxyA.getVertex(cache.indexA[0]); + var pointA = Transform.mulVec2(xfA, localPointA); + var s = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal); + if (s < 0.0) { + this.m_axis = Vec2.neg(this.m_axis); + s = -s; + } + return s; + } + else { + // Two points on A and one or two points on B. + this.m_type = SeparationFunctionType.e_faceA; + var localPointA1 = this.m_proxyA.getVertex(cache.indexA[0]); + var localPointA2 = this.m_proxyA.getVertex(cache.indexA[1]); + this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointA2, localPointA1), 1.0); + this.m_axis.normalize(); + var normal = Rot.mulVec2(xfA.q, this.m_axis); + this.m_localPoint = Vec2.mid(localPointA1, localPointA2); + var pointA = Transform.mulVec2(xfA, this.m_localPoint); + var localPointB = this.m_proxyB.getVertex(cache.indexB[0]); + var pointB = Transform.mulVec2(xfB, localPointB); + var s = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal); + if (s < 0.0) { + this.m_axis = Vec2.neg(this.m_axis); + s = -s; + } + return s; + } + }; + SeparationFunction.prototype.compute = function (find, t) { + // It was findMinSeparation and evaluate + var xfA = Transform.identity(); + var xfB = Transform.identity(); + this.m_sweepA.getTransform(xfA, t); + this.m_sweepB.getTransform(xfB, t); + switch (this.m_type) { + case SeparationFunctionType.e_points: { + if (find) { + var axisA = Rot.mulTVec2(xfA.q, this.m_axis); + var axisB = Rot.mulTVec2(xfB.q, Vec2.neg(this.m_axis)); + this.indexA = this.m_proxyA.getSupport(axisA); + this.indexB = this.m_proxyB.getSupport(axisB); + } + var localPointA = this.m_proxyA.getVertex(this.indexA); + var localPointB = this.m_proxyB.getVertex(this.indexB); + var pointA = Transform.mulVec2(xfA, localPointA); + var pointB = Transform.mulVec2(xfB, localPointB); + var sep = Vec2.dot(pointB, this.m_axis) - Vec2.dot(pointA, this.m_axis); + return sep; } - // w3 region - if (d13_1 <= 0.0 && d23_1 <= 0.0) { - this.m_v3.a = 1.0; - this.m_count = 1; - this.m_v1.set(this.m_v3); - return; + case SeparationFunctionType.e_faceA: { + var normal = Rot.mulVec2(xfA.q, this.m_axis); + var pointA = Transform.mulVec2(xfA, this.m_localPoint); + if (find) { + var axisB = Rot.mulTVec2(xfB.q, Vec2.neg(normal)); + this.indexA = -1; + this.indexB = this.m_proxyB.getSupport(axisB); + } + var localPointB = this.m_proxyB.getVertex(this.indexB); + var pointB = Transform.mulVec2(xfB, localPointB); + var sep = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal); + return sep; } - // e23 - if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) { - var inv_d23 = 1.0 / (d23_1 + d23_2); - this.m_v2.a = d23_1 * inv_d23; - this.m_v3.a = d23_2 * inv_d23; - this.m_count = 2; - this.m_v1.set(this.m_v3); - return; + case SeparationFunctionType.e_faceB: { + var normal = Rot.mulVec2(xfB.q, this.m_axis); + var pointB = Transform.mulVec2(xfB, this.m_localPoint); + if (find) { + var axisA = Rot.mulTVec2(xfA.q, Vec2.neg(normal)); + this.indexB = -1; + this.indexA = this.m_proxyA.getSupport(axisA); + } + var localPointA = this.m_proxyA.getVertex(this.indexA); + var pointA = Transform.mulVec2(xfA, localPointA); + var sep = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal); + return sep; } - // Must be in triangle123 - var inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3); - this.m_v1.a = d123_1 * inv_d123; - this.m_v2.a = d123_2 * inv_d123; - this.m_v3.a = d123_3 * inv_d123; - this.m_count = 3; - }; - return Simplex; - }()); - /** - * Determine if two generic shapes overlap. - */ - function testOverlap(shapeA, indexA, shapeB, indexB, xfA, xfB) { - var input = new DistanceInput(); - input.proxyA.set(shapeA, indexA); - input.proxyB.set(shapeB, indexB); - input.transformA = xfA; - input.transformB = xfB; - input.useRadii = true; - var cache = new SimplexCache(); - var output = new DistanceOutput(); - Distance(output, cache, input); - return output.distance < 10.0 * math.EPSILON; + default: + if (find) { + this.indexA = -1; + this.indexB = -1; + } + return 0.0; + } + }; + SeparationFunction.prototype.findMinSeparation = function (t) { + return this.compute(true, t); + }; + SeparationFunction.prototype.evaluate = function (t) { + return this.compute(false, t); + }; + return SeparationFunction; +}()); +new SeparationFunction(); +// legacy exports +TimeOfImpact.Input = TOIInput; +TimeOfImpact.Output = TOIOutput; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var TimeStep = /** @class */ (function () { + function TimeStep() { + /** time step */ + this.dt = 0; + /** inverse time step (0 if dt == 0) */ + this.inv_dt = 0; + this.velocityIterations = 0; + this.positionIterations = 0; + this.warmStarting = false; + this.blockSolve = true; + /** timestep ratio for variable timestep */ + this.inv_dt0 = 0.0; + /** dt * inv_dt0 */ + this.dtRatio = 1; } - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * A contact edge is used to connect bodies and contacts together in a contact - * graph where each body is a node and each contact is an edge. A contact edge - * belongs to a doubly linked list maintained in each attached body. Each - * contact has two contact nodes, one for each attached body. - * - * @prop {Contact} contact The contact - * @prop {ContactEdge} prev The previous contact edge in the body's contact list - * @prop {ContactEdge} next The next contact edge in the body's contact list - * @prop {Body} other Provides quick access to the other body attached. - */ - var ContactEdge = /** @class */ (function () { - function ContactEdge(contact) { - this.contact = contact; + TimeStep.prototype.reset = function (dt) { + if (this.dt > 0.0) { + this.inv_dt0 = this.inv_dt; } - return ContactEdge; - }()); - /** - * Friction mixing law. The idea is to allow either fixture to drive the - * restitution to zero. For example, anything slides on ice. - */ - function mixFriction(friction1, friction2) { - return math.sqrt(friction1 * friction2); + this.dt = dt; + this.inv_dt = dt == 0 ? 0 : 1 / dt; + this.dtRatio = dt * this.inv_dt0; + }; + return TimeStep; +}()); +// reuse +var s_subStep = new TimeStep(); +/** + * Contact impulses for reporting. Impulses are used instead of forces because + * sub-step forces may approach infinity for rigid body collisions. These match + * up one-to-one with the contact points in Manifold. + */ +var ContactImpulse = /** @class */ (function () { + function ContactImpulse(contact) { + this.contact = contact; + this.normals = []; + this.tangents = []; } - /** - * Restitution mixing law. The idea is allow for anything to bounce off an - * inelastic surface. For example, a superball bounces on anything. - */ - function mixRestitution(restitution1, restitution2) { - return restitution1 > restitution2 ? restitution1 : restitution2; + Object.defineProperty(ContactImpulse.prototype, "normalImpulses", { + get: function () { + var contact = this.contact; + var normals = this.normals; + normals.length = 0; + for (var p = 0; p < contact.v_points.length; ++p) { + normals.push(contact.v_points[p].normalImpulse); + } + return normals; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContactImpulse.prototype, "tangentImpulses", { + get: function () { + var contact = this.contact; + var tangents = this.tangents; + tangents.length = 0; + for (var p = 0; p < contact.v_points.length; ++p) { + tangents.push(contact.v_points[p].tangentImpulse); + } + return tangents; + }, + enumerable: false, + configurable: true + }); + return ContactImpulse; +}()); +/** + * Finds and solves islands. An island is a connected subset of the world. + */ +var Solver = /** @class */ (function () { + function Solver(world) { + this.m_world = world; + this.m_stack = []; + this.m_bodies = []; + this.m_contacts = []; + this.m_joints = []; } - // TODO: move this to Settings? - var s_registers = []; - // TODO: merge with ManifoldPoint? - var VelocityConstraintPoint = /** @class */ (function () { - function VelocityConstraintPoint() { - this.rA = Vec2.zero(); - this.rB = Vec2.zero(); - this.normalImpulse = 0; - this.tangentImpulse = 0; - this.normalMass = 0; - this.tangentMass = 0; - this.velocityBias = 0; - } - return VelocityConstraintPoint; - }()); - /** - * The class manages contact between two shapes. A contact exists for each - * overlapping AABB in the broad-phase (except if filtered). Therefore a contact - * object may exist that has no contact points. - */ - var Contact = /** @class */ (function () { - function Contact(fA, indexA, fB, indexB, evaluateFcn) { - /** @internal */ - this.m_manifold = new Manifold(); - /** @internal */ - this.m_prev = null; - /** @internal */ - this.m_next = null; - /** @internal */ - this.m_toi = 1.0; - /** @internal */ - this.m_toiCount = 0; - /** @internal This contact has a valid TOI in m_toi */ - this.m_toiFlag = false; - /** @internal */ - this.m_tangentSpeed = 0.0; - /** @internal This contact can be disabled (by user) */ - this.m_enabledFlag = true; - /** @internal Used when crawling contact graph when forming islands. */ - this.m_islandFlag = false; - /** @internal Set when the shapes are touching. */ - this.m_touchingFlag = false; - /** @internal This contact needs filtering because a fixture filter was changed. */ - this.m_filterFlag = false; - /** @internal This bullet contact had a TOI event */ - this.m_bulletHitFlag = false; - /** @internal Contact reporting impulse object cache */ - this.m_impulse = new ContactImpulse(this); - // VelocityConstraint - /** @internal */ this.v_points = []; // [maxManifoldPoints]; - /** @internal */ this.v_normal = Vec2.zero(); - /** @internal */ this.v_normalMass = new Mat22(); - /** @internal */ this.v_K = new Mat22(); - // PositionConstraint - /** @internal */ this.p_localPoints = []; // [maxManifoldPoints]; - /** @internal */ this.p_localNormal = Vec2.zero(); - /** @internal */ this.p_localPoint = Vec2.zero(); - /** @internal */ this.p_localCenterA = Vec2.zero(); - /** @internal */ this.p_localCenterB = Vec2.zero(); - // Nodes for connecting bodies. - this.m_nodeA = new ContactEdge(this); - this.m_nodeB = new ContactEdge(this); - this.m_fixtureA = fA; - this.m_fixtureB = fB; - this.m_indexA = indexA; - this.m_indexB = indexB; - this.m_evaluateFcn = evaluateFcn; - this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction); - this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution); - } - Contact.prototype.initConstraint = function (step) { - var fixtureA = this.m_fixtureA; - var fixtureB = this.m_fixtureB; - var shapeA = fixtureA.getShape(); - var shapeB = fixtureB.getShape(); - var bodyA = fixtureA.getBody(); - var bodyB = fixtureB.getBody(); - var manifold = this.getManifold(); - var pointCount = manifold.pointCount; - this.v_invMassA = bodyA.m_invMass; - this.v_invMassB = bodyB.m_invMass; - this.v_invIA = bodyA.m_invI; - this.v_invIB = bodyB.m_invI; - this.v_friction = this.m_friction; - this.v_restitution = this.m_restitution; - this.v_tangentSpeed = this.m_tangentSpeed; - this.v_pointCount = pointCount; - this.v_K.setZero(); - this.v_normalMass.setZero(); - this.p_invMassA = bodyA.m_invMass; - this.p_invMassB = bodyB.m_invMass; - this.p_invIA = bodyA.m_invI; - this.p_invIB = bodyB.m_invI; - this.p_localCenterA = Vec2.clone(bodyA.m_sweep.localCenter); - this.p_localCenterB = Vec2.clone(bodyB.m_sweep.localCenter); - this.p_radiusA = shapeA.m_radius; - this.p_radiusB = shapeB.m_radius; - this.p_type = manifold.type; - this.p_localNormal = Vec2.clone(manifold.localNormal); - this.p_localPoint = Vec2.clone(manifold.localPoint); - this.p_pointCount = pointCount; - for (var j = 0; j < pointCount; ++j) { - var cp = manifold.points[j]; - var vcp = this.v_points[j] = new VelocityConstraintPoint(); - if (step.warmStarting) { - vcp.normalImpulse = step.dtRatio * cp.normalImpulse; - vcp.tangentImpulse = step.dtRatio * cp.tangentImpulse; + Solver.prototype.clear = function () { + this.m_stack.length = 0; + this.m_bodies.length = 0; + this.m_contacts.length = 0; + this.m_joints.length = 0; + }; + Solver.prototype.addBody = function (body) { + this.m_bodies.push(body); + // why? + // body.c_position.c.setZero(); + // body.c_position.a = 0; + // body.c_velocity.v.setZero(); + // body.c_velocity.w = 0; + }; + Solver.prototype.addContact = function (contact) { + // false && console.assert(contact instanceof Contact, 'Not a Contact!', contact); + this.m_contacts.push(contact); + }; + Solver.prototype.addJoint = function (joint) { + this.m_joints.push(joint); + }; + Solver.prototype.solveWorld = function (step) { + var world = this.m_world; + // Clear all the island flags. + for (var b = world.m_bodyList; b; b = b.m_next) { + b.m_islandFlag = false; + } + for (var c = world.m_contactList; c; c = c.m_next) { + c.m_islandFlag = false; + } + for (var j = world.m_jointList; j; j = j.m_next) { + j.m_islandFlag = false; + } + // Build and simulate all awake islands. + var stack = this.m_stack; + for (var seed = world.m_bodyList; seed; seed = seed.m_next) { + if (seed.m_islandFlag) { + continue; + } + if (seed.isAwake() == false || seed.isActive() == false) { + continue; + } + // The seed can be dynamic or kinematic. + if (seed.isStatic()) { + continue; + } + // Reset island and stack. + this.clear(); + stack.push(seed); + seed.m_islandFlag = true; + // Perform a depth first search (DFS) on the constraint graph. + while (stack.length > 0) { + // Grab the next body off the stack and add it to the island. + var b = stack.pop(); + this.addBody(b); + // Make sure the body is awake. + b.setAwake(true); + // To keep islands as small as possible, we don't + // propagate islands across static bodies. + if (b.isStatic()) { + continue; } - else { - vcp.normalImpulse = 0.0; - vcp.tangentImpulse = 0.0; + // Search all contacts connected to this body. + for (var ce = b.m_contactList; ce; ce = ce.next) { + var contact = ce.contact; + // Has this contact already been added to an island? + if (contact.m_islandFlag) { + continue; + } + // Is this contact solid and touching? + if (contact.isEnabled() == false || contact.isTouching() == false) { + continue; + } + // Skip sensors. + var sensorA = contact.m_fixtureA.m_isSensor; + var sensorB = contact.m_fixtureB.m_isSensor; + if (sensorA || sensorB) { + continue; + } + this.addContact(contact); + contact.m_islandFlag = true; + var other = ce.other; + // Was the other body already added to this island? + if (other.m_islandFlag) { + continue; + } + // false && console.assert(stack.length < world.m_bodyCount); + stack.push(other); + other.m_islandFlag = true; } - vcp.rA.setZero(); - vcp.rB.setZero(); - vcp.normalMass = 0.0; - vcp.tangentMass = 0.0; - vcp.velocityBias = 0.0; - this.p_localPoints[j] = Vec2.clone(cp.localPoint); - } - }; - /** - * Get the contact manifold. Do not modify the manifold unless you understand - * the internals of the library. - */ - Contact.prototype.getManifold = function () { - return this.m_manifold; - }; - /** - * Get the world manifold. - */ - Contact.prototype.getWorldManifold = function (worldManifold) { - var bodyA = this.m_fixtureA.getBody(); - var bodyB = this.m_fixtureB.getBody(); - var shapeA = this.m_fixtureA.getShape(); - var shapeB = this.m_fixtureB.getShape(); - return this.m_manifold.getWorldManifold(worldManifold, bodyA.getTransform(), shapeA.m_radius, bodyB.getTransform(), shapeB.m_radius); - }; - /** - * Enable/disable this contact. This can be used inside the pre-solve contact - * listener. The contact is only disabled for the current time step (or sub-step - * in continuous collisions). - */ - Contact.prototype.setEnabled = function (flag) { - this.m_enabledFlag = !!flag; - }; - /** - * Has this contact been disabled? - */ - Contact.prototype.isEnabled = function () { - return this.m_enabledFlag; - }; - /** - * Is this contact touching? - */ - Contact.prototype.isTouching = function () { - return this.m_touchingFlag; - }; - /** - * Get the next contact in the world's contact list. - */ - Contact.prototype.getNext = function () { - return this.m_next; - }; - /** - * Get fixture A in this contact. - */ - Contact.prototype.getFixtureA = function () { - return this.m_fixtureA; - }; - /** - * Get fixture B in this contact. - */ - Contact.prototype.getFixtureB = function () { - return this.m_fixtureB; - }; - /** - * Get the child primitive index for fixture A. - */ - Contact.prototype.getChildIndexA = function () { - return this.m_indexA; - }; - /** - * Get the child primitive index for fixture B. - */ - Contact.prototype.getChildIndexB = function () { - return this.m_indexB; - }; - /** - * Flag this contact for filtering. Filtering will occur the next time step. - */ - Contact.prototype.flagForFiltering = function () { - this.m_filterFlag = true; - }; - /** - * Override the default friction mixture. You can call this in - * ContactListener.preSolve. This value persists until set or reset. - */ - Contact.prototype.setFriction = function (friction) { - this.m_friction = friction; - }; - /** - * Get the friction. - */ - Contact.prototype.getFriction = function () { - return this.m_friction; - }; - /** - * Reset the friction mixture to the default value. - */ - Contact.prototype.resetFriction = function () { - this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction); - }; - /** - * Override the default restitution mixture. You can call this in - * ContactListener.preSolve. The value persists until you set or reset. - */ - Contact.prototype.setRestitution = function (restitution) { - this.m_restitution = restitution; - }; - /** - * Get the restitution. - */ - Contact.prototype.getRestitution = function () { - return this.m_restitution; - }; - /** - * Reset the restitution to the default value. - */ - Contact.prototype.resetRestitution = function () { - this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution); - }; - /** - * Set the desired tangent speed for a conveyor belt behavior. In meters per - * second. - */ - Contact.prototype.setTangentSpeed = function (speed) { - this.m_tangentSpeed = speed; - }; - /** - * Get the desired tangent speed. In meters per second. - */ - Contact.prototype.getTangentSpeed = function () { - return this.m_tangentSpeed; - }; - /** - * Called by Update method, and implemented by subclasses. - */ - Contact.prototype.evaluate = function (manifold, xfA, xfB) { - this.m_evaluateFcn(manifold, xfA, this.m_fixtureA, this.m_indexA, xfB, this.m_fixtureB, this.m_indexB); - }; - /** - * Updates the contact manifold and touching status. - * - * Note: do not assume the fixture AABBs are overlapping or are valid. - * - * @param listener.beginContact - * @param listener.endContact - * @param listener.preSolve - */ - Contact.prototype.update = function (listener) { - // Re-enable this contact. - this.m_enabledFlag = true; - var touching = false; - var wasTouching = this.m_touchingFlag; - var sensorA = this.m_fixtureA.isSensor(); - var sensorB = this.m_fixtureB.isSensor(); - var sensor = sensorA || sensorB; - var bodyA = this.m_fixtureA.getBody(); - var bodyB = this.m_fixtureB.getBody(); - var xfA = bodyA.getTransform(); - var xfB = bodyB.getTransform(); - var oldManifold; - // Is this contact a sensor? - if (sensor) { - var shapeA = this.m_fixtureA.getShape(); - var shapeB = this.m_fixtureB.getShape(); - touching = testOverlap(shapeA, this.m_indexA, shapeB, this.m_indexB, xfA, xfB); - // Sensors don't generate manifolds. - this.m_manifold.pointCount = 0; - } - else { - // TODO reuse manifold - oldManifold = this.m_manifold; - this.m_manifold = new Manifold(); - this.evaluate(this.m_manifold, xfA, xfB); - touching = this.m_manifold.pointCount > 0; - // Match old contact ids to new contact ids and copy the - // stored impulses to warm start the solver. - for (var i = 0; i < this.m_manifold.pointCount; ++i) { - var nmp = this.m_manifold.points[i]; - nmp.normalImpulse = 0.0; - nmp.tangentImpulse = 0.0; - for (var j = 0; j < oldManifold.pointCount; ++j) { - var omp = oldManifold.points[j]; - if (omp.id.key == nmp.id.key) { - nmp.normalImpulse = omp.normalImpulse; - nmp.tangentImpulse = omp.tangentImpulse; - break; - } + // Search all joints connect to this body. + for (var je = b.m_jointList; je; je = je.next) { + if (je.joint.m_islandFlag == true) { + continue; + } + var other = je.other; + // Don't simulate joints connected to inactive bodies. + if (other.isActive() == false) { + continue; + } + this.addJoint(je.joint); + je.joint.m_islandFlag = true; + if (other.m_islandFlag) { + continue; } + // false && console.assert(stack.length < world.m_bodyCount); + stack.push(other); + other.m_islandFlag = true; } - if (touching != wasTouching) { - bodyA.setAwake(true); - bodyB.setAwake(true); + } + this.solveIsland(step); + // Post solve cleanup. + for (var i = 0; i < this.m_bodies.length; ++i) { + // Allow static bodies to participate in other islands. + // TODO: are they added at all? + var b = this.m_bodies[i]; + if (b.isStatic()) { + b.m_islandFlag = false; } } - this.m_touchingFlag = touching; - if (!wasTouching && touching && listener) { - listener.beginContact(this); + } + }; + Solver.prototype.solveIsland = function (step) { + // B2: Island Solve + var world = this.m_world; + var gravity = world.m_gravity; + var allowSleep = world.m_allowSleep; + var h = step.dt; + // Integrate velocities and apply damping. Initialize the body state. + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + var c = Vec2.clone(body.m_sweep.c); + var a = body.m_sweep.a; + var v = Vec2.clone(body.m_linearVelocity); + var w = body.m_angularVelocity; + // Store positions for continuous collision. + body.m_sweep.c0.setVec2(body.m_sweep.c); + body.m_sweep.a0 = body.m_sweep.a; + if (body.isDynamic()) { + // Integrate velocities. + v.addMul(h * body.m_gravityScale, gravity); + v.addMul(h * body.m_invMass, body.m_force); + w += h * body.m_invI * body.m_torque; + /** + *
+                 * Apply damping.
+                 * ODE: dv/dt + c * v = 0
+                 * Solution: v(t) = v0 * exp(-c * t)
+                 * Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)
+                 * v2 = exp(-c * dt) * v1
+                 * Pade approximation:
+                 * v2 = v1 * 1 / (1 + c * dt)
+                 * 
+ */ + v.mul(1.0 / (1.0 + h * body.m_linearDamping)); + w *= 1.0 / (1.0 + h * body.m_angularDamping); + } + body.c_position.c = c; + body.c_position.a = a; + body.c_velocity.v = v; + body.c_velocity.w = w; + } + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.initConstraint(step); + } + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.initVelocityConstraint(step); + } + if (step.warmStarting) { + // Warm start. + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.warmStartConstraint(step); } - if (wasTouching && !touching && listener) { - listener.endContact(this); + } + for (var i = 0; i < this.m_joints.length; ++i) { + var joint = this.m_joints[i]; + joint.initVelocityConstraints(step); + } + // Solve velocity constraints + for (var i = 0; i < step.velocityIterations; ++i) { + for (var j = 0; j < this.m_joints.length; ++j) { + var joint = this.m_joints[j]; + joint.solveVelocityConstraints(step); } - if (!sensor && touching && listener) { - listener.preSolve(this, oldManifold); + for (var j = 0; j < this.m_contacts.length; ++j) { + var contact = this.m_contacts[j]; + contact.solveVelocityConstraint(step); } - }; - Contact.prototype.solvePositionConstraint = function (step) { - return this._solvePositionConstraint(step); - }; - Contact.prototype.solvePositionConstraintTOI = function (step, toiA, toiB) { - return this._solvePositionConstraint(step, toiA, toiB); - }; - Contact.prototype._solvePositionConstraint = function (step, toiA, toiB) { - var toi = !!toiA && !!toiB; - var fixtureA = this.m_fixtureA; - var fixtureB = this.m_fixtureB; - var bodyA = fixtureA.getBody(); - var bodyB = fixtureB.getBody(); - bodyA.c_velocity; - bodyB.c_velocity; - var positionA = bodyA.c_position; - var positionB = bodyB.c_position; - var localCenterA = Vec2.clone(this.p_localCenterA); - var localCenterB = Vec2.clone(this.p_localCenterB); - var mA = 0.0; - var iA = 0.0; - if (!toi || (bodyA == toiA || bodyA == toiB)) { - mA = this.p_invMassA; - iA = this.p_invIA; - } - var mB = 0.0; - var iB = 0.0; - if (!toi || (bodyB == toiA || bodyB == toiB)) { - mB = this.p_invMassB; - iB = this.p_invIB; - } - var cA = Vec2.clone(positionA.c); - var aA = positionA.a; - var cB = Vec2.clone(positionB.c); - var aB = positionB.a; + } + // Store impulses for warm starting + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.storeConstraintImpulses(step); + } + // Integrate positions + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + var c = Vec2.clone(body.c_position.c); + var a = body.c_position.a; + var v = Vec2.clone(body.c_velocity.v); + var w = body.c_velocity.w; + // Check for large velocities + var translation = Vec2.mulNumVec2(h, v); + if (Vec2.lengthSquared(translation) > Settings.maxTranslationSquared) { + var ratio = Settings.maxTranslation / translation.length(); + v.mul(ratio); + } + var rotation = h * w; + if (rotation * rotation > Settings.maxRotationSquared) { + var ratio = Settings.maxRotation / math.abs(rotation); + w *= ratio; + } + // Integrate + c.addMul(h, v); + a += h * w; + body.c_position.c.setVec2(c); + body.c_position.a = a; + body.c_velocity.v.setVec2(v); + body.c_velocity.w = w; + } + // Solve position constraints + var positionSolved = false; + for (var i = 0; i < step.positionIterations; ++i) { var minSeparation = 0.0; - // Solve normal constraints - for (var j = 0; j < this.p_pointCount; ++j) { - var xfA = Transform.identity(); - var xfB = Transform.identity(); - xfA.q.setAngle(aA); - xfB.q.setAngle(aB); - xfA.p = Vec2.sub(cA, Rot.mulVec2(xfA.q, localCenterA)); - xfB.p = Vec2.sub(cB, Rot.mulVec2(xfB.q, localCenterB)); - // PositionSolverManifold - var normal = void 0; - var point = void 0; - var separation = void 0; - switch (this.p_type) { - case ManifoldType.e_circles: { - var pointA = Transform.mulVec2(xfA, this.p_localPoint); - var pointB = Transform.mulVec2(xfB, this.p_localPoints[0]); - normal = Vec2.sub(pointB, pointA); - normal.normalize(); - point = Vec2.combine(0.5, pointA, 0.5, pointB); - separation = Vec2.dot(Vec2.sub(pointB, pointA), normal) - this.p_radiusA - this.p_radiusB; - break; - } - case ManifoldType.e_faceA: { - normal = Rot.mulVec2(xfA.q, this.p_localNormal); - var planePoint = Transform.mulVec2(xfA, this.p_localPoint); - var clipPoint = Transform.mulVec2(xfB, this.p_localPoints[j]); - separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB; - point = clipPoint; - break; - } - case ManifoldType.e_faceB: { - normal = Rot.mulVec2(xfB.q, this.p_localNormal); - var planePoint = Transform.mulVec2(xfB, this.p_localPoint); - var clipPoint = Transform.mulVec2(xfA, this.p_localPoints[j]); - separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB; - point = clipPoint; - // Ensure normal points from A to B - normal.mul(-1); - break; - } - } - var rA = Vec2.sub(point, cA); - var rB = Vec2.sub(point, cB); - // Track max constraint error. + for (var j = 0; j < this.m_contacts.length; ++j) { + var contact = this.m_contacts[j]; + var separation = contact.solvePositionConstraint(step); minSeparation = math.min(minSeparation, separation); - var baumgarte = toi ? Settings.toiBaugarte : Settings.baumgarte; - var linearSlop = Settings.linearSlop; - var maxLinearCorrection = Settings.maxLinearCorrection; - // Prevent large corrections and allow slop. - var C = math.clamp(baumgarte * (separation + linearSlop), -maxLinearCorrection, 0.0); - // Compute the effective mass. - var rnA = Vec2.crossVec2Vec2(rA, normal); - var rnB = Vec2.crossVec2Vec2(rB, normal); - var K = mA + mB + iA * rnA * rnA + iB * rnB * rnB; - // Compute normal impulse - var impulse = K > 0.0 ? -C / K : 0.0; - var P = Vec2.mulNumVec2(impulse, normal); - cA.subMul(mA, P); - aA -= iA * Vec2.crossVec2Vec2(rA, P); - cB.addMul(mB, P); - aB += iB * Vec2.crossVec2Vec2(rB, P); - } - positionA.c.setVec2(cA); - positionA.a = aA; - positionB.c.setVec2(cB); - positionB.a = aB; - return minSeparation; - }; - Contact.prototype.initVelocityConstraint = function (step) { - var fixtureA = this.m_fixtureA; - var fixtureB = this.m_fixtureB; - var bodyA = fixtureA.getBody(); - var bodyB = fixtureB.getBody(); - var velocityA = bodyA.c_velocity; - var velocityB = bodyB.c_velocity; - var positionA = bodyA.c_position; - var positionB = bodyB.c_position; - var radiusA = this.p_radiusA; - var radiusB = this.p_radiusB; - var manifold = this.getManifold(); - var mA = this.v_invMassA; - var mB = this.v_invMassB; - var iA = this.v_invIA; - var iB = this.v_invIB; - var localCenterA = Vec2.clone(this.p_localCenterA); - var localCenterB = Vec2.clone(this.p_localCenterB); - var cA = Vec2.clone(positionA.c); - var aA = positionA.a; - var vA = Vec2.clone(velocityA.v); - var wA = velocityA.w; - var cB = Vec2.clone(positionB.c); - var aB = positionB.a; - var vB = Vec2.clone(velocityB.v); - var wB = velocityB.w; - var xfA = Transform.identity(); - var xfB = Transform.identity(); - xfA.q.setAngle(aA); - xfB.q.setAngle(aB); - xfA.p.setCombine(1, cA, -1, Rot.mulVec2(xfA.q, localCenterA)); - xfB.p.setCombine(1, cB, -1, Rot.mulVec2(xfB.q, localCenterB)); - var worldManifold = manifold.getWorldManifold(null, xfA, radiusA, xfB, radiusB); - this.v_normal.setVec2(worldManifold.normal); - for (var j = 0; j < this.v_pointCount; ++j) { - var vcp = this.v_points[j]; // VelocityConstraintPoint - vcp.rA.setVec2(Vec2.sub(worldManifold.points[j], cA)); - vcp.rB.setVec2(Vec2.sub(worldManifold.points[j], cB)); - var rnA = Vec2.crossVec2Vec2(vcp.rA, this.v_normal); - var rnB = Vec2.crossVec2Vec2(vcp.rB, this.v_normal); - var kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB; - vcp.normalMass = kNormal > 0.0 ? 1.0 / kNormal : 0.0; - var tangent = Vec2.crossVec2Num(this.v_normal, 1.0); - var rtA = Vec2.crossVec2Vec2(vcp.rA, tangent); - var rtB = Vec2.crossVec2Vec2(vcp.rB, tangent); - var kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB; - vcp.tangentMass = kTangent > 0.0 ? 1.0 / kTangent : 0.0; - // Setup a velocity bias for restitution. - vcp.velocityBias = 0.0; - var vRel = Vec2.dot(this.v_normal, vB) - + Vec2.dot(this.v_normal, Vec2.crossNumVec2(wB, vcp.rB)) - - Vec2.dot(this.v_normal, vA) - - Vec2.dot(this.v_normal, Vec2.crossNumVec2(wA, vcp.rA)); - if (vRel < -Settings.velocityThreshold) { - vcp.velocityBias = -this.v_restitution * vRel; - } } - // If we have two points, then prepare the block solver. - if (this.v_pointCount == 2 && step.blockSolve) { - var vcp1 = this.v_points[0]; // VelocityConstraintPoint - var vcp2 = this.v_points[1]; // VelocityConstraintPoint - var rn1A = Vec2.crossVec2Vec2(vcp1.rA, this.v_normal); - var rn1B = Vec2.crossVec2Vec2(vcp1.rB, this.v_normal); - var rn2A = Vec2.crossVec2Vec2(vcp2.rA, this.v_normal); - var rn2B = Vec2.crossVec2Vec2(vcp2.rB, this.v_normal); - var k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B; - var k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B; - var k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B; - // Ensure a reasonable condition number. - var k_maxConditionNumber = 1000.0; - if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) { - // K is safe to invert. - this.v_K.ex.setNum(k11, k12); - this.v_K.ey.setNum(k12, k22); - this.v_normalMass.set(this.v_K.getInverse()); + // We can't expect minSpeparation >= -Settings.linearSlop because we don't + // push the separation above -Settings.linearSlop. + var contactsOkay = minSeparation >= -3.0 * Settings.linearSlop; + var jointsOkay = true; + for (var j = 0; j < this.m_joints.length; ++j) { + var joint = this.m_joints[j]; + var jointOkay = joint.solvePositionConstraints(step); + jointsOkay = jointsOkay && jointOkay; + } + if (contactsOkay && jointsOkay) { + // Exit early if the position errors are small. + positionSolved = true; + break; + } + } + // Copy state buffers back to the bodies + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + body.m_sweep.c.setVec2(body.c_position.c); + body.m_sweep.a = body.c_position.a; + body.m_linearVelocity.setVec2(body.c_velocity.v); + body.m_angularVelocity = body.c_velocity.w; + body.synchronizeTransform(); + } + this.postSolveIsland(); + if (allowSleep) { + var minSleepTime = Infinity; + var linTolSqr = Settings.linearSleepToleranceSqr; + var angTolSqr = Settings.angularSleepToleranceSqr; + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + if (body.isStatic()) { + continue; + } + if ((body.m_autoSleepFlag == false) + || (body.m_angularVelocity * body.m_angularVelocity > angTolSqr) + || (Vec2.lengthSquared(body.m_linearVelocity) > linTolSqr)) { + body.m_sleepTime = 0.0; + minSleepTime = 0.0; } else { - // The constraints are redundant, just use one. - // TODO_ERIN use deepest? - this.v_pointCount = 1; + body.m_sleepTime += h; + minSleepTime = math.min(minSleepTime, body.m_sleepTime); } } - positionA.c.setVec2(cA); - positionA.a = aA; - velocityA.v.setVec2(vA); - velocityA.w = wA; - positionB.c.setVec2(cB); - positionB.a = aB; - velocityB.v.setVec2(vB); - velocityB.w = wB; - }; - Contact.prototype.warmStartConstraint = function (step) { - var fixtureA = this.m_fixtureA; - var fixtureB = this.m_fixtureB; - var bodyA = fixtureA.getBody(); - var bodyB = fixtureB.getBody(); - var velocityA = bodyA.c_velocity; - var velocityB = bodyB.c_velocity; - bodyA.c_position; - bodyB.c_position; - var mA = this.v_invMassA; - var iA = this.v_invIA; - var mB = this.v_invMassB; - var iB = this.v_invIB; - var vA = Vec2.clone(velocityA.v); - var wA = velocityA.w; - var vB = Vec2.clone(velocityB.v); - var wB = velocityB.w; - var normal = this.v_normal; - var tangent = Vec2.crossVec2Num(normal, 1.0); - for (var j = 0; j < this.v_pointCount; ++j) { - var vcp = this.v_points[j]; // VelocityConstraintPoint - var P = Vec2.combine(vcp.normalImpulse, normal, vcp.tangentImpulse, tangent); - wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); - vA.subMul(mA, P); - wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); - vB.addMul(mB, P); + if (minSleepTime >= Settings.timeToSleep && positionSolved) { + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + body.setAwake(false); + } } - velocityA.v.setVec2(vA); - velocityA.w = wA; - velocityB.v.setVec2(vB); - velocityB.w = wB; - }; - Contact.prototype.storeConstraintImpulses = function (step) { - var manifold = this.m_manifold; - for (var j = 0; j < this.v_pointCount; ++j) { - manifold.points[j].normalImpulse = this.v_points[j].normalImpulse; - manifold.points[j].tangentImpulse = this.v_points[j].tangentImpulse; + } + }; + /** + * Find TOI contacts and solve them. + */ + Solver.prototype.solveWorldTOI = function (step) { + var world = this.m_world; + if (world.m_stepComplete) { + for (var b = world.m_bodyList; b; b = b.m_next) { + b.m_islandFlag = false; + b.m_sweep.alpha0 = 0.0; } - }; - Contact.prototype.solveVelocityConstraint = function (step) { - var bodyA = this.m_fixtureA.m_body; - var bodyB = this.m_fixtureB.m_body; - var velocityA = bodyA.c_velocity; - bodyA.c_position; - var velocityB = bodyB.c_velocity; - bodyB.c_position; - var mA = this.v_invMassA; - var iA = this.v_invIA; - var mB = this.v_invMassB; - var iB = this.v_invIB; - var vA = Vec2.clone(velocityA.v); - var wA = velocityA.w; - var vB = Vec2.clone(velocityB.v); - var wB = velocityB.w; - var normal = this.v_normal; - var tangent = Vec2.crossVec2Num(normal, 1.0); - var friction = this.v_friction; - // Solve tangent constraints first because non-penetration is more important - // than friction. - for (var j = 0; j < this.v_pointCount; ++j) { - var vcp = this.v_points[j]; // VelocityConstraintPoint - // Relative velocity at contact - var dv = Vec2.zero(); - dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB)); - dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA)); - // Compute tangent force - var vt = Vec2.dot(dv, tangent) - this.v_tangentSpeed; - var lambda = vcp.tangentMass * (-vt); - // Clamp the accumulated force - var maxFriction = friction * vcp.normalImpulse; - var newImpulse = math.clamp(vcp.tangentImpulse + lambda, -maxFriction, maxFriction); - lambda = newImpulse - vcp.tangentImpulse; - vcp.tangentImpulse = newImpulse; - // Apply contact impulse - var P = Vec2.mulNumVec2(lambda, tangent); - vA.subMul(mA, P); - wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); - vB.addMul(mB, P); - wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); + for (var c = world.m_contactList; c; c = c.m_next) { + // Invalidate TOI + c.m_toiFlag = false; + c.m_islandFlag = false; + c.m_toiCount = 0; + c.m_toi = 1.0; } - // Solve normal constraints - if (this.v_pointCount == 1 || step.blockSolve == false) { - for (var i = 0; i < this.v_pointCount; ++i) { - var vcp = this.v_points[i]; // VelocityConstraintPoint - // Relative velocity at contact - var dv = Vec2.zero(); - dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB)); - dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA)); - // Compute normal impulse - var vn = Vec2.dot(dv, normal); - var lambda = -vcp.normalMass * (vn - vcp.velocityBias); - // Clamp the accumulated impulse - var newImpulse = math.max(vcp.normalImpulse + lambda, 0.0); - lambda = newImpulse - vcp.normalImpulse; - vcp.normalImpulse = newImpulse; - // Apply contact impulse - var P = Vec2.mulNumVec2(lambda, normal); - vA.subMul(mA, P); - wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); - vB.addMul(mB, P); - wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); + } + // Find TOI events and solve them. + while (true) { + // Find the first TOI. + var minContact = null; // Contact + var minAlpha = 1.0; + for (var c = world.m_contactList; c; c = c.m_next) { + // Is this contact disabled? + if (c.isEnabled() == false) { + continue; } - } - else { - // Block solver developed in collaboration with Dirk Gregorius (back in - // 01/07 on Box2D_Lite). - // Build the mini LCP for this contact patch - // - // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i = - // 1..2 - // - // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n ) - // b = vn0 - velocityBias - // - // The system is solved using the "Total enumeration method" (s. Murty). - // The complementary constraint vn_i * x_i - // implies that we must have in any solution either vn_i = 0 or x_i = 0. - // So for the 2D contact problem the cases - // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and - // vn1 = 0 need to be tested. The first valid - // solution that satisfies the problem is chosen. - // - // In order to account of the accumulated impulse 'a' (because of the - // iterative nature of the solver which only requires - // that the accumulated impulse is clamped and not the incremental - // impulse) we change the impulse variable (x_i). - // - // Substitute: - // - // x = a + d - // - // a := old total impulse - // x := new total impulse - // d := incremental impulse - // - // For the current iteration we extend the formula for the incremental - // impulse - // to compute the new total impulse: - // - // vn = A * d + b - // = A * (x - a) + b - // = A * x + b - A * a - // = A * x + b' - // b' = b - A * a; - var vcp1 = this.v_points[0]; // VelocityConstraintPoint - var vcp2 = this.v_points[1]; // VelocityConstraintPoint - var a = Vec2.neo(vcp1.normalImpulse, vcp2.normalImpulse); - // Relative velocity at contact - var dv1 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp1.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp1.rA)); - var dv2 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp2.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp2.rA)); - // Compute normal velocity - var vn1 = Vec2.dot(dv1, normal); - var vn2 = Vec2.dot(dv2, normal); - var b = Vec2.neo(vn1 - vcp1.velocityBias, vn2 - vcp2.velocityBias); - // Compute b' - b.sub(Mat22.mulVec2(this.v_K, a)); - // NOT_USED(k_errorTol); - while (true) { - // - // Case 1: vn = 0 - // - // 0 = A * x + b' - // - // Solve for x: - // - // x = - inv(A) * b' - // - var x = Mat22.mulVec2(this.v_normalMass, b).neg(); - if (x.x >= 0.0 && x.y >= 0.0) { - // Get the incremental impulse - var d = Vec2.sub(x, a); - // Apply incremental impulse - var P1 = Vec2.mulNumVec2(d.x, normal); - var P2 = Vec2.mulNumVec2(d.y, normal); - vA.subCombine(mA, P1, mA, P2); - wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); - vB.addCombine(mB, P1, mB, P2); - wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); - // Accumulate - vcp1.normalImpulse = x.x; - vcp2.normalImpulse = x.y; - break; + // Prevent excessive sub-stepping. + if (c.m_toiCount > Settings.maxSubSteps) { + continue; + } + var alpha = 1.0; + if (c.m_toiFlag) { + // This contact has a valid cached TOI. + alpha = c.m_toi; + } + else { + var fA_1 = c.getFixtureA(); + var fB_1 = c.getFixtureB(); + // Is there a sensor? + if (fA_1.isSensor() || fB_1.isSensor()) { + continue; } - // - // Case 2: vn1 = 0 and x2 = 0 - // - // 0 = a11 * x1 + a12 * 0 + b1' - // vn2 = a21 * x1 + a22 * 0 + b2' - // - x.x = -vcp1.normalMass * b.x; - x.y = 0.0; - vn1 = 0.0; - vn2 = this.v_K.ex.y * x.x + b.y; - if (x.x >= 0.0 && vn2 >= 0.0) { - // Get the incremental impulse - var d = Vec2.sub(x, a); - // Apply incremental impulse - var P1 = Vec2.mulNumVec2(d.x, normal); - var P2 = Vec2.mulNumVec2(d.y, normal); - vA.subCombine(mA, P1, mA, P2); - wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); - vB.addCombine(mB, P1, mB, P2); - wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); - // Accumulate - vcp1.normalImpulse = x.x; - vcp2.normalImpulse = x.y; - break; + var bA_1 = fA_1.getBody(); + var bB_1 = fB_1.getBody(); + var activeA = bA_1.isAwake() && !bA_1.isStatic(); + var activeB = bB_1.isAwake() && !bB_1.isStatic(); + // Is at least one body active (awake and dynamic or kinematic)? + if (activeA == false && activeB == false) { + continue; } - // - // Case 3: vn2 = 0 and x1 = 0 - // - // vn1 = a11 * 0 + a12 * x2 + b1' - // 0 = a21 * 0 + a22 * x2 + b2' - // - x.x = 0.0; - x.y = -vcp2.normalMass * b.y; - vn1 = this.v_K.ey.x * x.y + b.x; - vn2 = 0.0; - if (x.y >= 0.0 && vn1 >= 0.0) { - // Resubstitute for the incremental impulse - var d = Vec2.sub(x, a); - // Apply incremental impulse - var P1 = Vec2.mulNumVec2(d.x, normal); - var P2 = Vec2.mulNumVec2(d.y, normal); - vA.subCombine(mA, P1, mA, P2); - wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); - vB.addCombine(mB, P1, mB, P2); - wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); - // Accumulate - vcp1.normalImpulse = x.x; - vcp2.normalImpulse = x.y; - break; + var collideA = bA_1.isBullet() || !bA_1.isDynamic(); + var collideB = bB_1.isBullet() || !bB_1.isDynamic(); + // Are these two non-bullet dynamic bodies? + if (collideA == false && collideB == false) { + continue; } - // - // Case 4: x1 = 0 and x2 = 0 - // - // vn1 = b1 - // vn2 = b2; - // - x.x = 0.0; - x.y = 0.0; - vn1 = b.x; - vn2 = b.y; - if (vn1 >= 0.0 && vn2 >= 0.0) { - // Resubstitute for the incremental impulse - var d = Vec2.sub(x, a); - // Apply incremental impulse - var P1 = Vec2.mulNumVec2(d.x, normal); - var P2 = Vec2.mulNumVec2(d.y, normal); - vA.subCombine(mA, P1, mA, P2); - wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); - vB.addCombine(mB, P1, mB, P2); - wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); - // Accumulate - vcp1.normalImpulse = x.x; - vcp2.normalImpulse = x.y; - break; + // Compute the TOI for this contact. + // Put the sweeps onto the same time interval. + var alpha0 = bA_1.m_sweep.alpha0; + if (bA_1.m_sweep.alpha0 < bB_1.m_sweep.alpha0) { + alpha0 = bB_1.m_sweep.alpha0; + bA_1.m_sweep.advance(alpha0); } - // No solution, give up. This is hit sometimes, but it doesn't seem to - // matter. - break; + else if (bB_1.m_sweep.alpha0 < bA_1.m_sweep.alpha0) { + alpha0 = bA_1.m_sweep.alpha0; + bB_1.m_sweep.advance(alpha0); + } + var indexA = c.getChildIndexA(); + var indexB = c.getChildIndexB(); + bA_1.m_sweep; + bB_1.m_sweep; + // Compute the time of impact in interval [0, minTOI] + var input = new TOIInput(); // TODO: reuse + input.proxyA.set(fA_1.getShape(), indexA); + input.proxyB.set(fB_1.getShape(), indexB); + input.sweepA.set(bA_1.m_sweep); + input.sweepB.set(bB_1.m_sweep); + input.tMax = 1.0; + var output = new TOIOutput(); // TODO: reuse + TimeOfImpact(output, input); + // Beta is the fraction of the remaining portion of the [time?]. + var beta = output.t; + if (output.state == TOIOutputState.e_touching) { + alpha = math.min(alpha0 + (1.0 - alpha0) * beta, 1.0); + } + else { + alpha = 1.0; + } + c.m_toi = alpha; + c.m_toiFlag = true; + } + if (alpha < minAlpha) { + // This is the minimum TOI found so far. + minContact = c; + minAlpha = alpha; } } - velocityA.v.setVec2(vA); - velocityA.w = wA; - velocityB.v.setVec2(vB); - velocityB.w = wB; - }; - /** - * @internal - */ - Contact.addType = function (type1, type2, callback) { - s_registers[type1] = s_registers[type1] || {}; - s_registers[type1][type2] = callback; - }; - /** - * @internal - */ - Contact.create = function (fixtureA, indexA, fixtureB, indexB) { - var typeA = fixtureA.getType(); - var typeB = fixtureB.getType(); - // TODO: pool contacts - var contact; - var evaluateFcn; - if (evaluateFcn = s_registers[typeA] && s_registers[typeA][typeB]) { - contact = new Contact(fixtureA, indexA, fixtureB, indexB, evaluateFcn); - } - else if (evaluateFcn = s_registers[typeB] && s_registers[typeB][typeA]) { - contact = new Contact(fixtureB, indexB, fixtureA, indexA, evaluateFcn); - } - else { - return null; + if (minContact == null || 1.0 - 10.0 * math.EPSILON < minAlpha) { + // No more TOI events. Done! + world.m_stepComplete = true; + break; } - // Contact creation may swap fixtures. - fixtureA = contact.getFixtureA(); - fixtureB = contact.getFixtureB(); - indexA = contact.getChildIndexA(); - indexB = contact.getChildIndexB(); - var bodyA = fixtureA.getBody(); - var bodyB = fixtureB.getBody(); - // Connect to body A - contact.m_nodeA.contact = contact; - contact.m_nodeA.other = bodyB; - contact.m_nodeA.prev = null; - contact.m_nodeA.next = bodyA.m_contactList; - if (bodyA.m_contactList != null) { - bodyA.m_contactList.prev = contact.m_nodeA; - } - bodyA.m_contactList = contact.m_nodeA; - // Connect to body B - contact.m_nodeB.contact = contact; - contact.m_nodeB.other = bodyA; - contact.m_nodeB.prev = null; - contact.m_nodeB.next = bodyB.m_contactList; - if (bodyB.m_contactList != null) { - bodyB.m_contactList.prev = contact.m_nodeB; - } - bodyB.m_contactList = contact.m_nodeB; - // Wake up the bodies - if (fixtureA.isSensor() == false && fixtureB.isSensor() == false) { - bodyA.setAwake(true); - bodyB.setAwake(true); + // Advance the bodies to the TOI. + var fA = minContact.getFixtureA(); + var fB = minContact.getFixtureB(); + var bA = fA.getBody(); + var bB = fB.getBody(); + var backup1 = bA.m_sweep.clone(); + var backup2 = bB.m_sweep.clone(); + bA.advance(minAlpha); + bB.advance(minAlpha); + // The TOI contact likely has some new contact points. + minContact.update(world); + minContact.m_toiFlag = false; + ++minContact.m_toiCount; + // Is the contact solid? + if (minContact.isEnabled() == false || minContact.isTouching() == false) { + // Restore the sweeps. + minContact.setEnabled(false); + bA.m_sweep.set(backup1); + bB.m_sweep.set(backup2); + bA.synchronizeTransform(); + bB.synchronizeTransform(); + continue; + } + bA.setAwake(true); + bB.setAwake(true); + // Build the island + this.clear(); + this.addBody(bA); + this.addBody(bB); + this.addContact(minContact); + bA.m_islandFlag = true; + bB.m_islandFlag = true; + minContact.m_islandFlag = true; + // Get contacts on bodyA and bodyB. + var bodies = [bA, bB]; + for (var i = 0; i < bodies.length; ++i) { + var body = bodies[i]; + if (body.isDynamic()) { + for (var ce = body.m_contactList; ce; ce = ce.next) { + // if (this.m_bodyCount == this.m_bodyCapacity) { break; } + // if (this.m_contactCount == this.m_contactCapacity) { break; } + var contact = ce.contact; + // Has this contact already been added to the island? + if (contact.m_islandFlag) { + continue; + } + // Only add if either is static, kinematic or bullet. + var other = ce.other; + if (other.isDynamic() && !body.isBullet() && !other.isBullet()) { + continue; + } + // Skip sensors. + var sensorA = contact.m_fixtureA.m_isSensor; + var sensorB = contact.m_fixtureB.m_isSensor; + if (sensorA || sensorB) { + continue; + } + // Tentatively advance the body to the TOI. + var backup = other.m_sweep.clone(); + if (other.m_islandFlag == false) { + other.advance(minAlpha); + } + // Update the contact points + contact.update(world); + // Was the contact disabled by the user? + // Are there contact points? + if (contact.isEnabled() == false || contact.isTouching() == false) { + other.m_sweep.set(backup); + other.synchronizeTransform(); + continue; + } + // Add the contact to the island + contact.m_islandFlag = true; + this.addContact(contact); + // Has the other body already been added to the island? + if (other.m_islandFlag) { + continue; + } + // Add the other body to the island. + other.m_islandFlag = true; + if (!other.isStatic()) { + other.setAwake(true); + } + this.addBody(other); + } + } } - return contact; - }; - /** - * @internal - */ - Contact.destroy = function (contact, listener) { - var fixtureA = contact.m_fixtureA; - var fixtureB = contact.m_fixtureB; - var bodyA = fixtureA.getBody(); - var bodyB = fixtureB.getBody(); - if (contact.isTouching()) { - listener.endContact(contact); + s_subStep.reset((1.0 - minAlpha) * step.dt); + s_subStep.dtRatio = 1.0; + s_subStep.positionIterations = 20; + s_subStep.velocityIterations = step.velocityIterations; + s_subStep.warmStarting = false; + this.solveIslandTOI(s_subStep, bA, bB); + // Reset island flags and synchronize broad-phase proxies. + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + body.m_islandFlag = false; + if (!body.isDynamic()) { + continue; + } + body.synchronizeFixtures(); + // Invalidate all contact TOIs on this displaced body. + for (var ce = body.m_contactList; ce; ce = ce.next) { + ce.contact.m_toiFlag = false; + ce.contact.m_islandFlag = false; + } } - // Remove from body 1 - if (contact.m_nodeA.prev) { - contact.m_nodeA.prev.next = contact.m_nodeA.next; + // Commit fixture proxy movements to the broad-phase so that new contacts + // are created. + // Also, some contacts can be destroyed. + world.findNewContacts(); + if (world.m_subStepping) { + world.m_stepComplete = false; + break; } - if (contact.m_nodeA.next) { - contact.m_nodeA.next.prev = contact.m_nodeA.prev; + } + }; + Solver.prototype.solveIslandTOI = function (subStep, toiA, toiB) { + this.m_world; + // Initialize the body state. + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + body.c_position.c.setVec2(body.m_sweep.c); + body.c_position.a = body.m_sweep.a; + body.c_velocity.v.setVec2(body.m_linearVelocity); + body.c_velocity.w = body.m_angularVelocity; + } + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.initConstraint(subStep); + } + // Solve position constraints. + for (var i = 0; i < subStep.positionIterations; ++i) { + var minSeparation = 0.0; + for (var j = 0; j < this.m_contacts.length; ++j) { + var contact = this.m_contacts[j]; + var separation = contact.solvePositionConstraintTOI(subStep, toiA, toiB); + minSeparation = math.min(minSeparation, separation); } - if (contact.m_nodeA == bodyA.m_contactList) { - bodyA.m_contactList = contact.m_nodeA.next; + // We can't expect minSpeparation >= -Settings.linearSlop because we don't + // push the separation above -Settings.linearSlop. + var contactsOkay = minSeparation >= -1.5 * Settings.linearSlop; + if (contactsOkay) { + break; } - // Remove from body 2 - if (contact.m_nodeB.prev) { - contact.m_nodeB.prev.next = contact.m_nodeB.next; + } + var i, c; + // Leap of faith to new safe state. + toiA.m_sweep.c0.setVec2(toiA.c_position.c); + toiA.m_sweep.a0 = toiA.c_position.a; + toiB.m_sweep.c0.setVec2(toiB.c_position.c); + toiB.m_sweep.a0 = toiB.c_position.a; + // No warm starting is needed for TOI events because warm + // starting impulses were applied in the discrete solver. + for (var i = 0; i < this.m_contacts.length; ++i) { + var contact = this.m_contacts[i]; + contact.initVelocityConstraint(subStep); + } + // Solve velocity constraints. + for (var i = 0; i < subStep.velocityIterations; ++i) { + for (var j = 0; j < this.m_contacts.length; ++j) { + var contact = this.m_contacts[j]; + contact.solveVelocityConstraint(subStep); } - if (contact.m_nodeB.next) { - contact.m_nodeB.next.prev = contact.m_nodeB.prev; + } + // Don't store the TOI contact forces for warm starting + // because they can be quite large. + var h = subStep.dt; + // Integrate positions + for (var i = 0; i < this.m_bodies.length; ++i) { + var body = this.m_bodies[i]; + var c = Vec2.clone(body.c_position.c); + var a = body.c_position.a; + var v = Vec2.clone(body.c_velocity.v); + var w = body.c_velocity.w; + // Check for large velocities + var translation = Vec2.mulNumVec2(h, v); + if (Vec2.dot(translation, translation) > Settings.maxTranslationSquared) { + var ratio = Settings.maxTranslation / translation.length(); + v.mul(ratio); + } + var rotation = h * w; + if (rotation * rotation > Settings.maxRotationSquared) { + var ratio = Settings.maxRotation / math.abs(rotation); + w *= ratio; + } + // Integrate + c.addMul(h, v); + a += h * w; + body.c_position.c = c; + body.c_position.a = a; + body.c_velocity.v = v; + body.c_velocity.w = w; + // Sync bodies + body.m_sweep.c = c; + body.m_sweep.a = a; + body.m_linearVelocity = v; + body.m_angularVelocity = w; + body.synchronizeTransform(); + } + this.postSolveIsland(); + }; + /** @internal */ + Solver.prototype.postSolveIsland = function () { + for (var c = 0; c < this.m_contacts.length; ++c) { + var contact = this.m_contacts[c]; + this.m_world.postSolve(contact, contact.m_impulse); + } + }; + return Solver; +}()); +// @ts-ignore +Solver.TimeStep = TimeStep; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A 2-by-2 matrix. Stored in column-major order. + */ +var Mat22 = /** @class */ (function () { + // tslint:disable-next-line:typedef + function Mat22(a, b, c, d) { + if (typeof a === 'object' && a !== null) { + this.ex = Vec2.clone(a); + this.ey = Vec2.clone(b); + } + else if (typeof a === 'number') { + this.ex = Vec2.neo(a, c); + this.ey = Vec2.neo(b, d); + } + else { + this.ex = Vec2.zero(); + this.ey = Vec2.zero(); + } + } + /** @internal */ + Mat22.prototype.toString = function () { + return JSON.stringify(this); + }; + Mat22.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return Vec2.isValid(obj.ex) && Vec2.isValid(obj.ey); + }; + Mat22.assert = function (o) { + }; + // tslint:disable-next-line:typedef + Mat22.prototype.set = function (a, b, c, d) { + if (typeof a === 'number' && typeof b === 'number' && typeof c === 'number' + && typeof d === 'number') { + this.ex.setNum(a, c); + this.ey.setNum(b, d); + } + else if (typeof a === 'object' && typeof b === 'object') { + this.ex.setVec2(a); + this.ey.setVec2(b); + } + else if (typeof a === 'object') { + this.ex.setVec2(a.ex); + this.ey.setVec2(a.ey); + } + else ; + }; + Mat22.prototype.setIdentity = function () { + this.ex.x = 1.0; + this.ey.x = 0.0; + this.ex.y = 0.0; + this.ey.y = 1.0; + }; + Mat22.prototype.setZero = function () { + this.ex.x = 0.0; + this.ey.x = 0.0; + this.ex.y = 0.0; + this.ey.y = 0.0; + }; + Mat22.prototype.getInverse = function () { + var a = this.ex.x; + var b = this.ey.x; + var c = this.ex.y; + var d = this.ey.y; + var det = a * d - b * c; + if (det !== 0.0) { + det = 1.0 / det; + } + var imx = new Mat22(); + imx.ex.x = det * d; + imx.ey.x = -det * b; + imx.ex.y = -det * c; + imx.ey.y = det * a; + return imx; + }; + /** + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. + */ + Mat22.prototype.solve = function (v) { + var a = this.ex.x; + var b = this.ey.x; + var c = this.ex.y; + var d = this.ey.y; + var det = a * d - b * c; + if (det !== 0.0) { + det = 1.0 / det; + } + var w = Vec2.zero(); + w.x = det * (d * v.x - b * v.y); + w.y = det * (a * v.y - c * v.x); + return w; + }; + // tslint:disable-next-line:typedef + Mat22.mul = function (mx, v) { + if (v && 'x' in v && 'y' in v) { + var x = mx.ex.x * v.x + mx.ey.x * v.y; + var y = mx.ex.y * v.x + mx.ey.y * v.y; + return Vec2.neo(x, y); + } + else if (v && 'ex' in v && 'ey' in v) { // Mat22 + // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey)); + var a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y; + var b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y; + var c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y; + var d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y; + return new Mat22(a, b, c, d); + } + }; + Mat22.mulVec2 = function (mx, v) { + var x = mx.ex.x * v.x + mx.ey.x * v.y; + var y = mx.ex.y * v.x + mx.ey.y * v.y; + return Vec2.neo(x, y); + }; + Mat22.mulMat22 = function (mx, v) { + // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey)); + var a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y; + var b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y; + var c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y; + var d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y; + return new Mat22(a, b, c, d); + }; + // tslint:disable-next-line:typedef + Mat22.mulT = function (mx, v) { + if (v && 'x' in v && 'y' in v) { // Vec2 + return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey)); + } + else if (v && 'ex' in v && 'ey' in v) { // Mat22 + var c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex)); + var c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey)); + return new Mat22(c1, c2); + } + }; + Mat22.mulTVec2 = function (mx, v) { + return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey)); + }; + Mat22.mulTMat22 = function (mx, v) { + var c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex)); + var c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey)); + return new Mat22(c1, c2); + }; + Mat22.abs = function (mx) { + return new Mat22(Vec2.abs(mx.ex), Vec2.abs(mx.ey)); + }; + Mat22.add = function (mx1, mx2) { + return new Mat22(Vec2.add(mx1.ex, mx2.ex), Vec2.add(mx1.ey, mx2.ey)); + }; + return Mat22; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var ManifoldType; +(function (ManifoldType) { + ManifoldType[ManifoldType["e_circles"] = 0] = "e_circles"; + ManifoldType[ManifoldType["e_faceA"] = 1] = "e_faceA"; + ManifoldType[ManifoldType["e_faceB"] = 2] = "e_faceB"; +})(ManifoldType || (ManifoldType = {})); +var ContactFeatureType; +(function (ContactFeatureType) { + ContactFeatureType[ContactFeatureType["e_vertex"] = 0] = "e_vertex"; + ContactFeatureType[ContactFeatureType["e_face"] = 1] = "e_face"; +})(ContactFeatureType || (ContactFeatureType = {})); +/** + * This is used for determining the state of contact points. + */ +var PointState; +(function (PointState) { + /** Point does not exist */ + PointState[PointState["nullState"] = 0] = "nullState"; + /** Point was added in the update */ + PointState[PointState["addState"] = 1] = "addState"; + /** Point persisted across the update */ + PointState[PointState["persistState"] = 2] = "persistState"; + /** Point was removed in the update */ + PointState[PointState["removeState"] = 3] = "removeState"; +})(PointState || (PointState = {})); +/** + * Used for computing contact manifolds. + */ +var ClipVertex = /** @class */ (function () { + function ClipVertex() { + this.v = Vec2.zero(); + this.id = new ContactID(); + } + ClipVertex.prototype.set = function (o) { + this.v.setVec2(o.v); + this.id.set(o.id); + }; + return ClipVertex; +}()); +/** + * A manifold for two touching convex shapes. Manifolds are created in `evaluate` + * method of Contact subclasses. + * + * Supported manifold types are e_faceA or e_faceB for clip point versus plane + * with radius and e_circles point versus point with radius. + * + * We store contacts in this way so that position correction can account for + * movement, which is critical for continuous physics. All contact scenarios + * must be expressed in one of these types. This structure is stored across time + * steps, so we keep it small. + * + * @prop type e_circle, e_faceA, e_faceB + * @prop localPoint Usage depends on manifold type:
+ * e_circles: the local center of circleA
+ * e_faceA: the center of faceA
+ * e_faceB: the center of faceB + * @prop localNormal Usage depends on manifold type:
+ * e_circles: not used
+ * e_faceA: the normal on polygonA
+ * e_faceB: the normal on polygonB + * @prop points The points of contact {ManifoldPoint[]} + * @prop pointCount The number of manifold points + */ +var Manifold = /** @class */ (function () { + function Manifold() { + this.localNormal = Vec2.zero(); + this.localPoint = Vec2.zero(); + this.points = [new ManifoldPoint(), new ManifoldPoint()]; + this.pointCount = 0; + } + /** + * Evaluate the manifold with supplied transforms. This assumes modest motion + * from the original state. This does not change the point count, impulses, etc. + * The radii must come from the shapes that generated the manifold. + */ + Manifold.prototype.getWorldManifold = function (wm, xfA, radiusA, xfB, radiusB) { + if (this.pointCount == 0) { + return; + } + wm = wm || new WorldManifold(); + var normal = wm.normal; + var points = wm.points; + var separations = wm.separations; + // TODO: improve + switch (this.type) { + case ManifoldType.e_circles: { + normal = Vec2.neo(1.0, 0.0); + var pointA = Transform.mulVec2(xfA, this.localPoint); + var pointB = Transform.mulVec2(xfB, this.points[0].localPoint); + var dist = Vec2.sub(pointB, pointA); + if (Vec2.lengthSquared(dist) > math.EPSILON * math.EPSILON) { + normal.setVec2(dist); + normal.normalize(); + } + var cA = pointA.clone().addMul(radiusA, normal); + var cB = pointB.clone().addMul(-radiusB, normal); + points[0] = Vec2.mid(cA, cB); + separations[0] = Vec2.dot(Vec2.sub(cB, cA), normal); + points.length = 1; + separations.length = 1; + break; } - if (contact.m_nodeB == bodyB.m_contactList) { - bodyB.m_contactList = contact.m_nodeB.next; + case ManifoldType.e_faceA: { + normal = Rot.mulVec2(xfA.q, this.localNormal); + var planePoint = Transform.mulVec2(xfA, this.localPoint); + for (var i = 0; i < this.pointCount; ++i) { + var clipPoint = Transform.mulVec2(xfB, this.points[i].localPoint); + var cA = Vec2.clone(clipPoint).addMul(radiusA - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal); + var cB = Vec2.clone(clipPoint).subMul(radiusB, normal); + points[i] = Vec2.mid(cA, cB); + separations[i] = Vec2.dot(Vec2.sub(cB, cA), normal); + } + points.length = this.pointCount; + separations.length = this.pointCount; + break; } - if (contact.m_manifold.pointCount > 0 && fixtureA.isSensor() == false - && fixtureB.isSensor() == false) { - bodyA.setAwake(true); - bodyB.setAwake(true); + case ManifoldType.e_faceB: { + normal = Rot.mulVec2(xfB.q, this.localNormal); + var planePoint = Transform.mulVec2(xfB, this.localPoint); + for (var i = 0; i < this.pointCount; ++i) { + var clipPoint = Transform.mulVec2(xfA, this.points[i].localPoint); + var cB = Vec2.combine(1, clipPoint, radiusB - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal); + var cA = Vec2.combine(1, clipPoint, -radiusA, normal); + points[i] = Vec2.mid(cA, cB); + separations[i] = Vec2.dot(Vec2.sub(cA, cB), normal); + } + points.length = this.pointCount; + separations.length = this.pointCount; + // Ensure normal points from A to B. + normal.mul(-1); + break; } - fixtureA.getType(); - fixtureB.getType(); - // const destroyFcn = s_registers[typeA][typeB].destroyFcn; - // if (typeof destroyFcn === 'function') { - // destroyFcn(contact); - // } - }; - return Contact; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * A joint edge is used to connect bodies and joints together in a joint graph - * where each body is a node and each joint is an edge. A joint edge belongs to - * a doubly linked list maintained in each attached body. Each joint has two - * joint nodes, one for each attached body. - */ - var JointEdge = /** @class */ (function () { - function JointEdge() { - /** - * provides quick access to the other body attached. - */ - this.other = null; - /** - * the joint - */ - this.joint = null; - /** - * prev the previous joint edge in the body's joint list - */ - this.prev = null; - /** - * the next joint edge in the body's joint list - */ - this.next = null; - } - return JointEdge; - }()); - /** - * The base joint class. Joints are used to constraint two bodies together in - * various fashions. Some joints also feature limits and motors. - */ - var Joint = /** @class */ (function () { - function Joint(def, bodyA, bodyB) { - /** @internal */ this.m_type = 'unknown-joint'; - /** @internal */ this.m_prev = null; - /** @internal */ this.m_next = null; - /** @internal */ this.m_edgeA = new JointEdge(); - /** @internal */ this.m_edgeB = new JointEdge(); - /** @internal */ this.m_islandFlag = false; - bodyA = 'bodyA' in def ? def.bodyA : bodyA; - bodyB = 'bodyB' in def ? def.bodyB : bodyB; - this.m_bodyA = bodyA; - this.m_bodyB = bodyB; - this.m_collideConnected = !!def.collideConnected; - this.m_userData = def.userData; } + wm.normal = normal; + wm.points = points; + wm.separations = separations; + return wm; + }; + Manifold.clipSegmentToLine = clipSegmentToLine; + Manifold.ClipVertex = ClipVertex; + Manifold.getPointStates = getPointStates; + Manifold.PointState = PointState; + return Manifold; +}()); +/** + * A manifold point is a contact point belonging to a contact manifold. It holds + * details related to the geometry and dynamics of the contact points. + * + * This structure is stored across time steps, so we keep it small. + * + * Note: impulses are used for internal caching and may not provide reliable + * contact forces, especially for high speed collisions. + */ +var ManifoldPoint = /** @class */ (function () { + function ManifoldPoint() { /** - * Short-cut function to determine if either body is inactive. - */ - Joint.prototype.isActive = function () { - return this.m_bodyA.isActive() && this.m_bodyB.isActive(); - }; - /** - * Get the type of the concrete joint. + * Usage depends on manifold type. + * e_circles: the local center of circleB, + * e_faceA: the local center of cirlceB or the clip point of polygonB, + * e_faceB: the clip point of polygonA. */ - Joint.prototype.getType = function () { - return this.m_type; - }; + this.localPoint = Vec2.zero(); /** - * Get the first body attached to this joint. + * The non-penetration impulse */ - Joint.prototype.getBodyA = function () { - return this.m_bodyA; - }; + this.normalImpulse = 0; /** - * Get the second body attached to this joint. + * The friction impulse */ - Joint.prototype.getBodyB = function () { - return this.m_bodyB; - }; + this.tangentImpulse = 0; /** - * Get the next joint the world joint list. + * Uniquely identifies a contact point between two shapes to facilatate warm starting */ - Joint.prototype.getNext = function () { - return this.m_next; - }; - Joint.prototype.getUserData = function () { - return this.m_userData; - }; - Joint.prototype.setUserData = function (data) { - this.m_userData = data; - }; + this.id = new ContactID(); + } + return ManifoldPoint; +}()); +/** + * Contact ids to facilitate warm starting. + */ +var ContactID = /** @class */ (function () { + function ContactID() { + this.cf = new ContactFeature(); + } + Object.defineProperty(ContactID.prototype, "key", { + /** + * Used to quickly compare contact ids. + */ + get: function () { + return this.cf.indexA + this.cf.indexB * 4 + this.cf.typeA * 16 + this.cf.typeB * 64; + }, + enumerable: false, + configurable: true + }); + ContactID.prototype.set = function (o) { + // this.key = o.key; + this.cf.set(o.cf); + }; + return ContactID; +}()); +/** + * The features that intersect to form the contact point. + */ +var ContactFeature = /** @class */ (function () { + function ContactFeature() { + } + ContactFeature.prototype.set = function (o) { + this.indexA = o.indexA; + this.indexB = o.indexB; + this.typeA = o.typeA; + this.typeB = o.typeB; + }; + return ContactFeature; +}()); +/** + * This is used to compute the current state of a contact manifold. + */ +var WorldManifold = /** @class */ (function () { + function WorldManifold() { /** - * Get collide connected. Note: modifying the collide connect flag won't work - * correctly because the flag is only checked when fixture AABBs begin to - * overlap. + * World contact point (point of intersection) */ - Joint.prototype.getCollideConnected = function () { - return this.m_collideConnected; - }; + this.points = []; // [maxManifoldPoints] /** - * Shift the origin for any points stored in world coordinates. + * A negative value indicates overlap, in meters */ - Joint.prototype.shiftOrigin = function (newOrigin) { }; - return Joint; - }()); + this.separations = []; // [maxManifoldPoints] + } + return WorldManifold; +}()); +/** + * Compute the point states given two manifolds. The states pertain to the + * transition from manifold1 to manifold2. So state1 is either persist or remove + * while state2 is either add or persist. + */ +function getPointStates(state1, state2, manifold1, manifold2) { + // state1, state2: PointState[Settings.maxManifoldPoints] + // for (var i = 0; i < Settings.maxManifoldPoints; ++i) { + // state1[i] = PointState.nullState; + // state2[i] = PointState.nullState; + // } + // Detect persists and removes. + for (var i = 0; i < manifold1.pointCount; ++i) { + var id = manifold1.points[i].id; + state1[i] = PointState.removeState; + for (var j = 0; j < manifold2.pointCount; ++j) { + if (manifold2.points[j].id.key == id.key) { + state1[i] = PointState.persistState; + break; + } + } + } + // Detect persists and adds. + for (var i = 0; i < manifold2.pointCount; ++i) { + var id = manifold2.points[i].id; + state2[i] = PointState.addState; + for (var j = 0; j < manifold1.pointCount; ++j) { + if (manifold1.points[j].id.key == id.key) { + state2[i] = PointState.persistState; + break; + } + } + } +} +/** + * Clipping for contact manifolds. Sutherland-Hodgman clipping. + */ +function clipSegmentToLine(vOut, vIn, normal, offset, vertexIndexA) { + // Start with no output points + var numOut = 0; + // Calculate the distance of end points to the line + var distance0 = Vec2.dot(normal, vIn[0].v) - offset; + var distance1 = Vec2.dot(normal, vIn[1].v) - offset; + // If the points are behind the plane + if (distance0 <= 0.0) + vOut[numOut++].set(vIn[0]); + if (distance1 <= 0.0) + vOut[numOut++].set(vIn[1]); + // If the points are on different sides of the plane + if (distance0 * distance1 < 0.0) { + // Find intersection point of edge and plane + var interp = distance0 / (distance0 - distance1); + vOut[numOut].v.setCombine(1 - interp, vIn[0].v, interp, vIn[1].v); + // VertexA is hitting edgeB. + vOut[numOut].id.cf.indexA = vertexIndexA; + vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB; + vOut[numOut].id.cf.typeA = ContactFeatureType.e_vertex; + vOut[numOut].id.cf.typeB = ContactFeatureType.e_face; + ++numOut; + } + return numOut; +} - var now = function () { - return Date.now(); +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A contact edge is used to connect bodies and contacts together in a contact + * graph where each body is a node and each contact is an edge. A contact edge + * belongs to a doubly linked list maintained in each attached body. Each + * contact has two contact nodes, one for each attached body. + * + * @prop {Contact} contact The contact + * @prop {ContactEdge} prev The previous contact edge in the body's contact list + * @prop {ContactEdge} next The next contact edge in the body's contact list + * @prop {Body} other Provides quick access to the other body attached. + */ +var ContactEdge = /** @class */ (function () { + function ContactEdge(contact) { + this.contact = contact; + } + return ContactEdge; +}()); +/** + * Friction mixing law. The idea is to allow either fixture to drive the + * restitution to zero. For example, anything slides on ice. + */ +function mixFriction(friction1, friction2) { + return math.sqrt(friction1 * friction2); +} +/** + * Restitution mixing law. The idea is allow for anything to bounce off an + * inelastic surface. For example, a superball bounces on anything. + */ +function mixRestitution(restitution1, restitution2) { + return restitution1 > restitution2 ? restitution1 : restitution2; +} +// TODO: move this to Settings? +var s_registers = []; +// TODO: merge with ManifoldPoint? +var VelocityConstraintPoint = /** @class */ (function () { + function VelocityConstraintPoint() { + this.rA = Vec2.zero(); + this.rB = Vec2.zero(); + this.normalImpulse = 0; + this.tangentImpulse = 0; + this.normalMass = 0; + this.tangentMass = 0; + this.velocityBias = 0; + } + return VelocityConstraintPoint; +}()); +/** + * The class manages contact between two shapes. A contact exists for each + * overlapping AABB in the broad-phase (except if filtered). Therefore a contact + * object may exist that has no contact points. + */ +var Contact = /** @class */ (function () { + function Contact(fA, indexA, fB, indexB, evaluateFcn) { + /** @internal */ + this.m_manifold = new Manifold(); + /** @internal */ + this.m_prev = null; + /** @internal */ + this.m_next = null; + /** @internal */ + this.m_toi = 1.0; + /** @internal */ + this.m_toiCount = 0; + /** @internal This contact has a valid TOI in m_toi */ + this.m_toiFlag = false; + /** @internal */ + this.m_tangentSpeed = 0.0; + /** @internal This contact can be disabled (by user) */ + this.m_enabledFlag = true; + /** @internal Used when crawling contact graph when forming islands. */ + this.m_islandFlag = false; + /** @internal Set when the shapes are touching. */ + this.m_touchingFlag = false; + /** @internal This contact needs filtering because a fixture filter was changed. */ + this.m_filterFlag = false; + /** @internal This bullet contact had a TOI event */ + this.m_bulletHitFlag = false; + /** @internal Contact reporting impulse object cache */ + this.m_impulse = new ContactImpulse(this); + // VelocityConstraint + /** @internal */ this.v_points = []; // [maxManifoldPoints]; + /** @internal */ this.v_normal = Vec2.zero(); + /** @internal */ this.v_normalMass = new Mat22(); + /** @internal */ this.v_K = new Mat22(); + // PositionConstraint + /** @internal */ this.p_localPoints = []; // [maxManifoldPoints]; + /** @internal */ this.p_localNormal = Vec2.zero(); + /** @internal */ this.p_localPoint = Vec2.zero(); + /** @internal */ this.p_localCenterA = Vec2.zero(); + /** @internal */ this.p_localCenterB = Vec2.zero(); + // Nodes for connecting bodies. + this.m_nodeA = new ContactEdge(this); + this.m_nodeB = new ContactEdge(this); + this.m_fixtureA = fA; + this.m_fixtureB = fB; + this.m_indexA = indexA; + this.m_indexB = indexB; + this.m_evaluateFcn = evaluateFcn; + this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction); + this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution); + } + Contact.prototype.initConstraint = function (step) { + var fixtureA = this.m_fixtureA; + var fixtureB = this.m_fixtureB; + var shapeA = fixtureA.getShape(); + var shapeB = fixtureB.getShape(); + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + var manifold = this.getManifold(); + var pointCount = manifold.pointCount; + this.v_invMassA = bodyA.m_invMass; + this.v_invMassB = bodyB.m_invMass; + this.v_invIA = bodyA.m_invI; + this.v_invIB = bodyB.m_invI; + this.v_friction = this.m_friction; + this.v_restitution = this.m_restitution; + this.v_tangentSpeed = this.m_tangentSpeed; + this.v_pointCount = pointCount; + this.v_K.setZero(); + this.v_normalMass.setZero(); + this.p_invMassA = bodyA.m_invMass; + this.p_invMassB = bodyB.m_invMass; + this.p_invIA = bodyA.m_invI; + this.p_invIB = bodyB.m_invI; + this.p_localCenterA = Vec2.clone(bodyA.m_sweep.localCenter); + this.p_localCenterB = Vec2.clone(bodyB.m_sweep.localCenter); + this.p_radiusA = shapeA.m_radius; + this.p_radiusB = shapeB.m_radius; + this.p_type = manifold.type; + this.p_localNormal = Vec2.clone(manifold.localNormal); + this.p_localPoint = Vec2.clone(manifold.localPoint); + this.p_pointCount = pointCount; + for (var j = 0; j < pointCount; ++j) { + var cp = manifold.points[j]; + var vcp = this.v_points[j] = new VelocityConstraintPoint(); + if (step.warmStarting) { + vcp.normalImpulse = step.dtRatio * cp.normalImpulse; + vcp.tangentImpulse = step.dtRatio * cp.tangentImpulse; + } + else { + vcp.normalImpulse = 0.0; + vcp.tangentImpulse = 0.0; + } + vcp.rA.setZero(); + vcp.rB.setZero(); + vcp.normalMass = 0.0; + vcp.tangentMass = 0.0; + vcp.velocityBias = 0.0; + this.p_localPoints[j] = Vec2.clone(cp.localPoint); + } + }; + /** + * Get the contact manifold. Do not modify the manifold unless you understand + * the internals of the library. + */ + Contact.prototype.getManifold = function () { + return this.m_manifold; + }; + /** + * Get the world manifold. + */ + Contact.prototype.getWorldManifold = function (worldManifold) { + var bodyA = this.m_fixtureA.getBody(); + var bodyB = this.m_fixtureB.getBody(); + var shapeA = this.m_fixtureA.getShape(); + var shapeB = this.m_fixtureB.getShape(); + return this.m_manifold.getWorldManifold(worldManifold, bodyA.getTransform(), shapeA.m_radius, bodyB.getTransform(), shapeB.m_radius); + }; + /** + * Enable/disable this contact. This can be used inside the pre-solve contact + * listener. The contact is only disabled for the current time step (or sub-step + * in continuous collisions). + */ + Contact.prototype.setEnabled = function (flag) { + this.m_enabledFlag = !!flag; + }; + /** + * Has this contact been disabled? + */ + Contact.prototype.isEnabled = function () { + return this.m_enabledFlag; + }; + /** + * Is this contact touching? + */ + Contact.prototype.isTouching = function () { + return this.m_touchingFlag; + }; + /** + * Get the next contact in the world's contact list. + */ + Contact.prototype.getNext = function () { + return this.m_next; + }; + /** + * Get fixture A in this contact. + */ + Contact.prototype.getFixtureA = function () { + return this.m_fixtureA; + }; + /** + * Get fixture B in this contact. + */ + Contact.prototype.getFixtureB = function () { + return this.m_fixtureB; + }; + /** + * Get the child primitive index for fixture A. + */ + Contact.prototype.getChildIndexA = function () { + return this.m_indexA; + }; + /** + * Get the child primitive index for fixture B. + */ + Contact.prototype.getChildIndexB = function () { + return this.m_indexB; }; - var diff = function (time) { - return Date.now() - time; + /** + * Flag this contact for filtering. Filtering will occur the next time step. + */ + Contact.prototype.flagForFiltering = function () { + this.m_filterFlag = true; }; - var Timer = { - now: now, - diff: diff, + /** + * Override the default friction mixture. You can call this in + * ContactListener.preSolve. This value persists until set or reset. + */ + Contact.prototype.setFriction = function (friction) { + this.m_friction = friction; }; - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * Input parameters for TimeOfImpact. - */ - var TOIInput = /** @class */ (function () { - function TOIInput() { - this.proxyA = new DistanceProxy(); - this.proxyB = new DistanceProxy(); - this.sweepA = new Sweep(); - this.sweepB = new Sweep(); - } - return TOIInput; - }()); - var TOIOutputState; - (function (TOIOutputState) { - TOIOutputState[TOIOutputState["e_unknown"] = 0] = "e_unknown"; - TOIOutputState[TOIOutputState["e_failed"] = 1] = "e_failed"; - TOIOutputState[TOIOutputState["e_overlapped"] = 2] = "e_overlapped"; - TOIOutputState[TOIOutputState["e_touching"] = 3] = "e_touching"; - TOIOutputState[TOIOutputState["e_separated"] = 4] = "e_separated"; - })(TOIOutputState || (TOIOutputState = {})); - /** - * Output parameters for TimeOfImpact. - */ - var TOIOutput = /** @class */ (function () { - function TOIOutput() { - } - return TOIOutput; - }()); - stats.toiTime = 0; - stats.toiMaxTime = 0; - stats.toiCalls = 0; - stats.toiIters = 0; - stats.toiMaxIters = 0; - stats.toiRootIters = 0; - stats.toiMaxRootIters = 0; - /** - * Compute the upper bound on time before two shapes penetrate. Time is - * represented as a fraction between [0,tMax]. This uses a swept separating axis - * and may miss some intermediate, non-tunneling collision. If you change the - * time interval, you should call this function again. + /** + * Get the friction. + */ + Contact.prototype.getFriction = function () { + return this.m_friction; + }; + /** + * Reset the friction mixture to the default value. + */ + Contact.prototype.resetFriction = function () { + this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction); + }; + /** + * Override the default restitution mixture. You can call this in + * ContactListener.preSolve. The value persists until you set or reset. + */ + Contact.prototype.setRestitution = function (restitution) { + this.m_restitution = restitution; + }; + /** + * Get the restitution. + */ + Contact.prototype.getRestitution = function () { + return this.m_restitution; + }; + /** + * Reset the restitution to the default value. + */ + Contact.prototype.resetRestitution = function () { + this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution); + }; + /** + * Set the desired tangent speed for a conveyor belt behavior. In meters per + * second. + */ + Contact.prototype.setTangentSpeed = function (speed) { + this.m_tangentSpeed = speed; + }; + /** + * Get the desired tangent speed. In meters per second. + */ + Contact.prototype.getTangentSpeed = function () { + return this.m_tangentSpeed; + }; + /** + * Called by Update method, and implemented by subclasses. + */ + Contact.prototype.evaluate = function (manifold, xfA, xfB) { + this.m_evaluateFcn(manifold, xfA, this.m_fixtureA, this.m_indexA, xfB, this.m_fixtureB, this.m_indexB); + }; + /** + * Updates the contact manifold and touching status. * - * Note: use Distance to compute the contact point and normal at the time of - * impact. + * Note: do not assume the fixture AABBs are overlapping or are valid. * - * CCD via the local separating axis method. This seeks progression by computing - * the largest time at which separation is maintained. - */ - function TimeOfImpact(output, input) { - var timer = Timer.now(); - ++stats.toiCalls; - output.state = TOIOutputState.e_unknown; - output.t = input.tMax; - var proxyA = input.proxyA; // DistanceProxy - var proxyB = input.proxyB; // DistanceProxy - var sweepA = input.sweepA; // Sweep - var sweepB = input.sweepB; // Sweep - // Large rotations can make the root finder fail, so we normalize the - // sweep angles. - sweepA.normalize(); - sweepB.normalize(); - var tMax = input.tMax; - var totalRadius = proxyA.m_radius + proxyB.m_radius; - var target = math.max(Settings.linearSlop, totalRadius - 3.0 * Settings.linearSlop); - var tolerance = 0.25 * Settings.linearSlop; - var t1 = 0.0; - var k_maxIterations = Settings.maxTOIIterations; - var iter = 0; - // Prepare input for distance query. - var cache = new SimplexCache(); - var distanceInput = new DistanceInput(); - distanceInput.proxyA = input.proxyA; - distanceInput.proxyB = input.proxyB; - distanceInput.useRadii = false; - // The outer loop progressively attempts to compute new separating axes. - // This loop terminates when an axis is repeated (no progress is made). - while (true) { - var xfA = Transform.identity(); - var xfB = Transform.identity(); - sweepA.getTransform(xfA, t1); - sweepB.getTransform(xfB, t1); - // Get the distance between shapes. We can also use the results - // to get a separating axis. - distanceInput.transformA = xfA; - distanceInput.transformB = xfB; - var distanceOutput = new DistanceOutput(); - Distance(distanceOutput, cache, distanceInput); - // If the shapes are overlapped, we give up on continuous collision. - if (distanceOutput.distance <= 0.0) { - // Failure! - output.state = TOIOutputState.e_overlapped; - output.t = 0.0; - break; - } - if (distanceOutput.distance < target + tolerance) { - // Victory! - output.state = TOIOutputState.e_touching; - output.t = t1; - break; - } - // Initialize the separating axis. - var fcn = new SeparationFunction(); - fcn.initialize(cache, proxyA, sweepA, proxyB, sweepB, t1); - // if (false) { - // // Dump the curve seen by the root finder - // const N = 100; - // const dx = 1.0 / N; - // const xs = []; // [ N + 1 ]; - // const fs = []; // [ N + 1 ]; - // const x = 0.0; - // for (const i = 0; i <= N; ++i) { - // sweepA.getTransform(xfA, x); - // sweepB.getTransform(xfB, x); - // const f = fcn.evaluate(xfA, xfB) - target; - // printf("%g %g\n", x, f); - // xs[i] = x; - // fs[i] = f; - // x += dx; - // } - // } - // Compute the TOI on the separating axis. We do this by successively - // resolving the deepest point. This loop is bounded by the number of - // vertices. - var done = false; - var t2 = tMax; - var pushBackIter = 0; - while (true) { - // Find the deepest point at t2. Store the witness point indices. - var s2 = fcn.findMinSeparation(t2); - // const indexA = fcn.indexA; - // const indexB = fcn.indexB; - // Is the final configuration separated? - if (s2 > target + tolerance) { - // Victory! - output.state = TOIOutputState.e_separated; - output.t = tMax; - done = true; - break; - } - // Has the separation reached tolerance? - if (s2 > target - tolerance) { - // Advance the sweeps - t1 = t2; - break; - } - // Compute the initial separation of the witness points. - var s1 = fcn.evaluate(t1); - // const indexA = fcn.indexA; - // const indexB = fcn.indexB; - // Check for initial overlap. This might happen if the root finder - // runs out of iterations. - if (s1 < target - tolerance) { - output.state = TOIOutputState.e_failed; - output.t = t1; - done = true; - break; - } - // Check for touching - if (s1 <= target + tolerance) { - // Victory! t1 should hold the TOI (could be 0.0). - output.state = TOIOutputState.e_touching; - output.t = t1; - done = true; - break; - } - // Compute 1D root of: f(x) - target = 0 - var rootIterCount = 0; - var a1 = t1; - var a2 = t2; - while (true) { - // Use a mix of the secant rule and bisection. - var t = void 0; - if (rootIterCount & 1) { - // Secant rule to improve convergence. - t = a1 + (target - s1) * (a2 - a1) / (s2 - s1); - } - else { - // Bisection to guarantee progress. - t = 0.5 * (a1 + a2); - } - ++rootIterCount; - ++stats.toiRootIters; - var s = fcn.evaluate(t); - fcn.indexA; - fcn.indexB; - if (math.abs(s - target) < tolerance) { - // t2 holds a tentative value for t1 - t2 = t; - break; - } - // Ensure we continue to bracket the root. - if (s > target) { - a1 = t; - s1 = s; - } - else { - a2 = t; - s2 = s; - } - if (rootIterCount === 50) { + * @param listener.beginContact + * @param listener.endContact + * @param listener.preSolve + */ + Contact.prototype.update = function (listener) { + // Re-enable this contact. + this.m_enabledFlag = true; + var touching = false; + var wasTouching = this.m_touchingFlag; + var sensorA = this.m_fixtureA.isSensor(); + var sensorB = this.m_fixtureB.isSensor(); + var sensor = sensorA || sensorB; + var bodyA = this.m_fixtureA.getBody(); + var bodyB = this.m_fixtureB.getBody(); + var xfA = bodyA.getTransform(); + var xfB = bodyB.getTransform(); + var oldManifold; + // Is this contact a sensor? + if (sensor) { + var shapeA = this.m_fixtureA.getShape(); + var shapeB = this.m_fixtureB.getShape(); + touching = testOverlap(shapeA, this.m_indexA, shapeB, this.m_indexB, xfA, xfB); + // Sensors don't generate manifolds. + this.m_manifold.pointCount = 0; + } + else { + // TODO reuse manifold + oldManifold = this.m_manifold; + this.m_manifold = new Manifold(); + this.evaluate(this.m_manifold, xfA, xfB); + touching = this.m_manifold.pointCount > 0; + // Match old contact ids to new contact ids and copy the + // stored impulses to warm start the solver. + for (var i = 0; i < this.m_manifold.pointCount; ++i) { + var nmp = this.m_manifold.points[i]; + nmp.normalImpulse = 0.0; + nmp.tangentImpulse = 0.0; + for (var j = 0; j < oldManifold.pointCount; ++j) { + var omp = oldManifold.points[j]; + if (omp.id.key == nmp.id.key) { + nmp.normalImpulse = omp.normalImpulse; + nmp.tangentImpulse = omp.tangentImpulse; break; } } - stats.toiMaxRootIters = math.max(stats.toiMaxRootIters, rootIterCount); - ++pushBackIter; - if (pushBackIter === Settings.maxPolygonVertices) { - break; - } - } - ++iter; - ++stats.toiIters; - if (done) { - break; } - if (iter === k_maxIterations) { - // Root finder got stuck. Semi-victory. - output.state = TOIOutputState.e_failed; - output.t = t1; - break; + if (touching != wasTouching) { + bodyA.setAwake(true); + bodyB.setAwake(true); } } - stats.toiMaxIters = math.max(stats.toiMaxIters, iter); - var time = Timer.diff(timer); - stats.toiMaxTime = math.max(stats.toiMaxTime, time); - stats.toiTime += time; - } - var SeparationFunctionType; - (function (SeparationFunctionType) { - SeparationFunctionType[SeparationFunctionType["e_points"] = 1] = "e_points"; - SeparationFunctionType[SeparationFunctionType["e_faceA"] = 2] = "e_faceA"; - SeparationFunctionType[SeparationFunctionType["e_faceB"] = 3] = "e_faceB"; - })(SeparationFunctionType || (SeparationFunctionType = {})); - var SeparationFunction = /** @class */ (function () { - function SeparationFunction() { - this.m_proxyA = new DistanceProxy(); - this.m_proxyB = new DistanceProxy(); - this.m_localPoint = Vec2.zero(); - this.m_axis = Vec2.zero(); - } - // TODO_ERIN might not need to return the separation - SeparationFunction.prototype.initialize = function (cache, proxyA, sweepA, proxyB, sweepB, t1) { - this.m_proxyA = proxyA; - this.m_proxyB = proxyB; - var count = cache.count; - this.m_sweepA = sweepA; - this.m_sweepB = sweepB; - var xfA = Transform.identity(); - var xfB = Transform.identity(); - this.m_sweepA.getTransform(xfA, t1); - this.m_sweepB.getTransform(xfB, t1); - if (count === 1) { - this.m_type = SeparationFunctionType.e_points; - var localPointA = this.m_proxyA.getVertex(cache.indexA[0]); - var localPointB = this.m_proxyB.getVertex(cache.indexB[0]); - var pointA = Transform.mulVec2(xfA, localPointA); - var pointB = Transform.mulVec2(xfB, localPointB); - this.m_axis.setCombine(1, pointB, -1, pointA); - var s = this.m_axis.normalize(); - return s; - } - else if (cache.indexA[0] === cache.indexA[1]) { - // Two points on B and one on A. - this.m_type = SeparationFunctionType.e_faceB; - var localPointB1 = proxyB.getVertex(cache.indexB[0]); - var localPointB2 = proxyB.getVertex(cache.indexB[1]); - this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointB2, localPointB1), 1.0); - this.m_axis.normalize(); - var normal = Rot.mulVec2(xfB.q, this.m_axis); - this.m_localPoint = Vec2.mid(localPointB1, localPointB2); - var pointB = Transform.mulVec2(xfB, this.m_localPoint); - var localPointA = proxyA.getVertex(cache.indexA[0]); - var pointA = Transform.mulVec2(xfA, localPointA); - var s = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal); - if (s < 0.0) { - this.m_axis = Vec2.neg(this.m_axis); - s = -s; - } - return s; - } - else { - // Two points on A and one or two points on B. - this.m_type = SeparationFunctionType.e_faceA; - var localPointA1 = this.m_proxyA.getVertex(cache.indexA[0]); - var localPointA2 = this.m_proxyA.getVertex(cache.indexA[1]); - this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointA2, localPointA1), 1.0); - this.m_axis.normalize(); - var normal = Rot.mulVec2(xfA.q, this.m_axis); - this.m_localPoint = Vec2.mid(localPointA1, localPointA2); - var pointA = Transform.mulVec2(xfA, this.m_localPoint); - var localPointB = this.m_proxyB.getVertex(cache.indexB[0]); - var pointB = Transform.mulVec2(xfB, localPointB); - var s = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal); - if (s < 0.0) { - this.m_axis = Vec2.neg(this.m_axis); - s = -s; - } - return s; - } - }; - SeparationFunction.prototype.compute = function (find, t) { - // It was findMinSeparation and evaluate - var xfA = Transform.identity(); - var xfB = Transform.identity(); - this.m_sweepA.getTransform(xfA, t); - this.m_sweepB.getTransform(xfB, t); - switch (this.m_type) { - case SeparationFunctionType.e_points: { - if (find) { - var axisA = Rot.mulTVec2(xfA.q, this.m_axis); - var axisB = Rot.mulTVec2(xfB.q, Vec2.neg(this.m_axis)); - this.indexA = this.m_proxyA.getSupport(axisA); - this.indexB = this.m_proxyB.getSupport(axisB); - } - var localPointA = this.m_proxyA.getVertex(this.indexA); - var localPointB = this.m_proxyB.getVertex(this.indexB); - var pointA = Transform.mulVec2(xfA, localPointA); - var pointB = Transform.mulVec2(xfB, localPointB); - var sep = Vec2.dot(pointB, this.m_axis) - Vec2.dot(pointA, this.m_axis); - return sep; - } - case SeparationFunctionType.e_faceA: { - var normal = Rot.mulVec2(xfA.q, this.m_axis); - var pointA = Transform.mulVec2(xfA, this.m_localPoint); - if (find) { - var axisB = Rot.mulTVec2(xfB.q, Vec2.neg(normal)); - this.indexA = -1; - this.indexB = this.m_proxyB.getSupport(axisB); - } - var localPointB = this.m_proxyB.getVertex(this.indexB); - var pointB = Transform.mulVec2(xfB, localPointB); - var sep = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal); - return sep; - } - case SeparationFunctionType.e_faceB: { - var normal = Rot.mulVec2(xfB.q, this.m_axis); - var pointB = Transform.mulVec2(xfB, this.m_localPoint); - if (find) { - var axisA = Rot.mulTVec2(xfA.q, Vec2.neg(normal)); - this.indexB = -1; - this.indexA = this.m_proxyA.getSupport(axisA); - } - var localPointA = this.m_proxyA.getVertex(this.indexA); - var pointA = Transform.mulVec2(xfA, localPointA); - var sep = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal); - return sep; - } - default: - if (find) { - this.indexA = -1; - this.indexB = -1; - } - return 0.0; - } - }; - SeparationFunction.prototype.findMinSeparation = function (t) { - return this.compute(true, t); - }; - SeparationFunction.prototype.evaluate = function (t) { - return this.compute(false, t); - }; - return SeparationFunction; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var TimeStep = /** @class */ (function () { - function TimeStep() { - /** time step */ - this.dt = 0; - /** inverse time step (0 if dt == 0) */ - this.inv_dt = 0; - this.velocityIterations = 0; - this.positionIterations = 0; - this.warmStarting = false; - this.blockSolve = true; - /** timestep ratio for variable timestep */ - this.inv_dt0 = 0.0; - /** dt * inv_dt0 */ - this.dtRatio = 1; - } - TimeStep.prototype.reset = function (dt) { - if (this.dt > 0.0) { - this.inv_dt0 = this.inv_dt; - } - this.dt = dt; - this.inv_dt = dt == 0 ? 0 : 1 / dt; - this.dtRatio = dt * this.inv_dt0; - }; - return TimeStep; - }()); - // reuse - var s_subStep = new TimeStep(); - /** - * Contact impulses for reporting. Impulses are used instead of forces because - * sub-step forces may approach infinity for rigid body collisions. These match - * up one-to-one with the contact points in Manifold. - */ - var ContactImpulse = /** @class */ (function () { - function ContactImpulse(contact) { - this.contact = contact; - this.normals = []; - this.tangents = []; - } - Object.defineProperty(ContactImpulse.prototype, "normalImpulses", { - get: function () { - var contact = this.contact; - var normals = this.normals; - normals.length = 0; - for (var p = 0; p < contact.v_points.length; ++p) { - normals.push(contact.v_points[p].normalImpulse); - } - return normals; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(ContactImpulse.prototype, "tangentImpulses", { - get: function () { - var contact = this.contact; - var tangents = this.tangents; - tangents.length = 0; - for (var p = 0; p < contact.v_points.length; ++p) { - tangents.push(contact.v_points[p].tangentImpulse); - } - return tangents; - }, - enumerable: false, - configurable: true - }); - return ContactImpulse; - }()); - /** - * Finds and solves islands. An island is a connected subset of the world. - */ - var Solver = /** @class */ (function () { - function Solver(world) { - this.m_world = world; - this.m_stack = []; - this.m_bodies = []; - this.m_contacts = []; - this.m_joints = []; - } - Solver.prototype.clear = function () { - this.m_stack.length = 0; - this.m_bodies.length = 0; - this.m_contacts.length = 0; - this.m_joints.length = 0; - }; - Solver.prototype.addBody = function (body) { - this.m_bodies.push(body); - // why? - // body.c_position.c.setZero(); - // body.c_position.a = 0; - // body.c_velocity.v.setZero(); - // body.c_velocity.w = 0; - }; - Solver.prototype.addContact = function (contact) { - this.m_contacts.push(contact); - }; - Solver.prototype.addJoint = function (joint) { - this.m_joints.push(joint); - }; - Solver.prototype.solveWorld = function (step) { - var world = this.m_world; - // Clear all the island flags. - for (var b = world.m_bodyList; b; b = b.m_next) { - b.m_islandFlag = false; - } - for (var c = world.m_contactList; c; c = c.m_next) { - c.m_islandFlag = false; - } - for (var j = world.m_jointList; j; j = j.m_next) { - j.m_islandFlag = false; - } - // Build and simulate all awake islands. - var stack = this.m_stack; - for (var seed = world.m_bodyList; seed; seed = seed.m_next) { - if (seed.m_islandFlag) { - continue; - } - if (seed.isAwake() == false || seed.isActive() == false) { - continue; - } - // The seed can be dynamic or kinematic. - if (seed.isStatic()) { - continue; - } - // Reset island and stack. - this.clear(); - stack.push(seed); - seed.m_islandFlag = true; - // Perform a depth first search (DFS) on the constraint graph. - while (stack.length > 0) { - // Grab the next body off the stack and add it to the island. - var b = stack.pop(); - this.addBody(b); - // Make sure the body is awake. - b.setAwake(true); - // To keep islands as small as possible, we don't - // propagate islands across static bodies. - if (b.isStatic()) { - continue; - } - // Search all contacts connected to this body. - for (var ce = b.m_contactList; ce; ce = ce.next) { - var contact = ce.contact; - // Has this contact already been added to an island? - if (contact.m_islandFlag) { - continue; - } - // Is this contact solid and touching? - if (contact.isEnabled() == false || contact.isTouching() == false) { - continue; - } - // Skip sensors. - var sensorA = contact.m_fixtureA.m_isSensor; - var sensorB = contact.m_fixtureB.m_isSensor; - if (sensorA || sensorB) { - continue; - } - this.addContact(contact); - contact.m_islandFlag = true; - var other = ce.other; - // Was the other body already added to this island? - if (other.m_islandFlag) { - continue; - } - // _ASSERT && common.assert(stack.length < world.m_bodyCount); - stack.push(other); - other.m_islandFlag = true; - } - // Search all joints connect to this body. - for (var je = b.m_jointList; je; je = je.next) { - if (je.joint.m_islandFlag == true) { - continue; - } - var other = je.other; - // Don't simulate joints connected to inactive bodies. - if (other.isActive() == false) { - continue; - } - this.addJoint(je.joint); - je.joint.m_islandFlag = true; - if (other.m_islandFlag) { - continue; - } - // _ASSERT && common.assert(stack.length < world.m_bodyCount); - stack.push(other); - other.m_islandFlag = true; - } - } - this.solveIsland(step); - // Post solve cleanup. - for (var i = 0; i < this.m_bodies.length; ++i) { - // Allow static bodies to participate in other islands. - // TODO: are they added at all? - var b = this.m_bodies[i]; - if (b.isStatic()) { - b.m_islandFlag = false; - } - } - } - }; - Solver.prototype.solveIsland = function (step) { - // B2: Island Solve - var world = this.m_world; - var gravity = world.m_gravity; - var allowSleep = world.m_allowSleep; - var h = step.dt; - // Integrate velocities and apply damping. Initialize the body state. - for (var i = 0; i < this.m_bodies.length; ++i) { - var body = this.m_bodies[i]; - var c = Vec2.clone(body.m_sweep.c); - var a = body.m_sweep.a; - var v = Vec2.clone(body.m_linearVelocity); - var w = body.m_angularVelocity; - // Store positions for continuous collision. - body.m_sweep.c0.setVec2(body.m_sweep.c); - body.m_sweep.a0 = body.m_sweep.a; - if (body.isDynamic()) { - // Integrate velocities. - v.addMul(h * body.m_gravityScale, gravity); - v.addMul(h * body.m_invMass, body.m_force); - w += h * body.m_invI * body.m_torque; - /** - *
-                     * Apply damping.
-                     * ODE: dv/dt + c * v = 0
-                     * Solution: v(t) = v0 * exp(-c * t)
-                     * Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)
-                     * v2 = exp(-c * dt) * v1
-                     * Pade approximation:
-                     * v2 = v1 * 1 / (1 + c * dt)
-                     * 
- */ - v.mul(1.0 / (1.0 + h * body.m_linearDamping)); - w *= 1.0 / (1.0 + h * body.m_angularDamping); - } - body.c_position.c = c; - body.c_position.a = a; - body.c_velocity.v = v; - body.c_velocity.w = w; - } - for (var i = 0; i < this.m_contacts.length; ++i) { - var contact = this.m_contacts[i]; - contact.initConstraint(step); - } - for (var i = 0; i < this.m_contacts.length; ++i) { - var contact = this.m_contacts[i]; - contact.initVelocityConstraint(step); - } - if (step.warmStarting) { - // Warm start. - for (var i = 0; i < this.m_contacts.length; ++i) { - var contact = this.m_contacts[i]; - contact.warmStartConstraint(step); - } - } - for (var i = 0; i < this.m_joints.length; ++i) { - var joint = this.m_joints[i]; - joint.initVelocityConstraints(step); - } - // Solve velocity constraints - for (var i = 0; i < step.velocityIterations; ++i) { - for (var j = 0; j < this.m_joints.length; ++j) { - var joint = this.m_joints[j]; - joint.solveVelocityConstraints(step); - } - for (var j = 0; j < this.m_contacts.length; ++j) { - var contact = this.m_contacts[j]; - contact.solveVelocityConstraint(step); - } - } - // Store impulses for warm starting - for (var i = 0; i < this.m_contacts.length; ++i) { - var contact = this.m_contacts[i]; - contact.storeConstraintImpulses(step); - } - // Integrate positions - for (var i = 0; i < this.m_bodies.length; ++i) { - var body = this.m_bodies[i]; - var c = Vec2.clone(body.c_position.c); - var a = body.c_position.a; - var v = Vec2.clone(body.c_velocity.v); - var w = body.c_velocity.w; - // Check for large velocities - var translation = Vec2.mulNumVec2(h, v); - if (Vec2.lengthSquared(translation) > Settings.maxTranslationSquared) { - var ratio = Settings.maxTranslation / translation.length(); - v.mul(ratio); - } - var rotation = h * w; - if (rotation * rotation > Settings.maxRotationSquared) { - var ratio = Settings.maxRotation / math.abs(rotation); - w *= ratio; - } - // Integrate - c.addMul(h, v); - a += h * w; - body.c_position.c.setVec2(c); - body.c_position.a = a; - body.c_velocity.v.setVec2(v); - body.c_velocity.w = w; - } - // Solve position constraints - var positionSolved = false; - for (var i = 0; i < step.positionIterations; ++i) { - var minSeparation = 0.0; - for (var j = 0; j < this.m_contacts.length; ++j) { - var contact = this.m_contacts[j]; - var separation = contact.solvePositionConstraint(step); - minSeparation = math.min(minSeparation, separation); - } - // We can't expect minSpeparation >= -Settings.linearSlop because we don't - // push the separation above -Settings.linearSlop. - var contactsOkay = minSeparation >= -3.0 * Settings.linearSlop; - var jointsOkay = true; - for (var j = 0; j < this.m_joints.length; ++j) { - var joint = this.m_joints[j]; - var jointOkay = joint.solvePositionConstraints(step); - jointsOkay = jointsOkay && jointOkay; - } - if (contactsOkay && jointsOkay) { - // Exit early if the position errors are small. - positionSolved = true; - break; - } - } - // Copy state buffers back to the bodies - for (var i = 0; i < this.m_bodies.length; ++i) { - var body = this.m_bodies[i]; - body.m_sweep.c.setVec2(body.c_position.c); - body.m_sweep.a = body.c_position.a; - body.m_linearVelocity.setVec2(body.c_velocity.v); - body.m_angularVelocity = body.c_velocity.w; - body.synchronizeTransform(); - } - this.postSolveIsland(); - if (allowSleep) { - var minSleepTime = Infinity; - var linTolSqr = Settings.linearSleepToleranceSqr; - var angTolSqr = Settings.angularSleepToleranceSqr; - for (var i = 0; i < this.m_bodies.length; ++i) { - var body = this.m_bodies[i]; - if (body.isStatic()) { - continue; - } - if ((body.m_autoSleepFlag == false) - || (body.m_angularVelocity * body.m_angularVelocity > angTolSqr) - || (Vec2.lengthSquared(body.m_linearVelocity) > linTolSqr)) { - body.m_sleepTime = 0.0; - minSleepTime = 0.0; - } - else { - body.m_sleepTime += h; - minSleepTime = math.min(minSleepTime, body.m_sleepTime); - } - } - if (minSleepTime >= Settings.timeToSleep && positionSolved) { - for (var i = 0; i < this.m_bodies.length; ++i) { - var body = this.m_bodies[i]; - body.setAwake(false); - } - } - } - }; - /** @internal */ - Solver.prototype.printBodies = function (tag) { - for (var i = 0; i < this.m_bodies.length; ++i) { - var b = this.m_bodies[i]; - common.debug(tag, b.c_position.a, b.c_position.c.x, b.c_position.c.y, b.c_velocity.w, b.c_velocity.v.x, b.c_velocity.v.y); - } - }; - /** - * Find TOI contacts and solve them. - */ - Solver.prototype.solveWorldTOI = function (step) { - var world = this.m_world; - if (world.m_stepComplete) { - for (var b = world.m_bodyList; b; b = b.m_next) { - b.m_islandFlag = false; - b.m_sweep.alpha0 = 0.0; - } - for (var c = world.m_contactList; c; c = c.m_next) { - // Invalidate TOI - c.m_toiFlag = false; - c.m_islandFlag = false; - c.m_toiCount = 0; - c.m_toi = 1.0; - } - } - // Find TOI events and solve them. - while (true) { - // Find the first TOI. - var minContact = null; // Contact - var minAlpha = 1.0; - for (var c = world.m_contactList; c; c = c.m_next) { - // Is this contact disabled? - if (c.isEnabled() == false) { - continue; - } - // Prevent excessive sub-stepping. - if (c.m_toiCount > Settings.maxSubSteps) { - continue; - } - var alpha = 1.0; - if (c.m_toiFlag) { - // This contact has a valid cached TOI. - alpha = c.m_toi; - } - else { - var fA_1 = c.getFixtureA(); - var fB_1 = c.getFixtureB(); - // Is there a sensor? - if (fA_1.isSensor() || fB_1.isSensor()) { - continue; - } - var bA_1 = fA_1.getBody(); - var bB_1 = fB_1.getBody(); - var activeA = bA_1.isAwake() && !bA_1.isStatic(); - var activeB = bB_1.isAwake() && !bB_1.isStatic(); - // Is at least one body active (awake and dynamic or kinematic)? - if (activeA == false && activeB == false) { - continue; - } - var collideA = bA_1.isBullet() || !bA_1.isDynamic(); - var collideB = bB_1.isBullet() || !bB_1.isDynamic(); - // Are these two non-bullet dynamic bodies? - if (collideA == false && collideB == false) { - continue; - } - // Compute the TOI for this contact. - // Put the sweeps onto the same time interval. - var alpha0 = bA_1.m_sweep.alpha0; - if (bA_1.m_sweep.alpha0 < bB_1.m_sweep.alpha0) { - alpha0 = bB_1.m_sweep.alpha0; - bA_1.m_sweep.advance(alpha0); - } - else if (bB_1.m_sweep.alpha0 < bA_1.m_sweep.alpha0) { - alpha0 = bA_1.m_sweep.alpha0; - bB_1.m_sweep.advance(alpha0); - } - var indexA = c.getChildIndexA(); - var indexB = c.getChildIndexB(); - bA_1.m_sweep; - bB_1.m_sweep; - // Compute the time of impact in interval [0, minTOI] - var input = new TOIInput(); // TODO: reuse - input.proxyA.set(fA_1.getShape(), indexA); - input.proxyB.set(fB_1.getShape(), indexB); - input.sweepA.set(bA_1.m_sweep); - input.sweepB.set(bB_1.m_sweep); - input.tMax = 1.0; - var output = new TOIOutput(); // TODO: reuse - TimeOfImpact(output, input); - // Beta is the fraction of the remaining portion of the [time?]. - var beta = output.t; - if (output.state == TOIOutputState.e_touching) { - alpha = math.min(alpha0 + (1.0 - alpha0) * beta, 1.0); - } - else { - alpha = 1.0; - } - c.m_toi = alpha; - c.m_toiFlag = true; - } - if (alpha < minAlpha) { - // This is the minimum TOI found so far. - minContact = c; - minAlpha = alpha; - } - } - if (minContact == null || 1.0 - 10.0 * math.EPSILON < minAlpha) { - // No more TOI events. Done! - world.m_stepComplete = true; + this.m_touchingFlag = touching; + if (!wasTouching && touching && listener) { + listener.beginContact(this); + } + if (wasTouching && !touching && listener) { + listener.endContact(this); + } + if (!sensor && touching && listener) { + listener.preSolve(this, oldManifold); + } + }; + Contact.prototype.solvePositionConstraint = function (step) { + return this._solvePositionConstraint(step); + }; + Contact.prototype.solvePositionConstraintTOI = function (step, toiA, toiB) { + return this._solvePositionConstraint(step, toiA, toiB); + }; + Contact.prototype._solvePositionConstraint = function (step, toiA, toiB) { + var toi = !!toiA && !!toiB; + var fixtureA = this.m_fixtureA; + var fixtureB = this.m_fixtureB; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + bodyA.c_velocity; + bodyB.c_velocity; + var positionA = bodyA.c_position; + var positionB = bodyB.c_position; + var localCenterA = Vec2.clone(this.p_localCenterA); + var localCenterB = Vec2.clone(this.p_localCenterB); + var mA = 0.0; + var iA = 0.0; + if (!toi || (bodyA == toiA || bodyA == toiB)) { + mA = this.p_invMassA; + iA = this.p_invIA; + } + var mB = 0.0; + var iB = 0.0; + if (!toi || (bodyB == toiA || bodyB == toiB)) { + mB = this.p_invMassB; + iB = this.p_invIB; + } + var cA = Vec2.clone(positionA.c); + var aA = positionA.a; + var cB = Vec2.clone(positionB.c); + var aB = positionB.a; + var minSeparation = 0.0; + // Solve normal constraints + for (var j = 0; j < this.p_pointCount; ++j) { + var xfA = Transform.identity(); + var xfB = Transform.identity(); + xfA.q.setAngle(aA); + xfB.q.setAngle(aB); + xfA.p = Vec2.sub(cA, Rot.mulVec2(xfA.q, localCenterA)); + xfB.p = Vec2.sub(cB, Rot.mulVec2(xfB.q, localCenterB)); + // PositionSolverManifold + var normal = void 0; + var point = void 0; + var separation = void 0; + switch (this.p_type) { + case ManifoldType.e_circles: { + var pointA = Transform.mulVec2(xfA, this.p_localPoint); + var pointB = Transform.mulVec2(xfB, this.p_localPoints[0]); + normal = Vec2.sub(pointB, pointA); + normal.normalize(); + point = Vec2.combine(0.5, pointA, 0.5, pointB); + separation = Vec2.dot(Vec2.sub(pointB, pointA), normal) - this.p_radiusA - this.p_radiusB; break; } - // Advance the bodies to the TOI. - var fA = minContact.getFixtureA(); - var fB = minContact.getFixtureB(); - var bA = fA.getBody(); - var bB = fB.getBody(); - var backup1 = bA.m_sweep.clone(); - var backup2 = bB.m_sweep.clone(); - bA.advance(minAlpha); - bB.advance(minAlpha); - // The TOI contact likely has some new contact points. - minContact.update(world); - minContact.m_toiFlag = false; - ++minContact.m_toiCount; - // Is the contact solid? - if (minContact.isEnabled() == false || minContact.isTouching() == false) { - // Restore the sweeps. - minContact.setEnabled(false); - bA.m_sweep.set(backup1); - bB.m_sweep.set(backup2); - bA.synchronizeTransform(); - bB.synchronizeTransform(); - continue; - } - bA.setAwake(true); - bB.setAwake(true); - // Build the island - this.clear(); - this.addBody(bA); - this.addBody(bB); - this.addContact(minContact); - bA.m_islandFlag = true; - bB.m_islandFlag = true; - minContact.m_islandFlag = true; - // Get contacts on bodyA and bodyB. - var bodies = [bA, bB]; - for (var i = 0; i < bodies.length; ++i) { - var body = bodies[i]; - if (body.isDynamic()) { - for (var ce = body.m_contactList; ce; ce = ce.next) { - // if (this.m_bodyCount == this.m_bodyCapacity) { break; } - // if (this.m_contactCount == this.m_contactCapacity) { break; } - var contact = ce.contact; - // Has this contact already been added to the island? - if (contact.m_islandFlag) { - continue; - } - // Only add if either is static, kinematic or bullet. - var other = ce.other; - if (other.isDynamic() && !body.isBullet() && !other.isBullet()) { - continue; - } - // Skip sensors. - var sensorA = contact.m_fixtureA.m_isSensor; - var sensorB = contact.m_fixtureB.m_isSensor; - if (sensorA || sensorB) { - continue; - } - // Tentatively advance the body to the TOI. - var backup = other.m_sweep.clone(); - if (other.m_islandFlag == false) { - other.advance(minAlpha); - } - // Update the contact points - contact.update(world); - // Was the contact disabled by the user? - // Are there contact points? - if (contact.isEnabled() == false || contact.isTouching() == false) { - other.m_sweep.set(backup); - other.synchronizeTransform(); - continue; - } - // Add the contact to the island - contact.m_islandFlag = true; - this.addContact(contact); - // Has the other body already been added to the island? - if (other.m_islandFlag) { - continue; - } - // Add the other body to the island. - other.m_islandFlag = true; - if (!other.isStatic()) { - other.setAwake(true); - } - this.addBody(other); - } - } - } - s_subStep.reset((1.0 - minAlpha) * step.dt); - s_subStep.dtRatio = 1.0; - s_subStep.positionIterations = 20; - s_subStep.velocityIterations = step.velocityIterations; - s_subStep.warmStarting = false; - this.solveIslandTOI(s_subStep, bA, bB); - // Reset island flags and synchronize broad-phase proxies. - for (var i = 0; i < this.m_bodies.length; ++i) { - var body = this.m_bodies[i]; - body.m_islandFlag = false; - if (!body.isDynamic()) { - continue; - } - body.synchronizeFixtures(); - // Invalidate all contact TOIs on this displaced body. - for (var ce = body.m_contactList; ce; ce = ce.next) { - ce.contact.m_toiFlag = false; - ce.contact.m_islandFlag = false; - } + case ManifoldType.e_faceA: { + normal = Rot.mulVec2(xfA.q, this.p_localNormal); + var planePoint = Transform.mulVec2(xfA, this.p_localPoint); + var clipPoint = Transform.mulVec2(xfB, this.p_localPoints[j]); + separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB; + point = clipPoint; + break; } - // Commit fixture proxy movements to the broad-phase so that new contacts - // are created. - // Also, some contacts can be destroyed. - world.findNewContacts(); - if (world.m_subStepping) { - world.m_stepComplete = false; + case ManifoldType.e_faceB: { + normal = Rot.mulVec2(xfB.q, this.p_localNormal); + var planePoint = Transform.mulVec2(xfB, this.p_localPoint); + var clipPoint = Transform.mulVec2(xfA, this.p_localPoints[j]); + separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB; + point = clipPoint; + // Ensure normal points from A to B + normal.mul(-1); break; } } - var b, c; - }; - Solver.prototype.solveIslandTOI = function (subStep, toiA, toiB) { - this.m_world; - // Initialize the body state. - for (var i = 0; i < this.m_bodies.length; ++i) { - var body = this.m_bodies[i]; - body.c_position.c.setVec2(body.m_sweep.c); - body.c_position.a = body.m_sweep.a; - body.c_velocity.v.setVec2(body.m_linearVelocity); - body.c_velocity.w = body.m_angularVelocity; + var rA = Vec2.sub(point, cA); + var rB = Vec2.sub(point, cB); + // Track max constraint error. + minSeparation = math.min(minSeparation, separation); + var baumgarte = toi ? Settings.toiBaugarte : Settings.baumgarte; + var linearSlop = Settings.linearSlop; + var maxLinearCorrection = Settings.maxLinearCorrection; + // Prevent large corrections and allow slop. + var C = math.clamp(baumgarte * (separation + linearSlop), -maxLinearCorrection, 0.0); + // Compute the effective mass. + var rnA = Vec2.crossVec2Vec2(rA, normal); + var rnB = Vec2.crossVec2Vec2(rB, normal); + var K = mA + mB + iA * rnA * rnA + iB * rnB * rnB; + // Compute normal impulse + var impulse = K > 0.0 ? -C / K : 0.0; + var P = Vec2.mulNumVec2(impulse, normal); + cA.subMul(mA, P); + aA -= iA * Vec2.crossVec2Vec2(rA, P); + cB.addMul(mB, P); + aB += iB * Vec2.crossVec2Vec2(rB, P); + } + positionA.c.setVec2(cA); + positionA.a = aA; + positionB.c.setVec2(cB); + positionB.a = aB; + return minSeparation; + }; + Contact.prototype.initVelocityConstraint = function (step) { + var fixtureA = this.m_fixtureA; + var fixtureB = this.m_fixtureB; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + var velocityA = bodyA.c_velocity; + var velocityB = bodyB.c_velocity; + var positionA = bodyA.c_position; + var positionB = bodyB.c_position; + var radiusA = this.p_radiusA; + var radiusB = this.p_radiusB; + var manifold = this.getManifold(); + var mA = this.v_invMassA; + var mB = this.v_invMassB; + var iA = this.v_invIA; + var iB = this.v_invIB; + var localCenterA = Vec2.clone(this.p_localCenterA); + var localCenterB = Vec2.clone(this.p_localCenterB); + var cA = Vec2.clone(positionA.c); + var aA = positionA.a; + var vA = Vec2.clone(velocityA.v); + var wA = velocityA.w; + var cB = Vec2.clone(positionB.c); + var aB = positionB.a; + var vB = Vec2.clone(velocityB.v); + var wB = velocityB.w; + var xfA = Transform.identity(); + var xfB = Transform.identity(); + xfA.q.setAngle(aA); + xfB.q.setAngle(aB); + xfA.p.setCombine(1, cA, -1, Rot.mulVec2(xfA.q, localCenterA)); + xfB.p.setCombine(1, cB, -1, Rot.mulVec2(xfB.q, localCenterB)); + var worldManifold = manifold.getWorldManifold(null, xfA, radiusA, xfB, radiusB); + this.v_normal.setVec2(worldManifold.normal); + for (var j = 0; j < this.v_pointCount; ++j) { + var vcp = this.v_points[j]; // VelocityConstraintPoint + vcp.rA.setVec2(Vec2.sub(worldManifold.points[j], cA)); + vcp.rB.setVec2(Vec2.sub(worldManifold.points[j], cB)); + var rnA = Vec2.crossVec2Vec2(vcp.rA, this.v_normal); + var rnB = Vec2.crossVec2Vec2(vcp.rB, this.v_normal); + var kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB; + vcp.normalMass = kNormal > 0.0 ? 1.0 / kNormal : 0.0; + var tangent = Vec2.crossVec2Num(this.v_normal, 1.0); + var rtA = Vec2.crossVec2Vec2(vcp.rA, tangent); + var rtB = Vec2.crossVec2Vec2(vcp.rB, tangent); + var kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB; + vcp.tangentMass = kTangent > 0.0 ? 1.0 / kTangent : 0.0; + // Setup a velocity bias for restitution. + vcp.velocityBias = 0.0; + var vRel = Vec2.dot(this.v_normal, vB) + + Vec2.dot(this.v_normal, Vec2.crossNumVec2(wB, vcp.rB)) + - Vec2.dot(this.v_normal, vA) + - Vec2.dot(this.v_normal, Vec2.crossNumVec2(wA, vcp.rA)); + if (vRel < -Settings.velocityThreshold) { + vcp.velocityBias = -this.v_restitution * vRel; } - for (var i = 0; i < this.m_contacts.length; ++i) { - var contact = this.m_contacts[i]; - contact.initConstraint(subStep); - } - // Solve position constraints. - for (var i = 0; i < subStep.positionIterations; ++i) { - var minSeparation = 0.0; - for (var j = 0; j < this.m_contacts.length; ++j) { - var contact = this.m_contacts[j]; - var separation = contact.solvePositionConstraintTOI(subStep, toiA, toiB); - minSeparation = math.min(minSeparation, separation); - } - // We can't expect minSpeparation >= -Settings.linearSlop because we don't - // push the separation above -Settings.linearSlop. - var contactsOkay = minSeparation >= -1.5 * Settings.linearSlop; - if (contactsOkay) { - break; - } + } + // If we have two points, then prepare the block solver. + if (this.v_pointCount == 2 && step.blockSolve) { + var vcp1 = this.v_points[0]; // VelocityConstraintPoint + var vcp2 = this.v_points[1]; // VelocityConstraintPoint + var rn1A = Vec2.crossVec2Vec2(vcp1.rA, this.v_normal); + var rn1B = Vec2.crossVec2Vec2(vcp1.rB, this.v_normal); + var rn2A = Vec2.crossVec2Vec2(vcp2.rA, this.v_normal); + var rn2B = Vec2.crossVec2Vec2(vcp2.rB, this.v_normal); + var k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B; + var k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B; + var k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B; + // Ensure a reasonable condition number. + var k_maxConditionNumber = 1000.0; + if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) { + // K is safe to invert. + this.v_K.ex.setNum(k11, k12); + this.v_K.ey.setNum(k12, k22); + this.v_normalMass.set(this.v_K.getInverse()); } - var i, c; - // Leap of faith to new safe state. - toiA.m_sweep.c0.setVec2(toiA.c_position.c); - toiA.m_sweep.a0 = toiA.c_position.a; - toiB.m_sweep.c0.setVec2(toiB.c_position.c); - toiB.m_sweep.a0 = toiB.c_position.a; - // No warm starting is needed for TOI events because warm - // starting impulses were applied in the discrete solver. - for (var i = 0; i < this.m_contacts.length; ++i) { - var contact = this.m_contacts[i]; - contact.initVelocityConstraint(subStep); + else { + // The constraints are redundant, just use one. + // TODO_ERIN use deepest? + this.v_pointCount = 1; } - // Solve velocity constraints. - for (var i = 0; i < subStep.velocityIterations; ++i) { - for (var j = 0; j < this.m_contacts.length; ++j) { - var contact = this.m_contacts[j]; - contact.solveVelocityConstraint(subStep); - } + } + positionA.c.setVec2(cA); + positionA.a = aA; + velocityA.v.setVec2(vA); + velocityA.w = wA; + positionB.c.setVec2(cB); + positionB.a = aB; + velocityB.v.setVec2(vB); + velocityB.w = wB; + }; + Contact.prototype.warmStartConstraint = function (step) { + var fixtureA = this.m_fixtureA; + var fixtureB = this.m_fixtureB; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + var velocityA = bodyA.c_velocity; + var velocityB = bodyB.c_velocity; + bodyA.c_position; + bodyB.c_position; + var mA = this.v_invMassA; + var iA = this.v_invIA; + var mB = this.v_invMassB; + var iB = this.v_invIB; + var vA = Vec2.clone(velocityA.v); + var wA = velocityA.w; + var vB = Vec2.clone(velocityB.v); + var wB = velocityB.w; + var normal = this.v_normal; + var tangent = Vec2.crossVec2Num(normal, 1.0); + for (var j = 0; j < this.v_pointCount; ++j) { + var vcp = this.v_points[j]; // VelocityConstraintPoint + var P = Vec2.combine(vcp.normalImpulse, normal, vcp.tangentImpulse, tangent); + wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); + vA.subMul(mA, P); + wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); + vB.addMul(mB, P); + } + velocityA.v.setVec2(vA); + velocityA.w = wA; + velocityB.v.setVec2(vB); + velocityB.w = wB; + }; + Contact.prototype.storeConstraintImpulses = function (step) { + var manifold = this.m_manifold; + for (var j = 0; j < this.v_pointCount; ++j) { + manifold.points[j].normalImpulse = this.v_points[j].normalImpulse; + manifold.points[j].tangentImpulse = this.v_points[j].tangentImpulse; + } + }; + Contact.prototype.solveVelocityConstraint = function (step) { + var bodyA = this.m_fixtureA.m_body; + var bodyB = this.m_fixtureB.m_body; + var velocityA = bodyA.c_velocity; + bodyA.c_position; + var velocityB = bodyB.c_velocity; + bodyB.c_position; + var mA = this.v_invMassA; + var iA = this.v_invIA; + var mB = this.v_invMassB; + var iB = this.v_invIB; + var vA = Vec2.clone(velocityA.v); + var wA = velocityA.w; + var vB = Vec2.clone(velocityB.v); + var wB = velocityB.w; + var normal = this.v_normal; + var tangent = Vec2.crossVec2Num(normal, 1.0); + var friction = this.v_friction; + // Solve tangent constraints first because non-penetration is more important + // than friction. + for (var j = 0; j < this.v_pointCount; ++j) { + var vcp = this.v_points[j]; // VelocityConstraintPoint + // Relative velocity at contact + var dv = Vec2.zero(); + dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB)); + dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA)); + // Compute tangent force + var vt = Vec2.dot(dv, tangent) - this.v_tangentSpeed; + var lambda = vcp.tangentMass * (-vt); + // Clamp the accumulated force + var maxFriction = friction * vcp.normalImpulse; + var newImpulse = math.clamp(vcp.tangentImpulse + lambda, -maxFriction, maxFriction); + lambda = newImpulse - vcp.tangentImpulse; + vcp.tangentImpulse = newImpulse; + // Apply contact impulse + var P = Vec2.mulNumVec2(lambda, tangent); + vA.subMul(mA, P); + wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); + vB.addMul(mB, P); + wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); + } + // Solve normal constraints + if (this.v_pointCount == 1 || step.blockSolve == false) { + for (var i = 0; i < this.v_pointCount; ++i) { + var vcp = this.v_points[i]; // VelocityConstraintPoint + // Relative velocity at contact + var dv = Vec2.zero(); + dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB)); + dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA)); + // Compute normal impulse + var vn = Vec2.dot(dv, normal); + var lambda = -vcp.normalMass * (vn - vcp.velocityBias); + // Clamp the accumulated impulse + var newImpulse = math.max(vcp.normalImpulse + lambda, 0.0); + lambda = newImpulse - vcp.normalImpulse; + vcp.normalImpulse = newImpulse; + // Apply contact impulse + var P = Vec2.mulNumVec2(lambda, normal); + vA.subMul(mA, P); + wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P); + vB.addMul(mB, P); + wB += iB * Vec2.crossVec2Vec2(vcp.rB, P); } - // Don't store the TOI contact forces for warm starting - // because they can be quite large. - var h = subStep.dt; - // Integrate positions - for (var i = 0; i < this.m_bodies.length; ++i) { - var body = this.m_bodies[i]; - var c = Vec2.clone(body.c_position.c); - var a = body.c_position.a; - var v = Vec2.clone(body.c_velocity.v); - var w = body.c_velocity.w; - // Check for large velocities - var translation = Vec2.mulNumVec2(h, v); - if (Vec2.dot(translation, translation) > Settings.maxTranslationSquared) { - var ratio = Settings.maxTranslation / translation.length(); - v.mul(ratio); + } + else { + // Block solver developed in collaboration with Dirk Gregorius (back in + // 01/07 on Box2D_Lite). + // Build the mini LCP for this contact patch + // + // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i = + // 1..2 + // + // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n ) + // b = vn0 - velocityBias + // + // The system is solved using the "Total enumeration method" (s. Murty). + // The complementary constraint vn_i * x_i + // implies that we must have in any solution either vn_i = 0 or x_i = 0. + // So for the 2D contact problem the cases + // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and + // vn1 = 0 need to be tested. The first valid + // solution that satisfies the problem is chosen. + // + // In order to account of the accumulated impulse 'a' (because of the + // iterative nature of the solver which only requires + // that the accumulated impulse is clamped and not the incremental + // impulse) we change the impulse variable (x_i). + // + // Substitute: + // + // x = a + d + // + // a := old total impulse + // x := new total impulse + // d := incremental impulse + // + // For the current iteration we extend the formula for the incremental + // impulse + // to compute the new total impulse: + // + // vn = A * d + b + // = A * (x - a) + b + // = A * x + b - A * a + // = A * x + b' + // b' = b - A * a; + var vcp1 = this.v_points[0]; // VelocityConstraintPoint + var vcp2 = this.v_points[1]; // VelocityConstraintPoint + var a = Vec2.neo(vcp1.normalImpulse, vcp2.normalImpulse); + // Relative velocity at contact + var dv1 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp1.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp1.rA)); + var dv2 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp2.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp2.rA)); + // Compute normal velocity + var vn1 = Vec2.dot(dv1, normal); + var vn2 = Vec2.dot(dv2, normal); + var b = Vec2.neo(vn1 - vcp1.velocityBias, vn2 - vcp2.velocityBias); + // Compute b' + b.sub(Mat22.mulVec2(this.v_K, a)); + // NOT_USED(k_errorTol); + while (true) { + // + // Case 1: vn = 0 + // + // 0 = A * x + b' + // + // Solve for x: + // + // x = - inv(A) * b' + // + var x = Mat22.mulVec2(this.v_normalMass, b).neg(); + if (x.x >= 0.0 && x.y >= 0.0) { + // Get the incremental impulse + var d = Vec2.sub(x, a); + // Apply incremental impulse + var P1 = Vec2.mulNumVec2(d.x, normal); + var P2 = Vec2.mulNumVec2(d.y, normal); + vA.subCombine(mA, P1, mA, P2); + wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); + vB.addCombine(mB, P1, mB, P2); + wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); + // Accumulate + vcp1.normalImpulse = x.x; + vcp2.normalImpulse = x.y; + break; + } + // + // Case 2: vn1 = 0 and x2 = 0 + // + // 0 = a11 * x1 + a12 * 0 + b1' + // vn2 = a21 * x1 + a22 * 0 + b2' + // + x.x = -vcp1.normalMass * b.x; + x.y = 0.0; + vn1 = 0.0; + vn2 = this.v_K.ex.y * x.x + b.y; + if (x.x >= 0.0 && vn2 >= 0.0) { + // Get the incremental impulse + var d = Vec2.sub(x, a); + // Apply incremental impulse + var P1 = Vec2.mulNumVec2(d.x, normal); + var P2 = Vec2.mulNumVec2(d.y, normal); + vA.subCombine(mA, P1, mA, P2); + wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); + vB.addCombine(mB, P1, mB, P2); + wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); + // Accumulate + vcp1.normalImpulse = x.x; + vcp2.normalImpulse = x.y; + break; } - var rotation = h * w; - if (rotation * rotation > Settings.maxRotationSquared) { - var ratio = Settings.maxRotation / math.abs(rotation); - w *= ratio; + // + // Case 3: vn2 = 0 and x1 = 0 + // + // vn1 = a11 * 0 + a12 * x2 + b1' + // 0 = a21 * 0 + a22 * x2 + b2' + // + x.x = 0.0; + x.y = -vcp2.normalMass * b.y; + vn1 = this.v_K.ey.x * x.y + b.x; + vn2 = 0.0; + if (x.y >= 0.0 && vn1 >= 0.0) { + // Resubstitute for the incremental impulse + var d = Vec2.sub(x, a); + // Apply incremental impulse + var P1 = Vec2.mulNumVec2(d.x, normal); + var P2 = Vec2.mulNumVec2(d.y, normal); + vA.subCombine(mA, P1, mA, P2); + wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); + vB.addCombine(mB, P1, mB, P2); + wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); + // Accumulate + vcp1.normalImpulse = x.x; + vcp2.normalImpulse = x.y; + break; } - // Integrate - c.addMul(h, v); - a += h * w; - body.c_position.c = c; - body.c_position.a = a; - body.c_velocity.v = v; - body.c_velocity.w = w; - // Sync bodies - body.m_sweep.c = c; - body.m_sweep.a = a; - body.m_linearVelocity = v; - body.m_angularVelocity = w; - body.synchronizeTransform(); - } - this.postSolveIsland(); - }; - /** @internal */ - Solver.prototype.postSolveIsland = function () { - for (var c = 0; c < this.m_contacts.length; ++c) { - var contact = this.m_contacts[c]; - this.m_world.postSolve(contact, contact.m_impulse); + // + // Case 4: x1 = 0 and x2 = 0 + // + // vn1 = b1 + // vn2 = b2; + // + x.x = 0.0; + x.y = 0.0; + vn1 = b.x; + vn2 = b.y; + if (vn1 >= 0.0 && vn2 >= 0.0) { + // Resubstitute for the incremental impulse + var d = Vec2.sub(x, a); + // Apply incremental impulse + var P1 = Vec2.mulNumVec2(d.x, normal); + var P2 = Vec2.mulNumVec2(d.y, normal); + vA.subCombine(mA, P1, mA, P2); + wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2)); + vB.addCombine(mB, P1, mB, P2); + wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2)); + // Accumulate + vcp1.normalImpulse = x.x; + vcp2.normalImpulse = x.y; + break; + } + // No solution, give up. This is hit sometimes, but it doesn't seem to + // matter. + break; } - }; - return Solver; - }()); + } + velocityA.v.setVec2(vA); + velocityA.w = wA; + velocityB.v.setVec2(vB); + velocityB.w = wB; + }; + /** + * @internal + */ + Contact.addType = function (type1, type2, callback) { + s_registers[type1] = s_registers[type1] || {}; + s_registers[type1][type2] = callback; + }; + /** + * @internal + */ + Contact.create = function (fixtureA, indexA, fixtureB, indexB) { + var typeA = fixtureA.getType(); + var typeB = fixtureB.getType(); + // TODO: pool contacts + var contact; + var evaluateFcn; + if (evaluateFcn = s_registers[typeA] && s_registers[typeA][typeB]) { + contact = new Contact(fixtureA, indexA, fixtureB, indexB, evaluateFcn); + } + else if (evaluateFcn = s_registers[typeB] && s_registers[typeB][typeA]) { + contact = new Contact(fixtureB, indexB, fixtureA, indexA, evaluateFcn); + } + else { + return null; + } + // Contact creation may swap fixtures. + fixtureA = contact.getFixtureA(); + fixtureB = contact.getFixtureB(); + indexA = contact.getChildIndexA(); + indexB = contact.getChildIndexB(); + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + // Connect to body A + contact.m_nodeA.contact = contact; + contact.m_nodeA.other = bodyB; + contact.m_nodeA.prev = null; + contact.m_nodeA.next = bodyA.m_contactList; + if (bodyA.m_contactList != null) { + bodyA.m_contactList.prev = contact.m_nodeA; + } + bodyA.m_contactList = contact.m_nodeA; + // Connect to body B + contact.m_nodeB.contact = contact; + contact.m_nodeB.other = bodyA; + contact.m_nodeB.prev = null; + contact.m_nodeB.next = bodyB.m_contactList; + if (bodyB.m_contactList != null) { + bodyB.m_contactList.prev = contact.m_nodeB; + } + bodyB.m_contactList = contact.m_nodeB; + // Wake up the bodies + if (fixtureA.isSensor() == false && fixtureB.isSensor() == false) { + bodyA.setAwake(true); + bodyB.setAwake(true); + } + return contact; + }; + /** + * @internal + */ + Contact.destroy = function (contact, listener) { + var fixtureA = contact.m_fixtureA; + var fixtureB = contact.m_fixtureB; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + if (contact.isTouching()) { + listener.endContact(contact); + } + // Remove from body 1 + if (contact.m_nodeA.prev) { + contact.m_nodeA.prev.next = contact.m_nodeA.next; + } + if (contact.m_nodeA.next) { + contact.m_nodeA.next.prev = contact.m_nodeA.prev; + } + if (contact.m_nodeA == bodyA.m_contactList) { + bodyA.m_contactList = contact.m_nodeA.next; + } + // Remove from body 2 + if (contact.m_nodeB.prev) { + contact.m_nodeB.prev.next = contact.m_nodeB.next; + } + if (contact.m_nodeB.next) { + contact.m_nodeB.next.prev = contact.m_nodeB.prev; + } + if (contact.m_nodeB == bodyB.m_contactList) { + bodyB.m_contactList = contact.m_nodeB.next; + } + if (contact.m_manifold.pointCount > 0 && fixtureA.isSensor() == false + && fixtureB.isSensor() == false) { + bodyA.setAwake(true); + bodyB.setAwake(true); + } + fixtureA.getType(); + fixtureB.getType(); + // const destroyFcn = s_registers[typeA][typeB].destroyFcn; + // if (typeof destroyFcn === 'function') { + // destroyFcn(contact); + // } + }; + return Contact; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var WorldDefDefault = { + gravity: Vec2.zero(), + allowSleep: true, + warmStarting: true, + continuousPhysics: true, + subStepping: false, + blockSolve: true, + velocityIterations: 8, + positionIterations: 3 +}; +var World = /** @class */ (function () { + /** + * @param def World definition or gravity vector. + */ + function World(def) { + if (!(this instanceof World)) { + return new World(def); + } + this.s_step = new TimeStep(); + if (def && Vec2.isValid(def)) { + def = { gravity: def }; + } + def = options(def, WorldDefDefault); + this.m_solver = new Solver(this); + this.m_broadPhase = new BroadPhase(); + this.m_contactList = null; + this.m_contactCount = 0; + this.m_bodyList = null; + this.m_bodyCount = 0; + this.m_jointList = null; + this.m_jointCount = 0; + this.m_stepComplete = true; + this.m_allowSleep = def.allowSleep; + this.m_gravity = Vec2.clone(def.gravity); + this.m_clearForces = true; + this.m_newFixture = false; + this.m_locked = false; + // These are for debugging the solver. + this.m_warmStarting = def.warmStarting; + this.m_continuousPhysics = def.continuousPhysics; + this.m_subStepping = def.subStepping; + this.m_blockSolve = def.blockSolve; + this.m_velocityIterations = def.velocityIterations; + this.m_positionIterations = def.positionIterations; + this.m_t = 0; + } + /** @internal */ + World.prototype._serialize = function () { + var bodies = []; + var joints = []; + for (var b = this.getBodyList(); b; b = b.getNext()) { + bodies.push(b); + } + for (var j = this.getJointList(); j; j = j.getNext()) { + // @ts-ignore + if (typeof j._serialize === 'function') { + joints.push(j); + } + } + return { + gravity: this.m_gravity, + bodies: bodies, + joints: joints, + }; + }; + /** @internal */ + World._deserialize = function (data, context, restore) { + if (!data) { + return new World(); + } + var world = new World(data.gravity); + if (data.bodies) { + for (var i = data.bodies.length - 1; i >= 0; i -= 1) { + world._addBody(restore(Body, data.bodies[i], world)); + } + } + if (data.joints) { + for (var i = data.joints.length - 1; i >= 0; i--) { + world.createJoint(restore(Joint, data.joints[i], world)); + } + } + return world; + }; + /** + * Get the world body list. With the returned body, use Body.getNext to get the + * next body in the world list. A null body indicates the end of the list. + * + * @return the head of the world body list. + */ + World.prototype.getBodyList = function () { + return this.m_bodyList; + }; + /** + * Get the world joint list. With the returned joint, use Joint.getNext to get + * the next joint in the world list. A null joint indicates the end of the list. + * + * @return the head of the world joint list. + */ + World.prototype.getJointList = function () { + return this.m_jointList; + }; + /** + * Get the world contact list. With the returned contact, use Contact.getNext to + * get the next contact in the world list. A null contact indicates the end of + * the list. + * + * Warning: contacts are created and destroyed in the middle of a time step. + * Use ContactListener to avoid missing contacts. + * + * @return the head of the world contact list. + */ + World.prototype.getContactList = function () { + return this.m_contactList; + }; + World.prototype.getBodyCount = function () { + return this.m_bodyCount; + }; + World.prototype.getJointCount = function () { + return this.m_jointCount; + }; + /** + * Get the number of contacts (each may have 0 or more contact points). + */ + World.prototype.getContactCount = function () { + return this.m_contactCount; + }; + /** + * Change the global gravity vector. + */ + World.prototype.setGravity = function (gravity) { + this.m_gravity = gravity; + }; + /** + * Get the global gravity vector. + */ + World.prototype.getGravity = function () { + return this.m_gravity; + }; + /** + * Is the world locked (in the middle of a time step). + */ + World.prototype.isLocked = function () { + return this.m_locked; + }; + /** + * Enable/disable sleep. + */ + World.prototype.setAllowSleeping = function (flag) { + if (flag == this.m_allowSleep) { + return; + } + this.m_allowSleep = flag; + if (this.m_allowSleep == false) { + for (var b = this.m_bodyList; b; b = b.m_next) { + b.setAwake(true); + } + } + }; + World.prototype.getAllowSleeping = function () { + return this.m_allowSleep; + }; + /** + * Enable/disable warm starting. For testing. + */ + World.prototype.setWarmStarting = function (flag) { + this.m_warmStarting = flag; + }; + World.prototype.getWarmStarting = function () { + return this.m_warmStarting; + }; + /** + * Enable/disable continuous physics. For testing. + */ + World.prototype.setContinuousPhysics = function (flag) { + this.m_continuousPhysics = flag; + }; + World.prototype.getContinuousPhysics = function () { + return this.m_continuousPhysics; + }; + /** + * Enable/disable single stepped continuous physics. For testing. + */ + World.prototype.setSubStepping = function (flag) { + this.m_subStepping = flag; + }; + World.prototype.getSubStepping = function () { + return this.m_subStepping; + }; + /** + * Set flag to control automatic clearing of forces after each time step. + */ + World.prototype.setAutoClearForces = function (flag) { + this.m_clearForces = flag; + }; + /** + * Get the flag that controls automatic clearing of forces after each time step. + */ + World.prototype.getAutoClearForces = function () { + return this.m_clearForces; + }; + /** + * Manually clear the force buffer on all bodies. By default, forces are cleared + * automatically after each call to step. The default behavior is modified by + * calling setAutoClearForces. The purpose of this function is to support + * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step + * under a variable frame-rate. When you perform sub-stepping you will disable + * auto clearing of forces and instead call clearForces after all sub-steps are + * complete in one pass of your game loop. + * + * See {@link World.setAutoClearForces} + */ + World.prototype.clearForces = function () { + for (var body = this.m_bodyList; body; body = body.getNext()) { + body.m_force.setZero(); + body.m_torque = 0.0; + } + }; + /** + * Query the world for all fixtures that potentially overlap the provided AABB. + * + * @param aabb The query box. + * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query. + */ + World.prototype.queryAABB = function (aabb, callback) { + var broadPhase = this.m_broadPhase; + this.m_broadPhase.query(aabb, function (proxyId) { + var proxy = broadPhase.getUserData(proxyId); + return callback(proxy.fixture); + }); + }; + /** + * Ray-cast the world for all fixtures in the path of the ray. Your callback + * controls whether you get the closest point, any point, or n-points. The + * ray-cast ignores shapes that contain the starting point. + * + * @param point1 The ray starting point + * @param point2 The ray ending point + * @param callback A user implemented callback function. + */ + World.prototype.rayCast = function (point1, point2, callback) { + var broadPhase = this.m_broadPhase; + this.m_broadPhase.rayCast({ + maxFraction: 1.0, + p1: point1, + p2: point2 + }, function (input, proxyId) { + var proxy = broadPhase.getUserData(proxyId); + var fixture = proxy.fixture; + var index = proxy.childIndex; + // @ts-ignore + var output = {}; // TODO GC + var hit = fixture.rayCast(output, input, index); + if (hit) { + var fraction = output.fraction; + var point = Vec2.add(Vec2.mulNumVec2((1.0 - fraction), input.p1), Vec2.mulNumVec2(fraction, input.p2)); + return callback(fixture, point, output.normal, fraction); + } + return input.maxFraction; + }); + }; + /** + * Get the number of broad-phase proxies. + */ + World.prototype.getProxyCount = function () { + return this.m_broadPhase.getProxyCount(); + }; + /** + * Get the height of broad-phase dynamic tree. + */ + World.prototype.getTreeHeight = function () { + return this.m_broadPhase.getTreeHeight(); + }; + /** + * Get the balance of broad-phase dynamic tree. + */ + World.prototype.getTreeBalance = function () { + return this.m_broadPhase.getTreeBalance(); + }; + /** + * Get the quality metric of broad-phase dynamic tree. The smaller the better. + * The minimum is 1. + */ + World.prototype.getTreeQuality = function () { + return this.m_broadPhase.getTreeQuality(); + }; + /** + * Shift the world origin. Useful for large worlds. The body shift formula is: + * position -= newOrigin + * + * @param newOrigin The new origin with respect to the old origin + */ + World.prototype.shiftOrigin = function (newOrigin) { + if (this.m_locked) { + return; + } + for (var b = this.m_bodyList; b; b = b.m_next) { + b.m_xf.p.sub(newOrigin); + b.m_sweep.c0.sub(newOrigin); + b.m_sweep.c.sub(newOrigin); + } + for (var j = this.m_jointList; j; j = j.m_next) { + j.shiftOrigin(newOrigin); + } + this.m_broadPhase.shiftOrigin(newOrigin); + }; + /** + * @internal Used for deserialize. + */ + World.prototype._addBody = function (body) { + if (this.isLocked()) { + return; + } + // Add to world doubly linked list. + body.m_prev = null; + body.m_next = this.m_bodyList; + if (this.m_bodyList) { + this.m_bodyList.m_prev = body; + } + this.m_bodyList = body; + ++this.m_bodyCount; + }; + // tslint:disable-next-line:typedef + World.prototype.createBody = function (arg1, arg2) { + if (this.isLocked()) { + return null; + } + var def = {}; + if (!arg1) ; + else if (Vec2.isValid(arg1)) { + def = { position: arg1, angle: arg2 }; + } + else if (typeof arg1 === 'object') { + def = arg1; + } + var body = new Body(this, def); + this._addBody(body); + return body; + }; + // tslint:disable-next-line:typedef + World.prototype.createDynamicBody = function (arg1, arg2) { + var def = {}; + if (!arg1) ; + else if (Vec2.isValid(arg1)) { + def = { position: arg1, angle: arg2 }; + } + else if (typeof arg1 === 'object') { + def = arg1; + } + def.type = 'dynamic'; + return this.createBody(def); + }; + // tslint:disable-next-line:typedef + World.prototype.createKinematicBody = function (arg1, arg2) { + var def = {}; + if (!arg1) ; + else if (Vec2.isValid(arg1)) { + def = { position: arg1, angle: arg2 }; + } + else if (typeof arg1 === 'object') { + def = arg1; + } + def.type = 'kinematic'; + return this.createBody(def); + }; + /** + * Destroy a rigid body given a definition. No reference to the definition is + * retained. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * Warning: This automatically deletes all associated shapes and joints. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * Warning: This function is locked during callbacks. + */ + World.prototype.destroyBody = function (b) { + if (this.isLocked()) { + return; + } + if (b.m_destroyed) { + return false; + } + // Delete the attached joints. + var je = b.m_jointList; + while (je) { + var je0 = je; + je = je.next; + this.publish('remove-joint', je0.joint); + this.destroyJoint(je0.joint); + b.m_jointList = je; + } + b.m_jointList = null; + // Delete the attached contacts. + var ce = b.m_contactList; + while (ce) { + var ce0 = ce; + ce = ce.next; + this.destroyContact(ce0.contact); + b.m_contactList = ce; + } + b.m_contactList = null; + // Delete the attached fixtures. This destroys broad-phase proxies. + var f = b.m_fixtureList; + while (f) { + var f0 = f; + f = f.m_next; + this.publish('remove-fixture', f0); + f0.destroyProxies(this.m_broadPhase); + b.m_fixtureList = f; + } + b.m_fixtureList = null; + // Remove world body list. + if (b.m_prev) { + b.m_prev.m_next = b.m_next; + } + if (b.m_next) { + b.m_next.m_prev = b.m_prev; + } + if (b == this.m_bodyList) { + this.m_bodyList = b.m_next; + } + b.m_destroyed = true; + --this.m_bodyCount; + this.publish('remove-body', b); + return true; + }; + /** + * Create a joint to constrain bodies together. No reference to the definition + * is retained. This may cause the connected bodies to cease colliding. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var WorldDefDefault = { - gravity: Vec2.zero(), - allowSleep: true, - warmStarting: true, - continuousPhysics: true, - subStepping: false, - blockSolve: true, - velocityIterations: 8, - positionIterations: 3 - }; - var World = /** @class */ (function () { - /** - * @param def World definition or gravity vector. - */ - function World(def) { - var _this = this; - /** @internal */ - this.s_step = new TimeStep(); // reuse - /** - * @internal - * Callback for broad-phase. - */ - this.createContact = function (proxyA, proxyB) { - var fixtureA = proxyA.fixture; - var fixtureB = proxyB.fixture; - var indexA = proxyA.childIndex; - var indexB = proxyB.childIndex; - var bodyA = fixtureA.getBody(); - var bodyB = fixtureB.getBody(); - // Are the fixtures on the same body? - if (bodyA == bodyB) { - return; - } - // TODO_ERIN use a hash table to remove a potential bottleneck when both - // bodies have a lot of contacts. - // Does a contact already exist? - var edge = bodyB.getContactList(); // ContactEdge - while (edge) { - if (edge.other == bodyA) { - var fA = edge.contact.getFixtureA(); - var fB = edge.contact.getFixtureB(); - var iA = edge.contact.getChildIndexA(); - var iB = edge.contact.getChildIndexB(); - if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) { - // A contact already exists. - return; - } - if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) { - // A contact already exists. - return; - } - } - edge = edge.next; - } - if (bodyB.shouldCollide(bodyA) == false) { - return; - } - if (fixtureB.shouldCollide(fixtureA) == false) { - return; - } - // Call the factory. - var contact = Contact.create(fixtureA, indexA, fixtureB, indexB); - if (contact == null) { - return; - } - // Insert into the world. - contact.m_prev = null; - if (_this.m_contactList != null) { - contact.m_next = _this.m_contactList; - _this.m_contactList.m_prev = contact; - } - _this.m_contactList = contact; - ++_this.m_contactCount; - }; - if (!(this instanceof World)) { - return new World(def); - } - if (def && Vec2.isValid(def)) { - def = { gravity: def }; - } - def = options(def, WorldDefDefault); - this.m_solver = new Solver(this); - this.m_broadPhase = new BroadPhase(); - this.m_contactList = null; - this.m_contactCount = 0; - this.m_bodyList = null; - this.m_bodyCount = 0; - this.m_jointList = null; - this.m_jointCount = 0; - this.m_stepComplete = true; - this.m_allowSleep = def.allowSleep; - this.m_gravity = Vec2.clone(def.gravity); - this.m_clearForces = true; - this.m_newFixture = false; - this.m_locked = false; - // These are for debugging the solver. - this.m_warmStarting = def.warmStarting; - this.m_continuousPhysics = def.continuousPhysics; - this.m_subStepping = def.subStepping; - this.m_blockSolve = def.blockSolve; - this.m_velocityIterations = def.velocityIterations; - this.m_positionIterations = def.positionIterations; - this.m_t = 0; + * Warning: This function is locked during callbacks. + */ + World.prototype.createJoint = function (joint) { + if (this.isLocked()) { + return null; } - /** @internal */ - World.prototype._serialize = function () { - var bodies = []; - var joints = []; - for (var b = this.getBodyList(); b; b = b.getNext()) { - bodies.push(b); - } - for (var j = this.getJointList(); j; j = j.getNext()) { - // @ts-ignore - if (typeof j._serialize === 'function') { - joints.push(j); - } - } - return { - gravity: this.m_gravity, - bodies: bodies, - joints: joints, - }; - }; - /** @internal */ - World._deserialize = function (data, context, restore) { - if (!data) { - return new World(); - } - var world = new World(data.gravity); - if (data.bodies) { - for (var i = data.bodies.length - 1; i >= 0; i -= 1) { - world._addBody(restore(Body, data.bodies[i], world)); - } - } - if (data.joints) { - for (var i = data.joints.length - 1; i >= 0; i--) { - world.createJoint(restore(Joint, data.joints[i], world)); + // Connect to the world list. + joint.m_prev = null; + joint.m_next = this.m_jointList; + if (this.m_jointList) { + this.m_jointList.m_prev = joint; + } + this.m_jointList = joint; + ++this.m_jointCount; + // Connect to the bodies' doubly linked lists. + joint.m_edgeA.joint = joint; + joint.m_edgeA.other = joint.m_bodyB; + joint.m_edgeA.prev = null; + joint.m_edgeA.next = joint.m_bodyA.m_jointList; + if (joint.m_bodyA.m_jointList) + joint.m_bodyA.m_jointList.prev = joint.m_edgeA; + joint.m_bodyA.m_jointList = joint.m_edgeA; + joint.m_edgeB.joint = joint; + joint.m_edgeB.other = joint.m_bodyA; + joint.m_edgeB.prev = null; + joint.m_edgeB.next = joint.m_bodyB.m_jointList; + if (joint.m_bodyB.m_jointList) + joint.m_bodyB.m_jointList.prev = joint.m_edgeB; + joint.m_bodyB.m_jointList = joint.m_edgeB; + // If the joint prevents collisions, then flag any contacts for filtering. + if (joint.m_collideConnected == false) { + for (var edge = joint.m_bodyB.getContactList(); edge; edge = edge.next) { + if (edge.other == joint.m_bodyA) { + // Flag the contact for filtering at the next time step (where either + // body is awake). + edge.contact.flagForFiltering(); } } - return world; - }; - /** - * Get the world body list. With the returned body, use Body.getNext to get the - * next body in the world list. A null body indicates the end of the list. - * - * @return the head of the world body list. - */ - World.prototype.getBodyList = function () { - return this.m_bodyList; - }; - /** - * Get the world joint list. With the returned joint, use Joint.getNext to get - * the next joint in the world list. A null joint indicates the end of the list. - * - * @return the head of the world joint list. - */ - World.prototype.getJointList = function () { - return this.m_jointList; - }; - /** - * Get the world contact list. With the returned contact, use Contact.getNext to - * get the next contact in the world list. A null contact indicates the end of - * the list. - * - * Warning: contacts are created and destroyed in the middle of a time step. - * Use ContactListener to avoid missing contacts. - * - * @return the head of the world contact list. - */ - World.prototype.getContactList = function () { - return this.m_contactList; - }; - World.prototype.getBodyCount = function () { - return this.m_bodyCount; - }; - World.prototype.getJointCount = function () { - return this.m_jointCount; - }; - /** - * Get the number of contacts (each may have 0 or more contact points). - */ - World.prototype.getContactCount = function () { - return this.m_contactCount; - }; - /** - * Change the global gravity vector. - */ - World.prototype.setGravity = function (gravity) { - this.m_gravity = gravity; - }; - /** - * Get the global gravity vector. - */ - World.prototype.getGravity = function () { - return this.m_gravity; - }; - /** - * Is the world locked (in the middle of a time step). - */ - World.prototype.isLocked = function () { - return this.m_locked; - }; - /** - * Enable/disable sleep. - */ - World.prototype.setAllowSleeping = function (flag) { - if (flag == this.m_allowSleep) { - return; - } - this.m_allowSleep = flag; - if (this.m_allowSleep == false) { - for (var b = this.m_bodyList; b; b = b.m_next) { - b.setAwake(true); + } + // Note: creating a joint doesn't wake the bodies. + return joint; + }; + /** + * Destroy a joint. This may cause the connected bodies to begin colliding. + * Warning: This function is locked during callbacks. + */ + World.prototype.destroyJoint = function (joint) { + if (this.isLocked()) { + return; + } + // Remove from the doubly linked list. + if (joint.m_prev) { + joint.m_prev.m_next = joint.m_next; + } + if (joint.m_next) { + joint.m_next.m_prev = joint.m_prev; + } + if (joint == this.m_jointList) { + this.m_jointList = joint.m_next; + } + // Disconnect from bodies. + var bodyA = joint.m_bodyA; + var bodyB = joint.m_bodyB; + // Wake up connected bodies. + bodyA.setAwake(true); + bodyB.setAwake(true); + // Remove from body 1. + if (joint.m_edgeA.prev) { + joint.m_edgeA.prev.next = joint.m_edgeA.next; + } + if (joint.m_edgeA.next) { + joint.m_edgeA.next.prev = joint.m_edgeA.prev; + } + if (joint.m_edgeA == bodyA.m_jointList) { + bodyA.m_jointList = joint.m_edgeA.next; + } + joint.m_edgeA.prev = null; + joint.m_edgeA.next = null; + // Remove from body 2 + if (joint.m_edgeB.prev) { + joint.m_edgeB.prev.next = joint.m_edgeB.next; + } + if (joint.m_edgeB.next) { + joint.m_edgeB.next.prev = joint.m_edgeB.prev; + } + if (joint.m_edgeB == bodyB.m_jointList) { + bodyB.m_jointList = joint.m_edgeB.next; + } + joint.m_edgeB.prev = null; + joint.m_edgeB.next = null; + --this.m_jointCount; + // If the joint prevents collisions, then flag any contacts for filtering. + if (joint.m_collideConnected == false) { + var edge = bodyB.getContactList(); + while (edge) { + if (edge.other == bodyA) { + // Flag the contact for filtering at the next time step (where either + // body is awake). + edge.contact.flagForFiltering(); } + edge = edge.next; } - }; - World.prototype.getAllowSleeping = function () { - return this.m_allowSleep; - }; - /** - * Enable/disable warm starting. For testing. - */ - World.prototype.setWarmStarting = function (flag) { - this.m_warmStarting = flag; - }; - World.prototype.getWarmStarting = function () { - return this.m_warmStarting; - }; - /** - * Enable/disable continuous physics. For testing. - */ - World.prototype.setContinuousPhysics = function (flag) { - this.m_continuousPhysics = flag; - }; - World.prototype.getContinuousPhysics = function () { - return this.m_continuousPhysics; - }; - /** - * Enable/disable single stepped continuous physics. For testing. - */ - World.prototype.setSubStepping = function (flag) { - this.m_subStepping = flag; - }; - World.prototype.getSubStepping = function () { - return this.m_subStepping; - }; - /** - * Set flag to control automatic clearing of forces after each time step. - */ - World.prototype.setAutoClearForces = function (flag) { - this.m_clearForces = flag; - }; - /** - * Get the flag that controls automatic clearing of forces after each time step. - */ - World.prototype.getAutoClearForces = function () { - return this.m_clearForces; - }; - /** - * Manually clear the force buffer on all bodies. By default, forces are cleared - * automatically after each call to step. The default behavior is modified by - * calling setAutoClearForces. The purpose of this function is to support - * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step - * under a variable frame-rate. When you perform sub-stepping you will disable - * auto clearing of forces and instead call clearForces after all sub-steps are - * complete in one pass of your game loop. - * - * See {@link World.setAutoClearForces} - */ - World.prototype.clearForces = function () { - for (var body = this.m_bodyList; body; body = body.getNext()) { - body.m_force.setZero(); - body.m_torque = 0.0; - } - }; - /** - * Query the world for all fixtures that potentially overlap the provided AABB. - * - * @param aabb The query box. - * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query. - */ - World.prototype.queryAABB = function (aabb, callback) { - var broadPhase = this.m_broadPhase; - this.m_broadPhase.query(aabb, function (proxyId) { - var proxy = broadPhase.getUserData(proxyId); - return callback(proxy.fixture); - }); - }; - /** - * Ray-cast the world for all fixtures in the path of the ray. Your callback - * controls whether you get the closest point, any point, or n-points. The - * ray-cast ignores shapes that contain the starting point. - * - * @param point1 The ray starting point - * @param point2 The ray ending point - * @param callback A user implemented callback function. - */ - World.prototype.rayCast = function (point1, point2, callback) { - var broadPhase = this.m_broadPhase; - this.m_broadPhase.rayCast({ - maxFraction: 1.0, - p1: point1, - p2: point2 - }, function (input, proxyId) { - var proxy = broadPhase.getUserData(proxyId); - var fixture = proxy.fixture; - var index = proxy.childIndex; - // @ts-ignore - var output = {}; // TODO GC - var hit = fixture.rayCast(output, input, index); - if (hit) { - var fraction = output.fraction; - var point = Vec2.add(Vec2.mulNumVec2((1.0 - fraction), input.p1), Vec2.mulNumVec2(fraction, input.p2)); - return callback(fixture, point, output.normal, fraction); + } + this.publish('remove-joint', joint); + }; + /** + * Take a time step. This performs collision detection, integration, and + * constraint solution. + * + * Broad-phase, narrow-phase, solve and solve time of impacts. + * + * @param timeStep Time step, this should not vary. + */ + World.prototype.step = function (timeStep, velocityIterations, positionIterations) { + this.publish('pre-step', timeStep); + if ((velocityIterations | 0) !== velocityIterations) { + // TODO: remove this in future + velocityIterations = 0; + } + velocityIterations = velocityIterations || this.m_velocityIterations; + positionIterations = positionIterations || this.m_positionIterations; + // If new fixtures were added, we need to find the new contacts. + if (this.m_newFixture) { + this.findNewContacts(); + this.m_newFixture = false; + } + this.m_locked = true; + this.s_step.reset(timeStep); + this.s_step.velocityIterations = velocityIterations; + this.s_step.positionIterations = positionIterations; + this.s_step.warmStarting = this.m_warmStarting; + this.s_step.blockSolve = this.m_blockSolve; + // Update contacts. This is where some contacts are destroyed. + this.updateContacts(); + // Integrate velocities, solve velocity constraints, and integrate positions. + if (this.m_stepComplete && timeStep > 0.0) { + this.m_solver.solveWorld(this.s_step); + // Synchronize fixtures, check for out of range bodies. + for (var b = this.m_bodyList; b; b = b.getNext()) { + // If a body was not in an island then it did not move. + if (b.m_islandFlag == false) { + continue; } - return input.maxFraction; - }); - }; - /** - * Get the number of broad-phase proxies. - */ - World.prototype.getProxyCount = function () { - return this.m_broadPhase.getProxyCount(); - }; - /** - * Get the height of broad-phase dynamic tree. - */ - World.prototype.getTreeHeight = function () { - return this.m_broadPhase.getTreeHeight(); - }; - /** - * Get the balance of broad-phase dynamic tree. - */ - World.prototype.getTreeBalance = function () { - return this.m_broadPhase.getTreeBalance(); - }; - /** - * Get the quality metric of broad-phase dynamic tree. The smaller the better. - * The minimum is 1. - */ - World.prototype.getTreeQuality = function () { - return this.m_broadPhase.getTreeQuality(); - }; - /** - * Shift the world origin. Useful for large worlds. The body shift formula is: - * position -= newOrigin - * - * @param newOrigin The new origin with respect to the old origin - */ - World.prototype.shiftOrigin = function (newOrigin) { - if (this.m_locked) { - return; - } - for (var b = this.m_bodyList; b; b = b.m_next) { - b.m_xf.p.sub(newOrigin); - b.m_sweep.c0.sub(newOrigin); - b.m_sweep.c.sub(newOrigin); - } - for (var j = this.m_jointList; j; j = j.m_next) { - j.shiftOrigin(newOrigin); - } - this.m_broadPhase.shiftOrigin(newOrigin); - }; - /** - * @internal Used for deserialize. - */ - World.prototype._addBody = function (body) { - if (this.isLocked()) { - return; - } - // Add to world doubly linked list. - body.m_prev = null; - body.m_next = this.m_bodyList; - if (this.m_bodyList) { - this.m_bodyList.m_prev = body; - } - this.m_bodyList = body; - ++this.m_bodyCount; - }; - // tslint:disable-next-line:typedef - World.prototype.createBody = function (arg1, arg2) { - if (this.isLocked()) { - return null; - } - var def = {}; - if (!arg1) ; - else if (Vec2.isValid(arg1)) { - def = { position: arg1, angle: arg2 }; - } - else if (typeof arg1 === 'object') { - def = arg1; - } - var body = new Body(this, def); - this._addBody(body); - return body; - }; - // tslint:disable-next-line:typedef - World.prototype.createDynamicBody = function (arg1, arg2) { - var def = {}; - if (!arg1) ; - else if (Vec2.isValid(arg1)) { - def = { position: arg1, angle: arg2 }; - } - else if (typeof arg1 === 'object') { - def = arg1; - } - def.type = 'dynamic'; - return this.createBody(def); - }; - // tslint:disable-next-line:typedef - World.prototype.createKinematicBody = function (arg1, arg2) { - var def = {}; - if (!arg1) ; - else if (Vec2.isValid(arg1)) { - def = { position: arg1, angle: arg2 }; - } - else if (typeof arg1 === 'object') { - def = arg1; - } - def.type = 'kinematic'; - return this.createBody(def); - }; - /** - * Destroy a rigid body given a definition. No reference to the definition is - * retained. - * - * Warning: This automatically deletes all associated shapes and joints. - * - * Warning: This function is locked during callbacks. - */ - World.prototype.destroyBody = function (b) { - if (this.isLocked()) { - return; - } - if (b.m_destroyed) { - return false; - } - // Delete the attached joints. - var je = b.m_jointList; - while (je) { - var je0 = je; - je = je.next; - this.publish('remove-joint', je0.joint); - this.destroyJoint(je0.joint); - b.m_jointList = je; - } - b.m_jointList = null; - // Delete the attached contacts. - var ce = b.m_contactList; - while (ce) { - var ce0 = ce; - ce = ce.next; - this.destroyContact(ce0.contact); - b.m_contactList = ce; - } - b.m_contactList = null; - // Delete the attached fixtures. This destroys broad-phase proxies. - var f = b.m_fixtureList; - while (f) { - var f0 = f; - f = f.m_next; - this.publish('remove-fixture', f0); - f0.destroyProxies(this.m_broadPhase); - b.m_fixtureList = f; - } - b.m_fixtureList = null; - // Remove world body list. - if (b.m_prev) { - b.m_prev.m_next = b.m_next; - } - if (b.m_next) { - b.m_next.m_prev = b.m_prev; - } - if (b == this.m_bodyList) { - this.m_bodyList = b.m_next; - } - b.m_destroyed = true; - --this.m_bodyCount; - this.publish('remove-body', b); - return true; - }; - /** - * Create a joint to constrain bodies together. No reference to the definition - * is retained. This may cause the connected bodies to cease colliding. - * - * Warning: This function is locked during callbacks. - */ - World.prototype.createJoint = function (joint) { - if (this.isLocked()) { - return null; - } - // Connect to the world list. - joint.m_prev = null; - joint.m_next = this.m_jointList; - if (this.m_jointList) { - this.m_jointList.m_prev = joint; - } - this.m_jointList = joint; - ++this.m_jointCount; - // Connect to the bodies' doubly linked lists. - joint.m_edgeA.joint = joint; - joint.m_edgeA.other = joint.m_bodyB; - joint.m_edgeA.prev = null; - joint.m_edgeA.next = joint.m_bodyA.m_jointList; - if (joint.m_bodyA.m_jointList) - joint.m_bodyA.m_jointList.prev = joint.m_edgeA; - joint.m_bodyA.m_jointList = joint.m_edgeA; - joint.m_edgeB.joint = joint; - joint.m_edgeB.other = joint.m_bodyA; - joint.m_edgeB.prev = null; - joint.m_edgeB.next = joint.m_bodyB.m_jointList; - if (joint.m_bodyB.m_jointList) - joint.m_bodyB.m_jointList.prev = joint.m_edgeB; - joint.m_bodyB.m_jointList = joint.m_edgeB; - // If the joint prevents collisions, then flag any contacts for filtering. - if (joint.m_collideConnected == false) { - for (var edge = joint.m_bodyB.getContactList(); edge; edge = edge.next) { - if (edge.other == joint.m_bodyA) { - // Flag the contact for filtering at the next time step (where either - // body is awake). - edge.contact.flagForFiltering(); - } + if (b.isStatic()) { + continue; } + // Update fixtures (for broad-phase). + b.synchronizeFixtures(); } - // Note: creating a joint doesn't wake the bodies. - return joint; - }; - /** - * Destroy a joint. This may cause the connected bodies to begin colliding. - * Warning: This function is locked during callbacks. - */ - World.prototype.destroyJoint = function (joint) { - if (this.isLocked()) { - return; - } - // Remove from the doubly linked list. - if (joint.m_prev) { - joint.m_prev.m_next = joint.m_next; - } - if (joint.m_next) { - joint.m_next.m_prev = joint.m_prev; - } - if (joint == this.m_jointList) { - this.m_jointList = joint.m_next; - } - // Disconnect from bodies. - var bodyA = joint.m_bodyA; - var bodyB = joint.m_bodyB; - // Wake up connected bodies. - bodyA.setAwake(true); - bodyB.setAwake(true); - // Remove from body 1. - if (joint.m_edgeA.prev) { - joint.m_edgeA.prev.next = joint.m_edgeA.next; - } - if (joint.m_edgeA.next) { - joint.m_edgeA.next.prev = joint.m_edgeA.prev; - } - if (joint.m_edgeA == bodyA.m_jointList) { - bodyA.m_jointList = joint.m_edgeA.next; - } - joint.m_edgeA.prev = null; - joint.m_edgeA.next = null; - // Remove from body 2 - if (joint.m_edgeB.prev) { - joint.m_edgeB.prev.next = joint.m_edgeB.next; - } - if (joint.m_edgeB.next) { - joint.m_edgeB.next.prev = joint.m_edgeB.prev; - } - if (joint.m_edgeB == bodyB.m_jointList) { - bodyB.m_jointList = joint.m_edgeB.next; - } - joint.m_edgeB.prev = null; - joint.m_edgeB.next = null; - --this.m_jointCount; - // If the joint prevents collisions, then flag any contacts for filtering. - if (joint.m_collideConnected == false) { - var edge = bodyB.getContactList(); - while (edge) { - if (edge.other == bodyA) { - // Flag the contact for filtering at the next time step (where either - // body is awake). - edge.contact.flagForFiltering(); - } - edge = edge.next; + // Look for new contacts. + this.findNewContacts(); + } + // Handle TOI events. + if (this.m_continuousPhysics && timeStep > 0.0) { + this.m_solver.solveWorldTOI(this.s_step); + } + if (this.m_clearForces) { + this.clearForces(); + } + this.m_locked = false; + this.publish('post-step', timeStep); + }; + /** + * @internal + * Call this method to find new contacts. + */ + World.prototype.findNewContacts = function () { + var _this = this; + this.m_broadPhase.updatePairs(function (proxyA, proxyB) { return _this.createContact(proxyA, proxyB); }); + }; + /** + * @internal + * Callback for broad-phase. + */ + World.prototype.createContact = function (proxyA, proxyB) { + var fixtureA = proxyA.fixture; + var fixtureB = proxyB.fixture; + var indexA = proxyA.childIndex; + var indexB = proxyB.childIndex; + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + // Are the fixtures on the same body? + if (bodyA == bodyB) { + return; + } + // TODO_ERIN use a hash table to remove a potential bottleneck when both + // bodies have a lot of contacts. + // Does a contact already exist? + var edge = bodyB.getContactList(); // ContactEdge + while (edge) { + if (edge.other == bodyA) { + var fA = edge.contact.getFixtureA(); + var fB = edge.contact.getFixtureB(); + var iA = edge.contact.getChildIndexA(); + var iB = edge.contact.getChildIndexB(); + if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) { + // A contact already exists. + return; } - } - this.publish('remove-joint', joint); - }; - /** - * Take a time step. This performs collision detection, integration, and - * constraint solution. - * - * Broad-phase, narrow-phase, solve and solve time of impacts. - * - * @param timeStep Time step, this should not vary. - */ - World.prototype.step = function (timeStep, velocityIterations, positionIterations) { - this.publish('pre-step', timeStep); - if ((velocityIterations | 0) !== velocityIterations) { - // TODO: remove this in future - velocityIterations = 0; - } - velocityIterations = velocityIterations || this.m_velocityIterations; - positionIterations = positionIterations || this.m_positionIterations; - // If new fixtures were added, we need to find the new contacts. - if (this.m_newFixture) { - this.findNewContacts(); - this.m_newFixture = false; - } - this.m_locked = true; - this.s_step.reset(timeStep); - this.s_step.velocityIterations = velocityIterations; - this.s_step.positionIterations = positionIterations; - this.s_step.warmStarting = this.m_warmStarting; - this.s_step.blockSolve = this.m_blockSolve; - // Update contacts. This is where some contacts are destroyed. - this.updateContacts(); - // Integrate velocities, solve velocity constraints, and integrate positions. - if (this.m_stepComplete && timeStep > 0.0) { - this.m_solver.solveWorld(this.s_step); - // Synchronize fixtures, check for out of range bodies. - for (var b = this.m_bodyList; b; b = b.getNext()) { - // If a body was not in an island then it did not move. - if (b.m_islandFlag == false) { - continue; - } - if (b.isStatic()) { - continue; - } - // Update fixtures (for broad-phase). - b.synchronizeFixtures(); + if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) { + // A contact already exists. + return; } - // Look for new contacts. - this.findNewContacts(); } - // Handle TOI events. - if (this.m_continuousPhysics && timeStep > 0.0) { - this.m_solver.solveWorldTOI(this.s_step); - } - if (this.m_clearForces) { - this.clearForces(); - } - this.m_locked = false; - this.publish('post-step', timeStep); - }; - /** - * @internal - * Call this method to find new contacts. - */ - World.prototype.findNewContacts = function () { - this.m_broadPhase.updatePairs(this.createContact); - }; - /** - * @internal - * Removes old non-overlapping contacts, applies filters and updates contacts. - */ - World.prototype.updateContacts = function () { - // Update awake contacts. - var c; - var next_c = this.m_contactList; - while (c = next_c) { - next_c = c.getNext(); - var fixtureA = c.getFixtureA(); - var fixtureB = c.getFixtureB(); - var indexA = c.getChildIndexA(); - var indexB = c.getChildIndexB(); - var bodyA = fixtureA.getBody(); - var bodyB = fixtureB.getBody(); - // Is this contact flagged for filtering? - if (c.m_filterFlag) { - if (bodyB.shouldCollide(bodyA) == false) { - this.destroyContact(c); - continue; - } - if (fixtureB.shouldCollide(fixtureA) == false) { - this.destroyContact(c); - continue; - } - // Clear the filtering flag. - c.m_filterFlag = false; - } - var activeA = bodyA.isAwake() && !bodyA.isStatic(); - var activeB = bodyB.isAwake() && !bodyB.isStatic(); - // At least one body must be awake and it must be dynamic or kinematic. - if (activeA == false && activeB == false) { + edge = edge.next; + } + if (bodyB.shouldCollide(bodyA) == false) { + return; + } + if (fixtureB.shouldCollide(fixtureA) == false) { + return; + } + // Call the factory. + var contact = Contact.create(fixtureA, indexA, fixtureB, indexB); + if (contact == null) { + return; + } + // Insert into the world. + contact.m_prev = null; + if (this.m_contactList != null) { + contact.m_next = this.m_contactList; + this.m_contactList.m_prev = contact; + } + this.m_contactList = contact; + ++this.m_contactCount; + }; + /** + * @internal + * Removes old non-overlapping contacts, applies filters and updates contacts. + */ + World.prototype.updateContacts = function () { + // Update awake contacts. + var c; + var next_c = this.m_contactList; + while (c = next_c) { + next_c = c.getNext(); + var fixtureA = c.getFixtureA(); + var fixtureB = c.getFixtureB(); + var indexA = c.getChildIndexA(); + var indexB = c.getChildIndexB(); + var bodyA = fixtureA.getBody(); + var bodyB = fixtureB.getBody(); + // Is this contact flagged for filtering? + if (c.m_filterFlag) { + if (bodyB.shouldCollide(bodyA) == false) { + this.destroyContact(c); continue; } - var proxyIdA = fixtureA.m_proxies[indexA].proxyId; - var proxyIdB = fixtureB.m_proxies[indexB].proxyId; - var overlap = this.m_broadPhase.testOverlap(proxyIdA, proxyIdB); - // Here we destroy contacts that cease to overlap in the broad-phase. - if (overlap == false) { + if (fixtureB.shouldCollide(fixtureA) == false) { this.destroyContact(c); continue; } - // The contact persists. - c.update(this); - } - }; - /** - * @internal - */ - World.prototype.destroyContact = function (contact) { - Contact.destroy(contact, this); - // Remove from the world. - if (contact.m_prev) { - contact.m_prev.m_next = contact.m_next; - } - if (contact.m_next) { - contact.m_next.m_prev = contact.m_prev; - } - if (contact == this.m_contactList) { - this.m_contactList = contact.m_next; - } - --this.m_contactCount; - }; - /** - * Register an event listener. - */ - // tslint:disable-next-line:typedef - World.prototype.on = function (name, listener) { - if (typeof name !== 'string' || typeof listener !== 'function') { - return this; - } - if (!this._listeners) { - this._listeners = {}; - } - if (!this._listeners[name]) { - this._listeners[name] = []; - } - this._listeners[name].push(listener); + // Clear the filtering flag. + c.m_filterFlag = false; + } + var activeA = bodyA.isAwake() && !bodyA.isStatic(); + var activeB = bodyB.isAwake() && !bodyB.isStatic(); + // At least one body must be awake and it must be dynamic or kinematic. + if (activeA == false && activeB == false) { + continue; + } + var proxyIdA = fixtureA.m_proxies[indexA].proxyId; + var proxyIdB = fixtureB.m_proxies[indexB].proxyId; + var overlap = this.m_broadPhase.testOverlap(proxyIdA, proxyIdB); + // Here we destroy contacts that cease to overlap in the broad-phase. + if (overlap == false) { + this.destroyContact(c); + continue; + } + // The contact persists. + c.update(this); + } + }; + /** + * @internal + */ + World.prototype.destroyContact = function (contact) { + Contact.destroy(contact, this); + // Remove from the world. + if (contact.m_prev) { + contact.m_prev.m_next = contact.m_next; + } + if (contact.m_next) { + contact.m_next.m_prev = contact.m_prev; + } + if (contact == this.m_contactList) { + this.m_contactList = contact.m_next; + } + --this.m_contactCount; + }; + /** + * Register an event listener. + */ + // tslint:disable-next-line:typedef + World.prototype.on = function (name, listener) { + if (typeof name !== 'string' || typeof listener !== 'function') { return this; - }; - /** - * Remove an event listener. - */ - // tslint:disable-next-line:typedef - World.prototype.off = function (name, listener) { - if (typeof name !== 'string' || typeof listener !== 'function') { - return this; - } - var listeners = this._listeners && this._listeners[name]; - if (!listeners || !listeners.length) { - return this; - } - var index = listeners.indexOf(listener); - if (index >= 0) { - listeners.splice(index, 1); - } + } + if (!this._listeners) { + this._listeners = {}; + } + if (!this._listeners[name]) { + this._listeners[name] = []; + } + this._listeners[name].push(listener); + return this; + }; + /** + * Remove an event listener. + */ + // tslint:disable-next-line:typedef + World.prototype.off = function (name, listener) { + if (typeof name !== 'string' || typeof listener !== 'function') { return this; - }; - World.prototype.publish = function (name, arg1, arg2, arg3) { - var listeners = this._listeners && this._listeners[name]; - if (!listeners || !listeners.length) { - return 0; - } - for (var l = 0; l < listeners.length; l++) { - listeners[l].call(this, arg1, arg2, arg3); - } - return listeners.length; - }; - /** - * @internal - */ - World.prototype.beginContact = function (contact) { - this.publish('begin-contact', contact); - }; - /** - * @internal - */ - World.prototype.endContact = function (contact) { - this.publish('end-contact', contact); - }; - /** - * @internal - */ - World.prototype.preSolve = function (contact, oldManifold) { - this.publish('pre-solve', contact, oldManifold); - }; - /** - * @internal - */ - World.prototype.postSolve = function (contact, impulse) { - this.publish('post-solve', contact, impulse); - }; - return World; - }()); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var Vec3 = /** @class */ (function () { - // tslint:disable-next-line:typedef - function Vec3(x, y, z) { - if (!(this instanceof Vec3)) { - return new Vec3(x, y, z); - } - if (typeof x === 'undefined') { - this.x = 0; - this.y = 0; - this.z = 0; - } - else if (typeof x === 'object') { - this.x = x.x; - this.y = x.y; - this.z = x.z; - } - else { - this.x = x; - this.y = y; - this.z = z; - } } - /** @internal */ - Vec3.prototype._serialize = function () { - return { - x: this.x, - y: this.y, - z: this.z - }; - }; - /** @internal */ - Vec3._deserialize = function (data) { - var obj = Object.create(Vec3.prototype); - obj.x = data.x; - obj.y = data.y; - obj.z = data.z; - return obj; - }; - /** @internal */ - Vec3.neo = function (x, y, z) { - var obj = Object.create(Vec3.prototype); - obj.x = x; - obj.y = y; - obj.z = z; - return obj; - }; - Vec3.zero = function () { - var obj = Object.create(Vec3.prototype); - obj.x = 0; - obj.y = 0; - obj.z = 0; - return obj; - }; - Vec3.clone = function (v) { - return Vec3.neo(v.x, v.y, v.z); - }; - /** @internal */ - Vec3.prototype.toString = function () { - return JSON.stringify(this); - }; - /** - * Does this vector contain finite coordinates? - */ - Vec3.isValid = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - return math.isFinite(obj.x) && math.isFinite(obj.y) && math.isFinite(obj.z); - }; - Vec3.assert = function (o) { - return; - }; - Vec3.prototype.setZero = function () { - this.x = 0.0; - this.y = 0.0; - this.z = 0.0; + var listeners = this._listeners && this._listeners[name]; + if (!listeners || !listeners.length) { return this; - }; - Vec3.prototype.set = function (x, y, z) { + } + var index = listeners.indexOf(listener); + if (index >= 0) { + listeners.splice(index, 1); + } + return this; + }; + World.prototype.publish = function (name, arg1, arg2, arg3) { + var listeners = this._listeners && this._listeners[name]; + if (!listeners || !listeners.length) { + return 0; + } + for (var l = 0; l < listeners.length; l++) { + listeners[l].call(this, arg1, arg2, arg3); + } + return listeners.length; + }; + /** + * @internal + */ + World.prototype.beginContact = function (contact) { + this.publish('begin-contact', contact); + }; + /** + * @internal + */ + World.prototype.endContact = function (contact) { + this.publish('end-contact', contact); + }; + /** + * @internal + */ + World.prototype.preSolve = function (contact, oldManifold) { + this.publish('pre-solve', contact, oldManifold); + }; + /** + * @internal + */ + World.prototype.postSolve = function (contact, impulse) { + this.publish('post-solve', contact, impulse); + }; + return World; +}()); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var Vec3 = /** @class */ (function () { + // tslint:disable-next-line:typedef + function Vec3(x, y, z) { + if (!(this instanceof Vec3)) { + return new Vec3(x, y, z); + } + if (typeof x === 'undefined') { + this.x = 0; + this.y = 0; + this.z = 0; + } + else if (typeof x === 'object') { + this.x = x.x; + this.y = x.y; + this.z = x.z; + } + else { this.x = x; this.y = y; this.z = z; - return this; - }; - Vec3.prototype.add = function (w) { - this.x += w.x; - this.y += w.y; - this.z += w.z; - return this; - }; - Vec3.prototype.sub = function (w) { - this.x -= w.x; - this.y -= w.y; - this.z -= w.z; - return this; - }; - Vec3.prototype.mul = function (m) { - this.x *= m; - this.y *= m; - this.z *= m; - return this; - }; - Vec3.areEqual = function (v, w) { - return v === w || - typeof v === 'object' && v !== null && - typeof w === 'object' && w !== null && - v.x === w.x && v.y === w.y && v.z === w.z; - }; - /** - * Perform the dot product on two vectors. - */ - Vec3.dot = function (v, w) { - return v.x * w.x + v.y * w.y + v.z * w.z; - }; - /** - * Perform the cross product on two vectors. In 2D this produces a scalar. - */ - Vec3.cross = function (v, w) { - return new Vec3(v.y * w.z - v.z * w.y, v.z * w.x - v.x * w.z, v.x * w.y - v.y * w.x); - }; - Vec3.add = function (v, w) { - return new Vec3(v.x + w.x, v.y + w.y, v.z + w.z); - }; - Vec3.sub = function (v, w) { - return new Vec3(v.x - w.x, v.y - w.y, v.z - w.z); - }; - Vec3.mul = function (v, m) { - return new Vec3(m * v.x, m * v.y, m * v.z); - }; - Vec3.prototype.neg = function () { - this.x = -this.x; - this.y = -this.y; - this.z = -this.z; - return this; - }; - Vec3.neg = function (v) { - return new Vec3(-v.x, -v.y, -v.z); + } + } + /** @internal */ + Vec3.prototype._serialize = function () { + return { + x: this.x, + y: this.y, + z: this.z }; - return Vec3; - }()); + }; + /** @internal */ + Vec3._deserialize = function (data) { + var obj = Object.create(Vec3.prototype); + obj.x = data.x; + obj.y = data.y; + obj.z = data.z; + return obj; + }; + /** @internal */ + Vec3.neo = function (x, y, z) { + var obj = Object.create(Vec3.prototype); + obj.x = x; + obj.y = y; + obj.z = z; + return obj; + }; + Vec3.zero = function () { + var obj = Object.create(Vec3.prototype); + obj.x = 0; + obj.y = 0; + obj.z = 0; + return obj; + }; + Vec3.clone = function (v) { + return Vec3.neo(v.x, v.y, v.z); + }; + /** @internal */ + Vec3.prototype.toString = function () { + return JSON.stringify(this); + }; + /** + * Does this vector contain finite coordinates? + */ + Vec3.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return math.isFinite(obj.x) && math.isFinite(obj.y) && math.isFinite(obj.z); + }; + Vec3.assert = function (o) { + }; + Vec3.prototype.setZero = function () { + this.x = 0.0; + this.y = 0.0; + this.z = 0.0; + return this; + }; + Vec3.prototype.set = function (x, y, z) { + this.x = x; + this.y = y; + this.z = z; + return this; + }; + Vec3.prototype.add = function (w) { + this.x += w.x; + this.y += w.y; + this.z += w.z; + return this; + }; + Vec3.prototype.sub = function (w) { + this.x -= w.x; + this.y -= w.y; + this.z -= w.z; + return this; + }; + Vec3.prototype.mul = function (m) { + this.x *= m; + this.y *= m; + this.z *= m; + return this; + }; + Vec3.areEqual = function (v, w) { + return v === w || + typeof v === 'object' && v !== null && + typeof w === 'object' && w !== null && + v.x === w.x && v.y === w.y && v.z === w.z; + }; + /** + * Perform the dot product on two vectors. + */ + Vec3.dot = function (v, w) { + return v.x * w.x + v.y * w.y + v.z * w.z; + }; + /** + * Perform the cross product on two vectors. In 2D this produces a scalar. + */ + Vec3.cross = function (v, w) { + return new Vec3(v.y * w.z - v.z * w.y, v.z * w.x - v.x * w.z, v.x * w.y - v.y * w.x); + }; + Vec3.add = function (v, w) { + return new Vec3(v.x + w.x, v.y + w.y, v.z + w.z); + }; + Vec3.sub = function (v, w) { + return new Vec3(v.x - w.x, v.y - w.y, v.z - w.z); + }; + Vec3.mul = function (v, m) { + return new Vec3(m * v.x, m * v.y, m * v.z); + }; + Vec3.prototype.neg = function () { + this.x = -this.x; + this.y = -this.y; + this.z = -this.z; + return this; + }; + Vec3.neg = function (v) { + return new Vec3(-v.x, -v.y, -v.z); + }; + return Vec3; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A line segment (edge) shape. These can be connected in chains or loops to + * other edge shapes. The connectivity information is used to ensure correct + * contact normals. + */ +var EdgeShape = /** @class */ (function (_super) { + __extends(EdgeShape, _super); + function EdgeShape(v1, v2) { + var _this = this; + // @ts-ignore + if (!(_this instanceof EdgeShape)) { + return new EdgeShape(v1, v2); + } + _this = _super.call(this) || this; + _this.m_type = EdgeShape.TYPE; + _this.m_radius = Settings.polygonRadius; + _this.m_vertex1 = v1 ? Vec2.clone(v1) : Vec2.zero(); + _this.m_vertex2 = v2 ? Vec2.clone(v2) : Vec2.zero(); + _this.m_vertex0 = Vec2.zero(); + _this.m_vertex3 = Vec2.zero(); + _this.m_hasVertex0 = false; + _this.m_hasVertex3 = false; + return _this; + } + /** @internal */ + EdgeShape.prototype._serialize = function () { + return { + type: this.m_type, + vertex1: this.m_vertex1, + vertex2: this.m_vertex2, + vertex0: this.m_vertex0, + vertex3: this.m_vertex3, + hasVertex0: this.m_hasVertex0, + hasVertex3: this.m_hasVertex3, + }; + }; + /** @internal */ + EdgeShape._deserialize = function (data) { + var shape = new EdgeShape(data.vertex1, data.vertex2); + if (shape.m_hasVertex0) { + shape.setPrevVertex(data.vertex0); + } + if (shape.m_hasVertex3) { + shape.setNextVertex(data.vertex3); + } + return shape; + }; + /** @internal */ + EdgeShape.prototype._reset = function () { + // noop + }; + EdgeShape.prototype.getRadius = function () { + return this.m_radius; + }; + EdgeShape.prototype.getType = function () { + return this.m_type; + }; + /** @internal @deprecated */ + EdgeShape.prototype.setNext = function (v) { + return this.setNextVertex(v); + }; + /** + * Optional next vertex, used for smooth collision. + */ + EdgeShape.prototype.setNextVertex = function (v) { + if (v) { + this.m_vertex3.setVec2(v); + this.m_hasVertex3 = true; + } + else { + this.m_vertex3.setZero(); + this.m_hasVertex3 = false; + } + return this; + }; + /** + * Optional next vertex, used for smooth collision. + */ + EdgeShape.prototype.getNextVertex = function () { + return this.m_vertex3; + }; + /** @internal @deprecated */ + EdgeShape.prototype.setPrev = function (v) { + return this.setPrevVertex(v); + }; + /** + * Optional prev vertex, used for smooth collision. + */ + EdgeShape.prototype.setPrevVertex = function (v) { + if (v) { + this.m_vertex0.setVec2(v); + this.m_hasVertex0 = true; + } + else { + this.m_vertex0.setZero(); + this.m_hasVertex0 = false; + } + return this; + }; + /** + * Optional prev vertex, used for smooth collision. + */ + EdgeShape.prototype.getPrevVertex = function () { + return this.m_vertex0; + }; + /** + * Set this as an isolated edge. + */ + EdgeShape.prototype._set = function (v1, v2) { + this.m_vertex1.setVec2(v1); + this.m_vertex2.setVec2(v2); + this.m_hasVertex0 = false; + this.m_hasVertex3 = false; + return this; + }; + /** + * @internal + * @deprecated Shapes should be treated as immutable. + * + * clone the concrete shape. + */ + EdgeShape.prototype._clone = function () { + var clone = new EdgeShape(); + clone.m_type = this.m_type; + clone.m_radius = this.m_radius; + clone.m_vertex1.setVec2(this.m_vertex1); + clone.m_vertex2.setVec2(this.m_vertex2); + clone.m_vertex0.setVec2(this.m_vertex0); + clone.m_vertex3.setVec2(this.m_vertex3); + clone.m_hasVertex0 = this.m_hasVertex0; + clone.m_hasVertex3 = this.m_hasVertex3; + return clone; + }; + /** + * Get the number of child primitives. + */ + EdgeShape.prototype.getChildCount = function () { + return 1; + }; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + EdgeShape.prototype.testPoint = function (xf, p) { + return false; + }; + /** + * Cast a ray against a child shape. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + EdgeShape.prototype.rayCast = function (output, input, xf, childIndex) { + // p = p1 + t * d + // v = v1 + s * e + // p1 + t * d = v1 + s * e + // s * e - t * d = p1 - v1 + // NOT_USED(childIndex); + // Put the ray into the edge's frame of reference. + var p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p)); + var p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p)); + var d = Vec2.sub(p2, p1); + var v1 = this.m_vertex1; + var v2 = this.m_vertex2; + var e = Vec2.sub(v2, v1); + var normal = Vec2.neo(e.y, -e.x); + normal.normalize(); + // q = p1 + t * d + // dot(normal, q - v1) = 0 + // dot(normal, p1 - v1) + t * dot(normal, d) = 0 + var numerator = Vec2.dot(normal, Vec2.sub(v1, p1)); + var denominator = Vec2.dot(normal, d); + if (denominator == 0.0) { + return false; + } + var t = numerator / denominator; + if (t < 0.0 || input.maxFraction < t) { + return false; + } + var q = Vec2.add(p1, Vec2.mulNumVec2(t, d)); + // q = v1 + s * r + // s = dot(q - v1, r) / dot(r, r) + var r = Vec2.sub(v2, v1); + var rr = Vec2.dot(r, r); + if (rr == 0.0) { + return false; + } + var s = Vec2.dot(Vec2.sub(q, v1), r) / rr; + if (s < 0.0 || 1.0 < s) { + return false; + } + output.fraction = t; + if (numerator > 0.0) { + output.normal = Rot.mulVec2(xf.q, normal).neg(); + } + else { + output.normal = Rot.mulVec2(xf.q, normal); + } + return true; + }; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + EdgeShape.prototype.computeAABB = function (aabb, xf, childIndex) { + var v1 = Transform.mulVec2(xf, this.m_vertex1); + var v2 = Transform.mulVec2(xf, this.m_vertex2); + aabb.combinePoints(v1, v2); + aabb.extend(this.m_radius); + }; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * A line segment (edge) shape. These can be connected in chains or loops to - * other edge shapes. The connectivity information is used to ensure correct - * contact normals. - */ - var EdgeShape = /** @class */ (function (_super) { - __extends(EdgeShape, _super); - function EdgeShape(v1, v2) { - var _this = this; - // @ts-ignore - if (!(_this instanceof EdgeShape)) { - return new EdgeShape(v1, v2); - } - _this = _super.call(this) || this; - _this.m_type = EdgeShape.TYPE; - _this.m_radius = Settings.polygonRadius; - _this.m_vertex1 = v1 ? Vec2.clone(v1) : Vec2.zero(); - _this.m_vertex2 = v2 ? Vec2.clone(v2) : Vec2.zero(); - _this.m_vertex0 = Vec2.zero(); - _this.m_vertex3 = Vec2.zero(); - _this.m_hasVertex0 = false; - _this.m_hasVertex3 = false; - return _this; + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + EdgeShape.prototype.computeMass = function (massData, density) { + massData.mass = 0.0; + massData.center.setCombine(0.5, this.m_vertex1, 0.5, this.m_vertex2); + massData.I = 0.0; + }; + EdgeShape.prototype.computeDistanceProxy = function (proxy) { + proxy.m_vertices.push(this.m_vertex1); + proxy.m_vertices.push(this.m_vertex2); + proxy.m_count = 2; + proxy.m_radius = this.m_radius; + }; + EdgeShape.TYPE = 'edge'; + return EdgeShape; +}(Shape)); +var Edge = EdgeShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A chain shape is a free form sequence of line segments. The chain has + * two-sided collision, so you can use inside and outside collision. Therefore, + * you may use any winding order. Connectivity information is used to create + * smooth collisions. + * + * WARNING: The chain will not collide properly if there are self-intersections. + */ +var ChainShape = /** @class */ (function (_super) { + __extends(ChainShape, _super); + function ChainShape(vertices, loop) { + var _this = this; + // @ts-ignore + if (!(_this instanceof ChainShape)) { + return new ChainShape(vertices, loop); } - /** @internal */ - EdgeShape.prototype._serialize = function () { - return { - type: this.m_type, - vertex1: this.m_vertex1, - vertex2: this.m_vertex2, - vertex0: this.m_vertex0, - vertex3: this.m_vertex3, - hasVertex0: this.m_hasVertex0, - hasVertex3: this.m_hasVertex3, - }; - }; - /** @internal */ - EdgeShape._deserialize = function (data) { - var shape = new EdgeShape(data.vertex1, data.vertex2); - if (shape.m_hasVertex0) { - shape.setPrevVertex(data.vertex0); - } - if (shape.m_hasVertex3) { - shape.setNextVertex(data.vertex3); - } - return shape; - }; - /** @internal @deprecated */ - EdgeShape.prototype.setNext = function (v) { - return this.setNextVertex(v); - }; - /** - * Optional next vertex, used for smooth collision. - */ - EdgeShape.prototype.setNextVertex = function (v) { - if (v) { - this.m_vertex3.setVec2(v); - this.m_hasVertex3 = true; - } - else { - this.m_vertex3.setZero(); - this.m_hasVertex3 = false; - } - return this; - }; - /** - * Optional next vertex, used for smooth collision. - */ - EdgeShape.prototype.getNextVertex = function () { - return this.m_vertex3; - }; - /** @internal @deprecated */ - EdgeShape.prototype.setPrev = function (v) { - return this.setPrevVertex(v); - }; - /** - * Optional prev vertex, used for smooth collision. - */ - EdgeShape.prototype.setPrevVertex = function (v) { - if (v) { - this.m_vertex0.setVec2(v); - this.m_hasVertex0 = true; + _this = _super.call(this) || this; + _this.m_type = ChainShape.TYPE; + _this.m_radius = Settings.polygonRadius; + _this.m_vertices = []; + _this.m_count = 0; + _this.m_prevVertex = null; + _this.m_nextVertex = null; + _this.m_hasPrevVertex = false; + _this.m_hasNextVertex = false; + _this.m_isLoop = !!loop; + if (vertices && vertices.length) { + if (loop) { + _this._createLoop(vertices); } else { - this.m_vertex0.setZero(); - this.m_hasVertex0 = false; - } - return this; - }; - /** - * Optional prev vertex, used for smooth collision. - */ - EdgeShape.prototype.getPrevVertex = function () { - return this.m_vertex0; - }; - /** - * Set this as an isolated edge. - */ - EdgeShape.prototype._set = function (v1, v2) { - this.m_vertex1.setVec2(v1); - this.m_vertex2.setVec2(v2); - this.m_hasVertex0 = false; - this.m_hasVertex3 = false; - return this; - }; - /** - * @internal - * @deprecated Shapes should be treated as immutable. - * - * clone the concrete shape. - */ - EdgeShape.prototype._clone = function () { - var clone = new EdgeShape(); - clone.m_type = this.m_type; - clone.m_radius = this.m_radius; - clone.m_vertex1.setVec2(this.m_vertex1); - clone.m_vertex2.setVec2(this.m_vertex2); - clone.m_vertex0.setVec2(this.m_vertex0); - clone.m_vertex3.setVec2(this.m_vertex3); - clone.m_hasVertex0 = this.m_hasVertex0; - clone.m_hasVertex3 = this.m_hasVertex3; - return clone; - }; - /** - * Get the number of child primitives. - */ - EdgeShape.prototype.getChildCount = function () { - return 1; - }; - /** - * Test a point for containment in this shape. This only works for convex - * shapes. - * - * @param xf The shape world transform. - * @param p A point in world coordinates. - */ - EdgeShape.prototype.testPoint = function (xf, p) { - return false; - }; - /** - * Cast a ray against a child shape. - * - * @param output The ray-cast results. - * @param input The ray-cast input parameters. - * @param xf The transform to be applied to the shape. - * @param childIndex The child shape index - */ - EdgeShape.prototype.rayCast = function (output, input, xf, childIndex) { - // p = p1 + t * d - // v = v1 + s * e - // p1 + t * d = v1 + s * e - // s * e - t * d = p1 - v1 - // NOT_USED(childIndex); - // Put the ray into the edge's frame of reference. - var p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p)); - var p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p)); - var d = Vec2.sub(p2, p1); - var v1 = this.m_vertex1; - var v2 = this.m_vertex2; - var e = Vec2.sub(v2, v1); - var normal = Vec2.neo(e.y, -e.x); - normal.normalize(); - // q = p1 + t * d - // dot(normal, q - v1) = 0 - // dot(normal, p1 - v1) + t * dot(normal, d) = 0 - var numerator = Vec2.dot(normal, Vec2.sub(v1, p1)); - var denominator = Vec2.dot(normal, d); - if (denominator == 0.0) { - return false; - } - var t = numerator / denominator; - if (t < 0.0 || input.maxFraction < t) { - return false; - } - var q = Vec2.add(p1, Vec2.mulNumVec2(t, d)); - // q = v1 + s * r - // s = dot(q - v1, r) / dot(r, r) - var r = Vec2.sub(v2, v1); - var rr = Vec2.dot(r, r); - if (rr == 0.0) { - return false; - } - var s = Vec2.dot(Vec2.sub(q, v1), r) / rr; - if (s < 0.0 || 1.0 < s) { - return false; + _this._createChain(vertices); } - output.fraction = t; - if (numerator > 0.0) { - output.normal = Rot.mulVec2(xf.q, normal).neg(); - } - else { - output.normal = Rot.mulVec2(xf.q, normal); + } + return _this; + } + /** @internal */ + ChainShape.prototype._serialize = function () { + var data = { + type: this.m_type, + vertices: this.m_vertices, + isLoop: this.m_isLoop, + hasPrevVertex: this.m_hasPrevVertex, + hasNextVertex: this.m_hasNextVertex, + prevVertex: null, + nextVertex: null, + }; + if (this.m_prevVertex) { + data.prevVertex = this.m_prevVertex; + } + if (this.m_nextVertex) { + data.nextVertex = this.m_nextVertex; + } + return data; + }; + /** @internal */ + ChainShape._deserialize = function (data, fixture, restore) { + var vertices = []; + if (data.vertices) { + for (var i = 0; i < data.vertices.length; i++) { + vertices.push(restore(Vec2, data.vertices[i])); } - return true; - }; - /** - * Given a transform, compute the associated axis aligned bounding box for a - * child shape. - * - * @param aabb Returns the axis aligned box. - * @param xf The world transform of the shape. - * @param childIndex The child shape - */ - EdgeShape.prototype.computeAABB = function (aabb, xf, childIndex) { - var v1 = Transform.mulVec2(xf, this.m_vertex1); - var v2 = Transform.mulVec2(xf, this.m_vertex2); - aabb.combinePoints(v1, v2); - aabb.extend(this.m_radius); - }; - /** - * Compute the mass properties of this shape using its dimensions and density. - * The inertia tensor is computed about the local origin. - * - * @param massData Returns the mass data for this shape. - * @param density The density in kilograms per meter squared. - */ - EdgeShape.prototype.computeMass = function (massData, density) { - massData.mass = 0.0; - massData.center.setCombine(0.5, this.m_vertex1, 0.5, this.m_vertex2); - massData.I = 0.0; - }; - EdgeShape.prototype.computeDistanceProxy = function (proxy) { - proxy.m_vertices.push(this.m_vertex1); - proxy.m_vertices.push(this.m_vertex2); - proxy.m_count = 2; - proxy.m_radius = this.m_radius; - }; - EdgeShape.TYPE = 'edge'; - return EdgeShape; - }(Shape)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + } + var shape = new ChainShape(vertices, data.isLoop); + if (data.prevVertex) { + shape.setPrevVertex(data.prevVertex); + } + if (data.nextVertex) { + shape.setNextVertex(data.nextVertex); + } + return shape; + }; + // clear() { + // this.m_vertices.length = 0; + // this.m_count = 0; + // } + ChainShape.prototype.getType = function () { + return this.m_type; + }; + ChainShape.prototype.getRadius = function () { + return this.m_radius; + }; + /** + * @internal + * Create a loop. This automatically adjusts connectivity. * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * @param vertices an array of vertices, these are copied + * @param count the vertex count + */ + ChainShape.prototype._createLoop = function (vertices) { + for (var i = 1; i < vertices.length; ++i) { + vertices[i - 1]; + vertices[i]; + } + this.m_vertices = []; + this.m_count = vertices.length + 1; + for (var i = 0; i < vertices.length; ++i) { + this.m_vertices[i] = Vec2.clone(vertices[i]); + } + this.m_vertices[vertices.length] = Vec2.clone(vertices[0]); + this.m_prevVertex = this.m_vertices[this.m_count - 2]; + this.m_nextVertex = this.m_vertices[1]; + this.m_hasPrevVertex = true; + this.m_hasNextVertex = true; + return this; + }; + /** + * @internal + * Create a chain with isolated end vertices. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * A chain shape is a free form sequence of line segments. The chain has - * two-sided collision, so you can use inside and outside collision. Therefore, - * you may use any winding order. Connectivity information is used to create - * smooth collisions. + * @param vertices an array of vertices, these are copied + * @param count the vertex count + */ + ChainShape.prototype._createChain = function (vertices) { + for (var i = 1; i < vertices.length; ++i) { + // If the code crashes here, it means your vertices are too close together. + vertices[i - 1]; + vertices[i]; + } + this.m_count = vertices.length; + for (var i = 0; i < vertices.length; ++i) { + this.m_vertices[i] = Vec2.clone(vertices[i]); + } + this.m_hasPrevVertex = false; + this.m_hasNextVertex = false; + this.m_prevVertex = null; + this.m_nextVertex = null; + return this; + }; + /** @internal */ + ChainShape.prototype._reset = function () { + if (this.m_isLoop) { + this._createLoop(this.m_vertices); + } + else { + this._createChain(this.m_vertices); + } + }; + /** + * Establish connectivity to a vertex that precedes the first vertex. Don't call + * this for loops. + */ + ChainShape.prototype.setPrevVertex = function (prevVertex) { + this.m_prevVertex = prevVertex; + this.m_hasPrevVertex = true; + }; + ChainShape.prototype.getPrevVertex = function () { + return this.m_prevVertex; + }; + /** + * Establish connectivity to a vertex that follows the last vertex. Don't call + * this for loops. + */ + ChainShape.prototype.setNextVertex = function (nextVertex) { + this.m_nextVertex = nextVertex; + this.m_hasNextVertex = true; + }; + ChainShape.prototype.getNextVertex = function () { + return this.m_nextVertex; + }; + /** + * @internal + * @deprecated Shapes should be treated as immutable. * - * WARNING: The chain will not collide properly if there are self-intersections. + * clone the concrete shape. */ - var ChainShape = /** @class */ (function (_super) { - __extends(ChainShape, _super); - function ChainShape(vertices, loop) { - var _this = this; - // @ts-ignore - if (!(_this instanceof ChainShape)) { - return new ChainShape(vertices, loop); - } - _this = _super.call(this) || this; - _this.m_type = ChainShape.TYPE; - _this.m_radius = Settings.polygonRadius; - _this.m_vertices = []; - _this.m_count = 0; - _this.m_prevVertex = null; - _this.m_nextVertex = null; - _this.m_hasPrevVertex = false; - _this.m_hasNextVertex = false; - _this.m_isLoop = !!loop; - if (vertices && vertices.length) { - if (loop) { - _this._createLoop(vertices); - } - else { - _this._createChain(vertices); - } - } - return _this; + ChainShape.prototype._clone = function () { + var clone = new ChainShape(); + clone._createChain(this.m_vertices); + clone.m_type = this.m_type; + clone.m_radius = this.m_radius; + clone.m_prevVertex = this.m_prevVertex; + clone.m_nextVertex = this.m_nextVertex; + clone.m_hasPrevVertex = this.m_hasPrevVertex; + clone.m_hasNextVertex = this.m_hasNextVertex; + return clone; + }; + /** + * Get the number of child primitives. + */ + ChainShape.prototype.getChildCount = function () { + // edge count = vertex count - 1 + return this.m_count - 1; + }; + // Get a child edge. + ChainShape.prototype.getChildEdge = function (edge, childIndex) { + edge.m_type = EdgeShape.TYPE; + edge.m_radius = this.m_radius; + edge.m_vertex1 = this.m_vertices[childIndex]; + edge.m_vertex2 = this.m_vertices[childIndex + 1]; + if (childIndex > 0) { + edge.m_vertex0 = this.m_vertices[childIndex - 1]; + edge.m_hasVertex0 = true; } - /** @internal */ - ChainShape.prototype._serialize = function () { - var data = { - type: this.m_type, - vertices: this.m_vertices, - isLoop: this.m_isLoop, - hasPrevVertex: this.m_hasPrevVertex, - hasNextVertex: this.m_hasNextVertex, - prevVertex: null, - nextVertex: null, - }; - if (this.m_prevVertex) { - data.prevVertex = this.m_prevVertex; - } - if (this.m_nextVertex) { - data.nextVertex = this.m_nextVertex; - } - return data; - }; - /** @internal */ - ChainShape._deserialize = function (data, fixture, restore) { - var vertices = []; - if (data.vertices) { - for (var i = 0; i < data.vertices.length; i++) { - vertices.push(restore(Vec2, data.vertices[i])); - } - } - var shape = new ChainShape(vertices, data.isLoop); - if (data.prevVertex) { - shape.setPrevVertex(data.prevVertex); - } - if (data.nextVertex) { - shape.setNextVertex(data.nextVertex); - } - return shape; - }; - // clear() { - // this.m_vertices.length = 0; - // this.m_count = 0; - // } - /** - * @internal - * Create a loop. This automatically adjusts connectivity. - * - * @param vertices an array of vertices, these are copied - * @param count the vertex count - */ - ChainShape.prototype._createLoop = function (vertices) { - for (var i = 1; i < vertices.length; ++i) { - vertices[i - 1]; - vertices[i]; - } - this.m_vertices = []; - this.m_count = vertices.length + 1; - for (var i = 0; i < vertices.length; ++i) { - this.m_vertices[i] = Vec2.clone(vertices[i]); - } - this.m_vertices[vertices.length] = Vec2.clone(vertices[0]); - this.m_prevVertex = this.m_vertices[this.m_count - 2]; - this.m_nextVertex = this.m_vertices[1]; - this.m_hasPrevVertex = true; - this.m_hasNextVertex = true; - return this; - }; - /** - * @internal - * Create a chain with isolated end vertices. - * - * @param vertices an array of vertices, these are copied - * @param count the vertex count - */ - ChainShape.prototype._createChain = function (vertices) { - for (var i = 1; i < vertices.length; ++i) { - // If the code crashes here, it means your vertices are too close together. - vertices[i - 1]; - vertices[i]; - } - this.m_count = vertices.length; - for (var i = 0; i < vertices.length; ++i) { - this.m_vertices[i] = Vec2.clone(vertices[i]); - } - this.m_hasPrevVertex = false; - this.m_hasNextVertex = false; - this.m_prevVertex = null; - this.m_nextVertex = null; - return this; - }; - /** @internal */ - ChainShape.prototype._reset = function () { - if (this.m_isLoop) { - this._createLoop(this.m_vertices); - } - else { - this._createChain(this.m_vertices); - } - }; - /** - * Establish connectivity to a vertex that precedes the first vertex. Don't call - * this for loops. - */ - ChainShape.prototype.setPrevVertex = function (prevVertex) { - this.m_prevVertex = prevVertex; - this.m_hasPrevVertex = true; - }; - ChainShape.prototype.getPrevVertex = function () { - return this.m_prevVertex; - }; - /** - * Establish connectivity to a vertex that follows the last vertex. Don't call - * this for loops. - */ - ChainShape.prototype.setNextVertex = function (nextVertex) { - this.m_nextVertex = nextVertex; - this.m_hasNextVertex = true; - }; - ChainShape.prototype.getNextVertex = function () { - return this.m_nextVertex; - }; - /** - * @internal - * @deprecated Shapes should be treated as immutable. - * - * clone the concrete shape. - */ - ChainShape.prototype._clone = function () { - var clone = new ChainShape(); - clone._createChain(this.m_vertices); - clone.m_type = this.m_type; - clone.m_radius = this.m_radius; - clone.m_prevVertex = this.m_prevVertex; - clone.m_nextVertex = this.m_nextVertex; - clone.m_hasPrevVertex = this.m_hasPrevVertex; - clone.m_hasNextVertex = this.m_hasNextVertex; - return clone; - }; - /** - * Get the number of child primitives. - */ - ChainShape.prototype.getChildCount = function () { - // edge count = vertex count - 1 - return this.m_count - 1; - }; - // Get a child edge. - ChainShape.prototype.getChildEdge = function (edge, childIndex) { - edge.m_type = EdgeShape.TYPE; - edge.m_radius = this.m_radius; - edge.m_vertex1 = this.m_vertices[childIndex]; - edge.m_vertex2 = this.m_vertices[childIndex + 1]; - if (childIndex > 0) { - edge.m_vertex0 = this.m_vertices[childIndex - 1]; - edge.m_hasVertex0 = true; - } - else { - edge.m_vertex0 = this.m_prevVertex; - edge.m_hasVertex0 = this.m_hasPrevVertex; - } - if (childIndex < this.m_count - 2) { - edge.m_vertex3 = this.m_vertices[childIndex + 2]; - edge.m_hasVertex3 = true; - } - else { - edge.m_vertex3 = this.m_nextVertex; - edge.m_hasVertex3 = this.m_hasNextVertex; - } - }; - ChainShape.prototype.getVertex = function (index) { - if (index < this.m_count) { - return this.m_vertices[index]; - } - else { - return this.m_vertices[0]; - } - }; - ChainShape.prototype.isLoop = function () { - return this.m_isLoop; - }; - /** - * Test a point for containment in this shape. This only works for convex - * shapes. - * - * This always return false. - * - * @param xf The shape world transform. - * @param p A point in world coordinates. - */ - ChainShape.prototype.testPoint = function (xf, p) { - return false; - }; - /** - * Cast a ray against a child shape. - * - * @param output The ray-cast results. - * @param input The ray-cast input parameters. - * @param xf The transform to be applied to the shape. - * @param childIndex The child shape index - */ - ChainShape.prototype.rayCast = function (output, input, xf, childIndex) { - var edgeShape = new EdgeShape(this.getVertex(childIndex), this.getVertex(childIndex + 1)); - return edgeShape.rayCast(output, input, xf, 0); - }; - /** - * Given a transform, compute the associated axis aligned bounding box for a - * child shape. - * - * @param aabb Returns the axis aligned box. - * @param xf The world transform of the shape. - * @param childIndex The child shape - */ - ChainShape.prototype.computeAABB = function (aabb, xf, childIndex) { - var v1 = Transform.mulVec2(xf, this.getVertex(childIndex)); - var v2 = Transform.mulVec2(xf, this.getVertex(childIndex + 1)); - aabb.combinePoints(v1, v2); - }; - /** - * Compute the mass properties of this shape using its dimensions and density. - * The inertia tensor is computed about the local origin. - * - * Chains have zero mass. - * - * @param massData Returns the mass data for this shape. - * @param density The density in kilograms per meter squared. - */ - ChainShape.prototype.computeMass = function (massData, density) { - massData.mass = 0.0; - massData.center = Vec2.zero(); - massData.I = 0.0; - }; - ChainShape.prototype.computeDistanceProxy = function (proxy, childIndex) { - proxy.m_buffer[0] = this.getVertex(childIndex); - proxy.m_buffer[1] = this.getVertex(childIndex + 1); - proxy.m_vertices = proxy.m_buffer; - proxy.m_count = 2; - proxy.m_radius = this.m_radius; + else { + edge.m_vertex0 = this.m_prevVertex; + edge.m_hasVertex0 = this.m_hasPrevVertex; + } + if (childIndex < this.m_count - 2) { + edge.m_vertex3 = this.m_vertices[childIndex + 2]; + edge.m_hasVertex3 = true; + } + else { + edge.m_vertex3 = this.m_nextVertex; + edge.m_hasVertex3 = this.m_hasNextVertex; + } + }; + ChainShape.prototype.getVertex = function (index) { + if (index < this.m_count) { + return this.m_vertices[index]; + } + else { + return this.m_vertices[0]; + } + }; + ChainShape.prototype.isLoop = function () { + return this.m_isLoop; + }; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * This always return false. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + ChainShape.prototype.testPoint = function (xf, p) { + return false; + }; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + ChainShape.prototype.rayCast = function (output, input, xf, childIndex) { + var edgeShape = new EdgeShape(this.getVertex(childIndex), this.getVertex(childIndex + 1)); + return edgeShape.rayCast(output, input, xf, 0); + }; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + ChainShape.prototype.computeAABB = function (aabb, xf, childIndex) { + var v1 = Transform.mulVec2(xf, this.getVertex(childIndex)); + var v2 = Transform.mulVec2(xf, this.getVertex(childIndex + 1)); + aabb.combinePoints(v1, v2); + }; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * Chains have zero mass. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + ChainShape.prototype.computeMass = function (massData, density) { + massData.mass = 0.0; + massData.center = Vec2.zero(); + massData.I = 0.0; + }; + ChainShape.prototype.computeDistanceProxy = function (proxy, childIndex) { + proxy.m_buffer[0] = this.getVertex(childIndex); + proxy.m_buffer[1] = this.getVertex(childIndex + 1); + proxy.m_vertices = proxy.m_buffer; + proxy.m_count = 2; + proxy.m_radius = this.m_radius; + }; + ChainShape.TYPE = 'chain'; + return ChainShape; +}(Shape)); +var Chain = ChainShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A convex polygon. It is assumed that the interior of the polygon is to the + * left of each edge. Polygons have a maximum number of vertices equal to + * Settings.maxPolygonVertices. In most cases you should not need many vertices + * for a convex polygon. extends Shape + */ +var PolygonShape = /** @class */ (function (_super) { + __extends(PolygonShape, _super); + // @ts-ignore + function PolygonShape(vertices) { + var _this = this; + // @ts-ignore + if (!(_this instanceof PolygonShape)) { + return new PolygonShape(vertices); + } + _this = _super.call(this) || this; + _this.m_type = PolygonShape.TYPE; + _this.m_radius = Settings.polygonRadius; + _this.m_centroid = Vec2.zero(); + _this.m_vertices = []; + _this.m_normals = []; + _this.m_count = 0; + if (vertices && vertices.length) { + _this._set(vertices); + } + return _this; + } + /** @internal */ + PolygonShape.prototype._serialize = function () { + return { + type: this.m_type, + vertices: this.m_vertices, }; - ChainShape.TYPE = 'chain'; - return ChainShape; - }(Shape)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba + }; + /** @internal */ + PolygonShape._deserialize = function (data, fixture, restore) { + var vertices = []; + if (data.vertices) { + for (var i = 0; i < data.vertices.length; i++) { + vertices.push(restore(Vec2, data.vertices[i])); + } + } + var shape = new PolygonShape(vertices); + return shape; + }; + PolygonShape.prototype.getType = function () { + return this.m_type; + }; + PolygonShape.prototype.getRadius = function () { + return this.m_radius; + }; + PolygonShape.prototype.getVertex = function (index) { + return this.m_vertices[index]; + }; + /** + * @internal + * @deprecated Shapes should be treated as immutable. * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * clone the concrete shape. + */ + PolygonShape.prototype._clone = function () { + var clone = new PolygonShape(); + clone.m_type = this.m_type; + clone.m_radius = this.m_radius; + clone.m_count = this.m_count; + clone.m_centroid.setVec2(this.m_centroid); + for (var i = 0; i < this.m_count; i++) { + clone.m_vertices.push(this.m_vertices[i].clone()); + } + for (var i = 0; i < this.m_normals.length; i++) { + clone.m_normals.push(this.m_normals[i].clone()); + } + return clone; + }; + /** + * Get the number of child primitives. + */ + PolygonShape.prototype.getChildCount = function () { + return 1; + }; + /** @internal */ + PolygonShape.prototype._reset = function () { + this._set(this.m_vertices); + }; + /** + * @internal * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + * Create a convex hull from the given array of local points. The count must be + * in the range [3, Settings.maxPolygonVertices]. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - /** - * A convex polygon. It is assumed that the interior of the polygon is to the - * left of each edge. Polygons have a maximum number of vertices equal to - * Settings.maxPolygonVertices. In most cases you should not need many vertices - * for a convex polygon. extends Shape - */ - var PolygonShape = /** @class */ (function (_super) { - __extends(PolygonShape, _super); - // @ts-ignore - function PolygonShape(vertices) { - var _this = this; - // @ts-ignore - if (!(_this instanceof PolygonShape)) { - return new PolygonShape(vertices); - } - _this = _super.call(this) || this; - _this.m_type = PolygonShape.TYPE; - _this.m_radius = Settings.polygonRadius; - _this.m_centroid = Vec2.zero(); - _this.m_vertices = []; - _this.m_normals = []; - _this.m_count = 0; - if (vertices && vertices.length) { - _this._set(vertices); - } - return _this; + * Warning: the points may be re-ordered, even if they form a convex polygon + * Warning: collinear points are handled but not removed. Collinear points may + * lead to poor stacking behavior. + */ + PolygonShape.prototype._set = function (vertices) { + if (vertices.length < 3) { + this._setAsBox(1.0, 1.0); + return; } - /** @internal */ - PolygonShape.prototype._serialize = function () { - return { - type: this.m_type, - vertices: this.m_vertices, - }; - }; - /** @internal */ - PolygonShape._deserialize = function (data, fixture, restore) { - var vertices = []; - if (data.vertices) { - for (var i = 0; i < data.vertices.length; i++) { - vertices.push(restore(Vec2, data.vertices[i])); + var n = math.min(vertices.length, Settings.maxPolygonVertices); + // Perform welding and copy vertices into local buffer. + var ps = []; // [Settings.maxPolygonVertices]; + for (var i = 0; i < n; ++i) { + var v = vertices[i]; + var unique = true; + for (var j = 0; j < ps.length; ++j) { + if (Vec2.distanceSquared(v, ps[j]) < 0.25 * Settings.linearSlopSquared) { + unique = false; + break; } } - var shape = new PolygonShape(vertices); - return shape; - }; - PolygonShape.prototype.getVertex = function (index) { - return this.m_vertices[index]; - }; - /** - * @internal - * @deprecated Shapes should be treated as immutable. - * - * clone the concrete shape. - */ - PolygonShape.prototype._clone = function () { - var clone = new PolygonShape(); - clone.m_type = this.m_type; - clone.m_radius = this.m_radius; - clone.m_count = this.m_count; - clone.m_centroid.setVec2(this.m_centroid); - for (var i = 0; i < this.m_count; i++) { - clone.m_vertices.push(this.m_vertices[i].clone()); - } - for (var i = 0; i < this.m_normals.length; i++) { - clone.m_normals.push(this.m_normals[i].clone()); - } - return clone; - }; - /** - * Get the number of child primitives. - */ - PolygonShape.prototype.getChildCount = function () { - return 1; - }; - /** @internal */ - PolygonShape.prototype._reset = function () { - this._set(this.m_vertices); - }; - /** - * @internal - * - * Create a convex hull from the given array of local points. The count must be - * in the range [3, Settings.maxPolygonVertices]. - * - * Warning: the points may be re-ordered, even if they form a convex polygon - * Warning: collinear points are handled but not removed. Collinear points may - * lead to poor stacking behavior. - */ - PolygonShape.prototype._set = function (vertices) { - if (vertices.length < 3) { - this._setAsBox(1.0, 1.0); - return; - } - var n = math.min(vertices.length, Settings.maxPolygonVertices); - // Perform welding and copy vertices into local buffer. - var ps = []; // [Settings.maxPolygonVertices]; - for (var i = 0; i < n; ++i) { - var v = vertices[i]; - var unique = true; - for (var j = 0; j < ps.length; ++j) { - if (Vec2.distanceSquared(v, ps[j]) < 0.25 * Settings.linearSlopSquared) { - unique = false; - break; - } - } - if (unique) { - ps.push(v); - } + if (unique) { + ps.push(Vec2.clone(v)); } - n = ps.length; - if (n < 3) { - this._setAsBox(1.0, 1.0); - return; + } + n = ps.length; + if (n < 3) { + this._setAsBox(1.0, 1.0); + return; + } + // Create the convex hull using the Gift wrapping algorithm + // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm + // Find the right most point on the hull (in case of multiple points bottom most is used) + var i0 = 0; + var x0 = ps[0].x; + for (var i = 1; i < n; ++i) { + var x = ps[i].x; + if (x > x0 || (x === x0 && ps[i].y < ps[i0].y)) { + i0 = i; + x0 = x; } - // Create the convex hull using the Gift wrapping algorithm - // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm - // Find the right most point on the hull (in case of multiple points bottom most is used) - var i0 = 0; - var x0 = ps[0].x; - for (var i = 1; i < n; ++i) { - var x = ps[i].x; - if (x > x0 || (x === x0 && ps[i].y < ps[i0].y)) { - i0 = i; - x0 = x; + } + var hull = []; // [Settings.maxPolygonVertices]; + var m = 0; + var ih = i0; + while (true) { + hull[m] = ih; + var ie = 0; + for (var j = 1; j < n; ++j) { + if (ie === ih) { + ie = j; + continue; } - } - var hull = []; // [Settings.maxPolygonVertices]; - var m = 0; - var ih = i0; - while (true) { - hull[m] = ih; - var ie = 0; - for (var j = 1; j < n; ++j) { - if (ie === ih) { - ie = j; - continue; - } - var r = Vec2.sub(ps[ie], ps[hull[m]]); - var v = Vec2.sub(ps[j], ps[hull[m]]); - var c = Vec2.crossVec2Vec2(r, v); - // c < 0 means counter-clockwise wrapping, c > 0 means clockwise wrapping - if (c < 0.0) { - ie = j; - } - // Collinearity check - if (c === 0.0 && v.lengthSquared() > r.lengthSquared()) { - ie = j; - } + var r = Vec2.sub(ps[ie], ps[hull[m]]); + var v = Vec2.sub(ps[j], ps[hull[m]]); + var c = Vec2.crossVec2Vec2(r, v); + // c < 0 means counter-clockwise wrapping, c > 0 means clockwise wrapping + if (c < 0.0) { + ie = j; } - ++m; - ih = ie; - if (ie === i0) { - break; + // Collinearity check + if (c === 0.0 && v.lengthSquared() > r.lengthSquared()) { + ie = j; } } - if (m < 3) { - this._setAsBox(1.0, 1.0); - return; - } - this.m_count = m; - // Copy vertices. - this.m_vertices = []; - for (var i = 0; i < m; ++i) { - this.m_vertices[i] = ps[hull[i]]; - } - // Compute normals. Ensure the edges have non-zero length. - for (var i = 0; i < m; ++i) { - var i1 = i; - var i2 = i + 1 < m ? i + 1 : 0; - var edge = Vec2.sub(this.m_vertices[i2], this.m_vertices[i1]); - this.m_normals[i] = Vec2.crossVec2Num(edge, 1.0); - this.m_normals[i].normalize(); - } - // Compute the polygon centroid. - this.m_centroid = ComputeCentroid(this.m_vertices, m); - }; - /** @internal */ - PolygonShape.prototype._setAsBox = function (hx, hy, center, angle) { - // start with right-bottom, counter-clockwise, as in Gift wrapping algorithm in PolygonShape._set() - this.m_vertices[0] = Vec2.neo(hx, -hy); - this.m_vertices[1] = Vec2.neo(hx, hy); - this.m_vertices[2] = Vec2.neo(-hx, hy); - this.m_vertices[3] = Vec2.neo(-hx, -hy); - this.m_normals[0] = Vec2.neo(1.0, 0.0); - this.m_normals[1] = Vec2.neo(0.0, 1.0); - this.m_normals[2] = Vec2.neo(-1.0, 0.0); - this.m_normals[3] = Vec2.neo(0.0, -1.0); - this.m_count = 4; - if (Vec2.isValid(center)) { - angle = angle || 0; - this.m_centroid.setVec2(center); - var xf = Transform.identity(); - xf.p.setVec2(center); - xf.q.setAngle(angle); - // Transform vertices and normals. - for (var i = 0; i < this.m_count; ++i) { - this.m_vertices[i] = Transform.mulVec2(xf, this.m_vertices[i]); - this.m_normals[i] = Rot.mulVec2(xf.q, this.m_normals[i]); - } + ++m; + ih = ie; + if (ie === i0) { + break; } - }; - /** - * Test a point for containment in this shape. This only works for convex - * shapes. - * - * @param xf The shape world transform. - * @param p A point in world coordinates. - */ - PolygonShape.prototype.testPoint = function (xf, p) { - var pLocal = Rot.mulTVec2(xf.q, Vec2.sub(p, xf.p)); + } + if (m < 3) { + this._setAsBox(1.0, 1.0); + return; + } + this.m_count = m; + // Copy vertices. + this.m_vertices = []; + for (var i = 0; i < m; ++i) { + this.m_vertices[i] = ps[hull[i]]; + } + // Compute normals. Ensure the edges have non-zero length. + for (var i = 0; i < m; ++i) { + var i1 = i; + var i2 = i + 1 < m ? i + 1 : 0; + var edge = Vec2.sub(this.m_vertices[i2], this.m_vertices[i1]); + this.m_normals[i] = Vec2.crossVec2Num(edge, 1.0); + this.m_normals[i].normalize(); + } + // Compute the polygon centroid. + this.m_centroid = ComputeCentroid(this.m_vertices, m); + }; + /** @internal */ + PolygonShape.prototype._setAsBox = function (hx, hy, center, angle) { + // start with right-bottom, counter-clockwise, as in Gift wrapping algorithm in PolygonShape._set() + this.m_vertices[0] = Vec2.neo(hx, -hy); + this.m_vertices[1] = Vec2.neo(hx, hy); + this.m_vertices[2] = Vec2.neo(-hx, hy); + this.m_vertices[3] = Vec2.neo(-hx, -hy); + this.m_normals[0] = Vec2.neo(1.0, 0.0); + this.m_normals[1] = Vec2.neo(0.0, 1.0); + this.m_normals[2] = Vec2.neo(-1.0, 0.0); + this.m_normals[3] = Vec2.neo(0.0, -1.0); + this.m_count = 4; + if (Vec2.isValid(center)) { + angle = angle || 0; + this.m_centroid.setVec2(center); + var xf = Transform.identity(); + xf.p.setVec2(center); + xf.q.setAngle(angle); + // Transform vertices and normals. for (var i = 0; i < this.m_count; ++i) { - var dot = Vec2.dot(this.m_normals[i], Vec2.sub(pLocal, this.m_vertices[i])); - if (dot > 0.0) { - return false; - } + this.m_vertices[i] = Transform.mulVec2(xf, this.m_vertices[i]); + this.m_normals[i] = Rot.mulVec2(xf.q, this.m_normals[i]); } - return true; - }; - /** - * Cast a ray against a child shape. - * - * @param output The ray-cast results. - * @param input The ray-cast input parameters. - * @param xf The transform to be applied to the shape. - * @param childIndex The child shape index - */ - PolygonShape.prototype.rayCast = function (output, input, xf, childIndex) { - // Put the ray into the polygon's frame of reference. - var p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p)); - var p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p)); - var d = Vec2.sub(p2, p1); - var lower = 0.0; - var upper = input.maxFraction; - var index = -1; - for (var i = 0; i < this.m_count; ++i) { - // p = p1 + a * d - // dot(normal, p - v) = 0 - // dot(normal, p1 - v) + a * dot(normal, d) = 0 - var numerator = Vec2.dot(this.m_normals[i], Vec2.sub(this.m_vertices[i], p1)); - var denominator = Vec2.dot(this.m_normals[i], d); - if (denominator == 0.0) { - if (numerator < 0.0) { - return false; - } - } - else { - // Note: we want this predicate without division: - // lower < numerator / denominator, where denominator < 0 - // Since denominator < 0, we have to flip the inequality: - // lower < numerator / denominator <==> denominator * lower > numerator. - if (denominator < 0.0 && numerator < lower * denominator) { - // Increase lower. - // The segment enters this half-space. - lower = numerator / denominator; - index = i; - } - else if (denominator > 0.0 && numerator < upper * denominator) { - // Decrease upper. - // The segment exits this half-space. - upper = numerator / denominator; - } - } - // The use of epsilon here causes the assert on lower to trip - // in some cases. Apparently the use of epsilon was to make edge - // shapes work, but now those are handled separately. - // if (upper < lower - Math.EPSILON) - if (upper < lower) { + } + }; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + PolygonShape.prototype.testPoint = function (xf, p) { + var pLocal = Rot.mulTVec2(xf.q, Vec2.sub(p, xf.p)); + for (var i = 0; i < this.m_count; ++i) { + var dot = Vec2.dot(this.m_normals[i], Vec2.sub(pLocal, this.m_vertices[i])); + if (dot > 0.0) { + return false; + } + } + return true; + }; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + PolygonShape.prototype.rayCast = function (output, input, xf, childIndex) { + // Put the ray into the polygon's frame of reference. + var p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p)); + var p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p)); + var d = Vec2.sub(p2, p1); + var lower = 0.0; + var upper = input.maxFraction; + var index = -1; + for (var i = 0; i < this.m_count; ++i) { + // p = p1 + a * d + // dot(normal, p - v) = 0 + // dot(normal, p1 - v) + a * dot(normal, d) = 0 + var numerator = Vec2.dot(this.m_normals[i], Vec2.sub(this.m_vertices[i], p1)); + var denominator = Vec2.dot(this.m_normals[i], d); + if (denominator == 0.0) { + if (numerator < 0.0) { return false; } } - if (index >= 0) { - output.fraction = lower; - output.normal = Rot.mulVec2(xf.q, this.m_normals[index]); - return true; - } - return false; - }; - /** - * Given a transform, compute the associated axis aligned bounding box for a - * child shape. - * - * @param aabb Returns the axis aligned box. - * @param xf The world transform of the shape. - * @param childIndex The child shape - */ - PolygonShape.prototype.computeAABB = function (aabb, xf, childIndex) { - var minX = Infinity; - var minY = Infinity; - var maxX = -Infinity; - var maxY = -Infinity; - for (var i = 0; i < this.m_count; ++i) { - var v = Transform.mulVec2(xf, this.m_vertices[i]); - minX = math.min(minX, v.x); - maxX = math.max(maxX, v.x); - minY = math.min(minY, v.y); - maxY = math.max(maxY, v.y); - } - aabb.lowerBound.setNum(minX, minY); - aabb.upperBound.setNum(maxX, maxY); - aabb.extend(this.m_radius); - }; - /** - * Compute the mass properties of this shape using its dimensions and density. - * The inertia tensor is computed about the local origin. - * - * @param massData Returns the mass data for this shape. - * @param density The density in kilograms per meter squared. - */ - PolygonShape.prototype.computeMass = function (massData, density) { - var center = Vec2.zero(); - var area = 0.0; - var I = 0.0; - // s is the reference point for forming triangles. - // It's location doesn't change the result (except for rounding error). - var s = Vec2.zero(); - // This code would put the reference point inside the polygon. - for (var i = 0; i < this.m_count; ++i) { - s.add(this.m_vertices[i]); - } - s.mul(1.0 / this.m_count); - var k_inv3 = 1.0 / 3.0; - for (var i = 0; i < this.m_count; ++i) { - // Triangle vertices. - var e1 = Vec2.sub(this.m_vertices[i], s); - var e2 = i + 1 < this.m_count ? Vec2.sub(this.m_vertices[i + 1], s) : Vec2.sub(this.m_vertices[0], s); - var D = Vec2.crossVec2Vec2(e1, e2); - var triangleArea = 0.5 * D; - area += triangleArea; - // Area weighted centroid - center.addCombine(triangleArea * k_inv3, e1, triangleArea * k_inv3, e2); - var ex1 = e1.x; - var ey1 = e1.y; - var ex2 = e2.x; - var ey2 = e2.y; - var intx2 = ex1 * ex1 + ex2 * ex1 + ex2 * ex2; - var inty2 = ey1 * ey1 + ey2 * ey1 + ey2 * ey2; - I += (0.25 * k_inv3 * D) * (intx2 + inty2); - } - // Total mass - massData.mass = density * area; - center.mul(1.0 / area); - massData.center.setCombine(1, center, 1, s); - // Inertia tensor relative to the local origin (point s). - massData.I = density * I; - // Shift to center of mass then to original body origin. - massData.I += massData.mass * (Vec2.dot(massData.center, massData.center) - Vec2.dot(center, center)); - }; - /** - * Validate convexity. This is a very time consuming operation. - * @returns true if valid - */ - PolygonShape.prototype.validate = function () { - for (var i = 0; i < this.m_count; ++i) { - var i1 = i; - var i2 = i < this.m_count - 1 ? i1 + 1 : 0; - var p = this.m_vertices[i1]; - var e = Vec2.sub(this.m_vertices[i2], p); - for (var j = 0; j < this.m_count; ++j) { - if (j == i1 || j == i2) { - continue; - } - var v = Vec2.sub(this.m_vertices[j], p); - var c = Vec2.crossVec2Vec2(e, v); - if (c < 0.0) { - return false; - } - } + else { + // Note: we want this predicate without division: + // lower < numerator / denominator, where denominator < 0 + // Since denominator < 0, we have to flip the inequality: + // lower < numerator / denominator <==> denominator * lower > numerator. + if (denominator < 0.0 && numerator < lower * denominator) { + // Increase lower. + // The segment enters this half-space. + lower = numerator / denominator; + index = i; + } + else if (denominator > 0.0 && numerator < upper * denominator) { + // Decrease upper. + // The segment exits this half-space. + upper = numerator / denominator; + } + } + // The use of epsilon here causes the assert on lower to trip + // in some cases. Apparently the use of epsilon was to make edge + // shapes work, but now those are handled separately. + // if (upper < lower - Math.EPSILON) + if (upper < lower) { + return false; } + } + if (index >= 0) { + output.fraction = lower; + output.normal = Rot.mulVec2(xf.q, this.m_normals[index]); return true; - }; - PolygonShape.prototype.computeDistanceProxy = function (proxy) { - proxy.m_vertices = this.m_vertices; - proxy.m_count = this.m_count; - proxy.m_radius = this.m_radius; - }; - PolygonShape.TYPE = 'polygon'; - return PolygonShape; - }(Shape)); - function ComputeCentroid(vs, count) { - var c = Vec2.zero(); + } + return false; + }; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. + * + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape + */ + PolygonShape.prototype.computeAABB = function (aabb, xf, childIndex) { + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + for (var i = 0; i < this.m_count; ++i) { + var v = Transform.mulVec2(xf, this.m_vertices[i]); + minX = math.min(minX, v.x); + maxX = math.max(maxX, v.x); + minY = math.min(minY, v.y); + maxY = math.max(maxY, v.y); + } + aabb.lowerBound.setNum(minX, minY); + aabb.upperBound.setNum(maxX, maxY); + aabb.extend(this.m_radius); + }; + /** + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. + */ + PolygonShape.prototype.computeMass = function (massData, density) { + var center = Vec2.zero(); var area = 0.0; - // pRef is the reference point for forming triangles. + var I = 0.0; + // s is the reference point for forming triangles. // It's location doesn't change the result (except for rounding error). - var pRef = Vec2.zero(); - var i; - var inv3 = 1.0 / 3.0; - for (var i = 0; i < count; ++i) { + var s = Vec2.zero(); + // This code would put the reference point inside the polygon. + for (var i = 0; i < this.m_count; ++i) { + s.add(this.m_vertices[i]); + } + s.mul(1.0 / this.m_count); + var k_inv3 = 1.0 / 3.0; + for (var i = 0; i < this.m_count; ++i) { // Triangle vertices. - var p1 = pRef; - var p2 = vs[i]; - var p3 = i + 1 < count ? vs[i + 1] : vs[0]; - var e1 = Vec2.sub(p2, p1); - var e2 = Vec2.sub(p3, p1); + var e1 = Vec2.sub(this.m_vertices[i], s); + var e2 = i + 1 < this.m_count ? Vec2.sub(this.m_vertices[i + 1], s) : Vec2.sub(this.m_vertices[0], s); var D = Vec2.crossVec2Vec2(e1, e2); var triangleArea = 0.5 * D; area += triangleArea; // Area weighted centroid - c.addMul(triangleArea * inv3, p1); - c.addMul(triangleArea * inv3, p2); - c.addMul(triangleArea * inv3, p3); + center.addCombine(triangleArea * k_inv3, e1, triangleArea * k_inv3, e2); + var ex1 = e1.x; + var ey1 = e1.y; + var ex2 = e2.x; + var ey2 = e2.y; + var intx2 = ex1 * ex1 + ex2 * ex1 + ex2 * ex2; + var inty2 = ey1 * ey1 + ey2 * ey1 + ey2 * ey2; + I += (0.25 * k_inv3 * D) * (intx2 + inty2); + } + // Total mass + massData.mass = density * area; + center.mul(1.0 / area); + massData.center.setCombine(1, center, 1, s); + // Inertia tensor relative to the local origin (point s). + massData.I = density * I; + // Shift to center of mass then to original body origin. + massData.I += massData.mass * (Vec2.dot(massData.center, massData.center) - Vec2.dot(center, center)); + }; + /** + * Validate convexity. This is a very time consuming operation. + * @returns true if valid + */ + PolygonShape.prototype.validate = function () { + for (var i = 0; i < this.m_count; ++i) { + var i1 = i; + var i2 = i < this.m_count - 1 ? i1 + 1 : 0; + var p = this.m_vertices[i1]; + var e = Vec2.sub(this.m_vertices[i2], p); + for (var j = 0; j < this.m_count; ++j) { + if (j == i1 || j == i2) { + continue; + } + var v = Vec2.sub(this.m_vertices[j], p); + var c = Vec2.crossVec2Vec2(e, v); + if (c < 0.0) { + return false; + } + } + } + return true; + }; + PolygonShape.prototype.computeDistanceProxy = function (proxy) { + proxy.m_vertices = this.m_vertices; + proxy.m_count = this.m_count; + proxy.m_radius = this.m_radius; + }; + PolygonShape.TYPE = 'polygon'; + return PolygonShape; +}(Shape)); +function ComputeCentroid(vs, count) { + var c = Vec2.zero(); + var area = 0.0; + // pRef is the reference point for forming triangles. + // It's location doesn't change the result (except for rounding error). + var pRef = Vec2.zero(); + var i; + var inv3 = 1.0 / 3.0; + for (var i = 0; i < count; ++i) { + // Triangle vertices. + var p1 = pRef; + var p2 = vs[i]; + var p3 = i + 1 < count ? vs[i + 1] : vs[0]; + var e1 = Vec2.sub(p2, p1); + var e2 = Vec2.sub(p3, p1); + var D = Vec2.crossVec2Vec2(e1, e2); + var triangleArea = 0.5 * D; + area += triangleArea; + // Area weighted centroid + c.addMul(triangleArea * inv3, p1); + c.addMul(triangleArea * inv3, p2); + c.addMul(triangleArea * inv3, p3); + } + c.mul(1.0 / area); + return c; +} +var Polygon = PolygonShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A rectangle polygon which extend PolygonShape. + */ +var BoxShape = /** @class */ (function (_super) { + __extends(BoxShape, _super); + function BoxShape(hx, hy, center, angle) { + var _this = this; + // @ts-ignore + if (!(_this instanceof BoxShape)) { + return new BoxShape(hx, hy, center, angle); + } + _this = _super.call(this) || this; + _this._setAsBox(hx, hy, center, angle); + return _this; + } + BoxShape.TYPE = 'polygon'; + return BoxShape; +}(PolygonShape)); +var Box = BoxShape; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var CircleShape = /** @class */ (function (_super) { + __extends(CircleShape, _super); + // tslint:disable-next-line:typedef + function CircleShape(a, b) { + var _this = this; + // @ts-ignore + if (!(_this instanceof CircleShape)) { + return new CircleShape(a, b); + } + _this = _super.call(this) || this; + _this.m_type = CircleShape.TYPE; + _this.m_p = Vec2.zero(); + _this.m_radius = 1; + if (typeof a === 'object' && Vec2.isValid(a)) { + _this.m_p.setVec2(a); + if (typeof b === 'number') { + _this.m_radius = b; + } + } + else if (typeof a === 'number') { + _this.m_radius = a; + } + return _this; + } + /** @internal */ + CircleShape.prototype._serialize = function () { + return { + type: this.m_type, + p: this.m_p, + radius: this.m_radius, + }; + }; + /** @internal */ + CircleShape._deserialize = function (data) { + return new CircleShape(data.p, data.radius); + }; + /** @internal */ + CircleShape.prototype._reset = function () { + // noop + }; + CircleShape.prototype.getType = function () { + return this.m_type; + }; + CircleShape.prototype.getRadius = function () { + return this.m_radius; + }; + CircleShape.prototype.getCenter = function () { + return this.m_p; + }; + CircleShape.prototype.getVertex = function (index) { + return this.m_p; + }; + /** + * @internal + * @deprecated Shapes should be treated as immutable. + * + * clone the concrete shape. + */ + CircleShape.prototype._clone = function () { + var clone = new CircleShape(); + clone.m_type = this.m_type; + clone.m_radius = this.m_radius; + clone.m_p = this.m_p.clone(); + return clone; + }; + /** + * Get the number of child primitives. + */ + CircleShape.prototype.getChildCount = function () { + return 1; + }; + /** + * Test a point for containment in this shape. This only works for convex + * shapes. + * + * @param xf The shape world transform. + * @param p A point in world coordinates. + */ + CircleShape.prototype.testPoint = function (xf, p) { + var center = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); + var d = Vec2.sub(p, center); + return Vec2.dot(d, d) <= this.m_radius * this.m_radius; + }; + /** + * Cast a ray against a child shape. + * + * @param output The ray-cast results. + * @param input The ray-cast input parameters. + * @param xf The transform to be applied to the shape. + * @param childIndex The child shape index + */ + CircleShape.prototype.rayCast = function (output, input, xf, childIndex) { + // Collision Detection in Interactive 3D Environments by Gino van den Bergen + // From Section 3.1.2 + // x = s + a * r + // norm(x) = radius + var position = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); + var s = Vec2.sub(input.p1, position); + var b = Vec2.dot(s, s) - this.m_radius * this.m_radius; + // Solve quadratic equation. + var r = Vec2.sub(input.p2, input.p1); + var c = Vec2.dot(s, r); + var rr = Vec2.dot(r, r); + var sigma = c * c - rr * b; + // Check for negative discriminant and short segment. + if (sigma < 0.0 || rr < math.EPSILON) { + return false; + } + // Find the point of intersection of the line with the circle. + var a = -(c + math.sqrt(sigma)); + // Is the intersection point on the segment? + if (0.0 <= a && a <= input.maxFraction * rr) { + a /= rr; + output.fraction = a; + output.normal = Vec2.add(s, Vec2.mulNumVec2(a, r)); + output.normal.normalize(); + return true; } - c.mul(1.0 / area); - return c; - } - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. + return false; + }; + /** + * Given a transform, compute the associated axis aligned bounding box for a + * child shape. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * @param aabb Returns the axis aligned box. + * @param xf The world transform of the shape. + * @param childIndex The child shape */ + CircleShape.prototype.computeAABB = function (aabb, xf, childIndex) { + var p = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); + aabb.lowerBound.setNum(p.x - this.m_radius, p.y - this.m_radius); + aabb.upperBound.setNum(p.x + this.m_radius, p.y + this.m_radius); + }; /** - * A rectangle polygon which extend PolygonShape. + * Compute the mass properties of this shape using its dimensions and density. + * The inertia tensor is computed about the local origin. + * + * @param massData Returns the mass data for this shape. + * @param density The density in kilograms per meter squared. */ - var BoxShape = /** @class */ (function (_super) { - __extends(BoxShape, _super); - function BoxShape(hx, hy, center, angle) { - var _this = this; - // @ts-ignore - if (!(_this instanceof BoxShape)) { - return new BoxShape(hx, hy, center, angle); - } - _this = _super.call(this) || this; - _this._setAsBox(hx, hy, center, angle); - return _this; - } - BoxShape.TYPE = 'polygon'; - return BoxShape; - }(PolygonShape)); + CircleShape.prototype.computeMass = function (massData, density) { + massData.mass = density * math.PI * this.m_radius * this.m_radius; + massData.center = this.m_p; + // inertia about the local origin + massData.I = massData.mass + * (0.5 * this.m_radius * this.m_radius + Vec2.dot(this.m_p, this.m_p)); + }; + CircleShape.prototype.computeDistanceProxy = function (proxy) { + proxy.m_vertices.push(this.m_p); + proxy.m_count = 1; + proxy.m_radius = this.m_radius; + }; + CircleShape.TYPE = 'circle'; + return CircleShape; +}(Shape)); +var Circle = CircleShape; - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var CircleShape = /** @class */ (function (_super) { - __extends(CircleShape, _super); - // tslint:disable-next-line:typedef - function CircleShape(a, b) { - var _this = this; - // @ts-ignore - if (!(_this instanceof CircleShape)) { - return new CircleShape(a, b); - } - _this = _super.call(this) || this; - _this.m_type = CircleShape.TYPE; - _this.m_p = Vec2.zero(); - _this.m_radius = 1; - if (typeof a === 'object' && Vec2.isValid(a)) { - _this.m_p.setVec2(a); - if (typeof b === 'number') { - _this.m_radius = b; - } - } - else if (typeof a === 'number') { - _this.m_radius = a; - } - return _this; +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$a = { + frequencyHz: 0.0, + dampingRatio: 0.0 +}; +/** + * A distance joint constrains two points on two bodies to remain at a fixed + * distance from each other. You can view this as a massless, rigid rod. + * + * @param anchorA Anchor A in global coordination. + * @param anchorB Anchor B in global coordination. + */ +var DistanceJoint = /** @class */ (function (_super) { + __extends(DistanceJoint, _super); + function DistanceJoint(def, bodyA, bodyB, anchorA, anchorB) { + var _this = this; + // @ts-ignore + if (!(_this instanceof DistanceJoint)) { + return new DistanceJoint(def, bodyA, bodyB, anchorA, anchorB); } - /** @internal */ - CircleShape.prototype._serialize = function () { - return { - type: this.m_type, - p: this.m_p, - radius: this.m_radius, - }; - }; - /** @internal */ - CircleShape._deserialize = function (data) { - return new CircleShape(data.p, data.radius); - }; - // TODO: already defined in Shape - CircleShape.prototype.getRadius = function () { - return this.m_radius; - }; - CircleShape.prototype.getCenter = function () { - return this.m_p; - }; - CircleShape.prototype.getVertex = function (index) { - return this.m_p; - }; - /** - * @internal - * @deprecated Shapes should be treated as immutable. - * - * clone the concrete shape. - */ - CircleShape.prototype._clone = function () { - var clone = new CircleShape(); - clone.m_type = this.m_type; - clone.m_radius = this.m_radius; - clone.m_p = this.m_p.clone(); - return clone; - }; - /** - * Get the number of child primitives. - */ - CircleShape.prototype.getChildCount = function () { - return 1; - }; - /** - * Test a point for containment in this shape. This only works for convex - * shapes. - * - * @param xf The shape world transform. - * @param p A point in world coordinates. - */ - CircleShape.prototype.testPoint = function (xf, p) { - var center = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); - var d = Vec2.sub(p, center); - return Vec2.dot(d, d) <= this.m_radius * this.m_radius; - }; - /** - * Cast a ray against a child shape. - * - * @param output The ray-cast results. - * @param input The ray-cast input parameters. - * @param xf The transform to be applied to the shape. - * @param childIndex The child shape index - */ - CircleShape.prototype.rayCast = function (output, input, xf, childIndex) { - // Collision Detection in Interactive 3D Environments by Gino van den Bergen - // From Section 3.1.2 - // x = s + a * r - // norm(x) = radius - var position = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); - var s = Vec2.sub(input.p1, position); - var b = Vec2.dot(s, s) - this.m_radius * this.m_radius; - // Solve quadratic equation. - var r = Vec2.sub(input.p2, input.p1); - var c = Vec2.dot(s, r); - var rr = Vec2.dot(r, r); - var sigma = c * c - rr * b; - // Check for negative discriminant and short segment. - if (sigma < 0.0 || rr < math.EPSILON) { - return false; - } - // Find the point of intersection of the line with the circle. - var a = -(c + math.sqrt(sigma)); - // Is the intersection point on the segment? - if (0.0 <= a && a <= input.maxFraction * rr) { - a /= rr; - output.fraction = a; - output.normal = Vec2.add(s, Vec2.mulNumVec2(a, r)); - output.normal.normalize(); - return true; - } - return false; - }; - /** - * Given a transform, compute the associated axis aligned bounding box for a - * child shape. - * - * @param aabb Returns the axis aligned box. - * @param xf The world transform of the shape. - * @param childIndex The child shape - */ - CircleShape.prototype.computeAABB = function (aabb, xf, childIndex) { - var p = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); - aabb.lowerBound.setNum(p.x - this.m_radius, p.y - this.m_radius); - aabb.upperBound.setNum(p.x + this.m_radius, p.y + this.m_radius); - }; - /** - * Compute the mass properties of this shape using its dimensions and density. - * The inertia tensor is computed about the local origin. - * - * @param massData Returns the mass data for this shape. - * @param density The density in kilograms per meter squared. - */ - CircleShape.prototype.computeMass = function (massData, density) { - massData.mass = density * math.PI * this.m_radius * this.m_radius; - massData.center = this.m_p; - // inertia about the local origin - massData.I = massData.mass - * (0.5 * this.m_radius * this.m_radius + Vec2.dot(this.m_p, this.m_p)); - }; - CircleShape.prototype.computeDistanceProxy = function (proxy) { - proxy.m_vertices.push(this.m_p); - proxy.m_count = 1; - proxy.m_radius = this.m_radius; + // order of constructor arguments is changed in v0.2 + if (bodyB && anchorA && ('m_type' in anchorA) && ('x' in bodyB) && ('y' in bodyB)) { + var temp = bodyB; + bodyB = anchorA; + anchorA = temp; + } + def = options(def, DEFAULTS$a); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = DistanceJoint.TYPE; + // Solver shared + _this.m_localAnchorA = Vec2.clone(anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.zero()); + _this.m_length = math.isFinite(def.length) ? def.length : + Vec2.distance(bodyA.getWorldPoint(_this.m_localAnchorA), bodyB.getWorldPoint(_this.m_localAnchorB)); + _this.m_frequencyHz = def.frequencyHz; + _this.m_dampingRatio = def.dampingRatio; + _this.m_impulse = 0.0; + _this.m_gamma = 0.0; + _this.m_bias = 0.0; + return _this; + // 1-D constrained system + // m (v2 - v1) = lambda + // v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass. + // x2 = x1 + h * v2 + // 1-D mass-damper-spring system + // m (v2 - v1) + h * d * v2 + h * k * + // C = norm(p2 - p1) - L + // u = (p2 - p1) / norm(p2 - p1) + // Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1)) + // J = [-u -cross(r1, u) u cross(r2, u)] + // K = J * invM * JT + // = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2 + } + /** @internal */ + DistanceJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + frequencyHz: this.m_frequencyHz, + dampingRatio: this.m_dampingRatio, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + length: this.m_length, + impulse: this.m_impulse, + gamma: this.m_gamma, + bias: this.m_bias, }; - CircleShape.TYPE = 'circle'; - return CircleShape; - }(Shape)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + }; + /** @internal */ + DistanceJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new DistanceJoint(data); + return joint; + }; + /** @internal */ + DistanceJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + if (def.length > 0) { + this.m_length = +def.length; + } + else if (def.length < 0) ; + else if (def.anchorA || def.anchorA || def.anchorA || def.anchorA) { + this.m_length = Vec2.distance(this.m_bodyA.getWorldPoint(this.m_localAnchorA), this.m_bodyB.getWorldPoint(this.m_localAnchorB)); + } + }; + /** + * The local anchor point relative to bodyA's origin. */ - var DEFAULTS$a = { - frequencyHz: 0.0, - dampingRatio: 0.0 + DistanceJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; }; /** - * A distance joint constrains two points on two bodies to remain at a fixed - * distance from each other. You can view this as a massless, rigid rod. - * - * @param anchorA Anchor A in global coordination. - * @param anchorB Anchor B in global coordination. + * The local anchor point relative to bodyB's origin. */ - var DistanceJoint = /** @class */ (function (_super) { - __extends(DistanceJoint, _super); - function DistanceJoint(def, bodyA, bodyB, anchorA, anchorB) { - var _this = this; - // @ts-ignore - if (!(_this instanceof DistanceJoint)) { - return new DistanceJoint(def, bodyA, bodyB, anchorA, anchorB); - } - // order of constructor arguments is changed in v0.2 - if (bodyB && anchorA && ('m_type' in anchorA) && ('x' in bodyB) && ('y' in bodyB)) { - var temp = bodyB; - bodyB = anchorA; - anchorA = temp; - } - def = options(def, DEFAULTS$a); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = DistanceJoint.TYPE; - // Solver shared - _this.m_localAnchorA = Vec2.clone(anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.zero()); - _this.m_localAnchorB = Vec2.clone(anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.zero()); - _this.m_length = math.isFinite(def.length) ? def.length : - Vec2.distance(bodyA.getWorldPoint(_this.m_localAnchorA), bodyB.getWorldPoint(_this.m_localAnchorB)); - _this.m_frequencyHz = def.frequencyHz; - _this.m_dampingRatio = def.dampingRatio; - _this.m_impulse = 0.0; - _this.m_gamma = 0.0; - _this.m_bias = 0.0; - return _this; - // 1-D constrained system - // m (v2 - v1) = lambda - // v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass. - // x2 = x1 + h * v2 - // 1-D mass-damper-spring system - // m (v2 - v1) + h * d * v2 + h * k * - // C = norm(p2 - p1) - L - // u = (p2 - p1) / norm(p2 - p1) - // Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1)) - // J = [-u -cross(r1, u) u cross(r2, u)] - // K = J * invM * JT - // = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2 + DistanceJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * Set the natural length. Manipulating the length can lead to non-physical + * behavior when the frequency is zero. + */ + DistanceJoint.prototype.setLength = function (length) { + this.m_length = length; + }; + /** + * Get the natural length. + */ + DistanceJoint.prototype.getLength = function () { + return this.m_length; + }; + DistanceJoint.prototype.setFrequency = function (hz) { + this.m_frequencyHz = hz; + }; + DistanceJoint.prototype.getFrequency = function () { + return this.m_frequencyHz; + }; + DistanceJoint.prototype.setDampingRatio = function (ratio) { + this.m_dampingRatio = ratio; + }; + DistanceJoint.prototype.getDampingRatio = function () { + return this.m_dampingRatio; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + DistanceJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + DistanceJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + DistanceJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + DistanceJoint.prototype.getReactionTorque = function (inv_dt) { + return 0.0; + }; + DistanceJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + this.m_u = Vec2.sub(Vec2.add(cB, this.m_rB), Vec2.add(cA, this.m_rA)); + // Handle singularity. + var length = this.m_u.length(); + if (length > Settings.linearSlop) { + this.m_u.mul(1.0 / length); } - /** @internal */ - DistanceJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - frequencyHz: this.m_frequencyHz, - dampingRatio: this.m_dampingRatio, - localAnchorA: this.m_localAnchorA, - localAnchorB: this.m_localAnchorB, - length: this.m_length, - impulse: this.m_impulse, - gamma: this.m_gamma, - bias: this.m_bias, - }; - }; - /** @internal */ - DistanceJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - var joint = new DistanceJoint(data); - return joint; - }; - /** @internal */ - DistanceJoint.prototype._setAnchors = function (def) { - if (def.anchorA) { - this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); - } - else if (def.localAnchorA) { - this.m_localAnchorA.setVec2(def.localAnchorA); - } - if (def.anchorB) { - this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); - } - else if (def.localAnchorB) { - this.m_localAnchorB.setVec2(def.localAnchorB); - } - if (def.length > 0) { - this.m_length = +def.length; - } - else if (def.length < 0) ; - else if (def.anchorA || def.anchorA || def.anchorA || def.anchorA) { - this.m_length = Vec2.distance(this.m_bodyA.getWorldPoint(this.m_localAnchorA), this.m_bodyB.getWorldPoint(this.m_localAnchorB)); - } - }; - /** - * The local anchor point relative to bodyA's origin. - */ - DistanceJoint.prototype.getLocalAnchorA = function () { - return this.m_localAnchorA; - }; - /** - * The local anchor point relative to bodyB's origin. - */ - DistanceJoint.prototype.getLocalAnchorB = function () { - return this.m_localAnchorB; - }; - /** - * Set the natural length. Manipulating the length can lead to non-physical - * behavior when the frequency is zero. - */ - DistanceJoint.prototype.setLength = function (length) { - this.m_length = length; - }; - /** - * Get the natural length. - */ - DistanceJoint.prototype.getLength = function () { - return this.m_length; - }; - DistanceJoint.prototype.setFrequency = function (hz) { - this.m_frequencyHz = hz; - }; - DistanceJoint.prototype.getFrequency = function () { - return this.m_frequencyHz; - }; - DistanceJoint.prototype.setDampingRatio = function (ratio) { - this.m_dampingRatio = ratio; - }; - DistanceJoint.prototype.getDampingRatio = function () { - return this.m_dampingRatio; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - DistanceJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - DistanceJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - DistanceJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - DistanceJoint.prototype.getReactionTorque = function (inv_dt) { - return 0.0; - }; - DistanceJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - this.m_u = Vec2.sub(Vec2.add(cB, this.m_rB), Vec2.add(cA, this.m_rA)); - // Handle singularity. - var length = this.m_u.length(); - if (length > Settings.linearSlop) { - this.m_u.mul(1.0 / length); - } - else { - this.m_u.setNum(0.0, 0.0); - } - var crAu = Vec2.crossVec2Vec2(this.m_rA, this.m_u); - var crBu = Vec2.crossVec2Vec2(this.m_rB, this.m_u); - var invMass = this.m_invMassA + this.m_invIA * crAu * crAu + this.m_invMassB - + this.m_invIB * crBu * crBu; - // Compute the effective mass matrix. + else { + this.m_u.setNum(0.0, 0.0); + } + var crAu = Vec2.crossVec2Vec2(this.m_rA, this.m_u); + var crBu = Vec2.crossVec2Vec2(this.m_rB, this.m_u); + var invMass = this.m_invMassA + this.m_invIA * crAu * crAu + this.m_invMassB + + this.m_invIB * crBu * crBu; + // Compute the effective mass matrix. + this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0; + if (this.m_frequencyHz > 0.0) { + var C = length - this.m_length; + // Frequency + var omega = 2.0 * math.PI * this.m_frequencyHz; + // Damping coefficient + var d = 2.0 * this.m_mass * this.m_dampingRatio * omega; + // Spring stiffness + var k = this.m_mass * omega * omega; + // magic formulas + var h = step.dt; + this.m_gamma = h * (d + h * k); + this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0; + this.m_bias = C * h * k * this.m_gamma; + invMass += this.m_gamma; this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0; - if (this.m_frequencyHz > 0.0) { - var C = length - this.m_length; - // Frequency - var omega = 2.0 * math.PI * this.m_frequencyHz; - // Damping coefficient - var d = 2.0 * this.m_mass * this.m_dampingRatio * omega; - // Spring stiffness - var k = this.m_mass * omega * omega; - // magic formulas - var h = step.dt; - this.m_gamma = h * (d + h * k); - this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0; - this.m_bias = C * h * k * this.m_gamma; - invMass += this.m_gamma; - this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0; - } - else { - this.m_gamma = 0.0; - this.m_bias = 0.0; - } - if (step.warmStarting) { - // Scale the impulse to support a variable time step. - this.m_impulse *= step.dtRatio; - var P = Vec2.mulNumVec2(this.m_impulse, this.m_u); - vA.subMul(this.m_invMassA, P); - wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); - vB.addMul(this.m_invMassB, P); - wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); - } - else { - this.m_impulse = 0.0; - } - this.m_bodyA.c_velocity.v.setVec2(vA); - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v.setVec2(vB); - this.m_bodyB.c_velocity.w = wB; - }; - DistanceJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - // Cdot = dot(u, v + cross(w, r)) - var vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA)); - var vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)); - var Cdot = Vec2.dot(this.m_u, vpB) - Vec2.dot(this.m_u, vpA); - var impulse = -this.m_mass - * (Cdot + this.m_bias + this.m_gamma * this.m_impulse); - this.m_impulse += impulse; - var P = Vec2.mulNumVec2(impulse, this.m_u); + } + else { + this.m_gamma = 0.0; + this.m_bias = 0.0; + } + if (step.warmStarting) { + // Scale the impulse to support a variable time step. + this.m_impulse *= step.dtRatio; + var P = Vec2.mulNumVec2(this.m_impulse, this.m_u); vA.subMul(this.m_invMassA, P); wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); vB.addMul(this.m_invMassB, P); wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); - this.m_bodyA.c_velocity.v.setVec2(vA); - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v.setVec2(vB); - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - DistanceJoint.prototype.solvePositionConstraints = function (step) { - if (this.m_frequencyHz > 0.0) { - // There is no position correction for soft distance constraints. - return true; - } - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); - var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); - var u = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); - var length = u.normalize(); - var C = length - this.m_length; - C = math - .clamp(C, -Settings.maxLinearCorrection, Settings.maxLinearCorrection); - var impulse = -this.m_mass * C; - var P = Vec2.mulNumVec2(impulse, u); - cA.subMul(this.m_invMassA, P); - aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P); - cB.addMul(this.m_invMassB, P); - aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P); - this.m_bodyA.c_position.c.setVec2(cA); - this.m_bodyA.c_position.a = aA; - this.m_bodyB.c_position.c.setVec2(cB); - this.m_bodyB.c_position.a = aB; - return math.abs(C) < Settings.linearSlop; - }; - DistanceJoint.TYPE = 'distance-joint'; - return DistanceJoint; - }(Joint)); + } + else { + this.m_impulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + DistanceJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + // Cdot = dot(u, v + cross(w, r)) + var vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA)); + var vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)); + var Cdot = Vec2.dot(this.m_u, vpB) - Vec2.dot(this.m_u, vpA); + var impulse = -this.m_mass + * (Cdot + this.m_bias + this.m_gamma * this.m_impulse); + this.m_impulse += impulse; + var P = Vec2.mulNumVec2(impulse, this.m_u); + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + DistanceJoint.prototype.solvePositionConstraints = function (step) { + if (this.m_frequencyHz > 0.0) { + // There is no position correction for soft distance constraints. + return true; + } + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); + var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); + var u = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); + var length = u.normalize(); + var C = length - this.m_length; + C = math + .clamp(C, -Settings.maxLinearCorrection, Settings.maxLinearCorrection); + var impulse = -this.m_mass * C; + var P = Vec2.mulNumVec2(impulse, u); + cA.subMul(this.m_invMassA, P); + aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P); + cB.addMul(this.m_invMassB, P); + aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P); + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + return math.abs(C) < Settings.linearSlop; + }; + DistanceJoint.TYPE = 'distance-joint'; + return DistanceJoint; +}(Joint)); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$9 = { + maxForce: 0.0, + maxTorque: 0.0, +}; +/** + * Friction joint. This is used for top-down friction. It provides 2D + * translational friction and angular friction. + * + * @param anchor Anchor in global coordination. + */ +var FrictionJoint = /** @class */ (function (_super) { + __extends(FrictionJoint, _super); + function FrictionJoint(def, bodyA, bodyB, anchor) { + var _this = this; + // @ts-ignore + if (!(_this instanceof FrictionJoint)) { + return new FrictionJoint(def, bodyA, bodyB, anchor); + } + def = options(def, DEFAULTS$9); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = FrictionJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + // Solver shared + _this.m_linearImpulse = Vec2.zero(); + _this.m_angularImpulse = 0.0; + _this.m_maxForce = def.maxForce; + _this.m_maxTorque = def.maxTorque; + return _this; + // Point-to-point constraint + // Cdot = v2 - v1 + // = v2 + cross(w2, r2) - v1 - cross(w1, r1) + // J = [-I -r1_skew I r2_skew ] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + // Angle constraint + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // K = invI1 + invI2 + } + /** @internal */ + FrictionJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + maxForce: this.m_maxForce, + maxTorque: this.m_maxTorque, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + }; + }; + /** @internal */ + FrictionJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new FrictionJoint(data); + return joint; + }; + /** @internal */ + FrictionJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + FrictionJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + FrictionJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * Set the maximum friction force in N. + */ + FrictionJoint.prototype.setMaxForce = function (force) { + this.m_maxForce = force; + }; + /** + * Get the maximum friction force in N. + */ + FrictionJoint.prototype.getMaxForce = function () { + return this.m_maxForce; + }; + /** + * Set the maximum friction torque in N*m. */ - var DEFAULTS$9 = { - maxForce: 0.0, - maxTorque: 0.0, + FrictionJoint.prototype.setMaxTorque = function (torque) { + this.m_maxTorque = torque; }; /** - * Friction joint. This is used for top-down friction. It provides 2D - * translational friction and angular friction. - * - * @param anchor Anchor in global coordination. + * Get the maximum friction torque in N*m. */ - var FrictionJoint = /** @class */ (function (_super) { - __extends(FrictionJoint, _super); - function FrictionJoint(def, bodyA, bodyB, anchor) { - var _this = this; - // @ts-ignore - if (!(_this instanceof FrictionJoint)) { - return new FrictionJoint(def, bodyA, bodyB, anchor); - } - def = options(def, DEFAULTS$9); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = FrictionJoint.TYPE; - _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); - _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); - // Solver shared - _this.m_linearImpulse = Vec2.zero(); - _this.m_angularImpulse = 0.0; - _this.m_maxForce = def.maxForce; - _this.m_maxTorque = def.maxTorque; - return _this; - // Point-to-point constraint - // Cdot = v2 - v1 - // = v2 + cross(w2, r2) - v1 - cross(w1, r1) - // J = [-I -r1_skew I r2_skew ] - // Identity used: - // w k % (rx i + ry j) = w * (-ry i + rx j) - // Angle constraint - // Cdot = w2 - w1 - // J = [0 0 -1 0 0 1] - // K = invI1 + invI2 + FrictionJoint.prototype.getMaxTorque = function () { + return this.m_maxTorque; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + FrictionJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + FrictionJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + FrictionJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + FrictionJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_angularImpulse; + }; + FrictionJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + // Compute the effective mass matrix. + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var K = new Mat22(); + K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y + * this.m_rB.y; + K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y; + K.ey.x = K.ex.y; + K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x + * this.m_rB.x; + this.m_linearMass = K.getInverse(); + this.m_angularMass = iA + iB; + if (this.m_angularMass > 0.0) { + this.m_angularMass = 1.0 / this.m_angularMass; } - /** @internal */ - FrictionJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - maxForce: this.m_maxForce, - maxTorque: this.m_maxTorque, - localAnchorA: this.m_localAnchorA, - localAnchorB: this.m_localAnchorB, - }; - }; - /** @internal */ - FrictionJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - var joint = new FrictionJoint(data); - return joint; - }; - /** @internal */ - FrictionJoint.prototype._setAnchors = function (def) { - if (def.anchorA) { - this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); - } - else if (def.localAnchorA) { - this.m_localAnchorA.setVec2(def.localAnchorA); - } - if (def.anchorB) { - this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); - } - else if (def.localAnchorB) { - this.m_localAnchorB.setVec2(def.localAnchorB); - } - }; - /** - * The local anchor point relative to bodyA's origin. - */ - FrictionJoint.prototype.getLocalAnchorA = function () { - return this.m_localAnchorA; - }; - /** - * The local anchor point relative to bodyB's origin. - */ - FrictionJoint.prototype.getLocalAnchorB = function () { - return this.m_localAnchorB; - }; - /** - * Set the maximum friction force in N. - */ - FrictionJoint.prototype.setMaxForce = function (force) { - this.m_maxForce = force; - }; - /** - * Get the maximum friction force in N. - */ - FrictionJoint.prototype.getMaxForce = function () { - return this.m_maxForce; - }; - /** - * Set the maximum friction torque in N*m. - */ - FrictionJoint.prototype.setMaxTorque = function (torque) { - this.m_maxTorque = torque; - }; - /** - * Get the maximum friction torque in N*m. - */ - FrictionJoint.prototype.getMaxTorque = function () { - return this.m_maxTorque; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - FrictionJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - FrictionJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - FrictionJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - FrictionJoint.prototype.getReactionTorque = function (inv_dt) { - return inv_dt * this.m_angularImpulse; - }; - FrictionJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - // Compute the effective mass matrix. - this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - // J = [-I -r1_skew I r2_skew] - // [ 0 -1 0 1] - // r_skew = [-ry; rx] - // Matlab - // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] - // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] - // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - var K = new Mat22(); - K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y - * this.m_rB.y; - K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y; - K.ey.x = K.ex.y; - K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x - * this.m_rB.x; - this.m_linearMass = K.getInverse(); - this.m_angularMass = iA + iB; - if (this.m_angularMass > 0.0) { - this.m_angularMass = 1.0 / this.m_angularMass; - } - if (step.warmStarting) { - // Scale impulses to support a variable time step. - this.m_linearImpulse.mul(step.dtRatio); - this.m_angularImpulse *= step.dtRatio; - var P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y); - vA.subMul(mA, P); - wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse); - vB.addMul(mB, P); - wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse); - } - else { - this.m_linearImpulse.setZero(); - this.m_angularImpulse = 0.0; - } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - FrictionJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - var h = step.dt; // float - // Solve angular friction - { - var Cdot = wB - wA; // float - var impulse = -this.m_angularMass * Cdot; // float - var oldImpulse = this.m_angularImpulse; // float - var maxImpulse = h * this.m_maxTorque; // float - this.m_angularImpulse = math.clamp(this.m_angularImpulse + impulse, -maxImpulse, maxImpulse); - impulse = this.m_angularImpulse - oldImpulse; - wA -= iA * impulse; - wB += iB * impulse; - } - // Solve linear friction - { - var Cdot = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA))); // Vec2 - var impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); // Vec2 - var oldImpulse = this.m_linearImpulse; // Vec2 - this.m_linearImpulse.add(impulse); - var maxImpulse = h * this.m_maxForce; // float - if (this.m_linearImpulse.lengthSquared() > maxImpulse * maxImpulse) { - this.m_linearImpulse.normalize(); - this.m_linearImpulse.mul(maxImpulse); - } - impulse = Vec2.sub(this.m_linearImpulse, oldImpulse); - vA.subMul(mA, impulse); - wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); - vB.addMul(mB, impulse); - wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); - } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - FrictionJoint.prototype.solvePositionConstraints = function (step) { - return true; - }; - FrictionJoint.TYPE = 'friction-joint'; - return FrictionJoint; - }(Joint)); + if (step.warmStarting) { + // Scale impulses to support a variable time step. + this.m_linearImpulse.mul(step.dtRatio); + this.m_angularImpulse *= step.dtRatio; + var P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse); + } + else { + this.m_linearImpulse.setZero(); + this.m_angularImpulse = 0.0; + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + FrictionJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var h = step.dt; // float + // Solve angular friction + { + var Cdot = wB - wA; // float + var impulse = -this.m_angularMass * Cdot; // float + var oldImpulse = this.m_angularImpulse; // float + var maxImpulse = h * this.m_maxTorque; // float + this.m_angularImpulse = math.clamp(this.m_angularImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_angularImpulse - oldImpulse; + wA -= iA * impulse; + wB += iB * impulse; + } + // Solve linear friction + { + var Cdot = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA))); // Vec2 + var impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); // Vec2 + var oldImpulse = this.m_linearImpulse; // Vec2 + this.m_linearImpulse.add(impulse); + var maxImpulse = h * this.m_maxForce; // float + if (this.m_linearImpulse.lengthSquared() > maxImpulse * maxImpulse) { + this.m_linearImpulse.normalize(); + this.m_linearImpulse.mul(maxImpulse); + } + impulse = Vec2.sub(this.m_linearImpulse, oldImpulse); + vA.subMul(mA, impulse); + wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); + vB.addMul(mB, impulse); + wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + FrictionJoint.prototype.solvePositionConstraints = function (step) { + return true; + }; + FrictionJoint.TYPE = 'friction-joint'; + return FrictionJoint; +}(Joint)); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +/** + * A 3-by-3 matrix. Stored in column-major order. + */ +var Mat33 = /** @class */ (function () { + function Mat33(a, b, c) { + if (typeof a === 'object' && a !== null) { + this.ex = Vec3.clone(a); + this.ey = Vec3.clone(b); + this.ez = Vec3.clone(c); + } + else { + this.ex = Vec3.zero(); + this.ey = Vec3.zero(); + this.ez = Vec3.zero(); + } + } + /** @internal */ + Mat33.prototype.toString = function () { + return JSON.stringify(this); + }; + Mat33.isValid = function (obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + return Vec3.isValid(obj.ex) && Vec3.isValid(obj.ey) && Vec3.isValid(obj.ez); + }; + Mat33.assert = function (o) { + }; + /** + * Set this matrix to all zeros. */ + Mat33.prototype.setZero = function () { + this.ex.setZero(); + this.ey.setZero(); + this.ez.setZero(); + return this; + }; /** - * A 3-by-3 matrix. Stored in column-major order. + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. */ - var Mat33 = /** @class */ (function () { - function Mat33(a, b, c) { - if (typeof a === 'object' && a !== null) { - this.ex = Vec3.clone(a); - this.ey = Vec3.clone(b); - this.ez = Vec3.clone(c); - } - else { - this.ex = Vec3.zero(); - this.ey = Vec3.zero(); - this.ez = Vec3.zero(); - } + Mat33.prototype.solve33 = function (v) { + var det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez)); + if (det !== 0.0) { + det = 1.0 / det; } - /** @internal */ - Mat33.prototype.toString = function () { - return JSON.stringify(this); - }; - Mat33.isValid = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - return Vec3.isValid(obj.ex) && Vec3.isValid(obj.ey) && Vec3.isValid(obj.ez); - }; - Mat33.assert = function (o) { - return; - }; - /** - * Set this matrix to all zeros. - */ - Mat33.prototype.setZero = function () { - this.ex.setZero(); - this.ey.setZero(); - this.ez.setZero(); - return this; - }; - /** - * Solve A * x = b, where b is a column vector. This is more efficient than - * computing the inverse in one-shot cases. - */ - Mat33.prototype.solve33 = function (v) { - var det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez)); - if (det !== 0.0) { - det = 1.0 / det; - } - var r = new Vec3(); - r.x = det * Vec3.dot(v, Vec3.cross(this.ey, this.ez)); - r.y = det * Vec3.dot(this.ex, Vec3.cross(v, this.ez)); - r.z = det * Vec3.dot(this.ex, Vec3.cross(this.ey, v)); - return r; - }; - /** - * Solve A * x = b, where b is a column vector. This is more efficient than - * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix - * equation. - */ - Mat33.prototype.solve22 = function (v) { - var a11 = this.ex.x; - var a12 = this.ey.x; - var a21 = this.ex.y; - var a22 = this.ey.y; - var det = a11 * a22 - a12 * a21; - if (det !== 0.0) { - det = 1.0 / det; - } - var r = Vec2.zero(); - r.x = det * (a22 * v.x - a12 * v.y); - r.y = det * (a11 * v.y - a21 * v.x); - return r; - }; - /** - * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if - * singular. - */ - Mat33.prototype.getInverse22 = function (M) { - var a = this.ex.x; - var b = this.ey.x; - var c = this.ex.y; - var d = this.ey.y; - var det = a * d - b * c; - if (det !== 0.0) { - det = 1.0 / det; - } - M.ex.x = det * d; - M.ey.x = -det * b; - M.ex.z = 0.0; - M.ex.y = -det * c; - M.ey.y = det * a; - M.ey.z = 0.0; - M.ez.x = 0.0; - M.ez.y = 0.0; - M.ez.z = 0.0; - }; - /** - * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix - * if singular. - */ - Mat33.prototype.getSymInverse33 = function (M) { - var det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez)); - if (det !== 0.0) { - det = 1.0 / det; - } - var a11 = this.ex.x; - var a12 = this.ey.x; - var a13 = this.ez.x; - var a22 = this.ey.y; - var a23 = this.ez.y; - var a33 = this.ez.z; - M.ex.x = det * (a22 * a33 - a23 * a23); - M.ex.y = det * (a13 * a23 - a12 * a33); - M.ex.z = det * (a12 * a23 - a13 * a22); - M.ey.x = M.ex.y; - M.ey.y = det * (a11 * a33 - a13 * a13); - M.ey.z = det * (a13 * a12 - a11 * a23); - M.ez.x = M.ex.z; - M.ez.y = M.ey.z; - M.ez.z = det * (a11 * a22 - a12 * a12); - }; - // tslint:disable-next-line:typedef - Mat33.mul = function (a, b) { - if (b && 'z' in b && 'y' in b && 'x' in b) { - var x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z; - var y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z; - var z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z; - return new Vec3(x, y, z); - } - else if (b && 'y' in b && 'x' in b) { - var x = a.ex.x * b.x + a.ey.x * b.y; - var y = a.ex.y * b.x + a.ey.y * b.y; - return Vec2.neo(x, y); - } - }; - Mat33.mulVec3 = function (a, b) { + var r = new Vec3(); + r.x = det * Vec3.dot(v, Vec3.cross(this.ey, this.ez)); + r.y = det * Vec3.dot(this.ex, Vec3.cross(v, this.ez)); + r.z = det * Vec3.dot(this.ex, Vec3.cross(this.ey, v)); + return r; + }; + /** + * Solve A * x = b, where b is a column vector. This is more efficient than + * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix + * equation. + */ + Mat33.prototype.solve22 = function (v) { + var a11 = this.ex.x; + var a12 = this.ey.x; + var a21 = this.ex.y; + var a22 = this.ey.y; + var det = a11 * a22 - a12 * a21; + if (det !== 0.0) { + det = 1.0 / det; + } + var r = Vec2.zero(); + r.x = det * (a22 * v.x - a12 * v.y); + r.y = det * (a11 * v.y - a21 * v.x); + return r; + }; + /** + * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if + * singular. + */ + Mat33.prototype.getInverse22 = function (M) { + var a = this.ex.x; + var b = this.ey.x; + var c = this.ex.y; + var d = this.ey.y; + var det = a * d - b * c; + if (det !== 0.0) { + det = 1.0 / det; + } + M.ex.x = det * d; + M.ey.x = -det * b; + M.ex.z = 0.0; + M.ex.y = -det * c; + M.ey.y = det * a; + M.ey.z = 0.0; + M.ez.x = 0.0; + M.ez.y = 0.0; + M.ez.z = 0.0; + }; + /** + * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix + * if singular. + */ + Mat33.prototype.getSymInverse33 = function (M) { + var det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez)); + if (det !== 0.0) { + det = 1.0 / det; + } + var a11 = this.ex.x; + var a12 = this.ey.x; + var a13 = this.ez.x; + var a22 = this.ey.y; + var a23 = this.ez.y; + var a33 = this.ez.z; + M.ex.x = det * (a22 * a33 - a23 * a23); + M.ex.y = det * (a13 * a23 - a12 * a33); + M.ex.z = det * (a12 * a23 - a13 * a22); + M.ey.x = M.ex.y; + M.ey.y = det * (a11 * a33 - a13 * a13); + M.ey.z = det * (a13 * a12 - a11 * a23); + M.ez.x = M.ex.z; + M.ez.y = M.ey.z; + M.ez.z = det * (a11 * a22 - a12 * a12); + }; + // tslint:disable-next-line:typedef + Mat33.mul = function (a, b) { + if (b && 'z' in b && 'y' in b && 'x' in b) { var x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z; var y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z; var z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z; return new Vec3(x, y, z); - }; - Mat33.mulVec2 = function (a, b) { + } + else if (b && 'y' in b && 'x' in b) { var x = a.ex.x * b.x + a.ey.x * b.y; var y = a.ex.y * b.x + a.ey.y * b.y; return Vec2.neo(x, y); - }; - Mat33.add = function (a, b) { - return new Mat33(Vec3.add(a.ex, b.ex), Vec3.add(a.ey, b.ey), Vec3.add(a.ez, b.ez)); - }; - return Mat33; - }()); + } + }; + Mat33.mulVec3 = function (a, b) { + var x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z; + var y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z; + var z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z; + return new Vec3(x, y, z); + }; + Mat33.mulVec2 = function (a, b) { + var x = a.ex.x * b.x + a.ey.x * b.y; + var y = a.ex.y * b.x + a.ey.y * b.y; + return Vec2.neo(x, y); + }; + Mat33.add = function (a, b) { + return new Mat33(Vec3.add(a.ex, b.ex), Vec3.add(a.ey, b.ey), Vec3.add(a.ez, b.ez)); + }; + return Mat33; +}()); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var inactiveLimit$2 = 0; - var atLowerLimit$1 = 1; - var atUpperLimit$2 = 2; - var equalLimits$1 = 3; - var DEFAULTS$8 = { - lowerAngle: 0.0, - upperAngle: 0.0, - maxMotorTorque: 0.0, - motorSpeed: 0.0, - enableLimit: false, - enableMotor: false - }; - /** - * A revolute joint constrains two bodies to share a common point while they are - * free to rotate about the point. The relative rotation about the shared point - * is the joint angle. You can limit the relative rotation with a joint limit - * that specifies a lower and upper angle. You can use a motor to drive the - * relative rotation about the shared point. A maximum motor torque is provided - * so that infinite forces are not generated. - */ - var RevoluteJoint = /** @class */ (function (_super) { - __extends(RevoluteJoint, _super); +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var inactiveLimit$2 = 0; +var atLowerLimit$1 = 1; +var atUpperLimit$2 = 2; +var equalLimits$1 = 3; +var DEFAULTS$8 = { + lowerAngle: 0.0, + upperAngle: 0.0, + maxMotorTorque: 0.0, + motorSpeed: 0.0, + enableLimit: false, + enableMotor: false +}; +/** + * A revolute joint constrains two bodies to share a common point while they are + * free to rotate about the point. The relative rotation about the shared point + * is the joint angle. You can limit the relative rotation with a joint limit + * that specifies a lower and upper angle. You can use a motor to drive the + * relative rotation about the shared point. A maximum motor torque is provided + * so that infinite forces are not generated. + */ +var RevoluteJoint = /** @class */ (function (_super) { + __extends(RevoluteJoint, _super); + // @ts-ignore + function RevoluteJoint(def, bodyA, bodyB, anchor) { + var _this = this; // @ts-ignore - function RevoluteJoint(def, bodyA, bodyB, anchor) { - var _this = this; - // @ts-ignore - if (!(_this instanceof RevoluteJoint)) { - return new RevoluteJoint(def, bodyA, bodyB, anchor); - } - def = options(def, DEFAULTS$8); - _this = _super.call(this, def, bodyA, bodyB) || this; - // effective mass for point-to-point constraint. - /** @internal */ _this.m_mass = new Mat33(); - /** @internal */ _this.m_limitState = inactiveLimit$2; // TODO enum - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = RevoluteJoint.TYPE; - _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); - _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); - _this.m_referenceAngle = math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); - _this.m_impulse = new Vec3(); - _this.m_motorImpulse = 0.0; - _this.m_lowerAngle = def.lowerAngle; - _this.m_upperAngle = def.upperAngle; - _this.m_maxMotorTorque = def.maxMotorTorque; - _this.m_motorSpeed = def.motorSpeed; - _this.m_enableLimit = def.enableLimit; - _this.m_enableMotor = def.enableMotor; - return _this; - // Point-to-point constraint - // C = p2 - p1 - // Cdot = v2 - v1 - // = v2 + cross(w2, r2) - v1 - cross(w1, r1) - // J = [-I -r1_skew I r2_skew ] - // Identity used: - // w k % (rx i + ry j) = w * (-ry i + rx j) - // Motor constraint - // Cdot = w2 - w1 - // J = [0 0 -1 0 0 1] - // K = invI1 + invI2 + if (!(_this instanceof RevoluteJoint)) { + return new RevoluteJoint(def, bodyA, bodyB, anchor); } - /** @internal */ - RevoluteJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - lowerAngle: this.m_lowerAngle, - upperAngle: this.m_upperAngle, - maxMotorTorque: this.m_maxMotorTorque, - motorSpeed: this.m_motorSpeed, - enableLimit: this.m_enableLimit, - enableMotor: this.m_enableMotor, - localAnchorA: this.m_localAnchorA, - localAnchorB: this.m_localAnchorB, - referenceAngle: this.m_referenceAngle, - }; - }; - /** @internal */ - RevoluteJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - var joint = new RevoluteJoint(data); - return joint; - }; - /** @internal */ - RevoluteJoint.prototype._setAnchors = function (def) { - if (def.anchorA) { - this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); - } - else if (def.localAnchorA) { - this.m_localAnchorA.setVec2(def.localAnchorA); - } - if (def.anchorB) { - this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); - } - else if (def.localAnchorB) { - this.m_localAnchorB.setVec2(def.localAnchorB); - } - }; - /** - * The local anchor point relative to bodyA's origin. - */ - RevoluteJoint.prototype.getLocalAnchorA = function () { - return this.m_localAnchorA; - }; - /** - * The local anchor point relative to bodyB's origin. - */ - RevoluteJoint.prototype.getLocalAnchorB = function () { - return this.m_localAnchorB; - }; - /** - * Get the reference angle. - */ - RevoluteJoint.prototype.getReferenceAngle = function () { - return this.m_referenceAngle; - }; - /** - * Get the current joint angle in radians. - */ - RevoluteJoint.prototype.getJointAngle = function () { - var bA = this.m_bodyA; - var bB = this.m_bodyB; - return bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle; - }; - /** - * Get the current joint angle speed in radians per second. - */ - RevoluteJoint.prototype.getJointSpeed = function () { - var bA = this.m_bodyA; - var bB = this.m_bodyB; - return bB.m_angularVelocity - bA.m_angularVelocity; - }; - /** - * Is the joint motor enabled? - */ - RevoluteJoint.prototype.isMotorEnabled = function () { - return this.m_enableMotor; - }; - /** - * Enable/disable the joint motor. - */ - RevoluteJoint.prototype.enableMotor = function (flag) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_enableMotor = flag; - }; - /** - * Get the current motor torque given the inverse time step. Unit is N*m. - */ - RevoluteJoint.prototype.getMotorTorque = function (inv_dt) { - return inv_dt * this.m_motorImpulse; + def = options(def, DEFAULTS$8); + _this = _super.call(this, def, bodyA, bodyB) || this; + // effective mass for point-to-point constraint. + /** @internal */ _this.m_mass = new Mat33(); + /** @internal */ _this.m_limitState = inactiveLimit$2; // TODO enum + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = RevoluteJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + _this.m_referenceAngle = math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); + _this.m_impulse = new Vec3(); + _this.m_motorImpulse = 0.0; + _this.m_lowerAngle = def.lowerAngle; + _this.m_upperAngle = def.upperAngle; + _this.m_maxMotorTorque = def.maxMotorTorque; + _this.m_motorSpeed = def.motorSpeed; + _this.m_enableLimit = def.enableLimit; + _this.m_enableMotor = def.enableMotor; + return _this; + // Point-to-point constraint + // C = p2 - p1 + // Cdot = v2 - v1 + // = v2 + cross(w2, r2) - v1 - cross(w1, r1) + // J = [-I -r1_skew I r2_skew ] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + // Motor constraint + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // K = invI1 + invI2 + } + /** @internal */ + RevoluteJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + lowerAngle: this.m_lowerAngle, + upperAngle: this.m_upperAngle, + maxMotorTorque: this.m_maxMotorTorque, + motorSpeed: this.m_motorSpeed, + enableLimit: this.m_enableLimit, + enableMotor: this.m_enableMotor, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + referenceAngle: this.m_referenceAngle, }; - /** - * Set the motor speed in radians per second. - */ - RevoluteJoint.prototype.setMotorSpeed = function (speed) { + }; + /** @internal */ + RevoluteJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new RevoluteJoint(data); + return joint; + }; + /** @internal */ + RevoluteJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + RevoluteJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + RevoluteJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * Get the reference angle. + */ + RevoluteJoint.prototype.getReferenceAngle = function () { + return this.m_referenceAngle; + }; + /** + * Get the current joint angle in radians. + */ + RevoluteJoint.prototype.getJointAngle = function () { + var bA = this.m_bodyA; + var bB = this.m_bodyB; + return bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle; + }; + /** + * Get the current joint angle speed in radians per second. + */ + RevoluteJoint.prototype.getJointSpeed = function () { + var bA = this.m_bodyA; + var bB = this.m_bodyB; + return bB.m_angularVelocity - bA.m_angularVelocity; + }; + /** + * Is the joint motor enabled? + */ + RevoluteJoint.prototype.isMotorEnabled = function () { + return this.m_enableMotor; + }; + /** + * Enable/disable the joint motor. + */ + RevoluteJoint.prototype.enableMotor = function (flag) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableMotor = flag; + }; + /** + * Get the current motor torque given the inverse time step. Unit is N*m. + */ + RevoluteJoint.prototype.getMotorTorque = function (inv_dt) { + return inv_dt * this.m_motorImpulse; + }; + /** + * Set the motor speed in radians per second. + */ + RevoluteJoint.prototype.setMotorSpeed = function (speed) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_motorSpeed = speed; + }; + /** + * Get the motor speed in radians per second. + */ + RevoluteJoint.prototype.getMotorSpeed = function () { + return this.m_motorSpeed; + }; + /** + * Set the maximum motor torque, usually in N-m. + */ + RevoluteJoint.prototype.setMaxMotorTorque = function (torque) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_maxMotorTorque = torque; + }; + RevoluteJoint.prototype.getMaxMotorTorque = function () { + return this.m_maxMotorTorque; + }; + /** + * Is the joint limit enabled? + */ + RevoluteJoint.prototype.isLimitEnabled = function () { + return this.m_enableLimit; + }; + /** + * Enable/disable the joint limit. + */ + RevoluteJoint.prototype.enableLimit = function (flag) { + if (flag != this.m_enableLimit) { this.m_bodyA.setAwake(true); this.m_bodyB.setAwake(true); - this.m_motorSpeed = speed; - }; - /** - * Get the motor speed in radians per second. - */ - RevoluteJoint.prototype.getMotorSpeed = function () { - return this.m_motorSpeed; - }; - /** - * Set the maximum motor torque, usually in N-m. - */ - RevoluteJoint.prototype.setMaxMotorTorque = function (torque) { + this.m_enableLimit = flag; + this.m_impulse.z = 0.0; + } + }; + /** + * Get the lower joint limit in radians. + */ + RevoluteJoint.prototype.getLowerLimit = function () { + return this.m_lowerAngle; + }; + /** + * Get the upper joint limit in radians. + */ + RevoluteJoint.prototype.getUpperLimit = function () { + return this.m_upperAngle; + }; + /** + * Set the joint limits in radians. + */ + RevoluteJoint.prototype.setLimits = function (lower, upper) { + if (lower != this.m_lowerAngle || upper != this.m_upperAngle) { this.m_bodyA.setAwake(true); this.m_bodyB.setAwake(true); - this.m_maxMotorTorque = torque; - }; - RevoluteJoint.prototype.getMaxMotorTorque = function () { - return this.m_maxMotorTorque; - }; - /** - * Is the joint limit enabled? - */ - RevoluteJoint.prototype.isLimitEnabled = function () { - return this.m_enableLimit; - }; - /** - * Enable/disable the joint limit. - */ - RevoluteJoint.prototype.enableLimit = function (flag) { - if (flag != this.m_enableLimit) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_enableLimit = flag; - this.m_impulse.z = 0.0; + this.m_impulse.z = 0.0; + this.m_lowerAngle = lower; + this.m_upperAngle = upper; + } + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + RevoluteJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + RevoluteJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force given the inverse time step. Unit is N. + */ + RevoluteJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt); + }; + /** + * Get the reaction torque due to the joint limit given the inverse time step. + * Unit is N*m. + */ + RevoluteJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_impulse.z; + }; + RevoluteJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var fixedRotation = (iA + iB === 0.0); // bool + this.m_mass.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y + * this.m_rB.y * iB; + this.m_mass.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y + * this.m_rB.x * iB; + this.m_mass.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB; + this.m_mass.ex.y = this.m_mass.ey.x; + this.m_mass.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x + * this.m_rB.x * iB; + this.m_mass.ez.y = this.m_rA.x * iA + this.m_rB.x * iB; + this.m_mass.ex.z = this.m_mass.ez.x; + this.m_mass.ey.z = this.m_mass.ez.y; + this.m_mass.ez.z = iA + iB; + this.m_motorMass = iA + iB; + if (this.m_motorMass > 0.0) { + this.m_motorMass = 1.0 / this.m_motorMass; + } + if (this.m_enableMotor == false || fixedRotation) { + this.m_motorImpulse = 0.0; + } + if (this.m_enableLimit && fixedRotation == false) { + var jointAngle = aB - aA - this.m_referenceAngle; // float + if (math.abs(this.m_upperAngle - this.m_lowerAngle) < 2.0 * Settings.angularSlop) { + this.m_limitState = equalLimits$1; } - }; - /** - * Get the lower joint limit in radians. - */ - RevoluteJoint.prototype.getLowerLimit = function () { - return this.m_lowerAngle; - }; - /** - * Get the upper joint limit in radians. - */ - RevoluteJoint.prototype.getUpperLimit = function () { - return this.m_upperAngle; - }; - /** - * Set the joint limits in radians. - */ - RevoluteJoint.prototype.setLimits = function (lower, upper) { - if (lower != this.m_lowerAngle || upper != this.m_upperAngle) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); + else if (jointAngle <= this.m_lowerAngle) { + if (this.m_limitState != atLowerLimit$1) { + this.m_impulse.z = 0.0; + } + this.m_limitState = atLowerLimit$1; + } + else if (jointAngle >= this.m_upperAngle) { + if (this.m_limitState != atUpperLimit$2) { + this.m_impulse.z = 0.0; + } + this.m_limitState = atUpperLimit$2; + } + else { + this.m_limitState = inactiveLimit$2; this.m_impulse.z = 0.0; - this.m_lowerAngle = lower; - this.m_upperAngle = upper; } - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - RevoluteJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - RevoluteJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force given the inverse time step. Unit is N. - */ - RevoluteJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt); - }; - /** - * Get the reaction torque due to the joint limit given the inverse time step. - * Unit is N*m. - */ - RevoluteJoint.prototype.getReactionTorque = function (inv_dt) { - return inv_dt * this.m_impulse.z; - }; - RevoluteJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - // J = [-I -r1_skew I r2_skew] - // [ 0 -1 0 1] - // r_skew = [-ry; rx] - // Matlab - // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] - // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] - // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + } + else { + this.m_limitState = inactiveLimit$2; + } + if (step.warmStarting) { + // Scale impulses to support a variable time step. + this.m_impulse.mul(step.dtRatio); + this.m_motorImpulse *= step.dtRatio; + var P = Vec2.neo(this.m_impulse.x, this.m_impulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_motorImpulse + this.m_impulse.z); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_motorImpulse + this.m_impulse.z); + } + else { + this.m_impulse.setZero(); + this.m_motorImpulse = 0.0; + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + RevoluteJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var fixedRotation = (iA + iB === 0.0); // bool + // Solve motor constraint. + if (this.m_enableMotor && this.m_limitState != equalLimits$1 + && fixedRotation == false) { + var Cdot = wB - wA - this.m_motorSpeed; // float + var impulse = -this.m_motorMass * Cdot; // float + var oldImpulse = this.m_motorImpulse; // float + var maxImpulse = step.dt * this.m_maxMotorTorque; // float + this.m_motorImpulse = math.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_motorImpulse - oldImpulse; + wA -= iA * impulse; + wB += iB * impulse; + } + // Solve limit constraint. + if (this.m_enableLimit && this.m_limitState != inactiveLimit$2 + && fixedRotation == false) { + var Cdot1 = Vec2.zero(); + Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); + var Cdot2 = wB - wA; // float + var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); + var impulse = Vec3.neg(this.m_mass.solve33(Cdot)); // Vec3 + if (this.m_limitState == equalLimits$1) { + this.m_impulse.add(impulse); + } + else if (this.m_limitState == atLowerLimit$1) { + var newImpulse = this.m_impulse.z + impulse.z; // float + if (newImpulse < 0.0) { + var rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2 + var reduced = this.m_mass.solve22(rhs); // Vec2 + impulse.x = reduced.x; + impulse.y = reduced.y; + impulse.z = -this.m_impulse.z; + this.m_impulse.x += reduced.x; + this.m_impulse.y += reduced.y; + this.m_impulse.z = 0.0; + } + else { + this.m_impulse.add(impulse); + } + } + else if (this.m_limitState == atUpperLimit$2) { + var newImpulse = this.m_impulse.z + impulse.z; // float + if (newImpulse > 0.0) { + var rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2 + var reduced = this.m_mass.solve22(rhs); // Vec2 + impulse.x = reduced.x; + impulse.y = reduced.y; + impulse.z = -this.m_impulse.z; + this.m_impulse.x += reduced.x; + this.m_impulse.y += reduced.y; + this.m_impulse.z = 0.0; + } + else { + this.m_impulse.add(impulse); + } + } + var P = Vec2.neo(impulse.x, impulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z); + } + else { + // Solve point-to-point constraint + var Cdot = Vec2.zero(); + Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); + var impulse = this.m_mass.solve22(Vec2.neg(Cdot)); // Vec2 + this.m_impulse.x += impulse.x; + this.m_impulse.y += impulse.y; + vA.subMul(mA, impulse); + wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); + vB.addMul(mB, impulse); + wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + RevoluteJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var angularError = 0.0; // float + var positionError = 0.0; // float + var fixedRotation = (this.m_invIA + this.m_invIB == 0.0); // bool + // Solve angular limit constraint. + if (this.m_enableLimit && this.m_limitState != inactiveLimit$2 + && fixedRotation == false) { + var angle = aB - aA - this.m_referenceAngle; // float + var limitImpulse = 0.0; // float + if (this.m_limitState == equalLimits$1) { + // Prevent large angular corrections + var C = math.clamp(angle - this.m_lowerAngle, -Settings.maxAngularCorrection, Settings.maxAngularCorrection); // float + limitImpulse = -this.m_motorMass * C; + angularError = math.abs(C); + } + else if (this.m_limitState == atLowerLimit$1) { + var C = angle - this.m_lowerAngle; // float + angularError = -C; + // Prevent large angular corrections and allow some slop. + C = math.clamp(C + Settings.angularSlop, -Settings.maxAngularCorrection, 0.0); + limitImpulse = -this.m_motorMass * C; + } + else if (this.m_limitState == atUpperLimit$2) { + var C = angle - this.m_upperAngle; // float + angularError = C; + // Prevent large angular corrections and allow some slop. + C = math.clamp(C - Settings.angularSlop, 0.0, Settings.maxAngularCorrection); + limitImpulse = -this.m_motorMass * C; + } + aA -= this.m_invIA * limitImpulse; + aB += this.m_invIB * limitImpulse; + } + // Solve point-to-point constraint. + { + qA.setAngle(aA); + qB.setAngle(aB); + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2 + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2 + var C = Vec2.zero(); + C.addCombine(1, cB, 1, rB); + C.subCombine(1, cA, 1, rA); + positionError = C.length(); var mA = this.m_invMassA; var mB = this.m_invMassB; // float var iA = this.m_invIA; var iB = this.m_invIB; // float - var fixedRotation = (iA + iB === 0.0); // bool - this.m_mass.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y - * this.m_rB.y * iB; - this.m_mass.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y - * this.m_rB.x * iB; - this.m_mass.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB; - this.m_mass.ex.y = this.m_mass.ey.x; - this.m_mass.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x - * this.m_rB.x * iB; - this.m_mass.ez.y = this.m_rA.x * iA + this.m_rB.x * iB; - this.m_mass.ex.z = this.m_mass.ez.x; - this.m_mass.ey.z = this.m_mass.ez.y; - this.m_mass.ez.z = iA + iB; - this.m_motorMass = iA + iB; + var K = new Mat22(); + K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y; + K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y; + K.ey.x = K.ex.y; + K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x; + var impulse = Vec2.neg(K.solve(C)); // Vec2 + cA.subMul(mA, impulse); + aA -= iA * Vec2.crossVec2Vec2(rA, impulse); + cB.addMul(mB, impulse); + aB += iB * Vec2.crossVec2Vec2(rB, impulse); + } + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + return positionError <= Settings.linearSlop + && angularError <= Settings.angularSlop; + }; + RevoluteJoint.TYPE = 'revolute-joint'; + return RevoluteJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var inactiveLimit$1 = 0; +var atLowerLimit = 1; +var atUpperLimit$1 = 2; +var equalLimits = 3; +var DEFAULTS$7 = { + enableLimit: false, + lowerTranslation: 0.0, + upperTranslation: 0.0, + enableMotor: false, + maxMotorForce: 0.0, + motorSpeed: 0.0 +}; +/** + * A prismatic joint. This joint provides one degree of freedom: translation + * along an axis fixed in bodyA. Relative rotation is prevented. You can use a + * joint limit to restrict the range of motion and a joint motor to drive the + * motion or to model joint friction. + */ +var PrismaticJoint = /** @class */ (function (_super) { + __extends(PrismaticJoint, _super); + function PrismaticJoint(def, bodyA, bodyB, anchor, axis) { + var _this = this; + // @ts-ignore + if (!(_this instanceof PrismaticJoint)) { + return new PrismaticJoint(def, bodyA, bodyB, anchor, axis); + } + def = options(def, DEFAULTS$7); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = PrismaticJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + _this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || Vec2.neo(1.0, 0.0)); + _this.m_localXAxisA.normalize(); + _this.m_localYAxisA = Vec2.crossNumVec2(1.0, _this.m_localXAxisA); + _this.m_referenceAngle = math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); + _this.m_impulse = new Vec3(); + _this.m_motorMass = 0.0; + _this.m_motorImpulse = 0.0; + _this.m_lowerTranslation = def.lowerTranslation; + _this.m_upperTranslation = def.upperTranslation; + _this.m_maxMotorForce = def.maxMotorForce; + _this.m_motorSpeed = def.motorSpeed; + _this.m_enableLimit = def.enableLimit; + _this.m_enableMotor = def.enableMotor; + _this.m_limitState = inactiveLimit$1; + _this.m_axis = Vec2.zero(); + _this.m_perp = Vec2.zero(); + _this.m_K = new Mat33(); + return _this; + // Linear constraint (point-to-line) + // d = p2 - p1 = x2 + r2 - x1 - r1 + // C = dot(perp, d) + // Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 - + // cross(w1, r1)) + // = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) + + // dot(cross(r2, perp), v2) + // J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)] + // + // Angular constraint + // C = a2 - a1 + a_initial + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // + // K = J * invM * JT + // + // J = [-a -s1 a s2] + // [0 -1 0 1] + // a = perp + // s1 = cross(d + r1, a) = cross(p2 - x1, a) + // s2 = cross(r2, a) = cross(p2 - x2, a) + // Motor/Limit linear constraint + // C = dot(ax1, d) + // Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) + + // dot(cross(r2, ax1), v2) + // J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)] + // Block Solver + // We develop a block solver that includes the joint limit. This makes the + // limit stiff (inelastic) even + // when the mass has poor distribution (leading to large torques about the + // joint anchor points). + // + // The Jacobian has 3 rows: + // J = [-uT -s1 uT s2] // linear + // [0 -1 0 1] // angular + // [-vT -a1 vT a2] // limit + // + // u = perp + // v = axis + // s1 = cross(d + r1, u), s2 = cross(r2, u) + // a1 = cross(d + r1, v), a2 = cross(r2, v) + // M * (v2 - v1) = JT * df + // J * v2 = bias + // + // v2 = v1 + invM * JT * df + // J * (v1 + invM * JT * df) = bias + // K * df = bias - J * v1 = -Cdot + // K = J * invM * JT + // Cdot = J * v1 - bias + // + // Now solve for f2. + // df = f2 - f1 + // K * (f2 - f1) = -Cdot + // f2 = invK * (-Cdot) + f1 + // + // Clamp accumulated limit impulse. + // lower: f2(3) = max(f2(3), 0) + // upper: f2(3) = min(f2(3), 0) + // + // Solve for correct f2(1:2) + // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1 + // = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3) + // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) + + // K(1:2,1:2) * f1(1:2) + // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + + // f1(1:2) + // + // Now compute impulse to be applied: + // df = f2 - f1 + } + /** @internal */ + PrismaticJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + lowerTranslation: this.m_lowerTranslation, + upperTranslation: this.m_upperTranslation, + maxMotorForce: this.m_maxMotorForce, + motorSpeed: this.m_motorSpeed, + enableLimit: this.m_enableLimit, + enableMotor: this.m_enableMotor, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + localAxisA: this.m_localXAxisA, + referenceAngle: this.m_referenceAngle, + }; + }; + /** @internal */ + PrismaticJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + data.localAxisA = Vec2.clone(data.localAxisA); + var joint = new PrismaticJoint(data); + return joint; + }; + /** @internal */ + PrismaticJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + if (def.localAxisA) { + this.m_localXAxisA.setVec2(def.localAxisA); + this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA)); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + PrismaticJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + PrismaticJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * The local joint axis relative to bodyA. + */ + PrismaticJoint.prototype.getLocalAxisA = function () { + return this.m_localXAxisA; + }; + /** + * Get the reference angle. + */ + PrismaticJoint.prototype.getReferenceAngle = function () { + return this.m_referenceAngle; + }; + /** + * Get the current joint translation, usually in meters. + */ + PrismaticJoint.prototype.getJointTranslation = function () { + var pA = this.m_bodyA.getWorldPoint(this.m_localAnchorA); + var pB = this.m_bodyB.getWorldPoint(this.m_localAnchorB); + var d = Vec2.sub(pB, pA); + var axis = this.m_bodyA.getWorldVector(this.m_localXAxisA); + var translation = Vec2.dot(d, axis); + return translation; + }; + /** + * Get the current joint translation speed, usually in meters per second. + */ + PrismaticJoint.prototype.getJointSpeed = function () { + var bA = this.m_bodyA; + var bB = this.m_bodyB; + var rA = Rot.mulVec2(bA.m_xf.q, Vec2.sub(this.m_localAnchorA, bA.m_sweep.localCenter)); // Vec2 + var rB = Rot.mulVec2(bB.m_xf.q, Vec2.sub(this.m_localAnchorB, bB.m_sweep.localCenter)); // Vec2 + var p1 = Vec2.add(bA.m_sweep.c, rA); // Vec2 + var p2 = Vec2.add(bB.m_sweep.c, rB); // Vec2 + var d = Vec2.sub(p2, p1); // Vec2 + var axis = Rot.mulVec2(bA.m_xf.q, this.m_localXAxisA); // Vec2 + var vA = bA.m_linearVelocity; // Vec2 + var vB = bB.m_linearVelocity; // Vec2 + var wA = bA.m_angularVelocity; // float + var wB = bB.m_angularVelocity; // float + var speed = Vec2.dot(d, Vec2.crossNumVec2(wA, axis)) + + Vec2.dot(axis, Vec2.sub(Vec2.addCrossNumVec2(vB, wB, rB), Vec2.addCrossNumVec2(vA, wA, rA))); // float + return speed; + }; + /** + * Is the joint limit enabled? + */ + PrismaticJoint.prototype.isLimitEnabled = function () { + return this.m_enableLimit; + }; + /** + * Enable/disable the joint limit. + */ + PrismaticJoint.prototype.enableLimit = function (flag) { + if (flag != this.m_enableLimit) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableLimit = flag; + this.m_impulse.z = 0.0; + } + }; + /** + * Get the lower joint limit, usually in meters. + */ + PrismaticJoint.prototype.getLowerLimit = function () { + return this.m_lowerTranslation; + }; + /** + * Get the upper joint limit, usually in meters. + */ + PrismaticJoint.prototype.getUpperLimit = function () { + return this.m_upperTranslation; + }; + /** + * Set the joint limits, usually in meters. + */ + PrismaticJoint.prototype.setLimits = function (lower, upper) { + if (lower != this.m_lowerTranslation || upper != this.m_upperTranslation) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_lowerTranslation = lower; + this.m_upperTranslation = upper; + this.m_impulse.z = 0.0; + } + }; + /** + * Is the joint motor enabled? + */ + PrismaticJoint.prototype.isMotorEnabled = function () { + return this.m_enableMotor; + }; + /** + * Enable/disable the joint motor. + */ + PrismaticJoint.prototype.enableMotor = function (flag) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableMotor = flag; + }; + /** + * Set the motor speed, usually in meters per second. + */ + PrismaticJoint.prototype.setMotorSpeed = function (speed) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_motorSpeed = speed; + }; + /** + * Set the maximum motor force, usually in N. + */ + PrismaticJoint.prototype.setMaxMotorForce = function (force) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_maxMotorForce = force; + }; + PrismaticJoint.prototype.getMaxMotorForce = function () { + return this.m_maxMotorForce; + }; + /** + * Get the motor speed, usually in meters per second. + */ + PrismaticJoint.prototype.getMotorSpeed = function () { + return this.m_motorSpeed; + }; + /** + * Get the current motor force given the inverse time step, usually in N. + */ + PrismaticJoint.prototype.getMotorForce = function (inv_dt) { + return inv_dt * this.m_motorImpulse; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + PrismaticJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + PrismaticJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + PrismaticJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + this.m_impulse.z, this.m_axis).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + PrismaticJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_impulse.y; + }; + PrismaticJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + // Compute the effective masses. + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + var d = Vec2.zero(); + d.addCombine(1, cB, 1, rB); + d.subCombine(1, cA, 1, rA); + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + // Compute motor Jacobian and effective mass. + { + this.m_axis = Rot.mulVec2(qA, this.m_localXAxisA); + this.m_a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_axis); + this.m_a2 = Vec2.crossVec2Vec2(rB, this.m_axis); + this.m_motorMass = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 + * this.m_a2; if (this.m_motorMass > 0.0) { this.m_motorMass = 1.0 / this.m_motorMass; } - if (this.m_enableMotor == false || fixedRotation) { - this.m_motorImpulse = 0.0; - } - if (this.m_enableLimit && fixedRotation == false) { - var jointAngle = aB - aA - this.m_referenceAngle; // float - if (math.abs(this.m_upperAngle - this.m_lowerAngle) < 2.0 * Settings.angularSlop) { - this.m_limitState = equalLimits$1; - } - else if (jointAngle <= this.m_lowerAngle) { - if (this.m_limitState != atLowerLimit$1) { - this.m_impulse.z = 0.0; - } - this.m_limitState = atLowerLimit$1; - } - else if (jointAngle >= this.m_upperAngle) { - if (this.m_limitState != atUpperLimit$2) { - this.m_impulse.z = 0.0; - } - this.m_limitState = atUpperLimit$2; - } - else { - this.m_limitState = inactiveLimit$2; + } + // Prismatic constraint. + { + this.m_perp = Rot.mulVec2(qA, this.m_localYAxisA); + this.m_s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_perp); + this.m_s2 = Vec2.crossVec2Vec2(rB, this.m_perp); + Vec2.crossVec2Vec2(rA, this.m_perp); + var k11 = mA + mB + iA * this.m_s1 * this.m_s1 + iB * this.m_s2 * this.m_s2; + var k12 = iA * this.m_s1 + iB * this.m_s2; + var k13 = iA * this.m_s1 * this.m_a1 + iB * this.m_s2 * this.m_a2; + var k22 = iA + iB; + if (k22 == 0.0) { + // For bodies with fixed rotation. + k22 = 1.0; + } + var k23 = iA * this.m_a1 + iB * this.m_a2; + var k33 = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 * this.m_a2; + this.m_K.ex.set(k11, k12, k13); + this.m_K.ey.set(k12, k22, k23); + this.m_K.ez.set(k13, k23, k33); + } + // Compute motor and limit terms. + if (this.m_enableLimit) { + var jointTranslation = Vec2.dot(this.m_axis, d); // float + if (math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * Settings.linearSlop) { + this.m_limitState = equalLimits; + } + else if (jointTranslation <= this.m_lowerTranslation) { + if (this.m_limitState != atLowerLimit) { + this.m_limitState = atLowerLimit; this.m_impulse.z = 0.0; } } - else { - this.m_limitState = inactiveLimit$2; - } - if (step.warmStarting) { - // Scale impulses to support a variable time step. - this.m_impulse.mul(step.dtRatio); - this.m_motorImpulse *= step.dtRatio; - var P = Vec2.neo(this.m_impulse.x, this.m_impulse.y); - vA.subMul(mA, P); - wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_motorImpulse + this.m_impulse.z); - vB.addMul(mB, P); - wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_motorImpulse + this.m_impulse.z); + else if (jointTranslation >= this.m_upperTranslation) { + if (this.m_limitState != atUpperLimit$1) { + this.m_limitState = atUpperLimit$1; + this.m_impulse.z = 0.0; + } } else { - this.m_impulse.setZero(); - this.m_motorImpulse = 0.0; + this.m_limitState = inactiveLimit$1; + this.m_impulse.z = 0.0; } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - RevoluteJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var mA = this.m_invMassA; - var mB = this.m_invMassB; // float - var iA = this.m_invIA; - var iB = this.m_invIB; // float - var fixedRotation = (iA + iB === 0.0); // bool - // Solve motor constraint. - if (this.m_enableMotor && this.m_limitState != equalLimits$1 - && fixedRotation == false) { - var Cdot = wB - wA - this.m_motorSpeed; // float - var impulse = -this.m_motorMass * Cdot; // float - var oldImpulse = this.m_motorImpulse; // float - var maxImpulse = step.dt * this.m_maxMotorTorque; // float - this.m_motorImpulse = math.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); - impulse = this.m_motorImpulse - oldImpulse; - wA -= iA * impulse; - wB += iB * impulse; - } - // Solve limit constraint. - if (this.m_enableLimit && this.m_limitState != inactiveLimit$2 - && fixedRotation == false) { - var Cdot1 = Vec2.zero(); - Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); - Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); - var Cdot2 = wB - wA; // float - var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); - var impulse = Vec3.neg(this.m_mass.solve33(Cdot)); // Vec3 - if (this.m_limitState == equalLimits$1) { - this.m_impulse.add(impulse); - } - else if (this.m_limitState == atLowerLimit$1) { - var newImpulse = this.m_impulse.z + impulse.z; // float - if (newImpulse < 0.0) { - var rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2 - var reduced = this.m_mass.solve22(rhs); // Vec2 - impulse.x = reduced.x; - impulse.y = reduced.y; - impulse.z = -this.m_impulse.z; - this.m_impulse.x += reduced.x; - this.m_impulse.y += reduced.y; - this.m_impulse.z = 0.0; - } - else { - this.m_impulse.add(impulse); - } - } - else if (this.m_limitState == atUpperLimit$2) { - var newImpulse = this.m_impulse.z + impulse.z; // float - if (newImpulse > 0.0) { - var rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2 - var reduced = this.m_mass.solve22(rhs); // Vec2 - impulse.x = reduced.x; - impulse.y = reduced.y; - impulse.z = -this.m_impulse.z; - this.m_impulse.x += reduced.x; - this.m_impulse.y += reduced.y; - this.m_impulse.z = 0.0; - } - else { - this.m_impulse.add(impulse); - } - } - var P = Vec2.neo(impulse.x, impulse.y); - vA.subMul(mA, P); - wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z); - vB.addMul(mB, P); - wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z); + } + else { + this.m_limitState = inactiveLimit$1; + this.m_impulse.z = 0.0; + } + if (this.m_enableMotor == false) { + this.m_motorImpulse = 0.0; + } + if (step.warmStarting) { + // Account for variable time step. + this.m_impulse.mul(step.dtRatio); + this.m_motorImpulse *= step.dtRatio; + var P = Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + + this.m_impulse.z, this.m_axis); + var LA = this.m_impulse.x * this.m_s1 + this.m_impulse.y + + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1; + var LB = this.m_impulse.x * this.m_s2 + this.m_impulse.y + + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2; + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + else { + this.m_impulse.setZero(); + this.m_motorImpulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + PrismaticJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + // Solve linear motor constraint. + if (this.m_enableMotor && this.m_limitState != equalLimits) { + var Cdot = Vec2.dot(this.m_axis, Vec2.sub(vB, vA)) + this.m_a2 * wB + - this.m_a1 * wA; + var impulse = this.m_motorMass * (this.m_motorSpeed - Cdot); + var oldImpulse = this.m_motorImpulse; + var maxImpulse = step.dt * this.m_maxMotorForce; + this.m_motorImpulse = math.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_motorImpulse - oldImpulse; + var P = Vec2.mulNumVec2(impulse, this.m_axis); + var LA = impulse * this.m_a1; + var LB = impulse * this.m_a2; + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + var Cdot1 = Vec2.zero(); + Cdot1.x += Vec2.dot(this.m_perp, vB) + this.m_s2 * wB; + Cdot1.x -= Vec2.dot(this.m_perp, vA) + this.m_s1 * wA; + Cdot1.y = wB - wA; + if (this.m_enableLimit && this.m_limitState != inactiveLimit$1) { + // Solve prismatic and limit constraint in block form. + var Cdot2 = 0; + Cdot2 += Vec2.dot(this.m_axis, vB) + this.m_a2 * wB; + Cdot2 -= Vec2.dot(this.m_axis, vA) + this.m_a1 * wA; + var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); + var f1 = Vec3.clone(this.m_impulse); + var df = this.m_K.solve33(Vec3.neg(Cdot)); // Vec3 + this.m_impulse.add(df); + if (this.m_limitState == atLowerLimit) { + this.m_impulse.z = math.max(this.m_impulse.z, 0.0); + } + else if (this.m_limitState == atUpperLimit$1) { + this.m_impulse.z = math.min(this.m_impulse.z, 0.0); } - else { - // Solve point-to-point constraint - var Cdot = Vec2.zero(); - Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); - Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); - var impulse = this.m_mass.solve22(Vec2.neg(Cdot)); // Vec2 - this.m_impulse.x += impulse.x; - this.m_impulse.y += impulse.y; - vA.subMul(mA, impulse); - wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); - vB.addMul(mB, impulse); - wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); - } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - RevoluteJoint.prototype.solvePositionConstraints = function (step) { - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var angularError = 0.0; // float - var positionError = 0.0; // float - var fixedRotation = (this.m_invIA + this.m_invIB == 0.0); // bool - // Solve angular limit constraint. - if (this.m_enableLimit && this.m_limitState != inactiveLimit$2 - && fixedRotation == false) { - var angle = aB - aA - this.m_referenceAngle; // float - var limitImpulse = 0.0; // float - if (this.m_limitState == equalLimits$1) { - // Prevent large angular corrections - var C = math.clamp(angle - this.m_lowerAngle, -Settings.maxAngularCorrection, Settings.maxAngularCorrection); // float - limitImpulse = -this.m_motorMass * C; - angularError = math.abs(C); - } - else if (this.m_limitState == atLowerLimit$1) { - var C = angle - this.m_lowerAngle; // float - angularError = -C; - // Prevent large angular corrections and allow some slop. - C = math.clamp(C + Settings.angularSlop, -Settings.maxAngularCorrection, 0.0); - limitImpulse = -this.m_motorMass * C; - } - else if (this.m_limitState == atUpperLimit$2) { - var C = angle - this.m_upperAngle; // float - angularError = C; - // Prevent large angular corrections and allow some slop. - C = math.clamp(C - Settings.angularSlop, 0.0, Settings.maxAngularCorrection); - limitImpulse = -this.m_motorMass * C; - } - aA -= this.m_invIA * limitImpulse; - aB += this.m_invIB * limitImpulse; - } - // Solve point-to-point constraint. - { - qA.setAngle(aA); - qB.setAngle(aB); - var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2 - var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2 - var C = Vec2.zero(); - C.addCombine(1, cB, 1, rB); - C.subCombine(1, cA, 1, rA); - positionError = C.length(); - var mA = this.m_invMassA; - var mB = this.m_invMassB; // float - var iA = this.m_invIA; - var iB = this.m_invIB; // float - var K = new Mat22(); - K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y; - K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y; - K.ey.x = K.ex.y; - K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x; - var impulse = Vec2.neg(K.solve(C)); // Vec2 - cA.subMul(mA, impulse); - aA -= iA * Vec2.crossVec2Vec2(rA, impulse); - cB.addMul(mB, impulse); - aB += iB * Vec2.crossVec2Vec2(rB, impulse); - } - this.m_bodyA.c_position.c.setVec2(cA); - this.m_bodyA.c_position.a = aA; - this.m_bodyB.c_position.c.setVec2(cB); - this.m_bodyB.c_position.a = aB; - return positionError <= Settings.linearSlop - && angularError <= Settings.angularSlop; - }; - RevoluteJoint.TYPE = 'revolute-joint'; - return RevoluteJoint; - }(Joint)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var inactiveLimit$1 = 0; - var atLowerLimit = 1; - var atUpperLimit$1 = 2; - var equalLimits = 3; - var DEFAULTS$7 = { - enableLimit: false, - lowerTranslation: 0.0, - upperTranslation: 0.0, - enableMotor: false, - maxMotorForce: 0.0, - motorSpeed: 0.0 - }; - /** - * A prismatic joint. This joint provides one degree of freedom: translation - * along an axis fixed in bodyA. Relative rotation is prevented. You can use a - * joint limit to restrict the range of motion and a joint motor to drive the - * motion or to model joint friction. - */ - var PrismaticJoint = /** @class */ (function (_super) { - __extends(PrismaticJoint, _super); - function PrismaticJoint(def, bodyA, bodyB, anchor, axis) { - var _this = this; - // @ts-ignore - if (!(_this instanceof PrismaticJoint)) { - return new PrismaticJoint(def, bodyA, bodyB, anchor, axis); - } - def = options(def, DEFAULTS$7); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = PrismaticJoint.TYPE; - _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); - _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); - _this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || Vec2.neo(1.0, 0.0)); - _this.m_localXAxisA.normalize(); - _this.m_localYAxisA = Vec2.crossNumVec2(1.0, _this.m_localXAxisA); - _this.m_referenceAngle = math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); - _this.m_impulse = new Vec3(); - _this.m_motorMass = 0.0; - _this.m_motorImpulse = 0.0; - _this.m_lowerTranslation = def.lowerTranslation; - _this.m_upperTranslation = def.upperTranslation; - _this.m_maxMotorForce = def.maxMotorForce; - _this.m_motorSpeed = def.motorSpeed; - _this.m_enableLimit = def.enableLimit; - _this.m_enableMotor = def.enableMotor; - _this.m_limitState = inactiveLimit$1; - _this.m_axis = Vec2.zero(); - _this.m_perp = Vec2.zero(); - _this.m_K = new Mat33(); - return _this; - // Linear constraint (point-to-line) - // d = p2 - p1 = x2 + r2 - x1 - r1 - // C = dot(perp, d) - // Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 - - // cross(w1, r1)) - // = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) + - // dot(cross(r2, perp), v2) - // J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)] - // - // Angular constraint - // C = a2 - a1 + a_initial - // Cdot = w2 - w1 - // J = [0 0 -1 0 0 1] - // - // K = J * invM * JT - // - // J = [-a -s1 a s2] - // [0 -1 0 1] - // a = perp - // s1 = cross(d + r1, a) = cross(p2 - x1, a) - // s2 = cross(r2, a) = cross(p2 - x2, a) - // Motor/Limit linear constraint - // C = dot(ax1, d) - // Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) + - // dot(cross(r2, ax1), v2) - // J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)] - // Block Solver - // We develop a block solver that includes the joint limit. This makes the - // limit stiff (inelastic) even - // when the mass has poor distribution (leading to large torques about the - // joint anchor points). - // - // The Jacobian has 3 rows: - // J = [-uT -s1 uT s2] // linear - // [0 -1 0 1] // angular - // [-vT -a1 vT a2] // limit - // - // u = perp - // v = axis - // s1 = cross(d + r1, u), s2 = cross(r2, u) - // a1 = cross(d + r1, v), a2 = cross(r2, v) - // M * (v2 - v1) = JT * df - // J * v2 = bias - // - // v2 = v1 + invM * JT * df - // J * (v1 + invM * JT * df) = bias - // K * df = bias - J * v1 = -Cdot - // K = J * invM * JT - // Cdot = J * v1 - bias - // - // Now solve for f2. - // df = f2 - f1 - // K * (f2 - f1) = -Cdot - // f2 = invK * (-Cdot) + f1 - // - // Clamp accumulated limit impulse. - // lower: f2(3) = max(f2(3), 0) - // upper: f2(3) = min(f2(3), 0) - // - // Solve for correct f2(1:2) - // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1 - // = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3) - // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) + - // K(1:2,1:2) * f1(1:2) // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + // f1(1:2) - // - // Now compute impulse to be applied: - // df = f2 - f1 + var b = Vec2.combine(-1, Cdot1, -(this.m_impulse.z - f1.z), Vec2.neo(this.m_K.ez.x, this.m_K.ez.y)); // Vec2 + var f2r = Vec2.add(this.m_K.solve22(b), Vec2.neo(f1.x, f1.y)); // Vec2 + this.m_impulse.x = f2r.x; + this.m_impulse.y = f2r.y; + df = Vec3.sub(this.m_impulse, f1); + var P = Vec2.combine(df.x, this.m_perp, df.z, this.m_axis); // Vec2 + var LA = df.x * this.m_s1 + df.y + df.z * this.m_a1; // float + var LB = df.x * this.m_s2 + df.y + df.z * this.m_a2; // float + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; } - /** @internal */ - PrismaticJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - lowerTranslation: this.m_lowerTranslation, - upperTranslation: this.m_upperTranslation, - maxMotorForce: this.m_maxMotorForce, - motorSpeed: this.m_motorSpeed, - enableLimit: this.m_enableLimit, - enableMotor: this.m_enableMotor, - localAnchorA: this.m_localAnchorA, - localAnchorB: this.m_localAnchorB, - localAxisA: this.m_localXAxisA, - referenceAngle: this.m_referenceAngle, - }; - }; - /** @internal */ - PrismaticJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - data.localAxisA = Vec2.clone(data.localAxisA); - var joint = new PrismaticJoint(data); - return joint; - }; - /** @internal */ - PrismaticJoint.prototype._setAnchors = function (def) { - if (def.anchorA) { - this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); - } - else if (def.localAnchorA) { - this.m_localAnchorA.setVec2(def.localAnchorA); - } - if (def.anchorB) { - this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); - } - else if (def.localAnchorB) { - this.m_localAnchorB.setVec2(def.localAnchorB); - } - if (def.localAxisA) { - this.m_localXAxisA.setVec2(def.localAxisA); - this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA)); - } - }; - /** - * The local anchor point relative to bodyA's origin. - */ - PrismaticJoint.prototype.getLocalAnchorA = function () { - return this.m_localAnchorA; - }; - /** - * The local anchor point relative to bodyB's origin. - */ - PrismaticJoint.prototype.getLocalAnchorB = function () { - return this.m_localAnchorB; - }; - /** - * The local joint axis relative to bodyA. - */ - PrismaticJoint.prototype.getLocalAxisA = function () { - return this.m_localXAxisA; - }; - /** - * Get the reference angle. - */ - PrismaticJoint.prototype.getReferenceAngle = function () { - return this.m_referenceAngle; - }; - /** - * Get the current joint translation, usually in meters. - */ - PrismaticJoint.prototype.getJointTranslation = function () { - var pA = this.m_bodyA.getWorldPoint(this.m_localAnchorA); - var pB = this.m_bodyB.getWorldPoint(this.m_localAnchorB); - var d = Vec2.sub(pB, pA); - var axis = this.m_bodyA.getWorldVector(this.m_localXAxisA); - var translation = Vec2.dot(d, axis); - return translation; - }; - /** - * Get the current joint translation speed, usually in meters per second. - */ - PrismaticJoint.prototype.getJointSpeed = function () { - var bA = this.m_bodyA; - var bB = this.m_bodyB; - var rA = Rot.mulVec2(bA.m_xf.q, Vec2.sub(this.m_localAnchorA, bA.m_sweep.localCenter)); // Vec2 - var rB = Rot.mulVec2(bB.m_xf.q, Vec2.sub(this.m_localAnchorB, bB.m_sweep.localCenter)); // Vec2 - var p1 = Vec2.add(bA.m_sweep.c, rA); // Vec2 - var p2 = Vec2.add(bB.m_sweep.c, rB); // Vec2 - var d = Vec2.sub(p2, p1); // Vec2 - var axis = Rot.mulVec2(bA.m_xf.q, this.m_localXAxisA); // Vec2 - var vA = bA.m_linearVelocity; // Vec2 - var vB = bB.m_linearVelocity; // Vec2 - var wA = bA.m_angularVelocity; // float - var wB = bB.m_angularVelocity; // float - var speed = Vec2.dot(d, Vec2.crossNumVec2(wA, axis)) - + Vec2.dot(axis, Vec2.sub(Vec2.addCrossNumVec2(vB, wB, rB), Vec2.addCrossNumVec2(vA, wA, rA))); // float - return speed; - }; - /** - * Is the joint limit enabled? - */ - PrismaticJoint.prototype.isLimitEnabled = function () { - return this.m_enableLimit; - }; - /** - * Enable/disable the joint limit. - */ - PrismaticJoint.prototype.enableLimit = function (flag) { - if (flag != this.m_enableLimit) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_enableLimit = flag; - this.m_impulse.z = 0.0; + else { + // Limit is inactive, just solve the prismatic constraint in block form. + var df = this.m_K.solve22(Vec2.neg(Cdot1)); // Vec2 + this.m_impulse.x += df.x; + this.m_impulse.y += df.y; + var P = Vec2.mulNumVec2(df.x, this.m_perp); // Vec2 + var LA = df.x * this.m_s1 + df.y; // float + var LB = df.x * this.m_s2 + df.y; // float + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + PrismaticJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + // Compute fresh Jacobians + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2 + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2 + var d = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); // Vec2 + var axis = Rot.mulVec2(qA, this.m_localXAxisA); // Vec2 + var a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), axis); // float + var a2 = Vec2.crossVec2Vec2(rB, axis); // float + var perp = Rot.mulVec2(qA, this.m_localYAxisA); // Vec2 + var s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), perp); // float + var s2 = Vec2.crossVec2Vec2(rB, perp); // float + var impulse = new Vec3(); + var C1 = Vec2.zero(); // Vec2 + C1.x = Vec2.dot(perp, d); + C1.y = aB - aA - this.m_referenceAngle; + var linearError = math.abs(C1.x); // float + var angularError = math.abs(C1.y); // float + var linearSlop = Settings.linearSlop; + var maxLinearCorrection = Settings.maxLinearCorrection; + var active = false; // bool + var C2 = 0.0; // float + if (this.m_enableLimit) { + var translation = Vec2.dot(axis, d); // float + if (math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * linearSlop) { + // Prevent large angular corrections + C2 = math.clamp(translation, -maxLinearCorrection, maxLinearCorrection); + linearError = math.max(linearError, math.abs(translation)); + active = true; + } + else if (translation <= this.m_lowerTranslation) { + // Prevent large linear corrections and allow some slop. + C2 = math.clamp(translation - this.m_lowerTranslation + linearSlop, -maxLinearCorrection, 0.0); + linearError = math + .max(linearError, this.m_lowerTranslation - translation); + active = true; + } + else if (translation >= this.m_upperTranslation) { + // Prevent large linear corrections and allow some slop. + C2 = math.clamp(translation - this.m_upperTranslation - linearSlop, 0.0, maxLinearCorrection); + linearError = math + .max(linearError, translation - this.m_upperTranslation); + active = true; } - }; - /** - * Get the lower joint limit, usually in meters. - */ - PrismaticJoint.prototype.getLowerLimit = function () { - return this.m_lowerTranslation; - }; - /** - * Get the upper joint limit, usually in meters. - */ - PrismaticJoint.prototype.getUpperLimit = function () { - return this.m_upperTranslation; - }; - /** - * Set the joint limits, usually in meters. - */ - PrismaticJoint.prototype.setLimits = function (lower, upper) { - if (lower != this.m_lowerTranslation || upper != this.m_upperTranslation) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_lowerTranslation = lower; - this.m_upperTranslation = upper; - this.m_impulse.z = 0.0; + } + if (active) { + var k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float + var k12 = iA * s1 + iB * s2; // float + var k13 = iA * s1 * a1 + iB * s2 * a2; // float + var k22 = iA + iB; // float + if (k22 == 0.0) { + // For fixed rotation + k22 = 1.0; + } + var k23 = iA * a1 + iB * a2; // float + var k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; // float + var K = new Mat33(); + K.ex.set(k11, k12, k13); + K.ey.set(k12, k22, k23); + K.ez.set(k13, k23, k33); + var C = new Vec3(); + C.x = C1.x; + C.y = C1.y; + C.z = C2; + impulse = K.solve33(Vec3.neg(C)); + } + else { + var k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float + var k12 = iA * s1 + iB * s2; // float + var k22 = iA + iB; // float + if (k22 == 0.0) { + k22 = 1.0; } + var K = new Mat22(); + K.ex.setNum(k11, k12); + K.ey.setNum(k12, k22); + var impulse1 = K.solve(Vec2.neg(C1)); // Vec2 + impulse.x = impulse1.x; + impulse.y = impulse1.y; + impulse.z = 0.0; + } + var P = Vec2.combine(impulse.x, perp, impulse.z, axis); // Vec2 + var LA = impulse.x * s1 + impulse.y + impulse.z * a1; // float + var LB = impulse.x * s2 + impulse.y + impulse.z * a2; // float + cA.subMul(mA, P); + aA -= iA * LA; + cB.addMul(mB, P); + aB += iB * LB; + this.m_bodyA.c_position.c = cA; + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c = cB; + this.m_bodyB.c_position.a = aB; + return linearError <= Settings.linearSlop + && angularError <= Settings.angularSlop; + }; + PrismaticJoint.TYPE = 'prismatic-joint'; + return PrismaticJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$6 = { + ratio: 1.0 +}; +/** + * A gear joint is used to connect two joints together. Either joint can be a + * revolute or prismatic joint. You specify a gear ratio to bind the motions + * together: coordinate1 + ratio * coordinate2 = constant + * + * The ratio can be negative or positive. If one joint is a revolute joint and + * the other joint is a prismatic joint, then the ratio will have units of + * length or units of 1/length. Warning: You have to manually destroy the gear + * joint if joint1 or joint2 is destroyed. + * + * This definition requires two existing revolute or prismatic joints (any + * combination will work). + */ +var GearJoint = /** @class */ (function (_super) { + __extends(GearJoint, _super); + function GearJoint(def, bodyA, bodyB, joint1, joint2, ratio) { + var _this = this; + // @ts-ignore + if (!(_this instanceof GearJoint)) { + return new GearJoint(def, bodyA, bodyB, joint1, joint2, ratio); + } + def = options(def, DEFAULTS$6); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = GearJoint.TYPE; + _this.m_joint1 = joint1 ? joint1 : def.joint1; + _this.m_joint2 = joint2 ? joint2 : def.joint2; + _this.m_ratio = math.isFinite(ratio) ? ratio : def.ratio; + _this.m_type1 = _this.m_joint1.getType(); + _this.m_type2 = _this.m_joint2.getType(); + // joint1 connects body A to body C + // joint2 connects body B to body D + var coordinateA; + var coordinateB; + // TODO_ERIN there might be some problem with the joint edges in Joint. + _this.m_bodyC = _this.m_joint1.getBodyA(); + _this.m_bodyA = _this.m_joint1.getBodyB(); + // Get geometry of joint1 + var xfA = _this.m_bodyA.m_xf; + var aA = _this.m_bodyA.m_sweep.a; + var xfC = _this.m_bodyC.m_xf; + var aC = _this.m_bodyC.m_sweep.a; + if (_this.m_type1 === RevoluteJoint.TYPE) { + var revolute = _this.m_joint1; + _this.m_localAnchorC = revolute.m_localAnchorA; + _this.m_localAnchorA = revolute.m_localAnchorB; + _this.m_referenceAngleA = revolute.m_referenceAngle; + _this.m_localAxisC = Vec2.zero(); + coordinateA = aA - aC - _this.m_referenceAngleA; + } + else { + var prismatic = _this.m_joint1; + _this.m_localAnchorC = prismatic.m_localAnchorA; + _this.m_localAnchorA = prismatic.m_localAnchorB; + _this.m_referenceAngleA = prismatic.m_referenceAngle; + _this.m_localAxisC = prismatic.m_localXAxisA; + var pC = _this.m_localAnchorC; + var pA = Rot.mulTVec2(xfC.q, Vec2.add(Rot.mulVec2(xfA.q, _this.m_localAnchorA), Vec2.sub(xfA.p, xfC.p))); + coordinateA = Vec2.dot(pA, _this.m_localAxisC) - Vec2.dot(pC, _this.m_localAxisC); + } + _this.m_bodyD = _this.m_joint2.getBodyA(); + _this.m_bodyB = _this.m_joint2.getBodyB(); + // Get geometry of joint2 + var xfB = _this.m_bodyB.m_xf; + var aB = _this.m_bodyB.m_sweep.a; + var xfD = _this.m_bodyD.m_xf; + var aD = _this.m_bodyD.m_sweep.a; + if (_this.m_type2 === RevoluteJoint.TYPE) { + var revolute = _this.m_joint2; + _this.m_localAnchorD = revolute.m_localAnchorA; + _this.m_localAnchorB = revolute.m_localAnchorB; + _this.m_referenceAngleB = revolute.m_referenceAngle; + _this.m_localAxisD = Vec2.zero(); + coordinateB = aB - aD - _this.m_referenceAngleB; + } + else { + var prismatic = _this.m_joint2; + _this.m_localAnchorD = prismatic.m_localAnchorA; + _this.m_localAnchorB = prismatic.m_localAnchorB; + _this.m_referenceAngleB = prismatic.m_referenceAngle; + _this.m_localAxisD = prismatic.m_localXAxisA; + var pD = _this.m_localAnchorD; + var pB = Rot.mulTVec2(xfD.q, Vec2.add(Rot.mulVec2(xfB.q, _this.m_localAnchorB), Vec2.sub(xfB.p, xfD.p))); + coordinateB = Vec2.dot(pB, _this.m_localAxisD) - Vec2.dot(pD, _this.m_localAxisD); + } + _this.m_constant = coordinateA + _this.m_ratio * coordinateB; + _this.m_impulse = 0.0; + return _this; + // Gear Joint: + // C0 = (coordinate1 + ratio * coordinate2)_initial + // C = (coordinate1 + ratio * coordinate2) - C0 = 0 + // J = [J1 ratio * J2] + // K = J * invM * JT + // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T + // + // Revolute: + // coordinate = rotation + // Cdot = angularVelocity + // J = [0 0 1] + // K = J * invM * JT = invI + // + // Prismatic: + // coordinate = dot(p - pg, ug) + // Cdot = dot(v + cross(w, r), ug) + // J = [ug cross(r, ug)] + // K = J * invM * JT = invMass + invI * cross(r, ug)^2 + } + /** @internal */ + GearJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + joint1: this.m_joint1, + joint2: this.m_joint2, + ratio: this.m_ratio, + // _constant: this.m_constant, }; - /** - * Is the joint motor enabled? - */ - PrismaticJoint.prototype.isMotorEnabled = function () { - return this.m_enableMotor; - }; - /** - * Enable/disable the joint motor. - */ - PrismaticJoint.prototype.enableMotor = function (flag) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_enableMotor = flag; + }; + /** @internal */ + GearJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + data.joint1 = restore(Joint, data.joint1, world); + data.joint2 = restore(Joint, data.joint2, world); + var joint = new GearJoint(data); + // if (data._constant) joint.m_constant = data._constant; + return joint; + }; + /** + * Get the first joint. + */ + GearJoint.prototype.getJoint1 = function () { + return this.m_joint1; + }; + /** + * Get the second joint. + */ + GearJoint.prototype.getJoint2 = function () { + return this.m_joint2; + }; + /** + * Set the gear ratio. + */ + GearJoint.prototype.setRatio = function (ratio) { + this.m_ratio = ratio; + }; + /** + * Get the gear ratio. + */ + GearJoint.prototype.getRatio = function () { + return this.m_ratio; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + GearJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + GearJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + GearJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(this.m_impulse, this.m_JvAC).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + GearJoint.prototype.getReactionTorque = function (inv_dt) { + var L = this.m_impulse * this.m_JwA; // float + return inv_dt * L; + }; + GearJoint.prototype.initVelocityConstraints = function (step) { + this.m_lcA = this.m_bodyA.m_sweep.localCenter; + this.m_lcB = this.m_bodyB.m_sweep.localCenter; + this.m_lcC = this.m_bodyC.m_sweep.localCenter; + this.m_lcD = this.m_bodyD.m_sweep.localCenter; + this.m_mA = this.m_bodyA.m_invMass; + this.m_mB = this.m_bodyB.m_invMass; + this.m_mC = this.m_bodyC.m_invMass; + this.m_mD = this.m_bodyD.m_invMass; + this.m_iA = this.m_bodyA.m_invI; + this.m_iB = this.m_bodyB.m_invI; + this.m_iC = this.m_bodyC.m_invI; + this.m_iD = this.m_bodyD.m_invI; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var aC = this.m_bodyC.c_position.a; + var vC = this.m_bodyC.c_velocity.v; + var wC = this.m_bodyC.c_velocity.w; + var aD = this.m_bodyD.c_position.a; + var vD = this.m_bodyD.c_velocity.v; + var wD = this.m_bodyD.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var qC = Rot.neo(aC); + var qD = Rot.neo(aD); + this.m_mass = 0.0; + if (this.m_type1 == RevoluteJoint.TYPE) { + this.m_JvAC = Vec2.zero(); + this.m_JwA = 1.0; + this.m_JwC = 1.0; + this.m_mass += this.m_iA + this.m_iC; + } + else { + var u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2 + var rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2 + var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2 + this.m_JvAC = u; + this.m_JwC = Vec2.crossVec2Vec2(rC, u); + this.m_JwA = Vec2.crossVec2Vec2(rA, u); + this.m_mass += this.m_mC + this.m_mA + this.m_iC * this.m_JwC * this.m_JwC + this.m_iA * this.m_JwA * this.m_JwA; + } + if (this.m_type2 == RevoluteJoint.TYPE) { + this.m_JvBD = Vec2.zero(); + this.m_JwB = this.m_ratio; + this.m_JwD = this.m_ratio; + this.m_mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD); + } + else { + var u = Rot.mulVec2(qD, this.m_localAxisD); // Vec2 + var rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); // Vec2 + var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); // Vec2 + this.m_JvBD = Vec2.mulNumVec2(this.m_ratio, u); + this.m_JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u); + this.m_JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u); + this.m_mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD * this.m_JwD * this.m_JwD + this.m_iB * this.m_JwB * this.m_JwB; + } + // Compute effective mass. + this.m_mass = this.m_mass > 0.0 ? 1.0 / this.m_mass : 0.0; + if (step.warmStarting) { + vA.addMul(this.m_mA * this.m_impulse, this.m_JvAC); + wA += this.m_iA * this.m_impulse * this.m_JwA; + vB.addMul(this.m_mB * this.m_impulse, this.m_JvBD); + wB += this.m_iB * this.m_impulse * this.m_JwB; + vC.subMul(this.m_mC * this.m_impulse, this.m_JvAC); + wC -= this.m_iC * this.m_impulse * this.m_JwC; + vD.subMul(this.m_mD * this.m_impulse, this.m_JvBD); + wD -= this.m_iD * this.m_impulse * this.m_JwD; + } + else { + this.m_impulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + this.m_bodyC.c_velocity.v.setVec2(vC); + this.m_bodyC.c_velocity.w = wC; + this.m_bodyD.c_velocity.v.setVec2(vD); + this.m_bodyD.c_velocity.w = wD; + }; + GearJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var vC = this.m_bodyC.c_velocity.v; + var wC = this.m_bodyC.c_velocity.w; + var vD = this.m_bodyD.c_velocity.v; + var wD = this.m_bodyD.c_velocity.w; + var Cdot = Vec2.dot(this.m_JvAC, vA) - Vec2.dot(this.m_JvAC, vC) + + Vec2.dot(this.m_JvBD, vB) - Vec2.dot(this.m_JvBD, vD); // float + Cdot += (this.m_JwA * wA - this.m_JwC * wC) + + (this.m_JwB * wB - this.m_JwD * wD); + var impulse = -this.m_mass * Cdot; // float + this.m_impulse += impulse; + vA.addMul(this.m_mA * impulse, this.m_JvAC); + wA += this.m_iA * impulse * this.m_JwA; + vB.addMul(this.m_mB * impulse, this.m_JvBD); + wB += this.m_iB * impulse * this.m_JwB; + vC.subMul(this.m_mC * impulse, this.m_JvAC); + wC -= this.m_iC * impulse * this.m_JwC; + vD.subMul(this.m_mD * impulse, this.m_JvBD); + wD -= this.m_iD * impulse * this.m_JwD; + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + this.m_bodyC.c_velocity.v.setVec2(vC); + this.m_bodyC.c_velocity.w = wC; + this.m_bodyD.c_velocity.v.setVec2(vD); + this.m_bodyD.c_velocity.w = wD; + }; + /** + * This returns true if the position errors are within tolerance. + */ + GearJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var cC = this.m_bodyC.c_position.c; + var aC = this.m_bodyC.c_position.a; + var cD = this.m_bodyD.c_position.c; + var aD = this.m_bodyD.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var qC = Rot.neo(aC); + var qD = Rot.neo(aD); + var linearError = 0.0; + var coordinateA; + var coordinateB; + var JvAC; + var JvBD; + var JwA; + var JwB; + var JwC; + var JwD; + var mass = 0.0; + if (this.m_type1 == RevoluteJoint.TYPE) { + JvAC = Vec2.zero(); + JwA = 1.0; + JwC = 1.0; + mass += this.m_iA + this.m_iC; + coordinateA = aA - aC - this.m_referenceAngleA; + } + else { + var u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2 + var rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2 + var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2 + JvAC = u; + JwC = Vec2.crossVec2Vec2(rC, u); + JwA = Vec2.crossVec2Vec2(rA, u); + mass += this.m_mC + this.m_mA + this.m_iC * JwC * JwC + this.m_iA * JwA * JwA; + var pC = Vec2.sub(this.m_localAnchorC, this.m_lcC); // Vec2 + var pA = Rot.mulTVec2(qC, Vec2.add(rA, Vec2.sub(cA, cC))); // Vec2 + coordinateA = Vec2.dot(Vec2.sub(pA, pC), this.m_localAxisC); + } + if (this.m_type2 == RevoluteJoint.TYPE) { + JvBD = Vec2.zero(); + JwB = this.m_ratio; + JwD = this.m_ratio; + mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD); + coordinateB = aB - aD - this.m_referenceAngleB; + } + else { + var u = Rot.mulVec2(qD, this.m_localAxisD); + var rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); + var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); + JvBD = Vec2.mulNumVec2(this.m_ratio, u); + JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u); + JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u); + mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD + * JwD * JwD + this.m_iB * JwB * JwB; + var pD = Vec2.sub(this.m_localAnchorD, this.m_lcD); // Vec2 + var pB = Rot.mulTVec2(qD, Vec2.add(rB, Vec2.sub(cB, cD))); // Vec2 + coordinateB = Vec2.dot(pB, this.m_localAxisD) + - Vec2.dot(pD, this.m_localAxisD); + } + var C = (coordinateA + this.m_ratio * coordinateB) - this.m_constant; // float + var impulse = 0.0; // float + if (mass > 0.0) { + impulse = -C / mass; + } + cA.addMul(this.m_mA * impulse, JvAC); + aA += this.m_iA * impulse * JwA; + cB.addMul(this.m_mB * impulse, JvBD); + aB += this.m_iB * impulse * JwB; + cC.subMul(this.m_mC * impulse, JvAC); + aC -= this.m_iC * impulse * JwC; + cD.subMul(this.m_mD * impulse, JvBD); + aD -= this.m_iD * impulse * JwD; + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + this.m_bodyC.c_position.c.setVec2(cC); + this.m_bodyC.c_position.a = aC; + this.m_bodyD.c_position.c.setVec2(cD); + this.m_bodyD.c_position.a = aD; + // TODO_ERIN not implemented + return linearError < Settings.linearSlop; + }; + GearJoint.TYPE = 'gear-joint'; + return GearJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$5 = { + maxForce: 1.0, + maxTorque: 1.0, + correctionFactor: 0.3 +}; +/** + * A motor joint is used to control the relative motion between two bodies. A + * typical usage is to control the movement of a dynamic body with respect to + * the ground. + */ +var MotorJoint = /** @class */ (function (_super) { + __extends(MotorJoint, _super); + function MotorJoint(def, bodyA, bodyB) { + var _this = this; + // @ts-ignore + if (!(_this instanceof MotorJoint)) { + return new MotorJoint(def, bodyA, bodyB); + } + def = options(def, DEFAULTS$5); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = MotorJoint.TYPE; + _this.m_linearOffset = math.isFinite(def.linearOffset) ? def.linearOffset : bodyA.getLocalPoint(bodyB.getPosition()); + _this.m_angularOffset = math.isFinite(def.angularOffset) ? def.angularOffset : bodyB.getAngle() - bodyA.getAngle(); + _this.m_linearImpulse = Vec2.zero(); + _this.m_angularImpulse = 0.0; + _this.m_maxForce = def.maxForce; + _this.m_maxTorque = def.maxTorque; + _this.m_correctionFactor = def.correctionFactor; + return _this; + // Point-to-point constraint + // Cdot = v2 - v1 + // = v2 + cross(w2, r2) - v1 - cross(w1, r1) + // J = [-I -r1_skew I r2_skew ] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + // Angle constraint + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // K = invI1 + invI2 + } + /** @internal */ + MotorJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + maxForce: this.m_maxForce, + maxTorque: this.m_maxTorque, + correctionFactor: this.m_correctionFactor, + linearOffset: this.m_linearOffset, + angularOffset: this.m_angularOffset, }; - /** - * Set the motor speed, usually in meters per second. - */ - PrismaticJoint.prototype.setMotorSpeed = function (speed) { + }; + /** @internal */ + MotorJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new MotorJoint(data); + return joint; + }; + /** @internal */ + MotorJoint.prototype._setAnchors = function (def) { + }; + /** + * Set the maximum friction force in N. + */ + MotorJoint.prototype.setMaxForce = function (force) { + this.m_maxForce = force; + }; + /** + * Get the maximum friction force in N. + */ + MotorJoint.prototype.getMaxForce = function () { + return this.m_maxForce; + }; + /** + * Set the maximum friction torque in N*m. + */ + MotorJoint.prototype.setMaxTorque = function (torque) { + this.m_maxTorque = torque; + }; + /** + * Get the maximum friction torque in N*m. + */ + MotorJoint.prototype.getMaxTorque = function () { + return this.m_maxTorque; + }; + /** + * Set the position correction factor in the range [0,1]. + */ + MotorJoint.prototype.setCorrectionFactor = function (factor) { + this.m_correctionFactor = factor; + }; + /** + * Get the position correction factor in the range [0,1]. + */ + MotorJoint.prototype.getCorrectionFactor = function () { + return this.m_correctionFactor; + }; + /** + * Set/get the target linear offset, in frame A, in meters. + */ + MotorJoint.prototype.setLinearOffset = function (linearOffset) { + if (linearOffset.x != this.m_linearOffset.x + || linearOffset.y != this.m_linearOffset.y) { this.m_bodyA.setAwake(true); this.m_bodyB.setAwake(true); - this.m_motorSpeed = speed; - }; - /** - * Set the maximum motor force, usually in N. - */ - PrismaticJoint.prototype.setMaxMotorForce = function (force) { + this.m_linearOffset = linearOffset; + } + }; + MotorJoint.prototype.getLinearOffset = function () { + return this.m_linearOffset; + }; + /** + * Set/get the target angular offset, in radians. + */ + MotorJoint.prototype.setAngularOffset = function (angularOffset) { + if (angularOffset != this.m_angularOffset) { this.m_bodyA.setAwake(true); this.m_bodyB.setAwake(true); - this.m_maxMotorForce = force; - }; - PrismaticJoint.prototype.getMaxMotorForce = function () { - return this.m_maxMotorForce; - }; - /** - * Get the motor speed, usually in meters per second. - */ - PrismaticJoint.prototype.getMotorSpeed = function () { - return this.m_motorSpeed; - }; - /** - * Get the current motor force given the inverse time step, usually in N. - */ - PrismaticJoint.prototype.getMotorForce = function (inv_dt) { - return inv_dt * this.m_motorImpulse; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - PrismaticJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - PrismaticJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - PrismaticJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + this.m_impulse.z, this.m_axis).mul(inv_dt); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - PrismaticJoint.prototype.getReactionTorque = function (inv_dt) { - return inv_dt * this.m_impulse.y; - }; - PrismaticJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - // Compute the effective masses. - var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - var d = Vec2.zero(); - d.addCombine(1, cB, 1, rB); - d.subCombine(1, cA, 1, rA); - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - // Compute motor Jacobian and effective mass. - { - this.m_axis = Rot.mulVec2(qA, this.m_localXAxisA); - this.m_a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_axis); - this.m_a2 = Vec2.crossVec2Vec2(rB, this.m_axis); - this.m_motorMass = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 - * this.m_a2; - if (this.m_motorMass > 0.0) { - this.m_motorMass = 1.0 / this.m_motorMass; - } - } - // Prismatic constraint. - { - this.m_perp = Rot.mulVec2(qA, this.m_localYAxisA); - this.m_s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_perp); - this.m_s2 = Vec2.crossVec2Vec2(rB, this.m_perp); - Vec2.crossVec2Vec2(rA, this.m_perp); - var k11 = mA + mB + iA * this.m_s1 * this.m_s1 + iB * this.m_s2 * this.m_s2; - var k12 = iA * this.m_s1 + iB * this.m_s2; - var k13 = iA * this.m_s1 * this.m_a1 + iB * this.m_s2 * this.m_a2; - var k22 = iA + iB; - if (k22 == 0.0) { - // For bodies with fixed rotation. - k22 = 1.0; - } - var k23 = iA * this.m_a1 + iB * this.m_a2; - var k33 = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 * this.m_a2; - this.m_K.ex.set(k11, k12, k13); - this.m_K.ey.set(k12, k22, k23); - this.m_K.ez.set(k13, k23, k33); - } - // Compute motor and limit terms. - if (this.m_enableLimit) { - var jointTranslation = Vec2.dot(this.m_axis, d); // float - if (math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * Settings.linearSlop) { - this.m_limitState = equalLimits; - } - else if (jointTranslation <= this.m_lowerTranslation) { - if (this.m_limitState != atLowerLimit) { - this.m_limitState = atLowerLimit; - this.m_impulse.z = 0.0; - } - } - else if (jointTranslation >= this.m_upperTranslation) { - if (this.m_limitState != atUpperLimit$1) { - this.m_limitState = atUpperLimit$1; - this.m_impulse.z = 0.0; - } - } - else { - this.m_limitState = inactiveLimit$1; - this.m_impulse.z = 0.0; - } - } - else { - this.m_limitState = inactiveLimit$1; - this.m_impulse.z = 0.0; - } - if (this.m_enableMotor == false) { - this.m_motorImpulse = 0.0; - } - if (step.warmStarting) { - // Account for variable time step. - this.m_impulse.mul(step.dtRatio); - this.m_motorImpulse *= step.dtRatio; - var P = Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse - + this.m_impulse.z, this.m_axis); - var LA = this.m_impulse.x * this.m_s1 + this.m_impulse.y - + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1; - var LB = this.m_impulse.x * this.m_s2 + this.m_impulse.y - + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2; - vA.subMul(mA, P); - wA -= iA * LA; - vB.addMul(mB, P); - wB += iB * LB; - } - else { - this.m_impulse.setZero(); - this.m_motorImpulse = 0.0; - } - this.m_bodyA.c_velocity.v.setVec2(vA); - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v.setVec2(vB); - this.m_bodyB.c_velocity.w = wB; - }; - PrismaticJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - // Solve linear motor constraint. - if (this.m_enableMotor && this.m_limitState != equalLimits) { - var Cdot = Vec2.dot(this.m_axis, Vec2.sub(vB, vA)) + this.m_a2 * wB - - this.m_a1 * wA; - var impulse = this.m_motorMass * (this.m_motorSpeed - Cdot); - var oldImpulse = this.m_motorImpulse; - var maxImpulse = step.dt * this.m_maxMotorForce; - this.m_motorImpulse = math.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); - impulse = this.m_motorImpulse - oldImpulse; - var P = Vec2.mulNumVec2(impulse, this.m_axis); - var LA = impulse * this.m_a1; - var LB = impulse * this.m_a2; - vA.subMul(mA, P); - wA -= iA * LA; - vB.addMul(mB, P); - wB += iB * LB; - } - var Cdot1 = Vec2.zero(); - Cdot1.x += Vec2.dot(this.m_perp, vB) + this.m_s2 * wB; - Cdot1.x -= Vec2.dot(this.m_perp, vA) + this.m_s1 * wA; - Cdot1.y = wB - wA; - if (this.m_enableLimit && this.m_limitState != inactiveLimit$1) { - // Solve prismatic and limit constraint in block form. - var Cdot2 = 0; - Cdot2 += Vec2.dot(this.m_axis, vB) + this.m_a2 * wB; - Cdot2 -= Vec2.dot(this.m_axis, vA) + this.m_a1 * wA; - var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); - var f1 = Vec3.clone(this.m_impulse); - var df = this.m_K.solve33(Vec3.neg(Cdot)); // Vec3 - this.m_impulse.add(df); - if (this.m_limitState == atLowerLimit) { - this.m_impulse.z = math.max(this.m_impulse.z, 0.0); - } - else if (this.m_limitState == atUpperLimit$1) { - this.m_impulse.z = math.min(this.m_impulse.z, 0.0); - } - // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + - // f1(1:2) - var b = Vec2.combine(-1, Cdot1, -(this.m_impulse.z - f1.z), Vec2.neo(this.m_K.ez.x, this.m_K.ez.y)); // Vec2 - var f2r = Vec2.add(this.m_K.solve22(b), Vec2.neo(f1.x, f1.y)); // Vec2 - this.m_impulse.x = f2r.x; - this.m_impulse.y = f2r.y; - df = Vec3.sub(this.m_impulse, f1); - var P = Vec2.combine(df.x, this.m_perp, df.z, this.m_axis); // Vec2 - var LA = df.x * this.m_s1 + df.y + df.z * this.m_a1; // float - var LB = df.x * this.m_s2 + df.y + df.z * this.m_a2; // float - vA.subMul(mA, P); - wA -= iA * LA; - vB.addMul(mB, P); - wB += iB * LB; - } - else { - // Limit is inactive, just solve the prismatic constraint in block form. - var df = this.m_K.solve22(Vec2.neg(Cdot1)); // Vec2 - this.m_impulse.x += df.x; - this.m_impulse.y += df.y; - var P = Vec2.mulNumVec2(df.x, this.m_perp); // Vec2 - var LA = df.x * this.m_s1 + df.y; // float - var LB = df.x * this.m_s2 + df.y; // float - vA.subMul(mA, P); - wA -= iA * LA; - vB.addMul(mB, P); - wB += iB * LB; - } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - PrismaticJoint.prototype.solvePositionConstraints = function (step) { - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - // Compute fresh Jacobians - var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2 - var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2 - var d = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); // Vec2 - var axis = Rot.mulVec2(qA, this.m_localXAxisA); // Vec2 - var a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), axis); // float - var a2 = Vec2.crossVec2Vec2(rB, axis); // float - var perp = Rot.mulVec2(qA, this.m_localYAxisA); // Vec2 - var s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), perp); // float - var s2 = Vec2.crossVec2Vec2(rB, perp); // float - var impulse = new Vec3(); - var C1 = Vec2.zero(); // Vec2 - C1.x = Vec2.dot(perp, d); - C1.y = aB - aA - this.m_referenceAngle; - var linearError = math.abs(C1.x); // float - var angularError = math.abs(C1.y); // float - var linearSlop = Settings.linearSlop; - var maxLinearCorrection = Settings.maxLinearCorrection; - var active = false; // bool - var C2 = 0.0; // float - if (this.m_enableLimit) { - var translation = Vec2.dot(axis, d); // float - if (math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * linearSlop) { - // Prevent large angular corrections - C2 = math.clamp(translation, -maxLinearCorrection, maxLinearCorrection); - linearError = math.max(linearError, math.abs(translation)); - active = true; - } - else if (translation <= this.m_lowerTranslation) { - // Prevent large linear corrections and allow some slop. - C2 = math.clamp(translation - this.m_lowerTranslation + linearSlop, -maxLinearCorrection, 0.0); - linearError = math - .max(linearError, this.m_lowerTranslation - translation); - active = true; - } - else if (translation >= this.m_upperTranslation) { - // Prevent large linear corrections and allow some slop. - C2 = math.clamp(translation - this.m_upperTranslation - linearSlop, 0.0, maxLinearCorrection); - linearError = math - .max(linearError, translation - this.m_upperTranslation); - active = true; - } - } - if (active) { - var k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float - var k12 = iA * s1 + iB * s2; // float - var k13 = iA * s1 * a1 + iB * s2 * a2; // float - var k22 = iA + iB; // float - if (k22 == 0.0) { - // For fixed rotation - k22 = 1.0; - } - var k23 = iA * a1 + iB * a2; // float - var k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; // float - var K = new Mat33(); - K.ex.set(k11, k12, k13); - K.ey.set(k12, k22, k23); - K.ez.set(k13, k23, k33); - var C = new Vec3(); - C.x = C1.x; - C.y = C1.y; - C.z = C2; - impulse = K.solve33(Vec3.neg(C)); - } - else { - var k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float - var k12 = iA * s1 + iB * s2; // float - var k22 = iA + iB; // float - if (k22 == 0.0) { - k22 = 1.0; - } - var K = new Mat22(); - K.ex.setNum(k11, k12); - K.ey.setNum(k12, k22); - var impulse1 = K.solve(Vec2.neg(C1)); // Vec2 - impulse.x = impulse1.x; - impulse.y = impulse1.y; - impulse.z = 0.0; - } - var P = Vec2.combine(impulse.x, perp, impulse.z, axis); // Vec2 - var LA = impulse.x * s1 + impulse.y + impulse.z * a1; // float - var LB = impulse.x * s2 + impulse.y + impulse.z * a2; // float - cA.subMul(mA, P); - aA -= iA * LA; - cB.addMul(mB, P); - aB += iB * LB; - this.m_bodyA.c_position.c = cA; - this.m_bodyA.c_position.a = aA; - this.m_bodyB.c_position.c = cB; - this.m_bodyB.c_position.a = aB; - return linearError <= Settings.linearSlop - && angularError <= Settings.angularSlop; - }; - PrismaticJoint.TYPE = 'prismatic-joint'; - return PrismaticJoint; - }(Joint)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + this.m_angularOffset = angularOffset; + } + }; + MotorJoint.prototype.getAngularOffset = function () { + return this.m_angularOffset; + }; + /** + * Get the anchor point on bodyA in world coordinates. */ - var DEFAULTS$6 = { - ratio: 1.0 + MotorJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getPosition(); }; /** - * A gear joint is used to connect two joints together. Either joint can be a - * revolute or prismatic joint. You specify a gear ratio to bind the motions - * together: coordinate1 + ratio * coordinate2 = constant - * - * The ratio can be negative or positive. If one joint is a revolute joint and - * the other joint is a prismatic joint, then the ratio will have units of - * length or units of 1/length. Warning: You have to manually destroy the gear - * joint if joint1 or joint2 is destroyed. - * - * This definition requires two existing revolute or prismatic joints (any - * combination will work). + * Get the anchor point on bodyB in world coordinates. */ - var GearJoint = /** @class */ (function (_super) { - __extends(GearJoint, _super); - function GearJoint(def, bodyA, bodyB, joint1, joint2, ratio) { - var _this = this; - // @ts-ignore - if (!(_this instanceof GearJoint)) { - return new GearJoint(def, bodyA, bodyB, joint1, joint2, ratio); - } - def = options(def, DEFAULTS$6); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = GearJoint.TYPE; - _this.m_joint1 = joint1 ? joint1 : def.joint1; - _this.m_joint2 = joint2 ? joint2 : def.joint2; - _this.m_ratio = math.isFinite(ratio) ? ratio : def.ratio; - _this.m_type1 = _this.m_joint1.getType(); - _this.m_type2 = _this.m_joint2.getType(); - // joint1 connects body A to body C - // joint2 connects body B to body D - var coordinateA; - var coordinateB; - // TODO_ERIN there might be some problem with the joint edges in Joint. - _this.m_bodyC = _this.m_joint1.getBodyA(); - _this.m_bodyA = _this.m_joint1.getBodyB(); - // Get geometry of joint1 - var xfA = _this.m_bodyA.m_xf; - var aA = _this.m_bodyA.m_sweep.a; - var xfC = _this.m_bodyC.m_xf; - var aC = _this.m_bodyC.m_sweep.a; - if (_this.m_type1 === RevoluteJoint.TYPE) { - var revolute = _this.m_joint1; - _this.m_localAnchorC = revolute.m_localAnchorA; - _this.m_localAnchorA = revolute.m_localAnchorB; - _this.m_referenceAngleA = revolute.m_referenceAngle; - _this.m_localAxisC = Vec2.zero(); - coordinateA = aA - aC - _this.m_referenceAngleA; - } - else { - var prismatic = _this.m_joint1; - _this.m_localAnchorC = prismatic.m_localAnchorA; - _this.m_localAnchorA = prismatic.m_localAnchorB; - _this.m_referenceAngleA = prismatic.m_referenceAngle; - _this.m_localAxisC = prismatic.m_localXAxisA; - var pC = _this.m_localAnchorC; - var pA = Rot.mulTVec2(xfC.q, Vec2.add(Rot.mulVec2(xfA.q, _this.m_localAnchorA), Vec2.sub(xfA.p, xfC.p))); - coordinateA = Vec2.dot(pA, _this.m_localAxisC) - Vec2.dot(pC, _this.m_localAxisC); - } - _this.m_bodyD = _this.m_joint2.getBodyA(); - _this.m_bodyB = _this.m_joint2.getBodyB(); - // Get geometry of joint2 - var xfB = _this.m_bodyB.m_xf; - var aB = _this.m_bodyB.m_sweep.a; - var xfD = _this.m_bodyD.m_xf; - var aD = _this.m_bodyD.m_sweep.a; - if (_this.m_type2 === RevoluteJoint.TYPE) { - var revolute = _this.m_joint2; - _this.m_localAnchorD = revolute.m_localAnchorA; - _this.m_localAnchorB = revolute.m_localAnchorB; - _this.m_referenceAngleB = revolute.m_referenceAngle; - _this.m_localAxisD = Vec2.zero(); - coordinateB = aB - aD - _this.m_referenceAngleB; - } - else { - var prismatic = _this.m_joint2; - _this.m_localAnchorD = prismatic.m_localAnchorA; - _this.m_localAnchorB = prismatic.m_localAnchorB; - _this.m_referenceAngleB = prismatic.m_referenceAngle; - _this.m_localAxisD = prismatic.m_localXAxisA; - var pD = _this.m_localAnchorD; - var pB = Rot.mulTVec2(xfD.q, Vec2.add(Rot.mulVec2(xfB.q, _this.m_localAnchorB), Vec2.sub(xfB.p, xfD.p))); - coordinateB = Vec2.dot(pB, _this.m_localAxisD) - Vec2.dot(pD, _this.m_localAxisD); - } - _this.m_constant = coordinateA + _this.m_ratio * coordinateB; - _this.m_impulse = 0.0; - return _this; - // Gear Joint: - // C0 = (coordinate1 + ratio * coordinate2)_initial - // C = (coordinate1 + ratio * coordinate2) - C0 = 0 - // J = [J1 ratio * J2] - // K = J * invM * JT - // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T - // - // Revolute: - // coordinate = rotation - // Cdot = angularVelocity - // J = [0 0 1] - // K = J * invM * JT = invI - // - // Prismatic: - // coordinate = dot(p - pg, ug) - // Cdot = dot(v + cross(w, r), ug) - // J = [ug cross(r, ug)] - // K = J * invM * JT = invMass + invI * cross(r, ug)^2 + MotorJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getPosition(); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + MotorJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + MotorJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_angularImpulse; + }; + MotorJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + // Compute the effective mass matrix. + this.m_rA = Rot.mulVec2(qA, Vec2.neg(this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.neg(this.m_localCenterB)); + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var K = new Mat22(); + K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y * this.m_rB.y; + K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y; + K.ey.x = K.ex.y; + K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x * this.m_rB.x; + this.m_linearMass = K.getInverse(); + this.m_angularMass = iA + iB; + if (this.m_angularMass > 0.0) { + this.m_angularMass = 1.0 / this.m_angularMass; } - /** @internal */ - GearJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - joint1: this.m_joint1, - joint2: this.m_joint2, - ratio: this.m_ratio, - // _constant: this.m_constant, - }; - }; - /** @internal */ - GearJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - data.joint1 = restore(Joint, data.joint1, world); - data.joint2 = restore(Joint, data.joint2, world); - var joint = new GearJoint(data); - // if (data._constant) joint.m_constant = data._constant; - return joint; - }; - /** - * Get the first joint. - */ - GearJoint.prototype.getJoint1 = function () { - return this.m_joint1; - }; - /** - * Get the second joint. - */ - GearJoint.prototype.getJoint2 = function () { - return this.m_joint2; - }; - /** - * Set the gear ratio. - */ - GearJoint.prototype.setRatio = function (ratio) { - this.m_ratio = ratio; - }; - /** - * Get the gear ratio. - */ - GearJoint.prototype.getRatio = function () { - return this.m_ratio; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - GearJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - GearJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - GearJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.mulNumVec2(this.m_impulse, this.m_JvAC).mul(inv_dt); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - GearJoint.prototype.getReactionTorque = function (inv_dt) { - var L = this.m_impulse * this.m_JwA; // float - return inv_dt * L; - }; - GearJoint.prototype.initVelocityConstraints = function (step) { - this.m_lcA = this.m_bodyA.m_sweep.localCenter; - this.m_lcB = this.m_bodyB.m_sweep.localCenter; - this.m_lcC = this.m_bodyC.m_sweep.localCenter; - this.m_lcD = this.m_bodyD.m_sweep.localCenter; - this.m_mA = this.m_bodyA.m_invMass; - this.m_mB = this.m_bodyB.m_invMass; - this.m_mC = this.m_bodyC.m_invMass; - this.m_mD = this.m_bodyD.m_invMass; - this.m_iA = this.m_bodyA.m_invI; - this.m_iB = this.m_bodyB.m_invI; - this.m_iC = this.m_bodyC.m_invI; - this.m_iD = this.m_bodyD.m_invI; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var aC = this.m_bodyC.c_position.a; - var vC = this.m_bodyC.c_velocity.v; - var wC = this.m_bodyC.c_velocity.w; - var aD = this.m_bodyD.c_position.a; - var vD = this.m_bodyD.c_velocity.v; - var wD = this.m_bodyD.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var qC = Rot.neo(aC); - var qD = Rot.neo(aD); - this.m_mass = 0.0; - if (this.m_type1 == RevoluteJoint.TYPE) { - this.m_JvAC = Vec2.zero(); - this.m_JwA = 1.0; - this.m_JwC = 1.0; - this.m_mass += this.m_iA + this.m_iC; - } - else { - var u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2 - var rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2 - var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2 - this.m_JvAC = u; - this.m_JwC = Vec2.crossVec2Vec2(rC, u); - this.m_JwA = Vec2.crossVec2Vec2(rA, u); - this.m_mass += this.m_mC + this.m_mA + this.m_iC * this.m_JwC * this.m_JwC + this.m_iA * this.m_JwA * this.m_JwA; - } - if (this.m_type2 == RevoluteJoint.TYPE) { - this.m_JvBD = Vec2.zero(); - this.m_JwB = this.m_ratio; - this.m_JwD = this.m_ratio; - this.m_mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD); - } - else { - var u = Rot.mulVec2(qD, this.m_localAxisD); // Vec2 - var rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); // Vec2 - var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); // Vec2 - this.m_JvBD = Vec2.mulNumVec2(this.m_ratio, u); - this.m_JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u); - this.m_JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u); - this.m_mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD * this.m_JwD * this.m_JwD + this.m_iB * this.m_JwB * this.m_JwB; - } - // Compute effective mass. - this.m_mass = this.m_mass > 0.0 ? 1.0 / this.m_mass : 0.0; - if (step.warmStarting) { - vA.addMul(this.m_mA * this.m_impulse, this.m_JvAC); - wA += this.m_iA * this.m_impulse * this.m_JwA; - vB.addMul(this.m_mB * this.m_impulse, this.m_JvBD); - wB += this.m_iB * this.m_impulse * this.m_JwB; - vC.subMul(this.m_mC * this.m_impulse, this.m_JvAC); - wC -= this.m_iC * this.m_impulse * this.m_JwC; - vD.subMul(this.m_mD * this.m_impulse, this.m_JvBD); - wD -= this.m_iD * this.m_impulse * this.m_JwD; - } - else { - this.m_impulse = 0.0; - } - this.m_bodyA.c_velocity.v.setVec2(vA); - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v.setVec2(vB); - this.m_bodyB.c_velocity.w = wB; - this.m_bodyC.c_velocity.v.setVec2(vC); - this.m_bodyC.c_velocity.w = wC; - this.m_bodyD.c_velocity.v.setVec2(vD); - this.m_bodyD.c_velocity.w = wD; - }; - GearJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var vC = this.m_bodyC.c_velocity.v; - var wC = this.m_bodyC.c_velocity.w; - var vD = this.m_bodyD.c_velocity.v; - var wD = this.m_bodyD.c_velocity.w; - var Cdot = Vec2.dot(this.m_JvAC, vA) - Vec2.dot(this.m_JvAC, vC) - + Vec2.dot(this.m_JvBD, vB) - Vec2.dot(this.m_JvBD, vD); // float - Cdot += (this.m_JwA * wA - this.m_JwC * wC) - + (this.m_JwB * wB - this.m_JwD * wD); - var impulse = -this.m_mass * Cdot; // float - this.m_impulse += impulse; - vA.addMul(this.m_mA * impulse, this.m_JvAC); - wA += this.m_iA * impulse * this.m_JwA; - vB.addMul(this.m_mB * impulse, this.m_JvBD); - wB += this.m_iB * impulse * this.m_JwB; - vC.subMul(this.m_mC * impulse, this.m_JvAC); - wC -= this.m_iC * impulse * this.m_JwC; - vD.subMul(this.m_mD * impulse, this.m_JvBD); - wD -= this.m_iD * impulse * this.m_JwD; - this.m_bodyA.c_velocity.v.setVec2(vA); - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v.setVec2(vB); - this.m_bodyB.c_velocity.w = wB; - this.m_bodyC.c_velocity.v.setVec2(vC); - this.m_bodyC.c_velocity.w = wC; - this.m_bodyD.c_velocity.v.setVec2(vD); - this.m_bodyD.c_velocity.w = wD; - }; - /** - * This returns true if the position errors are within tolerance. - */ - GearJoint.prototype.solvePositionConstraints = function (step) { - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var cC = this.m_bodyC.c_position.c; - var aC = this.m_bodyC.c_position.a; - var cD = this.m_bodyD.c_position.c; - var aD = this.m_bodyD.c_position.a; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var qC = Rot.neo(aC); - var qD = Rot.neo(aD); - var linearError = 0.0; - var coordinateA; - var coordinateB; - var JvAC; - var JvBD; - var JwA; - var JwB; - var JwC; - var JwD; - var mass = 0.0; - if (this.m_type1 == RevoluteJoint.TYPE) { - JvAC = Vec2.zero(); - JwA = 1.0; - JwC = 1.0; - mass += this.m_iA + this.m_iC; - coordinateA = aA - aC - this.m_referenceAngleA; - } - else { - var u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2 - var rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2 - var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2 - JvAC = u; - JwC = Vec2.crossVec2Vec2(rC, u); - JwA = Vec2.crossVec2Vec2(rA, u); - mass += this.m_mC + this.m_mA + this.m_iC * JwC * JwC + this.m_iA * JwA * JwA; - var pC = Vec2.sub(this.m_localAnchorC, this.m_lcC); // Vec2 - var pA = Rot.mulTVec2(qC, Vec2.add(rA, Vec2.sub(cA, cC))); // Vec2 - coordinateA = Vec2.dot(Vec2.sub(pA, pC), this.m_localAxisC); - } - if (this.m_type2 == RevoluteJoint.TYPE) { - JvBD = Vec2.zero(); - JwB = this.m_ratio; - JwD = this.m_ratio; - mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD); - coordinateB = aB - aD - this.m_referenceAngleB; - } - else { - var u = Rot.mulVec2(qD, this.m_localAxisD); - var rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); - var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); - JvBD = Vec2.mulNumVec2(this.m_ratio, u); - JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u); - JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u); - mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD - * JwD * JwD + this.m_iB * JwB * JwB; - var pD = Vec2.sub(this.m_localAnchorD, this.m_lcD); // Vec2 - var pB = Rot.mulTVec2(qD, Vec2.add(rB, Vec2.sub(cB, cD))); // Vec2 - coordinateB = Vec2.dot(pB, this.m_localAxisD) - - Vec2.dot(pD, this.m_localAxisD); - } - var C = (coordinateA + this.m_ratio * coordinateB) - this.m_constant; // float - var impulse = 0.0; // float - if (mass > 0.0) { - impulse = -C / mass; - } - cA.addMul(this.m_mA * impulse, JvAC); - aA += this.m_iA * impulse * JwA; - cB.addMul(this.m_mB * impulse, JvBD); - aB += this.m_iB * impulse * JwB; - cC.subMul(this.m_mC * impulse, JvAC); - aC -= this.m_iC * impulse * JwC; - cD.subMul(this.m_mD * impulse, JvBD); - aD -= this.m_iD * impulse * JwD; - this.m_bodyA.c_position.c.setVec2(cA); - this.m_bodyA.c_position.a = aA; - this.m_bodyB.c_position.c.setVec2(cB); - this.m_bodyB.c_position.a = aB; - this.m_bodyC.c_position.c.setVec2(cC); - this.m_bodyC.c_position.a = aC; - this.m_bodyD.c_position.c.setVec2(cD); - this.m_bodyD.c_position.a = aD; - // TODO_ERIN not implemented - return linearError < Settings.linearSlop; - }; - GearJoint.TYPE = 'gear-joint'; - return GearJoint; - }(Joint)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var DEFAULTS$5 = { - maxForce: 1.0, - maxTorque: 1.0, - correctionFactor: 0.3 - }; - /** - * A motor joint is used to control the relative motion between two bodies. A - * typical usage is to control the movement of a dynamic body with respect to - * the ground. - */ - var MotorJoint = /** @class */ (function (_super) { - __extends(MotorJoint, _super); - function MotorJoint(def, bodyA, bodyB) { - var _this = this; - // @ts-ignore - if (!(_this instanceof MotorJoint)) { - return new MotorJoint(def, bodyA, bodyB); - } - def = options(def, DEFAULTS$5); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = MotorJoint.TYPE; - _this.m_linearOffset = math.isFinite(def.linearOffset) ? def.linearOffset : bodyA.getLocalPoint(bodyB.getPosition()); - _this.m_angularOffset = math.isFinite(def.angularOffset) ? def.angularOffset : bodyB.getAngle() - bodyA.getAngle(); - _this.m_linearImpulse = Vec2.zero(); - _this.m_angularImpulse = 0.0; - _this.m_maxForce = def.maxForce; - _this.m_maxTorque = def.maxTorque; - _this.m_correctionFactor = def.correctionFactor; - return _this; - // Point-to-point constraint - // Cdot = v2 - v1 - // = v2 + cross(w2, r2) - v1 - cross(w1, r1) - // J = [-I -r1_skew I r2_skew ] - // Identity used: - // w k % (rx i + ry j) = w * (-ry i + rx j) - // Angle constraint - // Cdot = w2 - w1 - // J = [0 0 -1 0 0 1] - // K = invI1 + invI2 + this.m_linearError = Vec2.zero(); + this.m_linearError.addCombine(1, cB, 1, this.m_rB); + this.m_linearError.subCombine(1, cA, 1, this.m_rA); + this.m_linearError.sub(Rot.mulVec2(qA, this.m_linearOffset)); + this.m_angularError = aB - aA - this.m_angularOffset; + if (step.warmStarting) { + // Scale impulses to support a variable time step. + this.m_linearImpulse.mul(step.dtRatio); + this.m_angularImpulse *= step.dtRatio; + var P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse); } - /** @internal */ - MotorJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - maxForce: this.m_maxForce, - maxTorque: this.m_maxTorque, - correctionFactor: this.m_correctionFactor, - linearOffset: this.m_linearOffset, - angularOffset: this.m_angularOffset, - }; - }; - /** @internal */ - MotorJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - var joint = new MotorJoint(data); - return joint; - }; - /** @internal */ - MotorJoint.prototype._setAnchors = function (def) { - }; - /** - * Set the maximum friction force in N. - */ - MotorJoint.prototype.setMaxForce = function (force) { - this.m_maxForce = force; - }; - /** - * Get the maximum friction force in N. - */ - MotorJoint.prototype.getMaxForce = function () { - return this.m_maxForce; - }; - /** - * Set the maximum friction torque in N*m. - */ - MotorJoint.prototype.setMaxTorque = function (torque) { - this.m_maxTorque = torque; - }; - /** - * Get the maximum friction torque in N*m. - */ - MotorJoint.prototype.getMaxTorque = function () { - return this.m_maxTorque; - }; - /** - * Set the position correction factor in the range [0,1]. - */ - MotorJoint.prototype.setCorrectionFactor = function (factor) { - this.m_correctionFactor = factor; - }; - /** - * Get the position correction factor in the range [0,1]. - */ - MotorJoint.prototype.getCorrectionFactor = function () { - return this.m_correctionFactor; - }; - /** - * Set/get the target linear offset, in frame A, in meters. - */ - MotorJoint.prototype.setLinearOffset = function (linearOffset) { - if (linearOffset.x != this.m_linearOffset.x - || linearOffset.y != this.m_linearOffset.y) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_linearOffset = linearOffset; - } - }; - MotorJoint.prototype.getLinearOffset = function () { - return this.m_linearOffset; - }; - /** - * Set/get the target angular offset, in radians. - */ - MotorJoint.prototype.setAngularOffset = function (angularOffset) { - if (angularOffset != this.m_angularOffset) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_angularOffset = angularOffset; - } - }; - MotorJoint.prototype.getAngularOffset = function () { - return this.m_angularOffset; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - MotorJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getPosition(); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - MotorJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getPosition(); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - MotorJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - MotorJoint.prototype.getReactionTorque = function (inv_dt) { - return inv_dt * this.m_angularImpulse; - }; - MotorJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - // Compute the effective mass matrix. - this.m_rA = Rot.mulVec2(qA, Vec2.neg(this.m_localCenterA)); - this.m_rB = Rot.mulVec2(qB, Vec2.neg(this.m_localCenterB)); - // J = [-I -r1_skew I r2_skew] - // [ 0 -1 0 1] - // r_skew = [-ry; rx] - // Matlab - // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] - // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] - // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - var K = new Mat22(); - K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y * this.m_rB.y; - K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y; - K.ey.x = K.ex.y; - K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x * this.m_rB.x; - this.m_linearMass = K.getInverse(); - this.m_angularMass = iA + iB; - if (this.m_angularMass > 0.0) { - this.m_angularMass = 1.0 / this.m_angularMass; - } - this.m_linearError = Vec2.zero(); - this.m_linearError.addCombine(1, cB, 1, this.m_rB); - this.m_linearError.subCombine(1, cA, 1, this.m_rA); - this.m_linearError.sub(Rot.mulVec2(qA, this.m_linearOffset)); - this.m_angularError = aB - aA - this.m_angularOffset; - if (step.warmStarting) { - // Scale impulses to support a variable time step. - this.m_linearImpulse.mul(step.dtRatio); - this.m_angularImpulse *= step.dtRatio; - var P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y); - vA.subMul(mA, P); - wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse); - vB.addMul(mB, P); - wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse); - } - else { - this.m_linearImpulse.setZero(); - this.m_angularImpulse = 0.0; - } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - MotorJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - var h = step.dt; - var inv_h = step.inv_dt; - // Solve angular friction - { - var Cdot = wB - wA + inv_h * this.m_correctionFactor * this.m_angularError; - var impulse = -this.m_angularMass * Cdot; - var oldImpulse = this.m_angularImpulse; - var maxImpulse = h * this.m_maxTorque; - this.m_angularImpulse = math.clamp(this.m_angularImpulse + impulse, -maxImpulse, maxImpulse); - impulse = this.m_angularImpulse - oldImpulse; - wA -= iA * impulse; - wB += iB * impulse; - } - // Solve linear friction - { - var Cdot = Vec2.zero(); - Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); - Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); - Cdot.addMul(inv_h * this.m_correctionFactor, this.m_linearError); - var impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); - var oldImpulse = Vec2.clone(this.m_linearImpulse); - this.m_linearImpulse.add(impulse); - var maxImpulse = h * this.m_maxForce; - this.m_linearImpulse.clamp(maxImpulse); - impulse = Vec2.sub(this.m_linearImpulse, oldImpulse); - vA.subMul(mA, impulse); - wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); - vB.addMul(mB, impulse); - wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); - } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - MotorJoint.prototype.solvePositionConstraints = function (step) { - return true; + else { + this.m_linearImpulse.setZero(); + this.m_angularImpulse = 0.0; + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + MotorJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var h = step.dt; + var inv_h = step.inv_dt; + // Solve angular friction + { + var Cdot = wB - wA + inv_h * this.m_correctionFactor * this.m_angularError; + var impulse = -this.m_angularMass * Cdot; + var oldImpulse = this.m_angularImpulse; + var maxImpulse = h * this.m_maxTorque; + this.m_angularImpulse = math.clamp(this.m_angularImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_angularImpulse - oldImpulse; + wA -= iA * impulse; + wB += iB * impulse; + } + // Solve linear friction + { + var Cdot = Vec2.zero(); + Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); + Cdot.addMul(inv_h * this.m_correctionFactor, this.m_linearError); + var impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); + var oldImpulse = Vec2.clone(this.m_linearImpulse); + this.m_linearImpulse.add(impulse); + var maxImpulse = h * this.m_maxForce; + this.m_linearImpulse.clamp(maxImpulse); + impulse = Vec2.sub(this.m_linearImpulse, oldImpulse); + vA.subMul(mA, impulse); + wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse); + vB.addMul(mB, impulse); + wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + MotorJoint.prototype.solvePositionConstraints = function (step) { + return true; + }; + MotorJoint.TYPE = 'motor-joint'; + return MotorJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$4 = { + maxForce: 0.0, + frequencyHz: 5.0, + dampingRatio: 0.7 +}; +/** + * A mouse joint is used to make a point on a body track a specified world + * point. This a soft constraint with a maximum force. This allows the + * constraint to stretch and without applying huge forces. + * + * NOTE: this joint is not documented in the manual because it was developed to + * be used in the testbed. If you want to learn how to use the mouse joint, look + * at the testbed. + */ +var MouseJoint = /** @class */ (function (_super) { + __extends(MouseJoint, _super); + function MouseJoint(def, bodyA, bodyB, target) { + var _this = this; + // @ts-ignore + if (!(_this instanceof MouseJoint)) { + return new MouseJoint(def, bodyA, bodyB, target); + } + def = options(def, DEFAULTS$4); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = MouseJoint.TYPE; + if (Vec2.isValid(target)) { + _this.m_targetA = Vec2.clone(target); + } + else if (Vec2.isValid(def.target)) { + _this.m_targetA = Vec2.clone(def.target); + } + else { + _this.m_targetA = Vec2.zero(); + } + _this.m_localAnchorB = Transform.mulTVec2(bodyB.getTransform(), _this.m_targetA); + _this.m_maxForce = def.maxForce; + _this.m_impulse = Vec2.zero(); + _this.m_frequencyHz = def.frequencyHz; + _this.m_dampingRatio = def.dampingRatio; + _this.m_beta = 0.0; + _this.m_gamma = 0.0; + // Solver temp + _this.m_rB = Vec2.zero(); + _this.m_localCenterB = Vec2.zero(); + _this.m_invMassB = 0.0; + _this.m_invIB = 0.0; + _this.m_mass = new Mat22(); + _this.m_C = Vec2.zero(); + return _this; + // p = attached point, m = mouse point + // C = p - m + // Cdot = v + // = v + cross(w, r) + // J = [I r_skew] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + } + /** @internal */ + MouseJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + target: this.m_targetA, + maxForce: this.m_maxForce, + frequencyHz: this.m_frequencyHz, + dampingRatio: this.m_dampingRatio, + _localAnchorB: this.m_localAnchorB, }; - MotorJoint.TYPE = 'motor-joint'; - return MotorJoint; - }(Joint)); + }; + /** @internal */ + MouseJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + data.target = Vec2.clone(data.target); + var joint = new MouseJoint(data); + if (data._localAnchorB) { + joint.m_localAnchorB = data._localAnchorB; + } + return joint; + }; + /** + * Use this to update the target point. + */ + MouseJoint.prototype.setTarget = function (target) { + if (this.m_bodyB.isAwake() == false) { + this.m_bodyB.setAwake(true); + } + this.m_targetA = Vec2.clone(target); + }; + MouseJoint.prototype.getTarget = function () { + return this.m_targetA; + }; + /** + * Set the maximum force in Newtons. + */ + MouseJoint.prototype.setMaxForce = function (force) { + this.m_maxForce = force; + }; + /** + * Get the maximum force in Newtons. + */ + MouseJoint.prototype.getMaxForce = function () { + return this.m_maxForce; + }; + /** + * Set the frequency in Hertz. + */ + MouseJoint.prototype.setFrequency = function (hz) { + this.m_frequencyHz = hz; + }; + /** + * Get the frequency in Hertz. + */ + MouseJoint.prototype.getFrequency = function () { + return this.m_frequencyHz; + }; + /** + * Set the damping ratio (dimensionless). + */ + MouseJoint.prototype.setDampingRatio = function (ratio) { + this.m_dampingRatio = ratio; + }; + /** + * Get the damping ratio (dimensionless). + */ + MouseJoint.prototype.getDampingRatio = function () { + return this.m_dampingRatio; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + MouseJoint.prototype.getAnchorA = function () { + return Vec2.clone(this.m_targetA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + MouseJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + MouseJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(inv_dt, this.m_impulse); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + MouseJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * 0.0; + }; + /** + * Shift the origin for any points stored in world coordinates. + */ + MouseJoint.prototype.shiftOrigin = function (newOrigin) { + this.m_targetA.sub(newOrigin); + }; + MouseJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIB = this.m_bodyB.m_invI; + var position = this.m_bodyB.c_position; + var velocity = this.m_bodyB.c_velocity; + var cB = position.c; + var aB = position.a; + var vB = velocity.v; + var wB = velocity.w; + var qB = Rot.neo(aB); + var mass = this.m_bodyB.getMass(); + // Frequency + var omega = 2.0 * math.PI * this.m_frequencyHz; + // Damping coefficient + var d = 2.0 * mass * this.m_dampingRatio * omega; + // Spring stiffness + var k = mass * (omega * omega); + // magic formulas + // gamma has units of inverse mass. + // beta has units of inverse time. + var h = step.dt; + this.m_gamma = h * (d + h * k); + if (this.m_gamma != 0.0) { + this.m_gamma = 1.0 / this.m_gamma; + } + this.m_beta = h * k * this.m_gamma; + // Compute the effective mass matrix. + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) * + // invI2 * skew(r2)] + // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y + // -r1.x*r1.y] + // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x] + var K = new Mat22(); + K.ex.x = this.m_invMassB + this.m_invIB * this.m_rB.y * this.m_rB.y + + this.m_gamma; + K.ex.y = -this.m_invIB * this.m_rB.x * this.m_rB.y; + K.ey.x = K.ex.y; + K.ey.y = this.m_invMassB + this.m_invIB * this.m_rB.x * this.m_rB.x + + this.m_gamma; + this.m_mass = K.getInverse(); + this.m_C.setVec2(cB); + this.m_C.addCombine(1, this.m_rB, -1, this.m_targetA); + this.m_C.mul(this.m_beta); + // Cheat with some damping + wB *= 0.98; + if (step.warmStarting) { + this.m_impulse.mul(step.dtRatio); + vB.addMul(this.m_invMassB, this.m_impulse); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, this.m_impulse); + } + else { + this.m_impulse.setZero(); + } + velocity.v.setVec2(vB); + velocity.w = wB; + }; + MouseJoint.prototype.solveVelocityConstraints = function (step) { + var velocity = this.m_bodyB.c_velocity; + var vB = Vec2.clone(velocity.v); + var wB = velocity.w; + // Cdot = v + cross(w, r) + var Cdot = Vec2.crossNumVec2(wB, this.m_rB); + Cdot.add(vB); + Cdot.addCombine(1, this.m_C, this.m_gamma, this.m_impulse); + Cdot.neg(); + var impulse = Mat22.mulVec2(this.m_mass, Cdot); + var oldImpulse = Vec2.clone(this.m_impulse); + this.m_impulse.add(impulse); + var maxImpulse = step.dt * this.m_maxForce; + this.m_impulse.clamp(maxImpulse); + impulse = Vec2.sub(this.m_impulse, oldImpulse); + vB.addMul(this.m_invMassB, impulse); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, impulse); + velocity.v.setVec2(vB); + velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + MouseJoint.prototype.solvePositionConstraints = function (step) { + return true; + }; + MouseJoint.TYPE = 'mouse-joint'; + return MouseJoint; +}(Joint)); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var DEFAULTS$4 = { - maxForce: 0.0, - frequencyHz: 5.0, - dampingRatio: 0.7 - }; - /** - * A mouse joint is used to make a point on a body track a specified world - * point. This a soft constraint with a maximum force. This allows the - * constraint to stretch and without applying huge forces. - * - * NOTE: this joint is not documented in the manual because it was developed to - * be used in the testbed. If you want to learn how to use the mouse joint, look - * at the testbed. - */ - var MouseJoint = /** @class */ (function (_super) { - __extends(MouseJoint, _super); - function MouseJoint(def, bodyA, bodyB, target) { - var _this = this; - // @ts-ignore - if (!(_this instanceof MouseJoint)) { - return new MouseJoint(def, bodyA, bodyB, target); - } - def = options(def, DEFAULTS$4); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = MouseJoint.TYPE; - _this.m_targetA = target ? Vec2.clone(target) : def.target || Vec2.zero(); - _this.m_localAnchorB = Transform.mulTVec2(bodyB.getTransform(), _this.m_targetA); - _this.m_maxForce = def.maxForce; - _this.m_impulse = Vec2.zero(); - _this.m_frequencyHz = def.frequencyHz; - _this.m_dampingRatio = def.dampingRatio; - _this.m_beta = 0.0; - _this.m_gamma = 0.0; - // Solver temp - _this.m_rB = Vec2.zero(); - _this.m_localCenterB = Vec2.zero(); - _this.m_invMassB = 0.0; - _this.m_invIB = 0.0; - _this.m_mass = new Mat22(); - _this.m_C = Vec2.zero(); - return _this; - // p = attached point, m = mouse point - // C = p - m - // Cdot = v - // = v + cross(w, r) - // J = [I r_skew] - // Identity used: - // w k % (rx i + ry j) = w * (-ry i + rx j) +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$3 = { + collideConnected: true +}; +/** + * The pulley joint is connected to two bodies and two fixed ground points. The + * pulley supports a ratio such that: length1 + ratio * length2 <= constant + * + * Yes, the force transmitted is scaled by the ratio. + * + * Warning: the pulley joint can get a bit squirrelly by itself. They often work + * better when combined with prismatic joints. You should also cover the the + * anchor points with static shapes to prevent one side from going to zero + * length. + */ +var PulleyJoint = /** @class */ (function (_super) { + __extends(PulleyJoint, _super); + function PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio) { + var _this = this; + // @ts-ignore + if (!(_this instanceof PulleyJoint)) { + return new PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio); } - /** @internal */ - MouseJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - target: this.m_targetA, - maxForce: this.m_maxForce, - frequencyHz: this.m_frequencyHz, - dampingRatio: this.m_dampingRatio, - _localAnchorB: this.m_localAnchorB, - }; - }; - /** @internal */ - MouseJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - data.target = Vec2.clone(data.target); - var joint = new MouseJoint(data); - if (data._localAnchorB) { - joint.m_localAnchorB = data._localAnchorB; - } - return joint; - }; - /** - * Use this to update the target point. - */ - MouseJoint.prototype.setTarget = function (target) { - if (this.m_bodyB.isAwake() == false) { - this.m_bodyB.setAwake(true); - } - this.m_targetA = Vec2.clone(target); - }; - MouseJoint.prototype.getTarget = function () { - return this.m_targetA; - }; - /** - * Set the maximum force in Newtons. - */ - MouseJoint.prototype.setMaxForce = function (force) { - this.m_maxForce = force; - }; - /** - * Get the maximum force in Newtons. - */ - MouseJoint.prototype.getMaxForce = function () { - return this.m_maxForce; - }; - /** - * Set the frequency in Hertz. - */ - MouseJoint.prototype.setFrequency = function (hz) { - this.m_frequencyHz = hz; - }; - /** - * Get the frequency in Hertz. - */ - MouseJoint.prototype.getFrequency = function () { - return this.m_frequencyHz; - }; - /** - * Set the damping ratio (dimensionless). - */ - MouseJoint.prototype.setDampingRatio = function (ratio) { - this.m_dampingRatio = ratio; - }; - /** - * Get the damping ratio (dimensionless). - */ - MouseJoint.prototype.getDampingRatio = function () { - return this.m_dampingRatio; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - MouseJoint.prototype.getAnchorA = function () { - return Vec2.clone(this.m_targetA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - MouseJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - MouseJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.mulNumVec2(inv_dt, this.m_impulse); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - MouseJoint.prototype.getReactionTorque = function (inv_dt) { - return inv_dt * 0.0; - }; - /** - * Shift the origin for any points stored in world coordinates. - */ - MouseJoint.prototype.shiftOrigin = function (newOrigin) { - this.m_targetA.sub(newOrigin); - }; - MouseJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIB = this.m_bodyB.m_invI; - var position = this.m_bodyB.c_position; - var velocity = this.m_bodyB.c_velocity; - var cB = position.c; - var aB = position.a; - var vB = velocity.v; - var wB = velocity.w; - var qB = Rot.neo(aB); - var mass = this.m_bodyB.getMass(); - // Frequency - var omega = 2.0 * math.PI * this.m_frequencyHz; - // Damping coefficient - var d = 2.0 * mass * this.m_dampingRatio * omega; - // Spring stiffness - var k = mass * (omega * omega); - // magic formulas - // gamma has units of inverse mass. - // beta has units of inverse time. - var h = step.dt; - this.m_gamma = h * (d + h * k); - if (this.m_gamma != 0.0) { - this.m_gamma = 1.0 / this.m_gamma; - } - this.m_beta = h * k * this.m_gamma; - // Compute the effective mass matrix. - this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) * - // invI2 * skew(r2)] - // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y - // -r1.x*r1.y] - // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x] - var K = new Mat22(); - K.ex.x = this.m_invMassB + this.m_invIB * this.m_rB.y * this.m_rB.y - + this.m_gamma; - K.ex.y = -this.m_invIB * this.m_rB.x * this.m_rB.y; - K.ey.x = K.ex.y; - K.ey.y = this.m_invMassB + this.m_invIB * this.m_rB.x * this.m_rB.x - + this.m_gamma; - this.m_mass = K.getInverse(); - this.m_C.setVec2(cB); - this.m_C.addCombine(1, this.m_rB, -1, this.m_targetA); - this.m_C.mul(this.m_beta); - // Cheat with some damping - wB *= 0.98; - if (step.warmStarting) { - this.m_impulse.mul(step.dtRatio); - vB.addMul(this.m_invMassB, this.m_impulse); - wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, this.m_impulse); - } - else { - this.m_impulse.setZero(); - } - velocity.v.setVec2(vB); - velocity.w = wB; - }; - MouseJoint.prototype.solveVelocityConstraints = function (step) { - var velocity = this.m_bodyB.c_velocity; - var vB = Vec2.clone(velocity.v); - var wB = velocity.w; - // Cdot = v + cross(w, r) - var Cdot = Vec2.crossNumVec2(wB, this.m_rB); - Cdot.add(vB); - Cdot.addCombine(1, this.m_C, this.m_gamma, this.m_impulse); - Cdot.neg(); - var impulse = Mat22.mulVec2(this.m_mass, Cdot); - var oldImpulse = Vec2.clone(this.m_impulse); - this.m_impulse.add(impulse); - var maxImpulse = step.dt * this.m_maxForce; - this.m_impulse.clamp(maxImpulse); - impulse = Vec2.sub(this.m_impulse, oldImpulse); - vB.addMul(this.m_invMassB, impulse); - wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, impulse); - velocity.v.setVec2(vB); - velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - MouseJoint.prototype.solvePositionConstraints = function (step) { - return true; + def = options(def, DEFAULTS$3); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = PulleyJoint.TYPE; + _this.m_groundAnchorA = groundA ? groundA : def.groundAnchorA || Vec2.neo(-1.0, 1.0); + _this.m_groundAnchorB = groundB ? groundB : def.groundAnchorB || Vec2.neo(1.0, 1.0); + _this.m_localAnchorA = anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.neo(-1.0, 0.0); + _this.m_localAnchorB = anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.neo(1.0, 0.0); + _this.m_lengthA = math.isFinite(def.lengthA) ? def.lengthA : Vec2.distance(anchorA, groundA); + _this.m_lengthB = math.isFinite(def.lengthB) ? def.lengthB : Vec2.distance(anchorB, groundB); + _this.m_ratio = math.isFinite(ratio) ? ratio : def.ratio; + _this.m_constant = _this.m_lengthA + _this.m_ratio * _this.m_lengthB; + _this.m_impulse = 0.0; + return _this; + // Pulley: + // length1 = norm(p1 - s1) + // length2 = norm(p2 - s2) + // C0 = (length1 + ratio * length2)_initial + // C = C0 - (length1 + ratio * length2) + // u1 = (p1 - s1) / norm(p1 - s1) + // u2 = (p2 - s2) / norm(p2 - s2) + // Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2)) + // J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)] + // K = J * invM * JT + // = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 * + // cross(r2, u2)^2) + } + PulleyJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + groundAnchorA: this.m_groundAnchorA, + groundAnchorB: this.m_groundAnchorB, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + lengthA: this.m_lengthA, + lengthB: this.m_lengthB, + ratio: this.m_ratio, }; - MouseJoint.TYPE = 'mouse-joint'; - return MouseJoint; - }(Joint)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + }; + /** @internal */ + PulleyJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new PulleyJoint(data); + return joint; + }; + /** + * Get the first ground anchor. */ - var DEFAULTS$3 = { - collideConnected: true + PulleyJoint.prototype.getGroundAnchorA = function () { + return this.m_groundAnchorA; }; /** - * The pulley joint is connected to two bodies and two fixed ground points. The - * pulley supports a ratio such that: length1 + ratio * length2 <= constant - * - * Yes, the force transmitted is scaled by the ratio. + * Get the second ground anchor. + */ + PulleyJoint.prototype.getGroundAnchorB = function () { + return this.m_groundAnchorB; + }; + /** + * Get the current length of the segment attached to bodyA. + */ + PulleyJoint.prototype.getLengthA = function () { + return this.m_lengthA; + }; + /** + * Get the current length of the segment attached to bodyB. + */ + PulleyJoint.prototype.getLengthB = function () { + return this.m_lengthB; + }; + /** + * Get the pulley ratio. + */ + PulleyJoint.prototype.getRatio = function () { + return this.m_ratio; + }; + /** + * Get the current length of the segment attached to bodyA. + */ + PulleyJoint.prototype.getCurrentLengthA = function () { + var p = this.m_bodyA.getWorldPoint(this.m_localAnchorA); + var s = this.m_groundAnchorA; + return Vec2.distance(p, s); + }; + /** + * Get the current length of the segment attached to bodyB. + */ + PulleyJoint.prototype.getCurrentLengthB = function () { + var p = this.m_bodyB.getWorldPoint(this.m_localAnchorB); + var s = this.m_groundAnchorB; + return Vec2.distance(p, s); + }; + /** + * Shift the origin for any points stored in world coordinates. * - * Warning: the pulley joint can get a bit squirrelly by itself. They often work - * better when combined with prismatic joints. You should also cover the the - * anchor points with static shapes to prevent one side from going to zero - * length. - */ - var PulleyJoint = /** @class */ (function (_super) { - __extends(PulleyJoint, _super); - function PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio) { - var _this = this; - // @ts-ignore - if (!(_this instanceof PulleyJoint)) { - return new PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio); - } - def = options(def, DEFAULTS$3); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = PulleyJoint.TYPE; - _this.m_groundAnchorA = groundA ? groundA : def.groundAnchorA || Vec2.neo(-1.0, 1.0); - _this.m_groundAnchorB = groundB ? groundB : def.groundAnchorB || Vec2.neo(1.0, 1.0); - _this.m_localAnchorA = anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.neo(-1.0, 0.0); - _this.m_localAnchorB = anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.neo(1.0, 0.0); - _this.m_lengthA = math.isFinite(def.lengthA) ? def.lengthA : Vec2.distance(anchorA, groundA); - _this.m_lengthB = math.isFinite(def.lengthB) ? def.lengthB : Vec2.distance(anchorB, groundB); - _this.m_ratio = math.isFinite(ratio) ? ratio : def.ratio; - _this.m_constant = _this.m_lengthA + _this.m_ratio * _this.m_lengthB; - _this.m_impulse = 0.0; - return _this; - // Pulley: - // length1 = norm(p1 - s1) - // length2 = norm(p2 - s2) - // C0 = (length1 + ratio * length2)_initial - // C = C0 - (length1 + ratio * length2) - // u1 = (p1 - s1) / norm(p1 - s1) - // u2 = (p2 - s2) / norm(p2 - s2) - // Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2)) - // J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)] - // K = J * invM * JT - // = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 * - // cross(r2, u2)^2) - } - PulleyJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - groundAnchorA: this.m_groundAnchorA, - groundAnchorB: this.m_groundAnchorB, - localAnchorA: this.m_localAnchorA, - localAnchorB: this.m_localAnchorB, - lengthA: this.m_lengthA, - lengthB: this.m_lengthB, - ratio: this.m_ratio, - }; - }; - /** @internal */ - PulleyJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - var joint = new PulleyJoint(data); - return joint; - }; - /** - * Get the first ground anchor. - */ - PulleyJoint.prototype.getGroundAnchorA = function () { - return this.m_groundAnchorA; - }; - /** - * Get the second ground anchor. - */ - PulleyJoint.prototype.getGroundAnchorB = function () { - return this.m_groundAnchorB; - }; - /** - * Get the current length of the segment attached to bodyA. - */ - PulleyJoint.prototype.getLengthA = function () { - return this.m_lengthA; - }; - /** - * Get the current length of the segment attached to bodyB. - */ - PulleyJoint.prototype.getLengthB = function () { - return this.m_lengthB; - }; - /** - * Get the pulley ratio. - */ - PulleyJoint.prototype.getRatio = function () { - return this.m_ratio; - }; - /** - * Get the current length of the segment attached to bodyA. - */ - PulleyJoint.prototype.getCurrentLengthA = function () { - var p = this.m_bodyA.getWorldPoint(this.m_localAnchorA); - var s = this.m_groundAnchorA; - return Vec2.distance(p, s); - }; - /** - * Get the current length of the segment attached to bodyB. - */ - PulleyJoint.prototype.getCurrentLengthB = function () { - var p = this.m_bodyB.getWorldPoint(this.m_localAnchorB); - var s = this.m_groundAnchorB; - return Vec2.distance(p, s); - }; - /** - * Shift the origin for any points stored in world coordinates. - * - * @param newOrigin - */ - PulleyJoint.prototype.shiftOrigin = function (newOrigin) { - this.m_groundAnchorA.sub(newOrigin); - this.m_groundAnchorB.sub(newOrigin); - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - PulleyJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - PulleyJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - PulleyJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.mulNumVec2(this.m_impulse, this.m_uB).mul(inv_dt); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - PulleyJoint.prototype.getReactionTorque = function (inv_dt) { - return 0.0; - }; - PulleyJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - // Get the pulley axes. - this.m_uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA); - this.m_uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB); - var lengthA = this.m_uA.length(); - var lengthB = this.m_uB.length(); - if (lengthA > 10.0 * Settings.linearSlop) { - this.m_uA.mul(1.0 / lengthA); - } - else { - this.m_uA.setZero(); - } - if (lengthB > 10.0 * Settings.linearSlop) { - this.m_uB.mul(1.0 / lengthB); - } - else { - this.m_uB.setZero(); - } - // Compute effective mass. - var ruA = Vec2.crossVec2Vec2(this.m_rA, this.m_uA); // float - var ruB = Vec2.crossVec2Vec2(this.m_rB, this.m_uB); // float - var mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float - var mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float - this.m_mass = mA + this.m_ratio * this.m_ratio * mB; - if (this.m_mass > 0.0) { - this.m_mass = 1.0 / this.m_mass; - } - if (step.warmStarting) { - // Scale impulses to support variable time steps. - this.m_impulse *= step.dtRatio; - // Warm starting. - var PA = Vec2.mulNumVec2(-this.m_impulse, this.m_uA); - var PB = Vec2.mulNumVec2(-this.m_ratio * this.m_impulse, this.m_uB); - vA.addMul(this.m_invMassA, PA); - wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA); - vB.addMul(this.m_invMassB, PB); - wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB); - } - else { - this.m_impulse = 0.0; - } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - PulleyJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA)); - var vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)); - var Cdot = -Vec2.dot(this.m_uA, vpA) - this.m_ratio - * Vec2.dot(this.m_uB, vpB); // float - var impulse = -this.m_mass * Cdot; // float - this.m_impulse += impulse; - var PA = Vec2.mulNumVec2(-impulse, this.m_uA); // Vec2 - var PB = Vec2.mulNumVec2(-this.m_ratio * impulse, this.m_uB); // Vec2 + * @param newOrigin + */ + PulleyJoint.prototype.shiftOrigin = function (newOrigin) { + this.m_groundAnchorA.sub(newOrigin); + this.m_groundAnchorB.sub(newOrigin); + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + PulleyJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + PulleyJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + PulleyJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(this.m_impulse, this.m_uB).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + PulleyJoint.prototype.getReactionTorque = function (inv_dt) { + return 0.0; + }; + PulleyJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // Get the pulley axes. + this.m_uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA); + this.m_uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB); + var lengthA = this.m_uA.length(); + var lengthB = this.m_uB.length(); + if (lengthA > 10.0 * Settings.linearSlop) { + this.m_uA.mul(1.0 / lengthA); + } + else { + this.m_uA.setZero(); + } + if (lengthB > 10.0 * Settings.linearSlop) { + this.m_uB.mul(1.0 / lengthB); + } + else { + this.m_uB.setZero(); + } + // Compute effective mass. + var ruA = Vec2.crossVec2Vec2(this.m_rA, this.m_uA); // float + var ruB = Vec2.crossVec2Vec2(this.m_rB, this.m_uB); // float + var mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float + var mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float + this.m_mass = mA + this.m_ratio * this.m_ratio * mB; + if (this.m_mass > 0.0) { + this.m_mass = 1.0 / this.m_mass; + } + if (step.warmStarting) { + // Scale impulses to support variable time steps. + this.m_impulse *= step.dtRatio; + // Warm starting. + var PA = Vec2.mulNumVec2(-this.m_impulse, this.m_uA); + var PB = Vec2.mulNumVec2(-this.m_ratio * this.m_impulse, this.m_uB); vA.addMul(this.m_invMassA, PA); wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA); vB.addMul(this.m_invMassB, PB); wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB); - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - PulleyJoint.prototype.solvePositionConstraints = function (step) { - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - // Get the pulley axes. - var uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA); - var uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB); - var lengthA = uA.length(); - var lengthB = uB.length(); - if (lengthA > 10.0 * Settings.linearSlop) { - uA.mul(1.0 / lengthA); - } - else { - uA.setZero(); - } - if (lengthB > 10.0 * Settings.linearSlop) { - uB.mul(1.0 / lengthB); - } - else { - uB.setZero(); - } - // Compute effective mass. - var ruA = Vec2.crossVec2Vec2(rA, uA); - var ruB = Vec2.crossVec2Vec2(rB, uB); - var mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float - var mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float - var mass = mA + this.m_ratio * this.m_ratio * mB; // float - if (mass > 0.0) { - mass = 1.0 / mass; - } - var C = this.m_constant - lengthA - this.m_ratio * lengthB; // float - var linearError = math.abs(C); // float - var impulse = -mass * C; // float - var PA = Vec2.mulNumVec2(-impulse, uA); // Vec2 - var PB = Vec2.mulNumVec2(-this.m_ratio * impulse, uB); // Vec2 - cA.addMul(this.m_invMassA, PA); - aA += this.m_invIA * Vec2.crossVec2Vec2(rA, PA); - cB.addMul(this.m_invMassB, PB); - aB += this.m_invIB * Vec2.crossVec2Vec2(rB, PB); - this.m_bodyA.c_position.c = cA; - this.m_bodyA.c_position.a = aA; - this.m_bodyB.c_position.c = cB; - this.m_bodyB.c_position.a = aB; - return linearError < Settings.linearSlop; - }; - PulleyJoint.TYPE = 'pulley-joint'; - return PulleyJoint; - }(Joint)); + } + else { + this.m_impulse = 0.0; + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + PulleyJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA)); + var vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)); + var Cdot = -Vec2.dot(this.m_uA, vpA) - this.m_ratio + * Vec2.dot(this.m_uB, vpB); // float + var impulse = -this.m_mass * Cdot; // float + this.m_impulse += impulse; + var PA = Vec2.mulNumVec2(-impulse, this.m_uA); // Vec2 + var PB = Vec2.mulNumVec2(-this.m_ratio * impulse, this.m_uB); // Vec2 + vA.addMul(this.m_invMassA, PA); + wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA); + vB.addMul(this.m_invMassB, PB); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB); + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + PulleyJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // Get the pulley axes. + var uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA); + var uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB); + var lengthA = uA.length(); + var lengthB = uB.length(); + if (lengthA > 10.0 * Settings.linearSlop) { + uA.mul(1.0 / lengthA); + } + else { + uA.setZero(); + } + if (lengthB > 10.0 * Settings.linearSlop) { + uB.mul(1.0 / lengthB); + } + else { + uB.setZero(); + } + // Compute effective mass. + var ruA = Vec2.crossVec2Vec2(rA, uA); + var ruB = Vec2.crossVec2Vec2(rB, uB); + var mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float + var mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float + var mass = mA + this.m_ratio * this.m_ratio * mB; // float + if (mass > 0.0) { + mass = 1.0 / mass; + } + var C = this.m_constant - lengthA - this.m_ratio * lengthB; // float + var linearError = math.abs(C); // float + var impulse = -mass * C; // float + var PA = Vec2.mulNumVec2(-impulse, uA); // Vec2 + var PB = Vec2.mulNumVec2(-this.m_ratio * impulse, uB); // Vec2 + cA.addMul(this.m_invMassA, PA); + aA += this.m_invIA * Vec2.crossVec2Vec2(rA, PA); + cB.addMul(this.m_invMassB, PB); + aB += this.m_invIB * Vec2.crossVec2Vec2(rB, PB); + this.m_bodyA.c_position.c = cA; + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c = cB; + this.m_bodyB.c_position.a = aB; + return linearError < Settings.linearSlop; + }; + PulleyJoint.TYPE = 'pulley-joint'; + return PulleyJoint; +}(Joint)); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var inactiveLimit = 0; - var atUpperLimit = 2; - var DEFAULTS$2 = { - maxLength: 0.0, - }; - /** - * A rope joint enforces a maximum distance between two points on two bodies. It - * has no other effect. - * - * Warning: if you attempt to change the maximum length during the simulation - * you will get some non-physical behavior. - * - * A model that would allow you to dynamically modify the length would have some - * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you - * want to dynamically control length. - */ - var RopeJoint = /** @class */ (function (_super) { - __extends(RopeJoint, _super); - function RopeJoint(def, bodyA, bodyB, anchor) { - var _this = this; - // @ts-ignore - if (!(_this instanceof RopeJoint)) { - return new RopeJoint(def, bodyA, bodyB, anchor); - } - def = options(def, DEFAULTS$2); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = RopeJoint.TYPE; - _this.m_localAnchorA = anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.neo(-1.0, 0.0); - _this.m_localAnchorB = anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.neo(1.0, 0.0); - _this.m_maxLength = def.maxLength; - _this.m_mass = 0.0; - _this.m_impulse = 0.0; - _this.m_length = 0.0; - _this.m_state = inactiveLimit; - return _this; - // Limit: - // C = norm(pB - pA) - L - // u = (pB - pA) / norm(pB - pA) - // Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA)) - // J = [-u -cross(rA, u) u cross(rB, u)] - // K = J * invM * JT - // = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2 +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var inactiveLimit = 0; +var atUpperLimit = 2; +var DEFAULTS$2 = { + maxLength: 0.0, +}; +/** + * A rope joint enforces a maximum distance between two points on two bodies. It + * has no other effect. + * + * Warning: if you attempt to change the maximum length during the simulation + * you will get some non-physical behavior. + * + * A model that would allow you to dynamically modify the length would have some + * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you + * want to dynamically control length. + */ +var RopeJoint = /** @class */ (function (_super) { + __extends(RopeJoint, _super); + function RopeJoint(def, bodyA, bodyB, anchor) { + var _this = this; + // @ts-ignore + if (!(_this instanceof RopeJoint)) { + return new RopeJoint(def, bodyA, bodyB, anchor); } - /** @internal */ - RopeJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - localAnchorA: this.m_localAnchorA, - localAnchorB: this.m_localAnchorB, - maxLength: this.m_maxLength, - }; - }; - /** @internal */ - RopeJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - var joint = new RopeJoint(data); - return joint; - }; - /** - * The local anchor point relative to bodyA's origin. - */ - RopeJoint.prototype.getLocalAnchorA = function () { - return this.m_localAnchorA; - }; - /** - * The local anchor point relative to bodyB's origin. - */ - RopeJoint.prototype.getLocalAnchorB = function () { - return this.m_localAnchorB; - }; - /** - * Set the maximum length of the rope. - */ - RopeJoint.prototype.setMaxLength = function (length) { - this.m_maxLength = length; - }; - /** - * Get the maximum length of the rope. - */ - RopeJoint.prototype.getMaxLength = function () { - return this.m_maxLength; - }; - RopeJoint.prototype.getLimitState = function () { - // TODO LimitState - return this.m_state; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - RopeJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - RopeJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - RopeJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - RopeJoint.prototype.getReactionTorque = function (inv_dt) { - return 0.0; - }; - RopeJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - this.m_rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); - this.m_rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); - this.m_u = Vec2.zero(); - this.m_u.addCombine(1, cB, 1, this.m_rB); - this.m_u.subCombine(1, cA, 1, this.m_rA); // Vec2 - this.m_length = this.m_u.length(); - var C = this.m_length - this.m_maxLength; // float - if (C > 0.0) { - this.m_state = atUpperLimit; - } - else { - this.m_state = inactiveLimit; - } - if (this.m_length > Settings.linearSlop) { - this.m_u.mul(1.0 / this.m_length); - } - else { - this.m_u.setZero(); - this.m_mass = 0.0; - this.m_impulse = 0.0; - return; - } - // Compute effective mass. - var crA = Vec2.crossVec2Vec2(this.m_rA, this.m_u); // float - var crB = Vec2.crossVec2Vec2(this.m_rB, this.m_u); // float - var invMass = this.m_invMassA + this.m_invIA * crA * crA + this.m_invMassB - + this.m_invIB * crB * crB; // float - this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0; - if (step.warmStarting) { - // Scale the impulse to support a variable time step. - this.m_impulse *= step.dtRatio; - var P = Vec2.mulNumVec2(this.m_impulse, this.m_u); - vA.subMul(this.m_invMassA, P); - wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); - vB.addMul(this.m_invMassB, P); - wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); - } - else { - this.m_impulse = 0.0; - } - this.m_bodyA.c_velocity.v.setVec2(vA); - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v.setVec2(vB); - this.m_bodyB.c_velocity.w = wB; + def = options(def, DEFAULTS$2); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = RopeJoint.TYPE; + _this.m_localAnchorA = anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.neo(-1.0, 0.0); + _this.m_localAnchorB = anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.neo(1.0, 0.0); + _this.m_maxLength = def.maxLength; + _this.m_mass = 0.0; + _this.m_impulse = 0.0; + _this.m_length = 0.0; + _this.m_state = inactiveLimit; + return _this; + // Limit: + // C = norm(pB - pA) - L + // u = (pB - pA) / norm(pB - pA) + // Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA)) + // J = [-u -cross(rA, u) u cross(rB, u)] + // K = J * invM * JT + // = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2 + } + /** @internal */ + RopeJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + maxLength: this.m_maxLength, }; - RopeJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - // Cdot = dot(u, v + cross(w, r)) - var vpA = Vec2.addCrossNumVec2(vA, wA, this.m_rA); // Vec2 - var vpB = Vec2.addCrossNumVec2(vB, wB, this.m_rB); // Vec2 - var C = this.m_length - this.m_maxLength; // float - var Cdot = Vec2.dot(this.m_u, Vec2.sub(vpB, vpA)); // float - // Predictive constraint. - if (C < 0.0) { - Cdot += step.inv_dt * C; - } - var impulse = -this.m_mass * Cdot; // float - var oldImpulse = this.m_impulse; // float - this.m_impulse = math.min(0.0, this.m_impulse + impulse); - impulse = this.m_impulse - oldImpulse; - var P = Vec2.mulNumVec2(impulse, this.m_u); // Vec2 + }; + /** @internal */ + RopeJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new RopeJoint(data); + return joint; + }; + /** + * The local anchor point relative to bodyA's origin. + */ + RopeJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + RopeJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * Set the maximum length of the rope. + */ + RopeJoint.prototype.setMaxLength = function (length) { + this.m_maxLength = length; + }; + /** + * Get the maximum length of the rope. + */ + RopeJoint.prototype.getMaxLength = function () { + return this.m_maxLength; + }; + RopeJoint.prototype.getLimitState = function () { + // TODO LimitState + return this.m_state; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + RopeJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + RopeJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + RopeJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + RopeJoint.prototype.getReactionTorque = function (inv_dt) { + return 0.0; + }; + RopeJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); + this.m_rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); + this.m_u = Vec2.zero(); + this.m_u.addCombine(1, cB, 1, this.m_rB); + this.m_u.subCombine(1, cA, 1, this.m_rA); // Vec2 + this.m_length = this.m_u.length(); + var C = this.m_length - this.m_maxLength; // float + if (C > 0.0) { + this.m_state = atUpperLimit; + } + else { + this.m_state = inactiveLimit; + } + if (this.m_length > Settings.linearSlop) { + this.m_u.mul(1.0 / this.m_length); + } + else { + this.m_u.setZero(); + this.m_mass = 0.0; + this.m_impulse = 0.0; + return; + } + // Compute effective mass. + var crA = Vec2.crossVec2Vec2(this.m_rA, this.m_u); // float + var crB = Vec2.crossVec2Vec2(this.m_rB, this.m_u); // float + var invMass = this.m_invMassA + this.m_invIA * crA * crA + this.m_invMassB + + this.m_invIB * crB * crB; // float + this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0; + if (step.warmStarting) { + // Scale the impulse to support a variable time step. + this.m_impulse *= step.dtRatio; + var P = Vec2.mulNumVec2(this.m_impulse, this.m_u); vA.subMul(this.m_invMassA, P); wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); vB.addMul(this.m_invMassB, P); wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - RopeJoint.prototype.solvePositionConstraints = function (step) { - var cA = this.m_bodyA.c_position.c; // Vec2 - var aA = this.m_bodyA.c_position.a; // float - var cB = this.m_bodyB.c_position.c; // Vec2 - var aB = this.m_bodyB.c_position.a; // float - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); - var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); - var u = Vec2.zero(); - u.addCombine(1, cB, 1, rB); - u.subCombine(1, cA, 1, rA); // Vec2 - var length = u.normalize(); // float - var C = length - this.m_maxLength; // float - C = math.clamp(C, 0.0, Settings.maxLinearCorrection); - var impulse = -this.m_mass * C; // float - var P = Vec2.mulNumVec2(impulse, u); // Vec2 - cA.subMul(this.m_invMassA, P); - aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P); - cB.addMul(this.m_invMassB, P); - aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P); - this.m_bodyA.c_position.c.setVec2(cA); - this.m_bodyA.c_position.a = aA; - this.m_bodyB.c_position.c.setVec2(cB); - this.m_bodyB.c_position.a = aB; - return length - this.m_maxLength < Settings.linearSlop; - }; - RopeJoint.TYPE = 'rope-joint'; - return RopeJoint; - }(Joint)); - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var DEFAULTS$1 = { - frequencyHz: 0.0, - dampingRatio: 0.0, - }; - /** - * A weld joint essentially glues two bodies together. A weld joint may distort - * somewhat because the island constraint solver is approximate. - */ - var WeldJoint = /** @class */ (function (_super) { - __extends(WeldJoint, _super); - function WeldJoint(def, bodyA, bodyB, anchor) { - var _this = this; - // @ts-ignore - if (!(_this instanceof WeldJoint)) { - return new WeldJoint(def, bodyA, bodyB, anchor); - } - def = options(def, DEFAULTS$1); - _this = _super.call(this, def, bodyA, bodyB) || this; - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = WeldJoint.TYPE; - _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); - _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); - _this.m_referenceAngle = math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); - _this.m_frequencyHz = def.frequencyHz; - _this.m_dampingRatio = def.dampingRatio; - _this.m_impulse = new Vec3(); - _this.m_bias = 0.0; - _this.m_gamma = 0.0; - // Solver temp - _this.m_rA; // Vec2 - _this.m_rB; // Vec2 - _this.m_localCenterA; // Vec2 - _this.m_localCenterB; // Vec2 - _this.m_invMassA; // float - _this.m_invMassB; // float - _this.m_invIA; // float - _this.m_invIB; // float - _this.m_mass = new Mat33(); - return _this; - // Point-to-point constraint - // C = p2 - p1 - // Cdot = v2 - v1 - // / = v2 + cross(w2, r2) - v1 - cross(w1, r1) - // J = [-I -r1_skew I r2_skew ] - // Identity used: - // w k % (rx i + ry j) = w * (-ry i + rx j) - // Angle constraint - // C = angle2 - angle1 - referenceAngle - // Cdot = w2 - w1 - // J = [0 0 -1 0 0 1] - // K = invI1 + invI2 } - /** @internal */ - WeldJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - frequencyHz: this.m_frequencyHz, - dampingRatio: this.m_dampingRatio, - localAnchorA: this.m_localAnchorA, - localAnchorB: this.m_localAnchorB, - referenceAngle: this.m_referenceAngle, - }; - }; - /** @internal */ - WeldJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - var joint = new WeldJoint(data); - return joint; - }; - /** @internal */ - WeldJoint.prototype._setAnchors = function (def) { - if (def.anchorA) { - this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); - } - else if (def.localAnchorA) { - this.m_localAnchorA.setVec2(def.localAnchorA); - } - if (def.anchorB) { - this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); - } - else if (def.localAnchorB) { - this.m_localAnchorB.setVec2(def.localAnchorB); - } - }; - /** - * The local anchor point relative to bodyA's origin. - */ - WeldJoint.prototype.getLocalAnchorA = function () { - return this.m_localAnchorA; - }; - /** - * The local anchor point relative to bodyB's origin. - */ - WeldJoint.prototype.getLocalAnchorB = function () { - return this.m_localAnchorB; - }; - /** - * Get the reference angle. - */ - WeldJoint.prototype.getReferenceAngle = function () { - return this.m_referenceAngle; - }; - /** - * Set frequency in Hz. - */ - WeldJoint.prototype.setFrequency = function (hz) { - this.m_frequencyHz = hz; - }; - /** - * Get frequency in Hz. - */ - WeldJoint.prototype.getFrequency = function () { - return this.m_frequencyHz; - }; - /** - * Set damping ratio. - */ - WeldJoint.prototype.setDampingRatio = function (ratio) { - this.m_dampingRatio = ratio; - }; - /** - * Get damping ratio. - */ - WeldJoint.prototype.getDampingRatio = function () { - return this.m_dampingRatio; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - WeldJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - WeldJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - WeldJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - WeldJoint.prototype.getReactionTorque = function (inv_dt) { - return inv_dt * this.m_impulse.z; - }; - WeldJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - // J = [-I -r1_skew I r2_skew] - // [ 0 -1 0 1] - // r_skew = [-ry; rx] - // Matlab - // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] - // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] - // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - var K = new Mat33(); - K.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y * this.m_rB.y - * iB; - K.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y * this.m_rB.x * iB; - K.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB; - K.ex.y = K.ey.x; - K.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x * this.m_rB.x - * iB; - K.ez.y = this.m_rA.x * iA + this.m_rB.x * iB; - K.ex.z = K.ez.x; - K.ey.z = K.ez.y; - K.ez.z = iA + iB; - if (this.m_frequencyHz > 0.0) { - K.getInverse22(this.m_mass); - var invM = iA + iB; // float - var m = invM > 0.0 ? 1.0 / invM : 0.0; // float - var C = aB - aA - this.m_referenceAngle; // float - // Frequency - var omega = 2.0 * math.PI * this.m_frequencyHz; // float - // Damping coefficient - var d = 2.0 * m * this.m_dampingRatio * omega; // float - // Spring stiffness - var k = m * omega * omega; // float - // magic formulas - var h = step.dt; // float - this.m_gamma = h * (d + h * k); - this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0; - this.m_bias = C * h * k * this.m_gamma; - invM += this.m_gamma; - this.m_mass.ez.z = invM != 0.0 ? 1.0 / invM : 0.0; - } - else if (K.ez.z == 0.0) { - K.getInverse22(this.m_mass); - this.m_gamma = 0.0; - this.m_bias = 0.0; - } - else { - K.getSymInverse33(this.m_mass); - this.m_gamma = 0.0; - this.m_bias = 0.0; - } - if (step.warmStarting) { - // Scale impulses to support a variable time step. - this.m_impulse.mul(step.dtRatio); - var P = Vec2.neo(this.m_impulse.x, this.m_impulse.y); - vA.subMul(mA, P); - wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_impulse.z); - vB.addMul(mB, P); - wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_impulse.z); - } - else { - this.m_impulse.setZero(); - } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - WeldJoint.prototype.solveVelocityConstraints = function (step) { - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var mA = this.m_invMassA; - var mB = this.m_invMassB; // float - var iA = this.m_invIA; - var iB = this.m_invIB; // float - if (this.m_frequencyHz > 0.0) { - var Cdot2 = wB - wA; // float - var impulse2 = -this.m_mass.ez.z - * (Cdot2 + this.m_bias + this.m_gamma * this.m_impulse.z); // float - this.m_impulse.z += impulse2; - wA -= iA * impulse2; - wB += iB * impulse2; - var Cdot1 = Vec2.zero(); - Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); - Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2 - var impulse1 = Vec2.neg(Mat33.mulVec2(this.m_mass, Cdot1)); // Vec2 - this.m_impulse.x += impulse1.x; - this.m_impulse.y += impulse1.y; - var P = Vec2.clone(impulse1); // Vec2 - vA.subMul(mA, P); - wA -= iA * Vec2.crossVec2Vec2(this.m_rA, P); - vB.addMul(mB, P); - wB += iB * Vec2.crossVec2Vec2(this.m_rB, P); - } - else { - var Cdot1 = Vec2.zero(); - Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); - Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2 - var Cdot2 = wB - wA; // float - var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); // Vec3 - var impulse = Vec3.neg(Mat33.mulVec3(this.m_mass, Cdot)); // Vec3 - this.m_impulse.add(impulse); - var P = Vec2.neo(impulse.x, impulse.y); - vA.subMul(mA, P); - wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z); - vB.addMul(mB, P); - wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z); - } - this.m_bodyA.c_velocity.v = vA; - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v = vB; - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - WeldJoint.prototype.solvePositionConstraints = function (step) { - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var mA = this.m_invMassA; - var mB = this.m_invMassB; - var iA = this.m_invIA; - var iB = this.m_invIB; - var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - var positionError; - var angularError; - var K = new Mat33(); - K.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB; - K.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB; - K.ez.x = -rA.y * iA - rB.y * iB; - K.ex.y = K.ey.x; - K.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB; - K.ez.y = rA.x * iA + rB.x * iB; - K.ex.z = K.ez.x; - K.ey.z = K.ez.y; - K.ez.z = iA + iB; - if (this.m_frequencyHz > 0.0) { - var C1 = Vec2.zero(); - C1.addCombine(1, cB, 1, rB); - C1.subCombine(1, cA, 1, rA); // Vec2 - positionError = C1.length(); - angularError = 0.0; - var P = Vec2.neg(K.solve22(C1)); // Vec2 - cA.subMul(mA, P); - aA -= iA * Vec2.crossVec2Vec2(rA, P); - cB.addMul(mB, P); - aB += iB * Vec2.crossVec2Vec2(rB, P); - } - else { - var C1 = Vec2.zero(); - C1.addCombine(1, cB, 1, rB); - C1.subCombine(1, cA, 1, rA); - var C2 = aB - aA - this.m_referenceAngle; // float - positionError = C1.length(); - angularError = math.abs(C2); - var C = new Vec3(C1.x, C1.y, C2); - var impulse = new Vec3(); - if (K.ez.z > 0.0) { - impulse = Vec3.neg(K.solve33(C)); - } - else { - var impulse2 = Vec2.neg(K.solve22(C1)); - impulse.set(impulse2.x, impulse2.y, 0.0); - } - var P = Vec2.neo(impulse.x, impulse.y); - cA.subMul(mA, P); - aA -= iA * (Vec2.crossVec2Vec2(rA, P) + impulse.z); - cB.addMul(mB, P); - aB += iB * (Vec2.crossVec2Vec2(rB, P) + impulse.z); - } - this.m_bodyA.c_position.c = cA; - this.m_bodyA.c_position.a = aA; - this.m_bodyB.c_position.c = cB; - this.m_bodyB.c_position.a = aB; - return positionError <= Settings.linearSlop && angularError <= Settings.angularSlop; - }; - WeldJoint.TYPE = 'weld-joint'; - return WeldJoint; - }(Joint)); + else { + this.m_impulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + RopeJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + // Cdot = dot(u, v + cross(w, r)) + var vpA = Vec2.addCrossNumVec2(vA, wA, this.m_rA); // Vec2 + var vpB = Vec2.addCrossNumVec2(vB, wB, this.m_rB); // Vec2 + var C = this.m_length - this.m_maxLength; // float + var Cdot = Vec2.dot(this.m_u, Vec2.sub(vpB, vpA)); // float + // Predictive constraint. + if (C < 0.0) { + Cdot += step.inv_dt * C; + } + var impulse = -this.m_mass * Cdot; // float + var oldImpulse = this.m_impulse; // float + this.m_impulse = math.min(0.0, this.m_impulse + impulse); + impulse = this.m_impulse - oldImpulse; + var P = Vec2.mulNumVec2(impulse, this.m_u); // Vec2 + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P); + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + RopeJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; // Vec2 + var aA = this.m_bodyA.c_position.a; // float + var cB = this.m_bodyB.c_position.c; // Vec2 + var aB = this.m_bodyB.c_position.a; // float + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA); + var rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB); + var u = Vec2.zero(); + u.addCombine(1, cB, 1, rB); + u.subCombine(1, cA, 1, rA); // Vec2 + var length = u.normalize(); // float + var C = length - this.m_maxLength; // float + C = math.clamp(C, 0.0, Settings.maxLinearCorrection); + var impulse = -this.m_mass * C; // float + var P = Vec2.mulNumVec2(impulse, u); // Vec2 + cA.subMul(this.m_invMassA, P); + aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P); + cB.addMul(this.m_invMassB, P); + aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P); + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + return length - this.m_maxLength < Settings.linearSlop; + }; + RopeJoint.TYPE = 'rope-joint'; + return RopeJoint; +}(Joint)); - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - var DEFAULTS = { - enableMotor: false, - maxMotorTorque: 0.0, - motorSpeed: 0.0, - frequencyHz: 2.0, - dampingRatio: 0.7, - }; - /** - * A wheel joint. This joint provides two degrees of freedom: translation along - * an axis fixed in bodyA and rotation in the plane. In other words, it is a - * point to line constraint with a rotational motor and a linear spring/damper. - * This joint is designed for vehicle suspensions. - */ - var WheelJoint = /** @class */ (function (_super) { - __extends(WheelJoint, _super); +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS$1 = { + frequencyHz: 0.0, + dampingRatio: 0.0, +}; +/** + * A weld joint essentially glues two bodies together. A weld joint may distort + * somewhat because the island constraint solver is approximate. + */ +var WeldJoint = /** @class */ (function (_super) { + __extends(WeldJoint, _super); + function WeldJoint(def, bodyA, bodyB, anchor) { + var _this = this; // @ts-ignore - function WheelJoint(def, bodyA, bodyB, anchor, axis) { - var _this = this; - // @ts-ignore - if (!(_this instanceof WheelJoint)) { - return new WheelJoint(def, bodyA, bodyB, anchor, axis); - } - def = options(def, DEFAULTS); - _this = _super.call(this, def, bodyA, bodyB) || this; - /** @internal */ _this.m_ax = Vec2.zero(); - /** @internal */ _this.m_ay = Vec2.zero(); - bodyA = _this.m_bodyA; - bodyB = _this.m_bodyB; - _this.m_type = WheelJoint.TYPE; - _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); - _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); - // @ts-ignore localAxis - _this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || def.localAxis || Vec2.neo(1.0, 0.0)); - _this.m_localYAxisA = Vec2.crossNumVec2(1.0, _this.m_localXAxisA); - _this.m_mass = 0.0; - _this.m_impulse = 0.0; - _this.m_motorMass = 0.0; - _this.m_motorImpulse = 0.0; - _this.m_springMass = 0.0; - _this.m_springImpulse = 0.0; - _this.m_maxMotorTorque = def.maxMotorTorque; - _this.m_motorSpeed = def.motorSpeed; - _this.m_enableMotor = def.enableMotor; - _this.m_frequencyHz = def.frequencyHz; - _this.m_dampingRatio = def.dampingRatio; - _this.m_bias = 0.0; - _this.m_gamma = 0.0; - return _this; - // Linear constraint (point-to-line) - // d = pB - pA = xB + rB - xA - rA - // C = dot(ay, d) - // Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA, - // rA)) - // = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB, - // ay), vB) - // J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)] - // Spring linear constraint - // C = dot(ax, d) - // Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) + - // dot(cross(rB, ax), vB) - // J = [-ax -cross(d+rA, ax) ax cross(rB, ax)] - // Motor rotational constraint - // Cdot = wB - wA - // J = [0 0 -1 0 0 1] + if (!(_this instanceof WeldJoint)) { + return new WeldJoint(def, bodyA, bodyB, anchor); } - /** @internal */ - WheelJoint.prototype._serialize = function () { - return { - type: this.m_type, - bodyA: this.m_bodyA, - bodyB: this.m_bodyB, - collideConnected: this.m_collideConnected, - enableMotor: this.m_enableMotor, - maxMotorTorque: this.m_maxMotorTorque, - motorSpeed: this.m_motorSpeed, - frequencyHz: this.m_frequencyHz, - dampingRatio: this.m_dampingRatio, - localAnchorA: this.m_localAnchorA, - localAnchorB: this.m_localAnchorB, - localAxisA: this.m_localXAxisA, - }; - }; - /** @internal */ - WheelJoint._deserialize = function (data, world, restore) { - data = __assign({}, data); - data.bodyA = restore(Body, data.bodyA, world); - data.bodyB = restore(Body, data.bodyB, world); - var joint = new WheelJoint(data); - return joint; - }; - /** @internal */ - WheelJoint.prototype._setAnchors = function (def) { - if (def.anchorA) { - this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); - } - else if (def.localAnchorA) { - this.m_localAnchorA.setVec2(def.localAnchorA); - } - if (def.anchorB) { - this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); - } - else if (def.localAnchorB) { - this.m_localAnchorB.setVec2(def.localAnchorB); - } - if (def.localAxisA) { - this.m_localXAxisA.setVec2(def.localAxisA); - this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA)); - } - }; - /** - * The local anchor point relative to bodyA's origin. - */ - WheelJoint.prototype.getLocalAnchorA = function () { - return this.m_localAnchorA; - }; - /** - * The local anchor point relative to bodyB's origin. - */ - WheelJoint.prototype.getLocalAnchorB = function () { - return this.m_localAnchorB; - }; - /** - * The local joint axis relative to bodyA. - */ - WheelJoint.prototype.getLocalAxisA = function () { - return this.m_localXAxisA; - }; - /** - * Get the current joint translation, usually in meters. - */ - WheelJoint.prototype.getJointTranslation = function () { - var bA = this.m_bodyA; - var bB = this.m_bodyB; - var pA = bA.getWorldPoint(this.m_localAnchorA); // Vec2 - var pB = bB.getWorldPoint(this.m_localAnchorB); // Vec2 - var d = Vec2.sub(pB, pA); // Vec2 - var axis = bA.getWorldVector(this.m_localXAxisA); // Vec2 - var translation = Vec2.dot(d, axis); // float - return translation; - }; - /** - * Get the current joint translation speed, usually in meters per second. - */ - WheelJoint.prototype.getJointSpeed = function () { - var wA = this.m_bodyA.m_angularVelocity; - var wB = this.m_bodyB.m_angularVelocity; - return wB - wA; - }; - /** - * Is the joint motor enabled? - */ - WheelJoint.prototype.isMotorEnabled = function () { - return this.m_enableMotor; - }; - /** - * Enable/disable the joint motor. - */ - WheelJoint.prototype.enableMotor = function (flag) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_enableMotor = flag; - }; - /** - * Set the motor speed, usually in radians per second. - */ - WheelJoint.prototype.setMotorSpeed = function (speed) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_motorSpeed = speed; - }; - /** - * Get the motor speed, usually in radians per second. - */ - WheelJoint.prototype.getMotorSpeed = function () { - return this.m_motorSpeed; - }; - /** - * Set/Get the maximum motor force, usually in N-m. - */ - WheelJoint.prototype.setMaxMotorTorque = function (torque) { - this.m_bodyA.setAwake(true); - this.m_bodyB.setAwake(true); - this.m_maxMotorTorque = torque; - }; - WheelJoint.prototype.getMaxMotorTorque = function () { - return this.m_maxMotorTorque; - }; - /** - * Get the current motor torque given the inverse time step, usually in N-m. - */ - WheelJoint.prototype.getMotorTorque = function (inv_dt) { - return inv_dt * this.m_motorImpulse; - }; - /** - * Set/Get the spring frequency in hertz. Setting the frequency to zero disables - * the spring. - */ - WheelJoint.prototype.setSpringFrequencyHz = function (hz) { - this.m_frequencyHz = hz; - }; - WheelJoint.prototype.getSpringFrequencyHz = function () { - return this.m_frequencyHz; - }; - /** - * Set/Get the spring damping ratio - */ - WheelJoint.prototype.setSpringDampingRatio = function (ratio) { - this.m_dampingRatio = ratio; - }; - WheelJoint.prototype.getSpringDampingRatio = function () { - return this.m_dampingRatio; - }; - /** - * Get the anchor point on bodyA in world coordinates. - */ - WheelJoint.prototype.getAnchorA = function () { - return this.m_bodyA.getWorldPoint(this.m_localAnchorA); - }; - /** - * Get the anchor point on bodyB in world coordinates. - */ - WheelJoint.prototype.getAnchorB = function () { - return this.m_bodyB.getWorldPoint(this.m_localAnchorB); - }; - /** - * Get the reaction force on bodyB at the joint anchor in Newtons. - */ - WheelJoint.prototype.getReactionForce = function (inv_dt) { - return Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax).mul(inv_dt); - }; - /** - * Get the reaction torque on bodyB in N*m. - */ - WheelJoint.prototype.getReactionTorque = function (inv_dt) { - return inv_dt * this.m_motorImpulse; + def = options(def, DEFAULTS$1); + _this = _super.call(this, def, bodyA, bodyB) || this; + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = WeldJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + _this.m_referenceAngle = math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle(); + _this.m_frequencyHz = def.frequencyHz; + _this.m_dampingRatio = def.dampingRatio; + _this.m_impulse = new Vec3(); + _this.m_bias = 0.0; + _this.m_gamma = 0.0; + // Solver temp + _this.m_rA; // Vec2 + _this.m_rB; // Vec2 + _this.m_localCenterA; // Vec2 + _this.m_localCenterB; // Vec2 + _this.m_invMassA; // float + _this.m_invMassB; // float + _this.m_invIA; // float + _this.m_invIB; // float + _this.m_mass = new Mat33(); + return _this; + // Point-to-point constraint + // C = p2 - p1 + // Cdot = v2 - v1 + // / = v2 + cross(w2, r2) - v1 - cross(w1, r1) + // J = [-I -r1_skew I r2_skew ] + // Identity used: + // w k % (rx i + ry j) = w * (-ry i + rx j) + // Angle constraint + // C = angle2 - angle1 - referenceAngle + // Cdot = w2 - w1 + // J = [0 0 -1 0 0 1] + // K = invI1 + invI2 + } + /** @internal */ + WeldJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + frequencyHz: this.m_frequencyHz, + dampingRatio: this.m_dampingRatio, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + referenceAngle: this.m_referenceAngle, }; - WheelJoint.prototype.initVelocityConstraints = function (step) { - this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; - this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; - this.m_invMassA = this.m_bodyA.m_invMass; - this.m_invMassB = this.m_bodyB.m_invMass; - this.m_invIA = this.m_bodyA.m_invI; - this.m_invIB = this.m_bodyB.m_invI; - var mA = this.m_invMassA; - var mB = this.m_invMassB; // float - var iA = this.m_invIA; - var iB = this.m_invIB; // float - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - // Compute the effective masses. - var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - var d = Vec2.zero(); - d.addCombine(1, cB, 1, rB); - d.subCombine(1, cA, 1, rA); // Vec2 - // Point to line constraint - { - this.m_ay = Rot.mulVec2(qA, this.m_localYAxisA); - this.m_sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ay); - this.m_sBy = Vec2.crossVec2Vec2(rB, this.m_ay); - this.m_mass = mA + mB + iA * this.m_sAy * this.m_sAy + iB * this.m_sBy - * this.m_sBy; - if (this.m_mass > 0.0) { - this.m_mass = 1.0 / this.m_mass; - } - } - // Spring constraint - this.m_springMass = 0.0; + }; + /** @internal */ + WeldJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new WeldJoint(data); + return joint; + }; + /** @internal */ + WeldJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + WeldJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + WeldJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * Get the reference angle. + */ + WeldJoint.prototype.getReferenceAngle = function () { + return this.m_referenceAngle; + }; + /** + * Set frequency in Hz. + */ + WeldJoint.prototype.setFrequency = function (hz) { + this.m_frequencyHz = hz; + }; + /** + * Get frequency in Hz. + */ + WeldJoint.prototype.getFrequency = function () { + return this.m_frequencyHz; + }; + /** + * Set damping ratio. + */ + WeldJoint.prototype.setDampingRatio = function (ratio) { + this.m_dampingRatio = ratio; + }; + /** + * Get damping ratio. + */ + WeldJoint.prototype.getDampingRatio = function () { + return this.m_dampingRatio; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + WeldJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + WeldJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + WeldJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + WeldJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_impulse.z; + }; + WeldJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var K = new Mat33(); + K.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y * this.m_rB.y + * iB; + K.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y * this.m_rB.x * iB; + K.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB; + K.ex.y = K.ey.x; + K.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x * this.m_rB.x + * iB; + K.ez.y = this.m_rA.x * iA + this.m_rB.x * iB; + K.ex.z = K.ez.x; + K.ey.z = K.ez.y; + K.ez.z = iA + iB; + if (this.m_frequencyHz > 0.0) { + K.getInverse22(this.m_mass); + var invM = iA + iB; // float + var m = invM > 0.0 ? 1.0 / invM : 0.0; // float + var C = aB - aA - this.m_referenceAngle; // float + // Frequency + var omega = 2.0 * math.PI * this.m_frequencyHz; // float + // Damping coefficient + var d = 2.0 * m * this.m_dampingRatio * omega; // float + // Spring stiffness + var k = m * omega * omega; // float + // magic formulas + var h = step.dt; // float + this.m_gamma = h * (d + h * k); + this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0; + this.m_bias = C * h * k * this.m_gamma; + invM += this.m_gamma; + this.m_mass.ez.z = invM != 0.0 ? 1.0 / invM : 0.0; + } + else if (K.ez.z == 0.0) { + K.getInverse22(this.m_mass); + this.m_gamma = 0.0; this.m_bias = 0.0; + } + else { + K.getSymInverse33(this.m_mass); this.m_gamma = 0.0; - if (this.m_frequencyHz > 0.0) { - this.m_ax = Rot.mulVec2(qA, this.m_localXAxisA); - this.m_sAx = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ax); - this.m_sBx = Vec2.crossVec2Vec2(rB, this.m_ax); - var invMass = mA + mB + iA * this.m_sAx * this.m_sAx + iB * this.m_sBx - * this.m_sBx; // float - if (invMass > 0.0) { - this.m_springMass = 1.0 / invMass; - var C = Vec2.dot(d, this.m_ax); // float - // Frequency - var omega = 2.0 * math.PI * this.m_frequencyHz; // float - // Damping coefficient - var damp = 2.0 * this.m_springMass * this.m_dampingRatio * omega; // float - // Spring stiffness - var k = this.m_springMass * omega * omega; // float - // magic formulas - var h = step.dt; // float - this.m_gamma = h * (damp + h * k); - if (this.m_gamma > 0.0) { - this.m_gamma = 1.0 / this.m_gamma; - } - this.m_bias = C * h * k * this.m_gamma; - this.m_springMass = invMass + this.m_gamma; - if (this.m_springMass > 0.0) { - this.m_springMass = 1.0 / this.m_springMass; - } - } + this.m_bias = 0.0; + } + if (step.warmStarting) { + // Scale impulses to support a variable time step. + this.m_impulse.mul(step.dtRatio); + var P = Vec2.neo(this.m_impulse.x, this.m_impulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_impulse.z); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_impulse.z); + } + else { + this.m_impulse.setZero(); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + WeldJoint.prototype.solveVelocityConstraints = function (step) { + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + if (this.m_frequencyHz > 0.0) { + var Cdot2 = wB - wA; // float + var impulse2 = -this.m_mass.ez.z + * (Cdot2 + this.m_bias + this.m_gamma * this.m_impulse.z); // float + this.m_impulse.z += impulse2; + wA -= iA * impulse2; + wB += iB * impulse2; + var Cdot1 = Vec2.zero(); + Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2 + var impulse1 = Vec2.neg(Mat33.mulVec2(this.m_mass, Cdot1)); // Vec2 + this.m_impulse.x += impulse1.x; + this.m_impulse.y += impulse1.y; + var P = Vec2.clone(impulse1); // Vec2 + vA.subMul(mA, P); + wA -= iA * Vec2.crossVec2Vec2(this.m_rA, P); + vB.addMul(mB, P); + wB += iB * Vec2.crossVec2Vec2(this.m_rB, P); + } + else { + var Cdot1 = Vec2.zero(); + Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB)); + Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2 + var Cdot2 = wB - wA; // float + var Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); // Vec3 + var impulse = Vec3.neg(Mat33.mulVec3(this.m_mass, Cdot)); // Vec3 + this.m_impulse.add(impulse); + var P = Vec2.neo(impulse.x, impulse.y); + vA.subMul(mA, P); + wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z); + vB.addMul(mB, P); + wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z); + } + this.m_bodyA.c_velocity.v = vA; + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v = vB; + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + WeldJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var mA = this.m_invMassA; + var mB = this.m_invMassB; + var iA = this.m_invIA; + var iB = this.m_invIB; + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + var positionError; + var angularError; + var K = new Mat33(); + K.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB; + K.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB; + K.ez.x = -rA.y * iA - rB.y * iB; + K.ex.y = K.ey.x; + K.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB; + K.ez.y = rA.x * iA + rB.x * iB; + K.ex.z = K.ez.x; + K.ey.z = K.ez.y; + K.ez.z = iA + iB; + if (this.m_frequencyHz > 0.0) { + var C1 = Vec2.zero(); + C1.addCombine(1, cB, 1, rB); + C1.subCombine(1, cA, 1, rA); // Vec2 + positionError = C1.length(); + angularError = 0.0; + var P = Vec2.neg(K.solve22(C1)); // Vec2 + cA.subMul(mA, P); + aA -= iA * Vec2.crossVec2Vec2(rA, P); + cB.addMul(mB, P); + aB += iB * Vec2.crossVec2Vec2(rB, P); + } + else { + var C1 = Vec2.zero(); + C1.addCombine(1, cB, 1, rB); + C1.subCombine(1, cA, 1, rA); + var C2 = aB - aA - this.m_referenceAngle; // float + positionError = C1.length(); + angularError = math.abs(C2); + var C = new Vec3(C1.x, C1.y, C2); + var impulse = new Vec3(); + if (K.ez.z > 0.0) { + impulse = Vec3.neg(K.solve33(C)); } else { - this.m_springImpulse = 0.0; + var impulse2 = Vec2.neg(K.solve22(C1)); + impulse.set(impulse2.x, impulse2.y, 0.0); + } + var P = Vec2.neo(impulse.x, impulse.y); + cA.subMul(mA, P); + aA -= iA * (Vec2.crossVec2Vec2(rA, P) + impulse.z); + cB.addMul(mB, P); + aB += iB * (Vec2.crossVec2Vec2(rB, P) + impulse.z); + } + this.m_bodyA.c_position.c = cA; + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c = cB; + this.m_bodyB.c_position.a = aB; + return positionError <= Settings.linearSlop && angularError <= Settings.angularSlop; + }; + WeldJoint.TYPE = 'weld-joint'; + return WeldJoint; +}(Joint)); + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var DEFAULTS = { + enableMotor: false, + maxMotorTorque: 0.0, + motorSpeed: 0.0, + frequencyHz: 2.0, + dampingRatio: 0.7, +}; +/** + * A wheel joint. This joint provides two degrees of freedom: translation along + * an axis fixed in bodyA and rotation in the plane. In other words, it is a + * point to line constraint with a rotational motor and a linear spring/damper. + * This joint is designed for vehicle suspensions. + */ +var WheelJoint = /** @class */ (function (_super) { + __extends(WheelJoint, _super); + // @ts-ignore + function WheelJoint(def, bodyA, bodyB, anchor, axis) { + var _this = this; + // @ts-ignore + if (!(_this instanceof WheelJoint)) { + return new WheelJoint(def, bodyA, bodyB, anchor, axis); + } + def = options(def, DEFAULTS); + _this = _super.call(this, def, bodyA, bodyB) || this; + /** @internal */ _this.m_ax = Vec2.zero(); + /** @internal */ _this.m_ay = Vec2.zero(); + bodyA = _this.m_bodyA; + bodyB = _this.m_bodyB; + _this.m_type = WheelJoint.TYPE; + _this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero()); + _this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero()); + // @ts-ignore localAxis + _this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || def.localAxis || Vec2.neo(1.0, 0.0)); + _this.m_localYAxisA = Vec2.crossNumVec2(1.0, _this.m_localXAxisA); + _this.m_mass = 0.0; + _this.m_impulse = 0.0; + _this.m_motorMass = 0.0; + _this.m_motorImpulse = 0.0; + _this.m_springMass = 0.0; + _this.m_springImpulse = 0.0; + _this.m_maxMotorTorque = def.maxMotorTorque; + _this.m_motorSpeed = def.motorSpeed; + _this.m_enableMotor = def.enableMotor; + _this.m_frequencyHz = def.frequencyHz; + _this.m_dampingRatio = def.dampingRatio; + _this.m_bias = 0.0; + _this.m_gamma = 0.0; + return _this; + // Linear constraint (point-to-line) + // d = pB - pA = xB + rB - xA - rA + // C = dot(ay, d) + // Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA, + // rA)) + // = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB, + // ay), vB) + // J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)] + // Spring linear constraint + // C = dot(ax, d) + // Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) + + // dot(cross(rB, ax), vB) + // J = [-ax -cross(d+rA, ax) ax cross(rB, ax)] + // Motor rotational constraint + // Cdot = wB - wA + // J = [0 0 -1 0 0 1] + } + /** @internal */ + WheelJoint.prototype._serialize = function () { + return { + type: this.m_type, + bodyA: this.m_bodyA, + bodyB: this.m_bodyB, + collideConnected: this.m_collideConnected, + enableMotor: this.m_enableMotor, + maxMotorTorque: this.m_maxMotorTorque, + motorSpeed: this.m_motorSpeed, + frequencyHz: this.m_frequencyHz, + dampingRatio: this.m_dampingRatio, + localAnchorA: this.m_localAnchorA, + localAnchorB: this.m_localAnchorB, + localAxisA: this.m_localXAxisA, + }; + }; + /** @internal */ + WheelJoint._deserialize = function (data, world, restore) { + data = __assign({}, data); + data.bodyA = restore(Body, data.bodyA, world); + data.bodyB = restore(Body, data.bodyB, world); + var joint = new WheelJoint(data); + return joint; + }; + /** @internal */ + WheelJoint.prototype._setAnchors = function (def) { + if (def.anchorA) { + this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA)); + } + else if (def.localAnchorA) { + this.m_localAnchorA.setVec2(def.localAnchorA); + } + if (def.anchorB) { + this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB)); + } + else if (def.localAnchorB) { + this.m_localAnchorB.setVec2(def.localAnchorB); + } + if (def.localAxisA) { + this.m_localXAxisA.setVec2(def.localAxisA); + this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA)); + } + }; + /** + * The local anchor point relative to bodyA's origin. + */ + WheelJoint.prototype.getLocalAnchorA = function () { + return this.m_localAnchorA; + }; + /** + * The local anchor point relative to bodyB's origin. + */ + WheelJoint.prototype.getLocalAnchorB = function () { + return this.m_localAnchorB; + }; + /** + * The local joint axis relative to bodyA. + */ + WheelJoint.prototype.getLocalAxisA = function () { + return this.m_localXAxisA; + }; + /** + * Get the current joint translation, usually in meters. + */ + WheelJoint.prototype.getJointTranslation = function () { + var bA = this.m_bodyA; + var bB = this.m_bodyB; + var pA = bA.getWorldPoint(this.m_localAnchorA); // Vec2 + var pB = bB.getWorldPoint(this.m_localAnchorB); // Vec2 + var d = Vec2.sub(pB, pA); // Vec2 + var axis = bA.getWorldVector(this.m_localXAxisA); // Vec2 + var translation = Vec2.dot(d, axis); // float + return translation; + }; + /** + * Get the current joint translation speed, usually in meters per second. + */ + WheelJoint.prototype.getJointSpeed = function () { + var wA = this.m_bodyA.m_angularVelocity; + var wB = this.m_bodyB.m_angularVelocity; + return wB - wA; + }; + /** + * Is the joint motor enabled? + */ + WheelJoint.prototype.isMotorEnabled = function () { + return this.m_enableMotor; + }; + /** + * Enable/disable the joint motor. + */ + WheelJoint.prototype.enableMotor = function (flag) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_enableMotor = flag; + }; + /** + * Set the motor speed, usually in radians per second. + */ + WheelJoint.prototype.setMotorSpeed = function (speed) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_motorSpeed = speed; + }; + /** + * Get the motor speed, usually in radians per second. + */ + WheelJoint.prototype.getMotorSpeed = function () { + return this.m_motorSpeed; + }; + /** + * Set/Get the maximum motor force, usually in N-m. + */ + WheelJoint.prototype.setMaxMotorTorque = function (torque) { + this.m_bodyA.setAwake(true); + this.m_bodyB.setAwake(true); + this.m_maxMotorTorque = torque; + }; + WheelJoint.prototype.getMaxMotorTorque = function () { + return this.m_maxMotorTorque; + }; + /** + * Get the current motor torque given the inverse time step, usually in N-m. + */ + WheelJoint.prototype.getMotorTorque = function (inv_dt) { + return inv_dt * this.m_motorImpulse; + }; + /** + * Set/Get the spring frequency in hertz. Setting the frequency to zero disables + * the spring. + */ + WheelJoint.prototype.setSpringFrequencyHz = function (hz) { + this.m_frequencyHz = hz; + }; + WheelJoint.prototype.getSpringFrequencyHz = function () { + return this.m_frequencyHz; + }; + /** + * Set/Get the spring damping ratio + */ + WheelJoint.prototype.setSpringDampingRatio = function (ratio) { + this.m_dampingRatio = ratio; + }; + WheelJoint.prototype.getSpringDampingRatio = function () { + return this.m_dampingRatio; + }; + /** + * Get the anchor point on bodyA in world coordinates. + */ + WheelJoint.prototype.getAnchorA = function () { + return this.m_bodyA.getWorldPoint(this.m_localAnchorA); + }; + /** + * Get the anchor point on bodyB in world coordinates. + */ + WheelJoint.prototype.getAnchorB = function () { + return this.m_bodyB.getWorldPoint(this.m_localAnchorB); + }; + /** + * Get the reaction force on bodyB at the joint anchor in Newtons. + */ + WheelJoint.prototype.getReactionForce = function (inv_dt) { + return Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax).mul(inv_dt); + }; + /** + * Get the reaction torque on bodyB in N*m. + */ + WheelJoint.prototype.getReactionTorque = function (inv_dt) { + return inv_dt * this.m_motorImpulse; + }; + WheelJoint.prototype.initVelocityConstraints = function (step) { + this.m_localCenterA = this.m_bodyA.m_sweep.localCenter; + this.m_localCenterB = this.m_bodyB.m_sweep.localCenter; + this.m_invMassA = this.m_bodyA.m_invMass; + this.m_invMassB = this.m_bodyB.m_invMass; + this.m_invIA = this.m_bodyA.m_invI; + this.m_invIB = this.m_bodyB.m_invI; + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + // Compute the effective masses. + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + var d = Vec2.zero(); + d.addCombine(1, cB, 1, rB); + d.subCombine(1, cA, 1, rA); // Vec2 + // Point to line constraint + { + this.m_ay = Rot.mulVec2(qA, this.m_localYAxisA); + this.m_sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ay); + this.m_sBy = Vec2.crossVec2Vec2(rB, this.m_ay); + this.m_mass = mA + mB + iA * this.m_sAy * this.m_sAy + iB * this.m_sBy + * this.m_sBy; + if (this.m_mass > 0.0) { + this.m_mass = 1.0 / this.m_mass; } - // Rotational motor - if (this.m_enableMotor) { - this.m_motorMass = iA + iB; - if (this.m_motorMass > 0.0) { - this.m_motorMass = 1.0 / this.m_motorMass; + } + // Spring constraint + this.m_springMass = 0.0; + this.m_bias = 0.0; + this.m_gamma = 0.0; + if (this.m_frequencyHz > 0.0) { + this.m_ax = Rot.mulVec2(qA, this.m_localXAxisA); + this.m_sAx = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ax); + this.m_sBx = Vec2.crossVec2Vec2(rB, this.m_ax); + var invMass = mA + mB + iA * this.m_sAx * this.m_sAx + iB * this.m_sBx + * this.m_sBx; // float + if (invMass > 0.0) { + this.m_springMass = 1.0 / invMass; + var C = Vec2.dot(d, this.m_ax); // float + // Frequency + var omega = 2.0 * math.PI * this.m_frequencyHz; // float + // Damping coefficient + var damp = 2.0 * this.m_springMass * this.m_dampingRatio * omega; // float + // Spring stiffness + var k = this.m_springMass * omega * omega; // float + // magic formulas + var h = step.dt; // float + this.m_gamma = h * (damp + h * k); + if (this.m_gamma > 0.0) { + this.m_gamma = 1.0 / this.m_gamma; + } + this.m_bias = C * h * k * this.m_gamma; + this.m_springMass = invMass + this.m_gamma; + if (this.m_springMass > 0.0) { + this.m_springMass = 1.0 / this.m_springMass; } } - else { - this.m_motorMass = 0.0; - this.m_motorImpulse = 0.0; - } - if (step.warmStarting) { - // Account for variable time step. - this.m_impulse *= step.dtRatio; - this.m_springImpulse *= step.dtRatio; - this.m_motorImpulse *= step.dtRatio; - var P = Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax); - var LA = this.m_impulse * this.m_sAy + this.m_springImpulse * this.m_sAx + this.m_motorImpulse; - var LB = this.m_impulse * this.m_sBy + this.m_springImpulse * this.m_sBx + this.m_motorImpulse; - vA.subMul(this.m_invMassA, P); - wA -= this.m_invIA * LA; - vB.addMul(this.m_invMassB, P); - wB += this.m_invIB * LB; - } - else { - this.m_impulse = 0.0; - this.m_springImpulse = 0.0; - this.m_motorImpulse = 0.0; - } - this.m_bodyA.c_velocity.v.setVec2(vA); - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v.setVec2(vB); - this.m_bodyB.c_velocity.w = wB; - }; - WheelJoint.prototype.solveVelocityConstraints = function (step) { - var mA = this.m_invMassA; - var mB = this.m_invMassB; // float - var iA = this.m_invIA; - var iB = this.m_invIB; // float - var vA = this.m_bodyA.c_velocity.v; - var wA = this.m_bodyA.c_velocity.w; - var vB = this.m_bodyB.c_velocity.v; - var wB = this.m_bodyB.c_velocity.w; - // Solve spring constraint - { - var Cdot = Vec2.dot(this.m_ax, vB) - Vec2.dot(this.m_ax, vA) + this.m_sBx - * wB - this.m_sAx * wA; // float - var impulse = -this.m_springMass - * (Cdot + this.m_bias + this.m_gamma * this.m_springImpulse); // float - this.m_springImpulse += impulse; - var P = Vec2.mulNumVec2(impulse, this.m_ax); // Vec2 - var LA = impulse * this.m_sAx; // float - var LB = impulse * this.m_sBx; // float - vA.subMul(mA, P); - wA -= iA * LA; - vB.addMul(mB, P); - wB += iB * LB; - } - // Solve rotational motor constraint - { - var Cdot = wB - wA - this.m_motorSpeed; // float - var impulse = -this.m_motorMass * Cdot; // float - var oldImpulse = this.m_motorImpulse; // float - var maxImpulse = step.dt * this.m_maxMotorTorque; // float - this.m_motorImpulse = math.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); - impulse = this.m_motorImpulse - oldImpulse; - wA -= iA * impulse; - wB += iB * impulse; - } - // Solve point to line constraint - { - var Cdot = Vec2.dot(this.m_ay, vB) - Vec2.dot(this.m_ay, vA) + this.m_sBy - * wB - this.m_sAy * wA; // float - var impulse = -this.m_mass * Cdot; // float - this.m_impulse += impulse; - var P = Vec2.mulNumVec2(impulse, this.m_ay); // Vec2 - var LA = impulse * this.m_sAy; // float - var LB = impulse * this.m_sBy; // float - vA.subMul(mA, P); - wA -= iA * LA; - vB.addMul(mB, P); - wB += iB * LB; - } - this.m_bodyA.c_velocity.v.setVec2(vA); - this.m_bodyA.c_velocity.w = wA; - this.m_bodyB.c_velocity.v.setVec2(vB); - this.m_bodyB.c_velocity.w = wB; - }; - /** - * This returns true if the position errors are within tolerance. - */ - WheelJoint.prototype.solvePositionConstraints = function (step) { - var cA = this.m_bodyA.c_position.c; - var aA = this.m_bodyA.c_position.a; - var cB = this.m_bodyB.c_position.c; - var aB = this.m_bodyB.c_position.a; - var qA = Rot.neo(aA); - var qB = Rot.neo(aB); - var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); - var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); - var d = Vec2.zero(); - d.addCombine(1, cB, 1, rB); - d.subCombine(1, cA, 1, rA); - var ay = Rot.mulVec2(qA, this.m_localYAxisA); - var sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), ay); // float - var sBy = Vec2.crossVec2Vec2(rB, ay); // float - var C = Vec2.dot(d, ay); // float - var k = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_sAy - * this.m_sAy + this.m_invIB * this.m_sBy * this.m_sBy; // float - var impulse; // float - if (k != 0.0) { - impulse = -C / k; + } + else { + this.m_springImpulse = 0.0; + } + // Rotational motor + if (this.m_enableMotor) { + this.m_motorMass = iA + iB; + if (this.m_motorMass > 0.0) { + this.m_motorMass = 1.0 / this.m_motorMass; } - else { - impulse = 0.0; - } - var P = Vec2.mulNumVec2(impulse, ay); // Vec2 - var LA = impulse * sAy; // float - var LB = impulse * sBy; // float - cA.subMul(this.m_invMassA, P); - aA -= this.m_invIA * LA; - cB.addMul(this.m_invMassB, P); - aB += this.m_invIB * LB; - this.m_bodyA.c_position.c.setVec2(cA); - this.m_bodyA.c_position.a = aA; - this.m_bodyB.c_position.c.setVec2(cB); - this.m_bodyB.c_position.a = aB; - return math.abs(C) <= Settings.linearSlop; - }; - WheelJoint.TYPE = 'wheel-joint'; - return WheelJoint; - }(Joint)); + } + else { + this.m_motorMass = 0.0; + this.m_motorImpulse = 0.0; + } + if (step.warmStarting) { + // Account for variable time step. + this.m_impulse *= step.dtRatio; + this.m_springImpulse *= step.dtRatio; + this.m_motorImpulse *= step.dtRatio; + var P = Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax); + var LA = this.m_impulse * this.m_sAy + this.m_springImpulse * this.m_sAx + this.m_motorImpulse; + var LB = this.m_impulse * this.m_sBy + this.m_springImpulse * this.m_sBx + this.m_motorImpulse; + vA.subMul(this.m_invMassA, P); + wA -= this.m_invIA * LA; + vB.addMul(this.m_invMassB, P); + wB += this.m_invIB * LB; + } + else { + this.m_impulse = 0.0; + this.m_springImpulse = 0.0; + this.m_motorImpulse = 0.0; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + WheelJoint.prototype.solveVelocityConstraints = function (step) { + var mA = this.m_invMassA; + var mB = this.m_invMassB; // float + var iA = this.m_invIA; + var iB = this.m_invIB; // float + var vA = this.m_bodyA.c_velocity.v; + var wA = this.m_bodyA.c_velocity.w; + var vB = this.m_bodyB.c_velocity.v; + var wB = this.m_bodyB.c_velocity.w; + // Solve spring constraint + { + var Cdot = Vec2.dot(this.m_ax, vB) - Vec2.dot(this.m_ax, vA) + this.m_sBx + * wB - this.m_sAx * wA; // float + var impulse = -this.m_springMass + * (Cdot + this.m_bias + this.m_gamma * this.m_springImpulse); // float + this.m_springImpulse += impulse; + var P = Vec2.mulNumVec2(impulse, this.m_ax); // Vec2 + var LA = impulse * this.m_sAx; // float + var LB = impulse * this.m_sBx; // float + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + // Solve rotational motor constraint + { + var Cdot = wB - wA - this.m_motorSpeed; // float + var impulse = -this.m_motorMass * Cdot; // float + var oldImpulse = this.m_motorImpulse; // float + var maxImpulse = step.dt * this.m_maxMotorTorque; // float + this.m_motorImpulse = math.clamp(this.m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = this.m_motorImpulse - oldImpulse; + wA -= iA * impulse; + wB += iB * impulse; + } + // Solve point to line constraint + { + var Cdot = Vec2.dot(this.m_ay, vB) - Vec2.dot(this.m_ay, vA) + this.m_sBy + * wB - this.m_sAy * wA; // float + var impulse = -this.m_mass * Cdot; // float + this.m_impulse += impulse; + var P = Vec2.mulNumVec2(impulse, this.m_ay); // Vec2 + var LA = impulse * this.m_sAy; // float + var LB = impulse * this.m_sBy; // float + vA.subMul(mA, P); + wA -= iA * LA; + vB.addMul(mB, P); + wB += iB * LB; + } + this.m_bodyA.c_velocity.v.setVec2(vA); + this.m_bodyA.c_velocity.w = wA; + this.m_bodyB.c_velocity.v.setVec2(vB); + this.m_bodyB.c_velocity.w = wB; + }; + /** + * This returns true if the position errors are within tolerance. + */ + WheelJoint.prototype.solvePositionConstraints = function (step) { + var cA = this.m_bodyA.c_position.c; + var aA = this.m_bodyA.c_position.a; + var cB = this.m_bodyB.c_position.c; + var aB = this.m_bodyB.c_position.a; + var qA = Rot.neo(aA); + var qB = Rot.neo(aB); + var rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); + var rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); + var d = Vec2.zero(); + d.addCombine(1, cB, 1, rB); + d.subCombine(1, cA, 1, rA); + var ay = Rot.mulVec2(qA, this.m_localYAxisA); + var sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), ay); // float + var sBy = Vec2.crossVec2Vec2(rB, ay); // float + var C = Vec2.dot(d, ay); // float + var k = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_sAy + * this.m_sAy + this.m_invIB * this.m_sBy * this.m_sBy; // float + var impulse; // float + if (k != 0.0) { + impulse = -C / k; + } + else { + impulse = 0.0; + } + var P = Vec2.mulNumVec2(impulse, ay); // Vec2 + var LA = impulse * sAy; // float + var LB = impulse * sBy; // float + cA.subMul(this.m_invMassA, P); + aA -= this.m_invIA * LA; + cB.addMul(this.m_invMassB, P); + aB += this.m_invIB * LB; + this.m_bodyA.c_position.c.setVec2(cA); + this.m_bodyA.c_position.a = aA; + this.m_bodyB.c_position.c.setVec2(cB); + this.m_bodyB.c_position.a = aB; + return math.abs(C) <= Settings.linearSlop; + }; + WheelJoint.TYPE = 'wheel-joint'; + return WheelJoint; +}(Joint)); - var SID = 0; - function Serializer(opts) { - var _a; - opts = opts || {}; - var rootClass = opts.rootClass || World; - var preSerialize = opts.preSerialize || function (obj) { return obj; }; - var postSerialize = opts.postSerialize || function (data, obj) { return data; }; - var preDeserialize = opts.preDeserialize || function (data) { return data; }; - var postDeserialize = opts.postDeserialize || function (obj, data) { return obj; }; - // This is used to create ref objects during serialize - var refTypes = { - World: World, - Body: Body, - Joint: Joint, - Fixture: Fixture, - Shape: Shape, - }; - // This is used by restore to deserialize objects and refs - var restoreTypes = __assign({ Vec2: Vec2, - Vec3: Vec3 }, refTypes); - var CLASS_BY_TYPE_PROP = (_a = {}, - _a[Body.STATIC] = Body, - _a[Body.DYNAMIC] = Body, - _a[Body.KINEMATIC] = Body, - _a[ChainShape.TYPE] = ChainShape, - _a[BoxShape.TYPE] = BoxShape, - _a[EdgeShape.TYPE] = EdgeShape, - _a[PolygonShape.TYPE] = PolygonShape, - _a[CircleShape.TYPE] = CircleShape, - _a[DistanceJoint.TYPE] = DistanceJoint, - _a[FrictionJoint.TYPE] = FrictionJoint, - _a[GearJoint.TYPE] = GearJoint, - _a[MotorJoint.TYPE] = MotorJoint, - _a[MouseJoint.TYPE] = MouseJoint, - _a[PrismaticJoint.TYPE] = PrismaticJoint, - _a[PulleyJoint.TYPE] = PulleyJoint, - _a[RevoluteJoint.TYPE] = RevoluteJoint, - _a[RopeJoint.TYPE] = RopeJoint, - _a[WeldJoint.TYPE] = WeldJoint, - _a[WheelJoint.TYPE] = WheelJoint, - _a); - this.toJson = function (root) { - var json = []; - var queue = [root]; - var refMap = {}; - function storeRef(value, typeName) { - value.__sid = value.__sid || ++SID; - if (!refMap[value.__sid]) { - queue.push(value); - var index = json.length + queue.length; - var ref = { - refIndex: index, - refType: typeName - }; - refMap[value.__sid] = ref; - } - return refMap[value.__sid]; - } - function serialize(obj) { - obj = preSerialize(obj); - var data = obj._serialize(); - data = postSerialize(data, obj); - return data; +var SID = 0; +function Serializer(opts) { + var _a; + opts = opts || {}; + var rootClass = opts.rootClass || World; + var preSerialize = opts.preSerialize || function (obj) { return obj; }; + var postSerialize = opts.postSerialize || function (data, obj) { return data; }; + var preDeserialize = opts.preDeserialize || function (data) { return data; }; + var postDeserialize = opts.postDeserialize || function (obj, data) { return obj; }; + // This is used to create ref objects during serialize + var refTypes = { + World: World, + Body: Body, + Joint: Joint, + Fixture: Fixture, + Shape: Shape, + }; + // This is used by restore to deserialize objects and refs + var restoreTypes = __assign({ Vec2: Vec2, + Vec3: Vec3 }, refTypes); + var CLASS_BY_TYPE_PROP = (_a = {}, + _a[Body.STATIC] = Body, + _a[Body.DYNAMIC] = Body, + _a[Body.KINEMATIC] = Body, + _a[ChainShape.TYPE] = ChainShape, + _a[BoxShape.TYPE] = BoxShape, + _a[EdgeShape.TYPE] = EdgeShape, + _a[PolygonShape.TYPE] = PolygonShape, + _a[CircleShape.TYPE] = CircleShape, + _a[DistanceJoint.TYPE] = DistanceJoint, + _a[FrictionJoint.TYPE] = FrictionJoint, + _a[GearJoint.TYPE] = GearJoint, + _a[MotorJoint.TYPE] = MotorJoint, + _a[MouseJoint.TYPE] = MouseJoint, + _a[PrismaticJoint.TYPE] = PrismaticJoint, + _a[PulleyJoint.TYPE] = PulleyJoint, + _a[RevoluteJoint.TYPE] = RevoluteJoint, + _a[RopeJoint.TYPE] = RopeJoint, + _a[WeldJoint.TYPE] = WeldJoint, + _a[WheelJoint.TYPE] = WheelJoint, + _a); + this.toJson = function (root) { + var json = []; + var queue = [root]; + var refMap = {}; + function storeRef(value, typeName) { + value.__sid = value.__sid || ++SID; + if (!refMap[value.__sid]) { + queue.push(value); + var index = json.length + queue.length; + var ref = { + refIndex: index, + refType: typeName + }; + refMap[value.__sid] = ref; + } + return refMap[value.__sid]; + } + function serialize(obj) { + obj = preSerialize(obj); + var data = obj._serialize(); + data = postSerialize(data, obj); + return data; + } + function toJson(value, top) { + if (typeof value !== 'object' || value === null) { + return value; } - function toJson(value, top) { - if (typeof value !== 'object' || value === null) { - return value; - } - if (typeof value._serialize === 'function') { - if (value !== top) { - // tslint:disable-next-line:no-for-in - for (var typeName in refTypes) { - if (value instanceof refTypes[typeName]) { - return storeRef(value, typeName); - } + if (typeof value._serialize === 'function') { + if (value !== top) { + // tslint:disable-next-line:no-for-in + for (var typeName in refTypes) { + if (value instanceof refTypes[typeName]) { + return storeRef(value, typeName); } } - value = serialize(value); } - if (Array.isArray(value)) { - var newValue = []; - for (var key = 0; key < value.length; key++) { - newValue[key] = toJson(value[key]); - } - value = newValue; + value = serialize(value); + } + if (Array.isArray(value)) { + var newValue = []; + for (var key = 0; key < value.length; key++) { + newValue[key] = toJson(value[key]); } - else { - var newValue = {}; - // tslint:disable-next-line:no-for-in - for (var key in value) { - if (value.hasOwnProperty(key)) { - newValue[key] = toJson(value[key]); - } + value = newValue; + } + else { + var newValue = {}; + // tslint:disable-next-line:no-for-in + for (var key in value) { + if (value.hasOwnProperty(key)) { + newValue[key] = toJson(value[key]); } - value = newValue; } - return value; + value = newValue; } - while (queue.length) { - var obj = queue.shift(); - var str = toJson(obj, obj); - json.push(str); + return value; + } + while (queue.length) { + var obj = queue.shift(); + var str = toJson(obj, obj); + json.push(str); + } + return json; + }; + this.fromJson = function (json) { + var refMap = {}; + function findDeserilizer(data, cls) { + if (!cls || !cls._deserialize) { + cls = CLASS_BY_TYPE_PROP[data.type]; } - return json; - }; - this.fromJson = function (json) { - var refMap = {}; - function findDeserilizer(data, cls) { - if (!cls || !cls._deserialize) { - cls = CLASS_BY_TYPE_PROP[data.type]; - } - return cls && cls._deserialize; - } - /** - * Deserialize a data object. - */ - function deserialize(cls, data, ctx) { - var deserializer = findDeserilizer(data, cls); - if (!deserializer) { - return; - } - data = preDeserialize(data); - var obj = deserializer(data, ctx, restoreRef); - obj = postDeserialize(obj, data); - return obj; - } - /** - * Restore a ref object or deserialize a data object. - * - * This is passed as callback to class deserializers. - */ - function restoreRef(cls, ref, ctx) { - if (!ref.refIndex) { - return cls && cls._deserialize && deserialize(cls, ref, ctx); - } - cls = restoreTypes[ref.refType] || cls; - var index = ref.refIndex; - if (!refMap[index]) { - var data = json[index]; - var obj = deserialize(cls, data, ctx); - refMap[index] = obj; - } - return refMap[index]; + return cls && cls._deserialize; + } + /** + * Deserialize a data object. + */ + function deserialize(cls, data, ctx) { + var deserializer = findDeserilizer(data, cls); + if (!deserializer) { + return; } - var root = rootClass._deserialize(json[0], null, restoreRef); - return root; - }; - } - var serializer = new Serializer(); - Serializer.toJson = serializer.toJson; - Serializer.fromJson = serializer.fromJson; + data = preDeserialize(data); + var obj = deserializer(data, ctx, restoreRef); + obj = postDeserialize(obj, data); + return obj; + } + /** + * Restore a ref object or deserialize a data object. + * + * This is passed as callback to class deserializers. + */ + function restoreRef(cls, ref, ctx) { + if (!ref.refIndex) { + return cls && cls._deserialize && deserialize(cls, ref, ctx); + } + cls = restoreTypes[ref.refType] || cls; + var index = ref.refIndex; + if (!refMap[index]) { + var data = json[index]; + var obj = deserialize(cls, data, ctx); + refMap[index] = obj; + } + return refMap[index]; + } + var root = rootClass._deserialize(json[0], null, restoreRef); + return root; + }; +} +var serializer = new Serializer(); +Serializer.toJson = serializer.toJson; +Serializer.fromJson = serializer.fromJson; - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - Contact.addType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact); - function CircleCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { - CollideCircles(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact); +function CircleCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + CollideCircles(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); +} +var CollideCircles = function (manifold, circleA, xfA, circleB, xfB) { + manifold.pointCount = 0; + var pA = Transform.mulVec2(xfA, circleA.m_p); + var pB = Transform.mulVec2(xfB, circleB.m_p); + var distSqr = Vec2.distanceSquared(pB, pA); + var rA = circleA.m_radius; + var rB = circleB.m_radius; + var radius = rA + rB; + if (distSqr > radius * radius) { + return; } - function CollideCircles(manifold, circleA, xfA, circleB, xfB) { - manifold.pointCount = 0; - var pA = Transform.mulVec2(xfA, circleA.m_p); - var pB = Transform.mulVec2(xfB, circleB.m_p); - var distSqr = Vec2.distanceSquared(pB, pA); - var rA = circleA.m_radius; - var rB = circleB.m_radius; - var radius = rA + rB; - if (distSqr > radius * radius) { + manifold.type = ManifoldType.e_circles; + manifold.localPoint.setVec2(circleA.m_p); + manifold.localNormal.setZero(); + manifold.pointCount = 1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(EdgeShape.TYPE, CircleShape.TYPE, EdgeCircleContact); +Contact.addType(ChainShape.TYPE, CircleShape.TYPE, ChainCircleContact); +function EdgeCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + var shapeA = fixtureA.getShape(); + var shapeB = fixtureB.getShape(); + CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB); +} +function ChainCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + var chain = fixtureA.getShape(); + var edge = new EdgeShape(); + chain.getChildEdge(edge, indexA); + var shapeA = edge; + var shapeB = fixtureB.getShape(); + CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB); +} +// Compute contact points for edge versus circle. +// This accounts for edge connectivity. +var CollideEdgeCircle = function (manifold, edgeA, xfA, circleB, xfB) { + manifold.pointCount = 0; + // Compute circle in frame of edge + var Q = Transform.mulTVec2(xfA, Transform.mulVec2(xfB, circleB.m_p)); + var A = edgeA.m_vertex1; + var B = edgeA.m_vertex2; + var e = Vec2.sub(B, A); + // Barycentric coordinates + var u = Vec2.dot(e, Vec2.sub(B, Q)); + var v = Vec2.dot(e, Vec2.sub(Q, A)); + var radius = edgeA.m_radius + circleB.m_radius; + // Region A + if (v <= 0.0) { + var P_1 = Vec2.clone(A); + var d_1 = Vec2.sub(Q, P_1); + var dd_1 = Vec2.dot(d_1, d_1); + if (dd_1 > radius * radius) { return; } + // Is there an edge connected to A? + if (edgeA.m_hasVertex0) { + var A1 = edgeA.m_vertex0; + var B1 = A; + var e1 = Vec2.sub(B1, A1); + var u1 = Vec2.dot(e1, Vec2.sub(B1, Q)); + // Is the circle in Region AB of the previous edge? + if (u1 > 0.0) { + return; + } + } manifold.type = ManifoldType.e_circles; - manifold.localPoint.setVec2(circleA.m_p); manifold.localNormal.setZero(); + manifold.localPoint.setVec2(P_1); manifold.pointCount = 1; manifold.points[0].localPoint.setVec2(circleB.m_p); // manifold.points[0].id.key = 0; @@ -13849,1002 +13946,930 @@ manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; manifold.points[0].id.cf.indexB = 0; manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; + return; } - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - Contact.addType(EdgeShape.TYPE, CircleShape.TYPE, EdgeCircleContact); - Contact.addType(ChainShape.TYPE, CircleShape.TYPE, ChainCircleContact); - function EdgeCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { - var shapeA = fixtureA.getShape(); - var shapeB = fixtureB.getShape(); - CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB); - } - function ChainCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { - var chain = fixtureA.getShape(); - var edge = new EdgeShape(); - chain.getChildEdge(edge, indexA); - var shapeA = edge; - var shapeB = fixtureB.getShape(); - CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB); - } - // Compute contact points for edge versus circle. - // This accounts for edge connectivity. - function CollideEdgeCircle(manifold, edgeA, xfA, circleB, xfB) { - manifold.pointCount = 0; - // Compute circle in frame of edge - var Q = Transform.mulTVec2(xfA, Transform.mulVec2(xfB, circleB.m_p)); - var A = edgeA.m_vertex1; - var B = edgeA.m_vertex2; - var e = Vec2.sub(B, A); - // Barycentric coordinates - var u = Vec2.dot(e, Vec2.sub(B, Q)); - var v = Vec2.dot(e, Vec2.sub(Q, A)); - var radius = edgeA.m_radius + circleB.m_radius; - // Region A - if (v <= 0.0) { - var P_1 = Vec2.clone(A); - var d_1 = Vec2.sub(Q, P_1); - var dd_1 = Vec2.dot(d_1, d_1); - if (dd_1 > radius * radius) { - return; - } - // Is there an edge connected to A? - if (edgeA.m_hasVertex0) { - var A1 = edgeA.m_vertex0; - var B1 = A; - var e1 = Vec2.sub(B1, A1); - var u1 = Vec2.dot(e1, Vec2.sub(B1, Q)); - // Is the circle in Region AB of the previous edge? - if (u1 > 0.0) { - return; - } - } - manifold.type = ManifoldType.e_circles; - manifold.localNormal.setZero(); - manifold.localPoint.setVec2(P_1); - manifold.pointCount = 1; - manifold.points[0].localPoint.setVec2(circleB.m_p); - // manifold.points[0].id.key = 0; - manifold.points[0].id.cf.indexA = 0; - manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; - manifold.points[0].id.cf.indexB = 0; - manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; + // Region B + if (u <= 0.0) { + var P_2 = Vec2.clone(B); + var d_2 = Vec2.sub(Q, P_2); + var dd_2 = Vec2.dot(d_2, d_2); + if (dd_2 > radius * radius) { return; } - // Region B - if (u <= 0.0) { - var P_2 = Vec2.clone(B); - var d_2 = Vec2.sub(Q, P_2); - var dd_2 = Vec2.dot(d_2, d_2); - if (dd_2 > radius * radius) { + // Is there an edge connected to B? + if (edgeA.m_hasVertex3) { + var B2 = edgeA.m_vertex3; + var A2 = B; + var e2 = Vec2.sub(B2, A2); + var v2 = Vec2.dot(e2, Vec2.sub(Q, A2)); + // Is the circle in Region AB of the next edge? + if (v2 > 0.0) { return; } - // Is there an edge connected to B? - if (edgeA.m_hasVertex3) { - var B2 = edgeA.m_vertex3; - var A2 = B; - var e2 = Vec2.sub(B2, A2); - var v2 = Vec2.dot(e2, Vec2.sub(Q, A2)); - // Is the circle in Region AB of the next edge? - if (v2 > 0.0) { - return; - } + } + manifold.type = ManifoldType.e_circles; + manifold.localNormal.setZero(); + manifold.localPoint.setVec2(P_2); + manifold.pointCount = 1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 1; + manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; + return; + } + // Region AB + var den = Vec2.dot(e, e); + var P = Vec2.combine(u / den, A, v / den, B); + var d = Vec2.sub(Q, P); + var dd = Vec2.dot(d, d); + if (dd > radius * radius) { + return; + } + var n = Vec2.neo(-e.y, e.x); + if (Vec2.dot(n, Vec2.sub(Q, A)) < 0.0) { + n.setNum(-n.x, -n.y); + } + n.normalize(); + manifold.type = ManifoldType.e_faceA; + manifold.localNormal = n; + manifold.localPoint.setVec2(A); + manifold.pointCount = 1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = ContactFeatureType.e_face; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(PolygonShape.TYPE, PolygonShape.TYPE, PolygonContact); +function PolygonContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + CollidePolygons(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); +} +/** + * Find the max separation between poly1 and poly2 using edge normals from + * poly1. + */ +function findMaxSeparation(poly1, xf1, poly2, xf2, output) { + var count1 = poly1.m_count; + var count2 = poly2.m_count; + var n1s = poly1.m_normals; + var v1s = poly1.m_vertices; + var v2s = poly2.m_vertices; + var xf = Transform.mulTXf(xf2, xf1); + var bestIndex = 0; + var maxSeparation = -Infinity; + for (var i = 0; i < count1; ++i) { + // Get poly1 normal in frame2. + var n = Rot.mulVec2(xf.q, n1s[i]); + var v1 = Transform.mulVec2(xf, v1s[i]); + // Find deepest point for normal i. + var si = Infinity; + for (var j = 0; j < count2; ++j) { + var sij = Vec2.dot(n, v2s[j]) - Vec2.dot(n, v1); + if (sij < si) { + si = sij; } - manifold.type = ManifoldType.e_circles; - manifold.localNormal.setZero(); - manifold.localPoint.setVec2(P_2); - manifold.pointCount = 1; - manifold.points[0].localPoint.setVec2(circleB.m_p); - // manifold.points[0].id.key = 0; - manifold.points[0].id.cf.indexA = 1; - manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; - manifold.points[0].id.cf.indexB = 0; - manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; + } + if (si > maxSeparation) { + maxSeparation = si; + bestIndex = i; + } + } + // used to keep last FindMaxSeparation call values + output.maxSeparation = maxSeparation; + output.bestIndex = bestIndex; +} +function findIncidentEdge(c, poly1, xf1, edge1, poly2, xf2) { + var normals1 = poly1.m_normals; + var count2 = poly2.m_count; + var vertices2 = poly2.m_vertices; + var normals2 = poly2.m_normals; + // Get the normal of the reference edge in poly2's frame. + var normal1 = Rot.mulTVec2(xf2.q, Rot.mulVec2(xf1.q, normals1[edge1])); + // Find the incident edge on poly2. + var index = 0; + var minDot = Infinity; + for (var i = 0; i < count2; ++i) { + var dot = Vec2.dot(normal1, normals2[i]); + if (dot < minDot) { + minDot = dot; + index = i; + } + } + // Build the clip vertices for the incident edge. + var i1 = index; + var i2 = i1 + 1 < count2 ? i1 + 1 : 0; + c[0].v = Transform.mulVec2(xf2, vertices2[i1]); + c[0].id.cf.indexA = edge1; + c[0].id.cf.indexB = i1; + c[0].id.cf.typeA = ContactFeatureType.e_face; + c[0].id.cf.typeB = ContactFeatureType.e_vertex; + c[1].v = Transform.mulVec2(xf2, vertices2[i2]); + c[1].id.cf.indexA = edge1; + c[1].id.cf.indexB = i2; + c[1].id.cf.typeA = ContactFeatureType.e_face; + c[1].id.cf.typeB = ContactFeatureType.e_vertex; +} +var maxSeparation = { + maxSeparation: 0, + bestIndex: 0, +}; +/** + * + * Find edge normal of max separation on A - return if separating axis is found
+ * Find edge normal of max separation on B - return if separation axis is found
+ * Choose reference edge as min(minA, minB)
+ * Find incident edge
+ * Clip + * + * The normal points from 1 to 2 + */ +var CollidePolygons = function (manifold, polyA, xfA, polyB, xfB) { + manifold.pointCount = 0; + var totalRadius = polyA.m_radius + polyB.m_radius; + findMaxSeparation(polyA, xfA, polyB, xfB, maxSeparation); + var edgeA = maxSeparation.bestIndex; + var separationA = maxSeparation.maxSeparation; + if (separationA > totalRadius) + return; + findMaxSeparation(polyB, xfB, polyA, xfA, maxSeparation); + var edgeB = maxSeparation.bestIndex; + var separationB = maxSeparation.maxSeparation; + if (separationB > totalRadius) + return; + var poly1; // reference polygon + var poly2; // incident polygon + var xf1; + var xf2; + var edge1; // reference edge + var flip; + var k_tol = 0.1 * Settings.linearSlop; + if (separationB > separationA + k_tol) { + poly1 = polyB; + poly2 = polyA; + xf1 = xfB; + xf2 = xfA; + edge1 = edgeB; + manifold.type = ManifoldType.e_faceB; + flip = 1; + } + else { + poly1 = polyA; + poly2 = polyB; + xf1 = xfA; + xf2 = xfB; + edge1 = edgeA; + manifold.type = ManifoldType.e_faceA; + flip = 0; + } + var incidentEdge = [new ClipVertex(), new ClipVertex()]; + findIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2); + var count1 = poly1.m_count; + var vertices1 = poly1.m_vertices; + var iv1 = edge1; + var iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0; + var v11 = vertices1[iv1]; + var v12 = vertices1[iv2]; + var localTangent = Vec2.sub(v12, v11); + localTangent.normalize(); + var localNormal = Vec2.crossVec2Num(localTangent, 1.0); + var planePoint = Vec2.combine(0.5, v11, 0.5, v12); + var tangent = Rot.mulVec2(xf1.q, localTangent); + var normal = Vec2.crossVec2Num(tangent, 1.0); + v11 = Transform.mulVec2(xf1, v11); + v12 = Transform.mulVec2(xf1, v12); + // Face offset. + var frontOffset = Vec2.dot(normal, v11); + // Side offsets, extended by polytope skin thickness. + var sideOffset1 = -Vec2.dot(tangent, v11) + totalRadius; + var sideOffset2 = Vec2.dot(tangent, v12) + totalRadius; + // Clip incident edge against extruded edge1 side edges. + var clipPoints1 = [new ClipVertex(), new ClipVertex()]; + var clipPoints2 = [new ClipVertex(), new ClipVertex()]; + var np; + // Clip to box side 1 + np = clipSegmentToLine(clipPoints1, incidentEdge, Vec2.neg(tangent), sideOffset1, iv1); + if (np < 2) { + return; + } + // Clip to negative box side 1 + np = clipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2); + if (np < 2) { + return; + } + // Now clipPoints2 contains the clipped points. + manifold.localNormal = localNormal; + manifold.localPoint = planePoint; + var pointCount = 0; + for (var i = 0; i < clipPoints2.length /* maxManifoldPoints */; ++i) { + var separation = Vec2.dot(normal, clipPoints2[i].v) - frontOffset; + if (separation <= totalRadius) { + var cp = manifold.points[pointCount]; + cp.localPoint.setVec2(Transform.mulTVec2(xf2, clipPoints2[i].v)); + cp.id = clipPoints2[i].id; + if (flip) { + // Swap features + var cf = cp.id.cf; + var indexA = cf.indexA; + var indexB = cf.indexB; + var typeA = cf.typeA; + var typeB = cf.typeB; + cf.indexA = indexB; + cf.indexB = indexA; + cf.typeA = typeB; + cf.typeB = typeA; + } + ++pointCount; + } + } + manifold.pointCount = pointCount; +}; + +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(PolygonShape.TYPE, CircleShape.TYPE, PolygonCircleContact); +function PolygonCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { + CollidePolygonCircle(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); +} +var CollidePolygonCircle = function (manifold, polygonA, xfA, circleB, xfB) { + manifold.pointCount = 0; + // Compute circle position in the frame of the polygon. + var c = Transform.mulVec2(xfB, circleB.m_p); + var cLocal = Transform.mulTVec2(xfA, c); + // Find the min separating edge. + var normalIndex = 0; + var separation = -Infinity; + var radius = polygonA.m_radius + circleB.m_radius; + var vertexCount = polygonA.m_count; + var vertices = polygonA.m_vertices; + var normals = polygonA.m_normals; + for (var i = 0; i < vertexCount; ++i) { + var s = Vec2.dot(normals[i], Vec2.sub(cLocal, vertices[i])); + if (s > radius) { + // Early out. + return; + } + if (s > separation) { + separation = s; + normalIndex = i; + } + } + // Vertices that subtend the incident face. + var vertIndex1 = normalIndex; + var vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0; + var v1 = vertices[vertIndex1]; + var v2 = vertices[vertIndex2]; + // If the center is inside the polygon ... + if (separation < math.EPSILON) { + manifold.pointCount = 1; + manifold.type = ManifoldType.e_faceA; + manifold.localNormal.setVec2(normals[normalIndex]); + manifold.localPoint.setCombine(0.5, v1, 0.5, v2); + manifold.points[0].localPoint = circleB.m_p; + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; + return; + } + // Compute barycentric coordinates + var u1 = Vec2.dot(Vec2.sub(cLocal, v1), Vec2.sub(v2, v1)); + var u2 = Vec2.dot(Vec2.sub(cLocal, v2), Vec2.sub(v1, v2)); + if (u1 <= 0.0) { + if (Vec2.distanceSquared(cLocal, v1) > radius * radius) { + return; + } + manifold.pointCount = 1; + manifold.type = ManifoldType.e_faceA; + manifold.localNormal.setCombine(1, cLocal, -1, v1); + manifold.localNormal.normalize(); + manifold.localPoint = v1; + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; + } + else if (u2 <= 0.0) { + if (Vec2.distanceSquared(cLocal, v2) > radius * radius) { return; } - // Region AB - var den = Vec2.dot(e, e); - var P = Vec2.combine(u / den, A, v / den, B); - var d = Vec2.sub(Q, P); - var dd = Vec2.dot(d, d); - if (dd > radius * radius) { + manifold.pointCount = 1; + manifold.type = ManifoldType.e_faceA; + manifold.localNormal.setCombine(1, cLocal, -1, v2); + manifold.localNormal.normalize(); + manifold.localPoint.setVec2(v2); + manifold.points[0].localPoint.setVec2(circleB.m_p); + // manifold.points[0].id.key = 0; + manifold.points[0].id.cf.indexA = 0; + manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; + manifold.points[0].id.cf.indexB = 0; + manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; + } + else { + var faceCenter = Vec2.mid(v1, v2); + var separation_1 = Vec2.dot(cLocal, normals[vertIndex1]) - Vec2.dot(faceCenter, normals[vertIndex1]); + if (separation_1 > radius) { return; } - var n = Vec2.neo(-e.y, e.x); - if (Vec2.dot(n, Vec2.sub(Q, A)) < 0.0) { - n.setNum(-n.x, -n.y); - } - n.normalize(); - manifold.type = ManifoldType.e_faceA; - manifold.localNormal = n; - manifold.localPoint.setVec2(A); manifold.pointCount = 1; + manifold.type = ManifoldType.e_faceA; + manifold.localNormal.setVec2(normals[vertIndex1]); + manifold.localPoint.setVec2(faceCenter); manifold.points[0].localPoint.setVec2(circleB.m_p); // manifold.points[0].id.key = 0; manifold.points[0].id.cf.indexA = 0; - manifold.points[0].id.cf.typeA = ContactFeatureType.e_face; + manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; manifold.points[0].id.cf.indexB = 0; manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; } +}; - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - Contact.addType(PolygonShape.TYPE, PolygonShape.TYPE, PolygonContact); - function PolygonContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { - CollidePolygons(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); +/* + * Planck.js + * The MIT License + * Copyright (c) 2021 Erin Catto, Ali Shakiba + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Contact.addType(EdgeShape.TYPE, PolygonShape.TYPE, EdgePolygonContact); +Contact.addType(ChainShape.TYPE, PolygonShape.TYPE, ChainPolygonContact); +function EdgePolygonContact(manifold, xfA, fA, indexA, xfB, fB, indexB) { + CollideEdgePolygon(manifold, fA.getShape(), xfA, fB.getShape(), xfB); +} +function ChainPolygonContact(manifold, xfA, fA, indexA, xfB, fB, indexB) { + var chain = fA.getShape(); + var edge = new EdgeShape(); + chain.getChildEdge(edge, indexA); + CollideEdgePolygon(manifold, edge, xfA, fB.getShape(), xfB); +} +var EPAxisType; +(function (EPAxisType) { + EPAxisType[EPAxisType["e_unknown"] = -1] = "e_unknown"; + EPAxisType[EPAxisType["e_edgeA"] = 1] = "e_edgeA"; + EPAxisType[EPAxisType["e_edgeB"] = 2] = "e_edgeB"; +})(EPAxisType || (EPAxisType = {})); +// unused? +var VertexType; +(function (VertexType) { + VertexType[VertexType["e_isolated"] = 0] = "e_isolated"; + VertexType[VertexType["e_concave"] = 1] = "e_concave"; + VertexType[VertexType["e_convex"] = 2] = "e_convex"; +})(VertexType || (VertexType = {})); +/** + * This structure is used to keep track of the best separating axis. + */ +var EPAxis = /** @class */ (function () { + function EPAxis() { } - /** - * Find the max separation between poly1 and poly2 using edge normals from - * poly1. - */ - function findMaxSeparation(poly1, xf1, poly2, xf2, output) { - var count1 = poly1.m_count; - var count2 = poly2.m_count; - var n1s = poly1.m_normals; - var v1s = poly1.m_vertices; - var v2s = poly2.m_vertices; - var xf = Transform.mulTXf(xf2, xf1); - var bestIndex = 0; - var maxSeparation = -Infinity; - for (var i = 0; i < count1; ++i) { - // Get poly1 normal in frame2. - var n = Rot.mulVec2(xf.q, n1s[i]); - var v1 = Transform.mulVec2(xf, v1s[i]); - // Find deepest point for normal i. - var si = Infinity; - for (var j = 0; j < count2; ++j) { - var sij = Vec2.dot(n, v2s[j]) - Vec2.dot(n, v1); - if (sij < si) { - si = sij; - } - } - if (si > maxSeparation) { - maxSeparation = si; - bestIndex = i; - } - } - // used to keep last FindMaxSeparation call values - output.maxSeparation = maxSeparation; - output.bestIndex = bestIndex; + return EPAxis; +}()); +/** + * This holds polygon B expressed in frame A. + */ +var TempPolygon = /** @class */ (function () { + function TempPolygon() { + this.vertices = []; // [Settings.maxPolygonVertices] + this.normals = []; // [Settings.maxPolygonVertices]; + this.count = 0; } - function findIncidentEdge(c, poly1, xf1, edge1, poly2, xf2) { - var normals1 = poly1.m_normals; - var count2 = poly2.m_count; - var vertices2 = poly2.m_vertices; - var normals2 = poly2.m_normals; - // Get the normal of the reference edge in poly2's frame. - var normal1 = Rot.mulTVec2(xf2.q, Rot.mulVec2(xf1.q, normals1[edge1])); - // Find the incident edge on poly2. - var index = 0; - var minDot = Infinity; - for (var i = 0; i < count2; ++i) { - var dot = Vec2.dot(normal1, normals2[i]); - if (dot < minDot) { - minDot = dot; - index = i; - } - } - // Build the clip vertices for the incident edge. - var i1 = index; - var i2 = i1 + 1 < count2 ? i1 + 1 : 0; - c[0].v = Transform.mulVec2(xf2, vertices2[i1]); - c[0].id.cf.indexA = edge1; - c[0].id.cf.indexB = i1; - c[0].id.cf.typeA = ContactFeatureType.e_face; - c[0].id.cf.typeB = ContactFeatureType.e_vertex; - c[1].v = Transform.mulVec2(xf2, vertices2[i2]); - c[1].id.cf.indexA = edge1; - c[1].id.cf.indexB = i2; - c[1].id.cf.typeA = ContactFeatureType.e_face; - c[1].id.cf.typeB = ContactFeatureType.e_vertex; + return TempPolygon; +}()); +/** + * Reference face used for clipping + */ +var ReferenceFace = /** @class */ (function () { + function ReferenceFace() { + this.normal = Vec2.zero(); + this.sideNormal1 = Vec2.zero(); + this.sideNormal2 = Vec2.zero(); } - var maxSeparation = { - maxSeparation: 0, - bestIndex: 0, - }; - /** - * - * Find edge normal of max separation on A - return if separating axis is found
- * Find edge normal of max separation on B - return if separation axis is found
- * Choose reference edge as min(minA, minB)
- * Find incident edge
- * Clip - * - * The normal points from 1 to 2 - */ - function CollidePolygons(manifold, polyA, xfA, polyB, xfB) { - manifold.pointCount = 0; - var totalRadius = polyA.m_radius + polyB.m_radius; - findMaxSeparation(polyA, xfA, polyB, xfB, maxSeparation); - var edgeA = maxSeparation.bestIndex; - var separationA = maxSeparation.maxSeparation; - if (separationA > totalRadius) - return; - findMaxSeparation(polyB, xfB, polyA, xfA, maxSeparation); - var edgeB = maxSeparation.bestIndex; - var separationB = maxSeparation.maxSeparation; - if (separationB > totalRadius) - return; - var poly1; // reference polygon - var poly2; // incident polygon - var xf1; - var xf2; - var edge1; // reference edge - var flip; - var k_tol = 0.1 * Settings.linearSlop; - if (separationB > separationA + k_tol) { - poly1 = polyB; - poly2 = polyA; - xf1 = xfB; - xf2 = xfA; - edge1 = edgeB; - manifold.type = ManifoldType.e_faceB; - flip = 1; - } - else { - poly1 = polyA; - poly2 = polyB; - xf1 = xfA; - xf2 = xfB; - edge1 = edgeA; - manifold.type = ManifoldType.e_faceA; - flip = 0; - } - var incidentEdge = [new ClipVertex(), new ClipVertex()]; - findIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2); - var count1 = poly1.m_count; - var vertices1 = poly1.m_vertices; - var iv1 = edge1; - var iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0; - var v11 = vertices1[iv1]; - var v12 = vertices1[iv2]; - var localTangent = Vec2.sub(v12, v11); - localTangent.normalize(); - var localNormal = Vec2.crossVec2Num(localTangent, 1.0); - var planePoint = Vec2.combine(0.5, v11, 0.5, v12); - var tangent = Rot.mulVec2(xf1.q, localTangent); - var normal = Vec2.crossVec2Num(tangent, 1.0); - v11 = Transform.mulVec2(xf1, v11); - v12 = Transform.mulVec2(xf1, v12); - // Face offset. - var frontOffset = Vec2.dot(normal, v11); - // Side offsets, extended by polytope skin thickness. - var sideOffset1 = -Vec2.dot(tangent, v11) + totalRadius; - var sideOffset2 = Vec2.dot(tangent, v12) + totalRadius; - // Clip incident edge against extruded edge1 side edges. - var clipPoints1 = [new ClipVertex(), new ClipVertex()]; - var clipPoints2 = [new ClipVertex(), new ClipVertex()]; - var np; - // Clip to box side 1 - np = clipSegmentToLine(clipPoints1, incidentEdge, Vec2.neg(tangent), sideOffset1, iv1); - if (np < 2) { - return; - } - // Clip to negative box side 1 - np = clipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2); - if (np < 2) { - return; - } - // Now clipPoints2 contains the clipped points. - manifold.localNormal = localNormal; - manifold.localPoint = planePoint; - var pointCount = 0; - for (var i = 0; i < clipPoints2.length /* maxManifoldPoints */; ++i) { - var separation = Vec2.dot(normal, clipPoints2[i].v) - frontOffset; - if (separation <= totalRadius) { - var cp = manifold.points[pointCount]; - cp.localPoint.setVec2(Transform.mulTVec2(xf2, clipPoints2[i].v)); - cp.id = clipPoints2[i].id; - if (flip) { - // Swap features - var cf = cp.id.cf; - var indexA = cf.indexA; - var indexB = cf.indexB; - var typeA = cf.typeA; - var typeB = cf.typeB; - cf.indexA = indexB; - cf.indexB = indexA; - cf.typeA = typeB; - cf.typeB = typeA; - } - ++pointCount; - } - } - manifold.pointCount = pointCount; + return ReferenceFace; +}()); +// reused +var edgeAxis = new EPAxis(); +var polygonAxis = new EPAxis(); +var polygonBA = new TempPolygon(); +var rf = new ReferenceFace(); +/** + * This function collides and edge and a polygon, taking into account edge + * adjacency. + */ +var CollideEdgePolygon = function (manifold, edgeA, xfA, polygonB, xfB) { + // Algorithm: + // 1. Classify v1 and v2 + // 2. Classify polygon centroid as front or back + // 3. Flip normal if necessary + // 4. Initialize normal range to [-pi, pi] about face normal + // 5. Adjust normal range according to adjacent edges + // 6. Visit each separating axes, only accept axes within the range + // 7. Return if _any_ axis indicates separation + // 8. Clip + // let m_type1: VertexType; + // let m_type2: VertexType; + var xf = Transform.mulTXf(xfA, xfB); + var centroidB = Transform.mulVec2(xf, polygonB.m_centroid); + var v0 = edgeA.m_vertex0; + var v1 = edgeA.m_vertex1; + var v2 = edgeA.m_vertex2; + var v3 = edgeA.m_vertex3; + var hasVertex0 = edgeA.m_hasVertex0; + var hasVertex3 = edgeA.m_hasVertex3; + var edge1 = Vec2.sub(v2, v1); + edge1.normalize(); + var normal1 = Vec2.neo(edge1.y, -edge1.x); + var offset1 = Vec2.dot(normal1, Vec2.sub(centroidB, v1)); + var offset0 = 0.0; + var offset2 = 0.0; + var convex1 = false; + var convex2 = false; + var normal0; + var normal2; + // Is there a preceding edge? + if (hasVertex0) { + var edge0 = Vec2.sub(v1, v0); + edge0.normalize(); + normal0 = Vec2.neo(edge0.y, -edge0.x); + convex1 = Vec2.crossVec2Vec2(edge0, edge1) >= 0.0; + offset0 = Vec2.dot(normal0, centroidB) - Vec2.dot(normal0, v0); } - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - Contact.addType(PolygonShape.TYPE, CircleShape.TYPE, PolygonCircleContact); - function PolygonCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB, indexB) { - CollidePolygonCircle(manifold, fixtureA.getShape(), xfA, fixtureB.getShape(), xfB); + // Is there a following edge? + if (hasVertex3) { + var edge2 = Vec2.sub(v3, v2); + edge2.normalize(); + normal2 = Vec2.neo(edge2.y, -edge2.x); + convex2 = Vec2.crossVec2Vec2(edge1, edge2) > 0.0; + offset2 = Vec2.dot(normal2, centroidB) - Vec2.dot(normal2, v2); } - function CollidePolygonCircle(manifold, polygonA, xfA, circleB, xfB) { - manifold.pointCount = 0; - // Compute circle position in the frame of the polygon. - var c = Transform.mulVec2(xfB, circleB.m_p); - var cLocal = Transform.mulTVec2(xfA, c); - // Find the min separating edge. - var normalIndex = 0; - var separation = -Infinity; - var radius = polygonA.m_radius + circleB.m_radius; - var vertexCount = polygonA.m_count; - var vertices = polygonA.m_vertices; - var normals = polygonA.m_normals; - for (var i = 0; i < vertexCount; ++i) { - var s = Vec2.dot(normals[i], Vec2.sub(cLocal, vertices[i])); - if (s > radius) { - // Early out. - return; + var front; + var normal = Vec2.zero(); + var lowerLimit = Vec2.zero(); + var upperLimit = Vec2.zero(); + // Determine front or back collision. Determine collision normal limits. + if (hasVertex0 && hasVertex3) { + if (convex1 && convex2) { + front = offset0 >= 0.0 || offset1 >= 0.0 || offset2 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal0); + upperLimit.setVec2(normal2); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setMul(-1, normal1); } - if (s > separation) { - separation = s; - normalIndex = i; - } - } - // Vertices that subtend the incident face. - var vertIndex1 = normalIndex; - var vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0; - var v1 = vertices[vertIndex1]; - var v2 = vertices[vertIndex2]; - // If the center is inside the polygon ... - if (separation < math.EPSILON) { - manifold.pointCount = 1; - manifold.type = ManifoldType.e_faceA; - manifold.localNormal.setVec2(normals[normalIndex]); - manifold.localPoint.setCombine(0.5, v1, 0.5, v2); - manifold.points[0].localPoint = circleB.m_p; - // manifold.points[0].id.key = 0; - manifold.points[0].id.cf.indexA = 0; - manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; - manifold.points[0].id.cf.indexB = 0; - manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; - return; } - // Compute barycentric coordinates - var u1 = Vec2.dot(Vec2.sub(cLocal, v1), Vec2.sub(v2, v1)); - var u2 = Vec2.dot(Vec2.sub(cLocal, v2), Vec2.sub(v1, v2)); - if (u1 <= 0.0) { - if (Vec2.distanceSquared(cLocal, v1) > radius * radius) { - return; + else if (convex1) { + front = offset0 >= 0.0 || (offset1 >= 0.0 && offset2 >= 0.0); + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal0); + upperLimit.setVec2(normal1); } - manifold.pointCount = 1; - manifold.type = ManifoldType.e_faceA; - manifold.localNormal.setCombine(1, cLocal, -1, v1); - manifold.localNormal.normalize(); - manifold.localPoint = v1; - manifold.points[0].localPoint.setVec2(circleB.m_p); - // manifold.points[0].id.key = 0; - manifold.points[0].id.cf.indexA = 0; - manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; - manifold.points[0].id.cf.indexB = 0; - manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; - } - else if (u2 <= 0.0) { - if (Vec2.distanceSquared(cLocal, v2) > radius * radius) { - return; + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal2); + upperLimit.setMul(-1, normal1); } - manifold.pointCount = 1; - manifold.type = ManifoldType.e_faceA; - manifold.localNormal.setCombine(1, cLocal, -1, v2); - manifold.localNormal.normalize(); - manifold.localPoint.setVec2(v2); - manifold.points[0].localPoint.setVec2(circleB.m_p); - // manifold.points[0].id.key = 0; - manifold.points[0].id.cf.indexA = 0; - manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; - manifold.points[0].id.cf.indexB = 0; - manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; } - else { - var faceCenter = Vec2.mid(v1, v2); - var separation_1 = Vec2.dot(cLocal, normals[vertIndex1]) - Vec2.dot(faceCenter, normals[vertIndex1]); - if (separation_1 > radius) { - return; + else if (convex2) { + front = offset2 >= 0.0 || (offset0 >= 0.0 && offset1 >= 0.0); + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal1); + upperLimit.setVec2(normal2); + } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setMul(-1, normal0); } - manifold.pointCount = 1; - manifold.type = ManifoldType.e_faceA; - manifold.localNormal.setVec2(normals[vertIndex1]); - manifold.localPoint.setVec2(faceCenter); - manifold.points[0].localPoint.setVec2(circleB.m_p); - // manifold.points[0].id.key = 0; - manifold.points[0].id.cf.indexA = 0; - manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex; - manifold.points[0].id.cf.indexB = 0; - manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex; } - } - - /* - * Planck.js - * The MIT License - * Copyright (c) 2021 Erin Catto, Ali Shakiba - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - Contact.addType(EdgeShape.TYPE, PolygonShape.TYPE, EdgePolygonContact); - Contact.addType(ChainShape.TYPE, PolygonShape.TYPE, ChainPolygonContact); - function EdgePolygonContact(manifold, xfA, fA, indexA, xfB, fB, indexB) { - CollideEdgePolygon(manifold, fA.getShape(), xfA, fB.getShape(), xfB); - } - function ChainPolygonContact(manifold, xfA, fA, indexA, xfB, fB, indexB) { - var chain = fA.getShape(); - var edge = new EdgeShape(); - chain.getChildEdge(edge, indexA); - CollideEdgePolygon(manifold, edge, xfA, fB.getShape(), xfB); - } - var EPAxisType; - (function (EPAxisType) { - EPAxisType[EPAxisType["e_unknown"] = -1] = "e_unknown"; - EPAxisType[EPAxisType["e_edgeA"] = 1] = "e_edgeA"; - EPAxisType[EPAxisType["e_edgeB"] = 2] = "e_edgeB"; - })(EPAxisType || (EPAxisType = {})); - // unused? - var VertexType; - (function (VertexType) { - VertexType[VertexType["e_isolated"] = 0] = "e_isolated"; - VertexType[VertexType["e_concave"] = 1] = "e_concave"; - VertexType[VertexType["e_convex"] = 2] = "e_convex"; - })(VertexType || (VertexType = {})); - /** - * This structure is used to keep track of the best separating axis. - */ - var EPAxis = /** @class */ (function () { - function EPAxis() { - } - return EPAxis; - }()); - /** - * This holds polygon B expressed in frame A. - */ - var TempPolygon = /** @class */ (function () { - function TempPolygon() { - this.vertices = []; // [Settings.maxPolygonVertices] - this.normals = []; // [Settings.maxPolygonVertices]; - this.count = 0; - } - return TempPolygon; - }()); - /** - * Reference face used for clipping - */ - var ReferenceFace = /** @class */ (function () { - function ReferenceFace() { - this.normal = Vec2.zero(); - this.sideNormal1 = Vec2.zero(); - this.sideNormal2 = Vec2.zero(); - } - return ReferenceFace; - }()); - // reused - var edgeAxis = new EPAxis(); - var polygonAxis = new EPAxis(); - var polygonBA = new TempPolygon(); - var rf = new ReferenceFace(); - /** - * This function collides and edge and a polygon, taking into account edge - * adjacency. - */ - function CollideEdgePolygon(manifold, edgeA, xfA, polygonB, xfB) { - // Algorithm: - // 1. Classify v1 and v2 - // 2. Classify polygon centroid as front or back - // 3. Flip normal if necessary - // 4. Initialize normal range to [-pi, pi] about face normal - // 5. Adjust normal range according to adjacent edges - // 6. Visit each separating axes, only accept axes within the range - // 7. Return if _any_ axis indicates separation - // 8. Clip - // let m_type1: VertexType; - // let m_type2: VertexType; - var xf = Transform.mulTXf(xfA, xfB); - var centroidB = Transform.mulVec2(xf, polygonB.m_centroid); - var v0 = edgeA.m_vertex0; - var v1 = edgeA.m_vertex1; - var v2 = edgeA.m_vertex2; - var v3 = edgeA.m_vertex3; - var hasVertex0 = edgeA.m_hasVertex0; - var hasVertex3 = edgeA.m_hasVertex3; - var edge1 = Vec2.sub(v2, v1); - edge1.normalize(); - var normal1 = Vec2.neo(edge1.y, -edge1.x); - var offset1 = Vec2.dot(normal1, Vec2.sub(centroidB, v1)); - var offset0 = 0.0; - var offset2 = 0.0; - var convex1 = false; - var convex2 = false; - var normal0; - var normal2; - // Is there a preceding edge? - if (hasVertex0) { - var edge0 = Vec2.sub(v1, v0); - edge0.normalize(); - normal0 = Vec2.neo(edge0.y, -edge0.x); - convex1 = Vec2.crossVec2Vec2(edge0, edge1) >= 0.0; - offset0 = Vec2.dot(normal0, centroidB) - Vec2.dot(normal0, v0); - } - // Is there a following edge? - if (hasVertex3) { - var edge2 = Vec2.sub(v3, v2); - edge2.normalize(); - normal2 = Vec2.neo(edge2.y, -edge2.x); - convex2 = Vec2.crossVec2Vec2(edge1, edge2) > 0.0; - offset2 = Vec2.dot(normal2, centroidB) - Vec2.dot(normal2, v2); - } - var front; - var normal = Vec2.zero(); - var lowerLimit = Vec2.zero(); - var upperLimit = Vec2.zero(); - // Determine front or back collision. Determine collision normal limits. - if (hasVertex0 && hasVertex3) { - if (convex1 && convex2) { - front = offset0 >= 0.0 || offset1 >= 0.0 || offset2 >= 0.0; - if (front) { - normal.setVec2(normal1); - lowerLimit.setVec2(normal0); - upperLimit.setVec2(normal2); - } - else { - normal.setMul(-1, normal1); - lowerLimit.setMul(-1, normal1); - upperLimit.setMul(-1, normal1); - } + else { + front = offset0 >= 0.0 && offset1 >= 0.0 && offset2 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal1); + upperLimit.setVec2(normal1); } - else if (convex1) { - front = offset0 >= 0.0 || (offset1 >= 0.0 && offset2 >= 0.0); - if (front) { - normal.setVec2(normal1); - lowerLimit.setVec2(normal0); - upperLimit.setVec2(normal1); - } - else { - normal.setMul(-1, normal1); - lowerLimit.setMul(-1, normal2); - upperLimit.setMul(-1, normal1); - } + else { + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal2); + upperLimit.setMul(-1, normal0); } - else if (convex2) { - front = offset2 >= 0.0 || (offset0 >= 0.0 && offset1 >= 0.0); - if (front) { - normal.setVec2(normal1); - lowerLimit.setVec2(normal1); - upperLimit.setVec2(normal2); - } - else { - normal.setMul(-1, normal1); - lowerLimit.setMul(-1, normal1); - upperLimit.setMul(-1, normal0); - } + } + } + else if (hasVertex0) { + if (convex1) { + front = offset0 >= 0.0 || offset1 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal0); + upperLimit.setMul(-1, normal1); } else { - front = offset0 >= 0.0 && offset1 >= 0.0 && offset2 >= 0.0; - if (front) { - normal.setVec2(normal1); - lowerLimit.setVec2(normal1); - upperLimit.setVec2(normal1); - } - else { - normal.setMul(-1, normal1); - lowerLimit.setMul(-1, normal2); - upperLimit.setMul(-1, normal0); - } + normal.setMul(-1, normal1); + lowerLimit.setVec2(normal1); + upperLimit.setMul(-1, normal1); } } - else if (hasVertex0) { - if (convex1) { - front = offset0 >= 0.0 || offset1 >= 0.0; - if (front) { - normal.setVec2(normal1); - lowerLimit.setVec2(normal0); - upperLimit.setMul(-1, normal1); - } - else { - normal.setMul(-1, normal1); - lowerLimit.setVec2(normal1); - upperLimit.setMul(-1, normal1); - } + else { + front = offset0 >= 0.0 && offset1 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setVec2(normal1); + upperLimit.setMul(-1, normal1); } else { - front = offset0 >= 0.0 && offset1 >= 0.0; - if (front) { - normal.setVec2(normal1); - lowerLimit.setVec2(normal1); - upperLimit.setMul(-1, normal1); - } - else { - normal.setMul(-1, normal1); - lowerLimit.setVec2(normal1); - upperLimit.setMul(-1, normal0); - } + normal.setMul(-1, normal1); + lowerLimit.setVec2(normal1); + upperLimit.setMul(-1, normal0); } } - else if (hasVertex3) { - if (convex2) { - front = offset1 >= 0.0 || offset2 >= 0.0; - if (front) { - normal.setVec2(normal1); - lowerLimit.setMul(-1, normal1); - upperLimit.setVec2(normal2); - } - else { - normal.setMul(-1, normal1); - lowerLimit.setMul(-1, normal1); - upperLimit.setVec2(normal1); - } + } + else if (hasVertex3) { + if (convex2) { + front = offset1 >= 0.0 || offset2 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setVec2(normal2); } else { - front = offset1 >= 0.0 && offset2 >= 0.0; - if (front) { - normal.setVec2(normal1); - lowerLimit.setMul(-1, normal1); - upperLimit.setVec2(normal1); - } - else { - normal.setMul(-1, normal1); - lowerLimit.setMul(-1, normal2); - upperLimit.setVec2(normal1); - } + normal.setMul(-1, normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setVec2(normal1); } } else { - front = offset1 >= 0.0; + front = offset1 >= 0.0 && offset2 >= 0.0; if (front) { normal.setVec2(normal1); lowerLimit.setMul(-1, normal1); - upperLimit.setMul(-1, normal1); + upperLimit.setVec2(normal1); } else { normal.setMul(-1, normal1); - lowerLimit.setVec2(normal1); + lowerLimit.setMul(-1, normal2); upperLimit.setVec2(normal1); } } - // Get polygonB in frameA - polygonBA.count = polygonB.m_count; - for (var i = 0; i < polygonB.m_count; ++i) { - polygonBA.vertices[i] = Transform.mulVec2(xf, polygonB.m_vertices[i]); - polygonBA.normals[i] = Rot.mulVec2(xf.q, polygonB.m_normals[i]); - } - var radius = 2.0 * Settings.polygonRadius; - manifold.pointCount = 0; - { // ComputeEdgeSeparation - edgeAxis.type = EPAxisType.e_edgeA; - edgeAxis.index = front ? 0 : 1; - edgeAxis.separation = Infinity; - for (var i = 0; i < polygonBA.count; ++i) { - var s = Vec2.dot(normal, Vec2.sub(polygonBA.vertices[i], v1)); - if (s < edgeAxis.separation) { - edgeAxis.separation = s; - } - } - } - // If no valid normal can be found than this edge should not collide. - // @ts-ignore - if (edgeAxis.type == EPAxisType.e_unknown) { - return; + } + else { + front = offset1 >= 0.0; + if (front) { + normal.setVec2(normal1); + lowerLimit.setMul(-1, normal1); + upperLimit.setMul(-1, normal1); } - if (edgeAxis.separation > radius) { - return; + else { + normal.setMul(-1, normal1); + lowerLimit.setVec2(normal1); + upperLimit.setVec2(normal1); } - { // ComputePolygonSeparation - polygonAxis.type = EPAxisType.e_unknown; - polygonAxis.index = -1; - polygonAxis.separation = -Infinity; - var perp = Vec2.neo(-normal.y, normal.x); - for (var i = 0; i < polygonBA.count; ++i) { - var n = Vec2.neg(polygonBA.normals[i]); - var s1 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v1)); - var s2 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v2)); - var s = math.min(s1, s2); - if (s > radius) { - // No collision - polygonAxis.type = EPAxisType.e_edgeB; - polygonAxis.index = i; - polygonAxis.separation = s; - break; - } - // Adjacency - if (Vec2.dot(n, perp) >= 0.0) { - if (Vec2.dot(Vec2.sub(n, upperLimit), normal) < -Settings.angularSlop) { - continue; - } - } - else { - if (Vec2.dot(Vec2.sub(n, lowerLimit), normal) < -Settings.angularSlop) { - continue; - } - } - if (s > polygonAxis.separation) { - polygonAxis.type = EPAxisType.e_edgeB; - polygonAxis.index = i; - polygonAxis.separation = s; - } + } + // Get polygonB in frameA + polygonBA.count = polygonB.m_count; + for (var i = 0; i < polygonB.m_count; ++i) { + polygonBA.vertices[i] = Transform.mulVec2(xf, polygonB.m_vertices[i]); + polygonBA.normals[i] = Rot.mulVec2(xf.q, polygonB.m_normals[i]); + } + var radius = 2.0 * Settings.polygonRadius; + manifold.pointCount = 0; + { // ComputeEdgeSeparation + edgeAxis.type = EPAxisType.e_edgeA; + edgeAxis.index = front ? 0 : 1; + edgeAxis.separation = Infinity; + for (var i = 0; i < polygonBA.count; ++i) { + var s = Vec2.dot(normal, Vec2.sub(polygonBA.vertices[i], v1)); + if (s < edgeAxis.separation) { + edgeAxis.separation = s; } } - if (polygonAxis.type != EPAxisType.e_unknown && polygonAxis.separation > radius) { - return; - } - // Use hysteresis for jitter reduction. - var k_relativeTol = 0.98; - var k_absoluteTol = 0.001; - var primaryAxis; - if (polygonAxis.type == EPAxisType.e_unknown) { - primaryAxis = edgeAxis; - } - else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) { - primaryAxis = polygonAxis; - } - else { - primaryAxis = edgeAxis; - } - var ie = [new ClipVertex(), new ClipVertex()]; - if (primaryAxis.type == EPAxisType.e_edgeA) { - manifold.type = ManifoldType.e_faceA; - // Search for the polygon normal that is most anti-parallel to the edge - // normal. - var bestIndex = 0; - var bestValue = Vec2.dot(normal, polygonBA.normals[0]); - for (var i = 1; i < polygonBA.count; ++i) { - var value = Vec2.dot(normal, polygonBA.normals[i]); - if (value < bestValue) { - bestValue = value; - bestIndex = i; - } + } + // If no valid normal can be found than this edge should not collide. + // @ts-ignore + if (edgeAxis.type == EPAxisType.e_unknown) { + return; + } + if (edgeAxis.separation > radius) { + return; + } + { // ComputePolygonSeparation + polygonAxis.type = EPAxisType.e_unknown; + polygonAxis.index = -1; + polygonAxis.separation = -Infinity; + var perp = Vec2.neo(-normal.y, normal.x); + for (var i = 0; i < polygonBA.count; ++i) { + var n = Vec2.neg(polygonBA.normals[i]); + var s1 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v1)); + var s2 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v2)); + var s = math.min(s1, s2); + if (s > radius) { + // No collision + polygonAxis.type = EPAxisType.e_edgeB; + polygonAxis.index = i; + polygonAxis.separation = s; + break; } - var i1 = bestIndex; - var i2 = i1 + 1 < polygonBA.count ? i1 + 1 : 0; - ie[0].v = polygonBA.vertices[i1]; - ie[0].id.cf.indexA = 0; - ie[0].id.cf.indexB = i1; - ie[0].id.cf.typeA = ContactFeatureType.e_face; - ie[0].id.cf.typeB = ContactFeatureType.e_vertex; - ie[1].v = polygonBA.vertices[i2]; - ie[1].id.cf.indexA = 0; - ie[1].id.cf.indexB = i2; - ie[1].id.cf.typeA = ContactFeatureType.e_face; - ie[1].id.cf.typeB = ContactFeatureType.e_vertex; - if (front) { - rf.i1 = 0; - rf.i2 = 1; - rf.v1 = v1; - rf.v2 = v2; - rf.normal.setVec2(normal1); + // Adjacency + if (Vec2.dot(n, perp) >= 0.0) { + if (Vec2.dot(Vec2.sub(n, upperLimit), normal) < -Settings.angularSlop) { + continue; + } } else { - rf.i1 = 1; - rf.i2 = 0; - rf.v1 = v2; - rf.v2 = v1; - rf.normal.setMul(-1, normal1); + if (Vec2.dot(Vec2.sub(n, lowerLimit), normal) < -Settings.angularSlop) { + continue; + } + } + if (s > polygonAxis.separation) { + polygonAxis.type = EPAxisType.e_edgeB; + polygonAxis.index = i; + polygonAxis.separation = s; } } - else { - manifold.type = ManifoldType.e_faceB; - ie[0].v = v1; - ie[0].id.cf.indexA = 0; - ie[0].id.cf.indexB = primaryAxis.index; - ie[0].id.cf.typeA = ContactFeatureType.e_vertex; - ie[0].id.cf.typeB = ContactFeatureType.e_face; - ie[1].v = v2; - ie[1].id.cf.indexA = 0; - ie[1].id.cf.indexB = primaryAxis.index; - ie[1].id.cf.typeA = ContactFeatureType.e_vertex; - ie[1].id.cf.typeB = ContactFeatureType.e_face; - rf.i1 = primaryAxis.index; - rf.i2 = rf.i1 + 1 < polygonBA.count ? rf.i1 + 1 : 0; - rf.v1 = polygonBA.vertices[rf.i1]; - rf.v2 = polygonBA.vertices[rf.i2]; - rf.normal.setVec2(polygonBA.normals[rf.i1]); - } - rf.sideNormal1.setNum(rf.normal.y, -rf.normal.x); - rf.sideNormal2.setMul(-1, rf.sideNormal1); - rf.sideOffset1 = Vec2.dot(rf.sideNormal1, rf.v1); - rf.sideOffset2 = Vec2.dot(rf.sideNormal2, rf.v2); - // Clip incident edge against extruded edge1 side edges. - var clipPoints1 = [new ClipVertex(), new ClipVertex()]; - var clipPoints2 = [new ClipVertex(), new ClipVertex()]; - var np; - // Clip to box side 1 - np = clipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1); - if (np < Settings.maxManifoldPoints) { - return; - } - // Clip to negative box side 1 - np = clipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2); - if (np < Settings.maxManifoldPoints) { - return; + } + if (polygonAxis.type != EPAxisType.e_unknown && polygonAxis.separation > radius) { + return; + } + // Use hysteresis for jitter reduction. + var k_relativeTol = 0.98; + var k_absoluteTol = 0.001; + var primaryAxis; + if (polygonAxis.type == EPAxisType.e_unknown) { + primaryAxis = edgeAxis; + } + else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) { + primaryAxis = polygonAxis; + } + else { + primaryAxis = edgeAxis; + } + var ie = [new ClipVertex(), new ClipVertex()]; + if (primaryAxis.type == EPAxisType.e_edgeA) { + manifold.type = ManifoldType.e_faceA; + // Search for the polygon normal that is most anti-parallel to the edge + // normal. + var bestIndex = 0; + var bestValue = Vec2.dot(normal, polygonBA.normals[0]); + for (var i = 1; i < polygonBA.count; ++i) { + var value = Vec2.dot(normal, polygonBA.normals[i]); + if (value < bestValue) { + bestValue = value; + bestIndex = i; + } } - // Now clipPoints2 contains the clipped points. - if (primaryAxis.type == EPAxisType.e_edgeA) { - manifold.localNormal = Vec2.clone(rf.normal); - manifold.localPoint = Vec2.clone(rf.v1); + var i1 = bestIndex; + var i2 = i1 + 1 < polygonBA.count ? i1 + 1 : 0; + ie[0].v = polygonBA.vertices[i1]; + ie[0].id.cf.indexA = 0; + ie[0].id.cf.indexB = i1; + ie[0].id.cf.typeA = ContactFeatureType.e_face; + ie[0].id.cf.typeB = ContactFeatureType.e_vertex; + ie[1].v = polygonBA.vertices[i2]; + ie[1].id.cf.indexA = 0; + ie[1].id.cf.indexB = i2; + ie[1].id.cf.typeA = ContactFeatureType.e_face; + ie[1].id.cf.typeB = ContactFeatureType.e_vertex; + if (front) { + rf.i1 = 0; + rf.i2 = 1; + rf.v1 = v1; + rf.v2 = v2; + rf.normal.setVec2(normal1); } else { - manifold.localNormal = Vec2.clone(polygonB.m_normals[rf.i1]); - manifold.localPoint = Vec2.clone(polygonB.m_vertices[rf.i1]); - } - var pointCount = 0; - for (var i = 0; i < Settings.maxManifoldPoints; ++i) { - var separation = Vec2.dot(rf.normal, Vec2.sub(clipPoints2[i].v, rf.v1)); - if (separation <= radius) { - var cp = manifold.points[pointCount]; // ManifoldPoint - if (primaryAxis.type == EPAxisType.e_edgeA) { - cp.localPoint = Transform.mulTVec2(xf, clipPoints2[i].v); - cp.id = clipPoints2[i].id; - } - else { - cp.localPoint = clipPoints2[i].v; - cp.id.cf.typeA = clipPoints2[i].id.cf.typeB; - cp.id.cf.typeB = clipPoints2[i].id.cf.typeA; - cp.id.cf.indexA = clipPoints2[i].id.cf.indexB; - cp.id.cf.indexB = clipPoints2[i].id.cf.indexA; - } - ++pointCount; + rf.i1 = 1; + rf.i2 = 0; + rf.v1 = v2; + rf.v2 = v1; + rf.normal.setMul(-1, normal1); + } + } + else { + manifold.type = ManifoldType.e_faceB; + ie[0].v = v1; + ie[0].id.cf.indexA = 0; + ie[0].id.cf.indexB = primaryAxis.index; + ie[0].id.cf.typeA = ContactFeatureType.e_vertex; + ie[0].id.cf.typeB = ContactFeatureType.e_face; + ie[1].v = v2; + ie[1].id.cf.indexA = 0; + ie[1].id.cf.indexB = primaryAxis.index; + ie[1].id.cf.typeA = ContactFeatureType.e_vertex; + ie[1].id.cf.typeB = ContactFeatureType.e_face; + rf.i1 = primaryAxis.index; + rf.i2 = rf.i1 + 1 < polygonBA.count ? rf.i1 + 1 : 0; + rf.v1 = polygonBA.vertices[rf.i1]; + rf.v2 = polygonBA.vertices[rf.i2]; + rf.normal.setVec2(polygonBA.normals[rf.i1]); + } + rf.sideNormal1.setNum(rf.normal.y, -rf.normal.x); + rf.sideNormal2.setMul(-1, rf.sideNormal1); + rf.sideOffset1 = Vec2.dot(rf.sideNormal1, rf.v1); + rf.sideOffset2 = Vec2.dot(rf.sideNormal2, rf.v2); + // Clip incident edge against extruded edge1 side edges. + var clipPoints1 = [new ClipVertex(), new ClipVertex()]; + var clipPoints2 = [new ClipVertex(), new ClipVertex()]; + var np; + // Clip to box side 1 + np = clipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1); + if (np < Settings.maxManifoldPoints) { + return; + } + // Clip to negative box side 1 + np = clipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2); + if (np < Settings.maxManifoldPoints) { + return; + } + // Now clipPoints2 contains the clipped points. + if (primaryAxis.type == EPAxisType.e_edgeA) { + manifold.localNormal = Vec2.clone(rf.normal); + manifold.localPoint = Vec2.clone(rf.v1); + } + else { + manifold.localNormal = Vec2.clone(polygonB.m_normals[rf.i1]); + manifold.localPoint = Vec2.clone(polygonB.m_vertices[rf.i1]); + } + var pointCount = 0; + for (var i = 0; i < Settings.maxManifoldPoints; ++i) { + var separation = Vec2.dot(rf.normal, Vec2.sub(clipPoints2[i].v, rf.v1)); + if (separation <= radius) { + var cp = manifold.points[pointCount]; // ManifoldPoint + if (primaryAxis.type == EPAxisType.e_edgeA) { + cp.localPoint = Transform.mulTVec2(xf, clipPoints2[i].v); + cp.id = clipPoints2[i].id; + } + else { + cp.localPoint = clipPoints2[i].v; + cp.id.cf.typeA = clipPoints2[i].id.cf.typeB; + cp.id.cf.typeB = clipPoints2[i].id.cf.typeA; + cp.id.cf.indexA = clipPoints2[i].id.cf.indexB; + cp.id.cf.indexB = clipPoints2[i].id.cf.indexA; } + ++pointCount; } - manifold.pointCount = pointCount; } + manifold.pointCount = pointCount; +}; - /** @deprecated Merged with main namespace */ - var internal = {}; - // @ts-ignore - internal.CollidePolygons = CollidePolygons; - // @ts-ignore - internal.Settings = Settings; - // @ts-ignore - internal.Sweep = Sweep; - // @ts-ignore - internal.Manifold = Manifold; - // @ts-ignore - internal.Distance = Distance; - // @ts-ignore - internal.TimeOfImpact = TimeOfImpact; - // @ts-ignore - internal.DynamicTree = DynamicTree; - // @ts-ignore - internal.stats = stats; - // @ts-ignore - Solver.TimeStep = TimeStep; - // @ts-ignore - Distance.testOverlap = testOverlap; - // @ts-ignore - Distance.Input = DistanceInput; - // @ts-ignore - Distance.Output = DistanceOutput; - // @ts-ignore - Distance.Proxy = DistanceProxy; - // @ts-ignore - Distance.Cache = SimplexCache; - // @ts-ignore - TimeOfImpact.Input = TOIInput; - // @ts-ignore - TimeOfImpact.Output = TOIOutput; - - exports.AABB = AABB; - exports.Body = Body; - exports.Box = BoxShape; - exports.Chain = ChainShape; - exports.Circle = CircleShape; - exports.CollideCircles = CollideCircles; - exports.CollideEdgeCircle = CollideEdgeCircle; - exports.CollideEdgePolygon = CollideEdgePolygon; - exports.CollidePolygonCircle = CollidePolygonCircle; - exports.CollidePolygons = CollidePolygons; - exports.Contact = Contact; - exports.Distance = Distance; - exports.DistanceJoint = DistanceJoint; - exports.DynamicTree = DynamicTree; - exports.Edge = EdgeShape; - exports.Fixture = Fixture; - exports.FrictionJoint = FrictionJoint; - exports.GearJoint = GearJoint; - exports.Joint = Joint; - exports.Manifold = Manifold; - exports.Mat22 = Mat22; - exports.Mat33 = Mat33; - exports.Math = math; - exports.MotorJoint = MotorJoint; - exports.MouseJoint = MouseJoint; - exports.Polygon = PolygonShape; - exports.PrismaticJoint = PrismaticJoint; - exports.PulleyJoint = PulleyJoint; - exports.RevoluteJoint = RevoluteJoint; - exports.RopeJoint = RopeJoint; - exports.Rot = Rot; - exports.Serializer = Serializer; - exports.Settings = Settings; - exports.Shape = Shape; - exports.Sweep = Sweep; - exports.TimeOfImpact = TimeOfImpact; - exports.Transform = Transform; - exports.Vec2 = Vec2; - exports.Vec3 = Vec3; - exports.WeldJoint = WeldJoint; - exports.WheelJoint = WheelJoint; - exports.World = World; - exports.internal = internal; +/** @deprecated Merged with main namespace */ +var internal = { + CollidePolygons: CollidePolygons, + Settings: Settings, + Sweep: Sweep, + Manifold: Manifold, + Distance: Distance, + TimeOfImpact: TimeOfImpact, + DynamicTree: DynamicTree, + stats: stats +}; - Object.defineProperty(exports, '__esModule', { value: true }); +var planck = /*#__PURE__*/Object.freeze({ + __proto__: null, + internal: internal, + Serializer: Serializer, + math: math, + Vec2: Vec2, + Vec3: Vec3, + Mat22: Mat22, + Mat33: Mat33, + Transform: Transform, + Rot: Rot, + AABB: AABB, + Shape: Shape, + FixtureProxy: FixtureProxy, + Fixture: Fixture, + MassData: MassData, + Body: Body, + ContactEdge: ContactEdge, + mixFriction: mixFriction, + mixRestitution: mixRestitution, + VelocityConstraintPoint: VelocityConstraintPoint, + Contact: Contact, + JointEdge: JointEdge, + Joint: Joint, + World: World, + CircleShape: CircleShape, + Circle: Circle, + EdgeShape: EdgeShape, + Edge: Edge, + PolygonShape: PolygonShape, + Polygon: Polygon, + ChainShape: ChainShape, + Chain: Chain, + BoxShape: BoxShape, + Box: Box, + CollideCircles: CollideCircles, + CollideEdgeCircle: CollideEdgeCircle, + CollidePolygons: CollidePolygons, + CollidePolygonCircle: CollidePolygonCircle, + CollideEdgePolygon: CollideEdgePolygon, + DistanceJoint: DistanceJoint, + FrictionJoint: FrictionJoint, + GearJoint: GearJoint, + MotorJoint: MotorJoint, + MouseJoint: MouseJoint, + PrismaticJoint: PrismaticJoint, + PulleyJoint: PulleyJoint, + RevoluteJoint: RevoluteJoint, + RopeJoint: RopeJoint, + WeldJoint: WeldJoint, + WheelJoint: WheelJoint, + Settings: Settings, + Sweep: Sweep, + get ManifoldType () { return ManifoldType; }, + get ContactFeatureType () { return ContactFeatureType; }, + get PointState () { return PointState; }, + ClipVertex: ClipVertex, + Manifold: Manifold, + ManifoldPoint: ManifoldPoint, + ContactID: ContactID, + ContactFeature: ContactFeature, + WorldManifold: WorldManifold, + getPointStates: getPointStates, + clipSegmentToLine: clipSegmentToLine, + DistanceInput: DistanceInput, + DistanceOutput: DistanceOutput, + SimplexCache: SimplexCache, + Distance: Distance, + DistanceProxy: DistanceProxy, + testOverlap: testOverlap, + TOIInput: TOIInput, + get TOIOutputState () { return TOIOutputState; }, + TOIOutput: TOIOutput, + TimeOfImpact: TimeOfImpact, + TreeNode: TreeNode, + DynamicTree: DynamicTree, + stats: stats +}); -}))); +export { AABB, Body, Box, BoxShape, Chain, ChainShape, Circle, CircleShape, ClipVertex, CollideCircles, CollideEdgeCircle, CollideEdgePolygon, CollidePolygonCircle, CollidePolygons, Contact, ContactEdge, ContactFeature, ContactFeatureType, ContactID, Distance, DistanceInput, DistanceJoint, DistanceOutput, DistanceProxy, DynamicTree, Edge, EdgeShape, Fixture, FixtureProxy, FrictionJoint, GearJoint, Joint, JointEdge, Manifold, ManifoldPoint, ManifoldType, MassData, Mat22, Mat33, MotorJoint, MouseJoint, PointState, Polygon, PolygonShape, PrismaticJoint, PulleyJoint, RevoluteJoint, RopeJoint, Rot, Serializer, Settings, Shape, SimplexCache, Sweep, TOIInput, TOIOutput, TOIOutputState, TimeOfImpact, Transform, TreeNode, Vec2, Vec3, VelocityConstraintPoint, WeldJoint, WheelJoint, World, WorldManifold, clipSegmentToLine, planck as default, getPointStates, internal, math, mixFriction, mixRestitution, stats, testOverlap }; //# sourceMappingURL=planck.js.map diff --git a/dist/planck.js.map b/dist/planck.js.map index bc0abb1b..15b471e1 100644 --- a/dist/planck.js.map +++ b/dist/planck.js.map @@ -1 +1 @@ -{"version":3,"file":"planck.js","sources":["../node_modules/tslib/tslib.es6.js","../src/util/options.ts","../src/util/common.ts","../src/common/Math.ts","../src/common/Vec2.ts","../src/collision/AABB.ts","../src/Settings.ts","../src/util/Pool.ts","../src/collision/DynamicTree.ts","../src/collision/BroadPhase.ts","../src/common/Rot.ts","../src/common/Transform.ts","../src/common/Sweep.ts","../src/dynamics/Velocity.ts","../src/dynamics/Position.ts","../src/collision/Shape.ts","../src/dynamics/Fixture.ts","../src/dynamics/Body.ts","../src/common/Mat22.ts","../src/collision/Manifold.ts","../src/util/stats.ts","../src/collision/Distance.ts","../src/dynamics/Contact.ts","../src/dynamics/Joint.ts","../src/util/Timer.ts","../src/collision/TimeOfImpact.ts","../src/dynamics/Solver.ts","../src/dynamics/World.ts","../src/common/Vec3.ts","../src/collision/shape/EdgeShape.ts","../src/collision/shape/ChainShape.ts","../src/collision/shape/PolygonShape.ts","../src/collision/shape/BoxShape.ts","../src/collision/shape/CircleShape.ts","../src/dynamics/joint/DistanceJoint.ts","../src/dynamics/joint/FrictionJoint.ts","../src/common/Mat33.ts","../src/dynamics/joint/RevoluteJoint.ts","../src/dynamics/joint/PrismaticJoint.ts","../src/dynamics/joint/GearJoint.ts","../src/dynamics/joint/MotorJoint.ts","../src/dynamics/joint/MouseJoint.ts","../src/dynamics/joint/PulleyJoint.ts","../src/dynamics/joint/RopeJoint.ts","../src/dynamics/joint/WeldJoint.ts","../src/dynamics/joint/WheelJoint.ts","../src/serializer/index.ts","../src/collision/shape/CollideCircle.ts","../src/collision/shape/CollideEdgeCircle.ts","../src/collision/shape/CollidePolygon.ts","../src/collision/shape/CollideCirclePolygone.ts","../src/collision/shape/CollideEdgePolygon.ts","../src/index.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","export default function(input: T, defaults: object): T {\n if (input === null || typeof input === 'undefined') {\n // tslint:disable-next-line:no-object-literal-type-assertion\n input = {} as T;\n }\n\n const output = {...input};\n\n // tslint:disable-next-line:no-for-in\n for (const key in defaults) {\n if (defaults.hasOwnProperty(key) && typeof input[key] === 'undefined') {\n output[key] = defaults[key];\n }\n }\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n const symbols = Object.getOwnPropertySymbols(defaults);\n for (let i = 0; i < symbols.length; i++) {\n const symbol = symbols[i];\n if (defaults.propertyIsEnumerable(symbol) && typeof input[symbol] === 'undefined') {\n output[symbol] = defaults[symbol];\n }\n }\n }\n\n return output;\n}\n","const _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\nexport const debug = function(...rest: any[]): void {\n if (!_DEBUG) return;\n console.log.apply(console, arguments);\n};\n\nexport const assert = function(statement: boolean, err?: string, log?: any): void {\n if (!_ASSERT) return;\n if (statement) return;\n log && console.log(log);\n throw new Error(err);\n};\n\nexport default {\n assert,\n debug,\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst math: Math & {\n readonly EPSILON: number;\n /**\n * This function is used to ensure that a floating point number is not a NaN or\n * infinity.\n */\n isFinite(x: any): boolean;\n assert(x: any): void;\n /**\n * This is a approximate yet fast inverse square-root (todo).\n */\n invSqrt(x: number): number;\n /**\n * Next Largest Power of 2 Given a binary integer value x, the next largest\n * power of 2 can be computed by a SWAR algorithm that recursively \"folds\" the\n * upper bits into the lower bits. This process yields a bit vector with the\n * same most significant 1 as x, but all 1's below it. Adding 1 to that value\n * yields the next largest power of 2. For a 32-bit value:\n */\n nextPowerOfTwo(x: number): number;\n isPowerOfTwo(x: number): boolean;\n mod(num: number, min?: number, max?: number): number;\n /**\n * Returns a min if num is less than min, and max if more than max, otherwise returns num.\n */\n clamp(num: number, min: number, max: number): number;\n /**\n * Returns a random number between min and max when two arguments are provided.\n * If one arg is provided between 0 to max.\n * If one arg is passed between 0 to 1.\n */\n random(min?: number, max?: number): number;\n} = Object.create(Math);\n\nexport default math;\n\n// @ts-ignore\n// noinspection JSConstantReassignment\nmath.EPSILON = 1e-9; // TODO\n\nmath.isFinite = function(x: unknown): boolean {\n return (typeof x === 'number') && isFinite(x) && !isNaN(x);\n};\n\nmath.assert = function(x: any): void {\n if (!_ASSERT) return;\n if (!math.isFinite(x)) {\n _DEBUG && common.debug(x);\n throw new Error('Invalid Number!');\n }\n};\n\nmath.invSqrt = function(x: number): number {\n // TODO:\n return 1 / Math.sqrt(x);\n};\n\nmath.nextPowerOfTwo = function(x: number): number {\n // TODO\n x |= (x >> 1);\n x |= (x >> 2);\n x |= (x >> 4);\n x |= (x >> 8);\n x |= (x >> 16);\n return x + 1;\n};\n\nmath.isPowerOfTwo = function(x: number): boolean {\n return x > 0 && (x & (x - 1)) === 0;\n};\n\nmath.mod = function(num: number, min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n if (max > min) {\n num = (num - min) % (max - min);\n return num + (num < 0 ? max : min);\n } else {\n num = (num - max) % (min - max);\n return num + (num <= 0 ? min : max);\n }\n};\n\nmath.clamp = function(num: number, min: number, max: number): number {\n if (num < min) {\n return min;\n } else if (num > max) {\n return max;\n } else {\n return num;\n }\n};\n\nmath.random = function(min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n return min === max ? min : Math.random() * (max - min) + min;\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Math from './Math';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport default class Vec2 {\n x: number;\n y: number;\n\n constructor(x: number, y: number);\n constructor(obj: { x: number, y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?) {\n if (!(this instanceof Vec2)) {\n return new Vec2(x, y);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n } else {\n this.x = x;\n this.y = y;\n }\n _ASSERT && Vec2.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = data.x;\n obj.y = data.y;\n return obj;\n }\n\n static zero(): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = 0;\n obj.y = 0;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = x;\n obj.y = y;\n return obj;\n }\n\n static clone(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(v.x, v.y);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Vec2.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Vec2!');\n }\n }\n\n clone(): Vec2 {\n return Vec2.clone(this);\n }\n\n /**\n * Set this vector to all zeros.\n *\n * @returns this\n */\n setZero(): Vec2 {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n set(x: number, y: number): Vec2;\n set(value: Vec2): Vec2;\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n // tslint:disable-next-line:typedef\n set(x, y?) {\n if (typeof x === 'object') {\n _ASSERT && Vec2.assert(x);\n this.x = x.x;\n this.y = x.y;\n } else {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n }\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setNum(x: number, y: number) {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setVec2(value: Vec2) {\n _ASSERT && Vec2.assert(value);\n this.x = value.x;\n this.y = value.y;\n\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use setCombine or setMul\n */\n wSet(a: number, v: Vec2, b?: number, w?: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.setCombine(a, v, b, w);\n } else {\n return this.setMul(a, v);\n }\n }\n\n /**\n * Set linear combination of v and w: `a * v + b * w`\n */\n setCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x = x;\n this.y = y;\n return this;\n }\n\n setMul(a: number, v: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Add a vector to this vector.\n *\n * @returns this\n */\n add(w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x += w.x;\n this.y += w.y;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use addCombine or addMul\n */\n wAdd(a: number, v: Vec2, b?: number, w?: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.addCombine(a, v, b, w);\n } else {\n return this.addMul(a, v);\n }\n }\n\n /**\n * Add linear combination of v and w: `a * v + b * w`\n */\n addCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x += x;\n this.y += y;\n return this;\n }\n\n addMul(a: number, v: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x += x;\n this.y += y;\n return this;\n }\n\n /**\n * @deprecated Use subCombine or subMul\n */\n wSub(a: number, v: Vec2, b?: number, w?: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.subCombine(a, v, b, w);\n } else {\n return this.subMul(a, v);\n }}\n\n /**\n * Subtract linear combination of v and w: `a * v + b * w`\n */\n subCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n subMul(a: number, v: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n /**\n * Subtract a vector from this vector\n *\n * @returns this\n */\n sub(w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x -= w.x;\n this.y -= w.y;\n return this;\n }\n\n /**\n * Multiply this vector by a scalar.\n *\n * @returns this\n */\n mul(m: number): Vec2 {\n _ASSERT && Math.assert(m);\n this.x *= m;\n this.y *= m;\n return this;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n length(): number {\n return Vec2.lengthOf(this);\n }\n\n /**\n * Get the length squared.\n */\n lengthSquared(): number {\n return Vec2.lengthSquared(this);\n }\n\n /**\n * Convert this vector into a unit vector.\n *\n * @returns old length\n */\n normalize(): number {\n const length = this.length();\n if (length < Math.EPSILON) {\n return 0.0;\n }\n const invLength = 1.0 / length;\n this.x *= invLength;\n this.y *= invLength;\n return length;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n static lengthOf(v: Vec2): number {\n _ASSERT && Vec2.assert(v);\n return Math.sqrt(v.x * v.x + v.y * v.y);\n }\n\n /**\n * Get the length squared.\n */\n static lengthSquared(v: Vec2): number {\n _ASSERT && Vec2.assert(v);\n return v.x * v.x + v.y * v.y;\n }\n\n static distance(v: Vec2, w: Vec2): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n static distanceSquared(v: Vec2, w: Vec2): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return dx * dx + dy * dy;\n }\n\n static areEqual(v: Vec2, w: Vec2): boolean {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v === w || typeof w === 'object' && w !== null && v.x === w.x && v.y === w.y;\n }\n\n /**\n * Get the skew vector such that dot(skew_vec, other) == cross(vec, other)\n */\n static skew(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.y, v.x);\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec2, w: Vec2): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.x + v.y * w.y;\n }\n\n static cross(v: Vec2, w: Vec2): number;\n static cross(v: Vec2, w: number): Vec2;\n static cross(v: number, w: Vec2): Vec2;\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n *\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n // tslint:disable-next-line:typedef\n static cross(v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n\n } else {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static crossVec2Vec2(v: Vec2, w: Vec2): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossVec2Num(v: Vec2, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossNumVec2(v: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n }\n\n static addCross(a: Vec2, v: Vec2, w: number): Vec2;\n static addCross(a: Vec2, v: number, w: Vec2): Vec2;\n /**\n * Returns `a + (v x w)`\n */\n // tslint:disable-next-line:typedef\n static addCross(a, v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n _ASSERT && common.assert(false);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossVec2Num(a: Vec2, v: Vec2, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossNumVec2(a: Vec2, v: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n static add(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x + w.x, v.y + w.y);\n }\n\n /** @internal @deprecated */\n static wAdd(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return Vec2.combine(a, v, b, w);\n } else {\n return Vec2.mulNumVec2(a, v);\n }\n }\n\n static combine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n return Vec2.zero().setCombine(a, v, b, w);\n }\n\n static sub(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x - w.x, v.y - w.y);\n }\n\n static mul(a: Vec2, b: number): Vec2;\n static mul(a: number, b: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (typeof a === 'object') {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n\n } else if (typeof b === 'object') {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n }\n\n static mulVec2Num(a: Vec2, b: number): Vec2 {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n }\n\n static mulNumVec2(a: number, b: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n\n neg(): Vec2 {\n this.x = -this.x;\n this.y = -this.y;\n return this;\n }\n\n static neg(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.x, -v.y);\n }\n\n static abs(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Math.abs(v.x), Math.abs(v.y));\n }\n\n static mid(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo((v.x + w.x) * 0.5, (v.y + w.y) * 0.5);\n }\n\n static upper(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.max(v.x, w.x), Math.max(v.y, w.y));\n }\n\n static lower(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.min(v.x, w.x), Math.min(v.y, w.y));\n }\n\n clamp(max: number): Vec2 {\n const lengthSqr = this.x * this.x + this.y * this.y;\n if (lengthSqr > max * max) {\n const invLength = Math.invSqrt(lengthSqr);\n this.x *= invLength * max;\n this.y *= invLength * max;\n }\n return this;\n }\n\n static clamp(v: Vec2, max: number): Vec2 {\n v = Vec2.neo(v.x, v.y);\n v.clamp(max);\n return v;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static scaleFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x * x, v.y * y);\n };\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static translateFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x + x, v.y + y);\n };\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n */\nexport interface RayCastInput {\n p1: Vec2;\n p2: Vec2;\n maxFraction: number;\n}\n\nexport type RayCastCallback = (subInput: RayCastInput, id: number) => number;\n\n/**\n * Ray-cast output data. The ray hits at `p1 + fraction * (p2 - p1)`,\n * where `p1` and `p2` come from RayCastInput.\n */\nexport interface RayCastOutput {\n normal: Vec2;\n fraction: number;\n}\n\nexport default class AABB {\n lowerBound: Vec2;\n upperBound: Vec2;\n\n constructor(lower?: Vec2, upper?: Vec2) {\n if (!(this instanceof AABB)) {\n return new AABB(lower, upper);\n }\n\n this.lowerBound = Vec2.zero();\n this.upperBound = Vec2.zero();\n\n if (typeof lower === 'object') {\n this.lowerBound.setVec2(lower);\n }\n if (typeof upper === 'object') {\n this.upperBound.setVec2(upper);\n } else if (typeof lower === 'object') {\n this.upperBound.setVec2(lower);\n }\n }\n\n /**\n * Verify that the bounds are sorted.\n */\n isValid(): boolean {\n return AABB.isValid(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.lowerBound) && Vec2.isValid(obj.upperBound) && Vec2.sub(obj.upperBound, obj.lowerBound).lengthSquared() >= 0;\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!AABB.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid AABB!');\n }\n }\n\n /**\n * Get the center of the AABB.\n */\n getCenter(): Vec2 {\n return Vec2.neo((this.lowerBound.x + this.upperBound.x) * 0.5, (this.lowerBound.y + this.upperBound.y) * 0.5);\n }\n\n /**\n * Get the extents of the AABB (half-widths).\n */\n getExtents(): Vec2 {\n return Vec2.neo((this.upperBound.x - this.lowerBound.x) * 0.5, (this.upperBound.y - this.lowerBound.y) * 0.5);\n }\n\n /**\n * Get the perimeter length.\n */\n getPerimeter(): number {\n return 2.0 * (this.upperBound.x - this.lowerBound.x + this.upperBound.y - this.lowerBound.y);\n }\n\n /**\n * Combine one or two AABB into this one.\n */\n combine(a: AABB, b?: AABB): void {\n b = b || this;\n\n const lowerA = a.lowerBound;\n const upperA = a.upperBound;\n const lowerB = b.lowerBound;\n const upperB = b.upperBound;\n\n const lowerX = Math.min(lowerA.x, lowerB.x);\n const lowerY = Math.min(lowerA.y, lowerB.y);\n const upperX = Math.max(upperB.x, upperA.x);\n const upperY = Math.max(upperB.y, upperA.y);\n\n this.lowerBound.setNum(lowerX, lowerY);\n this.upperBound.setNum(upperX, upperY);\n }\n\n combinePoints(a: Vec2, b: Vec2): void {\n this.lowerBound.setNum(Math.min(a.x, b.x), Math.min(a.y, b.y));\n this.upperBound.setNum(Math.max(a.x, b.x), Math.max(a.y, b.y));\n }\n\n set(aabb: AABB): void {\n this.lowerBound.setNum(aabb.lowerBound.x, aabb.lowerBound.y);\n this.upperBound.setNum(aabb.upperBound.x, aabb.upperBound.y);\n }\n\n contains(aabb: AABB): boolean {\n let result = true;\n result = result && this.lowerBound.x <= aabb.lowerBound.x;\n result = result && this.lowerBound.y <= aabb.lowerBound.y;\n result = result && aabb.upperBound.x <= this.upperBound.x;\n result = result && aabb.upperBound.y <= this.upperBound.y;\n return result;\n }\n\n extend(value: number): AABB {\n AABB.extend(this, value);\n return this;\n }\n\n static extend(aabb: AABB, value: number): void {\n aabb.lowerBound.x -= value;\n aabb.lowerBound.y -= value;\n aabb.upperBound.x += value;\n aabb.upperBound.y += value;\n }\n\n static testOverlap(a: AABB, b: AABB): boolean {\n const d1x = b.lowerBound.x - a.upperBound.x;\n const d2x = a.lowerBound.x - b.upperBound.x;\n\n const d1y = b.lowerBound.y - a.upperBound.y;\n const d2y = a.lowerBound.y - b.upperBound.y;\n\n if (d1x > 0 || d1y > 0 || d2x > 0 || d2y > 0) {\n return false;\n }\n return true;\n }\n\n static areEqual(a: AABB, b: AABB): boolean {\n return Vec2.areEqual(a.lowerBound, b.lowerBound) && Vec2.areEqual(a.upperBound, b.upperBound);\n }\n\n static diff(a: AABB, b: AABB): number {\n const wD = Math.max(0, Math.min(a.upperBound.x, b.upperBound.x) - Math.max(b.lowerBound.x, a.lowerBound.x));\n const hD = Math.max(0, Math.min(a.upperBound.y, b.upperBound.y) - Math.max(b.lowerBound.y, a.lowerBound.y));\n\n const wA = a.upperBound.x - a.lowerBound.x;\n const hA = a.upperBound.y - a.lowerBound.y;\n\n const wB = b.upperBound.x - b.lowerBound.x;\n const hB = b.upperBound.y - b.lowerBound.y;\n\n return wA * hA + wB * hB - wD * hD;\n }\n\n rayCast(output: RayCastOutput, input: RayCastInput): boolean {\n // From Real-time Collision Detection, p179.\n\n let tmin = -Infinity;\n let tmax = Infinity;\n\n const p = input.p1;\n const d = Vec2.sub(input.p2, input.p1);\n const absD = Vec2.abs(d);\n\n const normal = Vec2.zero();\n\n for (let f: 'x' | 'y' = 'x'; f !== null; f = (f === 'x' ? 'y' : null)) {\n if (absD.x < Math.EPSILON) {\n // Parallel.\n if (p[f] < this.lowerBound[f] || this.upperBound[f] < p[f]) {\n return false;\n }\n } else {\n const inv_d = 1.0 / d[f];\n let t1 = (this.lowerBound[f] - p[f]) * inv_d;\n let t2 = (this.upperBound[f] - p[f]) * inv_d;\n\n // Sign of the normal vector.\n let s = -1.0;\n\n if (t1 > t2) {\n const temp = t1;\n t1 = t2;\n t2 = temp;\n s = 1.0;\n }\n\n // Push the min up\n if (t1 > tmin) {\n normal.setZero();\n normal[f] = s;\n tmin = t1;\n }\n\n // Pull the max down\n tmax = Math.min(tmax, t2);\n\n if (tmin > tmax) {\n return false;\n }\n }\n }\n\n // Does the ray start inside the box?\n // Does the ray intersect beyond the max fraction?\n if (tmin < 0.0 || input.maxFraction < tmin) {\n return false;\n }\n\n // Intersection.\n output.fraction = tmin;\n output.normal = normal;\n return true;\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n// TODO merge with World options?\n\n/**\n * Tuning constants based on meters-kilograms-seconds (MKS) units.\n */\n// tslint:disable-next-line:no-unnecessary-class\nexport default class Settings {\n // Collision\n /**\n * The maximum number of contact points between two convex shapes. Do not change\n * this value.\n */\n static maxManifoldPoints: number = 2;\n\n /**\n * The maximum number of vertices on a convex polygon. You cannot increase this\n * too much because BlockAllocator has a maximum object size.\n */\n static maxPolygonVertices: number = 12;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This allows proxies to move\n * by a small amount without triggering a tree adjustment. This is in meters.\n */\n static aabbExtension: number = 0.1;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This is used to predict the\n * future position based on the current displacement. This is a dimensionless\n * multiplier.\n */\n static aabbMultiplier: number = 2.0;\n\n /**\n * A small length used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static linearSlop: number = 0.005;\n static get linearSlopSquared(): number { return Settings.linearSlop * Settings.linearSlop; }\n\n /**\n * A small angle used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static angularSlop: number = (2.0 / 180.0 * Math.PI);\n\n /**\n * The radius of the polygon/edge shape skin. This should not be modified.\n * Making this smaller means polygons will have an insufficient buffer for\n * continuous collision. Making it larger may create artifacts for vertex\n * collision.\n */\n static get polygonRadius(): number { return 2.0 * Settings.linearSlop; }\n\n /**\n * Maximum number of sub-steps per contact in continuous physics simulation.\n */\n static maxSubSteps: number = 8;\n\n// Dynamics\n\n /**\n * Maximum number of contacts to be handled to solve a TOI impact.\n */\n static maxTOIContacts: number = 32;\n\n /**\n * Maximum iterations to solve a TOI.\n */\n static maxTOIIterations: number = 20;\n\n /**\n * Maximum iterations to find Distance.\n */\n static maxDistnceIterations: number = 20;\n\n /**\n * A velocity threshold for elastic collisions. Any collision with a relative\n * linear velocity below this threshold will be treated as inelastic.\n */\n static velocityThreshold: number = 1.0;\n\n /**\n * The maximum linear position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxLinearCorrection: number = 0.2;\n\n /**\n * The maximum angular position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxAngularCorrection: number = (8.0 / 180.0 * Math.PI);\n\n /**\n * The maximum linear velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxTranslation: number = 2.0;\n static get maxTranslationSquared(): number { return Settings.maxTranslation * Settings.maxTranslation; }\n\n /**\n * The maximum angular velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxRotation: number = (0.5 * Math.PI);\n static get maxRotationSquared(): number { return Settings.maxRotation * Settings.maxRotation; }\n\n /**\n * This scale factor controls how fast overlap is resolved. Ideally this would\n * be 1 so that overlap is removed in one time step. However using values close\n * to 1 often lead to overshoot.\n */\n static baumgarte: number = 0.2;\n static toiBaugarte: number = 0.75;\n\n // Sleep\n\n /**\n * The time that a body must be still before it will go to sleep.\n */\n static timeToSleep: number = 0.5;\n\n /**\n * A body cannot sleep if its linear velocity is above this tolerance.\n */\n static linearSleepTolerance: number = 0.01;\n static get linearSleepToleranceSqr(): number { return Math.pow(Settings.linearSleepTolerance, 2); }\n\n /**\n * A body cannot sleep if its angular velocity is above this tolerance.\n */\n static angularSleepTolerance: number = (2.0 / 180.0 * Math.PI);\n static get angularSleepToleranceSqr(): number { return Math.pow(Settings.angularSleepTolerance, 2); }\n\n}\n","/*\n * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js\n *\n * This software is provided 'as-is', without any express or implied\n * warranty. In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * 1. The origin of this software must not be misrepresented; you must not\n * claim that you wrote the original software. If you use this software\n * in a product, an acknowledgment in the product documentation would be\n * appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n * misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n */\n\nexport default class Pool {\n _list: T[] = [];\n _max: number = Infinity;\n\n _createFn: () => T;\n _outFn: (item: T) => void;\n _inFn: (item: T) => void;\n _discardFn: (item: T) => T;\n\n _createCount: number = 0;\n _outCount: number = 0;\n _inCount: number = 0;\n _discardCount: number = 0;\n\n constructor(opts: {\n max?: number,\n create?: () => T,\n allocate?: (item: T) => void,\n release?: (item: T) => void,\n discard?: (item: T) => T,\n }) {\n this._list = [];\n this._max = opts.max || this._max;\n\n this._createFn = opts.create;\n this._outFn = opts.allocate;\n this._inFn = opts.release;\n this._discardFn = opts.discard;\n }\n\n max(n?: number): number | Pool {\n if (typeof n === 'number') {\n this._max = n;\n return this;\n }\n return this._max;\n }\n\n size(): number {\n return this._list.length;\n }\n\n allocate(): T {\n let item: T;\n if (this._list.length > 0) {\n item = this._list.shift();\n } else {\n this._createCount++;\n if (typeof this._createFn === 'function') {\n item = this._createFn();\n } else {\n // tslint:disable-next-line:no-object-literal-type-assertion\n item = {} as T;\n }\n }\n this._outCount++;\n if (typeof this._outFn === 'function') {\n this._outFn(item);\n }\n return item;\n }\n\n release(item: T): void {\n if (this._list.length < this._max) {\n this._inCount++;\n if (typeof this._inFn === 'function') {\n this._inFn(item);\n }\n this._list.push(item);\n } else {\n this._discardCount++;\n if (typeof this._discardFn === 'function') {\n item = this._discardFn(item);\n }\n }\n }\n\n /** @internal */\n toString(): string {\n return \" +\" + this._createCount + \" >\" + this._outCount + \" <\" + this._inCount + \" -\"\n + this._discardCount + \" =\" + this._list.length + \"/\" + this._max;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../Settings';\nimport common from '../util/common';\nimport Pool from '../util/Pool';\nimport Vec2 from '../common/Vec2';\nimport Math from '../common/Math';\nimport AABB, { RayCastCallback, RayCastInput } from './AABB';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport type DynamicTreeQueryCallback = (nodeId: number) => boolean;\n\n/**\n * A node in the dynamic tree. The client does not interact with this directly.\n */\nexport class TreeNode {\n id: number;\n /** Enlarged AABB */\n aabb: AABB = new AABB();\n userData: T = null;\n parent: TreeNode = null;\n child1: TreeNode = null;\n child2: TreeNode = null;\n /** 0: leaf, -1: free node */\n height: number = -1;\n\n constructor(id?: number) {\n this.id = id;\n }\n\n /** @internal */\n toString(): string {\n return this.id + \": \" + this.userData;\n }\n\n isLeaf(): boolean {\n return this.child1 == null;\n }\n}\n\n/**\n * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A\n * dynamic tree arranges data in a binary tree to accelerate queries such as\n * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we\n * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger\n * than the client object. This allows the client object to move by small\n * amounts without triggering a tree update.\n *\n * Nodes are pooled and relocatable, so we use node indices rather than\n * pointers.\n */\nexport default class DynamicTree {\n m_root: TreeNode;\n m_lastProxyId: number;\n m_nodes: {\n [id: number]: TreeNode\n };\n m_pool: Pool>;\n\n constructor() {\n this.m_root = null;\n this.m_nodes = {};\n this.m_lastProxyId = 0;\n\n this.m_pool = new Pool>({\n create(): TreeNode {\n return new TreeNode();\n }\n });\n }\n\n /**\n * Get proxy user data.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getUserData(id: number): T {\n const node = this.m_nodes[id];\n _ASSERT && common.assert(!!node);\n return node.userData;\n }\n\n /**\n * Get the fat AABB for a node id.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getFatAABB(id: number): AABB {\n const node = this.m_nodes[id];\n _ASSERT && common.assert(!!node);\n return node.aabb;\n }\n\n allocateNode(): TreeNode {\n const node = this.m_pool.allocate();\n node.id = ++this.m_lastProxyId;\n node.userData = null;\n node.parent = null;\n node.child1 = null;\n node.child2 = null;\n node.height = -1;\n this.m_nodes[node.id] = node;\n return node;\n }\n\n freeNode(node: TreeNode): void {\n this.m_pool.release(node);\n node.height = -1;\n // tslint:disable-next-line:no-dynamic-delete\n delete this.m_nodes[node.id];\n }\n\n /**\n * Create a proxy in the tree as a leaf node. We return the index of the node\n * instead of a pointer so that we can grow the node pool.\n *\n * Create a proxy. Provide a tight fitting AABB and a userData pointer.\n */\n createProxy(aabb: AABB, userData: T): number {\n _ASSERT && common.assert(AABB.isValid(aabb));\n\n const node = this.allocateNode();\n\n node.aabb.set(aabb);\n\n // Fatten the aabb.\n AABB.extend(node.aabb, Settings.aabbExtension);\n\n node.userData = userData;\n node.height = 0;\n\n this.insertLeaf(node);\n\n return node.id;\n }\n\n /**\n * Destroy a proxy. This asserts if the id is invalid.\n */\n destroyProxy(id: number): void {\n const node = this.m_nodes[id];\n\n _ASSERT && common.assert(!!node);\n _ASSERT && common.assert(node.isLeaf());\n\n this.removeLeaf(node);\n this.freeNode(node);\n }\n\n /**\n * Move a proxy with a swepted AABB. If the proxy has moved outside of its\n * fattened AABB, then the proxy is removed from the tree and re-inserted.\n * Otherwise the function returns immediately.\n *\n * @param d Displacement\n *\n * @return true if the proxy was re-inserted.\n */\n moveProxy(id: number, aabb: AABB, d: Vec2): boolean {\n _ASSERT && common.assert(AABB.isValid(aabb));\n _ASSERT && common.assert(!d || Vec2.isValid(d));\n\n const node = this.m_nodes[id];\n\n _ASSERT && common.assert(!!node);\n _ASSERT && common.assert(node.isLeaf());\n\n if (node.aabb.contains(aabb)) {\n return false;\n }\n\n this.removeLeaf(node);\n\n node.aabb.set(aabb);\n\n // Extend AABB.\n aabb = node.aabb;\n AABB.extend(aabb, Settings.aabbExtension);\n\n // Predict AABB displacement.\n // const d = Vec2.mul(Settings.aabbMultiplier, displacement);\n\n if (d.x < 0.0) {\n aabb.lowerBound.x += d.x * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.x += d.x * Settings.aabbMultiplier;\n }\n\n if (d.y < 0.0) {\n aabb.lowerBound.y += d.y * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.y += d.y * Settings.aabbMultiplier;\n }\n\n this.insertLeaf(node);\n\n return true;\n }\n\n insertLeaf(leaf: TreeNode): void {\n _ASSERT && common.assert(AABB.isValid(leaf.aabb));\n\n if (this.m_root == null) {\n this.m_root = leaf;\n this.m_root.parent = null;\n return;\n }\n\n // Find the best sibling for this node\n const leafAABB = leaf.aabb;\n let index = this.m_root;\n while (!index.isLeaf()) {\n const child1 = index.child1;\n const child2 = index.child2;\n\n const area = index.aabb.getPerimeter();\n\n const combinedAABB = new AABB();\n combinedAABB.combine(index.aabb, leafAABB);\n const combinedArea = combinedAABB.getPerimeter();\n\n // Cost of creating a new parent for this node and the new leaf\n const cost = 2.0 * combinedArea;\n\n // Minimum cost of pushing the leaf further down the tree\n const inheritanceCost = 2.0 * (combinedArea - area);\n\n // Cost of descending into child1\n let cost1;\n if (child1.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n cost1 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n const oldArea = child1.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost1 = (newArea - oldArea) + inheritanceCost;\n }\n\n // Cost of descending into child2\n let cost2;\n if (child2.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n cost2 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n const oldArea = child2.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost2 = newArea - oldArea + inheritanceCost;\n }\n\n // Descend according to the minimum cost.\n if (cost < cost1 && cost < cost2) {\n break;\n }\n\n // Descend\n if (cost1 < cost2) {\n index = child1;\n } else {\n index = child2;\n }\n }\n\n const sibling = index;\n\n // Create a new parent.\n const oldParent = sibling.parent;\n const newParent = this.allocateNode();\n newParent.parent = oldParent;\n newParent.userData = null;\n newParent.aabb.combine(leafAABB, sibling.aabb);\n newParent.height = sibling.height + 1;\n\n if (oldParent != null) {\n // The sibling was not the root.\n if (oldParent.child1 === sibling) {\n oldParent.child1 = newParent;\n } else {\n oldParent.child2 = newParent;\n }\n\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n } else {\n // The sibling was the root.\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n this.m_root = newParent;\n }\n\n // Walk back up the tree fixing heights and AABBs\n index = leaf.parent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n _ASSERT && common.assert(child1 != null);\n _ASSERT && common.assert(child2 != null);\n\n index.height = 1 + Math.max(child1.height, child2.height);\n index.aabb.combine(child1.aabb, child2.aabb);\n\n index = index.parent;\n }\n\n // validate();\n }\n\n removeLeaf(leaf: TreeNode): void {\n if (leaf === this.m_root) {\n this.m_root = null;\n return;\n }\n\n const parent = leaf.parent;\n const grandParent = parent.parent;\n let sibling;\n if (parent.child1 === leaf) {\n sibling = parent.child2;\n } else {\n sibling = parent.child1;\n }\n\n if (grandParent != null) {\n // Destroy parent and connect sibling to grandParent.\n if (grandParent.child1 === parent) {\n grandParent.child1 = sibling;\n } else {\n grandParent.child2 = sibling;\n }\n sibling.parent = grandParent;\n this.freeNode(parent);\n\n // Adjust ancestor bounds.\n let index = grandParent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n index.aabb.combine(child1.aabb, child2.aabb);\n index.height = 1 + Math.max(child1.height, child2.height);\n\n index = index.parent;\n }\n } else {\n this.m_root = sibling;\n sibling.parent = null;\n this.freeNode(parent);\n }\n\n // validate();\n }\n\n /**\n * Perform a left or right rotation if node A is imbalanced. Returns the new\n * root index.\n */\n balance(iA: TreeNode): TreeNode {\n _ASSERT && common.assert(iA != null);\n\n const A = iA;\n if (A.isLeaf() || A.height < 2) {\n return iA;\n }\n\n const B = A.child1;\n const C = A.child2;\n\n const balance = C.height - B.height;\n\n // Rotate C up\n if (balance > 1) {\n const F = C.child1;\n const G = C.child2;\n\n // Swap A and C\n C.child1 = A;\n C.parent = A.parent;\n A.parent = C;\n\n // A's old parent should point to C\n if (C.parent != null) {\n if (C.parent.child1 === iA) {\n C.parent.child1 = C;\n } else {\n C.parent.child2 = C;\n }\n } else {\n this.m_root = C;\n }\n\n // Rotate\n if (F.height > G.height) {\n C.child2 = F;\n A.child2 = G;\n G.parent = A;\n A.aabb.combine(B.aabb, G.aabb);\n C.aabb.combine(A.aabb, F.aabb);\n\n A.height = 1 + Math.max(B.height, G.height);\n C.height = 1 + Math.max(A.height, F.height);\n } else {\n C.child2 = G;\n A.child2 = F;\n F.parent = A;\n A.aabb.combine(B.aabb, F.aabb);\n C.aabb.combine(A.aabb, G.aabb);\n\n A.height = 1 + Math.max(B.height, F.height);\n C.height = 1 + Math.max(A.height, G.height);\n }\n\n return C;\n }\n\n // Rotate B up\n if (balance < -1) {\n const D = B.child1;\n const E = B.child2;\n\n // Swap A and B\n B.child1 = A;\n B.parent = A.parent;\n A.parent = B;\n\n // A's old parent should point to B\n if (B.parent != null) {\n if (B.parent.child1 === A) {\n B.parent.child1 = B;\n } else {\n B.parent.child2 = B;\n }\n } else {\n this.m_root = B;\n }\n\n // Rotate\n if (D.height > E.height) {\n B.child2 = D;\n A.child1 = E;\n E.parent = A;\n A.aabb.combine(C.aabb, E.aabb);\n B.aabb.combine(A.aabb, D.aabb);\n\n A.height = 1 + Math.max(C.height, E.height);\n B.height = 1 + Math.max(A.height, D.height);\n } else {\n B.child2 = E;\n A.child1 = D;\n D.parent = A;\n A.aabb.combine(C.aabb, D.aabb);\n B.aabb.combine(A.aabb, E.aabb);\n\n A.height = 1 + Math.max(C.height, D.height);\n B.height = 1 + Math.max(A.height, E.height);\n }\n\n return B;\n }\n\n return A;\n }\n\n /**\n * Compute the height of the binary tree in O(N) time. Should not be called\n * often.\n */\n getHeight(): number {\n if (this.m_root == null) {\n return 0;\n }\n\n return this.m_root.height;\n }\n\n /**\n * Get the ratio of the sum of the node areas to the root area.\n */\n getAreaRatio(): number {\n if (this.m_root == null) {\n return 0.0;\n }\n\n const root = this.m_root;\n const rootArea = root.aabb.getPerimeter();\n\n let totalArea = 0.0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // Free node in pool\n continue;\n }\n\n totalArea += node.aabb.getPerimeter();\n }\n\n this.iteratorPool.release(it);\n\n return totalArea / rootArea;\n }\n\n /**\n * Compute the height of a sub-tree.\n */\n computeHeight(id?: number): number {\n let node;\n if (typeof id !== 'undefined') {\n node = this.m_nodes[id];\n } else {\n node = this.m_root;\n }\n\n // _ASSERT && common.assert(0 <= id && id < this.m_nodeCapacity);\n\n if (node.isLeaf()) {\n return 0;\n }\n\n const height1 = this.computeHeight(node.child1.id);\n const height2 = this.computeHeight(node.child2.id);\n return 1 + Math.max(height1, height2);\n }\n\n validateStructure(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n if (node === this.m_root) {\n _ASSERT && common.assert(node.parent == null);\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && common.assert(child1 == null);\n _ASSERT && common.assert(child2 == null);\n _ASSERT && common.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && common.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && common.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n _ASSERT && common.assert(child1.parent === node);\n _ASSERT && common.assert(child2.parent === node);\n\n this.validateStructure(child1);\n this.validateStructure(child2);\n }\n\n validateMetrics(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && common.assert(child1 == null);\n _ASSERT && common.assert(child2 == null);\n _ASSERT && common.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && common.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && common.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n const height1 = child1.height;\n const height2 = child2.height;\n const height = 1 + Math.max(height1, height2);\n _ASSERT && common.assert(node.height === height);\n\n const aabb = new AABB();\n aabb.combine(child1.aabb, child2.aabb);\n\n _ASSERT && common.assert(AABB.areEqual(aabb, node.aabb));\n\n this.validateMetrics(child1);\n this.validateMetrics(child2);\n }\n\n /**\n * Validate this tree. For testing.\n */\n validate(): void {\n this.validateStructure(this.m_root);\n this.validateMetrics(this.m_root);\n\n _ASSERT && common.assert(this.getHeight() === this.computeHeight());\n }\n\n /**\n * Get the maximum balance of an node in the tree. The balance is the difference\n * in height of the two children of a node.\n */\n getMaxBalance(): number {\n let maxBalance = 0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height <= 1) {\n continue;\n }\n\n _ASSERT && common.assert(!node.isLeaf());\n\n const balance = Math.abs(node.child2.height - node.child1.height);\n maxBalance = Math.max(maxBalance, balance);\n }\n this.iteratorPool.release(it);\n\n return maxBalance;\n }\n\n /**\n * Build an optimal tree. Very expensive. For testing.\n */\n rebuildBottomUp(): void {\n const nodes = [];\n let count = 0;\n\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // free node in pool\n continue;\n }\n\n if (node.isLeaf()) {\n node.parent = null;\n nodes[count] = node;\n ++count;\n } else {\n this.freeNode(node);\n }\n }\n this.iteratorPool.release(it);\n\n while (count > 1) {\n let minCost = Infinity;\n let iMin = -1;\n let jMin = -1;\n for (let i = 0; i < count; ++i) {\n const aabbi = nodes[i].aabb;\n for (let j = i + 1; j < count; ++j) {\n const aabbj = nodes[j].aabb;\n const b = new AABB();\n b.combine(aabbi, aabbj);\n const cost = b.getPerimeter();\n if (cost < minCost) {\n iMin = i;\n jMin = j;\n minCost = cost;\n }\n }\n }\n\n const child1 = nodes[iMin];\n const child2 = nodes[jMin];\n\n const parent = this.allocateNode();\n parent.child1 = child1;\n parent.child2 = child2;\n parent.height = 1 + Math.max(child1.height, child2.height);\n parent.aabb.combine(child1.aabb, child2.aabb);\n parent.parent = null;\n\n child1.parent = parent;\n child2.parent = parent;\n\n nodes[jMin] = nodes[count - 1];\n nodes[iMin] = parent;\n --count;\n }\n\n this.m_root = nodes[0];\n\n this.validate();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n const aabb = node.aabb;\n aabb.lowerBound.x -= newOrigin.x;\n aabb.lowerBound.y -= newOrigin.y;\n aabb.upperBound.x -= newOrigin.x;\n aabb.upperBound.y -= newOrigin.y;\n }\n this.iteratorPool.release(it);\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query(aabb: AABB, queryCallback: DynamicTreeQueryCallback): void {\n _ASSERT && common.assert(typeof queryCallback === 'function');\n const stack = this.stackPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, aabb)) {\n if (node.isLeaf()) {\n const proceed = queryCallback(node.id);\n if (proceed === false) {\n return;\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n }\n\n this.stackPool.release(stack);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n // TODO: GC\n _ASSERT && common.assert(typeof rayCastCallback === 'function');\n const p1 = input.p1;\n const p2 = input.p2;\n const r = Vec2.sub(p2, p1);\n _ASSERT && common.assert(r.lengthSquared() > 0.0);\n r.normalize();\n\n // v is perpendicular to the segment.\n const v = Vec2.crossNumVec2(1.0, r);\n const abs_v = Vec2.abs(v);\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n\n let maxFraction = input.maxFraction;\n\n // Build a bounding box for the segment.\n const segmentAABB = new AABB();\n let t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n\n const stack = this.stackPool.allocate();\n const subInput = this.inputPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, segmentAABB) === false) {\n continue;\n }\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n const c = node.aabb.getCenter();\n const h = node.aabb.getExtents();\n const separation = Math.abs(Vec2.dot(v, Vec2.sub(p1, c))) - Vec2.dot(abs_v, h);\n if (separation > 0.0) {\n continue;\n }\n\n if (node.isLeaf()) {\n subInput.p1 = Vec2.clone(input.p1);\n subInput.p2 = Vec2.clone(input.p2);\n subInput.maxFraction = maxFraction;\n\n const value = rayCastCallback(subInput, node.id);\n\n if (value === 0.0) {\n // The client has terminated the ray cast.\n return;\n }\n\n if (value > 0.0) {\n // update segment bounding box.\n maxFraction = value;\n t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n this.stackPool.release(stack);\n this.inputPool.release(subInput);\n }\n\n private inputPool: Pool = new Pool({\n create(): RayCastInput {\n // tslint:disable-next-line:no-object-literal-type-assertion\n return {} as RayCastInput;\n },\n release(stack: RayCastInput): void {\n }\n });\n\n private stackPool: Pool>> = new Pool>>({\n create(): Array> {\n return [];\n },\n release(stack: Array>): void {\n stack.length = 0;\n }\n });\n\n private iteratorPool: Pool> = new Pool>({\n create(): Iterator {\n return new Iterator();\n },\n release(iterator: Iterator): void {\n iterator.close();\n }\n });\n\n}\n\nclass Iterator {\n parents: Array> = [];\n states: number[] = [];\n preorder(root: TreeNode): Iterator {\n this.parents.length = 0;\n this.parents.push(root);\n this.states.length = 0;\n this.states.push(0);\n return this;\n }\n next(): TreeNode {\n while (this.parents.length > 0) {\n const i = this.parents.length - 1;\n const node = this.parents[i];\n if (this.states[i] === 0) {\n this.states[i] = 1;\n return node;\n }\n if (this.states[i] === 1) {\n this.states[i] = 2;\n if (node.child1) {\n this.parents.push(node.child1);\n this.states.push(1);\n return node.child1;\n }\n }\n if (this.states[i] === 2) {\n this.states[i] = 3;\n if (node.child2) {\n this.parents.push(node.child2);\n this.states.push(1);\n return node.child2;\n }\n }\n this.parents.pop();\n this.states.pop();\n }\n }\n close(): void {\n this.parents.length = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from '../common/Vec2';\nimport Math from '../common/Math';\nimport AABB, { RayCastCallback, RayCastInput } from './AABB';\nimport DynamicTree, { DynamicTreeQueryCallback } from './DynamicTree';\nimport { FixtureProxy } from \"../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * The broad-phase wraps and extends a dynamic-tree to keep track of moved\n * objects and query them on update.\n */\nexport default class BroadPhase {\n m_tree: DynamicTree = new DynamicTree();\n m_proxyCount: number = 0;\n m_moveBuffer: number[] = [];\n\n m_callback: (userDataA: any, userDataB: any) => void;\n m_queryProxyId: number;\n\n /**\n * Get user data from a proxy. Returns null if the id is invalid.\n */\n getUserData(proxyId: number): FixtureProxy {\n return this.m_tree.getUserData(proxyId);\n }\n\n /**\n * Test overlap of fat AABBs.\n */\n testOverlap(proxyIdA: number, proxyIdB: number): boolean {\n const aabbA = this.m_tree.getFatAABB(proxyIdA);\n const aabbB = this.m_tree.getFatAABB(proxyIdB);\n return AABB.testOverlap(aabbA, aabbB);\n }\n\n /**\n * Get the fat AABB for a proxy.\n */\n getFatAABB(proxyId: number): AABB {\n return this.m_tree.getFatAABB(proxyId);\n }\n\n /**\n * Get the number of proxies.\n */\n getProxyCount(): number {\n return this.m_proxyCount;\n }\n\n /**\n * Get the height of the embedded tree.\n */\n getTreeHeight(): number {\n return this.m_tree.getHeight();\n }\n\n /**\n * Get the balance (integer) of the embedded tree.\n */\n getTreeBalance(): number {\n return this.m_tree.getMaxBalance();\n }\n\n /**\n * Get the quality metric of the embedded tree.\n */\n getTreeQuality(): number {\n return this.m_tree.getAreaRatio();\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query = (aabb: AABB, queryCallback: DynamicTreeQueryCallback): void => {\n this.m_tree.query(aabb, queryCallback);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n this.m_tree.rayCast(input, rayCastCallback);\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_tree.shiftOrigin(newOrigin);\n }\n\n /**\n * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs\n * is called.\n */\n createProxy(aabb: AABB, userData: FixtureProxy): number {\n _ASSERT && common.assert(AABB.isValid(aabb));\n const proxyId = this.m_tree.createProxy(aabb, userData);\n this.m_proxyCount++;\n this.bufferMove(proxyId);\n return proxyId;\n }\n\n /**\n * Destroy a proxy. It is up to the client to remove any pairs.\n */\n destroyProxy(proxyId: number): void {\n this.unbufferMove(proxyId);\n this.m_proxyCount--;\n this.m_tree.destroyProxy(proxyId);\n }\n\n /**\n * Call moveProxy as many times as you like, then when you are done call\n * UpdatePairs to finalized the proxy pairs (for your time step).\n */\n moveProxy(proxyId: number, aabb: AABB, displacement: Vec2): void {\n _ASSERT && common.assert(AABB.isValid(aabb));\n const changed = this.m_tree.moveProxy(proxyId, aabb, displacement);\n if (changed) {\n this.bufferMove(proxyId);\n }\n }\n\n /**\n * Call to trigger a re-processing of it's pairs on the next call to\n * UpdatePairs.\n */\n touchProxy(proxyId: number): void {\n this.bufferMove(proxyId);\n }\n\n bufferMove(proxyId: number): void {\n this.m_moveBuffer.push(proxyId);\n }\n\n unbufferMove(proxyId: number): void {\n for (let i = 0; i < this.m_moveBuffer.length; ++i) {\n if (this.m_moveBuffer[i] === proxyId) {\n this.m_moveBuffer[i] = null;\n }\n }\n }\n\n /**\n * Update the pairs. This results in pair callbacks. This can only add pairs.\n */\n updatePairs(addPairCallback: (userDataA: FixtureProxy, userDataB: FixtureProxy) => void): void {\n _ASSERT && common.assert(typeof addPairCallback === 'function');\n this.m_callback = addPairCallback;\n\n // Perform tree queries for all moving proxies.\n while (this.m_moveBuffer.length > 0) {\n this.m_queryProxyId = this.m_moveBuffer.pop();\n if (this.m_queryProxyId === null) {\n continue;\n }\n\n // We have to query the tree with the fat AABB so that\n // we don't fail to create a pair that may touch later.\n const fatAABB = this.m_tree.getFatAABB(this.m_queryProxyId);\n\n // Query tree, create pairs and add them pair buffer.\n this.m_tree.query(fatAABB, this.queryCallback);\n }\n\n // Try to keep the tree balanced.\n // this.m_tree.rebalance(4);\n }\n\n queryCallback = (proxyId: number): boolean => {\n // A proxy cannot form a pair with itself.\n if (proxyId === this.m_queryProxyId) {\n return true;\n }\n\n const proxyIdA = Math.min(proxyId, this.m_queryProxyId);\n const proxyIdB = Math.max(proxyId, this.m_queryProxyId);\n\n // TODO: Skip any duplicate pairs.\n\n const userDataA = this.m_tree.getUserData(proxyIdA);\n const userDataB = this.m_tree.getUserData(proxyIdB);\n\n // Send the pairs back to the client.\n this.m_callback(userDataA, userDataB);\n\n return true;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from './Vec2';\nimport Math from './Math';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport default class Rot {\n s: number;\n c: number;\n\n /** Initialize from an angle in radians. */\n constructor(angle?: number | Rot) {\n if (!(this instanceof Rot)) {\n return new Rot(angle);\n }\n if (typeof angle === 'number') {\n this.setAngle(angle);\n } else if (typeof angle === 'object') {\n this.setRot(angle);\n } else {\n this.setIdentity();\n }\n }\n\n /** @internal */\n static neo(angle: number): Rot {\n const obj = Object.create(Rot.prototype);\n obj.setAngle(angle);\n return obj;\n }\n\n static clone(rot: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n const obj = Object.create(Rot.prototype);\n obj.s = rot.s;\n obj.c = rot.c;\n return obj;\n }\n\n static identity(): Rot {\n const obj = Object.create(Rot.prototype);\n obj.s = 0.0;\n obj.c = 1.0;\n return obj;\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.s) && Math.isFinite(obj.c);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Rot.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Rot!');\n }\n }\n\n /** Set to the identity rotation. */\n setIdentity(): void {\n this.s = 0.0;\n this.c = 1.0;\n }\n\n set(angle: number | Rot): void {\n if (typeof angle === 'object') {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n\n } else {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n }\n\n setRot(angle: Rot): void {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n }\n\n /** Set using an angle in radians. */\n setAngle(angle: number): void {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n\n /** Get the angle in radians. */\n getAngle(): number {\n return Math.atan2(this.s, this.c);\n }\n\n /** Get the x-axis. */\n getXAxis(): Vec2 {\n return Vec2.neo(this.c, this.s);\n }\n\n /** Get the u-axis. */\n getYAxis(): Vec2 {\n return Vec2.neo(-this.s, this.c);\n }\n\n /** Multiply two rotations: q * r */\n static mul(rot: Rot, m: Rot): Rot;\n /** Rotate a vector */\n static mul(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(rot, m) {\n _ASSERT && Rot.assert(rot);\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Multiply two rotations: q * r */\n static mulRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n }\n\n /** Rotate a vector */\n static mulVec2(rot: Rot, m: Vec2): Vec2 {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n\n static mulSub(rot: Rot, v: Vec2, w: Vec2): Vec2 {\n const x = rot.c * (v.x - w.x) - rot.s * (v.y - w.y);\n const y = rot.s * (v.x - w.x) + rot.c * (v.y - w.y);\n return Vec2.neo(x, y);\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulT(rot: Rot, m: Rot): Rot;\n /** Inverse rotate a vector */\n static mulT(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(rot, m) {\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulTRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n }\n\n /** Inverse rotate a vector */\n static mulTVec2(rot: Rot, m: Vec2): Vec2 {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from './Vec2';\nimport Rot from './Rot';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A transform contains translation and rotation. It is used to represent the\n * position and orientation of rigid frames. Initialize using a position vector\n * and a rotation.\n */\nexport default class Transform {\n /** position */\n p: Vec2;\n\n /** rotation */\n q: Rot;\n\n constructor(position?: Vec2, rotation?: number) {\n if (!(this instanceof Transform)) {\n return new Transform(position, rotation);\n }\n this.p = Vec2.zero();\n this.q = Rot.identity();\n if (typeof position !== 'undefined') {\n this.p.setVec2(position);\n }\n if (typeof rotation !== 'undefined') {\n this.q.setAngle(rotation);\n }\n }\n\n static clone(xf: Transform): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(xf.p);\n obj.q = Rot.clone(xf.q);\n return obj;\n }\n\n /** @internal */\n static neo(position: Vec2, rotation: Rot): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(position);\n obj.q = Rot.clone(rotation);\n return obj;\n }\n\n static identity(): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.zero();\n obj.q = Rot.identity();\n return obj;\n }\n\n /**\n * Set this to the identity transform.\n */\n setIdentity(): void {\n this.p.setZero();\n this.q.setIdentity();\n }\n\n set(position: Vec2, rotation: number): void;\n set(xf: Transform): void;\n /**\n * Set this based on the position and angle.\n */\n // tslint:disable-next-line:typedef\n set(a, b?) {\n if (typeof b === 'undefined') {\n this.p.set(a.p);\n this.q.set(a.q);\n } else {\n this.p.set(a);\n this.q.set(b);\n }\n }\n\n /**\n * Set this based on the position and angle.\n */\n setNum(position: Vec2, rotation: number) {\n this.p.setVec2(position);\n this.q.setAngle(rotation);\n }\n\n setTransform(xf: Transform): void {\n this.p.setVec2(xf.p);\n this.q.setRot(xf.q);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.p) && Rot.isValid(obj.q);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Transform.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Transform!');\n }\n }\n\n static mul(a: Transform, b: Vec2): Vec2;\n static mul(a: Transform, b: Transform): Transform;\n // static mul(a: Transform, b: Vec2[]): Vec2[];\n // static mul(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (Array.isArray(b)) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n\n } else if ('x' in b && 'y' in b) {\n return Transform.mulVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulXf(a, b);\n }\n }\n\n static mulAll(a: Transform, b: Vec2[]): Vec2[];\n static mulAll(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mulAll(a: Transform, b) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static mulFn(a: Transform) {\n _ASSERT && Transform.assert(a);\n return function(b: Vec2): Vec2 {\n return Transform.mul(a, b);\n };\n }\n\n static mulVec2(a: Transform, b: Vec2): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = (a.q.c * b.x - a.q.s * b.y) + a.p.x;\n const y = (a.q.s * b.x + a.q.c * b.y) + a.p.y;\n return Vec2.neo(x, y);\n }\n\n static mulXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p\n // = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p\n const xf = Transform.identity();\n xf.q = Rot.mulRot(a.q, b.q);\n xf.p = Vec2.add(Rot.mulVec2(a.q, b.p), a.p);\n return xf;\n }\n\n static mulT(a: Transform, b: Vec2): Vec2;\n static mulT(a: Transform, b: Transform): Transform;\n // tslint:disable-next-line:typedef\n static mulT(a, b) {\n if ('x' in b && 'y' in b) {\n return Transform.mulTVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulTXf(a, b);\n }\n }\n\n static mulTVec2(a: Transform, b: Vec2): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const px = b.x - a.p.x;\n const py = b.y - a.p.y;\n const x = (a.q.c * px + a.q.s * py);\n const y = (-a.q.s * px + a.q.c * py);\n return Vec2.neo(x, y);\n }\n\n static mulTXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q' * (B.q * v1 + B.p - A.p)\n // = A.q' * B.q * v1 + A.q' * (B.p - A.p)\n const xf = Transform.identity();\n xf.q.setRot(Rot.mulTRot(a.q, b.q));\n xf.p.setVec2(Rot.mulTVec2(a.q, Vec2.sub(b.p, a.p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Math from './Math';\nimport Vec2 from './Vec2';\nimport Rot from './Rot';\nimport Transform from './Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * This describes the motion of a body/shape for TOI computation. Shapes are\n * defined with respect to the body origin, which may not coincide with the\n * center of mass. However, to support dynamics we must interpolate the center\n * of mass position.\n */\nexport default class Sweep {\n /** Local center of mass position */\n localCenter: Vec2;\n\n /** World center position */\n c: Vec2;\n\n /** World angle */\n a: number;\n\n /** Fraction of the current time step in the range [0,1], c0 and a0 are c and a at alpha0. */\n alpha0: number;\n\n c0: Vec2;\n a0: number;\n\n constructor(c?: Vec2, a?: number) {\n _ASSERT && common.assert(typeof c === 'undefined');\n _ASSERT && common.assert(typeof a === 'undefined');\n this.localCenter = Vec2.zero();\n this.c = Vec2.zero();\n this.a = 0;\n this.alpha0 = 0;\n this.c0 = Vec2.zero();\n this.a0 = 0;\n }\n\n setTransform(xf: Transform): void {\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n\n this.a = xf.q.getAngle();\n this.a0 = xf.q.getAngle();\n }\n\n setLocalCenter(localCenter: Vec2, xf: Transform): void {\n this.localCenter.setVec2(localCenter);\n\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n }\n\n /**\n * Get the interpolated transform at a specific time.\n *\n * @param xf\n * @param beta A factor in [0,1], where 0 indicates alpha0\n */\n getTransform(xf: Transform, beta: number = 0): void {\n xf.q.setAngle((1.0 - beta) * this.a0 + beta * this.a);\n xf.p.setCombine((1.0 - beta), this.c0, beta, this.c);\n\n // shift to origin\n xf.p.sub(Rot.mulVec2(xf.q, this.localCenter));\n }\n\n /**\n * Advance the sweep forward, yielding a new initial state.\n *\n * @param alpha The new initial time\n */\n advance(alpha: number): void {\n _ASSERT && common.assert(this.alpha0 < 1.0);\n const beta = (alpha - this.alpha0) / (1.0 - this.alpha0);\n this.c0.setCombine(beta, this.c, 1 - beta, this.c0);\n this.a0 = beta * this.a + (1 - beta) * this.a0;\n this.alpha0 = alpha;\n }\n\n forward(): void {\n this.a0 = this.a;\n this.c0.setVec2(this.c);\n }\n\n /**\n * normalize the angles in radians to be between -pi and pi.\n */\n normalize(): void {\n const a0 = Math.mod(this.a0, -Math.PI, +Math.PI);\n this.a -= this.a0 - a0;\n this.a0 = a0;\n }\n\n clone(): Sweep {\n const clone = new Sweep();\n clone.localCenter.setVec2(this.localCenter);\n clone.alpha0 = this.alpha0;\n clone.a0 = this.a0;\n clone.a = this.a;\n clone.c0.setVec2(this.c0);\n clone.c.setVec2(this.c);\n return clone;\n }\n\n set(that: Sweep): void {\n this.localCenter.setVec2(that.localCenter);\n this.alpha0 = that.alpha0;\n this.a0 = that.a0;\n this.a = that.a;\n this.c0.setVec2(that.c0);\n this.c.setVec2(that.c);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Vec2 from '../common/Vec2';\n\nexport default class Velocity {\n /** linear */\n v: Vec2;\n\n /** angular */\n w: number;\n\n constructor() {\n this.v = Vec2.zero();\n this.w = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Vec2 from '../common/Vec2';\nimport Rot from '../common/Rot';\nimport Transform from '../common/Transform';\n\n\nexport default class Position {\n /** location */\n c: Vec2;\n\n /** angle */\n a: number;\n\n constructor() {\n this.c = Vec2.zero();\n this.a = 0;\n }\n\n getTransform(xf: Transform, p: Vec2): Transform {\n xf.q.setAngle(this.a);\n xf.p.setVec2(Vec2.sub(this.c, Rot.mulVec2(xf.q, p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../dynamics/Body';\nimport AABB, { RayCastOutput, RayCastInput } from './AABB';\nimport { DistanceProxy } from './Distance';\nimport type Transform from '../common/Transform';\nimport type Vec2 from '../common/Vec2';\n\n\n/**\n * A shape is used for collision detection. You can create a shape however you\n * like. Shapes used for simulation in World are created automatically when a\n * Fixture is created. Shapes may encapsulate one or more child shapes.\n */\nexport default abstract class Shape {\n m_type: ShapeType;\n m_radius: number;\n\n /** @internal */\n _reset(): void {\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return typeof obj.m_type === 'string' && typeof obj.m_radius === 'number';\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n /**\n * Get the type of this shape. You can use this to down cast to the concrete\n * shape.\n *\n * @return the shape type.\n */\n getType(): ShapeType {\n return this.m_type;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n abstract _clone(): Shape;\n\n /**\n * Get the number of child primitives.\n */\n abstract getChildCount(): number;\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n abstract testPoint(xf: Transform, p: Vec2): boolean;\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n abstract rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean;\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n abstract computeAABB(aabb: AABB, xf: Transform, childIndex: number): void;\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n abstract computeMass(massData: MassData, density?: number): void;\n\n abstract computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void;\n\n}\n\nexport type ShapeType = \"circle\" | \"edge\" | \"polygon\" | \"chain\";\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport options from '../util/options';\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\nimport AABB, { RayCastInput, RayCastOutput } from '../collision/AABB';\nimport Shape, { ShapeType } from '../collision/Shape';\nimport Body, { MassData } from \"./Body\";\nimport BroadPhase from \"../collision/BroadPhase\";\nimport Transform from \"../common/Transform\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A fixture definition is used to create a fixture. This class defines an\n * abstract fixture definition. You can reuse fixture definitions safely.\n */\nexport interface FixtureOpt {\n userData?: unknown;\n /**\n * The friction coefficient, usually in the range [0,1]\n */\n friction?: number;\n /**\n * The restitution (elasticity) usually in the range [0,1]\n */\n restitution?: number;\n /**\n * The density, usually in kg/m^2\n */\n density?: number;\n /**\n * A sensor shape collects contact information but never generates a collision response.\n */\n isSensor?: boolean;\n /**\n * Zero, positive or negative collision group.\n * Fixtures with same positive groupIndex always collide and fixtures with same negative groupIndex never collide.\n */\n filterGroupIndex?: number;\n /**\n * Collision category bit or bits that this fixture belongs to.\n * If groupIndex is zero or not matching, then at least one bit in this fixture categoryBits should match other fixture maskBits and vice versa.\n */\n filterCategoryBits?: number;\n /**\n * Collision category bit or bits that this fixture accept for collision.\n */\n filterMaskBits?: number;\n}\n\nexport interface FixtureDef extends FixtureOpt {\n shape: Shape;\n}\n\nconst FixtureDefDefault: FixtureOpt = {\n userData : null,\n friction : 0.2,\n restitution : 0.0,\n density : 0.0,\n isSensor : false,\n\n filterGroupIndex : 0,\n filterCategoryBits : 0x0001,\n filterMaskBits : 0xFFFF\n};\n\n/**\n * This proxy is used internally to connect shape children to the broad-phase.\n */\nexport class FixtureProxy {\n aabb: AABB;\n fixture: Fixture;\n childIndex: number;\n proxyId: number;\n constructor(fixture: Fixture, childIndex: number) {\n this.aabb = new AABB();\n this.fixture = fixture;\n this.childIndex = childIndex;\n this.proxyId;\n }\n}\n\n/**\n * A fixture is used to attach a shape to a body for collision detection. A\n * fixture inherits its transform from its parent. Fixtures hold additional\n * non-geometric data such as friction, collision filters, etc.\n *\n * To create a new Fixture use {@link Body.createFixture}.\n */\nexport default class Fixture {\n /** @internal */ m_body: Body;\n /** @internal */ m_friction: number;\n /** @internal */ m_restitution: number;\n /** @internal */ m_density: number;\n /** @internal */ m_isSensor: boolean;\n /** @internal */ m_filterGroupIndex: number;\n /** @internal */ m_filterCategoryBits: number;\n /** @internal */ m_filterMaskBits: number;\n /** @internal */ m_shape: Shape;\n /** @internal */ m_next: Fixture | null;\n /** @internal */ m_proxies: FixtureProxy[];\n /** @internal */ m_proxyCount: number;\n /** @internal */ m_userData: unknown;\n\n constructor(body: Body, def: FixtureDef);\n constructor(body: Body, shape: Shape, def?: FixtureOpt);\n constructor(body: Body, shape: Shape, density?: number);\n // tslint:disable-next-line:typedef\n /** @internal */ constructor(body: Body, shape?, def?) {\n if (shape.shape) {\n def = shape;\n shape = shape.shape;\n\n } else if (typeof def === 'number') {\n def = {density : def};\n }\n\n def = options(def, FixtureDefDefault);\n\n this.m_body = body;\n\n this.m_friction = def.friction;\n this.m_restitution = def.restitution;\n this.m_density = def.density;\n this.m_isSensor = def.isSensor;\n\n this.m_filterGroupIndex = def.filterGroupIndex;\n this.m_filterCategoryBits = def.filterCategoryBits;\n this.m_filterMaskBits = def.filterMaskBits;\n\n // TODO validate shape\n this.m_shape = shape; // .clone();\n\n this.m_next = null;\n\n this.m_proxies = [];\n this.m_proxyCount = 0;\n\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n\n this.m_userData = def.userData;\n }\n\n /**\n * Re-setup fixture.\n * @internal\n */\n _reset(): void {\n const body = this.getBody();\n const broadPhase = body.m_world.m_broadPhase;\n this.destroyProxies(broadPhase);\n if (this.m_shape._reset) {\n this.m_shape._reset();\n }\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n this.createProxies(broadPhase, body.m_xf);\n body.resetMassData();\n }\n\n /** @internal */\n _serialize(): object {\n return {\n friction: this.m_friction,\n restitution: this.m_restitution,\n density: this.m_density,\n isSensor: this.m_isSensor,\n\n filterGroupIndex: this.m_filterGroupIndex,\n filterCategoryBits: this.m_filterCategoryBits,\n filterMaskBits: this.m_filterMaskBits,\n\n shape: this.m_shape,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, body: any, restore: any): Fixture {\n const shape = restore(Shape, data.shape);\n const fixture = shape && new Fixture(body, shape, data);\n return fixture;\n }\n\n /**\n * Get the type of the child shape. You can use this to down cast to the\n * concrete shape.\n */\n getType(): ShapeType {\n return this.m_shape.getType();\n }\n\n /**\n * Get the child shape. You can modify the child shape, however you should not\n * change the number of vertices because this will crash some collision caching\n * mechanisms. Manipulating the shape may lead to non-physical behavior.\n */\n getShape(): Shape {\n return this.m_shape;\n }\n\n /**\n * A sensor shape collects contact information but never generates a collision\n * response.\n */\n isSensor(): boolean {\n return this.m_isSensor;\n }\n\n /**\n * Set if this fixture is a sensor.\n */\n setSensor(sensor: boolean): void {\n if (sensor != this.m_isSensor) {\n this.m_body.setAwake(true);\n this.m_isSensor = sensor;\n }\n }\n\n // /**\n // * Get the contact filtering data.\n // */\n // getFilterData() {\n // return this.m_filter;\n // }\n\n /**\n * Get the user data that was assigned in the fixture definition. Use this to\n * store your application specific data.\n */\n getUserData(): unknown {\n return this.m_userData;\n }\n\n /**\n * Set the user data. Use this to store your application specific data.\n */\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get the parent body of this fixture. This is null if the fixture is not\n * attached.\n */\n getBody(): Body {\n return this.m_body;\n }\n\n /**\n * Get the next fixture in the parent body's fixture list.\n */\n getNext(): Fixture | null {\n return this.m_next;\n }\n\n /**\n * Get the density of this fixture.\n */\n getDensity(): number {\n return this.m_density;\n }\n\n /**\n * Set the density of this fixture. This will _not_ automatically adjust the\n * mass of the body. You must call Body.resetMassData to update the body's mass.\n */\n setDensity(density: number): void {\n _ASSERT && common.assert(Math.isFinite(density) && density >= 0.0);\n this.m_density = density;\n }\n\n /**\n * Get the coefficient of friction, usually in the range [0,1].\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Set the coefficient of friction. This will not change the friction of\n * existing contacts.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the coefficient of restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Set the coefficient of restitution. This will not change the restitution of\n * existing contacts.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Test a point in world coordinates for containment in this fixture.\n */\n testPoint(p: Vec2): boolean {\n return this.m_shape.testPoint(this.m_body.getTransform(), p);\n }\n\n /**\n * Cast a ray against this shape.\n */\n rayCast(output: RayCastOutput, input: RayCastInput, childIndex: number): boolean {\n return this.m_shape.rayCast(output, input, this.m_body.getTransform(), childIndex);\n }\n\n /**\n * Get the mass data for this fixture. The mass data is based on the density and\n * the shape. The rotational inertia is about the shape's origin. This operation\n * may be expensive.\n */\n getMassData(massData: MassData): void {\n this.m_shape.computeMass(massData, this.m_density);\n }\n\n /**\n * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a\n * more accurate AABB, compute it using the shape and the body transform.\n */\n getAABB(childIndex: number): AABB {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_proxyCount);\n return this.m_proxies[childIndex].aabb;\n }\n\n /**\n * These support body activation/deactivation.\n */\n createProxies(broadPhase: BroadPhase, xf: Transform): void {\n _ASSERT && common.assert(this.m_proxyCount == 0);\n\n // Create proxies in the broad-phase.\n this.m_proxyCount = this.m_shape.getChildCount();\n\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n this.m_shape.computeAABB(proxy.aabb, xf, i);\n proxy.proxyId = broadPhase.createProxy(proxy.aabb, proxy);\n }\n }\n\n destroyProxies(broadPhase: BroadPhase): void {\n // Destroy proxies in the broad-phase.\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n broadPhase.destroyProxy(proxy.proxyId);\n proxy.proxyId = null;\n }\n\n this.m_proxyCount = 0;\n }\n\n /**\n * Updates this fixture proxy in broad-phase (with combined AABB of current and\n * next transformation).\n */\n synchronize(broadPhase: BroadPhase, xf1: Transform, xf2: Transform): void {\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n // Compute an AABB that covers the swept shape (may miss some rotation\n // effect).\n const aabb1 = new AABB();\n const aabb2 = new AABB();\n this.m_shape.computeAABB(aabb1, xf1, proxy.childIndex);\n this.m_shape.computeAABB(aabb2, xf2, proxy.childIndex);\n\n proxy.aabb.combine(aabb1, aabb2);\n\n const displacement = Vec2.sub(xf2.p, xf1.p);\n\n broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement);\n }\n }\n\n /**\n * Set the contact filtering data. This will not update contacts until the next\n * time step when either parent body is active and awake. This automatically\n * calls refilter.\n */\n setFilterData(filter: { groupIndex: number, categoryBits: number, maskBits: number }): void {\n this.m_filterGroupIndex = filter.groupIndex;\n this.m_filterCategoryBits = filter.categoryBits;\n this.m_filterMaskBits = filter.maskBits;\n this.refilter();\n }\n\n getFilterGroupIndex(): number {\n return this.m_filterGroupIndex;\n }\n\n setFilterGroupIndex(groupIndex: number): void {\n this.m_filterGroupIndex = groupIndex;\n }\n\n getFilterCategoryBits(): number {\n return this.m_filterCategoryBits;\n }\n\n setFilterCategoryBits(categoryBits: number): void {\n this.m_filterCategoryBits = categoryBits;\n }\n\n getFilterMaskBits(): number {\n return this.m_filterMaskBits;\n }\n\n setFilterMaskBits(maskBits: number): void {\n this.m_filterMaskBits = maskBits;\n }\n\n /**\n * Call this if you want to establish collision that was previously disabled by\n * ContactFilter.\n */\n refilter(): void {\n if (this.m_body == null) {\n return;\n }\n\n // Flag associated contacts for filtering.\n let edge = this.m_body.getContactList();\n while (edge) {\n const contact = edge.contact;\n const fixtureA = contact.getFixtureA();\n const fixtureB = contact.getFixtureB();\n if (fixtureA == this || fixtureB == this) {\n contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n\n const world = this.m_body.getWorld();\n\n if (world == null) {\n return;\n }\n\n // Touch each proxy so that new pairs may be created\n const broadPhase = world.m_broadPhase;\n for (let i = 0; i < this.m_proxyCount; ++i) {\n broadPhase.touchProxy(this.m_proxies[i].proxyId);\n }\n }\n\n /**\n * Implement this method to provide collision filtering, if you want finer\n * control over contact creation.\n *\n * Return true if contact calculations should be performed between these two\n * fixtures.\n *\n * Warning: for performance reasons this is only called when the AABBs begin to\n * overlap.\n */\n shouldCollide(that: Fixture): boolean {\n\n if (that.m_filterGroupIndex === this.m_filterGroupIndex && that.m_filterGroupIndex !== 0) {\n return that.m_filterGroupIndex > 0;\n }\n\n const collideA = (that.m_filterMaskBits & this.m_filterCategoryBits) !== 0;\n const collideB = (that.m_filterCategoryBits & this.m_filterMaskBits) !== 0;\n const collide = collideA && collideB;\n return collide;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nimport common from '../util/common';\nimport options from '../util/options';\nimport Vec2 from '../common/Vec2';\nimport Rot from '../common/Rot';\nimport Math from '../common/Math';\nimport Sweep from '../common/Sweep';\nimport Transform from '../common/Transform';\nimport Velocity from './Velocity';\nimport Position from './Position';\nimport Fixture, { FixtureDef, FixtureOpt } from './Fixture';\nimport Shape from '../collision/Shape';\nimport { JointEdge } from \"./Joint\";\nimport World from \"./World\";\nimport { ContactEdge } from \"./Contact\";\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\nexport type BodyType = 'static' | 'kinematic' | 'dynamic';\n\nconst STATIC = 'static';\nconst KINEMATIC = 'kinematic';\nconst DYNAMIC = 'dynamic';\n\nexport interface BodyDef {\n /**\n * Body types are static, kinematic, or dynamic. Note: if a dynamic\n * body would have zero mass, the mass is set to one.\n */\n type?: BodyType;\n /**\n * The world position of the body. Avoid creating bodies at the\n * origin since this can lead to many overlapping shapes.\n */\n position?: Vec2;\n /**\n * The world angle of the body in radians.\n */\n angle?: number;\n /**\n * The linear velocity of the body's origin in world co-ordinates.\n */\n linearVelocity?: Vec2;\n angularVelocity?: number;\n /**\n * Linear damping is use to reduce the linear velocity. The\n * damping parameter can be larger than 1.0 but the damping effect becomes\n * sensitive to the time step when the damping parameter is large.\n */\n linearDamping?: number;\n /**\n * Angular damping is use to reduce the angular velocity.\n * The damping parameter can be larger than 1.0 but the damping effect\n * becomes sensitive to the time step when the damping parameter is large.\n */\n angularDamping?: number;\n /**\n * Should this body be prevented from rotating? Useful for characters.\n */\n fixedRotation?: boolean;\n /**\n * Is this a fast moving body that should be prevented from\n * tunneling through other moving bodies? Note that all bodies are\n * prevented from tunneling through kinematic and static bodies. This\n * setting is only considered on dynamic bodies. Warning: You should use\n * this flag sparingly since it increases processing time.\n */\n bullet?: boolean;\n gravityScale?: number;\n /**\n * Set this flag to false if this body should never fall asleep. Note that this increases CPU usage.\n */\n allowSleep?: boolean;\n /**\n * Is this body initially awake or sleeping?\n */\n awake?: boolean;\n /**\n * Does this body start out active?\n */\n active?: boolean;\n userData?: any;\n}\n\nconst BodyDefDefault: BodyDef = {\n type : STATIC,\n position : Vec2.zero(),\n angle : 0.0,\n\n linearVelocity : Vec2.zero(),\n angularVelocity : 0.0,\n\n linearDamping : 0.0,\n angularDamping : 0.0,\n\n fixedRotation : false,\n bullet : false,\n gravityScale : 1.0,\n\n allowSleep : true,\n awake : true,\n active : true,\n\n userData : null\n};\n\n/**\n * MassData This holds the mass data computed for a shape.\n */\nexport class MassData {\n /** The mass of the shape, usually in kilograms. */\n mass: number = 0;\n /** The position of the shape's centroid relative to the shape's origin. */\n center: Vec2 = Vec2.zero();\n /** The rotational inertia of the shape about the local origin. */\n I: number = 0;\n}\n\n/**\n * A rigid body composed of one or more fixtures.\n *\n * To create a new Body use {@link World.createBody}.\n */\nexport default class Body {\n /**\n * A static body does not move under simulation and behaves as if it has infinite mass.\n * Internally, zero is stored for the mass and the inverse mass.\n * Static bodies can be moved manually by the user.\n * A static body has zero velocity.\n * Static bodies do not collide with other static or kinematic bodies.\n */\n static readonly STATIC: BodyType = 'static';\n /**\n * A kinematic body moves under simulation according to its velocity.\n * Kinematic bodies do not respond to forces.\n * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity.\n * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass.\n * Kinematic bodies do not collide with other kinematic or static bodies.\n */\n static readonly KINEMATIC: BodyType = 'kinematic';\n\n /**\n * A dynamic body is fully simulated.\n * They can be moved manually by the user, but normally they move according to forces.\n * A dynamic body can collide with all body types.\n * A dynamic body always has finite, non-zero mass.\n * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate.\n */\n static readonly DYNAMIC: BodyType = 'dynamic';\n\n /** @internal */ m_world: World;\n /** @internal */ m_awakeFlag: boolean;\n /** @internal */ m_autoSleepFlag: boolean;\n /** @internal */ m_bulletFlag: boolean;\n /** @internal */ m_fixedRotationFlag: boolean;\n /** @internal */ m_activeFlag: boolean;\n /** @internal */ m_islandFlag: boolean;\n /** @internal */ m_toiFlag: boolean;\n /** @internal */ m_userData: unknown;\n /** @internal */ m_type: BodyType;\n /** @internal */ m_mass: number;\n /** @internal */ m_invMass: number;\n /** @internal Rotational inertia about the center of mass. */\n m_I: number;\n /** @internal */ m_invI: number;\n /** @internal the body origin transform */\n m_xf: Transform;\n /** @internal the swept motion for CCD */\n m_sweep: Sweep;\n // position and velocity correction\n /** @internal */ c_velocity: Velocity;\n /** @internal */ c_position: Position;\n /** @internal */ m_force: Vec2;\n /** @internal */ m_torque: number;\n /** @internal */ m_linearVelocity: Vec2;\n /** @internal */ m_angularVelocity: number;\n /** @internal */ m_linearDamping: number;\n /** @internal */ m_angularDamping: number;\n /** @internal */ m_gravityScale: number;\n /** @internal */ m_sleepTime: number;\n /** @internal */ m_jointList: JointEdge | null;\n /** @internal */ m_contactList: ContactEdge | null;\n /** @internal */ m_fixtureList: Fixture | null;\n /** @internal */ m_prev: Body | null;\n /** @internal */ m_next: Body | null;\n /** @internal */ m_destroyed: boolean;\n\n /** @internal */\n constructor(world: World, def: BodyDef) {\n def = options(def, BodyDefDefault);\n\n _ASSERT && common.assert(Vec2.isValid(def.position));\n _ASSERT && common.assert(Vec2.isValid(def.linearVelocity));\n _ASSERT && common.assert(Math.isFinite(def.angle));\n _ASSERT && common.assert(Math.isFinite(def.angularVelocity));\n _ASSERT && common.assert(Math.isFinite(def.angularDamping) && def.angularDamping >= 0.0);\n _ASSERT && common.assert(Math.isFinite(def.linearDamping) && def.linearDamping >= 0.0);\n\n this.m_world = world;\n\n this.m_awakeFlag = def.awake;\n this.m_autoSleepFlag = def.allowSleep;\n this.m_bulletFlag = def.bullet;\n this.m_fixedRotationFlag = def.fixedRotation;\n this.m_activeFlag = def.active;\n\n this.m_islandFlag = false;\n this.m_toiFlag = false;\n\n this.m_userData = def.userData;\n this.m_type = def.type;\n\n if (this.m_type == DYNAMIC) {\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n } else {\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n }\n\n // Rotational inertia about the center of mass.\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n // the body origin transform\n this.m_xf = Transform.identity();\n this.m_xf.p = Vec2.clone(def.position);\n this.m_xf.q.setAngle(def.angle);\n\n // the swept motion for CCD\n this.m_sweep = new Sweep();\n this.m_sweep.setTransform(this.m_xf);\n\n // position and velocity correction\n this.c_velocity = new Velocity();\n this.c_position = new Position();\n\n this.m_force = Vec2.zero();\n this.m_torque = 0.0;\n\n this.m_linearVelocity = Vec2.clone(def.linearVelocity);\n this.m_angularVelocity = def.angularVelocity;\n\n this.m_linearDamping = def.linearDamping;\n this.m_angularDamping = def.angularDamping;\n this.m_gravityScale = def.gravityScale;\n\n this.m_sleepTime = 0.0;\n\n this.m_jointList = null;\n this.m_contactList = null;\n this.m_fixtureList = null;\n\n this.m_prev = null;\n this.m_next = null;\n\n this.m_destroyed = false;\n }\n\n /** @internal */\n _serialize(): object {\n const fixtures = [];\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n fixtures.push(f);\n }\n return {\n type: this.m_type,\n bullet: this.m_bulletFlag,\n position: this.m_xf.p,\n angle: this.m_xf.q.getAngle(),\n linearVelocity: this.m_linearVelocity,\n angularVelocity: this.m_angularVelocity,\n fixtures,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): Body {\n const body = new Body(world, data);\n\n if (data.fixtures) {\n for (let i = data.fixtures.length - 1; i >= 0; i--) {\n const fixture = restore(Fixture, data.fixtures[i], body);\n body._addFixture(fixture);\n }\n }\n return body;\n }\n\n isWorldLocked(): boolean {\n return this.m_world && this.m_world.isLocked() ? true : false;\n }\n\n getWorld(): World {\n return this.m_world;\n }\n\n getNext(): Body | null {\n return this.m_next;\n }\n\n setUserData(data: any): void {\n this.m_userData = data;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n getFixtureList(): Fixture | null {\n return this.m_fixtureList;\n }\n\n getJointList(): JointEdge | null {\n return this.m_jointList;\n }\n\n /**\n * Warning: this list changes during the time step and you may miss some\n * collisions if you don't use ContactListener.\n */\n getContactList(): ContactEdge | null {\n return this.m_contactList;\n }\n\n isStatic(): boolean {\n return this.m_type == STATIC;\n }\n\n isDynamic(): boolean {\n return this.m_type == DYNAMIC;\n }\n\n isKinematic(): boolean {\n return this.m_type == KINEMATIC;\n }\n\n /**\n * This will alter the mass and velocity.\n */\n setStatic(): Body {\n this.setType(STATIC);\n return this;\n }\n\n setDynamic(): Body {\n this.setType(DYNAMIC);\n return this;\n }\n\n setKinematic(): Body {\n this.setType(KINEMATIC);\n return this;\n }\n\n /**\n * @internal\n */\n getType(): BodyType {\n return this.m_type;\n }\n\n /**\n * @internal\n */\n setType(type: BodyType): void {\n _ASSERT && common.assert(type === STATIC || type === KINEMATIC || type === DYNAMIC);\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type == type) {\n return;\n }\n\n this.m_type = type;\n\n this.resetMassData();\n\n if (this.m_type == STATIC) {\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_sweep.forward();\n this.synchronizeFixtures();\n }\n\n this.setAwake(true);\n\n this.m_force.setZero();\n this.m_torque = 0.0;\n\n // Delete the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n\n // Touch the proxies so that new contacts will be created (when appropriate)\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n const proxyCount = f.m_proxyCount;\n for (let i = 0; i < proxyCount; ++i) {\n broadPhase.touchProxy(f.m_proxies[i].proxyId);\n }\n }\n }\n\n isBullet(): boolean {\n return this.m_bulletFlag;\n }\n\n /**\n * Should this body be treated like a bullet for continuous collision detection?\n */\n setBullet(flag: boolean): void {\n this.m_bulletFlag = !!flag;\n }\n\n isSleepingAllowed(): boolean {\n return this.m_autoSleepFlag;\n }\n\n setSleepingAllowed(flag: boolean): void {\n this.m_autoSleepFlag = !!flag;\n if (this.m_autoSleepFlag == false) {\n this.setAwake(true);\n }\n }\n\n isAwake(): boolean {\n return this.m_awakeFlag;\n }\n\n /**\n * Set the sleep state of the body. A sleeping body has very low CPU cost.\n *\n * @param flag Set to true to wake the body, false to put it to sleep.\n */\n setAwake(flag: boolean): void {\n if (flag) {\n if (this.m_awakeFlag == false) {\n this.m_awakeFlag = true;\n this.m_sleepTime = 0.0;\n }\n } else {\n this.m_awakeFlag = false;\n this.m_sleepTime = 0.0;\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_force.setZero();\n this.m_torque = 0.0;\n }\n }\n\n isActive(): boolean {\n return this.m_activeFlag;\n }\n\n /**\n * Set the active state of the body. An inactive body is not simulated and\n * cannot be collided with or woken up. If you pass a flag of true, all fixtures\n * will be added to the broad-phase. If you pass a flag of false, all fixtures\n * will be removed from the broad-phase and all contacts will be destroyed.\n * Fixtures and joints are otherwise unaffected.\n *\n * You may continue to create/destroy fixtures and joints on inactive bodies.\n * Fixtures on an inactive body are implicitly inactive and will not participate\n * in collisions, ray-casts, or queries. Joints connected to an inactive body\n * are implicitly inactive. An inactive body is still owned by a World object\n * and remains\n */\n setActive(flag: boolean): void {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (flag == this.m_activeFlag) {\n return;\n }\n\n this.m_activeFlag = !!flag;\n\n if (this.m_activeFlag) {\n // Create all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.createProxies(broadPhase, this.m_xf);\n }\n // Contacts are created the next time step.\n\n } else {\n // Destroy all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.destroyProxies(broadPhase);\n }\n\n // Destroy the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n }\n }\n\n isFixedRotation(): boolean {\n return this.m_fixedRotationFlag;\n }\n\n /**\n * Set this body to have fixed rotation. This causes the mass to be reset.\n */\n setFixedRotation(flag: boolean): void {\n if (this.m_fixedRotationFlag == flag) {\n return;\n }\n\n this.m_fixedRotationFlag = !!flag;\n\n this.m_angularVelocity = 0.0;\n\n this.resetMassData();\n }\n\n /**\n * Get the world transform for the body's origin.\n */\n getTransform(): Transform {\n return this.m_xf;\n }\n\n /**\n * Set the position of the body's origin and rotation. Manipulating a body's\n * transform may cause non-physical behavior. Note: contacts are updated on the\n * next call to World.step.\n *\n * @param position The world position of the body's local origin.\n * @param angle The world rotation in radians.\n */\n setTransform(position: Vec2, angle: number): void {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n this.m_xf.setNum(position, angle);\n this.m_sweep.setTransform(this.m_xf);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, this.m_xf, this.m_xf);\n }\n }\n\n synchronizeTransform(): void {\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Update fixtures in broad-phase.\n */\n synchronizeFixtures(): void {\n const xf = Transform.identity();\n\n this.m_sweep.getTransform(xf, 0);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, xf, this.m_xf);\n }\n }\n\n /**\n * Used in TOI.\n */\n advance(alpha: number): void {\n // Advance to the new safe time. This doesn't sync the broad-phase.\n this.m_sweep.advance(alpha);\n this.m_sweep.c.setVec2(this.m_sweep.c0);\n this.m_sweep.a = this.m_sweep.a0;\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Get the world position for the body's origin.\n */\n getPosition(): Vec2 {\n return this.m_xf.p;\n }\n\n setPosition(p: Vec2): void {\n this.setTransform(p, this.m_sweep.a);\n }\n\n /**\n * Get the current world rotation angle in radians.\n */\n getAngle(): number {\n return this.m_sweep.a;\n }\n\n setAngle(angle: number): void {\n this.setTransform(this.m_xf.p, angle);\n }\n\n /**\n * Get the world position of the center of mass.\n */\n getWorldCenter(): Vec2 {\n return this.m_sweep.c;\n }\n\n /**\n * Get the local position of the center of mass.\n */\n getLocalCenter(): Vec2 {\n return this.m_sweep.localCenter;\n }\n\n /**\n * Get the linear velocity of the center of mass.\n *\n * @return the linear velocity of the center of mass.\n */\n getLinearVelocity(): Vec2 {\n return this.m_linearVelocity;\n }\n\n /**\n * Get the world linear velocity of a world point attached to this body.\n *\n * @param worldPoint A point in world coordinates.\n */\n getLinearVelocityFromWorldPoint(worldPoint: Vec2): Vec2 {\n const localCenter = Vec2.sub(worldPoint, this.m_sweep.c);\n return Vec2.add(this.m_linearVelocity, Vec2.crossNumVec2(this.m_angularVelocity,\n localCenter));\n }\n\n /**\n * Get the world velocity of a local point.\n *\n * @param localPoint A point in local coordinates.\n */\n getLinearVelocityFromLocalPoint(localPoint: Vec2): Vec2 {\n return this.getLinearVelocityFromWorldPoint(this.getWorldPoint(localPoint));\n }\n\n /**\n * Set the linear velocity of the center of mass.\n *\n * @param v The new linear velocity of the center of mass.\n */\n setLinearVelocity(v: Vec2): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (Vec2.dot(v, v) > 0.0) {\n this.setAwake(true);\n }\n this.m_linearVelocity.setVec2(v);\n }\n\n /**\n * Get the angular velocity.\n *\n * @returns the angular velocity in radians/second.\n */\n getAngularVelocity(): number {\n return this.m_angularVelocity;\n }\n\n /**\n * Set the angular velocity.\n *\n * @param omega The new angular velocity in radians/second.\n */\n setAngularVelocity(w: number): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (w * w > 0.0) {\n this.setAwake(true);\n }\n this.m_angularVelocity = w;\n }\n\n getLinearDamping(): number {\n return this.m_linearDamping;\n }\n\n setLinearDamping(linearDamping: number): void {\n this.m_linearDamping = linearDamping;\n }\n\n getAngularDamping(): number {\n return this.m_angularDamping;\n }\n\n setAngularDamping(angularDamping: number): void {\n this.m_angularDamping = angularDamping;\n }\n\n getGravityScale(): number {\n return this.m_gravityScale;\n }\n\n /**\n * Scale the gravity applied to this body.\n */\n setGravityScale(scale: number): void {\n this.m_gravityScale = scale;\n }\n\n /**\n * Get the total mass of the body.\n *\n * @returns The mass, usually in kilograms (kg).\n */\n getMass(): number {\n return this.m_mass;\n }\n\n /**\n * Get the rotational inertia of the body about the local origin.\n *\n * @return the rotational inertia, usually in kg-m^2.\n */\n getInertia(): number {\n return this.m_I + this.m_mass\n * Vec2.dot(this.m_sweep.localCenter, this.m_sweep.localCenter);\n }\n\n /**\n * Copy the mass data of the body to data.\n */\n getMassData(data: MassData): void {\n data.mass = this.m_mass;\n data.I = this.getInertia();\n data.center.setVec2(this.m_sweep.localCenter);\n }\n\n /**\n * This resets the mass properties to the sum of the mass properties of the\n * fixtures. This normally does not need to be called unless you called\n * SetMassData to override the mass and you later want to reset the mass.\n */\n resetMassData(): void {\n // Compute mass data from shapes. Each shape has its own density.\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n this.m_sweep.localCenter.setZero();\n\n // Static and kinematic bodies have zero mass.\n if (this.isStatic() || this.isKinematic()) {\n this.m_sweep.c0.setVec2(this.m_xf.p);\n this.m_sweep.c.setVec2(this.m_xf.p);\n this.m_sweep.a0 = this.m_sweep.a;\n return;\n }\n\n _ASSERT && common.assert(this.isDynamic());\n\n // Accumulate mass over all fixtures.\n const localCenter = Vec2.zero();\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n if (f.m_density == 0.0) {\n continue;\n }\n\n const massData = new MassData();\n f.getMassData(massData);\n this.m_mass += massData.mass;\n localCenter.addMul(massData.mass, massData.center);\n this.m_I += massData.I;\n }\n\n // Compute center of mass.\n if (this.m_mass > 0.0) {\n this.m_invMass = 1.0 / this.m_mass;\n localCenter.mul(this.m_invMass);\n\n } else {\n // Force all dynamic bodies to have a positive mass.\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n }\n\n if (this.m_I > 0.0 && this.m_fixedRotationFlag == false) {\n // Center the inertia about the center of mass.\n this.m_I -= this.m_mass * Vec2.dot(localCenter, localCenter);\n _ASSERT && common.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n\n } else {\n this.m_I = 0.0;\n this.m_invI = 0.0;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(localCenter, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Set the mass properties to override the mass properties of the fixtures. Note\n * that this changes the center of mass position. Note that creating or\n * destroying fixtures can also alter the mass. This function has no effect if\n * the body isn't dynamic.\n *\n * @param massData The mass properties.\n */\n setMassData(massData: MassData): void {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n this.m_mass = massData.mass;\n if (this.m_mass <= 0.0) {\n this.m_mass = 1.0;\n }\n\n this.m_invMass = 1.0 / this.m_mass;\n\n if (massData.I > 0.0 && this.m_fixedRotationFlag == false) {\n this.m_I = massData.I - this.m_mass\n * Vec2.dot(massData.center, massData.center);\n _ASSERT && common.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(massData.center, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Apply a force at a world point. If the force is not applied at the center of\n * mass, it will generate a torque and affect the angular velocity. This wakes\n * up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyForce(force: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping.\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n this.m_torque += Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), force);\n }\n }\n\n /**\n * Apply a force to the center of mass. This wakes up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param wake Also wake up the body\n */\n applyForceToCenter(force: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n }\n }\n\n /**\n * Apply a torque. This affects the angular velocity without affecting the\n * linear velocity of the center of mass. This wakes up the body.\n *\n * @param torque About the z-axis (out of the screen), usually in N-m.\n * @param wake Also wake up the body\n */\n applyTorque(torque: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_torque += torque;\n }\n }\n\n /**\n * Apply an impulse at a point. This immediately modifies the velocity. It also\n * modifies the angular velocity if the point of application is not at the\n * center of mass. This wakes up the body.\n *\n * @param impulse The world impulse vector, usually in N-seconds or kg-m/s.\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyLinearImpulse(impulse: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_linearVelocity.addMul(this.m_invMass, impulse);\n this.m_angularVelocity += this.m_invI * Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), impulse);\n }\n }\n\n /**\n * Apply an angular impulse.\n *\n * @param impulse The angular impulse in units of kg*m*m/s\n * @param wake Also wake up the body\n */\n applyAngularImpulse(impulse: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_angularVelocity += this.m_invI * impulse;\n }\n }\n\n /**\n * This is used to prevent connected bodies (by joints) from colliding,\n * depending on the joint's collideConnected flag.\n */\n shouldCollide(that: Body): boolean {\n // At least one body should be dynamic.\n if (this.m_type != DYNAMIC && that.m_type != DYNAMIC) {\n return false;\n }\n // Does a joint prevent collision?\n for (let jn = this.m_jointList; jn; jn = jn.next) {\n if (jn.other == that) {\n if (jn.joint.m_collideConnected == false) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addFixture(fixture: Fixture): Fixture {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.createProxies(broadPhase, this.m_xf);\n }\n\n fixture.m_next = this.m_fixtureList;\n this.m_fixtureList = fixture;\n\n // Adjust mass properties if needed.\n if (fixture.m_density > 0.0) {\n this.resetMassData();\n }\n\n // Let the world know we have a new fixture. This will cause new contacts\n // to be created at the beginning of the next time step.\n this.m_world.m_newFixture = true;\n\n return fixture;\n }\n\n /**\n * Creates a fixture and attach it to this body.\n *\n * If the density is non-zero, this function automatically updates the mass of\n * the body.\n *\n * Contacts are not created until the next time step.\n *\n * Warning: This function is locked during callbacks.\n */\n createFixture(def: FixtureDef): Fixture;\n createFixture(shape: Shape, opt?: FixtureOpt): Fixture;\n createFixture(shape: Shape, density?: number): Fixture;\n // tslint:disable-next-line:typedef\n createFixture(shape, fixdef?) {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n const fixture = new Fixture(this, shape, fixdef);\n this._addFixture(fixture);\n return fixture;\n }\n\n /**\n * Destroy a fixture. This removes the fixture from the broad-phase and destroys\n * all contacts associated with this fixture. This will automatically adjust the\n * mass of the body if the body is dynamic and the fixture has positive density.\n * All fixtures attached to a body are implicitly destroyed when the body is\n * destroyed.\n *\n * Warning: This function is locked during callbacks.\n *\n * @param fixture The fixture to be removed.\n */\n destroyFixture(fixture: Fixture): void {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n _ASSERT && common.assert(fixture.m_body == this);\n\n // Remove the fixture from this body's singly linked list.\n let found = false;\n if (this.m_fixtureList === fixture) {\n this.m_fixtureList = fixture.m_next;\n found = true;\n\n } else {\n let node = this.m_fixtureList;\n while (node != null) {\n if (node.m_next === fixture) {\n node.m_next = fixture.m_next;\n found = true;\n break;\n }\n node = node.m_next;\n }\n }\n\n // You tried to remove a shape that is not attached to this body.\n _ASSERT && common.assert(found);\n\n // Destroy any contacts associated with the fixture.\n let edge = this.m_contactList;\n while (edge) {\n const c = edge.contact;\n edge = edge.next;\n\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n\n if (fixture == fixtureA || fixture == fixtureB) {\n // This destroys the contact and removes it from\n // this body's contact list.\n this.m_world.destroyContact(c);\n }\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.destroyProxies(broadPhase);\n }\n\n fixture.m_body = null;\n fixture.m_next = null;\n\n this.m_world.publish('remove-fixture', fixture);\n\n // Reset the mass data.\n this.resetMassData();\n }\n\n /**\n * Get the corresponding world point of a local point.\n */\n getWorldPoint(localPoint: Vec2): Vec2 {\n return Transform.mulVec2(this.m_xf, localPoint);\n }\n\n /**\n * Get the corresponding world vector of a local vector.\n */\n getWorldVector(localVector: Vec2): Vec2 {\n return Rot.mulVec2(this.m_xf.q, localVector);\n }\n\n /**\n * Gets the corresponding local point of a world point.\n */\n getLocalPoint(worldPoint: Vec2): Vec2 {\n return Transform.mulTVec2(this.m_xf, worldPoint);\n }\n\n /**\n * Gets the corresponding local vector of a world vector.\n */\n getLocalVector(worldVector: Vec2): Vec2 {\n return Rot.mulTVec2(this.m_xf.q, worldVector);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from './Vec2';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 2-by-2 matrix. Stored in column-major order.\n */\nexport default class Mat22 {\n ex: Vec2;\n ey: Vec2;\n\n constructor(a: number, b: number, c: number, d: number);\n constructor(a: { x: number; y: number }, b: { x: number; y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(a?, b?, c?, d?) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec2.clone(a);\n this.ey = Vec2.clone(b);\n } else if (typeof a === 'number') {\n this.ex = Vec2.neo(a, c);\n this.ey = Vec2.neo(b, d);\n } else {\n this.ex = Vec2.zero();\n this.ey = Vec2.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.ex) && Vec2.isValid(obj.ey);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Mat22.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Mat22!');\n }\n }\n\n set(a: Mat22): void;\n set(a: Vec2, b: Vec2): void;\n set(a: number, b: number, c: number, d: number): void;\n // tslint:disable-next-line:typedef\n set(a, b?, c?, d?): void {\n if (typeof a === 'number' && typeof b === 'number' && typeof c === 'number'\n && typeof d === 'number') {\n this.ex.setNum(a, c);\n this.ey.setNum(b, d);\n\n } else if (typeof a === 'object' && typeof b === 'object') {\n this.ex.setVec2(a);\n this.ey.setVec2(b);\n\n } else if (typeof a === 'object') {\n _ASSERT && Mat22.assert(a);\n this.ex.setVec2(a.ex);\n this.ey.setVec2(a.ey);\n\n } else {\n _ASSERT && common.assert(false);\n }\n }\n\n setIdentity(): void {\n this.ex.x = 1.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 1.0;\n }\n\n setZero(): void {\n this.ex.x = 0.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 0.0;\n }\n\n getInverse(): Mat22 {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const imx = new Mat22();\n imx.ex.x = det * d;\n imx.ey.x = -det * b;\n imx.ex.y = -det * c;\n imx.ey.y = det * a;\n return imx;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const w = Vec2.zero();\n w.x = det * (d * v.x - b * v.y);\n w.y = det * (a * v.y - c * v.x);\n return w;\n }\n\n /**\n * Multiply a matrix times a vector. If a rotation matrix is provided, then this\n * transforms the vector from one frame to another.\n */\n static mul(mx: Mat22, my: Mat22): Mat22;\n static mul(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(mx, v) {\n if (v && 'x' in v && 'y' in v) {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n _ASSERT && common.assert(false);\n }\n\n static mulVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n }\n\n static mulMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n /**\n * Multiply a matrix transpose times a vector. If a rotation matrix is provided,\n * then this transforms the vector from one frame to another (inverse\n * transform).\n */\n static mulT(mx: Mat22, my: Mat22): Mat22;\n static mulT(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(mx, v) {\n if (v && 'x' in v && 'y' in v) { // Vec2\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n _ASSERT && common.assert(false);\n }\n\n static mulTVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n }\n\n static mulTMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n static abs(mx: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n return new Mat22(Vec2.abs(mx.ex), Vec2.abs(mx.ey));\n }\n\n static add(mx1: Mat22, mx2: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx1);\n _ASSERT && Mat22.assert(mx2);\n return new Mat22(Vec2.add(mx1.ex, mx2.ex), Vec2.add(mx1.ey, mx2.ey));\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Vec2 from '../common/Vec2';\nimport Transform from '../common/Transform';\nimport Math from '../common/Math';\nimport Rot from '../common/Rot';\n\nexport enum ManifoldType {\n e_circles = 0,\n e_faceA = 1,\n e_faceB = 2\n}\n\nexport enum ContactFeatureType {\n e_vertex = 0,\n e_face = 1\n}\n\n/**\n * This is used for determining the state of contact points.\n */\n export enum PointState {\n /** Point does not exist */\n nullState = 0,\n /** Point was added in the update */\n addState = 1,\n /** Point persisted across the update */\n persistState = 2,\n /** Point was removed in the update */\n removeState = 3\n}\n\n/**\n * Used for computing contact manifolds.\n */\n export class ClipVertex {\n v: Vec2 = Vec2.zero();\n id: ContactID = new ContactID();\n\n set(o: ClipVertex): void {\n this.v.setVec2(o.v);\n this.id.set(o.id);\n }\n}\n\n/**\n * A manifold for two touching convex shapes. Manifolds are created in `evaluate`\n * method of Contact subclasses.\n *\n * Supported manifold types are e_faceA or e_faceB for clip point versus plane\n * with radius and e_circles point versus point with radius.\n *\n * We store contacts in this way so that position correction can account for\n * movement, which is critical for continuous physics. All contact scenarios\n * must be expressed in one of these types. This structure is stored across time\n * steps, so we keep it small.\n *\n * @prop type e_circle, e_faceA, e_faceB\n * @prop localPoint Usage depends on manifold type:
\n * e_circles: the local center of circleA
\n * e_faceA: the center of faceA
\n * e_faceB: the center of faceB\n * @prop localNormal Usage depends on manifold type:
\n * e_circles: not used
\n * e_faceA: the normal on polygonA
\n * e_faceB: the normal on polygonB\n * @prop points The points of contact {ManifoldPoint[]}\n * @prop pointCount The number of manifold points\n */\nexport default class Manifold {\n type: ManifoldType;\n localNormal: Vec2 = Vec2.zero();\n localPoint: Vec2 = Vec2.zero();\n points: ManifoldPoint[] = [ new ManifoldPoint(), new ManifoldPoint() ];\n pointCount: number = 0;\n\n /**\n * Evaluate the manifold with supplied transforms. This assumes modest motion\n * from the original state. This does not change the point count, impulses, etc.\n * The radii must come from the shapes that generated the manifold.\n */\n getWorldManifold(wm: WorldManifold | undefined, xfA: Transform, radiusA: number, xfB: Transform, radiusB: number): WorldManifold {\n if (this.pointCount == 0) {\n return;\n }\n\n wm = wm || new WorldManifold();\n\n let normal = wm.normal;\n const points = wm.points;\n const separations = wm.separations;\n\n // TODO: improve\n switch (this.type) {\n case ManifoldType.e_circles: {\n normal = Vec2.neo(1.0, 0.0);\n const pointA = Transform.mulVec2(xfA, this.localPoint);\n const pointB = Transform.mulVec2(xfB, this.points[0].localPoint);\n const dist = Vec2.sub(pointB, pointA);\n if (Vec2.lengthSquared(dist) > Math.EPSILON * Math.EPSILON) {\n normal.setVec2(dist);\n normal.normalize();\n }\n const cA = pointA.clone().addMul(radiusA, normal);\n const cB = pointB.clone().addMul(-radiusB, normal);\n points[0] = Vec2.mid(cA, cB);\n separations[0] = Vec2.dot(Vec2.sub(cB, cA), normal);\n points.length = 1;\n separations.length = 1;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfA, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfB, this.points[i].localPoint);\n const cA = Vec2.clone(clipPoint).addMul(radiusA - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cB = Vec2.clone(clipPoint).subMul(radiusB, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cB, cA), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfB, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfA, this.points[i].localPoint);\n const cB = Vec2.combine(1, clipPoint, radiusB - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cA = Vec2.combine(1, clipPoint, -radiusA, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cA, cB), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n // Ensure normal points from A to B.\n normal.mul(-1);\n break;\n }\n }\n\n wm.normal = normal;\n wm.points = points;\n wm.separations = separations;\n return wm;\n }\n\n static clipSegmentToLine = clipSegmentToLine;\n static ClipVertex = ClipVertex;\n static getPointStates = getPointStates;\n static PointState = PointState;\n}\n\n/**\n * A manifold point is a contact point belonging to a contact manifold. It holds\n * details related to the geometry and dynamics of the contact points.\n *\n * This structure is stored across time steps, so we keep it small.\n *\n * Note: impulses are used for internal caching and may not provide reliable\n * contact forces, especially for high speed collisions.\n */\nexport class ManifoldPoint {\n /**\n * Usage depends on manifold type.\n * e_circles: the local center of circleB,\n * e_faceA: the local center of cirlceB or the clip point of polygonB,\n * e_faceB: the clip point of polygonA.\n */\n localPoint: Vec2 = Vec2.zero();\n /**\n * The non-penetration impulse\n */\n normalImpulse: number = 0;\n /**\n * The friction impulse\n */\n tangentImpulse: number = 0;\n /**\n * Uniquely identifies a contact point between two shapes to facilatate warm starting\n */\n id: ContactID = new ContactID();\n}\n\n/**\n * Contact ids to facilitate warm starting.\n */\nexport class ContactID {\n cf: ContactFeature = new ContactFeature();\n\n /**\n * Used to quickly compare contact ids.\n */\n get key(): number {\n return this.cf.indexA + this.cf.indexB * 4 + this.cf.typeA * 16 + this.cf.typeB * 64;\n }\n\n set(o: ContactID): void {\n // this.key = o.key;\n this.cf.set(o.cf);\n }\n}\n\n/**\n * The features that intersect to form the contact point.\n */\nexport class ContactFeature {\n /**\n * Feature index on shapeA\n */\n indexA: number;\n /**\n * Feature index on shapeB\n */\n indexB: number;\n /**\n * The feature type on shapeA\n */\n typeA: ContactFeatureType;\n /**\n * The feature type on shapeB\n */\n typeB: ContactFeatureType;\n set(o: ContactFeature): void {\n this.indexA = o.indexA;\n this.indexB = o.indexB;\n this.typeA = o.typeA;\n this.typeB = o.typeB;\n }\n}\n\n/**\n * This is used to compute the current state of a contact manifold.\n */\nexport class WorldManifold {\n /**\n * World vector pointing from A to B\n */\n normal: Vec2;\n /**\n * World contact point (point of intersection)\n */\n points: Vec2[] = []; // [maxManifoldPoints]\n /**\n * A negative value indicates overlap, in meters\n */\n separations: number[] = []; // [maxManifoldPoints]\n}\n\n/**\n * Compute the point states given two manifolds. The states pertain to the\n * transition from manifold1 to manifold2. So state1 is either persist or remove\n * while state2 is either add or persist.\n */\nexport function getPointStates(\n state1: PointState[],\n state2: PointState[],\n manifold1: Manifold,\n manifold2: Manifold\n): void {\n // state1, state2: PointState[Settings.maxManifoldPoints]\n\n // for (var i = 0; i < Settings.maxManifoldPoints; ++i) {\n // state1[i] = PointState.nullState;\n // state2[i] = PointState.nullState;\n // }\n\n // Detect persists and removes.\n for (let i = 0; i < manifold1.pointCount; ++i) {\n const id = manifold1.points[i].id;\n\n state1[i] = PointState.removeState;\n\n for (let j = 0; j < manifold2.pointCount; ++j) {\n if (manifold2.points[j].id.key == id.key) {\n state1[i] = PointState.persistState;\n break;\n }\n }\n }\n\n // Detect persists and adds.\n for (let i = 0; i < manifold2.pointCount; ++i) {\n const id = manifold2.points[i].id;\n\n state2[i] = PointState.addState;\n\n for (let j = 0; j < manifold1.pointCount; ++j) {\n if (manifold1.points[j].id.key == id.key) {\n state2[i] = PointState.persistState;\n break;\n }\n }\n }\n}\n\n/**\n * Clipping for contact manifolds. Sutherland-Hodgman clipping.\n */\nexport function clipSegmentToLine(\n vOut: ClipVertex[],\n vIn: ClipVertex[],\n normal: Vec2,\n offset: number,\n vertexIndexA: number\n): number {\n // Start with no output points\n let numOut = 0;\n\n // Calculate the distance of end points to the line\n const distance0 = Vec2.dot(normal, vIn[0].v) - offset;\n const distance1 = Vec2.dot(normal, vIn[1].v) - offset;\n\n // If the points are behind the plane\n if (distance0 <= 0.0)\n vOut[numOut++].set(vIn[0]);\n if (distance1 <= 0.0)\n vOut[numOut++].set(vIn[1]);\n\n // If the points are on different sides of the plane\n if (distance0 * distance1 < 0.0) {\n // Find intersection point of edge and plane\n const interp = distance0 / (distance0 - distance1);\n vOut[numOut].v.setCombine(1 - interp, vIn[0].v, interp, vIn[1].v);\n\n // VertexA is hitting edgeB.\n vOut[numOut].id.cf.indexA = vertexIndexA;\n vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB;\n vOut[numOut].id.cf.typeA = ContactFeatureType.e_vertex;\n vOut[numOut].id.cf.typeB = ContactFeatureType.e_face;\n ++numOut;\n }\n\n return numOut;\n}\n","export default {\n gjkCalls: 0,\n gjkIters: 0,\n gjkMaxIters: 0,\n\n toiTime: 0,\n toiMaxTime: 0,\n toiCalls: 0,\n toiIters: 0,\n toiMaxIters: 0,\n toiRootIters: 0,\n toiMaxRootIters: 0,\n\n toString(newline?: string): string {\n newline = typeof newline === 'string' ? newline : '\\n';\n let string = \"\";\n // tslint:disable-next-line:no-for-in\n for (const name in this) {\n if (typeof this[name] !== 'function' && typeof this[name] !== 'object') {\n string += name + ': ' + this[name] + newline;\n }\n }\n return string;\n }\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../Settings';\nimport stats from '../util/stats';\nimport common from '../util/common';\n\nimport Shape from './Shape';\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\nimport Rot from '../common/Rot';\nimport Transform from '../common/Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates.\n */\n\nstats.gjkCalls = 0;\nstats.gjkIters = 0;\nstats.gjkMaxIters = 0;\n\n/**\n * Input for Distance. You have to option to use the shape radii in the\n * computation. Even\n */\nexport class DistanceInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n transformA: Transform | null = null;\n transformB: Transform | null = null;\n useRadii: boolean = false;\n}\n\n/**\n * Output for Distance.\n *\n * @prop {Vec2} pointA closest point on shapeA\n * @prop {Vec2} pointB closest point on shapeB\n * @prop distance\n * @prop iterations number of GJK iterations used\n */\nexport class DistanceOutput {\n pointA: Vec2 = Vec2.zero();\n pointB: Vec2 = Vec2.zero();\n distance: number;\n iterations: number;\n}\n\n/**\n * Used to warm start Distance. Set count to zero on first call.\n *\n * @prop {number} metric length or area\n * @prop {array} indexA vertices on shape A\n * @prop {array} indexB vertices on shape B\n * @prop {number} count\n */\nexport class SimplexCache {\n metric: number = 0;\n indexA: number[] = [];\n indexB: number[] = [];\n count: number = 0;\n}\n\n/**\n * Compute the closest points between two shapes. Supports any combination of:\n * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On\n * the first call set SimplexCache.count to zero.\n */\nexport default function Distance(output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void {\n ++stats.gjkCalls;\n\n const proxyA = input.proxyA;\n const proxyB = input.proxyB;\n const xfA = input.transformA;\n const xfB = input.transformB;\n\n // Initialize the simplex.\n const simplex = new Simplex();\n simplex.readCache(cache, proxyA, xfA, proxyB, xfB);\n\n // Get simplex vertices as an array.\n const vertices = simplex.m_v;\n const k_maxIters = Settings.maxDistnceIterations;\n\n // These store the vertices of the last simplex so that we\n // can check for duplicates and prevent cycling.\n const saveA = [];\n const saveB = []; // int[3]\n let saveCount = 0;\n\n let distanceSqr1 = Infinity;\n let distanceSqr2 = Infinity;\n\n // Main iteration loop.\n let iter = 0;\n while (iter < k_maxIters) {\n // Copy simplex so we can identify duplicates.\n saveCount = simplex.m_count;\n for (let i = 0; i < saveCount; ++i) {\n saveA[i] = vertices[i].indexA;\n saveB[i] = vertices[i].indexB;\n }\n\n simplex.solve();\n\n // If we have 3 points, then the origin is in the corresponding triangle.\n if (simplex.m_count === 3) {\n break;\n }\n\n // Compute closest point.\n const p = simplex.getClosestPoint();\n distanceSqr2 = p.lengthSquared();\n\n // Ensure progress\n if (distanceSqr2 >= distanceSqr1) {\n // break;\n }\n distanceSqr1 = distanceSqr2;\n\n // Get search direction.\n const d = simplex.getSearchDirection();\n\n // Ensure the search direction is numerically fit.\n if (d.lengthSquared() < Math.EPSILON * Math.EPSILON) {\n // The origin is probably contained by a line segment\n // or triangle. Thus the shapes are overlapped.\n\n // We can't return zero here even though there may be overlap.\n // In case the simplex is a point, segment, or triangle it is difficult\n // to determine if the origin is contained in the CSO or very close to it.\n break;\n }\n\n // Compute a tentative new simplex vertex using support points.\n const vertex = vertices[simplex.m_count]; // SimplexVertex\n\n vertex.indexA = proxyA.getSupport(Rot.mulTVec2(xfA.q, Vec2.neg(d)));\n vertex.wA = Transform.mulVec2(xfA, proxyA.getVertex(vertex.indexA));\n\n vertex.indexB = proxyB.getSupport(Rot.mulTVec2(xfB.q, d));\n vertex.wB = Transform.mulVec2(xfB, proxyB.getVertex(vertex.indexB));\n\n vertex.w = Vec2.sub(vertex.wB, vertex.wA);\n\n // Iteration count is equated to the number of support point calls.\n ++iter;\n ++stats.gjkIters;\n\n // Check for duplicate support points. This is the main termination\n // criteria.\n let duplicate = false;\n for (let i = 0; i < saveCount; ++i) {\n if (vertex.indexA === saveA[i] && vertex.indexB === saveB[i]) {\n duplicate = true;\n break;\n }\n }\n\n // If we found a duplicate support point we must exit to avoid cycling.\n if (duplicate) {\n break;\n }\n\n // New vertex is ok and needed.\n ++simplex.m_count;\n }\n\n stats.gjkMaxIters = Math.max(stats.gjkMaxIters, iter);\n\n // Prepare output.\n simplex.getWitnessPoints(output.pointA, output.pointB);\n output.distance = Vec2.distance(output.pointA, output.pointB);\n output.iterations = iter;\n\n // Cache the simplex.\n simplex.writeCache(cache);\n\n // Apply radii if requested.\n if (input.useRadii) {\n const rA = proxyA.m_radius;\n const rB = proxyB.m_radius;\n\n if (output.distance > rA + rB && output.distance > Math.EPSILON) {\n // Shapes are still no overlapped.\n // Move the witness points to the outer surface.\n output.distance -= rA + rB;\n const normal = Vec2.sub(output.pointB, output.pointA);\n normal.normalize();\n output.pointA.addMul(rA, normal);\n output.pointB.subMul(rB, normal);\n } else {\n // Shapes are overlapped when radii are considered.\n // Move the witness points to the middle.\n const p = Vec2.mid(output.pointA, output.pointB);\n output.pointA.setVec2(p);\n output.pointB.setVec2(p);\n output.distance = 0.0;\n }\n }\n}\n\n/**\n * A distance proxy is used by the GJK algorithm. It encapsulates any shape.\n */\nexport class DistanceProxy {\n /** internal */ m_buffer: Vec2[];\n /** internal */ m_vertices: Vec2[];\n /** internal */ m_count: number;\n /** internal */ m_radius: number;\n\n\n constructor() {\n this.m_buffer = []; // Vec2[2]\n this.m_vertices = []; // Vec2[]\n this.m_count = 0;\n this.m_radius = 0;\n }\n\n /**\n * Get the vertex count.\n */\n getVertexCount(): number {\n return this.m_count;\n }\n\n /**\n * Get a vertex by index. Used by Distance.\n */\n getVertex(index: number): Vec2 {\n _ASSERT && common.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * Get the supporting vertex index in the given direction.\n */\n getSupport(d: Vec2): number {\n let bestIndex = 0;\n let bestValue = Vec2.dot(this.m_vertices[0], d);\n for (let i = 0; i < this.m_count; ++i) {\n const value = Vec2.dot(this.m_vertices[i], d);\n if (value > bestValue) {\n bestIndex = i;\n bestValue = value;\n }\n }\n return bestIndex;\n }\n\n /**\n * Get the supporting vertex in the given direction.\n */\n getSupportVertex(d: Vec2): Vec2 {\n return this.m_vertices[this.getSupport(d)];\n }\n\n /**\n * Initialize the proxy using the given shape. The shape must remain in scope\n * while the proxy is in use.\n */\n set(shape: Shape, index: number): void {\n // TODO remove, use shape instead\n _ASSERT && common.assert(typeof shape.computeDistanceProxy === 'function');\n shape.computeDistanceProxy(this, index);\n }\n}\n\nclass SimplexVertex {\n /** support point in proxyA */\n wA: Vec2 = Vec2.zero();\n /** wA index */\n indexA: number;\n\n /** support point in proxyB */\n wB: Vec2 = Vec2.zero();\n /** wB index */\n indexB: number;\n\n /** wB - wA; */\n w: Vec2 = Vec2.zero();\n /** barycentric coordinate for closest point */\n a: number;\n\n set(v: SimplexVertex): void {\n this.indexA = v.indexA;\n this.indexB = v.indexB;\n this.wA = Vec2.clone(v.wA);\n this.wB = Vec2.clone(v.wB);\n this.w = Vec2.clone(v.w);\n this.a = v.a;\n }\n}\n\nclass Simplex {\n m_v1: SimplexVertex;\n m_v2: SimplexVertex;\n m_v3: SimplexVertex;\n m_v: SimplexVertex[];\n m_count: number;\n\n constructor() {\n this.m_v1 = new SimplexVertex();\n this.m_v2 = new SimplexVertex();\n this.m_v3 = new SimplexVertex();\n this.m_v = [ this.m_v1, this.m_v2, this.m_v3 ];\n this.m_count;\n }\n\n /** @internal */\n toString(): string {\n if (this.m_count === 3) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y,\n this.m_v3.a, this.m_v3.wA.x, this.m_v3.wA.y, this.m_v3.wB.x, this.m_v3.wB.y\n ].toString();\n\n } else if (this.m_count === 2) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y\n ].toString();\n\n } else if (this.m_count === 1) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y\n ].toString();\n\n } else {\n return \"+\" + this.m_count;\n }\n }\n\n readCache(cache: SimplexCache, proxyA: DistanceProxy, transformA: Transform, proxyB: DistanceProxy, transformB: Transform): void {\n _ASSERT && common.assert(cache.count <= 3);\n\n // Copy data from cache.\n this.m_count = cache.count;\n for (let i = 0; i < this.m_count; ++i) {\n const v = this.m_v[i];\n v.indexA = cache.indexA[i];\n v.indexB = cache.indexB[i];\n const wALocal = proxyA.getVertex(v.indexA);\n const wBLocal = proxyB.getVertex(v.indexB);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 0.0;\n }\n\n // Compute the new simplex metric, if it is substantially different than\n // old metric then flush the simplex.\n if (this.m_count > 1) {\n const metric1 = cache.metric;\n const metric2 = this.getMetric();\n if (metric2 < 0.5 * metric1 || 2.0 * metric1 < metric2\n || metric2 < Math.EPSILON) {\n // Reset the simplex.\n this.m_count = 0;\n }\n }\n\n // If the cache is empty or invalid...\n if (this.m_count === 0) {\n const v = this.m_v[0];\n v.indexA = 0;\n v.indexB = 0;\n const wALocal = proxyA.getVertex(0);\n const wBLocal = proxyB.getVertex(0);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 1.0;\n this.m_count = 1;\n }\n }\n\n writeCache(cache: SimplexCache): void {\n cache.metric = this.getMetric();\n cache.count = this.m_count;\n for (let i = 0; i < this.m_count; ++i) {\n cache.indexA[i] = this.m_v[i].indexA;\n cache.indexB[i] = this.m_v[i].indexB;\n }\n }\n\n getSearchDirection(): Vec2 {\n switch (this.m_count) {\n case 1:\n return Vec2.neg(this.m_v1.w);\n\n case 2: {\n const e12 = Vec2.sub(this.m_v2.w, this.m_v1.w);\n const sgn = Vec2.crossVec2Vec2(e12, Vec2.neg(this.m_v1.w));\n if (sgn > 0.0) {\n // Origin is left of e12.\n return Vec2.crossNumVec2(1.0, e12);\n } else {\n // Origin is right of e12.\n return Vec2.crossVec2Num(e12, 1.0);\n }\n }\n\n default:\n _ASSERT && common.assert(false);\n return Vec2.zero();\n }\n }\n\n getClosestPoint(): Vec2 {\n switch (this.m_count) {\n case 0:\n _ASSERT && common.assert(false);\n return Vec2.zero();\n\n case 1:\n return Vec2.clone(this.m_v1.w);\n\n case 2:\n return Vec2.combine(this.m_v1.a, this.m_v1.w, this.m_v2.a, this.m_v2.w);\n\n case 3:\n return Vec2.zero();\n\n default:\n _ASSERT && common.assert(false);\n return Vec2.zero();\n }\n }\n\n getWitnessPoints(pA: Vec2, pB: Vec2): void {\n switch (this.m_count) {\n case 0:\n _ASSERT && common.assert(false);\n break;\n\n case 1:\n pA.setVec2(this.m_v1.wA);\n pB.setVec2(this.m_v1.wB);\n break;\n\n case 2:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pB.setCombine(this.m_v1.a, this.m_v1.wB, this.m_v2.a, this.m_v2.wB);\n break;\n\n case 3:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pA.addMul(this.m_v3.a, this.m_v3.wA);\n pB.setVec2(pA);\n break;\n\n default:\n _ASSERT && common.assert(false);\n break;\n }\n }\n\n getMetric(): number {\n switch (this.m_count) {\n case 0:\n _ASSERT && common.assert(false);\n return 0.0;\n\n case 1:\n return 0.0;\n\n case 2:\n return Vec2.distance(this.m_v1.w, this.m_v2.w);\n\n case 3:\n return Vec2.crossVec2Vec2(Vec2.sub(this.m_v2.w, this.m_v1.w), Vec2.sub(this.m_v3.w,\n this.m_v1.w));\n\n default:\n _ASSERT && common.assert(false);\n return 0.0;\n }\n }\n\n solve(): void {\n switch (this.m_count) {\n case 1:\n break;\n\n case 2:\n this.solve2();\n break;\n\n case 3:\n this.solve3();\n break;\n\n default:\n _ASSERT && common.assert(false);\n }\n }\n\n// Solve a line segment using barycentric coordinates.\n//\n// p = a1 * w1 + a2 * w2\n// a1 + a2 = 1\n//\n// The vector from the origin to the closest point on the line is\n// perpendicular to the line.\n// e12 = w2 - w1\n// dot(p, e) = 0\n// a1 * dot(w1, e) + a2 * dot(w2, e) = 0\n//\n// 2-by-2 linear system\n// [1 1 ][a1] = [1]\n// [w1.e12 w2.e12][a2] = [0]\n//\n// Define\n// d12_1 = dot(w2, e12)\n// d12_2 = -dot(w1, e12)\n// d12 = d12_1 + d12_2\n//\n// Solution\n// a1 = d12_1 / d12\n// a2 = d12_2 / d12\n solve2(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const e12 = Vec2.sub(w2, w1);\n\n // w1 region\n const d12_2 = -Vec2.dot(w1, e12);\n if (d12_2 <= 0.0) {\n // a2 <= 0, so we clamp it to 0\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // w2 region\n const d12_1 = Vec2.dot(w2, e12);\n if (d12_1 <= 0.0) {\n // a1 <= 0, so we clamp it to 0\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // Must be in e12 region.\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n }\n\n// Possible regions:\n// - points[2]\n// - edge points[0]-points[2]\n// - edge points[1]-points[2]\n// - inside the triangle\n solve3(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const w3 = this.m_v3.w;\n\n // Edge12\n // [1 1 ][a1] = [1]\n // [w1.e12 w2.e12][a2] = [0]\n // a3 = 0\n const e12 = Vec2.sub(w2, w1);\n const w1e12 = Vec2.dot(w1, e12);\n const w2e12 = Vec2.dot(w2, e12);\n const d12_1 = w2e12;\n const d12_2 = -w1e12;\n\n // Edge13\n // [1 1 ][a1] = [1]\n // [w1.e13 w3.e13][a3] = [0]\n // a2 = 0\n const e13 = Vec2.sub(w3, w1);\n const w1e13 = Vec2.dot(w1, e13);\n const w3e13 = Vec2.dot(w3, e13);\n const d13_1 = w3e13;\n const d13_2 = -w1e13;\n\n // Edge23\n // [1 1 ][a2] = [1]\n // [w2.e23 w3.e23][a3] = [0]\n // a1 = 0\n const e23 = Vec2.sub(w3, w2);\n const w2e23 = Vec2.dot(w2, e23);\n const w3e23 = Vec2.dot(w3, e23);\n const d23_1 = w3e23;\n const d23_2 = -w2e23;\n\n // Triangle123\n const n123 = Vec2.crossVec2Vec2(e12, e13);\n\n const d123_1 = n123 * Vec2.crossVec2Vec2(w2, w3);\n const d123_2 = n123 * Vec2.crossVec2Vec2(w3, w1);\n const d123_3 = n123 * Vec2.crossVec2Vec2(w1, w2);\n\n // w1 region\n if (d12_2 <= 0.0 && d13_2 <= 0.0) {\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // e12\n if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) {\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n return;\n }\n\n // e13\n if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) {\n const inv_d13 = 1.0 / (d13_1 + d13_2);\n this.m_v1.a = d13_1 * inv_d13;\n this.m_v3.a = d13_2 * inv_d13;\n this.m_count = 2;\n this.m_v2.set(this.m_v3);\n return;\n }\n\n // w2 region\n if (d12_1 <= 0.0 && d23_2 <= 0.0) {\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // w3 region\n if (d13_1 <= 0.0 && d23_1 <= 0.0) {\n this.m_v3.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // e23\n if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) {\n const inv_d23 = 1.0 / (d23_1 + d23_2);\n this.m_v2.a = d23_1 * inv_d23;\n this.m_v3.a = d23_2 * inv_d23;\n this.m_count = 2;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // Must be in triangle123\n const inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3);\n this.m_v1.a = d123_1 * inv_d123;\n this.m_v2.a = d123_2 * inv_d123;\n this.m_v3.a = d123_3 * inv_d123;\n this.m_count = 3;\n }\n}\n\n\n/**\n * Determine if two generic shapes overlap.\n */\nexport function testOverlap(shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform): boolean {\n const input = new DistanceInput();\n input.proxyA.set(shapeA, indexA);\n input.proxyB.set(shapeB, indexB);\n input.transformA = xfA;\n input.transformB = xfB;\n input.useRadii = true;\n\n const cache = new SimplexCache();\n const output = new DistanceOutput();\n\n Distance(output, cache, input);\n\n return output.distance < 10.0 * Math.EPSILON;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { ShapeType } from \"../collision/Shape\";\nimport common from '../util/common';\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\nimport Transform from '../common/Transform';\nimport Mat22 from '../common/Mat22';\nimport Rot from '../common/Rot';\nimport Settings from '../Settings';\nimport Manifold, { ManifoldType, WorldManifold } from '../collision/Manifold';\nimport { testOverlap } from '../collision/Distance';\nimport Fixture from \"./Fixture\";\nimport Body from \"./Body\";\nimport { ContactImpulse, TimeStep } from \"./Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst DEBUG_SOLVER = false;\n\n/**\n * A contact edge is used to connect bodies and contacts together in a contact\n * graph where each body is a node and each contact is an edge. A contact edge\n * belongs to a doubly linked list maintained in each attached body. Each\n * contact has two contact nodes, one for each attached body.\n *\n * @prop {Contact} contact The contact\n * @prop {ContactEdge} prev The previous contact edge in the body's contact list\n * @prop {ContactEdge} next The next contact edge in the body's contact list\n * @prop {Body} other Provides quick access to the other body attached.\n */\nexport class ContactEdge {\n contact: Contact;\n prev: ContactEdge | undefined;\n next: ContactEdge | undefined;\n other: Body | undefined;\n constructor(contact: Contact) {\n this.contact = contact;\n }\n}\n\nexport type EvaluateFunction = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void;\n\nexport type ContactCallback = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void /* & { destroyFcn?: (contact: Contact) => void }*/;\n\n\n/**\n * Friction mixing law. The idea is to allow either fixture to drive the\n * restitution to zero. For example, anything slides on ice.\n */\nexport function mixFriction(friction1: number, friction2: number): number {\n return Math.sqrt(friction1 * friction2);\n}\n\n/**\n * Restitution mixing law. The idea is allow for anything to bounce off an\n * inelastic surface. For example, a superball bounces on anything.\n */\nexport function mixRestitution(restitution1: number, restitution2: number): number {\n return restitution1 > restitution2 ? restitution1 : restitution2;\n}\n\n// TODO: move this to Settings?\nconst s_registers = [];\n\n// TODO: merge with ManifoldPoint?\nexport class VelocityConstraintPoint {\n rA: Vec2 = Vec2.zero();\n rB: Vec2 = Vec2.zero();\n normalImpulse: number = 0;\n tangentImpulse: number = 0;\n normalMass: number = 0;\n tangentMass: number = 0;\n velocityBias: number = 0;\n}\n\n/**\n * The class manages contact between two shapes. A contact exists for each\n * overlapping AABB in the broad-phase (except if filtered). Therefore a contact\n * object may exist that has no contact points.\n */\nexport default class Contact {\n /** @internal */\n m_nodeA: ContactEdge;\n /** @internal */\n m_nodeB: ContactEdge;\n /** @internal */\n m_fixtureA: Fixture;\n /** @internal */\n m_fixtureB: Fixture;\n /** @internal */\n m_indexA: number;\n /** @internal */\n m_indexB: number;\n /** @internal */\n m_evaluateFcn: EvaluateFunction;\n /** @internal */\n m_manifold: Manifold = new Manifold();\n /** @internal */\n m_prev: Contact | null = null;\n /** @internal */\n m_next: Contact | null = null;\n /** @internal */\n m_toi: number = 1.0;\n /** @internal */\n m_toiCount: number = 0;\n /** @internal This contact has a valid TOI in m_toi */\n m_toiFlag: boolean = false;\n /** @internal */\n m_friction: number;\n /** @internal */\n m_restitution: number;\n /** @internal */\n m_tangentSpeed: number = 0.0;\n /** @internal This contact can be disabled (by user) */\n m_enabledFlag: boolean = true;\n /** @internal Used when crawling contact graph when forming islands. */\n m_islandFlag: boolean = false;\n /** @internal Set when the shapes are touching. */\n m_touchingFlag: boolean = false;\n /** @internal This contact needs filtering because a fixture filter was changed. */\n m_filterFlag: boolean = false;\n /** @internal This bullet contact had a TOI event */\n m_bulletHitFlag: boolean = false;\n\n /** @internal Contact reporting impulse object cache */\n m_impulse: ContactImpulse = new ContactImpulse(this);\n\n // VelocityConstraint\n /** @internal */ v_points: VelocityConstraintPoint[] = []; // [maxManifoldPoints];\n /** @internal */ v_normal: Vec2 = Vec2.zero();\n /** @internal */ v_normalMass: Mat22 = new Mat22();\n /** @internal */ v_K: Mat22 = new Mat22();\n /** @internal */ v_pointCount: number;\n /** @internal */ v_tangentSpeed: number | undefined;\n /** @internal */ v_friction: number | undefined;\n /** @internal */ v_restitution: number | undefined;\n /** @internal */ v_invMassA: number | undefined;\n /** @internal */ v_invMassB: number | undefined;\n /** @internal */ v_invIA: number | undefined;\n /** @internal */ v_invIB: number | undefined;\n\n // PositionConstraint\n /** @internal */ p_localPoints: Vec2[] = []; // [maxManifoldPoints];\n /** @internal */ p_localNormal: Vec2 = Vec2.zero();\n /** @internal */ p_localPoint: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterA: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterB: Vec2 = Vec2.zero();\n /** @internal */ p_type: ManifoldType | undefined;\n /** @internal */ p_radiusA: number | undefined;\n /** @internal */ p_radiusB: number | undefined;\n /** @internal */ p_pointCount: number | undefined;\n /** @internal */ p_invMassA: number | undefined;\n /** @internal */ p_invMassB: number | undefined;\n /** @internal */ p_invIA: number | undefined;\n /** @internal */ p_invIB: number | undefined;\n\n constructor(fA: Fixture, indexA: number, fB: Fixture, indexB: number, evaluateFcn: EvaluateFunction) {\n // Nodes for connecting bodies.\n this.m_nodeA = new ContactEdge(this);\n this.m_nodeB = new ContactEdge(this);\n\n this.m_fixtureA = fA;\n this.m_fixtureB = fB;\n\n this.m_indexA = indexA;\n this.m_indexB = indexB;\n\n this.m_evaluateFcn = evaluateFcn;\n\n this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction);\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution);\n }\n\n initConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const shapeA = fixtureA.getShape();\n const shapeB = fixtureB.getShape();\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const manifold = this.getManifold();\n\n const pointCount = manifold.pointCount;\n _ASSERT && common.assert(pointCount > 0);\n\n this.v_invMassA = bodyA.m_invMass;\n this.v_invMassB = bodyB.m_invMass;\n this.v_invIA = bodyA.m_invI;\n this.v_invIB = bodyB.m_invI;\n\n this.v_friction = this.m_friction;\n this.v_restitution = this.m_restitution;\n this.v_tangentSpeed = this.m_tangentSpeed;\n\n this.v_pointCount = pointCount;\n\n this.v_K.setZero();\n this.v_normalMass.setZero();\n\n this.p_invMassA = bodyA.m_invMass;\n this.p_invMassB = bodyB.m_invMass;\n this.p_invIA = bodyA.m_invI;\n this.p_invIB = bodyB.m_invI;\n this.p_localCenterA = Vec2.clone(bodyA.m_sweep.localCenter);\n this.p_localCenterB = Vec2.clone(bodyB.m_sweep.localCenter);\n\n this.p_radiusA = shapeA.m_radius;\n this.p_radiusB = shapeB.m_radius;\n\n this.p_type = manifold.type;\n this.p_localNormal = Vec2.clone(manifold.localNormal);\n this.p_localPoint = Vec2.clone(manifold.localPoint);\n this.p_pointCount = pointCount;\n\n for (let j = 0; j < pointCount; ++j) {\n const cp = manifold.points[j];\n const vcp = this.v_points[j] = new VelocityConstraintPoint();\n\n if (step.warmStarting) {\n vcp.normalImpulse = step.dtRatio * cp.normalImpulse;\n vcp.tangentImpulse = step.dtRatio * cp.tangentImpulse;\n\n } else {\n vcp.normalImpulse = 0.0;\n vcp.tangentImpulse = 0.0;\n }\n\n vcp.rA.setZero();\n vcp.rB.setZero();\n vcp.normalMass = 0.0;\n vcp.tangentMass = 0.0;\n vcp.velocityBias = 0.0;\n\n this.p_localPoints[j] = Vec2.clone(cp.localPoint);\n\n }\n }\n\n /**\n * Get the contact manifold. Do not modify the manifold unless you understand\n * the internals of the library.\n */\n getManifold(): Manifold {\n return this.m_manifold;\n }\n\n /**\n * Get the world manifold.\n */\n getWorldManifold(worldManifold: WorldManifold | null | undefined): WorldManifold | undefined {\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n\n return this.m_manifold.getWorldManifold(worldManifold, bodyA.getTransform(),\n shapeA.m_radius, bodyB.getTransform(), shapeB.m_radius);\n }\n\n /**\n * Enable/disable this contact. This can be used inside the pre-solve contact\n * listener. The contact is only disabled for the current time step (or sub-step\n * in continuous collisions).\n */\n setEnabled(flag: boolean): void {\n this.m_enabledFlag = !!flag;\n }\n\n /**\n * Has this contact been disabled?\n */\n isEnabled(): boolean {\n return this.m_enabledFlag;\n }\n\n /**\n * Is this contact touching?\n */\n isTouching(): boolean {\n return this.m_touchingFlag;\n }\n\n /**\n * Get the next contact in the world's contact list.\n */\n getNext(): Contact | null {\n return this.m_next;\n }\n\n /**\n * Get fixture A in this contact.\n */\n getFixtureA(): Fixture {\n return this.m_fixtureA;\n }\n\n /**\n * Get fixture B in this contact.\n */\n getFixtureB(): Fixture {\n return this.m_fixtureB;\n }\n\n /**\n * Get the child primitive index for fixture A.\n */\n getChildIndexA(): number {\n return this.m_indexA;\n }\n\n /**\n * Get the child primitive index for fixture B.\n */\n getChildIndexB(): number {\n return this.m_indexB;\n }\n\n /**\n * Flag this contact for filtering. Filtering will occur the next time step.\n */\n flagForFiltering(): void {\n this.m_filterFlag = true;\n }\n\n /**\n * Override the default friction mixture. You can call this in\n * ContactListener.preSolve. This value persists until set or reset.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the friction.\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Reset the friction mixture to the default value.\n */\n resetFriction(): void {\n this.m_friction = mixFriction(this.m_fixtureA.m_friction,\n this.m_fixtureB.m_friction);\n }\n\n /**\n * Override the default restitution mixture. You can call this in\n * ContactListener.preSolve. The value persists until you set or reset.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Get the restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Reset the restitution to the default value.\n */\n resetRestitution(): void {\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution,\n this.m_fixtureB.m_restitution);\n }\n\n /**\n * Set the desired tangent speed for a conveyor belt behavior. In meters per\n * second.\n */\n setTangentSpeed(speed: number): void {\n this.m_tangentSpeed = speed;\n }\n\n /**\n * Get the desired tangent speed. In meters per second.\n */\n getTangentSpeed(): number {\n return this.m_tangentSpeed;\n }\n\n /**\n * Called by Update method, and implemented by subclasses.\n */\n evaluate(manifold: Manifold, xfA: Transform, xfB: Transform): void {\n this.m_evaluateFcn(manifold, xfA, this.m_fixtureA, this.m_indexA, xfB,\n this.m_fixtureB, this.m_indexB);\n }\n\n /**\n * Updates the contact manifold and touching status.\n *\n * Note: do not assume the fixture AABBs are overlapping or are valid.\n *\n * @param listener.beginContact\n * @param listener.endContact\n * @param listener.preSolve\n */\n update(listener?: {\n beginContact(contact: Contact): void,\n endContact(contact: Contact): void,\n preSolve(contact: Contact, oldManifold: Manifold): void\n }): void {\n\n // Re-enable this contact.\n this.m_enabledFlag = true;\n\n let touching = false;\n const wasTouching = this.m_touchingFlag;\n\n const sensorA = this.m_fixtureA.isSensor();\n const sensorB = this.m_fixtureB.isSensor();\n const sensor = sensorA || sensorB;\n\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const xfA = bodyA.getTransform();\n const xfB = bodyB.getTransform();\n\n let oldManifold;\n\n // Is this contact a sensor?\n if (sensor) {\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n touching = testOverlap(shapeA, this.m_indexA, shapeB, this.m_indexB, xfA, xfB);\n\n // Sensors don't generate manifolds.\n this.m_manifold.pointCount = 0;\n } else {\n\n // TODO reuse manifold\n oldManifold = this.m_manifold;\n this.m_manifold = new Manifold();\n\n this.evaluate(this.m_manifold, xfA, xfB);\n touching = this.m_manifold.pointCount > 0;\n\n // Match old contact ids to new contact ids and copy the\n // stored impulses to warm start the solver.\n for (let i = 0; i < this.m_manifold.pointCount; ++i) {\n const nmp = this.m_manifold.points[i];\n nmp.normalImpulse = 0.0;\n nmp.tangentImpulse = 0.0;\n\n for (let j = 0; j < oldManifold.pointCount; ++j) {\n const omp = oldManifold.points[j];\n if (omp.id.key == nmp.id.key) {\n nmp.normalImpulse = omp.normalImpulse;\n nmp.tangentImpulse = omp.tangentImpulse;\n break;\n }\n }\n }\n\n if (touching != wasTouching) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n }\n\n this.m_touchingFlag = touching;\n\n if (!wasTouching && touching && listener) {\n listener.beginContact(this);\n }\n\n if (wasTouching && !touching && listener) {\n listener.endContact(this);\n }\n\n if (!sensor && touching && listener) {\n listener.preSolve(this, oldManifold);\n }\n }\n\n solvePositionConstraint(step: TimeStep): number {\n return this._solvePositionConstraint(step);\n }\n\n solvePositionConstraintTOI(step: TimeStep, toiA: Body, toiB: Body): number {\n return this._solvePositionConstraint(step, toiA, toiB);\n }\n\n private _solvePositionConstraint(step: TimeStep, toiA?: Body, toiB?: Body): number {\n const toi: boolean = !!toiA && !!toiB;\n\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n let mA = 0.0;\n let iA = 0.0;\n if (!toi || (bodyA == toiA || bodyA == toiB)) {\n mA = this.p_invMassA;\n iA = this.p_invIA;\n }\n\n let mB = 0.0;\n let iB = 0.0;\n if (!toi || (bodyB == toiA || bodyB == toiB)) {\n mB = this.p_invMassB;\n iB = this.p_invIB;\n }\n\n const cA = Vec2.clone(positionA.c);\n let aA = positionA.a;\n\n const cB = Vec2.clone(positionB.c);\n let aB = positionB.a;\n\n let minSeparation = 0.0;\n\n // Solve normal constraints\n for (let j = 0; j < this.p_pointCount; ++j) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p = Vec2.sub(cA, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p = Vec2.sub(cB, Rot.mulVec2(xfB.q, localCenterB));\n\n // PositionSolverManifold\n let normal;\n let point;\n let separation;\n switch (this.p_type) {\n case ManifoldType.e_circles: {\n const pointA = Transform.mulVec2(xfA, this.p_localPoint);\n const pointB = Transform.mulVec2(xfB, this.p_localPoints[0]);\n normal = Vec2.sub(pointB, pointA);\n normal.normalize();\n point = Vec2.combine(0.5, pointA, 0.5, pointB);\n separation = Vec2.dot(Vec2.sub(pointB, pointA), normal) - this.p_radiusA - this.p_radiusB;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfA, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfB, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfB, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfA, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n\n // Ensure normal points from A to B\n normal.mul(-1);\n break;\n }\n }\n\n const rA = Vec2.sub(point, cA);\n const rB = Vec2.sub(point, cB);\n\n // Track max constraint error.\n minSeparation = Math.min(minSeparation, separation);\n\n const baumgarte = toi ? Settings.toiBaugarte : Settings.baumgarte;\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n // Prevent large corrections and allow slop.\n const C = Math.clamp(baumgarte * (separation + linearSlop), -maxLinearCorrection, 0.0);\n\n // Compute the effective mass.\n const rnA = Vec2.crossVec2Vec2(rA, normal);\n const rnB = Vec2.crossVec2Vec2(rB, normal);\n const K = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n // Compute normal impulse\n const impulse = K > 0.0 ? -C / K : 0.0;\n\n const P = Vec2.mulNumVec2(impulse, normal);\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n\n return minSeparation;\n }\n\n initVelocityConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const radiusA = this.p_radiusA;\n const radiusB = this.p_radiusB;\n const manifold = this.getManifold();\n\n const mA = this.v_invMassA;\n const mB = this.v_invMassB;\n const iA = this.v_invIA;\n const iB = this.v_invIB;\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n const cA = Vec2.clone(positionA.c);\n const aA = positionA.a;\n const vA = Vec2.clone(velocityA.v);\n const wA = velocityA.w;\n\n const cB = Vec2.clone(positionB.c);\n const aB = positionB.a;\n const vB = Vec2.clone(velocityB.v);\n const wB = velocityB.w;\n\n _ASSERT && common.assert(manifold.pointCount > 0);\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p.setCombine(1, cA, -1, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p.setCombine(1, cB, -1, Rot.mulVec2(xfB.q, localCenterB));\n\n const worldManifold = manifold.getWorldManifold(null, xfA, radiusA, xfB, radiusB);\n\n this.v_normal.setVec2(worldManifold.normal);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n vcp.rA.setVec2(Vec2.sub(worldManifold.points[j], cA));\n vcp.rB.setVec2(Vec2.sub(worldManifold.points[j], cB));\n\n const rnA = Vec2.crossVec2Vec2(vcp.rA, this.v_normal);\n const rnB = Vec2.crossVec2Vec2(vcp.rB, this.v_normal);\n\n const kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n vcp.normalMass = kNormal > 0.0 ? 1.0 / kNormal : 0.0;\n\n const tangent = Vec2.crossVec2Num(this.v_normal, 1.0);\n\n const rtA = Vec2.crossVec2Vec2(vcp.rA, tangent);\n const rtB = Vec2.crossVec2Vec2(vcp.rB, tangent);\n\n const kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB;\n\n vcp.tangentMass = kTangent > 0.0 ? 1.0 / kTangent : 0.0;\n\n // Setup a velocity bias for restitution.\n vcp.velocityBias = 0.0;\n const vRel = Vec2.dot(this.v_normal, vB)\n + Vec2.dot(this.v_normal, Vec2.crossNumVec2(wB, vcp.rB))\n - Vec2.dot(this.v_normal, vA)\n - Vec2.dot(this.v_normal, Vec2.crossNumVec2(wA, vcp.rA));\n if (vRel < -Settings.velocityThreshold) {\n vcp.velocityBias = -this.v_restitution * vRel;\n }\n }\n\n // If we have two points, then prepare the block solver.\n if (this.v_pointCount == 2 && step.blockSolve) {\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const rn1A = Vec2.crossVec2Vec2(vcp1.rA, this.v_normal);\n const rn1B = Vec2.crossVec2Vec2(vcp1.rB, this.v_normal);\n const rn2A = Vec2.crossVec2Vec2(vcp2.rA, this.v_normal);\n const rn2B = Vec2.crossVec2Vec2(vcp2.rB, this.v_normal);\n\n const k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B;\n const k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B;\n const k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B;\n\n // Ensure a reasonable condition number.\n const k_maxConditionNumber = 1000.0;\n if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) {\n // K is safe to invert.\n this.v_K.ex.setNum(k11, k12);\n this.v_K.ey.setNum(k12, k22);\n this.v_normalMass.set(this.v_K.getInverse());\n } else {\n // The constraints are redundant, just use one.\n // TODO_ERIN use deepest?\n this.v_pointCount = 1;\n }\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n warmStartConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n const P = Vec2.combine(vcp.normalImpulse, normal, vcp.tangentImpulse, tangent);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n vA.subMul(mA, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n vB.addMul(mB, P);\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n storeConstraintImpulses(step: TimeStep): void {\n const manifold = this.m_manifold;\n for (let j = 0; j < this.v_pointCount; ++j) {\n manifold.points[j].normalImpulse = this.v_points[j].normalImpulse;\n manifold.points[j].tangentImpulse = this.v_points[j].tangentImpulse;\n }\n }\n\n solveVelocityConstraint(step: TimeStep): void {\n const bodyA = this.m_fixtureA.m_body;\n const bodyB = this.m_fixtureB.m_body;\n\n const velocityA = bodyA.c_velocity;\n const positionA = bodyA.c_position;\n\n const velocityB = bodyB.c_velocity;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n const friction = this.v_friction;\n\n _ASSERT && common.assert(this.v_pointCount == 1 || this.v_pointCount == 2);\n\n // Solve tangent constraints first because non-penetration is more important\n // than friction.\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute tangent force\n const vt = Vec2.dot(dv, tangent) - this.v_tangentSpeed;\n let lambda = vcp.tangentMass * (-vt);\n\n // Clamp the accumulated force\n const maxFriction = friction * vcp.normalImpulse;\n const newImpulse = Math.clamp(vcp.tangentImpulse + lambda, -maxFriction, maxFriction);\n lambda = newImpulse - vcp.tangentImpulse;\n vcp.tangentImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, tangent);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n\n // Solve normal constraints\n if (this.v_pointCount == 1 || step.blockSolve == false) {\n for (let i = 0; i < this.v_pointCount; ++i) {\n const vcp = this.v_points[i]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute normal impulse\n const vn = Vec2.dot(dv, normal);\n let lambda = -vcp.normalMass * (vn - vcp.velocityBias);\n\n // Clamp the accumulated impulse\n const newImpulse = Math.max(vcp.normalImpulse + lambda, 0.0);\n lambda = newImpulse - vcp.normalImpulse;\n vcp.normalImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, normal);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n } else {\n // Block solver developed in collaboration with Dirk Gregorius (back in\n // 01/07 on Box2D_Lite).\n // Build the mini LCP for this contact patch\n //\n // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i =\n // 1..2\n //\n // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n )\n // b = vn0 - velocityBias\n //\n // The system is solved using the \"Total enumeration method\" (s. Murty).\n // The complementary constraint vn_i * x_i\n // implies that we must have in any solution either vn_i = 0 or x_i = 0.\n // So for the 2D contact problem the cases\n // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and\n // vn1 = 0 need to be tested. The first valid\n // solution that satisfies the problem is chosen.\n //\n // In order to account of the accumulated impulse 'a' (because of the\n // iterative nature of the solver which only requires\n // that the accumulated impulse is clamped and not the incremental\n // impulse) we change the impulse variable (x_i).\n //\n // Substitute:\n //\n // x = a + d\n //\n // a := old total impulse\n // x := new total impulse\n // d := incremental impulse\n //\n // For the current iteration we extend the formula for the incremental\n // impulse\n // to compute the new total impulse:\n //\n // vn = A * d + b\n // = A * (x - a) + b\n // = A * x + b - A * a\n // = A * x + b'\n // b' = b - A * a;\n\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const a = Vec2.neo(vcp1.normalImpulse, vcp2.normalImpulse);\n _ASSERT && common.assert(a.x >= 0.0 && a.y >= 0.0);\n\n // Relative velocity at contact\n let dv1 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp1.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp1.rA));\n let dv2 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp2.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp2.rA));\n\n // Compute normal velocity\n let vn1 = Vec2.dot(dv1, normal);\n let vn2 = Vec2.dot(dv2, normal);\n\n const b = Vec2.neo(vn1 - vcp1.velocityBias, vn2 - vcp2.velocityBias);\n\n // Compute b'\n b.sub(Mat22.mulVec2(this.v_K, a));\n\n const k_errorTol = 1e-3;\n // NOT_USED(k_errorTol);\n\n while (true) {\n //\n // Case 1: vn = 0\n //\n // 0 = A * x + b'\n //\n // Solve for x:\n //\n // x = - inv(A) * b'\n //\n const x = Mat22.mulVec2(this.v_normalMass, b).neg();\n\n if (x.x >= 0.0 && x.y >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n dv1 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA)));\n dv2 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA)));\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && common.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n _ASSERT && common.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 2: vn1 = 0 and x2 = 0\n //\n // 0 = a11 * x1 + a12 * 0 + b1'\n // vn2 = a21 * x1 + a22 * 0 + b2'\n //\n x.x = -vcp1.normalMass * b.x;\n x.y = 0.0;\n vn1 = 0.0;\n vn2 = this.v_K.ex.y * x.x + b.y;\n\n if (x.x >= 0.0 && vn2 >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv1B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB));\n const dv1A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA));\n const dv1 = Vec2.sub(dv1B, dv1A);\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n\n _ASSERT && common.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 3: vn2 = 0 and x1 = 0\n //\n // vn1 = a11 * 0 + a12 * x2 + b1'\n // 0 = a21 * 0 + a22 * x2 + b2'\n //\n x.x = 0.0;\n x.y = -vcp2.normalMass * b.y;\n vn1 = this.v_K.ey.x * x.y + b.x;\n vn2 = 0.0;\n\n if (x.y >= 0.0 && vn1 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv2B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB));\n const dv2A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA));\n const dv1 = Vec2.sub(dv2B, dv2A);\n\n // Compute normal velocity\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && common.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 4: x1 = 0 and x2 = 0\n //\n // vn1 = b1\n // vn2 = b2;\n //\n x.x = 0.0;\n x.y = 0.0;\n vn1 = b.x;\n vn2 = b.y;\n\n if (vn1 >= 0.0 && vn2 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n break;\n }\n\n // No solution, give up. This is hit sometimes, but it doesn't seem to\n // matter.\n break;\n }\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n /**\n * @internal\n */\n static addType(type1: ShapeType, type2: ShapeType, callback: ContactCallback): void {\n s_registers[type1] = s_registers[type1] || {};\n s_registers[type1][type2] = callback;\n }\n\n /**\n * @internal\n */\n static create(fixtureA: Fixture, indexA: number, fixtureB: Fixture, indexB: number): Contact | null {\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // TODO: pool contacts\n let contact;\n let evaluateFcn;\n if (evaluateFcn = s_registers[typeA] && s_registers[typeA][typeB]) {\n contact = new Contact(fixtureA, indexA, fixtureB, indexB, evaluateFcn);\n } else if (evaluateFcn = s_registers[typeB] && s_registers[typeB][typeA]) {\n contact = new Contact(fixtureB, indexB, fixtureA, indexA, evaluateFcn);\n } else {\n return null;\n }\n\n // Contact creation may swap fixtures.\n fixtureA = contact.getFixtureA();\n fixtureB = contact.getFixtureB();\n indexA = contact.getChildIndexA();\n indexB = contact.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Connect to body A\n contact.m_nodeA.contact = contact;\n contact.m_nodeA.other = bodyB;\n\n contact.m_nodeA.prev = null;\n contact.m_nodeA.next = bodyA.m_contactList;\n if (bodyA.m_contactList != null) {\n bodyA.m_contactList.prev = contact.m_nodeA;\n }\n bodyA.m_contactList = contact.m_nodeA;\n\n // Connect to body B\n contact.m_nodeB.contact = contact;\n contact.m_nodeB.other = bodyA;\n\n contact.m_nodeB.prev = null;\n contact.m_nodeB.next = bodyB.m_contactList;\n if (bodyB.m_contactList != null) {\n bodyB.m_contactList.prev = contact.m_nodeB;\n }\n bodyB.m_contactList = contact.m_nodeB;\n\n // Wake up the bodies\n if (fixtureA.isSensor() == false && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n return contact;\n }\n\n /**\n * @internal\n */\n static destroy(contact: Contact, listener: { endContact: (contact: Contact) => void }): void {\n const fixtureA = contact.m_fixtureA;\n const fixtureB = contact.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n if (contact.isTouching()) {\n listener.endContact(contact);\n }\n\n // Remove from body 1\n if (contact.m_nodeA.prev) {\n contact.m_nodeA.prev.next = contact.m_nodeA.next;\n }\n\n if (contact.m_nodeA.next) {\n contact.m_nodeA.next.prev = contact.m_nodeA.prev;\n }\n\n if (contact.m_nodeA == bodyA.m_contactList) {\n bodyA.m_contactList = contact.m_nodeA.next;\n }\n\n // Remove from body 2\n if (contact.m_nodeB.prev) {\n contact.m_nodeB.prev.next = contact.m_nodeB.next;\n }\n\n if (contact.m_nodeB.next) {\n contact.m_nodeB.next.prev = contact.m_nodeB.prev;\n }\n\n if (contact.m_nodeB == bodyB.m_contactList) {\n bodyB.m_contactList = contact.m_nodeB.next;\n }\n\n if (contact.m_manifold.pointCount > 0 && fixtureA.isSensor() == false\n && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // const destroyFcn = s_registers[typeA][typeB].destroyFcn;\n // if (typeof destroyFcn === 'function') {\n // destroyFcn(contact);\n // }\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport type Vec2 from '../common/Vec2';\nimport type Body from './Body';\nimport { TimeStep } from \"./Solver\";\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n/**\n * A joint edge is used to connect bodies and joints together in a joint graph\n * where each body is a node and each joint is an edge. A joint edge belongs to\n * a doubly linked list maintained in each attached body. Each joint has two\n * joint nodes, one for each attached body.\n */\nexport class JointEdge {\n /**\n * provides quick access to the other body attached.\n */\n other: Body | null = null;\n /**\n * the joint\n */\n joint: Joint | null = null;\n /**\n * prev the previous joint edge in the body's joint list\n */\n prev: JointEdge | null = null;\n /**\n * the next joint edge in the body's joint list\n */\n next: JointEdge | null = null;\n}\n\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointOpt {\n /**\n * Use this to attach application specific data to your joints.\n */\n userData?: any;\n /**\n * Set this flag to true if the attached bodies\n * should collide.\n */\n collideConnected?: boolean;\n}\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointDef extends JointOpt {\n /**\n * The first attached body.\n */\n bodyA: Body;\n /**\n * The second attached body.\n */\n bodyB: Body;\n}\n\nconst DEFAULTS = {\n userData : null,\n collideConnected : false\n};\n\n/**\n * The base joint class. Joints are used to constraint two bodies together in\n * various fashions. Some joints also feature limits and motors.\n */\nexport default abstract class Joint {\n\n /** @internal */ m_type: string = 'unknown-joint';\n\n /** @internal */ m_bodyA: Body;\n /** @internal */ m_bodyB: Body;\n\n /** @internal */ m_collideConnected: boolean;\n\n /** @internal */ m_prev: Joint | null = null;\n /** @internal */ m_next: Joint | null = null;\n\n /** @internal */ m_edgeA: JointEdge = new JointEdge();\n /** @internal */ m_edgeB: JointEdge = new JointEdge();\n\n /** @internal */ m_islandFlag: boolean = false;\n /** @internal */ m_userData: unknown;\n\n constructor(def: JointDef);\n constructor(def: JointOpt, bodyA: Body, bodyB: Body);\n constructor(def: JointDef | JointOpt, bodyA?: Body, bodyB?: Body) {\n bodyA = 'bodyA' in def ? def.bodyA : bodyA;\n bodyB = 'bodyB' in def ? def.bodyB : bodyB;\n\n _ASSERT && common.assert(!!bodyA);\n _ASSERT && common.assert(!!bodyB);\n _ASSERT && common.assert(bodyA != bodyB);\n\n this.m_bodyA = bodyA!;\n this.m_bodyB = bodyB!;\n\n this.m_collideConnected = !!def.collideConnected;\n this.m_userData = def.userData;\n }\n\n /**\n * Short-cut function to determine if either body is inactive.\n */\n isActive(): boolean {\n return this.m_bodyA.isActive() && this.m_bodyB.isActive();\n }\n\n /**\n * Get the type of the concrete joint.\n */\n getType(): string {\n return this.m_type;\n }\n\n /**\n * Get the first body attached to this joint.\n */\n getBodyA(): Body {\n return this.m_bodyA;\n }\n\n /**\n * Get the second body attached to this joint.\n */\n getBodyB(): Body {\n return this.m_bodyB;\n }\n\n /**\n * Get the next joint the world joint list.\n */\n getNext(): Joint {\n return this.m_next;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get collide connected. Note: modifying the collide connect flag won't work\n * correctly because the flag is only checked when fixture AABBs begin to\n * overlap.\n */\n getCollideConnected(): boolean {\n return this.m_collideConnected;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n abstract getAnchorA(): Vec2;\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n abstract getAnchorB(): Vec2;\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n abstract getReactionForce(inv_dt: number): Vec2;\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n abstract getReactionTorque(inv_dt: number): number;\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2): void {}\n\n abstract initVelocityConstraints(step: TimeStep): void;\n\n abstract solveVelocityConstraints(step: TimeStep): void;\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n abstract solvePositionConstraints(step: TimeStep): boolean;\n\n}\n","export const now = function(): number {\n return Date.now();\n};\n\nexport const diff = function(time: number): number {\n return Date.now() - time;\n};\n\nexport default {\n now,\n diff,\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../Settings';\n\nimport common from '../util/common';\nimport stats from '../util/stats';\nimport Timer from '../util/Timer';\n\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\nimport Rot from '../common/Rot';\nimport Sweep from '../common/Sweep';\nimport Transform from '../common/Transform';\n\nimport Distance, { DistanceInput, DistanceOutput, DistanceProxy, SimplexCache } from './Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Input parameters for TimeOfImpact.\n */\nexport class TOIInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n sweepA: Sweep = new Sweep();\n sweepB: Sweep = new Sweep();\n /** defines sweep interval [0, tMax] */\n tMax: number | undefined;\n}\n\nexport enum TOIOutputState {\n e_unknown = 0,\n e_failed = 1,\n e_overlapped = 2,\n e_touching = 3,\n e_separated = 4,\n}\n\n/**\n * Output parameters for TimeOfImpact.\n */\nexport class TOIOutput {\n state: TOIOutputState | undefined;\n t: number | undefined;\n}\n\nstats.toiTime = 0;\nstats.toiMaxTime = 0;\nstats.toiCalls = 0;\nstats.toiIters = 0;\nstats.toiMaxIters = 0;\nstats.toiRootIters = 0;\nstats.toiMaxRootIters = 0;\n\n/**\n * Compute the upper bound on time before two shapes penetrate. Time is\n * represented as a fraction between [0,tMax]. This uses a swept separating axis\n * and may miss some intermediate, non-tunneling collision. If you change the\n * time interval, you should call this function again.\n *\n * Note: use Distance to compute the contact point and normal at the time of\n * impact.\n *\n * CCD via the local separating axis method. This seeks progression by computing\n * the largest time at which separation is maintained.\n */\nexport default function TimeOfImpact(output: TOIOutput, input: TOIInput): void {\n const timer = Timer.now();\n\n ++stats.toiCalls;\n\n output.state = TOIOutputState.e_unknown;\n output.t = input.tMax;\n\n const proxyA = input.proxyA; // DistanceProxy\n const proxyB = input.proxyB; // DistanceProxy\n\n const sweepA = input.sweepA; // Sweep\n const sweepB = input.sweepB; // Sweep\n\n // Large rotations can make the root finder fail, so we normalize the\n // sweep angles.\n sweepA.normalize();\n sweepB.normalize();\n\n const tMax = input.tMax;\n\n const totalRadius = proxyA.m_radius + proxyB.m_radius;\n const target = Math.max(Settings.linearSlop, totalRadius - 3.0 * Settings.linearSlop);\n const tolerance = 0.25 * Settings.linearSlop;\n _ASSERT && common.assert(target > tolerance);\n\n let t1 = 0.0;\n const k_maxIterations = Settings.maxTOIIterations;\n let iter = 0;\n\n // Prepare input for distance query.\n const cache = new SimplexCache();\n\n const distanceInput = new DistanceInput();\n distanceInput.proxyA = input.proxyA;\n distanceInput.proxyB = input.proxyB;\n distanceInput.useRadii = false;\n\n // The outer loop progressively attempts to compute new separating axes.\n // This loop terminates when an axis is repeated (no progress is made).\n while (true) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n sweepA.getTransform(xfA, t1);\n sweepB.getTransform(xfB, t1);\n\n // Get the distance between shapes. We can also use the results\n // to get a separating axis.\n distanceInput.transformA = xfA;\n distanceInput.transformB = xfB;\n const distanceOutput = new DistanceOutput();\n Distance(distanceOutput, cache, distanceInput);\n\n // If the shapes are overlapped, we give up on continuous collision.\n if (distanceOutput.distance <= 0.0) {\n // Failure!\n output.state = TOIOutputState.e_overlapped;\n output.t = 0.0;\n break;\n }\n\n if (distanceOutput.distance < target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n break;\n }\n\n // Initialize the separating axis.\n const fcn = new SeparationFunction();\n fcn.initialize(cache, proxyA, sweepA, proxyB, sweepB, t1);\n\n // if (false) {\n // // Dump the curve seen by the root finder\n // const N = 100;\n // const dx = 1.0 / N;\n // const xs = []; // [ N + 1 ];\n // const fs = []; // [ N + 1 ];\n // const x = 0.0;\n // for (const i = 0; i <= N; ++i) {\n // sweepA.getTransform(xfA, x);\n // sweepB.getTransform(xfB, x);\n // const f = fcn.evaluate(xfA, xfB) - target;\n // printf(\"%g %g\\n\", x, f);\n // xs[i] = x;\n // fs[i] = f;\n // x += dx;\n // }\n // }\n\n // Compute the TOI on the separating axis. We do this by successively\n // resolving the deepest point. This loop is bounded by the number of\n // vertices.\n let done = false;\n let t2 = tMax;\n let pushBackIter = 0;\n while (true) {\n // Find the deepest point at t2. Store the witness point indices.\n let s2 = fcn.findMinSeparation(t2);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Is the final configuration separated?\n if (s2 > target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_separated;\n output.t = tMax;\n done = true;\n break;\n }\n\n // Has the separation reached tolerance?\n if (s2 > target - tolerance) {\n // Advance the sweeps\n t1 = t2;\n break;\n }\n\n // Compute the initial separation of the witness points.\n let s1 = fcn.evaluate(t1);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Check for initial overlap. This might happen if the root finder\n // runs out of iterations.\n if (s1 < target - tolerance) {\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n done = true;\n break;\n }\n\n // Check for touching\n if (s1 <= target + tolerance) {\n // Victory! t1 should hold the TOI (could be 0.0).\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n done = true;\n break;\n }\n\n // Compute 1D root of: f(x) - target = 0\n let rootIterCount = 0;\n let a1 = t1;\n let a2 = t2;\n while (true) {\n // Use a mix of the secant rule and bisection.\n let t;\n if (rootIterCount & 1) {\n // Secant rule to improve convergence.\n t = a1 + (target - s1) * (a2 - a1) / (s2 - s1);\n } else {\n // Bisection to guarantee progress.\n t = 0.5 * (a1 + a2);\n }\n\n ++rootIterCount;\n ++stats.toiRootIters;\n\n const s = fcn.evaluate(t);\n const indexA = fcn.indexA;\n const indexB = fcn.indexB;\n\n if (Math.abs(s - target) < tolerance) {\n // t2 holds a tentative value for t1\n t2 = t;\n break;\n }\n\n // Ensure we continue to bracket the root.\n if (s > target) {\n a1 = t;\n s1 = s;\n } else {\n a2 = t;\n s2 = s;\n }\n\n if (rootIterCount === 50) {\n break;\n }\n }\n\n stats.toiMaxRootIters = Math.max(stats.toiMaxRootIters, rootIterCount);\n\n ++pushBackIter;\n\n if (pushBackIter === Settings.maxPolygonVertices) {\n break;\n }\n }\n\n ++iter;\n ++stats.toiIters;\n\n if (done) {\n break;\n }\n\n if (iter === k_maxIterations) {\n // Root finder got stuck. Semi-victory.\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n break;\n }\n }\n\n stats.toiMaxIters = Math.max(stats.toiMaxIters, iter);\n\n const time = Timer.diff(timer);\n stats.toiMaxTime = Math.max(stats.toiMaxTime, time);\n stats.toiTime += time;\n}\n\nenum SeparationFunctionType {\n e_points = 1,\n e_faceA = 2,\n e_faceB = 3,\n}\n\nclass SeparationFunction {\n m_proxyA: DistanceProxy = new DistanceProxy();\n m_proxyB: DistanceProxy = new DistanceProxy();\n m_sweepA: Sweep;\n m_sweepB: Sweep;\n indexA: number;\n indexB: number;\n m_type: SeparationFunctionType;\n m_localPoint: Vec2 = Vec2.zero();\n m_axis: Vec2 = Vec2.zero();\n\n // TODO_ERIN might not need to return the separation\n\n initialize(cache: SimplexCache, proxyA: DistanceProxy, sweepA: Sweep, proxyB: DistanceProxy, sweepB: Sweep, t1: number): number {\n this.m_proxyA = proxyA;\n this.m_proxyB = proxyB;\n const count = cache.count;\n _ASSERT && common.assert(0 < count && count < 3);\n\n this.m_sweepA = sweepA;\n this.m_sweepB = sweepB;\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t1);\n this.m_sweepB.getTransform(xfB, t1);\n\n if (count === 1) {\n this.m_type = SeparationFunctionType.e_points;\n const localPointA = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n this.m_axis.setCombine(1, pointB, -1, pointA);\n const s = this.m_axis.normalize();\n return s;\n\n } else if (cache.indexA[0] === cache.indexA[1]) {\n // Two points on B and one on A.\n this.m_type = SeparationFunctionType.e_faceB;\n const localPointB1 = proxyB.getVertex(cache.indexB[0]);\n const localPointB2 = proxyB.getVertex(cache.indexB[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointB2, localPointB1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointB1, localPointB2);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n const localPointA = proxyA.getVertex(cache.indexA[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n let s = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n\n } else {\n // Two points on A and one or two points on B.\n this.m_type = SeparationFunctionType.e_faceA;\n const localPointA1 = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointA2 = this.m_proxyA.getVertex(cache.indexA[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointA2, localPointA1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointA1, localPointA2);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n let s = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n }\n }\n\n compute(find: boolean, t: number): number {\n // It was findMinSeparation and evaluate\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t);\n this.m_sweepB.getTransform(xfB, t);\n\n switch (this.m_type) {\n case SeparationFunctionType.e_points: {\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, this.m_axis);\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(this.m_axis));\n\n this.indexA = this.m_proxyA.getSupport(axisA);\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, this.m_axis) - Vec2.dot(pointA, this.m_axis);\n return sep;\n }\n\n case SeparationFunctionType.e_faceA: {\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n if (find) {\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(normal));\n\n this.indexA = -1;\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n return sep;\n }\n\n case SeparationFunctionType.e_faceB: {\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, Vec2.neg(normal));\n\n this.indexB = -1;\n this.indexA = this.m_proxyA.getSupport(axisA);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n const sep = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n return sep;\n }\n\n default:\n _ASSERT && common.assert(false);\n if (find) {\n this.indexA = -1;\n this.indexB = -1;\n }\n return 0.0;\n }\n }\n\n findMinSeparation(t: number): number {\n return this.compute(true, t);\n }\n\n evaluate(t: number): number {\n return this.compute(false, t);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../Settings';\nimport common from '../util/common';\nimport Vec2 from '../common/Vec2';\nimport Math from '../common/Math';\nimport Body from './Body';\nimport Contact from './Contact';\nimport Joint from './Joint';\nimport TimeOfImpact, { TOIInput, TOIOutput, TOIOutputState } from '../collision/TimeOfImpact';\nimport Distance, { DistanceInput, DistanceOutput, SimplexCache } from '../collision/Distance';\nimport World from \"./World\";\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport class TimeStep {\n /** time step */\n dt: number = 0;\n /** inverse time step (0 if dt == 0) */\n inv_dt: number = 0;\n velocityIterations: number = 0;\n positionIterations: number = 0;\n warmStarting: boolean = false;\n blockSolve: boolean = true;\n\n /** timestep ratio for variable timestep */\n inv_dt0: number = 0.0;\n /** dt * inv_dt0 */\n dtRatio: number = 1;\n\n reset(dt: number): void {\n if (this.dt > 0.0) {\n this.inv_dt0 = this.inv_dt;\n }\n this.dt = dt;\n this.inv_dt = dt == 0 ? 0 : 1 / dt;\n this.dtRatio = dt * this.inv_dt0;\n }\n}\n\n// reuse\nconst s_subStep = new TimeStep();\n\n/**\n * Contact impulses for reporting. Impulses are used instead of forces because\n * sub-step forces may approach infinity for rigid body collisions. These match\n * up one-to-one with the contact points in Manifold.\n */\nexport class ContactImpulse {\n // TODO: merge with Contact class?\n\n private readonly contact: Contact;\n private readonly normals: number[];\n private readonly tangents: number[];\n\n constructor(contact: Contact) {\n this.contact = contact;\n this.normals = [];\n this.tangents = [];\n }\n\n get normalImpulses(): number[] {\n const contact = this.contact;\n const normals = this.normals;\n normals.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n normals.push(contact.v_points[p].normalImpulse);\n }\n return normals;\n }\n\n get tangentImpulses(): number[] {\n const contact = this.contact;\n const tangents = this.tangents;\n tangents.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n tangents.push(contact.v_points[p].tangentImpulse);\n }\n return tangents;\n }\n}\n\n/**\n * Finds and solves islands. An island is a connected subset of the world.\n */\nexport default class Solver {\n m_world: World;\n m_stack: Body[];\n m_bodies: Body[];\n m_contacts: Contact[];\n m_joints: Joint[];\n\n constructor(world: World) {\n this.m_world = world;\n this.m_stack = [];\n this.m_bodies = [];\n this.m_contacts = [];\n this.m_joints = [];\n }\n\n clear(): void {\n this.m_stack.length = 0;\n this.m_bodies.length = 0;\n this.m_contacts.length = 0;\n this.m_joints.length = 0;\n }\n\n addBody(body: Body): void {\n _ASSERT && common.assert(body instanceof Body, 'Not a Body!', body);\n this.m_bodies.push(body);\n // why?\n // body.c_position.c.setZero();\n // body.c_position.a = 0;\n // body.c_velocity.v.setZero();\n // body.c_velocity.w = 0;\n }\n\n addContact(contact: Contact): void {\n _ASSERT && common.assert(contact instanceof Contact, 'Not a Contact!', contact);\n this.m_contacts.push(contact);\n }\n\n addJoint(joint: Joint): void {\n _ASSERT && common.assert(joint instanceof Joint, 'Not a Joint!', joint);\n this.m_joints.push(joint);\n }\n\n solveWorld(step: TimeStep): void {\n const world = this.m_world;\n\n // Clear all the island flags.\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n }\n for (let c = world.m_contactList; c; c = c.m_next) {\n c.m_islandFlag = false;\n }\n for (let j = world.m_jointList; j; j = j.m_next) {\n j.m_islandFlag = false;\n }\n\n // Build and simulate all awake islands.\n const stack = this.m_stack;\n let loop = -1;\n for (let seed = world.m_bodyList; seed; seed = seed.m_next) {\n loop++;\n if (seed.m_islandFlag) {\n continue;\n }\n\n if (seed.isAwake() == false || seed.isActive() == false) {\n continue;\n }\n\n // The seed can be dynamic or kinematic.\n if (seed.isStatic()) {\n continue;\n }\n\n // Reset island and stack.\n this.clear();\n\n stack.push(seed);\n\n seed.m_islandFlag = true;\n\n // Perform a depth first search (DFS) on the constraint graph.\n while (stack.length > 0) {\n // Grab the next body off the stack and add it to the island.\n const b = stack.pop();\n _ASSERT && common.assert(b.isActive() == true);\n this.addBody(b);\n\n // Make sure the body is awake.\n b.setAwake(true);\n\n // To keep islands as small as possible, we don't\n // propagate islands across static bodies.\n if (b.isStatic()) {\n continue;\n }\n\n // Search all contacts connected to this body.\n for (let ce = b.m_contactList; ce; ce = ce.next) {\n const contact = ce.contact;\n\n // Has this contact already been added to an island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Is this contact solid and touching?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n this.addContact(contact);\n contact.m_islandFlag = true;\n\n const other = ce.other;\n\n // Was the other body already added to this island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && common.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n\n // Search all joints connect to this body.\n for (let je = b.m_jointList; je; je = je.next) {\n if (je.joint.m_islandFlag == true) {\n continue;\n }\n\n const other = je.other;\n\n // Don't simulate joints connected to inactive bodies.\n if (other.isActive() == false) {\n continue;\n }\n\n this.addJoint(je.joint);\n je.joint.m_islandFlag = true;\n\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && common.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n }\n\n this.solveIsland(step);\n\n // Post solve cleanup.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n // Allow static bodies to participate in other islands.\n // TODO: are they added at all?\n const b = this.m_bodies[i];\n if (b.isStatic()) {\n b.m_islandFlag = false;\n }\n }\n }\n }\n\n solveIsland(step: TimeStep): void {\n // B2: Island Solve\n const world = this.m_world;\n const gravity = world.m_gravity;\n const allowSleep = world.m_allowSleep;\n\n const h = step.dt;\n\n // Integrate velocities and apply damping. Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.m_sweep.c);\n const a = body.m_sweep.a;\n const v = Vec2.clone(body.m_linearVelocity);\n let w = body.m_angularVelocity;\n\n // Store positions for continuous collision.\n body.m_sweep.c0.setVec2(body.m_sweep.c);\n body.m_sweep.a0 = body.m_sweep.a;\n\n if (body.isDynamic()) {\n // Integrate velocities.\n v.addMul(h * body.m_gravityScale, gravity);\n v.addMul(h * body.m_invMass, body.m_force);\n w += h * body.m_invI * body.m_torque;\n /**\n *
\n         * Apply damping.\n         * ODE: dv/dt + c * v = 0\n         * Solution: v(t) = v0 * exp(-c * t)\n         * Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)\n         * v2 = exp(-c * dt) * v1\n         * Pade approximation:\n         * v2 = v1 * 1 / (1 + c * dt)\n         * 
\n */\n v.mul(1.0 / (1.0 + h * body.m_linearDamping));\n w *= 1.0 / (1.0 + h * body.m_angularDamping);\n }\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(step);\n }\n\n _DEBUG && this.printBodies('M: ');\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(step);\n }\n\n _DEBUG && this.printBodies('R: ');\n\n if (step.warmStarting) {\n // Warm start.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.warmStartConstraint(step);\n }\n }\n\n _DEBUG && this.printBodies('Q: ');\n\n for (let i = 0; i < this.m_joints.length; ++i) {\n const joint = this.m_joints[i];\n joint.initVelocityConstraints(step);\n }\n\n _DEBUG && this.printBodies('E: ');\n\n // Solve velocity constraints\n for (let i = 0; i < step.velocityIterations; ++i) {\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n joint.solveVelocityConstraints(step);\n }\n\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(step);\n }\n }\n\n _DEBUG && this.printBodies('D: ');\n\n // Store impulses for warm starting\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.storeConstraintImpulses(step);\n }\n\n _DEBUG && this.printBodies('C: ');\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.lengthSquared(translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c.setVec2(c);\n body.c_position.a = a;\n body.c_velocity.v.setVec2(v);\n body.c_velocity.w = w;\n }\n\n _DEBUG && this.printBodies('B: ');\n\n // Solve position constraints\n let positionSolved = false;\n for (let i = 0; i < step.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraint(step);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -3.0 * Settings.linearSlop;\n\n let jointsOkay = true;\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n const jointOkay = joint.solvePositionConstraints(step);\n jointsOkay = jointsOkay && jointOkay;\n }\n\n if (contactsOkay && jointsOkay) {\n // Exit early if the position errors are small.\n positionSolved = true;\n break;\n }\n }\n\n _DEBUG && this.printBodies('L: ');\n\n // Copy state buffers back to the bodies\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n body.m_sweep.c.setVec2(body.c_position.c);\n body.m_sweep.a = body.c_position.a;\n body.m_linearVelocity.setVec2(body.c_velocity.v);\n body.m_angularVelocity = body.c_velocity.w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n\n if (allowSleep) {\n let minSleepTime = Infinity;\n\n const linTolSqr = Settings.linearSleepToleranceSqr;\n const angTolSqr = Settings.angularSleepToleranceSqr;\n\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n if (body.isStatic()) {\n continue;\n }\n\n if ((body.m_autoSleepFlag == false)\n || (body.m_angularVelocity * body.m_angularVelocity > angTolSqr)\n || (Vec2.lengthSquared(body.m_linearVelocity) > linTolSqr)) {\n body.m_sleepTime = 0.0;\n minSleepTime = 0.0;\n } else {\n body.m_sleepTime += h;\n minSleepTime = Math.min(minSleepTime, body.m_sleepTime);\n }\n }\n\n if (minSleepTime >= Settings.timeToSleep && positionSolved) {\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.setAwake(false);\n }\n }\n }\n }\n\n /** @internal */\n printBodies(tag: string): void {\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const b = this.m_bodies[i];\n common.debug(tag, b.c_position.a, b.c_position.c.x, b.c_position.c.y, b.c_velocity.w, b.c_velocity.v.x, b.c_velocity.v.y);\n }\n }\n\n /**\n * Find TOI contacts and solve them.\n */\n solveWorldTOI(step: TimeStep): void {\n const world = this.m_world;\n\n if (world.m_stepComplete) {\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n b.m_sweep.alpha0 = 0.0;\n }\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Invalidate TOI\n c.m_toiFlag = false;\n c.m_islandFlag = false;\n c.m_toiCount = 0;\n c.m_toi = 1.0;\n }\n }\n\n // Find TOI events and solve them.\n while (true) {\n // Find the first TOI.\n let minContact = null; // Contact\n let minAlpha = 1.0;\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Is this contact disabled?\n if (c.isEnabled() == false) {\n continue;\n }\n\n // Prevent excessive sub-stepping.\n if (c.m_toiCount > Settings.maxSubSteps) {\n continue;\n }\n\n let alpha = 1.0;\n if (c.m_toiFlag) {\n // This contact has a valid cached TOI.\n alpha = c.m_toi;\n } else {\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n // Is there a sensor?\n if (fA.isSensor() || fB.isSensor()) {\n continue;\n }\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n _ASSERT && common.assert(bA.isDynamic() || bB.isDynamic());\n\n const activeA = bA.isAwake() && !bA.isStatic();\n const activeB = bB.isAwake() && !bB.isStatic();\n\n // Is at least one body active (awake and dynamic or kinematic)?\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const collideA = bA.isBullet() || !bA.isDynamic();\n const collideB = bB.isBullet() || !bB.isDynamic();\n\n // Are these two non-bullet dynamic bodies?\n if (collideA == false && collideB == false) {\n continue;\n }\n\n // Compute the TOI for this contact.\n // Put the sweeps onto the same time interval.\n let alpha0 = bA.m_sweep.alpha0;\n\n if (bA.m_sweep.alpha0 < bB.m_sweep.alpha0) {\n alpha0 = bB.m_sweep.alpha0;\n bA.m_sweep.advance(alpha0);\n } else if (bB.m_sweep.alpha0 < bA.m_sweep.alpha0) {\n alpha0 = bA.m_sweep.alpha0;\n bB.m_sweep.advance(alpha0);\n }\n\n _ASSERT && common.assert(alpha0 < 1.0);\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const sweepA = bA.m_sweep;\n const sweepB = bB.m_sweep;\n\n // Compute the time of impact in interval [0, minTOI]\n const input = new TOIInput(); // TODO: reuse\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.sweepA.set(bA.m_sweep);\n input.sweepB.set(bB.m_sweep);\n input.tMax = 1.0;\n\n const output = new TOIOutput(); // TODO: reuse\n TimeOfImpact(output, input);\n\n // Beta is the fraction of the remaining portion of the [time?].\n const beta = output.t;\n if (output.state == TOIOutputState.e_touching) {\n alpha = Math.min(alpha0 + (1.0 - alpha0) * beta, 1.0);\n } else {\n alpha = 1.0;\n }\n\n c.m_toi = alpha;\n c.m_toiFlag = true;\n }\n\n if (alpha < minAlpha) {\n // This is the minimum TOI found so far.\n minContact = c;\n minAlpha = alpha;\n }\n }\n\n if (minContact == null || 1.0 - 10.0 * Math.EPSILON < minAlpha) {\n // No more TOI events. Done!\n world.m_stepComplete = true;\n break;\n }\n\n // Advance the bodies to the TOI.\n const fA = minContact.getFixtureA();\n const fB = minContact.getFixtureB();\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const backup1 = bA.m_sweep.clone();\n const backup2 = bB.m_sweep.clone();\n\n bA.advance(minAlpha);\n bB.advance(minAlpha);\n\n // The TOI contact likely has some new contact points.\n minContact.update(world);\n minContact.m_toiFlag = false;\n ++minContact.m_toiCount;\n\n // Is the contact solid?\n if (minContact.isEnabled() == false || minContact.isTouching() == false) {\n // Restore the sweeps.\n minContact.setEnabled(false);\n bA.m_sweep.set(backup1);\n bB.m_sweep.set(backup2);\n bA.synchronizeTransform();\n bB.synchronizeTransform();\n continue;\n }\n\n bA.setAwake(true);\n bB.setAwake(true);\n\n // Build the island\n this.clear();\n this.addBody(bA);\n this.addBody(bB);\n this.addContact(minContact);\n\n bA.m_islandFlag = true;\n bB.m_islandFlag = true;\n minContact.m_islandFlag = true;\n\n // Get contacts on bodyA and bodyB.\n const bodies = [ bA, bB ];\n for (let i = 0; i < bodies.length; ++i) {\n const body = bodies[i];\n if (body.isDynamic()) {\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n // if (this.m_bodyCount == this.m_bodyCapacity) { break; }\n // if (this.m_contactCount == this.m_contactCapacity) { break; }\n\n const contact = ce.contact;\n\n // Has this contact already been added to the island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Only add if either is static, kinematic or bullet.\n const other = ce.other;\n if (other.isDynamic() && !body.isBullet() && !other.isBullet()) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n // Tentatively advance the body to the TOI.\n const backup = other.m_sweep.clone();\n if (other.m_islandFlag == false) {\n other.advance(minAlpha);\n }\n\n // Update the contact points\n contact.update(world);\n\n // Was the contact disabled by the user?\n // Are there contact points?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n other.m_sweep.set(backup);\n other.synchronizeTransform();\n continue;\n }\n\n // Add the contact to the island\n contact.m_islandFlag = true;\n this.addContact(contact);\n\n // Has the other body already been added to the island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // Add the other body to the island.\n other.m_islandFlag = true;\n\n if (!other.isStatic()) {\n other.setAwake(true);\n }\n\n this.addBody(other);\n }\n }\n }\n\n s_subStep.reset((1.0 - minAlpha) * step.dt);\n s_subStep.dtRatio = 1.0;\n s_subStep.positionIterations = 20;\n s_subStep.velocityIterations = step.velocityIterations;\n s_subStep.warmStarting = false;\n\n this.solveIslandTOI(s_subStep, bA, bB);\n\n // Reset island flags and synchronize broad-phase proxies.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.m_islandFlag = false;\n\n if (!body.isDynamic()) {\n continue;\n }\n\n body.synchronizeFixtures();\n\n // Invalidate all contact TOIs on this displaced body.\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n ce.contact.m_toiFlag = false;\n ce.contact.m_islandFlag = false;\n }\n }\n\n // Commit fixture proxy movements to the broad-phase so that new contacts\n // are created.\n // Also, some contacts can be destroyed.\n world.findNewContacts();\n\n if (world.m_subStepping) {\n world.m_stepComplete = false;\n break;\n }\n }\n\n if (_DEBUG) for (let b = world.m_bodyList; b; b = b.m_next) {\n const c = b.m_sweep.c;\n const a = b.m_sweep.a;\n const v = b.m_linearVelocity;\n const w = b.m_angularVelocity;\n }\n }\n\n solveIslandTOI(subStep: TimeStep, toiA: Body, toiB: Body): void {\n const world = this.m_world;\n\n // Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.c_position.c.setVec2(body.m_sweep.c);\n body.c_position.a = body.m_sweep.a;\n body.c_velocity.v.setVec2(body.m_linearVelocity);\n body.c_velocity.w = body.m_angularVelocity;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(subStep);\n }\n\n // Solve position constraints.\n for (let i = 0; i < subStep.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraintTOI(subStep, toiA, toiB);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -1.5 * Settings.linearSlop;\n if (contactsOkay) {\n break;\n }\n }\n\n if (false) {\n // Is the new position really safe?\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const c = this.m_contacts[i];\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const input = new DistanceInput();\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.transformA = bA.getTransform();\n input.transformB = bB.getTransform();\n input.useRadii = false;\n\n const output = new DistanceOutput();\n const cache = new SimplexCache();\n Distance(output, cache, input);\n\n if (output.distance == 0 || cache.count == 3) {\n cache.count += 0;\n }\n }\n }\n\n // Leap of faith to new safe state.\n toiA.m_sweep.c0.setVec2(toiA.c_position.c);\n toiA.m_sweep.a0 = toiA.c_position.a;\n toiB.m_sweep.c0.setVec2(toiB.c_position.c);\n toiB.m_sweep.a0 = toiB.c_position.a;\n\n // No warm starting is needed for TOI events because warm\n // starting impulses were applied in the discrete solver.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(subStep);\n }\n\n // Solve velocity constraints.\n for (let i = 0; i < subStep.velocityIterations; ++i) {\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(subStep);\n }\n }\n\n // Don't store the TOI contact forces for warm starting\n // because they can be quite large.\n\n const h = subStep.dt;\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.dot(translation, translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n\n // Sync bodies\n body.m_sweep.c = c;\n body.m_sweep.a = a;\n body.m_linearVelocity = v;\n body.m_angularVelocity = w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n }\n\n /** @internal */\n postSolveIsland(): void {\n for (let c = 0; c < this.m_contacts.length; ++c) {\n const contact = this.m_contacts[c];\n this.m_world.postSolve(contact, contact.m_impulse);\n }\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../util/options';\nimport common from '../util/common';\nimport Vec2 from '../common/Vec2';\nimport BroadPhase from '../collision/BroadPhase';\nimport Solver, { ContactImpulse, TimeStep } from './Solver';\nimport Body, { BodyDef } from './Body';\nimport Joint from './Joint';\nimport Contact from './Contact';\nimport AABB, { RayCastInput, RayCastOutput } from \"../collision/AABB\";\nimport Fixture, { FixtureProxy } from \"./Fixture\";\nimport Manifold from \"../collision/Manifold\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * @prop gravity [{ x : 0, y : 0}]\n * @prop allowSleep [true]\n * @prop warmStarting [true]\n * @prop continuousPhysics [true]\n * @prop subStepping [false]\n * @prop blockSolve [true]\n * @prop velocityIterations [8] For the velocity constraint solver.\n * @prop positionIterations [3] For the position constraint solver.\n */\nexport interface WorldDef {\n gravity?: Vec2;\n allowSleep?: boolean;\n warmStarting?: boolean;\n continuousPhysics?: boolean;\n subStepping?: boolean;\n blockSolve?: boolean;\n velocityIterations?: number;\n positionIterations?: number;\n}\n\nconst WorldDefDefault: WorldDef = {\n gravity : Vec2.zero(),\n allowSleep : true,\n warmStarting : true,\n continuousPhysics : true,\n subStepping : false,\n blockSolve : true,\n velocityIterations : 8,\n positionIterations : 3\n};\n\n/**\n * Callback function for ray casts, see {@link World.rayCast}.\n *\n * Called for each fixture found in the query. You control how the ray cast\n * proceeds by returning a float: return -1: ignore this fixture and continue\n * return 0: terminate the ray cast return fraction: clip the ray to this point\n * return 1: don't clip the ray and continue\n *\n * @param fixture The fixture hit by the ray\n * @param point The point of initial intersection\n * @param normal The normal vector at the point of intersection\n * @param fraction\n *\n * @return -1 to filter, 0 to terminate, fraction to clip the ray for closest hit, 1 to continue\n */\nexport type WorldRayCastCallback = (fixture: Fixture, point: Vec2, normal: Vec2, fraction: number) => number;\n\n/**\n * Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\nexport type WorldAABBQueryCallback = (fixture: Fixture) => boolean;\n\nexport default class World {\n /** @internal */ m_solver: Solver;\n /** @internal */ m_broadPhase: BroadPhase;\n /** @internal */ m_contactList: Contact | null;\n /** @internal */ m_contactCount: number;\n /** @internal */ m_bodyList: Body | null;\n /** @internal */ m_bodyCount: number;\n /** @internal */ m_jointList: Joint | null;\n /** @internal */ m_jointCount: number;\n /** @internal */ m_stepComplete: boolean;\n /** @internal */ m_allowSleep: boolean;\n /** @internal */ m_gravity: Vec2;\n /** @internal */ m_clearForces: boolean;\n /** @internal */ m_newFixture: boolean;\n /** @internal */ m_locked: boolean;\n /** @internal */ m_warmStarting: boolean;\n /** @internal */ m_continuousPhysics: boolean;\n /** @internal */ m_subStepping: boolean;\n /** @internal */ m_blockSolve: boolean;\n /** @internal */ m_velocityIterations: number;\n /** @internal */ m_positionIterations: number;\n /** @internal */ m_t: number;\n\n // TODO\n /** @internal */ _listeners: {\n [key: string]: any[]\n };\n\n /**\n * @param def World definition or gravity vector.\n */\n constructor(def?: WorldDef | Vec2 | null) {\n if (!(this instanceof World)) {\n return new World(def);\n }\n\n if (def && Vec2.isValid(def)) {\n def = { gravity: def as Vec2 };\n }\n\n def = options(def, WorldDefDefault) as WorldDef;\n\n this.m_solver = new Solver(this);\n\n this.m_broadPhase = new BroadPhase();\n\n this.m_contactList = null;\n this.m_contactCount = 0;\n\n this.m_bodyList = null;\n this.m_bodyCount = 0;\n\n this.m_jointList = null;\n this.m_jointCount = 0;\n\n this.m_stepComplete = true;\n\n this.m_allowSleep = def.allowSleep;\n this.m_gravity = Vec2.clone(def.gravity);\n\n this.m_clearForces = true;\n this.m_newFixture = false;\n this.m_locked = false;\n\n // These are for debugging the solver.\n this.m_warmStarting = def.warmStarting;\n this.m_continuousPhysics = def.continuousPhysics;\n this.m_subStepping = def.subStepping;\n\n this.m_blockSolve = def.blockSolve;\n this.m_velocityIterations = def.velocityIterations;\n this.m_positionIterations = def.positionIterations;\n\n this.m_t = 0;\n }\n\n /** @internal */\n _serialize(): object {\n const bodies = [];\n const joints = [];\n\n for (let b = this.getBodyList(); b; b = b.getNext()) {\n bodies.push(b);\n }\n\n for (let j = this.getJointList(); j; j = j.getNext()) {\n // @ts-ignore\n if (typeof j._serialize === 'function') {\n joints.push(j);\n }\n }\n\n return {\n gravity: this.m_gravity,\n bodies,\n joints,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, context: any, restore: any): World {\n if (!data) {\n return new World();\n }\n\n const world = new World(data.gravity);\n\n if (data.bodies) {\n for (let i = data.bodies.length - 1; i >= 0; i -= 1) {\n world._addBody(restore(Body, data.bodies[i], world));\n }\n }\n\n if (data.joints) {\n for (let i = data.joints.length - 1; i >= 0; i--) {\n world.createJoint(restore(Joint, data.joints[i], world));\n }\n }\n\n return world;\n }\n\n /**\n * Get the world body list. With the returned body, use Body.getNext to get the\n * next body in the world list. A null body indicates the end of the list.\n *\n * @return the head of the world body list.\n */\n getBodyList(): Body | null {\n return this.m_bodyList;\n }\n\n /**\n * Get the world joint list. With the returned joint, use Joint.getNext to get\n * the next joint in the world list. A null joint indicates the end of the list.\n *\n * @return the head of the world joint list.\n */\n getJointList(): Joint | null {\n return this.m_jointList;\n }\n\n /**\n * Get the world contact list. With the returned contact, use Contact.getNext to\n * get the next contact in the world list. A null contact indicates the end of\n * the list.\n *\n * Warning: contacts are created and destroyed in the middle of a time step.\n * Use ContactListener to avoid missing contacts.\n *\n * @return the head of the world contact list.\n */\n getContactList(): Contact | null {\n return this.m_contactList;\n }\n\n getBodyCount(): number {\n return this.m_bodyCount;\n }\n\n getJointCount(): number {\n return this.m_jointCount;\n }\n\n /**\n * Get the number of contacts (each may have 0 or more contact points).\n */\n getContactCount(): number {\n return this.m_contactCount;\n }\n\n /**\n * Change the global gravity vector.\n */\n setGravity(gravity: Vec2): void {\n this.m_gravity = gravity;\n }\n\n /**\n * Get the global gravity vector.\n */\n getGravity(): Vec2 {\n return this.m_gravity;\n }\n\n /**\n * Is the world locked (in the middle of a time step).\n */\n isLocked(): boolean {\n return this.m_locked;\n }\n\n /**\n * Enable/disable sleep.\n */\n setAllowSleeping(flag: boolean): void {\n if (flag == this.m_allowSleep) {\n return;\n }\n\n this.m_allowSleep = flag;\n if (this.m_allowSleep == false) {\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.setAwake(true);\n }\n }\n }\n\n getAllowSleeping(): boolean {\n return this.m_allowSleep;\n }\n\n /**\n * Enable/disable warm starting. For testing.\n */\n setWarmStarting(flag: boolean): void {\n this.m_warmStarting = flag;\n }\n\n getWarmStarting(): boolean {\n return this.m_warmStarting;\n }\n\n /**\n * Enable/disable continuous physics. For testing.\n */\n setContinuousPhysics(flag: boolean): void {\n this.m_continuousPhysics = flag;\n }\n\n getContinuousPhysics(): boolean {\n return this.m_continuousPhysics;\n }\n\n /**\n * Enable/disable single stepped continuous physics. For testing.\n */\n setSubStepping(flag: boolean): void {\n this.m_subStepping = flag;\n }\n\n getSubStepping(): boolean {\n return this.m_subStepping;\n }\n\n /**\n * Set flag to control automatic clearing of forces after each time step.\n */\n setAutoClearForces(flag: boolean): void {\n this.m_clearForces = flag;\n }\n\n /**\n * Get the flag that controls automatic clearing of forces after each time step.\n */\n getAutoClearForces(): boolean {\n return this.m_clearForces;\n }\n\n /**\n * Manually clear the force buffer on all bodies. By default, forces are cleared\n * automatically after each call to step. The default behavior is modified by\n * calling setAutoClearForces. The purpose of this function is to support\n * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step\n * under a variable frame-rate. When you perform sub-stepping you will disable\n * auto clearing of forces and instead call clearForces after all sub-steps are\n * complete in one pass of your game loop.\n *\n * See {@link World.setAutoClearForces}\n */\n clearForces(): void {\n for (let body = this.m_bodyList; body; body = body.getNext()) {\n body.m_force.setZero();\n body.m_torque = 0.0;\n }\n }\n\n /**\n * Query the world for all fixtures that potentially overlap the provided AABB.\n *\n * @param aabb The query box.\n * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\n queryAABB(aabb: AABB, callback: WorldAABBQueryCallback): void {\n _ASSERT && common.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n this.m_broadPhase.query(aabb, function(proxyId: number): boolean { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n return callback(proxy.fixture);\n });\n }\n\n /**\n * Ray-cast the world for all fixtures in the path of the ray. Your callback\n * controls whether you get the closest point, any point, or n-points. The\n * ray-cast ignores shapes that contain the starting point.\n *\n * @param point1 The ray starting point\n * @param point2 The ray ending point\n * @param callback A user implemented callback function.\n */\n rayCast(point1: Vec2, point2: Vec2, callback: WorldRayCastCallback): void {\n _ASSERT && common.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n\n this.m_broadPhase.rayCast({\n maxFraction : 1.0,\n p1 : point1,\n p2 : point2\n }, function(input: RayCastInput, proxyId: number): number { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n const fixture = proxy.fixture;\n const index = proxy.childIndex;\n // @ts-ignore\n const output: RayCastOutput = {}; // TODO GC\n const hit = fixture.rayCast(output, input, index);\n if (hit) {\n const fraction = output.fraction;\n const point = Vec2.add(Vec2.mulNumVec2((1.0 - fraction), input.p1), Vec2.mulNumVec2(fraction, input.p2));\n return callback(fixture, point, output.normal, fraction);\n }\n return input.maxFraction;\n });\n }\n\n /**\n * Get the number of broad-phase proxies.\n */\n getProxyCount(): number {\n return this.m_broadPhase.getProxyCount();\n }\n\n /**\n * Get the height of broad-phase dynamic tree.\n */\n getTreeHeight(): number {\n return this.m_broadPhase.getTreeHeight();\n }\n\n /**\n * Get the balance of broad-phase dynamic tree.\n */\n getTreeBalance(): number {\n return this.m_broadPhase.getTreeBalance();\n }\n\n /**\n * Get the quality metric of broad-phase dynamic tree. The smaller the better.\n * The minimum is 1.\n */\n getTreeQuality(): number {\n return this.m_broadPhase.getTreeQuality();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The body shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n _ASSERT && common.assert(this.m_locked == false);\n if (this.m_locked) {\n return;\n }\n\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.m_xf.p.sub(newOrigin);\n b.m_sweep.c0.sub(newOrigin);\n b.m_sweep.c.sub(newOrigin);\n }\n\n for (let j = this.m_jointList; j; j = j.m_next) {\n j.shiftOrigin(newOrigin);\n }\n\n this.m_broadPhase.shiftOrigin(newOrigin);\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addBody(body: Body): void {\n _ASSERT && common.assert(this.isLocked() === false);\n if (this.isLocked()) {\n return;\n }\n\n // Add to world doubly linked list.\n body.m_prev = null;\n body.m_next = this.m_bodyList;\n if (this.m_bodyList) {\n this.m_bodyList.m_prev = body;\n }\n this.m_bodyList = body;\n ++this.m_bodyCount;\n }\n\n /**\n * Create a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This function is locked during callbacks.\n */\n createBody(def?: BodyDef): Body;\n createBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createBody(arg1?, arg2?) {\n _ASSERT && common.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n\n const body = new Body(this, def);\n this._addBody(body);\n return body;\n }\n\n createDynamicBody(def?: BodyDef): Body;\n createDynamicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createDynamicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'dynamic';\n return this.createBody(def);\n }\n\n createKinematicBody(def?: BodyDef): Body;\n createKinematicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createKinematicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'kinematic';\n return this.createBody(def);\n }\n\n /**\n * Destroy a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This automatically deletes all associated shapes and joints.\n *\n * Warning: This function is locked during callbacks.\n */\n destroyBody(b: Body): boolean {\n _ASSERT && common.assert(this.m_bodyCount > 0);\n _ASSERT && common.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n if (b.m_destroyed) {\n return false;\n }\n\n // Delete the attached joints.\n let je = b.m_jointList;\n while (je) {\n const je0 = je;\n je = je.next;\n\n this.publish('remove-joint', je0.joint);\n this.destroyJoint(je0.joint);\n\n b.m_jointList = je;\n }\n b.m_jointList = null;\n\n // Delete the attached contacts.\n let ce = b.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n\n this.destroyContact(ce0.contact);\n\n b.m_contactList = ce;\n }\n b.m_contactList = null;\n\n // Delete the attached fixtures. This destroys broad-phase proxies.\n let f = b.m_fixtureList;\n while (f) {\n const f0 = f;\n f = f.m_next;\n\n this.publish('remove-fixture', f0);\n f0.destroyProxies(this.m_broadPhase);\n\n b.m_fixtureList = f;\n }\n b.m_fixtureList = null;\n\n // Remove world body list.\n if (b.m_prev) {\n b.m_prev.m_next = b.m_next;\n }\n\n if (b.m_next) {\n b.m_next.m_prev = b.m_prev;\n }\n\n if (b == this.m_bodyList) {\n this.m_bodyList = b.m_next;\n }\n\n b.m_destroyed = true;\n\n --this.m_bodyCount;\n\n this.publish('remove-body', b);\n\n return true;\n }\n\n /**\n * Create a joint to constrain bodies together. No reference to the definition\n * is retained. This may cause the connected bodies to cease colliding.\n *\n * Warning: This function is locked during callbacks.\n */\n createJoint(joint: T): T | null {\n _ASSERT && common.assert(!!joint.m_bodyA);\n _ASSERT && common.assert(!!joint.m_bodyB);\n _ASSERT && common.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n // Connect to the world list.\n joint.m_prev = null;\n joint.m_next = this.m_jointList;\n if (this.m_jointList) {\n this.m_jointList.m_prev = joint;\n }\n this.m_jointList = joint;\n ++this.m_jointCount;\n\n // Connect to the bodies' doubly linked lists.\n joint.m_edgeA.joint = joint;\n joint.m_edgeA.other = joint.m_bodyB;\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = joint.m_bodyA.m_jointList;\n if (joint.m_bodyA.m_jointList)\n joint.m_bodyA.m_jointList.prev = joint.m_edgeA;\n joint.m_bodyA.m_jointList = joint.m_edgeA;\n\n joint.m_edgeB.joint = joint;\n joint.m_edgeB.other = joint.m_bodyA;\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = joint.m_bodyB.m_jointList;\n if (joint.m_bodyB.m_jointList)\n joint.m_bodyB.m_jointList.prev = joint.m_edgeB;\n joint.m_bodyB.m_jointList = joint.m_edgeB;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n for (let edge = joint.m_bodyB.getContactList(); edge; edge = edge.next) {\n if (edge.other == joint.m_bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n }\n }\n\n // Note: creating a joint doesn't wake the bodies.\n\n return joint;\n }\n\n /**\n * Destroy a joint. This may cause the connected bodies to begin colliding.\n * Warning: This function is locked during callbacks.\n */\n destroyJoint(joint: Joint): void {\n _ASSERT && common.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n // Remove from the doubly linked list.\n if (joint.m_prev) {\n joint.m_prev.m_next = joint.m_next;\n }\n\n if (joint.m_next) {\n joint.m_next.m_prev = joint.m_prev;\n }\n\n if (joint == this.m_jointList) {\n this.m_jointList = joint.m_next;\n }\n\n // Disconnect from bodies.\n const bodyA = joint.m_bodyA;\n const bodyB = joint.m_bodyB;\n\n // Wake up connected bodies.\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n\n // Remove from body 1.\n if (joint.m_edgeA.prev) {\n joint.m_edgeA.prev.next = joint.m_edgeA.next;\n }\n\n if (joint.m_edgeA.next) {\n joint.m_edgeA.next.prev = joint.m_edgeA.prev;\n }\n\n if (joint.m_edgeA == bodyA.m_jointList) {\n bodyA.m_jointList = joint.m_edgeA.next;\n }\n\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = null;\n\n // Remove from body 2\n if (joint.m_edgeB.prev) {\n joint.m_edgeB.prev.next = joint.m_edgeB.next;\n }\n\n if (joint.m_edgeB.next) {\n joint.m_edgeB.next.prev = joint.m_edgeB.prev;\n }\n\n if (joint.m_edgeB == bodyB.m_jointList) {\n bodyB.m_jointList = joint.m_edgeB.next;\n }\n\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = null;\n\n _ASSERT && common.assert(this.m_jointCount > 0);\n --this.m_jointCount;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n let edge = bodyB.getContactList();\n while (edge) {\n if (edge.other == bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n }\n\n this.publish('remove-joint', joint);\n }\n\n /** @internal */\n s_step: TimeStep = new TimeStep(); // reuse\n\n /**\n * Take a time step. This performs collision detection, integration, and\n * constraint solution.\n *\n * Broad-phase, narrow-phase, solve and solve time of impacts.\n *\n * @param timeStep Time step, this should not vary.\n */\n step(timeStep: number, velocityIterations?: number, positionIterations?: number): void {\n this.publish('pre-step', timeStep);\n\n if ((velocityIterations | 0) !== velocityIterations) {\n // TODO: remove this in future\n velocityIterations = 0;\n }\n\n velocityIterations = velocityIterations || this.m_velocityIterations;\n positionIterations = positionIterations || this.m_positionIterations;\n\n // If new fixtures were added, we need to find the new contacts.\n if (this.m_newFixture) {\n this.findNewContacts();\n this.m_newFixture = false;\n }\n\n this.m_locked = true;\n\n this.s_step.reset(timeStep);\n this.s_step.velocityIterations = velocityIterations;\n this.s_step.positionIterations = positionIterations;\n this.s_step.warmStarting = this.m_warmStarting;\n this.s_step.blockSolve = this.m_blockSolve;\n\n // Update contacts. This is where some contacts are destroyed.\n this.updateContacts();\n\n // Integrate velocities, solve velocity constraints, and integrate positions.\n if (this.m_stepComplete && timeStep > 0.0) {\n this.m_solver.solveWorld(this.s_step);\n\n // Synchronize fixtures, check for out of range bodies.\n for (let b = this.m_bodyList; b; b = b.getNext()) {\n // If a body was not in an island then it did not move.\n if (b.m_islandFlag == false) {\n continue;\n }\n\n if (b.isStatic()) {\n continue;\n }\n\n // Update fixtures (for broad-phase).\n b.synchronizeFixtures();\n }\n // Look for new contacts.\n this.findNewContacts();\n }\n\n // Handle TOI events.\n if (this.m_continuousPhysics && timeStep > 0.0) {\n this.m_solver.solveWorldTOI(this.s_step);\n }\n\n if (this.m_clearForces) {\n this.clearForces();\n }\n\n this.m_locked = false;\n\n this.publish('post-step', timeStep);\n }\n\n /**\n * @internal\n * Call this method to find new contacts.\n */\n findNewContacts(): void {\n this.m_broadPhase.updatePairs(this.createContact);\n }\n\n /**\n * @internal\n * Callback for broad-phase.\n */\n createContact = (proxyA: FixtureProxy, proxyB: FixtureProxy): void => {\n const fixtureA = proxyA.fixture;\n const fixtureB = proxyB.fixture;\n\n const indexA = proxyA.childIndex;\n const indexB = proxyB.childIndex;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Are the fixtures on the same body?\n if (bodyA == bodyB) {\n return;\n }\n\n // TODO_ERIN use a hash table to remove a potential bottleneck when both\n // bodies have a lot of contacts.\n // Does a contact already exist?\n let edge = bodyB.getContactList(); // ContactEdge\n while (edge) {\n if (edge.other == bodyA) {\n const fA = edge.contact.getFixtureA();\n const fB = edge.contact.getFixtureB();\n const iA = edge.contact.getChildIndexA();\n const iB = edge.contact.getChildIndexB();\n\n if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) {\n // A contact already exists.\n return;\n }\n\n if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) {\n // A contact already exists.\n return;\n }\n }\n\n edge = edge.next;\n }\n\n if (bodyB.shouldCollide(bodyA) == false) {\n return;\n }\n if (fixtureB.shouldCollide(fixtureA) == false) {\n return;\n }\n\n // Call the factory.\n const contact = Contact.create(fixtureA, indexA, fixtureB, indexB);\n if (contact == null) {\n return;\n }\n\n // Insert into the world.\n contact.m_prev = null;\n if (this.m_contactList != null) {\n contact.m_next = this.m_contactList;\n this.m_contactList.m_prev = contact;\n }\n this.m_contactList = contact;\n\n ++this.m_contactCount;\n }\n\n /**\n * @internal\n * Removes old non-overlapping contacts, applies filters and updates contacts.\n */\n updateContacts(): void {\n // Update awake contacts.\n let c;\n let next_c = this.m_contactList;\n while (c = next_c) {\n next_c = c.getNext();\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Is this contact flagged for filtering?\n if (c.m_filterFlag) {\n if (bodyB.shouldCollide(bodyA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n if (fixtureB.shouldCollide(fixtureA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n // Clear the filtering flag.\n c.m_filterFlag = false;\n }\n\n const activeA = bodyA.isAwake() && !bodyA.isStatic();\n const activeB = bodyB.isAwake() && !bodyB.isStatic();\n\n // At least one body must be awake and it must be dynamic or kinematic.\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const proxyIdA = fixtureA.m_proxies[indexA].proxyId;\n const proxyIdB = fixtureB.m_proxies[indexB].proxyId;\n const overlap = this.m_broadPhase.testOverlap(proxyIdA, proxyIdB);\n\n // Here we destroy contacts that cease to overlap in the broad-phase.\n if (overlap == false) {\n this.destroyContact(c);\n continue;\n }\n\n // The contact persists.\n c.update(this);\n }\n }\n\n /**\n * @internal\n */\n destroyContact(contact: Contact): void {\n Contact.destroy(contact, this);\n\n // Remove from the world.\n if (contact.m_prev) {\n contact.m_prev.m_next = contact.m_next;\n }\n if (contact.m_next) {\n contact.m_next.m_prev = contact.m_prev;\n }\n if (contact == this.m_contactList) {\n this.m_contactList = contact.m_next;\n }\n\n --this.m_contactCount;\n }\n\n\n /**\n * Called when two fixtures begin to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'begin-contact', listener: (contact: Contact) => void): World;\n /**\n * Called when two fixtures cease to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'end-contact', listener: (contact: Contact) => void): World;\n /**\n * This is called after a contact is updated. This allows you to inspect a\n * contact before it goes to the solver. If you are careful, you can modify the\n * contact manifold (e.g. disable contact). A copy of the old manifold is\n * provided so that you can detect changes. Note: this is called only for awake\n * bodies. Note: this is called even when the number of contact points is zero.\n * Note: this is not called for sensors. Note: if you set the number of contact\n * points to zero, you will not get an endContact callback. However, you may get\n * a beginContact callback the next step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n /**\n * This lets you inspect a contact after the solver is finished. This is useful\n * for inspecting impulses. Note: the contact manifold does not include time of\n * impact impulses, which can be arbitrarily large if the sub-step is small.\n * Hence the impulse is provided explicitly in a separate data structure. Note:\n * this is only called for contacts that are touching, solid, and awake.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n /** Listener is called whenever a body is removed. */\n on(name: 'remove-body', listener: (body: Body) => void): World;\n /** Listener is called whenever a joint is removed implicitly or explicitly. */\n on(name: 'remove-joint', listener: (joint: Joint) => void): World;\n /** Listener is called whenever a fixture is removed implicitly or explicitly. */\n on(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Register an event listener.\n */\n // tslint:disable-next-line:typedef\n on(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n if (!this._listeners) {\n this._listeners = {};\n }\n if (!this._listeners[name]) {\n this._listeners[name] = [];\n }\n this._listeners[name].push(listener);\n return this;\n }\n\n off(name: 'begin-contact', listener: (contact: Contact) => void): World;\n off(name: 'end-contact', listener: (contact: Contact) => void): World;\n off(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n off(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n off(name: 'remove-body', listener: (body: Body) => void): World;\n off(name: 'remove-joint', listener: (joint: Joint) => void): World;\n off(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Remove an event listener.\n */\n // tslint:disable-next-line:typedef\n off(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return this;\n }\n const index = listeners.indexOf(listener);\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n publish(name: string, arg1?: any, arg2?: any, arg3?: any): number {\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return 0;\n }\n for (let l = 0; l < listeners.length; l++) {\n listeners[l].call(this, arg1, arg2, arg3);\n }\n return listeners.length;\n }\n\n /**\n * @internal\n */\n beginContact(contact: Contact): void {\n this.publish('begin-contact', contact);\n }\n\n /**\n * @internal\n */\n endContact(contact: Contact): void {\n this.publish('end-contact', contact);\n }\n\n /**\n * @internal\n */\n preSolve(contact: Contact, oldManifold: Manifold): void {\n this.publish('pre-solve', contact, oldManifold);\n }\n\n /**\n * @internal\n */\n postSolve(contact: Contact, impulse: ContactImpulse): void {\n this.publish('post-solve', contact, impulse);\n }\n\n /**\n * Joints and fixtures are destroyed when their associated body is destroyed.\n * Register a destruction listener so that you may nullify references to these\n * joints and shapes.\n *\n * `function(object)` is called when any joint or fixture is about to\n * be destroyed due to the destruction of one of its attached or parent bodies.\n */\n\n /**\n * Register a contact filter to provide specific control over collision.\n * Otherwise the default filter is used (defaultFilter). The listener is owned\n * by you and must remain in scope.\n *\n * Moved to Fixture.\n */\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Math from './Math';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport default class Vec3 {\n x: number;\n y: number;\n z: number;\n\n constructor(x: number, y: number, z: number);\n constructor(obj: { x: number, y: number, z: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?, z?) {\n if (!(this instanceof Vec3)) {\n return new Vec3(x, y, z);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n this.z = x.z;\n } else {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n _ASSERT && Vec3.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y,\n z: this.z\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = data.x;\n obj.y = data.y;\n obj.z = data.z;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number, z: number): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = x;\n obj.y = y;\n obj.z = z;\n return obj;\n }\n\n static zero(): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = 0;\n obj.y = 0;\n obj.z = 0;\n return obj;\n }\n\n static clone(v: Vec3): Vec3 {\n _ASSERT && Vec3.assert(v);\n return Vec3.neo(v.x, v.y, v.z);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y) && Math.isFinite(obj.z);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Vec3.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Vec3!');\n }\n }\n\n setZero(): Vec3 {\n this.x = 0.0;\n this.y = 0.0;\n this.z = 0.0;\n return this;\n }\n\n set(x: number, y: number, z: number): Vec3 {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n\n add(w: Vec3): Vec3 {\n this.x += w.x;\n this.y += w.y;\n this.z += w.z;\n return this;\n }\n\n sub(w: Vec3): Vec3 {\n this.x -= w.x;\n this.y -= w.y;\n this.z -= w.z;\n return this;\n }\n\n mul(m: number): Vec3 {\n this.x *= m;\n this.y *= m;\n this.z *= m;\n return this;\n }\n\n static areEqual(v: Vec3, w: Vec3): boolean {\n _ASSERT && Vec3.assert(v);\n _ASSERT && Vec3.assert(w);\n return v === w ||\n typeof v === 'object' && v !== null &&\n typeof w === 'object' && w !== null &&\n v.x === w.x && v.y === w.y && v.z === w.z;\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec3, w: Vec3): number {\n return v.x * w.x + v.y * w.y + v.z * w.z;\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static cross(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(\n v.y * w.z - v.z * w.y,\n v.z * w.x - v.x * w.z,\n v.x * w.y - v.y * w.x\n );\n }\n\n static add(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x + w.x, v.y + w.y, v.z + w.z);\n }\n\n static sub(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x - w.x, v.y - w.y, v.z - w.z);\n }\n\n static mul(v: Vec3, m: number): Vec3 {\n return new Vec3(m * v.x, m * v.y, m * v.z);\n }\n\n neg(): Vec3 {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n }\n\n static neg(v: Vec3): Vec3 {\n return new Vec3(-v.x, -v.y, -v.z);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../../Settings';\nimport Shape from '../Shape';\nimport Transform from '../../common/Transform';\nimport Rot from '../../common/Rot';\nimport Vec2 from '../../common/Vec2';\nimport AABB, { RayCastInput, RayCastOutput } from '../AABB';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n/**\n * A line segment (edge) shape. These can be connected in chains or loops to\n * other edge shapes. The connectivity information is used to ensure correct\n * contact normals.\n */\nexport default class EdgeShape extends Shape {\n static TYPE = 'edge' as const;\n\n // These are the edge vertices\n m_vertex1: Vec2;\n m_vertex2: Vec2;\n\n // Optional adjacent vertices. These are used for smooth collision.\n // Used by chain shape.\n m_vertex0: Vec2;\n m_vertex3: Vec2;\n m_hasVertex0: boolean;\n m_hasVertex3: boolean;\n\n constructor(v1?: Vec2, v2?: Vec2) {\n // @ts-ignore\n if (!(this instanceof EdgeShape)) {\n return new EdgeShape(v1, v2);\n }\n\n super();\n\n this.m_type = EdgeShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n\n\n this.m_vertex1 = v1 ? Vec2.clone(v1) : Vec2.zero();\n this.m_vertex2 = v2 ? Vec2.clone(v2) : Vec2.zero();\n\n this.m_vertex0 = Vec2.zero();\n this.m_vertex3 = Vec2.zero();\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertex1: this.m_vertex1,\n vertex2: this.m_vertex2,\n\n vertex0: this.m_vertex0,\n vertex3: this.m_vertex3,\n hasVertex0: this.m_hasVertex0,\n hasVertex3: this.m_hasVertex3,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): EdgeShape {\n const shape = new EdgeShape(data.vertex1, data.vertex2);\n if (shape.m_hasVertex0) {\n shape.setPrevVertex(data.vertex0);\n }\n if (shape.m_hasVertex3) {\n shape.setNextVertex(data.vertex3);\n }\n return shape;\n }\n\n /** @internal @deprecated */\n setNext(v?: Vec2): EdgeShape {\n return this.setNextVertex(v);\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n setNextVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex3.setVec2(v);\n this.m_hasVertex3 = true;\n } else {\n this.m_vertex3.setZero();\n this.m_hasVertex3 = false;\n }\n return this;\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n getNextVertex(): Vec2 {\n return this.m_vertex3;\n }\n\n /** @internal @deprecated */\n setPrev(v?: Vec2): EdgeShape {\n return this.setPrevVertex(v);\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n setPrevVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex0.setVec2(v);\n this.m_hasVertex0 = true;\n } else {\n this.m_vertex0.setZero();\n this.m_hasVertex0 = false;\n }\n return this;\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n getPrevVertex(): Vec2 {\n return this.m_vertex0;\n }\n\n /**\n * Set this as an isolated edge.\n */\n _set(v1: Vec2, v2: Vec2): EdgeShape {\n this.m_vertex1.setVec2(v1);\n this.m_vertex2.setVec2(v2);\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): EdgeShape {\n const clone = new EdgeShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_vertex1.setVec2(this.m_vertex1);\n clone.m_vertex2.setVec2(this.m_vertex2);\n clone.m_vertex0.setVec2(this.m_vertex0);\n clone.m_vertex3.setVec2(this.m_vertex3);\n clone.m_hasVertex0 = this.m_hasVertex0;\n clone.m_hasVertex3 = this.m_hasVertex3;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // p = p1 + t * d\n // v = v1 + s * e\n // p1 + t * d = v1 + s * e\n // s * e - t * d = p1 - v1\n\n // NOT_USED(childIndex);\n\n // Put the ray into the edge's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n const v1 = this.m_vertex1;\n const v2 = this.m_vertex2;\n const e = Vec2.sub(v2, v1);\n const normal = Vec2.neo(e.y, -e.x);\n normal.normalize();\n\n // q = p1 + t * d\n // dot(normal, q - v1) = 0\n // dot(normal, p1 - v1) + t * dot(normal, d) = 0\n const numerator = Vec2.dot(normal, Vec2.sub(v1, p1));\n const denominator = Vec2.dot(normal, d);\n\n if (denominator == 0.0) {\n return false;\n }\n\n const t = numerator / denominator;\n if (t < 0.0 || input.maxFraction < t) {\n return false;\n }\n\n const q = Vec2.add(p1, Vec2.mulNumVec2(t, d));\n\n // q = v1 + s * r\n // s = dot(q - v1, r) / dot(r, r)\n const r = Vec2.sub(v2, v1);\n const rr = Vec2.dot(r, r);\n if (rr == 0.0) {\n return false;\n }\n\n const s = Vec2.dot(Vec2.sub(q, v1), r) / rr;\n if (s < 0.0 || 1.0 < s) {\n return false;\n }\n\n output.fraction = t;\n if (numerator > 0.0) {\n output.normal = Rot.mulVec2(xf.q, normal).neg();\n } else {\n output.normal = Rot.mulVec2(xf.q, normal);\n }\n return true;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const v1 = Transform.mulVec2(xf, this.m_vertex1);\n const v2 = Transform.mulVec2(xf, this.m_vertex2);\n\n aabb.combinePoints(v1, v2);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center.setCombine(0.5, this.m_vertex1, 0.5, this.m_vertex2);\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_vertex1);\n proxy.m_vertices.push(this.m_vertex2);\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport AABB, { RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport common from '../../util/common';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Settings from '../../Settings';\nimport Shape from '../Shape';\nimport EdgeShape from './EdgeShape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A chain shape is a free form sequence of line segments. The chain has\n * two-sided collision, so you can use inside and outside collision. Therefore,\n * you may use any winding order. Connectivity information is used to create\n * smooth collisions.\n *\n * WARNING: The chain will not collide properly if there are self-intersections.\n */\nexport default class ChainShape extends Shape {\n static TYPE = 'chain' as const;\n\n m_vertices: Vec2[];\n m_count: number;\n m_prevVertex: Vec2 | null;\n m_nextVertex: Vec2 | null;\n m_hasPrevVertex: boolean;\n m_hasNextVertex: boolean;\n\n m_isLoop: boolean;\n\n constructor(vertices?: Vec2[], loop?: boolean) {\n // @ts-ignore\n if (!(this instanceof ChainShape)) {\n return new ChainShape(vertices, loop);\n }\n\n super();\n\n this.m_type = ChainShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_vertices = [];\n this.m_count = 0;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n\n this.m_isLoop = !!loop;\n\n if (vertices && vertices.length) {\n if (loop) {\n this._createLoop(vertices);\n } else {\n this._createChain(vertices);\n }\n }\n }\n\n /** @internal */\n _serialize(): object {\n const data = {\n type: this.m_type,\n vertices: this.m_vertices,\n isLoop: this.m_isLoop,\n hasPrevVertex: this.m_hasPrevVertex,\n hasNextVertex: this.m_hasNextVertex,\n prevVertex: null as Vec2 | null,\n nextVertex: null as Vec2 | null,\n };\n if (this.m_prevVertex) {\n data.prevVertex = this.m_prevVertex;\n }\n if (this.m_nextVertex) {\n data.nextVertex = this.m_nextVertex;\n }\n return data;\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): ChainShape {\n const vertices = [] as Vec2[];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n const shape = new ChainShape(vertices, data.isLoop);\n if (data.prevVertex) {\n shape.setPrevVertex(data.prevVertex);\n }\n if (data.nextVertex) {\n shape.setNextVertex(data.nextVertex);\n }\n return shape;\n }\n\n // clear() {\n // this.m_vertices.length = 0;\n // this.m_count = 0;\n // }\n\n /**\n * @internal\n * Create a loop. This automatically adjusts connectivity.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createLoop(vertices: Vec2[]): ChainShape {\n _ASSERT && common.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && common.assert(vertices.length >= 3);\n for (let i = 1; i < vertices.length; ++i) {\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n // If the code crashes here, it means your vertices are too close together.\n _ASSERT && common.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_vertices = [];\n this.m_count = vertices.length + 1;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n this.m_vertices[vertices.length] = Vec2.clone(vertices[0]);\n\n this.m_prevVertex = this.m_vertices[this.m_count - 2];\n this.m_nextVertex = this.m_vertices[1];\n this.m_hasPrevVertex = true;\n this.m_hasNextVertex = true;\n return this;\n }\n\n /**\n * @internal\n * Create a chain with isolated end vertices.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createChain(vertices: Vec2[]): ChainShape {\n _ASSERT && common.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && common.assert(vertices.length >= 2);\n for (let i = 1; i < vertices.length; ++i) {\n // If the code crashes here, it means your vertices are too close together.\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n _ASSERT && common.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_count = vertices.length;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n return this;\n }\n\n /** @internal */\n _reset(): void {\n if (this.m_isLoop) {\n this._createLoop(this.m_vertices);\n } else {\n this._createChain(this.m_vertices);\n }\n }\n\n /**\n * Establish connectivity to a vertex that precedes the first vertex. Don't call\n * this for loops.\n */\n setPrevVertex(prevVertex: Vec2): void {\n this.m_prevVertex = prevVertex;\n this.m_hasPrevVertex = true;\n }\n\n getPrevVertex(): Vec2 {\n return this.m_prevVertex;\n }\n\n /**\n * Establish connectivity to a vertex that follows the last vertex. Don't call\n * this for loops.\n */\n setNextVertex(nextVertex: Vec2): void {\n this.m_nextVertex = nextVertex;\n this.m_hasNextVertex = true;\n }\n\n getNextVertex(): Vec2 {\n return this.m_nextVertex;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): ChainShape {\n const clone = new ChainShape();\n clone._createChain(this.m_vertices);\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_prevVertex = this.m_prevVertex;\n clone.m_nextVertex = this.m_nextVertex;\n clone.m_hasPrevVertex = this.m_hasPrevVertex;\n clone.m_hasNextVertex = this.m_hasNextVertex;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): number {\n // edge count = vertex count - 1\n return this.m_count - 1;\n }\n\n // Get a child edge.\n getChildEdge(edge: EdgeShape, childIndex: number): void {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count - 1);\n edge.m_type = EdgeShape.TYPE;\n edge.m_radius = this.m_radius;\n\n edge.m_vertex1 = this.m_vertices[childIndex];\n edge.m_vertex2 = this.m_vertices[childIndex + 1];\n\n if (childIndex > 0) {\n edge.m_vertex0 = this.m_vertices[childIndex - 1];\n edge.m_hasVertex0 = true;\n } else {\n edge.m_vertex0 = this.m_prevVertex;\n edge.m_hasVertex0 = this.m_hasPrevVertex;\n }\n\n if (childIndex < this.m_count - 2) {\n edge.m_vertex3 = this.m_vertices[childIndex + 2];\n edge.m_hasVertex3 = true;\n } else {\n edge.m_vertex3 = this.m_nextVertex;\n edge.m_hasVertex3 = this.m_hasNextVertex;\n }\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && common.assert(0 <= index && index <= this.m_count);\n if (index < this.m_count) {\n return this.m_vertices[index];\n } else {\n return this.m_vertices[0];\n }\n }\n\n isLoop(): boolean {\n return this.m_isLoop;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * This always return false.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count);\n\n const edgeShape = new EdgeShape(this.getVertex(childIndex), this.getVertex(childIndex + 1));\n return edgeShape.rayCast(output, input, xf, 0);\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count);\n\n const v1 = Transform.mulVec2(xf, this.getVertex(childIndex));\n const v2 = Transform.mulVec2(xf, this.getVertex(childIndex + 1));\n\n aabb.combinePoints(v1, v2);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * Chains have zero mass.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center = Vec2.zero();\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count);\n proxy.m_buffer[0] = this.getVertex(childIndex);\n proxy.m_buffer[1] = this.getVertex(childIndex + 1);\n proxy.m_vertices = proxy.m_buffer;\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport AABB, { RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport common from '../../util/common';\nimport Math from '../../common/Math';\nimport Transform from '../../common/Transform';\nimport Rot from '../../common/Rot';\nimport Vec2 from '../../common/Vec2';\nimport Settings from '../../Settings';\nimport Shape from '../Shape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A convex polygon. It is assumed that the interior of the polygon is to the\n * left of each edge. Polygons have a maximum number of vertices equal to\n * Settings.maxPolygonVertices. In most cases you should not need many vertices\n * for a convex polygon. extends Shape\n */\nexport default class PolygonShape extends Shape {\n static TYPE = 'polygon' as const;\n\n m_centroid: Vec2;\n m_vertices: Vec2[]; // [Settings.maxPolygonVertices]\n m_normals: Vec2[]; // [Settings.maxPolygonVertices]\n m_count: number;\n\n // @ts-ignore\n constructor(vertices?: Vec2[]) {\n // @ts-ignore\n if (!(this instanceof PolygonShape)) {\n return new PolygonShape(vertices);\n }\n\n super();\n\n this.m_type = PolygonShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_centroid = Vec2.zero();\n this.m_vertices = [];\n this.m_normals = [];\n this.m_count = 0;\n\n if (vertices && vertices.length) {\n this._set(vertices);\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertices: this.m_vertices,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): PolygonShape {\n const vertices = [] as Vec2[];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n\n const shape = new PolygonShape(vertices);\n return shape;\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && common.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): PolygonShape {\n const clone = new PolygonShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_count = this.m_count;\n clone.m_centroid.setVec2(this.m_centroid);\n for (let i = 0; i < this.m_count; i++) {\n clone.m_vertices.push(this.m_vertices[i].clone());\n }\n for (let i = 0; i < this.m_normals.length; i++) {\n clone.m_normals.push(this.m_normals[i].clone());\n }\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /** @internal */\n _reset(): void {\n this._set(this.m_vertices);\n }\n\n /**\n * @internal\n *\n * Create a convex hull from the given array of local points. The count must be\n * in the range [3, Settings.maxPolygonVertices].\n *\n * Warning: the points may be re-ordered, even if they form a convex polygon\n * Warning: collinear points are handled but not removed. Collinear points may\n * lead to poor stacking behavior.\n */\n _set(vertices: Vec2[]): void {\n _ASSERT && common.assert(3 <= vertices.length && vertices.length <= Settings.maxPolygonVertices);\n if (vertices.length < 3) {\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n let n = Math.min(vertices.length, Settings.maxPolygonVertices);\n\n // Perform welding and copy vertices into local buffer.\n const ps = [] as Vec2[]; // [Settings.maxPolygonVertices];\n for (let i = 0; i < n; ++i) {\n const v = vertices[i];\n\n let unique = true;\n for (let j = 0; j < ps.length; ++j) {\n if (Vec2.distanceSquared(v, ps[j]) < 0.25 * Settings.linearSlopSquared) {\n unique = false;\n break;\n }\n }\n\n if (unique) {\n ps.push(v);\n }\n }\n\n n = ps.length;\n if (n < 3) {\n // Polygon is degenerate.\n _ASSERT && common.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n // Create the convex hull using the Gift wrapping algorithm\n // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm\n\n // Find the right most point on the hull (in case of multiple points bottom most is used)\n let i0 = 0;\n let x0 = ps[0].x;\n for (let i = 1; i < n; ++i) {\n const x = ps[i].x;\n if (x > x0 || (x === x0 && ps[i].y < ps[i0].y)) {\n i0 = i;\n x0 = x;\n }\n }\n\n const hull = [] as number[]; // [Settings.maxPolygonVertices];\n let m = 0;\n let ih = i0;\n\n while (true) {\n hull[m] = ih;\n\n let ie = 0;\n for (let j = 1; j < n; ++j) {\n if (ie === ih) {\n ie = j;\n continue;\n }\n\n const r = Vec2.sub(ps[ie], ps[hull[m]]);\n const v = Vec2.sub(ps[j], ps[hull[m]]);\n const c = Vec2.crossVec2Vec2(r, v);\n // c < 0 means counter-clockwise wrapping, c > 0 means clockwise wrapping\n if (c < 0.0) {\n ie = j;\n }\n\n // Collinearity check\n if (c === 0.0 && v.lengthSquared() > r.lengthSquared()) {\n ie = j;\n }\n }\n\n ++m;\n ih = ie;\n\n if (ie === i0) {\n break;\n }\n }\n\n if (m < 3) {\n // Polygon is degenerate.\n _ASSERT && common.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n this.m_count = m;\n\n // Copy vertices.\n this.m_vertices = [];\n for (let i = 0; i < m; ++i) {\n this.m_vertices[i] = ps[hull[i]];\n }\n\n // Compute normals. Ensure the edges have non-zero length.\n for (let i = 0; i < m; ++i) {\n const i1 = i;\n const i2 = i + 1 < m ? i + 1 : 0;\n const edge = Vec2.sub(this.m_vertices[i2], this.m_vertices[i1]);\n _ASSERT && common.assert(edge.lengthSquared() > Math.EPSILON * Math.EPSILON);\n this.m_normals[i] = Vec2.crossVec2Num(edge, 1.0);\n this.m_normals[i].normalize();\n }\n\n // Compute the polygon centroid.\n this.m_centroid = ComputeCentroid(this.m_vertices, m);\n }\n\n /** @internal */\n _setAsBox(hx: number, hy: number, center?: Vec2, angle?: number): void {\n // start with right-bottom, counter-clockwise, as in Gift wrapping algorithm in PolygonShape._set()\n this.m_vertices[0] = Vec2.neo(hx, -hy);\n this.m_vertices[1] = Vec2.neo(hx, hy);\n this.m_vertices[2] = Vec2.neo(-hx, hy);\n this.m_vertices[3] = Vec2.neo(-hx, -hy);\n\n this.m_normals[0] = Vec2.neo(1.0, 0.0);\n this.m_normals[1] = Vec2.neo(0.0, 1.0);\n this.m_normals[2] = Vec2.neo(-1.0, 0.0);\n this.m_normals[3] = Vec2.neo(0.0, -1.0);\n\n this.m_count = 4;\n\n if (Vec2.isValid(center)) {\n angle = angle || 0;\n\n this.m_centroid.setVec2(center);\n\n const xf = Transform.identity();\n xf.p.setVec2(center);\n xf.q.setAngle(angle);\n\n // Transform vertices and normals.\n for (let i = 0; i < this.m_count; ++i) {\n this.m_vertices[i] = Transform.mulVec2(xf, this.m_vertices[i]);\n this.m_normals[i] = Rot.mulVec2(xf.q, this.m_normals[i]);\n }\n }\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): boolean {\n const pLocal = Rot.mulTVec2(xf.q, Vec2.sub(p, xf.p));\n\n for (let i = 0; i < this.m_count; ++i) {\n const dot = Vec2.dot(this.m_normals[i], Vec2.sub(pLocal, this.m_vertices[i]));\n if (dot > 0.0) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n\n // Put the ray into the polygon's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n let lower = 0.0;\n let upper = input.maxFraction;\n\n let index = -1;\n\n for (let i = 0; i < this.m_count; ++i) {\n // p = p1 + a * d\n // dot(normal, p - v) = 0\n // dot(normal, p1 - v) + a * dot(normal, d) = 0\n const numerator = Vec2.dot(this.m_normals[i], Vec2.sub(this.m_vertices[i], p1));\n const denominator = Vec2.dot(this.m_normals[i], d);\n\n if (denominator == 0.0) {\n if (numerator < 0.0) {\n return false;\n }\n } else {\n // Note: we want this predicate without division:\n // lower < numerator / denominator, where denominator < 0\n // Since denominator < 0, we have to flip the inequality:\n // lower < numerator / denominator <==> denominator * lower > numerator.\n if (denominator < 0.0 && numerator < lower * denominator) {\n // Increase lower.\n // The segment enters this half-space.\n lower = numerator / denominator;\n index = i;\n } else if (denominator > 0.0 && numerator < upper * denominator) {\n // Decrease upper.\n // The segment exits this half-space.\n upper = numerator / denominator;\n }\n }\n\n // The use of epsilon here causes the assert on lower to trip\n // in some cases. Apparently the use of epsilon was to make edge\n // shapes work, but now those are handled separately.\n // if (upper < lower - Math.EPSILON)\n if (upper < lower) {\n return false;\n }\n }\n\n _ASSERT && common.assert(0.0 <= lower && lower <= input.maxFraction);\n\n if (index >= 0) {\n output.fraction = lower;\n output.normal = Rot.mulVec2(xf.q, this.m_normals[index]);\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < this.m_count; ++i) {\n const v = Transform.mulVec2(xf, this.m_vertices[i]);\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, v.y);\n maxY = Math.max(maxY, v.y);\n }\n\n aabb.lowerBound.setNum(minX, minY);\n aabb.upperBound.setNum(maxX, maxY);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n // Polygon mass, centroid, and inertia.\n // Let rho be the polygon density in mass per unit area.\n // Then:\n // mass = rho * int(dA)\n // centroid.x = (1/mass) * rho * int(x * dA)\n // centroid.y = (1/mass) * rho * int(y * dA)\n // I = rho * int((x*x + y*y) * dA)\n //\n // We can compute these integrals by summing all the integrals\n // for each triangle of the polygon. To evaluate the integral\n // for a single triangle, we make a change of variables to\n // the (u,v) coordinates of the triangle:\n // x = x0 + e1x * u + e2x * v\n // y = y0 + e1y * u + e2y * v\n // where 0 <= u && 0 <= v && u + v <= 1.\n //\n // We integrate u from [0,1-v] and then v from [0,1].\n // We also need to use the Jacobian of the transformation:\n // D = cross(e1, e2)\n //\n // Simplification: triangle centroid = (1/3) * (p1 + p2 + p3)\n //\n // The rest of the derivation is handled by computer algebra.\n\n _ASSERT && common.assert(this.m_count >= 3);\n\n const center = Vec2.zero();\n let area = 0.0;\n let I = 0.0;\n\n // s is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const s = Vec2.zero();\n\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < this.m_count; ++i) {\n s.add(this.m_vertices[i]);\n }\n s.mul(1.0 / this.m_count);\n\n const k_inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < this.m_count; ++i) {\n // Triangle vertices.\n const e1 = Vec2.sub(this.m_vertices[i], s);\n const e2 = i + 1 < this.m_count ? Vec2.sub(this.m_vertices[i + 1], s) : Vec2 .sub(this.m_vertices[0], s);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n center.addCombine(triangleArea * k_inv3, e1, triangleArea * k_inv3, e2);\n\n const ex1 = e1.x;\n const ey1 = e1.y;\n const ex2 = e2.x;\n const ey2 = e2.y;\n\n const intx2 = ex1 * ex1 + ex2 * ex1 + ex2 * ex2;\n const inty2 = ey1 * ey1 + ey2 * ey1 + ey2 * ey2;\n\n I += (0.25 * k_inv3 * D) * (intx2 + inty2);\n }\n\n // Total mass\n massData.mass = density * area;\n\n // Center of mass\n _ASSERT && common.assert(area > Math.EPSILON);\n center.mul(1.0 / area);\n massData.center.setCombine(1, center, 1, s);\n\n // Inertia tensor relative to the local origin (point s).\n massData.I = density * I;\n\n // Shift to center of mass then to original body origin.\n massData.I += massData.mass * (Vec2.dot(massData.center, massData.center) - Vec2.dot(center, center));\n }\n\n /**\n * Validate convexity. This is a very time consuming operation.\n * @returns true if valid\n */\n validate(): boolean {\n for (let i = 0; i < this.m_count; ++i) {\n const i1 = i;\n const i2 = i < this.m_count - 1 ? i1 + 1 : 0;\n const p = this.m_vertices[i1];\n const e = Vec2.sub(this.m_vertices[i2], p);\n\n for (let j = 0; j < this.m_count; ++j) {\n if (j == i1 || j == i2) {\n continue;\n }\n\n const v = Vec2.sub(this.m_vertices[j], p);\n const c = Vec2.crossVec2Vec2(e, v);\n if (c < 0.0) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices = this.m_vertices;\n proxy.m_count = this.m_count;\n proxy.m_radius = this.m_radius;\n }\n}\n\nfunction ComputeCentroid(vs: Vec2[], count: number): Vec2 {\n _ASSERT && common.assert(count >= 3);\n\n const c = Vec2.zero();\n let area = 0.0;\n\n // pRef is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const pRef = Vec2.zero();\n if (false) {\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < count; ++i) {\n pRef.add(vs[i]);\n }\n pRef.mul(1.0 / count);\n }\n\n const inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < count; ++i) {\n // Triangle vertices.\n const p1 = pRef;\n const p2 = vs[i];\n const p3 = i + 1 < count ? vs[i + 1] : vs[0];\n\n const e1 = Vec2.sub(p2, p1);\n const e2 = Vec2.sub(p3, p1);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n c.addMul(triangleArea * inv3, p1);\n c.addMul(triangleArea * inv3, p2);\n c.addMul(triangleArea * inv3, p3);\n }\n\n // Centroid\n _ASSERT && common.assert(area > Math.EPSILON);\n c.mul(1.0 / area);\n return c;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type Vec2 from '../../common/Vec2';\nimport PolygonShape from './PolygonShape';\n\n/**\n * A rectangle polygon which extend PolygonShape.\n */\nexport default class BoxShape extends PolygonShape {\n static TYPE = 'polygon' as const;\n\n constructor(hx: number, hy: number, center?: Vec2, angle?: number) {\n // @ts-ignore\n if (!(this instanceof BoxShape)) {\n return new BoxShape(hx, hy, center, angle);\n }\n\n super();\n\n this._setAsBox(hx, hy, center, angle);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Math from '../../common/Math';\nimport Rot from '../../common/Rot';\nimport Vec2 from '../../common/Vec2';\nimport Shape from '../Shape';\nimport AABB, { RayCastInput, RayCastOutput } from '../AABB';\nimport Transform from '../../common/Transform';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport default class CircleShape extends Shape {\n static TYPE = 'circle' as const;\n\n m_p: Vec2;\n\n constructor(position: Vec2, radius?: number);\n constructor(radius?: number);\n // tslint:disable-next-line:typedef\n constructor(a, b?) {\n // @ts-ignore\n if (!(this instanceof CircleShape)) {\n return new CircleShape(a, b);\n }\n\n super();\n\n this.m_type = CircleShape.TYPE;\n this.m_p = Vec2.zero();\n this.m_radius = 1;\n\n if (typeof a === 'object' && Vec2.isValid(a)) {\n this.m_p.setVec2(a);\n\n if (typeof b === 'number') {\n this.m_radius = b;\n }\n\n } else if (typeof a === 'number') {\n this.m_radius = a;\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n p: this.m_p,\n radius: this.m_radius,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): CircleShape {\n return new CircleShape(data.p, data.radius);\n }\n\n // TODO: already defined in Shape\n getRadius(): number {\n return this.m_radius;\n }\n\n getCenter(): Vec2 {\n return this.m_p;\n }\n\n getVertex(index: 0): Vec2 {\n _ASSERT && common.assert(index == 0);\n return this.m_p;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): CircleShape {\n const clone = new CircleShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_p = this.m_p.clone();\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): boolean {\n const center = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const d = Vec2.sub(p, center);\n return Vec2.dot(d, d) <= this.m_radius * this.m_radius;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // Collision Detection in Interactive 3D Environments by Gino van den Bergen\n // From Section 3.1.2\n // x = s + a * r\n // norm(x) = radius\n\n const position = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const s = Vec2.sub(input.p1, position);\n const b = Vec2.dot(s, s) - this.m_radius * this.m_radius;\n\n // Solve quadratic equation.\n const r = Vec2.sub(input.p2, input.p1);\n const c = Vec2.dot(s, r);\n const rr = Vec2.dot(r, r);\n const sigma = c * c - rr * b;\n\n // Check for negative discriminant and short segment.\n if (sigma < 0.0 || rr < Math.EPSILON) {\n return false;\n }\n\n // Find the point of intersection of the line with the circle.\n let a = -(c + Math.sqrt(sigma));\n\n // Is the intersection point on the segment?\n if (0.0 <= a && a <= input.maxFraction * rr) {\n a /= rr;\n output.fraction = a;\n output.normal = Vec2.add(s, Vec2.mulNumVec2(a, r));\n output.normal.normalize();\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const p = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n aabb.lowerBound.setNum(p.x - this.m_radius, p.y - this.m_radius);\n aabb.upperBound.setNum(p.x + this.m_radius, p.y + this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n massData.mass = density * Math.PI * this.m_radius * this.m_radius;\n massData.center = this.m_p;\n // inertia about the local origin\n massData.I = massData.mass\n * (0.5 * this.m_radius * this.m_radius + Vec2.dot(this.m_p, this.m_p));\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_p);\n proxy.m_count = 1;\n proxy.m_radius = this.m_radius;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. A value of 0 disables softness.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * Distance length.\n */\n length?: number;\n}\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointDef extends JointDef, DistanceJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0\n};\n\n/**\n * A distance joint constrains two points on two bodies to remain at a fixed\n * distance from each other. You can view this as a massless, rigid rod.\n *\n * @param anchorA Anchor A in global coordination.\n * @param anchorB Anchor B in global coordination.\n */\nexport default class DistanceJoint extends Joint {\n static TYPE = 'distance-joint' as const;\n\n // Solver shared\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_length: number;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_gamma: number;\n /** @internal */ m_bias: number;\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: DistanceJointDef);\n constructor(def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2);\n constructor(def: DistanceJointDef, bodyA?: Body, bodyB?: Body, anchorA?: Vec2, anchorB?: Vec2) {\n // @ts-ignore\n if (!(this instanceof DistanceJoint)) {\n return new DistanceJoint(def, bodyA, bodyB, anchorA, anchorB);\n }\n\n // order of constructor arguments is changed in v0.2\n if (bodyB && anchorA && ('m_type' in anchorA) && ('x' in bodyB) && ('y' in bodyB)) {\n const temp = bodyB;\n bodyB = anchorA;\n anchorA = temp;\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = DistanceJoint.TYPE;\n\n // Solver shared\n this.m_localAnchorA = Vec2.clone(anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.zero());\n this.m_length = Math.isFinite(def.length) ? def.length :\n Vec2.distance(bodyA.getWorldPoint(this.m_localAnchorA), bodyB.getWorldPoint(this.m_localAnchorB));\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n this.m_impulse = 0.0;\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n\n // 1-D constrained system\n // m (v2 - v1) = lambda\n // v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass.\n // x2 = x1 + h * v2\n\n // 1-D mass-damper-spring system\n // m (v2 - v1) + h * d * v2 + h * k *\n\n // C = norm(p2 - p1) - L\n // u = (p2 - p1) / norm(p2 - p1)\n // Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1))\n // J = [-u -cross(r1, u) u cross(r2, u)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n length: this.m_length,\n\n impulse: this.m_impulse,\n gamma: this.m_gamma,\n bias: this.m_bias,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): DistanceJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new DistanceJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n length?: number,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.length > 0) {\n this.m_length = +def.length;\n } else if (def.length < 0) { // don't change length\n } else if (def.anchorA || def.anchorA || def.anchorA || def.anchorA) {\n this.m_length = Vec2.distance(\n this.m_bodyA.getWorldPoint(this.m_localAnchorA),\n this.m_bodyB.getWorldPoint(this.m_localAnchorB)\n );\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the natural length. Manipulating the length can lead to non-physical\n * behavior when the frequency is zero.\n */\n setLength(length: number): void {\n this.m_length = length;\n }\n\n /**\n * Get the natural length.\n */\n getLength(): number {\n return this.m_length;\n }\n\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n this.m_u = Vec2.sub(Vec2.add(cB, this.m_rB), Vec2.add(cA, this.m_rA));\n\n // Handle singularity.\n const length = this.m_u.length();\n if (length > Settings.linearSlop) {\n this.m_u.mul(1.0 / length);\n } else {\n this.m_u.setNum(0.0, 0.0);\n }\n\n const crAu = Vec2.crossVec2Vec2(this.m_rA, this.m_u);\n const crBu = Vec2.crossVec2Vec2(this.m_rB, this.m_u);\n let invMass = this.m_invMassA + this.m_invIA * crAu * crAu + this.m_invMassB\n + this.m_invIB * crBu * crBu;\n\n // Compute the effective mass matrix.\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (this.m_frequencyHz > 0.0) {\n const C = length - this.m_length;\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * this.m_mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = this.m_mass * omega * omega;\n\n // magic formulas\n const h = step.dt;\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invMass += this.m_gamma;\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n } else {\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n const Cdot = Vec2.dot(this.m_u, vpB) - Vec2.dot(this.m_u, vpA);\n\n const impulse = -this.m_mass\n * (Cdot + this.m_bias + this.m_gamma * this.m_impulse);\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u);\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n if (this.m_frequencyHz > 0.0) {\n // There is no position correction for soft distance constraints.\n return true;\n }\n\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA));\n\n const length = u.normalize();\n let C = length - this.m_length;\n C = Math\n .clamp(C, -Settings.maxLinearCorrection, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C;\n const P = Vec2.mulNumVec2(impulse, u);\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Mat22 from '../../common/Mat22';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointOpt extends JointOpt {\n /**\n * The maximum friction force in N.\n */\n maxForce?: number;\n /**\n * The maximum friction torque in N-m.\n */\n maxTorque?: number;\n}\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointDef extends JointDef, FrictionJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n maxTorque : 0.0,\n};\n\n/**\n * Friction joint. This is used for top-down friction. It provides 2D\n * translational friction and angular friction.\n *\n * @param anchor Anchor in global coordination.\n */\nexport default class FrictionJoint extends Joint {\n static TYPE = 'friction-joint' as const;\n\n /** @internal */ m_type: 'friction-joint';\n\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n // Solver shared\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: FrictionJointDef);\n constructor(def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: FrictionJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (!(this instanceof FrictionJoint)) {\n return new FrictionJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = FrictionJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n\n // Solver shared\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): FrictionJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new FrictionJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && common.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && common.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y\n * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x\n * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt; // float\n\n // Solve angular friction\n {\n const Cdot = wB - wA; // float\n let impulse = -this.m_angularMass * Cdot; // float\n\n const oldImpulse = this.m_angularImpulse; // float\n const maxImpulse = h * this.m_maxTorque; // float\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)), Vec2.add(vA,\n Vec2.crossNumVec2(wA, this.m_rA))); // Vec2\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); // Vec2\n const oldImpulse = this.m_linearImpulse; // Vec2\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce; // float\n\n if (this.m_linearImpulse.lengthSquared() > maxImpulse * maxImpulse) {\n this.m_linearImpulse.normalize();\n this.m_linearImpulse.mul(maxImpulse);\n }\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from './Vec2';\nimport Vec3 from './Vec3';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 3-by-3 matrix. Stored in column-major order.\n */\nexport default class Mat33 {\n ex: Vec3;\n ey: Vec3;\n ez: Vec3;\n\n constructor(a: Vec3, b: Vec3, c: Vec3);\n constructor();\n constructor(a?: Vec3, b?: Vec3, c?: Vec3) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec3.clone(a);\n this.ey = Vec3.clone(b);\n this.ez = Vec3.clone(c);\n } else {\n this.ex = Vec3.zero();\n this.ey = Vec3.zero();\n this.ez = Vec3.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec3.isValid(obj.ex) && Vec3.isValid(obj.ey) && Vec3.isValid(obj.ez);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Mat33.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Mat33!');\n }\n }\n\n /**\n * Set this matrix to all zeros.\n */\n setZero(): Mat33 {\n this.ex.setZero();\n this.ey.setZero();\n this.ez.setZero();\n return this;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve33(v: Vec3): Vec3 {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = new Vec3();\n r.x = det * Vec3.dot(v, Vec3.cross(this.ey, this.ez));\n r.y = det * Vec3.dot(this.ex, Vec3.cross(v, this.ez));\n r.z = det * Vec3.dot(this.ex, Vec3.cross(this.ey, v));\n return r;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix\n * equation.\n */\n solve22(v: Vec2): Vec2 {\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a21 = this.ex.y;\n const a22 = this.ey.y;\n let det = a11 * a22 - a12 * a21;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = Vec2.zero();\n r.x = det * (a22 * v.x - a12 * v.y);\n r.y = det * (a11 * v.y - a21 * v.x);\n return r;\n }\n\n /**\n * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if\n * singular.\n */\n getInverse22(M: Mat33): void {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n M.ex.x = det * d;\n M.ey.x = -det * b;\n M.ex.z = 0.0;\n M.ex.y = -det * c;\n M.ey.y = det * a;\n M.ey.z = 0.0;\n M.ez.x = 0.0;\n M.ez.y = 0.0;\n M.ez.z = 0.0;\n }\n\n /**\n * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix\n * if singular.\n */\n getSymInverse33(M: Mat33): void {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a13 = this.ez.x;\n const a22 = this.ey.y;\n const a23 = this.ez.y;\n const a33 = this.ez.z;\n\n M.ex.x = det * (a22 * a33 - a23 * a23);\n M.ex.y = det * (a13 * a23 - a12 * a33);\n M.ex.z = det * (a12 * a23 - a13 * a22);\n\n M.ey.x = M.ex.y;\n M.ey.y = det * (a11 * a33 - a13 * a13);\n M.ey.z = det * (a13 * a12 - a11 * a23);\n\n M.ez.x = M.ex.z;\n M.ez.y = M.ey.z;\n M.ez.z = det * (a11 * a22 - a12 * a12);\n }\n\n /**\n * Multiply a matrix times a vector.\n */\n static mul(a: Mat33, b: Vec2): Vec2;\n static mul(a: Mat33, b: Vec3): Vec3;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n _ASSERT && Mat33.assert(a);\n if (b && 'z' in b && 'y' in b && 'x' in b) {\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n\n } else if (b && 'y' in b && 'x' in b) {\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n _ASSERT && common.assert(false);\n }\n\n static mulVec3(a: Mat33, b: Vec3): Vec3 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n }\n\n static mulVec2(a: Mat33, b: Vec2): Vec2 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n static add(a: Mat33, b: Mat33): Mat33 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Mat33.assert(b);\n return new Mat33(\n Vec3.add(a.ex, b.ex),\n Vec3.add(a.ey, b.ey),\n Vec3.add(a.ez, b.ez)\n );\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Vec3 from '../../common/Vec3';\nimport Mat22 from '../../common/Mat22';\nimport Mat33 from '../../common/Mat33';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointOpt extends JointOpt {\n /**\n * The lower angle for the joint limit (radians).\n */\n lowerAngle?: number;\n /**\n * The upper angle for the joint limit (radians).\n */\n upperAngle?: number;\n /**\n * The maximum motor torque used to achieve the desired motor speed. Usually\n * in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed. Usually in radians per second.\n */\n motorSpeed?: number;\n /**\n * A flag to enable joint limits.\n */\n enableLimit?: boolean;\n /**\n * A flag to enable the joint motor.\n */\n enableMotor?: boolean;\n}\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointDef extends JointDef, RevoluteJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n lowerAngle : 0.0,\n upperAngle : 0.0,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n enableLimit : false,\n enableMotor : false\n};\n\n/**\n * A revolute joint constrains two bodies to share a common point while they are\n * free to rotate about the point. The relative rotation about the shared point\n * is the joint angle. You can limit the relative rotation with a joint limit\n * that specifies a lower and upper angle. You can use a motor to drive the\n * relative rotation about the shared point. A maximum motor torque is provided\n * so that infinite forces are not generated.\n */\nexport default class RevoluteJoint extends Joint {\n static TYPE = 'revolute-joint' as const;\n\n /** @internal */ m_type: 'revolute-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerAngle: number;\n /** @internal */ m_upperAngle: number;\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n // effective mass for point-to-point constraint.\n /** @internal */ m_mass: Mat33 = new Mat33();\n // effective mass for motor/limit angular constraint.\n /** @internal */ m_motorMass: number;\n /** @internal */ m_limitState: number = inactiveLimit; // TODO enum\n\n constructor(def: RevoluteJointDef);\n constructor(def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n // @ts-ignore\n constructor(def: RevoluteJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (!(this instanceof RevoluteJoint)) {\n return new RevoluteJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RevoluteJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorImpulse = 0.0;\n\n this.m_lowerAngle = def.lowerAngle;\n this.m_upperAngle = def.upperAngle;\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Motor constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerAngle: this.m_lowerAngle,\n upperAngle: this.m_upperAngle,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any):RevoluteJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RevoluteJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle in radians.\n */\n getJointAngle(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle speed in radians per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_angularVelocity - bA.m_angularVelocity;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Get the current motor torque given the inverse time step. Unit is N*m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set the motor speed in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set the maximum motor torque, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit in radians.\n */\n getLowerLimit(): number {\n return this.m_lowerAngle;\n }\n\n /**\n * Get the upper joint limit in radians.\n */\n getUpperLimit(): number {\n return this.m_upperAngle;\n }\n\n /**\n * Set the joint limits in radians.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && common.assert(lower <= upper);\n\n if (lower != this.m_lowerAngle || upper != this.m_upperAngle) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_impulse.z = 0.0;\n this.m_lowerAngle = lower;\n this.m_upperAngle = upper;\n }\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force given the inverse time step. Unit is N.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque due to the joint limit given the inverse time step.\n * Unit is N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n this.m_mass.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y\n * this.m_rB.y * iB;\n this.m_mass.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y\n * this.m_rB.x * iB;\n this.m_mass.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n this.m_mass.ex.y = this.m_mass.ey.x;\n this.m_mass.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x\n * this.m_rB.x * iB;\n this.m_mass.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n this.m_mass.ex.z = this.m_mass.ez.x;\n this.m_mass.ey.z = this.m_mass.ez.y;\n this.m_mass.ez.z = iA + iB;\n\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n\n if (this.m_enableMotor == false || fixedRotation) {\n this.m_motorImpulse = 0.0;\n }\n\n if (this.m_enableLimit && fixedRotation == false) {\n const jointAngle = aB - aA - this.m_referenceAngle; // float\n\n if (Math.abs(this.m_upperAngle - this.m_lowerAngle) < 2.0 * Settings.angularSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointAngle <= this.m_lowerAngle) {\n if (this.m_limitState != atLowerLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atLowerLimit;\n\n } else if (jointAngle >= this.m_upperAngle) {\n if (this.m_limitState != atUpperLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atUpperLimit;\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_motorImpulse + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_motorImpulse + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n // Solve motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits\n && fixedRotation == false) {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const impulse = Vec3.neg(this.m_mass.solve33(Cdot)); // Vec3\n\n if (this.m_limitState == equalLimits) {\n this.m_impulse.add(impulse);\n\n } else if (this.m_limitState == atLowerLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse < 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n\n } else if (this.m_limitState == atUpperLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse > 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n\n } else {\n // Solve point-to-point constraint\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const impulse = this.m_mass.solve22(Vec2.neg(Cdot)); // Vec2\n\n this.m_impulse.x += impulse.x;\n this.m_impulse.y += impulse.y;\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n let angularError = 0.0; // float\n let positionError = 0.0; // float\n\n const fixedRotation = (this.m_invIA + this.m_invIB == 0.0); // bool\n\n // Solve angular limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const angle = aB - aA - this.m_referenceAngle; // float\n let limitImpulse = 0.0; // float\n\n if (this.m_limitState == equalLimits) {\n // Prevent large angular corrections\n const C = Math.clamp(angle - this.m_lowerAngle,\n -Settings.maxAngularCorrection, Settings.maxAngularCorrection); // float\n limitImpulse = -this.m_motorMass * C;\n angularError = Math.abs(C);\n\n } else if (this.m_limitState == atLowerLimit) {\n let C = angle - this.m_lowerAngle; // float\n angularError = -C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C + Settings.angularSlop, -Settings.maxAngularCorrection,\n 0.0);\n limitImpulse = -this.m_motorMass * C;\n\n } else if (this.m_limitState == atUpperLimit) {\n let C = angle - this.m_upperAngle; // float\n angularError = C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C - Settings.angularSlop, 0.0,\n Settings.maxAngularCorrection);\n limitImpulse = -this.m_motorMass * C;\n }\n\n aA -= this.m_invIA * limitImpulse;\n aB += this.m_invIB * limitImpulse;\n }\n\n // Solve point-to-point constraint.\n {\n qA.setAngle(aA);\n qB.setAngle(aB);\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n\n const C = Vec2.zero();\n C.addCombine(1, cB, 1, rB);\n C.subCombine(1, cA, 1, rA);\n positionError = C.length();\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y;\n K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x;\n\n const impulse = Vec2.neg(K.solve(C)); // Vec2\n\n cA.subMul(mA, impulse);\n aA -= iA * Vec2.crossVec2Vec2(rA, impulse);\n\n cB.addMul(mB, impulse);\n aB += iB * Vec2.crossVec2Vec2(rB, impulse);\n }\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Vec3 from '../../common/Vec3';\nimport Mat22 from '../../common/Mat22';\nimport Mat33 from '../../common/Mat33';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointOpt extends JointOpt {\n /**\n * Enable/disable the joint limit.\n */\n enableLimit?: boolean;\n /**\n * The lower translation limit, usually in meters.\n */\n lowerTranslation?: number;\n /**\n * The upper translation limit, usually in meters.\n */\n upperTranslation?: number;\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorForce?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n}\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointDef extends JointDef, PrismaticJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation unit axis in bodyA.\n */\n localAxisA: Vec2;\n /**\n * referenceAngle The constrained angle between the bodies:\n * bodyB_angle - bodyA_angle.\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n enableLimit : false,\n lowerTranslation : 0.0,\n upperTranslation : 0.0,\n enableMotor : false,\n maxMotorForce : 0.0,\n motorSpeed : 0.0\n};\n\n/**\n * A prismatic joint. This joint provides one degree of freedom: translation\n * along an axis fixed in bodyA. Relative rotation is prevented. You can use a\n * joint limit to restrict the range of motion and a joint motor to drive the\n * motion or to model joint friction.\n */\nexport default class PrismaticJoint extends Joint {\n static TYPE = 'prismatic-joint' as const;\n\n /** @internal */ m_type: 'prismatic-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerTranslation: number;\n /** @internal */ m_upperTranslation: number;\n /** @internal */ m_maxMotorForce: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n /** @internal */ m_limitState: number; // TODO enum\n /** @internal */ m_axis: Vec2;\n /** @internal */ m_perp: Vec2;\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_s1: number;\n /** @internal */ m_s2: number;\n /** @internal */ m_a1: number;\n /** @internal */ m_a2: number;\n /** @internal */ m_K: Mat33;\n\n constructor(def: PrismaticJointDef);\n constructor(def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n constructor(def: PrismaticJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (!(this instanceof PrismaticJoint)) {\n return new PrismaticJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PrismaticJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || Vec2.neo(1.0, 0.0));\n this.m_localXAxisA.normalize();\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n\n this.m_lowerTranslation = def.lowerTranslation;\n this.m_upperTranslation = def.upperTranslation;\n this.m_maxMotorForce = def.maxMotorForce;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n this.m_limitState = inactiveLimit;\n\n this.m_axis = Vec2.zero();\n this.m_perp = Vec2.zero();\n\n this.m_K = new Mat33();\n\n // Linear constraint (point-to-line)\n // d = p2 - p1 = x2 + r2 - x1 - r1\n // C = dot(perp, d)\n // Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 -\n // cross(w1, r1))\n // = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) +\n // dot(cross(r2, perp), v2)\n // J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)]\n //\n // Angular constraint\n // C = a2 - a1 + a_initial\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n //\n // K = J * invM * JT\n //\n // J = [-a -s1 a s2]\n // [0 -1 0 1]\n // a = perp\n // s1 = cross(d + r1, a) = cross(p2 - x1, a)\n // s2 = cross(r2, a) = cross(p2 - x2, a)\n\n // Motor/Limit linear constraint\n // C = dot(ax1, d)\n // Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) +\n // dot(cross(r2, ax1), v2)\n // J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)]\n\n // Block Solver\n // We develop a block solver that includes the joint limit. This makes the\n // limit stiff (inelastic) even\n // when the mass has poor distribution (leading to large torques about the\n // joint anchor points).\n //\n // The Jacobian has 3 rows:\n // J = [-uT -s1 uT s2] // linear\n // [0 -1 0 1] // angular\n // [-vT -a1 vT a2] // limit\n //\n // u = perp\n // v = axis\n // s1 = cross(d + r1, u), s2 = cross(r2, u)\n // a1 = cross(d + r1, v), a2 = cross(r2, v)\n\n // M * (v2 - v1) = JT * df\n // J * v2 = bias\n //\n // v2 = v1 + invM * JT * df\n // J * (v1 + invM * JT * df) = bias\n // K * df = bias - J * v1 = -Cdot\n // K = J * invM * JT\n // Cdot = J * v1 - bias\n //\n // Now solve for f2.\n // df = f2 - f1\n // K * (f2 - f1) = -Cdot\n // f2 = invK * (-Cdot) + f1\n //\n // Clamp accumulated limit impulse.\n // lower: f2(3) = max(f2(3), 0)\n // upper: f2(3) = min(f2(3), 0)\n //\n // Solve for correct f2(1:2)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1\n // = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) +\n // K(1:2,1:2) * f1(1:2)\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n //\n // Now compute impulse to be applied:\n // df = f2 - f1\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerTranslation: this.m_lowerTranslation,\n upperTranslation: this.m_upperTranslation,\n maxMotorForce: this.m_maxMotorForce,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PrismaticJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.localAxisA = Vec2.clone(data.localAxisA);\n const joint = new PrismaticJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const pA = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const pB = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const d = Vec2.sub(pB, pA);\n const axis = this.m_bodyA.getWorldVector(this.m_localXAxisA);\n\n const translation = Vec2.dot(d, axis);\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const rA = Rot.mulVec2(bA.m_xf.q, Vec2.sub(this.m_localAnchorA, bA.m_sweep.localCenter)); // Vec2\n const rB = Rot.mulVec2(bB.m_xf.q, Vec2.sub(this.m_localAnchorB, bB.m_sweep.localCenter)); // Vec2\n const p1 = Vec2.add(bA.m_sweep.c, rA); // Vec2\n const p2 = Vec2.add(bB.m_sweep.c, rB); // Vec2\n const d = Vec2.sub(p2, p1); // Vec2\n const axis = Rot.mulVec2(bA.m_xf.q, this.m_localXAxisA); // Vec2\n\n const vA = bA.m_linearVelocity; // Vec2\n const vB = bB.m_linearVelocity; // Vec2\n const wA = bA.m_angularVelocity; // float\n const wB = bB.m_angularVelocity; // float\n\n const speed = Vec2.dot(d, Vec2.crossNumVec2(wA, axis))\n + Vec2.dot(axis, Vec2.sub(Vec2.addCrossNumVec2(vB, wB, rB), Vec2.addCrossNumVec2(vA, wA, rA))); // float\n return speed;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit, usually in meters.\n */\n getLowerLimit(): number {\n return this.m_lowerTranslation;\n }\n\n /**\n * Get the upper joint limit, usually in meters.\n */\n getUpperLimit(): number {\n return this.m_upperTranslation;\n }\n\n /**\n * Set the joint limits, usually in meters.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && common.assert(lower <= upper);\n if (lower != this.m_lowerTranslation || upper != this.m_upperTranslation) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_lowerTranslation = lower;\n this.m_upperTranslation = upper;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in meters per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Set the maximum motor force, usually in N.\n */\n setMaxMotorForce(force: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorForce = force;\n }\n\n getMaxMotorForce(): number {\n return this.m_maxMotorForce;\n }\n\n /**\n * Get the motor speed, usually in meters per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Get the current motor force given the inverse time step, usually in N.\n */\n getMotorForce(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + this.m_impulse.z, this.m_axis).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.y;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute motor Jacobian and effective mass.\n {\n this.m_axis = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_axis);\n this.m_a2 = Vec2.crossVec2Vec2(rB, this.m_axis);\n\n this.m_motorMass = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2\n * this.m_a2;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n }\n\n // Prismatic constraint.\n {\n this.m_perp = Rot.mulVec2(qA, this.m_localYAxisA);\n\n this.m_s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_perp);\n this.m_s2 = Vec2.crossVec2Vec2(rB, this.m_perp);\n\n const s1test = Vec2.crossVec2Vec2(rA, this.m_perp);\n\n const k11 = mA + mB + iA * this.m_s1 * this.m_s1 + iB * this.m_s2 * this.m_s2;\n const k12 = iA * this.m_s1 + iB * this.m_s2;\n const k13 = iA * this.m_s1 * this.m_a1 + iB * this.m_s2 * this.m_a2;\n let k22 = iA + iB;\n if (k22 == 0.0) {\n // For bodies with fixed rotation.\n k22 = 1.0;\n }\n const k23 = iA * this.m_a1 + iB * this.m_a2;\n const k33 = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 * this.m_a2;\n\n this.m_K.ex.set(k11, k12, k13);\n this.m_K.ey.set(k12, k22, k23);\n this.m_K.ez.set(k13, k23, k33);\n }\n\n // Compute motor and limit terms.\n if (this.m_enableLimit) {\n\n const jointTranslation = Vec2.dot(this.m_axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * Settings.linearSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointTranslation <= this.m_lowerTranslation) {\n if (this.m_limitState != atLowerLimit) {\n this.m_limitState = atLowerLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else if (jointTranslation >= this.m_upperTranslation) {\n if (this.m_limitState != atUpperLimit) {\n this.m_limitState = atUpperLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n if (this.m_enableMotor == false) {\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse\n + this.m_impulse.z, this.m_axis);\n const LA = this.m_impulse.x * this.m_s1 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1;\n const LB = this.m_impulse.x * this.m_s2 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Solve linear motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits) {\n const Cdot = Vec2.dot(this.m_axis, Vec2.sub(vB, vA)) + this.m_a2 * wB\n - this.m_a1 * wA;\n let impulse = this.m_motorMass * (this.m_motorSpeed - Cdot);\n const oldImpulse = this.m_motorImpulse;\n const maxImpulse = step.dt * this.m_maxMotorForce;\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_axis);\n const LA = impulse * this.m_a1;\n const LB = impulse * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n const Cdot1 = Vec2.zero();\n Cdot1.x += Vec2.dot(this.m_perp, vB) + this.m_s2 * wB;\n Cdot1.x -= Vec2.dot(this.m_perp, vA) + this.m_s1 * wA;\n Cdot1.y = wB - wA;\n\n if (this.m_enableLimit && this.m_limitState != inactiveLimit) {\n // Solve prismatic and limit constraint in block form.\n let Cdot2 = 0;\n Cdot2 += Vec2.dot(this.m_axis, vB) + this.m_a2 * wB;\n Cdot2 -= Vec2.dot(this.m_axis, vA) + this.m_a1 * wA;\n\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const f1 = Vec3.clone(this.m_impulse);\n let df = this.m_K.solve33(Vec3.neg(Cdot)); // Vec3\n this.m_impulse.add(df);\n\n if (this.m_limitState == atLowerLimit) {\n this.m_impulse.z = Math.max(this.m_impulse.z, 0.0);\n } else if (this.m_limitState == atUpperLimit) {\n this.m_impulse.z = Math.min(this.m_impulse.z, 0.0);\n }\n\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n const b = Vec2.combine(-1, Cdot1, -(this.m_impulse.z - f1.z), Vec2.neo(this.m_K.ez.x, this.m_K.ez.y)); // Vec2\n const f2r = Vec2.add(this.m_K.solve22(b), Vec2.neo(f1.x, f1.y)); // Vec2\n this.m_impulse.x = f2r.x;\n this.m_impulse.y = f2r.y;\n\n df = Vec3.sub(this.m_impulse, f1);\n\n const P = Vec2.combine(df.x, this.m_perp, df.z, this.m_axis); // Vec2\n const LA = df.x * this.m_s1 + df.y + df.z * this.m_a1; // float\n const LB = df.x * this.m_s2 + df.y + df.z * this.m_a2; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n // Limit is inactive, just solve the prismatic constraint in block form.\n const df = this.m_K.solve22(Vec2.neg(Cdot1)); // Vec2\n this.m_impulse.x += df.x;\n this.m_impulse.y += df.y;\n\n const P = Vec2.mulNumVec2(df.x, this.m_perp); // Vec2\n const LA = df.x * this.m_s1 + df.y; // float\n const LB = df.x * this.m_s2 + df.y; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute fresh Jacobians\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n const d = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); // Vec2\n\n const axis = Rot.mulVec2(qA, this.m_localXAxisA); // Vec2\n const a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), axis); // float\n const a2 = Vec2.crossVec2Vec2(rB, axis); // float\n const perp = Rot.mulVec2(qA, this.m_localYAxisA); // Vec2\n\n const s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), perp); // float\n const s2 = Vec2.crossVec2Vec2(rB, perp); // float\n\n let impulse = new Vec3();\n const C1 = Vec2.zero(); // Vec2\n C1.x = Vec2.dot(perp, d);\n C1.y = aB - aA - this.m_referenceAngle;\n\n let linearError = Math.abs(C1.x); // float\n const angularError = Math.abs(C1.y); // float\n\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n let active = false; // bool\n let C2 = 0.0; // float\n if (this.m_enableLimit) {\n\n const translation = Vec2.dot(axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * linearSlop) {\n // Prevent large angular corrections\n C2 = Math.clamp(translation, -maxLinearCorrection, maxLinearCorrection);\n linearError = Math.max(linearError, Math.abs(translation));\n active = true;\n\n } else if (translation <= this.m_lowerTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_lowerTranslation + linearSlop,\n -maxLinearCorrection, 0.0);\n linearError = Math\n .max(linearError, this.m_lowerTranslation - translation);\n active = true;\n\n } else if (translation >= this.m_upperTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_upperTranslation - linearSlop, 0.0,\n maxLinearCorrection);\n linearError = Math\n .max(linearError, translation - this.m_upperTranslation);\n active = true;\n }\n }\n\n if (active) {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n const k13 = iA * s1 * a1 + iB * s2 * a2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n // For fixed rotation\n k22 = 1.0;\n }\n const k23 = iA * a1 + iB * a2; // float\n const k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; // float\n\n const K = new Mat33();\n K.ex.set(k11, k12, k13);\n K.ey.set(k12, k22, k23);\n K.ez.set(k13, k23, k33);\n\n const C = new Vec3();\n C.x = C1.x;\n C.y = C1.y;\n C.z = C2;\n\n impulse = K.solve33(Vec3.neg(C));\n } else {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n k22 = 1.0;\n }\n\n const K = new Mat22();\n K.ex.setNum(k11, k12);\n K.ey.setNum(k12, k22);\n\n const impulse1 = K.solve(Vec2.neg(C1)); // Vec2\n impulse.x = impulse1.x;\n impulse.y = impulse1.y;\n impulse.z = 0.0;\n }\n\n const P = Vec2.combine(impulse.x, perp, impulse.z, axis); // Vec2\n const LA = impulse.x * s1 + impulse.y + impulse.z * a1; // float\n const LB = impulse.x * s2 + impulse.y + impulse.z * a2; // float\n\n cA.subMul(mA, P);\n aA -= iA * LA;\n cB.addMul(mB, P);\n aB += iB * LB;\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport RevoluteJoint from './RevoluteJoint';\nimport PrismaticJoint from './PrismaticJoint';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Gear joint definition.\n */\nexport interface GearJointOpt extends JointOpt {\n /**\n * The gear ratio. See {@link GearJoint} for explanation.\n */\n ratio?: number;\n}\n/**\n * Gear joint definition.\n */\nexport interface GearJointDef extends JointDef, GearJointOpt {\n /**\n * The first revolute/prismatic joint attached to the gear joint.\n */\n joint1: RevoluteJoint | PrismaticJoint;\n /**\n * The second prismatic/revolute joint attached to the gear joint.\n */\n joint2: RevoluteJoint | PrismaticJoint;\n}\n\nconst DEFAULTS = {\n ratio : 1.0\n};\n\n/**\n * A gear joint is used to connect two joints together. Either joint can be a\n * revolute or prismatic joint. You specify a gear ratio to bind the motions\n * together: coordinate1 + ratio * coordinate2 = constant\n *\n * The ratio can be negative or positive. If one joint is a revolute joint and\n * the other joint is a prismatic joint, then the ratio will have units of\n * length or units of 1/length. Warning: You have to manually destroy the gear\n * joint if joint1 or joint2 is destroyed.\n *\n * This definition requires two existing revolute or prismatic joints (any\n * combination will work).\n */\nexport default class GearJoint extends Joint {\n static TYPE = 'gear-joint' as const;\n\n /** @internal */ m_type: 'gear-joint';\n /** @internal */ m_joint1: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_joint2: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_type1: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_type2: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_bodyC: Body;\n /** @internal */ m_localAnchorC: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_referenceAngleA: number;\n /** @internal */ m_localAxisC: Vec2;\n /** @internal */ m_bodyD: Body;\n /** @internal */ m_localAnchorD: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngleB: number;\n /** @internal */ m_localAxisD: Vec2;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_lcA: Vec2;\n /** @internal */ m_lcB: Vec2;\n /** @internal */ m_lcC: Vec2;\n /** @internal */ m_lcD: Vec2;\n /** @internal */ m_mA: number;\n /** @internal */ m_mB: number;\n /** @internal */ m_mC: number;\n /** @internal */ m_mD: number;\n /** @internal */ m_iA: number;\n /** @internal */ m_iB: number;\n /** @internal */ m_iC: number;\n /** @internal */ m_iD: number;\n /** @internal */ m_JvAC: Vec2;\n /** @internal */ m_JvBD: Vec2;\n /** @internal */ m_JwA: number;\n /** @internal */ m_JwB: number;\n /** @internal */ m_JwC: number;\n /** @internal */ m_JwD: number;\n /** @internal */ m_mass: number;\n\n constructor(def: GearJointDef);\n constructor(def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number);\n constructor(def: GearJointDef, bodyA?: Body, bodyB?: Body, joint1?: RevoluteJoint | PrismaticJoint, joint2?: RevoluteJoint | PrismaticJoint, ratio?: number) {\n // @ts-ignore\n if (!(this instanceof GearJoint)) {\n return new GearJoint(def, bodyA, bodyB, joint1, joint2, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = GearJoint.TYPE;\n\n _ASSERT && common.assert(joint1.m_type === RevoluteJoint.TYPE\n || joint1.m_type === PrismaticJoint.TYPE);\n _ASSERT && common.assert(joint2.m_type === RevoluteJoint.TYPE\n || joint2.m_type === PrismaticJoint.TYPE);\n\n this.m_joint1 = joint1 ? joint1 : def.joint1;\n this.m_joint2 = joint2 ? joint2 : def.joint2;\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n this.m_type1 = this.m_joint1.getType() as 'revolute-joint' | 'prismatic-joint';\n this.m_type2 = this.m_joint2.getType() as 'revolute-joint' | 'prismatic-joint';\n\n // joint1 connects body A to body C\n // joint2 connects body B to body D\n\n let coordinateA: number;\n let coordinateB: number;\n\n // TODO_ERIN there might be some problem with the joint edges in Joint.\n\n this.m_bodyC = this.m_joint1.getBodyA();\n this.m_bodyA = this.m_joint1.getBodyB();\n\n // Get geometry of joint1\n const xfA = this.m_bodyA.m_xf;\n const aA = this.m_bodyA.m_sweep.a;\n const xfC = this.m_bodyC.m_xf;\n const aC = this.m_bodyC.m_sweep.a;\n\n if (this.m_type1 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint1 as RevoluteJoint;\n this.m_localAnchorC = revolute.m_localAnchorA;\n this.m_localAnchorA = revolute.m_localAnchorB;\n this.m_referenceAngleA = revolute.m_referenceAngle;\n this.m_localAxisC = Vec2.zero();\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const prismatic = this.m_joint1 as PrismaticJoint;\n this.m_localAnchorC = prismatic.m_localAnchorA;\n this.m_localAnchorA = prismatic.m_localAnchorB;\n this.m_referenceAngleA = prismatic.m_referenceAngle;\n this.m_localAxisC = prismatic.m_localXAxisA;\n\n const pC = this.m_localAnchorC;\n const pA = Rot.mulTVec2(xfC.q, Vec2.add(Rot.mulVec2(xfA.q, this.m_localAnchorA), Vec2.sub(xfA.p, xfC.p)));\n coordinateA = Vec2.dot(pA, this.m_localAxisC) - Vec2.dot(pC, this.m_localAxisC);\n }\n\n this.m_bodyD = this.m_joint2.getBodyA();\n this.m_bodyB = this.m_joint2.getBodyB();\n\n // Get geometry of joint2\n const xfB = this.m_bodyB.m_xf;\n const aB = this.m_bodyB.m_sweep.a;\n const xfD = this.m_bodyD.m_xf;\n const aD = this.m_bodyD.m_sweep.a;\n\n if (this.m_type2 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint2 as RevoluteJoint;\n this.m_localAnchorD = revolute.m_localAnchorA;\n this.m_localAnchorB = revolute.m_localAnchorB;\n this.m_referenceAngleB = revolute.m_referenceAngle;\n this.m_localAxisD = Vec2.zero();\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const prismatic = this.m_joint2 as PrismaticJoint;\n this.m_localAnchorD = prismatic.m_localAnchorA;\n this.m_localAnchorB = prismatic.m_localAnchorB;\n this.m_referenceAngleB = prismatic.m_referenceAngle;\n this.m_localAxisD = prismatic.m_localXAxisA;\n\n const pD = this.m_localAnchorD;\n const pB = Rot.mulTVec2(xfD.q, Vec2.add(Rot.mulVec2(xfB.q, this.m_localAnchorB), Vec2.sub(xfB.p, xfD.p)));\n coordinateB = Vec2.dot(pB, this.m_localAxisD) - Vec2.dot(pD, this.m_localAxisD);\n }\n\n this.m_constant = coordinateA + this.m_ratio * coordinateB;\n\n this.m_impulse = 0.0;\n\n // Gear Joint:\n // C0 = (coordinate1 + ratio * coordinate2)_initial\n // C = (coordinate1 + ratio * coordinate2) - C0 = 0\n // J = [J1 ratio * J2]\n // K = J * invM * JT\n // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T\n //\n // Revolute:\n // coordinate = rotation\n // Cdot = angularVelocity\n // J = [0 0 1]\n // K = J * invM * JT = invI\n //\n // Prismatic:\n // coordinate = dot(p - pg, ug)\n // Cdot = dot(v + cross(w, r), ug)\n // J = [ug cross(r, ug)]\n // K = J * invM * JT = invMass + invI * cross(r, ug)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n joint1: this.m_joint1,\n joint2: this.m_joint2,\n ratio: this.m_ratio,\n\n // _constant: this.m_constant,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): GearJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.joint1 = restore(Joint, data.joint1, world);\n data.joint2 = restore(Joint, data.joint2, world);\n const joint = new GearJoint(data);\n // if (data._constant) joint.m_constant = data._constant;\n return joint;\n }\n\n /**\n * Get the first joint.\n */\n getJoint1(): Joint {\n return this.m_joint1;\n }\n\n /**\n * Get the second joint.\n */\n getJoint2(): Joint {\n return this.m_joint2;\n }\n\n /**\n * Set the gear ratio.\n */\n setRatio(ratio: number): void {\n _ASSERT && common.assert(Math.isFinite(ratio));\n this.m_ratio = ratio;\n }\n\n /**\n * Get the gear ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_JvAC).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n const L = this.m_impulse * this.m_JwA; // float\n return inv_dt * L;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_lcA = this.m_bodyA.m_sweep.localCenter;\n this.m_lcB = this.m_bodyB.m_sweep.localCenter;\n this.m_lcC = this.m_bodyC.m_sweep.localCenter;\n this.m_lcD = this.m_bodyD.m_sweep.localCenter;\n this.m_mA = this.m_bodyA.m_invMass;\n this.m_mB = this.m_bodyB.m_invMass;\n this.m_mC = this.m_bodyC.m_invMass;\n this.m_mD = this.m_bodyD.m_invMass;\n this.m_iA = this.m_bodyA.m_invI;\n this.m_iB = this.m_bodyB.m_invI;\n this.m_iC = this.m_bodyC.m_invI;\n this.m_iD = this.m_bodyD.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const aC = this.m_bodyC.c_position.a;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n\n const aD = this.m_bodyD.c_position.a;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n this.m_mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n this.m_JvAC = Vec2.zero();\n this.m_JwA = 1.0;\n this.m_JwC = 1.0;\n this.m_mass += this.m_iA + this.m_iC;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n this.m_JvAC = u;\n this.m_JwC = Vec2.crossVec2Vec2(rC, u);\n this.m_JwA = Vec2.crossVec2Vec2(rA, u);\n this.m_mass += this.m_mC + this.m_mA + this.m_iC * this.m_JwC * this.m_JwC + this.m_iA * this.m_JwA * this.m_JwA;\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n this.m_JvBD = Vec2.zero();\n this.m_JwB = this.m_ratio;\n this.m_JwD = this.m_ratio;\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD); // Vec2\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); // Vec2\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); // Vec2\n this.m_JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n this.m_JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n this.m_JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD * this.m_JwD * this.m_JwD + this.m_iB * this.m_JwB * this.m_JwB;\n }\n\n // Compute effective mass.\n this.m_mass = this.m_mass > 0.0 ? 1.0 / this.m_mass : 0.0;\n\n if (step.warmStarting) {\n vA.addMul(this.m_mA * this.m_impulse, this.m_JvAC);\n wA += this.m_iA * this.m_impulse * this.m_JwA;\n\n vB.addMul(this.m_mB * this.m_impulse, this.m_JvBD);\n wB += this.m_iB * this.m_impulse * this.m_JwB;\n\n vC.subMul(this.m_mC * this.m_impulse, this.m_JvAC);\n wC -= this.m_iC * this.m_impulse * this.m_JwC;\n\n vD.subMul(this.m_mD * this.m_impulse, this.m_JvBD);\n wD -= this.m_iD * this.m_impulse * this.m_JwD;\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n let Cdot = Vec2.dot(this.m_JvAC, vA) - Vec2.dot(this.m_JvAC, vC)\n + Vec2.dot(this.m_JvBD, vB) - Vec2.dot(this.m_JvBD, vD); // float\n Cdot += (this.m_JwA * wA - this.m_JwC * wC)\n + (this.m_JwB * wB - this.m_JwD * wD);\n\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n vA.addMul(this.m_mA * impulse, this.m_JvAC);\n wA += this.m_iA * impulse * this.m_JwA;\n vB.addMul(this.m_mB * impulse, this.m_JvBD);\n wB += this.m_iB * impulse * this.m_JwB;\n vC.subMul(this.m_mC * impulse, this.m_JvAC);\n wC -= this.m_iC * impulse * this.m_JwC;\n vD.subMul(this.m_mD * impulse, this.m_JvBD);\n wD -= this.m_iD * impulse * this.m_JwD;\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n const cC = this.m_bodyC.c_position.c;\n let aC = this.m_bodyC.c_position.a;\n const cD = this.m_bodyD.c_position.c;\n let aD = this.m_bodyD.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n const linearError = 0.0;\n\n let coordinateA: number;\n let coordinateB: number;\n\n let JvAC: Vec2;\n let JvBD: Vec2;\n let JwA: number;\n let JwB: number;\n let JwC: number;\n let JwD: number;\n let mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n JvAC = Vec2.zero();\n JwA = 1.0;\n JwC = 1.0;\n mass += this.m_iA + this.m_iC;\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n JvAC = u;\n JwC = Vec2.crossVec2Vec2(rC, u);\n JwA = Vec2.crossVec2Vec2(rA, u);\n mass += this.m_mC + this.m_mA + this.m_iC * JwC * JwC + this.m_iA * JwA * JwA;\n\n const pC = Vec2.sub(this.m_localAnchorC, this.m_lcC); // Vec2\n const pA = Rot.mulTVec2(qC, Vec2.add(rA, Vec2.sub(cA, cC))); // Vec2\n coordinateA = Vec2.dot(Vec2.sub(pA, pC), this.m_localAxisC);\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n JvBD = Vec2.zero();\n JwB = this.m_ratio;\n JwD = this.m_ratio;\n mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD);\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB);\n JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD\n * JwD * JwD + this.m_iB * JwB * JwB;\n\n const pD = Vec2.sub(this.m_localAnchorD, this.m_lcD); // Vec2\n const pB = Rot.mulTVec2(qD, Vec2.add(rB, Vec2.sub(cB, cD))); // Vec2\n coordinateB = Vec2.dot(pB, this.m_localAxisD)\n - Vec2.dot(pD, this.m_localAxisD);\n }\n\n const C = (coordinateA + this.m_ratio * coordinateB) - this.m_constant; // float\n\n let impulse = 0.0; // float\n if (mass > 0.0) {\n impulse = -C / mass;\n }\n\n cA.addMul(this.m_mA * impulse, JvAC);\n aA += this.m_iA * impulse * JwA;\n cB.addMul(this.m_mB * impulse, JvBD);\n aB += this.m_iB * impulse * JwB;\n cC.subMul(this.m_mC * impulse, JvAC);\n aC -= this.m_iC * impulse * JwC;\n cD.subMul(this.m_mD * impulse, JvBD);\n aD -= this.m_iD * impulse * JwD;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n this.m_bodyC.c_position.c.setVec2(cC);\n this.m_bodyC.c_position.a = aC;\n this.m_bodyD.c_position.c.setVec2(cD);\n this.m_bodyD.c_position.a = aD;\n\n // TODO_ERIN not implemented\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Mat22 from '../../common/Mat22';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Motor joint definition.\n */\nexport interface MotorJointOpt extends JointOpt {\n /**\n * The bodyB angle minus bodyA angle in radians.\n */\n angularOffset?: number;\n /**\n * The maximum motor force in N.\n */\n maxForce?: number;\n /**\n * The maximum motor torque in N-m.\n */\n maxTorque?: number;\n /**\n * Position correction factor in the range [0,1].\n */\n correctionFactor?: number;\n /**\n * Position of bodyB minus the position of bodyA, in bodyA's frame, in meters.\n */\n linearOffset?: Vec2;\n}\n/**\n * Motor joint definition.\n */\nexport interface MotorJointDef extends JointDef, MotorJointOpt {\n}\n\nconst DEFAULTS = {\n maxForce : 1.0,\n maxTorque : 1.0,\n correctionFactor : 0.3\n};\n\n/**\n * A motor joint is used to control the relative motion between two bodies. A\n * typical usage is to control the movement of a dynamic body with respect to\n * the ground.\n */\nexport default class MotorJoint extends Joint {\n static TYPE = 'motor-joint' as const;\n\n /** @internal */ m_type: 'motor-joint';\n /** @internal */ m_linearOffset: Vec2;\n /** @internal */ m_angularOffset: number;\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n /** @internal */ m_correctionFactor: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_linearError: Vec2;\n /** @internal */ m_angularError: number;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: MotorJointDef);\n constructor(def: MotorJointOpt, bodyA: Body, bodyB: Body);\n constructor(def: MotorJointDef | MotorJointOpt, bodyA?: Body, bodyB?: Body) {\n // @ts-ignore\n if (!(this instanceof MotorJoint)) {\n return new MotorJoint(def, bodyA, bodyB);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MotorJoint.TYPE;\n\n this.m_linearOffset = Math.isFinite(def.linearOffset) ? def.linearOffset : bodyA.getLocalPoint(bodyB.getPosition());\n this.m_angularOffset = Math.isFinite(def.angularOffset) ? def.angularOffset : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n this.m_correctionFactor = def.correctionFactor;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n correctionFactor: this.m_correctionFactor,\n\n linearOffset: this.m_linearOffset,\n angularOffset: this.m_angularOffset,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MotorJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new MotorJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {}): void {\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && common.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && common.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Set the position correction factor in the range [0,1].\n */\n setCorrectionFactor(factor: number): void {\n _ASSERT && common.assert(Math.isFinite(factor) && 0.0 <= factor && factor <= 1.0);\n this.m_correctionFactor = factor;\n }\n\n /**\n * Get the position correction factor in the range [0,1].\n */\n getCorrectionFactor(): number {\n return this.m_correctionFactor;\n }\n\n /**\n * Set/get the target linear offset, in frame A, in meters.\n */\n setLinearOffset(linearOffset: Vec2): void {\n if (linearOffset.x != this.m_linearOffset.x\n || linearOffset.y != this.m_linearOffset.y) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_linearOffset = linearOffset;\n }\n }\n\n getLinearOffset(): Vec2 {\n return this.m_linearOffset;\n }\n\n /**\n * Set/get the target angular offset, in radians.\n */\n setAngularOffset(angularOffset: number): void {\n if (angularOffset != this.m_angularOffset) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_angularOffset = angularOffset;\n }\n }\n\n getAngularOffset(): number {\n return this.m_angularOffset;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getPosition();\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getPosition();\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.neg(this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.neg(this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n this.m_linearError = Vec2.zero();\n this.m_linearError.addCombine(1, cB, 1, this.m_rB);\n this.m_linearError.subCombine(1, cA, 1, this.m_rA);\n this.m_linearError.sub(Rot.mulVec2(qA, this.m_linearOffset));\n\n this.m_angularError = aB - aA - this.m_angularOffset;\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt;\n const inv_h = step.inv_dt;\n\n // Solve angular friction\n {\n const Cdot = wB - wA + inv_h * this.m_correctionFactor * this.m_angularError;\n let impulse = -this.m_angularMass * Cdot;\n\n const oldImpulse = this.m_angularImpulse;\n const maxImpulse = h * this.m_maxTorque;\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n Cdot.addMul(inv_h * this.m_correctionFactor, this.m_linearError);\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot));\n const oldImpulse = Vec2.clone(this.m_linearImpulse);\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce;\n\n this.m_linearImpulse.clamp(maxImpulse);\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Mat22 from '../../common/Mat22';\nimport Rot from '../../common/Rot';\nimport Transform from '../../common/Transform';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointOpt extends JointOpt {\n /**\n * [maxForce = 0.0] The maximum constraint force that can be exerted to move\n * the candidate body. Usually you will express as some multiple of the\n * weight (multiplier * mass * gravity).\n */\n maxForce?: number;\n /**\n * [frequencyHz = 5.0] The response speed.\n */\n frequencyHz?: number;\n /**\n * [dampingRatio = 0.7] The damping ratio. 0 = no damping, 1 = critical\n * damping.\n */\n dampingRatio?: number;\n}\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointDef extends JointDef, MouseJointOpt {\n /**\n * The initial world target point. This is assumed to coincide with the body\n * anchor initially.\n */\n target: Vec2;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n frequencyHz : 5.0,\n dampingRatio : 0.7\n};\n\n/**\n * A mouse joint is used to make a point on a body track a specified world\n * point. This a soft constraint with a maximum force. This allows the\n * constraint to stretch and without applying huge forces.\n *\n * NOTE: this joint is not documented in the manual because it was developed to\n * be used in the testbed. If you want to learn how to use the mouse joint, look\n * at the testbed.\n */\nexport default class MouseJoint extends Joint {\n static TYPE = 'mouse-joint' as const;\n\n /** @internal */ m_type: 'mouse-joint';\n /** @internal */ m_targetA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_impulse: Vec2;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_beta: number;\n /** @internal */ m_gamma: number;\n // Solver temp\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat22;\n /** @internal */ m_C: Vec2;\n\n constructor(def: MouseJointDef);\n constructor(def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2);\n constructor(def: MouseJointDef, bodyA?: Body, bodyB?: Body, target?: Vec2) {\n // @ts-ignore\n if (!(this instanceof MouseJoint)) {\n return new MouseJoint(def, bodyA, bodyB, target);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MouseJoint.TYPE;\n\n _ASSERT && common.assert(Math.isFinite(def.maxForce) && def.maxForce >= 0.0);\n _ASSERT && common.assert(Math.isFinite(def.frequencyHz) && def.frequencyHz >= 0.0);\n _ASSERT && common.assert(Math.isFinite(def.dampingRatio) && def.dampingRatio >= 0.0);\n\n this.m_targetA = target ? Vec2.clone(target) : def.target || Vec2.zero();\n this.m_localAnchorB = Transform.mulTVec2(bodyB.getTransform(), this.m_targetA);\n\n this.m_maxForce = def.maxForce;\n this.m_impulse = Vec2.zero();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_beta = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rB = Vec2.zero();\n this.m_localCenterB = Vec2.zero();\n this.m_invMassB = 0.0;\n this.m_invIB = 0.0;\n this.m_mass = new Mat22();\n this.m_C = Vec2.zero();\n\n // p = attached point, m = mouse point\n // C = p - m\n // Cdot = v\n // = v + cross(w, r)\n // J = [I r_skew]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n target: this.m_targetA,\n maxForce: this.m_maxForce,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n _localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MouseJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.target = Vec2.clone(data.target);\n const joint = new MouseJoint(data);\n if (data._localAnchorB) {\n joint.m_localAnchorB = data._localAnchorB;\n }\n return joint;\n }\n\n /**\n * Use this to update the target point.\n */\n setTarget(target: Vec2): void {\n if (this.m_bodyB.isAwake() == false) {\n this.m_bodyB.setAwake(true);\n }\n this.m_targetA = Vec2.clone(target);\n }\n\n getTarget(): Vec2 {\n return this.m_targetA;\n }\n\n /**\n * Set the maximum force in Newtons.\n */\n setMaxForce(force: number): void {\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum force in Newtons.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the frequency in Hertz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get the frequency in Hertz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set the damping ratio (dimensionless).\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get the damping ratio (dimensionless).\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return Vec2.clone(this.m_targetA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_impulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * 0.0;\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_targetA.sub(newOrigin);\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const position = this.m_bodyB.c_position;\n const velocity = this.m_bodyB.c_velocity;\n\n const cB = position.c;\n const aB = position.a;\n const vB = velocity.v;\n let wB = velocity.w;\n\n const qB = Rot.neo(aB);\n\n const mass = this.m_bodyB.getMass();\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = mass * (omega * omega);\n\n // magic formulas\n // gamma has units of inverse mass.\n // beta has units of inverse time.\n const h = step.dt;\n _ASSERT && common.assert(d + h * k > Math.EPSILON);\n this.m_gamma = h * (d + h * k);\n if (this.m_gamma != 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n this.m_beta = h * k * this.m_gamma;\n\n // Compute the effective mass matrix.\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) *\n // invI2 * skew(r2)]\n // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y\n // -r1.x*r1.y]\n // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x]\n const K = new Mat22();\n K.ex.x = this.m_invMassB + this.m_invIB * this.m_rB.y * this.m_rB.y\n + this.m_gamma;\n K.ex.y = -this.m_invIB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = this.m_invMassB + this.m_invIB * this.m_rB.x * this.m_rB.x\n + this.m_gamma;\n\n this.m_mass = K.getInverse();\n\n this.m_C.setVec2(cB);\n this.m_C.addCombine(1, this.m_rB, -1, this.m_targetA);\n this.m_C.mul(this.m_beta);\n\n // Cheat with some damping\n wB *= 0.98;\n\n if (step.warmStarting) {\n this.m_impulse.mul(step.dtRatio);\n vB.addMul(this.m_invMassB, this.m_impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, this.m_impulse);\n\n } else {\n this.m_impulse.setZero();\n }\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const velocity = this.m_bodyB.c_velocity;\n const vB = Vec2.clone(velocity.v);\n let wB = velocity.w;\n\n // Cdot = v + cross(w, r)\n\n const Cdot = Vec2.crossNumVec2(wB, this.m_rB);\n Cdot.add(vB);\n\n Cdot.addCombine(1, this.m_C, this.m_gamma, this.m_impulse);\n Cdot.neg();\n\n let impulse = Mat22.mulVec2(this.m_mass, Cdot);\n\n const oldImpulse = Vec2.clone(this.m_impulse);\n this.m_impulse.add(impulse);\n const maxImpulse = step.dt * this.m_maxForce;\n this.m_impulse.clamp(maxImpulse);\n impulse = Vec2.sub(this.m_impulse, oldImpulse);\n\n vB.addMul(this.m_invMassB, impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\n// tslint:disable-next-line:no-empty-interface\nexport interface PulleyJointOpt extends JointOpt {\n}\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\nexport interface PulleyJointDef extends JointDef, PulleyJointOpt {\n /**\n * The first ground anchor in world coordinates. This point never moves.\n */\n groundAnchorA: Vec2;\n /**\n * The second ground anchor in world coordinates. This point never moves.\n */\n groundAnchorB: Vec2;\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The reference length for the segment attached to bodyA.\n */\n lengthA: number;\n /**\n * The reference length for the segment attached to bodyB.\n */\n lengthB: number;\n /**\n * The pulley ratio, used to simulate a block-and-tackle.\n */\n ratio: number;\n}\n\nconst DEFAULTS = {\n collideConnected : true\n};\n\n/**\n * The pulley joint is connected to two bodies and two fixed ground points. The\n * pulley supports a ratio such that: length1 + ratio * length2 <= constant\n *\n * Yes, the force transmitted is scaled by the ratio.\n *\n * Warning: the pulley joint can get a bit squirrelly by itself. They often work\n * better when combined with prismatic joints. You should also cover the the\n * anchor points with static shapes to prevent one side from going to zero\n * length.\n */\nexport default class PulleyJoint extends Joint {\n static TYPE = 'pulley-joint' as const;\n // static MIN_PULLEY_LENGTH: number = 2.0; // TODO where this is used?\n\n /** @internal */ m_type: 'pulley-joint';\n /** @internal */ m_groundAnchorA: Vec2;\n /** @internal */ m_groundAnchorB: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_lengthA: number;\n /** @internal */ m_lengthB: number;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_uA: Vec2;\n /** @internal */ m_uB: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: PulleyJointDef);\n constructor(def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number);\n constructor(def: PulleyJointDef, bodyA?: Body, bodyB?: Body, groundA?: Vec2, groundB?: Vec2, anchorA?: Vec2, anchorB?: Vec2, ratio?: number) {\n // @ts-ignore\n if (!(this instanceof PulleyJoint)) {\n return new PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PulleyJoint.TYPE;\n this.m_groundAnchorA = groundA ? groundA : def.groundAnchorA || Vec2.neo(-1.0, 1.0);\n this.m_groundAnchorB = groundB ? groundB : def.groundAnchorB || Vec2.neo(1.0, 1.0);\n this.m_localAnchorA = anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n this.m_lengthA = Math.isFinite(def.lengthA) ? def.lengthA : Vec2.distance(anchorA, groundA);\n this.m_lengthB = Math.isFinite(def.lengthB) ? def.lengthB : Vec2.distance(anchorB, groundB);\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n _ASSERT && common.assert(ratio > Math.EPSILON);\n\n this.m_constant = this.m_lengthA + this.m_ratio * this.m_lengthB;\n\n this.m_impulse = 0.0;\n\n // Pulley:\n // length1 = norm(p1 - s1)\n // length2 = norm(p2 - s2)\n // C0 = (length1 + ratio * length2)_initial\n // C = C0 - (length1 + ratio * length2)\n // u1 = (p1 - s1) / norm(p1 - s1)\n // u2 = (p2 - s2) / norm(p2 - s2)\n // Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2))\n // J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 *\n // cross(r2, u2)^2)\n }\n\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n groundAnchorA: this.m_groundAnchorA,\n groundAnchorB: this.m_groundAnchorB,\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n lengthA: this.m_lengthA,\n lengthB: this.m_lengthB,\n ratio: this.m_ratio,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PulleyJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new PulleyJoint(data);\n return joint;\n }\n\n /**\n * Get the first ground anchor.\n */\n getGroundAnchorA(): Vec2 {\n return this.m_groundAnchorA;\n }\n\n /**\n * Get the second ground anchor.\n */\n getGroundAnchorB(): Vec2 {\n return this.m_groundAnchorB;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getLengthA(): number {\n return this.m_lengthA;\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getLengthB(): number {\n return this.m_lengthB;\n }\n\n /**\n * Get the pulley ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getCurrentLengthA(): number {\n const p = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const s = this.m_groundAnchorA;\n return Vec2.distance(p, s);\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getCurrentLengthB(): number {\n const p = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const s = this.m_groundAnchorB;\n return Vec2.distance(p, s);\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n *\n * @param newOrigin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_groundAnchorA.sub(newOrigin);\n this.m_groundAnchorB.sub(newOrigin);\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_uB).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n this.m_uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n this.m_uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = this.m_uA.length();\n const lengthB = this.m_uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n this.m_uA.mul(1.0 / lengthA);\n } else {\n this.m_uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n this.m_uB.mul(1.0 / lengthB);\n } else {\n this.m_uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(this.m_rA, this.m_uA); // float\n const ruB = Vec2.crossVec2Vec2(this.m_rB, this.m_uB); // float\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n this.m_mass = mA + this.m_ratio * this.m_ratio * mB;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support variable time steps.\n this.m_impulse *= step.dtRatio;\n\n // Warm starting.\n const PA = Vec2.mulNumVec2(-this.m_impulse, this.m_uA);\n const PB = Vec2.mulNumVec2(-this.m_ratio * this.m_impulse, this.m_uB);\n\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n\n const Cdot = -Vec2.dot(this.m_uA, vpA) - this.m_ratio\n * Vec2.dot(this.m_uB, vpB); // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const PA = Vec2.mulNumVec2(-impulse, this.m_uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, this.m_uB); // Vec2\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n const uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n const uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = uA.length();\n const lengthB = uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n uA.mul(1.0 / lengthA);\n } else {\n uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n uB.mul(1.0 / lengthB);\n } else {\n uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(rA, uA);\n const ruB = Vec2.crossVec2Vec2(rB, uB);\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n let mass = mA + this.m_ratio * this.m_ratio * mB; // float\n\n if (mass > 0.0) {\n mass = 1.0 / mass;\n }\n\n const C = this.m_constant - lengthA - this.m_ratio * lengthB; // float\n const linearError = Math.abs(C); // float\n\n const impulse = -mass * C; // float\n\n const PA = Vec2.mulNumVec2(-impulse, uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, uB); // Vec2\n\n cA.addMul(this.m_invMassA, PA);\n aA += this.m_invIA * Vec2.crossVec2Vec2(rA, PA);\n cB.addMul(this.m_invMassB, PB);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, PB);\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointOpt extends JointOpt {\n /**\n * The maximum length of the rope.\n * Warning: this must be larger than linearSlop or the joint will have no effect.\n */\n maxLength?: number;\n}\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointDef extends JointDef, RopeJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxLength : 0.0,\n};\n\n/**\n * A rope joint enforces a maximum distance between two points on two bodies. It\n * has no other effect.\n *\n * Warning: if you attempt to change the maximum length during the simulation\n * you will get some non-physical behavior.\n *\n * A model that would allow you to dynamically modify the length would have some\n * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you\n * want to dynamically control length.\n */\nexport default class RopeJoint extends Joint {\n static TYPE = 'rope-joint' as const;\n\n /** @internal */ m_type: 'rope-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n /** @internal */ m_maxLength: number;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_length: number;\n /** @internal */ m_state: number; // TODO enum\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n constructor(def: RopeJointDef);\n constructor(def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: RopeJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (!(this instanceof RopeJoint)) {\n return new RopeJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RopeJoint.TYPE;\n this.m_localAnchorA = anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n\n this.m_maxLength = def.maxLength;\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_length = 0.0;\n this.m_state = inactiveLimit;\n\n // Limit:\n // C = norm(pB - pA) - L\n // u = (pB - pA) / norm(pB - pA)\n // Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA))\n // J = [-u -cross(rA, u) u cross(rB, u)]\n // K = J * invM * JT\n // = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n maxLength: this.m_maxLength,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): RopeJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RopeJoint(data);\n return joint;\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum length of the rope.\n */\n setMaxLength(length: number): void {\n this.m_maxLength = length;\n }\n\n /**\n * Get the maximum length of the rope.\n */\n getMaxLength(): number {\n return this.m_maxLength;\n }\n\n getLimitState(): number {\n // TODO LimitState\n return this.m_state;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n this.m_rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n this.m_u = Vec2.zero();\n this.m_u.addCombine(1, cB, 1, this.m_rB);\n this.m_u.subCombine(1, cA, 1, this.m_rA); // Vec2\n\n this.m_length = this.m_u.length();\n\n const C = this.m_length - this.m_maxLength; // float\n if (C > 0.0) {\n this.m_state = atUpperLimit;\n } else {\n this.m_state = inactiveLimit;\n }\n\n if (this.m_length > Settings.linearSlop) {\n this.m_u.mul(1.0 / this.m_length);\n } else {\n this.m_u.setZero();\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n return;\n }\n\n // Compute effective mass.\n const crA = Vec2.crossVec2Vec2(this.m_rA, this.m_u); // float\n const crB = Vec2.crossVec2Vec2(this.m_rB, this.m_u); // float\n const invMass = this.m_invMassA + this.m_invIA * crA * crA + this.m_invMassB\n + this.m_invIB * crB * crB; // float\n\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.addCrossNumVec2(vA, wA, this.m_rA); // Vec2\n const vpB = Vec2.addCrossNumVec2(vB, wB, this.m_rB); // Vec2\n const C = this.m_length - this.m_maxLength; // float\n let Cdot = Vec2.dot(this.m_u, Vec2.sub(vpB, vpA)); // float\n\n // Predictive constraint.\n if (C < 0.0) {\n Cdot += step.inv_dt * C;\n }\n\n let impulse = -this.m_mass * Cdot; // float\n const oldImpulse = this.m_impulse; // float\n this.m_impulse = Math.min(0.0, this.m_impulse + impulse);\n impulse = this.m_impulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u); // Vec2\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c; // Vec2\n let aA = this.m_bodyA.c_position.a; // float\n const cB = this.m_bodyB.c_position.c; // Vec2\n let aB = this.m_bodyB.c_position.a; // float\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.zero();\n u.addCombine(1, cB, 1, rB);\n u.subCombine(1, cA, 1, rA); // Vec2\n\n const length = u.normalize(); // float\n let C = length - this.m_maxLength; // float\n\n C = Math.clamp(C, 0.0, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C; // float\n const P = Vec2.mulNumVec2(impulse, u); // Vec2\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return length - this.m_maxLength < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Vec3 from '../../common/Vec3';\nimport Mat33 from '../../common/Mat33';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n *\n * @prop {float} frequencyHz\n * @prop {float} dampingRatio\n *\n * @prop {Vec2} localAnchorA\n * @prop {Vec2} localAnchorB\n * @prop {float} referenceAngle\n */\nexport interface WeldJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. Rotation only. Disable softness\n * with a value of 0.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle?: number;\n}\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n */\nexport interface WeldJointDef extends JointDef, WeldJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0,\n};\n\n/**\n * A weld joint essentially glues two bodies together. A weld joint may distort\n * somewhat because the island constraint solver is approximate.\n */\nexport default class WeldJoint extends Joint {\n static TYPE = 'weld-joint' as const\n\n /** @internal */ m_type: 'weld-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_impulse: Vec3;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat33;\n\n constructor(def: WeldJointDef);\n constructor(def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: WeldJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (!(this instanceof WeldJoint)) {\n return new WeldJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WeldJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_impulse = new Vec3();\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rA; // Vec2\n this.m_rB; // Vec2\n this.m_localCenterA; // Vec2\n this.m_localCenterB; // Vec2\n this.m_invMassA; // float\n this.m_invMassB; // float\n this.m_invIA; // float\n this.m_invIB; // float\n this.m_mass = new Mat33();\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // / = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // C = angle2 - angle1 - referenceAngle\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WeldJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WeldJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Set frequency in Hz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get frequency in Hz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set damping ratio.\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get damping ratio.\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat33();\n K.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y * this.m_rB.y\n * iB;\n K.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y * this.m_rB.x * iB;\n K.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x * this.m_rB.x\n * iB;\n K.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n K.getInverse22(this.m_mass);\n\n let invM = iA + iB; // float\n const m = invM > 0.0 ? 1.0 / invM : 0.0; // float\n\n const C = aB - aA - this.m_referenceAngle; // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const d = 2.0 * m * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = m * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invM += this.m_gamma;\n this.m_mass.ez.z = invM != 0.0 ? 1.0 / invM : 0.0;\n } else if (K.ez.z == 0.0) {\n K.getInverse22(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n } else {\n K.getSymInverse33(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n if (this.m_frequencyHz > 0.0) {\n const Cdot2 = wB - wA; // float\n\n const impulse2 = -this.m_mass.ez.z\n * (Cdot2 + this.m_bias + this.m_gamma * this.m_impulse.z); // float\n this.m_impulse.z += impulse2;\n\n wA -= iA * impulse2;\n wB += iB * impulse2;\n\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n\n const impulse1 = Vec2.neg(Mat33.mulVec2(this.m_mass, Cdot1)); // Vec2\n this.m_impulse.x += impulse1.x;\n this.m_impulse.y += impulse1.y;\n\n const P = Vec2.clone(impulse1); // Vec2\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, P);\n } else {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); // Vec3\n\n const impulse = Vec3.neg(Mat33.mulVec3(this.m_mass, Cdot)); // Vec3\n this.m_impulse.add(impulse);\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n let positionError: number;\n let angularError: number;\n\n const K = new Mat33();\n K.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB;\n K.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB;\n K.ez.x = -rA.y * iA - rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB;\n K.ez.y = rA.x * iA + rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA); // Vec2\n\n positionError = C1.length();\n angularError = 0.0;\n\n const P = Vec2.neg(K.solve22(C1)); // Vec2\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n } else {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA);\n\n const C2 = aB - aA - this.m_referenceAngle; // float\n\n positionError = C1.length();\n angularError = Math.abs(C2);\n\n const C = new Vec3(C1.x, C1.y, C2);\n\n let impulse = new Vec3();\n if (K.ez.z > 0.0) {\n impulse = Vec3.neg(K.solve33(C));\n } else {\n const impulse2 = Vec2.neg(K.solve22(C1));\n impulse.set(impulse2.x, impulse2.y, 0.0);\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n cA.subMul(mA, P);\n aA -= iA * (Vec2.crossVec2Vec2(rA, P) + impulse.z);\n\n cB.addMul(mB, P);\n aB += iB * (Vec2.crossVec2Vec2(rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointOpt extends JointOpt {\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n /**\n * Suspension frequency, zero indicates no suspension.\n */\n frequencyHz?: number;\n /**\n * Suspension damping ratio, one indicates critical damping.\n */\n dampingRatio?: number;\n}\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointDef extends JointDef, WheelJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation axis in bodyA.\n */\n localAxisA: Vec2;\n}\n\nconst DEFAULTS = {\n enableMotor : false,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n frequencyHz : 2.0,\n dampingRatio : 0.7,\n};\n\n/**\n * A wheel joint. This joint provides two degrees of freedom: translation along\n * an axis fixed in bodyA and rotation in the plane. In other words, it is a\n * point to line constraint with a rotational motor and a linear spring/damper.\n * This joint is designed for vehicle suspensions.\n */\nexport default class WheelJoint extends Joint {\n static TYPE = 'wheel-joint' as const;\n\n /** @internal */ m_type: 'wheel-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_springMass: number;\n /** @internal */ m_springImpulse: number;\n\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableMotor: boolean;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n /** @internal */ m_ax: Vec2 = Vec2.zero();\n /** @internal */ m_ay: Vec2 = Vec2.zero();\n /** @internal */ m_sAx: number;\n /** @internal */ m_sBx: number;\n /** @internal */ m_sAy: number;\n /** @internal */ m_sBy: number;\n\n constructor(def: WheelJointDef);\n constructor(def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n // @ts-ignore\n constructor(def: WheelJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (!(this instanceof WheelJoint)) {\n return new WheelJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WheelJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n // @ts-ignore localAxis\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || def.localAxis || Vec2.neo(1.0, 0.0));\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n this.m_springMass = 0.0;\n this.m_springImpulse = 0.0;\n\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableMotor = def.enableMotor;\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Linear constraint (point-to-line)\n // d = pB - pA = xB + rB - xA - rA\n // C = dot(ay, d)\n // Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA,\n // rA))\n // = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB,\n // ay), vB)\n // J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)]\n\n // Spring linear constraint\n // C = dot(ax, d)\n // Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) +\n // dot(cross(rB, ax), vB)\n // J = [-ax -cross(d+rA, ax) ax cross(rB, ax)]\n\n // Motor rotational constraint\n // Cdot = wB - wA\n // J = [0 0 -1 0 0 1]\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n enableMotor: this.m_enableMotor,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WheelJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WheelJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const pA = bA.getWorldPoint(this.m_localAnchorA); // Vec2\n const pB = bB.getWorldPoint(this.m_localAnchorB); // Vec2\n const d = Vec2.sub(pB, pA); // Vec2\n const axis = bA.getWorldVector(this.m_localXAxisA); // Vec2\n\n const translation = Vec2.dot(d, axis); // float\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const wA = this.m_bodyA.m_angularVelocity;\n const wB = this.m_bodyB.m_angularVelocity;\n return wB - wA;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed, usually in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set/Get the maximum motor force, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Get the current motor torque given the inverse time step, usually in N-m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set/Get the spring frequency in hertz. Setting the frequency to zero disables\n * the spring.\n */\n setSpringFrequencyHz(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getSpringFrequencyHz(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set/Get the spring damping ratio\n */\n setSpringDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getSpringDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA); // Vec2\n\n // Point to line constraint\n {\n this.m_ay = Rot.mulVec2(qA, this.m_localYAxisA);\n this.m_sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ay);\n this.m_sBy = Vec2.crossVec2Vec2(rB, this.m_ay);\n\n this.m_mass = mA + mB + iA * this.m_sAy * this.m_sAy + iB * this.m_sBy\n * this.m_sBy;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n }\n\n // Spring constraint\n this.m_springMass = 0.0;\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n if (this.m_frequencyHz > 0.0) {\n this.m_ax = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_sAx = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ax);\n this.m_sBx = Vec2.crossVec2Vec2(rB, this.m_ax);\n\n const invMass = mA + mB + iA * this.m_sAx * this.m_sAx + iB * this.m_sBx\n * this.m_sBx; // float\n\n if (invMass > 0.0) {\n this.m_springMass = 1.0 / invMass;\n\n const C = Vec2.dot(d, this.m_ax); // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const damp = 2.0 * this.m_springMass * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = this.m_springMass * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (damp + h * k);\n if (this.m_gamma > 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n\n this.m_bias = C * h * k * this.m_gamma;\n\n this.m_springMass = invMass + this.m_gamma;\n if (this.m_springMass > 0.0) {\n this.m_springMass = 1.0 / this.m_springMass;\n }\n }\n } else {\n this.m_springImpulse = 0.0;\n }\n\n // Rotational motor\n if (this.m_enableMotor) {\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n } else {\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse *= step.dtRatio;\n this.m_springImpulse *= step.dtRatio;\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax);\n const LA = this.m_impulse * this.m_sAy + this.m_springImpulse * this.m_sAx + this.m_motorImpulse;\n const LB = this.m_impulse * this.m_sBy + this.m_springImpulse * this.m_sBx + this.m_motorImpulse;\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * LA;\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * LB;\n\n } else {\n this.m_impulse = 0.0;\n this.m_springImpulse = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Solve spring constraint\n {\n const Cdot = Vec2.dot(this.m_ax, vB) - Vec2.dot(this.m_ax, vA) + this.m_sBx\n * wB - this.m_sAx * wA; // float\n const impulse = -this.m_springMass\n * (Cdot + this.m_bias + this.m_gamma * this.m_springImpulse); // float\n this.m_springImpulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ax); // Vec2\n const LA = impulse * this.m_sAx; // float\n const LB = impulse * this.m_sBx; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n // Solve rotational motor constraint\n {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve point to line constraint\n {\n const Cdot = Vec2.dot(this.m_ay, vB) - Vec2.dot(this.m_ay, vA) + this.m_sBy\n * wB - this.m_sAy * wA; // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ay); // Vec2\n const LA = impulse * this.m_sAy; // float\n const LB = impulse * this.m_sBy; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const ay = Rot.mulVec2(qA, this.m_localYAxisA);\n\n const sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), ay); // float\n const sBy = Vec2.crossVec2Vec2(rB, ay); // float\n\n const C = Vec2.dot(d, ay); // float\n\n const k = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_sAy\n * this.m_sAy + this.m_invIB * this.m_sBy * this.m_sBy; // float\n\n let impulse; // float\n if (k != 0.0) {\n impulse = -C / k;\n } else {\n impulse = 0.0;\n }\n\n const P = Vec2.mulNumVec2(impulse, ay); // Vec2\n const LA = impulse * sAy; // float\n const LB = impulse * sBy; // float\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * LA;\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * LB;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) <= Settings.linearSlop;\n }\n\n}\n","// tslint:disable:typedef\nimport World from '../dynamics/World';\nimport Body from '../dynamics/Body';\nimport Joint from '../dynamics/Joint';\nimport Fixture from '../dynamics/Fixture';\nimport Shape from '../collision/Shape';\nimport Vec2 from '../common/Vec2';\nimport Vec3 from '../common/Vec3';\nimport ChainShape from \"../collision/shape/ChainShape\";\nimport BoxShape from \"../collision/shape/BoxShape\";\nimport EdgeShape from \"../collision/shape/EdgeShape\";\nimport PolygonShape from \"../collision/shape/PolygonShape\";\nimport CircleShape from \"../collision/shape/CircleShape\";\nimport DistanceJoint from \"../dynamics/joint/DistanceJoint\";\nimport FrictionJoint from \"../dynamics/joint/FrictionJoint\";\nimport GearJoint from \"../dynamics/joint/GearJoint\";\nimport MotorJoint from \"../dynamics/joint/MotorJoint\";\nimport MouseJoint from \"../dynamics/joint/MouseJoint\";\nimport PrismaticJoint from \"../dynamics/joint/PrismaticJoint\";\nimport PulleyJoint from \"../dynamics/joint/PulleyJoint\";\nimport RevoluteJoint from \"../dynamics/joint/RevoluteJoint\";\nimport RopeJoint from \"../dynamics/joint/RopeJoint\";\nimport WeldJoint from \"../dynamics/joint/WeldJoint\";\nimport WheelJoint from \"../dynamics/joint/WheelJoint\";\n\nlet SID = 0;\n\nfunction Serializer(opts?) {\n opts = opts || {};\n\n const rootClass = opts.rootClass || World;\n\n const preSerialize = opts.preSerialize || function(obj) { return obj; };\n const postSerialize = opts.postSerialize || function(data, obj) { return data; };\n\n const preDeserialize = opts.preDeserialize || function(data) { return data; };\n const postDeserialize = opts.postDeserialize || function(obj, data) { return obj; };\n\n // This is used to create ref objects during serialize\n const refTypes = {\n World,\n Body,\n Joint,\n Fixture,\n Shape,\n };\n\n // This is used by restore to deserialize objects and refs\n const restoreTypes = {\n Vec2,\n Vec3,\n ...refTypes\n };\n\n const CLASS_BY_TYPE_PROP = {\n [Body.STATIC]: Body,\n [Body.DYNAMIC]: Body,\n [Body.KINEMATIC]: Body,\n [ChainShape.TYPE]: ChainShape,\n [BoxShape.TYPE]: BoxShape,\n [EdgeShape.TYPE]: EdgeShape,\n [PolygonShape.TYPE]: PolygonShape,\n [CircleShape.TYPE]: CircleShape,\n [DistanceJoint.TYPE]: DistanceJoint,\n [FrictionJoint.TYPE]: FrictionJoint,\n [GearJoint.TYPE]: GearJoint,\n [MotorJoint.TYPE]: MotorJoint,\n [MouseJoint.TYPE]: MouseJoint,\n [PrismaticJoint.TYPE]: PrismaticJoint,\n [PulleyJoint.TYPE]: PulleyJoint,\n [RevoluteJoint.TYPE]: RevoluteJoint,\n [RopeJoint.TYPE]: RopeJoint,\n [WeldJoint.TYPE]: WeldJoint,\n [WheelJoint.TYPE]: WheelJoint,\n }\n\n this.toJson = function(root) {\n const json = [];\n\n const queue = [root];\n const refMap = {};\n\n function storeRef(value, typeName) {\n value.__sid = value.__sid || ++SID;\n if (!refMap[value.__sid]) {\n queue.push(value);\n const index = json.length + queue.length;\n const ref = {\n refIndex: index,\n refType: typeName\n };\n refMap[value.__sid] = ref;\n }\n return refMap[value.__sid];\n }\n\n function serialize(obj) {\n obj = preSerialize(obj);\n let data = obj._serialize();\n data = postSerialize(data, obj);\n return data;\n }\n\n function toJson(value, top?) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (typeof value._serialize === 'function') {\n if (value !== top) {\n // tslint:disable-next-line:no-for-in\n for (const typeName in refTypes) {\n if (value instanceof refTypes[typeName]) {\n return storeRef(value, typeName);\n }\n }\n }\n value = serialize(value);\n }\n if (Array.isArray(value)) {\n const newValue = [];\n for (let key = 0; key < value.length; key++) {\n newValue[key] = toJson(value[key]);\n }\n value = newValue;\n\n } else {\n const newValue = {};\n // tslint:disable-next-line:no-for-in\n for (const key in value) {\n if (value.hasOwnProperty(key)) {\n newValue[key] = toJson(value[key]);\n }\n }\n value = newValue;\n }\n return value;\n }\n\n while (queue.length) {\n const obj = queue.shift();\n const str = toJson(obj, obj);\n json.push(str);\n }\n\n return json;\n };\n\n this.fromJson = function(json: object) {\n const refMap = {};\n\n function findDeserilizer(data, cls) {\n if (!cls || !cls._deserialize) {\n cls = CLASS_BY_TYPE_PROP[data.type]\n }\n return cls && cls._deserialize;\n }\n\n /**\n * Deserialize a data object.\n */\n function deserialize(cls, data, ctx) {\n const deserializer = findDeserilizer(data, cls);\n if (!deserializer) {\n return;\n }\n data = preDeserialize(data);\n let obj = deserializer(data, ctx, restoreRef);\n obj = postDeserialize(obj, data);\n return obj;\n }\n\n /**\n * Restore a ref object or deserialize a data object.\n *\n * This is passed as callback to class deserializers.\n */\n function restoreRef(cls, ref, ctx) {\n if (!ref.refIndex) {\n return cls && cls._deserialize && deserialize(cls, ref, ctx);\n }\n cls = restoreTypes[ref.refType] || cls;\n const index = ref.refIndex;\n if (!refMap[index]) {\n const data = json[index];\n const obj = deserialize(cls, data, ctx);\n refMap[index] = obj;\n }\n return refMap[index];\n }\n\n const root = rootClass._deserialize(json[0], null, restoreRef);\n\n return root;\n };\n}\n\nconst serializer = new Serializer();\n\nSerializer.toJson = serializer.toJson;\nSerializer.fromJson = serializer.fromJson;\n\nexport default Serializer;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nimport common from '../../util/common';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Contact from '../../dynamics/Contact';\nimport CircleShape from './CircleShape';\nimport Manifold, { ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact);\n\nfunction CircleCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == CircleShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE);\n CollideCircles(manifold, fixtureA.getShape() as CircleShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport function CollideCircles(manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n const pA = Transform.mulVec2(xfA, circleA.m_p);\n const pB = Transform.mulVec2(xfB, circleB.m_p);\n\n const distSqr = Vec2.distanceSquared(pB, pA);\n const rA = circleA.m_radius;\n const rB = circleB.m_radius;\n const radius = rA + rB;\n if (distSqr > radius * radius) {\n return;\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localPoint.setVec2(circleA.m_p);\n manifold.localNormal.setZero();\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Contact from '../../dynamics/Contact';\nimport EdgeShape from './EdgeShape';\nimport ChainShape from './ChainShape';\nimport CircleShape from './CircleShape';\nimport Manifold, { ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, CircleShape.TYPE, EdgeCircleContact);\nContact.addType(ChainShape.TYPE, CircleShape.TYPE, ChainCircleContact);\n\nfunction EdgeCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == EdgeShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const shapeA = fixtureA.getShape() as EdgeShape;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\nfunction ChainCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == ChainShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const chain = fixtureA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n const shapeA = edge;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\n// Compute contact points for edge versus circle.\n// This accounts for edge connectivity.\nexport function CollideEdgeCircle(manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle in frame of edge\n const Q = Transform.mulTVec2(xfA, Transform.mulVec2(xfB, circleB.m_p));\n\n const A = edgeA.m_vertex1;\n const B = edgeA.m_vertex2;\n const e = Vec2.sub(B, A);\n\n // Barycentric coordinates\n const u = Vec2.dot(e, Vec2.sub(B, Q));\n const v = Vec2.dot(e, Vec2.sub(Q, A));\n\n const radius = edgeA.m_radius + circleB.m_radius;\n\n // Region A\n if (v <= 0.0) {\n const P = Vec2.clone(A);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to A?\n if (edgeA.m_hasVertex0) {\n const A1 = edgeA.m_vertex0;\n const B1 = A;\n const e1 = Vec2.sub(B1, A1);\n const u1 = Vec2.dot(e1, Vec2.sub(B1, Q));\n\n // Is the circle in Region AB of the previous edge?\n if (u1 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region B\n if (u <= 0.0) {\n const P = Vec2.clone(B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to B?\n if (edgeA.m_hasVertex3) {\n const B2 = edgeA.m_vertex3;\n const A2 = B;\n const e2 = Vec2.sub(B2, A2);\n const v2 = Vec2.dot(e2, Vec2.sub(Q, A2));\n\n // Is the circle in Region AB of the next edge?\n if (v2 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 1;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region AB\n const den = Vec2.dot(e, e);\n _ASSERT && common.assert(den > 0.0);\n const P = Vec2.combine(u / den, A, v / den, B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n const n = Vec2.neo(-e.y, e.x);\n if (Vec2.dot(n, Vec2.sub(Q, A)) < 0.0) {\n n.setNum(-n.x, -n.y);\n }\n n.normalize();\n\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal = n;\n manifold.localPoint.setVec2(A);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_face;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Transform from '../../common/Transform';\nimport Rot from '../../common/Rot';\nimport Vec2 from '../../common/Vec2';\nimport Settings from '../../Settings';\nimport Manifold, { clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport Contact from '../../dynamics/Contact';\nimport PolygonShape from './PolygonShape';\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, PolygonShape.TYPE, PolygonContact);\n\nfunction PolygonContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == PolygonShape.TYPE);\n CollidePolygons(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as PolygonShape, xfB);\n}\n\ninterface MaxSeparation {\n maxSeparation: number;\n bestIndex: number;\n}\n\n/**\n * Find the max separation between poly1 and poly2 using edge normals from\n * poly1.\n */\nfunction findMaxSeparation(poly1: PolygonShape, xf1: Transform, poly2: PolygonShape, xf2: Transform, output: MaxSeparation): void {\n const count1 = poly1.m_count;\n const count2 = poly2.m_count;\n const n1s = poly1.m_normals;\n const v1s = poly1.m_vertices;\n const v2s = poly2.m_vertices;\n const xf = Transform.mulTXf(xf2, xf1);\n\n let bestIndex = 0;\n let maxSeparation = -Infinity;\n for (let i = 0; i < count1; ++i) {\n // Get poly1 normal in frame2.\n const n = Rot.mulVec2(xf.q, n1s[i]);\n const v1 = Transform.mulVec2(xf, v1s[i]);\n\n // Find deepest point for normal i.\n let si = Infinity;\n for (let j = 0; j < count2; ++j) {\n const sij = Vec2.dot(n, v2s[j]) - Vec2.dot(n, v1);\n if (sij < si) {\n si = sij;\n }\n }\n\n if (si > maxSeparation) {\n maxSeparation = si;\n bestIndex = i;\n }\n }\n\n // used to keep last FindMaxSeparation call values\n output.maxSeparation = maxSeparation;\n output.bestIndex = bestIndex;\n}\n\nfunction findIncidentEdge(c: ClipVertex[], poly1: PolygonShape, xf1: Transform, edge1: number, poly2: PolygonShape, xf2: Transform): void {\n const normals1 = poly1.m_normals;\n\n const count2 = poly2.m_count;\n const vertices2 = poly2.m_vertices;\n const normals2 = poly2.m_normals;\n\n _ASSERT && common.assert(0 <= edge1 && edge1 < poly1.m_count);\n\n // Get the normal of the reference edge in poly2's frame.\n const normal1 = Rot.mulTVec2(xf2.q, Rot.mulVec2(xf1.q, normals1[edge1]));\n\n // Find the incident edge on poly2.\n let index = 0;\n let minDot = Infinity;\n for (let i = 0; i < count2; ++i) {\n const dot = Vec2.dot(normal1, normals2[i]);\n if (dot < minDot) {\n minDot = dot;\n index = i;\n }\n }\n\n // Build the clip vertices for the incident edge.\n const i1 = index;\n const i2 = i1 + 1 < count2 ? i1 + 1 : 0;\n\n c[0].v = Transform.mulVec2(xf2, vertices2[i1]);\n c[0].id.cf.indexA = edge1;\n c[0].id.cf.indexB = i1;\n c[0].id.cf.typeA = ContactFeatureType.e_face;\n c[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n c[1].v = Transform.mulVec2(xf2, vertices2[i2]);\n c[1].id.cf.indexA = edge1;\n c[1].id.cf.indexB = i2;\n c[1].id.cf.typeA = ContactFeatureType.e_face;\n c[1].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n\nconst maxSeparation = {\n maxSeparation: 0,\n bestIndex: 0,\n};\n\n/**\n *\n * Find edge normal of max separation on A - return if separating axis is found
\n * Find edge normal of max separation on B - return if separation axis is found
\n * Choose reference edge as min(minA, minB)
\n * Find incident edge
\n * Clip\n *\n * The normal points from 1 to 2\n */\nexport function CollidePolygons(manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform): void {\n manifold.pointCount = 0;\n const totalRadius = polyA.m_radius + polyB.m_radius;\n\n findMaxSeparation(polyA, xfA, polyB, xfB, maxSeparation);\n const edgeA = maxSeparation.bestIndex;\n const separationA = maxSeparation.maxSeparation;\n if (separationA > totalRadius)\n return;\n\n findMaxSeparation(polyB, xfB, polyA, xfA, maxSeparation);\n const edgeB = maxSeparation.bestIndex;\n const separationB = maxSeparation.maxSeparation;\n if (separationB > totalRadius)\n return;\n\n let poly1; // reference polygon\n let poly2; // incident polygon\n let xf1;\n let xf2;\n let edge1; // reference edge\n let flip;\n const k_tol = 0.1 * Settings.linearSlop;\n\n if (separationB > separationA + k_tol) {\n poly1 = polyB;\n poly2 = polyA;\n xf1 = xfB;\n xf2 = xfA;\n edge1 = edgeB;\n manifold.type = ManifoldType.e_faceB;\n flip = 1;\n } else {\n poly1 = polyA;\n poly2 = polyB;\n xf1 = xfA;\n xf2 = xfB;\n edge1 = edgeA;\n manifold.type = ManifoldType.e_faceA;\n flip = 0;\n }\n\n const incidentEdge = [ new ClipVertex(), new ClipVertex() ];\n findIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);\n\n const count1 = poly1.m_count;\n const vertices1 = poly1.m_vertices;\n\n const iv1 = edge1;\n const iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0;\n\n let v11 = vertices1[iv1];\n let v12 = vertices1[iv2];\n\n const localTangent = Vec2.sub(v12, v11);\n localTangent.normalize();\n\n const localNormal = Vec2.crossVec2Num(localTangent, 1.0);\n const planePoint = Vec2.combine(0.5, v11, 0.5, v12);\n\n const tangent = Rot.mulVec2(xf1.q, localTangent);\n const normal = Vec2.crossVec2Num(tangent, 1.0);\n\n v11 = Transform.mulVec2(xf1, v11);\n v12 = Transform.mulVec2(xf1, v12);\n\n // Face offset.\n const frontOffset = Vec2.dot(normal, v11);\n\n // Side offsets, extended by polytope skin thickness.\n const sideOffset1 = -Vec2.dot(tangent, v11) + totalRadius;\n const sideOffset2 = Vec2.dot(tangent, v12) + totalRadius;\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, incidentEdge, Vec2.neg(tangent), sideOffset1, iv1);\n\n if (np < 2) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2);\n\n if (np < 2) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n manifold.localNormal = localNormal;\n manifold.localPoint = planePoint;\n\n let pointCount = 0;\n for (let i = 0; i < clipPoints2.length/* maxManifoldPoints */; ++i) {\n const separation = Vec2.dot(normal, clipPoints2[i].v) - frontOffset;\n\n if (separation <= totalRadius) {\n const cp = manifold.points[pointCount];\n cp.localPoint.setVec2(Transform.mulTVec2(xf2, clipPoints2[i].v));\n cp.id = clipPoints2[i].id;\n if (flip) {\n // Swap features\n const cf = cp.id.cf;\n const indexA = cf.indexA;\n const indexB = cf.indexB;\n const typeA = cf.typeA;\n const typeB = cf.typeB;\n cf.indexA = indexB;\n cf.indexB = indexA;\n cf.typeA = typeB;\n cf.typeB = typeA;\n }\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Math from '../../common/Math';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Contact from '../../dynamics/Contact';\nimport CircleShape from './CircleShape';\nimport PolygonShape from './PolygonShape';\nimport Manifold, { ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, CircleShape.TYPE, PolygonCircleContact);\n\nfunction PolygonCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE);\n CollidePolygonCircle(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport function CollidePolygonCircle(manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle position in the frame of the polygon.\n const c = Transform.mulVec2(xfB, circleB.m_p);\n const cLocal = Transform.mulTVec2(xfA, c);\n\n // Find the min separating edge.\n let normalIndex = 0;\n let separation = -Infinity;\n const radius = polygonA.m_radius + circleB.m_radius;\n const vertexCount = polygonA.m_count;\n const vertices = polygonA.m_vertices;\n const normals = polygonA.m_normals;\n\n for (let i = 0; i < vertexCount; ++i) {\n const s = Vec2.dot(normals[i], Vec2.sub(cLocal, vertices[i]));\n\n if (s > radius) {\n // Early out.\n return;\n }\n\n if (s > separation) {\n separation = s;\n normalIndex = i;\n }\n }\n\n // Vertices that subtend the incident face.\n const vertIndex1 = normalIndex;\n const vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0;\n const v1 = vertices[vertIndex1];\n const v2 = vertices[vertIndex2];\n\n // If the center is inside the polygon ...\n if (separation < Math.EPSILON) {\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[normalIndex]);\n manifold.localPoint.setCombine(0.5, v1, 0.5, v2);\n manifold.points[0].localPoint = circleB.m_p;\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Compute barycentric coordinates\n const u1 = Vec2.dot(Vec2.sub(cLocal, v1), Vec2.sub(v2, v1));\n const u2 = Vec2.dot(Vec2.sub(cLocal, v2), Vec2.sub(v1, v2));\n if (u1 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v1) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v1);\n manifold.localNormal.normalize();\n manifold.localPoint = v1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else if (u2 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v2) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v2);\n manifold.localNormal.normalize();\n manifold.localPoint.setVec2(v2);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else {\n const faceCenter = Vec2.mid(v1, v2);\n const separation = Vec2.dot(cLocal, normals[vertIndex1]) - Vec2.dot(faceCenter, normals[vertIndex1]);\n if (separation > radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[vertIndex1]);\n manifold.localPoint.setVec2(faceCenter);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Math from '../../common/Math';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Settings from '../../Settings';\nimport Contact from '../../dynamics/Contact';\nimport Manifold, { clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport EdgeShape from './EdgeShape';\nimport ChainShape from './ChainShape';\nimport PolygonShape from './PolygonShape';\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, PolygonShape.TYPE, EdgePolygonContact);\nContact.addType(ChainShape.TYPE, PolygonShape.TYPE, ChainPolygonContact);\n\nfunction EdgePolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fA.getType() == EdgeShape.TYPE);\n _ASSERT && common.assert(fB.getType() == PolygonShape.TYPE);\n\n CollideEdgePolygon(manifold, fA.getShape() as EdgeShape, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nfunction ChainPolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fA.getType() == ChainShape.TYPE);\n _ASSERT && common.assert(fB.getType() == PolygonShape.TYPE);\n\n const chain = fA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n CollideEdgePolygon(manifold, edge, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nenum EPAxisType {\n e_unknown = -1,\n e_edgeA = 1,\n e_edgeB = 2,\n}\n\n// unused?\nenum VertexType {\n e_isolated = 0,\n e_concave = 1,\n e_convex = 2,\n}\n\n/**\n * This structure is used to keep track of the best separating axis.\n */\nclass EPAxis {\n type: EPAxisType;\n index: number;\n separation: number;\n}\n\n/**\n * This holds polygon B expressed in frame A.\n */\nclass TempPolygon {\n vertices: Vec2[] = []; // [Settings.maxPolygonVertices]\n normals: Vec2[] = []; // [Settings.maxPolygonVertices];\n count: number = 0;\n}\n\n/**\n * Reference face used for clipping\n */\nclass ReferenceFace {\n i1: number;\n i2: number;\n v1: Vec2;\n v2: Vec2;\n normal: Vec2 = Vec2.zero();\n sideNormal1: Vec2 = Vec2.zero();\n sideOffset1: number;\n sideNormal2: Vec2 = Vec2.zero();\n sideOffset2: number;\n}\n\n// reused\nconst edgeAxis = new EPAxis();\nconst polygonAxis = new EPAxis();\nconst polygonBA = new TempPolygon();\nconst rf = new ReferenceFace();\n\n/**\n * This function collides and edge and a polygon, taking into account edge\n * adjacency.\n */\nexport function CollideEdgePolygon(manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform): void {\n // Algorithm:\n // 1. Classify v1 and v2\n // 2. Classify polygon centroid as front or back\n // 3. Flip normal if necessary\n // 4. Initialize normal range to [-pi, pi] about face normal\n // 5. Adjust normal range according to adjacent edges\n // 6. Visit each separating axes, only accept axes within the range\n // 7. Return if _any_ axis indicates separation\n // 8. Clip\n\n // let m_type1: VertexType;\n // let m_type2: VertexType;\n\n const xf = Transform.mulTXf(xfA, xfB);\n\n const centroidB = Transform.mulVec2(xf, polygonB.m_centroid);\n\n const v0 = edgeA.m_vertex0;\n const v1 = edgeA.m_vertex1;\n const v2 = edgeA.m_vertex2;\n const v3 = edgeA.m_vertex3;\n\n const hasVertex0 = edgeA.m_hasVertex0;\n const hasVertex3 = edgeA.m_hasVertex3;\n\n const edge1 = Vec2.sub(v2, v1);\n edge1.normalize();\n const normal1 = Vec2.neo(edge1.y, -edge1.x);\n const offset1 = Vec2.dot(normal1, Vec2.sub(centroidB, v1));\n let offset0 = 0.0;\n let offset2 = 0.0;\n let convex1 = false;\n let convex2 = false;\n\n let normal0;\n let normal2;\n\n // Is there a preceding edge?\n if (hasVertex0) {\n const edge0 = Vec2.sub(v1, v0);\n edge0.normalize();\n normal0 = Vec2.neo(edge0.y, -edge0.x);\n convex1 = Vec2.crossVec2Vec2(edge0, edge1) >= 0.0;\n offset0 = Vec2.dot(normal0, centroidB) - Vec2.dot(normal0, v0);\n }\n\n // Is there a following edge?\n if (hasVertex3) {\n const edge2 = Vec2.sub(v3, v2);\n edge2.normalize();\n normal2 = Vec2.neo(edge2.y, -edge2.x);\n convex2 = Vec2.crossVec2Vec2(edge1, edge2) > 0.0;\n offset2 = Vec2.dot(normal2, centroidB) - Vec2.dot(normal2, v2);\n }\n\n let front;\n const normal = Vec2.zero();\n const lowerLimit = Vec2.zero();\n const upperLimit = Vec2.zero();\n\n // Determine front or back collision. Determine collision normal limits.\n if (hasVertex0 && hasVertex3) {\n if (convex1 && convex2) {\n front = offset0 >= 0.0 || offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex1) {\n front = offset0 >= 0.0 || (offset1 >= 0.0 && offset2 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex2) {\n front = offset2 >= 0.0 || (offset0 >= 0.0 && offset1 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal0);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex0) {\n if (convex1) {\n front = offset0 >= 0.0 || offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex3) {\n if (convex2) {\n front = offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n }\n } else {\n front = offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setVec2(normal1);\n }\n }\n } else {\n front = offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n }\n }\n\n // Get polygonB in frameA\n polygonBA.count = polygonB.m_count;\n for (let i = 0; i < polygonB.m_count; ++i) {\n polygonBA.vertices[i] = Transform.mulVec2(xf, polygonB.m_vertices[i]);\n polygonBA.normals[i] = Rot.mulVec2(xf.q, polygonB.m_normals[i]);\n }\n\n const radius = 2.0 * Settings.polygonRadius;\n\n manifold.pointCount = 0;\n\n { // ComputeEdgeSeparation\n edgeAxis.type = EPAxisType.e_edgeA;\n edgeAxis.index = front ? 0 : 1;\n edgeAxis.separation = Infinity;\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const s = Vec2.dot(normal, Vec2.sub(polygonBA.vertices[i], v1));\n if (s < edgeAxis.separation) {\n edgeAxis.separation = s;\n }\n }\n }\n\n // If no valid normal can be found than this edge should not collide.\n // @ts-ignore\n if (edgeAxis.type == EPAxisType.e_unknown) {\n return;\n }\n\n if (edgeAxis.separation > radius) {\n return;\n }\n\n { // ComputePolygonSeparation\n polygonAxis.type = EPAxisType.e_unknown;\n polygonAxis.index = -1;\n polygonAxis.separation = -Infinity;\n\n const perp = Vec2.neo(-normal.y, normal.x);\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const n = Vec2.neg(polygonBA.normals[i]);\n\n const s1 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v1));\n const s2 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v2));\n const s = Math.min(s1, s2);\n\n if (s > radius) {\n // No collision\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n break;\n }\n\n // Adjacency\n if (Vec2.dot(n, perp) >= 0.0) {\n if (Vec2.dot(Vec2.sub(n, upperLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n } else {\n if (Vec2.dot(Vec2.sub(n, lowerLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n }\n\n if (s > polygonAxis.separation) {\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n }\n }\n }\n\n if (polygonAxis.type != EPAxisType.e_unknown && polygonAxis.separation > radius) {\n return;\n }\n\n // Use hysteresis for jitter reduction.\n const k_relativeTol = 0.98;\n const k_absoluteTol = 0.001;\n\n let primaryAxis;\n if (polygonAxis.type == EPAxisType.e_unknown) {\n primaryAxis = edgeAxis;\n } else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) {\n primaryAxis = polygonAxis;\n } else {\n primaryAxis = edgeAxis;\n }\n\n const ie = [ new ClipVertex(), new ClipVertex() ];\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.type = ManifoldType.e_faceA;\n\n // Search for the polygon normal that is most anti-parallel to the edge\n // normal.\n let bestIndex = 0;\n let bestValue = Vec2.dot(normal, polygonBA.normals[0]);\n for (let i = 1; i < polygonBA.count; ++i) {\n const value = Vec2.dot(normal, polygonBA.normals[i]);\n if (value < bestValue) {\n bestValue = value;\n bestIndex = i;\n }\n }\n\n const i1 = bestIndex;\n const i2 = i1 + 1 < polygonBA.count ? i1 + 1 : 0;\n\n ie[0].v = polygonBA.vertices[i1];\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = i1;\n ie[0].id.cf.typeA = ContactFeatureType.e_face;\n ie[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n ie[1].v = polygonBA.vertices[i2];\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = i2;\n ie[1].id.cf.typeA = ContactFeatureType.e_face;\n ie[1].id.cf.typeB = ContactFeatureType.e_vertex;\n\n if (front) {\n rf.i1 = 0;\n rf.i2 = 1;\n rf.v1 = v1;\n rf.v2 = v2;\n rf.normal.setVec2(normal1);\n } else {\n rf.i1 = 1;\n rf.i2 = 0;\n rf.v1 = v2;\n rf.v2 = v1;\n rf.normal.setMul(-1, normal1);\n }\n } else {\n manifold.type = ManifoldType.e_faceB;\n\n ie[0].v = v1;\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = primaryAxis.index;\n ie[0].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[0].id.cf.typeB = ContactFeatureType.e_face;\n\n ie[1].v = v2;\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = primaryAxis.index;\n ie[1].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[1].id.cf.typeB = ContactFeatureType.e_face;\n\n rf.i1 = primaryAxis.index;\n rf.i2 = rf.i1 + 1 < polygonBA.count ? rf.i1 + 1 : 0;\n rf.v1 = polygonBA.vertices[rf.i1];\n rf.v2 = polygonBA.vertices[rf.i2];\n rf.normal.setVec2(polygonBA.normals[rf.i1]);\n }\n\n rf.sideNormal1.setNum(rf.normal.y, -rf.normal.x);\n rf.sideNormal2.setMul(-1, rf.sideNormal1);\n rf.sideOffset1 = Vec2.dot(rf.sideNormal1, rf.v1);\n rf.sideOffset2 = Vec2.dot(rf.sideNormal2, rf.v2);\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.localNormal = Vec2.clone(rf.normal);\n manifold.localPoint = Vec2.clone(rf.v1);\n } else {\n manifold.localNormal = Vec2.clone(polygonB.m_normals[rf.i1]);\n manifold.localPoint = Vec2.clone(polygonB.m_vertices[rf.i1]);\n }\n\n let pointCount = 0;\n for (let i = 0; i < Settings.maxManifoldPoints; ++i) {\n const separation = Vec2.dot(rf.normal, Vec2.sub(clipPoints2[i].v, rf.v1));\n\n if (separation <= radius) {\n const cp = manifold.points[pointCount]; // ManifoldPoint\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n cp.localPoint = Transform.mulTVec2(xf, clipPoints2[i].v);\n cp.id = clipPoints2[i].id;\n } else {\n cp.localPoint = clipPoints2[i].v;\n cp.id.cf.typeA = clipPoints2[i].id.cf.typeB;\n cp.id.cf.typeB = clipPoints2[i].id.cf.typeA;\n cp.id.cf.indexA = clipPoints2[i].id.cf.indexB;\n cp.id.cf.indexB = clipPoints2[i].id.cf.indexA;\n }\n\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","export { default as Serializer } from './serializer/index';\n\nexport { default as Math } from './common/Math';\nexport { default as Vec2 } from './common/Vec2';\nexport { default as Vec3 } from './common/Vec3';\nexport { default as Mat22 } from './common/Mat22';\nexport { default as Mat33 } from './common/Mat33';\nexport { default as Transform } from './common/Transform';\nexport { default as Rot } from './common/Rot';\n\nexport { default as AABB } from './collision/AABB';\n\nexport { default as Shape } from './collision/Shape';\nexport { default as Fixture } from './dynamics/Fixture';\nexport { default as Body } from './dynamics/Body';\nexport { default as Contact } from './dynamics/Contact';\nexport { default as Joint } from './dynamics/Joint';\nexport { default as World } from './dynamics/World';\n\nexport { default as Circle } from './collision/shape/CircleShape';\nexport { default as Edge } from './collision/shape/EdgeShape';\nexport { default as Polygon } from './collision/shape/PolygonShape';\nexport { default as Chain } from './collision/shape/ChainShape';\nexport { default as Box } from './collision/shape/BoxShape';\n\nexport { CollideCircles } from './collision/shape/CollideCircle';\nexport { CollideEdgeCircle } from './collision/shape/CollideEdgeCircle';\nexport { CollidePolygons } from './collision/shape/CollidePolygon';\nexport { CollidePolygonCircle } from './collision/shape/CollideCirclePolygone';\nexport { CollideEdgePolygon } from './collision/shape/CollideEdgePolygon';\n\nexport { default as DistanceJoint } from './dynamics/joint/DistanceJoint';\nexport { default as FrictionJoint } from './dynamics/joint/FrictionJoint';\nexport { default as GearJoint } from './dynamics/joint/GearJoint';\nexport { default as MotorJoint } from './dynamics/joint/MotorJoint';\nexport { default as MouseJoint } from './dynamics/joint/MouseJoint';\nexport { default as PrismaticJoint } from './dynamics/joint/PrismaticJoint';\nexport { default as PulleyJoint } from './dynamics/joint/PulleyJoint';\nexport { default as RevoluteJoint } from './dynamics/joint/RevoluteJoint';\nexport { default as RopeJoint } from './dynamics/joint/RopeJoint';\nexport { default as WeldJoint } from './dynamics/joint/WeldJoint';\nexport { default as WheelJoint } from './dynamics/joint/WheelJoint';\n\nexport { default as Settings } from './Settings';\n\nexport { default as Sweep } from './common/Sweep';\nexport { default as Manifold } from './collision/Manifold';\nexport { default as Distance } from './collision/Distance';\nexport { default as TimeOfImpact } from './collision/TimeOfImpact';\nexport { default as DynamicTree } from './collision/DynamicTree';\n\nimport Solver, { TimeStep } from './dynamics/Solver';\nimport { CollidePolygons } from './collision/shape/CollidePolygon';\nimport { default as Settings } from './Settings';\nimport { default as Sweep } from './common/Sweep';\nimport { default as Manifold } from './collision/Manifold';\nimport { default as Distance, DistanceInput, DistanceOutput, DistanceProxy, SimplexCache, testOverlap } from './collision/Distance';\nimport { default as TimeOfImpact, TOIInput, TOIOutput } from './collision/TimeOfImpact';\nimport { default as DynamicTree } from './collision/DynamicTree';\n\nimport { default as stats } from './util/stats'; // todo: what to do with this?\n\nimport { ContactImpulse } from './dynamics/Solver';\ntype _ContactImpulse = InstanceType;\nexport type { _ContactImpulse as ContactImpulse }\n\n/** @deprecated Merged with main namespace */\nexport const internal = {};\n\n// @ts-ignore\ninternal.CollidePolygons = CollidePolygons;\n// @ts-ignore\ninternal.Settings = Settings;\n// @ts-ignore\ninternal.Sweep = Sweep;\n// @ts-ignore\ninternal.Manifold = Manifold;\n// @ts-ignore\ninternal.Distance = Distance;\n// @ts-ignore\ninternal.TimeOfImpact = TimeOfImpact;\n// @ts-ignore\ninternal.DynamicTree = DynamicTree;\n// @ts-ignore\ninternal.stats = stats;\n\n// @ts-ignore\nSolver.TimeStep = TimeStep;\n\n// @ts-ignore\nDistance.testOverlap = testOverlap;\n// @ts-ignore\nDistance.Input = DistanceInput;\n// @ts-ignore\nDistance.Output = DistanceOutput;\n// @ts-ignore\nDistance.Proxy = DistanceProxy;\n// @ts-ignore\nDistance.Cache = SimplexCache;\n\n// @ts-ignore\nTimeOfImpact.Input = TOIInput;\n// @ts-ignore\nTimeOfImpact.Output = TOIOutput;\n"],"names":["Math","DEFAULTS","inactiveLimit","atLowerLimit","atUpperLimit","equalLimits"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"planck.js","sources":["../node_modules/tslib/tslib.es6.js","../src/util/options.ts","../src/common/Math.ts","../src/common/Vec2.ts","../src/collision/AABB.ts","../src/Settings.ts","../src/util/Pool.ts","../src/collision/DynamicTree.ts","../src/collision/BroadPhase.ts","../src/common/Rot.ts","../src/common/Transform.ts","../src/common/Sweep.ts","../src/dynamics/Velocity.ts","../src/dynamics/Position.ts","../src/collision/Shape.ts","../src/dynamics/Fixture.ts","../src/dynamics/Body.ts","../src/dynamics/Joint.ts","../src/util/stats.ts","../src/util/Timer.ts","../src/collision/Distance.ts","../src/collision/TimeOfImpact.ts","../src/dynamics/Solver.ts","../src/common/Mat22.ts","../src/collision/Manifold.ts","../src/dynamics/Contact.ts","../src/dynamics/World.ts","../src/common/Vec3.ts","../src/collision/shape/EdgeShape.ts","../src/collision/shape/ChainShape.ts","../src/collision/shape/PolygonShape.ts","../src/collision/shape/BoxShape.ts","../src/collision/shape/CircleShape.ts","../src/dynamics/joint/DistanceJoint.ts","../src/dynamics/joint/FrictionJoint.ts","../src/common/Mat33.ts","../src/dynamics/joint/RevoluteJoint.ts","../src/dynamics/joint/PrismaticJoint.ts","../src/dynamics/joint/GearJoint.ts","../src/dynamics/joint/MotorJoint.ts","../src/dynamics/joint/MouseJoint.ts","../src/dynamics/joint/PulleyJoint.ts","../src/dynamics/joint/RopeJoint.ts","../src/dynamics/joint/WeldJoint.ts","../src/dynamics/joint/WheelJoint.ts","../src/serializer/index.ts","../src/collision/shape/CollideCircle.ts","../src/collision/shape/CollideEdgeCircle.ts","../src/collision/shape/CollidePolygon.ts","../src/collision/shape/CollideCirclePolygon.ts","../src/collision/shape/CollideEdgePolygon.ts","../src/index.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","export const options = function(input: T, defaults: object): T {\n if (input === null || typeof input === 'undefined') {\n // tslint:disable-next-line:no-object-literal-type-assertion\n input = {} as T;\n }\n\n const output = {...input};\n\n // tslint:disable-next-line:no-for-in\n for (const key in defaults) {\n if (defaults.hasOwnProperty(key) && typeof input[key] === 'undefined') {\n output[key] = defaults[key];\n }\n }\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n const symbols = Object.getOwnPropertySymbols(defaults);\n for (let i = 0; i < symbols.length; i++) {\n const symbol = symbols[i];\n if (defaults.propertyIsEnumerable(symbol) && typeof input[symbol] === 'undefined') {\n output[symbol] = defaults[symbol];\n }\n }\n }\n\n return output;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\nexport const math = Object.assign(Object.create(Math) as typeof Math, {\n EPSILON: 1e-9, // TODO\n\n /**\n * This function is used to ensure that a floating point number is not a NaN or\n * infinity.\n */\n isFinite: function(x: unknown): boolean {\n return (typeof x === 'number') && isFinite(x) && !isNaN(x);\n },\n\n assert: function(x: any): void {\n _ASSERT && console.assert(!math.isFinite(x), 'Invalid Number!', x);\n },\n\n /**\n * Next Largest Power of 2 Given a binary integer value x, the next largest\n * power of 2 can be computed by a SWAR algorithm that recursively \"folds\" the\n * upper bits into the lower bits. This process yields a bit vector with the\n * same most significant 1 as x, but all 1's below it. Adding 1 to that value\n * yields the next largest power of 2. For a 32-bit value:\n */\n nextPowerOfTwo: function(x: number): number {\n // TODO\n x |= (x >> 1);\n x |= (x >> 2);\n x |= (x >> 4);\n x |= (x >> 8);\n x |= (x >> 16);\n return x + 1;\n },\n\n isPowerOfTwo: function(x: number): boolean {\n return x > 0 && (x & (x - 1)) === 0;\n },\n\n mod: function(num: number, min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n if (max > min) {\n num = (num - min) % (max - min);\n return num + (num < 0 ? max : min);\n } else {\n num = (num - max) % (min - max);\n return num + (num <= 0 ? min : max);\n }\n },\n /**\n * Returns a min if num is less than min, and max if more than max, otherwise returns num.\n */\n clamp: function(num: number, min: number, max: number): number {\n if (num < min) {\n return min;\n } else if (num > max) {\n return max;\n } else {\n return num;\n }\n },\n /**\n * Returns a random number between min and max when two arguments are provided.\n * If one arg is provided between 0 to max.\n * If one arg is passed between 0 to 1.\n */\n random: function(min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n return min === max ? min : Math.random() * (max - min) + min;\n }\n});\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport interface Vec2Value {\n x: number;\n y: number;\n}\n\nexport class Vec2 {\n x: number;\n y: number;\n\n constructor(x: number, y: number);\n constructor(obj: { x: number, y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Vec2)) {\n return new Vec2(x, y);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n } else {\n this.x = x;\n this.y = y;\n }\n _ASSERT && Vec2.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = data.x;\n obj.y = data.y;\n return obj;\n }\n\n static zero(): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = 0;\n obj.y = 0;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = x;\n obj.y = y;\n return obj;\n }\n\n static clone(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(v.x, v.y);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Vec2.isValid(o), 'Invalid Vec2!', o);\n }\n\n clone(): Vec2 {\n return Vec2.clone(this);\n }\n\n /**\n * Set this vector to all zeros.\n *\n * @returns this\n */\n setZero(): Vec2 {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n set(x: number, y: number): Vec2;\n set(value: Vec2Value): Vec2;\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n // tslint:disable-next-line:typedef\n set(x, y?) {\n if (typeof x === 'object') {\n _ASSERT && Vec2.assert(x);\n this.x = x.x;\n this.y = x.y;\n } else {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n }\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setNum(x: number, y: number) {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setVec2(value: Vec2Value) {\n _ASSERT && Vec2.assert(value);\n this.x = value.x;\n this.y = value.y;\n\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use setCombine or setMul\n */\n wSet(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.setCombine(a, v, b, w);\n } else {\n return this.setMul(a, v);\n }\n }\n\n /**\n * Set linear combination of v and w: `a * v + b * w`\n */\n setCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x = x;\n this.y = y;\n return this;\n }\n\n setMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Add a vector to this vector.\n *\n * @returns this\n */\n add(w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x += w.x;\n this.y += w.y;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use addCombine or addMul\n */\n wAdd(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.addCombine(a, v, b, w);\n } else {\n return this.addMul(a, v);\n }\n }\n\n /**\n * Add linear combination of v and w: `a * v + b * w`\n */\n addCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x += x;\n this.y += y;\n return this;\n }\n\n addMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x += x;\n this.y += y;\n return this;\n }\n\n /**\n * @deprecated Use subCombine or subMul\n */\n wSub(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.subCombine(a, v, b, w);\n } else {\n return this.subMul(a, v);\n }}\n\n /**\n * Subtract linear combination of v and w: `a * v + b * w`\n */\n subCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n subMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n /**\n * Subtract a vector from this vector\n *\n * @returns this\n */\n sub(w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x -= w.x;\n this.y -= w.y;\n return this;\n }\n\n /**\n * Multiply this vector by a scalar.\n *\n * @returns this\n */\n mul(m: number): Vec2 {\n _ASSERT && Math.assert(m);\n this.x *= m;\n this.y *= m;\n return this;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n length(): number {\n return Vec2.lengthOf(this);\n }\n\n /**\n * Get the length squared.\n */\n lengthSquared(): number {\n return Vec2.lengthSquared(this);\n }\n\n /**\n * Convert this vector into a unit vector.\n *\n * @returns old length\n */\n normalize(): number {\n const length = this.length();\n if (length < Math.EPSILON) {\n return 0.0;\n }\n const invLength = 1.0 / length;\n this.x *= invLength;\n this.y *= invLength;\n return length;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n static lengthOf(v: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n return Math.sqrt(v.x * v.x + v.y * v.y);\n }\n\n /**\n * Get the length squared.\n */\n static lengthSquared(v: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n return v.x * v.x + v.y * v.y;\n }\n\n static distance(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n static distanceSquared(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return dx * dx + dy * dy;\n }\n\n static areEqual(v: Vec2Value, w: Vec2Value): boolean {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v === w || typeof w === 'object' && w !== null && v.x === w.x && v.y === w.y;\n }\n\n /**\n * Get the skew vector such that dot(skew_vec, other) == cross(vec, other)\n */\n static skew(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.y, v.x);\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.x + v.y * w.y;\n }\n\n static cross(v: Vec2Value, w: Vec2Value): number;\n static cross(v: Vec2Value, w: number): Vec2;\n static cross(v: number, w: Vec2Value): Vec2;\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n *\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n // tslint:disable-next-line:typedef\n static cross(v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n\n } else {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static crossVec2Vec2(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossVec2Num(v: Vec2Value, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossNumVec2(v: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n }\n\n static addCross(a: Vec2Value, v: Vec2Value, w: number): Vec2;\n static addCross(a: Vec2Value, v: number, w: Vec2Value): Vec2;\n /**\n * Returns `a + (v x w)`\n */\n // tslint:disable-next-line:typedef\n static addCross(a, v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n _ASSERT && console.assert(false);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossVec2Num(a: Vec2Value, v: Vec2Value, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossNumVec2(a: Vec2Value, v: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n static add(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x + w.x, v.y + w.y);\n }\n\n /** @internal @deprecated */\n static wAdd(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return Vec2.combine(a, v, b, w);\n } else {\n return Vec2.mulNumVec2(a, v);\n }\n }\n\n static combine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n return Vec2.zero().setCombine(a, v, b, w);\n }\n\n static sub(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x - w.x, v.y - w.y);\n }\n\n static mul(a: Vec2Value, b: number): Vec2;\n static mul(a: number, b: Vec2Value): Vec2;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (typeof a === 'object') {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n\n } else if (typeof b === 'object') {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n }\n\n static mulVec2Num(a: Vec2Value, b: number): Vec2 {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n }\n\n static mulNumVec2(a: number, b: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n\n neg(): Vec2 {\n this.x = -this.x;\n this.y = -this.y;\n return this;\n }\n\n static neg(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.x, -v.y);\n }\n\n static abs(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Math.abs(v.x), Math.abs(v.y));\n }\n\n static mid(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo((v.x + w.x) * 0.5, (v.y + w.y) * 0.5);\n }\n\n static upper(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.max(v.x, w.x), Math.max(v.y, w.y));\n }\n\n static lower(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.min(v.x, w.x), Math.min(v.y, w.y));\n }\n\n clamp(max: number): Vec2 {\n const lengthSqr = this.x * this.x + this.y * this.y;\n if (lengthSqr > max * max) {\n const scale = max / Math.sqrt(lengthSqr);\n this.x *= scale;\n this.y *= scale;\n }\n return this;\n }\n\n static clamp(v: Vec2Value, max: number): Vec2 {\n const r = Vec2.neo(v.x, v.y);\n r.clamp(max);\n return r;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static scaleFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x * x, v.y * y);\n };\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static translateFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x + x, v.y + y);\n };\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../common/Math';\nimport { Vec2, Vec2Value } from '../common/Vec2';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n */\nexport interface RayCastInput {\n p1: Vec2;\n p2: Vec2;\n maxFraction: number;\n}\n\nexport type RayCastCallback = (subInput: RayCastInput, id: number) => number;\n\n/**\n * Ray-cast output data. The ray hits at `p1 + fraction * (p2 - p1)`,\n * where `p1` and `p2` come from RayCastInput.\n */\nexport interface RayCastOutput {\n normal: Vec2;\n fraction: number;\n}\n\nexport class AABB {\n lowerBound: Vec2;\n upperBound: Vec2;\n\n constructor(lower?: Vec2Value, upper?: Vec2Value) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof AABB)) {\n return new AABB(lower, upper);\n }\n\n this.lowerBound = Vec2.zero();\n this.upperBound = Vec2.zero();\n\n if (typeof lower === 'object') {\n this.lowerBound.setVec2(lower);\n }\n if (typeof upper === 'object') {\n this.upperBound.setVec2(upper);\n } else if (typeof lower === 'object') {\n this.upperBound.setVec2(lower);\n }\n }\n\n /**\n * Verify that the bounds are sorted.\n */\n isValid(): boolean {\n return AABB.isValid(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.lowerBound) && Vec2.isValid(obj.upperBound) && Vec2.sub(obj.upperBound, obj.lowerBound).lengthSquared() >= 0;\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!AABB.isValid(o), 'Invalid AABB!', o);\n }\n\n /**\n * Get the center of the AABB.\n */\n getCenter(): Vec2 {\n return Vec2.neo((this.lowerBound.x + this.upperBound.x) * 0.5, (this.lowerBound.y + this.upperBound.y) * 0.5);\n }\n\n /**\n * Get the extents of the AABB (half-widths).\n */\n getExtents(): Vec2 {\n return Vec2.neo((this.upperBound.x - this.lowerBound.x) * 0.5, (this.upperBound.y - this.lowerBound.y) * 0.5);\n }\n\n /**\n * Get the perimeter length.\n */\n getPerimeter(): number {\n return 2.0 * (this.upperBound.x - this.lowerBound.x + this.upperBound.y - this.lowerBound.y);\n }\n\n /**\n * Combine one or two AABB into this one.\n */\n combine(a: AABB, b?: AABB): void {\n b = b || this;\n\n const lowerA = a.lowerBound;\n const upperA = a.upperBound;\n const lowerB = b.lowerBound;\n const upperB = b.upperBound;\n\n const lowerX = Math.min(lowerA.x, lowerB.x);\n const lowerY = Math.min(lowerA.y, lowerB.y);\n const upperX = Math.max(upperB.x, upperA.x);\n const upperY = Math.max(upperB.y, upperA.y);\n\n this.lowerBound.setNum(lowerX, lowerY);\n this.upperBound.setNum(upperX, upperY);\n }\n\n combinePoints(a: Vec2Value, b: Vec2Value): void {\n this.lowerBound.setNum(Math.min(a.x, b.x), Math.min(a.y, b.y));\n this.upperBound.setNum(Math.max(a.x, b.x), Math.max(a.y, b.y));\n }\n\n set(aabb: AABB): void {\n this.lowerBound.setNum(aabb.lowerBound.x, aabb.lowerBound.y);\n this.upperBound.setNum(aabb.upperBound.x, aabb.upperBound.y);\n }\n\n contains(aabb: AABB): boolean {\n let result = true;\n result = result && this.lowerBound.x <= aabb.lowerBound.x;\n result = result && this.lowerBound.y <= aabb.lowerBound.y;\n result = result && aabb.upperBound.x <= this.upperBound.x;\n result = result && aabb.upperBound.y <= this.upperBound.y;\n return result;\n }\n\n extend(value: number): AABB {\n AABB.extend(this, value);\n return this;\n }\n\n static extend(aabb: AABB, value: number): void {\n aabb.lowerBound.x -= value;\n aabb.lowerBound.y -= value;\n aabb.upperBound.x += value;\n aabb.upperBound.y += value;\n }\n\n static testOverlap(a: AABB, b: AABB): boolean {\n const d1x = b.lowerBound.x - a.upperBound.x;\n const d2x = a.lowerBound.x - b.upperBound.x;\n\n const d1y = b.lowerBound.y - a.upperBound.y;\n const d2y = a.lowerBound.y - b.upperBound.y;\n\n if (d1x > 0 || d1y > 0 || d2x > 0 || d2y > 0) {\n return false;\n }\n return true;\n }\n\n static areEqual(a: AABB, b: AABB): boolean {\n return Vec2.areEqual(a.lowerBound, b.lowerBound) && Vec2.areEqual(a.upperBound, b.upperBound);\n }\n\n static diff(a: AABB, b: AABB): number {\n const wD = Math.max(0, Math.min(a.upperBound.x, b.upperBound.x) - Math.max(b.lowerBound.x, a.lowerBound.x));\n const hD = Math.max(0, Math.min(a.upperBound.y, b.upperBound.y) - Math.max(b.lowerBound.y, a.lowerBound.y));\n\n const wA = a.upperBound.x - a.lowerBound.x;\n const hA = a.upperBound.y - a.lowerBound.y;\n\n const wB = b.upperBound.x - b.lowerBound.x;\n const hB = b.upperBound.y - b.lowerBound.y;\n\n return wA * hA + wB * hB - wD * hD;\n }\n\n rayCast(output: RayCastOutput, input: RayCastInput): boolean {\n // From Real-time Collision Detection, p179.\n\n let tmin = -Infinity;\n let tmax = Infinity;\n\n const p = input.p1;\n const d = Vec2.sub(input.p2, input.p1);\n const absD = Vec2.abs(d);\n\n const normal = Vec2.zero();\n\n for (let f: 'x' | 'y' = 'x'; f !== null; f = (f === 'x' ? 'y' : null)) {\n if (absD.x < Math.EPSILON) {\n // Parallel.\n if (p[f] < this.lowerBound[f] || this.upperBound[f] < p[f]) {\n return false;\n }\n } else {\n const inv_d = 1.0 / d[f];\n let t1 = (this.lowerBound[f] - p[f]) * inv_d;\n let t2 = (this.upperBound[f] - p[f]) * inv_d;\n\n // Sign of the normal vector.\n let s = -1.0;\n\n if (t1 > t2) {\n const temp = t1;\n t1 = t2;\n t2 = temp;\n s = 1.0;\n }\n\n // Push the min up\n if (t1 > tmin) {\n normal.setZero();\n normal[f] = s;\n tmin = t1;\n }\n\n // Pull the max down\n tmax = Math.min(tmax, t2);\n\n if (tmin > tmax) {\n return false;\n }\n }\n }\n\n // Does the ray start inside the box?\n // Does the ray intersect beyond the max fraction?\n if (tmin < 0.0 || input.maxFraction < tmin) {\n return false;\n }\n\n // Intersection.\n output.fraction = tmin;\n output.normal = normal;\n return true;\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n// TODO merge with World options?\n\n/**\n * Tuning constants based on meters-kilograms-seconds (MKS) units.\n */\n// tslint:disable-next-line:no-unnecessary-class\nexport class Settings {\n // Collision\n /**\n * The maximum number of contact points between two convex shapes. Do not change\n * this value.\n */\n static maxManifoldPoints: number = 2;\n\n /**\n * The maximum number of vertices on a convex polygon. You cannot increase this\n * too much because BlockAllocator has a maximum object size.\n */\n static maxPolygonVertices: number = 12;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This allows proxies to move\n * by a small amount without triggering a tree adjustment. This is in meters.\n */\n static aabbExtension: number = 0.1;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This is used to predict the\n * future position based on the current displacement. This is a dimensionless\n * multiplier.\n */\n static aabbMultiplier: number = 2.0;\n\n /**\n * A small length used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static linearSlop: number = 0.005;\n static get linearSlopSquared(): number { return Settings.linearSlop * Settings.linearSlop; }\n\n /**\n * A small angle used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static angularSlop: number = (2.0 / 180.0 * Math.PI);\n\n /**\n * The radius of the polygon/edge shape skin. This should not be modified.\n * Making this smaller means polygons will have an insufficient buffer for\n * continuous collision. Making it larger may create artifacts for vertex\n * collision.\n */\n static get polygonRadius(): number { return 2.0 * Settings.linearSlop; }\n\n /**\n * Maximum number of sub-steps per contact in continuous physics simulation.\n */\n static maxSubSteps: number = 8;\n\n// Dynamics\n\n /**\n * Maximum number of contacts to be handled to solve a TOI impact.\n */\n static maxTOIContacts: number = 32;\n\n /**\n * Maximum iterations to solve a TOI.\n */\n static maxTOIIterations: number = 20;\n\n /**\n * Maximum iterations to find Distance.\n */\n static maxDistnceIterations: number = 20;\n\n /**\n * A velocity threshold for elastic collisions. Any collision with a relative\n * linear velocity below this threshold will be treated as inelastic.\n */\n static velocityThreshold: number = 1.0;\n\n /**\n * The maximum linear position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxLinearCorrection: number = 0.2;\n\n /**\n * The maximum angular position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxAngularCorrection: number = (8.0 / 180.0 * Math.PI);\n\n /**\n * The maximum linear velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxTranslation: number = 2.0;\n static get maxTranslationSquared(): number { return Settings.maxTranslation * Settings.maxTranslation; }\n\n /**\n * The maximum angular velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxRotation: number = (0.5 * Math.PI);\n static get maxRotationSquared(): number { return Settings.maxRotation * Settings.maxRotation; }\n\n /**\n * This scale factor controls how fast overlap is resolved. Ideally this would\n * be 1 so that overlap is removed in one time step. However using values close\n * to 1 often lead to overshoot.\n */\n static baumgarte: number = 0.2;\n static toiBaugarte: number = 0.75;\n\n // Sleep\n\n /**\n * The time that a body must be still before it will go to sleep.\n */\n static timeToSleep: number = 0.5;\n\n /**\n * A body cannot sleep if its linear velocity is above this tolerance.\n */\n static linearSleepTolerance: number = 0.01;\n static get linearSleepToleranceSqr(): number { return Math.pow(Settings.linearSleepTolerance, 2); }\n\n /**\n * A body cannot sleep if its angular velocity is above this tolerance.\n */\n static angularSleepTolerance: number = (2.0 / 180.0 * Math.PI);\n static get angularSleepToleranceSqr(): number { return Math.pow(Settings.angularSleepTolerance, 2); }\n\n}\n","/*\n * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js\n *\n * This software is provided 'as-is', without any express or implied\n * warranty. In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * 1. The origin of this software must not be misrepresented; you must not\n * claim that you wrote the original software. If you use this software\n * in a product, an acknowledgment in the product documentation would be\n * appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n * misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n */\n\nexport class Pool {\n _list: T[] = [];\n _max: number = Infinity;\n\n _createFn: () => T;\n _outFn: (item: T) => void;\n _inFn: (item: T) => void;\n _discardFn: (item: T) => T;\n\n _createCount: number = 0;\n _outCount: number = 0;\n _inCount: number = 0;\n _discardCount: number = 0;\n\n constructor(opts: {\n max?: number,\n create?: () => T,\n allocate?: (item: T) => void,\n release?: (item: T) => void,\n discard?: (item: T) => T,\n }) {\n this._list = [];\n this._max = opts.max || this._max;\n\n this._createFn = opts.create;\n this._outFn = opts.allocate;\n this._inFn = opts.release;\n this._discardFn = opts.discard;\n }\n\n max(n?: number): number | Pool {\n if (typeof n === 'number') {\n this._max = n;\n return this;\n }\n return this._max;\n }\n\n size(): number {\n return this._list.length;\n }\n\n allocate(): T {\n let item: T;\n if (this._list.length > 0) {\n item = this._list.shift();\n } else {\n this._createCount++;\n if (typeof this._createFn === 'function') {\n item = this._createFn();\n } else {\n // tslint:disable-next-line:no-object-literal-type-assertion\n item = {} as T;\n }\n }\n this._outCount++;\n if (typeof this._outFn === 'function') {\n this._outFn(item);\n }\n return item;\n }\n\n release(item: T): void {\n if (this._list.length < this._max) {\n this._inCount++;\n if (typeof this._inFn === 'function') {\n this._inFn(item);\n }\n this._list.push(item);\n } else {\n this._discardCount++;\n if (typeof this._discardFn === 'function') {\n item = this._discardFn(item);\n }\n }\n }\n\n /** @internal */\n toString(): string {\n return \" +\" + this._createCount + \" >\" + this._outCount + \" <\" + this._inCount + \" -\"\n + this._discardCount + \" =\" + this._list.length + \"/\" + this._max;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { Pool } from '../util/Pool';\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { AABB, RayCastCallback, RayCastInput } from './AABB';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport type DynamicTreeQueryCallback = (nodeId: number) => boolean;\n\n/**\n * A node in the dynamic tree. The client does not interact with this directly.\n */\nexport class TreeNode {\n id: number;\n /** Enlarged AABB */\n aabb: AABB = new AABB();\n userData: T = null;\n parent: TreeNode = null;\n child1: TreeNode = null;\n child2: TreeNode = null;\n /** 0: leaf, -1: free node */\n height: number = -1;\n\n constructor(id?: number) {\n this.id = id;\n }\n\n /** @internal */\n toString(): string {\n return this.id + \": \" + this.userData;\n }\n\n isLeaf(): boolean {\n return this.child1 == null;\n }\n}\n\n/**\n * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A\n * dynamic tree arranges data in a binary tree to accelerate queries such as\n * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we\n * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger\n * than the client object. This allows the client object to move by small\n * amounts without triggering a tree update.\n *\n * Nodes are pooled and relocatable, so we use node indices rather than\n * pointers.\n */\nexport class DynamicTree {\n m_root: TreeNode;\n m_lastProxyId: number;\n m_nodes: {\n [id: number]: TreeNode\n };\n m_pool: Pool>;\n\n constructor() {\n this.m_root = null;\n this.m_nodes = {};\n this.m_lastProxyId = 0;\n\n this.m_pool = new Pool>({\n create(): TreeNode {\n return new TreeNode();\n }\n });\n }\n\n /**\n * Get proxy user data.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getUserData(id: number): T {\n const node = this.m_nodes[id];\n _ASSERT && console.assert(!!node);\n return node.userData;\n }\n\n /**\n * Get the fat AABB for a node id.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getFatAABB(id: number): AABB {\n const node = this.m_nodes[id];\n _ASSERT && console.assert(!!node);\n return node.aabb;\n }\n\n allocateNode(): TreeNode {\n const node = this.m_pool.allocate();\n node.id = ++this.m_lastProxyId;\n node.userData = null;\n node.parent = null;\n node.child1 = null;\n node.child2 = null;\n node.height = -1;\n this.m_nodes[node.id] = node;\n return node;\n }\n\n freeNode(node: TreeNode): void {\n this.m_pool.release(node);\n node.height = -1;\n // tslint:disable-next-line:no-dynamic-delete\n delete this.m_nodes[node.id];\n }\n\n /**\n * Create a proxy in the tree as a leaf node. We return the index of the node\n * instead of a pointer so that we can grow the node pool.\n *\n * Create a proxy. Provide a tight fitting AABB and a userData pointer.\n */\n createProxy(aabb: AABB, userData: T): number {\n _ASSERT && console.assert(AABB.isValid(aabb));\n\n const node = this.allocateNode();\n\n node.aabb.set(aabb);\n\n // Fatten the aabb.\n AABB.extend(node.aabb, Settings.aabbExtension);\n\n node.userData = userData;\n node.height = 0;\n\n this.insertLeaf(node);\n\n return node.id;\n }\n\n /**\n * Destroy a proxy. This asserts if the id is invalid.\n */\n destroyProxy(id: number): void {\n const node = this.m_nodes[id];\n\n _ASSERT && console.assert(!!node);\n _ASSERT && console.assert(node.isLeaf());\n\n this.removeLeaf(node);\n this.freeNode(node);\n }\n\n /**\n * Move a proxy with a swepted AABB. If the proxy has moved outside of its\n * fattened AABB, then the proxy is removed from the tree and re-inserted.\n * Otherwise the function returns immediately.\n *\n * @param d Displacement\n *\n * @return true if the proxy was re-inserted.\n */\n moveProxy(id: number, aabb: AABB, d: Vec2): boolean {\n _ASSERT && console.assert(AABB.isValid(aabb));\n _ASSERT && console.assert(!d || Vec2.isValid(d));\n\n const node = this.m_nodes[id];\n\n _ASSERT && console.assert(!!node);\n _ASSERT && console.assert(node.isLeaf());\n\n if (node.aabb.contains(aabb)) {\n return false;\n }\n\n this.removeLeaf(node);\n\n node.aabb.set(aabb);\n\n // Extend AABB.\n aabb = node.aabb;\n AABB.extend(aabb, Settings.aabbExtension);\n\n // Predict AABB displacement.\n // const d = Vec2.mul(Settings.aabbMultiplier, displacement);\n\n if (d.x < 0.0) {\n aabb.lowerBound.x += d.x * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.x += d.x * Settings.aabbMultiplier;\n }\n\n if (d.y < 0.0) {\n aabb.lowerBound.y += d.y * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.y += d.y * Settings.aabbMultiplier;\n }\n\n this.insertLeaf(node);\n\n return true;\n }\n\n insertLeaf(leaf: TreeNode): void {\n _ASSERT && console.assert(AABB.isValid(leaf.aabb));\n\n if (this.m_root == null) {\n this.m_root = leaf;\n this.m_root.parent = null;\n return;\n }\n\n // Find the best sibling for this node\n const leafAABB = leaf.aabb;\n let index = this.m_root;\n while (!index.isLeaf()) {\n const child1 = index.child1;\n const child2 = index.child2;\n\n const area = index.aabb.getPerimeter();\n\n const combinedAABB = new AABB();\n combinedAABB.combine(index.aabb, leafAABB);\n const combinedArea = combinedAABB.getPerimeter();\n\n // Cost of creating a new parent for this node and the new leaf\n const cost = 2.0 * combinedArea;\n\n // Minimum cost of pushing the leaf further down the tree\n const inheritanceCost = 2.0 * (combinedArea - area);\n\n // Cost of descending into child1\n let cost1;\n if (child1.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n cost1 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n const oldArea = child1.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost1 = (newArea - oldArea) + inheritanceCost;\n }\n\n // Cost of descending into child2\n let cost2;\n if (child2.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n cost2 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n const oldArea = child2.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost2 = newArea - oldArea + inheritanceCost;\n }\n\n // Descend according to the minimum cost.\n if (cost < cost1 && cost < cost2) {\n break;\n }\n\n // Descend\n if (cost1 < cost2) {\n index = child1;\n } else {\n index = child2;\n }\n }\n\n const sibling = index;\n\n // Create a new parent.\n const oldParent = sibling.parent;\n const newParent = this.allocateNode();\n newParent.parent = oldParent;\n newParent.userData = null;\n newParent.aabb.combine(leafAABB, sibling.aabb);\n newParent.height = sibling.height + 1;\n\n if (oldParent != null) {\n // The sibling was not the root.\n if (oldParent.child1 === sibling) {\n oldParent.child1 = newParent;\n } else {\n oldParent.child2 = newParent;\n }\n\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n } else {\n // The sibling was the root.\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n this.m_root = newParent;\n }\n\n // Walk back up the tree fixing heights and AABBs\n index = leaf.parent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n _ASSERT && console.assert(child1 != null);\n _ASSERT && console.assert(child2 != null);\n\n index.height = 1 + Math.max(child1.height, child2.height);\n index.aabb.combine(child1.aabb, child2.aabb);\n\n index = index.parent;\n }\n\n // validate();\n }\n\n removeLeaf(leaf: TreeNode): void {\n if (leaf === this.m_root) {\n this.m_root = null;\n return;\n }\n\n const parent = leaf.parent;\n const grandParent = parent.parent;\n let sibling;\n if (parent.child1 === leaf) {\n sibling = parent.child2;\n } else {\n sibling = parent.child1;\n }\n\n if (grandParent != null) {\n // Destroy parent and connect sibling to grandParent.\n if (grandParent.child1 === parent) {\n grandParent.child1 = sibling;\n } else {\n grandParent.child2 = sibling;\n }\n sibling.parent = grandParent;\n this.freeNode(parent);\n\n // Adjust ancestor bounds.\n let index = grandParent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n index.aabb.combine(child1.aabb, child2.aabb);\n index.height = 1 + Math.max(child1.height, child2.height);\n\n index = index.parent;\n }\n } else {\n this.m_root = sibling;\n sibling.parent = null;\n this.freeNode(parent);\n }\n\n // validate();\n }\n\n /**\n * Perform a left or right rotation if node A is imbalanced. Returns the new\n * root index.\n */\n balance(iA: TreeNode): TreeNode {\n _ASSERT && console.assert(iA != null);\n\n const A = iA;\n if (A.isLeaf() || A.height < 2) {\n return iA;\n }\n\n const B = A.child1;\n const C = A.child2;\n\n const balance = C.height - B.height;\n\n // Rotate C up\n if (balance > 1) {\n const F = C.child1;\n const G = C.child2;\n\n // Swap A and C\n C.child1 = A;\n C.parent = A.parent;\n A.parent = C;\n\n // A's old parent should point to C\n if (C.parent != null) {\n if (C.parent.child1 === iA) {\n C.parent.child1 = C;\n } else {\n C.parent.child2 = C;\n }\n } else {\n this.m_root = C;\n }\n\n // Rotate\n if (F.height > G.height) {\n C.child2 = F;\n A.child2 = G;\n G.parent = A;\n A.aabb.combine(B.aabb, G.aabb);\n C.aabb.combine(A.aabb, F.aabb);\n\n A.height = 1 + Math.max(B.height, G.height);\n C.height = 1 + Math.max(A.height, F.height);\n } else {\n C.child2 = G;\n A.child2 = F;\n F.parent = A;\n A.aabb.combine(B.aabb, F.aabb);\n C.aabb.combine(A.aabb, G.aabb);\n\n A.height = 1 + Math.max(B.height, F.height);\n C.height = 1 + Math.max(A.height, G.height);\n }\n\n return C;\n }\n\n // Rotate B up\n if (balance < -1) {\n const D = B.child1;\n const E = B.child2;\n\n // Swap A and B\n B.child1 = A;\n B.parent = A.parent;\n A.parent = B;\n\n // A's old parent should point to B\n if (B.parent != null) {\n if (B.parent.child1 === A) {\n B.parent.child1 = B;\n } else {\n B.parent.child2 = B;\n }\n } else {\n this.m_root = B;\n }\n\n // Rotate\n if (D.height > E.height) {\n B.child2 = D;\n A.child1 = E;\n E.parent = A;\n A.aabb.combine(C.aabb, E.aabb);\n B.aabb.combine(A.aabb, D.aabb);\n\n A.height = 1 + Math.max(C.height, E.height);\n B.height = 1 + Math.max(A.height, D.height);\n } else {\n B.child2 = E;\n A.child1 = D;\n D.parent = A;\n A.aabb.combine(C.aabb, D.aabb);\n B.aabb.combine(A.aabb, E.aabb);\n\n A.height = 1 + Math.max(C.height, D.height);\n B.height = 1 + Math.max(A.height, E.height);\n }\n\n return B;\n }\n\n return A;\n }\n\n /**\n * Compute the height of the binary tree in O(N) time. Should not be called\n * often.\n */\n getHeight(): number {\n if (this.m_root == null) {\n return 0;\n }\n\n return this.m_root.height;\n }\n\n /**\n * Get the ratio of the sum of the node areas to the root area.\n */\n getAreaRatio(): number {\n if (this.m_root == null) {\n return 0.0;\n }\n\n const root = this.m_root;\n const rootArea = root.aabb.getPerimeter();\n\n let totalArea = 0.0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // Free node in pool\n continue;\n }\n\n totalArea += node.aabb.getPerimeter();\n }\n\n this.iteratorPool.release(it);\n\n return totalArea / rootArea;\n }\n\n /**\n * Compute the height of a sub-tree.\n */\n computeHeight(id?: number): number {\n let node;\n if (typeof id !== 'undefined') {\n node = this.m_nodes[id];\n } else {\n node = this.m_root;\n }\n\n // _ASSERT && console.assert(0 <= id && id < this.m_nodeCapacity);\n\n if (node.isLeaf()) {\n return 0;\n }\n\n const height1 = this.computeHeight(node.child1.id);\n const height2 = this.computeHeight(node.child2.id);\n return 1 + Math.max(height1, height2);\n }\n\n validateStructure(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n if (node === this.m_root) {\n _ASSERT && console.assert(node.parent == null);\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && console.assert(child1 == null);\n _ASSERT && console.assert(child2 == null);\n _ASSERT && console.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && console.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && console.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n _ASSERT && console.assert(child1.parent === node);\n _ASSERT && console.assert(child2.parent === node);\n\n this.validateStructure(child1);\n this.validateStructure(child2);\n }\n\n validateMetrics(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && console.assert(child1 == null);\n _ASSERT && console.assert(child2 == null);\n _ASSERT && console.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && console.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && console.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n const height1 = child1.height;\n const height2 = child2.height;\n const height = 1 + Math.max(height1, height2);\n _ASSERT && console.assert(node.height === height);\n\n const aabb = new AABB();\n aabb.combine(child1.aabb, child2.aabb);\n\n _ASSERT && console.assert(AABB.areEqual(aabb, node.aabb));\n\n this.validateMetrics(child1);\n this.validateMetrics(child2);\n }\n\n /**\n * Validate this tree. For testing.\n */\n validate(): void {\n this.validateStructure(this.m_root);\n this.validateMetrics(this.m_root);\n _ASSERT && console.assert(this.getHeight() === this.computeHeight());\n }\n\n /**\n * Get the maximum balance of an node in the tree. The balance is the difference\n * in height of the two children of a node.\n */\n getMaxBalance(): number {\n let maxBalance = 0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height <= 1) {\n continue;\n }\n\n _ASSERT && console.assert(!node.isLeaf());\n\n const balance = Math.abs(node.child2.height - node.child1.height);\n maxBalance = Math.max(maxBalance, balance);\n }\n this.iteratorPool.release(it);\n\n return maxBalance;\n }\n\n /**\n * Build an optimal tree. Very expensive. For testing.\n */\n rebuildBottomUp(): void {\n const nodes = [];\n let count = 0;\n\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // free node in pool\n continue;\n }\n\n if (node.isLeaf()) {\n node.parent = null;\n nodes[count] = node;\n ++count;\n } else {\n this.freeNode(node);\n }\n }\n this.iteratorPool.release(it);\n\n while (count > 1) {\n let minCost = Infinity;\n let iMin = -1;\n let jMin = -1;\n for (let i = 0; i < count; ++i) {\n const aabbi = nodes[i].aabb;\n for (let j = i + 1; j < count; ++j) {\n const aabbj = nodes[j].aabb;\n const b = new AABB();\n b.combine(aabbi, aabbj);\n const cost = b.getPerimeter();\n if (cost < minCost) {\n iMin = i;\n jMin = j;\n minCost = cost;\n }\n }\n }\n\n const child1 = nodes[iMin];\n const child2 = nodes[jMin];\n\n const parent = this.allocateNode();\n parent.child1 = child1;\n parent.child2 = child2;\n parent.height = 1 + Math.max(child1.height, child2.height);\n parent.aabb.combine(child1.aabb, child2.aabb);\n parent.parent = null;\n\n child1.parent = parent;\n child2.parent = parent;\n\n nodes[jMin] = nodes[count - 1];\n nodes[iMin] = parent;\n --count;\n }\n\n this.m_root = nodes[0];\n\n _ASSERT && this.validate();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n const aabb = node.aabb;\n aabb.lowerBound.x -= newOrigin.x;\n aabb.lowerBound.y -= newOrigin.y;\n aabb.upperBound.x -= newOrigin.x;\n aabb.upperBound.y -= newOrigin.y;\n }\n this.iteratorPool.release(it);\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query(aabb: AABB, queryCallback: DynamicTreeQueryCallback): void {\n _ASSERT && console.assert(typeof queryCallback === 'function');\n const stack = this.stackPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, aabb)) {\n if (node.isLeaf()) {\n const proceed = queryCallback(node.id);\n if (proceed === false) {\n return;\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n }\n\n this.stackPool.release(stack);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n // TODO: GC\n _ASSERT && console.assert(typeof rayCastCallback === 'function');\n const p1 = input.p1;\n const p2 = input.p2;\n const r = Vec2.sub(p2, p1);\n _ASSERT && console.assert(r.lengthSquared() > 0.0);\n r.normalize();\n\n // v is perpendicular to the segment.\n const v = Vec2.crossNumVec2(1.0, r);\n const abs_v = Vec2.abs(v);\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n\n let maxFraction = input.maxFraction;\n\n // Build a bounding box for the segment.\n const segmentAABB = new AABB();\n let t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n\n const stack = this.stackPool.allocate();\n const subInput = this.inputPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, segmentAABB) === false) {\n continue;\n }\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n const c = node.aabb.getCenter();\n const h = node.aabb.getExtents();\n const separation = Math.abs(Vec2.dot(v, Vec2.sub(p1, c))) - Vec2.dot(abs_v, h);\n if (separation > 0.0) {\n continue;\n }\n\n if (node.isLeaf()) {\n subInput.p1 = Vec2.clone(input.p1);\n subInput.p2 = Vec2.clone(input.p2);\n subInput.maxFraction = maxFraction;\n\n const value = rayCastCallback(subInput, node.id);\n\n if (value === 0.0) {\n // The client has terminated the ray cast.\n return;\n }\n\n if (value > 0.0) {\n // update segment bounding box.\n maxFraction = value;\n t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n this.stackPool.release(stack);\n this.inputPool.release(subInput);\n }\n\n private inputPool: Pool = new Pool({\n create(): RayCastInput {\n // tslint:disable-next-line:no-object-literal-type-assertion\n return {} as RayCastInput;\n },\n release(stack: RayCastInput): void {\n }\n });\n\n private stackPool: Pool>> = new Pool>>({\n create(): Array> {\n return [];\n },\n release(stack: Array>): void {\n stack.length = 0;\n }\n });\n\n private iteratorPool: Pool> = new Pool>({\n create(): Iterator {\n return new Iterator();\n },\n release(iterator: Iterator): void {\n iterator.close();\n }\n });\n\n}\n\nclass Iterator {\n parents: Array> = [];\n states: number[] = [];\n preorder(root: TreeNode): Iterator {\n this.parents.length = 0;\n this.parents.push(root);\n this.states.length = 0;\n this.states.push(0);\n return this;\n }\n next(): TreeNode {\n while (this.parents.length > 0) {\n const i = this.parents.length - 1;\n const node = this.parents[i];\n if (this.states[i] === 0) {\n this.states[i] = 1;\n return node;\n }\n if (this.states[i] === 1) {\n this.states[i] = 2;\n if (node.child1) {\n this.parents.push(node.child1);\n this.states.push(1);\n return node.child1;\n }\n }\n if (this.states[i] === 2) {\n this.states[i] = 3;\n if (node.child2) {\n this.parents.push(node.child2);\n this.states.push(1);\n return node.child2;\n }\n }\n this.parents.pop();\n this.states.pop();\n }\n }\n close(): void {\n this.parents.length = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { AABB, RayCastCallback, RayCastInput } from './AABB';\nimport { DynamicTree, DynamicTreeQueryCallback } from './DynamicTree';\nimport { FixtureProxy } from \"../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * The broad-phase wraps and extends a dynamic-tree to keep track of moved\n * objects and query them on update.\n */\nexport class BroadPhase {\n m_tree: DynamicTree = new DynamicTree();\n m_proxyCount: number = 0;\n m_moveBuffer: number[] = [];\n\n m_callback: (userDataA: any, userDataB: any) => void;\n m_queryProxyId: number;\n\n /**\n * Get user data from a proxy. Returns null if the id is invalid.\n */\n getUserData(proxyId: number): FixtureProxy {\n return this.m_tree.getUserData(proxyId);\n }\n\n /**\n * Test overlap of fat AABBs.\n */\n testOverlap(proxyIdA: number, proxyIdB: number): boolean {\n const aabbA = this.m_tree.getFatAABB(proxyIdA);\n const aabbB = this.m_tree.getFatAABB(proxyIdB);\n return AABB.testOverlap(aabbA, aabbB);\n }\n\n /**\n * Get the fat AABB for a proxy.\n */\n getFatAABB(proxyId: number): AABB {\n return this.m_tree.getFatAABB(proxyId);\n }\n\n /**\n * Get the number of proxies.\n */\n getProxyCount(): number {\n return this.m_proxyCount;\n }\n\n /**\n * Get the height of the embedded tree.\n */\n getTreeHeight(): number {\n return this.m_tree.getHeight();\n }\n\n /**\n * Get the balance (integer) of the embedded tree.\n */\n getTreeBalance(): number {\n return this.m_tree.getMaxBalance();\n }\n\n /**\n * Get the quality metric of the embedded tree.\n */\n getTreeQuality(): number {\n return this.m_tree.getAreaRatio();\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query = (aabb: AABB, queryCallback: DynamicTreeQueryCallback): void => {\n this.m_tree.query(aabb, queryCallback);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n this.m_tree.rayCast(input, rayCastCallback);\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_tree.shiftOrigin(newOrigin);\n }\n\n /**\n * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs\n * is called.\n */\n createProxy(aabb: AABB, userData: FixtureProxy): number {\n _ASSERT && console.assert(AABB.isValid(aabb));\n const proxyId = this.m_tree.createProxy(aabb, userData);\n this.m_proxyCount++;\n this.bufferMove(proxyId);\n return proxyId;\n }\n\n /**\n * Destroy a proxy. It is up to the client to remove any pairs.\n */\n destroyProxy(proxyId: number): void {\n this.unbufferMove(proxyId);\n this.m_proxyCount--;\n this.m_tree.destroyProxy(proxyId);\n }\n\n /**\n * Call moveProxy as many times as you like, then when you are done call\n * UpdatePairs to finalized the proxy pairs (for your time step).\n */\n moveProxy(proxyId: number, aabb: AABB, displacement: Vec2): void {\n _ASSERT && console.assert(AABB.isValid(aabb));\n const changed = this.m_tree.moveProxy(proxyId, aabb, displacement);\n if (changed) {\n this.bufferMove(proxyId);\n }\n }\n\n /**\n * Call to trigger a re-processing of it's pairs on the next call to\n * UpdatePairs.\n */\n touchProxy(proxyId: number): void {\n this.bufferMove(proxyId);\n }\n\n bufferMove(proxyId: number): void {\n this.m_moveBuffer.push(proxyId);\n }\n\n unbufferMove(proxyId: number): void {\n for (let i = 0; i < this.m_moveBuffer.length; ++i) {\n if (this.m_moveBuffer[i] === proxyId) {\n this.m_moveBuffer[i] = null;\n }\n }\n }\n\n /**\n * Update the pairs. This results in pair callbacks. This can only add pairs.\n */\n updatePairs(addPairCallback: (userDataA: FixtureProxy, userDataB: FixtureProxy) => void): void {\n _ASSERT && console.assert(typeof addPairCallback === 'function');\n this.m_callback = addPairCallback;\n\n // Perform tree queries for all moving proxies.\n while (this.m_moveBuffer.length > 0) {\n this.m_queryProxyId = this.m_moveBuffer.pop();\n if (this.m_queryProxyId === null) {\n continue;\n }\n\n // We have to query the tree with the fat AABB so that\n // we don't fail to create a pair that may touch later.\n const fatAABB = this.m_tree.getFatAABB(this.m_queryProxyId);\n\n // Query tree, create pairs and add them pair buffer.\n this.m_tree.query(fatAABB, this.queryCallback);\n }\n\n // Try to keep the tree balanced.\n // this.m_tree.rebalance(4);\n }\n\n queryCallback = (proxyId: number): boolean => {\n // A proxy cannot form a pair with itself.\n if (proxyId === this.m_queryProxyId) {\n return true;\n }\n\n const proxyIdA = Math.min(proxyId, this.m_queryProxyId);\n const proxyIdB = Math.max(proxyId, this.m_queryProxyId);\n\n // TODO: Skip any duplicate pairs.\n\n const userDataA = this.m_tree.getUserData(proxyIdA);\n const userDataB = this.m_tree.getUserData(proxyIdB);\n\n // Send the pairs back to the client.\n this.m_callback(userDataA, userDataB);\n\n return true;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2, Vec2Value } from './Vec2';\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class Rot {\n s: number;\n c: number;\n\n /** Initialize from an angle in radians. */\n constructor(angle?: number | Rot) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Rot)) {\n return new Rot(angle);\n }\n if (typeof angle === 'number') {\n this.setAngle(angle);\n } else if (typeof angle === 'object') {\n this.setRot(angle);\n } else {\n this.setIdentity();\n }\n }\n\n /** @internal */\n static neo(angle: number): Rot {\n const obj = Object.create(Rot.prototype);\n obj.setAngle(angle);\n return obj;\n }\n\n static clone(rot: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n const obj = Object.create(Rot.prototype);\n obj.s = rot.s;\n obj.c = rot.c;\n return obj;\n }\n\n static identity(): Rot {\n const obj = Object.create(Rot.prototype);\n obj.s = 0.0;\n obj.c = 1.0;\n return obj;\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.s) && Math.isFinite(obj.c);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Rot.isValid(o), 'Invalid Rot!', o);\n }\n\n /** Set to the identity rotation. */\n setIdentity(): void {\n this.s = 0.0;\n this.c = 1.0;\n }\n\n set(angle: number | Rot): void {\n if (typeof angle === 'object') {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n\n } else {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n }\n\n setRot(angle: Rot): void {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n }\n\n /** Set using an angle in radians. */\n setAngle(angle: number): void {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n\n /** Get the angle in radians. */\n getAngle(): number {\n return Math.atan2(this.s, this.c);\n }\n\n /** Get the x-axis. */\n getXAxis(): Vec2 {\n return Vec2.neo(this.c, this.s);\n }\n\n /** Get the u-axis. */\n getYAxis(): Vec2 {\n return Vec2.neo(-this.s, this.c);\n }\n\n /** Multiply two rotations: q * r */\n static mul(rot: Rot, m: Rot): Rot;\n /** Rotate a vector */\n static mul(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(rot, m) {\n _ASSERT && Rot.assert(rot);\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Multiply two rotations: q * r */\n static mulRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n }\n\n /** Rotate a vector */\n static mulVec2(rot: Rot, m: Vec2): Vec2 {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n\n static mulSub(rot: Rot, v: Vec2, w: Vec2): Vec2 {\n const x = rot.c * (v.x - w.x) - rot.s * (v.y - w.y);\n const y = rot.s * (v.x - w.x) + rot.c * (v.y - w.y);\n return Vec2.neo(x, y);\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulT(rot: Rot, m: Rot): Rot;\n /** Inverse rotate a vector */\n static mulT(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(rot, m) {\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulTRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n }\n\n /** Inverse rotate a vector */\n static mulTVec2(rot: Rot, m: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2, Vec2Value } from './Vec2';\nimport { Rot } from './Rot';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A transform contains translation and rotation. It is used to represent the\n * position and orientation of rigid frames. Initialize using a position vector\n * and a rotation.\n */\nexport class Transform {\n /** position */\n p: Vec2;\n\n /** rotation */\n q: Rot;\n\n constructor(position?: Vec2Value, rotation?: number) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Transform)) {\n return new Transform(position, rotation);\n }\n this.p = Vec2.zero();\n this.q = Rot.identity();\n if (typeof position !== 'undefined') {\n this.p.setVec2(position);\n }\n if (typeof rotation !== 'undefined') {\n this.q.setAngle(rotation);\n }\n }\n\n static clone(xf: Transform): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(xf.p);\n obj.q = Rot.clone(xf.q);\n return obj;\n }\n\n /** @internal */\n static neo(position: Vec2, rotation: Rot): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(position);\n obj.q = Rot.clone(rotation);\n return obj;\n }\n\n static identity(): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.zero();\n obj.q = Rot.identity();\n return obj;\n }\n\n /**\n * Set this to the identity transform.\n */\n setIdentity(): void {\n this.p.setZero();\n this.q.setIdentity();\n }\n\n set(position: Vec2, rotation: number): void;\n set(xf: Transform): void;\n /**\n * Set this based on the position and angle.\n */\n // tslint:disable-next-line:typedef\n set(a, b?) {\n if (typeof b === 'undefined') {\n this.p.set(a.p);\n this.q.set(a.q);\n } else {\n this.p.set(a);\n this.q.set(b);\n }\n }\n\n /**\n * Set this based on the position and angle.\n */\n setNum(position: Vec2, rotation: number) {\n this.p.setVec2(position);\n this.q.setAngle(rotation);\n }\n\n setTransform(xf: Transform): void {\n this.p.setVec2(xf.p);\n this.q.setRot(xf.q);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.p) && Rot.isValid(obj.q);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Transform.isValid(o), 'Invalid Transform!', o);\n }\n\n static mul(a: Transform, b: Vec2Value): Vec2;\n static mul(a: Transform, b: Transform): Transform;\n // static mul(a: Transform, b: Vec2Value[]): Vec2[];\n // static mul(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (Array.isArray(b)) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n\n } else if ('x' in b && 'y' in b) {\n return Transform.mulVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulXf(a, b);\n }\n }\n\n static mulAll(a: Transform, b: Vec2Value[]): Vec2[];\n static mulAll(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mulAll(a: Transform, b) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static mulFn(a: Transform) {\n _ASSERT && Transform.assert(a);\n return function(b: Vec2Value): Vec2 {\n return Transform.mul(a, b);\n };\n }\n\n static mulVec2(a: Transform, b: Vec2Value): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = (a.q.c * b.x - a.q.s * b.y) + a.p.x;\n const y = (a.q.s * b.x + a.q.c * b.y) + a.p.y;\n return Vec2.neo(x, y);\n }\n\n static mulXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p\n // = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p\n const xf = Transform.identity();\n xf.q = Rot.mulRot(a.q, b.q);\n xf.p = Vec2.add(Rot.mulVec2(a.q, b.p), a.p);\n return xf;\n }\n\n static mulT(a: Transform, b: Vec2Value): Vec2;\n static mulT(a: Transform, b: Transform): Transform;\n // tslint:disable-next-line:typedef\n static mulT(a, b) {\n if ('x' in b && 'y' in b) {\n return Transform.mulTVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulTXf(a, b);\n }\n }\n\n static mulTVec2(a: Transform, b: Vec2Value): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const px = b.x - a.p.x;\n const py = b.y - a.p.y;\n const x = (a.q.c * px + a.q.s * py);\n const y = (-a.q.s * px + a.q.c * py);\n return Vec2.neo(x, y);\n }\n\n static mulTXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q' * (B.q * v1 + B.p - A.p)\n // = A.q' * B.q * v1 + A.q' * (B.p - A.p)\n const xf = Transform.identity();\n xf.q.setRot(Rot.mulTRot(a.q, b.q));\n xf.p.setVec2(Rot.mulTVec2(a.q, Vec2.sub(b.p, a.p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\nimport { Vec2 } from './Vec2';\nimport { Rot } from './Rot';\nimport { Transform } from './Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * This describes the motion of a body/shape for TOI computation. Shapes are\n * defined with respect to the body origin, which may not coincide with the\n * center of mass. However, to support dynamics we must interpolate the center\n * of mass position.\n */\nexport class Sweep {\n /** Local center of mass position */\n localCenter: Vec2;\n\n /** World center position */\n c: Vec2;\n\n /** World angle */\n a: number;\n\n /** Fraction of the current time step in the range [0,1], c0 and a0 are c and a at alpha0. */\n alpha0: number;\n\n c0: Vec2;\n a0: number;\n\n constructor(c?: Vec2, a?: number) {\n _ASSERT && console.assert(typeof c === 'undefined');\n _ASSERT && console.assert(typeof a === 'undefined');\n this.localCenter = Vec2.zero();\n this.c = Vec2.zero();\n this.a = 0;\n this.alpha0 = 0;\n this.c0 = Vec2.zero();\n this.a0 = 0;\n }\n\n setTransform(xf: Transform): void {\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n\n this.a = xf.q.getAngle();\n this.a0 = xf.q.getAngle();\n }\n\n setLocalCenter(localCenter: Vec2, xf: Transform): void {\n this.localCenter.setVec2(localCenter);\n\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n }\n\n /**\n * Get the interpolated transform at a specific time.\n *\n * @param xf\n * @param beta A factor in [0,1], where 0 indicates alpha0\n */\n getTransform(xf: Transform, beta: number = 0): void {\n xf.q.setAngle((1.0 - beta) * this.a0 + beta * this.a);\n xf.p.setCombine((1.0 - beta), this.c0, beta, this.c);\n\n // shift to origin\n xf.p.sub(Rot.mulVec2(xf.q, this.localCenter));\n }\n\n /**\n * Advance the sweep forward, yielding a new initial state.\n *\n * @param alpha The new initial time\n */\n advance(alpha: number): void {\n _ASSERT && console.assert(this.alpha0 < 1.0);\n const beta = (alpha - this.alpha0) / (1.0 - this.alpha0);\n this.c0.setCombine(beta, this.c, 1 - beta, this.c0);\n this.a0 = beta * this.a + (1 - beta) * this.a0;\n this.alpha0 = alpha;\n }\n\n forward(): void {\n this.a0 = this.a;\n this.c0.setVec2(this.c);\n }\n\n /**\n * normalize the angles in radians to be between -pi and pi.\n */\n normalize(): void {\n const a0 = Math.mod(this.a0, -Math.PI, +Math.PI);\n this.a -= this.a0 - a0;\n this.a0 = a0;\n }\n\n clone(): Sweep {\n const clone = new Sweep();\n clone.localCenter.setVec2(this.localCenter);\n clone.alpha0 = this.alpha0;\n clone.a0 = this.a0;\n clone.a = this.a;\n clone.c0.setVec2(this.c0);\n clone.c.setVec2(this.c);\n return clone;\n }\n\n set(that: Sweep): void {\n this.localCenter.setVec2(that.localCenter);\n this.alpha0 = that.alpha0;\n this.a0 = that.a0;\n this.a = that.a;\n this.c0.setVec2(that.c0);\n this.c.setVec2(that.c);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\n\nexport class Velocity {\n /** linear */\n v: Vec2;\n\n /** angular */\n w: number;\n\n constructor() {\n this.v = Vec2.zero();\n this.w = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Transform } from '../common/Transform';\n\n\nexport class Position {\n /** location */\n c: Vec2;\n\n /** angle */\n a: number;\n\n constructor() {\n this.c = Vec2.zero();\n this.a = 0;\n }\n\n getTransform(xf: Transform, p: Vec2): Transform {\n xf.q.setAngle(this.a);\n xf.p.setVec2(Vec2.sub(this.c, Rot.mulVec2(xf.q, p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from './AABB';\nimport { DistanceProxy } from './Distance';\nimport type { Transform } from '../common/Transform';\nimport type { Vec2Value } from '../common/Vec2';\n\n// todo make shape an interface\n\n/**\n * A shape is used for collision detection. You can create a shape however you\n * like. Shapes used for simulation in World are created automatically when a\n * Fixture is created. Shapes may encapsulate one or more child shapes.\n */\nexport abstract class Shape {\n m_type: ShapeType;\n m_radius: number;\n\n /** @internal */\n abstract _reset(): void;\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return typeof obj.m_type === 'string' && typeof obj.m_radius === 'number';\n }\n\n abstract getRadius(): number;\n\n /**\n * Get the type of this shape. You can use this to down cast to the concrete\n * shape.\n *\n * @return the shape type.\n */\n abstract getType(): ShapeType;\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n abstract _clone(): Shape;\n\n /**\n * Get the number of child primitives.\n */\n abstract getChildCount(): number;\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n abstract testPoint(xf: Transform, p: Vec2Value): boolean;\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n abstract rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean;\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n abstract computeAABB(aabb: AABB, xf: Transform, childIndex: number): void;\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n abstract computeMass(massData: MassData, density?: number): void;\n\n abstract computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void;\n\n}\n\nexport type ShapeType = \"circle\" | \"edge\" | \"polygon\" | \"chain\";\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { math as Math } from '../common/Math';\nimport { Vec2, Vec2Value } from '../common/Vec2';\nimport { AABB, RayCastInput, RayCastOutput } from '../collision/AABB';\nimport { Shape, ShapeType } from '../collision/Shape';\nimport { Body, MassData } from \"./Body\";\nimport { BroadPhase } from \"../collision/BroadPhase\";\nimport { Transform } from \"../common/Transform\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A fixture definition is used to create a fixture. This class defines an\n * abstract fixture definition. You can reuse fixture definitions safely.\n */\nexport interface FixtureOpt {\n userData?: unknown;\n /**\n * The friction coefficient, usually in the range [0,1]\n */\n friction?: number;\n /**\n * The restitution (elasticity) usually in the range [0,1]\n */\n restitution?: number;\n /**\n * The density, usually in kg/m^2\n */\n density?: number;\n /**\n * A sensor shape collects contact information but never generates a collision response.\n */\n isSensor?: boolean;\n /**\n * Zero, positive or negative collision group.\n * Fixtures with same positive groupIndex always collide and fixtures with same negative groupIndex never collide.\n */\n filterGroupIndex?: number;\n /**\n * Collision category bit or bits that this fixture belongs to.\n * If groupIndex is zero or not matching, then at least one bit in this fixture categoryBits should match other fixture maskBits and vice versa.\n */\n filterCategoryBits?: number;\n /**\n * Collision category bit or bits that this fixture accept for collision.\n */\n filterMaskBits?: number;\n}\n\nexport interface FixtureDef extends FixtureOpt {\n shape: Shape;\n}\n\nconst FixtureDefDefault: FixtureOpt = {\n userData : null,\n friction : 0.2,\n restitution : 0.0,\n density : 0.0,\n isSensor : false,\n\n filterGroupIndex : 0,\n filterCategoryBits : 0x0001,\n filterMaskBits : 0xFFFF\n};\n\n/**\n * This proxy is used internally to connect shape children to the broad-phase.\n */\nexport class FixtureProxy {\n aabb: AABB;\n fixture: Fixture;\n childIndex: number;\n proxyId: number;\n constructor(fixture: Fixture, childIndex: number) {\n this.aabb = new AABB();\n this.fixture = fixture;\n this.childIndex = childIndex;\n this.proxyId;\n }\n}\n\n/**\n * A fixture is used to attach a shape to a body for collision detection. A\n * fixture inherits its transform from its parent. Fixtures hold additional\n * non-geometric data such as friction, collision filters, etc.\n *\n * To create a new Fixture use {@link Body.createFixture}.\n */\nexport class Fixture {\n /** @internal */ m_body: Body;\n /** @internal */ m_friction: number;\n /** @internal */ m_restitution: number;\n /** @internal */ m_density: number;\n /** @internal */ m_isSensor: boolean;\n /** @internal */ m_filterGroupIndex: number;\n /** @internal */ m_filterCategoryBits: number;\n /** @internal */ m_filterMaskBits: number;\n /** @internal */ m_shape: Shape;\n /** @internal */ m_next: Fixture | null;\n /** @internal */ m_proxies: FixtureProxy[];\n /** @internal */ m_proxyCount: number;\n /** @internal */ m_userData: unknown;\n\n constructor(body: Body, def: FixtureDef);\n constructor(body: Body, shape: Shape, def?: FixtureOpt);\n constructor(body: Body, shape: Shape, density?: number);\n // tslint:disable-next-line:typedef\n /** @internal */ constructor(body: Body, shape?, def?) {\n if (shape.shape) {\n def = shape;\n shape = shape.shape;\n\n } else if (typeof def === 'number') {\n def = {density : def};\n }\n\n def = options(def, FixtureDefDefault);\n\n this.m_body = body;\n\n this.m_friction = def.friction;\n this.m_restitution = def.restitution;\n this.m_density = def.density;\n this.m_isSensor = def.isSensor;\n\n this.m_filterGroupIndex = def.filterGroupIndex;\n this.m_filterCategoryBits = def.filterCategoryBits;\n this.m_filterMaskBits = def.filterMaskBits;\n\n // TODO validate shape\n this.m_shape = shape; // .clone();\n\n this.m_next = null;\n\n this.m_proxies = [];\n this.m_proxyCount = 0;\n\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n\n this.m_userData = def.userData;\n }\n\n /**\n * Re-setup fixture.\n * @internal\n */\n _reset(): void {\n const body = this.getBody();\n const broadPhase = body.m_world.m_broadPhase;\n this.destroyProxies(broadPhase);\n if (this.m_shape._reset) {\n this.m_shape._reset();\n }\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n this.createProxies(broadPhase, body.m_xf);\n body.resetMassData();\n }\n\n /** @internal */\n _serialize(): object {\n return {\n friction: this.m_friction,\n restitution: this.m_restitution,\n density: this.m_density,\n isSensor: this.m_isSensor,\n\n filterGroupIndex: this.m_filterGroupIndex,\n filterCategoryBits: this.m_filterCategoryBits,\n filterMaskBits: this.m_filterMaskBits,\n\n shape: this.m_shape,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, body: any, restore: any): Fixture {\n const shape = restore(Shape, data.shape);\n const fixture = shape && new Fixture(body, shape, data);\n return fixture;\n }\n\n /**\n * Get the type of the child shape. You can use this to down cast to the\n * concrete shape.\n */\n getType(): ShapeType {\n return this.m_shape.getType();\n }\n\n /**\n * Get the child shape. You can modify the child shape, however you should not\n * change the number of vertices because this will crash some collision caching\n * mechanisms. Manipulating the shape may lead to non-physical behavior.\n */\n getShape(): Shape {\n return this.m_shape;\n }\n\n /**\n * A sensor shape collects contact information but never generates a collision\n * response.\n */\n isSensor(): boolean {\n return this.m_isSensor;\n }\n\n /**\n * Set if this fixture is a sensor.\n */\n setSensor(sensor: boolean): void {\n if (sensor != this.m_isSensor) {\n this.m_body.setAwake(true);\n this.m_isSensor = sensor;\n }\n }\n\n // /**\n // * Get the contact filtering data.\n // */\n // getFilterData() {\n // return this.m_filter;\n // }\n\n /**\n * Get the user data that was assigned in the fixture definition. Use this to\n * store your application specific data.\n */\n getUserData(): unknown {\n return this.m_userData;\n }\n\n /**\n * Set the user data. Use this to store your application specific data.\n */\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get the parent body of this fixture. This is null if the fixture is not\n * attached.\n */\n getBody(): Body {\n return this.m_body;\n }\n\n /**\n * Get the next fixture in the parent body's fixture list.\n */\n getNext(): Fixture | null {\n return this.m_next;\n }\n\n /**\n * Get the density of this fixture.\n */\n getDensity(): number {\n return this.m_density;\n }\n\n /**\n * Set the density of this fixture. This will _not_ automatically adjust the\n * mass of the body. You must call Body.resetMassData to update the body's mass.\n */\n setDensity(density: number): void {\n _ASSERT && console.assert(Math.isFinite(density) && density >= 0.0);\n this.m_density = density;\n }\n\n /**\n * Get the coefficient of friction, usually in the range [0,1].\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Set the coefficient of friction. This will not change the friction of\n * existing contacts.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the coefficient of restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Set the coefficient of restitution. This will not change the restitution of\n * existing contacts.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Test a point in world coordinates for containment in this fixture.\n */\n testPoint(p: Vec2Value): boolean {\n return this.m_shape.testPoint(this.m_body.getTransform(), p);\n }\n\n /**\n * Cast a ray against this shape.\n */\n rayCast(output: RayCastOutput, input: RayCastInput, childIndex: number): boolean {\n return this.m_shape.rayCast(output, input, this.m_body.getTransform(), childIndex);\n }\n\n /**\n * Get the mass data for this fixture. The mass data is based on the density and\n * the shape. The rotational inertia is about the shape's origin. This operation\n * may be expensive.\n */\n getMassData(massData: MassData): void {\n this.m_shape.computeMass(massData, this.m_density);\n }\n\n /**\n * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a\n * more accurate AABB, compute it using the shape and the body transform.\n */\n getAABB(childIndex: number): AABB {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_proxies.length);\n return this.m_proxies[childIndex].aabb;\n }\n\n /**\n * These support body activation/deactivation.\n */\n createProxies(broadPhase: BroadPhase, xf: Transform): void {\n _ASSERT && console.assert(this.m_proxyCount == 0);\n\n // Create proxies in the broad-phase.\n this.m_proxyCount = this.m_shape.getChildCount();\n\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n this.m_shape.computeAABB(proxy.aabb, xf, i);\n proxy.proxyId = broadPhase.createProxy(proxy.aabb, proxy);\n }\n }\n\n destroyProxies(broadPhase: BroadPhase): void {\n // Destroy proxies in the broad-phase.\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n broadPhase.destroyProxy(proxy.proxyId);\n proxy.proxyId = null;\n }\n\n this.m_proxyCount = 0;\n }\n\n /**\n * Updates this fixture proxy in broad-phase (with combined AABB of current and\n * next transformation).\n */\n synchronize(broadPhase: BroadPhase, xf1: Transform, xf2: Transform): void {\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n // Compute an AABB that covers the swept shape (may miss some rotation\n // effect).\n const aabb1 = new AABB();\n const aabb2 = new AABB();\n this.m_shape.computeAABB(aabb1, xf1, proxy.childIndex);\n this.m_shape.computeAABB(aabb2, xf2, proxy.childIndex);\n\n proxy.aabb.combine(aabb1, aabb2);\n\n const displacement = Vec2.sub(xf2.p, xf1.p);\n\n broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement);\n }\n }\n\n /**\n * Set the contact filtering data. This will not update contacts until the next\n * time step when either parent body is active and awake. This automatically\n * calls refilter.\n */\n setFilterData(filter: { groupIndex: number, categoryBits: number, maskBits: number }): void {\n this.m_filterGroupIndex = filter.groupIndex;\n this.m_filterCategoryBits = filter.categoryBits;\n this.m_filterMaskBits = filter.maskBits;\n this.refilter();\n }\n\n getFilterGroupIndex(): number {\n return this.m_filterGroupIndex;\n }\n\n setFilterGroupIndex(groupIndex: number): void {\n this.m_filterGroupIndex = groupIndex;\n }\n\n getFilterCategoryBits(): number {\n return this.m_filterCategoryBits;\n }\n\n setFilterCategoryBits(categoryBits: number): void {\n this.m_filterCategoryBits = categoryBits;\n }\n\n getFilterMaskBits(): number {\n return this.m_filterMaskBits;\n }\n\n setFilterMaskBits(maskBits: number): void {\n this.m_filterMaskBits = maskBits;\n }\n\n /**\n * Call this if you want to establish collision that was previously disabled by\n * ContactFilter.\n */\n refilter(): void {\n if (this.m_body == null) {\n return;\n }\n\n // Flag associated contacts for filtering.\n let edge = this.m_body.getContactList();\n while (edge) {\n const contact = edge.contact;\n const fixtureA = contact.getFixtureA();\n const fixtureB = contact.getFixtureB();\n if (fixtureA == this || fixtureB == this) {\n contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n\n const world = this.m_body.getWorld();\n\n if (world == null) {\n return;\n }\n\n // Touch each proxy so that new pairs may be created\n const broadPhase = world.m_broadPhase;\n for (let i = 0; i < this.m_proxyCount; ++i) {\n broadPhase.touchProxy(this.m_proxies[i].proxyId);\n }\n }\n\n /**\n * Implement this method to provide collision filtering, if you want finer\n * control over contact creation.\n *\n * Return true if contact calculations should be performed between these two\n * fixtures.\n *\n * Warning: for performance reasons this is only called when the AABBs begin to\n * overlap.\n */\n shouldCollide(that: Fixture): boolean {\n\n if (that.m_filterGroupIndex === this.m_filterGroupIndex && that.m_filterGroupIndex !== 0) {\n return that.m_filterGroupIndex > 0;\n }\n\n const collideA = (that.m_filterMaskBits & this.m_filterCategoryBits) !== 0;\n const collideB = (that.m_filterCategoryBits & this.m_filterMaskBits) !== 0;\n const collide = collideA && collideB;\n return collide;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { Vec2, Vec2Value } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { math as Math } from '../common/Math';\nimport { Sweep } from '../common/Sweep';\nimport { Transform } from '../common/Transform';\nimport { Velocity } from './Velocity';\nimport { Position } from './Position';\nimport { Fixture, FixtureDef, FixtureOpt } from './Fixture';\nimport { Shape } from '../collision/Shape';\nimport { JointEdge } from \"./Joint\";\nimport { World } from \"./World\";\nimport { ContactEdge } from \"./Contact\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport type BodyType = 'static' | 'kinematic' | 'dynamic';\n\nconst STATIC = 'static';\nconst KINEMATIC = 'kinematic';\nconst DYNAMIC = 'dynamic';\n\nexport interface BodyDef {\n /**\n * Body types are static, kinematic, or dynamic. Note: if a dynamic\n * body would have zero mass, the mass is set to one.\n */\n type?: BodyType;\n /**\n * The world position of the body. Avoid creating bodies at the\n * origin since this can lead to many overlapping shapes.\n */\n position?: Vec2;\n /**\n * The world angle of the body in radians.\n */\n angle?: number;\n /**\n * The linear velocity of the body's origin in world co-ordinates.\n */\n linearVelocity?: Vec2;\n angularVelocity?: number;\n /**\n * Linear damping is use to reduce the linear velocity. The\n * damping parameter can be larger than 1.0 but the damping effect becomes\n * sensitive to the time step when the damping parameter is large.\n */\n linearDamping?: number;\n /**\n * Angular damping is use to reduce the angular velocity.\n * The damping parameter can be larger than 1.0 but the damping effect\n * becomes sensitive to the time step when the damping parameter is large.\n */\n angularDamping?: number;\n /**\n * Should this body be prevented from rotating? Useful for characters.\n */\n fixedRotation?: boolean;\n /**\n * Is this a fast moving body that should be prevented from\n * tunneling through other moving bodies? Note that all bodies are\n * prevented from tunneling through kinematic and static bodies. This\n * setting is only considered on dynamic bodies. Warning: You should use\n * this flag sparingly since it increases processing time.\n */\n bullet?: boolean;\n gravityScale?: number;\n /**\n * Set this flag to false if this body should never fall asleep. Note that this increases CPU usage.\n */\n allowSleep?: boolean;\n /**\n * Is this body initially awake or sleeping?\n */\n awake?: boolean;\n /**\n * Does this body start out active?\n */\n active?: boolean;\n userData?: any;\n}\n\nconst BodyDefDefault: BodyDef = {\n type : STATIC,\n position : Vec2.zero(),\n angle : 0.0,\n\n linearVelocity : Vec2.zero(),\n angularVelocity : 0.0,\n\n linearDamping : 0.0,\n angularDamping : 0.0,\n\n fixedRotation : false,\n bullet : false,\n gravityScale : 1.0,\n\n allowSleep : true,\n awake : true,\n active : true,\n\n userData : null\n};\n\n/**\n * MassData This holds the mass data computed for a shape.\n */\nexport class MassData {\n /** The mass of the shape, usually in kilograms. */\n mass: number = 0;\n /** The position of the shape's centroid relative to the shape's origin. */\n center: Vec2 = Vec2.zero();\n /** The rotational inertia of the shape about the local origin. */\n I: number = 0;\n}\n\n/**\n * A rigid body composed of one or more fixtures.\n *\n * To create a new Body use {@link World.createBody}.\n */\nexport class Body {\n /**\n * A static body does not move under simulation and behaves as if it has infinite mass.\n * Internally, zero is stored for the mass and the inverse mass.\n * Static bodies can be moved manually by the user.\n * A static body has zero velocity.\n * Static bodies do not collide with other static or kinematic bodies.\n */\n static readonly STATIC: BodyType = 'static';\n /**\n * A kinematic body moves under simulation according to its velocity.\n * Kinematic bodies do not respond to forces.\n * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity.\n * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass.\n * Kinematic bodies do not collide with other kinematic or static bodies.\n */\n static readonly KINEMATIC: BodyType = 'kinematic';\n\n /**\n * A dynamic body is fully simulated.\n * They can be moved manually by the user, but normally they move according to forces.\n * A dynamic body can collide with all body types.\n * A dynamic body always has finite, non-zero mass.\n * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate.\n */\n static readonly DYNAMIC: BodyType = 'dynamic';\n\n /** @internal */ m_world: World;\n /** @internal */ m_awakeFlag: boolean;\n /** @internal */ m_autoSleepFlag: boolean;\n /** @internal */ m_bulletFlag: boolean;\n /** @internal */ m_fixedRotationFlag: boolean;\n /** @internal */ m_activeFlag: boolean;\n /** @internal */ m_islandFlag: boolean;\n /** @internal */ m_toiFlag: boolean;\n /** @internal */ m_userData: unknown;\n /** @internal */ m_type: BodyType;\n /** @internal */ m_mass: number;\n /** @internal */ m_invMass: number;\n /** @internal Rotational inertia about the center of mass. */\n m_I: number;\n /** @internal */ m_invI: number;\n /** @internal the body origin transform */\n m_xf: Transform;\n /** @internal the swept motion for CCD */\n m_sweep: Sweep;\n // position and velocity correction\n /** @internal */ c_velocity: Velocity;\n /** @internal */ c_position: Position;\n /** @internal */ m_force: Vec2;\n /** @internal */ m_torque: number;\n /** @internal */ m_linearVelocity: Vec2;\n /** @internal */ m_angularVelocity: number;\n /** @internal */ m_linearDamping: number;\n /** @internal */ m_angularDamping: number;\n /** @internal */ m_gravityScale: number;\n /** @internal */ m_sleepTime: number;\n /** @internal */ m_jointList: JointEdge | null;\n /** @internal */ m_contactList: ContactEdge | null;\n /** @internal */ m_fixtureList: Fixture | null;\n /** @internal */ m_prev: Body | null;\n /** @internal */ m_next: Body | null;\n /** @internal */ m_destroyed: boolean;\n\n /** @internal */\n constructor(world: World, def: BodyDef) {\n def = options(def, BodyDefDefault);\n\n _ASSERT && console.assert(Vec2.isValid(def.position));\n _ASSERT && console.assert(Vec2.isValid(def.linearVelocity));\n _ASSERT && console.assert(Math.isFinite(def.angle));\n _ASSERT && console.assert(Math.isFinite(def.angularVelocity));\n _ASSERT && console.assert(Math.isFinite(def.angularDamping) && def.angularDamping >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.linearDamping) && def.linearDamping >= 0.0);\n\n this.m_world = world;\n\n this.m_awakeFlag = def.awake;\n this.m_autoSleepFlag = def.allowSleep;\n this.m_bulletFlag = def.bullet;\n this.m_fixedRotationFlag = def.fixedRotation;\n this.m_activeFlag = def.active;\n\n this.m_islandFlag = false;\n this.m_toiFlag = false;\n\n this.m_userData = def.userData;\n this.m_type = def.type;\n\n if (this.m_type == DYNAMIC) {\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n } else {\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n }\n\n // Rotational inertia about the center of mass.\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n // the body origin transform\n this.m_xf = Transform.identity();\n this.m_xf.p = Vec2.clone(def.position);\n this.m_xf.q.setAngle(def.angle);\n\n // the swept motion for CCD\n this.m_sweep = new Sweep();\n this.m_sweep.setTransform(this.m_xf);\n\n // position and velocity correction\n this.c_velocity = new Velocity();\n this.c_position = new Position();\n\n this.m_force = Vec2.zero();\n this.m_torque = 0.0;\n\n this.m_linearVelocity = Vec2.clone(def.linearVelocity);\n this.m_angularVelocity = def.angularVelocity;\n\n this.m_linearDamping = def.linearDamping;\n this.m_angularDamping = def.angularDamping;\n this.m_gravityScale = def.gravityScale;\n\n this.m_sleepTime = 0.0;\n\n this.m_jointList = null;\n this.m_contactList = null;\n this.m_fixtureList = null;\n\n this.m_prev = null;\n this.m_next = null;\n\n this.m_destroyed = false;\n }\n\n /** @internal */\n _serialize(): object {\n const fixtures = [];\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n fixtures.push(f);\n }\n return {\n type: this.m_type,\n bullet: this.m_bulletFlag,\n position: this.m_xf.p,\n angle: this.m_xf.q.getAngle(),\n linearVelocity: this.m_linearVelocity,\n angularVelocity: this.m_angularVelocity,\n fixtures,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): Body {\n const body = new Body(world, data);\n\n if (data.fixtures) {\n for (let i = data.fixtures.length - 1; i >= 0; i--) {\n const fixture = restore(Fixture, data.fixtures[i], body);\n body._addFixture(fixture);\n }\n }\n return body;\n }\n\n isWorldLocked(): boolean {\n return this.m_world && this.m_world.isLocked() ? true : false;\n }\n\n getWorld(): World {\n return this.m_world;\n }\n\n getNext(): Body | null {\n return this.m_next;\n }\n\n setUserData(data: any): void {\n this.m_userData = data;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n getFixtureList(): Fixture | null {\n return this.m_fixtureList;\n }\n\n getJointList(): JointEdge | null {\n return this.m_jointList;\n }\n\n /**\n * Warning: this list changes during the time step and you may miss some\n * collisions if you don't use ContactListener.\n */\n getContactList(): ContactEdge | null {\n return this.m_contactList;\n }\n\n isStatic(): boolean {\n return this.m_type == STATIC;\n }\n\n isDynamic(): boolean {\n return this.m_type == DYNAMIC;\n }\n\n isKinematic(): boolean {\n return this.m_type == KINEMATIC;\n }\n\n /**\n * This will alter the mass and velocity.\n */\n setStatic(): Body {\n this.setType(STATIC);\n return this;\n }\n\n setDynamic(): Body {\n this.setType(DYNAMIC);\n return this;\n }\n\n setKinematic(): Body {\n this.setType(KINEMATIC);\n return this;\n }\n\n /**\n * @internal\n */\n getType(): BodyType {\n return this.m_type;\n }\n\n /**\n * @internal\n */\n setType(type: BodyType): void {\n _ASSERT && console.assert(type === STATIC || type === KINEMATIC || type === DYNAMIC);\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type == type) {\n return;\n }\n\n this.m_type = type;\n\n this.resetMassData();\n\n if (this.m_type == STATIC) {\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_sweep.forward();\n this.synchronizeFixtures();\n }\n\n this.setAwake(true);\n\n this.m_force.setZero();\n this.m_torque = 0.0;\n\n // Delete the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n\n // Touch the proxies so that new contacts will be created (when appropriate)\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n const proxyCount = f.m_proxyCount;\n for (let i = 0; i < proxyCount; ++i) {\n broadPhase.touchProxy(f.m_proxies[i].proxyId);\n }\n }\n }\n\n isBullet(): boolean {\n return this.m_bulletFlag;\n }\n\n /**\n * Should this body be treated like a bullet for continuous collision detection?\n */\n setBullet(flag: boolean): void {\n this.m_bulletFlag = !!flag;\n }\n\n isSleepingAllowed(): boolean {\n return this.m_autoSleepFlag;\n }\n\n setSleepingAllowed(flag: boolean): void {\n this.m_autoSleepFlag = !!flag;\n if (this.m_autoSleepFlag == false) {\n this.setAwake(true);\n }\n }\n\n isAwake(): boolean {\n return this.m_awakeFlag;\n }\n\n /**\n * Set the sleep state of the body. A sleeping body has very low CPU cost.\n *\n * @param flag Set to true to wake the body, false to put it to sleep.\n */\n setAwake(flag: boolean): void {\n if (flag) {\n if (this.m_awakeFlag == false) {\n this.m_awakeFlag = true;\n this.m_sleepTime = 0.0;\n }\n } else {\n this.m_awakeFlag = false;\n this.m_sleepTime = 0.0;\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_force.setZero();\n this.m_torque = 0.0;\n }\n }\n\n isActive(): boolean {\n return this.m_activeFlag;\n }\n\n /**\n * Set the active state of the body. An inactive body is not simulated and\n * cannot be collided with or woken up. If you pass a flag of true, all fixtures\n * will be added to the broad-phase. If you pass a flag of false, all fixtures\n * will be removed from the broad-phase and all contacts will be destroyed.\n * Fixtures and joints are otherwise unaffected.\n *\n * You may continue to create/destroy fixtures and joints on inactive bodies.\n * Fixtures on an inactive body are implicitly inactive and will not participate\n * in collisions, ray-casts, or queries. Joints connected to an inactive body\n * are implicitly inactive. An inactive body is still owned by a World object\n * and remains\n */\n setActive(flag: boolean): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (flag == this.m_activeFlag) {\n return;\n }\n\n this.m_activeFlag = !!flag;\n\n if (this.m_activeFlag) {\n // Create all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.createProxies(broadPhase, this.m_xf);\n }\n // Contacts are created the next time step.\n\n } else {\n // Destroy all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.destroyProxies(broadPhase);\n }\n\n // Destroy the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n }\n }\n\n isFixedRotation(): boolean {\n return this.m_fixedRotationFlag;\n }\n\n /**\n * Set this body to have fixed rotation. This causes the mass to be reset.\n */\n setFixedRotation(flag: boolean): void {\n if (this.m_fixedRotationFlag == flag) {\n return;\n }\n\n this.m_fixedRotationFlag = !!flag;\n\n this.m_angularVelocity = 0.0;\n\n this.resetMassData();\n }\n\n /**\n * Get the world transform for the body's origin.\n */\n getTransform(): Transform {\n return this.m_xf;\n }\n\n /**\n * Set the position of the body's origin and rotation. Manipulating a body's\n * transform may cause non-physical behavior. Note: contacts are updated on the\n * next call to World.step.\n *\n * @param position The world position of the body's local origin.\n * @param angle The world rotation in radians.\n */\n setTransform(position: Vec2, angle: number): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n this.m_xf.setNum(position, angle);\n this.m_sweep.setTransform(this.m_xf);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, this.m_xf, this.m_xf);\n }\n }\n\n synchronizeTransform(): void {\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Update fixtures in broad-phase.\n */\n synchronizeFixtures(): void {\n const xf = Transform.identity();\n\n this.m_sweep.getTransform(xf, 0);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, xf, this.m_xf);\n }\n }\n\n /**\n * Used in TOI.\n */\n advance(alpha: number): void {\n // Advance to the new safe time. This doesn't sync the broad-phase.\n this.m_sweep.advance(alpha);\n this.m_sweep.c.setVec2(this.m_sweep.c0);\n this.m_sweep.a = this.m_sweep.a0;\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Get the world position for the body's origin.\n */\n getPosition(): Vec2 {\n return this.m_xf.p;\n }\n\n setPosition(p: Vec2): void {\n this.setTransform(p, this.m_sweep.a);\n }\n\n /**\n * Get the current world rotation angle in radians.\n */\n getAngle(): number {\n return this.m_sweep.a;\n }\n\n setAngle(angle: number): void {\n this.setTransform(this.m_xf.p, angle);\n }\n\n /**\n * Get the world position of the center of mass.\n */\n getWorldCenter(): Vec2 {\n return this.m_sweep.c;\n }\n\n /**\n * Get the local position of the center of mass.\n */\n getLocalCenter(): Vec2 {\n return this.m_sweep.localCenter;\n }\n\n /**\n * Get the linear velocity of the center of mass.\n *\n * @return the linear velocity of the center of mass.\n */\n getLinearVelocity(): Vec2 {\n return this.m_linearVelocity;\n }\n\n /**\n * Get the world linear velocity of a world point attached to this body.\n *\n * @param worldPoint A point in world coordinates.\n */\n getLinearVelocityFromWorldPoint(worldPoint: Vec2): Vec2 {\n const localCenter = Vec2.sub(worldPoint, this.m_sweep.c);\n return Vec2.add(this.m_linearVelocity, Vec2.crossNumVec2(this.m_angularVelocity,\n localCenter));\n }\n\n /**\n * Get the world velocity of a local point.\n *\n * @param localPoint A point in local coordinates.\n */\n getLinearVelocityFromLocalPoint(localPoint: Vec2): Vec2 {\n return this.getLinearVelocityFromWorldPoint(this.getWorldPoint(localPoint));\n }\n\n /**\n * Set the linear velocity of the center of mass.\n *\n * @param v The new linear velocity of the center of mass.\n */\n setLinearVelocity(v: Vec2): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (Vec2.dot(v, v) > 0.0) {\n this.setAwake(true);\n }\n this.m_linearVelocity.setVec2(v);\n }\n\n /**\n * Get the angular velocity.\n *\n * @returns the angular velocity in radians/second.\n */\n getAngularVelocity(): number {\n return this.m_angularVelocity;\n }\n\n /**\n * Set the angular velocity.\n *\n * @param omega The new angular velocity in radians/second.\n */\n setAngularVelocity(w: number): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (w * w > 0.0) {\n this.setAwake(true);\n }\n this.m_angularVelocity = w;\n }\n\n getLinearDamping(): number {\n return this.m_linearDamping;\n }\n\n setLinearDamping(linearDamping: number): void {\n this.m_linearDamping = linearDamping;\n }\n\n getAngularDamping(): number {\n return this.m_angularDamping;\n }\n\n setAngularDamping(angularDamping: number): void {\n this.m_angularDamping = angularDamping;\n }\n\n getGravityScale(): number {\n return this.m_gravityScale;\n }\n\n /**\n * Scale the gravity applied to this body.\n */\n setGravityScale(scale: number): void {\n this.m_gravityScale = scale;\n }\n\n /**\n * Get the total mass of the body.\n *\n * @returns The mass, usually in kilograms (kg).\n */\n getMass(): number {\n return this.m_mass;\n }\n\n /**\n * Get the rotational inertia of the body about the local origin.\n *\n * @return the rotational inertia, usually in kg-m^2.\n */\n getInertia(): number {\n return this.m_I + this.m_mass\n * Vec2.dot(this.m_sweep.localCenter, this.m_sweep.localCenter);\n }\n\n /**\n * Copy the mass data of the body to data.\n */\n getMassData(data: MassData): void {\n data.mass = this.m_mass;\n data.I = this.getInertia();\n data.center.setVec2(this.m_sweep.localCenter);\n }\n\n /**\n * This resets the mass properties to the sum of the mass properties of the\n * fixtures. This normally does not need to be called unless you called\n * SetMassData to override the mass and you later want to reset the mass.\n */\n resetMassData(): void {\n // Compute mass data from shapes. Each shape has its own density.\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n this.m_sweep.localCenter.setZero();\n\n // Static and kinematic bodies have zero mass.\n if (this.isStatic() || this.isKinematic()) {\n this.m_sweep.c0.setVec2(this.m_xf.p);\n this.m_sweep.c.setVec2(this.m_xf.p);\n this.m_sweep.a0 = this.m_sweep.a;\n return;\n }\n\n _ASSERT && console.assert(this.isDynamic());\n\n // Accumulate mass over all fixtures.\n const localCenter = Vec2.zero();\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n if (f.m_density == 0.0) {\n continue;\n }\n\n const massData = new MassData();\n f.getMassData(massData);\n this.m_mass += massData.mass;\n localCenter.addMul(massData.mass, massData.center);\n this.m_I += massData.I;\n }\n\n // Compute center of mass.\n if (this.m_mass > 0.0) {\n this.m_invMass = 1.0 / this.m_mass;\n localCenter.mul(this.m_invMass);\n\n } else {\n // Force all dynamic bodies to have a positive mass.\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n }\n\n if (this.m_I > 0.0 && this.m_fixedRotationFlag == false) {\n // Center the inertia about the center of mass.\n this.m_I -= this.m_mass * Vec2.dot(localCenter, localCenter);\n _ASSERT && console.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n\n } else {\n this.m_I = 0.0;\n this.m_invI = 0.0;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(localCenter, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Set the mass properties to override the mass properties of the fixtures. Note\n * that this changes the center of mass position. Note that creating or\n * destroying fixtures can also alter the mass. This function has no effect if\n * the body isn't dynamic.\n *\n * @param massData The mass properties.\n */\n setMassData(massData: MassData): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n this.m_mass = massData.mass;\n if (this.m_mass <= 0.0) {\n this.m_mass = 1.0;\n }\n\n this.m_invMass = 1.0 / this.m_mass;\n\n if (massData.I > 0.0 && this.m_fixedRotationFlag == false) {\n this.m_I = massData.I - this.m_mass\n * Vec2.dot(massData.center, massData.center);\n _ASSERT && console.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(massData.center, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Apply a force at a world point. If the force is not applied at the center of\n * mass, it will generate a torque and affect the angular velocity. This wakes\n * up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyForce(force: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping.\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n this.m_torque += Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), force);\n }\n }\n\n /**\n * Apply a force to the center of mass. This wakes up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param wake Also wake up the body\n */\n applyForceToCenter(force: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n }\n }\n\n /**\n * Apply a torque. This affects the angular velocity without affecting the\n * linear velocity of the center of mass. This wakes up the body.\n *\n * @param torque About the z-axis (out of the screen), usually in N-m.\n * @param wake Also wake up the body\n */\n applyTorque(torque: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_torque += torque;\n }\n }\n\n /**\n * Apply an impulse at a point. This immediately modifies the velocity. It also\n * modifies the angular velocity if the point of application is not at the\n * center of mass. This wakes up the body.\n *\n * @param impulse The world impulse vector, usually in N-seconds or kg-m/s.\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyLinearImpulse(impulse: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_linearVelocity.addMul(this.m_invMass, impulse);\n this.m_angularVelocity += this.m_invI * Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), impulse);\n }\n }\n\n /**\n * Apply an angular impulse.\n *\n * @param impulse The angular impulse in units of kg*m*m/s\n * @param wake Also wake up the body\n */\n applyAngularImpulse(impulse: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_angularVelocity += this.m_invI * impulse;\n }\n }\n\n /**\n * This is used to prevent connected bodies (by joints) from colliding,\n * depending on the joint's collideConnected flag.\n */\n shouldCollide(that: Body): boolean {\n // At least one body should be dynamic.\n if (this.m_type != DYNAMIC && that.m_type != DYNAMIC) {\n return false;\n }\n // Does a joint prevent collision?\n for (let jn = this.m_jointList; jn; jn = jn.next) {\n if (jn.other == that) {\n if (jn.joint.m_collideConnected == false) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addFixture(fixture: Fixture): Fixture {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.createProxies(broadPhase, this.m_xf);\n }\n\n fixture.m_next = this.m_fixtureList;\n this.m_fixtureList = fixture;\n\n // Adjust mass properties if needed.\n if (fixture.m_density > 0.0) {\n this.resetMassData();\n }\n\n // Let the world know we have a new fixture. This will cause new contacts\n // to be created at the beginning of the next time step.\n this.m_world.m_newFixture = true;\n\n return fixture;\n }\n\n /**\n * Creates a fixture and attach it to this body.\n *\n * If the density is non-zero, this function automatically updates the mass of\n * the body.\n *\n * Contacts are not created until the next time step.\n *\n * Warning: This function is locked during callbacks.\n */\n createFixture(def: FixtureDef): Fixture;\n createFixture(shape: Shape, opt?: FixtureOpt): Fixture;\n createFixture(shape: Shape, density?: number): Fixture;\n // tslint:disable-next-line:typedef\n createFixture(shape, fixdef?) {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n const fixture = new Fixture(this, shape, fixdef);\n this._addFixture(fixture);\n return fixture;\n }\n\n /**\n * Destroy a fixture. This removes the fixture from the broad-phase and destroys\n * all contacts associated with this fixture. This will automatically adjust the\n * mass of the body if the body is dynamic and the fixture has positive density.\n * All fixtures attached to a body are implicitly destroyed when the body is\n * destroyed.\n *\n * Warning: This function is locked during callbacks.\n *\n * @param fixture The fixture to be removed.\n */\n destroyFixture(fixture: Fixture): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n _ASSERT && console.assert(fixture.m_body == this);\n\n // Remove the fixture from this body's singly linked list.\n let found = false;\n if (this.m_fixtureList === fixture) {\n this.m_fixtureList = fixture.m_next;\n found = true;\n\n } else {\n let node = this.m_fixtureList;\n while (node != null) {\n if (node.m_next === fixture) {\n node.m_next = fixture.m_next;\n found = true;\n break;\n }\n node = node.m_next;\n }\n }\n\n // You tried to remove a shape that is not attached to this body.\n _ASSERT && console.assert(found);\n\n // Destroy any contacts associated with the fixture.\n let edge = this.m_contactList;\n while (edge) {\n const c = edge.contact;\n edge = edge.next;\n\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n\n if (fixture == fixtureA || fixture == fixtureB) {\n // This destroys the contact and removes it from\n // this body's contact list.\n this.m_world.destroyContact(c);\n }\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.destroyProxies(broadPhase);\n }\n\n fixture.m_body = null;\n fixture.m_next = null;\n\n this.m_world.publish('remove-fixture', fixture);\n\n // Reset the mass data.\n this.resetMassData();\n }\n\n /**\n * Get the corresponding world point of a local point.\n */\n getWorldPoint(localPoint: Vec2): Vec2 {\n return Transform.mulVec2(this.m_xf, localPoint);\n }\n\n /**\n * Get the corresponding world vector of a local vector.\n */\n getWorldVector(localVector: Vec2): Vec2 {\n return Rot.mulVec2(this.m_xf.q, localVector);\n }\n\n /**\n * Gets the corresponding local point of a world point.\n */\n getLocalPoint(worldPoint: Vec2Value): Vec2 {\n return Transform.mulTVec2(this.m_xf, worldPoint);\n }\n\n /**\n * Gets the corresponding local vector of a world vector.\n */\n getLocalVector(worldVector: Vec2Value): Vec2 {\n return Rot.mulTVec2(this.m_xf.q, worldVector);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { Vec2 } from '../common/Vec2';\nimport type { Body } from './Body';\nimport { TimeStep } from \"./Solver\";\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n/**\n * A joint edge is used to connect bodies and joints together in a joint graph\n * where each body is a node and each joint is an edge. A joint edge belongs to\n * a doubly linked list maintained in each attached body. Each joint has two\n * joint nodes, one for each attached body.\n */\nexport class JointEdge {\n /**\n * provides quick access to the other body attached.\n */\n other: Body | null = null;\n /**\n * the joint\n */\n joint: Joint | null = null;\n /**\n * prev the previous joint edge in the body's joint list\n */\n prev: JointEdge | null = null;\n /**\n * the next joint edge in the body's joint list\n */\n next: JointEdge | null = null;\n}\n\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointOpt {\n /**\n * Use this to attach application specific data to your joints.\n */\n userData?: any;\n /**\n * Set this flag to true if the attached bodies\n * should collide.\n */\n collideConnected?: boolean;\n}\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointDef extends JointOpt {\n /**\n * The first attached body.\n */\n bodyA: Body;\n /**\n * The second attached body.\n */\n bodyB: Body;\n}\n\nconst DEFAULTS = {\n userData : null,\n collideConnected : false\n};\n\n/**\n * The base joint class. Joints are used to constraint two bodies together in\n * various fashions. Some joints also feature limits and motors.\n */\nexport abstract class Joint {\n\n /** @internal */ m_type: string = 'unknown-joint';\n\n /** @internal */ m_bodyA: Body;\n /** @internal */ m_bodyB: Body;\n\n /** @internal */ m_collideConnected: boolean;\n\n /** @internal */ m_prev: Joint | null = null;\n /** @internal */ m_next: Joint | null = null;\n\n /** @internal */ m_edgeA: JointEdge = new JointEdge();\n /** @internal */ m_edgeB: JointEdge = new JointEdge();\n\n /** @internal */ m_islandFlag: boolean = false;\n /** @internal */ m_userData: unknown;\n\n constructor(def: JointDef);\n constructor(def: JointOpt, bodyA: Body, bodyB: Body);\n constructor(def: JointDef | JointOpt, bodyA?: Body, bodyB?: Body) {\n bodyA = 'bodyA' in def ? def.bodyA : bodyA;\n bodyB = 'bodyB' in def ? def.bodyB : bodyB;\n\n _ASSERT && console.assert(!!bodyA);\n _ASSERT && console.assert(!!bodyB);\n _ASSERT && console.assert(bodyA != bodyB);\n\n this.m_bodyA = bodyA!;\n this.m_bodyB = bodyB!;\n\n this.m_collideConnected = !!def.collideConnected;\n this.m_userData = def.userData;\n }\n\n /**\n * Short-cut function to determine if either body is inactive.\n */\n isActive(): boolean {\n return this.m_bodyA.isActive() && this.m_bodyB.isActive();\n }\n\n /**\n * Get the type of the concrete joint.\n */\n getType(): string {\n return this.m_type;\n }\n\n /**\n * Get the first body attached to this joint.\n */\n getBodyA(): Body {\n return this.m_bodyA;\n }\n\n /**\n * Get the second body attached to this joint.\n */\n getBodyB(): Body {\n return this.m_bodyB;\n }\n\n /**\n * Get the next joint the world joint list.\n */\n getNext(): Joint {\n return this.m_next;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get collide connected. Note: modifying the collide connect flag won't work\n * correctly because the flag is only checked when fixture AABBs begin to\n * overlap.\n */\n getCollideConnected(): boolean {\n return this.m_collideConnected;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n abstract getAnchorA(): Vec2;\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n abstract getAnchorB(): Vec2;\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n abstract getReactionForce(inv_dt: number): Vec2;\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n abstract getReactionTorque(inv_dt: number): number;\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2): void {}\n\n abstract initVelocityConstraints(step: TimeStep): void;\n\n abstract solveVelocityConstraints(step: TimeStep): void;\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n abstract solvePositionConstraints(step: TimeStep): boolean;\n\n}\n","export const stats = {\n gjkCalls: 0,\n gjkIters: 0,\n gjkMaxIters: 0,\n\n toiTime: 0,\n toiMaxTime: 0,\n toiCalls: 0,\n toiIters: 0,\n toiMaxIters: 0,\n toiRootIters: 0,\n toiMaxRootIters: 0,\n\n toString(newline?: string): string {\n newline = typeof newline === 'string' ? newline : '\\n';\n let string = \"\";\n // tslint:disable-next-line:no-for-in\n for (const name in this) {\n if (typeof this[name] !== 'function' && typeof this[name] !== 'object') {\n string += name + ': ' + this[name] + newline;\n }\n }\n return string;\n }\n};\n","export const now = function(): number {\n return Date.now();\n};\n\nexport const diff = function(time: number): number {\n return Date.now() - time;\n};\n\nexport default {\n now,\n diff,\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { stats } from '../util/stats';\nimport { Shape } from './Shape';\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Transform } from '../common/Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates.\n */\n\nstats.gjkCalls = 0;\nstats.gjkIters = 0;\nstats.gjkMaxIters = 0;\n\n/**\n * Input for Distance. You have to option to use the shape radii in the\n * computation. Even\n */\nexport class DistanceInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n transformA: Transform | null = null;\n transformB: Transform | null = null;\n useRadii: boolean = false;\n}\n\n/**\n * Output for Distance.\n *\n * @prop {Vec2} pointA closest point on shapeA\n * @prop {Vec2} pointB closest point on shapeB\n * @prop distance\n * @prop iterations number of GJK iterations used\n */\nexport class DistanceOutput {\n pointA: Vec2 = Vec2.zero();\n pointB: Vec2 = Vec2.zero();\n distance: number;\n iterations: number;\n}\n\n/**\n * Used to warm start Distance. Set count to zero on first call.\n *\n * @prop {number} metric length or area\n * @prop {array} indexA vertices on shape A\n * @prop {array} indexB vertices on shape B\n * @prop {number} count\n */\nexport class SimplexCache {\n metric: number = 0;\n indexA: number[] = [];\n indexB: number[] = [];\n count: number = 0;\n}\n\n/**\n * Compute the closest points between two shapes. Supports any combination of:\n * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On\n * the first call set SimplexCache.count to zero.\n */\nexport const Distance = function (output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void {\n ++stats.gjkCalls;\n\n const proxyA = input.proxyA;\n const proxyB = input.proxyB;\n const xfA = input.transformA;\n const xfB = input.transformB;\n\n // Initialize the simplex.\n const simplex = new Simplex();\n simplex.readCache(cache, proxyA, xfA, proxyB, xfB);\n\n // Get simplex vertices as an array.\n const vertices = simplex.m_v;\n const k_maxIters = Settings.maxDistnceIterations;\n\n // These store the vertices of the last simplex so that we\n // can check for duplicates and prevent cycling.\n const saveA = [];\n const saveB = []; // int[3]\n let saveCount = 0;\n\n let distanceSqr1 = Infinity;\n let distanceSqr2 = Infinity;\n\n // Main iteration loop.\n let iter = 0;\n while (iter < k_maxIters) {\n // Copy simplex so we can identify duplicates.\n saveCount = simplex.m_count;\n for (let i = 0; i < saveCount; ++i) {\n saveA[i] = vertices[i].indexA;\n saveB[i] = vertices[i].indexB;\n }\n\n simplex.solve();\n\n // If we have 3 points, then the origin is in the corresponding triangle.\n if (simplex.m_count === 3) {\n break;\n }\n\n // Compute closest point.\n const p = simplex.getClosestPoint();\n distanceSqr2 = p.lengthSquared();\n\n // Ensure progress\n if (distanceSqr2 >= distanceSqr1) {\n // break;\n }\n distanceSqr1 = distanceSqr2;\n\n // Get search direction.\n const d = simplex.getSearchDirection();\n\n // Ensure the search direction is numerically fit.\n if (d.lengthSquared() < Math.EPSILON * Math.EPSILON) {\n // The origin is probably contained by a line segment\n // or triangle. Thus the shapes are overlapped.\n\n // We can't return zero here even though there may be overlap.\n // In case the simplex is a point, segment, or triangle it is difficult\n // to determine if the origin is contained in the CSO or very close to it.\n break;\n }\n\n // Compute a tentative new simplex vertex using support points.\n const vertex = vertices[simplex.m_count]; // SimplexVertex\n\n vertex.indexA = proxyA.getSupport(Rot.mulTVec2(xfA.q, Vec2.neg(d)));\n vertex.wA = Transform.mulVec2(xfA, proxyA.getVertex(vertex.indexA));\n\n vertex.indexB = proxyB.getSupport(Rot.mulTVec2(xfB.q, d));\n vertex.wB = Transform.mulVec2(xfB, proxyB.getVertex(vertex.indexB));\n\n vertex.w = Vec2.sub(vertex.wB, vertex.wA);\n\n // Iteration count is equated to the number of support point calls.\n ++iter;\n ++stats.gjkIters;\n\n // Check for duplicate support points. This is the main termination\n // criteria.\n let duplicate = false;\n for (let i = 0; i < saveCount; ++i) {\n if (vertex.indexA === saveA[i] && vertex.indexB === saveB[i]) {\n duplicate = true;\n break;\n }\n }\n\n // If we found a duplicate support point we must exit to avoid cycling.\n if (duplicate) {\n break;\n }\n\n // New vertex is ok and needed.\n ++simplex.m_count;\n }\n\n stats.gjkMaxIters = Math.max(stats.gjkMaxIters, iter);\n\n // Prepare output.\n simplex.getWitnessPoints(output.pointA, output.pointB);\n output.distance = Vec2.distance(output.pointA, output.pointB);\n output.iterations = iter;\n\n // Cache the simplex.\n simplex.writeCache(cache);\n\n // Apply radii if requested.\n if (input.useRadii) {\n const rA = proxyA.m_radius;\n const rB = proxyB.m_radius;\n\n if (output.distance > rA + rB && output.distance > Math.EPSILON) {\n // Shapes are still no overlapped.\n // Move the witness points to the outer surface.\n output.distance -= rA + rB;\n const normal = Vec2.sub(output.pointB, output.pointA);\n normal.normalize();\n output.pointA.addMul(rA, normal);\n output.pointB.subMul(rB, normal);\n } else {\n // Shapes are overlapped when radii are considered.\n // Move the witness points to the middle.\n const p = Vec2.mid(output.pointA, output.pointB);\n output.pointA.setVec2(p);\n output.pointB.setVec2(p);\n output.distance = 0.0;\n }\n }\n}\n\n/**\n * A distance proxy is used by the GJK algorithm. It encapsulates any shape.\n */\nexport class DistanceProxy {\n /** internal */ m_buffer: Vec2[];\n /** internal */ m_vertices: Vec2[];\n /** internal */ m_count: number;\n /** internal */ m_radius: number;\n\n\n constructor() {\n this.m_buffer = []; // Vec2[2]\n this.m_vertices = []; // Vec2[]\n this.m_count = 0;\n this.m_radius = 0;\n }\n\n /**\n * Get the vertex count.\n */\n getVertexCount(): number {\n return this.m_count;\n }\n\n /**\n * Get a vertex by index. Used by Distance.\n */\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * Get the supporting vertex index in the given direction.\n */\n getSupport(d: Vec2): number {\n let bestIndex = 0;\n let bestValue = Vec2.dot(this.m_vertices[0], d);\n for (let i = 0; i < this.m_count; ++i) {\n const value = Vec2.dot(this.m_vertices[i], d);\n if (value > bestValue) {\n bestIndex = i;\n bestValue = value;\n }\n }\n return bestIndex;\n }\n\n /**\n * Get the supporting vertex in the given direction.\n */\n getSupportVertex(d: Vec2): Vec2 {\n return this.m_vertices[this.getSupport(d)];\n }\n\n /**\n * Initialize the proxy using the given shape. The shape must remain in scope\n * while the proxy is in use.\n */\n set(shape: Shape, index: number): void {\n // TODO remove, use shape instead\n _ASSERT && console.assert(typeof shape.computeDistanceProxy === 'function');\n shape.computeDistanceProxy(this, index);\n }\n}\n\nclass SimplexVertex {\n /** support point in proxyA */\n wA: Vec2 = Vec2.zero();\n /** wA index */\n indexA: number;\n\n /** support point in proxyB */\n wB: Vec2 = Vec2.zero();\n /** wB index */\n indexB: number;\n\n /** wB - wA; */\n w: Vec2 = Vec2.zero();\n /** barycentric coordinate for closest point */\n a: number;\n\n set(v: SimplexVertex): void {\n this.indexA = v.indexA;\n this.indexB = v.indexB;\n this.wA = Vec2.clone(v.wA);\n this.wB = Vec2.clone(v.wB);\n this.w = Vec2.clone(v.w);\n this.a = v.a;\n }\n}\n\nclass Simplex {\n m_v1: SimplexVertex;\n m_v2: SimplexVertex;\n m_v3: SimplexVertex;\n m_v: SimplexVertex[];\n m_count: number;\n\n constructor() {\n this.m_v1 = new SimplexVertex();\n this.m_v2 = new SimplexVertex();\n this.m_v3 = new SimplexVertex();\n this.m_v = [ this.m_v1, this.m_v2, this.m_v3 ];\n this.m_count;\n }\n\n /** @internal */\n toString(): string {\n if (this.m_count === 3) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y,\n this.m_v3.a, this.m_v3.wA.x, this.m_v3.wA.y, this.m_v3.wB.x, this.m_v3.wB.y\n ].toString();\n\n } else if (this.m_count === 2) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y\n ].toString();\n\n } else if (this.m_count === 1) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y\n ].toString();\n\n } else {\n return \"+\" + this.m_count;\n }\n }\n\n readCache(cache: SimplexCache, proxyA: DistanceProxy, transformA: Transform, proxyB: DistanceProxy, transformB: Transform): void {\n _ASSERT && console.assert(cache.count <= 3);\n\n // Copy data from cache.\n this.m_count = cache.count;\n for (let i = 0; i < this.m_count; ++i) {\n const v = this.m_v[i];\n v.indexA = cache.indexA[i];\n v.indexB = cache.indexB[i];\n const wALocal = proxyA.getVertex(v.indexA);\n const wBLocal = proxyB.getVertex(v.indexB);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 0.0;\n }\n\n // Compute the new simplex metric, if it is substantially different than\n // old metric then flush the simplex.\n if (this.m_count > 1) {\n const metric1 = cache.metric;\n const metric2 = this.getMetric();\n if (metric2 < 0.5 * metric1 || 2.0 * metric1 < metric2\n || metric2 < Math.EPSILON) {\n // Reset the simplex.\n this.m_count = 0;\n }\n }\n\n // If the cache is empty or invalid...\n if (this.m_count === 0) {\n const v = this.m_v[0];\n v.indexA = 0;\n v.indexB = 0;\n const wALocal = proxyA.getVertex(0);\n const wBLocal = proxyB.getVertex(0);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 1.0;\n this.m_count = 1;\n }\n }\n\n writeCache(cache: SimplexCache): void {\n cache.metric = this.getMetric();\n cache.count = this.m_count;\n for (let i = 0; i < this.m_count; ++i) {\n cache.indexA[i] = this.m_v[i].indexA;\n cache.indexB[i] = this.m_v[i].indexB;\n }\n }\n\n getSearchDirection(): Vec2 {\n switch (this.m_count) {\n case 1:\n return Vec2.neg(this.m_v1.w);\n\n case 2: {\n const e12 = Vec2.sub(this.m_v2.w, this.m_v1.w);\n const sgn = Vec2.crossVec2Vec2(e12, Vec2.neg(this.m_v1.w));\n if (sgn > 0.0) {\n // Origin is left of e12.\n return Vec2.crossNumVec2(1.0, e12);\n } else {\n // Origin is right of e12.\n return Vec2.crossVec2Num(e12, 1.0);\n }\n }\n\n default:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n }\n }\n\n getClosestPoint(): Vec2 {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n\n case 1:\n return Vec2.clone(this.m_v1.w);\n\n case 2:\n return Vec2.combine(this.m_v1.a, this.m_v1.w, this.m_v2.a, this.m_v2.w);\n\n case 3:\n return Vec2.zero();\n\n default:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n }\n }\n\n getWitnessPoints(pA: Vec2, pB: Vec2): void {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n break;\n\n case 1:\n pA.setVec2(this.m_v1.wA);\n pB.setVec2(this.m_v1.wB);\n break;\n\n case 2:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pB.setCombine(this.m_v1.a, this.m_v1.wB, this.m_v2.a, this.m_v2.wB);\n break;\n\n case 3:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pA.addMul(this.m_v3.a, this.m_v3.wA);\n pB.setVec2(pA);\n break;\n\n default:\n _ASSERT && console.assert(false);\n break;\n }\n }\n\n getMetric(): number {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n return 0.0;\n\n case 1:\n return 0.0;\n\n case 2:\n return Vec2.distance(this.m_v1.w, this.m_v2.w);\n\n case 3:\n return Vec2.crossVec2Vec2(Vec2.sub(this.m_v2.w, this.m_v1.w), Vec2.sub(this.m_v3.w,\n this.m_v1.w));\n\n default:\n _ASSERT && console.assert(false);\n return 0.0;\n }\n }\n\n solve(): void {\n switch (this.m_count) {\n case 1:\n break;\n\n case 2:\n this.solve2();\n break;\n\n case 3:\n this.solve3();\n break;\n\n default:\n _ASSERT && console.assert(false);\n }\n }\n\n// Solve a line segment using barycentric coordinates.\n//\n// p = a1 * w1 + a2 * w2\n// a1 + a2 = 1\n//\n// The vector from the origin to the closest point on the line is\n// perpendicular to the line.\n// e12 = w2 - w1\n// dot(p, e) = 0\n// a1 * dot(w1, e) + a2 * dot(w2, e) = 0\n//\n// 2-by-2 linear system\n// [1 1 ][a1] = [1]\n// [w1.e12 w2.e12][a2] = [0]\n//\n// Define\n// d12_1 = dot(w2, e12)\n// d12_2 = -dot(w1, e12)\n// d12 = d12_1 + d12_2\n//\n// Solution\n// a1 = d12_1 / d12\n// a2 = d12_2 / d12\n solve2(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const e12 = Vec2.sub(w2, w1);\n\n // w1 region\n const d12_2 = -Vec2.dot(w1, e12);\n if (d12_2 <= 0.0) {\n // a2 <= 0, so we clamp it to 0\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // w2 region\n const d12_1 = Vec2.dot(w2, e12);\n if (d12_1 <= 0.0) {\n // a1 <= 0, so we clamp it to 0\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // Must be in e12 region.\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n }\n\n// Possible regions:\n// - points[2]\n// - edge points[0]-points[2]\n// - edge points[1]-points[2]\n// - inside the triangle\n solve3(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const w3 = this.m_v3.w;\n\n // Edge12\n // [1 1 ][a1] = [1]\n // [w1.e12 w2.e12][a2] = [0]\n // a3 = 0\n const e12 = Vec2.sub(w2, w1);\n const w1e12 = Vec2.dot(w1, e12);\n const w2e12 = Vec2.dot(w2, e12);\n const d12_1 = w2e12;\n const d12_2 = -w1e12;\n\n // Edge13\n // [1 1 ][a1] = [1]\n // [w1.e13 w3.e13][a3] = [0]\n // a2 = 0\n const e13 = Vec2.sub(w3, w1);\n const w1e13 = Vec2.dot(w1, e13);\n const w3e13 = Vec2.dot(w3, e13);\n const d13_1 = w3e13;\n const d13_2 = -w1e13;\n\n // Edge23\n // [1 1 ][a2] = [1]\n // [w2.e23 w3.e23][a3] = [0]\n // a1 = 0\n const e23 = Vec2.sub(w3, w2);\n const w2e23 = Vec2.dot(w2, e23);\n const w3e23 = Vec2.dot(w3, e23);\n const d23_1 = w3e23;\n const d23_2 = -w2e23;\n\n // Triangle123\n const n123 = Vec2.crossVec2Vec2(e12, e13);\n\n const d123_1 = n123 * Vec2.crossVec2Vec2(w2, w3);\n const d123_2 = n123 * Vec2.crossVec2Vec2(w3, w1);\n const d123_3 = n123 * Vec2.crossVec2Vec2(w1, w2);\n\n // w1 region\n if (d12_2 <= 0.0 && d13_2 <= 0.0) {\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // e12\n if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) {\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n return;\n }\n\n // e13\n if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) {\n const inv_d13 = 1.0 / (d13_1 + d13_2);\n this.m_v1.a = d13_1 * inv_d13;\n this.m_v3.a = d13_2 * inv_d13;\n this.m_count = 2;\n this.m_v2.set(this.m_v3);\n return;\n }\n\n // w2 region\n if (d12_1 <= 0.0 && d23_2 <= 0.0) {\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // w3 region\n if (d13_1 <= 0.0 && d23_1 <= 0.0) {\n this.m_v3.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // e23\n if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) {\n const inv_d23 = 1.0 / (d23_1 + d23_2);\n this.m_v2.a = d23_1 * inv_d23;\n this.m_v3.a = d23_2 * inv_d23;\n this.m_count = 2;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // Must be in triangle123\n const inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3);\n this.m_v1.a = d123_1 * inv_d123;\n this.m_v2.a = d123_2 * inv_d123;\n this.m_v3.a = d123_3 * inv_d123;\n this.m_count = 3;\n }\n}\n\n/**\n * Determine if two generic shapes overlap.\n */\nexport const testOverlap = function (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform): boolean {\n const input = new DistanceInput();\n input.proxyA.set(shapeA, indexA);\n input.proxyB.set(shapeB, indexB);\n input.transformA = xfA;\n input.transformB = xfB;\n input.useRadii = true;\n\n const cache = new SimplexCache();\n const output = new DistanceOutput();\n\n Distance(output, cache, input);\n\n return output.distance < 10.0 * Math.EPSILON;\n}\n\n// legacy exports\nDistance.testOverlap = testOverlap;\nDistance.Input = DistanceInput;\nDistance.Output = DistanceOutput;\nDistance.Proxy = DistanceProxy;\nDistance.Cache = SimplexCache;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { stats } from '../util/stats';\nimport Timer from '../util/Timer';\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Sweep } from '../common/Sweep';\nimport { Transform } from '../common/Transform';\n\nimport { Distance, DistanceInput, DistanceOutput, DistanceProxy, SimplexCache } from './Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n/**\n * Input parameters for TimeOfImpact.\n */\nexport class TOIInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n sweepA: Sweep = new Sweep();\n sweepB: Sweep = new Sweep();\n /** defines sweep interval [0, tMax] */\n tMax: number | undefined;\n}\n\nexport enum TOIOutputState {\n e_unknown = 0,\n e_failed = 1,\n e_overlapped = 2,\n e_touching = 3,\n e_separated = 4,\n}\n\n/**\n * Output parameters for TimeOfImpact.\n */\nexport class TOIOutput {\n state: TOIOutputState | undefined;\n t: number | undefined;\n}\n\nstats.toiTime = 0;\nstats.toiMaxTime = 0;\nstats.toiCalls = 0;\nstats.toiIters = 0;\nstats.toiMaxIters = 0;\nstats.toiRootIters = 0;\nstats.toiMaxRootIters = 0;\n\n/**\n * Compute the upper bound on time before two shapes penetrate. Time is\n * represented as a fraction between [0,tMax]. This uses a swept separating axis\n * and may miss some intermediate, non-tunneling collision. If you change the\n * time interval, you should call this function again.\n *\n * Note: use Distance to compute the contact point and normal at the time of\n * impact.\n *\n * CCD via the local separating axis method. This seeks progression by computing\n * the largest time at which separation is maintained.\n */\nexport const TimeOfImpact = function (output: TOIOutput, input: TOIInput): void {\n const timer = Timer.now();\n\n ++stats.toiCalls;\n\n output.state = TOIOutputState.e_unknown;\n output.t = input.tMax;\n\n const proxyA = input.proxyA; // DistanceProxy\n const proxyB = input.proxyB; // DistanceProxy\n\n const sweepA = input.sweepA; // Sweep\n const sweepB = input.sweepB; // Sweep\n\n // Large rotations can make the root finder fail, so we normalize the\n // sweep angles.\n sweepA.normalize();\n sweepB.normalize();\n\n const tMax = input.tMax;\n\n const totalRadius = proxyA.m_radius + proxyB.m_radius;\n const target = Math.max(Settings.linearSlop, totalRadius - 3.0 * Settings.linearSlop);\n const tolerance = 0.25 * Settings.linearSlop;\n _ASSERT && console.assert(target > tolerance);\n\n let t1 = 0.0;\n const k_maxIterations = Settings.maxTOIIterations;\n let iter = 0;\n\n // Prepare input for distance query.\n const cache = new SimplexCache();\n\n const distanceInput = new DistanceInput();\n distanceInput.proxyA = input.proxyA;\n distanceInput.proxyB = input.proxyB;\n distanceInput.useRadii = false;\n\n // The outer loop progressively attempts to compute new separating axes.\n // This loop terminates when an axis is repeated (no progress is made).\n while (true) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n sweepA.getTransform(xfA, t1);\n sweepB.getTransform(xfB, t1);\n\n // Get the distance between shapes. We can also use the results\n // to get a separating axis.\n distanceInput.transformA = xfA;\n distanceInput.transformB = xfB;\n const distanceOutput = new DistanceOutput();\n Distance(distanceOutput, cache, distanceInput);\n\n // If the shapes are overlapped, we give up on continuous collision.\n if (distanceOutput.distance <= 0.0) {\n // Failure!\n output.state = TOIOutputState.e_overlapped;\n output.t = 0.0;\n break;\n }\n\n if (distanceOutput.distance < target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n break;\n }\n\n // Initialize the separating axis.\n const fcn = new SeparationFunction();\n fcn.initialize(cache, proxyA, sweepA, proxyB, sweepB, t1);\n\n // if (false) {\n // // Dump the curve seen by the root finder\n // const N = 100;\n // const dx = 1.0 / N;\n // const xs = []; // [ N + 1 ];\n // const fs = []; // [ N + 1 ];\n // const x = 0.0;\n // for (const i = 0; i <= N; ++i) {\n // sweepA.getTransform(xfA, x);\n // sweepB.getTransform(xfB, x);\n // const f = fcn.evaluate(xfA, xfB) - target;\n // printf(\"%g %g\\n\", x, f);\n // xs[i] = x;\n // fs[i] = f;\n // x += dx;\n // }\n // }\n\n // Compute the TOI on the separating axis. We do this by successively\n // resolving the deepest point. This loop is bounded by the number of\n // vertices.\n let done = false;\n let t2 = tMax;\n let pushBackIter = 0;\n while (true) {\n // Find the deepest point at t2. Store the witness point indices.\n let s2 = fcn.findMinSeparation(t2);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Is the final configuration separated?\n if (s2 > target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_separated;\n output.t = tMax;\n done = true;\n break;\n }\n\n // Has the separation reached tolerance?\n if (s2 > target - tolerance) {\n // Advance the sweeps\n t1 = t2;\n break;\n }\n\n // Compute the initial separation of the witness points.\n let s1 = fcn.evaluate(t1);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Check for initial overlap. This might happen if the root finder\n // runs out of iterations.\n if (s1 < target - tolerance) {\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n done = true;\n break;\n }\n\n // Check for touching\n if (s1 <= target + tolerance) {\n // Victory! t1 should hold the TOI (could be 0.0).\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n done = true;\n break;\n }\n\n // Compute 1D root of: f(x) - target = 0\n let rootIterCount = 0;\n let a1 = t1;\n let a2 = t2;\n while (true) {\n // Use a mix of the secant rule and bisection.\n let t;\n if (rootIterCount & 1) {\n // Secant rule to improve convergence.\n t = a1 + (target - s1) * (a2 - a1) / (s2 - s1);\n } else {\n // Bisection to guarantee progress.\n t = 0.5 * (a1 + a2);\n }\n\n ++rootIterCount;\n ++stats.toiRootIters;\n\n const s = fcn.evaluate(t);\n const indexA = fcn.indexA;\n const indexB = fcn.indexB;\n\n if (Math.abs(s - target) < tolerance) {\n // t2 holds a tentative value for t1\n t2 = t;\n break;\n }\n\n // Ensure we continue to bracket the root.\n if (s > target) {\n a1 = t;\n s1 = s;\n } else {\n a2 = t;\n s2 = s;\n }\n\n if (rootIterCount === 50) {\n break;\n }\n }\n\n stats.toiMaxRootIters = Math.max(stats.toiMaxRootIters, rootIterCount);\n\n ++pushBackIter;\n\n if (pushBackIter === Settings.maxPolygonVertices) {\n break;\n }\n }\n\n ++iter;\n ++stats.toiIters;\n\n if (done) {\n break;\n }\n\n if (iter === k_maxIterations) {\n // Root finder got stuck. Semi-victory.\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n break;\n }\n }\n\n stats.toiMaxIters = Math.max(stats.toiMaxIters, iter);\n\n const time = Timer.diff(timer);\n stats.toiMaxTime = Math.max(stats.toiMaxTime, time);\n stats.toiTime += time;\n}\n\nenum SeparationFunctionType {\n e_points = 1,\n e_faceA = 2,\n e_faceB = 3,\n}\n\nclass SeparationFunction {\n m_proxyA: DistanceProxy = new DistanceProxy();\n m_proxyB: DistanceProxy = new DistanceProxy();\n m_sweepA: Sweep;\n m_sweepB: Sweep;\n indexA: number;\n indexB: number;\n m_type: SeparationFunctionType;\n m_localPoint: Vec2 = Vec2.zero();\n m_axis: Vec2 = Vec2.zero();\n\n // TODO_ERIN might not need to return the separation\n\n initialize(cache: SimplexCache, proxyA: DistanceProxy, sweepA: Sweep, proxyB: DistanceProxy, sweepB: Sweep, t1: number): number {\n this.m_proxyA = proxyA;\n this.m_proxyB = proxyB;\n const count = cache.count;\n _ASSERT && console.assert(0 < count && count < 3);\n\n this.m_sweepA = sweepA;\n this.m_sweepB = sweepB;\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t1);\n this.m_sweepB.getTransform(xfB, t1);\n\n if (count === 1) {\n this.m_type = SeparationFunctionType.e_points;\n const localPointA = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n this.m_axis.setCombine(1, pointB, -1, pointA);\n const s = this.m_axis.normalize();\n return s;\n\n } else if (cache.indexA[0] === cache.indexA[1]) {\n // Two points on B and one on A.\n this.m_type = SeparationFunctionType.e_faceB;\n const localPointB1 = proxyB.getVertex(cache.indexB[0]);\n const localPointB2 = proxyB.getVertex(cache.indexB[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointB2, localPointB1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointB1, localPointB2);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n const localPointA = proxyA.getVertex(cache.indexA[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n let s = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n\n } else {\n // Two points on A and one or two points on B.\n this.m_type = SeparationFunctionType.e_faceA;\n const localPointA1 = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointA2 = this.m_proxyA.getVertex(cache.indexA[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointA2, localPointA1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointA1, localPointA2);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n let s = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n }\n }\n\n compute(find: boolean, t: number): number {\n // It was findMinSeparation and evaluate\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t);\n this.m_sweepB.getTransform(xfB, t);\n\n switch (this.m_type) {\n case SeparationFunctionType.e_points: {\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, this.m_axis);\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(this.m_axis));\n\n this.indexA = this.m_proxyA.getSupport(axisA);\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, this.m_axis) - Vec2.dot(pointA, this.m_axis);\n return sep;\n }\n\n case SeparationFunctionType.e_faceA: {\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n if (find) {\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(normal));\n\n this.indexA = -1;\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n return sep;\n }\n\n case SeparationFunctionType.e_faceB: {\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, Vec2.neg(normal));\n\n this.indexB = -1;\n this.indexA = this.m_proxyA.getSupport(axisA);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n const sep = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n return sep;\n }\n\n default:\n _ASSERT && console.assert(false);\n if (find) {\n this.indexA = -1;\n this.indexB = -1;\n }\n return 0.0;\n }\n }\n\n findMinSeparation(t: number): number {\n return this.compute(true, t);\n }\n\n evaluate(t: number): number {\n return this.compute(false, t);\n }\n}\n\nconst separationFunction_reuse = new SeparationFunction();\n\n// legacy exports\nTimeOfImpact.Input = TOIInput;\nTimeOfImpact.Output = TOIOutput;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { Body } from './Body';\nimport type { Contact } from './Contact';\nimport { Joint } from './Joint';\nimport { TimeOfImpact, TOIInput, TOIOutput, TOIOutputState } from '../collision/TimeOfImpact';\nimport { Distance, DistanceInput, DistanceOutput, SimplexCache } from '../collision/Distance';\nimport { World } from \"./World\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport class TimeStep {\n /** time step */\n dt: number = 0;\n /** inverse time step (0 if dt == 0) */\n inv_dt: number = 0;\n velocityIterations: number = 0;\n positionIterations: number = 0;\n warmStarting: boolean = false;\n blockSolve: boolean = true;\n\n /** timestep ratio for variable timestep */\n inv_dt0: number = 0.0;\n /** dt * inv_dt0 */\n dtRatio: number = 1;\n\n reset(dt: number): void {\n if (this.dt > 0.0) {\n this.inv_dt0 = this.inv_dt;\n }\n this.dt = dt;\n this.inv_dt = dt == 0 ? 0 : 1 / dt;\n this.dtRatio = dt * this.inv_dt0;\n }\n}\n\n// reuse\nconst s_subStep = new TimeStep();\n\n/**\n * Contact impulses for reporting. Impulses are used instead of forces because\n * sub-step forces may approach infinity for rigid body collisions. These match\n * up one-to-one with the contact points in Manifold.\n */\nexport class ContactImpulse {\n // TODO: merge with Contact class?\n\n private readonly contact: Contact;\n private readonly normals: number[];\n private readonly tangents: number[];\n\n constructor(contact: Contact) {\n this.contact = contact;\n this.normals = [];\n this.tangents = [];\n }\n\n get normalImpulses(): number[] {\n const contact = this.contact;\n const normals = this.normals;\n normals.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n normals.push(contact.v_points[p].normalImpulse);\n }\n return normals;\n }\n\n get tangentImpulses(): number[] {\n const contact = this.contact;\n const tangents = this.tangents;\n tangents.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n tangents.push(contact.v_points[p].tangentImpulse);\n }\n return tangents;\n }\n}\n\n/**\n * Finds and solves islands. An island is a connected subset of the world.\n */\nexport class Solver {\n m_world: World;\n m_stack: Body[];\n m_bodies: Body[];\n m_contacts: Contact[];\n m_joints: Joint[];\n\n constructor(world: World) {\n this.m_world = world;\n this.m_stack = [];\n this.m_bodies = [];\n this.m_contacts = [];\n this.m_joints = [];\n }\n\n clear(): void {\n this.m_stack.length = 0;\n this.m_bodies.length = 0;\n this.m_contacts.length = 0;\n this.m_joints.length = 0;\n }\n\n addBody(body: Body): void {\n _ASSERT && console.assert(body instanceof Body, 'Not a Body!', body);\n this.m_bodies.push(body);\n // why?\n // body.c_position.c.setZero();\n // body.c_position.a = 0;\n // body.c_velocity.v.setZero();\n // body.c_velocity.w = 0;\n }\n\n addContact(contact: Contact): void {\n // _ASSERT && console.assert(contact instanceof Contact, 'Not a Contact!', contact);\n this.m_contacts.push(contact);\n }\n\n addJoint(joint: Joint): void {\n _ASSERT && console.assert(joint instanceof Joint, 'Not a Joint!', joint);\n this.m_joints.push(joint);\n }\n\n solveWorld(step: TimeStep): void {\n const world = this.m_world;\n\n // Clear all the island flags.\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n }\n for (let c = world.m_contactList; c; c = c.m_next) {\n c.m_islandFlag = false;\n }\n for (let j = world.m_jointList; j; j = j.m_next) {\n j.m_islandFlag = false;\n }\n\n // Build and simulate all awake islands.\n const stack = this.m_stack;\n let loop = -1;\n for (let seed = world.m_bodyList; seed; seed = seed.m_next) {\n loop++;\n if (seed.m_islandFlag) {\n continue;\n }\n\n if (seed.isAwake() == false || seed.isActive() == false) {\n continue;\n }\n\n // The seed can be dynamic or kinematic.\n if (seed.isStatic()) {\n continue;\n }\n\n // Reset island and stack.\n this.clear();\n\n stack.push(seed);\n\n seed.m_islandFlag = true;\n\n // Perform a depth first search (DFS) on the constraint graph.\n while (stack.length > 0) {\n // Grab the next body off the stack and add it to the island.\n const b = stack.pop();\n _ASSERT && console.assert(b.isActive() == true);\n this.addBody(b);\n\n // Make sure the body is awake.\n b.setAwake(true);\n\n // To keep islands as small as possible, we don't\n // propagate islands across static bodies.\n if (b.isStatic()) {\n continue;\n }\n\n // Search all contacts connected to this body.\n for (let ce = b.m_contactList; ce; ce = ce.next) {\n const contact = ce.contact;\n\n // Has this contact already been added to an island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Is this contact solid and touching?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n this.addContact(contact);\n contact.m_islandFlag = true;\n\n const other = ce.other;\n\n // Was the other body already added to this island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && console.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n\n // Search all joints connect to this body.\n for (let je = b.m_jointList; je; je = je.next) {\n if (je.joint.m_islandFlag == true) {\n continue;\n }\n\n const other = je.other;\n\n // Don't simulate joints connected to inactive bodies.\n if (other.isActive() == false) {\n continue;\n }\n\n this.addJoint(je.joint);\n je.joint.m_islandFlag = true;\n\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && console.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n }\n\n this.solveIsland(step);\n\n // Post solve cleanup.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n // Allow static bodies to participate in other islands.\n // TODO: are they added at all?\n const b = this.m_bodies[i];\n if (b.isStatic()) {\n b.m_islandFlag = false;\n }\n }\n }\n }\n\n solveIsland(step: TimeStep): void {\n // B2: Island Solve\n const world = this.m_world;\n const gravity = world.m_gravity;\n const allowSleep = world.m_allowSleep;\n\n const h = step.dt;\n\n // Integrate velocities and apply damping. Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.m_sweep.c);\n const a = body.m_sweep.a;\n const v = Vec2.clone(body.m_linearVelocity);\n let w = body.m_angularVelocity;\n\n // Store positions for continuous collision.\n body.m_sweep.c0.setVec2(body.m_sweep.c);\n body.m_sweep.a0 = body.m_sweep.a;\n\n if (body.isDynamic()) {\n // Integrate velocities.\n v.addMul(h * body.m_gravityScale, gravity);\n v.addMul(h * body.m_invMass, body.m_force);\n w += h * body.m_invI * body.m_torque;\n /**\n *
\n         * Apply damping.\n         * ODE: dv/dt + c * v = 0\n         * Solution: v(t) = v0 * exp(-c * t)\n         * Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)\n         * v2 = exp(-c * dt) * v1\n         * Pade approximation:\n         * v2 = v1 * 1 / (1 + c * dt)\n         * 
\n */\n v.mul(1.0 / (1.0 + h * body.m_linearDamping));\n w *= 1.0 / (1.0 + h * body.m_angularDamping);\n }\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(step);\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(step);\n }\n\n if (step.warmStarting) {\n // Warm start.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.warmStartConstraint(step);\n }\n }\n\n for (let i = 0; i < this.m_joints.length; ++i) {\n const joint = this.m_joints[i];\n joint.initVelocityConstraints(step);\n }\n\n // Solve velocity constraints\n for (let i = 0; i < step.velocityIterations; ++i) {\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n joint.solveVelocityConstraints(step);\n }\n\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(step);\n }\n }\n\n // Store impulses for warm starting\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.storeConstraintImpulses(step);\n }\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.lengthSquared(translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c.setVec2(c);\n body.c_position.a = a;\n body.c_velocity.v.setVec2(v);\n body.c_velocity.w = w;\n }\n\n // Solve position constraints\n let positionSolved = false;\n for (let i = 0; i < step.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraint(step);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -3.0 * Settings.linearSlop;\n\n let jointsOkay = true;\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n const jointOkay = joint.solvePositionConstraints(step);\n jointsOkay = jointsOkay && jointOkay;\n }\n\n if (contactsOkay && jointsOkay) {\n // Exit early if the position errors are small.\n positionSolved = true;\n break;\n }\n }\n\n // Copy state buffers back to the bodies\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n body.m_sweep.c.setVec2(body.c_position.c);\n body.m_sweep.a = body.c_position.a;\n body.m_linearVelocity.setVec2(body.c_velocity.v);\n body.m_angularVelocity = body.c_velocity.w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n\n if (allowSleep) {\n let minSleepTime = Infinity;\n\n const linTolSqr = Settings.linearSleepToleranceSqr;\n const angTolSqr = Settings.angularSleepToleranceSqr;\n\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n if (body.isStatic()) {\n continue;\n }\n\n if ((body.m_autoSleepFlag == false)\n || (body.m_angularVelocity * body.m_angularVelocity > angTolSqr)\n || (Vec2.lengthSquared(body.m_linearVelocity) > linTolSqr)) {\n body.m_sleepTime = 0.0;\n minSleepTime = 0.0;\n } else {\n body.m_sleepTime += h;\n minSleepTime = Math.min(minSleepTime, body.m_sleepTime);\n }\n }\n\n if (minSleepTime >= Settings.timeToSleep && positionSolved) {\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.setAwake(false);\n }\n }\n }\n }\n\n /**\n * Find TOI contacts and solve them.\n */\n solveWorldTOI(step: TimeStep): void {\n const world = this.m_world;\n\n if (world.m_stepComplete) {\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n b.m_sweep.alpha0 = 0.0;\n }\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Invalidate TOI\n c.m_toiFlag = false;\n c.m_islandFlag = false;\n c.m_toiCount = 0;\n c.m_toi = 1.0;\n }\n }\n\n // Find TOI events and solve them.\n while (true) {\n // Find the first TOI.\n let minContact = null; // Contact\n let minAlpha = 1.0;\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Is this contact disabled?\n if (c.isEnabled() == false) {\n continue;\n }\n\n // Prevent excessive sub-stepping.\n if (c.m_toiCount > Settings.maxSubSteps) {\n continue;\n }\n\n let alpha = 1.0;\n if (c.m_toiFlag) {\n // This contact has a valid cached TOI.\n alpha = c.m_toi;\n } else {\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n // Is there a sensor?\n if (fA.isSensor() || fB.isSensor()) {\n continue;\n }\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n _ASSERT && console.assert(bA.isDynamic() || bB.isDynamic());\n\n const activeA = bA.isAwake() && !bA.isStatic();\n const activeB = bB.isAwake() && !bB.isStatic();\n\n // Is at least one body active (awake and dynamic or kinematic)?\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const collideA = bA.isBullet() || !bA.isDynamic();\n const collideB = bB.isBullet() || !bB.isDynamic();\n\n // Are these two non-bullet dynamic bodies?\n if (collideA == false && collideB == false) {\n continue;\n }\n\n // Compute the TOI for this contact.\n // Put the sweeps onto the same time interval.\n let alpha0 = bA.m_sweep.alpha0;\n\n if (bA.m_sweep.alpha0 < bB.m_sweep.alpha0) {\n alpha0 = bB.m_sweep.alpha0;\n bA.m_sweep.advance(alpha0);\n } else if (bB.m_sweep.alpha0 < bA.m_sweep.alpha0) {\n alpha0 = bA.m_sweep.alpha0;\n bB.m_sweep.advance(alpha0);\n }\n\n _ASSERT && console.assert(alpha0 < 1.0);\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const sweepA = bA.m_sweep;\n const sweepB = bB.m_sweep;\n\n // Compute the time of impact in interval [0, minTOI]\n const input = new TOIInput(); // TODO: reuse\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.sweepA.set(bA.m_sweep);\n input.sweepB.set(bB.m_sweep);\n input.tMax = 1.0;\n\n const output = new TOIOutput(); // TODO: reuse\n TimeOfImpact(output, input);\n\n // Beta is the fraction of the remaining portion of the [time?].\n const beta = output.t;\n if (output.state == TOIOutputState.e_touching) {\n alpha = Math.min(alpha0 + (1.0 - alpha0) * beta, 1.0);\n } else {\n alpha = 1.0;\n }\n\n c.m_toi = alpha;\n c.m_toiFlag = true;\n }\n\n if (alpha < minAlpha) {\n // This is the minimum TOI found so far.\n minContact = c;\n minAlpha = alpha;\n }\n }\n\n if (minContact == null || 1.0 - 10.0 * Math.EPSILON < minAlpha) {\n // No more TOI events. Done!\n world.m_stepComplete = true;\n break;\n }\n\n // Advance the bodies to the TOI.\n const fA = minContact.getFixtureA();\n const fB = minContact.getFixtureB();\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const backup1 = bA.m_sweep.clone();\n const backup2 = bB.m_sweep.clone();\n\n bA.advance(minAlpha);\n bB.advance(minAlpha);\n\n // The TOI contact likely has some new contact points.\n minContact.update(world);\n minContact.m_toiFlag = false;\n ++minContact.m_toiCount;\n\n // Is the contact solid?\n if (minContact.isEnabled() == false || minContact.isTouching() == false) {\n // Restore the sweeps.\n minContact.setEnabled(false);\n bA.m_sweep.set(backup1);\n bB.m_sweep.set(backup2);\n bA.synchronizeTransform();\n bB.synchronizeTransform();\n continue;\n }\n\n bA.setAwake(true);\n bB.setAwake(true);\n\n // Build the island\n this.clear();\n this.addBody(bA);\n this.addBody(bB);\n this.addContact(minContact);\n\n bA.m_islandFlag = true;\n bB.m_islandFlag = true;\n minContact.m_islandFlag = true;\n\n // Get contacts on bodyA and bodyB.\n const bodies = [ bA, bB ];\n for (let i = 0; i < bodies.length; ++i) {\n const body = bodies[i];\n if (body.isDynamic()) {\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n // if (this.m_bodyCount == this.m_bodyCapacity) { break; }\n // if (this.m_contactCount == this.m_contactCapacity) { break; }\n\n const contact = ce.contact;\n\n // Has this contact already been added to the island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Only add if either is static, kinematic or bullet.\n const other = ce.other;\n if (other.isDynamic() && !body.isBullet() && !other.isBullet()) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n // Tentatively advance the body to the TOI.\n const backup = other.m_sweep.clone();\n if (other.m_islandFlag == false) {\n other.advance(minAlpha);\n }\n\n // Update the contact points\n contact.update(world);\n\n // Was the contact disabled by the user?\n // Are there contact points?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n other.m_sweep.set(backup);\n other.synchronizeTransform();\n continue;\n }\n\n // Add the contact to the island\n contact.m_islandFlag = true;\n this.addContact(contact);\n\n // Has the other body already been added to the island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // Add the other body to the island.\n other.m_islandFlag = true;\n\n if (!other.isStatic()) {\n other.setAwake(true);\n }\n\n this.addBody(other);\n }\n }\n }\n\n s_subStep.reset((1.0 - minAlpha) * step.dt);\n s_subStep.dtRatio = 1.0;\n s_subStep.positionIterations = 20;\n s_subStep.velocityIterations = step.velocityIterations;\n s_subStep.warmStarting = false;\n\n this.solveIslandTOI(s_subStep, bA, bB);\n\n // Reset island flags and synchronize broad-phase proxies.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.m_islandFlag = false;\n\n if (!body.isDynamic()) {\n continue;\n }\n\n body.synchronizeFixtures();\n\n // Invalidate all contact TOIs on this displaced body.\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n ce.contact.m_toiFlag = false;\n ce.contact.m_islandFlag = false;\n }\n }\n\n // Commit fixture proxy movements to the broad-phase so that new contacts\n // are created.\n // Also, some contacts can be destroyed.\n world.findNewContacts();\n\n if (world.m_subStepping) {\n world.m_stepComplete = false;\n break;\n }\n }\n }\n\n solveIslandTOI(subStep: TimeStep, toiA: Body, toiB: Body): void {\n const world = this.m_world;\n\n // Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.c_position.c.setVec2(body.m_sweep.c);\n body.c_position.a = body.m_sweep.a;\n body.c_velocity.v.setVec2(body.m_linearVelocity);\n body.c_velocity.w = body.m_angularVelocity;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(subStep);\n }\n\n // Solve position constraints.\n for (let i = 0; i < subStep.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraintTOI(subStep, toiA, toiB);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -1.5 * Settings.linearSlop;\n if (contactsOkay) {\n break;\n }\n }\n\n if (false) {\n // Is the new position really safe?\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const c = this.m_contacts[i];\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const input = new DistanceInput();\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.transformA = bA.getTransform();\n input.transformB = bB.getTransform();\n input.useRadii = false;\n\n const output = new DistanceOutput();\n const cache = new SimplexCache();\n Distance(output, cache, input);\n\n if (output.distance == 0 || cache.count == 3) {\n cache.count += 0;\n }\n }\n }\n\n // Leap of faith to new safe state.\n toiA.m_sweep.c0.setVec2(toiA.c_position.c);\n toiA.m_sweep.a0 = toiA.c_position.a;\n toiB.m_sweep.c0.setVec2(toiB.c_position.c);\n toiB.m_sweep.a0 = toiB.c_position.a;\n\n // No warm starting is needed for TOI events because warm\n // starting impulses were applied in the discrete solver.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(subStep);\n }\n\n // Solve velocity constraints.\n for (let i = 0; i < subStep.velocityIterations; ++i) {\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(subStep);\n }\n }\n\n // Don't store the TOI contact forces for warm starting\n // because they can be quite large.\n\n const h = subStep.dt;\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.dot(translation, translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n\n // Sync bodies\n body.m_sweep.c = c;\n body.m_sweep.a = a;\n body.m_linearVelocity = v;\n body.m_angularVelocity = w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n }\n\n /** @internal */\n postSolveIsland(): void {\n for (let c = 0; c < this.m_contacts.length; ++c) {\n const contact = this.m_contacts[c];\n this.m_world.postSolve(contact, contact.m_impulse);\n }\n }\n}\n\n// @ts-ignore\nSolver.TimeStep = TimeStep;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from './Vec2';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 2-by-2 matrix. Stored in column-major order.\n */\nexport class Mat22 {\n ex: Vec2;\n ey: Vec2;\n\n constructor(a: number, b: number, c: number, d: number);\n constructor(a: { x: number; y: number }, b: { x: number; y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(a?, b?, c?, d?) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec2.clone(a);\n this.ey = Vec2.clone(b);\n } else if (typeof a === 'number') {\n this.ex = Vec2.neo(a, c);\n this.ey = Vec2.neo(b, d);\n } else {\n this.ex = Vec2.zero();\n this.ey = Vec2.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.ex) && Vec2.isValid(obj.ey);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Mat22.isValid(o), 'Invalid Mat22!', o);\n }\n\n set(a: Mat22): void;\n set(a: Vec2, b: Vec2): void;\n set(a: number, b: number, c: number, d: number): void;\n // tslint:disable-next-line:typedef\n set(a, b?, c?, d?): void {\n if (typeof a === 'number' && typeof b === 'number' && typeof c === 'number'\n && typeof d === 'number') {\n this.ex.setNum(a, c);\n this.ey.setNum(b, d);\n\n } else if (typeof a === 'object' && typeof b === 'object') {\n this.ex.setVec2(a);\n this.ey.setVec2(b);\n\n } else if (typeof a === 'object') {\n _ASSERT && Mat22.assert(a);\n this.ex.setVec2(a.ex);\n this.ey.setVec2(a.ey);\n\n } else {\n _ASSERT && console.assert(false);\n }\n }\n\n setIdentity(): void {\n this.ex.x = 1.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 1.0;\n }\n\n setZero(): void {\n this.ex.x = 0.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 0.0;\n }\n\n getInverse(): Mat22 {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const imx = new Mat22();\n imx.ex.x = det * d;\n imx.ey.x = -det * b;\n imx.ex.y = -det * c;\n imx.ey.y = det * a;\n return imx;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const w = Vec2.zero();\n w.x = det * (d * v.x - b * v.y);\n w.y = det * (a * v.y - c * v.x);\n return w;\n }\n\n /**\n * Multiply a matrix times a vector. If a rotation matrix is provided, then this\n * transforms the vector from one frame to another.\n */\n static mul(mx: Mat22, my: Mat22): Mat22;\n static mul(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(mx, v) {\n if (v && 'x' in v && 'y' in v) {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n }\n\n static mulMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n /**\n * Multiply a matrix transpose times a vector. If a rotation matrix is provided,\n * then this transforms the vector from one frame to another (inverse\n * transform).\n */\n static mulT(mx: Mat22, my: Mat22): Mat22;\n static mulT(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(mx, v) {\n if (v && 'x' in v && 'y' in v) { // Vec2\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulTVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n }\n\n static mulTMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n static abs(mx: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n return new Mat22(Vec2.abs(mx.ex), Vec2.abs(mx.ey));\n }\n\n static add(mx1: Mat22, mx2: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx1);\n _ASSERT && Mat22.assert(mx2);\n return new Mat22(Vec2.add(mx1.ex, mx2.ex), Vec2.add(mx1.ey, mx2.ey));\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { Transform } from '../common/Transform';\nimport { math as Math } from '../common/Math';\nimport { Rot } from '../common/Rot';\n\nexport enum ManifoldType {\n e_circles = 0,\n e_faceA = 1,\n e_faceB = 2\n}\n\nexport enum ContactFeatureType {\n e_vertex = 0,\n e_face = 1\n}\n\n/**\n * This is used for determining the state of contact points.\n */\n export enum PointState {\n /** Point does not exist */\n nullState = 0,\n /** Point was added in the update */\n addState = 1,\n /** Point persisted across the update */\n persistState = 2,\n /** Point was removed in the update */\n removeState = 3\n}\n\n/**\n * Used for computing contact manifolds.\n */\n export class ClipVertex {\n v: Vec2 = Vec2.zero();\n id: ContactID = new ContactID();\n\n set(o: ClipVertex): void {\n this.v.setVec2(o.v);\n this.id.set(o.id);\n }\n}\n\n/**\n * A manifold for two touching convex shapes. Manifolds are created in `evaluate`\n * method of Contact subclasses.\n *\n * Supported manifold types are e_faceA or e_faceB for clip point versus plane\n * with radius and e_circles point versus point with radius.\n *\n * We store contacts in this way so that position correction can account for\n * movement, which is critical for continuous physics. All contact scenarios\n * must be expressed in one of these types. This structure is stored across time\n * steps, so we keep it small.\n *\n * @prop type e_circle, e_faceA, e_faceB\n * @prop localPoint Usage depends on manifold type:
\n * e_circles: the local center of circleA
\n * e_faceA: the center of faceA
\n * e_faceB: the center of faceB\n * @prop localNormal Usage depends on manifold type:
\n * e_circles: not used
\n * e_faceA: the normal on polygonA
\n * e_faceB: the normal on polygonB\n * @prop points The points of contact {ManifoldPoint[]}\n * @prop pointCount The number of manifold points\n */\nexport class Manifold {\n type: ManifoldType;\n localNormal: Vec2 = Vec2.zero();\n localPoint: Vec2 = Vec2.zero();\n points: ManifoldPoint[] = [ new ManifoldPoint(), new ManifoldPoint() ];\n pointCount: number = 0;\n\n /**\n * Evaluate the manifold with supplied transforms. This assumes modest motion\n * from the original state. This does not change the point count, impulses, etc.\n * The radii must come from the shapes that generated the manifold.\n */\n getWorldManifold(wm: WorldManifold | undefined, xfA: Transform, radiusA: number, xfB: Transform, radiusB: number): WorldManifold {\n if (this.pointCount == 0) {\n return;\n }\n\n wm = wm || new WorldManifold();\n\n let normal = wm.normal;\n const points = wm.points;\n const separations = wm.separations;\n\n // TODO: improve\n switch (this.type) {\n case ManifoldType.e_circles: {\n normal = Vec2.neo(1.0, 0.0);\n const pointA = Transform.mulVec2(xfA, this.localPoint);\n const pointB = Transform.mulVec2(xfB, this.points[0].localPoint);\n const dist = Vec2.sub(pointB, pointA);\n if (Vec2.lengthSquared(dist) > Math.EPSILON * Math.EPSILON) {\n normal.setVec2(dist);\n normal.normalize();\n }\n const cA = pointA.clone().addMul(radiusA, normal);\n const cB = pointB.clone().addMul(-radiusB, normal);\n points[0] = Vec2.mid(cA, cB);\n separations[0] = Vec2.dot(Vec2.sub(cB, cA), normal);\n points.length = 1;\n separations.length = 1;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfA, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfB, this.points[i].localPoint);\n const cA = Vec2.clone(clipPoint).addMul(radiusA - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cB = Vec2.clone(clipPoint).subMul(radiusB, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cB, cA), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfB, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfA, this.points[i].localPoint);\n const cB = Vec2.combine(1, clipPoint, radiusB - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cA = Vec2.combine(1, clipPoint, -radiusA, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cA, cB), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n // Ensure normal points from A to B.\n normal.mul(-1);\n break;\n }\n }\n\n wm.normal = normal;\n wm.points = points;\n wm.separations = separations;\n return wm;\n }\n\n static clipSegmentToLine = clipSegmentToLine;\n static ClipVertex = ClipVertex;\n static getPointStates = getPointStates;\n static PointState = PointState;\n}\n\n/**\n * A manifold point is a contact point belonging to a contact manifold. It holds\n * details related to the geometry and dynamics of the contact points.\n *\n * This structure is stored across time steps, so we keep it small.\n *\n * Note: impulses are used for internal caching and may not provide reliable\n * contact forces, especially for high speed collisions.\n */\nexport class ManifoldPoint {\n /**\n * Usage depends on manifold type.\n * e_circles: the local center of circleB,\n * e_faceA: the local center of cirlceB or the clip point of polygonB,\n * e_faceB: the clip point of polygonA.\n */\n localPoint: Vec2 = Vec2.zero();\n /**\n * The non-penetration impulse\n */\n normalImpulse: number = 0;\n /**\n * The friction impulse\n */\n tangentImpulse: number = 0;\n /**\n * Uniquely identifies a contact point between two shapes to facilatate warm starting\n */\n id: ContactID = new ContactID();\n}\n\n/**\n * Contact ids to facilitate warm starting.\n */\nexport class ContactID {\n cf: ContactFeature = new ContactFeature();\n\n /**\n * Used to quickly compare contact ids.\n */\n get key(): number {\n return this.cf.indexA + this.cf.indexB * 4 + this.cf.typeA * 16 + this.cf.typeB * 64;\n }\n\n set(o: ContactID): void {\n // this.key = o.key;\n this.cf.set(o.cf);\n }\n}\n\n/**\n * The features that intersect to form the contact point.\n */\nexport class ContactFeature {\n /**\n * Feature index on shapeA\n */\n indexA: number;\n /**\n * Feature index on shapeB\n */\n indexB: number;\n /**\n * The feature type on shapeA\n */\n typeA: ContactFeatureType;\n /**\n * The feature type on shapeB\n */\n typeB: ContactFeatureType;\n set(o: ContactFeature): void {\n this.indexA = o.indexA;\n this.indexB = o.indexB;\n this.typeA = o.typeA;\n this.typeB = o.typeB;\n }\n}\n\n/**\n * This is used to compute the current state of a contact manifold.\n */\nexport class WorldManifold {\n /**\n * World vector pointing from A to B\n */\n normal: Vec2;\n /**\n * World contact point (point of intersection)\n */\n points: Vec2[] = []; // [maxManifoldPoints]\n /**\n * A negative value indicates overlap, in meters\n */\n separations: number[] = []; // [maxManifoldPoints]\n}\n\n/**\n * Compute the point states given two manifolds. The states pertain to the\n * transition from manifold1 to manifold2. So state1 is either persist or remove\n * while state2 is either add or persist.\n */\nexport function getPointStates(\n state1: PointState[],\n state2: PointState[],\n manifold1: Manifold,\n manifold2: Manifold\n): void {\n // state1, state2: PointState[Settings.maxManifoldPoints]\n\n // for (var i = 0; i < Settings.maxManifoldPoints; ++i) {\n // state1[i] = PointState.nullState;\n // state2[i] = PointState.nullState;\n // }\n\n // Detect persists and removes.\n for (let i = 0; i < manifold1.pointCount; ++i) {\n const id = manifold1.points[i].id;\n\n state1[i] = PointState.removeState;\n\n for (let j = 0; j < manifold2.pointCount; ++j) {\n if (manifold2.points[j].id.key == id.key) {\n state1[i] = PointState.persistState;\n break;\n }\n }\n }\n\n // Detect persists and adds.\n for (let i = 0; i < manifold2.pointCount; ++i) {\n const id = manifold2.points[i].id;\n\n state2[i] = PointState.addState;\n\n for (let j = 0; j < manifold1.pointCount; ++j) {\n if (manifold1.points[j].id.key == id.key) {\n state2[i] = PointState.persistState;\n break;\n }\n }\n }\n}\n\n/**\n * Clipping for contact manifolds. Sutherland-Hodgman clipping.\n */\nexport function clipSegmentToLine(\n vOut: ClipVertex[],\n vIn: ClipVertex[],\n normal: Vec2,\n offset: number,\n vertexIndexA: number\n): number {\n // Start with no output points\n let numOut = 0;\n\n // Calculate the distance of end points to the line\n const distance0 = Vec2.dot(normal, vIn[0].v) - offset;\n const distance1 = Vec2.dot(normal, vIn[1].v) - offset;\n\n // If the points are behind the plane\n if (distance0 <= 0.0)\n vOut[numOut++].set(vIn[0]);\n if (distance1 <= 0.0)\n vOut[numOut++].set(vIn[1]);\n\n // If the points are on different sides of the plane\n if (distance0 * distance1 < 0.0) {\n // Find intersection point of edge and plane\n const interp = distance0 / (distance0 - distance1);\n vOut[numOut].v.setCombine(1 - interp, vIn[0].v, interp, vIn[1].v);\n\n // VertexA is hitting edgeB.\n vOut[numOut].id.cf.indexA = vertexIndexA;\n vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB;\n vOut[numOut].id.cf.typeA = ContactFeatureType.e_vertex;\n vOut[numOut].id.cf.typeB = ContactFeatureType.e_face;\n ++numOut;\n }\n\n return numOut;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { ShapeType } from \"../collision/Shape\";\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Transform } from '../common/Transform';\nimport { Mat22 } from '../common/Mat22';\nimport { Rot } from '../common/Rot';\nimport { Settings } from '../Settings';\nimport { Manifold, ManifoldType, WorldManifold } from '../collision/Manifold';\nimport { testOverlap } from '../collision/Distance';\nimport { Fixture } from \"./Fixture\";\nimport { Body } from \"./Body\";\nimport { ContactImpulse, TimeStep } from \"./Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst DEBUG_SOLVER = false;\n\n/**\n * A contact edge is used to connect bodies and contacts together in a contact\n * graph where each body is a node and each contact is an edge. A contact edge\n * belongs to a doubly linked list maintained in each attached body. Each\n * contact has two contact nodes, one for each attached body.\n *\n * @prop {Contact} contact The contact\n * @prop {ContactEdge} prev The previous contact edge in the body's contact list\n * @prop {ContactEdge} next The next contact edge in the body's contact list\n * @prop {Body} other Provides quick access to the other body attached.\n */\nexport class ContactEdge {\n contact: Contact;\n prev: ContactEdge | undefined;\n next: ContactEdge | undefined;\n other: Body | undefined;\n constructor(contact: Contact) {\n this.contact = contact;\n }\n}\n\nexport type EvaluateFunction = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void;\n\nexport type ContactCallback = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void /* & { destroyFcn?: (contact: Contact) => void }*/;\n\n\n/**\n * Friction mixing law. The idea is to allow either fixture to drive the\n * restitution to zero. For example, anything slides on ice.\n */\nexport function mixFriction(friction1: number, friction2: number): number {\n return Math.sqrt(friction1 * friction2);\n}\n\n/**\n * Restitution mixing law. The idea is allow for anything to bounce off an\n * inelastic surface. For example, a superball bounces on anything.\n */\nexport function mixRestitution(restitution1: number, restitution2: number): number {\n return restitution1 > restitution2 ? restitution1 : restitution2;\n}\n\n// TODO: move this to Settings?\nconst s_registers = [];\n\n// TODO: merge with ManifoldPoint?\nexport class VelocityConstraintPoint {\n rA: Vec2 = Vec2.zero();\n rB: Vec2 = Vec2.zero();\n normalImpulse: number = 0;\n tangentImpulse: number = 0;\n normalMass: number = 0;\n tangentMass: number = 0;\n velocityBias: number = 0;\n}\n\n/**\n * The class manages contact between two shapes. A contact exists for each\n * overlapping AABB in the broad-phase (except if filtered). Therefore a contact\n * object may exist that has no contact points.\n */\nexport class Contact {\n /** @internal */\n m_nodeA: ContactEdge;\n /** @internal */\n m_nodeB: ContactEdge;\n /** @internal */\n m_fixtureA: Fixture;\n /** @internal */\n m_fixtureB: Fixture;\n /** @internal */\n m_indexA: number;\n /** @internal */\n m_indexB: number;\n /** @internal */\n m_evaluateFcn: EvaluateFunction;\n /** @internal */\n m_manifold: Manifold = new Manifold();\n /** @internal */\n m_prev: Contact | null = null;\n /** @internal */\n m_next: Contact | null = null;\n /** @internal */\n m_toi: number = 1.0;\n /** @internal */\n m_toiCount: number = 0;\n /** @internal This contact has a valid TOI in m_toi */\n m_toiFlag: boolean = false;\n /** @internal */\n m_friction: number;\n /** @internal */\n m_restitution: number;\n /** @internal */\n m_tangentSpeed: number = 0.0;\n /** @internal This contact can be disabled (by user) */\n m_enabledFlag: boolean = true;\n /** @internal Used when crawling contact graph when forming islands. */\n m_islandFlag: boolean = false;\n /** @internal Set when the shapes are touching. */\n m_touchingFlag: boolean = false;\n /** @internal This contact needs filtering because a fixture filter was changed. */\n m_filterFlag: boolean = false;\n /** @internal This bullet contact had a TOI event */\n m_bulletHitFlag: boolean = false;\n\n /** @internal Contact reporting impulse object cache */\n m_impulse: ContactImpulse = new ContactImpulse(this);\n\n // VelocityConstraint\n /** @internal */ v_points: VelocityConstraintPoint[] = []; // [maxManifoldPoints];\n /** @internal */ v_normal: Vec2 = Vec2.zero();\n /** @internal */ v_normalMass: Mat22 = new Mat22();\n /** @internal */ v_K: Mat22 = new Mat22();\n /** @internal */ v_pointCount: number;\n /** @internal */ v_tangentSpeed: number | undefined;\n /** @internal */ v_friction: number | undefined;\n /** @internal */ v_restitution: number | undefined;\n /** @internal */ v_invMassA: number | undefined;\n /** @internal */ v_invMassB: number | undefined;\n /** @internal */ v_invIA: number | undefined;\n /** @internal */ v_invIB: number | undefined;\n\n // PositionConstraint\n /** @internal */ p_localPoints: Vec2[] = []; // [maxManifoldPoints];\n /** @internal */ p_localNormal: Vec2 = Vec2.zero();\n /** @internal */ p_localPoint: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterA: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterB: Vec2 = Vec2.zero();\n /** @internal */ p_type: ManifoldType | undefined;\n /** @internal */ p_radiusA: number | undefined;\n /** @internal */ p_radiusB: number | undefined;\n /** @internal */ p_pointCount: number | undefined;\n /** @internal */ p_invMassA: number | undefined;\n /** @internal */ p_invMassB: number | undefined;\n /** @internal */ p_invIA: number | undefined;\n /** @internal */ p_invIB: number | undefined;\n\n constructor(fA: Fixture, indexA: number, fB: Fixture, indexB: number, evaluateFcn: EvaluateFunction) {\n // Nodes for connecting bodies.\n this.m_nodeA = new ContactEdge(this);\n this.m_nodeB = new ContactEdge(this);\n\n this.m_fixtureA = fA;\n this.m_fixtureB = fB;\n\n this.m_indexA = indexA;\n this.m_indexB = indexB;\n\n this.m_evaluateFcn = evaluateFcn;\n\n this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction);\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution);\n }\n\n initConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const shapeA = fixtureA.getShape();\n const shapeB = fixtureB.getShape();\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const manifold = this.getManifold();\n\n const pointCount = manifold.pointCount;\n _ASSERT && console.assert(pointCount > 0);\n\n this.v_invMassA = bodyA.m_invMass;\n this.v_invMassB = bodyB.m_invMass;\n this.v_invIA = bodyA.m_invI;\n this.v_invIB = bodyB.m_invI;\n\n this.v_friction = this.m_friction;\n this.v_restitution = this.m_restitution;\n this.v_tangentSpeed = this.m_tangentSpeed;\n\n this.v_pointCount = pointCount;\n\n this.v_K.setZero();\n this.v_normalMass.setZero();\n\n this.p_invMassA = bodyA.m_invMass;\n this.p_invMassB = bodyB.m_invMass;\n this.p_invIA = bodyA.m_invI;\n this.p_invIB = bodyB.m_invI;\n this.p_localCenterA = Vec2.clone(bodyA.m_sweep.localCenter);\n this.p_localCenterB = Vec2.clone(bodyB.m_sweep.localCenter);\n\n this.p_radiusA = shapeA.m_radius;\n this.p_radiusB = shapeB.m_radius;\n\n this.p_type = manifold.type;\n this.p_localNormal = Vec2.clone(manifold.localNormal);\n this.p_localPoint = Vec2.clone(manifold.localPoint);\n this.p_pointCount = pointCount;\n\n for (let j = 0; j < pointCount; ++j) {\n const cp = manifold.points[j];\n const vcp = this.v_points[j] = new VelocityConstraintPoint();\n\n if (step.warmStarting) {\n vcp.normalImpulse = step.dtRatio * cp.normalImpulse;\n vcp.tangentImpulse = step.dtRatio * cp.tangentImpulse;\n\n } else {\n vcp.normalImpulse = 0.0;\n vcp.tangentImpulse = 0.0;\n }\n\n vcp.rA.setZero();\n vcp.rB.setZero();\n vcp.normalMass = 0.0;\n vcp.tangentMass = 0.0;\n vcp.velocityBias = 0.0;\n\n this.p_localPoints[j] = Vec2.clone(cp.localPoint);\n\n }\n }\n\n /**\n * Get the contact manifold. Do not modify the manifold unless you understand\n * the internals of the library.\n */\n getManifold(): Manifold {\n return this.m_manifold;\n }\n\n /**\n * Get the world manifold.\n */\n getWorldManifold(worldManifold: WorldManifold | null | undefined): WorldManifold | undefined {\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n\n return this.m_manifold.getWorldManifold(worldManifold, bodyA.getTransform(),\n shapeA.m_radius, bodyB.getTransform(), shapeB.m_radius);\n }\n\n /**\n * Enable/disable this contact. This can be used inside the pre-solve contact\n * listener. The contact is only disabled for the current time step (or sub-step\n * in continuous collisions).\n */\n setEnabled(flag: boolean): void {\n this.m_enabledFlag = !!flag;\n }\n\n /**\n * Has this contact been disabled?\n */\n isEnabled(): boolean {\n return this.m_enabledFlag;\n }\n\n /**\n * Is this contact touching?\n */\n isTouching(): boolean {\n return this.m_touchingFlag;\n }\n\n /**\n * Get the next contact in the world's contact list.\n */\n getNext(): Contact | null {\n return this.m_next;\n }\n\n /**\n * Get fixture A in this contact.\n */\n getFixtureA(): Fixture {\n return this.m_fixtureA;\n }\n\n /**\n * Get fixture B in this contact.\n */\n getFixtureB(): Fixture {\n return this.m_fixtureB;\n }\n\n /**\n * Get the child primitive index for fixture A.\n */\n getChildIndexA(): number {\n return this.m_indexA;\n }\n\n /**\n * Get the child primitive index for fixture B.\n */\n getChildIndexB(): number {\n return this.m_indexB;\n }\n\n /**\n * Flag this contact for filtering. Filtering will occur the next time step.\n */\n flagForFiltering(): void {\n this.m_filterFlag = true;\n }\n\n /**\n * Override the default friction mixture. You can call this in\n * ContactListener.preSolve. This value persists until set or reset.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the friction.\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Reset the friction mixture to the default value.\n */\n resetFriction(): void {\n this.m_friction = mixFriction(this.m_fixtureA.m_friction,\n this.m_fixtureB.m_friction);\n }\n\n /**\n * Override the default restitution mixture. You can call this in\n * ContactListener.preSolve. The value persists until you set or reset.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Get the restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Reset the restitution to the default value.\n */\n resetRestitution(): void {\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution,\n this.m_fixtureB.m_restitution);\n }\n\n /**\n * Set the desired tangent speed for a conveyor belt behavior. In meters per\n * second.\n */\n setTangentSpeed(speed: number): void {\n this.m_tangentSpeed = speed;\n }\n\n /**\n * Get the desired tangent speed. In meters per second.\n */\n getTangentSpeed(): number {\n return this.m_tangentSpeed;\n }\n\n /**\n * Called by Update method, and implemented by subclasses.\n */\n evaluate(manifold: Manifold, xfA: Transform, xfB: Transform): void {\n this.m_evaluateFcn(manifold, xfA, this.m_fixtureA, this.m_indexA, xfB,\n this.m_fixtureB, this.m_indexB);\n }\n\n /**\n * Updates the contact manifold and touching status.\n *\n * Note: do not assume the fixture AABBs are overlapping or are valid.\n *\n * @param listener.beginContact\n * @param listener.endContact\n * @param listener.preSolve\n */\n update(listener?: {\n beginContact(contact: Contact): void,\n endContact(contact: Contact): void,\n preSolve(contact: Contact, oldManifold: Manifold): void\n }): void {\n\n // Re-enable this contact.\n this.m_enabledFlag = true;\n\n let touching = false;\n const wasTouching = this.m_touchingFlag;\n\n const sensorA = this.m_fixtureA.isSensor();\n const sensorB = this.m_fixtureB.isSensor();\n const sensor = sensorA || sensorB;\n\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const xfA = bodyA.getTransform();\n const xfB = bodyB.getTransform();\n\n let oldManifold;\n\n // Is this contact a sensor?\n if (sensor) {\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n touching = testOverlap(shapeA, this.m_indexA, shapeB, this.m_indexB, xfA, xfB);\n\n // Sensors don't generate manifolds.\n this.m_manifold.pointCount = 0;\n } else {\n\n // TODO reuse manifold\n oldManifold = this.m_manifold;\n this.m_manifold = new Manifold();\n\n this.evaluate(this.m_manifold, xfA, xfB);\n touching = this.m_manifold.pointCount > 0;\n\n // Match old contact ids to new contact ids and copy the\n // stored impulses to warm start the solver.\n for (let i = 0; i < this.m_manifold.pointCount; ++i) {\n const nmp = this.m_manifold.points[i];\n nmp.normalImpulse = 0.0;\n nmp.tangentImpulse = 0.0;\n\n for (let j = 0; j < oldManifold.pointCount; ++j) {\n const omp = oldManifold.points[j];\n if (omp.id.key == nmp.id.key) {\n nmp.normalImpulse = omp.normalImpulse;\n nmp.tangentImpulse = omp.tangentImpulse;\n break;\n }\n }\n }\n\n if (touching != wasTouching) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n }\n\n this.m_touchingFlag = touching;\n\n if (!wasTouching && touching && listener) {\n listener.beginContact(this);\n }\n\n if (wasTouching && !touching && listener) {\n listener.endContact(this);\n }\n\n if (!sensor && touching && listener) {\n listener.preSolve(this, oldManifold);\n }\n }\n\n solvePositionConstraint(step: TimeStep): number {\n return this._solvePositionConstraint(step);\n }\n\n solvePositionConstraintTOI(step: TimeStep, toiA: Body, toiB: Body): number {\n return this._solvePositionConstraint(step, toiA, toiB);\n }\n\n private _solvePositionConstraint(step: TimeStep, toiA?: Body, toiB?: Body): number {\n const toi: boolean = !!toiA && !!toiB;\n\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n let mA = 0.0;\n let iA = 0.0;\n if (!toi || (bodyA == toiA || bodyA == toiB)) {\n mA = this.p_invMassA;\n iA = this.p_invIA;\n }\n\n let mB = 0.0;\n let iB = 0.0;\n if (!toi || (bodyB == toiA || bodyB == toiB)) {\n mB = this.p_invMassB;\n iB = this.p_invIB;\n }\n\n const cA = Vec2.clone(positionA.c);\n let aA = positionA.a;\n\n const cB = Vec2.clone(positionB.c);\n let aB = positionB.a;\n\n let minSeparation = 0.0;\n\n // Solve normal constraints\n for (let j = 0; j < this.p_pointCount; ++j) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p = Vec2.sub(cA, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p = Vec2.sub(cB, Rot.mulVec2(xfB.q, localCenterB));\n\n // PositionSolverManifold\n let normal;\n let point;\n let separation;\n switch (this.p_type) {\n case ManifoldType.e_circles: {\n const pointA = Transform.mulVec2(xfA, this.p_localPoint);\n const pointB = Transform.mulVec2(xfB, this.p_localPoints[0]);\n normal = Vec2.sub(pointB, pointA);\n normal.normalize();\n point = Vec2.combine(0.5, pointA, 0.5, pointB);\n separation = Vec2.dot(Vec2.sub(pointB, pointA), normal) - this.p_radiusA - this.p_radiusB;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfA, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfB, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfB, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfA, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n\n // Ensure normal points from A to B\n normal.mul(-1);\n break;\n }\n }\n\n const rA = Vec2.sub(point, cA);\n const rB = Vec2.sub(point, cB);\n\n // Track max constraint error.\n minSeparation = Math.min(minSeparation, separation);\n\n const baumgarte = toi ? Settings.toiBaugarte : Settings.baumgarte;\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n // Prevent large corrections and allow slop.\n const C = Math.clamp(baumgarte * (separation + linearSlop), -maxLinearCorrection, 0.0);\n\n // Compute the effective mass.\n const rnA = Vec2.crossVec2Vec2(rA, normal);\n const rnB = Vec2.crossVec2Vec2(rB, normal);\n const K = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n // Compute normal impulse\n const impulse = K > 0.0 ? -C / K : 0.0;\n\n const P = Vec2.mulNumVec2(impulse, normal);\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n\n return minSeparation;\n }\n\n initVelocityConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const radiusA = this.p_radiusA;\n const radiusB = this.p_radiusB;\n const manifold = this.getManifold();\n\n const mA = this.v_invMassA;\n const mB = this.v_invMassB;\n const iA = this.v_invIA;\n const iB = this.v_invIB;\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n const cA = Vec2.clone(positionA.c);\n const aA = positionA.a;\n const vA = Vec2.clone(velocityA.v);\n const wA = velocityA.w;\n\n const cB = Vec2.clone(positionB.c);\n const aB = positionB.a;\n const vB = Vec2.clone(velocityB.v);\n const wB = velocityB.w;\n\n _ASSERT && console.assert(manifold.pointCount > 0);\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p.setCombine(1, cA, -1, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p.setCombine(1, cB, -1, Rot.mulVec2(xfB.q, localCenterB));\n\n const worldManifold = manifold.getWorldManifold(null, xfA, radiusA, xfB, radiusB);\n\n this.v_normal.setVec2(worldManifold.normal);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n vcp.rA.setVec2(Vec2.sub(worldManifold.points[j], cA));\n vcp.rB.setVec2(Vec2.sub(worldManifold.points[j], cB));\n\n const rnA = Vec2.crossVec2Vec2(vcp.rA, this.v_normal);\n const rnB = Vec2.crossVec2Vec2(vcp.rB, this.v_normal);\n\n const kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n vcp.normalMass = kNormal > 0.0 ? 1.0 / kNormal : 0.0;\n\n const tangent = Vec2.crossVec2Num(this.v_normal, 1.0);\n\n const rtA = Vec2.crossVec2Vec2(vcp.rA, tangent);\n const rtB = Vec2.crossVec2Vec2(vcp.rB, tangent);\n\n const kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB;\n\n vcp.tangentMass = kTangent > 0.0 ? 1.0 / kTangent : 0.0;\n\n // Setup a velocity bias for restitution.\n vcp.velocityBias = 0.0;\n const vRel = Vec2.dot(this.v_normal, vB)\n + Vec2.dot(this.v_normal, Vec2.crossNumVec2(wB, vcp.rB))\n - Vec2.dot(this.v_normal, vA)\n - Vec2.dot(this.v_normal, Vec2.crossNumVec2(wA, vcp.rA));\n if (vRel < -Settings.velocityThreshold) {\n vcp.velocityBias = -this.v_restitution * vRel;\n }\n }\n\n // If we have two points, then prepare the block solver.\n if (this.v_pointCount == 2 && step.blockSolve) {\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const rn1A = Vec2.crossVec2Vec2(vcp1.rA, this.v_normal);\n const rn1B = Vec2.crossVec2Vec2(vcp1.rB, this.v_normal);\n const rn2A = Vec2.crossVec2Vec2(vcp2.rA, this.v_normal);\n const rn2B = Vec2.crossVec2Vec2(vcp2.rB, this.v_normal);\n\n const k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B;\n const k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B;\n const k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B;\n\n // Ensure a reasonable condition number.\n const k_maxConditionNumber = 1000.0;\n if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) {\n // K is safe to invert.\n this.v_K.ex.setNum(k11, k12);\n this.v_K.ey.setNum(k12, k22);\n this.v_normalMass.set(this.v_K.getInverse());\n } else {\n // The constraints are redundant, just use one.\n // TODO_ERIN use deepest?\n this.v_pointCount = 1;\n }\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n warmStartConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n const P = Vec2.combine(vcp.normalImpulse, normal, vcp.tangentImpulse, tangent);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n vA.subMul(mA, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n vB.addMul(mB, P);\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n storeConstraintImpulses(step: TimeStep): void {\n const manifold = this.m_manifold;\n for (let j = 0; j < this.v_pointCount; ++j) {\n manifold.points[j].normalImpulse = this.v_points[j].normalImpulse;\n manifold.points[j].tangentImpulse = this.v_points[j].tangentImpulse;\n }\n }\n\n solveVelocityConstraint(step: TimeStep): void {\n const bodyA = this.m_fixtureA.m_body;\n const bodyB = this.m_fixtureB.m_body;\n\n const velocityA = bodyA.c_velocity;\n const positionA = bodyA.c_position;\n\n const velocityB = bodyB.c_velocity;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n const friction = this.v_friction;\n\n _ASSERT && console.assert(this.v_pointCount == 1 || this.v_pointCount == 2);\n\n // Solve tangent constraints first because non-penetration is more important\n // than friction.\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute tangent force\n const vt = Vec2.dot(dv, tangent) - this.v_tangentSpeed;\n let lambda = vcp.tangentMass * (-vt);\n\n // Clamp the accumulated force\n const maxFriction = friction * vcp.normalImpulse;\n const newImpulse = Math.clamp(vcp.tangentImpulse + lambda, -maxFriction, maxFriction);\n lambda = newImpulse - vcp.tangentImpulse;\n vcp.tangentImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, tangent);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n\n // Solve normal constraints\n if (this.v_pointCount == 1 || step.blockSolve == false) {\n for (let i = 0; i < this.v_pointCount; ++i) {\n const vcp = this.v_points[i]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute normal impulse\n const vn = Vec2.dot(dv, normal);\n let lambda = -vcp.normalMass * (vn - vcp.velocityBias);\n\n // Clamp the accumulated impulse\n const newImpulse = Math.max(vcp.normalImpulse + lambda, 0.0);\n lambda = newImpulse - vcp.normalImpulse;\n vcp.normalImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, normal);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n } else {\n // Block solver developed in collaboration with Dirk Gregorius (back in\n // 01/07 on Box2D_Lite).\n // Build the mini LCP for this contact patch\n //\n // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i =\n // 1..2\n //\n // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n )\n // b = vn0 - velocityBias\n //\n // The system is solved using the \"Total enumeration method\" (s. Murty).\n // The complementary constraint vn_i * x_i\n // implies that we must have in any solution either vn_i = 0 or x_i = 0.\n // So for the 2D contact problem the cases\n // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and\n // vn1 = 0 need to be tested. The first valid\n // solution that satisfies the problem is chosen.\n //\n // In order to account of the accumulated impulse 'a' (because of the\n // iterative nature of the solver which only requires\n // that the accumulated impulse is clamped and not the incremental\n // impulse) we change the impulse variable (x_i).\n //\n // Substitute:\n //\n // x = a + d\n //\n // a := old total impulse\n // x := new total impulse\n // d := incremental impulse\n //\n // For the current iteration we extend the formula for the incremental\n // impulse\n // to compute the new total impulse:\n //\n // vn = A * d + b\n // = A * (x - a) + b\n // = A * x + b - A * a\n // = A * x + b'\n // b' = b - A * a;\n\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const a = Vec2.neo(vcp1.normalImpulse, vcp2.normalImpulse);\n _ASSERT && console.assert(a.x >= 0.0 && a.y >= 0.0);\n\n // Relative velocity at contact\n let dv1 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp1.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp1.rA));\n let dv2 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp2.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp2.rA));\n\n // Compute normal velocity\n let vn1 = Vec2.dot(dv1, normal);\n let vn2 = Vec2.dot(dv2, normal);\n\n const b = Vec2.neo(vn1 - vcp1.velocityBias, vn2 - vcp2.velocityBias);\n\n // Compute b'\n b.sub(Mat22.mulVec2(this.v_K, a));\n\n const k_errorTol = 1e-3;\n // NOT_USED(k_errorTol);\n\n while (true) {\n //\n // Case 1: vn = 0\n //\n // 0 = A * x + b'\n //\n // Solve for x:\n //\n // x = - inv(A) * b'\n //\n const x = Mat22.mulVec2(this.v_normalMass, b).neg();\n\n if (x.x >= 0.0 && x.y >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n dv1 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA)));\n dv2 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA)));\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && console.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n _ASSERT && console.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 2: vn1 = 0 and x2 = 0\n //\n // 0 = a11 * x1 + a12 * 0 + b1'\n // vn2 = a21 * x1 + a22 * 0 + b2'\n //\n x.x = -vcp1.normalMass * b.x;\n x.y = 0.0;\n vn1 = 0.0;\n vn2 = this.v_K.ex.y * x.x + b.y;\n\n if (x.x >= 0.0 && vn2 >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv1B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB));\n const dv1A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA));\n const dv1 = Vec2.sub(dv1B, dv1A);\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n\n _ASSERT && console.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 3: vn2 = 0 and x1 = 0\n //\n // vn1 = a11 * 0 + a12 * x2 + b1'\n // 0 = a21 * 0 + a22 * x2 + b2'\n //\n x.x = 0.0;\n x.y = -vcp2.normalMass * b.y;\n vn1 = this.v_K.ey.x * x.y + b.x;\n vn2 = 0.0;\n\n if (x.y >= 0.0 && vn1 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv2B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB));\n const dv2A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA));\n const dv1 = Vec2.sub(dv2B, dv2A);\n\n // Compute normal velocity\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && console.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 4: x1 = 0 and x2 = 0\n //\n // vn1 = b1\n // vn2 = b2;\n //\n x.x = 0.0;\n x.y = 0.0;\n vn1 = b.x;\n vn2 = b.y;\n\n if (vn1 >= 0.0 && vn2 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n break;\n }\n\n // No solution, give up. This is hit sometimes, but it doesn't seem to\n // matter.\n break;\n }\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n /**\n * @internal\n */\n static addType(type1: ShapeType, type2: ShapeType, callback: ContactCallback): void {\n s_registers[type1] = s_registers[type1] || {};\n s_registers[type1][type2] = callback;\n }\n\n /**\n * @internal\n */\n static create(fixtureA: Fixture, indexA: number, fixtureB: Fixture, indexB: number): Contact | null {\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // TODO: pool contacts\n let contact;\n let evaluateFcn;\n if (evaluateFcn = s_registers[typeA] && s_registers[typeA][typeB]) {\n contact = new Contact(fixtureA, indexA, fixtureB, indexB, evaluateFcn);\n } else if (evaluateFcn = s_registers[typeB] && s_registers[typeB][typeA]) {\n contact = new Contact(fixtureB, indexB, fixtureA, indexA, evaluateFcn);\n } else {\n return null;\n }\n\n // Contact creation may swap fixtures.\n fixtureA = contact.getFixtureA();\n fixtureB = contact.getFixtureB();\n indexA = contact.getChildIndexA();\n indexB = contact.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Connect to body A\n contact.m_nodeA.contact = contact;\n contact.m_nodeA.other = bodyB;\n\n contact.m_nodeA.prev = null;\n contact.m_nodeA.next = bodyA.m_contactList;\n if (bodyA.m_contactList != null) {\n bodyA.m_contactList.prev = contact.m_nodeA;\n }\n bodyA.m_contactList = contact.m_nodeA;\n\n // Connect to body B\n contact.m_nodeB.contact = contact;\n contact.m_nodeB.other = bodyA;\n\n contact.m_nodeB.prev = null;\n contact.m_nodeB.next = bodyB.m_contactList;\n if (bodyB.m_contactList != null) {\n bodyB.m_contactList.prev = contact.m_nodeB;\n }\n bodyB.m_contactList = contact.m_nodeB;\n\n // Wake up the bodies\n if (fixtureA.isSensor() == false && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n return contact;\n }\n\n /**\n * @internal\n */\n static destroy(contact: Contact, listener: { endContact: (contact: Contact) => void }): void {\n const fixtureA = contact.m_fixtureA;\n const fixtureB = contact.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n if (contact.isTouching()) {\n listener.endContact(contact);\n }\n\n // Remove from body 1\n if (contact.m_nodeA.prev) {\n contact.m_nodeA.prev.next = contact.m_nodeA.next;\n }\n\n if (contact.m_nodeA.next) {\n contact.m_nodeA.next.prev = contact.m_nodeA.prev;\n }\n\n if (contact.m_nodeA == bodyA.m_contactList) {\n bodyA.m_contactList = contact.m_nodeA.next;\n }\n\n // Remove from body 2\n if (contact.m_nodeB.prev) {\n contact.m_nodeB.prev.next = contact.m_nodeB.next;\n }\n\n if (contact.m_nodeB.next) {\n contact.m_nodeB.next.prev = contact.m_nodeB.prev;\n }\n\n if (contact.m_nodeB == bodyB.m_contactList) {\n bodyB.m_contactList = contact.m_nodeB.next;\n }\n\n if (contact.m_manifold.pointCount > 0 && fixtureA.isSensor() == false\n && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // const destroyFcn = s_registers[typeA][typeB].destroyFcn;\n // if (typeof destroyFcn === 'function') {\n // destroyFcn(contact);\n // }\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { Vec2 } from '../common/Vec2';\nimport { BroadPhase } from '../collision/BroadPhase';\nimport { Solver, ContactImpulse, TimeStep } from './Solver';\nimport { Body, BodyDef } from './Body';\nimport { Joint } from './Joint';\nimport { Contact } from './Contact';\nimport { AABB, RayCastInput, RayCastOutput } from \"../collision/AABB\";\nimport { Fixture, FixtureProxy } from \"./Fixture\";\nimport { Manifold } from \"../collision/Manifold\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * @prop gravity [{ x : 0, y : 0}]\n * @prop allowSleep [true]\n * @prop warmStarting [true]\n * @prop continuousPhysics [true]\n * @prop subStepping [false]\n * @prop blockSolve [true]\n * @prop velocityIterations [8] For the velocity constraint solver.\n * @prop positionIterations [3] For the position constraint solver.\n */\nexport interface WorldDef {\n gravity?: Vec2;\n allowSleep?: boolean;\n warmStarting?: boolean;\n continuousPhysics?: boolean;\n subStepping?: boolean;\n blockSolve?: boolean;\n velocityIterations?: number;\n positionIterations?: number;\n}\n\nconst WorldDefDefault: WorldDef = {\n gravity : Vec2.zero(),\n allowSleep : true,\n warmStarting : true,\n continuousPhysics : true,\n subStepping : false,\n blockSolve : true,\n velocityIterations : 8,\n positionIterations : 3\n};\n\n/**\n * Callback function for ray casts, see {@link World.rayCast}.\n *\n * Called for each fixture found in the query. You control how the ray cast\n * proceeds by returning a float: return -1: ignore this fixture and continue\n * return 0: terminate the ray cast return fraction: clip the ray to this point\n * return 1: don't clip the ray and continue\n *\n * @param fixture The fixture hit by the ray\n * @param point The point of initial intersection\n * @param normal The normal vector at the point of intersection\n * @param fraction\n *\n * @return -1 to filter, 0 to terminate, fraction to clip the ray for closest hit, 1 to continue\n */\nexport type WorldRayCastCallback = (fixture: Fixture, point: Vec2, normal: Vec2, fraction: number) => number;\n\n/**\n * Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\nexport type WorldAABBQueryCallback = (fixture: Fixture) => boolean;\n\nexport class World {\n /** @internal */ m_solver: Solver;\n /** @internal */ m_broadPhase: BroadPhase;\n /** @internal */ m_contactList: Contact | null;\n /** @internal */ m_contactCount: number;\n /** @internal */ m_bodyList: Body | null;\n /** @internal */ m_bodyCount: number;\n /** @internal */ m_jointList: Joint | null;\n /** @internal */ m_jointCount: number;\n /** @internal */ m_stepComplete: boolean;\n /** @internal */ m_allowSleep: boolean;\n /** @internal */ m_gravity: Vec2;\n /** @internal */ m_clearForces: boolean;\n /** @internal */ m_newFixture: boolean;\n /** @internal */ m_locked: boolean;\n /** @internal */ m_warmStarting: boolean;\n /** @internal */ m_continuousPhysics: boolean;\n /** @internal */ m_subStepping: boolean;\n /** @internal */ m_blockSolve: boolean;\n /** @internal */ m_velocityIterations: number;\n /** @internal */ m_positionIterations: number;\n /** @internal */ m_t: number;\n\n // TODO\n /** @internal */ _listeners: {\n [key: string]: any[]\n };\n\n /**\n * @param def World definition or gravity vector.\n */\n constructor(def?: WorldDef | Vec2 | null) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof World)) {\n return new World(def);\n }\n\n this.s_step = new TimeStep();\n\n\n if (def && Vec2.isValid(def)) {\n def = { gravity: def as Vec2 };\n }\n\n def = options(def, WorldDefDefault) as WorldDef;\n\n this.m_solver = new Solver(this);\n\n this.m_broadPhase = new BroadPhase();\n\n this.m_contactList = null;\n this.m_contactCount = 0;\n\n this.m_bodyList = null;\n this.m_bodyCount = 0;\n\n this.m_jointList = null;\n this.m_jointCount = 0;\n\n this.m_stepComplete = true;\n\n this.m_allowSleep = def.allowSleep;\n this.m_gravity = Vec2.clone(def.gravity);\n\n this.m_clearForces = true;\n this.m_newFixture = false;\n this.m_locked = false;\n\n // These are for debugging the solver.\n this.m_warmStarting = def.warmStarting;\n this.m_continuousPhysics = def.continuousPhysics;\n this.m_subStepping = def.subStepping;\n\n this.m_blockSolve = def.blockSolve;\n this.m_velocityIterations = def.velocityIterations;\n this.m_positionIterations = def.positionIterations;\n\n this.m_t = 0;\n }\n\n /** @internal */\n _serialize(): object {\n const bodies = [];\n const joints = [];\n\n for (let b = this.getBodyList(); b; b = b.getNext()) {\n bodies.push(b);\n }\n\n for (let j = this.getJointList(); j; j = j.getNext()) {\n // @ts-ignore\n if (typeof j._serialize === 'function') {\n joints.push(j);\n }\n }\n\n return {\n gravity: this.m_gravity,\n bodies,\n joints,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, context: any, restore: any): World {\n if (!data) {\n return new World();\n }\n\n const world = new World(data.gravity);\n\n if (data.bodies) {\n for (let i = data.bodies.length - 1; i >= 0; i -= 1) {\n world._addBody(restore(Body, data.bodies[i], world));\n }\n }\n\n if (data.joints) {\n for (let i = data.joints.length - 1; i >= 0; i--) {\n world.createJoint(restore(Joint, data.joints[i], world));\n }\n }\n\n return world;\n }\n\n /**\n * Get the world body list. With the returned body, use Body.getNext to get the\n * next body in the world list. A null body indicates the end of the list.\n *\n * @return the head of the world body list.\n */\n getBodyList(): Body | null {\n return this.m_bodyList;\n }\n\n /**\n * Get the world joint list. With the returned joint, use Joint.getNext to get\n * the next joint in the world list. A null joint indicates the end of the list.\n *\n * @return the head of the world joint list.\n */\n getJointList(): Joint | null {\n return this.m_jointList;\n }\n\n /**\n * Get the world contact list. With the returned contact, use Contact.getNext to\n * get the next contact in the world list. A null contact indicates the end of\n * the list.\n *\n * Warning: contacts are created and destroyed in the middle of a time step.\n * Use ContactListener to avoid missing contacts.\n *\n * @return the head of the world contact list.\n */\n getContactList(): Contact | null {\n return this.m_contactList;\n }\n\n getBodyCount(): number {\n return this.m_bodyCount;\n }\n\n getJointCount(): number {\n return this.m_jointCount;\n }\n\n /**\n * Get the number of contacts (each may have 0 or more contact points).\n */\n getContactCount(): number {\n return this.m_contactCount;\n }\n\n /**\n * Change the global gravity vector.\n */\n setGravity(gravity: Vec2): void {\n this.m_gravity = gravity;\n }\n\n /**\n * Get the global gravity vector.\n */\n getGravity(): Vec2 {\n return this.m_gravity;\n }\n\n /**\n * Is the world locked (in the middle of a time step).\n */\n isLocked(): boolean {\n return this.m_locked;\n }\n\n /**\n * Enable/disable sleep.\n */\n setAllowSleeping(flag: boolean): void {\n if (flag == this.m_allowSleep) {\n return;\n }\n\n this.m_allowSleep = flag;\n if (this.m_allowSleep == false) {\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.setAwake(true);\n }\n }\n }\n\n getAllowSleeping(): boolean {\n return this.m_allowSleep;\n }\n\n /**\n * Enable/disable warm starting. For testing.\n */\n setWarmStarting(flag: boolean): void {\n this.m_warmStarting = flag;\n }\n\n getWarmStarting(): boolean {\n return this.m_warmStarting;\n }\n\n /**\n * Enable/disable continuous physics. For testing.\n */\n setContinuousPhysics(flag: boolean): void {\n this.m_continuousPhysics = flag;\n }\n\n getContinuousPhysics(): boolean {\n return this.m_continuousPhysics;\n }\n\n /**\n * Enable/disable single stepped continuous physics. For testing.\n */\n setSubStepping(flag: boolean): void {\n this.m_subStepping = flag;\n }\n\n getSubStepping(): boolean {\n return this.m_subStepping;\n }\n\n /**\n * Set flag to control automatic clearing of forces after each time step.\n */\n setAutoClearForces(flag: boolean): void {\n this.m_clearForces = flag;\n }\n\n /**\n * Get the flag that controls automatic clearing of forces after each time step.\n */\n getAutoClearForces(): boolean {\n return this.m_clearForces;\n }\n\n /**\n * Manually clear the force buffer on all bodies. By default, forces are cleared\n * automatically after each call to step. The default behavior is modified by\n * calling setAutoClearForces. The purpose of this function is to support\n * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step\n * under a variable frame-rate. When you perform sub-stepping you will disable\n * auto clearing of forces and instead call clearForces after all sub-steps are\n * complete in one pass of your game loop.\n *\n * See {@link World.setAutoClearForces}\n */\n clearForces(): void {\n for (let body = this.m_bodyList; body; body = body.getNext()) {\n body.m_force.setZero();\n body.m_torque = 0.0;\n }\n }\n\n /**\n * Query the world for all fixtures that potentially overlap the provided AABB.\n *\n * @param aabb The query box.\n * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\n queryAABB(aabb: AABB, callback: WorldAABBQueryCallback): void {\n _ASSERT && console.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n this.m_broadPhase.query(aabb, function(proxyId: number): boolean { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n return callback(proxy.fixture);\n });\n }\n\n /**\n * Ray-cast the world for all fixtures in the path of the ray. Your callback\n * controls whether you get the closest point, any point, or n-points. The\n * ray-cast ignores shapes that contain the starting point.\n *\n * @param point1 The ray starting point\n * @param point2 The ray ending point\n * @param callback A user implemented callback function.\n */\n rayCast(point1: Vec2, point2: Vec2, callback: WorldRayCastCallback): void {\n _ASSERT && console.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n\n this.m_broadPhase.rayCast({\n maxFraction : 1.0,\n p1 : point1,\n p2 : point2\n }, function(input: RayCastInput, proxyId: number): number { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n const fixture = proxy.fixture;\n const index = proxy.childIndex;\n // @ts-ignore\n const output: RayCastOutput = {}; // TODO GC\n const hit = fixture.rayCast(output, input, index);\n if (hit) {\n const fraction = output.fraction;\n const point = Vec2.add(Vec2.mulNumVec2((1.0 - fraction), input.p1), Vec2.mulNumVec2(fraction, input.p2));\n return callback(fixture, point, output.normal, fraction);\n }\n return input.maxFraction;\n });\n }\n\n /**\n * Get the number of broad-phase proxies.\n */\n getProxyCount(): number {\n return this.m_broadPhase.getProxyCount();\n }\n\n /**\n * Get the height of broad-phase dynamic tree.\n */\n getTreeHeight(): number {\n return this.m_broadPhase.getTreeHeight();\n }\n\n /**\n * Get the balance of broad-phase dynamic tree.\n */\n getTreeBalance(): number {\n return this.m_broadPhase.getTreeBalance();\n }\n\n /**\n * Get the quality metric of broad-phase dynamic tree. The smaller the better.\n * The minimum is 1.\n */\n getTreeQuality(): number {\n return this.m_broadPhase.getTreeQuality();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The body shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n _ASSERT && console.assert(this.m_locked == false);\n if (this.m_locked) {\n return;\n }\n\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.m_xf.p.sub(newOrigin);\n b.m_sweep.c0.sub(newOrigin);\n b.m_sweep.c.sub(newOrigin);\n }\n\n for (let j = this.m_jointList; j; j = j.m_next) {\n j.shiftOrigin(newOrigin);\n }\n\n this.m_broadPhase.shiftOrigin(newOrigin);\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addBody(body: Body): void {\n _ASSERT && console.assert(this.isLocked() === false);\n if (this.isLocked()) {\n return;\n }\n\n // Add to world doubly linked list.\n body.m_prev = null;\n body.m_next = this.m_bodyList;\n if (this.m_bodyList) {\n this.m_bodyList.m_prev = body;\n }\n this.m_bodyList = body;\n ++this.m_bodyCount;\n }\n\n /**\n * Create a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This function is locked during callbacks.\n */\n createBody(def?: BodyDef): Body;\n createBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createBody(arg1?, arg2?) {\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n\n const body = new Body(this, def);\n this._addBody(body);\n return body;\n }\n\n createDynamicBody(def?: BodyDef): Body;\n createDynamicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createDynamicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'dynamic';\n return this.createBody(def);\n }\n\n createKinematicBody(def?: BodyDef): Body;\n createKinematicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createKinematicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'kinematic';\n return this.createBody(def);\n }\n\n /**\n * Destroy a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This automatically deletes all associated shapes and joints.\n *\n * Warning: This function is locked during callbacks.\n */\n destroyBody(b: Body): boolean {\n _ASSERT && console.assert(this.m_bodyCount > 0);\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n if (b.m_destroyed) {\n return false;\n }\n\n // Delete the attached joints.\n let je = b.m_jointList;\n while (je) {\n const je0 = je;\n je = je.next;\n\n this.publish('remove-joint', je0.joint);\n this.destroyJoint(je0.joint);\n\n b.m_jointList = je;\n }\n b.m_jointList = null;\n\n // Delete the attached contacts.\n let ce = b.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n\n this.destroyContact(ce0.contact);\n\n b.m_contactList = ce;\n }\n b.m_contactList = null;\n\n // Delete the attached fixtures. This destroys broad-phase proxies.\n let f = b.m_fixtureList;\n while (f) {\n const f0 = f;\n f = f.m_next;\n\n this.publish('remove-fixture', f0);\n f0.destroyProxies(this.m_broadPhase);\n\n b.m_fixtureList = f;\n }\n b.m_fixtureList = null;\n\n // Remove world body list.\n if (b.m_prev) {\n b.m_prev.m_next = b.m_next;\n }\n\n if (b.m_next) {\n b.m_next.m_prev = b.m_prev;\n }\n\n if (b == this.m_bodyList) {\n this.m_bodyList = b.m_next;\n }\n\n b.m_destroyed = true;\n\n --this.m_bodyCount;\n\n this.publish('remove-body', b);\n\n return true;\n }\n\n /**\n * Create a joint to constrain bodies together. No reference to the definition\n * is retained. This may cause the connected bodies to cease colliding.\n *\n * Warning: This function is locked during callbacks.\n */\n createJoint(joint: T): T | null {\n _ASSERT && console.assert(!!joint.m_bodyA);\n _ASSERT && console.assert(!!joint.m_bodyB);\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n // Connect to the world list.\n joint.m_prev = null;\n joint.m_next = this.m_jointList;\n if (this.m_jointList) {\n this.m_jointList.m_prev = joint;\n }\n this.m_jointList = joint;\n ++this.m_jointCount;\n\n // Connect to the bodies' doubly linked lists.\n joint.m_edgeA.joint = joint;\n joint.m_edgeA.other = joint.m_bodyB;\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = joint.m_bodyA.m_jointList;\n if (joint.m_bodyA.m_jointList)\n joint.m_bodyA.m_jointList.prev = joint.m_edgeA;\n joint.m_bodyA.m_jointList = joint.m_edgeA;\n\n joint.m_edgeB.joint = joint;\n joint.m_edgeB.other = joint.m_bodyA;\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = joint.m_bodyB.m_jointList;\n if (joint.m_bodyB.m_jointList)\n joint.m_bodyB.m_jointList.prev = joint.m_edgeB;\n joint.m_bodyB.m_jointList = joint.m_edgeB;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n for (let edge = joint.m_bodyB.getContactList(); edge; edge = edge.next) {\n if (edge.other == joint.m_bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n }\n }\n\n // Note: creating a joint doesn't wake the bodies.\n\n return joint;\n }\n\n /**\n * Destroy a joint. This may cause the connected bodies to begin colliding.\n * Warning: This function is locked during callbacks.\n */\n destroyJoint(joint: Joint): void {\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n // Remove from the doubly linked list.\n if (joint.m_prev) {\n joint.m_prev.m_next = joint.m_next;\n }\n\n if (joint.m_next) {\n joint.m_next.m_prev = joint.m_prev;\n }\n\n if (joint == this.m_jointList) {\n this.m_jointList = joint.m_next;\n }\n\n // Disconnect from bodies.\n const bodyA = joint.m_bodyA;\n const bodyB = joint.m_bodyB;\n\n // Wake up connected bodies.\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n\n // Remove from body 1.\n if (joint.m_edgeA.prev) {\n joint.m_edgeA.prev.next = joint.m_edgeA.next;\n }\n\n if (joint.m_edgeA.next) {\n joint.m_edgeA.next.prev = joint.m_edgeA.prev;\n }\n\n if (joint.m_edgeA == bodyA.m_jointList) {\n bodyA.m_jointList = joint.m_edgeA.next;\n }\n\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = null;\n\n // Remove from body 2\n if (joint.m_edgeB.prev) {\n joint.m_edgeB.prev.next = joint.m_edgeB.next;\n }\n\n if (joint.m_edgeB.next) {\n joint.m_edgeB.next.prev = joint.m_edgeB.prev;\n }\n\n if (joint.m_edgeB == bodyB.m_jointList) {\n bodyB.m_jointList = joint.m_edgeB.next;\n }\n\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = null;\n\n _ASSERT && console.assert(this.m_jointCount > 0);\n --this.m_jointCount;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n let edge = bodyB.getContactList();\n while (edge) {\n if (edge.other == bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n }\n\n this.publish('remove-joint', joint);\n }\n\n /** @internal */\n s_step: TimeStep; // reuse\n\n /**\n * Take a time step. This performs collision detection, integration, and\n * constraint solution.\n *\n * Broad-phase, narrow-phase, solve and solve time of impacts.\n *\n * @param timeStep Time step, this should not vary.\n */\n step(timeStep: number, velocityIterations?: number, positionIterations?: number): void {\n this.publish('pre-step', timeStep);\n\n if ((velocityIterations | 0) !== velocityIterations) {\n // TODO: remove this in future\n velocityIterations = 0;\n }\n\n velocityIterations = velocityIterations || this.m_velocityIterations;\n positionIterations = positionIterations || this.m_positionIterations;\n\n // If new fixtures were added, we need to find the new contacts.\n if (this.m_newFixture) {\n this.findNewContacts();\n this.m_newFixture = false;\n }\n\n this.m_locked = true;\n\n this.s_step.reset(timeStep);\n this.s_step.velocityIterations = velocityIterations;\n this.s_step.positionIterations = positionIterations;\n this.s_step.warmStarting = this.m_warmStarting;\n this.s_step.blockSolve = this.m_blockSolve;\n\n // Update contacts. This is where some contacts are destroyed.\n this.updateContacts();\n\n // Integrate velocities, solve velocity constraints, and integrate positions.\n if (this.m_stepComplete && timeStep > 0.0) {\n this.m_solver.solveWorld(this.s_step);\n\n // Synchronize fixtures, check for out of range bodies.\n for (let b = this.m_bodyList; b; b = b.getNext()) {\n // If a body was not in an island then it did not move.\n if (b.m_islandFlag == false) {\n continue;\n }\n\n if (b.isStatic()) {\n continue;\n }\n\n // Update fixtures (for broad-phase).\n b.synchronizeFixtures();\n }\n // Look for new contacts.\n this.findNewContacts();\n }\n\n // Handle TOI events.\n if (this.m_continuousPhysics && timeStep > 0.0) {\n this.m_solver.solveWorldTOI(this.s_step);\n }\n\n if (this.m_clearForces) {\n this.clearForces();\n }\n\n this.m_locked = false;\n\n this.publish('post-step', timeStep);\n }\n\n /**\n * @internal\n * Call this method to find new contacts.\n */\n findNewContacts(): void {\n this.m_broadPhase.updatePairs(\n (proxyA: FixtureProxy, proxyB: FixtureProxy) => this.createContact(proxyA, proxyB)\n );\n }\n\n /**\n * @internal\n * Callback for broad-phase.\n */\n createContact(proxyA: FixtureProxy, proxyB: FixtureProxy): void {\n const fixtureA = proxyA.fixture;\n const fixtureB = proxyB.fixture;\n\n const indexA = proxyA.childIndex;\n const indexB = proxyB.childIndex;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Are the fixtures on the same body?\n if (bodyA == bodyB) {\n return;\n }\n\n // TODO_ERIN use a hash table to remove a potential bottleneck when both\n // bodies have a lot of contacts.\n // Does a contact already exist?\n let edge = bodyB.getContactList(); // ContactEdge\n while (edge) {\n if (edge.other == bodyA) {\n const fA = edge.contact.getFixtureA();\n const fB = edge.contact.getFixtureB();\n const iA = edge.contact.getChildIndexA();\n const iB = edge.contact.getChildIndexB();\n\n if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) {\n // A contact already exists.\n return;\n }\n\n if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) {\n // A contact already exists.\n return;\n }\n }\n\n edge = edge.next;\n }\n\n if (bodyB.shouldCollide(bodyA) == false) {\n return;\n }\n if (fixtureB.shouldCollide(fixtureA) == false) {\n return;\n }\n\n // Call the factory.\n const contact = Contact.create(fixtureA, indexA, fixtureB, indexB);\n if (contact == null) {\n return;\n }\n\n // Insert into the world.\n contact.m_prev = null;\n if (this.m_contactList != null) {\n contact.m_next = this.m_contactList;\n this.m_contactList.m_prev = contact;\n }\n this.m_contactList = contact;\n\n ++this.m_contactCount;\n }\n\n /**\n * @internal\n * Removes old non-overlapping contacts, applies filters and updates contacts.\n */\n updateContacts(): void {\n // Update awake contacts.\n let c;\n let next_c = this.m_contactList;\n while (c = next_c) {\n next_c = c.getNext();\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Is this contact flagged for filtering?\n if (c.m_filterFlag) {\n if (bodyB.shouldCollide(bodyA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n if (fixtureB.shouldCollide(fixtureA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n // Clear the filtering flag.\n c.m_filterFlag = false;\n }\n\n const activeA = bodyA.isAwake() && !bodyA.isStatic();\n const activeB = bodyB.isAwake() && !bodyB.isStatic();\n\n // At least one body must be awake and it must be dynamic or kinematic.\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const proxyIdA = fixtureA.m_proxies[indexA].proxyId;\n const proxyIdB = fixtureB.m_proxies[indexB].proxyId;\n const overlap = this.m_broadPhase.testOverlap(proxyIdA, proxyIdB);\n\n // Here we destroy contacts that cease to overlap in the broad-phase.\n if (overlap == false) {\n this.destroyContact(c);\n continue;\n }\n\n // The contact persists.\n c.update(this);\n }\n }\n\n /**\n * @internal\n */\n destroyContact(contact: Contact): void {\n Contact.destroy(contact, this);\n\n // Remove from the world.\n if (contact.m_prev) {\n contact.m_prev.m_next = contact.m_next;\n }\n if (contact.m_next) {\n contact.m_next.m_prev = contact.m_prev;\n }\n if (contact == this.m_contactList) {\n this.m_contactList = contact.m_next;\n }\n\n --this.m_contactCount;\n }\n\n\n /**\n * Called when two fixtures begin to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'begin-contact', listener: (contact: Contact) => void): World;\n /**\n * Called when two fixtures cease to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'end-contact', listener: (contact: Contact) => void): World;\n /**\n * This is called after a contact is updated. This allows you to inspect a\n * contact before it goes to the solver. If you are careful, you can modify the\n * contact manifold (e.g. disable contact). A copy of the old manifold is\n * provided so that you can detect changes. Note: this is called only for awake\n * bodies. Note: this is called even when the number of contact points is zero.\n * Note: this is not called for sensors. Note: if you set the number of contact\n * points to zero, you will not get an endContact callback. However, you may get\n * a beginContact callback the next step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n /**\n * This lets you inspect a contact after the solver is finished. This is useful\n * for inspecting impulses. Note: the contact manifold does not include time of\n * impact impulses, which can be arbitrarily large if the sub-step is small.\n * Hence the impulse is provided explicitly in a separate data structure. Note:\n * this is only called for contacts that are touching, solid, and awake.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n /** Listener is called whenever a body is removed. */\n on(name: 'remove-body', listener: (body: Body) => void): World;\n /** Listener is called whenever a joint is removed implicitly or explicitly. */\n on(name: 'remove-joint', listener: (joint: Joint) => void): World;\n /** Listener is called whenever a fixture is removed implicitly or explicitly. */\n on(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Register an event listener.\n */\n // tslint:disable-next-line:typedef\n on(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n if (!this._listeners) {\n this._listeners = {};\n }\n if (!this._listeners[name]) {\n this._listeners[name] = [];\n }\n this._listeners[name].push(listener);\n return this;\n }\n\n off(name: 'begin-contact', listener: (contact: Contact) => void): World;\n off(name: 'end-contact', listener: (contact: Contact) => void): World;\n off(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n off(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n off(name: 'remove-body', listener: (body: Body) => void): World;\n off(name: 'remove-joint', listener: (joint: Joint) => void): World;\n off(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Remove an event listener.\n */\n // tslint:disable-next-line:typedef\n off(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return this;\n }\n const index = listeners.indexOf(listener);\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n publish(name: string, arg1?: any, arg2?: any, arg3?: any): number {\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return 0;\n }\n for (let l = 0; l < listeners.length; l++) {\n listeners[l].call(this, arg1, arg2, arg3);\n }\n return listeners.length;\n }\n\n /**\n * @internal\n */\n beginContact(contact: Contact): void {\n this.publish('begin-contact', contact);\n }\n\n /**\n * @internal\n */\n endContact(contact: Contact): void {\n this.publish('end-contact', contact);\n }\n\n /**\n * @internal\n */\n preSolve(contact: Contact, oldManifold: Manifold): void {\n this.publish('pre-solve', contact, oldManifold);\n }\n\n /**\n * @internal\n */\n postSolve(contact: Contact, impulse: ContactImpulse): void {\n this.publish('post-solve', contact, impulse);\n }\n\n /**\n * Joints and fixtures are destroyed when their associated body is destroyed.\n * Register a destruction listener so that you may nullify references to these\n * joints and shapes.\n *\n * `function(object)` is called when any joint or fixture is about to\n * be destroyed due to the destruction of one of its attached or parent bodies.\n */\n\n /**\n * Register a contact filter to provide specific control over collision.\n * Otherwise the default filter is used (defaultFilter). The listener is owned\n * by you and must remain in scope.\n *\n * Moved to Fixture.\n */\n}","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class Vec3 {\n x: number;\n y: number;\n z: number;\n\n constructor(x: number, y: number, z: number);\n constructor(obj: { x: number, y: number, z: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?, z?) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Vec3)) {\n return new Vec3(x, y, z);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n this.z = x.z;\n } else {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n _ASSERT && Vec3.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y,\n z: this.z\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = data.x;\n obj.y = data.y;\n obj.z = data.z;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number, z: number): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = x;\n obj.y = y;\n obj.z = z;\n return obj;\n }\n\n static zero(): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = 0;\n obj.y = 0;\n obj.z = 0;\n return obj;\n }\n\n static clone(v: Vec3): Vec3 {\n _ASSERT && Vec3.assert(v);\n return Vec3.neo(v.x, v.y, v.z);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y) && Math.isFinite(obj.z);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Vec3.isValid(o), 'Invalid Vec3!', o);\n }\n\n setZero(): Vec3 {\n this.x = 0.0;\n this.y = 0.0;\n this.z = 0.0;\n return this;\n }\n\n set(x: number, y: number, z: number): Vec3 {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n\n add(w: Vec3): Vec3 {\n this.x += w.x;\n this.y += w.y;\n this.z += w.z;\n return this;\n }\n\n sub(w: Vec3): Vec3 {\n this.x -= w.x;\n this.y -= w.y;\n this.z -= w.z;\n return this;\n }\n\n mul(m: number): Vec3 {\n this.x *= m;\n this.y *= m;\n this.z *= m;\n return this;\n }\n\n static areEqual(v: Vec3, w: Vec3): boolean {\n _ASSERT && Vec3.assert(v);\n _ASSERT && Vec3.assert(w);\n return v === w ||\n typeof v === 'object' && v !== null &&\n typeof w === 'object' && w !== null &&\n v.x === w.x && v.y === w.y && v.z === w.z;\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec3, w: Vec3): number {\n return v.x * w.x + v.y * w.y + v.z * w.z;\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static cross(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(\n v.y * w.z - v.z * w.y,\n v.z * w.x - v.x * w.z,\n v.x * w.y - v.y * w.x\n );\n }\n\n static add(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x + w.x, v.y + w.y, v.z + w.z);\n }\n\n static sub(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x - w.x, v.y - w.y, v.z - w.z);\n }\n\n static mul(v: Vec3, m: number): Vec3 {\n return new Vec3(m * v.x, m * v.y, m * v.z);\n }\n\n neg(): Vec3 {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n }\n\n static neg(v: Vec3): Vec3 {\n return new Vec3(-v.x, -v.y, -v.z);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { AABB, RayCastInput, RayCastOutput } from '../AABB';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A line segment (edge) shape. These can be connected in chains or loops to\n * other edge shapes. The connectivity information is used to ensure correct\n * contact normals.\n */\nexport class EdgeShape extends Shape {\n static TYPE = 'edge' as const;\n m_type: 'edge';\n\n m_radius: number;\n\n // These are the edge vertices\n m_vertex1: Vec2;\n m_vertex2: Vec2;\n\n // Optional adjacent vertices. These are used for smooth collision.\n // Used by chain shape.\n m_vertex0: Vec2;\n m_vertex3: Vec2;\n m_hasVertex0: boolean;\n m_hasVertex3: boolean;\n\n constructor(v1?: Vec2Value, v2?: Vec2Value) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof EdgeShape)) {\n return new EdgeShape(v1, v2);\n }\n\n super();\n\n this.m_type = EdgeShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n\n this.m_vertex1 = v1 ? Vec2.clone(v1) : Vec2.zero();\n this.m_vertex2 = v2 ? Vec2.clone(v2) : Vec2.zero();\n\n this.m_vertex0 = Vec2.zero();\n this.m_vertex3 = Vec2.zero();\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertex1: this.m_vertex1,\n vertex2: this.m_vertex2,\n\n vertex0: this.m_vertex0,\n vertex3: this.m_vertex3,\n hasVertex0: this.m_hasVertex0,\n hasVertex3: this.m_hasVertex3,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): EdgeShape {\n const shape = new EdgeShape(data.vertex1, data.vertex2);\n if (shape.m_hasVertex0) {\n shape.setPrevVertex(data.vertex0);\n }\n if (shape.m_hasVertex3) {\n shape.setNextVertex(data.vertex3);\n }\n return shape;\n }\n\n /** @internal */\n _reset(): void {\n // noop\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getType(): 'edge' {\n return this.m_type;\n }\n\n /** @internal @deprecated */\n setNext(v?: Vec2): EdgeShape {\n return this.setNextVertex(v);\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n setNextVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex3.setVec2(v);\n this.m_hasVertex3 = true;\n } else {\n this.m_vertex3.setZero();\n this.m_hasVertex3 = false;\n }\n return this;\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n getNextVertex(): Vec2 {\n return this.m_vertex3;\n }\n\n /** @internal @deprecated */\n setPrev(v?: Vec2): EdgeShape {\n return this.setPrevVertex(v);\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n setPrevVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex0.setVec2(v);\n this.m_hasVertex0 = true;\n } else {\n this.m_vertex0.setZero();\n this.m_hasVertex0 = false;\n }\n return this;\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n getPrevVertex(): Vec2 {\n return this.m_vertex0;\n }\n\n /**\n * Set this as an isolated edge.\n */\n _set(v1: Vec2, v2: Vec2): EdgeShape {\n this.m_vertex1.setVec2(v1);\n this.m_vertex2.setVec2(v2);\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): EdgeShape {\n const clone = new EdgeShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_vertex1.setVec2(this.m_vertex1);\n clone.m_vertex2.setVec2(this.m_vertex2);\n clone.m_vertex0.setVec2(this.m_vertex0);\n clone.m_vertex3.setVec2(this.m_vertex3);\n clone.m_hasVertex0 = this.m_hasVertex0;\n clone.m_hasVertex3 = this.m_hasVertex3;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // p = p1 + t * d\n // v = v1 + s * e\n // p1 + t * d = v1 + s * e\n // s * e - t * d = p1 - v1\n\n // NOT_USED(childIndex);\n\n // Put the ray into the edge's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n const v1 = this.m_vertex1;\n const v2 = this.m_vertex2;\n const e = Vec2.sub(v2, v1);\n const normal = Vec2.neo(e.y, -e.x);\n normal.normalize();\n\n // q = p1 + t * d\n // dot(normal, q - v1) = 0\n // dot(normal, p1 - v1) + t * dot(normal, d) = 0\n const numerator = Vec2.dot(normal, Vec2.sub(v1, p1));\n const denominator = Vec2.dot(normal, d);\n\n if (denominator == 0.0) {\n return false;\n }\n\n const t = numerator / denominator;\n if (t < 0.0 || input.maxFraction < t) {\n return false;\n }\n\n const q = Vec2.add(p1, Vec2.mulNumVec2(t, d));\n\n // q = v1 + s * r\n // s = dot(q - v1, r) / dot(r, r)\n const r = Vec2.sub(v2, v1);\n const rr = Vec2.dot(r, r);\n if (rr == 0.0) {\n return false;\n }\n\n const s = Vec2.dot(Vec2.sub(q, v1), r) / rr;\n if (s < 0.0 || 1.0 < s) {\n return false;\n }\n\n output.fraction = t;\n if (numerator > 0.0) {\n output.normal = Rot.mulVec2(xf.q, normal).neg();\n } else {\n output.normal = Rot.mulVec2(xf.q, normal);\n }\n return true;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const v1 = Transform.mulVec2(xf, this.m_vertex1);\n const v2 = Transform.mulVec2(xf, this.m_vertex2);\n\n aabb.combinePoints(v1, v2);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center.setCombine(0.5, this.m_vertex1, 0.5, this.m_vertex2);\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_vertex1);\n proxy.m_vertices.push(this.m_vertex2);\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n}\n\nexport const Edge = EdgeShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport { Transform } from '../../common/Transform';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\nimport { EdgeShape } from './EdgeShape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A chain shape is a free form sequence of line segments. The chain has\n * two-sided collision, so you can use inside and outside collision. Therefore,\n * you may use any winding order. Connectivity information is used to create\n * smooth collisions.\n *\n * WARNING: The chain will not collide properly if there are self-intersections.\n */\nexport class ChainShape extends Shape {\n static TYPE = 'chain' as const;\n m_type: 'chain';\n\n m_radius: number;\n\n m_vertices: Vec2[];\n m_count: number;\n m_prevVertex: Vec2 | null;\n m_nextVertex: Vec2 | null;\n m_hasPrevVertex: boolean;\n m_hasNextVertex: boolean;\n\n m_isLoop: boolean;\n\n constructor(vertices?: Vec2Value[], loop?: boolean) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof ChainShape)) {\n return new ChainShape(vertices, loop);\n }\n\n super();\n\n this.m_type = ChainShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_vertices = [];\n this.m_count = 0;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n\n this.m_isLoop = !!loop;\n\n if (vertices && vertices.length) {\n if (loop) {\n this._createLoop(vertices);\n } else {\n this._createChain(vertices);\n }\n }\n }\n\n /** @internal */\n _serialize(): object {\n const data = {\n type: this.m_type,\n vertices: this.m_vertices,\n isLoop: this.m_isLoop,\n hasPrevVertex: this.m_hasPrevVertex,\n hasNextVertex: this.m_hasNextVertex,\n prevVertex: null as Vec2 | null,\n nextVertex: null as Vec2 | null,\n };\n if (this.m_prevVertex) {\n data.prevVertex = this.m_prevVertex;\n }\n if (this.m_nextVertex) {\n data.nextVertex = this.m_nextVertex;\n }\n return data;\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): ChainShape {\n const vertices: Vec2[] = [];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n const shape = new ChainShape(vertices, data.isLoop);\n if (data.prevVertex) {\n shape.setPrevVertex(data.prevVertex);\n }\n if (data.nextVertex) {\n shape.setNextVertex(data.nextVertex);\n }\n return shape;\n }\n\n // clear() {\n // this.m_vertices.length = 0;\n // this.m_count = 0;\n // }\n\n getType(): 'chain' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n /**\n * @internal\n * Create a loop. This automatically adjusts connectivity.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createLoop(vertices: Vec2Value[]): ChainShape {\n _ASSERT && console.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && console.assert(vertices.length >= 3);\n for (let i = 1; i < vertices.length; ++i) {\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n // If the code crashes here, it means your vertices are too close together.\n _ASSERT && console.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_vertices = [];\n this.m_count = vertices.length + 1;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n this.m_vertices[vertices.length] = Vec2.clone(vertices[0]);\n\n this.m_prevVertex = this.m_vertices[this.m_count - 2];\n this.m_nextVertex = this.m_vertices[1];\n this.m_hasPrevVertex = true;\n this.m_hasNextVertex = true;\n return this;\n }\n\n /**\n * @internal\n * Create a chain with isolated end vertices.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createChain(vertices: Vec2Value[]): ChainShape {\n _ASSERT && console.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && console.assert(vertices.length >= 2);\n for (let i = 1; i < vertices.length; ++i) {\n // If the code crashes here, it means your vertices are too close together.\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n _ASSERT && console.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_count = vertices.length;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n return this;\n }\n\n /** @internal */\n _reset(): void {\n if (this.m_isLoop) {\n this._createLoop(this.m_vertices);\n } else {\n this._createChain(this.m_vertices);\n }\n }\n\n /**\n * Establish connectivity to a vertex that precedes the first vertex. Don't call\n * this for loops.\n */\n setPrevVertex(prevVertex: Vec2): void {\n this.m_prevVertex = prevVertex;\n this.m_hasPrevVertex = true;\n }\n\n getPrevVertex(): Vec2 {\n return this.m_prevVertex;\n }\n\n /**\n * Establish connectivity to a vertex that follows the last vertex. Don't call\n * this for loops.\n */\n setNextVertex(nextVertex: Vec2): void {\n this.m_nextVertex = nextVertex;\n this.m_hasNextVertex = true;\n }\n\n getNextVertex(): Vec2 {\n return this.m_nextVertex;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): ChainShape {\n const clone = new ChainShape();\n clone._createChain(this.m_vertices);\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_prevVertex = this.m_prevVertex;\n clone.m_nextVertex = this.m_nextVertex;\n clone.m_hasPrevVertex = this.m_hasPrevVertex;\n clone.m_hasNextVertex = this.m_hasNextVertex;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): number {\n // edge count = vertex count - 1\n return this.m_count - 1;\n }\n\n // Get a child edge.\n getChildEdge(edge: EdgeShape, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count - 1);\n edge.m_type = EdgeShape.TYPE;\n edge.m_radius = this.m_radius;\n\n edge.m_vertex1 = this.m_vertices[childIndex];\n edge.m_vertex2 = this.m_vertices[childIndex + 1];\n\n if (childIndex > 0) {\n edge.m_vertex0 = this.m_vertices[childIndex - 1];\n edge.m_hasVertex0 = true;\n } else {\n edge.m_vertex0 = this.m_prevVertex;\n edge.m_hasVertex0 = this.m_hasPrevVertex;\n }\n\n if (childIndex < this.m_count - 2) {\n edge.m_vertex3 = this.m_vertices[childIndex + 2];\n edge.m_hasVertex3 = true;\n } else {\n edge.m_vertex3 = this.m_nextVertex;\n edge.m_hasVertex3 = this.m_hasNextVertex;\n }\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index <= this.m_count);\n if (index < this.m_count) {\n return this.m_vertices[index];\n } else {\n return this.m_vertices[0];\n }\n }\n\n isLoop(): boolean {\n return this.m_isLoop;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * This always return false.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n\n const edgeShape = new EdgeShape(this.getVertex(childIndex), this.getVertex(childIndex + 1));\n return edgeShape.rayCast(output, input, xf, 0);\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n\n const v1 = Transform.mulVec2(xf, this.getVertex(childIndex));\n const v2 = Transform.mulVec2(xf, this.getVertex(childIndex + 1));\n\n aabb.combinePoints(v1, v2);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * Chains have zero mass.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center = Vec2.zero();\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n proxy.m_buffer[0] = this.getVertex(childIndex);\n proxy.m_buffer[1] = this.getVertex(childIndex + 1);\n proxy.m_vertices = proxy.m_buffer;\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n}\n\nexport const Chain = ChainShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A convex polygon. It is assumed that the interior of the polygon is to the\n * left of each edge. Polygons have a maximum number of vertices equal to\n * Settings.maxPolygonVertices. In most cases you should not need many vertices\n * for a convex polygon. extends Shape\n */\nexport class PolygonShape extends Shape {\n static TYPE = 'polygon' as const;\n m_type: 'polygon';\n\n m_centroid: Vec2;\n m_vertices: Vec2[]; // [Settings.maxPolygonVertices]\n m_normals: Vec2[]; // [Settings.maxPolygonVertices]\n m_count: number;\n m_radius: number;\n\n // @ts-ignore\n constructor(vertices?: Vec2Value[]) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PolygonShape)) {\n return new PolygonShape(vertices);\n }\n\n super();\n\n this.m_type = PolygonShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_centroid = Vec2.zero();\n this.m_vertices = [];\n this.m_normals = [];\n this.m_count = 0;\n\n if (vertices && vertices.length) {\n this._set(vertices);\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertices: this.m_vertices,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): PolygonShape {\n const vertices: Vec2[] = [];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n\n const shape = new PolygonShape(vertices);\n return shape;\n }\n\n getType(): 'polygon' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): PolygonShape {\n const clone = new PolygonShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_count = this.m_count;\n clone.m_centroid.setVec2(this.m_centroid);\n for (let i = 0; i < this.m_count; i++) {\n clone.m_vertices.push(this.m_vertices[i].clone());\n }\n for (let i = 0; i < this.m_normals.length; i++) {\n clone.m_normals.push(this.m_normals[i].clone());\n }\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /** @internal */\n _reset(): void {\n this._set(this.m_vertices);\n }\n\n /**\n * @internal\n *\n * Create a convex hull from the given array of local points. The count must be\n * in the range [3, Settings.maxPolygonVertices].\n *\n * Warning: the points may be re-ordered, even if they form a convex polygon\n * Warning: collinear points are handled but not removed. Collinear points may\n * lead to poor stacking behavior.\n */\n _set(vertices: Vec2Value[]): void {\n _ASSERT && console.assert(3 <= vertices.length && vertices.length <= Settings.maxPolygonVertices);\n if (vertices.length < 3) {\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n let n = Math.min(vertices.length, Settings.maxPolygonVertices);\n\n // Perform welding and copy vertices into local buffer.\n const ps: Vec2[] = []; // [Settings.maxPolygonVertices];\n for (let i = 0; i < n; ++i) {\n const v = vertices[i];\n\n let unique = true;\n for (let j = 0; j < ps.length; ++j) {\n if (Vec2.distanceSquared(v, ps[j]) < 0.25 * Settings.linearSlopSquared) {\n unique = false;\n break;\n }\n }\n\n if (unique) {\n ps.push(Vec2.clone(v));\n }\n }\n\n n = ps.length;\n if (n < 3) {\n // Polygon is degenerate.\n _ASSERT && console.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n // Create the convex hull using the Gift wrapping algorithm\n // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm\n\n // Find the right most point on the hull (in case of multiple points bottom most is used)\n let i0 = 0;\n let x0 = ps[0].x;\n for (let i = 1; i < n; ++i) {\n const x = ps[i].x;\n if (x > x0 || (x === x0 && ps[i].y < ps[i0].y)) {\n i0 = i;\n x0 = x;\n }\n }\n\n const hull = [] as number[]; // [Settings.maxPolygonVertices];\n let m = 0;\n let ih = i0;\n\n while (true) {\n hull[m] = ih;\n\n let ie = 0;\n for (let j = 1; j < n; ++j) {\n if (ie === ih) {\n ie = j;\n continue;\n }\n\n const r = Vec2.sub(ps[ie], ps[hull[m]]);\n const v = Vec2.sub(ps[j], ps[hull[m]]);\n const c = Vec2.crossVec2Vec2(r, v);\n // c < 0 means counter-clockwise wrapping, c > 0 means clockwise wrapping\n if (c < 0.0) {\n ie = j;\n }\n\n // Collinearity check\n if (c === 0.0 && v.lengthSquared() > r.lengthSquared()) {\n ie = j;\n }\n }\n\n ++m;\n ih = ie;\n\n if (ie === i0) {\n break;\n }\n }\n\n if (m < 3) {\n // Polygon is degenerate.\n _ASSERT && console.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n this.m_count = m;\n\n // Copy vertices.\n this.m_vertices = [];\n for (let i = 0; i < m; ++i) {\n this.m_vertices[i] = ps[hull[i]];\n }\n\n // Compute normals. Ensure the edges have non-zero length.\n for (let i = 0; i < m; ++i) {\n const i1 = i;\n const i2 = i + 1 < m ? i + 1 : 0;\n const edge = Vec2.sub(this.m_vertices[i2], this.m_vertices[i1]);\n _ASSERT && console.assert(edge.lengthSquared() > Math.EPSILON * Math.EPSILON);\n this.m_normals[i] = Vec2.crossVec2Num(edge, 1.0);\n this.m_normals[i].normalize();\n }\n\n // Compute the polygon centroid.\n this.m_centroid = ComputeCentroid(this.m_vertices, m);\n }\n\n /** @internal */\n _setAsBox(hx: number, hy: number, center?: Vec2Value, angle?: number): void {\n // start with right-bottom, counter-clockwise, as in Gift wrapping algorithm in PolygonShape._set()\n this.m_vertices[0] = Vec2.neo(hx, -hy);\n this.m_vertices[1] = Vec2.neo(hx, hy);\n this.m_vertices[2] = Vec2.neo(-hx, hy);\n this.m_vertices[3] = Vec2.neo(-hx, -hy);\n\n this.m_normals[0] = Vec2.neo(1.0, 0.0);\n this.m_normals[1] = Vec2.neo(0.0, 1.0);\n this.m_normals[2] = Vec2.neo(-1.0, 0.0);\n this.m_normals[3] = Vec2.neo(0.0, -1.0);\n\n this.m_count = 4;\n\n if (Vec2.isValid(center)) {\n angle = angle || 0;\n\n this.m_centroid.setVec2(center);\n\n const xf = Transform.identity();\n xf.p.setVec2(center);\n xf.q.setAngle(angle);\n\n // Transform vertices and normals.\n for (let i = 0; i < this.m_count; ++i) {\n this.m_vertices[i] = Transform.mulVec2(xf, this.m_vertices[i]);\n this.m_normals[i] = Rot.mulVec2(xf.q, this.m_normals[i]);\n }\n }\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): boolean {\n const pLocal = Rot.mulTVec2(xf.q, Vec2.sub(p, xf.p));\n\n for (let i = 0; i < this.m_count; ++i) {\n const dot = Vec2.dot(this.m_normals[i], Vec2.sub(pLocal, this.m_vertices[i]));\n if (dot > 0.0) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n\n // Put the ray into the polygon's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n let lower = 0.0;\n let upper = input.maxFraction;\n\n let index = -1;\n\n for (let i = 0; i < this.m_count; ++i) {\n // p = p1 + a * d\n // dot(normal, p - v) = 0\n // dot(normal, p1 - v) + a * dot(normal, d) = 0\n const numerator = Vec2.dot(this.m_normals[i], Vec2.sub(this.m_vertices[i], p1));\n const denominator = Vec2.dot(this.m_normals[i], d);\n\n if (denominator == 0.0) {\n if (numerator < 0.0) {\n return false;\n }\n } else {\n // Note: we want this predicate without division:\n // lower < numerator / denominator, where denominator < 0\n // Since denominator < 0, we have to flip the inequality:\n // lower < numerator / denominator <==> denominator * lower > numerator.\n if (denominator < 0.0 && numerator < lower * denominator) {\n // Increase lower.\n // The segment enters this half-space.\n lower = numerator / denominator;\n index = i;\n } else if (denominator > 0.0 && numerator < upper * denominator) {\n // Decrease upper.\n // The segment exits this half-space.\n upper = numerator / denominator;\n }\n }\n\n // The use of epsilon here causes the assert on lower to trip\n // in some cases. Apparently the use of epsilon was to make edge\n // shapes work, but now those are handled separately.\n // if (upper < lower - Math.EPSILON)\n if (upper < lower) {\n return false;\n }\n }\n\n _ASSERT && console.assert(0.0 <= lower && lower <= input.maxFraction);\n\n if (index >= 0) {\n output.fraction = lower;\n output.normal = Rot.mulVec2(xf.q, this.m_normals[index]);\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < this.m_count; ++i) {\n const v = Transform.mulVec2(xf, this.m_vertices[i]);\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, v.y);\n maxY = Math.max(maxY, v.y);\n }\n\n aabb.lowerBound.setNum(minX, minY);\n aabb.upperBound.setNum(maxX, maxY);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n // Polygon mass, centroid, and inertia.\n // Let rho be the polygon density in mass per unit area.\n // Then:\n // mass = rho * int(dA)\n // centroid.x = (1/mass) * rho * int(x * dA)\n // centroid.y = (1/mass) * rho * int(y * dA)\n // I = rho * int((x*x + y*y) * dA)\n //\n // We can compute these integrals by summing all the integrals\n // for each triangle of the polygon. To evaluate the integral\n // for a single triangle, we make a change of variables to\n // the (u,v) coordinates of the triangle:\n // x = x0 + e1x * u + e2x * v\n // y = y0 + e1y * u + e2y * v\n // where 0 <= u && 0 <= v && u + v <= 1.\n //\n // We integrate u from [0,1-v] and then v from [0,1].\n // We also need to use the Jacobian of the transformation:\n // D = cross(e1, e2)\n //\n // Simplification: triangle centroid = (1/3) * (p1 + p2 + p3)\n //\n // The rest of the derivation is handled by computer algebra.\n\n _ASSERT && console.assert(this.m_count >= 3);\n\n const center = Vec2.zero();\n let area = 0.0;\n let I = 0.0;\n\n // s is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const s = Vec2.zero();\n\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < this.m_count; ++i) {\n s.add(this.m_vertices[i]);\n }\n s.mul(1.0 / this.m_count);\n\n const k_inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < this.m_count; ++i) {\n // Triangle vertices.\n const e1 = Vec2.sub(this.m_vertices[i], s);\n const e2 = i + 1 < this.m_count ? Vec2.sub(this.m_vertices[i + 1], s) : Vec2 .sub(this.m_vertices[0], s);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n center.addCombine(triangleArea * k_inv3, e1, triangleArea * k_inv3, e2);\n\n const ex1 = e1.x;\n const ey1 = e1.y;\n const ex2 = e2.x;\n const ey2 = e2.y;\n\n const intx2 = ex1 * ex1 + ex2 * ex1 + ex2 * ex2;\n const inty2 = ey1 * ey1 + ey2 * ey1 + ey2 * ey2;\n\n I += (0.25 * k_inv3 * D) * (intx2 + inty2);\n }\n\n // Total mass\n massData.mass = density * area;\n\n // Center of mass\n _ASSERT && console.assert(area > Math.EPSILON);\n center.mul(1.0 / area);\n massData.center.setCombine(1, center, 1, s);\n\n // Inertia tensor relative to the local origin (point s).\n massData.I = density * I;\n\n // Shift to center of mass then to original body origin.\n massData.I += massData.mass * (Vec2.dot(massData.center, massData.center) - Vec2.dot(center, center));\n }\n\n /**\n * Validate convexity. This is a very time consuming operation.\n * @returns true if valid\n */\n validate(): boolean {\n for (let i = 0; i < this.m_count; ++i) {\n const i1 = i;\n const i2 = i < this.m_count - 1 ? i1 + 1 : 0;\n const p = this.m_vertices[i1];\n const e = Vec2.sub(this.m_vertices[i2], p);\n\n for (let j = 0; j < this.m_count; ++j) {\n if (j == i1 || j == i2) {\n continue;\n }\n\n const v = Vec2.sub(this.m_vertices[j], p);\n const c = Vec2.crossVec2Vec2(e, v);\n if (c < 0.0) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices = this.m_vertices;\n proxy.m_count = this.m_count;\n proxy.m_radius = this.m_radius;\n }\n}\n\nfunction ComputeCentroid(vs: Vec2[], count: number): Vec2 {\n _ASSERT && console.assert(count >= 3);\n\n const c = Vec2.zero();\n let area = 0.0;\n\n // pRef is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const pRef = Vec2.zero();\n if (false) {\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < count; ++i) {\n pRef.add(vs[i]);\n }\n pRef.mul(1.0 / count);\n }\n\n const inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < count; ++i) {\n // Triangle vertices.\n const p1 = pRef;\n const p2 = vs[i];\n const p3 = i + 1 < count ? vs[i + 1] : vs[0];\n\n const e1 = Vec2.sub(p2, p1);\n const e2 = Vec2.sub(p3, p1);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n c.addMul(triangleArea * inv3, p1);\n c.addMul(triangleArea * inv3, p2);\n c.addMul(triangleArea * inv3, p3);\n }\n\n // Centroid\n _ASSERT && console.assert(area > Math.EPSILON);\n c.mul(1.0 / area);\n return c;\n}\n\nexport const Polygon = PolygonShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { Vec2Value } from '../../common/Vec2';\nimport { PolygonShape } from './PolygonShape';\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A rectangle polygon which extend PolygonShape.\n */\nexport class BoxShape extends PolygonShape {\n static TYPE = 'polygon' as const;\n\n constructor(hx: number, hy: number, center?: Vec2Value, angle?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof BoxShape)) {\n return new BoxShape(hx, hy, center, angle);\n }\n\n super();\n\n this._setAsBox(hx, hy, center, angle);\n }\n}\n\nexport const Box = BoxShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Shape } from '../Shape';\nimport { AABB, RayCastInput, RayCastOutput } from '../AABB';\nimport { Transform } from '../../common/Transform';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class CircleShape extends Shape {\n static TYPE = 'circle' as const;\n m_type: 'circle';\n\n m_p: Vec2;\n m_radius: number;\n\n constructor(position: Vec2Value, radius?: number);\n constructor(radius?: number);\n // tslint:disable-next-line:typedef\n constructor(a, b?) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof CircleShape)) {\n return new CircleShape(a, b);\n }\n\n super();\n\n this.m_type = CircleShape.TYPE;\n this.m_p = Vec2.zero();\n this.m_radius = 1;\n\n if (typeof a === 'object' && Vec2.isValid(a)) {\n this.m_p.setVec2(a);\n\n if (typeof b === 'number') {\n this.m_radius = b;\n }\n\n } else if (typeof a === 'number') {\n this.m_radius = a;\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n p: this.m_p,\n radius: this.m_radius,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): CircleShape {\n return new CircleShape(data.p, data.radius);\n }\n\n /** @internal */\n _reset(): void {\n // noop\n }\n\n getType(): 'circle' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getCenter(): Vec2 {\n return this.m_p;\n }\n\n getVertex(index: 0): Vec2 {\n _ASSERT && console.assert(index == 0);\n return this.m_p;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): CircleShape {\n const clone = new CircleShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_p = this.m_p.clone();\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): boolean {\n const center = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const d = Vec2.sub(p, center);\n return Vec2.dot(d, d) <= this.m_radius * this.m_radius;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // Collision Detection in Interactive 3D Environments by Gino van den Bergen\n // From Section 3.1.2\n // x = s + a * r\n // norm(x) = radius\n\n const position = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const s = Vec2.sub(input.p1, position);\n const b = Vec2.dot(s, s) - this.m_radius * this.m_radius;\n\n // Solve quadratic equation.\n const r = Vec2.sub(input.p2, input.p1);\n const c = Vec2.dot(s, r);\n const rr = Vec2.dot(r, r);\n const sigma = c * c - rr * b;\n\n // Check for negative discriminant and short segment.\n if (sigma < 0.0 || rr < Math.EPSILON) {\n return false;\n }\n\n // Find the point of intersection of the line with the circle.\n let a = -(c + Math.sqrt(sigma));\n\n // Is the intersection point on the segment?\n if (0.0 <= a && a <= input.maxFraction * rr) {\n a /= rr;\n output.fraction = a;\n output.normal = Vec2.add(s, Vec2.mulNumVec2(a, r));\n output.normal.normalize();\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const p = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n aabb.lowerBound.setNum(p.x - this.m_radius, p.y - this.m_radius);\n aabb.upperBound.setNum(p.x + this.m_radius, p.y + this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n massData.mass = density * Math.PI * this.m_radius * this.m_radius;\n massData.center = this.m_p;\n // inertia about the local origin\n massData.I = massData.mass\n * (0.5 * this.m_radius * this.m_radius + Vec2.dot(this.m_p, this.m_p));\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_p);\n proxy.m_count = 1;\n proxy.m_radius = this.m_radius;\n }\n\n}\n\nexport const Circle = CircleShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. A value of 0 disables softness.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * Distance length.\n */\n length?: number;\n}\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointDef extends JointDef, DistanceJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0\n};\n\n/**\n * A distance joint constrains two points on two bodies to remain at a fixed\n * distance from each other. You can view this as a massless, rigid rod.\n *\n * @param anchorA Anchor A in global coordination.\n * @param anchorB Anchor B in global coordination.\n */\nexport class DistanceJoint extends Joint {\n static TYPE = 'distance-joint' as const;\n\n // Solver shared\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_length: number;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_gamma: number;\n /** @internal */ m_bias: number;\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: DistanceJointDef);\n constructor(def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2);\n constructor(def: DistanceJointDef, bodyA?: Body, bodyB?: Body, anchorA?: Vec2, anchorB?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof DistanceJoint)) {\n return new DistanceJoint(def, bodyA, bodyB, anchorA, anchorB);\n }\n\n // order of constructor arguments is changed in v0.2\n if (bodyB && anchorA && ('m_type' in anchorA) && ('x' in bodyB) && ('y' in bodyB)) {\n const temp = bodyB;\n bodyB = anchorA as any as Body;\n anchorA = temp as any as Vec2;\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = DistanceJoint.TYPE;\n\n // Solver shared\n this.m_localAnchorA = Vec2.clone(anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.zero());\n this.m_length = Math.isFinite(def.length) ? def.length :\n Vec2.distance(bodyA.getWorldPoint(this.m_localAnchorA), bodyB.getWorldPoint(this.m_localAnchorB));\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n this.m_impulse = 0.0;\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n\n // 1-D constrained system\n // m (v2 - v1) = lambda\n // v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass.\n // x2 = x1 + h * v2\n\n // 1-D mass-damper-spring system\n // m (v2 - v1) + h * d * v2 + h * k *\n\n // C = norm(p2 - p1) - L\n // u = (p2 - p1) / norm(p2 - p1)\n // Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1))\n // J = [-u -cross(r1, u) u cross(r2, u)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n length: this.m_length,\n\n impulse: this.m_impulse,\n gamma: this.m_gamma,\n bias: this.m_bias,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): DistanceJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new DistanceJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n length?: number,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.length > 0) {\n this.m_length = +def.length;\n } else if (def.length < 0) { // don't change length\n } else if (def.anchorA || def.anchorA || def.anchorA || def.anchorA) {\n this.m_length = Vec2.distance(\n this.m_bodyA.getWorldPoint(this.m_localAnchorA),\n this.m_bodyB.getWorldPoint(this.m_localAnchorB)\n );\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the natural length. Manipulating the length can lead to non-physical\n * behavior when the frequency is zero.\n */\n setLength(length: number): void {\n this.m_length = length;\n }\n\n /**\n * Get the natural length.\n */\n getLength(): number {\n return this.m_length;\n }\n\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n this.m_u = Vec2.sub(Vec2.add(cB, this.m_rB), Vec2.add(cA, this.m_rA));\n\n // Handle singularity.\n const length = this.m_u.length();\n if (length > Settings.linearSlop) {\n this.m_u.mul(1.0 / length);\n } else {\n this.m_u.setNum(0.0, 0.0);\n }\n\n const crAu = Vec2.crossVec2Vec2(this.m_rA, this.m_u);\n const crBu = Vec2.crossVec2Vec2(this.m_rB, this.m_u);\n let invMass = this.m_invMassA + this.m_invIA * crAu * crAu + this.m_invMassB\n + this.m_invIB * crBu * crBu;\n\n // Compute the effective mass matrix.\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (this.m_frequencyHz > 0.0) {\n const C = length - this.m_length;\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * this.m_mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = this.m_mass * omega * omega;\n\n // magic formulas\n const h = step.dt;\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invMass += this.m_gamma;\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n } else {\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n const Cdot = Vec2.dot(this.m_u, vpB) - Vec2.dot(this.m_u, vpA);\n\n const impulse = -this.m_mass\n * (Cdot + this.m_bias + this.m_gamma * this.m_impulse);\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u);\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n if (this.m_frequencyHz > 0.0) {\n // There is no position correction for soft distance constraints.\n return true;\n }\n\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA));\n\n const length = u.normalize();\n let C = length - this.m_length;\n C = Math\n .clamp(C, -Settings.maxLinearCorrection, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C;\n const P = Vec2.mulNumVec2(impulse, u);\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointOpt extends JointOpt {\n /**\n * The maximum friction force in N.\n */\n maxForce?: number;\n /**\n * The maximum friction torque in N-m.\n */\n maxTorque?: number;\n}\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointDef extends JointDef, FrictionJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n maxTorque : 0.0,\n};\n\n/**\n * Friction joint. This is used for top-down friction. It provides 2D\n * translational friction and angular friction.\n *\n * @param anchor Anchor in global coordination.\n */\nexport class FrictionJoint extends Joint {\n static TYPE = 'friction-joint' as const;\n\n /** @internal */ m_type: 'friction-joint';\n\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n // Solver shared\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: FrictionJointDef);\n constructor(def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: FrictionJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof FrictionJoint)) {\n return new FrictionJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = FrictionJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n\n // Solver shared\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): FrictionJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new FrictionJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && console.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && console.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y\n * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x\n * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt; // float\n\n // Solve angular friction\n {\n const Cdot = wB - wA; // float\n let impulse = -this.m_angularMass * Cdot; // float\n\n const oldImpulse = this.m_angularImpulse; // float\n const maxImpulse = h * this.m_maxTorque; // float\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)), Vec2.add(vA,\n Vec2.crossNumVec2(wA, this.m_rA))); // Vec2\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); // Vec2\n const oldImpulse = this.m_linearImpulse; // Vec2\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce; // float\n\n if (this.m_linearImpulse.lengthSquared() > maxImpulse * maxImpulse) {\n this.m_linearImpulse.normalize();\n this.m_linearImpulse.mul(maxImpulse);\n }\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from './Vec2';\nimport { Vec3 } from './Vec3';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 3-by-3 matrix. Stored in column-major order.\n */\nexport class Mat33 {\n ex: Vec3;\n ey: Vec3;\n ez: Vec3;\n\n constructor(a: Vec3, b: Vec3, c: Vec3);\n constructor();\n constructor(a?: Vec3, b?: Vec3, c?: Vec3) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec3.clone(a);\n this.ey = Vec3.clone(b);\n this.ez = Vec3.clone(c);\n } else {\n this.ex = Vec3.zero();\n this.ey = Vec3.zero();\n this.ez = Vec3.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec3.isValid(obj.ex) && Vec3.isValid(obj.ey) && Vec3.isValid(obj.ez);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Mat33.isValid(o), 'Invalid Mat33!', o);\n }\n\n /**\n * Set this matrix to all zeros.\n */\n setZero(): Mat33 {\n this.ex.setZero();\n this.ey.setZero();\n this.ez.setZero();\n return this;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve33(v: Vec3): Vec3 {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = new Vec3();\n r.x = det * Vec3.dot(v, Vec3.cross(this.ey, this.ez));\n r.y = det * Vec3.dot(this.ex, Vec3.cross(v, this.ez));\n r.z = det * Vec3.dot(this.ex, Vec3.cross(this.ey, v));\n return r;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix\n * equation.\n */\n solve22(v: Vec2): Vec2 {\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a21 = this.ex.y;\n const a22 = this.ey.y;\n let det = a11 * a22 - a12 * a21;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = Vec2.zero();\n r.x = det * (a22 * v.x - a12 * v.y);\n r.y = det * (a11 * v.y - a21 * v.x);\n return r;\n }\n\n /**\n * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if\n * singular.\n */\n getInverse22(M: Mat33): void {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n M.ex.x = det * d;\n M.ey.x = -det * b;\n M.ex.z = 0.0;\n M.ex.y = -det * c;\n M.ey.y = det * a;\n M.ey.z = 0.0;\n M.ez.x = 0.0;\n M.ez.y = 0.0;\n M.ez.z = 0.0;\n }\n\n /**\n * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix\n * if singular.\n */\n getSymInverse33(M: Mat33): void {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a13 = this.ez.x;\n const a22 = this.ey.y;\n const a23 = this.ez.y;\n const a33 = this.ez.z;\n\n M.ex.x = det * (a22 * a33 - a23 * a23);\n M.ex.y = det * (a13 * a23 - a12 * a33);\n M.ex.z = det * (a12 * a23 - a13 * a22);\n\n M.ey.x = M.ex.y;\n M.ey.y = det * (a11 * a33 - a13 * a13);\n M.ey.z = det * (a13 * a12 - a11 * a23);\n\n M.ez.x = M.ex.z;\n M.ez.y = M.ey.z;\n M.ez.z = det * (a11 * a22 - a12 * a12);\n }\n\n /**\n * Multiply a matrix times a vector.\n */\n static mul(a: Mat33, b: Vec2): Vec2;\n static mul(a: Mat33, b: Vec3): Vec3;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n _ASSERT && Mat33.assert(a);\n if (b && 'z' in b && 'y' in b && 'x' in b) {\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n\n } else if (b && 'y' in b && 'x' in b) {\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulVec3(a: Mat33, b: Vec3): Vec3 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n }\n\n static mulVec2(a: Mat33, b: Vec2): Vec2 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n static add(a: Mat33, b: Mat33): Mat33 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Mat33.assert(b);\n return new Mat33(\n Vec3.add(a.ex, b.ex),\n Vec3.add(a.ey, b.ey),\n Vec3.add(a.ez, b.ez)\n );\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat22 } from '../../common/Mat22';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointOpt extends JointOpt {\n /**\n * The lower angle for the joint limit (radians).\n */\n lowerAngle?: number;\n /**\n * The upper angle for the joint limit (radians).\n */\n upperAngle?: number;\n /**\n * The maximum motor torque used to achieve the desired motor speed. Usually\n * in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed. Usually in radians per second.\n */\n motorSpeed?: number;\n /**\n * A flag to enable joint limits.\n */\n enableLimit?: boolean;\n /**\n * A flag to enable the joint motor.\n */\n enableMotor?: boolean;\n}\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointDef extends JointDef, RevoluteJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n lowerAngle : 0.0,\n upperAngle : 0.0,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n enableLimit : false,\n enableMotor : false\n};\n\n/**\n * A revolute joint constrains two bodies to share a common point while they are\n * free to rotate about the point. The relative rotation about the shared point\n * is the joint angle. You can limit the relative rotation with a joint limit\n * that specifies a lower and upper angle. You can use a motor to drive the\n * relative rotation about the shared point. A maximum motor torque is provided\n * so that infinite forces are not generated.\n */\nexport class RevoluteJoint extends Joint {\n static TYPE = 'revolute-joint' as const;\n\n /** @internal */ m_type: 'revolute-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerAngle: number;\n /** @internal */ m_upperAngle: number;\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n // effective mass for point-to-point constraint.\n /** @internal */ m_mass: Mat33 = new Mat33();\n // effective mass for motor/limit angular constraint.\n /** @internal */ m_motorMass: number;\n /** @internal */ m_limitState: number = inactiveLimit; // TODO enum\n\n constructor(def: RevoluteJointDef);\n constructor(def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n // @ts-ignore\n constructor(def: RevoluteJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof RevoluteJoint)) {\n return new RevoluteJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RevoluteJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorImpulse = 0.0;\n\n this.m_lowerAngle = def.lowerAngle;\n this.m_upperAngle = def.upperAngle;\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Motor constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerAngle: this.m_lowerAngle,\n upperAngle: this.m_upperAngle,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any):RevoluteJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RevoluteJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle in radians.\n */\n getJointAngle(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle speed in radians per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_angularVelocity - bA.m_angularVelocity;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Get the current motor torque given the inverse time step. Unit is N*m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set the motor speed in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set the maximum motor torque, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit in radians.\n */\n getLowerLimit(): number {\n return this.m_lowerAngle;\n }\n\n /**\n * Get the upper joint limit in radians.\n */\n getUpperLimit(): number {\n return this.m_upperAngle;\n }\n\n /**\n * Set the joint limits in radians.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && console.assert(lower <= upper);\n\n if (lower != this.m_lowerAngle || upper != this.m_upperAngle) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_impulse.z = 0.0;\n this.m_lowerAngle = lower;\n this.m_upperAngle = upper;\n }\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force given the inverse time step. Unit is N.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque due to the joint limit given the inverse time step.\n * Unit is N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n this.m_mass.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y\n * this.m_rB.y * iB;\n this.m_mass.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y\n * this.m_rB.x * iB;\n this.m_mass.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n this.m_mass.ex.y = this.m_mass.ey.x;\n this.m_mass.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x\n * this.m_rB.x * iB;\n this.m_mass.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n this.m_mass.ex.z = this.m_mass.ez.x;\n this.m_mass.ey.z = this.m_mass.ez.y;\n this.m_mass.ez.z = iA + iB;\n\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n\n if (this.m_enableMotor == false || fixedRotation) {\n this.m_motorImpulse = 0.0;\n }\n\n if (this.m_enableLimit && fixedRotation == false) {\n const jointAngle = aB - aA - this.m_referenceAngle; // float\n\n if (Math.abs(this.m_upperAngle - this.m_lowerAngle) < 2.0 * Settings.angularSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointAngle <= this.m_lowerAngle) {\n if (this.m_limitState != atLowerLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atLowerLimit;\n\n } else if (jointAngle >= this.m_upperAngle) {\n if (this.m_limitState != atUpperLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atUpperLimit;\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_motorImpulse + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_motorImpulse + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n // Solve motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits\n && fixedRotation == false) {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const impulse = Vec3.neg(this.m_mass.solve33(Cdot)); // Vec3\n\n if (this.m_limitState == equalLimits) {\n this.m_impulse.add(impulse);\n\n } else if (this.m_limitState == atLowerLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse < 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n\n } else if (this.m_limitState == atUpperLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse > 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n\n } else {\n // Solve point-to-point constraint\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const impulse = this.m_mass.solve22(Vec2.neg(Cdot)); // Vec2\n\n this.m_impulse.x += impulse.x;\n this.m_impulse.y += impulse.y;\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n let angularError = 0.0; // float\n let positionError = 0.0; // float\n\n const fixedRotation = (this.m_invIA + this.m_invIB == 0.0); // bool\n\n // Solve angular limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const angle = aB - aA - this.m_referenceAngle; // float\n let limitImpulse = 0.0; // float\n\n if (this.m_limitState == equalLimits) {\n // Prevent large angular corrections\n const C = Math.clamp(angle - this.m_lowerAngle,\n -Settings.maxAngularCorrection, Settings.maxAngularCorrection); // float\n limitImpulse = -this.m_motorMass * C;\n angularError = Math.abs(C);\n\n } else if (this.m_limitState == atLowerLimit) {\n let C = angle - this.m_lowerAngle; // float\n angularError = -C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C + Settings.angularSlop, -Settings.maxAngularCorrection,\n 0.0);\n limitImpulse = -this.m_motorMass * C;\n\n } else if (this.m_limitState == atUpperLimit) {\n let C = angle - this.m_upperAngle; // float\n angularError = C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C - Settings.angularSlop, 0.0,\n Settings.maxAngularCorrection);\n limitImpulse = -this.m_motorMass * C;\n }\n\n aA -= this.m_invIA * limitImpulse;\n aB += this.m_invIB * limitImpulse;\n }\n\n // Solve point-to-point constraint.\n {\n qA.setAngle(aA);\n qB.setAngle(aB);\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n\n const C = Vec2.zero();\n C.addCombine(1, cB, 1, rB);\n C.subCombine(1, cA, 1, rA);\n positionError = C.length();\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y;\n K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x;\n\n const impulse = Vec2.neg(K.solve(C)); // Vec2\n\n cA.subMul(mA, impulse);\n aA -= iA * Vec2.crossVec2Vec2(rA, impulse);\n\n cB.addMul(mB, impulse);\n aB += iB * Vec2.crossVec2Vec2(rB, impulse);\n }\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat22 } from '../../common/Mat22';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointOpt extends JointOpt {\n /**\n * Enable/disable the joint limit.\n */\n enableLimit?: boolean;\n /**\n * The lower translation limit, usually in meters.\n */\n lowerTranslation?: number;\n /**\n * The upper translation limit, usually in meters.\n */\n upperTranslation?: number;\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorForce?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n}\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointDef extends JointDef, PrismaticJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation unit axis in bodyA.\n */\n localAxisA: Vec2;\n /**\n * referenceAngle The constrained angle between the bodies:\n * bodyB_angle - bodyA_angle.\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n enableLimit : false,\n lowerTranslation : 0.0,\n upperTranslation : 0.0,\n enableMotor : false,\n maxMotorForce : 0.0,\n motorSpeed : 0.0\n};\n\n/**\n * A prismatic joint. This joint provides one degree of freedom: translation\n * along an axis fixed in bodyA. Relative rotation is prevented. You can use a\n * joint limit to restrict the range of motion and a joint motor to drive the\n * motion or to model joint friction.\n */\nexport class PrismaticJoint extends Joint {\n static TYPE = 'prismatic-joint' as const;\n\n /** @internal */ m_type: 'prismatic-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerTranslation: number;\n /** @internal */ m_upperTranslation: number;\n /** @internal */ m_maxMotorForce: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n /** @internal */ m_limitState: number; // TODO enum\n /** @internal */ m_axis: Vec2;\n /** @internal */ m_perp: Vec2;\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_s1: number;\n /** @internal */ m_s2: number;\n /** @internal */ m_a1: number;\n /** @internal */ m_a2: number;\n /** @internal */ m_K: Mat33;\n\n constructor(def: PrismaticJointDef);\n constructor(def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n constructor(def: PrismaticJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PrismaticJoint)) {\n return new PrismaticJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PrismaticJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || Vec2.neo(1.0, 0.0));\n this.m_localXAxisA.normalize();\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n\n this.m_lowerTranslation = def.lowerTranslation;\n this.m_upperTranslation = def.upperTranslation;\n this.m_maxMotorForce = def.maxMotorForce;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n this.m_limitState = inactiveLimit;\n\n this.m_axis = Vec2.zero();\n this.m_perp = Vec2.zero();\n\n this.m_K = new Mat33();\n\n // Linear constraint (point-to-line)\n // d = p2 - p1 = x2 + r2 - x1 - r1\n // C = dot(perp, d)\n // Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 -\n // cross(w1, r1))\n // = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) +\n // dot(cross(r2, perp), v2)\n // J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)]\n //\n // Angular constraint\n // C = a2 - a1 + a_initial\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n //\n // K = J * invM * JT\n //\n // J = [-a -s1 a s2]\n // [0 -1 0 1]\n // a = perp\n // s1 = cross(d + r1, a) = cross(p2 - x1, a)\n // s2 = cross(r2, a) = cross(p2 - x2, a)\n\n // Motor/Limit linear constraint\n // C = dot(ax1, d)\n // Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) +\n // dot(cross(r2, ax1), v2)\n // J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)]\n\n // Block Solver\n // We develop a block solver that includes the joint limit. This makes the\n // limit stiff (inelastic) even\n // when the mass has poor distribution (leading to large torques about the\n // joint anchor points).\n //\n // The Jacobian has 3 rows:\n // J = [-uT -s1 uT s2] // linear\n // [0 -1 0 1] // angular\n // [-vT -a1 vT a2] // limit\n //\n // u = perp\n // v = axis\n // s1 = cross(d + r1, u), s2 = cross(r2, u)\n // a1 = cross(d + r1, v), a2 = cross(r2, v)\n\n // M * (v2 - v1) = JT * df\n // J * v2 = bias\n //\n // v2 = v1 + invM * JT * df\n // J * (v1 + invM * JT * df) = bias\n // K * df = bias - J * v1 = -Cdot\n // K = J * invM * JT\n // Cdot = J * v1 - bias\n //\n // Now solve for f2.\n // df = f2 - f1\n // K * (f2 - f1) = -Cdot\n // f2 = invK * (-Cdot) + f1\n //\n // Clamp accumulated limit impulse.\n // lower: f2(3) = max(f2(3), 0)\n // upper: f2(3) = min(f2(3), 0)\n //\n // Solve for correct f2(1:2)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1\n // = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) +\n // K(1:2,1:2) * f1(1:2)\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n //\n // Now compute impulse to be applied:\n // df = f2 - f1\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerTranslation: this.m_lowerTranslation,\n upperTranslation: this.m_upperTranslation,\n maxMotorForce: this.m_maxMotorForce,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PrismaticJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.localAxisA = Vec2.clone(data.localAxisA);\n const joint = new PrismaticJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const pA = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const pB = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const d = Vec2.sub(pB, pA);\n const axis = this.m_bodyA.getWorldVector(this.m_localXAxisA);\n\n const translation = Vec2.dot(d, axis);\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const rA = Rot.mulVec2(bA.m_xf.q, Vec2.sub(this.m_localAnchorA, bA.m_sweep.localCenter)); // Vec2\n const rB = Rot.mulVec2(bB.m_xf.q, Vec2.sub(this.m_localAnchorB, bB.m_sweep.localCenter)); // Vec2\n const p1 = Vec2.add(bA.m_sweep.c, rA); // Vec2\n const p2 = Vec2.add(bB.m_sweep.c, rB); // Vec2\n const d = Vec2.sub(p2, p1); // Vec2\n const axis = Rot.mulVec2(bA.m_xf.q, this.m_localXAxisA); // Vec2\n\n const vA = bA.m_linearVelocity; // Vec2\n const vB = bB.m_linearVelocity; // Vec2\n const wA = bA.m_angularVelocity; // float\n const wB = bB.m_angularVelocity; // float\n\n const speed = Vec2.dot(d, Vec2.crossNumVec2(wA, axis))\n + Vec2.dot(axis, Vec2.sub(Vec2.addCrossNumVec2(vB, wB, rB), Vec2.addCrossNumVec2(vA, wA, rA))); // float\n return speed;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit, usually in meters.\n */\n getLowerLimit(): number {\n return this.m_lowerTranslation;\n }\n\n /**\n * Get the upper joint limit, usually in meters.\n */\n getUpperLimit(): number {\n return this.m_upperTranslation;\n }\n\n /**\n * Set the joint limits, usually in meters.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && console.assert(lower <= upper);\n if (lower != this.m_lowerTranslation || upper != this.m_upperTranslation) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_lowerTranslation = lower;\n this.m_upperTranslation = upper;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in meters per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Set the maximum motor force, usually in N.\n */\n setMaxMotorForce(force: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorForce = force;\n }\n\n getMaxMotorForce(): number {\n return this.m_maxMotorForce;\n }\n\n /**\n * Get the motor speed, usually in meters per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Get the current motor force given the inverse time step, usually in N.\n */\n getMotorForce(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + this.m_impulse.z, this.m_axis).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.y;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute motor Jacobian and effective mass.\n {\n this.m_axis = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_axis);\n this.m_a2 = Vec2.crossVec2Vec2(rB, this.m_axis);\n\n this.m_motorMass = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2\n * this.m_a2;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n }\n\n // Prismatic constraint.\n {\n this.m_perp = Rot.mulVec2(qA, this.m_localYAxisA);\n\n this.m_s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_perp);\n this.m_s2 = Vec2.crossVec2Vec2(rB, this.m_perp);\n\n const s1test = Vec2.crossVec2Vec2(rA, this.m_perp);\n\n const k11 = mA + mB + iA * this.m_s1 * this.m_s1 + iB * this.m_s2 * this.m_s2;\n const k12 = iA * this.m_s1 + iB * this.m_s2;\n const k13 = iA * this.m_s1 * this.m_a1 + iB * this.m_s2 * this.m_a2;\n let k22 = iA + iB;\n if (k22 == 0.0) {\n // For bodies with fixed rotation.\n k22 = 1.0;\n }\n const k23 = iA * this.m_a1 + iB * this.m_a2;\n const k33 = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 * this.m_a2;\n\n this.m_K.ex.set(k11, k12, k13);\n this.m_K.ey.set(k12, k22, k23);\n this.m_K.ez.set(k13, k23, k33);\n }\n\n // Compute motor and limit terms.\n if (this.m_enableLimit) {\n\n const jointTranslation = Vec2.dot(this.m_axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * Settings.linearSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointTranslation <= this.m_lowerTranslation) {\n if (this.m_limitState != atLowerLimit) {\n this.m_limitState = atLowerLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else if (jointTranslation >= this.m_upperTranslation) {\n if (this.m_limitState != atUpperLimit) {\n this.m_limitState = atUpperLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n if (this.m_enableMotor == false) {\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse\n + this.m_impulse.z, this.m_axis);\n const LA = this.m_impulse.x * this.m_s1 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1;\n const LB = this.m_impulse.x * this.m_s2 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Solve linear motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits) {\n const Cdot = Vec2.dot(this.m_axis, Vec2.sub(vB, vA)) + this.m_a2 * wB\n - this.m_a1 * wA;\n let impulse = this.m_motorMass * (this.m_motorSpeed - Cdot);\n const oldImpulse = this.m_motorImpulse;\n const maxImpulse = step.dt * this.m_maxMotorForce;\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_axis);\n const LA = impulse * this.m_a1;\n const LB = impulse * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n const Cdot1 = Vec2.zero();\n Cdot1.x += Vec2.dot(this.m_perp, vB) + this.m_s2 * wB;\n Cdot1.x -= Vec2.dot(this.m_perp, vA) + this.m_s1 * wA;\n Cdot1.y = wB - wA;\n\n if (this.m_enableLimit && this.m_limitState != inactiveLimit) {\n // Solve prismatic and limit constraint in block form.\n let Cdot2 = 0;\n Cdot2 += Vec2.dot(this.m_axis, vB) + this.m_a2 * wB;\n Cdot2 -= Vec2.dot(this.m_axis, vA) + this.m_a1 * wA;\n\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const f1 = Vec3.clone(this.m_impulse);\n let df = this.m_K.solve33(Vec3.neg(Cdot)); // Vec3\n this.m_impulse.add(df);\n\n if (this.m_limitState == atLowerLimit) {\n this.m_impulse.z = Math.max(this.m_impulse.z, 0.0);\n } else if (this.m_limitState == atUpperLimit) {\n this.m_impulse.z = Math.min(this.m_impulse.z, 0.0);\n }\n\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n const b = Vec2.combine(-1, Cdot1, -(this.m_impulse.z - f1.z), Vec2.neo(this.m_K.ez.x, this.m_K.ez.y)); // Vec2\n const f2r = Vec2.add(this.m_K.solve22(b), Vec2.neo(f1.x, f1.y)); // Vec2\n this.m_impulse.x = f2r.x;\n this.m_impulse.y = f2r.y;\n\n df = Vec3.sub(this.m_impulse, f1);\n\n const P = Vec2.combine(df.x, this.m_perp, df.z, this.m_axis); // Vec2\n const LA = df.x * this.m_s1 + df.y + df.z * this.m_a1; // float\n const LB = df.x * this.m_s2 + df.y + df.z * this.m_a2; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n // Limit is inactive, just solve the prismatic constraint in block form.\n const df = this.m_K.solve22(Vec2.neg(Cdot1)); // Vec2\n this.m_impulse.x += df.x;\n this.m_impulse.y += df.y;\n\n const P = Vec2.mulNumVec2(df.x, this.m_perp); // Vec2\n const LA = df.x * this.m_s1 + df.y; // float\n const LB = df.x * this.m_s2 + df.y; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute fresh Jacobians\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n const d = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); // Vec2\n\n const axis = Rot.mulVec2(qA, this.m_localXAxisA); // Vec2\n const a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), axis); // float\n const a2 = Vec2.crossVec2Vec2(rB, axis); // float\n const perp = Rot.mulVec2(qA, this.m_localYAxisA); // Vec2\n\n const s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), perp); // float\n const s2 = Vec2.crossVec2Vec2(rB, perp); // float\n\n let impulse = new Vec3();\n const C1 = Vec2.zero(); // Vec2\n C1.x = Vec2.dot(perp, d);\n C1.y = aB - aA - this.m_referenceAngle;\n\n let linearError = Math.abs(C1.x); // float\n const angularError = Math.abs(C1.y); // float\n\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n let active = false; // bool\n let C2 = 0.0; // float\n if (this.m_enableLimit) {\n\n const translation = Vec2.dot(axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * linearSlop) {\n // Prevent large angular corrections\n C2 = Math.clamp(translation, -maxLinearCorrection, maxLinearCorrection);\n linearError = Math.max(linearError, Math.abs(translation));\n active = true;\n\n } else if (translation <= this.m_lowerTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_lowerTranslation + linearSlop,\n -maxLinearCorrection, 0.0);\n linearError = Math\n .max(linearError, this.m_lowerTranslation - translation);\n active = true;\n\n } else if (translation >= this.m_upperTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_upperTranslation - linearSlop, 0.0,\n maxLinearCorrection);\n linearError = Math\n .max(linearError, translation - this.m_upperTranslation);\n active = true;\n }\n }\n\n if (active) {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n const k13 = iA * s1 * a1 + iB * s2 * a2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n // For fixed rotation\n k22 = 1.0;\n }\n const k23 = iA * a1 + iB * a2; // float\n const k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; // float\n\n const K = new Mat33();\n K.ex.set(k11, k12, k13);\n K.ey.set(k12, k22, k23);\n K.ez.set(k13, k23, k33);\n\n const C = new Vec3();\n C.x = C1.x;\n C.y = C1.y;\n C.z = C2;\n\n impulse = K.solve33(Vec3.neg(C));\n } else {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n k22 = 1.0;\n }\n\n const K = new Mat22();\n K.ex.setNum(k11, k12);\n K.ey.setNum(k12, k22);\n\n const impulse1 = K.solve(Vec2.neg(C1)); // Vec2\n impulse.x = impulse1.x;\n impulse.y = impulse1.y;\n impulse.z = 0.0;\n }\n\n const P = Vec2.combine(impulse.x, perp, impulse.z, axis); // Vec2\n const LA = impulse.x * s1 + impulse.y + impulse.z * a1; // float\n const LB = impulse.x * s2 + impulse.y + impulse.z * a2; // float\n\n cA.subMul(mA, P);\n aA -= iA * LA;\n cB.addMul(mB, P);\n aB += iB * LB;\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { RevoluteJoint } from './RevoluteJoint';\nimport { PrismaticJoint } from './PrismaticJoint';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Gear joint definition.\n */\nexport interface GearJointOpt extends JointOpt {\n /**\n * The gear ratio. See {@link GearJoint} for explanation.\n */\n ratio?: number;\n}\n/**\n * Gear joint definition.\n */\nexport interface GearJointDef extends JointDef, GearJointOpt {\n /**\n * The first revolute/prismatic joint attached to the gear joint.\n */\n joint1: RevoluteJoint | PrismaticJoint;\n /**\n * The second prismatic/revolute joint attached to the gear joint.\n */\n joint2: RevoluteJoint | PrismaticJoint;\n}\n\nconst DEFAULTS = {\n ratio : 1.0\n};\n\n/**\n * A gear joint is used to connect two joints together. Either joint can be a\n * revolute or prismatic joint. You specify a gear ratio to bind the motions\n * together: coordinate1 + ratio * coordinate2 = constant\n *\n * The ratio can be negative or positive. If one joint is a revolute joint and\n * the other joint is a prismatic joint, then the ratio will have units of\n * length or units of 1/length. Warning: You have to manually destroy the gear\n * joint if joint1 or joint2 is destroyed.\n *\n * This definition requires two existing revolute or prismatic joints (any\n * combination will work).\n */\nexport class GearJoint extends Joint {\n static TYPE = 'gear-joint' as const;\n\n /** @internal */ m_type: 'gear-joint';\n /** @internal */ m_joint1: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_joint2: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_type1: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_type2: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_bodyC: Body;\n /** @internal */ m_localAnchorC: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_referenceAngleA: number;\n /** @internal */ m_localAxisC: Vec2;\n /** @internal */ m_bodyD: Body;\n /** @internal */ m_localAnchorD: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngleB: number;\n /** @internal */ m_localAxisD: Vec2;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_lcA: Vec2;\n /** @internal */ m_lcB: Vec2;\n /** @internal */ m_lcC: Vec2;\n /** @internal */ m_lcD: Vec2;\n /** @internal */ m_mA: number;\n /** @internal */ m_mB: number;\n /** @internal */ m_mC: number;\n /** @internal */ m_mD: number;\n /** @internal */ m_iA: number;\n /** @internal */ m_iB: number;\n /** @internal */ m_iC: number;\n /** @internal */ m_iD: number;\n /** @internal */ m_JvAC: Vec2;\n /** @internal */ m_JvBD: Vec2;\n /** @internal */ m_JwA: number;\n /** @internal */ m_JwB: number;\n /** @internal */ m_JwC: number;\n /** @internal */ m_JwD: number;\n /** @internal */ m_mass: number;\n\n constructor(def: GearJointDef);\n constructor(def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number);\n constructor(def: GearJointDef, bodyA?: Body, bodyB?: Body, joint1?: RevoluteJoint | PrismaticJoint, joint2?: RevoluteJoint | PrismaticJoint, ratio?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof GearJoint)) {\n return new GearJoint(def, bodyA, bodyB, joint1, joint2, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = GearJoint.TYPE;\n\n _ASSERT && console.assert(joint1.m_type === RevoluteJoint.TYPE\n || joint1.m_type === PrismaticJoint.TYPE);\n _ASSERT && console.assert(joint2.m_type === RevoluteJoint.TYPE\n || joint2.m_type === PrismaticJoint.TYPE);\n\n this.m_joint1 = joint1 ? joint1 : def.joint1;\n this.m_joint2 = joint2 ? joint2 : def.joint2;\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n this.m_type1 = this.m_joint1.getType() as 'revolute-joint' | 'prismatic-joint';\n this.m_type2 = this.m_joint2.getType() as 'revolute-joint' | 'prismatic-joint';\n\n // joint1 connects body A to body C\n // joint2 connects body B to body D\n\n let coordinateA: number;\n let coordinateB: number;\n\n // TODO_ERIN there might be some problem with the joint edges in Joint.\n\n this.m_bodyC = this.m_joint1.getBodyA();\n this.m_bodyA = this.m_joint1.getBodyB();\n\n // Get geometry of joint1\n const xfA = this.m_bodyA.m_xf;\n const aA = this.m_bodyA.m_sweep.a;\n const xfC = this.m_bodyC.m_xf;\n const aC = this.m_bodyC.m_sweep.a;\n\n if (this.m_type1 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint1 as RevoluteJoint;\n this.m_localAnchorC = revolute.m_localAnchorA;\n this.m_localAnchorA = revolute.m_localAnchorB;\n this.m_referenceAngleA = revolute.m_referenceAngle;\n this.m_localAxisC = Vec2.zero();\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const prismatic = this.m_joint1 as PrismaticJoint;\n this.m_localAnchorC = prismatic.m_localAnchorA;\n this.m_localAnchorA = prismatic.m_localAnchorB;\n this.m_referenceAngleA = prismatic.m_referenceAngle;\n this.m_localAxisC = prismatic.m_localXAxisA;\n\n const pC = this.m_localAnchorC;\n const pA = Rot.mulTVec2(xfC.q, Vec2.add(Rot.mulVec2(xfA.q, this.m_localAnchorA), Vec2.sub(xfA.p, xfC.p)));\n coordinateA = Vec2.dot(pA, this.m_localAxisC) - Vec2.dot(pC, this.m_localAxisC);\n }\n\n this.m_bodyD = this.m_joint2.getBodyA();\n this.m_bodyB = this.m_joint2.getBodyB();\n\n // Get geometry of joint2\n const xfB = this.m_bodyB.m_xf;\n const aB = this.m_bodyB.m_sweep.a;\n const xfD = this.m_bodyD.m_xf;\n const aD = this.m_bodyD.m_sweep.a;\n\n if (this.m_type2 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint2 as RevoluteJoint;\n this.m_localAnchorD = revolute.m_localAnchorA;\n this.m_localAnchorB = revolute.m_localAnchorB;\n this.m_referenceAngleB = revolute.m_referenceAngle;\n this.m_localAxisD = Vec2.zero();\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const prismatic = this.m_joint2 as PrismaticJoint;\n this.m_localAnchorD = prismatic.m_localAnchorA;\n this.m_localAnchorB = prismatic.m_localAnchorB;\n this.m_referenceAngleB = prismatic.m_referenceAngle;\n this.m_localAxisD = prismatic.m_localXAxisA;\n\n const pD = this.m_localAnchorD;\n const pB = Rot.mulTVec2(xfD.q, Vec2.add(Rot.mulVec2(xfB.q, this.m_localAnchorB), Vec2.sub(xfB.p, xfD.p)));\n coordinateB = Vec2.dot(pB, this.m_localAxisD) - Vec2.dot(pD, this.m_localAxisD);\n }\n\n this.m_constant = coordinateA + this.m_ratio * coordinateB;\n\n this.m_impulse = 0.0;\n\n // Gear Joint:\n // C0 = (coordinate1 + ratio * coordinate2)_initial\n // C = (coordinate1 + ratio * coordinate2) - C0 = 0\n // J = [J1 ratio * J2]\n // K = J * invM * JT\n // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T\n //\n // Revolute:\n // coordinate = rotation\n // Cdot = angularVelocity\n // J = [0 0 1]\n // K = J * invM * JT = invI\n //\n // Prismatic:\n // coordinate = dot(p - pg, ug)\n // Cdot = dot(v + cross(w, r), ug)\n // J = [ug cross(r, ug)]\n // K = J * invM * JT = invMass + invI * cross(r, ug)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n joint1: this.m_joint1,\n joint2: this.m_joint2,\n ratio: this.m_ratio,\n\n // _constant: this.m_constant,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): GearJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.joint1 = restore(Joint, data.joint1, world);\n data.joint2 = restore(Joint, data.joint2, world);\n const joint = new GearJoint(data);\n // if (data._constant) joint.m_constant = data._constant;\n return joint;\n }\n\n /**\n * Get the first joint.\n */\n getJoint1(): Joint {\n return this.m_joint1;\n }\n\n /**\n * Get the second joint.\n */\n getJoint2(): Joint {\n return this.m_joint2;\n }\n\n /**\n * Set the gear ratio.\n */\n setRatio(ratio: number): void {\n _ASSERT && console.assert(Math.isFinite(ratio));\n this.m_ratio = ratio;\n }\n\n /**\n * Get the gear ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_JvAC).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n const L = this.m_impulse * this.m_JwA; // float\n return inv_dt * L;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_lcA = this.m_bodyA.m_sweep.localCenter;\n this.m_lcB = this.m_bodyB.m_sweep.localCenter;\n this.m_lcC = this.m_bodyC.m_sweep.localCenter;\n this.m_lcD = this.m_bodyD.m_sweep.localCenter;\n this.m_mA = this.m_bodyA.m_invMass;\n this.m_mB = this.m_bodyB.m_invMass;\n this.m_mC = this.m_bodyC.m_invMass;\n this.m_mD = this.m_bodyD.m_invMass;\n this.m_iA = this.m_bodyA.m_invI;\n this.m_iB = this.m_bodyB.m_invI;\n this.m_iC = this.m_bodyC.m_invI;\n this.m_iD = this.m_bodyD.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const aC = this.m_bodyC.c_position.a;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n\n const aD = this.m_bodyD.c_position.a;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n this.m_mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n this.m_JvAC = Vec2.zero();\n this.m_JwA = 1.0;\n this.m_JwC = 1.0;\n this.m_mass += this.m_iA + this.m_iC;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n this.m_JvAC = u;\n this.m_JwC = Vec2.crossVec2Vec2(rC, u);\n this.m_JwA = Vec2.crossVec2Vec2(rA, u);\n this.m_mass += this.m_mC + this.m_mA + this.m_iC * this.m_JwC * this.m_JwC + this.m_iA * this.m_JwA * this.m_JwA;\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n this.m_JvBD = Vec2.zero();\n this.m_JwB = this.m_ratio;\n this.m_JwD = this.m_ratio;\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD); // Vec2\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); // Vec2\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); // Vec2\n this.m_JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n this.m_JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n this.m_JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD * this.m_JwD * this.m_JwD + this.m_iB * this.m_JwB * this.m_JwB;\n }\n\n // Compute effective mass.\n this.m_mass = this.m_mass > 0.0 ? 1.0 / this.m_mass : 0.0;\n\n if (step.warmStarting) {\n vA.addMul(this.m_mA * this.m_impulse, this.m_JvAC);\n wA += this.m_iA * this.m_impulse * this.m_JwA;\n\n vB.addMul(this.m_mB * this.m_impulse, this.m_JvBD);\n wB += this.m_iB * this.m_impulse * this.m_JwB;\n\n vC.subMul(this.m_mC * this.m_impulse, this.m_JvAC);\n wC -= this.m_iC * this.m_impulse * this.m_JwC;\n\n vD.subMul(this.m_mD * this.m_impulse, this.m_JvBD);\n wD -= this.m_iD * this.m_impulse * this.m_JwD;\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n let Cdot = Vec2.dot(this.m_JvAC, vA) - Vec2.dot(this.m_JvAC, vC)\n + Vec2.dot(this.m_JvBD, vB) - Vec2.dot(this.m_JvBD, vD); // float\n Cdot += (this.m_JwA * wA - this.m_JwC * wC)\n + (this.m_JwB * wB - this.m_JwD * wD);\n\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n vA.addMul(this.m_mA * impulse, this.m_JvAC);\n wA += this.m_iA * impulse * this.m_JwA;\n vB.addMul(this.m_mB * impulse, this.m_JvBD);\n wB += this.m_iB * impulse * this.m_JwB;\n vC.subMul(this.m_mC * impulse, this.m_JvAC);\n wC -= this.m_iC * impulse * this.m_JwC;\n vD.subMul(this.m_mD * impulse, this.m_JvBD);\n wD -= this.m_iD * impulse * this.m_JwD;\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n const cC = this.m_bodyC.c_position.c;\n let aC = this.m_bodyC.c_position.a;\n const cD = this.m_bodyD.c_position.c;\n let aD = this.m_bodyD.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n const linearError = 0.0;\n\n let coordinateA: number;\n let coordinateB: number;\n\n let JvAC: Vec2;\n let JvBD: Vec2;\n let JwA: number;\n let JwB: number;\n let JwC: number;\n let JwD: number;\n let mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n JvAC = Vec2.zero();\n JwA = 1.0;\n JwC = 1.0;\n mass += this.m_iA + this.m_iC;\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n JvAC = u;\n JwC = Vec2.crossVec2Vec2(rC, u);\n JwA = Vec2.crossVec2Vec2(rA, u);\n mass += this.m_mC + this.m_mA + this.m_iC * JwC * JwC + this.m_iA * JwA * JwA;\n\n const pC = Vec2.sub(this.m_localAnchorC, this.m_lcC); // Vec2\n const pA = Rot.mulTVec2(qC, Vec2.add(rA, Vec2.sub(cA, cC))); // Vec2\n coordinateA = Vec2.dot(Vec2.sub(pA, pC), this.m_localAxisC);\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n JvBD = Vec2.zero();\n JwB = this.m_ratio;\n JwD = this.m_ratio;\n mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD);\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB);\n JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD\n * JwD * JwD + this.m_iB * JwB * JwB;\n\n const pD = Vec2.sub(this.m_localAnchorD, this.m_lcD); // Vec2\n const pB = Rot.mulTVec2(qD, Vec2.add(rB, Vec2.sub(cB, cD))); // Vec2\n coordinateB = Vec2.dot(pB, this.m_localAxisD)\n - Vec2.dot(pD, this.m_localAxisD);\n }\n\n const C = (coordinateA + this.m_ratio * coordinateB) - this.m_constant; // float\n\n let impulse = 0.0; // float\n if (mass > 0.0) {\n impulse = -C / mass;\n }\n\n cA.addMul(this.m_mA * impulse, JvAC);\n aA += this.m_iA * impulse * JwA;\n cB.addMul(this.m_mB * impulse, JvBD);\n aB += this.m_iB * impulse * JwB;\n cC.subMul(this.m_mC * impulse, JvAC);\n aC -= this.m_iC * impulse * JwC;\n cD.subMul(this.m_mD * impulse, JvBD);\n aD -= this.m_iD * impulse * JwD;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n this.m_bodyC.c_position.c.setVec2(cC);\n this.m_bodyC.c_position.a = aC;\n this.m_bodyD.c_position.c.setVec2(cD);\n this.m_bodyD.c_position.a = aD;\n\n // TODO_ERIN not implemented\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Motor joint definition.\n */\nexport interface MotorJointOpt extends JointOpt {\n /**\n * The bodyB angle minus bodyA angle in radians.\n */\n angularOffset?: number;\n /**\n * The maximum motor force in N.\n */\n maxForce?: number;\n /**\n * The maximum motor torque in N-m.\n */\n maxTorque?: number;\n /**\n * Position correction factor in the range [0,1].\n */\n correctionFactor?: number;\n /**\n * Position of bodyB minus the position of bodyA, in bodyA's frame, in meters.\n */\n linearOffset?: Vec2;\n}\n/**\n * Motor joint definition.\n */\nexport interface MotorJointDef extends JointDef, MotorJointOpt {\n}\n\nconst DEFAULTS = {\n maxForce : 1.0,\n maxTorque : 1.0,\n correctionFactor : 0.3\n};\n\n/**\n * A motor joint is used to control the relative motion between two bodies. A\n * typical usage is to control the movement of a dynamic body with respect to\n * the ground.\n */\nexport class MotorJoint extends Joint {\n static TYPE = 'motor-joint' as const;\n\n /** @internal */ m_type: 'motor-joint';\n /** @internal */ m_linearOffset: Vec2;\n /** @internal */ m_angularOffset: number;\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n /** @internal */ m_correctionFactor: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_linearError: Vec2;\n /** @internal */ m_angularError: number;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: MotorJointDef);\n constructor(def: MotorJointOpt, bodyA: Body, bodyB: Body);\n constructor(def: MotorJointDef | MotorJointOpt, bodyA?: Body, bodyB?: Body) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof MotorJoint)) {\n return new MotorJoint(def, bodyA, bodyB);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MotorJoint.TYPE;\n\n this.m_linearOffset = Math.isFinite(def.linearOffset) ? def.linearOffset : bodyA.getLocalPoint(bodyB.getPosition());\n this.m_angularOffset = Math.isFinite(def.angularOffset) ? def.angularOffset : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n this.m_correctionFactor = def.correctionFactor;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n correctionFactor: this.m_correctionFactor,\n\n linearOffset: this.m_linearOffset,\n angularOffset: this.m_angularOffset,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MotorJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new MotorJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {}): void {\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && console.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && console.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Set the position correction factor in the range [0,1].\n */\n setCorrectionFactor(factor: number): void {\n _ASSERT && console.assert(Math.isFinite(factor) && 0.0 <= factor && factor <= 1.0);\n this.m_correctionFactor = factor;\n }\n\n /**\n * Get the position correction factor in the range [0,1].\n */\n getCorrectionFactor(): number {\n return this.m_correctionFactor;\n }\n\n /**\n * Set/get the target linear offset, in frame A, in meters.\n */\n setLinearOffset(linearOffset: Vec2): void {\n if (linearOffset.x != this.m_linearOffset.x\n || linearOffset.y != this.m_linearOffset.y) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_linearOffset = linearOffset;\n }\n }\n\n getLinearOffset(): Vec2 {\n return this.m_linearOffset;\n }\n\n /**\n * Set/get the target angular offset, in radians.\n */\n setAngularOffset(angularOffset: number): void {\n if (angularOffset != this.m_angularOffset) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_angularOffset = angularOffset;\n }\n }\n\n getAngularOffset(): number {\n return this.m_angularOffset;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getPosition();\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getPosition();\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.neg(this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.neg(this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n this.m_linearError = Vec2.zero();\n this.m_linearError.addCombine(1, cB, 1, this.m_rB);\n this.m_linearError.subCombine(1, cA, 1, this.m_rA);\n this.m_linearError.sub(Rot.mulVec2(qA, this.m_linearOffset));\n\n this.m_angularError = aB - aA - this.m_angularOffset;\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt;\n const inv_h = step.inv_dt;\n\n // Solve angular friction\n {\n const Cdot = wB - wA + inv_h * this.m_correctionFactor * this.m_angularError;\n let impulse = -this.m_angularMass * Cdot;\n\n const oldImpulse = this.m_angularImpulse;\n const maxImpulse = h * this.m_maxTorque;\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n Cdot.addMul(inv_h * this.m_correctionFactor, this.m_linearError);\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot));\n const oldImpulse = Vec2.clone(this.m_linearImpulse);\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce;\n\n this.m_linearImpulse.clamp(maxImpulse);\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Transform } from '../../common/Transform';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointOpt extends JointOpt {\n /**\n * [maxForce = 0.0] The maximum constraint force that can be exerted to move\n * the candidate body. Usually you will express as some multiple of the\n * weight (multiplier * mass * gravity).\n */\n maxForce?: number;\n /**\n * [frequencyHz = 5.0] The response speed.\n */\n frequencyHz?: number;\n /**\n * [dampingRatio = 0.7] The damping ratio. 0 = no damping, 1 = critical\n * damping.\n */\n dampingRatio?: number;\n}\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointDef extends JointDef, MouseJointOpt {\n /**\n * The initial world target point. This is assumed to coincide with the body\n * anchor initially.\n */\n target: Vec2Value;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n frequencyHz : 5.0,\n dampingRatio : 0.7\n};\n\n/**\n * A mouse joint is used to make a point on a body track a specified world\n * point. This a soft constraint with a maximum force. This allows the\n * constraint to stretch and without applying huge forces.\n *\n * NOTE: this joint is not documented in the manual because it was developed to\n * be used in the testbed. If you want to learn how to use the mouse joint, look\n * at the testbed.\n */\nexport class MouseJoint extends Joint {\n static TYPE = 'mouse-joint' as const;\n\n /** @internal */ m_type: 'mouse-joint';\n /** @internal */ m_targetA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_impulse: Vec2;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_beta: number;\n /** @internal */ m_gamma: number;\n // Solver temp\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat22;\n /** @internal */ m_C: Vec2;\n\n constructor(def: MouseJointDef);\n constructor(def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2);\n constructor(def: MouseJointDef, bodyA?: Body, bodyB?: Body, target?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof MouseJoint)) {\n return new MouseJoint(def, bodyA, bodyB, target);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MouseJoint.TYPE;\n\n _ASSERT && console.assert(Math.isFinite(def.maxForce) && def.maxForce >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.frequencyHz) && def.frequencyHz >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.dampingRatio) && def.dampingRatio >= 0.0);\n\n if (Vec2.isValid(target)) {\n this.m_targetA = Vec2.clone(target);\n } else if (Vec2.isValid(def.target)) {\n this.m_targetA = Vec2.clone(def.target);\n } else {\n this.m_targetA = Vec2.zero();\n }\n\n this.m_localAnchorB = Transform.mulTVec2(bodyB.getTransform(), this.m_targetA);\n\n this.m_maxForce = def.maxForce;\n this.m_impulse = Vec2.zero();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_beta = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rB = Vec2.zero();\n this.m_localCenterB = Vec2.zero();\n this.m_invMassB = 0.0;\n this.m_invIB = 0.0;\n this.m_mass = new Mat22();\n this.m_C = Vec2.zero();\n\n // p = attached point, m = mouse point\n // C = p - m\n // Cdot = v\n // = v + cross(w, r)\n // J = [I r_skew]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n target: this.m_targetA,\n maxForce: this.m_maxForce,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n _localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MouseJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.target = Vec2.clone(data.target);\n const joint = new MouseJoint(data);\n if (data._localAnchorB) {\n joint.m_localAnchorB = data._localAnchorB;\n }\n return joint;\n }\n\n /**\n * Use this to update the target point.\n */\n setTarget(target: Vec2Value): void {\n if (this.m_bodyB.isAwake() == false) {\n this.m_bodyB.setAwake(true);\n }\n this.m_targetA = Vec2.clone(target);\n }\n\n getTarget(): Vec2 {\n return this.m_targetA;\n }\n\n /**\n * Set the maximum force in Newtons.\n */\n setMaxForce(force: number): void {\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum force in Newtons.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the frequency in Hertz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get the frequency in Hertz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set the damping ratio (dimensionless).\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get the damping ratio (dimensionless).\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return Vec2.clone(this.m_targetA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_impulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * 0.0;\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2Value): void {\n this.m_targetA.sub(newOrigin);\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const position = this.m_bodyB.c_position;\n const velocity = this.m_bodyB.c_velocity;\n\n const cB = position.c;\n const aB = position.a;\n const vB = velocity.v;\n let wB = velocity.w;\n\n const qB = Rot.neo(aB);\n\n const mass = this.m_bodyB.getMass();\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = mass * (omega * omega);\n\n // magic formulas\n // gamma has units of inverse mass.\n // beta has units of inverse time.\n const h = step.dt;\n _ASSERT && console.assert(d + h * k > Math.EPSILON);\n this.m_gamma = h * (d + h * k);\n if (this.m_gamma != 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n this.m_beta = h * k * this.m_gamma;\n\n // Compute the effective mass matrix.\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) *\n // invI2 * skew(r2)]\n // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y\n // -r1.x*r1.y]\n // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x]\n const K = new Mat22();\n K.ex.x = this.m_invMassB + this.m_invIB * this.m_rB.y * this.m_rB.y\n + this.m_gamma;\n K.ex.y = -this.m_invIB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = this.m_invMassB + this.m_invIB * this.m_rB.x * this.m_rB.x\n + this.m_gamma;\n\n this.m_mass = K.getInverse();\n\n this.m_C.setVec2(cB);\n this.m_C.addCombine(1, this.m_rB, -1, this.m_targetA);\n this.m_C.mul(this.m_beta);\n\n // Cheat with some damping\n wB *= 0.98;\n\n if (step.warmStarting) {\n this.m_impulse.mul(step.dtRatio);\n vB.addMul(this.m_invMassB, this.m_impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, this.m_impulse);\n\n } else {\n this.m_impulse.setZero();\n }\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const velocity = this.m_bodyB.c_velocity;\n const vB = Vec2.clone(velocity.v);\n let wB = velocity.w;\n\n // Cdot = v + cross(w, r)\n\n const Cdot = Vec2.crossNumVec2(wB, this.m_rB);\n Cdot.add(vB);\n\n Cdot.addCombine(1, this.m_C, this.m_gamma, this.m_impulse);\n Cdot.neg();\n\n let impulse = Mat22.mulVec2(this.m_mass, Cdot);\n\n const oldImpulse = Vec2.clone(this.m_impulse);\n this.m_impulse.add(impulse);\n const maxImpulse = step.dt * this.m_maxForce;\n this.m_impulse.clamp(maxImpulse);\n impulse = Vec2.sub(this.m_impulse, oldImpulse);\n\n vB.addMul(this.m_invMassB, impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\n// tslint:disable-next-line:no-empty-interface\nexport interface PulleyJointOpt extends JointOpt {\n}\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\nexport interface PulleyJointDef extends JointDef, PulleyJointOpt {\n /**\n * The first ground anchor in world coordinates. This point never moves.\n */\n groundAnchorA: Vec2;\n /**\n * The second ground anchor in world coordinates. This point never moves.\n */\n groundAnchorB: Vec2;\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The reference length for the segment attached to bodyA.\n */\n lengthA: number;\n /**\n * The reference length for the segment attached to bodyB.\n */\n lengthB: number;\n /**\n * The pulley ratio, used to simulate a block-and-tackle.\n */\n ratio: number;\n}\n\nconst DEFAULTS = {\n collideConnected : true\n};\n\n/**\n * The pulley joint is connected to two bodies and two fixed ground points. The\n * pulley supports a ratio such that: length1 + ratio * length2 <= constant\n *\n * Yes, the force transmitted is scaled by the ratio.\n *\n * Warning: the pulley joint can get a bit squirrelly by itself. They often work\n * better when combined with prismatic joints. You should also cover the the\n * anchor points with static shapes to prevent one side from going to zero\n * length.\n */\nexport class PulleyJoint extends Joint {\n static TYPE = 'pulley-joint' as const;\n // static MIN_PULLEY_LENGTH: number = 2.0; // TODO where this is used?\n\n /** @internal */ m_type: 'pulley-joint';\n /** @internal */ m_groundAnchorA: Vec2;\n /** @internal */ m_groundAnchorB: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_lengthA: number;\n /** @internal */ m_lengthB: number;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_uA: Vec2;\n /** @internal */ m_uB: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: PulleyJointDef);\n constructor(def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number);\n constructor(def: PulleyJointDef, bodyA?: Body, bodyB?: Body, groundA?: Vec2, groundB?: Vec2, anchorA?: Vec2, anchorB?: Vec2, ratio?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PulleyJoint)) {\n return new PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PulleyJoint.TYPE;\n this.m_groundAnchorA = groundA ? groundA : def.groundAnchorA || Vec2.neo(-1.0, 1.0);\n this.m_groundAnchorB = groundB ? groundB : def.groundAnchorB || Vec2.neo(1.0, 1.0);\n this.m_localAnchorA = anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n this.m_lengthA = Math.isFinite(def.lengthA) ? def.lengthA : Vec2.distance(anchorA, groundA);\n this.m_lengthB = Math.isFinite(def.lengthB) ? def.lengthB : Vec2.distance(anchorB, groundB);\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n _ASSERT && console.assert(ratio > Math.EPSILON);\n\n this.m_constant = this.m_lengthA + this.m_ratio * this.m_lengthB;\n\n this.m_impulse = 0.0;\n\n // Pulley:\n // length1 = norm(p1 - s1)\n // length2 = norm(p2 - s2)\n // C0 = (length1 + ratio * length2)_initial\n // C = C0 - (length1 + ratio * length2)\n // u1 = (p1 - s1) / norm(p1 - s1)\n // u2 = (p2 - s2) / norm(p2 - s2)\n // Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2))\n // J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 *\n // cross(r2, u2)^2)\n }\n\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n groundAnchorA: this.m_groundAnchorA,\n groundAnchorB: this.m_groundAnchorB,\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n lengthA: this.m_lengthA,\n lengthB: this.m_lengthB,\n ratio: this.m_ratio,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PulleyJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new PulleyJoint(data);\n return joint;\n }\n\n /**\n * Get the first ground anchor.\n */\n getGroundAnchorA(): Vec2 {\n return this.m_groundAnchorA;\n }\n\n /**\n * Get the second ground anchor.\n */\n getGroundAnchorB(): Vec2 {\n return this.m_groundAnchorB;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getLengthA(): number {\n return this.m_lengthA;\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getLengthB(): number {\n return this.m_lengthB;\n }\n\n /**\n * Get the pulley ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getCurrentLengthA(): number {\n const p = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const s = this.m_groundAnchorA;\n return Vec2.distance(p, s);\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getCurrentLengthB(): number {\n const p = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const s = this.m_groundAnchorB;\n return Vec2.distance(p, s);\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n *\n * @param newOrigin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_groundAnchorA.sub(newOrigin);\n this.m_groundAnchorB.sub(newOrigin);\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_uB).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n this.m_uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n this.m_uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = this.m_uA.length();\n const lengthB = this.m_uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n this.m_uA.mul(1.0 / lengthA);\n } else {\n this.m_uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n this.m_uB.mul(1.0 / lengthB);\n } else {\n this.m_uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(this.m_rA, this.m_uA); // float\n const ruB = Vec2.crossVec2Vec2(this.m_rB, this.m_uB); // float\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n this.m_mass = mA + this.m_ratio * this.m_ratio * mB;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support variable time steps.\n this.m_impulse *= step.dtRatio;\n\n // Warm starting.\n const PA = Vec2.mulNumVec2(-this.m_impulse, this.m_uA);\n const PB = Vec2.mulNumVec2(-this.m_ratio * this.m_impulse, this.m_uB);\n\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n\n const Cdot = -Vec2.dot(this.m_uA, vpA) - this.m_ratio\n * Vec2.dot(this.m_uB, vpB); // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const PA = Vec2.mulNumVec2(-impulse, this.m_uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, this.m_uB); // Vec2\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n const uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n const uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = uA.length();\n const lengthB = uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n uA.mul(1.0 / lengthA);\n } else {\n uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n uB.mul(1.0 / lengthB);\n } else {\n uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(rA, uA);\n const ruB = Vec2.crossVec2Vec2(rB, uB);\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n let mass = mA + this.m_ratio * this.m_ratio * mB; // float\n\n if (mass > 0.0) {\n mass = 1.0 / mass;\n }\n\n const C = this.m_constant - lengthA - this.m_ratio * lengthB; // float\n const linearError = Math.abs(C); // float\n\n const impulse = -mass * C; // float\n\n const PA = Vec2.mulNumVec2(-impulse, uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, uB); // Vec2\n\n cA.addMul(this.m_invMassA, PA);\n aA += this.m_invIA * Vec2.crossVec2Vec2(rA, PA);\n cB.addMul(this.m_invMassB, PB);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, PB);\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointOpt extends JointOpt {\n /**\n * The maximum length of the rope.\n * Warning: this must be larger than linearSlop or the joint will have no effect.\n */\n maxLength?: number;\n}\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointDef extends JointDef, RopeJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxLength : 0.0,\n};\n\n/**\n * A rope joint enforces a maximum distance between two points on two bodies. It\n * has no other effect.\n *\n * Warning: if you attempt to change the maximum length during the simulation\n * you will get some non-physical behavior.\n *\n * A model that would allow you to dynamically modify the length would have some\n * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you\n * want to dynamically control length.\n */\nexport class RopeJoint extends Joint {\n static TYPE = 'rope-joint' as const;\n\n /** @internal */ m_type: 'rope-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n /** @internal */ m_maxLength: number;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_length: number;\n /** @internal */ m_state: number; // TODO enum\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n constructor(def: RopeJointDef);\n constructor(def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: RopeJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof RopeJoint)) {\n return new RopeJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RopeJoint.TYPE;\n this.m_localAnchorA = anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n\n this.m_maxLength = def.maxLength;\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_length = 0.0;\n this.m_state = inactiveLimit;\n\n // Limit:\n // C = norm(pB - pA) - L\n // u = (pB - pA) / norm(pB - pA)\n // Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA))\n // J = [-u -cross(rA, u) u cross(rB, u)]\n // K = J * invM * JT\n // = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n maxLength: this.m_maxLength,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): RopeJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RopeJoint(data);\n return joint;\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum length of the rope.\n */\n setMaxLength(length: number): void {\n this.m_maxLength = length;\n }\n\n /**\n * Get the maximum length of the rope.\n */\n getMaxLength(): number {\n return this.m_maxLength;\n }\n\n getLimitState(): number {\n // TODO LimitState\n return this.m_state;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n this.m_rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n this.m_u = Vec2.zero();\n this.m_u.addCombine(1, cB, 1, this.m_rB);\n this.m_u.subCombine(1, cA, 1, this.m_rA); // Vec2\n\n this.m_length = this.m_u.length();\n\n const C = this.m_length - this.m_maxLength; // float\n if (C > 0.0) {\n this.m_state = atUpperLimit;\n } else {\n this.m_state = inactiveLimit;\n }\n\n if (this.m_length > Settings.linearSlop) {\n this.m_u.mul(1.0 / this.m_length);\n } else {\n this.m_u.setZero();\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n return;\n }\n\n // Compute effective mass.\n const crA = Vec2.crossVec2Vec2(this.m_rA, this.m_u); // float\n const crB = Vec2.crossVec2Vec2(this.m_rB, this.m_u); // float\n const invMass = this.m_invMassA + this.m_invIA * crA * crA + this.m_invMassB\n + this.m_invIB * crB * crB; // float\n\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.addCrossNumVec2(vA, wA, this.m_rA); // Vec2\n const vpB = Vec2.addCrossNumVec2(vB, wB, this.m_rB); // Vec2\n const C = this.m_length - this.m_maxLength; // float\n let Cdot = Vec2.dot(this.m_u, Vec2.sub(vpB, vpA)); // float\n\n // Predictive constraint.\n if (C < 0.0) {\n Cdot += step.inv_dt * C;\n }\n\n let impulse = -this.m_mass * Cdot; // float\n const oldImpulse = this.m_impulse; // float\n this.m_impulse = Math.min(0.0, this.m_impulse + impulse);\n impulse = this.m_impulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u); // Vec2\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c; // Vec2\n let aA = this.m_bodyA.c_position.a; // float\n const cB = this.m_bodyB.c_position.c; // Vec2\n let aB = this.m_bodyB.c_position.a; // float\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.zero();\n u.addCombine(1, cB, 1, rB);\n u.subCombine(1, cA, 1, rA); // Vec2\n\n const length = u.normalize(); // float\n let C = length - this.m_maxLength; // float\n\n C = Math.clamp(C, 0.0, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C; // float\n const P = Vec2.mulNumVec2(impulse, u); // Vec2\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return length - this.m_maxLength < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n *\n * @prop {float} frequencyHz\n * @prop {float} dampingRatio\n *\n * @prop {Vec2} localAnchorA\n * @prop {Vec2} localAnchorB\n * @prop {float} referenceAngle\n */\nexport interface WeldJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. Rotation only. Disable softness\n * with a value of 0.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle?: number;\n}\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n */\nexport interface WeldJointDef extends JointDef, WeldJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0,\n};\n\n/**\n * A weld joint essentially glues two bodies together. A weld joint may distort\n * somewhat because the island constraint solver is approximate.\n */\nexport class WeldJoint extends Joint {\n static TYPE = 'weld-joint' as const\n\n /** @internal */ m_type: 'weld-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_impulse: Vec3;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat33;\n\n constructor(def: WeldJointDef);\n constructor(def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: WeldJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof WeldJoint)) {\n return new WeldJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WeldJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_impulse = new Vec3();\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rA; // Vec2\n this.m_rB; // Vec2\n this.m_localCenterA; // Vec2\n this.m_localCenterB; // Vec2\n this.m_invMassA; // float\n this.m_invMassB; // float\n this.m_invIA; // float\n this.m_invIB; // float\n this.m_mass = new Mat33();\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // / = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // C = angle2 - angle1 - referenceAngle\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WeldJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WeldJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Set frequency in Hz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get frequency in Hz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set damping ratio.\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get damping ratio.\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat33();\n K.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y * this.m_rB.y\n * iB;\n K.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y * this.m_rB.x * iB;\n K.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x * this.m_rB.x\n * iB;\n K.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n K.getInverse22(this.m_mass);\n\n let invM = iA + iB; // float\n const m = invM > 0.0 ? 1.0 / invM : 0.0; // float\n\n const C = aB - aA - this.m_referenceAngle; // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const d = 2.0 * m * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = m * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invM += this.m_gamma;\n this.m_mass.ez.z = invM != 0.0 ? 1.0 / invM : 0.0;\n } else if (K.ez.z == 0.0) {\n K.getInverse22(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n } else {\n K.getSymInverse33(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n if (this.m_frequencyHz > 0.0) {\n const Cdot2 = wB - wA; // float\n\n const impulse2 = -this.m_mass.ez.z\n * (Cdot2 + this.m_bias + this.m_gamma * this.m_impulse.z); // float\n this.m_impulse.z += impulse2;\n\n wA -= iA * impulse2;\n wB += iB * impulse2;\n\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n\n const impulse1 = Vec2.neg(Mat33.mulVec2(this.m_mass, Cdot1)); // Vec2\n this.m_impulse.x += impulse1.x;\n this.m_impulse.y += impulse1.y;\n\n const P = Vec2.clone(impulse1); // Vec2\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, P);\n } else {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); // Vec3\n\n const impulse = Vec3.neg(Mat33.mulVec3(this.m_mass, Cdot)); // Vec3\n this.m_impulse.add(impulse);\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n let positionError: number;\n let angularError: number;\n\n const K = new Mat33();\n K.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB;\n K.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB;\n K.ez.x = -rA.y * iA - rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB;\n K.ez.y = rA.x * iA + rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA); // Vec2\n\n positionError = C1.length();\n angularError = 0.0;\n\n const P = Vec2.neg(K.solve22(C1)); // Vec2\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n } else {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA);\n\n const C2 = aB - aA - this.m_referenceAngle; // float\n\n positionError = C1.length();\n angularError = Math.abs(C2);\n\n const C = new Vec3(C1.x, C1.y, C2);\n\n let impulse = new Vec3();\n if (K.ez.z > 0.0) {\n impulse = Vec3.neg(K.solve33(C));\n } else {\n const impulse2 = Vec2.neg(K.solve22(C1));\n impulse.set(impulse2.x, impulse2.y, 0.0);\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n cA.subMul(mA, P);\n aA -= iA * (Vec2.crossVec2Vec2(rA, P) + impulse.z);\n\n cB.addMul(mB, P);\n aB += iB * (Vec2.crossVec2Vec2(rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointOpt extends JointOpt {\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n /**\n * Suspension frequency, zero indicates no suspension.\n */\n frequencyHz?: number;\n /**\n * Suspension damping ratio, one indicates critical damping.\n */\n dampingRatio?: number;\n}\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointDef extends JointDef, WheelJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation axis in bodyA.\n */\n localAxisA: Vec2;\n}\n\nconst DEFAULTS = {\n enableMotor : false,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n frequencyHz : 2.0,\n dampingRatio : 0.7,\n};\n\n/**\n * A wheel joint. This joint provides two degrees of freedom: translation along\n * an axis fixed in bodyA and rotation in the plane. In other words, it is a\n * point to line constraint with a rotational motor and a linear spring/damper.\n * This joint is designed for vehicle suspensions.\n */\nexport class WheelJoint extends Joint {\n static TYPE = 'wheel-joint' as const;\n\n /** @internal */ m_type: 'wheel-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_springMass: number;\n /** @internal */ m_springImpulse: number;\n\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableMotor: boolean;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n /** @internal */ m_ax: Vec2 = Vec2.zero();\n /** @internal */ m_ay: Vec2 = Vec2.zero();\n /** @internal */ m_sAx: number;\n /** @internal */ m_sBx: number;\n /** @internal */ m_sAy: number;\n /** @internal */ m_sBy: number;\n\n constructor(def: WheelJointDef);\n constructor(def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n // @ts-ignore\n constructor(def: WheelJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof WheelJoint)) {\n return new WheelJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WheelJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n // @ts-ignore localAxis\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || def.localAxis || Vec2.neo(1.0, 0.0));\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n this.m_springMass = 0.0;\n this.m_springImpulse = 0.0;\n\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableMotor = def.enableMotor;\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Linear constraint (point-to-line)\n // d = pB - pA = xB + rB - xA - rA\n // C = dot(ay, d)\n // Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA,\n // rA))\n // = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB,\n // ay), vB)\n // J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)]\n\n // Spring linear constraint\n // C = dot(ax, d)\n // Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) +\n // dot(cross(rB, ax), vB)\n // J = [-ax -cross(d+rA, ax) ax cross(rB, ax)]\n\n // Motor rotational constraint\n // Cdot = wB - wA\n // J = [0 0 -1 0 0 1]\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n enableMotor: this.m_enableMotor,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WheelJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WheelJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const pA = bA.getWorldPoint(this.m_localAnchorA); // Vec2\n const pB = bB.getWorldPoint(this.m_localAnchorB); // Vec2\n const d = Vec2.sub(pB, pA); // Vec2\n const axis = bA.getWorldVector(this.m_localXAxisA); // Vec2\n\n const translation = Vec2.dot(d, axis); // float\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const wA = this.m_bodyA.m_angularVelocity;\n const wB = this.m_bodyB.m_angularVelocity;\n return wB - wA;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed, usually in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set/Get the maximum motor force, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Get the current motor torque given the inverse time step, usually in N-m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set/Get the spring frequency in hertz. Setting the frequency to zero disables\n * the spring.\n */\n setSpringFrequencyHz(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getSpringFrequencyHz(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set/Get the spring damping ratio\n */\n setSpringDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getSpringDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA); // Vec2\n\n // Point to line constraint\n {\n this.m_ay = Rot.mulVec2(qA, this.m_localYAxisA);\n this.m_sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ay);\n this.m_sBy = Vec2.crossVec2Vec2(rB, this.m_ay);\n\n this.m_mass = mA + mB + iA * this.m_sAy * this.m_sAy + iB * this.m_sBy\n * this.m_sBy;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n }\n\n // Spring constraint\n this.m_springMass = 0.0;\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n if (this.m_frequencyHz > 0.0) {\n this.m_ax = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_sAx = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ax);\n this.m_sBx = Vec2.crossVec2Vec2(rB, this.m_ax);\n\n const invMass = mA + mB + iA * this.m_sAx * this.m_sAx + iB * this.m_sBx\n * this.m_sBx; // float\n\n if (invMass > 0.0) {\n this.m_springMass = 1.0 / invMass;\n\n const C = Vec2.dot(d, this.m_ax); // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const damp = 2.0 * this.m_springMass * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = this.m_springMass * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (damp + h * k);\n if (this.m_gamma > 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n\n this.m_bias = C * h * k * this.m_gamma;\n\n this.m_springMass = invMass + this.m_gamma;\n if (this.m_springMass > 0.0) {\n this.m_springMass = 1.0 / this.m_springMass;\n }\n }\n } else {\n this.m_springImpulse = 0.0;\n }\n\n // Rotational motor\n if (this.m_enableMotor) {\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n } else {\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse *= step.dtRatio;\n this.m_springImpulse *= step.dtRatio;\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax);\n const LA = this.m_impulse * this.m_sAy + this.m_springImpulse * this.m_sAx + this.m_motorImpulse;\n const LB = this.m_impulse * this.m_sBy + this.m_springImpulse * this.m_sBx + this.m_motorImpulse;\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * LA;\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * LB;\n\n } else {\n this.m_impulse = 0.0;\n this.m_springImpulse = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Solve spring constraint\n {\n const Cdot = Vec2.dot(this.m_ax, vB) - Vec2.dot(this.m_ax, vA) + this.m_sBx\n * wB - this.m_sAx * wA; // float\n const impulse = -this.m_springMass\n * (Cdot + this.m_bias + this.m_gamma * this.m_springImpulse); // float\n this.m_springImpulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ax); // Vec2\n const LA = impulse * this.m_sAx; // float\n const LB = impulse * this.m_sBx; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n // Solve rotational motor constraint\n {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve point to line constraint\n {\n const Cdot = Vec2.dot(this.m_ay, vB) - Vec2.dot(this.m_ay, vA) + this.m_sBy\n * wB - this.m_sAy * wA; // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ay); // Vec2\n const LA = impulse * this.m_sAy; // float\n const LB = impulse * this.m_sBy; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const ay = Rot.mulVec2(qA, this.m_localYAxisA);\n\n const sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), ay); // float\n const sBy = Vec2.crossVec2Vec2(rB, ay); // float\n\n const C = Vec2.dot(d, ay); // float\n\n const k = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_sAy\n * this.m_sAy + this.m_invIB * this.m_sBy * this.m_sBy; // float\n\n let impulse; // float\n if (k != 0.0) {\n impulse = -C / k;\n } else {\n impulse = 0.0;\n }\n\n const P = Vec2.mulNumVec2(impulse, ay); // Vec2\n const LA = impulse * sAy; // float\n const LB = impulse * sBy; // float\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * LA;\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * LB;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) <= Settings.linearSlop;\n }\n\n}\n","// tslint:disable:typedef\nimport { World } from '../dynamics/World';\nimport { Body } from '../dynamics/Body';\nimport { Joint } from '../dynamics/Joint';\nimport { Fixture } from '../dynamics/Fixture';\nimport { Shape } from '../collision/Shape';\nimport { Vec2 } from '../common/Vec2';\nimport { Vec3 } from '../common/Vec3';\nimport { ChainShape } from \"../collision/shape/ChainShape\";\nimport { BoxShape } from \"../collision/shape/BoxShape\";\nimport { EdgeShape } from \"../collision/shape/EdgeShape\";\nimport { PolygonShape } from \"../collision/shape/PolygonShape\";\nimport { CircleShape } from \"../collision/shape/CircleShape\";\nimport { DistanceJoint } from \"../dynamics/joint/DistanceJoint\";\nimport { FrictionJoint } from \"../dynamics/joint/FrictionJoint\";\nimport { GearJoint } from \"../dynamics/joint/GearJoint\";\nimport { MotorJoint } from \"../dynamics/joint/MotorJoint\";\nimport { MouseJoint } from \"../dynamics/joint/MouseJoint\";\nimport { PrismaticJoint } from \"../dynamics/joint/PrismaticJoint\";\nimport { PulleyJoint } from \"../dynamics/joint/PulleyJoint\";\nimport { RevoluteJoint } from \"../dynamics/joint/RevoluteJoint\";\nimport { RopeJoint } from \"../dynamics/joint/RopeJoint\";\nimport { WeldJoint } from \"../dynamics/joint/WeldJoint\";\nimport { WheelJoint } from \"../dynamics/joint/WheelJoint\";\n\nlet SID = 0;\n\nexport function Serializer(opts?) {\n opts = opts || {};\n\n const rootClass = opts.rootClass || World;\n\n const preSerialize = opts.preSerialize || function(obj) { return obj; };\n const postSerialize = opts.postSerialize || function(data, obj) { return data; };\n\n const preDeserialize = opts.preDeserialize || function(data) { return data; };\n const postDeserialize = opts.postDeserialize || function(obj, data) { return obj; };\n\n // This is used to create ref objects during serialize\n const refTypes = {\n World,\n Body,\n Joint,\n Fixture,\n Shape,\n };\n\n // This is used by restore to deserialize objects and refs\n const restoreTypes = {\n Vec2,\n Vec3,\n ...refTypes\n };\n\n const CLASS_BY_TYPE_PROP = {\n [Body.STATIC]: Body,\n [Body.DYNAMIC]: Body,\n [Body.KINEMATIC]: Body,\n [ChainShape.TYPE]: ChainShape,\n [BoxShape.TYPE]: BoxShape,\n [EdgeShape.TYPE]: EdgeShape,\n [PolygonShape.TYPE]: PolygonShape,\n [CircleShape.TYPE]: CircleShape,\n [DistanceJoint.TYPE]: DistanceJoint,\n [FrictionJoint.TYPE]: FrictionJoint,\n [GearJoint.TYPE]: GearJoint,\n [MotorJoint.TYPE]: MotorJoint,\n [MouseJoint.TYPE]: MouseJoint,\n [PrismaticJoint.TYPE]: PrismaticJoint,\n [PulleyJoint.TYPE]: PulleyJoint,\n [RevoluteJoint.TYPE]: RevoluteJoint,\n [RopeJoint.TYPE]: RopeJoint,\n [WeldJoint.TYPE]: WeldJoint,\n [WheelJoint.TYPE]: WheelJoint,\n }\n\n this.toJson = function(root) {\n const json = [];\n\n const queue = [root];\n const refMap = {};\n\n function storeRef(value, typeName) {\n value.__sid = value.__sid || ++SID;\n if (!refMap[value.__sid]) {\n queue.push(value);\n const index = json.length + queue.length;\n const ref = {\n refIndex: index,\n refType: typeName\n };\n refMap[value.__sid] = ref;\n }\n return refMap[value.__sid];\n }\n\n function serialize(obj) {\n obj = preSerialize(obj);\n let data = obj._serialize();\n data = postSerialize(data, obj);\n return data;\n }\n\n function toJson(value, top?) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (typeof value._serialize === 'function') {\n if (value !== top) {\n // tslint:disable-next-line:no-for-in\n for (const typeName in refTypes) {\n if (value instanceof refTypes[typeName]) {\n return storeRef(value, typeName);\n }\n }\n }\n value = serialize(value);\n }\n if (Array.isArray(value)) {\n const newValue = [];\n for (let key = 0; key < value.length; key++) {\n newValue[key] = toJson(value[key]);\n }\n value = newValue;\n\n } else {\n const newValue = {};\n // tslint:disable-next-line:no-for-in\n for (const key in value) {\n if (value.hasOwnProperty(key)) {\n newValue[key] = toJson(value[key]);\n }\n }\n value = newValue;\n }\n return value;\n }\n\n while (queue.length) {\n const obj = queue.shift();\n const str = toJson(obj, obj);\n json.push(str);\n }\n\n return json;\n };\n\n this.fromJson = function(json: object) {\n const refMap = {};\n\n function findDeserilizer(data, cls) {\n if (!cls || !cls._deserialize) {\n cls = CLASS_BY_TYPE_PROP[data.type]\n }\n return cls && cls._deserialize;\n }\n\n /**\n * Deserialize a data object.\n */\n function deserialize(cls, data, ctx) {\n const deserializer = findDeserilizer(data, cls);\n if (!deserializer) {\n return;\n }\n data = preDeserialize(data);\n let obj = deserializer(data, ctx, restoreRef);\n obj = postDeserialize(obj, data);\n return obj;\n }\n\n /**\n * Restore a ref object or deserialize a data object.\n *\n * This is passed as callback to class deserializers.\n */\n function restoreRef(cls, ref, ctx) {\n if (!ref.refIndex) {\n return cls && cls._deserialize && deserialize(cls, ref, ctx);\n }\n cls = restoreTypes[ref.refType] || cls;\n const index = ref.refIndex;\n if (!refMap[index]) {\n const data = json[index];\n const obj = deserialize(cls, data, ctx);\n refMap[index] = obj;\n }\n return refMap[index];\n }\n\n const root = rootClass._deserialize(json[0], null, restoreRef);\n\n return root;\n };\n}\n\nconst serializer = new Serializer();\n\nSerializer.toJson = serializer.toJson;\nSerializer.fromJson = serializer.fromJson;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { CircleShape } from './CircleShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact);\n\nfunction CircleCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == CircleShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n CollideCircles(manifold, fixtureA.getShape() as CircleShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport const CollideCircles = function (manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n const pA = Transform.mulVec2(xfA, circleA.m_p);\n const pB = Transform.mulVec2(xfB, circleB.m_p);\n\n const distSqr = Vec2.distanceSquared(pB, pA);\n const rA = circleA.m_radius;\n const rB = circleB.m_radius;\n const radius = rA + rB;\n if (distSqr > radius * radius) {\n return;\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localPoint.setVec2(circleA.m_p);\n manifold.localNormal.setZero();\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { EdgeShape } from './EdgeShape';\nimport { ChainShape } from './ChainShape';\nimport { CircleShape } from './CircleShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, CircleShape.TYPE, EdgeCircleContact);\nContact.addType(ChainShape.TYPE, CircleShape.TYPE, ChainCircleContact);\n\nfunction EdgeCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == EdgeShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const shapeA = fixtureA.getShape() as EdgeShape;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\nfunction ChainCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == ChainShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const chain = fixtureA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n const shapeA = edge;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\n// Compute contact points for edge versus circle.\n// This accounts for edge connectivity.\nexport const CollideEdgeCircle = function (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle in frame of edge\n const Q = Transform.mulTVec2(xfA, Transform.mulVec2(xfB, circleB.m_p));\n\n const A = edgeA.m_vertex1;\n const B = edgeA.m_vertex2;\n const e = Vec2.sub(B, A);\n\n // Barycentric coordinates\n const u = Vec2.dot(e, Vec2.sub(B, Q));\n const v = Vec2.dot(e, Vec2.sub(Q, A));\n\n const radius = edgeA.m_radius + circleB.m_radius;\n\n // Region A\n if (v <= 0.0) {\n const P = Vec2.clone(A);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to A?\n if (edgeA.m_hasVertex0) {\n const A1 = edgeA.m_vertex0;\n const B1 = A;\n const e1 = Vec2.sub(B1, A1);\n const u1 = Vec2.dot(e1, Vec2.sub(B1, Q));\n\n // Is the circle in Region AB of the previous edge?\n if (u1 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region B\n if (u <= 0.0) {\n const P = Vec2.clone(B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to B?\n if (edgeA.m_hasVertex3) {\n const B2 = edgeA.m_vertex3;\n const A2 = B;\n const e2 = Vec2.sub(B2, A2);\n const v2 = Vec2.dot(e2, Vec2.sub(Q, A2));\n\n // Is the circle in Region AB of the next edge?\n if (v2 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 1;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region AB\n const den = Vec2.dot(e, e);\n _ASSERT && console.assert(den > 0.0);\n const P = Vec2.combine(u / den, A, v / den, B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n const n = Vec2.neo(-e.y, e.x);\n if (Vec2.dot(n, Vec2.sub(Q, A)) < 0.0) {\n n.setNum(-n.x, -n.y);\n }\n n.normalize();\n\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal = n;\n manifold.localPoint.setVec2(A);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_face;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2 } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Manifold, clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport { Contact } from '../../dynamics/Contact';\nimport { PolygonShape } from './PolygonShape';\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, PolygonShape.TYPE, PolygonContact);\n\nfunction PolygonContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == PolygonShape.TYPE);\n CollidePolygons(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as PolygonShape, xfB);\n}\n\ninterface MaxSeparation {\n maxSeparation: number;\n bestIndex: number;\n}\n\n/**\n * Find the max separation between poly1 and poly2 using edge normals from\n * poly1.\n */\nfunction findMaxSeparation(poly1: PolygonShape, xf1: Transform, poly2: PolygonShape, xf2: Transform, output: MaxSeparation): void {\n const count1 = poly1.m_count;\n const count2 = poly2.m_count;\n const n1s = poly1.m_normals;\n const v1s = poly1.m_vertices;\n const v2s = poly2.m_vertices;\n const xf = Transform.mulTXf(xf2, xf1);\n\n let bestIndex = 0;\n let maxSeparation = -Infinity;\n for (let i = 0; i < count1; ++i) {\n // Get poly1 normal in frame2.\n const n = Rot.mulVec2(xf.q, n1s[i]);\n const v1 = Transform.mulVec2(xf, v1s[i]);\n\n // Find deepest point for normal i.\n let si = Infinity;\n for (let j = 0; j < count2; ++j) {\n const sij = Vec2.dot(n, v2s[j]) - Vec2.dot(n, v1);\n if (sij < si) {\n si = sij;\n }\n }\n\n if (si > maxSeparation) {\n maxSeparation = si;\n bestIndex = i;\n }\n }\n\n // used to keep last FindMaxSeparation call values\n output.maxSeparation = maxSeparation;\n output.bestIndex = bestIndex;\n}\n\nfunction findIncidentEdge(c: ClipVertex[], poly1: PolygonShape, xf1: Transform, edge1: number, poly2: PolygonShape, xf2: Transform): void {\n const normals1 = poly1.m_normals;\n\n const count2 = poly2.m_count;\n const vertices2 = poly2.m_vertices;\n const normals2 = poly2.m_normals;\n\n _ASSERT && console.assert(0 <= edge1 && edge1 < poly1.m_count);\n\n // Get the normal of the reference edge in poly2's frame.\n const normal1 = Rot.mulTVec2(xf2.q, Rot.mulVec2(xf1.q, normals1[edge1]));\n\n // Find the incident edge on poly2.\n let index = 0;\n let minDot = Infinity;\n for (let i = 0; i < count2; ++i) {\n const dot = Vec2.dot(normal1, normals2[i]);\n if (dot < minDot) {\n minDot = dot;\n index = i;\n }\n }\n\n // Build the clip vertices for the incident edge.\n const i1 = index;\n const i2 = i1 + 1 < count2 ? i1 + 1 : 0;\n\n c[0].v = Transform.mulVec2(xf2, vertices2[i1]);\n c[0].id.cf.indexA = edge1;\n c[0].id.cf.indexB = i1;\n c[0].id.cf.typeA = ContactFeatureType.e_face;\n c[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n c[1].v = Transform.mulVec2(xf2, vertices2[i2]);\n c[1].id.cf.indexA = edge1;\n c[1].id.cf.indexB = i2;\n c[1].id.cf.typeA = ContactFeatureType.e_face;\n c[1].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n\nconst maxSeparation = {\n maxSeparation: 0,\n bestIndex: 0,\n};\n\n/**\n *\n * Find edge normal of max separation on A - return if separating axis is found
\n * Find edge normal of max separation on B - return if separation axis is found
\n * Choose reference edge as min(minA, minB)
\n * Find incident edge
\n * Clip\n *\n * The normal points from 1 to 2\n */\nexport const CollidePolygons = function (manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform): void {\n manifold.pointCount = 0;\n const totalRadius = polyA.m_radius + polyB.m_radius;\n\n findMaxSeparation(polyA, xfA, polyB, xfB, maxSeparation);\n const edgeA = maxSeparation.bestIndex;\n const separationA = maxSeparation.maxSeparation;\n if (separationA > totalRadius)\n return;\n\n findMaxSeparation(polyB, xfB, polyA, xfA, maxSeparation);\n const edgeB = maxSeparation.bestIndex;\n const separationB = maxSeparation.maxSeparation;\n if (separationB > totalRadius)\n return;\n\n let poly1; // reference polygon\n let poly2; // incident polygon\n let xf1;\n let xf2;\n let edge1; // reference edge\n let flip;\n const k_tol = 0.1 * Settings.linearSlop;\n\n if (separationB > separationA + k_tol) {\n poly1 = polyB;\n poly2 = polyA;\n xf1 = xfB;\n xf2 = xfA;\n edge1 = edgeB;\n manifold.type = ManifoldType.e_faceB;\n flip = 1;\n } else {\n poly1 = polyA;\n poly2 = polyB;\n xf1 = xfA;\n xf2 = xfB;\n edge1 = edgeA;\n manifold.type = ManifoldType.e_faceA;\n flip = 0;\n }\n\n const incidentEdge = [ new ClipVertex(), new ClipVertex() ];\n findIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);\n\n const count1 = poly1.m_count;\n const vertices1 = poly1.m_vertices;\n\n const iv1 = edge1;\n const iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0;\n\n let v11 = vertices1[iv1];\n let v12 = vertices1[iv2];\n\n const localTangent = Vec2.sub(v12, v11);\n localTangent.normalize();\n\n const localNormal = Vec2.crossVec2Num(localTangent, 1.0);\n const planePoint = Vec2.combine(0.5, v11, 0.5, v12);\n\n const tangent = Rot.mulVec2(xf1.q, localTangent);\n const normal = Vec2.crossVec2Num(tangent, 1.0);\n\n v11 = Transform.mulVec2(xf1, v11);\n v12 = Transform.mulVec2(xf1, v12);\n\n // Face offset.\n const frontOffset = Vec2.dot(normal, v11);\n\n // Side offsets, extended by polytope skin thickness.\n const sideOffset1 = -Vec2.dot(tangent, v11) + totalRadius;\n const sideOffset2 = Vec2.dot(tangent, v12) + totalRadius;\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, incidentEdge, Vec2.neg(tangent), sideOffset1, iv1);\n\n if (np < 2) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2);\n\n if (np < 2) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n manifold.localNormal = localNormal;\n manifold.localPoint = planePoint;\n\n let pointCount = 0;\n for (let i = 0; i < clipPoints2.length/* maxManifoldPoints */; ++i) {\n const separation = Vec2.dot(normal, clipPoints2[i].v) - frontOffset;\n\n if (separation <= totalRadius) {\n const cp = manifold.points[pointCount];\n cp.localPoint.setVec2(Transform.mulTVec2(xf2, clipPoints2[i].v));\n cp.id = clipPoints2[i].id;\n if (flip) {\n // Swap features\n const cf = cp.id.cf;\n const indexA = cf.indexA;\n const indexB = cf.indexB;\n const typeA = cf.typeA;\n const typeB = cf.typeB;\n cf.indexA = indexB;\n cf.indexB = indexA;\n cf.typeA = typeB;\n cf.typeB = typeA;\n }\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { CircleShape } from './CircleShape';\nimport { PolygonShape } from './PolygonShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, CircleShape.TYPE, PolygonCircleContact);\n\nfunction PolygonCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n CollidePolygonCircle(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport const CollidePolygonCircle = function (manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle position in the frame of the polygon.\n const c = Transform.mulVec2(xfB, circleB.m_p);\n const cLocal = Transform.mulTVec2(xfA, c);\n\n // Find the min separating edge.\n let normalIndex = 0;\n let separation = -Infinity;\n const radius = polygonA.m_radius + circleB.m_radius;\n const vertexCount = polygonA.m_count;\n const vertices = polygonA.m_vertices;\n const normals = polygonA.m_normals;\n\n for (let i = 0; i < vertexCount; ++i) {\n const s = Vec2.dot(normals[i], Vec2.sub(cLocal, vertices[i]));\n\n if (s > radius) {\n // Early out.\n return;\n }\n\n if (s > separation) {\n separation = s;\n normalIndex = i;\n }\n }\n\n // Vertices that subtend the incident face.\n const vertIndex1 = normalIndex;\n const vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0;\n const v1 = vertices[vertIndex1];\n const v2 = vertices[vertIndex2];\n\n // If the center is inside the polygon ...\n if (separation < Math.EPSILON) {\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[normalIndex]);\n manifold.localPoint.setCombine(0.5, v1, 0.5, v2);\n manifold.points[0].localPoint = circleB.m_p;\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Compute barycentric coordinates\n const u1 = Vec2.dot(Vec2.sub(cLocal, v1), Vec2.sub(v2, v1));\n const u2 = Vec2.dot(Vec2.sub(cLocal, v2), Vec2.sub(v1, v2));\n if (u1 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v1) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v1);\n manifold.localNormal.normalize();\n manifold.localPoint = v1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else if (u2 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v2) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v2);\n manifold.localNormal.normalize();\n manifold.localPoint.setVec2(v2);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else {\n const faceCenter = Vec2.mid(v1, v2);\n const separation = Vec2.dot(cLocal, normals[vertIndex1]) - Vec2.dot(faceCenter, normals[vertIndex1]);\n if (separation > radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[vertIndex1]);\n manifold.localPoint.setVec2(faceCenter);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Settings } from '../../Settings';\nimport { Contact } from '../../dynamics/Contact';\nimport { Manifold, clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport { EdgeShape } from './EdgeShape';\nimport { ChainShape } from './ChainShape';\nimport { PolygonShape } from './PolygonShape';\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, PolygonShape.TYPE, EdgePolygonContact);\nContact.addType(ChainShape.TYPE, PolygonShape.TYPE, ChainPolygonContact);\n\nfunction EdgePolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fA.getType() == EdgeShape.TYPE);\n _ASSERT && console.assert(fB.getType() == PolygonShape.TYPE);\n\n CollideEdgePolygon(manifold, fA.getShape() as EdgeShape, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nfunction ChainPolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fA.getType() == ChainShape.TYPE);\n _ASSERT && console.assert(fB.getType() == PolygonShape.TYPE);\n\n const chain = fA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n CollideEdgePolygon(manifold, edge, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nenum EPAxisType {\n e_unknown = -1,\n e_edgeA = 1,\n e_edgeB = 2,\n}\n\n// unused?\nenum VertexType {\n e_isolated = 0,\n e_concave = 1,\n e_convex = 2,\n}\n\n/**\n * This structure is used to keep track of the best separating axis.\n */\nclass EPAxis {\n type: EPAxisType;\n index: number;\n separation: number;\n}\n\n/**\n * This holds polygon B expressed in frame A.\n */\nclass TempPolygon {\n vertices: Vec2[] = []; // [Settings.maxPolygonVertices]\n normals: Vec2[] = []; // [Settings.maxPolygonVertices];\n count: number = 0;\n}\n\n/**\n * Reference face used for clipping\n */\nclass ReferenceFace {\n i1: number;\n i2: number;\n v1: Vec2;\n v2: Vec2;\n normal: Vec2 = Vec2.zero();\n sideNormal1: Vec2 = Vec2.zero();\n sideOffset1: number;\n sideNormal2: Vec2 = Vec2.zero();\n sideOffset2: number;\n}\n\n// reused\nconst edgeAxis = new EPAxis();\nconst polygonAxis = new EPAxis();\nconst polygonBA = new TempPolygon();\nconst rf = new ReferenceFace();\n\n/**\n * This function collides and edge and a polygon, taking into account edge\n * adjacency.\n */\nexport const CollideEdgePolygon = function (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform): void {\n // Algorithm:\n // 1. Classify v1 and v2\n // 2. Classify polygon centroid as front or back\n // 3. Flip normal if necessary\n // 4. Initialize normal range to [-pi, pi] about face normal\n // 5. Adjust normal range according to adjacent edges\n // 6. Visit each separating axes, only accept axes within the range\n // 7. Return if _any_ axis indicates separation\n // 8. Clip\n\n // let m_type1: VertexType;\n // let m_type2: VertexType;\n\n const xf = Transform.mulTXf(xfA, xfB);\n\n const centroidB = Transform.mulVec2(xf, polygonB.m_centroid);\n\n const v0 = edgeA.m_vertex0;\n const v1 = edgeA.m_vertex1;\n const v2 = edgeA.m_vertex2;\n const v3 = edgeA.m_vertex3;\n\n const hasVertex0 = edgeA.m_hasVertex0;\n const hasVertex3 = edgeA.m_hasVertex3;\n\n const edge1 = Vec2.sub(v2, v1);\n edge1.normalize();\n const normal1 = Vec2.neo(edge1.y, -edge1.x);\n const offset1 = Vec2.dot(normal1, Vec2.sub(centroidB, v1));\n let offset0 = 0.0;\n let offset2 = 0.0;\n let convex1 = false;\n let convex2 = false;\n\n let normal0;\n let normal2;\n\n // Is there a preceding edge?\n if (hasVertex0) {\n const edge0 = Vec2.sub(v1, v0);\n edge0.normalize();\n normal0 = Vec2.neo(edge0.y, -edge0.x);\n convex1 = Vec2.crossVec2Vec2(edge0, edge1) >= 0.0;\n offset0 = Vec2.dot(normal0, centroidB) - Vec2.dot(normal0, v0);\n }\n\n // Is there a following edge?\n if (hasVertex3) {\n const edge2 = Vec2.sub(v3, v2);\n edge2.normalize();\n normal2 = Vec2.neo(edge2.y, -edge2.x);\n convex2 = Vec2.crossVec2Vec2(edge1, edge2) > 0.0;\n offset2 = Vec2.dot(normal2, centroidB) - Vec2.dot(normal2, v2);\n }\n\n let front;\n const normal = Vec2.zero();\n const lowerLimit = Vec2.zero();\n const upperLimit = Vec2.zero();\n\n // Determine front or back collision. Determine collision normal limits.\n if (hasVertex0 && hasVertex3) {\n if (convex1 && convex2) {\n front = offset0 >= 0.0 || offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex1) {\n front = offset0 >= 0.0 || (offset1 >= 0.0 && offset2 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex2) {\n front = offset2 >= 0.0 || (offset0 >= 0.0 && offset1 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal0);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex0) {\n if (convex1) {\n front = offset0 >= 0.0 || offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex3) {\n if (convex2) {\n front = offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n }\n } else {\n front = offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setVec2(normal1);\n }\n }\n } else {\n front = offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n }\n }\n\n // Get polygonB in frameA\n polygonBA.count = polygonB.m_count;\n for (let i = 0; i < polygonB.m_count; ++i) {\n polygonBA.vertices[i] = Transform.mulVec2(xf, polygonB.m_vertices[i]);\n polygonBA.normals[i] = Rot.mulVec2(xf.q, polygonB.m_normals[i]);\n }\n\n const radius = 2.0 * Settings.polygonRadius;\n\n manifold.pointCount = 0;\n\n { // ComputeEdgeSeparation\n edgeAxis.type = EPAxisType.e_edgeA;\n edgeAxis.index = front ? 0 : 1;\n edgeAxis.separation = Infinity;\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const s = Vec2.dot(normal, Vec2.sub(polygonBA.vertices[i], v1));\n if (s < edgeAxis.separation) {\n edgeAxis.separation = s;\n }\n }\n }\n\n // If no valid normal can be found than this edge should not collide.\n // @ts-ignore\n if (edgeAxis.type == EPAxisType.e_unknown) {\n return;\n }\n\n if (edgeAxis.separation > radius) {\n return;\n }\n\n { // ComputePolygonSeparation\n polygonAxis.type = EPAxisType.e_unknown;\n polygonAxis.index = -1;\n polygonAxis.separation = -Infinity;\n\n const perp = Vec2.neo(-normal.y, normal.x);\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const n = Vec2.neg(polygonBA.normals[i]);\n\n const s1 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v1));\n const s2 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v2));\n const s = Math.min(s1, s2);\n\n if (s > radius) {\n // No collision\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n break;\n }\n\n // Adjacency\n if (Vec2.dot(n, perp) >= 0.0) {\n if (Vec2.dot(Vec2.sub(n, upperLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n } else {\n if (Vec2.dot(Vec2.sub(n, lowerLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n }\n\n if (s > polygonAxis.separation) {\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n }\n }\n }\n\n if (polygonAxis.type != EPAxisType.e_unknown && polygonAxis.separation > radius) {\n return;\n }\n\n // Use hysteresis for jitter reduction.\n const k_relativeTol = 0.98;\n const k_absoluteTol = 0.001;\n\n let primaryAxis;\n if (polygonAxis.type == EPAxisType.e_unknown) {\n primaryAxis = edgeAxis;\n } else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) {\n primaryAxis = polygonAxis;\n } else {\n primaryAxis = edgeAxis;\n }\n\n const ie = [ new ClipVertex(), new ClipVertex() ];\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.type = ManifoldType.e_faceA;\n\n // Search for the polygon normal that is most anti-parallel to the edge\n // normal.\n let bestIndex = 0;\n let bestValue = Vec2.dot(normal, polygonBA.normals[0]);\n for (let i = 1; i < polygonBA.count; ++i) {\n const value = Vec2.dot(normal, polygonBA.normals[i]);\n if (value < bestValue) {\n bestValue = value;\n bestIndex = i;\n }\n }\n\n const i1 = bestIndex;\n const i2 = i1 + 1 < polygonBA.count ? i1 + 1 : 0;\n\n ie[0].v = polygonBA.vertices[i1];\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = i1;\n ie[0].id.cf.typeA = ContactFeatureType.e_face;\n ie[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n ie[1].v = polygonBA.vertices[i2];\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = i2;\n ie[1].id.cf.typeA = ContactFeatureType.e_face;\n ie[1].id.cf.typeB = ContactFeatureType.e_vertex;\n\n if (front) {\n rf.i1 = 0;\n rf.i2 = 1;\n rf.v1 = v1;\n rf.v2 = v2;\n rf.normal.setVec2(normal1);\n } else {\n rf.i1 = 1;\n rf.i2 = 0;\n rf.v1 = v2;\n rf.v2 = v1;\n rf.normal.setMul(-1, normal1);\n }\n } else {\n manifold.type = ManifoldType.e_faceB;\n\n ie[0].v = v1;\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = primaryAxis.index;\n ie[0].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[0].id.cf.typeB = ContactFeatureType.e_face;\n\n ie[1].v = v2;\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = primaryAxis.index;\n ie[1].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[1].id.cf.typeB = ContactFeatureType.e_face;\n\n rf.i1 = primaryAxis.index;\n rf.i2 = rf.i1 + 1 < polygonBA.count ? rf.i1 + 1 : 0;\n rf.v1 = polygonBA.vertices[rf.i1];\n rf.v2 = polygonBA.vertices[rf.i2];\n rf.normal.setVec2(polygonBA.normals[rf.i1]);\n }\n\n rf.sideNormal1.setNum(rf.normal.y, -rf.normal.x);\n rf.sideNormal2.setMul(-1, rf.sideNormal1);\n rf.sideOffset1 = Vec2.dot(rf.sideNormal1, rf.v1);\n rf.sideOffset2 = Vec2.dot(rf.sideNormal2, rf.v2);\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.localNormal = Vec2.clone(rf.normal);\n manifold.localPoint = Vec2.clone(rf.v1);\n } else {\n manifold.localNormal = Vec2.clone(polygonB.m_normals[rf.i1]);\n manifold.localPoint = Vec2.clone(polygonB.m_vertices[rf.i1]);\n }\n\n let pointCount = 0;\n for (let i = 0; i < Settings.maxManifoldPoints; ++i) {\n const separation = Vec2.dot(rf.normal, Vec2.sub(clipPoints2[i].v, rf.v1));\n\n if (separation <= radius) {\n const cp = manifold.points[pointCount]; // ManifoldPoint\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n cp.localPoint = Transform.mulTVec2(xf, clipPoints2[i].v);\n cp.id = clipPoints2[i].id;\n } else {\n cp.localPoint = clipPoints2[i].v;\n cp.id.cf.typeA = clipPoints2[i].id.cf.typeB;\n cp.id.cf.typeB = clipPoints2[i].id.cf.typeA;\n cp.id.cf.indexA = clipPoints2[i].id.cf.indexB;\n cp.id.cf.indexB = clipPoints2[i].id.cf.indexA;\n }\n\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","export * from './serializer/index';\n\nexport * from './common/Math';\n\nexport * from './common/Vec2';\nexport * from './common/Vec3';\nexport * from './common/Mat22';\nexport * from './common/Mat33';\nexport * from './common/Transform';\nexport * from './common/Rot';\n\nexport * from './collision/AABB';\n\nexport * from './collision/Shape';\nexport * from './dynamics/Fixture';\nexport * from './dynamics/Body';\nexport * from './dynamics/Contact';\nexport * from './dynamics/Joint';\nexport * from './dynamics/World';\n\nexport * from './collision/shape/CircleShape';\nexport * from './collision/shape/EdgeShape';\nexport * from './collision/shape/PolygonShape';\nexport * from './collision/shape/ChainShape';\nexport * from './collision/shape/BoxShape';\n\nexport * from './collision/shape/CollideCircle';\nexport * from './collision/shape/CollideEdgeCircle';\nexport * from './collision/shape/CollidePolygon';\nexport * from './collision/shape/CollideCirclePolygon';\nexport * from './collision/shape/CollideEdgePolygon';\n\nexport * from './dynamics/joint/DistanceJoint';\nexport * from './dynamics/joint/FrictionJoint';\nexport * from './dynamics/joint/GearJoint';\nexport * from './dynamics/joint/MotorJoint';\nexport * from './dynamics/joint/MouseJoint';\nexport * from './dynamics/joint/PrismaticJoint';\nexport * from './dynamics/joint/PulleyJoint';\nexport * from './dynamics/joint/RevoluteJoint';\nexport * from './dynamics/joint/RopeJoint';\nexport * from './dynamics/joint/WeldJoint';\nexport * from './dynamics/joint/WheelJoint';\n\nexport * from './Settings';\n\nexport * from './common/Sweep';\nexport * from './collision/Manifold';\nexport * from './collision/Distance';\nexport * from './collision/TimeOfImpact';\nexport * from './collision/DynamicTree';\nexport * from './util/stats';\n\nimport { CollidePolygons } from './collision/shape/CollidePolygon';\nimport { Settings } from './Settings';\nimport { Sweep } from './common/Sweep';\nimport { DynamicTree } from './collision/DynamicTree';\nimport { Manifold } from './collision/Manifold';\nimport { Distance } from './collision/Distance';\nimport { TimeOfImpact } from './collision/TimeOfImpact';\nimport { stats } from './util/stats';\n\n/** @deprecated Merged with main namespace */\nexport const internal = {\n CollidePolygons,\n Settings,\n Sweep,\n Manifold,\n Distance,\n TimeOfImpact,\n DynamicTree,\n stats\n};\n"],"names":["Math","DEFAULTS","inactiveLimit","atLowerLimit","atUpperLimit","equalLimits"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,C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AA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAC,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC;AAC1D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA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,CAAA,CAAA,CAAA;AACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA;AAC3E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA;AAC3E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,EAAE,CAAI,CAAA,CAAA,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,EAAE,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAA,CAAI,C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"} \ No newline at end of file diff --git a/dist/planck.min.js b/dist/planck.min.js index 57f17926..408e77e2 100644 --- a/dist/planck.min.js +++ b/dist/planck.min.js @@ -1,5 +1,5 @@ /** - * Planck.js v1.0.0-alpha.4 + * Planck.js v1.0.0-beta.0 * @license The MIT license * @copyright Copyright (c) 2021 Erin Catto, Ali Shakiba * @@ -35,5 +35,5 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */var e=function(t,i){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i])})(t,i)};function i(t,i){if("function"!=typeof i&&null!==i)throw new TypeError("Class extends value "+String(i)+" is not a constructor or null");function o(){this.constructor=t}e(t,i),t.prototype=null===i?Object.create(i):(o.prototype=i.prototype,new o)}var o=function(){return(o=Object.assign||function(t){for(var e,i=1,o=arguments.length;i>1,t|=t>>2,t|=t>>4,t|=t>>8,(t|=t>>16)+1},r.isPowerOfTwo=function(t){return t>0&&0==(t&t-1)},r.mod=function(t,e,i){return void 0===e?(i=1,e=0):void 0===i&&(i=e,e=0),i>e?(t=(t-e)%(i-e))+(t<0?i:e):(t=(t-i)%(e-i))+(t<=0?e:i)},r.clamp=function(t,e,i){return ti?i:t},r.random=function(t,e){return void 0===t?(e=1,t=0):void 0===e&&(e=t,t=0),t===e?t:Math.random()*(e-t)+t};var m,a,c,h=function(){function t(e,i){if(!(this instanceof t))return new t(e,i);void 0===e?(this.x=0,this.y=0):"object"==typeof e?(this.x=e.x,this.y=e.y):(this.x=e,this.y=i)}return t.prototype._serialize=function(){return{x:this.x,y:this.y}},t._deserialize=function(e){var i=Object.create(t.prototype);return i.x=e.x,i.y=e.y,i},t.zero=function(){var e=Object.create(t.prototype);return e.x=0,e.y=0,e},t.neo=function(e,i){var o=Object.create(t.prototype);return o.x=e,o.y=i,o},t.clone=function(e){return t.neo(e.x,e.y)},t.prototype.toString=function(){return JSON.stringify(this)},t.isValid=function(t){return null!=t&&(r.isFinite(t.x)&&r.isFinite(t.y))},t.assert=function(t){},t.prototype.clone=function(){return t.clone(this)},t.prototype.setZero=function(){return this.x=0,this.y=0,this},t.prototype.set=function(t,e){return"object"==typeof t?(this.x=t.x,this.y=t.y):(this.x=t,this.y=e),this},t.prototype.setNum=function(t,e){return this.x=t,this.y=e,this},t.prototype.setVec2=function(t){return this.x=t.x,this.y=t.y,this},t.prototype.wSet=function(t,e,i,o){return void 0!==i||void 0!==o?this.setCombine(t,e,i,o):this.setMul(t,e)},t.prototype.setCombine=function(t,e,i,o){var s=t*e.x+i*o.x,n=t*e.y+i*o.y;return this.x=s,this.y=n,this},t.prototype.setMul=function(t,e){var i=t*e.x,o=t*e.y;return this.x=i,this.y=o,this},t.prototype.add=function(t){return this.x+=t.x,this.y+=t.y,this},t.prototype.wAdd=function(t,e,i,o){return void 0!==i||void 0!==o?this.addCombine(t,e,i,o):this.addMul(t,e)},t.prototype.addCombine=function(t,e,i,o){var s=t*e.x+i*o.x,n=t*e.y+i*o.y;return this.x+=s,this.y+=n,this},t.prototype.addMul=function(t,e){var i=t*e.x,o=t*e.y;return this.x+=i,this.y+=o,this},t.prototype.wSub=function(t,e,i,o){return void 0!==i||void 0!==o?this.subCombine(t,e,i,o):this.subMul(t,e)},t.prototype.subCombine=function(t,e,i,o){var s=t*e.x+i*o.x,n=t*e.y+i*o.y;return this.x-=s,this.y-=n,this},t.prototype.subMul=function(t,e){var i=t*e.x,o=t*e.y;return this.x-=i,this.y-=o,this},t.prototype.sub=function(t){return this.x-=t.x,this.y-=t.y,this},t.prototype.mul=function(t){return this.x*=t,this.y*=t,this},t.prototype.length=function(){return t.lengthOf(this)},t.prototype.lengthSquared=function(){return t.lengthSquared(this)},t.prototype.normalize=function(){var t=this.length();if(tt*t){var i=r.invSqrt(e);this.x*=i*t,this.y*=i*t}return this},t.clamp=function(e,i){return(e=t.neo(e.x,e.y)).clamp(i),e},t.scaleFn=function(e,i){return function(o){return t.neo(o.x*e,o.y*i)}},t.translateFn=function(e,i){return function(o){return t.neo(o.x+e,o.y+i)}},t}(),_=function(){function t(e,i){if(!(this instanceof t))return new t(e,i);this.lowerBound=h.zero(),this.upperBound=h.zero(),"object"==typeof e&&this.lowerBound.setVec2(e),"object"==typeof i?this.upperBound.setVec2(i):"object"==typeof e&&this.upperBound.setVec2(e)}return t.prototype.isValid=function(){return t.isValid(this)},t.isValid=function(t){return null!=t&&(h.isValid(t.lowerBound)&&h.isValid(t.upperBound)&&h.sub(t.upperBound,t.lowerBound).lengthSquared()>=0)},t.assert=function(t){},t.prototype.getCenter=function(){return h.neo(.5*(this.lowerBound.x+this.upperBound.x),.5*(this.lowerBound.y+this.upperBound.y))},t.prototype.getExtents=function(){return h.neo(.5*(this.upperBound.x-this.lowerBound.x),.5*(this.upperBound.y-this.lowerBound.y))},t.prototype.getPerimeter=function(){return 2*(this.upperBound.x-this.lowerBound.x+this.upperBound.y-this.lowerBound.y)},t.prototype.combine=function(t,e){e=e||this;var i=t.lowerBound,o=t.upperBound,s=e.lowerBound,n=e.upperBound,m=r.min(i.x,s.x),a=r.min(i.y,s.y),c=r.max(n.x,o.x),h=r.max(n.y,o.y);this.lowerBound.setNum(m,a),this.upperBound.setNum(c,h)},t.prototype.combinePoints=function(t,e){this.lowerBound.setNum(r.min(t.x,e.x),r.min(t.y,e.y)),this.upperBound.setNum(r.max(t.x,e.x),r.max(t.y,e.y))},t.prototype.set=function(t){this.lowerBound.setNum(t.lowerBound.x,t.lowerBound.y),this.upperBound.setNum(t.upperBound.x,t.upperBound.y)},t.prototype.contains=function(t){var e=!0;return e=(e=(e=(e=e&&this.lowerBound.x<=t.lowerBound.x)&&this.lowerBound.y<=t.lowerBound.y)&&t.upperBound.x<=this.upperBound.x)&&t.upperBound.y<=this.upperBound.y},t.prototype.extend=function(e){return t.extend(this,e),this},t.extend=function(t,e){t.lowerBound.x-=e,t.lowerBound.y-=e,t.upperBound.x+=e,t.upperBound.y+=e},t.testOverlap=function(t,e){var i=e.lowerBound.x-t.upperBound.x,o=t.lowerBound.x-e.upperBound.x,s=e.lowerBound.y-t.upperBound.y,n=t.lowerBound.y-e.upperBound.y;return!(i>0||s>0||o>0||n>0)},t.areEqual=function(t,e){return h.areEqual(t.lowerBound,e.lowerBound)&&h.areEqual(t.upperBound,e.upperBound)},t.diff=function(t,e){var i=r.max(0,r.min(t.upperBound.x,e.upperBound.x)-r.max(e.lowerBound.x,t.lowerBound.x)),o=r.max(0,r.min(t.upperBound.y,e.upperBound.y)-r.max(e.lowerBound.y,t.lowerBound.y));return(t.upperBound.x-t.lowerBound.x)*(t.upperBound.y-t.lowerBound.y)+(e.upperBound.x-e.lowerBound.x)*(e.upperBound.y-e.lowerBound.y)-i*o},t.prototype.rayCast=function(t,e){for(var i=-1/0,o=1/0,s=e.p1,n=h.sub(e.p2,e.p1),m=h.abs(n),a=h.zero(),c="x";null!==c;c="x"===c?"y":null)if(m.xu){var y=l;l=u,u=y,p=1}if(l>i&&(a.setZero(),a[c]=p,i=l),i>(o=r.min(o,u)))return!1}return!(i<0||e.maxFraction0?t=this._list.shift():(this._createCount++,t="function"==typeof this._createFn?this._createFn():{}),this._outCount++,"function"==typeof this._outFn&&this._outFn(t),t},t.prototype.release=function(t){this._list.length"+this._outCount+" <"+this._inCount+" -"+this._discardCount+" ="+this._list.length+"/"+this._max},t}(),p=function(){function t(t){this.aabb=new _,this.userData=null,this.parent=null,this.child1=null,this.child2=null,this.height=-1,this.id=t}return t.prototype.toString=function(){return this.id+": "+this.userData},t.prototype.isLeaf=function(){return null==this.child1},t}(),y=function(){function t(){this.inputPool=new u({create:function(){return{}},release:function(t){}}),this.stackPool=new u({create:function(){return[]},release:function(t){t.length=0}}),this.iteratorPool=new u({create:function(){return new d},release:function(t){t.close()}}),this.m_root=null,this.m_nodes={},this.m_lastProxyId=0,this.m_pool=new u({create:function(){return new p}})}return t.prototype.getUserData=function(t){return this.m_nodes[t].userData},t.prototype.getFatAABB=function(t){return this.m_nodes[t].aabb},t.prototype.allocateNode=function(){var t=this.m_pool.allocate();return t.id=++this.m_lastProxyId,t.userData=null,t.parent=null,t.child1=null,t.child2=null,t.height=-1,this.m_nodes[t.id]=t,t},t.prototype.freeNode=function(t){this.m_pool.release(t),t.height=-1,delete this.m_nodes[t.id]},t.prototype.createProxy=function(t,e){var i=this.allocateNode();return i.aabb.set(t),_.extend(i.aabb,l.aabbExtension),i.userData=e,i.height=0,this.insertLeaf(i),i.id},t.prototype.destroyProxy=function(t){var e=this.m_nodes[t];this.removeLeaf(e),this.freeNode(e)},t.prototype.moveProxy=function(t,e,i){var o=this.m_nodes[t];return!o.aabb.contains(e)&&(this.removeLeaf(o),o.aabb.set(e),e=o.aabb,_.extend(e,l.aabbExtension),i.x<0?e.lowerBound.x+=i.x*l.aabbMultiplier:e.upperBound.x+=i.x*l.aabbMultiplier,i.y<0?e.lowerBound.y+=i.y*l.aabbMultiplier:e.upperBound.y+=i.y*l.aabbMultiplier,this.insertLeaf(o),!0)},t.prototype.insertLeaf=function(t){if(null==this.m_root)return this.m_root=t,void(this.m_root.parent=null);for(var e=t.aabb,i=this.m_root;!i.isLeaf();){var o=i.child1,s=i.child2,n=i.aabb.getPerimeter(),m=new _;m.combine(i.aabb,e);var a=m.getPerimeter(),c=2*a,h=2*(a-n),l=void 0;if(o.isLeaf()){(y=new _).combine(e,o.aabb),l=y.getPerimeter()+h}else{(y=new _).combine(e,o.aabb);var u=o.aabb.getPerimeter();l=y.getPerimeter()-u+h}var p=void 0;if(s.isLeaf()){(y=new _).combine(e,s.aabb),p=y.getPerimeter()+h}else{var y;(y=new _).combine(e,s.aabb);u=s.aabb.getPerimeter();p=y.getPerimeter()-u+h}if(c1){var n=o.child1,m=o.child2;return o.child1=e,o.parent=e.parent,e.parent=o,null!=o.parent?o.parent.child1===t?o.parent.child1=o:o.parent.child2=o:this.m_root=o,n.height>m.height?(o.child2=n,e.child2=m,m.parent=e,e.aabb.combine(i.aabb,m.aabb),o.aabb.combine(e.aabb,n.aabb),e.height=1+r.max(i.height,m.height),o.height=1+r.max(e.height,n.height)):(o.child2=m,e.child2=n,n.parent=e,e.aabb.combine(i.aabb,n.aabb),o.aabb.combine(e.aabb,m.aabb),e.height=1+r.max(i.height,n.height),o.height=1+r.max(e.height,m.height)),o}if(s<-1){var a=i.child1,c=i.child2;return i.child1=e,i.parent=e.parent,e.parent=i,null!=i.parent?i.parent.child1===e?i.parent.child1=i:i.parent.child2=i:this.m_root=i,a.height>c.height?(i.child2=a,e.child1=c,c.parent=e,e.aabb.combine(o.aabb,c.aabb),i.aabb.combine(e.aabb,a.aabb),e.height=1+r.max(o.height,c.height),i.height=1+r.max(e.height,a.height)):(i.child2=c,e.child1=a,a.parent=e,e.aabb.combine(o.aabb,a.aabb),i.aabb.combine(e.aabb,c.aabb),e.height=1+r.max(o.height,a.height),i.height=1+r.max(e.height,c.height)),i}return e},t.prototype.getHeight=function(){return null==this.m_root?0:this.m_root.height},t.prototype.getAreaRatio=function(){if(null==this.m_root)return 0;for(var t,e=this.m_root.aabb.getPerimeter(),i=0,o=this.iteratorPool.allocate().preorder(this.m_root);t=o.next();)t.height<0||(i+=t.aabb.getPerimeter());return this.iteratorPool.release(o),i/e},t.prototype.computeHeight=function(t){var e;if((e=void 0!==t?this.m_nodes[t]:this.m_root).isLeaf())return 0;var i=this.computeHeight(e.child1.id),o=this.computeHeight(e.child2.id);return 1+r.max(i,o)},t.prototype.validateStructure=function(t){if(null!=t){this.m_root;var e=t.child1,i=t.child2;t.isLeaf()||(this.validateStructure(e),this.validateStructure(i))}},t.prototype.validateMetrics=function(t){if(null!=t){var e=t.child1,i=t.child2;if(!t.isLeaf()){var o=e.height,s=i.height;r.max(o,s),(new _).combine(e.aabb,i.aabb),this.validateMetrics(e),this.validateMetrics(i)}}},t.prototype.validate=function(){this.validateStructure(this.m_root),this.validateMetrics(this.m_root)},t.prototype.getMaxBalance=function(){for(var t,e=0,i=this.iteratorPool.allocate().preorder(this.m_root);t=i.next();)if(!(t.height<=1)){var o=r.abs(t.child2.height-t.child1.height);e=r.max(e,o)}return this.iteratorPool.release(i),e},t.prototype.rebuildBottomUp=function(){for(var t,e=[],i=0,o=this.iteratorPool.allocate().preorder(this.m_root);t=o.next();)t.height<0||(t.isLeaf()?(t.parent=null,e[i]=t,++i):this.freeNode(t));for(this.iteratorPool.release(o);i>1;){for(var s=1/0,n=-1,m=-1,a=0;a0;){var o=i.pop();if(null!=o)if(_.testOverlap(o.aabb,t))if(o.isLeaf()){if(!1===e(o.id))return}else i.push(o.child1),i.push(o.child2)}this.stackPool.release(i)},t.prototype.rayCast=function(t,e){var i=t.p1,o=t.p2,s=h.sub(o,i);s.normalize();var n=h.crossNumVec2(1,s),m=h.abs(n),a=t.maxFraction,c=new _,l=h.combine(1-a,i,a,o);c.combinePoints(i,l);var u=this.stackPool.allocate(),p=this.inputPool.allocate();for(u.push(this.m_root);u.length>0;){var y=u.pop();if(null!=y&&!1!==_.testOverlap(y.aabb,c)){var d=y.aabb.getCenter(),f=y.aabb.getExtents();if(!(r.abs(h.dot(n,h.sub(i,d)))-h.dot(m,f)>0))if(y.isLeaf()){p.p1=h.clone(t.p1),p.p2=h.clone(t.p2),p.maxFraction=a;var v=e(p,y.id);if(0===v)return;v>0&&(a=v,l=h.combine(1-a,i,a,o),c.combinePoints(i,l))}else u.push(y.child1),u.push(y.child2)}}this.stackPool.release(u),this.inputPool.release(p)},t}(),d=function(){function t(){this.parents=[],this.states=[]}return t.prototype.preorder=function(t){return this.parents.length=0,this.parents.push(t),this.states.length=0,this.states.push(0),this},t.prototype.next=function(){for(;this.parents.length>0;){var t=this.parents.length-1,e=this.parents[t];if(0===this.states[t])return this.states[t]=1,e;if(1===this.states[t]&&(this.states[t]=2,e.child1))return this.parents.push(e.child1),this.states.push(1),e.child1;if(2===this.states[t]&&(this.states[t]=3,e.child2))return this.parents.push(e.child2),this.states.push(1),e.child2;this.parents.pop(),this.states.pop()}},t.prototype.close=function(){this.parents.length=0},t}(),f=function(){function t(){var t=this;this.m_tree=new y,this.m_proxyCount=0,this.m_moveBuffer=[],this.query=function(e,i){t.m_tree.query(e,i)},this.queryCallback=function(e){if(e===t.m_queryProxyId)return!0;var i=r.min(e,t.m_queryProxyId),o=r.max(e,t.m_queryProxyId),s=t.m_tree.getUserData(i),n=t.m_tree.getUserData(o);return t.m_callback(s,n),!0}}return t.prototype.getUserData=function(t){return this.m_tree.getUserData(t)},t.prototype.testOverlap=function(t,e){var i=this.m_tree.getFatAABB(t),o=this.m_tree.getFatAABB(e);return _.testOverlap(i,o)},t.prototype.getFatAABB=function(t){return this.m_tree.getFatAABB(t)},t.prototype.getProxyCount=function(){return this.m_proxyCount},t.prototype.getTreeHeight=function(){return this.m_tree.getHeight()},t.prototype.getTreeBalance=function(){return this.m_tree.getMaxBalance()},t.prototype.getTreeQuality=function(){return this.m_tree.getAreaRatio()},t.prototype.rayCast=function(t,e){this.m_tree.rayCast(t,e)},t.prototype.shiftOrigin=function(t){this.m_tree.shiftOrigin(t)},t.prototype.createProxy=function(t,e){var i=this.m_tree.createProxy(t,e);return this.m_proxyCount++,this.bufferMove(i),i},t.prototype.destroyProxy=function(t){this.unbufferMove(t),this.m_proxyCount--,this.m_tree.destroyProxy(t)},t.prototype.moveProxy=function(t,e,i){this.m_tree.moveProxy(t,e,i)&&this.bufferMove(t)},t.prototype.touchProxy=function(t){this.bufferMove(t)},t.prototype.bufferMove=function(t){this.m_moveBuffer.push(t)},t.prototype.unbufferMove=function(t){for(var e=0;e0;)if(this.m_queryProxyId=this.m_moveBuffer.pop(),null!==this.m_queryProxyId){var e=this.m_tree.getFatAABB(this.m_queryProxyId);this.m_tree.query(e,this.queryCallback)}},t}(),v=function(){function t(e){if(!(this instanceof t))return new t(e);"number"==typeof e?this.setAngle(e):"object"==typeof e?this.setRot(e):this.setIdentity()}return t.neo=function(e){var i=Object.create(t.prototype);return i.setAngle(e),i},t.clone=function(e){var i=Object.create(t.prototype);return i.s=e.s,i.c=e.c,i},t.identity=function(){var e=Object.create(t.prototype);return e.s=0,e.c=1,e},t.isValid=function(t){return null!=t&&(r.isFinite(t.s)&&r.isFinite(t.c))},t.assert=function(t){},t.prototype.setIdentity=function(){this.s=0,this.c=1},t.prototype.set=function(t){"object"==typeof t?(this.s=t.s,this.c=t.c):(this.s=r.sin(t),this.c=r.cos(t))},t.prototype.setRot=function(t){this.s=t.s,this.c=t.c},t.prototype.setAngle=function(t){this.s=r.sin(t),this.c=r.cos(t)},t.prototype.getAngle=function(){return r.atan2(this.s,this.c)},t.prototype.getXAxis=function(){return h.neo(this.c,this.s)},t.prototype.getYAxis=function(){return h.neo(-this.s,this.c)},t.mul=function(e,i){if("c"in i&&"s"in i){var o=t.identity();return o.s=e.s*i.c+e.c*i.s,o.c=e.c*i.c-e.s*i.s,o}if("x"in i&&"y"in i)return h.neo(e.c*i.x-e.s*i.y,e.s*i.x+e.c*i.y)},t.mulRot=function(e,i){var o=t.identity();return o.s=e.s*i.c+e.c*i.s,o.c=e.c*i.c-e.s*i.s,o},t.mulVec2=function(t,e){return h.neo(t.c*e.x-t.s*e.y,t.s*e.x+t.c*e.y)},t.mulSub=function(t,e,i){var o=t.c*(e.x-i.x)-t.s*(e.y-i.y),s=t.s*(e.x-i.x)+t.c*(e.y-i.y);return h.neo(o,s)},t.mulT=function(e,i){if("c"in i&&"s"in i){var o=t.identity();return o.s=e.c*i.s-e.s*i.c,o.c=e.c*i.c+e.s*i.s,o}if("x"in i&&"y"in i)return h.neo(e.c*i.x+e.s*i.y,-e.s*i.x+e.c*i.y)},t.mulTRot=function(e,i){var o=t.identity();return o.s=e.c*i.s-e.s*i.c,o.c=e.c*i.c+e.s*i.s,o},t.mulTVec2=function(t,e){return h.neo(t.c*e.x+t.s*e.y,-t.s*e.x+t.c*e.y)},t}(),x=function(){function t(e,i){if(!(this instanceof t))return new t(e,i);this.p=h.zero(),this.q=v.identity(),void 0!==e&&this.p.setVec2(e),void 0!==i&&this.q.setAngle(i)}return t.clone=function(e){var i=Object.create(t.prototype);return i.p=h.clone(e.p),i.q=v.clone(e.q),i},t.neo=function(e,i){var o=Object.create(t.prototype);return o.p=h.clone(e),o.q=v.clone(i),o},t.identity=function(){var e=Object.create(t.prototype);return e.p=h.zero(),e.q=v.identity(),e},t.prototype.setIdentity=function(){this.p.setZero(),this.q.setIdentity()},t.prototype.set=function(t,e){void 0===e?(this.p.set(t.p),this.q.set(t.q)):(this.p.set(t),this.q.set(e))},t.prototype.setNum=function(t,e){this.p.setVec2(t),this.q.setAngle(e)},t.prototype.setTransform=function(t){this.p.setVec2(t.p),this.q.setRot(t.q)},t.isValid=function(t){return null!=t&&(h.isValid(t.p)&&v.isValid(t.q))},t.assert=function(t){},t.mul=function(e,i){if(Array.isArray(i)){for(var o=[],s=0;s0;var e=0!=(t.m_filterMaskBits&this.m_filterCategoryBits),i=0!=(t.m_filterCategoryBits&this.m_filterMaskBits);return e&&i},t}(),M="static",I="kinematic",z="dynamic",P={type:M,position:h.zero(),angle:0,linearVelocity:h.zero(),angularVelocity:0,linearDamping:0,angularDamping:0,fixedRotation:!1,bullet:!1,gravityScale:1,allowSleep:!0,awake:!0,active:!0,userData:null},S=function(){this.mass=0,this.center=h.zero(),this.I=0},T=function(){function t(t,e){e=s(e,P),this.m_world=t,this.m_awakeFlag=e.awake,this.m_autoSleepFlag=e.allowSleep,this.m_bulletFlag=e.bullet,this.m_fixedRotationFlag=e.fixedRotation,this.m_activeFlag=e.active,this.m_islandFlag=!1,this.m_toiFlag=!1,this.m_userData=e.userData,this.m_type=e.type,this.m_type==z?(this.m_mass=1,this.m_invMass=1):(this.m_mass=0,this.m_invMass=0),this.m_I=0,this.m_invI=0,this.m_xf=x.identity(),this.m_xf.p=h.clone(e.position),this.m_xf.q.setAngle(e.angle),this.m_sweep=new A,this.m_sweep.setTransform(this.m_xf),this.c_velocity=new b,this.c_position=new g,this.m_force=h.zero(),this.m_torque=0,this.m_linearVelocity=h.clone(e.linearVelocity),this.m_angularVelocity=e.angularVelocity,this.m_linearDamping=e.linearDamping,this.m_angularDamping=e.angularDamping,this.m_gravityScale=e.gravityScale,this.m_sleepTime=0,this.m_jointList=null,this.m_contactList=null,this.m_fixtureList=null,this.m_prev=null,this.m_next=null,this.m_destroyed=!1}return t.prototype._serialize=function(){for(var t=[],e=this.m_fixtureList;e;e=e.m_next)t.push(e);return{type:this.m_type,bullet:this.m_bulletFlag,position:this.m_xf.p,angle:this.m_xf.q.getAngle(),linearVelocity:this.m_linearVelocity,angularVelocity:this.m_angularVelocity,fixtures:t}},t._deserialize=function(e,i,o){var s=new t(i,e);if(e.fixtures)for(var n=e.fixtures.length-1;n>=0;n--){var r=o(C,e.fixtures[n],s);s._addFixture(r)}return s},t.prototype.isWorldLocked=function(){return!(!this.m_world||!this.m_world.isLocked())},t.prototype.getWorld=function(){return this.m_world},t.prototype.getNext=function(){return this.m_next},t.prototype.setUserData=function(t){this.m_userData=t},t.prototype.getUserData=function(){return this.m_userData},t.prototype.getFixtureList=function(){return this.m_fixtureList},t.prototype.getJointList=function(){return this.m_jointList},t.prototype.getContactList=function(){return this.m_contactList},t.prototype.isStatic=function(){return this.m_type==M},t.prototype.isDynamic=function(){return this.m_type==z},t.prototype.isKinematic=function(){return this.m_type==I},t.prototype.setStatic=function(){return this.setType(M),this},t.prototype.setDynamic=function(){return this.setType(z),this},t.prototype.setKinematic=function(){return this.setType(I),this},t.prototype.getType=function(){return this.m_type},t.prototype.setType=function(t){if(1!=this.isWorldLocked()&&this.m_type!=t){this.m_type=t,this.resetMassData(),this.m_type==M&&(this.m_linearVelocity.setZero(),this.m_angularVelocity=0,this.m_sweep.forward(),this.synchronizeFixtures()),this.setAwake(!0),this.m_force.setZero(),this.m_torque=0;for(var e=this.m_contactList;e;){var i=e;e=e.next,this.m_world.destroyContact(i.contact)}this.m_contactList=null;for(var o=this.m_world.m_broadPhase,s=this.m_fixtureList;s;s=s.m_next)for(var n=s.m_proxyCount,r=0;r0&&this.setAwake(!0),this.m_linearVelocity.setVec2(t))},t.prototype.getAngularVelocity=function(){return this.m_angularVelocity},t.prototype.setAngularVelocity=function(t){this.m_type!=M&&(t*t>0&&this.setAwake(!0),this.m_angularVelocity=t)},t.prototype.getLinearDamping=function(){return this.m_linearDamping},t.prototype.setLinearDamping=function(t){this.m_linearDamping=t},t.prototype.getAngularDamping=function(){return this.m_angularDamping},t.prototype.setAngularDamping=function(t){this.m_angularDamping=t},t.prototype.getGravityScale=function(){return this.m_gravityScale},t.prototype.setGravityScale=function(t){this.m_gravityScale=t},t.prototype.getMass=function(){return this.m_mass},t.prototype.getInertia=function(){return this.m_I+this.m_mass*h.dot(this.m_sweep.localCenter,this.m_sweep.localCenter)},t.prototype.getMassData=function(t){t.mass=this.m_mass,t.I=this.getInertia(),t.center.setVec2(this.m_sweep.localCenter)},t.prototype.resetMassData=function(){if(this.m_mass=0,this.m_invMass=0,this.m_I=0,this.m_invI=0,this.m_sweep.localCenter.setZero(),this.isStatic()||this.isKinematic())return this.m_sweep.c0.setVec2(this.m_xf.p),this.m_sweep.c.setVec2(this.m_xf.p),void(this.m_sweep.a0=this.m_sweep.a);for(var t=h.zero(),e=this.m_fixtureList;e;e=e.m_next)if(0!=e.m_density){var i=new S;e.getMassData(i),this.m_mass+=i.mass,t.addMul(i.mass,i.center),this.m_I+=i.I}this.m_mass>0?(this.m_invMass=1/this.m_mass,t.mul(this.m_invMass)):(this.m_mass=1,this.m_invMass=1),this.m_I>0&&0==this.m_fixedRotationFlag?(this.m_I-=this.m_mass*h.dot(t,t),this.m_invI=1/this.m_I):(this.m_I=0,this.m_invI=0);var o=h.clone(this.m_sweep.c);this.m_sweep.setLocalCenter(t,this.m_xf),this.m_linearVelocity.add(h.crossNumVec2(this.m_angularVelocity,h.sub(this.m_sweep.c,o)))},t.prototype.setMassData=function(t){if(1!=this.isWorldLocked()&&this.m_type==z){this.m_invMass=0,this.m_I=0,this.m_invI=0,this.m_mass=t.mass,this.m_mass<=0&&(this.m_mass=1),this.m_invMass=1/this.m_mass,t.I>0&&0==this.m_fixedRotationFlag&&(this.m_I=t.I-this.m_mass*h.dot(t.center,t.center),this.m_invI=1/this.m_I);var e=h.clone(this.m_sweep.c);this.m_sweep.setLocalCenter(t.center,this.m_xf),this.m_linearVelocity.add(h.crossNumVec2(this.m_angularVelocity,h.sub(this.m_sweep.c,e)))}},t.prototype.applyForce=function(t,e,i){void 0===i&&(i=!0),this.m_type==z&&(i&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&(this.m_force.add(t),this.m_torque+=h.crossVec2Vec2(h.sub(e,this.m_sweep.c),t)))},t.prototype.applyForceToCenter=function(t,e){void 0===e&&(e=!0),this.m_type==z&&(e&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&this.m_force.add(t))},t.prototype.applyTorque=function(t,e){void 0===e&&(e=!0),this.m_type==z&&(e&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&(this.m_torque+=t))},t.prototype.applyLinearImpulse=function(t,e,i){void 0===i&&(i=!0),this.m_type==z&&(i&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&(this.m_linearVelocity.addMul(this.m_invMass,t),this.m_angularVelocity+=this.m_invI*h.crossVec2Vec2(h.sub(e,this.m_sweep.c),t)))},t.prototype.applyAngularImpulse=function(t,e){void 0===e&&(e=!0),this.m_type==z&&(e&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&(this.m_angularVelocity+=this.m_invI*t))},t.prototype.shouldCollide=function(t){if(this.m_type!=z&&t.m_type!=z)return!1;for(var e=this.m_jointList;e;e=e.next)if(e.other==t&&0==e.joint.m_collideConnected)return!1;return!0},t.prototype._addFixture=function(t){if(1==this.isWorldLocked())return null;if(this.m_activeFlag){var e=this.m_world.m_broadPhase;t.createProxies(e,this.m_xf)}return t.m_next=this.m_fixtureList,this.m_fixtureList=t,t.m_density>0&&this.resetMassData(),this.m_world.m_newFixture=!0,t},t.prototype.createFixture=function(t,e){if(1==this.isWorldLocked())return null;var i=new C(this,t,e);return this._addFixture(i),i},t.prototype.destroyFixture=function(t){if(1!=this.isWorldLocked()){if(this.m_fixtureList===t)this.m_fixtureList=t.m_next;else for(var e=this.m_fixtureList;null!=e;){if(e.m_next===t){e.m_next=t.m_next;break}e=e.m_next}for(var i=this.m_contactList;i;){var o=i.contact;i=i.next;var s=o.getFixtureA(),n=o.getFixtureB();t!=s&&t!=n||this.m_world.destroyContact(o)}if(this.m_activeFlag){var r=this.m_world.m_broadPhase;t.destroyProxies(r)}t.m_body=null,t.m_next=null,this.m_world.publish("remove-fixture",t),this.resetMassData()}},t.prototype.getWorldPoint=function(t){return x.mulVec2(this.m_xf,t)},t.prototype.getWorldVector=function(t){return v.mulVec2(this.m_xf.q,t)},t.prototype.getLocalPoint=function(t){return x.mulTVec2(this.m_xf,t)},t.prototype.getLocalVector=function(t){return v.mulTVec2(this.m_xf.q,t)},t.STATIC="static",t.KINEMATIC="kinematic",t.DYNAMIC="dynamic",t}(),L=function(){function t(t,e,i,o){"object"==typeof t&&null!==t?(this.ex=h.clone(t),this.ey=h.clone(e)):"number"==typeof t?(this.ex=h.neo(t,i),this.ey=h.neo(e,o)):(this.ex=h.zero(),this.ey=h.zero())}return t.prototype.toString=function(){return JSON.stringify(this)},t.isValid=function(t){return null!=t&&(h.isValid(t.ex)&&h.isValid(t.ey))},t.assert=function(t){},t.prototype.set=function(t,e,i,o){"number"==typeof t&&"number"==typeof e&&"number"==typeof i&&"number"==typeof o?(this.ex.setNum(t,i),this.ey.setNum(e,o)):"object"==typeof t&&"object"==typeof e?(this.ex.setVec2(t),this.ey.setVec2(e)):"object"==typeof t&&(this.ex.setVec2(t.ex),this.ey.setVec2(t.ey))},t.prototype.setIdentity=function(){this.ex.x=1,this.ey.x=0,this.ex.y=0,this.ey.y=1},t.prototype.setZero=function(){this.ex.x=0,this.ey.x=0,this.ex.y=0,this.ey.y=0},t.prototype.getInverse=function(){var e=this.ex.x,i=this.ey.x,o=this.ex.y,s=this.ey.y,n=e*s-i*o;0!==n&&(n=1/n);var r=new t;return r.ex.x=n*s,r.ey.x=-n*i,r.ex.y=-n*o,r.ey.y=n*e,r},t.prototype.solve=function(t){var e=this.ex.x,i=this.ey.x,o=this.ex.y,s=this.ey.y,n=e*s-i*o;0!==n&&(n=1/n);var r=h.zero();return r.x=n*(s*t.x-i*t.y),r.y=n*(e*t.y-o*t.x),r},t.mul=function(e,i){if(i&&"x"in i&&"y"in i){var o=e.ex.x*i.x+e.ey.x*i.y,s=e.ex.y*i.x+e.ey.y*i.y;return h.neo(o,s)}if(i&&"ex"in i&&"ey"in i)return new t(e.ex.x*i.ex.x+e.ey.x*i.ex.y,e.ex.x*i.ey.x+e.ey.x*i.ey.y,e.ex.y*i.ex.x+e.ey.y*i.ex.y,e.ex.y*i.ey.x+e.ey.y*i.ey.y)},t.mulVec2=function(t,e){var i=t.ex.x*e.x+t.ey.x*e.y,o=t.ex.y*e.x+t.ey.y*e.y;return h.neo(i,o)},t.mulMat22=function(e,i){return new t(e.ex.x*i.ex.x+e.ey.x*i.ex.y,e.ex.x*i.ey.x+e.ey.x*i.ey.y,e.ex.y*i.ex.x+e.ey.y*i.ex.y,e.ex.y*i.ey.x+e.ey.y*i.ey.y)},t.mulT=function(e,i){return i&&"x"in i&&"y"in i?h.neo(h.dot(i,e.ex),h.dot(i,e.ey)):i&&"ex"in i&&"ey"in i?new t(h.neo(h.dot(e.ex,i.ex),h.dot(e.ey,i.ex)),h.neo(h.dot(e.ex,i.ey),h.dot(e.ey,i.ey))):void 0},t.mulTVec2=function(t,e){return h.neo(h.dot(e,t.ex),h.dot(e,t.ey))},t.mulTMat22=function(e,i){return new t(h.neo(h.dot(e.ex,i.ex),h.dot(e.ey,i.ex)),h.neo(h.dot(e.ex,i.ey),h.dot(e.ey,i.ey)))},t.abs=function(e){return new t(h.abs(e.ex),h.abs(e.ey))},t.add=function(e,i){return new t(h.add(e.ex,i.ex),h.add(e.ey,i.ey))},t}();!function(t){t[t.e_circles=0]="e_circles",t[t.e_faceA=1]="e_faceA",t[t.e_faceB=2]="e_faceB"}(m||(m={})),function(t){t[t.e_vertex=0]="e_vertex",t[t.e_face=1]="e_face"}(a||(a={})),function(t){t[t.nullState=0]="nullState",t[t.addState=1]="addState",t[t.persistState=2]="persistState",t[t.removeState=3]="removeState"}(c||(c={}));var F=function(){function t(){this.v=h.zero(),this.id=new k}return t.prototype.set=function(t){this.v.setVec2(t.v),this.id.set(t.id)},t}(),q=function(){function t(){this.localNormal=h.zero(),this.localPoint=h.zero(),this.points=[new N,new N],this.pointCount=0}return t.prototype.getWorldManifold=function(t,e,i,o,s){if(0!=this.pointCount){var n=(t=t||new j).normal,a=t.points,c=t.separations;switch(this.type){case m.e_circles:n=h.neo(1,0);var _=x.mulVec2(e,this.localPoint),l=x.mulVec2(o,this.points[0].localPoint),u=h.sub(l,_);h.lengthSquared(u)>r.EPSILON*r.EPSILON&&(n.setVec2(u),n.normalize());var p=_.clone().addMul(i,n),y=l.clone().addMul(-s,n);a[0]=h.mid(p,y),c[0]=h.dot(h.sub(y,p),n),a.length=1,c.length=1;break;case m.e_faceA:n=v.mulVec2(e.q,this.localNormal);for(var d=x.mulVec2(e,this.localPoint),f=0;fB+V&&t.distance>r.EPSILON){t.distance-=B+V;var w=h.sub(t.pointB,t.pointA);w.normalize(),t.pointA.addMul(B,w),t.pointB.subMul(V,w)}else{var C=h.mid(t.pointA,t.pointB);t.pointA.setVec2(C),t.pointB.setVec2(C),t.distance=0}}}var Z=function(){function t(){this.m_buffer=[],this.m_vertices=[],this.m_count=0,this.m_radius=0}return t.prototype.getVertexCount=function(){return this.m_count},t.prototype.getVertex=function(t){return this.m_vertices[t]},t.prototype.getSupport=function(t){for(var e=0,i=h.dot(this.m_vertices[0],t),o=0;oi&&(e=o,i=s)}return e},t.prototype.getSupportVertex=function(t){return this.m_vertices[this.getSupport(t)]},t.prototype.set=function(t,e){t.computeDistanceProxy(this,e)},t}(),X=function(){function t(){this.wA=h.zero(),this.wB=h.zero(),this.w=h.zero()}return t.prototype.set=function(t){this.indexA=t.indexA,this.indexB=t.indexB,this.wA=h.clone(t.wA),this.wB=h.clone(t.wB),this.w=h.clone(t.w),this.a=t.a},t}(),K=function(){function t(){this.m_v1=new X,this.m_v2=new X,this.m_v3=new X,this.m_v=[this.m_v1,this.m_v2,this.m_v3],this.m_count}return t.prototype.toString=function(){return 3===this.m_count?["+"+this.m_count,this.m_v1.a,this.m_v1.wA.x,this.m_v1.wA.y,this.m_v1.wB.x,this.m_v1.wB.y,this.m_v2.a,this.m_v2.wA.x,this.m_v2.wA.y,this.m_v2.wB.x,this.m_v2.wB.y,this.m_v3.a,this.m_v3.wA.x,this.m_v3.wA.y,this.m_v3.wB.x,this.m_v3.wB.y].toString():2===this.m_count?["+"+this.m_count,this.m_v1.a,this.m_v1.wA.x,this.m_v1.wA.y,this.m_v1.wB.x,this.m_v1.wB.y,this.m_v2.a,this.m_v2.wA.x,this.m_v2.wA.y,this.m_v2.wB.x,this.m_v2.wB.y].toString():1===this.m_count?["+"+this.m_count,this.m_v1.a,this.m_v1.wA.x,this.m_v1.wA.y,this.m_v1.wB.x,this.m_v1.wB.y].toString():"+"+this.m_count},t.prototype.readCache=function(t,e,i,o,s){this.m_count=t.count;for(var n=0;n1){var c=t.metric,_=this.getMetric();(_<.5*c||2*c<_||_0?h.crossNumVec2(1,t):h.crossVec2Num(t,1);default:return h.zero()}},t.prototype.getClosestPoint=function(){switch(this.m_count){case 0:return h.zero();case 1:return h.clone(this.m_v1.w);case 2:return h.combine(this.m_v1.a,this.m_v1.w,this.m_v2.a,this.m_v2.w);case 3:default:return h.zero()}},t.prototype.getWitnessPoints=function(t,e){switch(this.m_count){case 0:break;case 1:t.setVec2(this.m_v1.wA),e.setVec2(this.m_v1.wB);break;case 2:t.setCombine(this.m_v1.a,this.m_v1.wA,this.m_v2.a,this.m_v2.wA),e.setCombine(this.m_v1.a,this.m_v1.wB,this.m_v2.a,this.m_v2.wB);break;case 3:t.setCombine(this.m_v1.a,this.m_v1.wA,this.m_v2.a,this.m_v2.wA),t.addMul(this.m_v3.a,this.m_v3.wA),e.setVec2(t)}},t.prototype.getMetric=function(){switch(this.m_count){case 0:case 1:return 0;case 2:return h.distance(this.m_v1.w,this.m_v2.w);case 3:return h.crossVec2Vec2(h.sub(this.m_v2.w,this.m_v1.w),h.sub(this.m_v3.w,this.m_v1.w));default:return 0}},t.prototype.solve=function(){switch(this.m_count){case 1:break;case 2:this.solve2();break;case 3:this.solve3()}},t.prototype.solve2=function(){var t=this.m_v1.w,e=this.m_v2.w,i=h.sub(e,t),o=-h.dot(t,i);if(o<=0)return this.m_v1.a=1,void(this.m_count=1);var s=h.dot(e,i);if(s<=0)return this.m_v2.a=1,this.m_count=1,void this.m_v1.set(this.m_v2);var n=1/(s+o);this.m_v1.a=s*n,this.m_v2.a=o*n,this.m_count=2},t.prototype.solve3=function(){var t=this.m_v1.w,e=this.m_v2.w,i=this.m_v3.w,o=h.sub(e,t),s=h.dot(t,o),n=h.dot(e,o),r=-s,m=h.sub(i,t),a=h.dot(t,m),c=h.dot(i,m),_=-a,l=h.sub(i,e),u=h.dot(e,l),p=h.dot(i,l),y=-u,d=h.crossVec2Vec2(o,m),f=d*h.crossVec2Vec2(e,i),v=d*h.crossVec2Vec2(i,t),x=d*h.crossVec2Vec2(t,e);if(r<=0&&_<=0)return this.m_v1.a=1,void(this.m_count=1);if(n>0&&r>0&&x<=0){var A=1/(n+r);return this.m_v1.a=n*A,this.m_v2.a=r*A,void(this.m_count=2)}if(c>0&&_>0&&v<=0){var b=1/(c+_);return this.m_v1.a=c*b,this.m_v3.a=_*b,this.m_count=2,void this.m_v2.set(this.m_v3)}if(n<=0&&y<=0)return this.m_v2.a=1,this.m_count=1,void this.m_v1.set(this.m_v2);if(c<=0&&p<=0)return this.m_v3.a=1,this.m_count=1,void this.m_v1.set(this.m_v3);if(p>0&&y>0&&f<=0){var g=1/(p+y);return this.m_v2.a=p*g,this.m_v3.a=y*g,this.m_count=2,void this.m_v1.set(this.m_v3)}var B=1/(f+v+x);this.m_v1.a=f*B,this.m_v2.a=v*B,this.m_v3.a=x*B,this.m_count=3},t}();function G(t,e,i,o,s,n){var m=new J;m.proxyA.set(t,e),m.proxyB.set(i,o),m.transformA=s,m.transformB=n,m.useRadii=!0;var a=new W,c=new Y;return H(c,a,m),c.distance<10*r.EPSILON}var U=function(t){this.contact=t};function Q(t,e){return r.sqrt(t*e)}function $(t,e){return t>e?t:e}var tt,et=[],it=function(){this.rA=h.zero(),this.rB=h.zero(),this.normalImpulse=0,this.tangentImpulse=0,this.normalMass=0,this.tangentMass=0,this.velocityBias=0},ot=function(){function t(t,e,i,o,s){this.m_manifold=new q,this.m_prev=null,this.m_next=null,this.m_toi=1,this.m_toiCount=0,this.m_toiFlag=!1,this.m_tangentSpeed=0,this.m_enabledFlag=!0,this.m_islandFlag=!1,this.m_touchingFlag=!1,this.m_filterFlag=!1,this.m_bulletHitFlag=!1,this.m_impulse=new yt(this),this.v_points=[],this.v_normal=h.zero(),this.v_normalMass=new L,this.v_K=new L,this.p_localPoints=[],this.p_localNormal=h.zero(),this.p_localPoint=h.zero(),this.p_localCenterA=h.zero(),this.p_localCenterB=h.zero(),this.m_nodeA=new U(this),this.m_nodeB=new U(this),this.m_fixtureA=t,this.m_fixtureB=i,this.m_indexA=e,this.m_indexB=o,this.m_evaluateFcn=s,this.m_friction=Q(this.m_fixtureA.m_friction,this.m_fixtureB.m_friction),this.m_restitution=$(this.m_fixtureA.m_restitution,this.m_fixtureB.m_restitution)}return t.prototype.initConstraint=function(t){var e=this.m_fixtureA,i=this.m_fixtureB,o=e.getShape(),s=i.getShape(),n=e.getBody(),r=i.getBody(),m=this.getManifold(),a=m.pointCount;this.v_invMassA=n.m_invMass,this.v_invMassB=r.m_invMass,this.v_invIA=n.m_invI,this.v_invIB=r.m_invI,this.v_friction=this.m_friction,this.v_restitution=this.m_restitution,this.v_tangentSpeed=this.m_tangentSpeed,this.v_pointCount=a,this.v_K.setZero(),this.v_normalMass.setZero(),this.p_invMassA=n.m_invMass,this.p_invMassB=r.m_invMass,this.p_invIA=n.m_invI,this.p_invIB=r.m_invI,this.p_localCenterA=h.clone(n.m_sweep.localCenter),this.p_localCenterB=h.clone(r.m_sweep.localCenter),this.p_radiusA=o.m_radius,this.p_radiusB=s.m_radius,this.p_type=m.type,this.p_localNormal=h.clone(m.localNormal),this.p_localPoint=h.clone(m.localPoint),this.p_pointCount=a;for(var c=0;c0;for(var u=0;u0?-O/W:0,Z=h.mulNumVec2(H,P);g.subMul(d,Z),B-=f*h.crossVec2Vec2(k,Z),V.addMul(A,Z),w+=b*h.crossVec2Vec2(D,Z)}return _.c.setVec2(g),_.a=B,u.c.setVec2(V),u.a=w,C},t.prototype.initVelocityConstraint=function(t){var e=this.m_fixtureA,i=this.m_fixtureB,o=e.getBody(),s=i.getBody(),n=o.c_velocity,r=s.c_velocity,m=o.c_position,a=s.c_position,c=this.p_radiusA,_=this.p_radiusB,u=this.getManifold(),p=this.v_invMassA,y=this.v_invMassB,d=this.v_invIA,f=this.v_invIB,A=h.clone(this.p_localCenterA),b=h.clone(this.p_localCenterB),g=h.clone(m.c),B=m.a,V=h.clone(n.v),w=n.w,C=h.clone(a.c),M=a.a,I=h.clone(r.v),z=r.w,P=x.identity(),S=x.identity();P.q.setAngle(B),S.q.setAngle(M),P.p.setCombine(1,g,-1,v.mulVec2(P.q,A)),S.p.setCombine(1,C,-1,v.mulVec2(S.q,b));var T=u.getWorldManifold(null,P,c,S,_);this.v_normal.setVec2(T.normal);for(var L=0;L0?1/k:0;var D=h.crossVec2Num(this.v_normal,1),j=h.crossVec2Vec2(F.rA,D),R=h.crossVec2Vec2(F.rB,D),E=p+y+d*j*j+f*R*R;F.tangentMass=E>0?1/E:0,F.velocityBias=0;var O=h.dot(this.v_normal,I)+h.dot(this.v_normal,h.crossNumVec2(z,F.rB))-h.dot(this.v_normal,V)-h.dot(this.v_normal,h.crossNumVec2(w,F.rA));O<-l.velocityThreshold&&(F.velocityBias=-this.v_restitution*O)}if(2==this.v_pointCount&&t.blockSolve){var J=this.v_points[0],Y=this.v_points[1],W=h.crossVec2Vec2(J.rA,this.v_normal),H=h.crossVec2Vec2(J.rB,this.v_normal),Z=h.crossVec2Vec2(Y.rA,this.v_normal),X=h.crossVec2Vec2(Y.rB,this.v_normal),K=p+y+d*W*W+f*H*H,G=p+y+d*Z*Z+f*X*X,U=p+y+d*W*Z+f*H*X;K*K<1e3*(K*G-U*U)?(this.v_K.ex.setNum(K,U),this.v_K.ey.setNum(U,G),this.v_normalMass.set(this.v_K.getInverse())):this.v_pointCount=1}m.c.setVec2(g),m.a=B,n.v.setVec2(V),n.w=w,a.c.setVec2(C),a.a=M,r.v.setVec2(I),r.w=z},t.prototype.warmStartConstraint=function(t){var e=this.m_fixtureA,i=this.m_fixtureB,o=e.getBody(),s=i.getBody(),n=o.c_velocity,r=s.c_velocity;o.c_position,s.c_position;for(var m=this.v_invMassA,a=this.v_invIA,c=this.v_invMassB,_=this.v_invIB,l=h.clone(n.v),u=n.w,p=h.clone(r.v),y=r.w,d=this.v_normal,f=h.crossVec2Num(d,1),v=0;v=0&&k.y>=0){var D=h.sub(k,P),j=h.mulNumVec2(D.x,y),R=h.mulNumVec2(D.y,y);_.subCombine(n,j,n,R),l-=m*(h.crossVec2Vec2(I.rA,j)+h.crossVec2Vec2(z.rA,R)),u.addCombine(a,j,a,R),p+=c*(h.crossVec2Vec2(I.rB,j)+h.crossVec2Vec2(z.rB,R)),I.normalImpulse=k.x,z.normalImpulse=k.y;break}if(k.x=-I.normalMass*N.x,k.y=0,F=0,q=this.v_K.ex.y*k.x+N.y,k.x>=0&&q>=0){D=h.sub(k,P),j=h.mulNumVec2(D.x,y),R=h.mulNumVec2(D.y,y);_.subCombine(n,j,n,R),l-=m*(h.crossVec2Vec2(I.rA,j)+h.crossVec2Vec2(z.rA,R)),u.addCombine(a,j,a,R),p+=c*(h.crossVec2Vec2(I.rB,j)+h.crossVec2Vec2(z.rB,R)),I.normalImpulse=k.x,z.normalImpulse=k.y;break}if(k.x=0,k.y=-z.normalMass*N.y,F=this.v_K.ey.x*k.y+N.x,q=0,k.y>=0&&F>=0){D=h.sub(k,P),j=h.mulNumVec2(D.x,y),R=h.mulNumVec2(D.y,y);_.subCombine(n,j,n,R),l-=m*(h.crossVec2Vec2(I.rA,j)+h.crossVec2Vec2(z.rA,R)),u.addCombine(a,j,a,R),p+=c*(h.crossVec2Vec2(I.rB,j)+h.crossVec2Vec2(z.rB,R)),I.normalImpulse=k.x,z.normalImpulse=k.y;break}if(k.x=0,k.y=0,F=N.x,q=N.y,F>=0&&q>=0){D=h.sub(k,P),j=h.mulNumVec2(D.x,y),R=h.mulNumVec2(D.y,y);_.subCombine(n,j,n,R),l-=m*(h.crossVec2Vec2(I.rA,j)+h.crossVec2Vec2(z.rA,R)),u.addCombine(a,j,a,R),p+=c*(h.crossVec2Vec2(I.rB,j)+h.crossVec2Vec2(z.rB,R)),I.normalImpulse=k.x,z.normalImpulse=k.y;break}break}}o.v.setVec2(_),o.w=l,s.v.setVec2(u),s.w=p},t.addType=function(t,e,i){et[t]=et[t]||{},et[t][e]=i},t.create=function(e,i,o,s){var n,r,m=e.getType(),a=o.getType();if(r=et[m]&&et[m][a])n=new t(e,i,o,s,r);else{if(!(r=et[a]&&et[a][m]))return null;n=new t(o,s,e,i,r)}e=n.getFixtureA(),o=n.getFixtureB(),i=n.getChildIndexA(),s=n.getChildIndexB();var c=e.getBody(),h=o.getBody();return n.m_nodeA.contact=n,n.m_nodeA.other=h,n.m_nodeA.prev=null,n.m_nodeA.next=c.m_contactList,null!=c.m_contactList&&(c.m_contactList.prev=n.m_nodeA),c.m_contactList=n.m_nodeA,n.m_nodeB.contact=n,n.m_nodeB.other=c,n.m_nodeB.prev=null,n.m_nodeB.next=h.m_contactList,null!=h.m_contactList&&(h.m_contactList.prev=n.m_nodeB),h.m_contactList=n.m_nodeB,0==e.isSensor()&&0==o.isSensor()&&(c.setAwake(!0),h.setAwake(!0)),n},t.destroy=function(t,e){var i=t.m_fixtureA,o=t.m_fixtureB,s=i.getBody(),n=o.getBody();t.isTouching()&&e.endContact(t),t.m_nodeA.prev&&(t.m_nodeA.prev.next=t.m_nodeA.next),t.m_nodeA.next&&(t.m_nodeA.next.prev=t.m_nodeA.prev),t.m_nodeA==s.m_contactList&&(s.m_contactList=t.m_nodeA.next),t.m_nodeB.prev&&(t.m_nodeB.prev.next=t.m_nodeB.next),t.m_nodeB.next&&(t.m_nodeB.next.prev=t.m_nodeB.prev),t.m_nodeB==n.m_contactList&&(n.m_contactList=t.m_nodeB.next),t.m_manifold.pointCount>0&&0==i.isSensor()&&0==o.isSensor()&&(s.setAwake(!0),n.setAwake(!0)),i.getType(),o.getType()},t}(),st=function(){this.other=null,this.joint=null,this.prev=null,this.next=null},nt=function(){function t(t,e,i){this.m_type="unknown-joint",this.m_prev=null,this.m_next=null,this.m_edgeA=new st,this.m_edgeB=new st,this.m_islandFlag=!1,e="bodyA"in t?t.bodyA:e,i="bodyB"in t?t.bodyB:i,this.m_bodyA=e,this.m_bodyB=i,this.m_collideConnected=!!t.collideConnected,this.m_userData=t.userData}return t.prototype.isActive=function(){return this.m_bodyA.isActive()&&this.m_bodyB.isActive()},t.prototype.getType=function(){return this.m_type},t.prototype.getBodyA=function(){return this.m_bodyA},t.prototype.getBodyB=function(){return this.m_bodyB},t.prototype.getNext=function(){return this.m_next},t.prototype.getUserData=function(){return this.m_userData},t.prototype.setUserData=function(t){this.m_userData=t},t.prototype.getCollideConnected=function(){return this.m_collideConnected},t.prototype.shiftOrigin=function(t){},t}(),rt=function(){return Date.now()},mt=function(t){return Date.now()-t},at=function(){this.proxyA=new Z,this.proxyB=new Z,this.sweepA=new A,this.sweepB=new A};!function(t){t[t.e_unknown=0]="e_unknown",t[t.e_failed=1]="e_failed",t[t.e_overlapped=2]="e_overlapped",t[t.e_touching=3]="e_touching",t[t.e_separated=4]="e_separated"}(tt||(tt={}));var ct,ht=function(){};function _t(t,e){var i=rt();++O.toiCalls,t.state=tt.e_unknown,t.t=e.tMax;var o=e.proxyA,s=e.proxyB,n=e.sweepA,m=e.sweepB;n.normalize(),m.normalize();var a=e.tMax,c=o.m_radius+s.m_radius,h=r.max(l.linearSlop,c-3*l.linearSlop),_=.25*l.linearSlop,u=0,p=l.maxTOIIterations,y=0,d=new W,f=new J;for(f.proxyA=e.proxyA,f.proxyB=e.proxyB,f.useRadii=!1;;){var v=x.identity(),A=x.identity();n.getTransform(v,u),m.getTransform(A,u),f.transformA=v,f.transformB=A;var b=new Y;if(H(b,d,f),b.distance<=0){t.state=tt.e_overlapped,t.t=0;break}if(b.distanceh+_){t.state=tt.e_separated,t.t=a,B=!0;break}if(C>h-_){u=V;break}var M=g.evaluate(u);if(Mh?(z=S,M=T):(P=S,C=T),50===I)break}if(O.toiMaxRootIters=r.max(O.toiMaxRootIters,I),++w===l.maxPolygonVertices)break}if(++y,++O.toiIters,B)break;if(y===p){t.state=tt.e_failed,t.t=u;break}}O.toiMaxIters=r.max(O.toiMaxIters,y);var L=mt(i);O.toiMaxTime=r.max(O.toiMaxTime,L),O.toiTime+=L}O.toiTime=0,O.toiMaxTime=0,O.toiCalls=0,O.toiIters=0,O.toiMaxIters=0,O.toiRootIters=0,O.toiMaxRootIters=0,function(t){t[t.e_points=1]="e_points",t[t.e_faceA=2]="e_faceA",t[t.e_faceB=3]="e_faceB"}(ct||(ct={}));var lt=function(){function t(){this.m_proxyA=new Z,this.m_proxyB=new Z,this.m_localPoint=h.zero(),this.m_axis=h.zero()}return t.prototype.initialize=function(t,e,i,o,s,n){this.m_proxyA=e,this.m_proxyB=o;var r=t.count;this.m_sweepA=i,this.m_sweepB=s;var m=x.identity(),a=x.identity();if(this.m_sweepA.getTransform(m,n),this.m_sweepB.getTransform(a,n),1===r){this.m_type=ct.e_points;var c=this.m_proxyA.getVertex(t.indexA[0]),_=this.m_proxyB.getVertex(t.indexB[0]),l=x.mulVec2(m,c),u=x.mulVec2(a,_);return this.m_axis.setCombine(1,u,-1,l),b=this.m_axis.normalize()}if(t.indexA[0]===t.indexA[1]){this.m_type=ct.e_faceB;var p=o.getVertex(t.indexB[0]),y=o.getVertex(t.indexB[1]);this.m_axis=h.crossVec2Num(h.sub(y,p),1),this.m_axis.normalize();var d=v.mulVec2(a.q,this.m_axis);this.m_localPoint=h.mid(p,y);u=x.mulVec2(a,this.m_localPoint),c=e.getVertex(t.indexA[0]),l=x.mulVec2(m,c);return(b=h.dot(l,d)-h.dot(u,d))<0&&(this.m_axis=h.neg(this.m_axis),b=-b),b}this.m_type=ct.e_faceA;var f=this.m_proxyA.getVertex(t.indexA[0]),A=this.m_proxyA.getVertex(t.indexA[1]);this.m_axis=h.crossVec2Num(h.sub(A,f),1),this.m_axis.normalize();d=v.mulVec2(m.q,this.m_axis);this.m_localPoint=h.mid(f,A);var b;l=x.mulVec2(m,this.m_localPoint),_=this.m_proxyB.getVertex(t.indexB[0]),u=x.mulVec2(a,_);return(b=h.dot(u,d)-h.dot(l,d))<0&&(this.m_axis=h.neg(this.m_axis),b=-b),b},t.prototype.compute=function(t,e){var i=x.identity(),o=x.identity();switch(this.m_sweepA.getTransform(i,e),this.m_sweepB.getTransform(o,e),this.m_type){case ct.e_points:if(t){var s=v.mulTVec2(i.q,this.m_axis),n=v.mulTVec2(o.q,h.neg(this.m_axis));this.indexA=this.m_proxyA.getSupport(s),this.indexB=this.m_proxyB.getSupport(n)}var r=this.m_proxyA.getVertex(this.indexA),m=this.m_proxyB.getVertex(this.indexB),a=x.mulVec2(i,r),c=x.mulVec2(o,m);return h.dot(c,this.m_axis)-h.dot(a,this.m_axis);case ct.e_faceA:var _=v.mulVec2(i.q,this.m_axis);a=x.mulVec2(i,this.m_localPoint);if(t){n=v.mulTVec2(o.q,h.neg(_));this.indexA=-1,this.indexB=this.m_proxyB.getSupport(n)}m=this.m_proxyB.getVertex(this.indexB),c=x.mulVec2(o,m);return h.dot(c,_)-h.dot(a,_);case ct.e_faceB:_=v.mulVec2(o.q,this.m_axis),c=x.mulVec2(o,this.m_localPoint);if(t){s=v.mulTVec2(i.q,h.neg(_));this.indexB=-1,this.indexA=this.m_proxyA.getSupport(s)}r=this.m_proxyA.getVertex(this.indexA),a=x.mulVec2(i,r);return h.dot(a,_)-h.dot(c,_);default:return t&&(this.indexA=-1,this.indexB=-1),0}},t.prototype.findMinSeparation=function(t){return this.compute(!0,t)},t.prototype.evaluate=function(t){return this.compute(!1,t)},t}(),ut=function(){function t(){this.dt=0,this.inv_dt=0,this.velocityIterations=0,this.positionIterations=0,this.warmStarting=!1,this.blockSolve=!0,this.inv_dt0=0,this.dtRatio=1}return t.prototype.reset=function(t){this.dt>0&&(this.inv_dt0=this.inv_dt),this.dt=t,this.inv_dt=0==t?0:1/t,this.dtRatio=t*this.inv_dt0},t}(),pt=new ut,yt=function(){function t(t){this.contact=t,this.normals=[],this.tangents=[]}return Object.defineProperty(t.prototype,"normalImpulses",{get:function(){var t=this.contact,e=this.normals;e.length=0;for(var i=0;i0;){i=n.pop();if(this.addBody(i),i.setAwake(!0),!i.isStatic()){for(var m=i.m_contactList;m;m=m.next){var a=m.contact;if(!a.m_islandFlag&&(0!=a.isEnabled()&&0!=a.isTouching())){var c=a.m_fixtureA.m_isSensor,h=a.m_fixtureB.m_isSensor;if(!c&&!h)this.addContact(a),a.m_islandFlag=!0,(l=m.other).m_islandFlag||(n.push(l),l.m_islandFlag=!0)}}for(var _=i.m_jointList;_;_=_.next){var l;if(1!=_.joint.m_islandFlag)0!=(l=_.other).isActive()&&(this.addJoint(_.joint),_.joint.m_islandFlag=!0,l.m_islandFlag||(n.push(l),l.m_islandFlag=!0))}}}this.solveIsland(t);for(var u=0;ul.maxTranslationSquared){var d=l.maxTranslation/y.length();_.mul(d)}var f=s*u;if(f*f>l.maxRotationSquared)u*=d=l.maxRotation/r.abs(f);a.addMul(s,_),c+=s*u,m.c_position.c.setVec2(a),m.c_position.a=c,m.c_velocity.v.setVec2(_),m.c_velocity.w=u}var v=!1;for(n=0;n=-3*l.linearSlop,g=!0;for(p=0;pC||h.lengthSquared(m.m_linearVelocity)>w?(m.m_sleepTime=0,V=0):(m.m_sleepTime+=s,V=r.min(V,m.m_sleepTime)))}if(V>=l.timeToSleep&&v)for(n=0;nl.maxSubSteps)){var m=1;if(o.m_toiFlag)m=o.m_toi;else{var a=o.getFixtureA(),c=o.getFixtureB();if(a.isSensor()||c.isSensor())continue;var h=a.getBody(),_=c.getBody(),u=h.isAwake()&&!h.isStatic(),p=_.isAwake()&&!_.isStatic();if(0==u&&0==p)continue;var y=h.isBullet()||!h.isDynamic(),d=_.isBullet()||!_.isDynamic();if(0==y&&0==d)continue;var f=h.m_sweep.alpha0;h.m_sweep.alpha0<_.m_sweep.alpha0?(f=_.m_sweep.alpha0,h.m_sweep.advance(f)):_.m_sweep.alpha0=-1.5*l.linearSlop)break}e.m_sweep.c0.setVec2(e.c_position.c),e.m_sweep.a0=e.c_position.a,i.m_sweep.c0.setVec2(i.c_position.c),i.m_sweep.a0=i.c_position.a;for(o=0;ol.maxTranslationSquared){var f=l.maxTranslation/d.length();p.mul(f)}var v=a*y;if(v*v>l.maxRotationSquared)y*=f=l.maxRotation/r.abs(v);_.addMul(a,p),u+=a*y,c.c_position.c=_,c.c_position.a=u,c.c_velocity.v=p,c.c_velocity.w=y,c.m_sweep.c=_,c.m_sweep.a=u,c.m_linearVelocity=p,c.m_angularVelocity=y,c.synchronizeTransform()}this.postSolveIsland()},t.prototype.postSolveIsland=function(){for(var t=0;t=0;n-=1)s._addBody(o(T,e.bodies[n],s));if(e.joints)for(n=e.joints.length-1;n>=0;n--)s.createJoint(o(nt,e.joints[n],s));return s},t.prototype.getBodyList=function(){return this.m_bodyList},t.prototype.getJointList=function(){return this.m_jointList},t.prototype.getContactList=function(){return this.m_contactList},t.prototype.getBodyCount=function(){return this.m_bodyCount},t.prototype.getJointCount=function(){return this.m_jointCount},t.prototype.getContactCount=function(){return this.m_contactCount},t.prototype.setGravity=function(t){this.m_gravity=t},t.prototype.getGravity=function(){return this.m_gravity},t.prototype.isLocked=function(){return this.m_locked},t.prototype.setAllowSleeping=function(t){if(t!=this.m_allowSleep&&(this.m_allowSleep=t,0==this.m_allowSleep))for(var e=this.m_bodyList;e;e=e.m_next)e.setAwake(!0)},t.prototype.getAllowSleeping=function(){return this.m_allowSleep},t.prototype.setWarmStarting=function(t){this.m_warmStarting=t},t.prototype.getWarmStarting=function(){return this.m_warmStarting},t.prototype.setContinuousPhysics=function(t){this.m_continuousPhysics=t},t.prototype.getContinuousPhysics=function(){return this.m_continuousPhysics},t.prototype.setSubStepping=function(t){this.m_subStepping=t},t.prototype.getSubStepping=function(){return this.m_subStepping},t.prototype.setAutoClearForces=function(t){this.m_clearForces=t},t.prototype.getAutoClearForces=function(){return this.m_clearForces},t.prototype.clearForces=function(){for(var t=this.m_bodyList;t;t=t.getNext())t.m_force.setZero(),t.m_torque=0},t.prototype.queryAABB=function(t,e){var i=this.m_broadPhase;this.m_broadPhase.query(t,(function(t){var o=i.getUserData(t);return e(o.fixture)}))},t.prototype.rayCast=function(t,e,i){var o=this.m_broadPhase;this.m_broadPhase.rayCast({maxFraction:1,p1:t,p2:e},(function(t,e){var s=o.getUserData(e),n=s.fixture,r=s.childIndex,m={};if(n.rayCast(m,t,r)){var a=m.fraction,c=h.add(h.mulNumVec2(1-a,t.p1),h.mulNumVec2(a,t.p2));return i(n,c,m.normal,a)}return t.maxFraction}))},t.prototype.getProxyCount=function(){return this.m_broadPhase.getProxyCount()},t.prototype.getTreeHeight=function(){return this.m_broadPhase.getTreeHeight()},t.prototype.getTreeBalance=function(){return this.m_broadPhase.getTreeBalance()},t.prototype.getTreeQuality=function(){return this.m_broadPhase.getTreeQuality()},t.prototype.shiftOrigin=function(t){if(!this.m_locked){for(var e=this.m_bodyList;e;e=e.m_next)e.m_xf.p.sub(t),e.m_sweep.c0.sub(t),e.m_sweep.c.sub(t);for(var i=this.m_jointList;i;i=i.m_next)i.shiftOrigin(t);this.m_broadPhase.shiftOrigin(t)}},t.prototype._addBody=function(t){this.isLocked()||(t.m_prev=null,t.m_next=this.m_bodyList,this.m_bodyList&&(this.m_bodyList.m_prev=t),this.m_bodyList=t,++this.m_bodyCount)},t.prototype.createBody=function(t,e){if(this.isLocked())return null;var i={};t&&(h.isValid(t)?i={position:t,angle:e}:"object"==typeof t&&(i=t));var o=new T(this,i);return this._addBody(o),o},t.prototype.createDynamicBody=function(t,e){var i={};return t&&(h.isValid(t)?i={position:t,angle:e}:"object"==typeof t&&(i=t)),i.type="dynamic",this.createBody(i)},t.prototype.createKinematicBody=function(t,e){var i={};return t&&(h.isValid(t)?i={position:t,angle:e}:"object"==typeof t&&(i=t)),i.type="kinematic",this.createBody(i)},t.prototype.destroyBody=function(t){if(!this.isLocked()){if(t.m_destroyed)return!1;for(var e=t.m_jointList;e;){var i=e;e=e.next,this.publish("remove-joint",i.joint),this.destroyJoint(i.joint),t.m_jointList=e}t.m_jointList=null;for(var o=t.m_contactList;o;){var s=o;o=o.next,this.destroyContact(s.contact),t.m_contactList=o}t.m_contactList=null;for(var n=t.m_fixtureList;n;){var r=n;n=n.m_next,this.publish("remove-fixture",r),r.destroyProxies(this.m_broadPhase),t.m_fixtureList=n}return t.m_fixtureList=null,t.m_prev&&(t.m_prev.m_next=t.m_next),t.m_next&&(t.m_next.m_prev=t.m_prev),t==this.m_bodyList&&(this.m_bodyList=t.m_next),t.m_destroyed=!0,--this.m_bodyCount,this.publish("remove-body",t),!0}},t.prototype.createJoint=function(t){if(this.isLocked())return null;if(t.m_prev=null,t.m_next=this.m_jointList,this.m_jointList&&(this.m_jointList.m_prev=t),this.m_jointList=t,++this.m_jointCount,t.m_edgeA.joint=t,t.m_edgeA.other=t.m_bodyB,t.m_edgeA.prev=null,t.m_edgeA.next=t.m_bodyA.m_jointList,t.m_bodyA.m_jointList&&(t.m_bodyA.m_jointList.prev=t.m_edgeA),t.m_bodyA.m_jointList=t.m_edgeA,t.m_edgeB.joint=t,t.m_edgeB.other=t.m_bodyA,t.m_edgeB.prev=null,t.m_edgeB.next=t.m_bodyB.m_jointList,t.m_bodyB.m_jointList&&(t.m_bodyB.m_jointList.prev=t.m_edgeB),t.m_bodyB.m_jointList=t.m_edgeB,0==t.m_collideConnected)for(var e=t.m_bodyB.getContactList();e;e=e.next)e.other==t.m_bodyA&&e.contact.flagForFiltering();return t},t.prototype.destroyJoint=function(t){if(!this.isLocked()){t.m_prev&&(t.m_prev.m_next=t.m_next),t.m_next&&(t.m_next.m_prev=t.m_prev),t==this.m_jointList&&(this.m_jointList=t.m_next);var e=t.m_bodyA,i=t.m_bodyB;if(e.setAwake(!0),i.setAwake(!0),t.m_edgeA.prev&&(t.m_edgeA.prev.next=t.m_edgeA.next),t.m_edgeA.next&&(t.m_edgeA.next.prev=t.m_edgeA.prev),t.m_edgeA==e.m_jointList&&(e.m_jointList=t.m_edgeA.next),t.m_edgeA.prev=null,t.m_edgeA.next=null,t.m_edgeB.prev&&(t.m_edgeB.prev.next=t.m_edgeB.next),t.m_edgeB.next&&(t.m_edgeB.next.prev=t.m_edgeB.prev),t.m_edgeB==i.m_jointList&&(i.m_jointList=t.m_edgeB.next),t.m_edgeB.prev=null,t.m_edgeB.next=null,--this.m_jointCount,0==t.m_collideConnected)for(var o=i.getContactList();o;)o.other==e&&o.contact.flagForFiltering(),o=o.next;this.publish("remove-joint",t)}},t.prototype.step=function(t,e,i){if(this.publish("pre-step",t),(0|e)!==e&&(e=0),e=e||this.m_velocityIterations,i=i||this.m_positionIterations,this.m_newFixture&&(this.findNewContacts(),this.m_newFixture=!1),this.m_locked=!0,this.s_step.reset(t),this.s_step.velocityIterations=e,this.s_step.positionIterations=i,this.s_step.warmStarting=this.m_warmStarting,this.s_step.blockSolve=this.m_blockSolve,this.updateContacts(),this.m_stepComplete&&t>0){this.m_solver.solveWorld(this.s_step);for(var o=this.m_bodyList;o;o=o.getNext())0!=o.m_islandFlag&&(o.isStatic()||o.synchronizeFixtures());this.findNewContacts()}this.m_continuousPhysics&&t>0&&this.m_solver.solveWorldTOI(this.s_step),this.m_clearForces&&this.clearForces(),this.m_locked=!1,this.publish("post-step",t)},t.prototype.findNewContacts=function(){this.m_broadPhase.updatePairs(this.createContact)},t.prototype.updateContacts=function(){for(var t,e=this.m_contactList;t=e;){e=t.getNext();var i=t.getFixtureA(),o=t.getFixtureB(),s=t.getChildIndexA(),n=t.getChildIndexB(),r=i.getBody(),m=o.getBody();if(t.m_filterFlag){if(0==m.shouldCollide(r)){this.destroyContact(t);continue}if(0==o.shouldCollide(i)){this.destroyContact(t);continue}t.m_filterFlag=!1}var a=r.isAwake()&&!r.isStatic(),c=m.isAwake()&&!m.isStatic();if(0!=a||0!=c){var h=i.m_proxies[s].proxyId,_=o.m_proxies[n].proxyId;0!=this.m_broadPhase.testOverlap(h,_)?t.update(this):this.destroyContact(t)}}},t.prototype.destroyContact=function(t){ot.destroy(t,this),t.m_prev&&(t.m_prev.m_next=t.m_next),t.m_next&&(t.m_next.m_prev=t.m_prev),t==this.m_contactList&&(this.m_contactList=t.m_next),--this.m_contactCount},t.prototype.on=function(t,e){return"string"!=typeof t||"function"!=typeof e||(this._listeners||(this._listeners={}),this._listeners[t]||(this._listeners[t]=[]),this._listeners[t].push(e)),this},t.prototype.off=function(t,e){if("string"!=typeof t||"function"!=typeof e)return this;var i=this._listeners&&this._listeners[t];if(!i||!i.length)return this;var o=i.indexOf(e);return o>=0&&i.splice(o,1),this},t.prototype.publish=function(t,e,i,o){var s=this._listeners&&this._listeners[t];if(!s||!s.length)return 0;for(var n=0;n0?v.mulVec2(i.q,_).neg():v.mulVec2(i.q,_),!0)},e.prototype.computeAABB=function(t,e,i){var o=x.mulVec2(e,this.m_vertex1),s=x.mulVec2(e,this.m_vertex2);t.combinePoints(o,s),t.extend(this.m_radius)},e.prototype.computeMass=function(t,e){t.mass=0,t.center.setCombine(.5,this.m_vertex1,.5,this.m_vertex2),t.I=0},e.prototype.computeDistanceProxy=function(t){t.m_vertices.push(this.m_vertex1),t.m_vertices.push(this.m_vertex2),t.m_count=2,t.m_radius=this.m_radius},e.TYPE="edge",e}(B),bt=function(t){function e(i,o){var s=this;return s instanceof e?((s=t.call(this)||this).m_type=e.TYPE,s.m_radius=l.polygonRadius,s.m_vertices=[],s.m_count=0,s.m_prevVertex=null,s.m_nextVertex=null,s.m_hasPrevVertex=!1,s.m_hasNextVertex=!1,s.m_isLoop=!!o,i&&i.length&&(o?s._createLoop(i):s._createChain(i)),s):new e(i,o)}return i(e,t),e.prototype._serialize=function(){var t={type:this.m_type,vertices:this.m_vertices,isLoop:this.m_isLoop,hasPrevVertex:this.m_hasPrevVertex,hasNextVertex:this.m_hasNextVertex,prevVertex:null,nextVertex:null};return this.m_prevVertex&&(t.prevVertex=this.m_prevVertex),this.m_nextVertex&&(t.nextVertex=this.m_nextVertex),t},e._deserialize=function(t,i,o){var s=[];if(t.vertices)for(var n=0;n0?(t.m_vertex0=this.m_vertices[e-1],t.m_hasVertex0=!0):(t.m_vertex0=this.m_prevVertex,t.m_hasVertex0=this.m_hasPrevVertex),ec||_===c&&i[o].yf.lengthSquared()&&(d=m)}else d=m;if(++p,y=d,d===a)break}if(p<3)this._setAsBox(1,1);else{this.m_count=p,this.m_vertices=[];for(o=0;o0)return!1}return!0},e.prototype.rayCast=function(t,e,i,o){for(var s=v.mulTVec2(i.q,h.sub(e.p1,i.p)),n=v.mulTVec2(i.q,h.sub(e.p2,i.p)),r=h.sub(n,s),m=0,a=e.maxFraction,c=-1,_=0;_0&&l=0&&(t.fraction=m,t.normal=v.mulVec2(i.q,this.m_normals[c]),!0)},e.prototype.computeAABB=function(t,e,i){for(var o=1/0,s=1/0,n=-1/0,m=-1/0,a=0;a0?this.m_length=+t.length:t.length<0||(t.anchorA||t.anchorA||t.anchorA||t.anchorA)&&(this.m_length=h.distance(this.m_bodyA.getWorldPoint(this.m_localAnchorA),this.m_bodyB.getWorldPoint(this.m_localAnchorB)))},e.prototype.getLocalAnchorA=function(){return this.m_localAnchorA},e.prototype.getLocalAnchorB=function(){return this.m_localAnchorB},e.prototype.setLength=function(t){this.m_length=t},e.prototype.getLength=function(){return this.m_length},e.prototype.setFrequency=function(t){this.m_frequencyHz=t},e.prototype.getFrequency=function(){return this.m_frequencyHz},e.prototype.setDampingRatio=function(t){this.m_dampingRatio=t},e.prototype.getDampingRatio=function(){return this.m_dampingRatio},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return h.mulNumVec2(this.m_impulse,this.m_u).mul(t)},e.prototype.getReactionTorque=function(t){return 0},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyA.c_velocity.v,s=this.m_bodyA.c_velocity.w,n=this.m_bodyB.c_position.c,m=this.m_bodyB.c_position.a,a=this.m_bodyB.c_velocity.v,c=this.m_bodyB.c_velocity.w,_=v.neo(i),u=v.neo(m);this.m_rA=v.mulVec2(_,h.sub(this.m_localAnchorA,this.m_localCenterA)),this.m_rB=v.mulVec2(u,h.sub(this.m_localAnchorB,this.m_localCenterB)),this.m_u=h.sub(h.add(n,this.m_rB),h.add(e,this.m_rA));var p=this.m_u.length();p>l.linearSlop?this.m_u.mul(1/p):this.m_u.setNum(0,0);var y=h.crossVec2Vec2(this.m_rA,this.m_u),d=h.crossVec2Vec2(this.m_rB,this.m_u),f=this.m_invMassA+this.m_invIA*y*y+this.m_invMassB+this.m_invIB*d*d;if(this.m_mass=0!=f?1/f:0,this.m_frequencyHz>0){var x=p-this.m_length,A=2*r.PI*this.m_frequencyHz,b=2*this.m_mass*this.m_dampingRatio*A,g=this.m_mass*A*A,B=t.dt;this.m_gamma=B*(b+B*g),this.m_gamma=0!=this.m_gamma?1/this.m_gamma:0,this.m_bias=x*B*g*this.m_gamma,f+=this.m_gamma,this.m_mass=0!=f?1/f:0}else this.m_gamma=0,this.m_bias=0;if(t.warmStarting){this.m_impulse*=t.dtRatio;var V=h.mulNumVec2(this.m_impulse,this.m_u);o.subMul(this.m_invMassA,V),s-=this.m_invIA*h.crossVec2Vec2(this.m_rA,V),a.addMul(this.m_invMassB,V),c+=this.m_invIB*h.crossVec2Vec2(this.m_rB,V)}else this.m_impulse=0;this.m_bodyA.c_velocity.v.setVec2(o),this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v.setVec2(a),this.m_bodyB.c_velocity.w=c},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=h.add(e,h.crossNumVec2(i,this.m_rA)),r=h.add(o,h.crossNumVec2(s,this.m_rB)),m=h.dot(this.m_u,r)-h.dot(this.m_u,n),a=-this.m_mass*(m+this.m_bias+this.m_gamma*this.m_impulse);this.m_impulse+=a;var c=h.mulNumVec2(a,this.m_u);e.subMul(this.m_invMassA,c),i-=this.m_invIA*h.crossVec2Vec2(this.m_rA,c),o.addMul(this.m_invMassB,c),s+=this.m_invIB*h.crossVec2Vec2(this.m_rB,c),this.m_bodyA.c_velocity.v.setVec2(e),this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v.setVec2(o),this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){if(this.m_frequencyHz>0)return!0;var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyB.c_position.c,s=this.m_bodyB.c_position.a,n=v.neo(i),m=v.neo(s),a=v.mulSub(n,this.m_localAnchorA,this.m_localCenterA),c=v.mulSub(m,this.m_localAnchorB,this.m_localCenterB),_=h.sub(h.add(o,c),h.add(e,a)),u=_.normalize()-this.m_length;u=r.clamp(u,-l.maxLinearCorrection,l.maxLinearCorrection);var p=-this.m_mass*u,y=h.mulNumVec2(p,_);return e.subMul(this.m_invMassA,y),i-=this.m_invIA*h.crossVec2Vec2(a,y),o.addMul(this.m_invMassB,y),s+=this.m_invIB*h.crossVec2Vec2(c,y),this.m_bodyA.c_position.c.setVec2(e),this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c.setVec2(o),this.m_bodyB.c_position.a=s,r.abs(u)0&&(this.m_angularMass=1/this.m_angularMass),t.warmStarting){this.m_linearImpulse.mul(t.dtRatio),this.m_angularImpulse*=t.dtRatio;var y=h.neo(this.m_linearImpulse.x,this.m_linearImpulse.y);i.subMul(c,y),o-=l*(h.crossVec2Vec2(this.m_rA,y)+this.m_angularImpulse),n.addMul(_,y),r+=u*(h.crossVec2Vec2(this.m_rB,y)+this.m_angularImpulse)}else this.m_linearImpulse.setZero(),this.m_angularImpulse=0;this.m_bodyA.c_velocity.v=i,this.m_bodyA.c_velocity.w=o,this.m_bodyB.c_velocity.v=n,this.m_bodyB.c_velocity.w=r},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=this.m_invMassA,m=this.m_invMassB,a=this.m_invIA,c=this.m_invIB,_=t.dt,l=s-i,u=-this.m_angularMass*l,p=this.m_angularImpulse,y=_*this.m_maxTorque;this.m_angularImpulse=r.clamp(this.m_angularImpulse+u,-y,y),i-=a*(u=this.m_angularImpulse-p),s+=c*u;l=h.sub(h.add(o,h.crossNumVec2(s,this.m_rB)),h.add(e,h.crossNumVec2(i,this.m_rA))),u=h.neg(L.mulVec2(this.m_linearMass,l)),p=this.m_linearImpulse;this.m_linearImpulse.add(u);y=_*this.m_maxForce;this.m_linearImpulse.lengthSquared()>y*y&&(this.m_linearImpulse.normalize(),this.m_linearImpulse.mul(y)),u=h.sub(this.m_linearImpulse,p),e.subMul(n,u),i-=a*h.crossVec2Vec2(this.m_rA,u),o.addMul(m,u),s+=c*h.crossVec2Vec2(this.m_rB,u),this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){return!0},e.TYPE="friction-joint",e}(nt),zt=function(){function t(t,e,i){"object"==typeof t&&null!==t?(this.ex=xt.clone(t),this.ey=xt.clone(e),this.ez=xt.clone(i)):(this.ex=xt.zero(),this.ey=xt.zero(),this.ez=xt.zero())}return t.prototype.toString=function(){return JSON.stringify(this)},t.isValid=function(t){return null!=t&&(xt.isValid(t.ex)&&xt.isValid(t.ey)&&xt.isValid(t.ez))},t.assert=function(t){},t.prototype.setZero=function(){return this.ex.setZero(),this.ey.setZero(),this.ez.setZero(),this},t.prototype.solve33=function(t){var e=xt.dot(this.ex,xt.cross(this.ey,this.ez));0!==e&&(e=1/e);var i=new xt;return i.x=e*xt.dot(t,xt.cross(this.ey,this.ez)),i.y=e*xt.dot(this.ex,xt.cross(t,this.ez)),i.z=e*xt.dot(this.ex,xt.cross(this.ey,t)),i},t.prototype.solve22=function(t){var e=this.ex.x,i=this.ey.x,o=this.ex.y,s=this.ey.y,n=e*s-i*o;0!==n&&(n=1/n);var r=h.zero();return r.x=n*(s*t.x-i*t.y),r.y=n*(e*t.y-o*t.x),r},t.prototype.getInverse22=function(t){var e=this.ex.x,i=this.ey.x,o=this.ex.y,s=this.ey.y,n=e*s-i*o;0!==n&&(n=1/n),t.ex.x=n*s,t.ey.x=-n*i,t.ex.z=0,t.ex.y=-n*o,t.ey.y=n*e,t.ey.z=0,t.ez.x=0,t.ez.y=0,t.ez.z=0},t.prototype.getSymInverse33=function(t){var e=xt.dot(this.ex,xt.cross(this.ey,this.ez));0!==e&&(e=1/e);var i=this.ex.x,o=this.ey.x,s=this.ez.x,n=this.ey.y,r=this.ez.y,m=this.ez.z;t.ex.x=e*(n*m-r*r),t.ex.y=e*(s*r-o*m),t.ex.z=e*(o*r-s*n),t.ey.x=t.ex.y,t.ey.y=e*(i*m-s*s),t.ey.z=e*(s*o-i*r),t.ez.x=t.ex.z,t.ez.y=t.ey.z,t.ez.z=e*(i*n-o*o)},t.mul=function(t,e){if(e&&"z"in e&&"y"in e&&"x"in e){var i=t.ex.x*e.x+t.ey.x*e.y+t.ez.x*e.z,o=t.ex.y*e.x+t.ey.y*e.y+t.ez.y*e.z,s=t.ex.z*e.x+t.ey.z*e.y+t.ez.z*e.z;return new xt(i,o,s)}if(e&&"y"in e&&"x"in e){i=t.ex.x*e.x+t.ey.x*e.y,o=t.ex.y*e.x+t.ey.y*e.y;return h.neo(i,o)}},t.mulVec3=function(t,e){var i=t.ex.x*e.x+t.ey.x*e.y+t.ez.x*e.z,o=t.ex.y*e.x+t.ey.y*e.y+t.ez.y*e.z,s=t.ex.z*e.x+t.ey.z*e.y+t.ez.z*e.z;return new xt(i,o,s)},t.mulVec2=function(t,e){var i=t.ex.x*e.x+t.ey.x*e.y,o=t.ex.y*e.x+t.ey.y*e.y;return h.neo(i,o)},t.add=function(e,i){return new t(xt.add(e.ex,i.ex),xt.add(e.ey,i.ey),xt.add(e.ez,i.ez))},t}(),Pt={lowerAngle:0,upperAngle:0,maxMotorTorque:0,motorSpeed:0,enableLimit:!1,enableMotor:!1},St=function(t){function e(i,o,n,m){var a=this;return a instanceof e?(i=s(i,Pt),(a=t.call(this,i,o,n)||this).m_mass=new zt,a.m_limitState=0,o=a.m_bodyA,n=a.m_bodyB,a.m_type=e.TYPE,a.m_localAnchorA=h.clone(m?o.getLocalPoint(m):i.localAnchorA||h.zero()),a.m_localAnchorB=h.clone(m?n.getLocalPoint(m):i.localAnchorB||h.zero()),a.m_referenceAngle=r.isFinite(i.referenceAngle)?i.referenceAngle:n.getAngle()-o.getAngle(),a.m_impulse=new xt,a.m_motorImpulse=0,a.m_lowerAngle=i.lowerAngle,a.m_upperAngle=i.upperAngle,a.m_maxMotorTorque=i.maxMotorTorque,a.m_motorSpeed=i.motorSpeed,a.m_enableLimit=i.enableLimit,a.m_enableMotor=i.enableMotor,a):new e(i,o,n,m)}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,lowerAngle:this.m_lowerAngle,upperAngle:this.m_upperAngle,maxMotorTorque:this.m_maxMotorTorque,motorSpeed:this.m_motorSpeed,enableLimit:this.m_enableLimit,enableMotor:this.m_enableMotor,localAnchorA:this.m_localAnchorA,localAnchorB:this.m_localAnchorB,referenceAngle:this.m_referenceAngle}},e._deserialize=function(t,i,s){return(t=o({},t)).bodyA=s(T,t.bodyA,i),t.bodyB=s(T,t.bodyB,i),new e(t)},e.prototype._setAnchors=function(t){t.anchorA?this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(t.anchorA)):t.localAnchorA&&this.m_localAnchorA.setVec2(t.localAnchorA),t.anchorB?this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(t.anchorB)):t.localAnchorB&&this.m_localAnchorB.setVec2(t.localAnchorB)},e.prototype.getLocalAnchorA=function(){return this.m_localAnchorA},e.prototype.getLocalAnchorB=function(){return this.m_localAnchorB},e.prototype.getReferenceAngle=function(){return this.m_referenceAngle},e.prototype.getJointAngle=function(){var t=this.m_bodyA;return this.m_bodyB.m_sweep.a-t.m_sweep.a-this.m_referenceAngle},e.prototype.getJointSpeed=function(){var t=this.m_bodyA;return this.m_bodyB.m_angularVelocity-t.m_angularVelocity},e.prototype.isMotorEnabled=function(){return this.m_enableMotor},e.prototype.enableMotor=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableMotor=t},e.prototype.getMotorTorque=function(t){return t*this.m_motorImpulse},e.prototype.setMotorSpeed=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_motorSpeed=t},e.prototype.getMotorSpeed=function(){return this.m_motorSpeed},e.prototype.setMaxMotorTorque=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_maxMotorTorque=t},e.prototype.getMaxMotorTorque=function(){return this.m_maxMotorTorque},e.prototype.isLimitEnabled=function(){return this.m_enableLimit},e.prototype.enableLimit=function(t){t!=this.m_enableLimit&&(this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableLimit=t,this.m_impulse.z=0)},e.prototype.getLowerLimit=function(){return this.m_lowerAngle},e.prototype.getUpperLimit=function(){return this.m_upperAngle},e.prototype.setLimits=function(t,e){t==this.m_lowerAngle&&e==this.m_upperAngle||(this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_impulse.z=0,this.m_lowerAngle=t,this.m_upperAngle=e)},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return h.neo(this.m_impulse.x,this.m_impulse.y).mul(t)},e.prototype.getReactionTorque=function(t){return t*this.m_impulse.z},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyA.c_position.a,i=this.m_bodyA.c_velocity.v,o=this.m_bodyA.c_velocity.w,s=this.m_bodyB.c_position.a,n=this.m_bodyB.c_velocity.v,m=this.m_bodyB.c_velocity.w,a=v.neo(e),c=v.neo(s);this.m_rA=v.mulVec2(a,h.sub(this.m_localAnchorA,this.m_localCenterA)),this.m_rB=v.mulVec2(c,h.sub(this.m_localAnchorB,this.m_localCenterB));var _=this.m_invMassA,u=this.m_invMassB,p=this.m_invIA,y=this.m_invIB,d=p+y===0;if(this.m_mass.ex.x=_+u+this.m_rA.y*this.m_rA.y*p+this.m_rB.y*this.m_rB.y*y,this.m_mass.ey.x=-this.m_rA.y*this.m_rA.x*p-this.m_rB.y*this.m_rB.x*y,this.m_mass.ez.x=-this.m_rA.y*p-this.m_rB.y*y,this.m_mass.ex.y=this.m_mass.ey.x,this.m_mass.ey.y=_+u+this.m_rA.x*this.m_rA.x*p+this.m_rB.x*this.m_rB.x*y,this.m_mass.ez.y=this.m_rA.x*p+this.m_rB.x*y,this.m_mass.ex.z=this.m_mass.ez.x,this.m_mass.ey.z=this.m_mass.ez.y,this.m_mass.ez.z=p+y,this.m_motorMass=p+y,this.m_motorMass>0&&(this.m_motorMass=1/this.m_motorMass),(0==this.m_enableMotor||d)&&(this.m_motorImpulse=0),this.m_enableLimit&&0==d){var f=s-e-this.m_referenceAngle;r.abs(this.m_upperAngle-this.m_lowerAngle)<2*l.angularSlop?this.m_limitState=3:f<=this.m_lowerAngle?(1!=this.m_limitState&&(this.m_impulse.z=0),this.m_limitState=1):f>=this.m_upperAngle?(2!=this.m_limitState&&(this.m_impulse.z=0),this.m_limitState=2):(this.m_limitState=0,this.m_impulse.z=0)}else this.m_limitState=0;if(t.warmStarting){this.m_impulse.mul(t.dtRatio),this.m_motorImpulse*=t.dtRatio;var x=h.neo(this.m_impulse.x,this.m_impulse.y);i.subMul(_,x),o-=p*(h.crossVec2Vec2(this.m_rA,x)+this.m_motorImpulse+this.m_impulse.z),n.addMul(u,x),m+=y*(h.crossVec2Vec2(this.m_rB,x)+this.m_motorImpulse+this.m_impulse.z)}else this.m_impulse.setZero(),this.m_motorImpulse=0;this.m_bodyA.c_velocity.v=i,this.m_bodyA.c_velocity.w=o,this.m_bodyB.c_velocity.v=n,this.m_bodyB.c_velocity.w=m},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=this.m_invMassA,m=this.m_invMassB,a=this.m_invIA,c=this.m_invIB,_=a+c===0;if(this.m_enableMotor&&3!=this.m_limitState&&0==_){var l=s-i-this.m_motorSpeed,u=-this.m_motorMass*l,p=this.m_motorImpulse,y=t.dt*this.m_maxMotorTorque;this.m_motorImpulse=r.clamp(this.m_motorImpulse+u,-y,y),i-=a*(u=this.m_motorImpulse-p),s+=c*u}if(this.m_enableLimit&&0!=this.m_limitState&&0==_){var d=h.zero();d.addCombine(1,o,1,h.crossNumVec2(s,this.m_rB)),d.subCombine(1,e,1,h.crossNumVec2(i,this.m_rA));var f=s-i;l=new xt(d.x,d.y,f),u=xt.neg(this.m_mass.solve33(l));if(3==this.m_limitState)this.m_impulse.add(u);else if(1==this.m_limitState){if(this.m_impulse.z+u.z<0){var v=h.combine(-1,d,this.m_impulse.z,h.neo(this.m_mass.ez.x,this.m_mass.ez.y)),x=this.m_mass.solve22(v);u.x=x.x,u.y=x.y,u.z=-this.m_impulse.z,this.m_impulse.x+=x.x,this.m_impulse.y+=x.y,this.m_impulse.z=0}else this.m_impulse.add(u)}else if(2==this.m_limitState){if(this.m_impulse.z+u.z>0){v=h.combine(-1,d,this.m_impulse.z,h.neo(this.m_mass.ez.x,this.m_mass.ez.y)),x=this.m_mass.solve22(v);u.x=x.x,u.y=x.y,u.z=-this.m_impulse.z,this.m_impulse.x+=x.x,this.m_impulse.y+=x.y,this.m_impulse.z=0}else this.m_impulse.add(u)}var A=h.neo(u.x,u.y);e.subMul(n,A),i-=a*(h.crossVec2Vec2(this.m_rA,A)+u.z),o.addMul(m,A),s+=c*(h.crossVec2Vec2(this.m_rB,A)+u.z)}else{(l=h.zero()).addCombine(1,o,1,h.crossNumVec2(s,this.m_rB)),l.subCombine(1,e,1,h.crossNumVec2(i,this.m_rA));u=this.m_mass.solve22(h.neg(l));this.m_impulse.x+=u.x,this.m_impulse.y+=u.y,e.subMul(n,u),i-=a*h.crossVec2Vec2(this.m_rA,u),o.addMul(m,u),s+=c*h.crossVec2Vec2(this.m_rB,u)}this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){var e,i=this.m_bodyA.c_position.c,o=this.m_bodyA.c_position.a,s=this.m_bodyB.c_position.c,n=this.m_bodyB.c_position.a,m=v.neo(o),a=v.neo(n),c=0,_=this.m_invIA+this.m_invIB==0;if(this.m_enableLimit&&0!=this.m_limitState&&0==_){var u=n-o-this.m_referenceAngle,p=0;if(3==this.m_limitState){var y=r.clamp(u-this.m_lowerAngle,-l.maxAngularCorrection,l.maxAngularCorrection);p=-this.m_motorMass*y,c=r.abs(y)}else if(1==this.m_limitState){c=-(y=u-this.m_lowerAngle),y=r.clamp(y+l.angularSlop,-l.maxAngularCorrection,0),p=-this.m_motorMass*y}else if(2==this.m_limitState){c=y=u-this.m_upperAngle,y=r.clamp(y-l.angularSlop,0,l.maxAngularCorrection),p=-this.m_motorMass*y}o-=this.m_invIA*p,n+=this.m_invIB*p}m.setAngle(o),a.setAngle(n);var d=v.mulVec2(m,h.sub(this.m_localAnchorA,this.m_localCenterA)),f=v.mulVec2(a,h.sub(this.m_localAnchorB,this.m_localCenterB));(y=h.zero()).addCombine(1,s,1,f),y.subCombine(1,i,1,d),e=y.length();var x=this.m_invMassA,A=this.m_invMassB,b=this.m_invIA,g=this.m_invIB,B=new L;B.ex.x=x+A+b*d.y*d.y+g*f.y*f.y,B.ex.y=-b*d.x*d.y-g*f.x*f.y,B.ey.x=B.ex.y,B.ey.y=x+A+b*d.x*d.x+g*f.x*f.x;var V=h.neg(B.solve(y));return i.subMul(x,V),o-=b*h.crossVec2Vec2(d,V),s.addMul(A,V),n+=g*h.crossVec2Vec2(f,V),this.m_bodyA.c_position.c.setVec2(i),this.m_bodyA.c_position.a=o,this.m_bodyB.c_position.c.setVec2(s),this.m_bodyB.c_position.a=n,e<=l.linearSlop&&c<=l.angularSlop},e.TYPE="revolute-joint",e}(nt),Tt={enableLimit:!1,lowerTranslation:0,upperTranslation:0,enableMotor:!1,maxMotorForce:0,motorSpeed:0},Lt=function(t){function e(i,o,n,m,a){var c=this;return c instanceof e?(i=s(i,Tt),o=(c=t.call(this,i,o,n)||this).m_bodyA,n=c.m_bodyB,c.m_type=e.TYPE,c.m_localAnchorA=h.clone(m?o.getLocalPoint(m):i.localAnchorA||h.zero()),c.m_localAnchorB=h.clone(m?n.getLocalPoint(m):i.localAnchorB||h.zero()),c.m_localXAxisA=h.clone(a?o.getLocalVector(a):i.localAxisA||h.neo(1,0)),c.m_localXAxisA.normalize(),c.m_localYAxisA=h.crossNumVec2(1,c.m_localXAxisA),c.m_referenceAngle=r.isFinite(i.referenceAngle)?i.referenceAngle:n.getAngle()-o.getAngle(),c.m_impulse=new xt,c.m_motorMass=0,c.m_motorImpulse=0,c.m_lowerTranslation=i.lowerTranslation,c.m_upperTranslation=i.upperTranslation,c.m_maxMotorForce=i.maxMotorForce,c.m_motorSpeed=i.motorSpeed,c.m_enableLimit=i.enableLimit,c.m_enableMotor=i.enableMotor,c.m_limitState=0,c.m_axis=h.zero(),c.m_perp=h.zero(),c.m_K=new zt,c):new e(i,o,n,m,a)}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,lowerTranslation:this.m_lowerTranslation,upperTranslation:this.m_upperTranslation,maxMotorForce:this.m_maxMotorForce,motorSpeed:this.m_motorSpeed,enableLimit:this.m_enableLimit,enableMotor:this.m_enableMotor,localAnchorA:this.m_localAnchorA,localAnchorB:this.m_localAnchorB,localAxisA:this.m_localXAxisA,referenceAngle:this.m_referenceAngle}},e._deserialize=function(t,i,s){return(t=o({},t)).bodyA=s(T,t.bodyA,i),t.bodyB=s(T,t.bodyB,i),t.localAxisA=h.clone(t.localAxisA),new e(t)},e.prototype._setAnchors=function(t){t.anchorA?this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(t.anchorA)):t.localAnchorA&&this.m_localAnchorA.setVec2(t.localAnchorA),t.anchorB?this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(t.anchorB)):t.localAnchorB&&this.m_localAnchorB.setVec2(t.localAnchorB),t.localAxisA&&(this.m_localXAxisA.setVec2(t.localAxisA),this.m_localYAxisA.setVec2(h.crossNumVec2(1,t.localAxisA)))},e.prototype.getLocalAnchorA=function(){return this.m_localAnchorA},e.prototype.getLocalAnchorB=function(){return this.m_localAnchorB},e.prototype.getLocalAxisA=function(){return this.m_localXAxisA},e.prototype.getReferenceAngle=function(){return this.m_referenceAngle},e.prototype.getJointTranslation=function(){var t=this.m_bodyA.getWorldPoint(this.m_localAnchorA),e=this.m_bodyB.getWorldPoint(this.m_localAnchorB),i=h.sub(e,t),o=this.m_bodyA.getWorldVector(this.m_localXAxisA);return h.dot(i,o)},e.prototype.getJointSpeed=function(){var t=this.m_bodyA,e=this.m_bodyB,i=v.mulVec2(t.m_xf.q,h.sub(this.m_localAnchorA,t.m_sweep.localCenter)),o=v.mulVec2(e.m_xf.q,h.sub(this.m_localAnchorB,e.m_sweep.localCenter)),s=h.add(t.m_sweep.c,i),n=h.add(e.m_sweep.c,o),r=h.sub(n,s),m=v.mulVec2(t.m_xf.q,this.m_localXAxisA),a=t.m_linearVelocity,c=e.m_linearVelocity,_=t.m_angularVelocity,l=e.m_angularVelocity;return h.dot(r,h.crossNumVec2(_,m))+h.dot(m,h.sub(h.addCrossNumVec2(c,l,o),h.addCrossNumVec2(a,_,i)))},e.prototype.isLimitEnabled=function(){return this.m_enableLimit},e.prototype.enableLimit=function(t){t!=this.m_enableLimit&&(this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableLimit=t,this.m_impulse.z=0)},e.prototype.getLowerLimit=function(){return this.m_lowerTranslation},e.prototype.getUpperLimit=function(){return this.m_upperTranslation},e.prototype.setLimits=function(t,e){t==this.m_lowerTranslation&&e==this.m_upperTranslation||(this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_lowerTranslation=t,this.m_upperTranslation=e,this.m_impulse.z=0)},e.prototype.isMotorEnabled=function(){return this.m_enableMotor},e.prototype.enableMotor=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableMotor=t},e.prototype.setMotorSpeed=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_motorSpeed=t},e.prototype.setMaxMotorForce=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_maxMotorForce=t},e.prototype.getMaxMotorForce=function(){return this.m_maxMotorForce},e.prototype.getMotorSpeed=function(){return this.m_motorSpeed},e.prototype.getMotorForce=function(t){return t*this.m_motorImpulse},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return h.combine(this.m_impulse.x,this.m_perp,this.m_motorImpulse+this.m_impulse.z,this.m_axis).mul(t)},e.prototype.getReactionTorque=function(t){return t*this.m_impulse.y},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyA.c_velocity.v,s=this.m_bodyA.c_velocity.w,n=this.m_bodyB.c_position.c,m=this.m_bodyB.c_position.a,a=this.m_bodyB.c_velocity.v,c=this.m_bodyB.c_velocity.w,_=v.neo(i),u=v.neo(m),p=v.mulVec2(_,h.sub(this.m_localAnchorA,this.m_localCenterA)),y=v.mulVec2(u,h.sub(this.m_localAnchorB,this.m_localCenterB)),d=h.zero();d.addCombine(1,n,1,y),d.subCombine(1,e,1,p);var f=this.m_invMassA,x=this.m_invMassB,A=this.m_invIA,b=this.m_invIB;this.m_axis=v.mulVec2(_,this.m_localXAxisA),this.m_a1=h.crossVec2Vec2(h.add(d,p),this.m_axis),this.m_a2=h.crossVec2Vec2(y,this.m_axis),this.m_motorMass=f+x+A*this.m_a1*this.m_a1+b*this.m_a2*this.m_a2,this.m_motorMass>0&&(this.m_motorMass=1/this.m_motorMass),this.m_perp=v.mulVec2(_,this.m_localYAxisA),this.m_s1=h.crossVec2Vec2(h.add(d,p),this.m_perp),this.m_s2=h.crossVec2Vec2(y,this.m_perp),h.crossVec2Vec2(p,this.m_perp);var g=f+x+A*this.m_s1*this.m_s1+b*this.m_s2*this.m_s2,B=A*this.m_s1+b*this.m_s2,V=A*this.m_s1*this.m_a1+b*this.m_s2*this.m_a2,w=A+b;0==w&&(w=1);var C=A*this.m_a1+b*this.m_a2,M=f+x+A*this.m_a1*this.m_a1+b*this.m_a2*this.m_a2;if(this.m_K.ex.set(g,B,V),this.m_K.ey.set(B,w,C),this.m_K.ez.set(V,C,M),this.m_enableLimit){var I=h.dot(this.m_axis,d);r.abs(this.m_upperTranslation-this.m_lowerTranslation)<2*l.linearSlop?this.m_limitState=3:I<=this.m_lowerTranslation?1!=this.m_limitState&&(this.m_limitState=1,this.m_impulse.z=0):I>=this.m_upperTranslation?2!=this.m_limitState&&(this.m_limitState=2,this.m_impulse.z=0):(this.m_limitState=0,this.m_impulse.z=0)}else this.m_limitState=0,this.m_impulse.z=0;if(0==this.m_enableMotor&&(this.m_motorImpulse=0),t.warmStarting){this.m_impulse.mul(t.dtRatio),this.m_motorImpulse*=t.dtRatio;var z=h.combine(this.m_impulse.x,this.m_perp,this.m_motorImpulse+this.m_impulse.z,this.m_axis),P=this.m_impulse.x*this.m_s1+this.m_impulse.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_a1,S=this.m_impulse.x*this.m_s2+this.m_impulse.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_a2;o.subMul(f,z),s-=A*P,a.addMul(x,z),c+=b*S}else this.m_impulse.setZero(),this.m_motorImpulse=0;this.m_bodyA.c_velocity.v.setVec2(o),this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v.setVec2(a),this.m_bodyB.c_velocity.w=c},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=this.m_invMassA,m=this.m_invMassB,a=this.m_invIA,c=this.m_invIB;if(this.m_enableMotor&&3!=this.m_limitState){var _=h.dot(this.m_axis,h.sub(o,e))+this.m_a2*s-this.m_a1*i,l=this.m_motorMass*(this.m_motorSpeed-_),u=this.m_motorImpulse,p=t.dt*this.m_maxMotorForce;this.m_motorImpulse=r.clamp(this.m_motorImpulse+l,-p,p),l=this.m_motorImpulse-u;var y=h.mulNumVec2(l,this.m_axis),d=l*this.m_a1,f=l*this.m_a2;e.subMul(n,y),i-=a*d,o.addMul(m,y),s+=c*f}var v=h.zero();if(v.x+=h.dot(this.m_perp,o)+this.m_s2*s,v.x-=h.dot(this.m_perp,e)+this.m_s1*i,v.y=s-i,this.m_enableLimit&&0!=this.m_limitState){var x=0;x+=h.dot(this.m_axis,o)+this.m_a2*s,x-=h.dot(this.m_axis,e)+this.m_a1*i;_=new xt(v.x,v.y,x);var A=xt.clone(this.m_impulse),b=this.m_K.solve33(xt.neg(_));this.m_impulse.add(b),1==this.m_limitState?this.m_impulse.z=r.max(this.m_impulse.z,0):2==this.m_limitState&&(this.m_impulse.z=r.min(this.m_impulse.z,0));var g=h.combine(-1,v,-(this.m_impulse.z-A.z),h.neo(this.m_K.ez.x,this.m_K.ez.y)),B=h.add(this.m_K.solve22(g),h.neo(A.x,A.y));this.m_impulse.x=B.x,this.m_impulse.y=B.y,b=xt.sub(this.m_impulse,A);y=h.combine(b.x,this.m_perp,b.z,this.m_axis),d=b.x*this.m_s1+b.y+b.z*this.m_a1,f=b.x*this.m_s2+b.y+b.z*this.m_a2;e.subMul(n,y),i-=a*d,o.addMul(m,y),s+=c*f}else{b=this.m_K.solve22(h.neg(v));this.m_impulse.x+=b.x,this.m_impulse.y+=b.y;y=h.mulNumVec2(b.x,this.m_perp),d=b.x*this.m_s1+b.y,f=b.x*this.m_s2+b.y;e.subMul(n,y),i-=a*d,o.addMul(m,y),s+=c*f}this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyB.c_position.c,s=this.m_bodyB.c_position.a,n=v.neo(i),m=v.neo(s),a=this.m_invMassA,c=this.m_invMassB,_=this.m_invIA,u=this.m_invIB,p=v.mulVec2(n,h.sub(this.m_localAnchorA,this.m_localCenterA)),y=v.mulVec2(m,h.sub(this.m_localAnchorB,this.m_localCenterB)),d=h.sub(h.add(o,y),h.add(e,p)),f=v.mulVec2(n,this.m_localXAxisA),x=h.crossVec2Vec2(h.add(d,p),f),A=h.crossVec2Vec2(y,f),b=v.mulVec2(n,this.m_localYAxisA),g=h.crossVec2Vec2(h.add(d,p),b),B=h.crossVec2Vec2(y,b),V=new xt,w=h.zero();w.x=h.dot(b,d),w.y=s-i-this.m_referenceAngle;var C=r.abs(w.x),M=r.abs(w.y),I=l.linearSlop,z=l.maxLinearCorrection,P=!1,S=0;if(this.m_enableLimit){var T=h.dot(f,d);r.abs(this.m_upperTranslation-this.m_lowerTranslation)<2*I?(S=r.clamp(T,-z,z),C=r.max(C,r.abs(T)),P=!0):T<=this.m_lowerTranslation?(S=r.clamp(T-this.m_lowerTranslation+I,-z,0),C=r.max(C,this.m_lowerTranslation-T),P=!0):T>=this.m_upperTranslation&&(S=r.clamp(T-this.m_upperTranslation-I,0,z),C=r.max(C,T-this.m_upperTranslation),P=!0)}if(P){var F=a+c+_*g*g+u*B*B,q=_*g+u*B,N=_*g*x+u*B*A;0==(R=_+u)&&(R=1);var k=_*x+u*A,D=a+c+_*x*x+u*A*A;(E=new zt).ex.set(F,q,N),E.ey.set(q,R,k),E.ez.set(N,k,D);var j=new xt;j.x=w.x,j.y=w.y,j.z=S,V=E.solve33(xt.neg(j))}else{var R,E;F=a+c+_*g*g+u*B*B,q=_*g+u*B;0==(R=_+u)&&(R=1),(E=new L).ex.setNum(F,q),E.ey.setNum(q,R);var O=E.solve(h.neg(w));V.x=O.x,V.y=O.y,V.z=0}var J=h.combine(V.x,b,V.z,f),Y=V.x*g+V.y+V.z*x,W=V.x*B+V.y+V.z*A;return e.subMul(a,J),i-=_*Y,o.addMul(c,J),s+=u*W,this.m_bodyA.c_position.c=e,this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c=o,this.m_bodyB.c_position.a=s,C<=l.linearSlop&&M<=l.angularSlop},e.TYPE="prismatic-joint",e}(nt),Ft={ratio:1},qt=function(t){function e(i,o,n,m,a,c){var _,l,u=this;if(!(u instanceof e))return new e(i,o,n,m,a,c);i=s(i,Ft),o=(u=t.call(this,i,o,n)||this).m_bodyA,n=u.m_bodyB,u.m_type=e.TYPE,u.m_joint1=m||i.joint1,u.m_joint2=a||i.joint2,u.m_ratio=r.isFinite(c)?c:i.ratio,u.m_type1=u.m_joint1.getType(),u.m_type2=u.m_joint2.getType(),u.m_bodyC=u.m_joint1.getBodyA(),u.m_bodyA=u.m_joint1.getBodyB();var p=u.m_bodyA.m_xf,y=u.m_bodyA.m_sweep.a,d=u.m_bodyC.m_xf,f=u.m_bodyC.m_sweep.a;if(u.m_type1===St.TYPE){var x=u.m_joint1;u.m_localAnchorC=x.m_localAnchorA,u.m_localAnchorA=x.m_localAnchorB,u.m_referenceAngleA=x.m_referenceAngle,u.m_localAxisC=h.zero(),_=y-f-u.m_referenceAngleA}else{var A=u.m_joint1;u.m_localAnchorC=A.m_localAnchorA,u.m_localAnchorA=A.m_localAnchorB,u.m_referenceAngleA=A.m_referenceAngle,u.m_localAxisC=A.m_localXAxisA;var b=u.m_localAnchorC,g=v.mulTVec2(d.q,h.add(v.mulVec2(p.q,u.m_localAnchorA),h.sub(p.p,d.p)));_=h.dot(g,u.m_localAxisC)-h.dot(b,u.m_localAxisC)}u.m_bodyD=u.m_joint2.getBodyA(),u.m_bodyB=u.m_joint2.getBodyB();var B=u.m_bodyB.m_xf,V=u.m_bodyB.m_sweep.a,w=u.m_bodyD.m_xf,C=u.m_bodyD.m_sweep.a;if(u.m_type2===St.TYPE){x=u.m_joint2;u.m_localAnchorD=x.m_localAnchorA,u.m_localAnchorB=x.m_localAnchorB,u.m_referenceAngleB=x.m_referenceAngle,u.m_localAxisD=h.zero(),l=V-C-u.m_referenceAngleB}else{A=u.m_joint2;u.m_localAnchorD=A.m_localAnchorA,u.m_localAnchorB=A.m_localAnchorB,u.m_referenceAngleB=A.m_referenceAngle,u.m_localAxisD=A.m_localXAxisA;var M=u.m_localAnchorD,I=v.mulTVec2(w.q,h.add(v.mulVec2(B.q,u.m_localAnchorB),h.sub(B.p,w.p)));l=h.dot(I,u.m_localAxisD)-h.dot(M,u.m_localAxisD)}return u.m_constant=_+u.m_ratio*l,u.m_impulse=0,u}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,joint1:this.m_joint1,joint2:this.m_joint2,ratio:this.m_ratio}},e._deserialize=function(t,i,s){return(t=o({},t)).bodyA=s(T,t.bodyA,i),t.bodyB=s(T,t.bodyB,i),t.joint1=s(nt,t.joint1,i),t.joint2=s(nt,t.joint2,i),new e(t)},e.prototype.getJoint1=function(){return this.m_joint1},e.prototype.getJoint2=function(){return this.m_joint2},e.prototype.setRatio=function(t){this.m_ratio=t},e.prototype.getRatio=function(){return this.m_ratio},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return h.mulNumVec2(this.m_impulse,this.m_JvAC).mul(t)},e.prototype.getReactionTorque=function(t){return t*(this.m_impulse*this.m_JwA)},e.prototype.initVelocityConstraints=function(t){this.m_lcA=this.m_bodyA.m_sweep.localCenter,this.m_lcB=this.m_bodyB.m_sweep.localCenter,this.m_lcC=this.m_bodyC.m_sweep.localCenter,this.m_lcD=this.m_bodyD.m_sweep.localCenter,this.m_mA=this.m_bodyA.m_invMass,this.m_mB=this.m_bodyB.m_invMass,this.m_mC=this.m_bodyC.m_invMass,this.m_mD=this.m_bodyD.m_invMass,this.m_iA=this.m_bodyA.m_invI,this.m_iB=this.m_bodyB.m_invI,this.m_iC=this.m_bodyC.m_invI,this.m_iD=this.m_bodyD.m_invI;var e=this.m_bodyA.c_position.a,i=this.m_bodyA.c_velocity.v,o=this.m_bodyA.c_velocity.w,s=this.m_bodyB.c_position.a,n=this.m_bodyB.c_velocity.v,r=this.m_bodyB.c_velocity.w,m=this.m_bodyC.c_position.a,a=this.m_bodyC.c_velocity.v,c=this.m_bodyC.c_velocity.w,_=this.m_bodyD.c_position.a,l=this.m_bodyD.c_velocity.v,u=this.m_bodyD.c_velocity.w,p=v.neo(e),y=v.neo(s),d=v.neo(m),f=v.neo(_);if(this.m_mass=0,this.m_type1==St.TYPE)this.m_JvAC=h.zero(),this.m_JwA=1,this.m_JwC=1,this.m_mass+=this.m_iA+this.m_iC;else{var x=v.mulVec2(d,this.m_localAxisC),A=v.mulSub(d,this.m_localAnchorC,this.m_lcC),b=v.mulSub(p,this.m_localAnchorA,this.m_lcA);this.m_JvAC=x,this.m_JwC=h.crossVec2Vec2(A,x),this.m_JwA=h.crossVec2Vec2(b,x),this.m_mass+=this.m_mC+this.m_mA+this.m_iC*this.m_JwC*this.m_JwC+this.m_iA*this.m_JwA*this.m_JwA}if(this.m_type2==St.TYPE)this.m_JvBD=h.zero(),this.m_JwB=this.m_ratio,this.m_JwD=this.m_ratio,this.m_mass+=this.m_ratio*this.m_ratio*(this.m_iB+this.m_iD);else{x=v.mulVec2(f,this.m_localAxisD);var g=v.mulSub(f,this.m_localAnchorD,this.m_lcD),B=v.mulSub(y,this.m_localAnchorB,this.m_lcB);this.m_JvBD=h.mulNumVec2(this.m_ratio,x),this.m_JwD=this.m_ratio*h.crossVec2Vec2(g,x),this.m_JwB=this.m_ratio*h.crossVec2Vec2(B,x),this.m_mass+=this.m_ratio*this.m_ratio*(this.m_mD+this.m_mB)+this.m_iD*this.m_JwD*this.m_JwD+this.m_iB*this.m_JwB*this.m_JwB}this.m_mass=this.m_mass>0?1/this.m_mass:0,t.warmStarting?(i.addMul(this.m_mA*this.m_impulse,this.m_JvAC),o+=this.m_iA*this.m_impulse*this.m_JwA,n.addMul(this.m_mB*this.m_impulse,this.m_JvBD),r+=this.m_iB*this.m_impulse*this.m_JwB,a.subMul(this.m_mC*this.m_impulse,this.m_JvAC),c-=this.m_iC*this.m_impulse*this.m_JwC,l.subMul(this.m_mD*this.m_impulse,this.m_JvBD),u-=this.m_iD*this.m_impulse*this.m_JwD):this.m_impulse=0,this.m_bodyA.c_velocity.v.setVec2(i),this.m_bodyA.c_velocity.w=o,this.m_bodyB.c_velocity.v.setVec2(n),this.m_bodyB.c_velocity.w=r,this.m_bodyC.c_velocity.v.setVec2(a),this.m_bodyC.c_velocity.w=c,this.m_bodyD.c_velocity.v.setVec2(l),this.m_bodyD.c_velocity.w=u},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=this.m_bodyC.c_velocity.v,r=this.m_bodyC.c_velocity.w,m=this.m_bodyD.c_velocity.v,a=this.m_bodyD.c_velocity.w,c=h.dot(this.m_JvAC,e)-h.dot(this.m_JvAC,n)+h.dot(this.m_JvBD,o)-h.dot(this.m_JvBD,m);c+=this.m_JwA*i-this.m_JwC*r+(this.m_JwB*s-this.m_JwD*a);var _=-this.m_mass*c;this.m_impulse+=_,e.addMul(this.m_mA*_,this.m_JvAC),i+=this.m_iA*_*this.m_JwA,o.addMul(this.m_mB*_,this.m_JvBD),s+=this.m_iB*_*this.m_JwB,n.subMul(this.m_mC*_,this.m_JvAC),r-=this.m_iC*_*this.m_JwC,m.subMul(this.m_mD*_,this.m_JvBD),a-=this.m_iD*_*this.m_JwD,this.m_bodyA.c_velocity.v.setVec2(e),this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v.setVec2(o),this.m_bodyB.c_velocity.w=s,this.m_bodyC.c_velocity.v.setVec2(n),this.m_bodyC.c_velocity.w=r,this.m_bodyD.c_velocity.v.setVec2(m),this.m_bodyD.c_velocity.w=a},e.prototype.solvePositionConstraints=function(t){var e,i,o,s,n,r,m,a,c=this.m_bodyA.c_position.c,_=this.m_bodyA.c_position.a,u=this.m_bodyB.c_position.c,p=this.m_bodyB.c_position.a,y=this.m_bodyC.c_position.c,d=this.m_bodyC.c_position.a,f=this.m_bodyD.c_position.c,x=this.m_bodyD.c_position.a,A=v.neo(_),b=v.neo(p),g=v.neo(d),B=v.neo(x),V=0;if(this.m_type1==St.TYPE)o=h.zero(),n=1,m=1,V+=this.m_iA+this.m_iC,e=_-d-this.m_referenceAngleA;else{var w=v.mulVec2(g,this.m_localAxisC),C=v.mulSub(g,this.m_localAnchorC,this.m_lcC),M=v.mulSub(A,this.m_localAnchorA,this.m_lcA);o=w,m=h.crossVec2Vec2(C,w),n=h.crossVec2Vec2(M,w),V+=this.m_mC+this.m_mA+this.m_iC*m*m+this.m_iA*n*n;var I=h.sub(this.m_localAnchorC,this.m_lcC),z=v.mulTVec2(g,h.add(M,h.sub(c,y)));e=h.dot(h.sub(z,I),this.m_localAxisC)}if(this.m_type2==St.TYPE)s=h.zero(),r=this.m_ratio,a=this.m_ratio,V+=this.m_ratio*this.m_ratio*(this.m_iB+this.m_iD),i=p-x-this.m_referenceAngleB;else{w=v.mulVec2(B,this.m_localAxisD);var P=v.mulSub(B,this.m_localAnchorD,this.m_lcD),S=v.mulSub(b,this.m_localAnchorB,this.m_lcB);s=h.mulNumVec2(this.m_ratio,w),a=this.m_ratio*h.crossVec2Vec2(P,w),r=this.m_ratio*h.crossVec2Vec2(S,w),V+=this.m_ratio*this.m_ratio*(this.m_mD+this.m_mB)+this.m_iD*a*a+this.m_iB*r*r;var T=h.sub(this.m_localAnchorD,this.m_lcD),L=v.mulTVec2(B,h.add(S,h.sub(u,f)));i=h.dot(L,this.m_localAxisD)-h.dot(T,this.m_localAxisD)}var F=e+this.m_ratio*i-this.m_constant,q=0;return V>0&&(q=-F/V),c.addMul(this.m_mA*q,o),_+=this.m_iA*q*n,u.addMul(this.m_mB*q,s),p+=this.m_iB*q*r,y.subMul(this.m_mC*q,o),d-=this.m_iC*q*m,f.subMul(this.m_mD*q,s),x-=this.m_iD*q*a,this.m_bodyA.c_position.c.setVec2(c),this.m_bodyA.c_position.a=_,this.m_bodyB.c_position.c.setVec2(u),this.m_bodyB.c_position.a=p,this.m_bodyC.c_position.c.setVec2(y),this.m_bodyC.c_position.a=d,this.m_bodyD.c_position.c.setVec2(f),this.m_bodyD.c_position.a=x,00&&(this.m_angularMass=1/this.m_angularMass),this.m_linearError=h.zero(),this.m_linearError.addCombine(1,n,1,this.m_rB),this.m_linearError.subCombine(1,e,1,this.m_rA),this.m_linearError.sub(v.mulVec2(c,this.m_linearOffset)),this.m_angularError=r-i-this.m_angularOffset,t.warmStarting){this.m_linearImpulse.mul(t.dtRatio),this.m_angularImpulse*=t.dtRatio;var f=h.neo(this.m_linearImpulse.x,this.m_linearImpulse.y);o.subMul(l,f),s-=p*(h.crossVec2Vec2(this.m_rA,f)+this.m_angularImpulse),m.addMul(u,f),a+=y*(h.crossVec2Vec2(this.m_rB,f)+this.m_angularImpulse)}else this.m_linearImpulse.setZero(),this.m_angularImpulse=0;this.m_bodyA.c_velocity.v=o,this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v=m,this.m_bodyB.c_velocity.w=a},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=this.m_invMassA,m=this.m_invMassB,a=this.m_invIA,c=this.m_invIB,_=t.dt,l=t.inv_dt,u=s-i+l*this.m_correctionFactor*this.m_angularError,p=-this.m_angularMass*u,y=this.m_angularImpulse,d=_*this.m_maxTorque;this.m_angularImpulse=r.clamp(this.m_angularImpulse+p,-d,d),i-=a*(p=this.m_angularImpulse-y),s+=c*p,(u=h.zero()).addCombine(1,o,1,h.crossNumVec2(s,this.m_rB)),u.subCombine(1,e,1,h.crossNumVec2(i,this.m_rA)),u.addMul(l*this.m_correctionFactor,this.m_linearError);p=h.neg(L.mulVec2(this.m_linearMass,u)),y=h.clone(this.m_linearImpulse);this.m_linearImpulse.add(p);d=_*this.m_maxForce;this.m_linearImpulse.clamp(d),p=h.sub(this.m_linearImpulse,y),e.subMul(n,p),i-=a*h.crossVec2Vec2(this.m_rA,p),o.addMul(m,p),s+=c*h.crossVec2Vec2(this.m_rB,p),this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){return!0},e.TYPE="motor-joint",e}(nt),Dt={maxForce:0,frequencyHz:5,dampingRatio:.7},jt=function(t){function e(i,o,n,r){var m=this;return m instanceof e?(i=s(i,Dt),o=(m=t.call(this,i,o,n)||this).m_bodyA,n=m.m_bodyB,m.m_type=e.TYPE,m.m_targetA=r?h.clone(r):i.target||h.zero(),m.m_localAnchorB=x.mulTVec2(n.getTransform(),m.m_targetA),m.m_maxForce=i.maxForce,m.m_impulse=h.zero(),m.m_frequencyHz=i.frequencyHz,m.m_dampingRatio=i.dampingRatio,m.m_beta=0,m.m_gamma=0,m.m_rB=h.zero(),m.m_localCenterB=h.zero(),m.m_invMassB=0,m.m_invIB=0,m.m_mass=new L,m.m_C=h.zero(),m):new e(i,o,n,r)}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,target:this.m_targetA,maxForce:this.m_maxForce,frequencyHz:this.m_frequencyHz,dampingRatio:this.m_dampingRatio,_localAnchorB:this.m_localAnchorB}},e._deserialize=function(t,i,s){(t=o({},t)).bodyA=s(T,t.bodyA,i),t.bodyB=s(T,t.bodyB,i),t.target=h.clone(t.target);var n=new e(t);return t._localAnchorB&&(n.m_localAnchorB=t._localAnchorB),n},e.prototype.setTarget=function(t){0==this.m_bodyB.isAwake()&&this.m_bodyB.setAwake(!0),this.m_targetA=h.clone(t)},e.prototype.getTarget=function(){return this.m_targetA},e.prototype.setMaxForce=function(t){this.m_maxForce=t},e.prototype.getMaxForce=function(){return this.m_maxForce},e.prototype.setFrequency=function(t){this.m_frequencyHz=t},e.prototype.getFrequency=function(){return this.m_frequencyHz},e.prototype.setDampingRatio=function(t){this.m_dampingRatio=t},e.prototype.getDampingRatio=function(){return this.m_dampingRatio},e.prototype.getAnchorA=function(){return h.clone(this.m_targetA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return h.mulNumVec2(t,this.m_impulse)},e.prototype.getReactionTorque=function(t){return 0*t},e.prototype.shiftOrigin=function(t){this.m_targetA.sub(t)},e.prototype.initVelocityConstraints=function(t){this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyB.c_position,i=this.m_bodyB.c_velocity,o=e.c,s=e.a,n=i.v,m=i.w,a=v.neo(s),c=this.m_bodyB.getMass(),_=2*r.PI*this.m_frequencyHz,l=2*c*this.m_dampingRatio*_,u=c*(_*_),p=t.dt;this.m_gamma=p*(l+p*u),0!=this.m_gamma&&(this.m_gamma=1/this.m_gamma),this.m_beta=p*u*this.m_gamma,this.m_rB=v.mulVec2(a,h.sub(this.m_localAnchorB,this.m_localCenterB));var y=new L;y.ex.x=this.m_invMassB+this.m_invIB*this.m_rB.y*this.m_rB.y+this.m_gamma,y.ex.y=-this.m_invIB*this.m_rB.x*this.m_rB.y,y.ey.x=y.ex.y,y.ey.y=this.m_invMassB+this.m_invIB*this.m_rB.x*this.m_rB.x+this.m_gamma,this.m_mass=y.getInverse(),this.m_C.setVec2(o),this.m_C.addCombine(1,this.m_rB,-1,this.m_targetA),this.m_C.mul(this.m_beta),m*=.98,t.warmStarting?(this.m_impulse.mul(t.dtRatio),n.addMul(this.m_invMassB,this.m_impulse),m+=this.m_invIB*h.crossVec2Vec2(this.m_rB,this.m_impulse)):this.m_impulse.setZero(),i.v.setVec2(n),i.w=m},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyB.c_velocity,i=h.clone(e.v),o=e.w,s=h.crossNumVec2(o,this.m_rB);s.add(i),s.addCombine(1,this.m_C,this.m_gamma,this.m_impulse),s.neg();var n=L.mulVec2(this.m_mass,s),r=h.clone(this.m_impulse);this.m_impulse.add(n);var m=t.dt*this.m_maxForce;this.m_impulse.clamp(m),n=h.sub(this.m_impulse,r),i.addMul(this.m_invMassB,n),o+=this.m_invIB*h.crossVec2Vec2(this.m_rB,n),e.v.setVec2(i),e.w=o},e.prototype.solvePositionConstraints=function(t){return!0},e.TYPE="mouse-joint",e}(nt),Rt={collideConnected:!0},Et=function(t){function e(i,o,n,m,a,c,_,l){var u=this;return u instanceof e?(i=s(i,Rt),o=(u=t.call(this,i,o,n)||this).m_bodyA,n=u.m_bodyB,u.m_type=e.TYPE,u.m_groundAnchorA=m||(i.groundAnchorA||h.neo(-1,1)),u.m_groundAnchorB=a||(i.groundAnchorB||h.neo(1,1)),u.m_localAnchorA=c?o.getLocalPoint(c):i.localAnchorA||h.neo(-1,0),u.m_localAnchorB=_?n.getLocalPoint(_):i.localAnchorB||h.neo(1,0),u.m_lengthA=r.isFinite(i.lengthA)?i.lengthA:h.distance(c,m),u.m_lengthB=r.isFinite(i.lengthB)?i.lengthB:h.distance(_,a),u.m_ratio=r.isFinite(l)?l:i.ratio,u.m_constant=u.m_lengthA+u.m_ratio*u.m_lengthB,u.m_impulse=0,u):new e(i,o,n,m,a,c,_,l)}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,groundAnchorA:this.m_groundAnchorA,groundAnchorB:this.m_groundAnchorB,localAnchorA:this.m_localAnchorA,localAnchorB:this.m_localAnchorB,lengthA:this.m_lengthA,lengthB:this.m_lengthB,ratio:this.m_ratio}},e._deserialize=function(t,i,s){return(t=o({},t)).bodyA=s(T,t.bodyA,i),t.bodyB=s(T,t.bodyB,i),new e(t)},e.prototype.getGroundAnchorA=function(){return this.m_groundAnchorA},e.prototype.getGroundAnchorB=function(){return this.m_groundAnchorB},e.prototype.getLengthA=function(){return this.m_lengthA},e.prototype.getLengthB=function(){return this.m_lengthB},e.prototype.getRatio=function(){return this.m_ratio},e.prototype.getCurrentLengthA=function(){var t=this.m_bodyA.getWorldPoint(this.m_localAnchorA),e=this.m_groundAnchorA;return h.distance(t,e)},e.prototype.getCurrentLengthB=function(){var t=this.m_bodyB.getWorldPoint(this.m_localAnchorB),e=this.m_groundAnchorB;return h.distance(t,e)},e.prototype.shiftOrigin=function(t){this.m_groundAnchorA.sub(t),this.m_groundAnchorB.sub(t)},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return h.mulNumVec2(this.m_impulse,this.m_uB).mul(t)},e.prototype.getReactionTorque=function(t){return 0},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyA.c_velocity.v,s=this.m_bodyA.c_velocity.w,n=this.m_bodyB.c_position.c,r=this.m_bodyB.c_position.a,m=this.m_bodyB.c_velocity.v,a=this.m_bodyB.c_velocity.w,c=v.neo(i),_=v.neo(r);this.m_rA=v.mulVec2(c,h.sub(this.m_localAnchorA,this.m_localCenterA)),this.m_rB=v.mulVec2(_,h.sub(this.m_localAnchorB,this.m_localCenterB)),this.m_uA=h.sub(h.add(e,this.m_rA),this.m_groundAnchorA),this.m_uB=h.sub(h.add(n,this.m_rB),this.m_groundAnchorB);var u=this.m_uA.length(),p=this.m_uB.length();u>10*l.linearSlop?this.m_uA.mul(1/u):this.m_uA.setZero(),p>10*l.linearSlop?this.m_uB.mul(1/p):this.m_uB.setZero();var y=h.crossVec2Vec2(this.m_rA,this.m_uA),d=h.crossVec2Vec2(this.m_rB,this.m_uB),f=this.m_invMassA+this.m_invIA*y*y,x=this.m_invMassB+this.m_invIB*d*d;if(this.m_mass=f+this.m_ratio*this.m_ratio*x,this.m_mass>0&&(this.m_mass=1/this.m_mass),t.warmStarting){this.m_impulse*=t.dtRatio;var A=h.mulNumVec2(-this.m_impulse,this.m_uA),b=h.mulNumVec2(-this.m_ratio*this.m_impulse,this.m_uB);o.addMul(this.m_invMassA,A),s+=this.m_invIA*h.crossVec2Vec2(this.m_rA,A),m.addMul(this.m_invMassB,b),a+=this.m_invIB*h.crossVec2Vec2(this.m_rB,b)}else this.m_impulse=0;this.m_bodyA.c_velocity.v=o,this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v=m,this.m_bodyB.c_velocity.w=a},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=h.add(e,h.crossNumVec2(i,this.m_rA)),r=h.add(o,h.crossNumVec2(s,this.m_rB)),m=-h.dot(this.m_uA,n)-this.m_ratio*h.dot(this.m_uB,r),a=-this.m_mass*m;this.m_impulse+=a;var c=h.mulNumVec2(-a,this.m_uA),_=h.mulNumVec2(-this.m_ratio*a,this.m_uB);e.addMul(this.m_invMassA,c),i+=this.m_invIA*h.crossVec2Vec2(this.m_rA,c),o.addMul(this.m_invMassB,_),s+=this.m_invIB*h.crossVec2Vec2(this.m_rB,_),this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyB.c_position.c,s=this.m_bodyB.c_position.a,n=v.neo(i),m=v.neo(s),a=v.mulVec2(n,h.sub(this.m_localAnchorA,this.m_localCenterA)),c=v.mulVec2(m,h.sub(this.m_localAnchorB,this.m_localCenterB)),_=h.sub(h.add(e,this.m_rA),this.m_groundAnchorA),u=h.sub(h.add(o,this.m_rB),this.m_groundAnchorB),p=_.length(),y=u.length();p>10*l.linearSlop?_.mul(1/p):_.setZero(),y>10*l.linearSlop?u.mul(1/y):u.setZero();var d=h.crossVec2Vec2(a,_),f=h.crossVec2Vec2(c,u),x=this.m_invMassA+this.m_invIA*d*d,A=this.m_invMassB+this.m_invIB*f*f,b=x+this.m_ratio*this.m_ratio*A;b>0&&(b=1/b);var g=this.m_constant-p-this.m_ratio*y,B=r.abs(g),V=-b*g,w=h.mulNumVec2(-V,_),C=h.mulNumVec2(-this.m_ratio*V,u);return e.addMul(this.m_invMassA,w),i+=this.m_invIA*h.crossVec2Vec2(a,w),o.addMul(this.m_invMassB,C),s+=this.m_invIB*h.crossVec2Vec2(c,C),this.m_bodyA.c_position.c=e,this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c=o,this.m_bodyB.c_position.a=s,B0?2:0,!(this.m_length>l.linearSlop))return this.m_u.setZero(),this.m_mass=0,void(this.m_impulse=0);this.m_u.mul(1/this.m_length);var p=h.crossVec2Vec2(this.m_rA,this.m_u),y=h.crossVec2Vec2(this.m_rB,this.m_u),d=this.m_invMassA+this.m_invIA*p*p+this.m_invMassB+this.m_invIB*y*y;if(this.m_mass=0!=d?1/d:0,t.warmStarting){this.m_impulse*=t.dtRatio;var f=h.mulNumVec2(this.m_impulse,this.m_u);o.subMul(this.m_invMassA,f),s-=this.m_invIA*h.crossVec2Vec2(this.m_rA,f),m.addMul(this.m_invMassB,f),a+=this.m_invIB*h.crossVec2Vec2(this.m_rB,f)}else this.m_impulse=0;this.m_bodyA.c_velocity.v.setVec2(o),this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v.setVec2(m),this.m_bodyB.c_velocity.w=a},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=h.addCrossNumVec2(e,i,this.m_rA),m=h.addCrossNumVec2(o,s,this.m_rB),a=this.m_length-this.m_maxLength,c=h.dot(this.m_u,h.sub(m,n));a<0&&(c+=t.inv_dt*a);var _=-this.m_mass*c,l=this.m_impulse;this.m_impulse=r.min(0,this.m_impulse+_),_=this.m_impulse-l;var u=h.mulNumVec2(_,this.m_u);e.subMul(this.m_invMassA,u),i-=this.m_invIA*h.crossVec2Vec2(this.m_rA,u),o.addMul(this.m_invMassB,u),s+=this.m_invIB*h.crossVec2Vec2(this.m_rB,u),this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyB.c_position.c,s=this.m_bodyB.c_position.a,n=v.neo(i),m=v.neo(s),a=v.mulSub(n,this.m_localAnchorA,this.m_localCenterA),c=v.mulSub(m,this.m_localAnchorB,this.m_localCenterB),_=h.zero();_.addCombine(1,o,1,c),_.subCombine(1,e,1,a);var u=_.normalize(),p=u-this.m_maxLength;p=r.clamp(p,0,l.maxLinearCorrection);var y=-this.m_mass*p,d=h.mulNumVec2(y,_);return e.subMul(this.m_invMassA,d),i-=this.m_invIA*h.crossVec2Vec2(a,d),o.addMul(this.m_invMassB,d),s+=this.m_invIB*h.crossVec2Vec2(c,d),this.m_bodyA.c_position.c.setVec2(e),this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c.setVec2(o),this.m_bodyB.c_position.a=s,u-this.m_maxLength0){y.getInverse22(this.m_mass);var d=u+p,f=d>0?1/d:0,x=s-e-this.m_referenceAngle,A=2*r.PI*this.m_frequencyHz,b=2*f*this.m_dampingRatio*A,g=f*A*A,B=t.dt;this.m_gamma=B*(b+B*g),this.m_gamma=0!=this.m_gamma?1/this.m_gamma:0,this.m_bias=x*B*g*this.m_gamma,d+=this.m_gamma,this.m_mass.ez.z=0!=d?1/d:0}else 0==y.ez.z?(y.getInverse22(this.m_mass),this.m_gamma=0,this.m_bias=0):(y.getSymInverse33(this.m_mass),this.m_gamma=0,this.m_bias=0);if(t.warmStarting){this.m_impulse.mul(t.dtRatio);var V=h.neo(this.m_impulse.x,this.m_impulse.y);i.subMul(_,V),o-=u*(h.crossVec2Vec2(this.m_rA,V)+this.m_impulse.z),n.addMul(l,V),m+=p*(h.crossVec2Vec2(this.m_rB,V)+this.m_impulse.z)}else this.m_impulse.setZero();this.m_bodyA.c_velocity.v=i,this.m_bodyA.c_velocity.w=o,this.m_bodyB.c_velocity.v=n,this.m_bodyB.c_velocity.w=m},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=this.m_invMassA,r=this.m_invMassB,m=this.m_invIA,a=this.m_invIB;if(this.m_frequencyHz>0){var c=s-i,_=-this.m_mass.ez.z*(c+this.m_bias+this.m_gamma*this.m_impulse.z);this.m_impulse.z+=_,i-=m*_,s+=a*_,(p=h.zero()).addCombine(1,o,1,h.crossNumVec2(s,this.m_rB)),p.subCombine(1,e,1,h.crossNumVec2(i,this.m_rA));var l=h.neg(zt.mulVec2(this.m_mass,p));this.m_impulse.x+=l.x,this.m_impulse.y+=l.y;var u=h.clone(l);e.subMul(n,u),i-=m*h.crossVec2Vec2(this.m_rA,u),o.addMul(r,u),s+=a*h.crossVec2Vec2(this.m_rB,u)}else{var p;(p=h.zero()).addCombine(1,o,1,h.crossNumVec2(s,this.m_rB)),p.subCombine(1,e,1,h.crossNumVec2(i,this.m_rA));c=s-i;var y=new xt(p.x,p.y,c),d=xt.neg(zt.mulVec3(this.m_mass,y));this.m_impulse.add(d);u=h.neo(d.x,d.y);e.subMul(n,u),i-=m*(h.crossVec2Vec2(this.m_rA,u)+d.z),o.addMul(r,u),s+=a*(h.crossVec2Vec2(this.m_rB,u)+d.z)}this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){var e,i,o=this.m_bodyA.c_position.c,s=this.m_bodyA.c_position.a,n=this.m_bodyB.c_position.c,m=this.m_bodyB.c_position.a,a=v.neo(s),c=v.neo(m),_=this.m_invMassA,u=this.m_invMassB,p=this.m_invIA,y=this.m_invIB,d=v.mulVec2(a,h.sub(this.m_localAnchorA,this.m_localCenterA)),f=v.mulVec2(c,h.sub(this.m_localAnchorB,this.m_localCenterB)),x=new zt;if(x.ex.x=_+u+d.y*d.y*p+f.y*f.y*y,x.ey.x=-d.y*d.x*p-f.y*f.x*y,x.ez.x=-d.y*p-f.y*y,x.ex.y=x.ey.x,x.ey.y=_+u+d.x*d.x*p+f.x*f.x*y,x.ez.y=d.x*p+f.x*y,x.ex.z=x.ez.x,x.ey.z=x.ez.y,x.ez.z=p+y,this.m_frequencyHz>0){(b=h.zero()).addCombine(1,n,1,f),b.subCombine(1,o,1,d),e=b.length(),i=0;var A=h.neg(x.solve22(b));o.subMul(_,A),s-=p*h.crossVec2Vec2(d,A),n.addMul(u,A),m+=y*h.crossVec2Vec2(f,A)}else{var b;(b=h.zero()).addCombine(1,n,1,f),b.subCombine(1,o,1,d);var g=m-s-this.m_referenceAngle;e=b.length(),i=r.abs(g);var B=new xt(b.x,b.y,g),V=new xt;if(x.ez.z>0)V=xt.neg(x.solve33(B));else{var w=h.neg(x.solve22(b));V.set(w.x,w.y,0)}A=h.neo(V.x,V.y);o.subMul(_,A),s-=p*(h.crossVec2Vec2(d,A)+V.z),n.addMul(u,A),m+=y*(h.crossVec2Vec2(f,A)+V.z)}return this.m_bodyA.c_position.c=o,this.m_bodyA.c_position.a=s,this.m_bodyB.c_position.c=n,this.m_bodyB.c_position.a=m,e<=l.linearSlop&&i<=l.angularSlop},e.TYPE="weld-joint",e}(nt),Ht={enableMotor:!1,maxMotorTorque:0,motorSpeed:0,frequencyHz:2,dampingRatio:.7},Zt=function(t){function e(i,o,n,r,m){var a=this;return a instanceof e?(i=s(i,Ht),(a=t.call(this,i,o,n)||this).m_ax=h.zero(),a.m_ay=h.zero(),o=a.m_bodyA,n=a.m_bodyB,a.m_type=e.TYPE,a.m_localAnchorA=h.clone(r?o.getLocalPoint(r):i.localAnchorA||h.zero()),a.m_localAnchorB=h.clone(r?n.getLocalPoint(r):i.localAnchorB||h.zero()),a.m_localXAxisA=h.clone(m?o.getLocalVector(m):i.localAxisA||i.localAxis||h.neo(1,0)),a.m_localYAxisA=h.crossNumVec2(1,a.m_localXAxisA),a.m_mass=0,a.m_impulse=0,a.m_motorMass=0,a.m_motorImpulse=0,a.m_springMass=0,a.m_springImpulse=0,a.m_maxMotorTorque=i.maxMotorTorque,a.m_motorSpeed=i.motorSpeed,a.m_enableMotor=i.enableMotor,a.m_frequencyHz=i.frequencyHz,a.m_dampingRatio=i.dampingRatio,a.m_bias=0,a.m_gamma=0,a):new e(i,o,n,r,m)}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,enableMotor:this.m_enableMotor,maxMotorTorque:this.m_maxMotorTorque,motorSpeed:this.m_motorSpeed,frequencyHz:this.m_frequencyHz,dampingRatio:this.m_dampingRatio,localAnchorA:this.m_localAnchorA,localAnchorB:this.m_localAnchorB,localAxisA:this.m_localXAxisA}},e._deserialize=function(t,i,s){return(t=o({},t)).bodyA=s(T,t.bodyA,i),t.bodyB=s(T,t.bodyB,i),new e(t)},e.prototype._setAnchors=function(t){t.anchorA?this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(t.anchorA)):t.localAnchorA&&this.m_localAnchorA.setVec2(t.localAnchorA),t.anchorB?this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(t.anchorB)):t.localAnchorB&&this.m_localAnchorB.setVec2(t.localAnchorB),t.localAxisA&&(this.m_localXAxisA.setVec2(t.localAxisA),this.m_localYAxisA.setVec2(h.crossNumVec2(1,t.localAxisA)))},e.prototype.getLocalAnchorA=function(){return this.m_localAnchorA},e.prototype.getLocalAnchorB=function(){return this.m_localAnchorB},e.prototype.getLocalAxisA=function(){return this.m_localXAxisA},e.prototype.getJointTranslation=function(){var t=this.m_bodyA,e=this.m_bodyB,i=t.getWorldPoint(this.m_localAnchorA),o=e.getWorldPoint(this.m_localAnchorB),s=h.sub(o,i),n=t.getWorldVector(this.m_localXAxisA);return h.dot(s,n)},e.prototype.getJointSpeed=function(){var t=this.m_bodyA.m_angularVelocity;return this.m_bodyB.m_angularVelocity-t},e.prototype.isMotorEnabled=function(){return this.m_enableMotor},e.prototype.enableMotor=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableMotor=t},e.prototype.setMotorSpeed=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_motorSpeed=t},e.prototype.getMotorSpeed=function(){return this.m_motorSpeed},e.prototype.setMaxMotorTorque=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_maxMotorTorque=t},e.prototype.getMaxMotorTorque=function(){return this.m_maxMotorTorque},e.prototype.getMotorTorque=function(t){return t*this.m_motorImpulse},e.prototype.setSpringFrequencyHz=function(t){this.m_frequencyHz=t},e.prototype.getSpringFrequencyHz=function(){return this.m_frequencyHz},e.prototype.setSpringDampingRatio=function(t){this.m_dampingRatio=t},e.prototype.getSpringDampingRatio=function(){return this.m_dampingRatio},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return h.combine(this.m_impulse,this.m_ay,this.m_springImpulse,this.m_ax).mul(t)},e.prototype.getReactionTorque=function(t){return t*this.m_motorImpulse},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_invMassA,i=this.m_invMassB,o=this.m_invIA,s=this.m_invIB,n=this.m_bodyA.c_position.c,m=this.m_bodyA.c_position.a,a=this.m_bodyA.c_velocity.v,c=this.m_bodyA.c_velocity.w,_=this.m_bodyB.c_position.c,l=this.m_bodyB.c_position.a,u=this.m_bodyB.c_velocity.v,p=this.m_bodyB.c_velocity.w,y=v.neo(m),d=v.neo(l),f=v.mulVec2(y,h.sub(this.m_localAnchorA,this.m_localCenterA)),x=v.mulVec2(d,h.sub(this.m_localAnchorB,this.m_localCenterB)),A=h.zero();if(A.addCombine(1,_,1,x),A.subCombine(1,n,1,f),this.m_ay=v.mulVec2(y,this.m_localYAxisA),this.m_sAy=h.crossVec2Vec2(h.add(A,f),this.m_ay),this.m_sBy=h.crossVec2Vec2(x,this.m_ay),this.m_mass=e+i+o*this.m_sAy*this.m_sAy+s*this.m_sBy*this.m_sBy,this.m_mass>0&&(this.m_mass=1/this.m_mass),this.m_springMass=0,this.m_bias=0,this.m_gamma=0,this.m_frequencyHz>0){this.m_ax=v.mulVec2(y,this.m_localXAxisA),this.m_sAx=h.crossVec2Vec2(h.add(A,f),this.m_ax),this.m_sBx=h.crossVec2Vec2(x,this.m_ax);var b=e+i+o*this.m_sAx*this.m_sAx+s*this.m_sBx*this.m_sBx;if(b>0){this.m_springMass=1/b;var g=h.dot(A,this.m_ax),B=2*r.PI*this.m_frequencyHz,V=2*this.m_springMass*this.m_dampingRatio*B,w=this.m_springMass*B*B,C=t.dt;this.m_gamma=C*(V+C*w),this.m_gamma>0&&(this.m_gamma=1/this.m_gamma),this.m_bias=g*C*w*this.m_gamma,this.m_springMass=b+this.m_gamma,this.m_springMass>0&&(this.m_springMass=1/this.m_springMass)}}else this.m_springImpulse=0;if(this.m_enableMotor?(this.m_motorMass=o+s,this.m_motorMass>0&&(this.m_motorMass=1/this.m_motorMass)):(this.m_motorMass=0,this.m_motorImpulse=0),t.warmStarting){this.m_impulse*=t.dtRatio,this.m_springImpulse*=t.dtRatio,this.m_motorImpulse*=t.dtRatio;var M=h.combine(this.m_impulse,this.m_ay,this.m_springImpulse,this.m_ax),I=this.m_impulse*this.m_sAy+this.m_springImpulse*this.m_sAx+this.m_motorImpulse,z=this.m_impulse*this.m_sBy+this.m_springImpulse*this.m_sBx+this.m_motorImpulse;a.subMul(this.m_invMassA,M),c-=this.m_invIA*I,u.addMul(this.m_invMassB,M),p+=this.m_invIB*z}else this.m_impulse=0,this.m_springImpulse=0,this.m_motorImpulse=0;this.m_bodyA.c_velocity.v.setVec2(a),this.m_bodyA.c_velocity.w=c,this.m_bodyB.c_velocity.v.setVec2(u),this.m_bodyB.c_velocity.w=p},e.prototype.solveVelocityConstraints=function(t){var e=this.m_invMassA,i=this.m_invMassB,o=this.m_invIA,s=this.m_invIB,n=this.m_bodyA.c_velocity.v,m=this.m_bodyA.c_velocity.w,a=this.m_bodyB.c_velocity.v,c=this.m_bodyB.c_velocity.w,_=h.dot(this.m_ax,a)-h.dot(this.m_ax,n)+this.m_sBx*c-this.m_sAx*m,l=-this.m_springMass*(_+this.m_bias+this.m_gamma*this.m_springImpulse);this.m_springImpulse+=l;var u=h.mulNumVec2(l,this.m_ax),p=l*this.m_sAx,y=l*this.m_sBx;n.subMul(e,u),m-=o*p,a.addMul(i,u);_=(c+=s*y)-m-this.m_motorSpeed,l=-this.m_motorMass*_;var d=this.m_motorImpulse,f=t.dt*this.m_maxMotorTorque;this.m_motorImpulse=r.clamp(this.m_motorImpulse+l,-f,f),m-=o*(l=this.m_motorImpulse-d),c+=s*l;_=h.dot(this.m_ay,a)-h.dot(this.m_ay,n)+this.m_sBy*c-this.m_sAy*m,l=-this.m_mass*_;this.m_impulse+=l;u=h.mulNumVec2(l,this.m_ay),p=l*this.m_sAy,y=l*this.m_sBy;n.subMul(e,u),m-=o*p,a.addMul(i,u),c+=s*y,this.m_bodyA.c_velocity.v.setVec2(n),this.m_bodyA.c_velocity.w=m,this.m_bodyB.c_velocity.v.setVec2(a),this.m_bodyB.c_velocity.w=c},e.prototype.solvePositionConstraints=function(t){var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyB.c_position.c,s=this.m_bodyB.c_position.a,n=v.neo(i),m=v.neo(s),a=v.mulVec2(n,h.sub(this.m_localAnchorA,this.m_localCenterA)),c=v.mulVec2(m,h.sub(this.m_localAnchorB,this.m_localCenterB)),_=h.zero();_.addCombine(1,o,1,c),_.subCombine(1,e,1,a);var u,p=v.mulVec2(n,this.m_localYAxisA),y=h.crossVec2Vec2(h.add(_,a),p),d=h.crossVec2Vec2(c,p),f=h.dot(_,p),x=this.m_invMassA+this.m_invMassB+this.m_invIA*this.m_sAy*this.m_sAy+this.m_invIB*this.m_sBy*this.m_sBy;u=0!=x?-f/x:0;var A=h.mulNumVec2(u,p),b=u*y,g=u*d;return e.subMul(this.m_invMassA,A),i-=this.m_invIA*b,o.addMul(this.m_invMassB,A),s+=this.m_invIB*g,this.m_bodyA.c_position.c.setVec2(e),this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c.setVec2(o),this.m_bodyB.c_position.a=s,r.abs(f)<=l.linearSlop},e.TYPE="wheel-joint",e}(nt),Xt=0;function Kt(t){var e,i=(t=t||{}).rootClass||vt,s=t.preSerialize||function(t){return t},n=t.postSerialize||function(t,e){return t},r=t.preDeserialize||function(t){return t},m=t.postDeserialize||function(t,e){return t},a={World:vt,Body:T,Joint:nt,Fixture:C,Shape:B},c=o({Vec2:h,Vec3:xt},a),_=((e={})[T.STATIC]=T,e[T.DYNAMIC]=T,e[T.KINEMATIC]=T,e[bt.TYPE]=bt,e[Bt.TYPE]=Bt,e[At.TYPE]=At,e[gt.TYPE]=gt,e[Vt.TYPE]=Vt,e[Ct.TYPE]=Ct,e[It.TYPE]=It,e[qt.TYPE]=qt,e[kt.TYPE]=kt,e[jt.TYPE]=jt,e[Lt.TYPE]=Lt,e[Et.TYPE]=Et,e[St.TYPE]=St,e[Jt.TYPE]=Jt,e[Wt.TYPE]=Wt,e[Zt.TYPE]=Zt,e);this.toJson=function(t){var e=[],i=[t],o={};function r(t,s){if(t.__sid=t.__sid||++Xt,!o[t.__sid]){i.push(t);var n={refIndex:e.length+i.length,refType:s};o[t.__sid]=n}return o[t.__sid]}function m(t,e){if("object"!=typeof t||null===t)return t;if("function"==typeof t._serialize){if(t!==e)for(var i in a)if(t instanceof a[i])return r(t,i);t=function(t){var e=(t=s(t))._serialize();return n(e,t)}(t)}if(Array.isArray(t)){for(var o=[],c=0;c_*_||(t.type=m.e_circles,t.localPoint.setVec2(e.m_p),t.localNormal.setZero(),t.pointCount=1,t.points[0].localPoint.setVec2(o.m_p),t.points[0].id.cf.indexA=0,t.points[0].id.cf.typeA=a.e_vertex,t.points[0].id.cf.indexB=0,t.points[0].id.cf.typeB=a.e_vertex)}function Qt(t,e,i,o,s){t.pointCount=0;var n=x.mulTVec2(i,x.mulVec2(s,o.m_p)),r=e.m_vertex1,c=e.m_vertex2,_=h.sub(c,r),l=h.dot(_,h.sub(c,n)),u=h.dot(_,h.sub(n,r)),p=e.m_radius+o.m_radius;if(u<=0){var y=h.clone(r),d=h.sub(n,y);if(h.dot(d,d)>p*p)return;if(e.m_hasVertex0){var f=e.m_vertex0,v=r,A=h.sub(v,f);if(h.dot(A,h.sub(v,n))>0)return}return t.type=m.e_circles,t.localNormal.setZero(),t.localPoint.setVec2(y),t.pointCount=1,t.points[0].localPoint.setVec2(o.m_p),t.points[0].id.cf.indexA=0,t.points[0].id.cf.typeA=a.e_vertex,t.points[0].id.cf.indexB=0,void(t.points[0].id.cf.typeB=a.e_vertex)}if(l<=0){var b=h.clone(c),g=h.sub(n,b);if(h.dot(g,g)>p*p)return;if(e.m_hasVertex3){var B=e.m_vertex3,V=c,w=h.sub(B,V);if(h.dot(w,h.sub(n,V))>0)return}return t.type=m.e_circles,t.localNormal.setZero(),t.localPoint.setVec2(b),t.pointCount=1,t.points[0].localPoint.setVec2(o.m_p),t.points[0].id.cf.indexA=1,t.points[0].id.cf.typeA=a.e_vertex,t.points[0].id.cf.indexB=0,void(t.points[0].id.cf.typeB=a.e_vertex)}var C=h.dot(_,_),M=h.combine(l/C,r,u/C,c),I=h.sub(n,M);if(!(h.dot(I,I)>p*p)){var z=h.neo(-_.y,_.x);h.dot(z,h.sub(n,r))<0&&z.setNum(-z.x,-z.y),z.normalize(),t.type=m.e_faceA,t.localNormal=z,t.localPoint.setVec2(r),t.pointCount=1,t.points[0].localPoint.setVec2(o.m_p),t.points[0].id.cf.indexA=0,t.points[0].id.cf.typeA=a.e_face,t.points[0].id.cf.indexB=0,t.points[0].id.cf.typeB=a.e_vertex}}function $t(t,e,i,o,s){for(var n=t.m_count,r=i.m_count,m=t.m_normals,a=t.m_vertices,c=i.m_vertices,_=x.mulTXf(o,e),l=0,u=-1/0,p=0;pu&&(u=f,l=p)}s.maxSeparation=u,s.bestIndex=l}Kt.toJson=Gt.toJson,Kt.fromJson=Gt.fromJson,ot.addType(Vt.TYPE,Vt.TYPE,(function(t,e,i,o,s,n,r){Ut(t,i.getShape(),e,n.getShape(),s)})),ot.addType(At.TYPE,Vt.TYPE,(function(t,e,i,o,s,n,r){var m=i.getShape(),a=n.getShape();Qt(t,m,e,a,s)})),ot.addType(bt.TYPE,Vt.TYPE,(function(t,e,i,o,s,n,r){var m=i.getShape(),a=new At;m.getChildEdge(a,o);var c=a,h=n.getShape();Qt(t,c,e,h,s)})),ot.addType(gt.TYPE,gt.TYPE,(function(t,e,i,o,s,n,r){oe(t,i.getShape(),e,n.getShape(),s)}));var te,ee,ie={maxSeparation:0,bestIndex:0};function oe(t,e,i,o,s){t.pointCount=0;var n=e.m_radius+o.m_radius;$t(e,i,o,s,ie);var r=ie.bestIndex,c=ie.maxSeparation;if(!(c>n)){$t(o,s,e,i,ie);var _=ie.bestIndex,u=ie.maxSeparation;if(!(u>n)){var p,y,d,f,A,b;u>c+.1*l.linearSlop?(p=o,y=e,d=s,f=i,A=_,t.type=m.e_faceB,b=1):(p=e,y=o,d=i,f=s,A=r,t.type=m.e_faceA,b=0);var g=[new F,new F];!function(t,e,i,o,s,n){for(var r=e.m_normals,m=s.m_count,c=s.m_vertices,_=s.m_normals,l=v.mulTVec2(n.q,v.mulVec2(i.q,r[o])),u=0,p=1/0,y=0;yu)return;v>l&&(l=v,_=f)}var A=_,b=A+1u*u)return;t.pointCount=1,t.type=m.e_faceA,t.localNormal.setCombine(1,c,-1,g),t.localNormal.normalize(),t.localPoint=g,t.points[0].localPoint.setVec2(o.m_p),t.points[0].id.cf.indexA=0,t.points[0].id.cf.typeA=a.e_vertex,t.points[0].id.cf.indexB=0,t.points[0].id.cf.typeB=a.e_vertex}else if(w<=0){if(h.distanceSquared(c,B)>u*u)return;t.pointCount=1,t.type=m.e_faceA,t.localNormal.setCombine(1,c,-1,B),t.localNormal.normalize(),t.localPoint.setVec2(B),t.points[0].localPoint.setVec2(o.m_p),t.points[0].id.cf.indexA=0,t.points[0].id.cf.typeA=a.e_vertex,t.points[0].id.cf.indexB=0,t.points[0].id.cf.typeB=a.e_vertex}else{var C=h.mid(g,B);if(h.dot(c,d[A])-h.dot(C,d[A])>u)return;t.pointCount=1,t.type=m.e_faceA,t.localNormal.setVec2(d[A]),t.localPoint.setVec2(C),t.points[0].localPoint.setVec2(o.m_p),t.points[0].id.cf.indexA=0,t.points[0].id.cf.typeA=a.e_vertex,t.points[0].id.cf.indexB=0,t.points[0].id.cf.typeB=a.e_vertex}}ot.addType(gt.TYPE,Vt.TYPE,(function(t,e,i,o,s,n,r){se(t,i.getShape(),e,n.getShape(),s)})),ot.addType(At.TYPE,gt.TYPE,(function(t,e,i,o,s,n,r){le(t,i.getShape(),e,n.getShape(),s)})),ot.addType(bt.TYPE,gt.TYPE,(function(t,e,i,o,s,n,r){var m=i.getShape(),a=new At;m.getChildEdge(a,o),le(t,a,e,n.getShape(),s)})),function(t){t[t.e_unknown=-1]="e_unknown",t[t.e_edgeA=1]="e_edgeA",t[t.e_edgeB=2]="e_edgeB"}(te||(te={})),function(t){t[t.e_isolated=0]="e_isolated",t[t.e_concave=1]="e_concave",t[t.e_convex=2]="e_convex"}(ee||(ee={}));var ne=function(){},re=function(){this.vertices=[],this.normals=[],this.count=0},me=function(){this.normal=h.zero(),this.sideNormal1=h.zero(),this.sideNormal2=h.zero()},ae=new ne,ce=new ne,he=new re,_e=new me;function le(t,e,i,o,s){var n=x.mulTXf(i,s),c=x.mulVec2(n,o.m_centroid),_=e.m_vertex0,u=e.m_vertex1,p=e.m_vertex2,y=e.m_vertex3,d=e.m_hasVertex0,f=e.m_hasVertex3,A=h.sub(p,u);A.normalize();var b,g,B,V=h.neo(A.y,-A.x),w=h.dot(V,h.sub(c,u)),C=0,M=0,I=!1,z=!1;if(d){var P=h.sub(u,_);P.normalize(),b=h.neo(P.y,-P.x),I=h.crossVec2Vec2(P,A)>=0,C=h.dot(b,c)-h.dot(b,_)}if(f){var S=h.sub(y,p);S.normalize(),g=h.neo(S.y,-S.x),z=h.crossVec2Vec2(A,S)>0,M=h.dot(g,c)-h.dot(g,p)}var T=h.zero(),L=h.zero(),q=h.zero();d&&f?I&&z?(B=C>=0||w>=0||M>=0)?(T.setVec2(V),L.setVec2(b),q.setVec2(g)):(T.setMul(-1,V),L.setMul(-1,V),q.setMul(-1,V)):I?(B=C>=0||w>=0&&M>=0)?(T.setVec2(V),L.setVec2(b),q.setVec2(V)):(T.setMul(-1,V),L.setMul(-1,g),q.setMul(-1,V)):z?(B=M>=0||C>=0&&w>=0)?(T.setVec2(V),L.setVec2(V),q.setVec2(g)):(T.setMul(-1,V),L.setMul(-1,V),q.setMul(-1,b)):(B=C>=0&&w>=0&&M>=0)?(T.setVec2(V),L.setVec2(V),q.setVec2(V)):(T.setMul(-1,V),L.setMul(-1,g),q.setMul(-1,b)):d?I?(B=C>=0||w>=0)?(T.setVec2(V),L.setVec2(b),q.setMul(-1,V)):(T.setMul(-1,V),L.setVec2(V),q.setMul(-1,V)):(B=C>=0&&w>=0)?(T.setVec2(V),L.setVec2(V),q.setMul(-1,V)):(T.setMul(-1,V),L.setVec2(V),q.setMul(-1,b)):f?z?(B=w>=0||M>=0)?(T.setVec2(V),L.setMul(-1,V),q.setVec2(g)):(T.setMul(-1,V),L.setMul(-1,V),q.setVec2(V)):(B=w>=0&&M>=0)?(T.setVec2(V),L.setMul(-1,V),q.setVec2(V)):(T.setMul(-1,V),L.setMul(-1,g),q.setVec2(V)):(B=w>=0)?(T.setVec2(V),L.setMul(-1,V),q.setMul(-1,V)):(T.setMul(-1,V),L.setVec2(V),q.setVec2(V)),he.count=o.m_count;for(var N=0;Nk)){ce.type=te.e_unknown,ce.index=-1,ce.separation=-1/0;var D=h.neo(-T.y,T.x);for(N=0;Nk){ce.type=te.e_edgeB,ce.index=N,ce.separation=j;break}if(h.dot(R,D)>=0){if(h.dot(h.sub(R,q),T)<-l.angularSlop)continue}else if(h.dot(h.sub(R,L),T)<-l.angularSlop)continue;j>ce.separation&&(ce.type=te.e_edgeB,ce.index=N,ce.separation=j)}if(!(ce.type!=te.e_unknown&&ce.separation>k)){var Y;Y=ce.type==te.e_unknown?ae:ce.separation>.98*ae.separation+.001?ce:ae;var W=[new F,new F];if(Y.type==te.e_edgeA){t.type=m.e_faceA;var H=0,Z=h.dot(T,he.normals[0]);for(N=1;N>1,t|=t>>2,t|=t>>4,t|=t>>8,(t|=t>>16)+1},isPowerOfTwo:function(t){return t>0&&0==(t&t-1)},mod:function(t,e,i){return void 0===e?(i=1,e=0):void 0===i&&(i=e,e=0),i>e?(t=(t-e)%(i-e))+(t<0?i:e):(t=(t-i)%(e-i))+(t<=0?e:i)},clamp:function(t,e,i){return ti?i:t},random:function(t,e){return void 0===t?(e=1,t=0):void 0===e&&(e=t,t=0),t===e?t:Math.random()*(e-t)+t}}),r=function(){function t(e,i){if(!(this instanceof t))return new t(e,i);void 0===e?(this.x=0,this.y=0):"object"==typeof e?(this.x=e.x,this.y=e.y):(this.x=e,this.y=i)}return t.prototype._serialize=function(){return{x:this.x,y:this.y}},t._deserialize=function(e){var i=Object.create(t.prototype);return i.x=e.x,i.y=e.y,i},t.zero=function(){var e=Object.create(t.prototype);return e.x=0,e.y=0,e},t.neo=function(e,i){var o=Object.create(t.prototype);return o.x=e,o.y=i,o},t.clone=function(e){return t.neo(e.x,e.y)},t.prototype.toString=function(){return JSON.stringify(this)},t.isValid=function(t){return null!=t&&(n.isFinite(t.x)&&n.isFinite(t.y))},t.assert=function(t){},t.prototype.clone=function(){return t.clone(this)},t.prototype.setZero=function(){return this.x=0,this.y=0,this},t.prototype.set=function(t,e){return"object"==typeof t?(this.x=t.x,this.y=t.y):(this.x=t,this.y=e),this},t.prototype.setNum=function(t,e){return this.x=t,this.y=e,this},t.prototype.setVec2=function(t){return this.x=t.x,this.y=t.y,this},t.prototype.wSet=function(t,e,i,o){return void 0!==i||void 0!==o?this.setCombine(t,e,i,o):this.setMul(t,e)},t.prototype.setCombine=function(t,e,i,o){var s=t*e.x+i*o.x,n=t*e.y+i*o.y;return this.x=s,this.y=n,this},t.prototype.setMul=function(t,e){var i=t*e.x,o=t*e.y;return this.x=i,this.y=o,this},t.prototype.add=function(t){return this.x+=t.x,this.y+=t.y,this},t.prototype.wAdd=function(t,e,i,o){return void 0!==i||void 0!==o?this.addCombine(t,e,i,o):this.addMul(t,e)},t.prototype.addCombine=function(t,e,i,o){var s=t*e.x+i*o.x,n=t*e.y+i*o.y;return this.x+=s,this.y+=n,this},t.prototype.addMul=function(t,e){var i=t*e.x,o=t*e.y;return this.x+=i,this.y+=o,this},t.prototype.wSub=function(t,e,i,o){return void 0!==i||void 0!==o?this.subCombine(t,e,i,o):this.subMul(t,e)},t.prototype.subCombine=function(t,e,i,o){var s=t*e.x+i*o.x,n=t*e.y+i*o.y;return this.x-=s,this.y-=n,this},t.prototype.subMul=function(t,e){var i=t*e.x,o=t*e.y;return this.x-=i,this.y-=o,this},t.prototype.sub=function(t){return this.x-=t.x,this.y-=t.y,this},t.prototype.mul=function(t){return this.x*=t,this.y*=t,this},t.prototype.length=function(){return t.lengthOf(this)},t.prototype.lengthSquared=function(){return t.lengthSquared(this)},t.prototype.normalize=function(){var t=this.length();if(tt*t){var i=t/n.sqrt(e);this.x*=i,this.y*=i}return this},t.clamp=function(e,i){var o=t.neo(e.x,e.y);return o.clamp(i),o},t.scaleFn=function(e,i){return function(o){return t.neo(o.x*e,o.y*i)}},t.translateFn=function(e,i){return function(o){return t.neo(o.x+e,o.y+i)}},t}(),m=function(){function t(e,i){if(!(this instanceof t))return new t(e,i);this.lowerBound=r.zero(),this.upperBound=r.zero(),"object"==typeof e&&this.lowerBound.setVec2(e),"object"==typeof i?this.upperBound.setVec2(i):"object"==typeof e&&this.upperBound.setVec2(e)}return t.prototype.isValid=function(){return t.isValid(this)},t.isValid=function(t){return null!=t&&(r.isValid(t.lowerBound)&&r.isValid(t.upperBound)&&r.sub(t.upperBound,t.lowerBound).lengthSquared()>=0)},t.assert=function(t){},t.prototype.getCenter=function(){return r.neo(.5*(this.lowerBound.x+this.upperBound.x),.5*(this.lowerBound.y+this.upperBound.y))},t.prototype.getExtents=function(){return r.neo(.5*(this.upperBound.x-this.lowerBound.x),.5*(this.upperBound.y-this.lowerBound.y))},t.prototype.getPerimeter=function(){return 2*(this.upperBound.x-this.lowerBound.x+this.upperBound.y-this.lowerBound.y)},t.prototype.combine=function(t,e){e=e||this;var i=t.lowerBound,o=t.upperBound,s=e.lowerBound,r=e.upperBound,m=n.min(i.x,s.x),a=n.min(i.y,s.y),c=n.max(r.x,o.x),h=n.max(r.y,o.y);this.lowerBound.setNum(m,a),this.upperBound.setNum(c,h)},t.prototype.combinePoints=function(t,e){this.lowerBound.setNum(n.min(t.x,e.x),n.min(t.y,e.y)),this.upperBound.setNum(n.max(t.x,e.x),n.max(t.y,e.y))},t.prototype.set=function(t){this.lowerBound.setNum(t.lowerBound.x,t.lowerBound.y),this.upperBound.setNum(t.upperBound.x,t.upperBound.y)},t.prototype.contains=function(t){var e=!0;return e=(e=(e=(e=e&&this.lowerBound.x<=t.lowerBound.x)&&this.lowerBound.y<=t.lowerBound.y)&&t.upperBound.x<=this.upperBound.x)&&t.upperBound.y<=this.upperBound.y},t.prototype.extend=function(e){return t.extend(this,e),this},t.extend=function(t,e){t.lowerBound.x-=e,t.lowerBound.y-=e,t.upperBound.x+=e,t.upperBound.y+=e},t.testOverlap=function(t,e){var i=e.lowerBound.x-t.upperBound.x,o=t.lowerBound.x-e.upperBound.x,s=e.lowerBound.y-t.upperBound.y,n=t.lowerBound.y-e.upperBound.y;return!(i>0||s>0||o>0||n>0)},t.areEqual=function(t,e){return r.areEqual(t.lowerBound,e.lowerBound)&&r.areEqual(t.upperBound,e.upperBound)},t.diff=function(t,e){var i=n.max(0,n.min(t.upperBound.x,e.upperBound.x)-n.max(e.lowerBound.x,t.lowerBound.x)),o=n.max(0,n.min(t.upperBound.y,e.upperBound.y)-n.max(e.lowerBound.y,t.lowerBound.y));return(t.upperBound.x-t.lowerBound.x)*(t.upperBound.y-t.lowerBound.y)+(e.upperBound.x-e.lowerBound.x)*(e.upperBound.y-e.lowerBound.y)-i*o},t.prototype.rayCast=function(t,e){for(var i=-1/0,o=1/0,s=e.p1,m=r.sub(e.p2,e.p1),a=r.abs(m),c=r.zero(),h="x";null!==h;h="x"===h?"y":null)if(a.xu){var y=l;l=u,u=y,p=1}if(l>i&&(c.setZero(),c[h]=p,i=l),i>(o=n.min(o,u)))return!1}return!(i<0||e.maxFraction0?t=this._list.shift():(this._createCount++,t="function"==typeof this._createFn?this._createFn():{}),this._outCount++,"function"==typeof this._outFn&&this._outFn(t),t},t.prototype.release=function(t){this._list.length"+this._outCount+" <"+this._inCount+" -"+this._discardCount+" ="+this._list.length+"/"+this._max},t}(),h=function(){function t(t){this.aabb=new m,this.userData=null,this.parent=null,this.child1=null,this.child2=null,this.height=-1,this.id=t}return t.prototype.toString=function(){return this.id+": "+this.userData},t.prototype.isLeaf=function(){return null==this.child1},t}(),_=function(){function t(){this.inputPool=new c({create:function(){return{}},release:function(t){}}),this.stackPool=new c({create:function(){return[]},release:function(t){t.length=0}}),this.iteratorPool=new c({create:function(){return new l},release:function(t){t.close()}}),this.m_root=null,this.m_nodes={},this.m_lastProxyId=0,this.m_pool=new c({create:function(){return new h}})}return t.prototype.getUserData=function(t){return this.m_nodes[t].userData},t.prototype.getFatAABB=function(t){return this.m_nodes[t].aabb},t.prototype.allocateNode=function(){var t=this.m_pool.allocate();return t.id=++this.m_lastProxyId,t.userData=null,t.parent=null,t.child1=null,t.child2=null,t.height=-1,this.m_nodes[t.id]=t,t},t.prototype.freeNode=function(t){this.m_pool.release(t),t.height=-1,delete this.m_nodes[t.id]},t.prototype.createProxy=function(t,e){var i=this.allocateNode();return i.aabb.set(t),m.extend(i.aabb,a.aabbExtension),i.userData=e,i.height=0,this.insertLeaf(i),i.id},t.prototype.destroyProxy=function(t){var e=this.m_nodes[t];this.removeLeaf(e),this.freeNode(e)},t.prototype.moveProxy=function(t,e,i){var o=this.m_nodes[t];return!o.aabb.contains(e)&&(this.removeLeaf(o),o.aabb.set(e),e=o.aabb,m.extend(e,a.aabbExtension),i.x<0?e.lowerBound.x+=i.x*a.aabbMultiplier:e.upperBound.x+=i.x*a.aabbMultiplier,i.y<0?e.lowerBound.y+=i.y*a.aabbMultiplier:e.upperBound.y+=i.y*a.aabbMultiplier,this.insertLeaf(o),!0)},t.prototype.insertLeaf=function(t){if(null==this.m_root)return this.m_root=t,void(this.m_root.parent=null);for(var e=t.aabb,i=this.m_root;!i.isLeaf();){var o=i.child1,s=i.child2,r=i.aabb.getPerimeter(),a=new m;a.combine(i.aabb,e);var c=a.getPerimeter(),h=2*c,_=2*(c-r),l=void 0;if(o.isLeaf()){(y=new m).combine(e,o.aabb),l=y.getPerimeter()+_}else{(y=new m).combine(e,o.aabb);var u=o.aabb.getPerimeter();l=y.getPerimeter()-u+_}var p=void 0;if(s.isLeaf()){(y=new m).combine(e,s.aabb),p=y.getPerimeter()+_}else{var y;(y=new m).combine(e,s.aabb);u=s.aabb.getPerimeter();p=y.getPerimeter()-u+_}if(h1){var r=o.child1,m=o.child2;return o.child1=e,o.parent=e.parent,e.parent=o,null!=o.parent?o.parent.child1===t?o.parent.child1=o:o.parent.child2=o:this.m_root=o,r.height>m.height?(o.child2=r,e.child2=m,m.parent=e,e.aabb.combine(i.aabb,m.aabb),o.aabb.combine(e.aabb,r.aabb),e.height=1+n.max(i.height,m.height),o.height=1+n.max(e.height,r.height)):(o.child2=m,e.child2=r,r.parent=e,e.aabb.combine(i.aabb,r.aabb),o.aabb.combine(e.aabb,m.aabb),e.height=1+n.max(i.height,r.height),o.height=1+n.max(e.height,m.height)),o}if(s<-1){var a=i.child1,c=i.child2;return i.child1=e,i.parent=e.parent,e.parent=i,null!=i.parent?i.parent.child1===e?i.parent.child1=i:i.parent.child2=i:this.m_root=i,a.height>c.height?(i.child2=a,e.child1=c,c.parent=e,e.aabb.combine(o.aabb,c.aabb),i.aabb.combine(e.aabb,a.aabb),e.height=1+n.max(o.height,c.height),i.height=1+n.max(e.height,a.height)):(i.child2=c,e.child1=a,a.parent=e,e.aabb.combine(o.aabb,a.aabb),i.aabb.combine(e.aabb,c.aabb),e.height=1+n.max(o.height,a.height),i.height=1+n.max(e.height,c.height)),i}return e},t.prototype.getHeight=function(){return null==this.m_root?0:this.m_root.height},t.prototype.getAreaRatio=function(){if(null==this.m_root)return 0;for(var t,e=this.m_root.aabb.getPerimeter(),i=0,o=this.iteratorPool.allocate().preorder(this.m_root);t=o.next();)t.height<0||(i+=t.aabb.getPerimeter());return this.iteratorPool.release(o),i/e},t.prototype.computeHeight=function(t){var e;if((e=void 0!==t?this.m_nodes[t]:this.m_root).isLeaf())return 0;var i=this.computeHeight(e.child1.id),o=this.computeHeight(e.child2.id);return 1+n.max(i,o)},t.prototype.validateStructure=function(t){if(null!=t){this.m_root;var e=t.child1,i=t.child2;t.isLeaf()||(this.validateStructure(e),this.validateStructure(i))}},t.prototype.validateMetrics=function(t){if(null!=t){var e=t.child1,i=t.child2;if(!t.isLeaf()){var o=e.height,s=i.height;n.max(o,s),(new m).combine(e.aabb,i.aabb),this.validateMetrics(e),this.validateMetrics(i)}}},t.prototype.validate=function(){this.validateStructure(this.m_root),this.validateMetrics(this.m_root)},t.prototype.getMaxBalance=function(){for(var t,e=0,i=this.iteratorPool.allocate().preorder(this.m_root);t=i.next();)if(!(t.height<=1)){var o=n.abs(t.child2.height-t.child1.height);e=n.max(e,o)}return this.iteratorPool.release(i),e},t.prototype.rebuildBottomUp=function(){for(var t,e=[],i=0,o=this.iteratorPool.allocate().preorder(this.m_root);t=o.next();)t.height<0||(t.isLeaf()?(t.parent=null,e[i]=t,++i):this.freeNode(t));for(this.iteratorPool.release(o);i>1;){for(var s=1/0,r=-1,a=-1,c=0;c0;){var o=i.pop();if(null!=o)if(m.testOverlap(o.aabb,t))if(o.isLeaf()){if(!1===e(o.id))return}else i.push(o.child1),i.push(o.child2)}this.stackPool.release(i)},t.prototype.rayCast=function(t,e){var i=t.p1,o=t.p2,s=r.sub(o,i);s.normalize();var a=r.crossNumVec2(1,s),c=r.abs(a),h=t.maxFraction,_=new m,l=r.combine(1-h,i,h,o);_.combinePoints(i,l);var u=this.stackPool.allocate(),p=this.inputPool.allocate();for(u.push(this.m_root);u.length>0;){var y=u.pop();if(null!=y&&!1!==m.testOverlap(y.aabb,_)){var d=y.aabb.getCenter(),f=y.aabb.getExtents();if(!(n.abs(r.dot(a,r.sub(i,d)))-r.dot(c,f)>0))if(y.isLeaf()){p.p1=r.clone(t.p1),p.p2=r.clone(t.p2),p.maxFraction=h;var v=e(p,y.id);if(0===v)return;v>0&&(h=v,l=r.combine(1-h,i,h,o),_.combinePoints(i,l))}else u.push(y.child1),u.push(y.child2)}}this.stackPool.release(u),this.inputPool.release(p)},t}(),l=function(){function t(){this.parents=[],this.states=[]}return t.prototype.preorder=function(t){return this.parents.length=0,this.parents.push(t),this.states.length=0,this.states.push(0),this},t.prototype.next=function(){for(;this.parents.length>0;){var t=this.parents.length-1,e=this.parents[t];if(0===this.states[t])return this.states[t]=1,e;if(1===this.states[t]&&(this.states[t]=2,e.child1))return this.parents.push(e.child1),this.states.push(1),e.child1;if(2===this.states[t]&&(this.states[t]=3,e.child2))return this.parents.push(e.child2),this.states.push(1),e.child2;this.parents.pop(),this.states.pop()}},t.prototype.close=function(){this.parents.length=0},t}(),u=function(){function t(){var t=this;this.m_tree=new _,this.m_proxyCount=0,this.m_moveBuffer=[],this.query=function(e,i){t.m_tree.query(e,i)},this.queryCallback=function(e){if(e===t.m_queryProxyId)return!0;var i=n.min(e,t.m_queryProxyId),o=n.max(e,t.m_queryProxyId),s=t.m_tree.getUserData(i),r=t.m_tree.getUserData(o);return t.m_callback(s,r),!0}}return t.prototype.getUserData=function(t){return this.m_tree.getUserData(t)},t.prototype.testOverlap=function(t,e){var i=this.m_tree.getFatAABB(t),o=this.m_tree.getFatAABB(e);return m.testOverlap(i,o)},t.prototype.getFatAABB=function(t){return this.m_tree.getFatAABB(t)},t.prototype.getProxyCount=function(){return this.m_proxyCount},t.prototype.getTreeHeight=function(){return this.m_tree.getHeight()},t.prototype.getTreeBalance=function(){return this.m_tree.getMaxBalance()},t.prototype.getTreeQuality=function(){return this.m_tree.getAreaRatio()},t.prototype.rayCast=function(t,e){this.m_tree.rayCast(t,e)},t.prototype.shiftOrigin=function(t){this.m_tree.shiftOrigin(t)},t.prototype.createProxy=function(t,e){var i=this.m_tree.createProxy(t,e);return this.m_proxyCount++,this.bufferMove(i),i},t.prototype.destroyProxy=function(t){this.unbufferMove(t),this.m_proxyCount--,this.m_tree.destroyProxy(t)},t.prototype.moveProxy=function(t,e,i){this.m_tree.moveProxy(t,e,i)&&this.bufferMove(t)},t.prototype.touchProxy=function(t){this.bufferMove(t)},t.prototype.bufferMove=function(t){this.m_moveBuffer.push(t)},t.prototype.unbufferMove=function(t){for(var e=0;e0;)if(this.m_queryProxyId=this.m_moveBuffer.pop(),null!==this.m_queryProxyId){var e=this.m_tree.getFatAABB(this.m_queryProxyId);this.m_tree.query(e,this.queryCallback)}},t}(),p=function(){function t(e){if(!(this instanceof t))return new t(e);"number"==typeof e?this.setAngle(e):"object"==typeof e?this.setRot(e):this.setIdentity()}return t.neo=function(e){var i=Object.create(t.prototype);return i.setAngle(e),i},t.clone=function(e){var i=Object.create(t.prototype);return i.s=e.s,i.c=e.c,i},t.identity=function(){var e=Object.create(t.prototype);return e.s=0,e.c=1,e},t.isValid=function(t){return null!=t&&(n.isFinite(t.s)&&n.isFinite(t.c))},t.assert=function(t){},t.prototype.setIdentity=function(){this.s=0,this.c=1},t.prototype.set=function(t){"object"==typeof t?(this.s=t.s,this.c=t.c):(this.s=n.sin(t),this.c=n.cos(t))},t.prototype.setRot=function(t){this.s=t.s,this.c=t.c},t.prototype.setAngle=function(t){this.s=n.sin(t),this.c=n.cos(t)},t.prototype.getAngle=function(){return n.atan2(this.s,this.c)},t.prototype.getXAxis=function(){return r.neo(this.c,this.s)},t.prototype.getYAxis=function(){return r.neo(-this.s,this.c)},t.mul=function(e,i){if("c"in i&&"s"in i){var o=t.identity();return o.s=e.s*i.c+e.c*i.s,o.c=e.c*i.c-e.s*i.s,o}if("x"in i&&"y"in i)return r.neo(e.c*i.x-e.s*i.y,e.s*i.x+e.c*i.y)},t.mulRot=function(e,i){var o=t.identity();return o.s=e.s*i.c+e.c*i.s,o.c=e.c*i.c-e.s*i.s,o},t.mulVec2=function(t,e){return r.neo(t.c*e.x-t.s*e.y,t.s*e.x+t.c*e.y)},t.mulSub=function(t,e,i){var o=t.c*(e.x-i.x)-t.s*(e.y-i.y),s=t.s*(e.x-i.x)+t.c*(e.y-i.y);return r.neo(o,s)},t.mulT=function(e,i){if("c"in i&&"s"in i){var o=t.identity();return o.s=e.c*i.s-e.s*i.c,o.c=e.c*i.c+e.s*i.s,o}if("x"in i&&"y"in i)return r.neo(e.c*i.x+e.s*i.y,-e.s*i.x+e.c*i.y)},t.mulTRot=function(e,i){var o=t.identity();return o.s=e.c*i.s-e.s*i.c,o.c=e.c*i.c+e.s*i.s,o},t.mulTVec2=function(t,e){return r.neo(t.c*e.x+t.s*e.y,-t.s*e.x+t.c*e.y)},t}(),y=function(){function t(e,i){if(!(this instanceof t))return new t(e,i);this.p=r.zero(),this.q=p.identity(),void 0!==e&&this.p.setVec2(e),void 0!==i&&this.q.setAngle(i)}return t.clone=function(e){var i=Object.create(t.prototype);return i.p=r.clone(e.p),i.q=p.clone(e.q),i},t.neo=function(e,i){var o=Object.create(t.prototype);return o.p=r.clone(e),o.q=p.clone(i),o},t.identity=function(){var e=Object.create(t.prototype);return e.p=r.zero(),e.q=p.identity(),e},t.prototype.setIdentity=function(){this.p.setZero(),this.q.setIdentity()},t.prototype.set=function(t,e){void 0===e?(this.p.set(t.p),this.q.set(t.q)):(this.p.set(t),this.q.set(e))},t.prototype.setNum=function(t,e){this.p.setVec2(t),this.q.setAngle(e)},t.prototype.setTransform=function(t){this.p.setVec2(t.p),this.q.setRot(t.q)},t.isValid=function(t){return null!=t&&(r.isValid(t.p)&&p.isValid(t.q))},t.assert=function(t){},t.mul=function(e,i){if(Array.isArray(i)){for(var o=[],s=0;s0;var e=0!=(t.m_filterMaskBits&this.m_filterCategoryBits),i=0!=(t.m_filterCategoryBits&this.m_filterMaskBits);return e&&i},t}(),B="static",V="kinematic",w="dynamic",C={type:B,position:r.zero(),angle:0,linearVelocity:r.zero(),angularVelocity:0,linearDamping:0,angularDamping:0,fixedRotation:!1,bullet:!1,gravityScale:1,allowSleep:!0,awake:!0,active:!0,userData:null},M=function(){this.mass=0,this.center=r.zero(),this.I=0},I=function(){function t(t,e){e=s(e,C),this.m_world=t,this.m_awakeFlag=e.awake,this.m_autoSleepFlag=e.allowSleep,this.m_bulletFlag=e.bullet,this.m_fixedRotationFlag=e.fixedRotation,this.m_activeFlag=e.active,this.m_islandFlag=!1,this.m_toiFlag=!1,this.m_userData=e.userData,this.m_type=e.type,this.m_type==w?(this.m_mass=1,this.m_invMass=1):(this.m_mass=0,this.m_invMass=0),this.m_I=0,this.m_invI=0,this.m_xf=y.identity(),this.m_xf.p=r.clone(e.position),this.m_xf.q.setAngle(e.angle),this.m_sweep=new d,this.m_sweep.setTransform(this.m_xf),this.c_velocity=new f,this.c_position=new v,this.m_force=r.zero(),this.m_torque=0,this.m_linearVelocity=r.clone(e.linearVelocity),this.m_angularVelocity=e.angularVelocity,this.m_linearDamping=e.linearDamping,this.m_angularDamping=e.angularDamping,this.m_gravityScale=e.gravityScale,this.m_sleepTime=0,this.m_jointList=null,this.m_contactList=null,this.m_fixtureList=null,this.m_prev=null,this.m_next=null,this.m_destroyed=!1}return t.prototype._serialize=function(){for(var t=[],e=this.m_fixtureList;e;e=e.m_next)t.push(e);return{type:this.m_type,bullet:this.m_bulletFlag,position:this.m_xf.p,angle:this.m_xf.q.getAngle(),linearVelocity:this.m_linearVelocity,angularVelocity:this.m_angularVelocity,fixtures:t}},t._deserialize=function(e,i,o){var s=new t(i,e);if(e.fixtures)for(var n=e.fixtures.length-1;n>=0;n--){var r=o(b,e.fixtures[n],s);s._addFixture(r)}return s},t.prototype.isWorldLocked=function(){return!(!this.m_world||!this.m_world.isLocked())},t.prototype.getWorld=function(){return this.m_world},t.prototype.getNext=function(){return this.m_next},t.prototype.setUserData=function(t){this.m_userData=t},t.prototype.getUserData=function(){return this.m_userData},t.prototype.getFixtureList=function(){return this.m_fixtureList},t.prototype.getJointList=function(){return this.m_jointList},t.prototype.getContactList=function(){return this.m_contactList},t.prototype.isStatic=function(){return this.m_type==B},t.prototype.isDynamic=function(){return this.m_type==w},t.prototype.isKinematic=function(){return this.m_type==V},t.prototype.setStatic=function(){return this.setType(B),this},t.prototype.setDynamic=function(){return this.setType(w),this},t.prototype.setKinematic=function(){return this.setType(V),this},t.prototype.getType=function(){return this.m_type},t.prototype.setType=function(t){if(1!=this.isWorldLocked()&&this.m_type!=t){this.m_type=t,this.resetMassData(),this.m_type==B&&(this.m_linearVelocity.setZero(),this.m_angularVelocity=0,this.m_sweep.forward(),this.synchronizeFixtures()),this.setAwake(!0),this.m_force.setZero(),this.m_torque=0;for(var e=this.m_contactList;e;){var i=e;e=e.next,this.m_world.destroyContact(i.contact)}this.m_contactList=null;for(var o=this.m_world.m_broadPhase,s=this.m_fixtureList;s;s=s.m_next)for(var n=s.m_proxyCount,r=0;r0&&this.setAwake(!0),this.m_linearVelocity.setVec2(t))},t.prototype.getAngularVelocity=function(){return this.m_angularVelocity},t.prototype.setAngularVelocity=function(t){this.m_type!=B&&(t*t>0&&this.setAwake(!0),this.m_angularVelocity=t)},t.prototype.getLinearDamping=function(){return this.m_linearDamping},t.prototype.setLinearDamping=function(t){this.m_linearDamping=t},t.prototype.getAngularDamping=function(){return this.m_angularDamping},t.prototype.setAngularDamping=function(t){this.m_angularDamping=t},t.prototype.getGravityScale=function(){return this.m_gravityScale},t.prototype.setGravityScale=function(t){this.m_gravityScale=t},t.prototype.getMass=function(){return this.m_mass},t.prototype.getInertia=function(){return this.m_I+this.m_mass*r.dot(this.m_sweep.localCenter,this.m_sweep.localCenter)},t.prototype.getMassData=function(t){t.mass=this.m_mass,t.I=this.getInertia(),t.center.setVec2(this.m_sweep.localCenter)},t.prototype.resetMassData=function(){if(this.m_mass=0,this.m_invMass=0,this.m_I=0,this.m_invI=0,this.m_sweep.localCenter.setZero(),this.isStatic()||this.isKinematic())return this.m_sweep.c0.setVec2(this.m_xf.p),this.m_sweep.c.setVec2(this.m_xf.p),void(this.m_sweep.a0=this.m_sweep.a);for(var t=r.zero(),e=this.m_fixtureList;e;e=e.m_next)if(0!=e.m_density){var i=new M;e.getMassData(i),this.m_mass+=i.mass,t.addMul(i.mass,i.center),this.m_I+=i.I}this.m_mass>0?(this.m_invMass=1/this.m_mass,t.mul(this.m_invMass)):(this.m_mass=1,this.m_invMass=1),this.m_I>0&&0==this.m_fixedRotationFlag?(this.m_I-=this.m_mass*r.dot(t,t),this.m_invI=1/this.m_I):(this.m_I=0,this.m_invI=0);var o=r.clone(this.m_sweep.c);this.m_sweep.setLocalCenter(t,this.m_xf),this.m_linearVelocity.add(r.crossNumVec2(this.m_angularVelocity,r.sub(this.m_sweep.c,o)))},t.prototype.setMassData=function(t){if(1!=this.isWorldLocked()&&this.m_type==w){this.m_invMass=0,this.m_I=0,this.m_invI=0,this.m_mass=t.mass,this.m_mass<=0&&(this.m_mass=1),this.m_invMass=1/this.m_mass,t.I>0&&0==this.m_fixedRotationFlag&&(this.m_I=t.I-this.m_mass*r.dot(t.center,t.center),this.m_invI=1/this.m_I);var e=r.clone(this.m_sweep.c);this.m_sweep.setLocalCenter(t.center,this.m_xf),this.m_linearVelocity.add(r.crossNumVec2(this.m_angularVelocity,r.sub(this.m_sweep.c,e)))}},t.prototype.applyForce=function(t,e,i){void 0===i&&(i=!0),this.m_type==w&&(i&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&(this.m_force.add(t),this.m_torque+=r.crossVec2Vec2(r.sub(e,this.m_sweep.c),t)))},t.prototype.applyForceToCenter=function(t,e){void 0===e&&(e=!0),this.m_type==w&&(e&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&this.m_force.add(t))},t.prototype.applyTorque=function(t,e){void 0===e&&(e=!0),this.m_type==w&&(e&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&(this.m_torque+=t))},t.prototype.applyLinearImpulse=function(t,e,i){void 0===i&&(i=!0),this.m_type==w&&(i&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&(this.m_linearVelocity.addMul(this.m_invMass,t),this.m_angularVelocity+=this.m_invI*r.crossVec2Vec2(r.sub(e,this.m_sweep.c),t)))},t.prototype.applyAngularImpulse=function(t,e){void 0===e&&(e=!0),this.m_type==w&&(e&&0==this.m_awakeFlag&&this.setAwake(!0),this.m_awakeFlag&&(this.m_angularVelocity+=this.m_invI*t))},t.prototype.shouldCollide=function(t){if(this.m_type!=w&&t.m_type!=w)return!1;for(var e=this.m_jointList;e;e=e.next)if(e.other==t&&0==e.joint.m_collideConnected)return!1;return!0},t.prototype._addFixture=function(t){if(1==this.isWorldLocked())return null;if(this.m_activeFlag){var e=this.m_world.m_broadPhase;t.createProxies(e,this.m_xf)}return t.m_next=this.m_fixtureList,this.m_fixtureList=t,t.m_density>0&&this.resetMassData(),this.m_world.m_newFixture=!0,t},t.prototype.createFixture=function(t,e){if(1==this.isWorldLocked())return null;var i=new b(this,t,e);return this._addFixture(i),i},t.prototype.destroyFixture=function(t){if(1!=this.isWorldLocked()){if(this.m_fixtureList===t)this.m_fixtureList=t.m_next;else for(var e=this.m_fixtureList;null!=e;){if(e.m_next===t){e.m_next=t.m_next;break}e=e.m_next}for(var i=this.m_contactList;i;){var o=i.contact;i=i.next;var s=o.getFixtureA(),n=o.getFixtureB();t!=s&&t!=n||this.m_world.destroyContact(o)}if(this.m_activeFlag){var r=this.m_world.m_broadPhase;t.destroyProxies(r)}t.m_body=null,t.m_next=null,this.m_world.publish("remove-fixture",t),this.resetMassData()}},t.prototype.getWorldPoint=function(t){return y.mulVec2(this.m_xf,t)},t.prototype.getWorldVector=function(t){return p.mulVec2(this.m_xf.q,t)},t.prototype.getLocalPoint=function(t){return y.mulTVec2(this.m_xf,t)},t.prototype.getLocalVector=function(t){return p.mulTVec2(this.m_xf.q,t)},t.STATIC="static",t.KINEMATIC="kinematic",t.DYNAMIC="dynamic",t}(),S=function(){this.other=null,this.joint=null,this.prev=null,this.next=null},z=function(){function t(t,e,i){this.m_type="unknown-joint",this.m_prev=null,this.m_next=null,this.m_edgeA=new S,this.m_edgeB=new S,this.m_islandFlag=!1,e="bodyA"in t?t.bodyA:e,i="bodyB"in t?t.bodyB:i,this.m_bodyA=e,this.m_bodyB=i,this.m_collideConnected=!!t.collideConnected,this.m_userData=t.userData}return t.prototype.isActive=function(){return this.m_bodyA.isActive()&&this.m_bodyB.isActive()},t.prototype.getType=function(){return this.m_type},t.prototype.getBodyA=function(){return this.m_bodyA},t.prototype.getBodyB=function(){return this.m_bodyB},t.prototype.getNext=function(){return this.m_next},t.prototype.getUserData=function(){return this.m_userData},t.prototype.setUserData=function(t){this.m_userData=t},t.prototype.getCollideConnected=function(){return this.m_collideConnected},t.prototype.shiftOrigin=function(t){},t}(),P={gjkCalls:0,gjkIters:0,gjkMaxIters:0,toiTime:0,toiMaxTime:0,toiCalls:0,toiIters:0,toiMaxIters:0,toiRootIters:0,toiMaxRootIters:0,toString:function(t){t="string"==typeof t?t:"\n";var e="";for(var i in this)"function"!=typeof this[i]&&"object"!=typeof this[i]&&(e+=i+": "+this[i]+t);return e}},T=function(){return Date.now()},F=function(t){return Date.now()-t};P.gjkCalls=0,P.gjkIters=0,P.gjkMaxIters=0;var L=function(){this.proxyA=new D,this.proxyB=new D,this.transformA=null,this.transformB=null,this.useRadii=!1},q=function(){this.pointA=r.zero(),this.pointB=r.zero()},N=function(){this.metric=0,this.indexA=[],this.indexB=[],this.count=0},k=function(t,e,i){++P.gjkCalls;var o=i.proxyA,s=i.proxyB,m=i.transformA,c=i.transformB,h=new O;h.readCache(e,o,m,s,c);for(var _=h.m_v,l=a.maxDistnceIterations,u=[],d=[],f=0,v=0;vB+V&&t.distance>n.EPSILON){t.distance-=B+V;var w=r.sub(t.pointB,t.pointA);w.normalize(),t.pointA.addMul(B,w),t.pointB.subMul(V,w)}else{var C=r.mid(t.pointA,t.pointB);t.pointA.setVec2(C),t.pointB.setVec2(C),t.distance=0}}},D=function(){function t(){this.m_buffer=[],this.m_vertices=[],this.m_count=0,this.m_radius=0}return t.prototype.getVertexCount=function(){return this.m_count},t.prototype.getVertex=function(t){return this.m_vertices[t]},t.prototype.getSupport=function(t){for(var e=0,i=r.dot(this.m_vertices[0],t),o=0;oi&&(e=o,i=s)}return e},t.prototype.getSupportVertex=function(t){return this.m_vertices[this.getSupport(t)]},t.prototype.set=function(t,e){t.computeDistanceProxy(this,e)},t}(),j=function(){function t(){this.wA=r.zero(),this.wB=r.zero(),this.w=r.zero()}return t.prototype.set=function(t){this.indexA=t.indexA,this.indexB=t.indexB,this.wA=r.clone(t.wA),this.wB=r.clone(t.wB),this.w=r.clone(t.w),this.a=t.a},t}(),O=function(){function t(){this.m_v1=new j,this.m_v2=new j,this.m_v3=new j,this.m_v=[this.m_v1,this.m_v2,this.m_v3],this.m_count}return t.prototype.toString=function(){return 3===this.m_count?["+"+this.m_count,this.m_v1.a,this.m_v1.wA.x,this.m_v1.wA.y,this.m_v1.wB.x,this.m_v1.wB.y,this.m_v2.a,this.m_v2.wA.x,this.m_v2.wA.y,this.m_v2.wB.x,this.m_v2.wB.y,this.m_v3.a,this.m_v3.wA.x,this.m_v3.wA.y,this.m_v3.wB.x,this.m_v3.wB.y].toString():2===this.m_count?["+"+this.m_count,this.m_v1.a,this.m_v1.wA.x,this.m_v1.wA.y,this.m_v1.wB.x,this.m_v1.wB.y,this.m_v2.a,this.m_v2.wA.x,this.m_v2.wA.y,this.m_v2.wB.x,this.m_v2.wB.y].toString():1===this.m_count?["+"+this.m_count,this.m_v1.a,this.m_v1.wA.x,this.m_v1.wA.y,this.m_v1.wB.x,this.m_v1.wB.y].toString():"+"+this.m_count},t.prototype.readCache=function(t,e,i,o,s){this.m_count=t.count;for(var m=0;m1){var h=t.metric,_=this.getMetric();(_<.5*h||2*h<_||_0?r.crossNumVec2(1,t):r.crossVec2Num(t,1);default:return r.zero()}},t.prototype.getClosestPoint=function(){switch(this.m_count){case 0:return r.zero();case 1:return r.clone(this.m_v1.w);case 2:return r.combine(this.m_v1.a,this.m_v1.w,this.m_v2.a,this.m_v2.w);case 3:default:return r.zero()}},t.prototype.getWitnessPoints=function(t,e){switch(this.m_count){case 0:break;case 1:t.setVec2(this.m_v1.wA),e.setVec2(this.m_v1.wB);break;case 2:t.setCombine(this.m_v1.a,this.m_v1.wA,this.m_v2.a,this.m_v2.wA),e.setCombine(this.m_v1.a,this.m_v1.wB,this.m_v2.a,this.m_v2.wB);break;case 3:t.setCombine(this.m_v1.a,this.m_v1.wA,this.m_v2.a,this.m_v2.wA),t.addMul(this.m_v3.a,this.m_v3.wA),e.setVec2(t)}},t.prototype.getMetric=function(){switch(this.m_count){case 0:case 1:return 0;case 2:return r.distance(this.m_v1.w,this.m_v2.w);case 3:return r.crossVec2Vec2(r.sub(this.m_v2.w,this.m_v1.w),r.sub(this.m_v3.w,this.m_v1.w));default:return 0}},t.prototype.solve=function(){switch(this.m_count){case 1:break;case 2:this.solve2();break;case 3:this.solve3()}},t.prototype.solve2=function(){var t=this.m_v1.w,e=this.m_v2.w,i=r.sub(e,t),o=-r.dot(t,i);if(o<=0)return this.m_v1.a=1,void(this.m_count=1);var s=r.dot(e,i);if(s<=0)return this.m_v2.a=1,this.m_count=1,void this.m_v1.set(this.m_v2);var n=1/(s+o);this.m_v1.a=s*n,this.m_v2.a=o*n,this.m_count=2},t.prototype.solve3=function(){var t=this.m_v1.w,e=this.m_v2.w,i=this.m_v3.w,o=r.sub(e,t),s=r.dot(t,o),n=r.dot(e,o),m=-s,a=r.sub(i,t),c=r.dot(t,a),h=r.dot(i,a),_=-c,l=r.sub(i,e),u=r.dot(e,l),p=r.dot(i,l),y=-u,d=r.crossVec2Vec2(o,a),f=d*r.crossVec2Vec2(e,i),v=d*r.crossVec2Vec2(i,t),x=d*r.crossVec2Vec2(t,e);if(m<=0&&_<=0)return this.m_v1.a=1,void(this.m_count=1);if(n>0&&m>0&&x<=0){var A=1/(n+m);return this.m_v1.a=n*A,this.m_v2.a=m*A,void(this.m_count=2)}if(h>0&&_>0&&v<=0){var g=1/(h+_);return this.m_v1.a=h*g,this.m_v3.a=_*g,this.m_count=2,void this.m_v2.set(this.m_v3)}if(n<=0&&y<=0)return this.m_v2.a=1,this.m_count=1,void this.m_v1.set(this.m_v2);if(h<=0&&p<=0)return this.m_v3.a=1,this.m_count=1,void this.m_v1.set(this.m_v3);if(p>0&&y>0&&f<=0){var b=1/(p+y);return this.m_v2.a=p*b,this.m_v3.a=y*b,this.m_count=2,void this.m_v1.set(this.m_v3)}var B=1/(f+v+x);this.m_v1.a=f*B,this.m_v2.a=v*B,this.m_v3.a=x*B,this.m_count=3},t}(),R=function(t,e,i,o,s,r){var m=new L;m.proxyA.set(t,e),m.proxyB.set(i,o),m.transformA=s,m.transformB=r,m.useRadii=!0;var a=new N,c=new q;return k(c,a,m),c.distance<10*n.EPSILON};k.testOverlap=R,k.Input=L,k.Output=q,k.Proxy=D,k.Cache=N;var E,J=function(){this.proxyA=new D,this.proxyB=new D,this.sweepA=new d,this.sweepB=new d};t.TOIOutputState=void 0,(E=t.TOIOutputState||(t.TOIOutputState={}))[E.e_unknown=0]="e_unknown",E[E.e_failed=1]="e_failed",E[E.e_overlapped=2]="e_overlapped",E[E.e_touching=3]="e_touching",E[E.e_separated=4]="e_separated";var Y=function(){};P.toiTime=0,P.toiMaxTime=0,P.toiCalls=0,P.toiIters=0,P.toiMaxIters=0,P.toiRootIters=0,P.toiMaxRootIters=0;var W,H=function(e,i){var o=T();++P.toiCalls,e.state=t.TOIOutputState.e_unknown,e.t=i.tMax;var s=i.proxyA,r=i.proxyB,m=i.sweepA,c=i.sweepB;m.normalize(),c.normalize();var h=i.tMax,_=s.m_radius+r.m_radius,l=n.max(a.linearSlop,_-3*a.linearSlop),u=.25*a.linearSlop,p=0,d=a.maxTOIIterations,f=0,v=new N,x=new L;for(x.proxyA=i.proxyA,x.proxyB=i.proxyB,x.useRadii=!1;;){var A=y.identity(),g=y.identity();m.getTransform(A,p),c.getTransform(g,p),x.transformA=A,x.transformB=g;var b=new q;if(k(b,v,x),b.distance<=0){e.state=t.TOIOutputState.e_overlapped,e.t=0;break}if(b.distancel+u){e.state=t.TOIOutputState.e_separated,e.t=h,V=!0;break}if(M>l-u){p=w;break}var I=B.evaluate(p);if(Il?(z=j,I=O):(D=j,M=O),50===S)break}if(P.toiMaxRootIters=n.max(P.toiMaxRootIters,S),++C===a.maxPolygonVertices)break}if(++f,++P.toiIters,V)break;if(f===d){e.state=t.TOIOutputState.e_failed,e.t=p;break}}P.toiMaxIters=n.max(P.toiMaxIters,f);var R=F(o);P.toiMaxTime=n.max(P.toiMaxTime,R),P.toiTime+=R};!function(t){t[t.e_points=1]="e_points",t[t.e_faceA=2]="e_faceA",t[t.e_faceB=3]="e_faceB"}(W||(W={}));var Z=function(){function t(){this.m_proxyA=new D,this.m_proxyB=new D,this.m_localPoint=r.zero(),this.m_axis=r.zero()}return t.prototype.initialize=function(t,e,i,o,s,n){this.m_proxyA=e,this.m_proxyB=o;var m=t.count;this.m_sweepA=i,this.m_sweepB=s;var a=y.identity(),c=y.identity();if(this.m_sweepA.getTransform(a,n),this.m_sweepB.getTransform(c,n),1===m){this.m_type=W.e_points;var h=this.m_proxyA.getVertex(t.indexA[0]),_=this.m_proxyB.getVertex(t.indexB[0]),l=y.mulVec2(a,h),u=y.mulVec2(c,_);return this.m_axis.setCombine(1,u,-1,l),g=this.m_axis.normalize()}if(t.indexA[0]===t.indexA[1]){this.m_type=W.e_faceB;var d=o.getVertex(t.indexB[0]),f=o.getVertex(t.indexB[1]);this.m_axis=r.crossVec2Num(r.sub(f,d),1),this.m_axis.normalize();var v=p.mulVec2(c.q,this.m_axis);this.m_localPoint=r.mid(d,f);u=y.mulVec2(c,this.m_localPoint),h=e.getVertex(t.indexA[0]),l=y.mulVec2(a,h);return(g=r.dot(l,v)-r.dot(u,v))<0&&(this.m_axis=r.neg(this.m_axis),g=-g),g}this.m_type=W.e_faceA;var x=this.m_proxyA.getVertex(t.indexA[0]),A=this.m_proxyA.getVertex(t.indexA[1]);this.m_axis=r.crossVec2Num(r.sub(A,x),1),this.m_axis.normalize();v=p.mulVec2(a.q,this.m_axis);this.m_localPoint=r.mid(x,A);var g;l=y.mulVec2(a,this.m_localPoint),_=this.m_proxyB.getVertex(t.indexB[0]),u=y.mulVec2(c,_);return(g=r.dot(u,v)-r.dot(l,v))<0&&(this.m_axis=r.neg(this.m_axis),g=-g),g},t.prototype.compute=function(t,e){var i=y.identity(),o=y.identity();switch(this.m_sweepA.getTransform(i,e),this.m_sweepB.getTransform(o,e),this.m_type){case W.e_points:if(t){var s=p.mulTVec2(i.q,this.m_axis),n=p.mulTVec2(o.q,r.neg(this.m_axis));this.indexA=this.m_proxyA.getSupport(s),this.indexB=this.m_proxyB.getSupport(n)}var m=this.m_proxyA.getVertex(this.indexA),a=this.m_proxyB.getVertex(this.indexB),c=y.mulVec2(i,m),h=y.mulVec2(o,a);return r.dot(h,this.m_axis)-r.dot(c,this.m_axis);case W.e_faceA:var _=p.mulVec2(i.q,this.m_axis);c=y.mulVec2(i,this.m_localPoint);if(t){n=p.mulTVec2(o.q,r.neg(_));this.indexA=-1,this.indexB=this.m_proxyB.getSupport(n)}a=this.m_proxyB.getVertex(this.indexB),h=y.mulVec2(o,a);return r.dot(h,_)-r.dot(c,_);case W.e_faceB:_=p.mulVec2(o.q,this.m_axis),h=y.mulVec2(o,this.m_localPoint);if(t){s=p.mulTVec2(i.q,r.neg(_));this.indexB=-1,this.indexA=this.m_proxyA.getSupport(s)}m=this.m_proxyA.getVertex(this.indexA),c=y.mulVec2(i,m);return r.dot(c,_)-r.dot(h,_);default:return t&&(this.indexA=-1,this.indexB=-1),0}},t.prototype.findMinSeparation=function(t){return this.compute(!0,t)},t.prototype.evaluate=function(t){return this.compute(!1,t)},t}();new Z,H.Input=J,H.Output=Y;var X=function(){function t(){this.dt=0,this.inv_dt=0,this.velocityIterations=0,this.positionIterations=0,this.warmStarting=!1,this.blockSolve=!0,this.inv_dt0=0,this.dtRatio=1}return t.prototype.reset=function(t){this.dt>0&&(this.inv_dt0=this.inv_dt),this.dt=t,this.inv_dt=0==t?0:1/t,this.dtRatio=t*this.inv_dt0},t}(),K=new X,G=function(){function t(t){this.contact=t,this.normals=[],this.tangents=[]}return Object.defineProperty(t.prototype,"normalImpulses",{get:function(){var t=this.contact,e=this.normals;e.length=0;for(var i=0;i0;){i=n.pop();if(this.addBody(i),i.setAwake(!0),!i.isStatic()){for(var m=i.m_contactList;m;m=m.next){var a=m.contact;if(!a.m_islandFlag&&(0!=a.isEnabled()&&0!=a.isTouching())){var c=a.m_fixtureA.m_isSensor,h=a.m_fixtureB.m_isSensor;if(!c&&!h)this.addContact(a),a.m_islandFlag=!0,(l=m.other).m_islandFlag||(n.push(l),l.m_islandFlag=!0)}}for(var _=i.m_jointList;_;_=_.next){var l;if(1!=_.joint.m_islandFlag)0!=(l=_.other).isActive()&&(this.addJoint(_.joint),_.joint.m_islandFlag=!0,l.m_islandFlag||(n.push(l),l.m_islandFlag=!0))}}}this.solveIsland(t);for(var u=0;ua.maxTranslationSquared){var d=a.maxTranslation/y.length();l.mul(d)}var f=s*u;if(f*f>a.maxRotationSquared)u*=d=a.maxRotation/n.abs(f);h.addMul(s,l),_+=s*u,c.c_position.c.setVec2(h),c.c_position.a=_,c.c_velocity.v.setVec2(l),c.c_velocity.w=u}var v=!1;for(m=0;m=-3*a.linearSlop,b=!0;for(p=0;pC||r.lengthSquared(c.m_linearVelocity)>w?(c.m_sleepTime=0,V=0):(c.m_sleepTime+=s,V=n.min(V,c.m_sleepTime)))}if(V>=a.timeToSleep&&v)for(m=0;ma.maxSubSteps)){var c=1;if(s.m_toiFlag)c=s.m_toi;else{var h=s.getFixtureA(),_=s.getFixtureB();if(h.isSensor()||_.isSensor())continue;var l=h.getBody(),u=_.getBody(),p=l.isAwake()&&!l.isStatic(),y=u.isAwake()&&!u.isStatic();if(0==p&&0==y)continue;var d=l.isBullet()||!l.isDynamic(),f=u.isBullet()||!u.isDynamic();if(0==d&&0==f)continue;var v=l.m_sweep.alpha0;l.m_sweep.alpha0=-1.5*a.linearSlop)break}e.m_sweep.c0.setVec2(e.c_position.c),e.m_sweep.a0=e.c_position.a,i.m_sweep.c0.setVec2(i.c_position.c),i.m_sweep.a0=i.c_position.a;for(o=0;oa.maxTranslationSquared){var f=a.maxTranslation/d.length();p.mul(f)}var v=h*y;if(v*v>a.maxRotationSquared)y*=f=a.maxRotation/n.abs(v);l.addMul(h,p),u+=h*y,_.c_position.c=l,_.c_position.a=u,_.c_velocity.v=p,_.c_velocity.w=y,_.m_sweep.c=l,_.m_sweep.a=u,_.m_linearVelocity=p,_.m_angularVelocity=y,_.synchronizeTransform()}this.postSolveIsland()},e.prototype.postSolveIsland=function(){for(var t=0;tn.EPSILON*n.EPSILON&&(a.setVec2(u),a.normalize());var d=_.clone().addMul(o,a),f=l.clone().addMul(-m,a);c[0]=r.mid(d,f),h[0]=r.dot(r.sub(f,d),a),c.length=1,h.length=1;break;case t.ManifoldType.e_faceA:a=p.mulVec2(i.q,this.localNormal);for(var v=y.mulVec2(i,this.localPoint),x=0;xe?t:e}var ut=[],pt=function(){this.rA=r.zero(),this.rB=r.zero(),this.normalImpulse=0,this.tangentImpulse=0,this.normalMass=0,this.tangentMass=0,this.velocityBias=0},yt=function(){function e(t,e,i,o,s){this.m_manifold=new ot,this.m_prev=null,this.m_next=null,this.m_toi=1,this.m_toiCount=0,this.m_toiFlag=!1,this.m_tangentSpeed=0,this.m_enabledFlag=!0,this.m_islandFlag=!1,this.m_touchingFlag=!1,this.m_filterFlag=!1,this.m_bulletHitFlag=!1,this.m_impulse=new G(this),this.v_points=[],this.v_normal=r.zero(),this.v_normalMass=new et,this.v_K=new et,this.p_localPoints=[],this.p_localNormal=r.zero(),this.p_localPoint=r.zero(),this.p_localCenterA=r.zero(),this.p_localCenterB=r.zero(),this.m_nodeA=new ht(this),this.m_nodeB=new ht(this),this.m_fixtureA=t,this.m_fixtureB=i,this.m_indexA=e,this.m_indexB=o,this.m_evaluateFcn=s,this.m_friction=_t(this.m_fixtureA.m_friction,this.m_fixtureB.m_friction),this.m_restitution=lt(this.m_fixtureA.m_restitution,this.m_fixtureB.m_restitution)}return e.prototype.initConstraint=function(t){var e=this.m_fixtureA,i=this.m_fixtureB,o=e.getShape(),s=i.getShape(),n=e.getBody(),m=i.getBody(),a=this.getManifold(),c=a.pointCount;this.v_invMassA=n.m_invMass,this.v_invMassB=m.m_invMass,this.v_invIA=n.m_invI,this.v_invIB=m.m_invI,this.v_friction=this.m_friction,this.v_restitution=this.m_restitution,this.v_tangentSpeed=this.m_tangentSpeed,this.v_pointCount=c,this.v_K.setZero(),this.v_normalMass.setZero(),this.p_invMassA=n.m_invMass,this.p_invMassB=m.m_invMass,this.p_invIA=n.m_invI,this.p_invIB=m.m_invI,this.p_localCenterA=r.clone(n.m_sweep.localCenter),this.p_localCenterB=r.clone(m.m_sweep.localCenter),this.p_radiusA=o.m_radius,this.p_radiusB=s.m_radius,this.p_type=a.type,this.p_localNormal=r.clone(a.localNormal),this.p_localPoint=r.clone(a.localPoint),this.p_pointCount=c;for(var h=0;h0;for(var u=0;u0?-E/W:0,Z=r.mulNumVec2(H,z);b.subMul(v,Z),B-=x*r.crossVec2Vec2(k,Z),V.addMul(A,Z),w+=g*r.crossVec2Vec2(D,Z)}return l.c.setVec2(b),l.a=B,u.c.setVec2(V),u.a=w,C},e.prototype.initVelocityConstraint=function(t){var e=this.m_fixtureA,i=this.m_fixtureB,o=e.getBody(),s=i.getBody(),n=o.c_velocity,m=s.c_velocity,c=o.c_position,h=s.c_position,_=this.p_radiusA,l=this.p_radiusB,u=this.getManifold(),d=this.v_invMassA,f=this.v_invMassB,v=this.v_invIA,x=this.v_invIB,A=r.clone(this.p_localCenterA),g=r.clone(this.p_localCenterB),b=r.clone(c.c),B=c.a,V=r.clone(n.v),w=n.w,C=r.clone(h.c),M=h.a,I=r.clone(m.v),S=m.w,z=y.identity(),P=y.identity();z.q.setAngle(B),P.q.setAngle(M),z.p.setCombine(1,b,-1,p.mulVec2(z.q,A)),P.p.setCombine(1,C,-1,p.mulVec2(P.q,g));var T=u.getWorldManifold(null,z,_,P,l);this.v_normal.setVec2(T.normal);for(var F=0;F0?1/k:0;var D=r.crossVec2Num(this.v_normal,1),j=r.crossVec2Vec2(L.rA,D),O=r.crossVec2Vec2(L.rB,D),R=d+f+v*j*j+x*O*O;L.tangentMass=R>0?1/R:0,L.velocityBias=0;var E=r.dot(this.v_normal,I)+r.dot(this.v_normal,r.crossNumVec2(S,L.rB))-r.dot(this.v_normal,V)-r.dot(this.v_normal,r.crossNumVec2(w,L.rA));E<-a.velocityThreshold&&(L.velocityBias=-this.v_restitution*E)}if(2==this.v_pointCount&&t.blockSolve){var J=this.v_points[0],Y=this.v_points[1],W=r.crossVec2Vec2(J.rA,this.v_normal),H=r.crossVec2Vec2(J.rB,this.v_normal),Z=r.crossVec2Vec2(Y.rA,this.v_normal),X=r.crossVec2Vec2(Y.rB,this.v_normal),K=d+f+v*W*W+x*H*H,G=d+f+v*Z*Z+x*X*X,U=d+f+v*W*Z+x*H*X;K*K<1e3*(K*G-U*U)?(this.v_K.ex.setNum(K,U),this.v_K.ey.setNum(U,G),this.v_normalMass.set(this.v_K.getInverse())):this.v_pointCount=1}c.c.setVec2(b),c.a=B,n.v.setVec2(V),n.w=w,h.c.setVec2(C),h.a=M,m.v.setVec2(I),m.w=S},e.prototype.warmStartConstraint=function(t){var e=this.m_fixtureA,i=this.m_fixtureB,o=e.getBody(),s=i.getBody(),n=o.c_velocity,m=s.c_velocity;o.c_position,s.c_position;for(var a=this.v_invMassA,c=this.v_invIA,h=this.v_invMassB,_=this.v_invIB,l=r.clone(n.v),u=n.w,p=r.clone(m.v),y=m.w,d=this.v_normal,f=r.crossVec2Num(d,1),v=0;v=0&&N.y>=0){var k=r.sub(N,z),D=r.mulNumVec2(k.x,y),j=r.mulNumVec2(k.y,y);_.subCombine(m,D,m,j),l-=a*(r.crossVec2Vec2(I.rA,D)+r.crossVec2Vec2(S.rA,j)),u.addCombine(c,D,c,j),p+=h*(r.crossVec2Vec2(I.rB,D)+r.crossVec2Vec2(S.rB,j)),I.normalImpulse=N.x,S.normalImpulse=N.y;break}if(N.x=-I.normalMass*q.x,N.y=0,F=0,L=this.v_K.ex.y*N.x+q.y,N.x>=0&&L>=0){k=r.sub(N,z),D=r.mulNumVec2(k.x,y),j=r.mulNumVec2(k.y,y);_.subCombine(m,D,m,j),l-=a*(r.crossVec2Vec2(I.rA,D)+r.crossVec2Vec2(S.rA,j)),u.addCombine(c,D,c,j),p+=h*(r.crossVec2Vec2(I.rB,D)+r.crossVec2Vec2(S.rB,j)),I.normalImpulse=N.x,S.normalImpulse=N.y;break}if(N.x=0,N.y=-S.normalMass*q.y,F=this.v_K.ey.x*N.y+q.x,L=0,N.y>=0&&F>=0){k=r.sub(N,z),D=r.mulNumVec2(k.x,y),j=r.mulNumVec2(k.y,y);_.subCombine(m,D,m,j),l-=a*(r.crossVec2Vec2(I.rA,D)+r.crossVec2Vec2(S.rA,j)),u.addCombine(c,D,c,j),p+=h*(r.crossVec2Vec2(I.rB,D)+r.crossVec2Vec2(S.rB,j)),I.normalImpulse=N.x,S.normalImpulse=N.y;break}if(N.x=0,N.y=0,F=q.x,L=q.y,F>=0&&L>=0){k=r.sub(N,z),D=r.mulNumVec2(k.x,y),j=r.mulNumVec2(k.y,y);_.subCombine(m,D,m,j),l-=a*(r.crossVec2Vec2(I.rA,D)+r.crossVec2Vec2(S.rA,j)),u.addCombine(c,D,c,j),p+=h*(r.crossVec2Vec2(I.rB,D)+r.crossVec2Vec2(S.rB,j)),I.normalImpulse=N.x,S.normalImpulse=N.y;break}break}}o.v.setVec2(_),o.w=l,s.v.setVec2(u),s.w=p},e.addType=function(t,e,i){ut[t]=ut[t]||{},ut[t][e]=i},e.create=function(t,i,o,s){var n,r,m=t.getType(),a=o.getType();if(r=ut[m]&&ut[m][a])n=new e(t,i,o,s,r);else{if(!(r=ut[a]&&ut[a][m]))return null;n=new e(o,s,t,i,r)}t=n.getFixtureA(),o=n.getFixtureB(),i=n.getChildIndexA(),s=n.getChildIndexB();var c=t.getBody(),h=o.getBody();return n.m_nodeA.contact=n,n.m_nodeA.other=h,n.m_nodeA.prev=null,n.m_nodeA.next=c.m_contactList,null!=c.m_contactList&&(c.m_contactList.prev=n.m_nodeA),c.m_contactList=n.m_nodeA,n.m_nodeB.contact=n,n.m_nodeB.other=c,n.m_nodeB.prev=null,n.m_nodeB.next=h.m_contactList,null!=h.m_contactList&&(h.m_contactList.prev=n.m_nodeB),h.m_contactList=n.m_nodeB,0==t.isSensor()&&0==o.isSensor()&&(c.setAwake(!0),h.setAwake(!0)),n},e.destroy=function(t,e){var i=t.m_fixtureA,o=t.m_fixtureB,s=i.getBody(),n=o.getBody();t.isTouching()&&e.endContact(t),t.m_nodeA.prev&&(t.m_nodeA.prev.next=t.m_nodeA.next),t.m_nodeA.next&&(t.m_nodeA.next.prev=t.m_nodeA.prev),t.m_nodeA==s.m_contactList&&(s.m_contactList=t.m_nodeA.next),t.m_nodeB.prev&&(t.m_nodeB.prev.next=t.m_nodeB.next),t.m_nodeB.next&&(t.m_nodeB.next.prev=t.m_nodeB.prev),t.m_nodeB==n.m_contactList&&(n.m_contactList=t.m_nodeB.next),t.m_manifold.pointCount>0&&0==i.isSensor()&&0==o.isSensor()&&(s.setAwake(!0),n.setAwake(!0)),i.getType(),o.getType()},e}(),dt={gravity:r.zero(),allowSleep:!0,warmStarting:!0,continuousPhysics:!0,subStepping:!1,blockSolve:!0,velocityIterations:8,positionIterations:3},ft=function(){function t(e){if(!(this instanceof t))return new t(e);this.s_step=new X,e&&r.isValid(e)&&(e={gravity:e}),e=s(e,dt),this.m_solver=new U(this),this.m_broadPhase=new u,this.m_contactList=null,this.m_contactCount=0,this.m_bodyList=null,this.m_bodyCount=0,this.m_jointList=null,this.m_jointCount=0,this.m_stepComplete=!0,this.m_allowSleep=e.allowSleep,this.m_gravity=r.clone(e.gravity),this.m_clearForces=!0,this.m_newFixture=!1,this.m_locked=!1,this.m_warmStarting=e.warmStarting,this.m_continuousPhysics=e.continuousPhysics,this.m_subStepping=e.subStepping,this.m_blockSolve=e.blockSolve,this.m_velocityIterations=e.velocityIterations,this.m_positionIterations=e.positionIterations,this.m_t=0}return t.prototype._serialize=function(){for(var t=[],e=[],i=this.getBodyList();i;i=i.getNext())t.push(i);for(var o=this.getJointList();o;o=o.getNext())"function"==typeof o._serialize&&e.push(o);return{gravity:this.m_gravity,bodies:t,joints:e}},t._deserialize=function(e,i,o){if(!e)return new t;var s=new t(e.gravity);if(e.bodies)for(var n=e.bodies.length-1;n>=0;n-=1)s._addBody(o(I,e.bodies[n],s));if(e.joints)for(n=e.joints.length-1;n>=0;n--)s.createJoint(o(z,e.joints[n],s));return s},t.prototype.getBodyList=function(){return this.m_bodyList},t.prototype.getJointList=function(){return this.m_jointList},t.prototype.getContactList=function(){return this.m_contactList},t.prototype.getBodyCount=function(){return this.m_bodyCount},t.prototype.getJointCount=function(){return this.m_jointCount},t.prototype.getContactCount=function(){return this.m_contactCount},t.prototype.setGravity=function(t){this.m_gravity=t},t.prototype.getGravity=function(){return this.m_gravity},t.prototype.isLocked=function(){return this.m_locked},t.prototype.setAllowSleeping=function(t){if(t!=this.m_allowSleep&&(this.m_allowSleep=t,0==this.m_allowSleep))for(var e=this.m_bodyList;e;e=e.m_next)e.setAwake(!0)},t.prototype.getAllowSleeping=function(){return this.m_allowSleep},t.prototype.setWarmStarting=function(t){this.m_warmStarting=t},t.prototype.getWarmStarting=function(){return this.m_warmStarting},t.prototype.setContinuousPhysics=function(t){this.m_continuousPhysics=t},t.prototype.getContinuousPhysics=function(){return this.m_continuousPhysics},t.prototype.setSubStepping=function(t){this.m_subStepping=t},t.prototype.getSubStepping=function(){return this.m_subStepping},t.prototype.setAutoClearForces=function(t){this.m_clearForces=t},t.prototype.getAutoClearForces=function(){return this.m_clearForces},t.prototype.clearForces=function(){for(var t=this.m_bodyList;t;t=t.getNext())t.m_force.setZero(),t.m_torque=0},t.prototype.queryAABB=function(t,e){var i=this.m_broadPhase;this.m_broadPhase.query(t,(function(t){var o=i.getUserData(t);return e(o.fixture)}))},t.prototype.rayCast=function(t,e,i){var o=this.m_broadPhase;this.m_broadPhase.rayCast({maxFraction:1,p1:t,p2:e},(function(t,e){var s=o.getUserData(e),n=s.fixture,m=s.childIndex,a={};if(n.rayCast(a,t,m)){var c=a.fraction,h=r.add(r.mulNumVec2(1-c,t.p1),r.mulNumVec2(c,t.p2));return i(n,h,a.normal,c)}return t.maxFraction}))},t.prototype.getProxyCount=function(){return this.m_broadPhase.getProxyCount()},t.prototype.getTreeHeight=function(){return this.m_broadPhase.getTreeHeight()},t.prototype.getTreeBalance=function(){return this.m_broadPhase.getTreeBalance()},t.prototype.getTreeQuality=function(){return this.m_broadPhase.getTreeQuality()},t.prototype.shiftOrigin=function(t){if(!this.m_locked){for(var e=this.m_bodyList;e;e=e.m_next)e.m_xf.p.sub(t),e.m_sweep.c0.sub(t),e.m_sweep.c.sub(t);for(var i=this.m_jointList;i;i=i.m_next)i.shiftOrigin(t);this.m_broadPhase.shiftOrigin(t)}},t.prototype._addBody=function(t){this.isLocked()||(t.m_prev=null,t.m_next=this.m_bodyList,this.m_bodyList&&(this.m_bodyList.m_prev=t),this.m_bodyList=t,++this.m_bodyCount)},t.prototype.createBody=function(t,e){if(this.isLocked())return null;var i={};t&&(r.isValid(t)?i={position:t,angle:e}:"object"==typeof t&&(i=t));var o=new I(this,i);return this._addBody(o),o},t.prototype.createDynamicBody=function(t,e){var i={};return t&&(r.isValid(t)?i={position:t,angle:e}:"object"==typeof t&&(i=t)),i.type="dynamic",this.createBody(i)},t.prototype.createKinematicBody=function(t,e){var i={};return t&&(r.isValid(t)?i={position:t,angle:e}:"object"==typeof t&&(i=t)),i.type="kinematic",this.createBody(i)},t.prototype.destroyBody=function(t){if(!this.isLocked()){if(t.m_destroyed)return!1;for(var e=t.m_jointList;e;){var i=e;e=e.next,this.publish("remove-joint",i.joint),this.destroyJoint(i.joint),t.m_jointList=e}t.m_jointList=null;for(var o=t.m_contactList;o;){var s=o;o=o.next,this.destroyContact(s.contact),t.m_contactList=o}t.m_contactList=null;for(var n=t.m_fixtureList;n;){var r=n;n=n.m_next,this.publish("remove-fixture",r),r.destroyProxies(this.m_broadPhase),t.m_fixtureList=n}return t.m_fixtureList=null,t.m_prev&&(t.m_prev.m_next=t.m_next),t.m_next&&(t.m_next.m_prev=t.m_prev),t==this.m_bodyList&&(this.m_bodyList=t.m_next),t.m_destroyed=!0,--this.m_bodyCount,this.publish("remove-body",t),!0}},t.prototype.createJoint=function(t){if(this.isLocked())return null;if(t.m_prev=null,t.m_next=this.m_jointList,this.m_jointList&&(this.m_jointList.m_prev=t),this.m_jointList=t,++this.m_jointCount,t.m_edgeA.joint=t,t.m_edgeA.other=t.m_bodyB,t.m_edgeA.prev=null,t.m_edgeA.next=t.m_bodyA.m_jointList,t.m_bodyA.m_jointList&&(t.m_bodyA.m_jointList.prev=t.m_edgeA),t.m_bodyA.m_jointList=t.m_edgeA,t.m_edgeB.joint=t,t.m_edgeB.other=t.m_bodyA,t.m_edgeB.prev=null,t.m_edgeB.next=t.m_bodyB.m_jointList,t.m_bodyB.m_jointList&&(t.m_bodyB.m_jointList.prev=t.m_edgeB),t.m_bodyB.m_jointList=t.m_edgeB,0==t.m_collideConnected)for(var e=t.m_bodyB.getContactList();e;e=e.next)e.other==t.m_bodyA&&e.contact.flagForFiltering();return t},t.prototype.destroyJoint=function(t){if(!this.isLocked()){t.m_prev&&(t.m_prev.m_next=t.m_next),t.m_next&&(t.m_next.m_prev=t.m_prev),t==this.m_jointList&&(this.m_jointList=t.m_next);var e=t.m_bodyA,i=t.m_bodyB;if(e.setAwake(!0),i.setAwake(!0),t.m_edgeA.prev&&(t.m_edgeA.prev.next=t.m_edgeA.next),t.m_edgeA.next&&(t.m_edgeA.next.prev=t.m_edgeA.prev),t.m_edgeA==e.m_jointList&&(e.m_jointList=t.m_edgeA.next),t.m_edgeA.prev=null,t.m_edgeA.next=null,t.m_edgeB.prev&&(t.m_edgeB.prev.next=t.m_edgeB.next),t.m_edgeB.next&&(t.m_edgeB.next.prev=t.m_edgeB.prev),t.m_edgeB==i.m_jointList&&(i.m_jointList=t.m_edgeB.next),t.m_edgeB.prev=null,t.m_edgeB.next=null,--this.m_jointCount,0==t.m_collideConnected)for(var o=i.getContactList();o;)o.other==e&&o.contact.flagForFiltering(),o=o.next;this.publish("remove-joint",t)}},t.prototype.step=function(t,e,i){if(this.publish("pre-step",t),(0|e)!==e&&(e=0),e=e||this.m_velocityIterations,i=i||this.m_positionIterations,this.m_newFixture&&(this.findNewContacts(),this.m_newFixture=!1),this.m_locked=!0,this.s_step.reset(t),this.s_step.velocityIterations=e,this.s_step.positionIterations=i,this.s_step.warmStarting=this.m_warmStarting,this.s_step.blockSolve=this.m_blockSolve,this.updateContacts(),this.m_stepComplete&&t>0){this.m_solver.solveWorld(this.s_step);for(var o=this.m_bodyList;o;o=o.getNext())0!=o.m_islandFlag&&(o.isStatic()||o.synchronizeFixtures());this.findNewContacts()}this.m_continuousPhysics&&t>0&&this.m_solver.solveWorldTOI(this.s_step),this.m_clearForces&&this.clearForces(),this.m_locked=!1,this.publish("post-step",t)},t.prototype.findNewContacts=function(){var t=this;this.m_broadPhase.updatePairs((function(e,i){return t.createContact(e,i)}))},t.prototype.createContact=function(t,e){var i=t.fixture,o=e.fixture,s=t.childIndex,n=e.childIndex,r=i.getBody(),m=o.getBody();if(r!=m){for(var a=m.getContactList();a;){if(a.other==r){var c=a.contact.getFixtureA(),h=a.contact.getFixtureB(),_=a.contact.getChildIndexA(),l=a.contact.getChildIndexB();if(c==i&&h==o&&_==s&&l==n)return;if(c==o&&h==i&&_==n&&l==s)return}a=a.next}if(0!=m.shouldCollide(r)&&0!=o.shouldCollide(i)){var u=yt.create(i,s,o,n);null!=u&&(u.m_prev=null,null!=this.m_contactList&&(u.m_next=this.m_contactList,this.m_contactList.m_prev=u),this.m_contactList=u,++this.m_contactCount)}}},t.prototype.updateContacts=function(){for(var t,e=this.m_contactList;t=e;){e=t.getNext();var i=t.getFixtureA(),o=t.getFixtureB(),s=t.getChildIndexA(),n=t.getChildIndexB(),r=i.getBody(),m=o.getBody();if(t.m_filterFlag){if(0==m.shouldCollide(r)){this.destroyContact(t);continue}if(0==o.shouldCollide(i)){this.destroyContact(t);continue}t.m_filterFlag=!1}var a=r.isAwake()&&!r.isStatic(),c=m.isAwake()&&!m.isStatic();if(0!=a||0!=c){var h=i.m_proxies[s].proxyId,_=o.m_proxies[n].proxyId;0!=this.m_broadPhase.testOverlap(h,_)?t.update(this):this.destroyContact(t)}}},t.prototype.destroyContact=function(t){yt.destroy(t,this),t.m_prev&&(t.m_prev.m_next=t.m_next),t.m_next&&(t.m_next.m_prev=t.m_prev),t==this.m_contactList&&(this.m_contactList=t.m_next),--this.m_contactCount},t.prototype.on=function(t,e){return"string"!=typeof t||"function"!=typeof e||(this._listeners||(this._listeners={}),this._listeners[t]||(this._listeners[t]=[]),this._listeners[t].push(e)),this},t.prototype.off=function(t,e){if("string"!=typeof t||"function"!=typeof e)return this;var i=this._listeners&&this._listeners[t];if(!i||!i.length)return this;var o=i.indexOf(e);return o>=0&&i.splice(o,1),this},t.prototype.publish=function(t,e,i,o){var s=this._listeners&&this._listeners[t];if(!s||!s.length)return 0;for(var n=0;n0?p.mulVec2(i.q,_).neg():p.mulVec2(i.q,_),!0)},e.prototype.computeAABB=function(t,e,i){var o=y.mulVec2(e,this.m_vertex1),s=y.mulVec2(e,this.m_vertex2);t.combinePoints(o,s),t.extend(this.m_radius)},e.prototype.computeMass=function(t,e){t.mass=0,t.center.setCombine(.5,this.m_vertex1,.5,this.m_vertex2),t.I=0},e.prototype.computeDistanceProxy=function(t){t.m_vertices.push(this.m_vertex1),t.m_vertices.push(this.m_vertex2),t.m_count=2,t.m_radius=this.m_radius},e.TYPE="edge",e}(x),At=xt,gt=function(t){function e(i,o){var s=this;return s instanceof e?((s=t.call(this)||this).m_type=e.TYPE,s.m_radius=a.polygonRadius,s.m_vertices=[],s.m_count=0,s.m_prevVertex=null,s.m_nextVertex=null,s.m_hasPrevVertex=!1,s.m_hasNextVertex=!1,s.m_isLoop=!!o,i&&i.length&&(o?s._createLoop(i):s._createChain(i)),s):new e(i,o)}return i(e,t),e.prototype._serialize=function(){var t={type:this.m_type,vertices:this.m_vertices,isLoop:this.m_isLoop,hasPrevVertex:this.m_hasPrevVertex,hasNextVertex:this.m_hasNextVertex,prevVertex:null,nextVertex:null};return this.m_prevVertex&&(t.prevVertex=this.m_prevVertex),this.m_nextVertex&&(t.nextVertex=this.m_nextVertex),t},e._deserialize=function(t,i,o){var s=[];if(t.vertices)for(var n=0;n0?(t.m_vertex0=this.m_vertices[e-1],t.m_hasVertex0=!0):(t.m_vertex0=this.m_prevVertex,t.m_hasVertex0=this.m_hasPrevVertex),e_||l===_&&i[o].yf.lengthSquared()&&(d=c)}else d=c;if(++p,y=d,d===h)break}if(p<3)this._setAsBox(1,1);else{this.m_count=p,this.m_vertices=[];for(o=0;o0)return!1}return!0},e.prototype.rayCast=function(t,e,i,o){for(var s=p.mulTVec2(i.q,r.sub(e.p1,i.p)),n=p.mulTVec2(i.q,r.sub(e.p2,i.p)),m=r.sub(n,s),a=0,c=e.maxFraction,h=-1,_=0;_0&&l=0&&(t.fraction=a,t.normal=p.mulVec2(i.q,this.m_normals[h]),!0)},e.prototype.computeAABB=function(t,e,i){for(var o=1/0,s=1/0,r=-1/0,m=-1/0,a=0;a0?this.m_length=+t.length:t.length<0||(t.anchorA||t.anchorA||t.anchorA||t.anchorA)&&(this.m_length=r.distance(this.m_bodyA.getWorldPoint(this.m_localAnchorA),this.m_bodyB.getWorldPoint(this.m_localAnchorB)))},e.prototype.getLocalAnchorA=function(){return this.m_localAnchorA},e.prototype.getLocalAnchorB=function(){return this.m_localAnchorB},e.prototype.setLength=function(t){this.m_length=t},e.prototype.getLength=function(){return this.m_length},e.prototype.setFrequency=function(t){this.m_frequencyHz=t},e.prototype.getFrequency=function(){return this.m_frequencyHz},e.prototype.setDampingRatio=function(t){this.m_dampingRatio=t},e.prototype.getDampingRatio=function(){return this.m_dampingRatio},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return r.mulNumVec2(this.m_impulse,this.m_u).mul(t)},e.prototype.getReactionTorque=function(t){return 0},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyA.c_velocity.v,s=this.m_bodyA.c_velocity.w,m=this.m_bodyB.c_position.c,c=this.m_bodyB.c_position.a,h=this.m_bodyB.c_velocity.v,_=this.m_bodyB.c_velocity.w,l=p.neo(i),u=p.neo(c);this.m_rA=p.mulVec2(l,r.sub(this.m_localAnchorA,this.m_localCenterA)),this.m_rB=p.mulVec2(u,r.sub(this.m_localAnchorB,this.m_localCenterB)),this.m_u=r.sub(r.add(m,this.m_rB),r.add(e,this.m_rA));var y=this.m_u.length();y>a.linearSlop?this.m_u.mul(1/y):this.m_u.setNum(0,0);var d=r.crossVec2Vec2(this.m_rA,this.m_u),f=r.crossVec2Vec2(this.m_rB,this.m_u),v=this.m_invMassA+this.m_invIA*d*d+this.m_invMassB+this.m_invIB*f*f;if(this.m_mass=0!=v?1/v:0,this.m_frequencyHz>0){var x=y-this.m_length,A=2*n.PI*this.m_frequencyHz,g=2*this.m_mass*this.m_dampingRatio*A,b=this.m_mass*A*A,B=t.dt;this.m_gamma=B*(g+B*b),this.m_gamma=0!=this.m_gamma?1/this.m_gamma:0,this.m_bias=x*B*b*this.m_gamma,v+=this.m_gamma,this.m_mass=0!=v?1/v:0}else this.m_gamma=0,this.m_bias=0;if(t.warmStarting){this.m_impulse*=t.dtRatio;var V=r.mulNumVec2(this.m_impulse,this.m_u);o.subMul(this.m_invMassA,V),s-=this.m_invIA*r.crossVec2Vec2(this.m_rA,V),h.addMul(this.m_invMassB,V),_+=this.m_invIB*r.crossVec2Vec2(this.m_rB,V)}else this.m_impulse=0;this.m_bodyA.c_velocity.v.setVec2(o),this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v.setVec2(h),this.m_bodyB.c_velocity.w=_},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=r.add(e,r.crossNumVec2(i,this.m_rA)),m=r.add(o,r.crossNumVec2(s,this.m_rB)),a=r.dot(this.m_u,m)-r.dot(this.m_u,n),c=-this.m_mass*(a+this.m_bias+this.m_gamma*this.m_impulse);this.m_impulse+=c;var h=r.mulNumVec2(c,this.m_u);e.subMul(this.m_invMassA,h),i-=this.m_invIA*r.crossVec2Vec2(this.m_rA,h),o.addMul(this.m_invMassB,h),s+=this.m_invIB*r.crossVec2Vec2(this.m_rB,h),this.m_bodyA.c_velocity.v.setVec2(e),this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v.setVec2(o),this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){if(this.m_frequencyHz>0)return!0;var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyB.c_position.c,s=this.m_bodyB.c_position.a,m=p.neo(i),c=p.neo(s),h=p.mulSub(m,this.m_localAnchorA,this.m_localCenterA),_=p.mulSub(c,this.m_localAnchorB,this.m_localCenterB),l=r.sub(r.add(o,_),r.add(e,h)),u=l.normalize()-this.m_length;u=n.clamp(u,-a.maxLinearCorrection,a.maxLinearCorrection);var y=-this.m_mass*u,d=r.mulNumVec2(y,l);return e.subMul(this.m_invMassA,d),i-=this.m_invIA*r.crossVec2Vec2(h,d),o.addMul(this.m_invMassB,d),s+=this.m_invIB*r.crossVec2Vec2(_,d),this.m_bodyA.c_position.c.setVec2(e),this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c.setVec2(o),this.m_bodyB.c_position.a=s,n.abs(u)0&&(this.m_angularMass=1/this.m_angularMass),t.warmStarting){this.m_linearImpulse.mul(t.dtRatio),this.m_angularImpulse*=t.dtRatio;var d=r.neo(this.m_linearImpulse.x,this.m_linearImpulse.y);i.subMul(h,d),o-=l*(r.crossVec2Vec2(this.m_rA,d)+this.m_angularImpulse),n.addMul(_,d),m+=u*(r.crossVec2Vec2(this.m_rB,d)+this.m_angularImpulse)}else this.m_linearImpulse.setZero(),this.m_angularImpulse=0;this.m_bodyA.c_velocity.v=i,this.m_bodyA.c_velocity.w=o,this.m_bodyB.c_velocity.v=n,this.m_bodyB.c_velocity.w=m},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,m=this.m_invMassA,a=this.m_invMassB,c=this.m_invIA,h=this.m_invIB,_=t.dt,l=s-i,u=-this.m_angularMass*l,p=this.m_angularImpulse,y=_*this.m_maxTorque;this.m_angularImpulse=n.clamp(this.m_angularImpulse+u,-y,y),i-=c*(u=this.m_angularImpulse-p),s+=h*u;l=r.sub(r.add(o,r.crossNumVec2(s,this.m_rB)),r.add(e,r.crossNumVec2(i,this.m_rA))),u=r.neg(et.mulVec2(this.m_linearMass,l)),p=this.m_linearImpulse;this.m_linearImpulse.add(u);y=_*this.m_maxForce;this.m_linearImpulse.lengthSquared()>y*y&&(this.m_linearImpulse.normalize(),this.m_linearImpulse.mul(y)),u=r.sub(this.m_linearImpulse,p),e.subMul(m,u),i-=c*r.crossVec2Vec2(this.m_rA,u),o.addMul(a,u),s+=h*r.crossVec2Vec2(this.m_rB,u),this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){return!0},e.TYPE="friction-joint",e}(z),Ft=function(){function t(t,e,i){"object"==typeof t&&null!==t?(this.ex=vt.clone(t),this.ey=vt.clone(e),this.ez=vt.clone(i)):(this.ex=vt.zero(),this.ey=vt.zero(),this.ez=vt.zero())}return t.prototype.toString=function(){return JSON.stringify(this)},t.isValid=function(t){return null!=t&&(vt.isValid(t.ex)&&vt.isValid(t.ey)&&vt.isValid(t.ez))},t.assert=function(t){},t.prototype.setZero=function(){return this.ex.setZero(),this.ey.setZero(),this.ez.setZero(),this},t.prototype.solve33=function(t){var e=vt.dot(this.ex,vt.cross(this.ey,this.ez));0!==e&&(e=1/e);var i=new vt;return i.x=e*vt.dot(t,vt.cross(this.ey,this.ez)),i.y=e*vt.dot(this.ex,vt.cross(t,this.ez)),i.z=e*vt.dot(this.ex,vt.cross(this.ey,t)),i},t.prototype.solve22=function(t){var e=this.ex.x,i=this.ey.x,o=this.ex.y,s=this.ey.y,n=e*s-i*o;0!==n&&(n=1/n);var m=r.zero();return m.x=n*(s*t.x-i*t.y),m.y=n*(e*t.y-o*t.x),m},t.prototype.getInverse22=function(t){var e=this.ex.x,i=this.ey.x,o=this.ex.y,s=this.ey.y,n=e*s-i*o;0!==n&&(n=1/n),t.ex.x=n*s,t.ey.x=-n*i,t.ex.z=0,t.ex.y=-n*o,t.ey.y=n*e,t.ey.z=0,t.ez.x=0,t.ez.y=0,t.ez.z=0},t.prototype.getSymInverse33=function(t){var e=vt.dot(this.ex,vt.cross(this.ey,this.ez));0!==e&&(e=1/e);var i=this.ex.x,o=this.ey.x,s=this.ez.x,n=this.ey.y,r=this.ez.y,m=this.ez.z;t.ex.x=e*(n*m-r*r),t.ex.y=e*(s*r-o*m),t.ex.z=e*(o*r-s*n),t.ey.x=t.ex.y,t.ey.y=e*(i*m-s*s),t.ey.z=e*(s*o-i*r),t.ez.x=t.ex.z,t.ez.y=t.ey.z,t.ez.z=e*(i*n-o*o)},t.mul=function(t,e){if(e&&"z"in e&&"y"in e&&"x"in e){var i=t.ex.x*e.x+t.ey.x*e.y+t.ez.x*e.z,o=t.ex.y*e.x+t.ey.y*e.y+t.ez.y*e.z,s=t.ex.z*e.x+t.ey.z*e.y+t.ez.z*e.z;return new vt(i,o,s)}if(e&&"y"in e&&"x"in e){i=t.ex.x*e.x+t.ey.x*e.y,o=t.ex.y*e.x+t.ey.y*e.y;return r.neo(i,o)}},t.mulVec3=function(t,e){var i=t.ex.x*e.x+t.ey.x*e.y+t.ez.x*e.z,o=t.ex.y*e.x+t.ey.y*e.y+t.ez.y*e.z,s=t.ex.z*e.x+t.ey.z*e.y+t.ez.z*e.z;return new vt(i,o,s)},t.mulVec2=function(t,e){var i=t.ex.x*e.x+t.ey.x*e.y,o=t.ex.y*e.x+t.ey.y*e.y;return r.neo(i,o)},t.add=function(e,i){return new t(vt.add(e.ex,i.ex),vt.add(e.ey,i.ey),vt.add(e.ez,i.ez))},t}(),Lt={lowerAngle:0,upperAngle:0,maxMotorTorque:0,motorSpeed:0,enableLimit:!1,enableMotor:!1},qt=function(t){function e(i,o,m,a){var c=this;return c instanceof e?(i=s(i,Lt),(c=t.call(this,i,o,m)||this).m_mass=new Ft,c.m_limitState=0,o=c.m_bodyA,m=c.m_bodyB,c.m_type=e.TYPE,c.m_localAnchorA=r.clone(a?o.getLocalPoint(a):i.localAnchorA||r.zero()),c.m_localAnchorB=r.clone(a?m.getLocalPoint(a):i.localAnchorB||r.zero()),c.m_referenceAngle=n.isFinite(i.referenceAngle)?i.referenceAngle:m.getAngle()-o.getAngle(),c.m_impulse=new vt,c.m_motorImpulse=0,c.m_lowerAngle=i.lowerAngle,c.m_upperAngle=i.upperAngle,c.m_maxMotorTorque=i.maxMotorTorque,c.m_motorSpeed=i.motorSpeed,c.m_enableLimit=i.enableLimit,c.m_enableMotor=i.enableMotor,c):new e(i,o,m,a)}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,lowerAngle:this.m_lowerAngle,upperAngle:this.m_upperAngle,maxMotorTorque:this.m_maxMotorTorque,motorSpeed:this.m_motorSpeed,enableLimit:this.m_enableLimit,enableMotor:this.m_enableMotor,localAnchorA:this.m_localAnchorA,localAnchorB:this.m_localAnchorB,referenceAngle:this.m_referenceAngle}},e._deserialize=function(t,i,s){return(t=o({},t)).bodyA=s(I,t.bodyA,i),t.bodyB=s(I,t.bodyB,i),new e(t)},e.prototype._setAnchors=function(t){t.anchorA?this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(t.anchorA)):t.localAnchorA&&this.m_localAnchorA.setVec2(t.localAnchorA),t.anchorB?this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(t.anchorB)):t.localAnchorB&&this.m_localAnchorB.setVec2(t.localAnchorB)},e.prototype.getLocalAnchorA=function(){return this.m_localAnchorA},e.prototype.getLocalAnchorB=function(){return this.m_localAnchorB},e.prototype.getReferenceAngle=function(){return this.m_referenceAngle},e.prototype.getJointAngle=function(){var t=this.m_bodyA;return this.m_bodyB.m_sweep.a-t.m_sweep.a-this.m_referenceAngle},e.prototype.getJointSpeed=function(){var t=this.m_bodyA;return this.m_bodyB.m_angularVelocity-t.m_angularVelocity},e.prototype.isMotorEnabled=function(){return this.m_enableMotor},e.prototype.enableMotor=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableMotor=t},e.prototype.getMotorTorque=function(t){return t*this.m_motorImpulse},e.prototype.setMotorSpeed=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_motorSpeed=t},e.prototype.getMotorSpeed=function(){return this.m_motorSpeed},e.prototype.setMaxMotorTorque=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_maxMotorTorque=t},e.prototype.getMaxMotorTorque=function(){return this.m_maxMotorTorque},e.prototype.isLimitEnabled=function(){return this.m_enableLimit},e.prototype.enableLimit=function(t){t!=this.m_enableLimit&&(this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableLimit=t,this.m_impulse.z=0)},e.prototype.getLowerLimit=function(){return this.m_lowerAngle},e.prototype.getUpperLimit=function(){return this.m_upperAngle},e.prototype.setLimits=function(t,e){t==this.m_lowerAngle&&e==this.m_upperAngle||(this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_impulse.z=0,this.m_lowerAngle=t,this.m_upperAngle=e)},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return r.neo(this.m_impulse.x,this.m_impulse.y).mul(t)},e.prototype.getReactionTorque=function(t){return t*this.m_impulse.z},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyA.c_position.a,i=this.m_bodyA.c_velocity.v,o=this.m_bodyA.c_velocity.w,s=this.m_bodyB.c_position.a,m=this.m_bodyB.c_velocity.v,c=this.m_bodyB.c_velocity.w,h=p.neo(e),_=p.neo(s);this.m_rA=p.mulVec2(h,r.sub(this.m_localAnchorA,this.m_localCenterA)),this.m_rB=p.mulVec2(_,r.sub(this.m_localAnchorB,this.m_localCenterB));var l=this.m_invMassA,u=this.m_invMassB,y=this.m_invIA,d=this.m_invIB,f=y+d===0;if(this.m_mass.ex.x=l+u+this.m_rA.y*this.m_rA.y*y+this.m_rB.y*this.m_rB.y*d,this.m_mass.ey.x=-this.m_rA.y*this.m_rA.x*y-this.m_rB.y*this.m_rB.x*d,this.m_mass.ez.x=-this.m_rA.y*y-this.m_rB.y*d,this.m_mass.ex.y=this.m_mass.ey.x,this.m_mass.ey.y=l+u+this.m_rA.x*this.m_rA.x*y+this.m_rB.x*this.m_rB.x*d,this.m_mass.ez.y=this.m_rA.x*y+this.m_rB.x*d,this.m_mass.ex.z=this.m_mass.ez.x,this.m_mass.ey.z=this.m_mass.ez.y,this.m_mass.ez.z=y+d,this.m_motorMass=y+d,this.m_motorMass>0&&(this.m_motorMass=1/this.m_motorMass),(0==this.m_enableMotor||f)&&(this.m_motorImpulse=0),this.m_enableLimit&&0==f){var v=s-e-this.m_referenceAngle;n.abs(this.m_upperAngle-this.m_lowerAngle)<2*a.angularSlop?this.m_limitState=3:v<=this.m_lowerAngle?(1!=this.m_limitState&&(this.m_impulse.z=0),this.m_limitState=1):v>=this.m_upperAngle?(2!=this.m_limitState&&(this.m_impulse.z=0),this.m_limitState=2):(this.m_limitState=0,this.m_impulse.z=0)}else this.m_limitState=0;if(t.warmStarting){this.m_impulse.mul(t.dtRatio),this.m_motorImpulse*=t.dtRatio;var x=r.neo(this.m_impulse.x,this.m_impulse.y);i.subMul(l,x),o-=y*(r.crossVec2Vec2(this.m_rA,x)+this.m_motorImpulse+this.m_impulse.z),m.addMul(u,x),c+=d*(r.crossVec2Vec2(this.m_rB,x)+this.m_motorImpulse+this.m_impulse.z)}else this.m_impulse.setZero(),this.m_motorImpulse=0;this.m_bodyA.c_velocity.v=i,this.m_bodyA.c_velocity.w=o,this.m_bodyB.c_velocity.v=m,this.m_bodyB.c_velocity.w=c},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,m=this.m_invMassA,a=this.m_invMassB,c=this.m_invIA,h=this.m_invIB,_=c+h===0;if(this.m_enableMotor&&3!=this.m_limitState&&0==_){var l=s-i-this.m_motorSpeed,u=-this.m_motorMass*l,p=this.m_motorImpulse,y=t.dt*this.m_maxMotorTorque;this.m_motorImpulse=n.clamp(this.m_motorImpulse+u,-y,y),i-=c*(u=this.m_motorImpulse-p),s+=h*u}if(this.m_enableLimit&&0!=this.m_limitState&&0==_){var d=r.zero();d.addCombine(1,o,1,r.crossNumVec2(s,this.m_rB)),d.subCombine(1,e,1,r.crossNumVec2(i,this.m_rA));var f=s-i;l=new vt(d.x,d.y,f),u=vt.neg(this.m_mass.solve33(l));if(3==this.m_limitState)this.m_impulse.add(u);else if(1==this.m_limitState){if(this.m_impulse.z+u.z<0){var v=r.combine(-1,d,this.m_impulse.z,r.neo(this.m_mass.ez.x,this.m_mass.ez.y)),x=this.m_mass.solve22(v);u.x=x.x,u.y=x.y,u.z=-this.m_impulse.z,this.m_impulse.x+=x.x,this.m_impulse.y+=x.y,this.m_impulse.z=0}else this.m_impulse.add(u)}else if(2==this.m_limitState){if(this.m_impulse.z+u.z>0){v=r.combine(-1,d,this.m_impulse.z,r.neo(this.m_mass.ez.x,this.m_mass.ez.y)),x=this.m_mass.solve22(v);u.x=x.x,u.y=x.y,u.z=-this.m_impulse.z,this.m_impulse.x+=x.x,this.m_impulse.y+=x.y,this.m_impulse.z=0}else this.m_impulse.add(u)}var A=r.neo(u.x,u.y);e.subMul(m,A),i-=c*(r.crossVec2Vec2(this.m_rA,A)+u.z),o.addMul(a,A),s+=h*(r.crossVec2Vec2(this.m_rB,A)+u.z)}else{(l=r.zero()).addCombine(1,o,1,r.crossNumVec2(s,this.m_rB)),l.subCombine(1,e,1,r.crossNumVec2(i,this.m_rA));u=this.m_mass.solve22(r.neg(l));this.m_impulse.x+=u.x,this.m_impulse.y+=u.y,e.subMul(m,u),i-=c*r.crossVec2Vec2(this.m_rA,u),o.addMul(a,u),s+=h*r.crossVec2Vec2(this.m_rB,u)}this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){var e,i=this.m_bodyA.c_position.c,o=this.m_bodyA.c_position.a,s=this.m_bodyB.c_position.c,m=this.m_bodyB.c_position.a,c=p.neo(o),h=p.neo(m),_=0,l=this.m_invIA+this.m_invIB==0;if(this.m_enableLimit&&0!=this.m_limitState&&0==l){var u=m-o-this.m_referenceAngle,y=0;if(3==this.m_limitState){var d=n.clamp(u-this.m_lowerAngle,-a.maxAngularCorrection,a.maxAngularCorrection);y=-this.m_motorMass*d,_=n.abs(d)}else if(1==this.m_limitState){_=-(d=u-this.m_lowerAngle),d=n.clamp(d+a.angularSlop,-a.maxAngularCorrection,0),y=-this.m_motorMass*d}else if(2==this.m_limitState){_=d=u-this.m_upperAngle,d=n.clamp(d-a.angularSlop,0,a.maxAngularCorrection),y=-this.m_motorMass*d}o-=this.m_invIA*y,m+=this.m_invIB*y}c.setAngle(o),h.setAngle(m);var f=p.mulVec2(c,r.sub(this.m_localAnchorA,this.m_localCenterA)),v=p.mulVec2(h,r.sub(this.m_localAnchorB,this.m_localCenterB));(d=r.zero()).addCombine(1,s,1,v),d.subCombine(1,i,1,f),e=d.length();var x=this.m_invMassA,A=this.m_invMassB,g=this.m_invIA,b=this.m_invIB,B=new et;B.ex.x=x+A+g*f.y*f.y+b*v.y*v.y,B.ex.y=-g*f.x*f.y-b*v.x*v.y,B.ey.x=B.ex.y,B.ey.y=x+A+g*f.x*f.x+b*v.x*v.x;var V=r.neg(B.solve(d));return i.subMul(x,V),o-=g*r.crossVec2Vec2(f,V),s.addMul(A,V),m+=b*r.crossVec2Vec2(v,V),this.m_bodyA.c_position.c.setVec2(i),this.m_bodyA.c_position.a=o,this.m_bodyB.c_position.c.setVec2(s),this.m_bodyB.c_position.a=m,e<=a.linearSlop&&_<=a.angularSlop},e.TYPE="revolute-joint",e}(z),Nt={enableLimit:!1,lowerTranslation:0,upperTranslation:0,enableMotor:!1,maxMotorForce:0,motorSpeed:0},kt=function(t){function e(i,o,m,a,c){var h=this;return h instanceof e?(i=s(i,Nt),o=(h=t.call(this,i,o,m)||this).m_bodyA,m=h.m_bodyB,h.m_type=e.TYPE,h.m_localAnchorA=r.clone(a?o.getLocalPoint(a):i.localAnchorA||r.zero()),h.m_localAnchorB=r.clone(a?m.getLocalPoint(a):i.localAnchorB||r.zero()),h.m_localXAxisA=r.clone(c?o.getLocalVector(c):i.localAxisA||r.neo(1,0)),h.m_localXAxisA.normalize(),h.m_localYAxisA=r.crossNumVec2(1,h.m_localXAxisA),h.m_referenceAngle=n.isFinite(i.referenceAngle)?i.referenceAngle:m.getAngle()-o.getAngle(),h.m_impulse=new vt,h.m_motorMass=0,h.m_motorImpulse=0,h.m_lowerTranslation=i.lowerTranslation,h.m_upperTranslation=i.upperTranslation,h.m_maxMotorForce=i.maxMotorForce,h.m_motorSpeed=i.motorSpeed,h.m_enableLimit=i.enableLimit,h.m_enableMotor=i.enableMotor,h.m_limitState=0,h.m_axis=r.zero(),h.m_perp=r.zero(),h.m_K=new Ft,h):new e(i,o,m,a,c)}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,lowerTranslation:this.m_lowerTranslation,upperTranslation:this.m_upperTranslation,maxMotorForce:this.m_maxMotorForce,motorSpeed:this.m_motorSpeed,enableLimit:this.m_enableLimit,enableMotor:this.m_enableMotor,localAnchorA:this.m_localAnchorA,localAnchorB:this.m_localAnchorB,localAxisA:this.m_localXAxisA,referenceAngle:this.m_referenceAngle}},e._deserialize=function(t,i,s){return(t=o({},t)).bodyA=s(I,t.bodyA,i),t.bodyB=s(I,t.bodyB,i),t.localAxisA=r.clone(t.localAxisA),new e(t)},e.prototype._setAnchors=function(t){t.anchorA?this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(t.anchorA)):t.localAnchorA&&this.m_localAnchorA.setVec2(t.localAnchorA),t.anchorB?this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(t.anchorB)):t.localAnchorB&&this.m_localAnchorB.setVec2(t.localAnchorB),t.localAxisA&&(this.m_localXAxisA.setVec2(t.localAxisA),this.m_localYAxisA.setVec2(r.crossNumVec2(1,t.localAxisA)))},e.prototype.getLocalAnchorA=function(){return this.m_localAnchorA},e.prototype.getLocalAnchorB=function(){return this.m_localAnchorB},e.prototype.getLocalAxisA=function(){return this.m_localXAxisA},e.prototype.getReferenceAngle=function(){return this.m_referenceAngle},e.prototype.getJointTranslation=function(){var t=this.m_bodyA.getWorldPoint(this.m_localAnchorA),e=this.m_bodyB.getWorldPoint(this.m_localAnchorB),i=r.sub(e,t),o=this.m_bodyA.getWorldVector(this.m_localXAxisA);return r.dot(i,o)},e.prototype.getJointSpeed=function(){var t=this.m_bodyA,e=this.m_bodyB,i=p.mulVec2(t.m_xf.q,r.sub(this.m_localAnchorA,t.m_sweep.localCenter)),o=p.mulVec2(e.m_xf.q,r.sub(this.m_localAnchorB,e.m_sweep.localCenter)),s=r.add(t.m_sweep.c,i),n=r.add(e.m_sweep.c,o),m=r.sub(n,s),a=p.mulVec2(t.m_xf.q,this.m_localXAxisA),c=t.m_linearVelocity,h=e.m_linearVelocity,_=t.m_angularVelocity,l=e.m_angularVelocity;return r.dot(m,r.crossNumVec2(_,a))+r.dot(a,r.sub(r.addCrossNumVec2(h,l,o),r.addCrossNumVec2(c,_,i)))},e.prototype.isLimitEnabled=function(){return this.m_enableLimit},e.prototype.enableLimit=function(t){t!=this.m_enableLimit&&(this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableLimit=t,this.m_impulse.z=0)},e.prototype.getLowerLimit=function(){return this.m_lowerTranslation},e.prototype.getUpperLimit=function(){return this.m_upperTranslation},e.prototype.setLimits=function(t,e){t==this.m_lowerTranslation&&e==this.m_upperTranslation||(this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_lowerTranslation=t,this.m_upperTranslation=e,this.m_impulse.z=0)},e.prototype.isMotorEnabled=function(){return this.m_enableMotor},e.prototype.enableMotor=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableMotor=t},e.prototype.setMotorSpeed=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_motorSpeed=t},e.prototype.setMaxMotorForce=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_maxMotorForce=t},e.prototype.getMaxMotorForce=function(){return this.m_maxMotorForce},e.prototype.getMotorSpeed=function(){return this.m_motorSpeed},e.prototype.getMotorForce=function(t){return t*this.m_motorImpulse},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return r.combine(this.m_impulse.x,this.m_perp,this.m_motorImpulse+this.m_impulse.z,this.m_axis).mul(t)},e.prototype.getReactionTorque=function(t){return t*this.m_impulse.y},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyA.c_velocity.v,s=this.m_bodyA.c_velocity.w,m=this.m_bodyB.c_position.c,c=this.m_bodyB.c_position.a,h=this.m_bodyB.c_velocity.v,_=this.m_bodyB.c_velocity.w,l=p.neo(i),u=p.neo(c),y=p.mulVec2(l,r.sub(this.m_localAnchorA,this.m_localCenterA)),d=p.mulVec2(u,r.sub(this.m_localAnchorB,this.m_localCenterB)),f=r.zero();f.addCombine(1,m,1,d),f.subCombine(1,e,1,y);var v=this.m_invMassA,x=this.m_invMassB,A=this.m_invIA,g=this.m_invIB;this.m_axis=p.mulVec2(l,this.m_localXAxisA),this.m_a1=r.crossVec2Vec2(r.add(f,y),this.m_axis),this.m_a2=r.crossVec2Vec2(d,this.m_axis),this.m_motorMass=v+x+A*this.m_a1*this.m_a1+g*this.m_a2*this.m_a2,this.m_motorMass>0&&(this.m_motorMass=1/this.m_motorMass),this.m_perp=p.mulVec2(l,this.m_localYAxisA),this.m_s1=r.crossVec2Vec2(r.add(f,y),this.m_perp),this.m_s2=r.crossVec2Vec2(d,this.m_perp),r.crossVec2Vec2(y,this.m_perp);var b=v+x+A*this.m_s1*this.m_s1+g*this.m_s2*this.m_s2,B=A*this.m_s1+g*this.m_s2,V=A*this.m_s1*this.m_a1+g*this.m_s2*this.m_a2,w=A+g;0==w&&(w=1);var C=A*this.m_a1+g*this.m_a2,M=v+x+A*this.m_a1*this.m_a1+g*this.m_a2*this.m_a2;if(this.m_K.ex.set(b,B,V),this.m_K.ey.set(B,w,C),this.m_K.ez.set(V,C,M),this.m_enableLimit){var I=r.dot(this.m_axis,f);n.abs(this.m_upperTranslation-this.m_lowerTranslation)<2*a.linearSlop?this.m_limitState=3:I<=this.m_lowerTranslation?1!=this.m_limitState&&(this.m_limitState=1,this.m_impulse.z=0):I>=this.m_upperTranslation?2!=this.m_limitState&&(this.m_limitState=2,this.m_impulse.z=0):(this.m_limitState=0,this.m_impulse.z=0)}else this.m_limitState=0,this.m_impulse.z=0;if(0==this.m_enableMotor&&(this.m_motorImpulse=0),t.warmStarting){this.m_impulse.mul(t.dtRatio),this.m_motorImpulse*=t.dtRatio;var S=r.combine(this.m_impulse.x,this.m_perp,this.m_motorImpulse+this.m_impulse.z,this.m_axis),z=this.m_impulse.x*this.m_s1+this.m_impulse.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_a1,P=this.m_impulse.x*this.m_s2+this.m_impulse.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_a2;o.subMul(v,S),s-=A*z,h.addMul(x,S),_+=g*P}else this.m_impulse.setZero(),this.m_motorImpulse=0;this.m_bodyA.c_velocity.v.setVec2(o),this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v.setVec2(h),this.m_bodyB.c_velocity.w=_},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,m=this.m_invMassA,a=this.m_invMassB,c=this.m_invIA,h=this.m_invIB;if(this.m_enableMotor&&3!=this.m_limitState){var _=r.dot(this.m_axis,r.sub(o,e))+this.m_a2*s-this.m_a1*i,l=this.m_motorMass*(this.m_motorSpeed-_),u=this.m_motorImpulse,p=t.dt*this.m_maxMotorForce;this.m_motorImpulse=n.clamp(this.m_motorImpulse+l,-p,p),l=this.m_motorImpulse-u;var y=r.mulNumVec2(l,this.m_axis),d=l*this.m_a1,f=l*this.m_a2;e.subMul(m,y),i-=c*d,o.addMul(a,y),s+=h*f}var v=r.zero();if(v.x+=r.dot(this.m_perp,o)+this.m_s2*s,v.x-=r.dot(this.m_perp,e)+this.m_s1*i,v.y=s-i,this.m_enableLimit&&0!=this.m_limitState){var x=0;x+=r.dot(this.m_axis,o)+this.m_a2*s,x-=r.dot(this.m_axis,e)+this.m_a1*i;_=new vt(v.x,v.y,x);var A=vt.clone(this.m_impulse),g=this.m_K.solve33(vt.neg(_));this.m_impulse.add(g),1==this.m_limitState?this.m_impulse.z=n.max(this.m_impulse.z,0):2==this.m_limitState&&(this.m_impulse.z=n.min(this.m_impulse.z,0));var b=r.combine(-1,v,-(this.m_impulse.z-A.z),r.neo(this.m_K.ez.x,this.m_K.ez.y)),B=r.add(this.m_K.solve22(b),r.neo(A.x,A.y));this.m_impulse.x=B.x,this.m_impulse.y=B.y,g=vt.sub(this.m_impulse,A);y=r.combine(g.x,this.m_perp,g.z,this.m_axis),d=g.x*this.m_s1+g.y+g.z*this.m_a1,f=g.x*this.m_s2+g.y+g.z*this.m_a2;e.subMul(m,y),i-=c*d,o.addMul(a,y),s+=h*f}else{g=this.m_K.solve22(r.neg(v));this.m_impulse.x+=g.x,this.m_impulse.y+=g.y;y=r.mulNumVec2(g.x,this.m_perp),d=g.x*this.m_s1+g.y,f=g.x*this.m_s2+g.y;e.subMul(m,y),i-=c*d,o.addMul(a,y),s+=h*f}this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyB.c_position.c,s=this.m_bodyB.c_position.a,m=p.neo(i),c=p.neo(s),h=this.m_invMassA,_=this.m_invMassB,l=this.m_invIA,u=this.m_invIB,y=p.mulVec2(m,r.sub(this.m_localAnchorA,this.m_localCenterA)),d=p.mulVec2(c,r.sub(this.m_localAnchorB,this.m_localCenterB)),f=r.sub(r.add(o,d),r.add(e,y)),v=p.mulVec2(m,this.m_localXAxisA),x=r.crossVec2Vec2(r.add(f,y),v),A=r.crossVec2Vec2(d,v),g=p.mulVec2(m,this.m_localYAxisA),b=r.crossVec2Vec2(r.add(f,y),g),B=r.crossVec2Vec2(d,g),V=new vt,w=r.zero();w.x=r.dot(g,f),w.y=s-i-this.m_referenceAngle;var C=n.abs(w.x),M=n.abs(w.y),I=a.linearSlop,S=a.maxLinearCorrection,z=!1,P=0;if(this.m_enableLimit){var T=r.dot(v,f);n.abs(this.m_upperTranslation-this.m_lowerTranslation)<2*I?(P=n.clamp(T,-S,S),C=n.max(C,n.abs(T)),z=!0):T<=this.m_lowerTranslation?(P=n.clamp(T-this.m_lowerTranslation+I,-S,0),C=n.max(C,this.m_lowerTranslation-T),z=!0):T>=this.m_upperTranslation&&(P=n.clamp(T-this.m_upperTranslation-I,0,S),C=n.max(C,T-this.m_upperTranslation),z=!0)}if(z){var F=h+_+l*b*b+u*B*B,L=l*b+u*B,q=l*b*x+u*B*A;0==(j=l+u)&&(j=1);var N=l*x+u*A,k=h+_+l*x*x+u*A*A;(O=new Ft).ex.set(F,L,q),O.ey.set(L,j,N),O.ez.set(q,N,k);var D=new vt;D.x=w.x,D.y=w.y,D.z=P,V=O.solve33(vt.neg(D))}else{var j,O;F=h+_+l*b*b+u*B*B,L=l*b+u*B;0==(j=l+u)&&(j=1),(O=new et).ex.setNum(F,L),O.ey.setNum(L,j);var R=O.solve(r.neg(w));V.x=R.x,V.y=R.y,V.z=0}var E=r.combine(V.x,g,V.z,v),J=V.x*b+V.y+V.z*x,Y=V.x*B+V.y+V.z*A;return e.subMul(h,E),i-=l*J,o.addMul(_,E),s+=u*Y,this.m_bodyA.c_position.c=e,this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c=o,this.m_bodyB.c_position.a=s,C<=a.linearSlop&&M<=a.angularSlop},e.TYPE="prismatic-joint",e}(z),Dt={ratio:1},jt=function(t){function e(i,o,m,a,c,h){var _,l,u=this;if(!(u instanceof e))return new e(i,o,m,a,c,h);i=s(i,Dt),o=(u=t.call(this,i,o,m)||this).m_bodyA,m=u.m_bodyB,u.m_type=e.TYPE,u.m_joint1=a||i.joint1,u.m_joint2=c||i.joint2,u.m_ratio=n.isFinite(h)?h:i.ratio,u.m_type1=u.m_joint1.getType(),u.m_type2=u.m_joint2.getType(),u.m_bodyC=u.m_joint1.getBodyA(),u.m_bodyA=u.m_joint1.getBodyB();var y=u.m_bodyA.m_xf,d=u.m_bodyA.m_sweep.a,f=u.m_bodyC.m_xf,v=u.m_bodyC.m_sweep.a;if(u.m_type1===qt.TYPE){var x=u.m_joint1;u.m_localAnchorC=x.m_localAnchorA,u.m_localAnchorA=x.m_localAnchorB,u.m_referenceAngleA=x.m_referenceAngle,u.m_localAxisC=r.zero(),_=d-v-u.m_referenceAngleA}else{var A=u.m_joint1;u.m_localAnchorC=A.m_localAnchorA,u.m_localAnchorA=A.m_localAnchorB,u.m_referenceAngleA=A.m_referenceAngle,u.m_localAxisC=A.m_localXAxisA;var g=u.m_localAnchorC,b=p.mulTVec2(f.q,r.add(p.mulVec2(y.q,u.m_localAnchorA),r.sub(y.p,f.p)));_=r.dot(b,u.m_localAxisC)-r.dot(g,u.m_localAxisC)}u.m_bodyD=u.m_joint2.getBodyA(),u.m_bodyB=u.m_joint2.getBodyB();var B=u.m_bodyB.m_xf,V=u.m_bodyB.m_sweep.a,w=u.m_bodyD.m_xf,C=u.m_bodyD.m_sweep.a;if(u.m_type2===qt.TYPE){x=u.m_joint2;u.m_localAnchorD=x.m_localAnchorA,u.m_localAnchorB=x.m_localAnchorB,u.m_referenceAngleB=x.m_referenceAngle,u.m_localAxisD=r.zero(),l=V-C-u.m_referenceAngleB}else{A=u.m_joint2;u.m_localAnchorD=A.m_localAnchorA,u.m_localAnchorB=A.m_localAnchorB,u.m_referenceAngleB=A.m_referenceAngle,u.m_localAxisD=A.m_localXAxisA;var M=u.m_localAnchorD,I=p.mulTVec2(w.q,r.add(p.mulVec2(B.q,u.m_localAnchorB),r.sub(B.p,w.p)));l=r.dot(I,u.m_localAxisD)-r.dot(M,u.m_localAxisD)}return u.m_constant=_+u.m_ratio*l,u.m_impulse=0,u}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,joint1:this.m_joint1,joint2:this.m_joint2,ratio:this.m_ratio}},e._deserialize=function(t,i,s){return(t=o({},t)).bodyA=s(I,t.bodyA,i),t.bodyB=s(I,t.bodyB,i),t.joint1=s(z,t.joint1,i),t.joint2=s(z,t.joint2,i),new e(t)},e.prototype.getJoint1=function(){return this.m_joint1},e.prototype.getJoint2=function(){return this.m_joint2},e.prototype.setRatio=function(t){this.m_ratio=t},e.prototype.getRatio=function(){return this.m_ratio},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return r.mulNumVec2(this.m_impulse,this.m_JvAC).mul(t)},e.prototype.getReactionTorque=function(t){return t*(this.m_impulse*this.m_JwA)},e.prototype.initVelocityConstraints=function(t){this.m_lcA=this.m_bodyA.m_sweep.localCenter,this.m_lcB=this.m_bodyB.m_sweep.localCenter,this.m_lcC=this.m_bodyC.m_sweep.localCenter,this.m_lcD=this.m_bodyD.m_sweep.localCenter,this.m_mA=this.m_bodyA.m_invMass,this.m_mB=this.m_bodyB.m_invMass,this.m_mC=this.m_bodyC.m_invMass,this.m_mD=this.m_bodyD.m_invMass,this.m_iA=this.m_bodyA.m_invI,this.m_iB=this.m_bodyB.m_invI,this.m_iC=this.m_bodyC.m_invI,this.m_iD=this.m_bodyD.m_invI;var e=this.m_bodyA.c_position.a,i=this.m_bodyA.c_velocity.v,o=this.m_bodyA.c_velocity.w,s=this.m_bodyB.c_position.a,n=this.m_bodyB.c_velocity.v,m=this.m_bodyB.c_velocity.w,a=this.m_bodyC.c_position.a,c=this.m_bodyC.c_velocity.v,h=this.m_bodyC.c_velocity.w,_=this.m_bodyD.c_position.a,l=this.m_bodyD.c_velocity.v,u=this.m_bodyD.c_velocity.w,y=p.neo(e),d=p.neo(s),f=p.neo(a),v=p.neo(_);if(this.m_mass=0,this.m_type1==qt.TYPE)this.m_JvAC=r.zero(),this.m_JwA=1,this.m_JwC=1,this.m_mass+=this.m_iA+this.m_iC;else{var x=p.mulVec2(f,this.m_localAxisC),A=p.mulSub(f,this.m_localAnchorC,this.m_lcC),g=p.mulSub(y,this.m_localAnchorA,this.m_lcA);this.m_JvAC=x,this.m_JwC=r.crossVec2Vec2(A,x),this.m_JwA=r.crossVec2Vec2(g,x),this.m_mass+=this.m_mC+this.m_mA+this.m_iC*this.m_JwC*this.m_JwC+this.m_iA*this.m_JwA*this.m_JwA}if(this.m_type2==qt.TYPE)this.m_JvBD=r.zero(),this.m_JwB=this.m_ratio,this.m_JwD=this.m_ratio,this.m_mass+=this.m_ratio*this.m_ratio*(this.m_iB+this.m_iD);else{x=p.mulVec2(v,this.m_localAxisD);var b=p.mulSub(v,this.m_localAnchorD,this.m_lcD),B=p.mulSub(d,this.m_localAnchorB,this.m_lcB);this.m_JvBD=r.mulNumVec2(this.m_ratio,x),this.m_JwD=this.m_ratio*r.crossVec2Vec2(b,x),this.m_JwB=this.m_ratio*r.crossVec2Vec2(B,x),this.m_mass+=this.m_ratio*this.m_ratio*(this.m_mD+this.m_mB)+this.m_iD*this.m_JwD*this.m_JwD+this.m_iB*this.m_JwB*this.m_JwB}this.m_mass=this.m_mass>0?1/this.m_mass:0,t.warmStarting?(i.addMul(this.m_mA*this.m_impulse,this.m_JvAC),o+=this.m_iA*this.m_impulse*this.m_JwA,n.addMul(this.m_mB*this.m_impulse,this.m_JvBD),m+=this.m_iB*this.m_impulse*this.m_JwB,c.subMul(this.m_mC*this.m_impulse,this.m_JvAC),h-=this.m_iC*this.m_impulse*this.m_JwC,l.subMul(this.m_mD*this.m_impulse,this.m_JvBD),u-=this.m_iD*this.m_impulse*this.m_JwD):this.m_impulse=0,this.m_bodyA.c_velocity.v.setVec2(i),this.m_bodyA.c_velocity.w=o,this.m_bodyB.c_velocity.v.setVec2(n),this.m_bodyB.c_velocity.w=m,this.m_bodyC.c_velocity.v.setVec2(c),this.m_bodyC.c_velocity.w=h,this.m_bodyD.c_velocity.v.setVec2(l),this.m_bodyD.c_velocity.w=u},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=this.m_bodyC.c_velocity.v,m=this.m_bodyC.c_velocity.w,a=this.m_bodyD.c_velocity.v,c=this.m_bodyD.c_velocity.w,h=r.dot(this.m_JvAC,e)-r.dot(this.m_JvAC,n)+r.dot(this.m_JvBD,o)-r.dot(this.m_JvBD,a);h+=this.m_JwA*i-this.m_JwC*m+(this.m_JwB*s-this.m_JwD*c);var _=-this.m_mass*h;this.m_impulse+=_,e.addMul(this.m_mA*_,this.m_JvAC),i+=this.m_iA*_*this.m_JwA,o.addMul(this.m_mB*_,this.m_JvBD),s+=this.m_iB*_*this.m_JwB,n.subMul(this.m_mC*_,this.m_JvAC),m-=this.m_iC*_*this.m_JwC,a.subMul(this.m_mD*_,this.m_JvBD),c-=this.m_iD*_*this.m_JwD,this.m_bodyA.c_velocity.v.setVec2(e),this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v.setVec2(o),this.m_bodyB.c_velocity.w=s,this.m_bodyC.c_velocity.v.setVec2(n),this.m_bodyC.c_velocity.w=m,this.m_bodyD.c_velocity.v.setVec2(a),this.m_bodyD.c_velocity.w=c},e.prototype.solvePositionConstraints=function(t){var e,i,o,s,n,m,c,h,_=this.m_bodyA.c_position.c,l=this.m_bodyA.c_position.a,u=this.m_bodyB.c_position.c,y=this.m_bodyB.c_position.a,d=this.m_bodyC.c_position.c,f=this.m_bodyC.c_position.a,v=this.m_bodyD.c_position.c,x=this.m_bodyD.c_position.a,A=p.neo(l),g=p.neo(y),b=p.neo(f),B=p.neo(x),V=0;if(this.m_type1==qt.TYPE)o=r.zero(),n=1,c=1,V+=this.m_iA+this.m_iC,e=l-f-this.m_referenceAngleA;else{var w=p.mulVec2(b,this.m_localAxisC),C=p.mulSub(b,this.m_localAnchorC,this.m_lcC),M=p.mulSub(A,this.m_localAnchorA,this.m_lcA);o=w,c=r.crossVec2Vec2(C,w),n=r.crossVec2Vec2(M,w),V+=this.m_mC+this.m_mA+this.m_iC*c*c+this.m_iA*n*n;var I=r.sub(this.m_localAnchorC,this.m_lcC),S=p.mulTVec2(b,r.add(M,r.sub(_,d)));e=r.dot(r.sub(S,I),this.m_localAxisC)}if(this.m_type2==qt.TYPE)s=r.zero(),m=this.m_ratio,h=this.m_ratio,V+=this.m_ratio*this.m_ratio*(this.m_iB+this.m_iD),i=y-x-this.m_referenceAngleB;else{w=p.mulVec2(B,this.m_localAxisD);var z=p.mulSub(B,this.m_localAnchorD,this.m_lcD),P=p.mulSub(g,this.m_localAnchorB,this.m_lcB);s=r.mulNumVec2(this.m_ratio,w),h=this.m_ratio*r.crossVec2Vec2(z,w),m=this.m_ratio*r.crossVec2Vec2(P,w),V+=this.m_ratio*this.m_ratio*(this.m_mD+this.m_mB)+this.m_iD*h*h+this.m_iB*m*m;var T=r.sub(this.m_localAnchorD,this.m_lcD),F=p.mulTVec2(B,r.add(P,r.sub(u,v)));i=r.dot(F,this.m_localAxisD)-r.dot(T,this.m_localAxisD)}var L=e+this.m_ratio*i-this.m_constant,q=0;return V>0&&(q=-L/V),_.addMul(this.m_mA*q,o),l+=this.m_iA*q*n,u.addMul(this.m_mB*q,s),y+=this.m_iB*q*m,d.subMul(this.m_mC*q,o),f-=this.m_iC*q*c,v.subMul(this.m_mD*q,s),x-=this.m_iD*q*h,this.m_bodyA.c_position.c.setVec2(_),this.m_bodyA.c_position.a=l,this.m_bodyB.c_position.c.setVec2(u),this.m_bodyB.c_position.a=y,this.m_bodyC.c_position.c.setVec2(d),this.m_bodyC.c_position.a=f,this.m_bodyD.c_position.c.setVec2(v),this.m_bodyD.c_position.a=x,00&&(this.m_angularMass=1/this.m_angularMass),this.m_linearError=r.zero(),this.m_linearError.addCombine(1,n,1,this.m_rB),this.m_linearError.subCombine(1,e,1,this.m_rA),this.m_linearError.sub(p.mulVec2(h,this.m_linearOffset)),this.m_angularError=m-i-this.m_angularOffset,t.warmStarting){this.m_linearImpulse.mul(t.dtRatio),this.m_angularImpulse*=t.dtRatio;var v=r.neo(this.m_linearImpulse.x,this.m_linearImpulse.y);o.subMul(l,v),s-=y*(r.crossVec2Vec2(this.m_rA,v)+this.m_angularImpulse),a.addMul(u,v),c+=d*(r.crossVec2Vec2(this.m_rB,v)+this.m_angularImpulse)}else this.m_linearImpulse.setZero(),this.m_angularImpulse=0;this.m_bodyA.c_velocity.v=o,this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v=a,this.m_bodyB.c_velocity.w=c},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,m=this.m_invMassA,a=this.m_invMassB,c=this.m_invIA,h=this.m_invIB,_=t.dt,l=t.inv_dt,u=s-i+l*this.m_correctionFactor*this.m_angularError,p=-this.m_angularMass*u,y=this.m_angularImpulse,d=_*this.m_maxTorque;this.m_angularImpulse=n.clamp(this.m_angularImpulse+p,-d,d),i-=c*(p=this.m_angularImpulse-y),s+=h*p,(u=r.zero()).addCombine(1,o,1,r.crossNumVec2(s,this.m_rB)),u.subCombine(1,e,1,r.crossNumVec2(i,this.m_rA)),u.addMul(l*this.m_correctionFactor,this.m_linearError);p=r.neg(et.mulVec2(this.m_linearMass,u)),y=r.clone(this.m_linearImpulse);this.m_linearImpulse.add(p);d=_*this.m_maxForce;this.m_linearImpulse.clamp(d),p=r.sub(this.m_linearImpulse,y),e.subMul(m,p),i-=c*r.crossVec2Vec2(this.m_rA,p),o.addMul(a,p),s+=h*r.crossVec2Vec2(this.m_rB,p),this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){return!0},e.TYPE="motor-joint",e}(z),Et={maxForce:0,frequencyHz:5,dampingRatio:.7},Jt=function(t){function e(i,o,n,m){var a=this;return a instanceof e?(i=s(i,Et),o=(a=t.call(this,i,o,n)||this).m_bodyA,n=a.m_bodyB,a.m_type=e.TYPE,r.isValid(m)?a.m_targetA=r.clone(m):r.isValid(i.target)?a.m_targetA=r.clone(i.target):a.m_targetA=r.zero(),a.m_localAnchorB=y.mulTVec2(n.getTransform(),a.m_targetA),a.m_maxForce=i.maxForce,a.m_impulse=r.zero(),a.m_frequencyHz=i.frequencyHz,a.m_dampingRatio=i.dampingRatio,a.m_beta=0,a.m_gamma=0,a.m_rB=r.zero(),a.m_localCenterB=r.zero(),a.m_invMassB=0,a.m_invIB=0,a.m_mass=new et,a.m_C=r.zero(),a):new e(i,o,n,m)}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,target:this.m_targetA,maxForce:this.m_maxForce,frequencyHz:this.m_frequencyHz,dampingRatio:this.m_dampingRatio,_localAnchorB:this.m_localAnchorB}},e._deserialize=function(t,i,s){(t=o({},t)).bodyA=s(I,t.bodyA,i),t.bodyB=s(I,t.bodyB,i),t.target=r.clone(t.target);var n=new e(t);return t._localAnchorB&&(n.m_localAnchorB=t._localAnchorB),n},e.prototype.setTarget=function(t){0==this.m_bodyB.isAwake()&&this.m_bodyB.setAwake(!0),this.m_targetA=r.clone(t)},e.prototype.getTarget=function(){return this.m_targetA},e.prototype.setMaxForce=function(t){this.m_maxForce=t},e.prototype.getMaxForce=function(){return this.m_maxForce},e.prototype.setFrequency=function(t){this.m_frequencyHz=t},e.prototype.getFrequency=function(){return this.m_frequencyHz},e.prototype.setDampingRatio=function(t){this.m_dampingRatio=t},e.prototype.getDampingRatio=function(){return this.m_dampingRatio},e.prototype.getAnchorA=function(){return r.clone(this.m_targetA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return r.mulNumVec2(t,this.m_impulse)},e.prototype.getReactionTorque=function(t){return 0*t},e.prototype.shiftOrigin=function(t){this.m_targetA.sub(t)},e.prototype.initVelocityConstraints=function(t){this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyB.c_position,i=this.m_bodyB.c_velocity,o=e.c,s=e.a,m=i.v,a=i.w,c=p.neo(s),h=this.m_bodyB.getMass(),_=2*n.PI*this.m_frequencyHz,l=2*h*this.m_dampingRatio*_,u=h*(_*_),y=t.dt;this.m_gamma=y*(l+y*u),0!=this.m_gamma&&(this.m_gamma=1/this.m_gamma),this.m_beta=y*u*this.m_gamma,this.m_rB=p.mulVec2(c,r.sub(this.m_localAnchorB,this.m_localCenterB));var d=new et;d.ex.x=this.m_invMassB+this.m_invIB*this.m_rB.y*this.m_rB.y+this.m_gamma,d.ex.y=-this.m_invIB*this.m_rB.x*this.m_rB.y,d.ey.x=d.ex.y,d.ey.y=this.m_invMassB+this.m_invIB*this.m_rB.x*this.m_rB.x+this.m_gamma,this.m_mass=d.getInverse(),this.m_C.setVec2(o),this.m_C.addCombine(1,this.m_rB,-1,this.m_targetA),this.m_C.mul(this.m_beta),a*=.98,t.warmStarting?(this.m_impulse.mul(t.dtRatio),m.addMul(this.m_invMassB,this.m_impulse),a+=this.m_invIB*r.crossVec2Vec2(this.m_rB,this.m_impulse)):this.m_impulse.setZero(),i.v.setVec2(m),i.w=a},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyB.c_velocity,i=r.clone(e.v),o=e.w,s=r.crossNumVec2(o,this.m_rB);s.add(i),s.addCombine(1,this.m_C,this.m_gamma,this.m_impulse),s.neg();var n=et.mulVec2(this.m_mass,s),m=r.clone(this.m_impulse);this.m_impulse.add(n);var a=t.dt*this.m_maxForce;this.m_impulse.clamp(a),n=r.sub(this.m_impulse,m),i.addMul(this.m_invMassB,n),o+=this.m_invIB*r.crossVec2Vec2(this.m_rB,n),e.v.setVec2(i),e.w=o},e.prototype.solvePositionConstraints=function(t){return!0},e.TYPE="mouse-joint",e}(z),Yt={collideConnected:!0},Wt=function(t){function e(i,o,m,a,c,h,_,l){var u=this;return u instanceof e?(i=s(i,Yt),o=(u=t.call(this,i,o,m)||this).m_bodyA,m=u.m_bodyB,u.m_type=e.TYPE,u.m_groundAnchorA=a||(i.groundAnchorA||r.neo(-1,1)),u.m_groundAnchorB=c||(i.groundAnchorB||r.neo(1,1)),u.m_localAnchorA=h?o.getLocalPoint(h):i.localAnchorA||r.neo(-1,0),u.m_localAnchorB=_?m.getLocalPoint(_):i.localAnchorB||r.neo(1,0),u.m_lengthA=n.isFinite(i.lengthA)?i.lengthA:r.distance(h,a),u.m_lengthB=n.isFinite(i.lengthB)?i.lengthB:r.distance(_,c),u.m_ratio=n.isFinite(l)?l:i.ratio,u.m_constant=u.m_lengthA+u.m_ratio*u.m_lengthB,u.m_impulse=0,u):new e(i,o,m,a,c,h,_,l)}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,groundAnchorA:this.m_groundAnchorA,groundAnchorB:this.m_groundAnchorB,localAnchorA:this.m_localAnchorA,localAnchorB:this.m_localAnchorB,lengthA:this.m_lengthA,lengthB:this.m_lengthB,ratio:this.m_ratio}},e._deserialize=function(t,i,s){return(t=o({},t)).bodyA=s(I,t.bodyA,i),t.bodyB=s(I,t.bodyB,i),new e(t)},e.prototype.getGroundAnchorA=function(){return this.m_groundAnchorA},e.prototype.getGroundAnchorB=function(){return this.m_groundAnchorB},e.prototype.getLengthA=function(){return this.m_lengthA},e.prototype.getLengthB=function(){return this.m_lengthB},e.prototype.getRatio=function(){return this.m_ratio},e.prototype.getCurrentLengthA=function(){var t=this.m_bodyA.getWorldPoint(this.m_localAnchorA),e=this.m_groundAnchorA;return r.distance(t,e)},e.prototype.getCurrentLengthB=function(){var t=this.m_bodyB.getWorldPoint(this.m_localAnchorB),e=this.m_groundAnchorB;return r.distance(t,e)},e.prototype.shiftOrigin=function(t){this.m_groundAnchorA.sub(t),this.m_groundAnchorB.sub(t)},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return r.mulNumVec2(this.m_impulse,this.m_uB).mul(t)},e.prototype.getReactionTorque=function(t){return 0},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyA.c_velocity.v,s=this.m_bodyA.c_velocity.w,n=this.m_bodyB.c_position.c,m=this.m_bodyB.c_position.a,c=this.m_bodyB.c_velocity.v,h=this.m_bodyB.c_velocity.w,_=p.neo(i),l=p.neo(m);this.m_rA=p.mulVec2(_,r.sub(this.m_localAnchorA,this.m_localCenterA)),this.m_rB=p.mulVec2(l,r.sub(this.m_localAnchorB,this.m_localCenterB)),this.m_uA=r.sub(r.add(e,this.m_rA),this.m_groundAnchorA),this.m_uB=r.sub(r.add(n,this.m_rB),this.m_groundAnchorB);var u=this.m_uA.length(),y=this.m_uB.length();u>10*a.linearSlop?this.m_uA.mul(1/u):this.m_uA.setZero(),y>10*a.linearSlop?this.m_uB.mul(1/y):this.m_uB.setZero();var d=r.crossVec2Vec2(this.m_rA,this.m_uA),f=r.crossVec2Vec2(this.m_rB,this.m_uB),v=this.m_invMassA+this.m_invIA*d*d,x=this.m_invMassB+this.m_invIB*f*f;if(this.m_mass=v+this.m_ratio*this.m_ratio*x,this.m_mass>0&&(this.m_mass=1/this.m_mass),t.warmStarting){this.m_impulse*=t.dtRatio;var A=r.mulNumVec2(-this.m_impulse,this.m_uA),g=r.mulNumVec2(-this.m_ratio*this.m_impulse,this.m_uB);o.addMul(this.m_invMassA,A),s+=this.m_invIA*r.crossVec2Vec2(this.m_rA,A),c.addMul(this.m_invMassB,g),h+=this.m_invIB*r.crossVec2Vec2(this.m_rB,g)}else this.m_impulse=0;this.m_bodyA.c_velocity.v=o,this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v=c,this.m_bodyB.c_velocity.w=h},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=r.add(e,r.crossNumVec2(i,this.m_rA)),m=r.add(o,r.crossNumVec2(s,this.m_rB)),a=-r.dot(this.m_uA,n)-this.m_ratio*r.dot(this.m_uB,m),c=-this.m_mass*a;this.m_impulse+=c;var h=r.mulNumVec2(-c,this.m_uA),_=r.mulNumVec2(-this.m_ratio*c,this.m_uB);e.addMul(this.m_invMassA,h),i+=this.m_invIA*r.crossVec2Vec2(this.m_rA,h),o.addMul(this.m_invMassB,_),s+=this.m_invIB*r.crossVec2Vec2(this.m_rB,_),this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyB.c_position.c,s=this.m_bodyB.c_position.a,m=p.neo(i),c=p.neo(s),h=p.mulVec2(m,r.sub(this.m_localAnchorA,this.m_localCenterA)),_=p.mulVec2(c,r.sub(this.m_localAnchorB,this.m_localCenterB)),l=r.sub(r.add(e,this.m_rA),this.m_groundAnchorA),u=r.sub(r.add(o,this.m_rB),this.m_groundAnchorB),y=l.length(),d=u.length();y>10*a.linearSlop?l.mul(1/y):l.setZero(),d>10*a.linearSlop?u.mul(1/d):u.setZero();var f=r.crossVec2Vec2(h,l),v=r.crossVec2Vec2(_,u),x=this.m_invMassA+this.m_invIA*f*f,A=this.m_invMassB+this.m_invIB*v*v,g=x+this.m_ratio*this.m_ratio*A;g>0&&(g=1/g);var b=this.m_constant-y-this.m_ratio*d,B=n.abs(b),V=-g*b,w=r.mulNumVec2(-V,l),C=r.mulNumVec2(-this.m_ratio*V,u);return e.addMul(this.m_invMassA,w),i+=this.m_invIA*r.crossVec2Vec2(h,w),o.addMul(this.m_invMassB,C),s+=this.m_invIB*r.crossVec2Vec2(_,C),this.m_bodyA.c_position.c=e,this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c=o,this.m_bodyB.c_position.a=s,B0?2:0,!(this.m_length>a.linearSlop))return this.m_u.setZero(),this.m_mass=0,void(this.m_impulse=0);this.m_u.mul(1/this.m_length);var y=r.crossVec2Vec2(this.m_rA,this.m_u),d=r.crossVec2Vec2(this.m_rB,this.m_u),f=this.m_invMassA+this.m_invIA*y*y+this.m_invMassB+this.m_invIB*d*d;if(this.m_mass=0!=f?1/f:0,t.warmStarting){this.m_impulse*=t.dtRatio;var v=r.mulNumVec2(this.m_impulse,this.m_u);o.subMul(this.m_invMassA,v),s-=this.m_invIA*r.crossVec2Vec2(this.m_rA,v),c.addMul(this.m_invMassB,v),h+=this.m_invIB*r.crossVec2Vec2(this.m_rB,v)}else this.m_impulse=0;this.m_bodyA.c_velocity.v.setVec2(o),this.m_bodyA.c_velocity.w=s,this.m_bodyB.c_velocity.v.setVec2(c),this.m_bodyB.c_velocity.w=h},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,m=r.addCrossNumVec2(e,i,this.m_rA),a=r.addCrossNumVec2(o,s,this.m_rB),c=this.m_length-this.m_maxLength,h=r.dot(this.m_u,r.sub(a,m));c<0&&(h+=t.inv_dt*c);var _=-this.m_mass*h,l=this.m_impulse;this.m_impulse=n.min(0,this.m_impulse+_),_=this.m_impulse-l;var u=r.mulNumVec2(_,this.m_u);e.subMul(this.m_invMassA,u),i-=this.m_invIA*r.crossVec2Vec2(this.m_rA,u),o.addMul(this.m_invMassB,u),s+=this.m_invIB*r.crossVec2Vec2(this.m_rB,u),this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyB.c_position.c,s=this.m_bodyB.c_position.a,m=p.neo(i),c=p.neo(s),h=p.mulSub(m,this.m_localAnchorA,this.m_localCenterA),_=p.mulSub(c,this.m_localAnchorB,this.m_localCenterB),l=r.zero();l.addCombine(1,o,1,_),l.subCombine(1,e,1,h);var u=l.normalize(),y=u-this.m_maxLength;y=n.clamp(y,0,a.maxLinearCorrection);var d=-this.m_mass*y,f=r.mulNumVec2(d,l);return e.subMul(this.m_invMassA,f),i-=this.m_invIA*r.crossVec2Vec2(h,f),o.addMul(this.m_invMassB,f),s+=this.m_invIB*r.crossVec2Vec2(_,f),this.m_bodyA.c_position.c.setVec2(e),this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c.setVec2(o),this.m_bodyB.c_position.a=s,u-this.m_maxLength0){d.getInverse22(this.m_mass);var f=u+y,v=f>0?1/f:0,x=s-e-this.m_referenceAngle,A=2*n.PI*this.m_frequencyHz,g=2*v*this.m_dampingRatio*A,b=v*A*A,B=t.dt;this.m_gamma=B*(g+B*b),this.m_gamma=0!=this.m_gamma?1/this.m_gamma:0,this.m_bias=x*B*b*this.m_gamma,f+=this.m_gamma,this.m_mass.ez.z=0!=f?1/f:0}else 0==d.ez.z?(d.getInverse22(this.m_mass),this.m_gamma=0,this.m_bias=0):(d.getSymInverse33(this.m_mass),this.m_gamma=0,this.m_bias=0);if(t.warmStarting){this.m_impulse.mul(t.dtRatio);var V=r.neo(this.m_impulse.x,this.m_impulse.y);i.subMul(_,V),o-=u*(r.crossVec2Vec2(this.m_rA,V)+this.m_impulse.z),m.addMul(l,V),a+=y*(r.crossVec2Vec2(this.m_rB,V)+this.m_impulse.z)}else this.m_impulse.setZero();this.m_bodyA.c_velocity.v=i,this.m_bodyA.c_velocity.w=o,this.m_bodyB.c_velocity.v=m,this.m_bodyB.c_velocity.w=a},e.prototype.solveVelocityConstraints=function(t){var e=this.m_bodyA.c_velocity.v,i=this.m_bodyA.c_velocity.w,o=this.m_bodyB.c_velocity.v,s=this.m_bodyB.c_velocity.w,n=this.m_invMassA,m=this.m_invMassB,a=this.m_invIA,c=this.m_invIB;if(this.m_frequencyHz>0){var h=s-i,_=-this.m_mass.ez.z*(h+this.m_bias+this.m_gamma*this.m_impulse.z);this.m_impulse.z+=_,i-=a*_,s+=c*_,(p=r.zero()).addCombine(1,o,1,r.crossNumVec2(s,this.m_rB)),p.subCombine(1,e,1,r.crossNumVec2(i,this.m_rA));var l=r.neg(Ft.mulVec2(this.m_mass,p));this.m_impulse.x+=l.x,this.m_impulse.y+=l.y;var u=r.clone(l);e.subMul(n,u),i-=a*r.crossVec2Vec2(this.m_rA,u),o.addMul(m,u),s+=c*r.crossVec2Vec2(this.m_rB,u)}else{var p;(p=r.zero()).addCombine(1,o,1,r.crossNumVec2(s,this.m_rB)),p.subCombine(1,e,1,r.crossNumVec2(i,this.m_rA));h=s-i;var y=new vt(p.x,p.y,h),d=vt.neg(Ft.mulVec3(this.m_mass,y));this.m_impulse.add(d);u=r.neo(d.x,d.y);e.subMul(n,u),i-=a*(r.crossVec2Vec2(this.m_rA,u)+d.z),o.addMul(m,u),s+=c*(r.crossVec2Vec2(this.m_rB,u)+d.z)}this.m_bodyA.c_velocity.v=e,this.m_bodyA.c_velocity.w=i,this.m_bodyB.c_velocity.v=o,this.m_bodyB.c_velocity.w=s},e.prototype.solvePositionConstraints=function(t){var e,i,o=this.m_bodyA.c_position.c,s=this.m_bodyA.c_position.a,m=this.m_bodyB.c_position.c,c=this.m_bodyB.c_position.a,h=p.neo(s),_=p.neo(c),l=this.m_invMassA,u=this.m_invMassB,y=this.m_invIA,d=this.m_invIB,f=p.mulVec2(h,r.sub(this.m_localAnchorA,this.m_localCenterA)),v=p.mulVec2(_,r.sub(this.m_localAnchorB,this.m_localCenterB)),x=new Ft;if(x.ex.x=l+u+f.y*f.y*y+v.y*v.y*d,x.ey.x=-f.y*f.x*y-v.y*v.x*d,x.ez.x=-f.y*y-v.y*d,x.ex.y=x.ey.x,x.ey.y=l+u+f.x*f.x*y+v.x*v.x*d,x.ez.y=f.x*y+v.x*d,x.ex.z=x.ez.x,x.ey.z=x.ez.y,x.ez.z=y+d,this.m_frequencyHz>0){(g=r.zero()).addCombine(1,m,1,v),g.subCombine(1,o,1,f),e=g.length(),i=0;var A=r.neg(x.solve22(g));o.subMul(l,A),s-=y*r.crossVec2Vec2(f,A),m.addMul(u,A),c+=d*r.crossVec2Vec2(v,A)}else{var g;(g=r.zero()).addCombine(1,m,1,v),g.subCombine(1,o,1,f);var b=c-s-this.m_referenceAngle;e=g.length(),i=n.abs(b);var B=new vt(g.x,g.y,b),V=new vt;if(x.ez.z>0)V=vt.neg(x.solve33(B));else{var w=r.neg(x.solve22(g));V.set(w.x,w.y,0)}A=r.neo(V.x,V.y);o.subMul(l,A),s-=y*(r.crossVec2Vec2(f,A)+V.z),m.addMul(u,A),c+=d*(r.crossVec2Vec2(v,A)+V.z)}return this.m_bodyA.c_position.c=o,this.m_bodyA.c_position.a=s,this.m_bodyB.c_position.c=m,this.m_bodyB.c_position.a=c,e<=a.linearSlop&&i<=a.angularSlop},e.TYPE="weld-joint",e}(z),Gt={enableMotor:!1,maxMotorTorque:0,motorSpeed:0,frequencyHz:2,dampingRatio:.7},Ut=function(t){function e(i,o,n,m,a){var c=this;return c instanceof e?(i=s(i,Gt),(c=t.call(this,i,o,n)||this).m_ax=r.zero(),c.m_ay=r.zero(),o=c.m_bodyA,n=c.m_bodyB,c.m_type=e.TYPE,c.m_localAnchorA=r.clone(m?o.getLocalPoint(m):i.localAnchorA||r.zero()),c.m_localAnchorB=r.clone(m?n.getLocalPoint(m):i.localAnchorB||r.zero()),c.m_localXAxisA=r.clone(a?o.getLocalVector(a):i.localAxisA||i.localAxis||r.neo(1,0)),c.m_localYAxisA=r.crossNumVec2(1,c.m_localXAxisA),c.m_mass=0,c.m_impulse=0,c.m_motorMass=0,c.m_motorImpulse=0,c.m_springMass=0,c.m_springImpulse=0,c.m_maxMotorTorque=i.maxMotorTorque,c.m_motorSpeed=i.motorSpeed,c.m_enableMotor=i.enableMotor,c.m_frequencyHz=i.frequencyHz,c.m_dampingRatio=i.dampingRatio,c.m_bias=0,c.m_gamma=0,c):new e(i,o,n,m,a)}return i(e,t),e.prototype._serialize=function(){return{type:this.m_type,bodyA:this.m_bodyA,bodyB:this.m_bodyB,collideConnected:this.m_collideConnected,enableMotor:this.m_enableMotor,maxMotorTorque:this.m_maxMotorTorque,motorSpeed:this.m_motorSpeed,frequencyHz:this.m_frequencyHz,dampingRatio:this.m_dampingRatio,localAnchorA:this.m_localAnchorA,localAnchorB:this.m_localAnchorB,localAxisA:this.m_localXAxisA}},e._deserialize=function(t,i,s){return(t=o({},t)).bodyA=s(I,t.bodyA,i),t.bodyB=s(I,t.bodyB,i),new e(t)},e.prototype._setAnchors=function(t){t.anchorA?this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(t.anchorA)):t.localAnchorA&&this.m_localAnchorA.setVec2(t.localAnchorA),t.anchorB?this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(t.anchorB)):t.localAnchorB&&this.m_localAnchorB.setVec2(t.localAnchorB),t.localAxisA&&(this.m_localXAxisA.setVec2(t.localAxisA),this.m_localYAxisA.setVec2(r.crossNumVec2(1,t.localAxisA)))},e.prototype.getLocalAnchorA=function(){return this.m_localAnchorA},e.prototype.getLocalAnchorB=function(){return this.m_localAnchorB},e.prototype.getLocalAxisA=function(){return this.m_localXAxisA},e.prototype.getJointTranslation=function(){var t=this.m_bodyA,e=this.m_bodyB,i=t.getWorldPoint(this.m_localAnchorA),o=e.getWorldPoint(this.m_localAnchorB),s=r.sub(o,i),n=t.getWorldVector(this.m_localXAxisA);return r.dot(s,n)},e.prototype.getJointSpeed=function(){var t=this.m_bodyA.m_angularVelocity;return this.m_bodyB.m_angularVelocity-t},e.prototype.isMotorEnabled=function(){return this.m_enableMotor},e.prototype.enableMotor=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_enableMotor=t},e.prototype.setMotorSpeed=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_motorSpeed=t},e.prototype.getMotorSpeed=function(){return this.m_motorSpeed},e.prototype.setMaxMotorTorque=function(t){this.m_bodyA.setAwake(!0),this.m_bodyB.setAwake(!0),this.m_maxMotorTorque=t},e.prototype.getMaxMotorTorque=function(){return this.m_maxMotorTorque},e.prototype.getMotorTorque=function(t){return t*this.m_motorImpulse},e.prototype.setSpringFrequencyHz=function(t){this.m_frequencyHz=t},e.prototype.getSpringFrequencyHz=function(){return this.m_frequencyHz},e.prototype.setSpringDampingRatio=function(t){this.m_dampingRatio=t},e.prototype.getSpringDampingRatio=function(){return this.m_dampingRatio},e.prototype.getAnchorA=function(){return this.m_bodyA.getWorldPoint(this.m_localAnchorA)},e.prototype.getAnchorB=function(){return this.m_bodyB.getWorldPoint(this.m_localAnchorB)},e.prototype.getReactionForce=function(t){return r.combine(this.m_impulse,this.m_ay,this.m_springImpulse,this.m_ax).mul(t)},e.prototype.getReactionTorque=function(t){return t*this.m_motorImpulse},e.prototype.initVelocityConstraints=function(t){this.m_localCenterA=this.m_bodyA.m_sweep.localCenter,this.m_localCenterB=this.m_bodyB.m_sweep.localCenter,this.m_invMassA=this.m_bodyA.m_invMass,this.m_invMassB=this.m_bodyB.m_invMass,this.m_invIA=this.m_bodyA.m_invI,this.m_invIB=this.m_bodyB.m_invI;var e=this.m_invMassA,i=this.m_invMassB,o=this.m_invIA,s=this.m_invIB,m=this.m_bodyA.c_position.c,a=this.m_bodyA.c_position.a,c=this.m_bodyA.c_velocity.v,h=this.m_bodyA.c_velocity.w,_=this.m_bodyB.c_position.c,l=this.m_bodyB.c_position.a,u=this.m_bodyB.c_velocity.v,y=this.m_bodyB.c_velocity.w,d=p.neo(a),f=p.neo(l),v=p.mulVec2(d,r.sub(this.m_localAnchorA,this.m_localCenterA)),x=p.mulVec2(f,r.sub(this.m_localAnchorB,this.m_localCenterB)),A=r.zero();if(A.addCombine(1,_,1,x),A.subCombine(1,m,1,v),this.m_ay=p.mulVec2(d,this.m_localYAxisA),this.m_sAy=r.crossVec2Vec2(r.add(A,v),this.m_ay),this.m_sBy=r.crossVec2Vec2(x,this.m_ay),this.m_mass=e+i+o*this.m_sAy*this.m_sAy+s*this.m_sBy*this.m_sBy,this.m_mass>0&&(this.m_mass=1/this.m_mass),this.m_springMass=0,this.m_bias=0,this.m_gamma=0,this.m_frequencyHz>0){this.m_ax=p.mulVec2(d,this.m_localXAxisA),this.m_sAx=r.crossVec2Vec2(r.add(A,v),this.m_ax),this.m_sBx=r.crossVec2Vec2(x,this.m_ax);var g=e+i+o*this.m_sAx*this.m_sAx+s*this.m_sBx*this.m_sBx;if(g>0){this.m_springMass=1/g;var b=r.dot(A,this.m_ax),B=2*n.PI*this.m_frequencyHz,V=2*this.m_springMass*this.m_dampingRatio*B,w=this.m_springMass*B*B,C=t.dt;this.m_gamma=C*(V+C*w),this.m_gamma>0&&(this.m_gamma=1/this.m_gamma),this.m_bias=b*C*w*this.m_gamma,this.m_springMass=g+this.m_gamma,this.m_springMass>0&&(this.m_springMass=1/this.m_springMass)}}else this.m_springImpulse=0;if(this.m_enableMotor?(this.m_motorMass=o+s,this.m_motorMass>0&&(this.m_motorMass=1/this.m_motorMass)):(this.m_motorMass=0,this.m_motorImpulse=0),t.warmStarting){this.m_impulse*=t.dtRatio,this.m_springImpulse*=t.dtRatio,this.m_motorImpulse*=t.dtRatio;var M=r.combine(this.m_impulse,this.m_ay,this.m_springImpulse,this.m_ax),I=this.m_impulse*this.m_sAy+this.m_springImpulse*this.m_sAx+this.m_motorImpulse,S=this.m_impulse*this.m_sBy+this.m_springImpulse*this.m_sBx+this.m_motorImpulse;c.subMul(this.m_invMassA,M),h-=this.m_invIA*I,u.addMul(this.m_invMassB,M),y+=this.m_invIB*S}else this.m_impulse=0,this.m_springImpulse=0,this.m_motorImpulse=0;this.m_bodyA.c_velocity.v.setVec2(c),this.m_bodyA.c_velocity.w=h,this.m_bodyB.c_velocity.v.setVec2(u),this.m_bodyB.c_velocity.w=y},e.prototype.solveVelocityConstraints=function(t){var e=this.m_invMassA,i=this.m_invMassB,o=this.m_invIA,s=this.m_invIB,m=this.m_bodyA.c_velocity.v,a=this.m_bodyA.c_velocity.w,c=this.m_bodyB.c_velocity.v,h=this.m_bodyB.c_velocity.w,_=r.dot(this.m_ax,c)-r.dot(this.m_ax,m)+this.m_sBx*h-this.m_sAx*a,l=-this.m_springMass*(_+this.m_bias+this.m_gamma*this.m_springImpulse);this.m_springImpulse+=l;var u=r.mulNumVec2(l,this.m_ax),p=l*this.m_sAx,y=l*this.m_sBx;m.subMul(e,u),a-=o*p,c.addMul(i,u);_=(h+=s*y)-a-this.m_motorSpeed,l=-this.m_motorMass*_;var d=this.m_motorImpulse,f=t.dt*this.m_maxMotorTorque;this.m_motorImpulse=n.clamp(this.m_motorImpulse+l,-f,f),a-=o*(l=this.m_motorImpulse-d),h+=s*l;_=r.dot(this.m_ay,c)-r.dot(this.m_ay,m)+this.m_sBy*h-this.m_sAy*a,l=-this.m_mass*_;this.m_impulse+=l;u=r.mulNumVec2(l,this.m_ay),p=l*this.m_sAy,y=l*this.m_sBy;m.subMul(e,u),a-=o*p,c.addMul(i,u),h+=s*y,this.m_bodyA.c_velocity.v.setVec2(m),this.m_bodyA.c_velocity.w=a,this.m_bodyB.c_velocity.v.setVec2(c),this.m_bodyB.c_velocity.w=h},e.prototype.solvePositionConstraints=function(t){var e=this.m_bodyA.c_position.c,i=this.m_bodyA.c_position.a,o=this.m_bodyB.c_position.c,s=this.m_bodyB.c_position.a,m=p.neo(i),c=p.neo(s),h=p.mulVec2(m,r.sub(this.m_localAnchorA,this.m_localCenterA)),_=p.mulVec2(c,r.sub(this.m_localAnchorB,this.m_localCenterB)),l=r.zero();l.addCombine(1,o,1,_),l.subCombine(1,e,1,h);var u,y=p.mulVec2(m,this.m_localYAxisA),d=r.crossVec2Vec2(r.add(l,h),y),f=r.crossVec2Vec2(_,y),v=r.dot(l,y),x=this.m_invMassA+this.m_invMassB+this.m_invIA*this.m_sAy*this.m_sAy+this.m_invIB*this.m_sBy*this.m_sBy;u=0!=x?-v/x:0;var A=r.mulNumVec2(u,y),g=u*d,b=u*f;return e.subMul(this.m_invMassA,A),i-=this.m_invIA*g,o.addMul(this.m_invMassB,A),s+=this.m_invIB*b,this.m_bodyA.c_position.c.setVec2(e),this.m_bodyA.c_position.a=i,this.m_bodyB.c_position.c.setVec2(o),this.m_bodyB.c_position.a=s,n.abs(v)<=a.linearSlop},e.TYPE="wheel-joint",e}(z),Qt=0;function $t(t){var e,i=(t=t||{}).rootClass||ft,s=t.preSerialize||function(t){return t},n=t.postSerialize||function(t,e){return t},m=t.preDeserialize||function(t){return t},a=t.postDeserialize||function(t,e){return t},c={World:ft,Body:I,Joint:z,Fixture:b,Shape:x},h=o({Vec2:r,Vec3:vt},c),_=((e={})[I.STATIC]=I,e[I.DYNAMIC]=I,e[I.KINEMATIC]=I,e[gt.TYPE]=gt,e[wt.TYPE]=wt,e[xt.TYPE]=xt,e[Bt.TYPE]=Bt,e[Mt.TYPE]=Mt,e[zt.TYPE]=zt,e[Tt.TYPE]=Tt,e[jt.TYPE]=jt,e[Rt.TYPE]=Rt,e[Jt.TYPE]=Jt,e[kt.TYPE]=kt,e[Wt.TYPE]=Wt,e[qt.TYPE]=qt,e[Zt.TYPE]=Zt,e[Kt.TYPE]=Kt,e[Ut.TYPE]=Ut,e);this.toJson=function(t){var e=[],i=[t],o={};function r(t,s){if(t.__sid=t.__sid||++Qt,!o[t.__sid]){i.push(t);var n={refIndex:e.length+i.length,refType:s};o[t.__sid]=n}return o[t.__sid]}function m(t,e){if("object"!=typeof t||null===t)return t;if("function"==typeof t._serialize){if(t!==e)for(var i in c)if(t instanceof c[i])return r(t,i);t=function(t){var e=(t=s(t))._serialize();return n(e,t)}(t)}if(Array.isArray(t)){for(var o=[],a=0;ah*h||(e.type=t.ManifoldType.e_circles,e.localPoint.setVec2(i.m_p),e.localNormal.setZero(),e.pointCount=1,e.points[0].localPoint.setVec2(s.m_p),e.points[0].id.cf.indexA=0,e.points[0].id.cf.typeA=t.ContactFeatureType.e_vertex,e.points[0].id.cf.indexB=0,e.points[0].id.cf.typeB=t.ContactFeatureType.e_vertex)};yt.addType(xt.TYPE,Mt.TYPE,(function(t,e,i,o,s,n,r){var m=i.getShape(),a=n.getShape();ie(t,m,e,a,s)})),yt.addType(gt.TYPE,Mt.TYPE,(function(t,e,i,o,s,n,r){var m=i.getShape(),a=new xt;m.getChildEdge(a,o);var c=a,h=n.getShape();ie(t,c,e,h,s)}));var ie=function(e,i,o,s,n){e.pointCount=0;var m=y.mulTVec2(o,y.mulVec2(n,s.m_p)),a=i.m_vertex1,c=i.m_vertex2,h=r.sub(c,a),_=r.dot(h,r.sub(c,m)),l=r.dot(h,r.sub(m,a)),u=i.m_radius+s.m_radius;if(l<=0){var p=r.clone(a),d=r.sub(m,p);if(r.dot(d,d)>u*u)return;if(i.m_hasVertex0){var f=i.m_vertex0,v=a,x=r.sub(v,f);if(r.dot(x,r.sub(v,m))>0)return}return e.type=t.ManifoldType.e_circles,e.localNormal.setZero(),e.localPoint.setVec2(p),e.pointCount=1,e.points[0].localPoint.setVec2(s.m_p),e.points[0].id.cf.indexA=0,e.points[0].id.cf.typeA=t.ContactFeatureType.e_vertex,e.points[0].id.cf.indexB=0,void(e.points[0].id.cf.typeB=t.ContactFeatureType.e_vertex)}if(_<=0){var A=r.clone(c),g=r.sub(m,A);if(r.dot(g,g)>u*u)return;if(i.m_hasVertex3){var b=i.m_vertex3,B=c,V=r.sub(b,B);if(r.dot(V,r.sub(m,B))>0)return}return e.type=t.ManifoldType.e_circles,e.localNormal.setZero(),e.localPoint.setVec2(A),e.pointCount=1,e.points[0].localPoint.setVec2(s.m_p),e.points[0].id.cf.indexA=1,e.points[0].id.cf.typeA=t.ContactFeatureType.e_vertex,e.points[0].id.cf.indexB=0,void(e.points[0].id.cf.typeB=t.ContactFeatureType.e_vertex)}var w=r.dot(h,h),C=r.combine(_/w,a,l/w,c),M=r.sub(m,C);if(!(r.dot(M,M)>u*u)){var I=r.neo(-h.y,h.x);r.dot(I,r.sub(m,a))<0&&I.setNum(-I.x,-I.y),I.normalize(),e.type=t.ManifoldType.e_faceA,e.localNormal=I,e.localPoint.setVec2(a),e.pointCount=1,e.points[0].localPoint.setVec2(s.m_p),e.points[0].id.cf.indexA=0,e.points[0].id.cf.typeA=t.ContactFeatureType.e_face,e.points[0].id.cf.indexB=0,e.points[0].id.cf.typeB=t.ContactFeatureType.e_vertex}};function oe(t,e,i,o,s){for(var n=t.m_count,m=i.m_count,a=t.m_normals,c=t.m_vertices,h=i.m_vertices,_=y.mulTXf(o,e),l=0,u=-1/0,d=0;du&&(u=x,l=d)}s.maxSeparation=u,s.bestIndex=l}yt.addType(Bt.TYPE,Bt.TYPE,(function(t,e,i,o,s,n,r){ne(t,i.getShape(),e,n.getShape(),s)}));var se={maxSeparation:0,bestIndex:0},ne=function(e,i,o,s,n){e.pointCount=0;var m=i.m_radius+s.m_radius;oe(i,o,s,n,se);var c=se.bestIndex,h=se.maxSeparation;if(!(h>m)){oe(s,n,i,o,se);var _=se.bestIndex,l=se.maxSeparation;if(!(l>m)){var u,d,f,v,x,A;l>h+.1*a.linearSlop?(u=s,d=i,f=n,v=o,x=_,e.type=t.ManifoldType.e_faceB,A=1):(u=i,d=s,f=o,v=n,x=c,e.type=t.ManifoldType.e_faceA,A=0);var g=[new it,new it];!function(e,i,o,s,n,m){for(var a=i.m_normals,c=n.m_count,h=n.m_vertices,_=n.m_normals,l=p.mulTVec2(m.q,p.mulVec2(o.q,a[s])),u=0,d=1/0,f=0;fl)return;v>_&&(_=v,h=f)}var x=h,A=x+1l*l)return;e.pointCount=1,e.type=t.ManifoldType.e_faceA,e.localNormal.setCombine(1,c,-1,g),e.localNormal.normalize(),e.localPoint=g,e.points[0].localPoint.setVec2(s.m_p),e.points[0].id.cf.indexA=0,e.points[0].id.cf.typeA=t.ContactFeatureType.e_vertex,e.points[0].id.cf.indexB=0,e.points[0].id.cf.typeB=t.ContactFeatureType.e_vertex}else if(V<=0){if(r.distanceSquared(c,b)>l*l)return;e.pointCount=1,e.type=t.ManifoldType.e_faceA,e.localNormal.setCombine(1,c,-1,b),e.localNormal.normalize(),e.localPoint.setVec2(b),e.points[0].localPoint.setVec2(s.m_p),e.points[0].id.cf.indexA=0,e.points[0].id.cf.typeA=t.ContactFeatureType.e_vertex,e.points[0].id.cf.indexB=0,e.points[0].id.cf.typeB=t.ContactFeatureType.e_vertex}else{var w=r.mid(g,b);if(r.dot(c,d[x])-r.dot(w,d[x])>l)return;e.pointCount=1,e.type=t.ManifoldType.e_faceA,e.localNormal.setVec2(d[x]),e.localPoint.setVec2(w),e.points[0].localPoint.setVec2(s.m_p),e.points[0].id.cf.indexA=0,e.points[0].id.cf.typeA=t.ContactFeatureType.e_vertex,e.points[0].id.cf.indexB=0,e.points[0].id.cf.typeB=t.ContactFeatureType.e_vertex}};yt.addType(xt.TYPE,Bt.TYPE,(function(t,e,i,o,s,n,r){de(t,i.getShape(),e,n.getShape(),s)})),yt.addType(gt.TYPE,Bt.TYPE,(function(t,e,i,o,s,n,r){var m=i.getShape(),a=new xt;m.getChildEdge(a,o),de(t,a,e,n.getShape(),s)})),function(t){t[t.e_unknown=-1]="e_unknown",t[t.e_edgeA=1]="e_edgeA",t[t.e_edgeB=2]="e_edgeB"}(re||(re={})),function(t){t[t.e_isolated=0]="e_isolated",t[t.e_concave=1]="e_concave",t[t.e_convex=2]="e_convex"}(me||(me={}));var ce=function(){},he=function(){this.vertices=[],this.normals=[],this.count=0},_e=function(){this.normal=r.zero(),this.sideNormal1=r.zero(),this.sideNormal2=r.zero()},le=new ce,ue=new ce,pe=new he,ye=new _e,de=function(e,i,o,s,m){var c=y.mulTXf(o,m),h=y.mulVec2(c,s.m_centroid),_=i.m_vertex0,l=i.m_vertex1,u=i.m_vertex2,d=i.m_vertex3,f=i.m_hasVertex0,v=i.m_hasVertex3,x=r.sub(u,l);x.normalize();var A,g,b,B=r.neo(x.y,-x.x),V=r.dot(B,r.sub(h,l)),w=0,C=0,M=!1,I=!1;if(f){var S=r.sub(l,_);S.normalize(),A=r.neo(S.y,-S.x),M=r.crossVec2Vec2(S,x)>=0,w=r.dot(A,h)-r.dot(A,_)}if(v){var z=r.sub(d,u);z.normalize(),g=r.neo(z.y,-z.x),I=r.crossVec2Vec2(x,z)>0,C=r.dot(g,h)-r.dot(g,u)}var P=r.zero(),T=r.zero(),F=r.zero();f&&v?M&&I?(b=w>=0||V>=0||C>=0)?(P.setVec2(B),T.setVec2(A),F.setVec2(g)):(P.setMul(-1,B),T.setMul(-1,B),F.setMul(-1,B)):M?(b=w>=0||V>=0&&C>=0)?(P.setVec2(B),T.setVec2(A),F.setVec2(B)):(P.setMul(-1,B),T.setMul(-1,g),F.setMul(-1,B)):I?(b=C>=0||w>=0&&V>=0)?(P.setVec2(B),T.setVec2(B),F.setVec2(g)):(P.setMul(-1,B),T.setMul(-1,B),F.setMul(-1,A)):(b=w>=0&&V>=0&&C>=0)?(P.setVec2(B),T.setVec2(B),F.setVec2(B)):(P.setMul(-1,B),T.setMul(-1,g),F.setMul(-1,A)):f?M?(b=w>=0||V>=0)?(P.setVec2(B),T.setVec2(A),F.setMul(-1,B)):(P.setMul(-1,B),T.setVec2(B),F.setMul(-1,B)):(b=w>=0&&V>=0)?(P.setVec2(B),T.setVec2(B),F.setMul(-1,B)):(P.setMul(-1,B),T.setVec2(B),F.setMul(-1,A)):v?I?(b=V>=0||C>=0)?(P.setVec2(B),T.setMul(-1,B),F.setVec2(g)):(P.setMul(-1,B),T.setMul(-1,B),F.setVec2(B)):(b=V>=0&&C>=0)?(P.setVec2(B),T.setMul(-1,B),F.setVec2(B)):(P.setMul(-1,B),T.setMul(-1,g),F.setVec2(B)):(b=V>=0)?(P.setVec2(B),T.setMul(-1,B),F.setMul(-1,B)):(P.setMul(-1,B),T.setVec2(B),F.setVec2(B)),pe.count=s.m_count;for(var L=0;Lq)){ue.type=re.e_unknown,ue.index=-1,ue.separation=-1/0;var N=r.neo(-P.y,P.x);for(L=0;Lq){ue.type=re.e_edgeB,ue.index=L,ue.separation=k;break}if(r.dot(D,N)>=0){if(r.dot(r.sub(D,F),P)<-a.angularSlop)continue}else if(r.dot(r.sub(D,T),P)<-a.angularSlop)continue;k>ue.separation&&(ue.type=re.e_edgeB,ue.index=L,ue.separation=k)}if(!(ue.type!=re.e_unknown&&ue.separation>q)){var R;R=ue.type==re.e_unknown?le:ue.separation>.98*le.separation+.001?ue:le;var E=[new it,new it];if(R.type==re.e_edgeA){e.type=t.ManifoldType.e_faceA;var J=0,Y=r.dot(P,pe.normals[0]);for(L=1;L= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","export default function(input: T, defaults: object): T {\n if (input === null || typeof input === 'undefined') {\n // tslint:disable-next-line:no-object-literal-type-assertion\n input = {} as T;\n }\n\n const output = {...input};\n\n // tslint:disable-next-line:no-for-in\n for (const key in defaults) {\n if (defaults.hasOwnProperty(key) && typeof input[key] === 'undefined') {\n output[key] = defaults[key];\n }\n }\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n const symbols = Object.getOwnPropertySymbols(defaults);\n for (let i = 0; i < symbols.length; i++) {\n const symbol = symbols[i];\n if (defaults.propertyIsEnumerable(symbol) && typeof input[symbol] === 'undefined') {\n output[symbol] = defaults[symbol];\n }\n }\n }\n\n return output;\n}\n","const _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\nexport const debug = function(...rest: any[]): void {\n if (!_DEBUG) return;\n console.log.apply(console, arguments);\n};\n\nexport const assert = function(statement: boolean, err?: string, log?: any): void {\n if (!_ASSERT) return;\n if (statement) return;\n log && console.log(log);\n throw new Error(err);\n};\n\nexport default {\n assert,\n debug,\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst math: Math & {\n readonly EPSILON: number;\n /**\n * This function is used to ensure that a floating point number is not a NaN or\n * infinity.\n */\n isFinite(x: any): boolean;\n assert(x: any): void;\n /**\n * This is a approximate yet fast inverse square-root (todo).\n */\n invSqrt(x: number): number;\n /**\n * Next Largest Power of 2 Given a binary integer value x, the next largest\n * power of 2 can be computed by a SWAR algorithm that recursively \"folds\" the\n * upper bits into the lower bits. This process yields a bit vector with the\n * same most significant 1 as x, but all 1's below it. Adding 1 to that value\n * yields the next largest power of 2. For a 32-bit value:\n */\n nextPowerOfTwo(x: number): number;\n isPowerOfTwo(x: number): boolean;\n mod(num: number, min?: number, max?: number): number;\n /**\n * Returns a min if num is less than min, and max if more than max, otherwise returns num.\n */\n clamp(num: number, min: number, max: number): number;\n /**\n * Returns a random number between min and max when two arguments are provided.\n * If one arg is provided between 0 to max.\n * If one arg is passed between 0 to 1.\n */\n random(min?: number, max?: number): number;\n} = Object.create(Math);\n\nexport default math;\n\n// @ts-ignore\n// noinspection JSConstantReassignment\nmath.EPSILON = 1e-9; // TODO\n\nmath.isFinite = function(x: unknown): boolean {\n return (typeof x === 'number') && isFinite(x) && !isNaN(x);\n};\n\nmath.assert = function(x: any): void {\n if (!_ASSERT) return;\n if (!math.isFinite(x)) {\n _DEBUG && common.debug(x);\n throw new Error('Invalid Number!');\n }\n};\n\nmath.invSqrt = function(x: number): number {\n // TODO:\n return 1 / Math.sqrt(x);\n};\n\nmath.nextPowerOfTwo = function(x: number): number {\n // TODO\n x |= (x >> 1);\n x |= (x >> 2);\n x |= (x >> 4);\n x |= (x >> 8);\n x |= (x >> 16);\n return x + 1;\n};\n\nmath.isPowerOfTwo = function(x: number): boolean {\n return x > 0 && (x & (x - 1)) === 0;\n};\n\nmath.mod = function(num: number, min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n if (max > min) {\n num = (num - min) % (max - min);\n return num + (num < 0 ? max : min);\n } else {\n num = (num - max) % (min - max);\n return num + (num <= 0 ? min : max);\n }\n};\n\nmath.clamp = function(num: number, min: number, max: number): number {\n if (num < min) {\n return min;\n } else if (num > max) {\n return max;\n } else {\n return num;\n }\n};\n\nmath.random = function(min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n return min === max ? min : Math.random() * (max - min) + min;\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Vec2 from '../common/Vec2';\nimport Transform from '../common/Transform';\nimport Math from '../common/Math';\nimport Rot from '../common/Rot';\n\nexport enum ManifoldType {\n e_circles = 0,\n e_faceA = 1,\n e_faceB = 2\n}\n\nexport enum ContactFeatureType {\n e_vertex = 0,\n e_face = 1\n}\n\n/**\n * This is used for determining the state of contact points.\n */\n export enum PointState {\n /** Point does not exist */\n nullState = 0,\n /** Point was added in the update */\n addState = 1,\n /** Point persisted across the update */\n persistState = 2,\n /** Point was removed in the update */\n removeState = 3\n}\n\n/**\n * Used for computing contact manifolds.\n */\n export class ClipVertex {\n v: Vec2 = Vec2.zero();\n id: ContactID = new ContactID();\n\n set(o: ClipVertex): void {\n this.v.setVec2(o.v);\n this.id.set(o.id);\n }\n}\n\n/**\n * A manifold for two touching convex shapes. Manifolds are created in `evaluate`\n * method of Contact subclasses.\n *\n * Supported manifold types are e_faceA or e_faceB for clip point versus plane\n * with radius and e_circles point versus point with radius.\n *\n * We store contacts in this way so that position correction can account for\n * movement, which is critical for continuous physics. All contact scenarios\n * must be expressed in one of these types. This structure is stored across time\n * steps, so we keep it small.\n *\n * @prop type e_circle, e_faceA, e_faceB\n * @prop localPoint Usage depends on manifold type:
\n * e_circles: the local center of circleA
\n * e_faceA: the center of faceA
\n * e_faceB: the center of faceB\n * @prop localNormal Usage depends on manifold type:
\n * e_circles: not used
\n * e_faceA: the normal on polygonA
\n * e_faceB: the normal on polygonB\n * @prop points The points of contact {ManifoldPoint[]}\n * @prop pointCount The number of manifold points\n */\nexport default class Manifold {\n type: ManifoldType;\n localNormal: Vec2 = Vec2.zero();\n localPoint: Vec2 = Vec2.zero();\n points: ManifoldPoint[] = [ new ManifoldPoint(), new ManifoldPoint() ];\n pointCount: number = 0;\n\n /**\n * Evaluate the manifold with supplied transforms. This assumes modest motion\n * from the original state. This does not change the point count, impulses, etc.\n * The radii must come from the shapes that generated the manifold.\n */\n getWorldManifold(wm: WorldManifold | undefined, xfA: Transform, radiusA: number, xfB: Transform, radiusB: number): WorldManifold {\n if (this.pointCount == 0) {\n return;\n }\n\n wm = wm || new WorldManifold();\n\n let normal = wm.normal;\n const points = wm.points;\n const separations = wm.separations;\n\n // TODO: improve\n switch (this.type) {\n case ManifoldType.e_circles: {\n normal = Vec2.neo(1.0, 0.0);\n const pointA = Transform.mulVec2(xfA, this.localPoint);\n const pointB = Transform.mulVec2(xfB, this.points[0].localPoint);\n const dist = Vec2.sub(pointB, pointA);\n if (Vec2.lengthSquared(dist) > Math.EPSILON * Math.EPSILON) {\n normal.setVec2(dist);\n normal.normalize();\n }\n const cA = pointA.clone().addMul(radiusA, normal);\n const cB = pointB.clone().addMul(-radiusB, normal);\n points[0] = Vec2.mid(cA, cB);\n separations[0] = Vec2.dot(Vec2.sub(cB, cA), normal);\n points.length = 1;\n separations.length = 1;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfA, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfB, this.points[i].localPoint);\n const cA = Vec2.clone(clipPoint).addMul(radiusA - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cB = Vec2.clone(clipPoint).subMul(radiusB, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cB, cA), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfB, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfA, this.points[i].localPoint);\n const cB = Vec2.combine(1, clipPoint, radiusB - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cA = Vec2.combine(1, clipPoint, -radiusA, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cA, cB), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n // Ensure normal points from A to B.\n normal.mul(-1);\n break;\n }\n }\n\n wm.normal = normal;\n wm.points = points;\n wm.separations = separations;\n return wm;\n }\n\n static clipSegmentToLine = clipSegmentToLine;\n static ClipVertex = ClipVertex;\n static getPointStates = getPointStates;\n static PointState = PointState;\n}\n\n/**\n * A manifold point is a contact point belonging to a contact manifold. It holds\n * details related to the geometry and dynamics of the contact points.\n *\n * This structure is stored across time steps, so we keep it small.\n *\n * Note: impulses are used for internal caching and may not provide reliable\n * contact forces, especially for high speed collisions.\n */\nexport class ManifoldPoint {\n /**\n * Usage depends on manifold type.\n * e_circles: the local center of circleB,\n * e_faceA: the local center of cirlceB or the clip point of polygonB,\n * e_faceB: the clip point of polygonA.\n */\n localPoint: Vec2 = Vec2.zero();\n /**\n * The non-penetration impulse\n */\n normalImpulse: number = 0;\n /**\n * The friction impulse\n */\n tangentImpulse: number = 0;\n /**\n * Uniquely identifies a contact point between two shapes to facilatate warm starting\n */\n id: ContactID = new ContactID();\n}\n\n/**\n * Contact ids to facilitate warm starting.\n */\nexport class ContactID {\n cf: ContactFeature = new ContactFeature();\n\n /**\n * Used to quickly compare contact ids.\n */\n get key(): number {\n return this.cf.indexA + this.cf.indexB * 4 + this.cf.typeA * 16 + this.cf.typeB * 64;\n }\n\n set(o: ContactID): void {\n // this.key = o.key;\n this.cf.set(o.cf);\n }\n}\n\n/**\n * The features that intersect to form the contact point.\n */\nexport class ContactFeature {\n /**\n * Feature index on shapeA\n */\n indexA: number;\n /**\n * Feature index on shapeB\n */\n indexB: number;\n /**\n * The feature type on shapeA\n */\n typeA: ContactFeatureType;\n /**\n * The feature type on shapeB\n */\n typeB: ContactFeatureType;\n set(o: ContactFeature): void {\n this.indexA = o.indexA;\n this.indexB = o.indexB;\n this.typeA = o.typeA;\n this.typeB = o.typeB;\n }\n}\n\n/**\n * This is used to compute the current state of a contact manifold.\n */\nexport class WorldManifold {\n /**\n * World vector pointing from A to B\n */\n normal: Vec2;\n /**\n * World contact point (point of intersection)\n */\n points: Vec2[] = []; // [maxManifoldPoints]\n /**\n * A negative value indicates overlap, in meters\n */\n separations: number[] = []; // [maxManifoldPoints]\n}\n\n/**\n * Compute the point states given two manifolds. The states pertain to the\n * transition from manifold1 to manifold2. So state1 is either persist or remove\n * while state2 is either add or persist.\n */\nexport function getPointStates(\n state1: PointState[],\n state2: PointState[],\n manifold1: Manifold,\n manifold2: Manifold\n): void {\n // state1, state2: PointState[Settings.maxManifoldPoints]\n\n // for (var i = 0; i < Settings.maxManifoldPoints; ++i) {\n // state1[i] = PointState.nullState;\n // state2[i] = PointState.nullState;\n // }\n\n // Detect persists and removes.\n for (let i = 0; i < manifold1.pointCount; ++i) {\n const id = manifold1.points[i].id;\n\n state1[i] = PointState.removeState;\n\n for (let j = 0; j < manifold2.pointCount; ++j) {\n if (manifold2.points[j].id.key == id.key) {\n state1[i] = PointState.persistState;\n break;\n }\n }\n }\n\n // Detect persists and adds.\n for (let i = 0; i < manifold2.pointCount; ++i) {\n const id = manifold2.points[i].id;\n\n state2[i] = PointState.addState;\n\n for (let j = 0; j < manifold1.pointCount; ++j) {\n if (manifold1.points[j].id.key == id.key) {\n state2[i] = PointState.persistState;\n break;\n }\n }\n }\n}\n\n/**\n * Clipping for contact manifolds. Sutherland-Hodgman clipping.\n */\nexport function clipSegmentToLine(\n vOut: ClipVertex[],\n vIn: ClipVertex[],\n normal: Vec2,\n offset: number,\n vertexIndexA: number\n): number {\n // Start with no output points\n let numOut = 0;\n\n // Calculate the distance of end points to the line\n const distance0 = Vec2.dot(normal, vIn[0].v) - offset;\n const distance1 = Vec2.dot(normal, vIn[1].v) - offset;\n\n // If the points are behind the plane\n if (distance0 <= 0.0)\n vOut[numOut++].set(vIn[0]);\n if (distance1 <= 0.0)\n vOut[numOut++].set(vIn[1]);\n\n // If the points are on different sides of the plane\n if (distance0 * distance1 < 0.0) {\n // Find intersection point of edge and plane\n const interp = distance0 / (distance0 - distance1);\n vOut[numOut].v.setCombine(1 - interp, vIn[0].v, interp, vIn[1].v);\n\n // VertexA is hitting edgeB.\n vOut[numOut].id.cf.indexA = vertexIndexA;\n vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB;\n vOut[numOut].id.cf.typeA = ContactFeatureType.e_vertex;\n vOut[numOut].id.cf.typeB = ContactFeatureType.e_face;\n ++numOut;\n }\n\n return numOut;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Math from './Math';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport default class Vec2 {\n x: number;\n y: number;\n\n constructor(x: number, y: number);\n constructor(obj: { x: number, y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?) {\n if (!(this instanceof Vec2)) {\n return new Vec2(x, y);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n } else {\n this.x = x;\n this.y = y;\n }\n _ASSERT && Vec2.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = data.x;\n obj.y = data.y;\n return obj;\n }\n\n static zero(): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = 0;\n obj.y = 0;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = x;\n obj.y = y;\n return obj;\n }\n\n static clone(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(v.x, v.y);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Vec2.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Vec2!');\n }\n }\n\n clone(): Vec2 {\n return Vec2.clone(this);\n }\n\n /**\n * Set this vector to all zeros.\n *\n * @returns this\n */\n setZero(): Vec2 {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n set(x: number, y: number): Vec2;\n set(value: Vec2): Vec2;\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n // tslint:disable-next-line:typedef\n set(x, y?) {\n if (typeof x === 'object') {\n _ASSERT && Vec2.assert(x);\n this.x = x.x;\n this.y = x.y;\n } else {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n }\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setNum(x: number, y: number) {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setVec2(value: Vec2) {\n _ASSERT && Vec2.assert(value);\n this.x = value.x;\n this.y = value.y;\n\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use setCombine or setMul\n */\n wSet(a: number, v: Vec2, b?: number, w?: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.setCombine(a, v, b, w);\n } else {\n return this.setMul(a, v);\n }\n }\n\n /**\n * Set linear combination of v and w: `a * v + b * w`\n */\n setCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x = x;\n this.y = y;\n return this;\n }\n\n setMul(a: number, v: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Add a vector to this vector.\n *\n * @returns this\n */\n add(w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x += w.x;\n this.y += w.y;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use addCombine or addMul\n */\n wAdd(a: number, v: Vec2, b?: number, w?: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.addCombine(a, v, b, w);\n } else {\n return this.addMul(a, v);\n }\n }\n\n /**\n * Add linear combination of v and w: `a * v + b * w`\n */\n addCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x += x;\n this.y += y;\n return this;\n }\n\n addMul(a: number, v: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x += x;\n this.y += y;\n return this;\n }\n\n /**\n * @deprecated Use subCombine or subMul\n */\n wSub(a: number, v: Vec2, b?: number, w?: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.subCombine(a, v, b, w);\n } else {\n return this.subMul(a, v);\n }}\n\n /**\n * Subtract linear combination of v and w: `a * v + b * w`\n */\n subCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n subMul(a: number, v: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n /**\n * Subtract a vector from this vector\n *\n * @returns this\n */\n sub(w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x -= w.x;\n this.y -= w.y;\n return this;\n }\n\n /**\n * Multiply this vector by a scalar.\n *\n * @returns this\n */\n mul(m: number): Vec2 {\n _ASSERT && Math.assert(m);\n this.x *= m;\n this.y *= m;\n return this;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n length(): number {\n return Vec2.lengthOf(this);\n }\n\n /**\n * Get the length squared.\n */\n lengthSquared(): number {\n return Vec2.lengthSquared(this);\n }\n\n /**\n * Convert this vector into a unit vector.\n *\n * @returns old length\n */\n normalize(): number {\n const length = this.length();\n if (length < Math.EPSILON) {\n return 0.0;\n }\n const invLength = 1.0 / length;\n this.x *= invLength;\n this.y *= invLength;\n return length;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n static lengthOf(v: Vec2): number {\n _ASSERT && Vec2.assert(v);\n return Math.sqrt(v.x * v.x + v.y * v.y);\n }\n\n /**\n * Get the length squared.\n */\n static lengthSquared(v: Vec2): number {\n _ASSERT && Vec2.assert(v);\n return v.x * v.x + v.y * v.y;\n }\n\n static distance(v: Vec2, w: Vec2): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n static distanceSquared(v: Vec2, w: Vec2): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return dx * dx + dy * dy;\n }\n\n static areEqual(v: Vec2, w: Vec2): boolean {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v === w || typeof w === 'object' && w !== null && v.x === w.x && v.y === w.y;\n }\n\n /**\n * Get the skew vector such that dot(skew_vec, other) == cross(vec, other)\n */\n static skew(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.y, v.x);\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec2, w: Vec2): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.x + v.y * w.y;\n }\n\n static cross(v: Vec2, w: Vec2): number;\n static cross(v: Vec2, w: number): Vec2;\n static cross(v: number, w: Vec2): Vec2;\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n *\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n // tslint:disable-next-line:typedef\n static cross(v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n\n } else {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static crossVec2Vec2(v: Vec2, w: Vec2): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossVec2Num(v: Vec2, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossNumVec2(v: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n }\n\n static addCross(a: Vec2, v: Vec2, w: number): Vec2;\n static addCross(a: Vec2, v: number, w: Vec2): Vec2;\n /**\n * Returns `a + (v x w)`\n */\n // tslint:disable-next-line:typedef\n static addCross(a, v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n _ASSERT && common.assert(false);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossVec2Num(a: Vec2, v: Vec2, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossNumVec2(a: Vec2, v: number, w: Vec2): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n static add(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x + w.x, v.y + w.y);\n }\n\n /** @internal @deprecated */\n static wAdd(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return Vec2.combine(a, v, b, w);\n } else {\n return Vec2.mulNumVec2(a, v);\n }\n }\n\n static combine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n return Vec2.zero().setCombine(a, v, b, w);\n }\n\n static sub(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x - w.x, v.y - w.y);\n }\n\n static mul(a: Vec2, b: number): Vec2;\n static mul(a: number, b: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (typeof a === 'object') {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n\n } else if (typeof b === 'object') {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n }\n\n static mulVec2Num(a: Vec2, b: number): Vec2 {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n }\n\n static mulNumVec2(a: number, b: Vec2): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n\n neg(): Vec2 {\n this.x = -this.x;\n this.y = -this.y;\n return this;\n }\n\n static neg(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.x, -v.y);\n }\n\n static abs(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Math.abs(v.x), Math.abs(v.y));\n }\n\n static mid(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo((v.x + w.x) * 0.5, (v.y + w.y) * 0.5);\n }\n\n static upper(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.max(v.x, w.x), Math.max(v.y, w.y));\n }\n\n static lower(v: Vec2, w: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.min(v.x, w.x), Math.min(v.y, w.y));\n }\n\n clamp(max: number): Vec2 {\n const lengthSqr = this.x * this.x + this.y * this.y;\n if (lengthSqr > max * max) {\n const invLength = Math.invSqrt(lengthSqr);\n this.x *= invLength * max;\n this.y *= invLength * max;\n }\n return this;\n }\n\n static clamp(v: Vec2, max: number): Vec2 {\n v = Vec2.neo(v.x, v.y);\n v.clamp(max);\n return v;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static scaleFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x * x, v.y * y);\n };\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static translateFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x + x, v.y + y);\n };\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n */\nexport interface RayCastInput {\n p1: Vec2;\n p2: Vec2;\n maxFraction: number;\n}\n\nexport type RayCastCallback = (subInput: RayCastInput, id: number) => number;\n\n/**\n * Ray-cast output data. The ray hits at `p1 + fraction * (p2 - p1)`,\n * where `p1` and `p2` come from RayCastInput.\n */\nexport interface RayCastOutput {\n normal: Vec2;\n fraction: number;\n}\n\nexport default class AABB {\n lowerBound: Vec2;\n upperBound: Vec2;\n\n constructor(lower?: Vec2, upper?: Vec2) {\n if (!(this instanceof AABB)) {\n return new AABB(lower, upper);\n }\n\n this.lowerBound = Vec2.zero();\n this.upperBound = Vec2.zero();\n\n if (typeof lower === 'object') {\n this.lowerBound.setVec2(lower);\n }\n if (typeof upper === 'object') {\n this.upperBound.setVec2(upper);\n } else if (typeof lower === 'object') {\n this.upperBound.setVec2(lower);\n }\n }\n\n /**\n * Verify that the bounds are sorted.\n */\n isValid(): boolean {\n return AABB.isValid(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.lowerBound) && Vec2.isValid(obj.upperBound) && Vec2.sub(obj.upperBound, obj.lowerBound).lengthSquared() >= 0;\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!AABB.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid AABB!');\n }\n }\n\n /**\n * Get the center of the AABB.\n */\n getCenter(): Vec2 {\n return Vec2.neo((this.lowerBound.x + this.upperBound.x) * 0.5, (this.lowerBound.y + this.upperBound.y) * 0.5);\n }\n\n /**\n * Get the extents of the AABB (half-widths).\n */\n getExtents(): Vec2 {\n return Vec2.neo((this.upperBound.x - this.lowerBound.x) * 0.5, (this.upperBound.y - this.lowerBound.y) * 0.5);\n }\n\n /**\n * Get the perimeter length.\n */\n getPerimeter(): number {\n return 2.0 * (this.upperBound.x - this.lowerBound.x + this.upperBound.y - this.lowerBound.y);\n }\n\n /**\n * Combine one or two AABB into this one.\n */\n combine(a: AABB, b?: AABB): void {\n b = b || this;\n\n const lowerA = a.lowerBound;\n const upperA = a.upperBound;\n const lowerB = b.lowerBound;\n const upperB = b.upperBound;\n\n const lowerX = Math.min(lowerA.x, lowerB.x);\n const lowerY = Math.min(lowerA.y, lowerB.y);\n const upperX = Math.max(upperB.x, upperA.x);\n const upperY = Math.max(upperB.y, upperA.y);\n\n this.lowerBound.setNum(lowerX, lowerY);\n this.upperBound.setNum(upperX, upperY);\n }\n\n combinePoints(a: Vec2, b: Vec2): void {\n this.lowerBound.setNum(Math.min(a.x, b.x), Math.min(a.y, b.y));\n this.upperBound.setNum(Math.max(a.x, b.x), Math.max(a.y, b.y));\n }\n\n set(aabb: AABB): void {\n this.lowerBound.setNum(aabb.lowerBound.x, aabb.lowerBound.y);\n this.upperBound.setNum(aabb.upperBound.x, aabb.upperBound.y);\n }\n\n contains(aabb: AABB): boolean {\n let result = true;\n result = result && this.lowerBound.x <= aabb.lowerBound.x;\n result = result && this.lowerBound.y <= aabb.lowerBound.y;\n result = result && aabb.upperBound.x <= this.upperBound.x;\n result = result && aabb.upperBound.y <= this.upperBound.y;\n return result;\n }\n\n extend(value: number): AABB {\n AABB.extend(this, value);\n return this;\n }\n\n static extend(aabb: AABB, value: number): void {\n aabb.lowerBound.x -= value;\n aabb.lowerBound.y -= value;\n aabb.upperBound.x += value;\n aabb.upperBound.y += value;\n }\n\n static testOverlap(a: AABB, b: AABB): boolean {\n const d1x = b.lowerBound.x - a.upperBound.x;\n const d2x = a.lowerBound.x - b.upperBound.x;\n\n const d1y = b.lowerBound.y - a.upperBound.y;\n const d2y = a.lowerBound.y - b.upperBound.y;\n\n if (d1x > 0 || d1y > 0 || d2x > 0 || d2y > 0) {\n return false;\n }\n return true;\n }\n\n static areEqual(a: AABB, b: AABB): boolean {\n return Vec2.areEqual(a.lowerBound, b.lowerBound) && Vec2.areEqual(a.upperBound, b.upperBound);\n }\n\n static diff(a: AABB, b: AABB): number {\n const wD = Math.max(0, Math.min(a.upperBound.x, b.upperBound.x) - Math.max(b.lowerBound.x, a.lowerBound.x));\n const hD = Math.max(0, Math.min(a.upperBound.y, b.upperBound.y) - Math.max(b.lowerBound.y, a.lowerBound.y));\n\n const wA = a.upperBound.x - a.lowerBound.x;\n const hA = a.upperBound.y - a.lowerBound.y;\n\n const wB = b.upperBound.x - b.lowerBound.x;\n const hB = b.upperBound.y - b.lowerBound.y;\n\n return wA * hA + wB * hB - wD * hD;\n }\n\n rayCast(output: RayCastOutput, input: RayCastInput): boolean {\n // From Real-time Collision Detection, p179.\n\n let tmin = -Infinity;\n let tmax = Infinity;\n\n const p = input.p1;\n const d = Vec2.sub(input.p2, input.p1);\n const absD = Vec2.abs(d);\n\n const normal = Vec2.zero();\n\n for (let f: 'x' | 'y' = 'x'; f !== null; f = (f === 'x' ? 'y' : null)) {\n if (absD.x < Math.EPSILON) {\n // Parallel.\n if (p[f] < this.lowerBound[f] || this.upperBound[f] < p[f]) {\n return false;\n }\n } else {\n const inv_d = 1.0 / d[f];\n let t1 = (this.lowerBound[f] - p[f]) * inv_d;\n let t2 = (this.upperBound[f] - p[f]) * inv_d;\n\n // Sign of the normal vector.\n let s = -1.0;\n\n if (t1 > t2) {\n const temp = t1;\n t1 = t2;\n t2 = temp;\n s = 1.0;\n }\n\n // Push the min up\n if (t1 > tmin) {\n normal.setZero();\n normal[f] = s;\n tmin = t1;\n }\n\n // Pull the max down\n tmax = Math.min(tmax, t2);\n\n if (tmin > tmax) {\n return false;\n }\n }\n }\n\n // Does the ray start inside the box?\n // Does the ray intersect beyond the max fraction?\n if (tmin < 0.0 || input.maxFraction < tmin) {\n return false;\n }\n\n // Intersection.\n output.fraction = tmin;\n output.normal = normal;\n return true;\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n// TODO merge with World options?\n\n/**\n * Tuning constants based on meters-kilograms-seconds (MKS) units.\n */\n// tslint:disable-next-line:no-unnecessary-class\nexport default class Settings {\n // Collision\n /**\n * The maximum number of contact points between two convex shapes. Do not change\n * this value.\n */\n static maxManifoldPoints: number = 2;\n\n /**\n * The maximum number of vertices on a convex polygon. You cannot increase this\n * too much because BlockAllocator has a maximum object size.\n */\n static maxPolygonVertices: number = 12;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This allows proxies to move\n * by a small amount without triggering a tree adjustment. This is in meters.\n */\n static aabbExtension: number = 0.1;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This is used to predict the\n * future position based on the current displacement. This is a dimensionless\n * multiplier.\n */\n static aabbMultiplier: number = 2.0;\n\n /**\n * A small length used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static linearSlop: number = 0.005;\n static get linearSlopSquared(): number { return Settings.linearSlop * Settings.linearSlop; }\n\n /**\n * A small angle used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static angularSlop: number = (2.0 / 180.0 * Math.PI);\n\n /**\n * The radius of the polygon/edge shape skin. This should not be modified.\n * Making this smaller means polygons will have an insufficient buffer for\n * continuous collision. Making it larger may create artifacts for vertex\n * collision.\n */\n static get polygonRadius(): number { return 2.0 * Settings.linearSlop; }\n\n /**\n * Maximum number of sub-steps per contact in continuous physics simulation.\n */\n static maxSubSteps: number = 8;\n\n// Dynamics\n\n /**\n * Maximum number of contacts to be handled to solve a TOI impact.\n */\n static maxTOIContacts: number = 32;\n\n /**\n * Maximum iterations to solve a TOI.\n */\n static maxTOIIterations: number = 20;\n\n /**\n * Maximum iterations to find Distance.\n */\n static maxDistnceIterations: number = 20;\n\n /**\n * A velocity threshold for elastic collisions. Any collision with a relative\n * linear velocity below this threshold will be treated as inelastic.\n */\n static velocityThreshold: number = 1.0;\n\n /**\n * The maximum linear position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxLinearCorrection: number = 0.2;\n\n /**\n * The maximum angular position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxAngularCorrection: number = (8.0 / 180.0 * Math.PI);\n\n /**\n * The maximum linear velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxTranslation: number = 2.0;\n static get maxTranslationSquared(): number { return Settings.maxTranslation * Settings.maxTranslation; }\n\n /**\n * The maximum angular velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxRotation: number = (0.5 * Math.PI);\n static get maxRotationSquared(): number { return Settings.maxRotation * Settings.maxRotation; }\n\n /**\n * This scale factor controls how fast overlap is resolved. Ideally this would\n * be 1 so that overlap is removed in one time step. However using values close\n * to 1 often lead to overshoot.\n */\n static baumgarte: number = 0.2;\n static toiBaugarte: number = 0.75;\n\n // Sleep\n\n /**\n * The time that a body must be still before it will go to sleep.\n */\n static timeToSleep: number = 0.5;\n\n /**\n * A body cannot sleep if its linear velocity is above this tolerance.\n */\n static linearSleepTolerance: number = 0.01;\n static get linearSleepToleranceSqr(): number { return Math.pow(Settings.linearSleepTolerance, 2); }\n\n /**\n * A body cannot sleep if its angular velocity is above this tolerance.\n */\n static angularSleepTolerance: number = (2.0 / 180.0 * Math.PI);\n static get angularSleepToleranceSqr(): number { return Math.pow(Settings.angularSleepTolerance, 2); }\n\n}\n","/*\n * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js\n *\n * This software is provided 'as-is', without any express or implied\n * warranty. In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * 1. The origin of this software must not be misrepresented; you must not\n * claim that you wrote the original software. If you use this software\n * in a product, an acknowledgment in the product documentation would be\n * appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n * misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n */\n\nexport default class Pool {\n _list: T[] = [];\n _max: number = Infinity;\n\n _createFn: () => T;\n _outFn: (item: T) => void;\n _inFn: (item: T) => void;\n _discardFn: (item: T) => T;\n\n _createCount: number = 0;\n _outCount: number = 0;\n _inCount: number = 0;\n _discardCount: number = 0;\n\n constructor(opts: {\n max?: number,\n create?: () => T,\n allocate?: (item: T) => void,\n release?: (item: T) => void,\n discard?: (item: T) => T,\n }) {\n this._list = [];\n this._max = opts.max || this._max;\n\n this._createFn = opts.create;\n this._outFn = opts.allocate;\n this._inFn = opts.release;\n this._discardFn = opts.discard;\n }\n\n max(n?: number): number | Pool {\n if (typeof n === 'number') {\n this._max = n;\n return this;\n }\n return this._max;\n }\n\n size(): number {\n return this._list.length;\n }\n\n allocate(): T {\n let item: T;\n if (this._list.length > 0) {\n item = this._list.shift();\n } else {\n this._createCount++;\n if (typeof this._createFn === 'function') {\n item = this._createFn();\n } else {\n // tslint:disable-next-line:no-object-literal-type-assertion\n item = {} as T;\n }\n }\n this._outCount++;\n if (typeof this._outFn === 'function') {\n this._outFn(item);\n }\n return item;\n }\n\n release(item: T): void {\n if (this._list.length < this._max) {\n this._inCount++;\n if (typeof this._inFn === 'function') {\n this._inFn(item);\n }\n this._list.push(item);\n } else {\n this._discardCount++;\n if (typeof this._discardFn === 'function') {\n item = this._discardFn(item);\n }\n }\n }\n\n /** @internal */\n toString(): string {\n return \" +\" + this._createCount + \" >\" + this._outCount + \" <\" + this._inCount + \" -\"\n + this._discardCount + \" =\" + this._list.length + \"/\" + this._max;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../Settings';\nimport common from '../util/common';\nimport Pool from '../util/Pool';\nimport Vec2 from '../common/Vec2';\nimport Math from '../common/Math';\nimport AABB, { RayCastCallback, RayCastInput } from './AABB';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport type DynamicTreeQueryCallback = (nodeId: number) => boolean;\n\n/**\n * A node in the dynamic tree. The client does not interact with this directly.\n */\nexport class TreeNode {\n id: number;\n /** Enlarged AABB */\n aabb: AABB = new AABB();\n userData: T = null;\n parent: TreeNode = null;\n child1: TreeNode = null;\n child2: TreeNode = null;\n /** 0: leaf, -1: free node */\n height: number = -1;\n\n constructor(id?: number) {\n this.id = id;\n }\n\n /** @internal */\n toString(): string {\n return this.id + \": \" + this.userData;\n }\n\n isLeaf(): boolean {\n return this.child1 == null;\n }\n}\n\n/**\n * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A\n * dynamic tree arranges data in a binary tree to accelerate queries such as\n * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we\n * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger\n * than the client object. This allows the client object to move by small\n * amounts without triggering a tree update.\n *\n * Nodes are pooled and relocatable, so we use node indices rather than\n * pointers.\n */\nexport default class DynamicTree {\n m_root: TreeNode;\n m_lastProxyId: number;\n m_nodes: {\n [id: number]: TreeNode\n };\n m_pool: Pool>;\n\n constructor() {\n this.m_root = null;\n this.m_nodes = {};\n this.m_lastProxyId = 0;\n\n this.m_pool = new Pool>({\n create(): TreeNode {\n return new TreeNode();\n }\n });\n }\n\n /**\n * Get proxy user data.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getUserData(id: number): T {\n const node = this.m_nodes[id];\n _ASSERT && common.assert(!!node);\n return node.userData;\n }\n\n /**\n * Get the fat AABB for a node id.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getFatAABB(id: number): AABB {\n const node = this.m_nodes[id];\n _ASSERT && common.assert(!!node);\n return node.aabb;\n }\n\n allocateNode(): TreeNode {\n const node = this.m_pool.allocate();\n node.id = ++this.m_lastProxyId;\n node.userData = null;\n node.parent = null;\n node.child1 = null;\n node.child2 = null;\n node.height = -1;\n this.m_nodes[node.id] = node;\n return node;\n }\n\n freeNode(node: TreeNode): void {\n this.m_pool.release(node);\n node.height = -1;\n // tslint:disable-next-line:no-dynamic-delete\n delete this.m_nodes[node.id];\n }\n\n /**\n * Create a proxy in the tree as a leaf node. We return the index of the node\n * instead of a pointer so that we can grow the node pool.\n *\n * Create a proxy. Provide a tight fitting AABB and a userData pointer.\n */\n createProxy(aabb: AABB, userData: T): number {\n _ASSERT && common.assert(AABB.isValid(aabb));\n\n const node = this.allocateNode();\n\n node.aabb.set(aabb);\n\n // Fatten the aabb.\n AABB.extend(node.aabb, Settings.aabbExtension);\n\n node.userData = userData;\n node.height = 0;\n\n this.insertLeaf(node);\n\n return node.id;\n }\n\n /**\n * Destroy a proxy. This asserts if the id is invalid.\n */\n destroyProxy(id: number): void {\n const node = this.m_nodes[id];\n\n _ASSERT && common.assert(!!node);\n _ASSERT && common.assert(node.isLeaf());\n\n this.removeLeaf(node);\n this.freeNode(node);\n }\n\n /**\n * Move a proxy with a swepted AABB. If the proxy has moved outside of its\n * fattened AABB, then the proxy is removed from the tree and re-inserted.\n * Otherwise the function returns immediately.\n *\n * @param d Displacement\n *\n * @return true if the proxy was re-inserted.\n */\n moveProxy(id: number, aabb: AABB, d: Vec2): boolean {\n _ASSERT && common.assert(AABB.isValid(aabb));\n _ASSERT && common.assert(!d || Vec2.isValid(d));\n\n const node = this.m_nodes[id];\n\n _ASSERT && common.assert(!!node);\n _ASSERT && common.assert(node.isLeaf());\n\n if (node.aabb.contains(aabb)) {\n return false;\n }\n\n this.removeLeaf(node);\n\n node.aabb.set(aabb);\n\n // Extend AABB.\n aabb = node.aabb;\n AABB.extend(aabb, Settings.aabbExtension);\n\n // Predict AABB displacement.\n // const d = Vec2.mul(Settings.aabbMultiplier, displacement);\n\n if (d.x < 0.0) {\n aabb.lowerBound.x += d.x * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.x += d.x * Settings.aabbMultiplier;\n }\n\n if (d.y < 0.0) {\n aabb.lowerBound.y += d.y * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.y += d.y * Settings.aabbMultiplier;\n }\n\n this.insertLeaf(node);\n\n return true;\n }\n\n insertLeaf(leaf: TreeNode): void {\n _ASSERT && common.assert(AABB.isValid(leaf.aabb));\n\n if (this.m_root == null) {\n this.m_root = leaf;\n this.m_root.parent = null;\n return;\n }\n\n // Find the best sibling for this node\n const leafAABB = leaf.aabb;\n let index = this.m_root;\n while (!index.isLeaf()) {\n const child1 = index.child1;\n const child2 = index.child2;\n\n const area = index.aabb.getPerimeter();\n\n const combinedAABB = new AABB();\n combinedAABB.combine(index.aabb, leafAABB);\n const combinedArea = combinedAABB.getPerimeter();\n\n // Cost of creating a new parent for this node and the new leaf\n const cost = 2.0 * combinedArea;\n\n // Minimum cost of pushing the leaf further down the tree\n const inheritanceCost = 2.0 * (combinedArea - area);\n\n // Cost of descending into child1\n let cost1;\n if (child1.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n cost1 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n const oldArea = child1.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost1 = (newArea - oldArea) + inheritanceCost;\n }\n\n // Cost of descending into child2\n let cost2;\n if (child2.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n cost2 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n const oldArea = child2.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost2 = newArea - oldArea + inheritanceCost;\n }\n\n // Descend according to the minimum cost.\n if (cost < cost1 && cost < cost2) {\n break;\n }\n\n // Descend\n if (cost1 < cost2) {\n index = child1;\n } else {\n index = child2;\n }\n }\n\n const sibling = index;\n\n // Create a new parent.\n const oldParent = sibling.parent;\n const newParent = this.allocateNode();\n newParent.parent = oldParent;\n newParent.userData = null;\n newParent.aabb.combine(leafAABB, sibling.aabb);\n newParent.height = sibling.height + 1;\n\n if (oldParent != null) {\n // The sibling was not the root.\n if (oldParent.child1 === sibling) {\n oldParent.child1 = newParent;\n } else {\n oldParent.child2 = newParent;\n }\n\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n } else {\n // The sibling was the root.\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n this.m_root = newParent;\n }\n\n // Walk back up the tree fixing heights and AABBs\n index = leaf.parent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n _ASSERT && common.assert(child1 != null);\n _ASSERT && common.assert(child2 != null);\n\n index.height = 1 + Math.max(child1.height, child2.height);\n index.aabb.combine(child1.aabb, child2.aabb);\n\n index = index.parent;\n }\n\n // validate();\n }\n\n removeLeaf(leaf: TreeNode): void {\n if (leaf === this.m_root) {\n this.m_root = null;\n return;\n }\n\n const parent = leaf.parent;\n const grandParent = parent.parent;\n let sibling;\n if (parent.child1 === leaf) {\n sibling = parent.child2;\n } else {\n sibling = parent.child1;\n }\n\n if (grandParent != null) {\n // Destroy parent and connect sibling to grandParent.\n if (grandParent.child1 === parent) {\n grandParent.child1 = sibling;\n } else {\n grandParent.child2 = sibling;\n }\n sibling.parent = grandParent;\n this.freeNode(parent);\n\n // Adjust ancestor bounds.\n let index = grandParent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n index.aabb.combine(child1.aabb, child2.aabb);\n index.height = 1 + Math.max(child1.height, child2.height);\n\n index = index.parent;\n }\n } else {\n this.m_root = sibling;\n sibling.parent = null;\n this.freeNode(parent);\n }\n\n // validate();\n }\n\n /**\n * Perform a left or right rotation if node A is imbalanced. Returns the new\n * root index.\n */\n balance(iA: TreeNode): TreeNode {\n _ASSERT && common.assert(iA != null);\n\n const A = iA;\n if (A.isLeaf() || A.height < 2) {\n return iA;\n }\n\n const B = A.child1;\n const C = A.child2;\n\n const balance = C.height - B.height;\n\n // Rotate C up\n if (balance > 1) {\n const F = C.child1;\n const G = C.child2;\n\n // Swap A and C\n C.child1 = A;\n C.parent = A.parent;\n A.parent = C;\n\n // A's old parent should point to C\n if (C.parent != null) {\n if (C.parent.child1 === iA) {\n C.parent.child1 = C;\n } else {\n C.parent.child2 = C;\n }\n } else {\n this.m_root = C;\n }\n\n // Rotate\n if (F.height > G.height) {\n C.child2 = F;\n A.child2 = G;\n G.parent = A;\n A.aabb.combine(B.aabb, G.aabb);\n C.aabb.combine(A.aabb, F.aabb);\n\n A.height = 1 + Math.max(B.height, G.height);\n C.height = 1 + Math.max(A.height, F.height);\n } else {\n C.child2 = G;\n A.child2 = F;\n F.parent = A;\n A.aabb.combine(B.aabb, F.aabb);\n C.aabb.combine(A.aabb, G.aabb);\n\n A.height = 1 + Math.max(B.height, F.height);\n C.height = 1 + Math.max(A.height, G.height);\n }\n\n return C;\n }\n\n // Rotate B up\n if (balance < -1) {\n const D = B.child1;\n const E = B.child2;\n\n // Swap A and B\n B.child1 = A;\n B.parent = A.parent;\n A.parent = B;\n\n // A's old parent should point to B\n if (B.parent != null) {\n if (B.parent.child1 === A) {\n B.parent.child1 = B;\n } else {\n B.parent.child2 = B;\n }\n } else {\n this.m_root = B;\n }\n\n // Rotate\n if (D.height > E.height) {\n B.child2 = D;\n A.child1 = E;\n E.parent = A;\n A.aabb.combine(C.aabb, E.aabb);\n B.aabb.combine(A.aabb, D.aabb);\n\n A.height = 1 + Math.max(C.height, E.height);\n B.height = 1 + Math.max(A.height, D.height);\n } else {\n B.child2 = E;\n A.child1 = D;\n D.parent = A;\n A.aabb.combine(C.aabb, D.aabb);\n B.aabb.combine(A.aabb, E.aabb);\n\n A.height = 1 + Math.max(C.height, D.height);\n B.height = 1 + Math.max(A.height, E.height);\n }\n\n return B;\n }\n\n return A;\n }\n\n /**\n * Compute the height of the binary tree in O(N) time. Should not be called\n * often.\n */\n getHeight(): number {\n if (this.m_root == null) {\n return 0;\n }\n\n return this.m_root.height;\n }\n\n /**\n * Get the ratio of the sum of the node areas to the root area.\n */\n getAreaRatio(): number {\n if (this.m_root == null) {\n return 0.0;\n }\n\n const root = this.m_root;\n const rootArea = root.aabb.getPerimeter();\n\n let totalArea = 0.0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // Free node in pool\n continue;\n }\n\n totalArea += node.aabb.getPerimeter();\n }\n\n this.iteratorPool.release(it);\n\n return totalArea / rootArea;\n }\n\n /**\n * Compute the height of a sub-tree.\n */\n computeHeight(id?: number): number {\n let node;\n if (typeof id !== 'undefined') {\n node = this.m_nodes[id];\n } else {\n node = this.m_root;\n }\n\n // _ASSERT && common.assert(0 <= id && id < this.m_nodeCapacity);\n\n if (node.isLeaf()) {\n return 0;\n }\n\n const height1 = this.computeHeight(node.child1.id);\n const height2 = this.computeHeight(node.child2.id);\n return 1 + Math.max(height1, height2);\n }\n\n validateStructure(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n if (node === this.m_root) {\n _ASSERT && common.assert(node.parent == null);\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && common.assert(child1 == null);\n _ASSERT && common.assert(child2 == null);\n _ASSERT && common.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && common.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && common.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n _ASSERT && common.assert(child1.parent === node);\n _ASSERT && common.assert(child2.parent === node);\n\n this.validateStructure(child1);\n this.validateStructure(child2);\n }\n\n validateMetrics(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && common.assert(child1 == null);\n _ASSERT && common.assert(child2 == null);\n _ASSERT && common.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && common.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && common.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n const height1 = child1.height;\n const height2 = child2.height;\n const height = 1 + Math.max(height1, height2);\n _ASSERT && common.assert(node.height === height);\n\n const aabb = new AABB();\n aabb.combine(child1.aabb, child2.aabb);\n\n _ASSERT && common.assert(AABB.areEqual(aabb, node.aabb));\n\n this.validateMetrics(child1);\n this.validateMetrics(child2);\n }\n\n /**\n * Validate this tree. For testing.\n */\n validate(): void {\n this.validateStructure(this.m_root);\n this.validateMetrics(this.m_root);\n\n _ASSERT && common.assert(this.getHeight() === this.computeHeight());\n }\n\n /**\n * Get the maximum balance of an node in the tree. The balance is the difference\n * in height of the two children of a node.\n */\n getMaxBalance(): number {\n let maxBalance = 0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height <= 1) {\n continue;\n }\n\n _ASSERT && common.assert(!node.isLeaf());\n\n const balance = Math.abs(node.child2.height - node.child1.height);\n maxBalance = Math.max(maxBalance, balance);\n }\n this.iteratorPool.release(it);\n\n return maxBalance;\n }\n\n /**\n * Build an optimal tree. Very expensive. For testing.\n */\n rebuildBottomUp(): void {\n const nodes = [];\n let count = 0;\n\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // free node in pool\n continue;\n }\n\n if (node.isLeaf()) {\n node.parent = null;\n nodes[count] = node;\n ++count;\n } else {\n this.freeNode(node);\n }\n }\n this.iteratorPool.release(it);\n\n while (count > 1) {\n let minCost = Infinity;\n let iMin = -1;\n let jMin = -1;\n for (let i = 0; i < count; ++i) {\n const aabbi = nodes[i].aabb;\n for (let j = i + 1; j < count; ++j) {\n const aabbj = nodes[j].aabb;\n const b = new AABB();\n b.combine(aabbi, aabbj);\n const cost = b.getPerimeter();\n if (cost < minCost) {\n iMin = i;\n jMin = j;\n minCost = cost;\n }\n }\n }\n\n const child1 = nodes[iMin];\n const child2 = nodes[jMin];\n\n const parent = this.allocateNode();\n parent.child1 = child1;\n parent.child2 = child2;\n parent.height = 1 + Math.max(child1.height, child2.height);\n parent.aabb.combine(child1.aabb, child2.aabb);\n parent.parent = null;\n\n child1.parent = parent;\n child2.parent = parent;\n\n nodes[jMin] = nodes[count - 1];\n nodes[iMin] = parent;\n --count;\n }\n\n this.m_root = nodes[0];\n\n this.validate();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n const aabb = node.aabb;\n aabb.lowerBound.x -= newOrigin.x;\n aabb.lowerBound.y -= newOrigin.y;\n aabb.upperBound.x -= newOrigin.x;\n aabb.upperBound.y -= newOrigin.y;\n }\n this.iteratorPool.release(it);\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query(aabb: AABB, queryCallback: DynamicTreeQueryCallback): void {\n _ASSERT && common.assert(typeof queryCallback === 'function');\n const stack = this.stackPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, aabb)) {\n if (node.isLeaf()) {\n const proceed = queryCallback(node.id);\n if (proceed === false) {\n return;\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n }\n\n this.stackPool.release(stack);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n // TODO: GC\n _ASSERT && common.assert(typeof rayCastCallback === 'function');\n const p1 = input.p1;\n const p2 = input.p2;\n const r = Vec2.sub(p2, p1);\n _ASSERT && common.assert(r.lengthSquared() > 0.0);\n r.normalize();\n\n // v is perpendicular to the segment.\n const v = Vec2.crossNumVec2(1.0, r);\n const abs_v = Vec2.abs(v);\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n\n let maxFraction = input.maxFraction;\n\n // Build a bounding box for the segment.\n const segmentAABB = new AABB();\n let t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n\n const stack = this.stackPool.allocate();\n const subInput = this.inputPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, segmentAABB) === false) {\n continue;\n }\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n const c = node.aabb.getCenter();\n const h = node.aabb.getExtents();\n const separation = Math.abs(Vec2.dot(v, Vec2.sub(p1, c))) - Vec2.dot(abs_v, h);\n if (separation > 0.0) {\n continue;\n }\n\n if (node.isLeaf()) {\n subInput.p1 = Vec2.clone(input.p1);\n subInput.p2 = Vec2.clone(input.p2);\n subInput.maxFraction = maxFraction;\n\n const value = rayCastCallback(subInput, node.id);\n\n if (value === 0.0) {\n // The client has terminated the ray cast.\n return;\n }\n\n if (value > 0.0) {\n // update segment bounding box.\n maxFraction = value;\n t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n this.stackPool.release(stack);\n this.inputPool.release(subInput);\n }\n\n private inputPool: Pool = new Pool({\n create(): RayCastInput {\n // tslint:disable-next-line:no-object-literal-type-assertion\n return {} as RayCastInput;\n },\n release(stack: RayCastInput): void {\n }\n });\n\n private stackPool: Pool>> = new Pool>>({\n create(): Array> {\n return [];\n },\n release(stack: Array>): void {\n stack.length = 0;\n }\n });\n\n private iteratorPool: Pool> = new Pool>({\n create(): Iterator {\n return new Iterator();\n },\n release(iterator: Iterator): void {\n iterator.close();\n }\n });\n\n}\n\nclass Iterator {\n parents: Array> = [];\n states: number[] = [];\n preorder(root: TreeNode): Iterator {\n this.parents.length = 0;\n this.parents.push(root);\n this.states.length = 0;\n this.states.push(0);\n return this;\n }\n next(): TreeNode {\n while (this.parents.length > 0) {\n const i = this.parents.length - 1;\n const node = this.parents[i];\n if (this.states[i] === 0) {\n this.states[i] = 1;\n return node;\n }\n if (this.states[i] === 1) {\n this.states[i] = 2;\n if (node.child1) {\n this.parents.push(node.child1);\n this.states.push(1);\n return node.child1;\n }\n }\n if (this.states[i] === 2) {\n this.states[i] = 3;\n if (node.child2) {\n this.parents.push(node.child2);\n this.states.push(1);\n return node.child2;\n }\n }\n this.parents.pop();\n this.states.pop();\n }\n }\n close(): void {\n this.parents.length = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from '../common/Vec2';\nimport Math from '../common/Math';\nimport AABB, { RayCastCallback, RayCastInput } from './AABB';\nimport DynamicTree, { DynamicTreeQueryCallback } from './DynamicTree';\nimport { FixtureProxy } from \"../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * The broad-phase wraps and extends a dynamic-tree to keep track of moved\n * objects and query them on update.\n */\nexport default class BroadPhase {\n m_tree: DynamicTree = new DynamicTree();\n m_proxyCount: number = 0;\n m_moveBuffer: number[] = [];\n\n m_callback: (userDataA: any, userDataB: any) => void;\n m_queryProxyId: number;\n\n /**\n * Get user data from a proxy. Returns null if the id is invalid.\n */\n getUserData(proxyId: number): FixtureProxy {\n return this.m_tree.getUserData(proxyId);\n }\n\n /**\n * Test overlap of fat AABBs.\n */\n testOverlap(proxyIdA: number, proxyIdB: number): boolean {\n const aabbA = this.m_tree.getFatAABB(proxyIdA);\n const aabbB = this.m_tree.getFatAABB(proxyIdB);\n return AABB.testOverlap(aabbA, aabbB);\n }\n\n /**\n * Get the fat AABB for a proxy.\n */\n getFatAABB(proxyId: number): AABB {\n return this.m_tree.getFatAABB(proxyId);\n }\n\n /**\n * Get the number of proxies.\n */\n getProxyCount(): number {\n return this.m_proxyCount;\n }\n\n /**\n * Get the height of the embedded tree.\n */\n getTreeHeight(): number {\n return this.m_tree.getHeight();\n }\n\n /**\n * Get the balance (integer) of the embedded tree.\n */\n getTreeBalance(): number {\n return this.m_tree.getMaxBalance();\n }\n\n /**\n * Get the quality metric of the embedded tree.\n */\n getTreeQuality(): number {\n return this.m_tree.getAreaRatio();\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query = (aabb: AABB, queryCallback: DynamicTreeQueryCallback): void => {\n this.m_tree.query(aabb, queryCallback);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n this.m_tree.rayCast(input, rayCastCallback);\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_tree.shiftOrigin(newOrigin);\n }\n\n /**\n * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs\n * is called.\n */\n createProxy(aabb: AABB, userData: FixtureProxy): number {\n _ASSERT && common.assert(AABB.isValid(aabb));\n const proxyId = this.m_tree.createProxy(aabb, userData);\n this.m_proxyCount++;\n this.bufferMove(proxyId);\n return proxyId;\n }\n\n /**\n * Destroy a proxy. It is up to the client to remove any pairs.\n */\n destroyProxy(proxyId: number): void {\n this.unbufferMove(proxyId);\n this.m_proxyCount--;\n this.m_tree.destroyProxy(proxyId);\n }\n\n /**\n * Call moveProxy as many times as you like, then when you are done call\n * UpdatePairs to finalized the proxy pairs (for your time step).\n */\n moveProxy(proxyId: number, aabb: AABB, displacement: Vec2): void {\n _ASSERT && common.assert(AABB.isValid(aabb));\n const changed = this.m_tree.moveProxy(proxyId, aabb, displacement);\n if (changed) {\n this.bufferMove(proxyId);\n }\n }\n\n /**\n * Call to trigger a re-processing of it's pairs on the next call to\n * UpdatePairs.\n */\n touchProxy(proxyId: number): void {\n this.bufferMove(proxyId);\n }\n\n bufferMove(proxyId: number): void {\n this.m_moveBuffer.push(proxyId);\n }\n\n unbufferMove(proxyId: number): void {\n for (let i = 0; i < this.m_moveBuffer.length; ++i) {\n if (this.m_moveBuffer[i] === proxyId) {\n this.m_moveBuffer[i] = null;\n }\n }\n }\n\n /**\n * Update the pairs. This results in pair callbacks. This can only add pairs.\n */\n updatePairs(addPairCallback: (userDataA: FixtureProxy, userDataB: FixtureProxy) => void): void {\n _ASSERT && common.assert(typeof addPairCallback === 'function');\n this.m_callback = addPairCallback;\n\n // Perform tree queries for all moving proxies.\n while (this.m_moveBuffer.length > 0) {\n this.m_queryProxyId = this.m_moveBuffer.pop();\n if (this.m_queryProxyId === null) {\n continue;\n }\n\n // We have to query the tree with the fat AABB so that\n // we don't fail to create a pair that may touch later.\n const fatAABB = this.m_tree.getFatAABB(this.m_queryProxyId);\n\n // Query tree, create pairs and add them pair buffer.\n this.m_tree.query(fatAABB, this.queryCallback);\n }\n\n // Try to keep the tree balanced.\n // this.m_tree.rebalance(4);\n }\n\n queryCallback = (proxyId: number): boolean => {\n // A proxy cannot form a pair with itself.\n if (proxyId === this.m_queryProxyId) {\n return true;\n }\n\n const proxyIdA = Math.min(proxyId, this.m_queryProxyId);\n const proxyIdB = Math.max(proxyId, this.m_queryProxyId);\n\n // TODO: Skip any duplicate pairs.\n\n const userDataA = this.m_tree.getUserData(proxyIdA);\n const userDataB = this.m_tree.getUserData(proxyIdB);\n\n // Send the pairs back to the client.\n this.m_callback(userDataA, userDataB);\n\n return true;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from './Vec2';\nimport Math from './Math';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport default class Rot {\n s: number;\n c: number;\n\n /** Initialize from an angle in radians. */\n constructor(angle?: number | Rot) {\n if (!(this instanceof Rot)) {\n return new Rot(angle);\n }\n if (typeof angle === 'number') {\n this.setAngle(angle);\n } else if (typeof angle === 'object') {\n this.setRot(angle);\n } else {\n this.setIdentity();\n }\n }\n\n /** @internal */\n static neo(angle: number): Rot {\n const obj = Object.create(Rot.prototype);\n obj.setAngle(angle);\n return obj;\n }\n\n static clone(rot: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n const obj = Object.create(Rot.prototype);\n obj.s = rot.s;\n obj.c = rot.c;\n return obj;\n }\n\n static identity(): Rot {\n const obj = Object.create(Rot.prototype);\n obj.s = 0.0;\n obj.c = 1.0;\n return obj;\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.s) && Math.isFinite(obj.c);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Rot.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Rot!');\n }\n }\n\n /** Set to the identity rotation. */\n setIdentity(): void {\n this.s = 0.0;\n this.c = 1.0;\n }\n\n set(angle: number | Rot): void {\n if (typeof angle === 'object') {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n\n } else {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n }\n\n setRot(angle: Rot): void {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n }\n\n /** Set using an angle in radians. */\n setAngle(angle: number): void {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n\n /** Get the angle in radians. */\n getAngle(): number {\n return Math.atan2(this.s, this.c);\n }\n\n /** Get the x-axis. */\n getXAxis(): Vec2 {\n return Vec2.neo(this.c, this.s);\n }\n\n /** Get the u-axis. */\n getYAxis(): Vec2 {\n return Vec2.neo(-this.s, this.c);\n }\n\n /** Multiply two rotations: q * r */\n static mul(rot: Rot, m: Rot): Rot;\n /** Rotate a vector */\n static mul(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(rot, m) {\n _ASSERT && Rot.assert(rot);\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Multiply two rotations: q * r */\n static mulRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n }\n\n /** Rotate a vector */\n static mulVec2(rot: Rot, m: Vec2): Vec2 {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n\n static mulSub(rot: Rot, v: Vec2, w: Vec2): Vec2 {\n const x = rot.c * (v.x - w.x) - rot.s * (v.y - w.y);\n const y = rot.s * (v.x - w.x) + rot.c * (v.y - w.y);\n return Vec2.neo(x, y);\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulT(rot: Rot, m: Rot): Rot;\n /** Inverse rotate a vector */\n static mulT(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(rot, m) {\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulTRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n }\n\n /** Inverse rotate a vector */\n static mulTVec2(rot: Rot, m: Vec2): Vec2 {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from './Vec2';\nimport Rot from './Rot';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A transform contains translation and rotation. It is used to represent the\n * position and orientation of rigid frames. Initialize using a position vector\n * and a rotation.\n */\nexport default class Transform {\n /** position */\n p: Vec2;\n\n /** rotation */\n q: Rot;\n\n constructor(position?: Vec2, rotation?: number) {\n if (!(this instanceof Transform)) {\n return new Transform(position, rotation);\n }\n this.p = Vec2.zero();\n this.q = Rot.identity();\n if (typeof position !== 'undefined') {\n this.p.setVec2(position);\n }\n if (typeof rotation !== 'undefined') {\n this.q.setAngle(rotation);\n }\n }\n\n static clone(xf: Transform): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(xf.p);\n obj.q = Rot.clone(xf.q);\n return obj;\n }\n\n /** @internal */\n static neo(position: Vec2, rotation: Rot): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(position);\n obj.q = Rot.clone(rotation);\n return obj;\n }\n\n static identity(): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.zero();\n obj.q = Rot.identity();\n return obj;\n }\n\n /**\n * Set this to the identity transform.\n */\n setIdentity(): void {\n this.p.setZero();\n this.q.setIdentity();\n }\n\n set(position: Vec2, rotation: number): void;\n set(xf: Transform): void;\n /**\n * Set this based on the position and angle.\n */\n // tslint:disable-next-line:typedef\n set(a, b?) {\n if (typeof b === 'undefined') {\n this.p.set(a.p);\n this.q.set(a.q);\n } else {\n this.p.set(a);\n this.q.set(b);\n }\n }\n\n /**\n * Set this based on the position and angle.\n */\n setNum(position: Vec2, rotation: number) {\n this.p.setVec2(position);\n this.q.setAngle(rotation);\n }\n\n setTransform(xf: Transform): void {\n this.p.setVec2(xf.p);\n this.q.setRot(xf.q);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.p) && Rot.isValid(obj.q);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Transform.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Transform!');\n }\n }\n\n static mul(a: Transform, b: Vec2): Vec2;\n static mul(a: Transform, b: Transform): Transform;\n // static mul(a: Transform, b: Vec2[]): Vec2[];\n // static mul(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (Array.isArray(b)) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n\n } else if ('x' in b && 'y' in b) {\n return Transform.mulVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulXf(a, b);\n }\n }\n\n static mulAll(a: Transform, b: Vec2[]): Vec2[];\n static mulAll(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mulAll(a: Transform, b) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static mulFn(a: Transform) {\n _ASSERT && Transform.assert(a);\n return function(b: Vec2): Vec2 {\n return Transform.mul(a, b);\n };\n }\n\n static mulVec2(a: Transform, b: Vec2): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = (a.q.c * b.x - a.q.s * b.y) + a.p.x;\n const y = (a.q.s * b.x + a.q.c * b.y) + a.p.y;\n return Vec2.neo(x, y);\n }\n\n static mulXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p\n // = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p\n const xf = Transform.identity();\n xf.q = Rot.mulRot(a.q, b.q);\n xf.p = Vec2.add(Rot.mulVec2(a.q, b.p), a.p);\n return xf;\n }\n\n static mulT(a: Transform, b: Vec2): Vec2;\n static mulT(a: Transform, b: Transform): Transform;\n // tslint:disable-next-line:typedef\n static mulT(a, b) {\n if ('x' in b && 'y' in b) {\n return Transform.mulTVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulTXf(a, b);\n }\n }\n\n static mulTVec2(a: Transform, b: Vec2): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const px = b.x - a.p.x;\n const py = b.y - a.p.y;\n const x = (a.q.c * px + a.q.s * py);\n const y = (-a.q.s * px + a.q.c * py);\n return Vec2.neo(x, y);\n }\n\n static mulTXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q' * (B.q * v1 + B.p - A.p)\n // = A.q' * B.q * v1 + A.q' * (B.p - A.p)\n const xf = Transform.identity();\n xf.q.setRot(Rot.mulTRot(a.q, b.q));\n xf.p.setVec2(Rot.mulTVec2(a.q, Vec2.sub(b.p, a.p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Math from './Math';\nimport Vec2 from './Vec2';\nimport Rot from './Rot';\nimport Transform from './Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * This describes the motion of a body/shape for TOI computation. Shapes are\n * defined with respect to the body origin, which may not coincide with the\n * center of mass. However, to support dynamics we must interpolate the center\n * of mass position.\n */\nexport default class Sweep {\n /** Local center of mass position */\n localCenter: Vec2;\n\n /** World center position */\n c: Vec2;\n\n /** World angle */\n a: number;\n\n /** Fraction of the current time step in the range [0,1], c0 and a0 are c and a at alpha0. */\n alpha0: number;\n\n c0: Vec2;\n a0: number;\n\n constructor(c?: Vec2, a?: number) {\n _ASSERT && common.assert(typeof c === 'undefined');\n _ASSERT && common.assert(typeof a === 'undefined');\n this.localCenter = Vec2.zero();\n this.c = Vec2.zero();\n this.a = 0;\n this.alpha0 = 0;\n this.c0 = Vec2.zero();\n this.a0 = 0;\n }\n\n setTransform(xf: Transform): void {\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n\n this.a = xf.q.getAngle();\n this.a0 = xf.q.getAngle();\n }\n\n setLocalCenter(localCenter: Vec2, xf: Transform): void {\n this.localCenter.setVec2(localCenter);\n\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n }\n\n /**\n * Get the interpolated transform at a specific time.\n *\n * @param xf\n * @param beta A factor in [0,1], where 0 indicates alpha0\n */\n getTransform(xf: Transform, beta: number = 0): void {\n xf.q.setAngle((1.0 - beta) * this.a0 + beta * this.a);\n xf.p.setCombine((1.0 - beta), this.c0, beta, this.c);\n\n // shift to origin\n xf.p.sub(Rot.mulVec2(xf.q, this.localCenter));\n }\n\n /**\n * Advance the sweep forward, yielding a new initial state.\n *\n * @param alpha The new initial time\n */\n advance(alpha: number): void {\n _ASSERT && common.assert(this.alpha0 < 1.0);\n const beta = (alpha - this.alpha0) / (1.0 - this.alpha0);\n this.c0.setCombine(beta, this.c, 1 - beta, this.c0);\n this.a0 = beta * this.a + (1 - beta) * this.a0;\n this.alpha0 = alpha;\n }\n\n forward(): void {\n this.a0 = this.a;\n this.c0.setVec2(this.c);\n }\n\n /**\n * normalize the angles in radians to be between -pi and pi.\n */\n normalize(): void {\n const a0 = Math.mod(this.a0, -Math.PI, +Math.PI);\n this.a -= this.a0 - a0;\n this.a0 = a0;\n }\n\n clone(): Sweep {\n const clone = new Sweep();\n clone.localCenter.setVec2(this.localCenter);\n clone.alpha0 = this.alpha0;\n clone.a0 = this.a0;\n clone.a = this.a;\n clone.c0.setVec2(this.c0);\n clone.c.setVec2(this.c);\n return clone;\n }\n\n set(that: Sweep): void {\n this.localCenter.setVec2(that.localCenter);\n this.alpha0 = that.alpha0;\n this.a0 = that.a0;\n this.a = that.a;\n this.c0.setVec2(that.c0);\n this.c.setVec2(that.c);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Vec2 from '../common/Vec2';\n\nexport default class Velocity {\n /** linear */\n v: Vec2;\n\n /** angular */\n w: number;\n\n constructor() {\n this.v = Vec2.zero();\n this.w = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Vec2 from '../common/Vec2';\nimport Rot from '../common/Rot';\nimport Transform from '../common/Transform';\n\n\nexport default class Position {\n /** location */\n c: Vec2;\n\n /** angle */\n a: number;\n\n constructor() {\n this.c = Vec2.zero();\n this.a = 0;\n }\n\n getTransform(xf: Transform, p: Vec2): Transform {\n xf.q.setAngle(this.a);\n xf.p.setVec2(Vec2.sub(this.c, Rot.mulVec2(xf.q, p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../dynamics/Body';\nimport AABB, { RayCastOutput, RayCastInput } from './AABB';\nimport { DistanceProxy } from './Distance';\nimport type Transform from '../common/Transform';\nimport type Vec2 from '../common/Vec2';\n\n\n/**\n * A shape is used for collision detection. You can create a shape however you\n * like. Shapes used for simulation in World are created automatically when a\n * Fixture is created. Shapes may encapsulate one or more child shapes.\n */\nexport default abstract class Shape {\n m_type: ShapeType;\n m_radius: number;\n\n /** @internal */\n _reset(): void {\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return typeof obj.m_type === 'string' && typeof obj.m_radius === 'number';\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n /**\n * Get the type of this shape. You can use this to down cast to the concrete\n * shape.\n *\n * @return the shape type.\n */\n getType(): ShapeType {\n return this.m_type;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n abstract _clone(): Shape;\n\n /**\n * Get the number of child primitives.\n */\n abstract getChildCount(): number;\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n abstract testPoint(xf: Transform, p: Vec2): boolean;\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n abstract rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean;\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n abstract computeAABB(aabb: AABB, xf: Transform, childIndex: number): void;\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n abstract computeMass(massData: MassData, density?: number): void;\n\n abstract computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void;\n\n}\n\nexport type ShapeType = \"circle\" | \"edge\" | \"polygon\" | \"chain\";\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport options from '../util/options';\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\nimport AABB, { RayCastInput, RayCastOutput } from '../collision/AABB';\nimport Shape, { ShapeType } from '../collision/Shape';\nimport Body, { MassData } from \"./Body\";\nimport BroadPhase from \"../collision/BroadPhase\";\nimport Transform from \"../common/Transform\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A fixture definition is used to create a fixture. This class defines an\n * abstract fixture definition. You can reuse fixture definitions safely.\n */\nexport interface FixtureOpt {\n userData?: unknown;\n /**\n * The friction coefficient, usually in the range [0,1]\n */\n friction?: number;\n /**\n * The restitution (elasticity) usually in the range [0,1]\n */\n restitution?: number;\n /**\n * The density, usually in kg/m^2\n */\n density?: number;\n /**\n * A sensor shape collects contact information but never generates a collision response.\n */\n isSensor?: boolean;\n /**\n * Zero, positive or negative collision group.\n * Fixtures with same positive groupIndex always collide and fixtures with same negative groupIndex never collide.\n */\n filterGroupIndex?: number;\n /**\n * Collision category bit or bits that this fixture belongs to.\n * If groupIndex is zero or not matching, then at least one bit in this fixture categoryBits should match other fixture maskBits and vice versa.\n */\n filterCategoryBits?: number;\n /**\n * Collision category bit or bits that this fixture accept for collision.\n */\n filterMaskBits?: number;\n}\n\nexport interface FixtureDef extends FixtureOpt {\n shape: Shape;\n}\n\nconst FixtureDefDefault: FixtureOpt = {\n userData : null,\n friction : 0.2,\n restitution : 0.0,\n density : 0.0,\n isSensor : false,\n\n filterGroupIndex : 0,\n filterCategoryBits : 0x0001,\n filterMaskBits : 0xFFFF\n};\n\n/**\n * This proxy is used internally to connect shape children to the broad-phase.\n */\nexport class FixtureProxy {\n aabb: AABB;\n fixture: Fixture;\n childIndex: number;\n proxyId: number;\n constructor(fixture: Fixture, childIndex: number) {\n this.aabb = new AABB();\n this.fixture = fixture;\n this.childIndex = childIndex;\n this.proxyId;\n }\n}\n\n/**\n * A fixture is used to attach a shape to a body for collision detection. A\n * fixture inherits its transform from its parent. Fixtures hold additional\n * non-geometric data such as friction, collision filters, etc.\n *\n * To create a new Fixture use {@link Body.createFixture}.\n */\nexport default class Fixture {\n /** @internal */ m_body: Body;\n /** @internal */ m_friction: number;\n /** @internal */ m_restitution: number;\n /** @internal */ m_density: number;\n /** @internal */ m_isSensor: boolean;\n /** @internal */ m_filterGroupIndex: number;\n /** @internal */ m_filterCategoryBits: number;\n /** @internal */ m_filterMaskBits: number;\n /** @internal */ m_shape: Shape;\n /** @internal */ m_next: Fixture | null;\n /** @internal */ m_proxies: FixtureProxy[];\n /** @internal */ m_proxyCount: number;\n /** @internal */ m_userData: unknown;\n\n constructor(body: Body, def: FixtureDef);\n constructor(body: Body, shape: Shape, def?: FixtureOpt);\n constructor(body: Body, shape: Shape, density?: number);\n // tslint:disable-next-line:typedef\n /** @internal */ constructor(body: Body, shape?, def?) {\n if (shape.shape) {\n def = shape;\n shape = shape.shape;\n\n } else if (typeof def === 'number') {\n def = {density : def};\n }\n\n def = options(def, FixtureDefDefault);\n\n this.m_body = body;\n\n this.m_friction = def.friction;\n this.m_restitution = def.restitution;\n this.m_density = def.density;\n this.m_isSensor = def.isSensor;\n\n this.m_filterGroupIndex = def.filterGroupIndex;\n this.m_filterCategoryBits = def.filterCategoryBits;\n this.m_filterMaskBits = def.filterMaskBits;\n\n // TODO validate shape\n this.m_shape = shape; // .clone();\n\n this.m_next = null;\n\n this.m_proxies = [];\n this.m_proxyCount = 0;\n\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n\n this.m_userData = def.userData;\n }\n\n /**\n * Re-setup fixture.\n * @internal\n */\n _reset(): void {\n const body = this.getBody();\n const broadPhase = body.m_world.m_broadPhase;\n this.destroyProxies(broadPhase);\n if (this.m_shape._reset) {\n this.m_shape._reset();\n }\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n this.createProxies(broadPhase, body.m_xf);\n body.resetMassData();\n }\n\n /** @internal */\n _serialize(): object {\n return {\n friction: this.m_friction,\n restitution: this.m_restitution,\n density: this.m_density,\n isSensor: this.m_isSensor,\n\n filterGroupIndex: this.m_filterGroupIndex,\n filterCategoryBits: this.m_filterCategoryBits,\n filterMaskBits: this.m_filterMaskBits,\n\n shape: this.m_shape,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, body: any, restore: any): Fixture {\n const shape = restore(Shape, data.shape);\n const fixture = shape && new Fixture(body, shape, data);\n return fixture;\n }\n\n /**\n * Get the type of the child shape. You can use this to down cast to the\n * concrete shape.\n */\n getType(): ShapeType {\n return this.m_shape.getType();\n }\n\n /**\n * Get the child shape. You can modify the child shape, however you should not\n * change the number of vertices because this will crash some collision caching\n * mechanisms. Manipulating the shape may lead to non-physical behavior.\n */\n getShape(): Shape {\n return this.m_shape;\n }\n\n /**\n * A sensor shape collects contact information but never generates a collision\n * response.\n */\n isSensor(): boolean {\n return this.m_isSensor;\n }\n\n /**\n * Set if this fixture is a sensor.\n */\n setSensor(sensor: boolean): void {\n if (sensor != this.m_isSensor) {\n this.m_body.setAwake(true);\n this.m_isSensor = sensor;\n }\n }\n\n // /**\n // * Get the contact filtering data.\n // */\n // getFilterData() {\n // return this.m_filter;\n // }\n\n /**\n * Get the user data that was assigned in the fixture definition. Use this to\n * store your application specific data.\n */\n getUserData(): unknown {\n return this.m_userData;\n }\n\n /**\n * Set the user data. Use this to store your application specific data.\n */\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get the parent body of this fixture. This is null if the fixture is not\n * attached.\n */\n getBody(): Body {\n return this.m_body;\n }\n\n /**\n * Get the next fixture in the parent body's fixture list.\n */\n getNext(): Fixture | null {\n return this.m_next;\n }\n\n /**\n * Get the density of this fixture.\n */\n getDensity(): number {\n return this.m_density;\n }\n\n /**\n * Set the density of this fixture. This will _not_ automatically adjust the\n * mass of the body. You must call Body.resetMassData to update the body's mass.\n */\n setDensity(density: number): void {\n _ASSERT && common.assert(Math.isFinite(density) && density >= 0.0);\n this.m_density = density;\n }\n\n /**\n * Get the coefficient of friction, usually in the range [0,1].\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Set the coefficient of friction. This will not change the friction of\n * existing contacts.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the coefficient of restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Set the coefficient of restitution. This will not change the restitution of\n * existing contacts.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Test a point in world coordinates for containment in this fixture.\n */\n testPoint(p: Vec2): boolean {\n return this.m_shape.testPoint(this.m_body.getTransform(), p);\n }\n\n /**\n * Cast a ray against this shape.\n */\n rayCast(output: RayCastOutput, input: RayCastInput, childIndex: number): boolean {\n return this.m_shape.rayCast(output, input, this.m_body.getTransform(), childIndex);\n }\n\n /**\n * Get the mass data for this fixture. The mass data is based on the density and\n * the shape. The rotational inertia is about the shape's origin. This operation\n * may be expensive.\n */\n getMassData(massData: MassData): void {\n this.m_shape.computeMass(massData, this.m_density);\n }\n\n /**\n * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a\n * more accurate AABB, compute it using the shape and the body transform.\n */\n getAABB(childIndex: number): AABB {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_proxyCount);\n return this.m_proxies[childIndex].aabb;\n }\n\n /**\n * These support body activation/deactivation.\n */\n createProxies(broadPhase: BroadPhase, xf: Transform): void {\n _ASSERT && common.assert(this.m_proxyCount == 0);\n\n // Create proxies in the broad-phase.\n this.m_proxyCount = this.m_shape.getChildCount();\n\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n this.m_shape.computeAABB(proxy.aabb, xf, i);\n proxy.proxyId = broadPhase.createProxy(proxy.aabb, proxy);\n }\n }\n\n destroyProxies(broadPhase: BroadPhase): void {\n // Destroy proxies in the broad-phase.\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n broadPhase.destroyProxy(proxy.proxyId);\n proxy.proxyId = null;\n }\n\n this.m_proxyCount = 0;\n }\n\n /**\n * Updates this fixture proxy in broad-phase (with combined AABB of current and\n * next transformation).\n */\n synchronize(broadPhase: BroadPhase, xf1: Transform, xf2: Transform): void {\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n // Compute an AABB that covers the swept shape (may miss some rotation\n // effect).\n const aabb1 = new AABB();\n const aabb2 = new AABB();\n this.m_shape.computeAABB(aabb1, xf1, proxy.childIndex);\n this.m_shape.computeAABB(aabb2, xf2, proxy.childIndex);\n\n proxy.aabb.combine(aabb1, aabb2);\n\n const displacement = Vec2.sub(xf2.p, xf1.p);\n\n broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement);\n }\n }\n\n /**\n * Set the contact filtering data. This will not update contacts until the next\n * time step when either parent body is active and awake. This automatically\n * calls refilter.\n */\n setFilterData(filter: { groupIndex: number, categoryBits: number, maskBits: number }): void {\n this.m_filterGroupIndex = filter.groupIndex;\n this.m_filterCategoryBits = filter.categoryBits;\n this.m_filterMaskBits = filter.maskBits;\n this.refilter();\n }\n\n getFilterGroupIndex(): number {\n return this.m_filterGroupIndex;\n }\n\n setFilterGroupIndex(groupIndex: number): void {\n this.m_filterGroupIndex = groupIndex;\n }\n\n getFilterCategoryBits(): number {\n return this.m_filterCategoryBits;\n }\n\n setFilterCategoryBits(categoryBits: number): void {\n this.m_filterCategoryBits = categoryBits;\n }\n\n getFilterMaskBits(): number {\n return this.m_filterMaskBits;\n }\n\n setFilterMaskBits(maskBits: number): void {\n this.m_filterMaskBits = maskBits;\n }\n\n /**\n * Call this if you want to establish collision that was previously disabled by\n * ContactFilter.\n */\n refilter(): void {\n if (this.m_body == null) {\n return;\n }\n\n // Flag associated contacts for filtering.\n let edge = this.m_body.getContactList();\n while (edge) {\n const contact = edge.contact;\n const fixtureA = contact.getFixtureA();\n const fixtureB = contact.getFixtureB();\n if (fixtureA == this || fixtureB == this) {\n contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n\n const world = this.m_body.getWorld();\n\n if (world == null) {\n return;\n }\n\n // Touch each proxy so that new pairs may be created\n const broadPhase = world.m_broadPhase;\n for (let i = 0; i < this.m_proxyCount; ++i) {\n broadPhase.touchProxy(this.m_proxies[i].proxyId);\n }\n }\n\n /**\n * Implement this method to provide collision filtering, if you want finer\n * control over contact creation.\n *\n * Return true if contact calculations should be performed between these two\n * fixtures.\n *\n * Warning: for performance reasons this is only called when the AABBs begin to\n * overlap.\n */\n shouldCollide(that: Fixture): boolean {\n\n if (that.m_filterGroupIndex === this.m_filterGroupIndex && that.m_filterGroupIndex !== 0) {\n return that.m_filterGroupIndex > 0;\n }\n\n const collideA = (that.m_filterMaskBits & this.m_filterCategoryBits) !== 0;\n const collideB = (that.m_filterCategoryBits & this.m_filterMaskBits) !== 0;\n const collide = collideA && collideB;\n return collide;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nimport common from '../util/common';\nimport options from '../util/options';\nimport Vec2 from '../common/Vec2';\nimport Rot from '../common/Rot';\nimport Math from '../common/Math';\nimport Sweep from '../common/Sweep';\nimport Transform from '../common/Transform';\nimport Velocity from './Velocity';\nimport Position from './Position';\nimport Fixture, { FixtureDef, FixtureOpt } from './Fixture';\nimport Shape from '../collision/Shape';\nimport { JointEdge } from \"./Joint\";\nimport World from \"./World\";\nimport { ContactEdge } from \"./Contact\";\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\nexport type BodyType = 'static' | 'kinematic' | 'dynamic';\n\nconst STATIC = 'static';\nconst KINEMATIC = 'kinematic';\nconst DYNAMIC = 'dynamic';\n\nexport interface BodyDef {\n /**\n * Body types are static, kinematic, or dynamic. Note: if a dynamic\n * body would have zero mass, the mass is set to one.\n */\n type?: BodyType;\n /**\n * The world position of the body. Avoid creating bodies at the\n * origin since this can lead to many overlapping shapes.\n */\n position?: Vec2;\n /**\n * The world angle of the body in radians.\n */\n angle?: number;\n /**\n * The linear velocity of the body's origin in world co-ordinates.\n */\n linearVelocity?: Vec2;\n angularVelocity?: number;\n /**\n * Linear damping is use to reduce the linear velocity. The\n * damping parameter can be larger than 1.0 but the damping effect becomes\n * sensitive to the time step when the damping parameter is large.\n */\n linearDamping?: number;\n /**\n * Angular damping is use to reduce the angular velocity.\n * The damping parameter can be larger than 1.0 but the damping effect\n * becomes sensitive to the time step when the damping parameter is large.\n */\n angularDamping?: number;\n /**\n * Should this body be prevented from rotating? Useful for characters.\n */\n fixedRotation?: boolean;\n /**\n * Is this a fast moving body that should be prevented from\n * tunneling through other moving bodies? Note that all bodies are\n * prevented from tunneling through kinematic and static bodies. This\n * setting is only considered on dynamic bodies. Warning: You should use\n * this flag sparingly since it increases processing time.\n */\n bullet?: boolean;\n gravityScale?: number;\n /**\n * Set this flag to false if this body should never fall asleep. Note that this increases CPU usage.\n */\n allowSleep?: boolean;\n /**\n * Is this body initially awake or sleeping?\n */\n awake?: boolean;\n /**\n * Does this body start out active?\n */\n active?: boolean;\n userData?: any;\n}\n\nconst BodyDefDefault: BodyDef = {\n type : STATIC,\n position : Vec2.zero(),\n angle : 0.0,\n\n linearVelocity : Vec2.zero(),\n angularVelocity : 0.0,\n\n linearDamping : 0.0,\n angularDamping : 0.0,\n\n fixedRotation : false,\n bullet : false,\n gravityScale : 1.0,\n\n allowSleep : true,\n awake : true,\n active : true,\n\n userData : null\n};\n\n/**\n * MassData This holds the mass data computed for a shape.\n */\nexport class MassData {\n /** The mass of the shape, usually in kilograms. */\n mass: number = 0;\n /** The position of the shape's centroid relative to the shape's origin. */\n center: Vec2 = Vec2.zero();\n /** The rotational inertia of the shape about the local origin. */\n I: number = 0;\n}\n\n/**\n * A rigid body composed of one or more fixtures.\n *\n * To create a new Body use {@link World.createBody}.\n */\nexport default class Body {\n /**\n * A static body does not move under simulation and behaves as if it has infinite mass.\n * Internally, zero is stored for the mass and the inverse mass.\n * Static bodies can be moved manually by the user.\n * A static body has zero velocity.\n * Static bodies do not collide with other static or kinematic bodies.\n */\n static readonly STATIC: BodyType = 'static';\n /**\n * A kinematic body moves under simulation according to its velocity.\n * Kinematic bodies do not respond to forces.\n * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity.\n * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass.\n * Kinematic bodies do not collide with other kinematic or static bodies.\n */\n static readonly KINEMATIC: BodyType = 'kinematic';\n\n /**\n * A dynamic body is fully simulated.\n * They can be moved manually by the user, but normally they move according to forces.\n * A dynamic body can collide with all body types.\n * A dynamic body always has finite, non-zero mass.\n * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate.\n */\n static readonly DYNAMIC: BodyType = 'dynamic';\n\n /** @internal */ m_world: World;\n /** @internal */ m_awakeFlag: boolean;\n /** @internal */ m_autoSleepFlag: boolean;\n /** @internal */ m_bulletFlag: boolean;\n /** @internal */ m_fixedRotationFlag: boolean;\n /** @internal */ m_activeFlag: boolean;\n /** @internal */ m_islandFlag: boolean;\n /** @internal */ m_toiFlag: boolean;\n /** @internal */ m_userData: unknown;\n /** @internal */ m_type: BodyType;\n /** @internal */ m_mass: number;\n /** @internal */ m_invMass: number;\n /** @internal Rotational inertia about the center of mass. */\n m_I: number;\n /** @internal */ m_invI: number;\n /** @internal the body origin transform */\n m_xf: Transform;\n /** @internal the swept motion for CCD */\n m_sweep: Sweep;\n // position and velocity correction\n /** @internal */ c_velocity: Velocity;\n /** @internal */ c_position: Position;\n /** @internal */ m_force: Vec2;\n /** @internal */ m_torque: number;\n /** @internal */ m_linearVelocity: Vec2;\n /** @internal */ m_angularVelocity: number;\n /** @internal */ m_linearDamping: number;\n /** @internal */ m_angularDamping: number;\n /** @internal */ m_gravityScale: number;\n /** @internal */ m_sleepTime: number;\n /** @internal */ m_jointList: JointEdge | null;\n /** @internal */ m_contactList: ContactEdge | null;\n /** @internal */ m_fixtureList: Fixture | null;\n /** @internal */ m_prev: Body | null;\n /** @internal */ m_next: Body | null;\n /** @internal */ m_destroyed: boolean;\n\n /** @internal */\n constructor(world: World, def: BodyDef) {\n def = options(def, BodyDefDefault);\n\n _ASSERT && common.assert(Vec2.isValid(def.position));\n _ASSERT && common.assert(Vec2.isValid(def.linearVelocity));\n _ASSERT && common.assert(Math.isFinite(def.angle));\n _ASSERT && common.assert(Math.isFinite(def.angularVelocity));\n _ASSERT && common.assert(Math.isFinite(def.angularDamping) && def.angularDamping >= 0.0);\n _ASSERT && common.assert(Math.isFinite(def.linearDamping) && def.linearDamping >= 0.0);\n\n this.m_world = world;\n\n this.m_awakeFlag = def.awake;\n this.m_autoSleepFlag = def.allowSleep;\n this.m_bulletFlag = def.bullet;\n this.m_fixedRotationFlag = def.fixedRotation;\n this.m_activeFlag = def.active;\n\n this.m_islandFlag = false;\n this.m_toiFlag = false;\n\n this.m_userData = def.userData;\n this.m_type = def.type;\n\n if (this.m_type == DYNAMIC) {\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n } else {\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n }\n\n // Rotational inertia about the center of mass.\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n // the body origin transform\n this.m_xf = Transform.identity();\n this.m_xf.p = Vec2.clone(def.position);\n this.m_xf.q.setAngle(def.angle);\n\n // the swept motion for CCD\n this.m_sweep = new Sweep();\n this.m_sweep.setTransform(this.m_xf);\n\n // position and velocity correction\n this.c_velocity = new Velocity();\n this.c_position = new Position();\n\n this.m_force = Vec2.zero();\n this.m_torque = 0.0;\n\n this.m_linearVelocity = Vec2.clone(def.linearVelocity);\n this.m_angularVelocity = def.angularVelocity;\n\n this.m_linearDamping = def.linearDamping;\n this.m_angularDamping = def.angularDamping;\n this.m_gravityScale = def.gravityScale;\n\n this.m_sleepTime = 0.0;\n\n this.m_jointList = null;\n this.m_contactList = null;\n this.m_fixtureList = null;\n\n this.m_prev = null;\n this.m_next = null;\n\n this.m_destroyed = false;\n }\n\n /** @internal */\n _serialize(): object {\n const fixtures = [];\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n fixtures.push(f);\n }\n return {\n type: this.m_type,\n bullet: this.m_bulletFlag,\n position: this.m_xf.p,\n angle: this.m_xf.q.getAngle(),\n linearVelocity: this.m_linearVelocity,\n angularVelocity: this.m_angularVelocity,\n fixtures,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): Body {\n const body = new Body(world, data);\n\n if (data.fixtures) {\n for (let i = data.fixtures.length - 1; i >= 0; i--) {\n const fixture = restore(Fixture, data.fixtures[i], body);\n body._addFixture(fixture);\n }\n }\n return body;\n }\n\n isWorldLocked(): boolean {\n return this.m_world && this.m_world.isLocked() ? true : false;\n }\n\n getWorld(): World {\n return this.m_world;\n }\n\n getNext(): Body | null {\n return this.m_next;\n }\n\n setUserData(data: any): void {\n this.m_userData = data;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n getFixtureList(): Fixture | null {\n return this.m_fixtureList;\n }\n\n getJointList(): JointEdge | null {\n return this.m_jointList;\n }\n\n /**\n * Warning: this list changes during the time step and you may miss some\n * collisions if you don't use ContactListener.\n */\n getContactList(): ContactEdge | null {\n return this.m_contactList;\n }\n\n isStatic(): boolean {\n return this.m_type == STATIC;\n }\n\n isDynamic(): boolean {\n return this.m_type == DYNAMIC;\n }\n\n isKinematic(): boolean {\n return this.m_type == KINEMATIC;\n }\n\n /**\n * This will alter the mass and velocity.\n */\n setStatic(): Body {\n this.setType(STATIC);\n return this;\n }\n\n setDynamic(): Body {\n this.setType(DYNAMIC);\n return this;\n }\n\n setKinematic(): Body {\n this.setType(KINEMATIC);\n return this;\n }\n\n /**\n * @internal\n */\n getType(): BodyType {\n return this.m_type;\n }\n\n /**\n * @internal\n */\n setType(type: BodyType): void {\n _ASSERT && common.assert(type === STATIC || type === KINEMATIC || type === DYNAMIC);\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type == type) {\n return;\n }\n\n this.m_type = type;\n\n this.resetMassData();\n\n if (this.m_type == STATIC) {\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_sweep.forward();\n this.synchronizeFixtures();\n }\n\n this.setAwake(true);\n\n this.m_force.setZero();\n this.m_torque = 0.0;\n\n // Delete the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n\n // Touch the proxies so that new contacts will be created (when appropriate)\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n const proxyCount = f.m_proxyCount;\n for (let i = 0; i < proxyCount; ++i) {\n broadPhase.touchProxy(f.m_proxies[i].proxyId);\n }\n }\n }\n\n isBullet(): boolean {\n return this.m_bulletFlag;\n }\n\n /**\n * Should this body be treated like a bullet for continuous collision detection?\n */\n setBullet(flag: boolean): void {\n this.m_bulletFlag = !!flag;\n }\n\n isSleepingAllowed(): boolean {\n return this.m_autoSleepFlag;\n }\n\n setSleepingAllowed(flag: boolean): void {\n this.m_autoSleepFlag = !!flag;\n if (this.m_autoSleepFlag == false) {\n this.setAwake(true);\n }\n }\n\n isAwake(): boolean {\n return this.m_awakeFlag;\n }\n\n /**\n * Set the sleep state of the body. A sleeping body has very low CPU cost.\n *\n * @param flag Set to true to wake the body, false to put it to sleep.\n */\n setAwake(flag: boolean): void {\n if (flag) {\n if (this.m_awakeFlag == false) {\n this.m_awakeFlag = true;\n this.m_sleepTime = 0.0;\n }\n } else {\n this.m_awakeFlag = false;\n this.m_sleepTime = 0.0;\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_force.setZero();\n this.m_torque = 0.0;\n }\n }\n\n isActive(): boolean {\n return this.m_activeFlag;\n }\n\n /**\n * Set the active state of the body. An inactive body is not simulated and\n * cannot be collided with or woken up. If you pass a flag of true, all fixtures\n * will be added to the broad-phase. If you pass a flag of false, all fixtures\n * will be removed from the broad-phase and all contacts will be destroyed.\n * Fixtures and joints are otherwise unaffected.\n *\n * You may continue to create/destroy fixtures and joints on inactive bodies.\n * Fixtures on an inactive body are implicitly inactive and will not participate\n * in collisions, ray-casts, or queries. Joints connected to an inactive body\n * are implicitly inactive. An inactive body is still owned by a World object\n * and remains\n */\n setActive(flag: boolean): void {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (flag == this.m_activeFlag) {\n return;\n }\n\n this.m_activeFlag = !!flag;\n\n if (this.m_activeFlag) {\n // Create all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.createProxies(broadPhase, this.m_xf);\n }\n // Contacts are created the next time step.\n\n } else {\n // Destroy all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.destroyProxies(broadPhase);\n }\n\n // Destroy the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n }\n }\n\n isFixedRotation(): boolean {\n return this.m_fixedRotationFlag;\n }\n\n /**\n * Set this body to have fixed rotation. This causes the mass to be reset.\n */\n setFixedRotation(flag: boolean): void {\n if (this.m_fixedRotationFlag == flag) {\n return;\n }\n\n this.m_fixedRotationFlag = !!flag;\n\n this.m_angularVelocity = 0.0;\n\n this.resetMassData();\n }\n\n /**\n * Get the world transform for the body's origin.\n */\n getTransform(): Transform {\n return this.m_xf;\n }\n\n /**\n * Set the position of the body's origin and rotation. Manipulating a body's\n * transform may cause non-physical behavior. Note: contacts are updated on the\n * next call to World.step.\n *\n * @param position The world position of the body's local origin.\n * @param angle The world rotation in radians.\n */\n setTransform(position: Vec2, angle: number): void {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n this.m_xf.setNum(position, angle);\n this.m_sweep.setTransform(this.m_xf);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, this.m_xf, this.m_xf);\n }\n }\n\n synchronizeTransform(): void {\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Update fixtures in broad-phase.\n */\n synchronizeFixtures(): void {\n const xf = Transform.identity();\n\n this.m_sweep.getTransform(xf, 0);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, xf, this.m_xf);\n }\n }\n\n /**\n * Used in TOI.\n */\n advance(alpha: number): void {\n // Advance to the new safe time. This doesn't sync the broad-phase.\n this.m_sweep.advance(alpha);\n this.m_sweep.c.setVec2(this.m_sweep.c0);\n this.m_sweep.a = this.m_sweep.a0;\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Get the world position for the body's origin.\n */\n getPosition(): Vec2 {\n return this.m_xf.p;\n }\n\n setPosition(p: Vec2): void {\n this.setTransform(p, this.m_sweep.a);\n }\n\n /**\n * Get the current world rotation angle in radians.\n */\n getAngle(): number {\n return this.m_sweep.a;\n }\n\n setAngle(angle: number): void {\n this.setTransform(this.m_xf.p, angle);\n }\n\n /**\n * Get the world position of the center of mass.\n */\n getWorldCenter(): Vec2 {\n return this.m_sweep.c;\n }\n\n /**\n * Get the local position of the center of mass.\n */\n getLocalCenter(): Vec2 {\n return this.m_sweep.localCenter;\n }\n\n /**\n * Get the linear velocity of the center of mass.\n *\n * @return the linear velocity of the center of mass.\n */\n getLinearVelocity(): Vec2 {\n return this.m_linearVelocity;\n }\n\n /**\n * Get the world linear velocity of a world point attached to this body.\n *\n * @param worldPoint A point in world coordinates.\n */\n getLinearVelocityFromWorldPoint(worldPoint: Vec2): Vec2 {\n const localCenter = Vec2.sub(worldPoint, this.m_sweep.c);\n return Vec2.add(this.m_linearVelocity, Vec2.crossNumVec2(this.m_angularVelocity,\n localCenter));\n }\n\n /**\n * Get the world velocity of a local point.\n *\n * @param localPoint A point in local coordinates.\n */\n getLinearVelocityFromLocalPoint(localPoint: Vec2): Vec2 {\n return this.getLinearVelocityFromWorldPoint(this.getWorldPoint(localPoint));\n }\n\n /**\n * Set the linear velocity of the center of mass.\n *\n * @param v The new linear velocity of the center of mass.\n */\n setLinearVelocity(v: Vec2): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (Vec2.dot(v, v) > 0.0) {\n this.setAwake(true);\n }\n this.m_linearVelocity.setVec2(v);\n }\n\n /**\n * Get the angular velocity.\n *\n * @returns the angular velocity in radians/second.\n */\n getAngularVelocity(): number {\n return this.m_angularVelocity;\n }\n\n /**\n * Set the angular velocity.\n *\n * @param omega The new angular velocity in radians/second.\n */\n setAngularVelocity(w: number): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (w * w > 0.0) {\n this.setAwake(true);\n }\n this.m_angularVelocity = w;\n }\n\n getLinearDamping(): number {\n return this.m_linearDamping;\n }\n\n setLinearDamping(linearDamping: number): void {\n this.m_linearDamping = linearDamping;\n }\n\n getAngularDamping(): number {\n return this.m_angularDamping;\n }\n\n setAngularDamping(angularDamping: number): void {\n this.m_angularDamping = angularDamping;\n }\n\n getGravityScale(): number {\n return this.m_gravityScale;\n }\n\n /**\n * Scale the gravity applied to this body.\n */\n setGravityScale(scale: number): void {\n this.m_gravityScale = scale;\n }\n\n /**\n * Get the total mass of the body.\n *\n * @returns The mass, usually in kilograms (kg).\n */\n getMass(): number {\n return this.m_mass;\n }\n\n /**\n * Get the rotational inertia of the body about the local origin.\n *\n * @return the rotational inertia, usually in kg-m^2.\n */\n getInertia(): number {\n return this.m_I + this.m_mass\n * Vec2.dot(this.m_sweep.localCenter, this.m_sweep.localCenter);\n }\n\n /**\n * Copy the mass data of the body to data.\n */\n getMassData(data: MassData): void {\n data.mass = this.m_mass;\n data.I = this.getInertia();\n data.center.setVec2(this.m_sweep.localCenter);\n }\n\n /**\n * This resets the mass properties to the sum of the mass properties of the\n * fixtures. This normally does not need to be called unless you called\n * SetMassData to override the mass and you later want to reset the mass.\n */\n resetMassData(): void {\n // Compute mass data from shapes. Each shape has its own density.\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n this.m_sweep.localCenter.setZero();\n\n // Static and kinematic bodies have zero mass.\n if (this.isStatic() || this.isKinematic()) {\n this.m_sweep.c0.setVec2(this.m_xf.p);\n this.m_sweep.c.setVec2(this.m_xf.p);\n this.m_sweep.a0 = this.m_sweep.a;\n return;\n }\n\n _ASSERT && common.assert(this.isDynamic());\n\n // Accumulate mass over all fixtures.\n const localCenter = Vec2.zero();\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n if (f.m_density == 0.0) {\n continue;\n }\n\n const massData = new MassData();\n f.getMassData(massData);\n this.m_mass += massData.mass;\n localCenter.addMul(massData.mass, massData.center);\n this.m_I += massData.I;\n }\n\n // Compute center of mass.\n if (this.m_mass > 0.0) {\n this.m_invMass = 1.0 / this.m_mass;\n localCenter.mul(this.m_invMass);\n\n } else {\n // Force all dynamic bodies to have a positive mass.\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n }\n\n if (this.m_I > 0.0 && this.m_fixedRotationFlag == false) {\n // Center the inertia about the center of mass.\n this.m_I -= this.m_mass * Vec2.dot(localCenter, localCenter);\n _ASSERT && common.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n\n } else {\n this.m_I = 0.0;\n this.m_invI = 0.0;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(localCenter, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Set the mass properties to override the mass properties of the fixtures. Note\n * that this changes the center of mass position. Note that creating or\n * destroying fixtures can also alter the mass. This function has no effect if\n * the body isn't dynamic.\n *\n * @param massData The mass properties.\n */\n setMassData(massData: MassData): void {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n this.m_mass = massData.mass;\n if (this.m_mass <= 0.0) {\n this.m_mass = 1.0;\n }\n\n this.m_invMass = 1.0 / this.m_mass;\n\n if (massData.I > 0.0 && this.m_fixedRotationFlag == false) {\n this.m_I = massData.I - this.m_mass\n * Vec2.dot(massData.center, massData.center);\n _ASSERT && common.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(massData.center, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Apply a force at a world point. If the force is not applied at the center of\n * mass, it will generate a torque and affect the angular velocity. This wakes\n * up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyForce(force: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping.\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n this.m_torque += Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), force);\n }\n }\n\n /**\n * Apply a force to the center of mass. This wakes up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param wake Also wake up the body\n */\n applyForceToCenter(force: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n }\n }\n\n /**\n * Apply a torque. This affects the angular velocity without affecting the\n * linear velocity of the center of mass. This wakes up the body.\n *\n * @param torque About the z-axis (out of the screen), usually in N-m.\n * @param wake Also wake up the body\n */\n applyTorque(torque: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_torque += torque;\n }\n }\n\n /**\n * Apply an impulse at a point. This immediately modifies the velocity. It also\n * modifies the angular velocity if the point of application is not at the\n * center of mass. This wakes up the body.\n *\n * @param impulse The world impulse vector, usually in N-seconds or kg-m/s.\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyLinearImpulse(impulse: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_linearVelocity.addMul(this.m_invMass, impulse);\n this.m_angularVelocity += this.m_invI * Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), impulse);\n }\n }\n\n /**\n * Apply an angular impulse.\n *\n * @param impulse The angular impulse in units of kg*m*m/s\n * @param wake Also wake up the body\n */\n applyAngularImpulse(impulse: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_angularVelocity += this.m_invI * impulse;\n }\n }\n\n /**\n * This is used to prevent connected bodies (by joints) from colliding,\n * depending on the joint's collideConnected flag.\n */\n shouldCollide(that: Body): boolean {\n // At least one body should be dynamic.\n if (this.m_type != DYNAMIC && that.m_type != DYNAMIC) {\n return false;\n }\n // Does a joint prevent collision?\n for (let jn = this.m_jointList; jn; jn = jn.next) {\n if (jn.other == that) {\n if (jn.joint.m_collideConnected == false) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addFixture(fixture: Fixture): Fixture {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.createProxies(broadPhase, this.m_xf);\n }\n\n fixture.m_next = this.m_fixtureList;\n this.m_fixtureList = fixture;\n\n // Adjust mass properties if needed.\n if (fixture.m_density > 0.0) {\n this.resetMassData();\n }\n\n // Let the world know we have a new fixture. This will cause new contacts\n // to be created at the beginning of the next time step.\n this.m_world.m_newFixture = true;\n\n return fixture;\n }\n\n /**\n * Creates a fixture and attach it to this body.\n *\n * If the density is non-zero, this function automatically updates the mass of\n * the body.\n *\n * Contacts are not created until the next time step.\n *\n * Warning: This function is locked during callbacks.\n */\n createFixture(def: FixtureDef): Fixture;\n createFixture(shape: Shape, opt?: FixtureOpt): Fixture;\n createFixture(shape: Shape, density?: number): Fixture;\n // tslint:disable-next-line:typedef\n createFixture(shape, fixdef?) {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n const fixture = new Fixture(this, shape, fixdef);\n this._addFixture(fixture);\n return fixture;\n }\n\n /**\n * Destroy a fixture. This removes the fixture from the broad-phase and destroys\n * all contacts associated with this fixture. This will automatically adjust the\n * mass of the body if the body is dynamic and the fixture has positive density.\n * All fixtures attached to a body are implicitly destroyed when the body is\n * destroyed.\n *\n * Warning: This function is locked during callbacks.\n *\n * @param fixture The fixture to be removed.\n */\n destroyFixture(fixture: Fixture): void {\n _ASSERT && common.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n _ASSERT && common.assert(fixture.m_body == this);\n\n // Remove the fixture from this body's singly linked list.\n let found = false;\n if (this.m_fixtureList === fixture) {\n this.m_fixtureList = fixture.m_next;\n found = true;\n\n } else {\n let node = this.m_fixtureList;\n while (node != null) {\n if (node.m_next === fixture) {\n node.m_next = fixture.m_next;\n found = true;\n break;\n }\n node = node.m_next;\n }\n }\n\n // You tried to remove a shape that is not attached to this body.\n _ASSERT && common.assert(found);\n\n // Destroy any contacts associated with the fixture.\n let edge = this.m_contactList;\n while (edge) {\n const c = edge.contact;\n edge = edge.next;\n\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n\n if (fixture == fixtureA || fixture == fixtureB) {\n // This destroys the contact and removes it from\n // this body's contact list.\n this.m_world.destroyContact(c);\n }\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.destroyProxies(broadPhase);\n }\n\n fixture.m_body = null;\n fixture.m_next = null;\n\n this.m_world.publish('remove-fixture', fixture);\n\n // Reset the mass data.\n this.resetMassData();\n }\n\n /**\n * Get the corresponding world point of a local point.\n */\n getWorldPoint(localPoint: Vec2): Vec2 {\n return Transform.mulVec2(this.m_xf, localPoint);\n }\n\n /**\n * Get the corresponding world vector of a local vector.\n */\n getWorldVector(localVector: Vec2): Vec2 {\n return Rot.mulVec2(this.m_xf.q, localVector);\n }\n\n /**\n * Gets the corresponding local point of a world point.\n */\n getLocalPoint(worldPoint: Vec2): Vec2 {\n return Transform.mulTVec2(this.m_xf, worldPoint);\n }\n\n /**\n * Gets the corresponding local vector of a world vector.\n */\n getLocalVector(worldVector: Vec2): Vec2 {\n return Rot.mulTVec2(this.m_xf.q, worldVector);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from './Vec2';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 2-by-2 matrix. Stored in column-major order.\n */\nexport default class Mat22 {\n ex: Vec2;\n ey: Vec2;\n\n constructor(a: number, b: number, c: number, d: number);\n constructor(a: { x: number; y: number }, b: { x: number; y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(a?, b?, c?, d?) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec2.clone(a);\n this.ey = Vec2.clone(b);\n } else if (typeof a === 'number') {\n this.ex = Vec2.neo(a, c);\n this.ey = Vec2.neo(b, d);\n } else {\n this.ex = Vec2.zero();\n this.ey = Vec2.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.ex) && Vec2.isValid(obj.ey);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Mat22.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Mat22!');\n }\n }\n\n set(a: Mat22): void;\n set(a: Vec2, b: Vec2): void;\n set(a: number, b: number, c: number, d: number): void;\n // tslint:disable-next-line:typedef\n set(a, b?, c?, d?): void {\n if (typeof a === 'number' && typeof b === 'number' && typeof c === 'number'\n && typeof d === 'number') {\n this.ex.setNum(a, c);\n this.ey.setNum(b, d);\n\n } else if (typeof a === 'object' && typeof b === 'object') {\n this.ex.setVec2(a);\n this.ey.setVec2(b);\n\n } else if (typeof a === 'object') {\n _ASSERT && Mat22.assert(a);\n this.ex.setVec2(a.ex);\n this.ey.setVec2(a.ey);\n\n } else {\n _ASSERT && common.assert(false);\n }\n }\n\n setIdentity(): void {\n this.ex.x = 1.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 1.0;\n }\n\n setZero(): void {\n this.ex.x = 0.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 0.0;\n }\n\n getInverse(): Mat22 {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const imx = new Mat22();\n imx.ex.x = det * d;\n imx.ey.x = -det * b;\n imx.ex.y = -det * c;\n imx.ey.y = det * a;\n return imx;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const w = Vec2.zero();\n w.x = det * (d * v.x - b * v.y);\n w.y = det * (a * v.y - c * v.x);\n return w;\n }\n\n /**\n * Multiply a matrix times a vector. If a rotation matrix is provided, then this\n * transforms the vector from one frame to another.\n */\n static mul(mx: Mat22, my: Mat22): Mat22;\n static mul(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(mx, v) {\n if (v && 'x' in v && 'y' in v) {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n _ASSERT && common.assert(false);\n }\n\n static mulVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n }\n\n static mulMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n /**\n * Multiply a matrix transpose times a vector. If a rotation matrix is provided,\n * then this transforms the vector from one frame to another (inverse\n * transform).\n */\n static mulT(mx: Mat22, my: Mat22): Mat22;\n static mulT(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(mx, v) {\n if (v && 'x' in v && 'y' in v) { // Vec2\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n _ASSERT && common.assert(false);\n }\n\n static mulTVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n }\n\n static mulTMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n static abs(mx: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n return new Mat22(Vec2.abs(mx.ex), Vec2.abs(mx.ey));\n }\n\n static add(mx1: Mat22, mx2: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx1);\n _ASSERT && Mat22.assert(mx2);\n return new Mat22(Vec2.add(mx1.ex, mx2.ex), Vec2.add(mx1.ey, mx2.ey));\n }\n}\n","export default {\n gjkCalls: 0,\n gjkIters: 0,\n gjkMaxIters: 0,\n\n toiTime: 0,\n toiMaxTime: 0,\n toiCalls: 0,\n toiIters: 0,\n toiMaxIters: 0,\n toiRootIters: 0,\n toiMaxRootIters: 0,\n\n toString(newline?: string): string {\n newline = typeof newline === 'string' ? newline : '\\n';\n let string = \"\";\n // tslint:disable-next-line:no-for-in\n for (const name in this) {\n if (typeof this[name] !== 'function' && typeof this[name] !== 'object') {\n string += name + ': ' + this[name] + newline;\n }\n }\n return string;\n }\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../Settings';\nimport stats from '../util/stats';\nimport common from '../util/common';\n\nimport Shape from './Shape';\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\nimport Rot from '../common/Rot';\nimport Transform from '../common/Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates.\n */\n\nstats.gjkCalls = 0;\nstats.gjkIters = 0;\nstats.gjkMaxIters = 0;\n\n/**\n * Input for Distance. You have to option to use the shape radii in the\n * computation. Even\n */\nexport class DistanceInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n transformA: Transform | null = null;\n transformB: Transform | null = null;\n useRadii: boolean = false;\n}\n\n/**\n * Output for Distance.\n *\n * @prop {Vec2} pointA closest point on shapeA\n * @prop {Vec2} pointB closest point on shapeB\n * @prop distance\n * @prop iterations number of GJK iterations used\n */\nexport class DistanceOutput {\n pointA: Vec2 = Vec2.zero();\n pointB: Vec2 = Vec2.zero();\n distance: number;\n iterations: number;\n}\n\n/**\n * Used to warm start Distance. Set count to zero on first call.\n *\n * @prop {number} metric length or area\n * @prop {array} indexA vertices on shape A\n * @prop {array} indexB vertices on shape B\n * @prop {number} count\n */\nexport class SimplexCache {\n metric: number = 0;\n indexA: number[] = [];\n indexB: number[] = [];\n count: number = 0;\n}\n\n/**\n * Compute the closest points between two shapes. Supports any combination of:\n * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On\n * the first call set SimplexCache.count to zero.\n */\nexport default function Distance(output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void {\n ++stats.gjkCalls;\n\n const proxyA = input.proxyA;\n const proxyB = input.proxyB;\n const xfA = input.transformA;\n const xfB = input.transformB;\n\n // Initialize the simplex.\n const simplex = new Simplex();\n simplex.readCache(cache, proxyA, xfA, proxyB, xfB);\n\n // Get simplex vertices as an array.\n const vertices = simplex.m_v;\n const k_maxIters = Settings.maxDistnceIterations;\n\n // These store the vertices of the last simplex so that we\n // can check for duplicates and prevent cycling.\n const saveA = [];\n const saveB = []; // int[3]\n let saveCount = 0;\n\n let distanceSqr1 = Infinity;\n let distanceSqr2 = Infinity;\n\n // Main iteration loop.\n let iter = 0;\n while (iter < k_maxIters) {\n // Copy simplex so we can identify duplicates.\n saveCount = simplex.m_count;\n for (let i = 0; i < saveCount; ++i) {\n saveA[i] = vertices[i].indexA;\n saveB[i] = vertices[i].indexB;\n }\n\n simplex.solve();\n\n // If we have 3 points, then the origin is in the corresponding triangle.\n if (simplex.m_count === 3) {\n break;\n }\n\n // Compute closest point.\n const p = simplex.getClosestPoint();\n distanceSqr2 = p.lengthSquared();\n\n // Ensure progress\n if (distanceSqr2 >= distanceSqr1) {\n // break;\n }\n distanceSqr1 = distanceSqr2;\n\n // Get search direction.\n const d = simplex.getSearchDirection();\n\n // Ensure the search direction is numerically fit.\n if (d.lengthSquared() < Math.EPSILON * Math.EPSILON) {\n // The origin is probably contained by a line segment\n // or triangle. Thus the shapes are overlapped.\n\n // We can't return zero here even though there may be overlap.\n // In case the simplex is a point, segment, or triangle it is difficult\n // to determine if the origin is contained in the CSO or very close to it.\n break;\n }\n\n // Compute a tentative new simplex vertex using support points.\n const vertex = vertices[simplex.m_count]; // SimplexVertex\n\n vertex.indexA = proxyA.getSupport(Rot.mulTVec2(xfA.q, Vec2.neg(d)));\n vertex.wA = Transform.mulVec2(xfA, proxyA.getVertex(vertex.indexA));\n\n vertex.indexB = proxyB.getSupport(Rot.mulTVec2(xfB.q, d));\n vertex.wB = Transform.mulVec2(xfB, proxyB.getVertex(vertex.indexB));\n\n vertex.w = Vec2.sub(vertex.wB, vertex.wA);\n\n // Iteration count is equated to the number of support point calls.\n ++iter;\n ++stats.gjkIters;\n\n // Check for duplicate support points. This is the main termination\n // criteria.\n let duplicate = false;\n for (let i = 0; i < saveCount; ++i) {\n if (vertex.indexA === saveA[i] && vertex.indexB === saveB[i]) {\n duplicate = true;\n break;\n }\n }\n\n // If we found a duplicate support point we must exit to avoid cycling.\n if (duplicate) {\n break;\n }\n\n // New vertex is ok and needed.\n ++simplex.m_count;\n }\n\n stats.gjkMaxIters = Math.max(stats.gjkMaxIters, iter);\n\n // Prepare output.\n simplex.getWitnessPoints(output.pointA, output.pointB);\n output.distance = Vec2.distance(output.pointA, output.pointB);\n output.iterations = iter;\n\n // Cache the simplex.\n simplex.writeCache(cache);\n\n // Apply radii if requested.\n if (input.useRadii) {\n const rA = proxyA.m_radius;\n const rB = proxyB.m_radius;\n\n if (output.distance > rA + rB && output.distance > Math.EPSILON) {\n // Shapes are still no overlapped.\n // Move the witness points to the outer surface.\n output.distance -= rA + rB;\n const normal = Vec2.sub(output.pointB, output.pointA);\n normal.normalize();\n output.pointA.addMul(rA, normal);\n output.pointB.subMul(rB, normal);\n } else {\n // Shapes are overlapped when radii are considered.\n // Move the witness points to the middle.\n const p = Vec2.mid(output.pointA, output.pointB);\n output.pointA.setVec2(p);\n output.pointB.setVec2(p);\n output.distance = 0.0;\n }\n }\n}\n\n/**\n * A distance proxy is used by the GJK algorithm. It encapsulates any shape.\n */\nexport class DistanceProxy {\n /** internal */ m_buffer: Vec2[];\n /** internal */ m_vertices: Vec2[];\n /** internal */ m_count: number;\n /** internal */ m_radius: number;\n\n\n constructor() {\n this.m_buffer = []; // Vec2[2]\n this.m_vertices = []; // Vec2[]\n this.m_count = 0;\n this.m_radius = 0;\n }\n\n /**\n * Get the vertex count.\n */\n getVertexCount(): number {\n return this.m_count;\n }\n\n /**\n * Get a vertex by index. Used by Distance.\n */\n getVertex(index: number): Vec2 {\n _ASSERT && common.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * Get the supporting vertex index in the given direction.\n */\n getSupport(d: Vec2): number {\n let bestIndex = 0;\n let bestValue = Vec2.dot(this.m_vertices[0], d);\n for (let i = 0; i < this.m_count; ++i) {\n const value = Vec2.dot(this.m_vertices[i], d);\n if (value > bestValue) {\n bestIndex = i;\n bestValue = value;\n }\n }\n return bestIndex;\n }\n\n /**\n * Get the supporting vertex in the given direction.\n */\n getSupportVertex(d: Vec2): Vec2 {\n return this.m_vertices[this.getSupport(d)];\n }\n\n /**\n * Initialize the proxy using the given shape. The shape must remain in scope\n * while the proxy is in use.\n */\n set(shape: Shape, index: number): void {\n // TODO remove, use shape instead\n _ASSERT && common.assert(typeof shape.computeDistanceProxy === 'function');\n shape.computeDistanceProxy(this, index);\n }\n}\n\nclass SimplexVertex {\n /** support point in proxyA */\n wA: Vec2 = Vec2.zero();\n /** wA index */\n indexA: number;\n\n /** support point in proxyB */\n wB: Vec2 = Vec2.zero();\n /** wB index */\n indexB: number;\n\n /** wB - wA; */\n w: Vec2 = Vec2.zero();\n /** barycentric coordinate for closest point */\n a: number;\n\n set(v: SimplexVertex): void {\n this.indexA = v.indexA;\n this.indexB = v.indexB;\n this.wA = Vec2.clone(v.wA);\n this.wB = Vec2.clone(v.wB);\n this.w = Vec2.clone(v.w);\n this.a = v.a;\n }\n}\n\nclass Simplex {\n m_v1: SimplexVertex;\n m_v2: SimplexVertex;\n m_v3: SimplexVertex;\n m_v: SimplexVertex[];\n m_count: number;\n\n constructor() {\n this.m_v1 = new SimplexVertex();\n this.m_v2 = new SimplexVertex();\n this.m_v3 = new SimplexVertex();\n this.m_v = [ this.m_v1, this.m_v2, this.m_v3 ];\n this.m_count;\n }\n\n /** @internal */\n toString(): string {\n if (this.m_count === 3) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y,\n this.m_v3.a, this.m_v3.wA.x, this.m_v3.wA.y, this.m_v3.wB.x, this.m_v3.wB.y\n ].toString();\n\n } else if (this.m_count === 2) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y\n ].toString();\n\n } else if (this.m_count === 1) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y\n ].toString();\n\n } else {\n return \"+\" + this.m_count;\n }\n }\n\n readCache(cache: SimplexCache, proxyA: DistanceProxy, transformA: Transform, proxyB: DistanceProxy, transformB: Transform): void {\n _ASSERT && common.assert(cache.count <= 3);\n\n // Copy data from cache.\n this.m_count = cache.count;\n for (let i = 0; i < this.m_count; ++i) {\n const v = this.m_v[i];\n v.indexA = cache.indexA[i];\n v.indexB = cache.indexB[i];\n const wALocal = proxyA.getVertex(v.indexA);\n const wBLocal = proxyB.getVertex(v.indexB);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 0.0;\n }\n\n // Compute the new simplex metric, if it is substantially different than\n // old metric then flush the simplex.\n if (this.m_count > 1) {\n const metric1 = cache.metric;\n const metric2 = this.getMetric();\n if (metric2 < 0.5 * metric1 || 2.0 * metric1 < metric2\n || metric2 < Math.EPSILON) {\n // Reset the simplex.\n this.m_count = 0;\n }\n }\n\n // If the cache is empty or invalid...\n if (this.m_count === 0) {\n const v = this.m_v[0];\n v.indexA = 0;\n v.indexB = 0;\n const wALocal = proxyA.getVertex(0);\n const wBLocal = proxyB.getVertex(0);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 1.0;\n this.m_count = 1;\n }\n }\n\n writeCache(cache: SimplexCache): void {\n cache.metric = this.getMetric();\n cache.count = this.m_count;\n for (let i = 0; i < this.m_count; ++i) {\n cache.indexA[i] = this.m_v[i].indexA;\n cache.indexB[i] = this.m_v[i].indexB;\n }\n }\n\n getSearchDirection(): Vec2 {\n switch (this.m_count) {\n case 1:\n return Vec2.neg(this.m_v1.w);\n\n case 2: {\n const e12 = Vec2.sub(this.m_v2.w, this.m_v1.w);\n const sgn = Vec2.crossVec2Vec2(e12, Vec2.neg(this.m_v1.w));\n if (sgn > 0.0) {\n // Origin is left of e12.\n return Vec2.crossNumVec2(1.0, e12);\n } else {\n // Origin is right of e12.\n return Vec2.crossVec2Num(e12, 1.0);\n }\n }\n\n default:\n _ASSERT && common.assert(false);\n return Vec2.zero();\n }\n }\n\n getClosestPoint(): Vec2 {\n switch (this.m_count) {\n case 0:\n _ASSERT && common.assert(false);\n return Vec2.zero();\n\n case 1:\n return Vec2.clone(this.m_v1.w);\n\n case 2:\n return Vec2.combine(this.m_v1.a, this.m_v1.w, this.m_v2.a, this.m_v2.w);\n\n case 3:\n return Vec2.zero();\n\n default:\n _ASSERT && common.assert(false);\n return Vec2.zero();\n }\n }\n\n getWitnessPoints(pA: Vec2, pB: Vec2): void {\n switch (this.m_count) {\n case 0:\n _ASSERT && common.assert(false);\n break;\n\n case 1:\n pA.setVec2(this.m_v1.wA);\n pB.setVec2(this.m_v1.wB);\n break;\n\n case 2:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pB.setCombine(this.m_v1.a, this.m_v1.wB, this.m_v2.a, this.m_v2.wB);\n break;\n\n case 3:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pA.addMul(this.m_v3.a, this.m_v3.wA);\n pB.setVec2(pA);\n break;\n\n default:\n _ASSERT && common.assert(false);\n break;\n }\n }\n\n getMetric(): number {\n switch (this.m_count) {\n case 0:\n _ASSERT && common.assert(false);\n return 0.0;\n\n case 1:\n return 0.0;\n\n case 2:\n return Vec2.distance(this.m_v1.w, this.m_v2.w);\n\n case 3:\n return Vec2.crossVec2Vec2(Vec2.sub(this.m_v2.w, this.m_v1.w), Vec2.sub(this.m_v3.w,\n this.m_v1.w));\n\n default:\n _ASSERT && common.assert(false);\n return 0.0;\n }\n }\n\n solve(): void {\n switch (this.m_count) {\n case 1:\n break;\n\n case 2:\n this.solve2();\n break;\n\n case 3:\n this.solve3();\n break;\n\n default:\n _ASSERT && common.assert(false);\n }\n }\n\n// Solve a line segment using barycentric coordinates.\n//\n// p = a1 * w1 + a2 * w2\n// a1 + a2 = 1\n//\n// The vector from the origin to the closest point on the line is\n// perpendicular to the line.\n// e12 = w2 - w1\n// dot(p, e) = 0\n// a1 * dot(w1, e) + a2 * dot(w2, e) = 0\n//\n// 2-by-2 linear system\n// [1 1 ][a1] = [1]\n// [w1.e12 w2.e12][a2] = [0]\n//\n// Define\n// d12_1 = dot(w2, e12)\n// d12_2 = -dot(w1, e12)\n// d12 = d12_1 + d12_2\n//\n// Solution\n// a1 = d12_1 / d12\n// a2 = d12_2 / d12\n solve2(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const e12 = Vec2.sub(w2, w1);\n\n // w1 region\n const d12_2 = -Vec2.dot(w1, e12);\n if (d12_2 <= 0.0) {\n // a2 <= 0, so we clamp it to 0\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // w2 region\n const d12_1 = Vec2.dot(w2, e12);\n if (d12_1 <= 0.0) {\n // a1 <= 0, so we clamp it to 0\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // Must be in e12 region.\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n }\n\n// Possible regions:\n// - points[2]\n// - edge points[0]-points[2]\n// - edge points[1]-points[2]\n// - inside the triangle\n solve3(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const w3 = this.m_v3.w;\n\n // Edge12\n // [1 1 ][a1] = [1]\n // [w1.e12 w2.e12][a2] = [0]\n // a3 = 0\n const e12 = Vec2.sub(w2, w1);\n const w1e12 = Vec2.dot(w1, e12);\n const w2e12 = Vec2.dot(w2, e12);\n const d12_1 = w2e12;\n const d12_2 = -w1e12;\n\n // Edge13\n // [1 1 ][a1] = [1]\n // [w1.e13 w3.e13][a3] = [0]\n // a2 = 0\n const e13 = Vec2.sub(w3, w1);\n const w1e13 = Vec2.dot(w1, e13);\n const w3e13 = Vec2.dot(w3, e13);\n const d13_1 = w3e13;\n const d13_2 = -w1e13;\n\n // Edge23\n // [1 1 ][a2] = [1]\n // [w2.e23 w3.e23][a3] = [0]\n // a1 = 0\n const e23 = Vec2.sub(w3, w2);\n const w2e23 = Vec2.dot(w2, e23);\n const w3e23 = Vec2.dot(w3, e23);\n const d23_1 = w3e23;\n const d23_2 = -w2e23;\n\n // Triangle123\n const n123 = Vec2.crossVec2Vec2(e12, e13);\n\n const d123_1 = n123 * Vec2.crossVec2Vec2(w2, w3);\n const d123_2 = n123 * Vec2.crossVec2Vec2(w3, w1);\n const d123_3 = n123 * Vec2.crossVec2Vec2(w1, w2);\n\n // w1 region\n if (d12_2 <= 0.0 && d13_2 <= 0.0) {\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // e12\n if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) {\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n return;\n }\n\n // e13\n if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) {\n const inv_d13 = 1.0 / (d13_1 + d13_2);\n this.m_v1.a = d13_1 * inv_d13;\n this.m_v3.a = d13_2 * inv_d13;\n this.m_count = 2;\n this.m_v2.set(this.m_v3);\n return;\n }\n\n // w2 region\n if (d12_1 <= 0.0 && d23_2 <= 0.0) {\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // w3 region\n if (d13_1 <= 0.0 && d23_1 <= 0.0) {\n this.m_v3.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // e23\n if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) {\n const inv_d23 = 1.0 / (d23_1 + d23_2);\n this.m_v2.a = d23_1 * inv_d23;\n this.m_v3.a = d23_2 * inv_d23;\n this.m_count = 2;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // Must be in triangle123\n const inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3);\n this.m_v1.a = d123_1 * inv_d123;\n this.m_v2.a = d123_2 * inv_d123;\n this.m_v3.a = d123_3 * inv_d123;\n this.m_count = 3;\n }\n}\n\n\n/**\n * Determine if two generic shapes overlap.\n */\nexport function testOverlap(shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform): boolean {\n const input = new DistanceInput();\n input.proxyA.set(shapeA, indexA);\n input.proxyB.set(shapeB, indexB);\n input.transformA = xfA;\n input.transformB = xfB;\n input.useRadii = true;\n\n const cache = new SimplexCache();\n const output = new DistanceOutput();\n\n Distance(output, cache, input);\n\n return output.distance < 10.0 * Math.EPSILON;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { ShapeType } from \"../collision/Shape\";\nimport common from '../util/common';\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\nimport Transform from '../common/Transform';\nimport Mat22 from '../common/Mat22';\nimport Rot from '../common/Rot';\nimport Settings from '../Settings';\nimport Manifold, { ManifoldType, WorldManifold } from '../collision/Manifold';\nimport { testOverlap } from '../collision/Distance';\nimport Fixture from \"./Fixture\";\nimport Body from \"./Body\";\nimport { ContactImpulse, TimeStep } from \"./Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst DEBUG_SOLVER = false;\n\n/**\n * A contact edge is used to connect bodies and contacts together in a contact\n * graph where each body is a node and each contact is an edge. A contact edge\n * belongs to a doubly linked list maintained in each attached body. Each\n * contact has two contact nodes, one for each attached body.\n *\n * @prop {Contact} contact The contact\n * @prop {ContactEdge} prev The previous contact edge in the body's contact list\n * @prop {ContactEdge} next The next contact edge in the body's contact list\n * @prop {Body} other Provides quick access to the other body attached.\n */\nexport class ContactEdge {\n contact: Contact;\n prev: ContactEdge | undefined;\n next: ContactEdge | undefined;\n other: Body | undefined;\n constructor(contact: Contact) {\n this.contact = contact;\n }\n}\n\nexport type EvaluateFunction = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void;\n\nexport type ContactCallback = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void /* & { destroyFcn?: (contact: Contact) => void }*/;\n\n\n/**\n * Friction mixing law. The idea is to allow either fixture to drive the\n * restitution to zero. For example, anything slides on ice.\n */\nexport function mixFriction(friction1: number, friction2: number): number {\n return Math.sqrt(friction1 * friction2);\n}\n\n/**\n * Restitution mixing law. The idea is allow for anything to bounce off an\n * inelastic surface. For example, a superball bounces on anything.\n */\nexport function mixRestitution(restitution1: number, restitution2: number): number {\n return restitution1 > restitution2 ? restitution1 : restitution2;\n}\n\n// TODO: move this to Settings?\nconst s_registers = [];\n\n// TODO: merge with ManifoldPoint?\nexport class VelocityConstraintPoint {\n rA: Vec2 = Vec2.zero();\n rB: Vec2 = Vec2.zero();\n normalImpulse: number = 0;\n tangentImpulse: number = 0;\n normalMass: number = 0;\n tangentMass: number = 0;\n velocityBias: number = 0;\n}\n\n/**\n * The class manages contact between two shapes. A contact exists for each\n * overlapping AABB in the broad-phase (except if filtered). Therefore a contact\n * object may exist that has no contact points.\n */\nexport default class Contact {\n /** @internal */\n m_nodeA: ContactEdge;\n /** @internal */\n m_nodeB: ContactEdge;\n /** @internal */\n m_fixtureA: Fixture;\n /** @internal */\n m_fixtureB: Fixture;\n /** @internal */\n m_indexA: number;\n /** @internal */\n m_indexB: number;\n /** @internal */\n m_evaluateFcn: EvaluateFunction;\n /** @internal */\n m_manifold: Manifold = new Manifold();\n /** @internal */\n m_prev: Contact | null = null;\n /** @internal */\n m_next: Contact | null = null;\n /** @internal */\n m_toi: number = 1.0;\n /** @internal */\n m_toiCount: number = 0;\n /** @internal This contact has a valid TOI in m_toi */\n m_toiFlag: boolean = false;\n /** @internal */\n m_friction: number;\n /** @internal */\n m_restitution: number;\n /** @internal */\n m_tangentSpeed: number = 0.0;\n /** @internal This contact can be disabled (by user) */\n m_enabledFlag: boolean = true;\n /** @internal Used when crawling contact graph when forming islands. */\n m_islandFlag: boolean = false;\n /** @internal Set when the shapes are touching. */\n m_touchingFlag: boolean = false;\n /** @internal This contact needs filtering because a fixture filter was changed. */\n m_filterFlag: boolean = false;\n /** @internal This bullet contact had a TOI event */\n m_bulletHitFlag: boolean = false;\n\n /** @internal Contact reporting impulse object cache */\n m_impulse: ContactImpulse = new ContactImpulse(this);\n\n // VelocityConstraint\n /** @internal */ v_points: VelocityConstraintPoint[] = []; // [maxManifoldPoints];\n /** @internal */ v_normal: Vec2 = Vec2.zero();\n /** @internal */ v_normalMass: Mat22 = new Mat22();\n /** @internal */ v_K: Mat22 = new Mat22();\n /** @internal */ v_pointCount: number;\n /** @internal */ v_tangentSpeed: number | undefined;\n /** @internal */ v_friction: number | undefined;\n /** @internal */ v_restitution: number | undefined;\n /** @internal */ v_invMassA: number | undefined;\n /** @internal */ v_invMassB: number | undefined;\n /** @internal */ v_invIA: number | undefined;\n /** @internal */ v_invIB: number | undefined;\n\n // PositionConstraint\n /** @internal */ p_localPoints: Vec2[] = []; // [maxManifoldPoints];\n /** @internal */ p_localNormal: Vec2 = Vec2.zero();\n /** @internal */ p_localPoint: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterA: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterB: Vec2 = Vec2.zero();\n /** @internal */ p_type: ManifoldType | undefined;\n /** @internal */ p_radiusA: number | undefined;\n /** @internal */ p_radiusB: number | undefined;\n /** @internal */ p_pointCount: number | undefined;\n /** @internal */ p_invMassA: number | undefined;\n /** @internal */ p_invMassB: number | undefined;\n /** @internal */ p_invIA: number | undefined;\n /** @internal */ p_invIB: number | undefined;\n\n constructor(fA: Fixture, indexA: number, fB: Fixture, indexB: number, evaluateFcn: EvaluateFunction) {\n // Nodes for connecting bodies.\n this.m_nodeA = new ContactEdge(this);\n this.m_nodeB = new ContactEdge(this);\n\n this.m_fixtureA = fA;\n this.m_fixtureB = fB;\n\n this.m_indexA = indexA;\n this.m_indexB = indexB;\n\n this.m_evaluateFcn = evaluateFcn;\n\n this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction);\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution);\n }\n\n initConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const shapeA = fixtureA.getShape();\n const shapeB = fixtureB.getShape();\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const manifold = this.getManifold();\n\n const pointCount = manifold.pointCount;\n _ASSERT && common.assert(pointCount > 0);\n\n this.v_invMassA = bodyA.m_invMass;\n this.v_invMassB = bodyB.m_invMass;\n this.v_invIA = bodyA.m_invI;\n this.v_invIB = bodyB.m_invI;\n\n this.v_friction = this.m_friction;\n this.v_restitution = this.m_restitution;\n this.v_tangentSpeed = this.m_tangentSpeed;\n\n this.v_pointCount = pointCount;\n\n this.v_K.setZero();\n this.v_normalMass.setZero();\n\n this.p_invMassA = bodyA.m_invMass;\n this.p_invMassB = bodyB.m_invMass;\n this.p_invIA = bodyA.m_invI;\n this.p_invIB = bodyB.m_invI;\n this.p_localCenterA = Vec2.clone(bodyA.m_sweep.localCenter);\n this.p_localCenterB = Vec2.clone(bodyB.m_sweep.localCenter);\n\n this.p_radiusA = shapeA.m_radius;\n this.p_radiusB = shapeB.m_radius;\n\n this.p_type = manifold.type;\n this.p_localNormal = Vec2.clone(manifold.localNormal);\n this.p_localPoint = Vec2.clone(manifold.localPoint);\n this.p_pointCount = pointCount;\n\n for (let j = 0; j < pointCount; ++j) {\n const cp = manifold.points[j];\n const vcp = this.v_points[j] = new VelocityConstraintPoint();\n\n if (step.warmStarting) {\n vcp.normalImpulse = step.dtRatio * cp.normalImpulse;\n vcp.tangentImpulse = step.dtRatio * cp.tangentImpulse;\n\n } else {\n vcp.normalImpulse = 0.0;\n vcp.tangentImpulse = 0.0;\n }\n\n vcp.rA.setZero();\n vcp.rB.setZero();\n vcp.normalMass = 0.0;\n vcp.tangentMass = 0.0;\n vcp.velocityBias = 0.0;\n\n this.p_localPoints[j] = Vec2.clone(cp.localPoint);\n\n }\n }\n\n /**\n * Get the contact manifold. Do not modify the manifold unless you understand\n * the internals of the library.\n */\n getManifold(): Manifold {\n return this.m_manifold;\n }\n\n /**\n * Get the world manifold.\n */\n getWorldManifold(worldManifold: WorldManifold | null | undefined): WorldManifold | undefined {\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n\n return this.m_manifold.getWorldManifold(worldManifold, bodyA.getTransform(),\n shapeA.m_radius, bodyB.getTransform(), shapeB.m_radius);\n }\n\n /**\n * Enable/disable this contact. This can be used inside the pre-solve contact\n * listener. The contact is only disabled for the current time step (or sub-step\n * in continuous collisions).\n */\n setEnabled(flag: boolean): void {\n this.m_enabledFlag = !!flag;\n }\n\n /**\n * Has this contact been disabled?\n */\n isEnabled(): boolean {\n return this.m_enabledFlag;\n }\n\n /**\n * Is this contact touching?\n */\n isTouching(): boolean {\n return this.m_touchingFlag;\n }\n\n /**\n * Get the next contact in the world's contact list.\n */\n getNext(): Contact | null {\n return this.m_next;\n }\n\n /**\n * Get fixture A in this contact.\n */\n getFixtureA(): Fixture {\n return this.m_fixtureA;\n }\n\n /**\n * Get fixture B in this contact.\n */\n getFixtureB(): Fixture {\n return this.m_fixtureB;\n }\n\n /**\n * Get the child primitive index for fixture A.\n */\n getChildIndexA(): number {\n return this.m_indexA;\n }\n\n /**\n * Get the child primitive index for fixture B.\n */\n getChildIndexB(): number {\n return this.m_indexB;\n }\n\n /**\n * Flag this contact for filtering. Filtering will occur the next time step.\n */\n flagForFiltering(): void {\n this.m_filterFlag = true;\n }\n\n /**\n * Override the default friction mixture. You can call this in\n * ContactListener.preSolve. This value persists until set or reset.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the friction.\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Reset the friction mixture to the default value.\n */\n resetFriction(): void {\n this.m_friction = mixFriction(this.m_fixtureA.m_friction,\n this.m_fixtureB.m_friction);\n }\n\n /**\n * Override the default restitution mixture. You can call this in\n * ContactListener.preSolve. The value persists until you set or reset.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Get the restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Reset the restitution to the default value.\n */\n resetRestitution(): void {\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution,\n this.m_fixtureB.m_restitution);\n }\n\n /**\n * Set the desired tangent speed for a conveyor belt behavior. In meters per\n * second.\n */\n setTangentSpeed(speed: number): void {\n this.m_tangentSpeed = speed;\n }\n\n /**\n * Get the desired tangent speed. In meters per second.\n */\n getTangentSpeed(): number {\n return this.m_tangentSpeed;\n }\n\n /**\n * Called by Update method, and implemented by subclasses.\n */\n evaluate(manifold: Manifold, xfA: Transform, xfB: Transform): void {\n this.m_evaluateFcn(manifold, xfA, this.m_fixtureA, this.m_indexA, xfB,\n this.m_fixtureB, this.m_indexB);\n }\n\n /**\n * Updates the contact manifold and touching status.\n *\n * Note: do not assume the fixture AABBs are overlapping or are valid.\n *\n * @param listener.beginContact\n * @param listener.endContact\n * @param listener.preSolve\n */\n update(listener?: {\n beginContact(contact: Contact): void,\n endContact(contact: Contact): void,\n preSolve(contact: Contact, oldManifold: Manifold): void\n }): void {\n\n // Re-enable this contact.\n this.m_enabledFlag = true;\n\n let touching = false;\n const wasTouching = this.m_touchingFlag;\n\n const sensorA = this.m_fixtureA.isSensor();\n const sensorB = this.m_fixtureB.isSensor();\n const sensor = sensorA || sensorB;\n\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const xfA = bodyA.getTransform();\n const xfB = bodyB.getTransform();\n\n let oldManifold;\n\n // Is this contact a sensor?\n if (sensor) {\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n touching = testOverlap(shapeA, this.m_indexA, shapeB, this.m_indexB, xfA, xfB);\n\n // Sensors don't generate manifolds.\n this.m_manifold.pointCount = 0;\n } else {\n\n // TODO reuse manifold\n oldManifold = this.m_manifold;\n this.m_manifold = new Manifold();\n\n this.evaluate(this.m_manifold, xfA, xfB);\n touching = this.m_manifold.pointCount > 0;\n\n // Match old contact ids to new contact ids and copy the\n // stored impulses to warm start the solver.\n for (let i = 0; i < this.m_manifold.pointCount; ++i) {\n const nmp = this.m_manifold.points[i];\n nmp.normalImpulse = 0.0;\n nmp.tangentImpulse = 0.0;\n\n for (let j = 0; j < oldManifold.pointCount; ++j) {\n const omp = oldManifold.points[j];\n if (omp.id.key == nmp.id.key) {\n nmp.normalImpulse = omp.normalImpulse;\n nmp.tangentImpulse = omp.tangentImpulse;\n break;\n }\n }\n }\n\n if (touching != wasTouching) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n }\n\n this.m_touchingFlag = touching;\n\n if (!wasTouching && touching && listener) {\n listener.beginContact(this);\n }\n\n if (wasTouching && !touching && listener) {\n listener.endContact(this);\n }\n\n if (!sensor && touching && listener) {\n listener.preSolve(this, oldManifold);\n }\n }\n\n solvePositionConstraint(step: TimeStep): number {\n return this._solvePositionConstraint(step);\n }\n\n solvePositionConstraintTOI(step: TimeStep, toiA: Body, toiB: Body): number {\n return this._solvePositionConstraint(step, toiA, toiB);\n }\n\n private _solvePositionConstraint(step: TimeStep, toiA?: Body, toiB?: Body): number {\n const toi: boolean = !!toiA && !!toiB;\n\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n let mA = 0.0;\n let iA = 0.0;\n if (!toi || (bodyA == toiA || bodyA == toiB)) {\n mA = this.p_invMassA;\n iA = this.p_invIA;\n }\n\n let mB = 0.0;\n let iB = 0.0;\n if (!toi || (bodyB == toiA || bodyB == toiB)) {\n mB = this.p_invMassB;\n iB = this.p_invIB;\n }\n\n const cA = Vec2.clone(positionA.c);\n let aA = positionA.a;\n\n const cB = Vec2.clone(positionB.c);\n let aB = positionB.a;\n\n let minSeparation = 0.0;\n\n // Solve normal constraints\n for (let j = 0; j < this.p_pointCount; ++j) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p = Vec2.sub(cA, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p = Vec2.sub(cB, Rot.mulVec2(xfB.q, localCenterB));\n\n // PositionSolverManifold\n let normal;\n let point;\n let separation;\n switch (this.p_type) {\n case ManifoldType.e_circles: {\n const pointA = Transform.mulVec2(xfA, this.p_localPoint);\n const pointB = Transform.mulVec2(xfB, this.p_localPoints[0]);\n normal = Vec2.sub(pointB, pointA);\n normal.normalize();\n point = Vec2.combine(0.5, pointA, 0.5, pointB);\n separation = Vec2.dot(Vec2.sub(pointB, pointA), normal) - this.p_radiusA - this.p_radiusB;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfA, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfB, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfB, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfA, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n\n // Ensure normal points from A to B\n normal.mul(-1);\n break;\n }\n }\n\n const rA = Vec2.sub(point, cA);\n const rB = Vec2.sub(point, cB);\n\n // Track max constraint error.\n minSeparation = Math.min(minSeparation, separation);\n\n const baumgarte = toi ? Settings.toiBaugarte : Settings.baumgarte;\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n // Prevent large corrections and allow slop.\n const C = Math.clamp(baumgarte * (separation + linearSlop), -maxLinearCorrection, 0.0);\n\n // Compute the effective mass.\n const rnA = Vec2.crossVec2Vec2(rA, normal);\n const rnB = Vec2.crossVec2Vec2(rB, normal);\n const K = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n // Compute normal impulse\n const impulse = K > 0.0 ? -C / K : 0.0;\n\n const P = Vec2.mulNumVec2(impulse, normal);\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n\n return minSeparation;\n }\n\n initVelocityConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const radiusA = this.p_radiusA;\n const radiusB = this.p_radiusB;\n const manifold = this.getManifold();\n\n const mA = this.v_invMassA;\n const mB = this.v_invMassB;\n const iA = this.v_invIA;\n const iB = this.v_invIB;\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n const cA = Vec2.clone(positionA.c);\n const aA = positionA.a;\n const vA = Vec2.clone(velocityA.v);\n const wA = velocityA.w;\n\n const cB = Vec2.clone(positionB.c);\n const aB = positionB.a;\n const vB = Vec2.clone(velocityB.v);\n const wB = velocityB.w;\n\n _ASSERT && common.assert(manifold.pointCount > 0);\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p.setCombine(1, cA, -1, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p.setCombine(1, cB, -1, Rot.mulVec2(xfB.q, localCenterB));\n\n const worldManifold = manifold.getWorldManifold(null, xfA, radiusA, xfB, radiusB);\n\n this.v_normal.setVec2(worldManifold.normal);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n vcp.rA.setVec2(Vec2.sub(worldManifold.points[j], cA));\n vcp.rB.setVec2(Vec2.sub(worldManifold.points[j], cB));\n\n const rnA = Vec2.crossVec2Vec2(vcp.rA, this.v_normal);\n const rnB = Vec2.crossVec2Vec2(vcp.rB, this.v_normal);\n\n const kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n vcp.normalMass = kNormal > 0.0 ? 1.0 / kNormal : 0.0;\n\n const tangent = Vec2.crossVec2Num(this.v_normal, 1.0);\n\n const rtA = Vec2.crossVec2Vec2(vcp.rA, tangent);\n const rtB = Vec2.crossVec2Vec2(vcp.rB, tangent);\n\n const kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB;\n\n vcp.tangentMass = kTangent > 0.0 ? 1.0 / kTangent : 0.0;\n\n // Setup a velocity bias for restitution.\n vcp.velocityBias = 0.0;\n const vRel = Vec2.dot(this.v_normal, vB)\n + Vec2.dot(this.v_normal, Vec2.crossNumVec2(wB, vcp.rB))\n - Vec2.dot(this.v_normal, vA)\n - Vec2.dot(this.v_normal, Vec2.crossNumVec2(wA, vcp.rA));\n if (vRel < -Settings.velocityThreshold) {\n vcp.velocityBias = -this.v_restitution * vRel;\n }\n }\n\n // If we have two points, then prepare the block solver.\n if (this.v_pointCount == 2 && step.blockSolve) {\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const rn1A = Vec2.crossVec2Vec2(vcp1.rA, this.v_normal);\n const rn1B = Vec2.crossVec2Vec2(vcp1.rB, this.v_normal);\n const rn2A = Vec2.crossVec2Vec2(vcp2.rA, this.v_normal);\n const rn2B = Vec2.crossVec2Vec2(vcp2.rB, this.v_normal);\n\n const k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B;\n const k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B;\n const k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B;\n\n // Ensure a reasonable condition number.\n const k_maxConditionNumber = 1000.0;\n if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) {\n // K is safe to invert.\n this.v_K.ex.setNum(k11, k12);\n this.v_K.ey.setNum(k12, k22);\n this.v_normalMass.set(this.v_K.getInverse());\n } else {\n // The constraints are redundant, just use one.\n // TODO_ERIN use deepest?\n this.v_pointCount = 1;\n }\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n warmStartConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n const P = Vec2.combine(vcp.normalImpulse, normal, vcp.tangentImpulse, tangent);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n vA.subMul(mA, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n vB.addMul(mB, P);\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n storeConstraintImpulses(step: TimeStep): void {\n const manifold = this.m_manifold;\n for (let j = 0; j < this.v_pointCount; ++j) {\n manifold.points[j].normalImpulse = this.v_points[j].normalImpulse;\n manifold.points[j].tangentImpulse = this.v_points[j].tangentImpulse;\n }\n }\n\n solveVelocityConstraint(step: TimeStep): void {\n const bodyA = this.m_fixtureA.m_body;\n const bodyB = this.m_fixtureB.m_body;\n\n const velocityA = bodyA.c_velocity;\n const positionA = bodyA.c_position;\n\n const velocityB = bodyB.c_velocity;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n const friction = this.v_friction;\n\n _ASSERT && common.assert(this.v_pointCount == 1 || this.v_pointCount == 2);\n\n // Solve tangent constraints first because non-penetration is more important\n // than friction.\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute tangent force\n const vt = Vec2.dot(dv, tangent) - this.v_tangentSpeed;\n let lambda = vcp.tangentMass * (-vt);\n\n // Clamp the accumulated force\n const maxFriction = friction * vcp.normalImpulse;\n const newImpulse = Math.clamp(vcp.tangentImpulse + lambda, -maxFriction, maxFriction);\n lambda = newImpulse - vcp.tangentImpulse;\n vcp.tangentImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, tangent);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n\n // Solve normal constraints\n if (this.v_pointCount == 1 || step.blockSolve == false) {\n for (let i = 0; i < this.v_pointCount; ++i) {\n const vcp = this.v_points[i]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute normal impulse\n const vn = Vec2.dot(dv, normal);\n let lambda = -vcp.normalMass * (vn - vcp.velocityBias);\n\n // Clamp the accumulated impulse\n const newImpulse = Math.max(vcp.normalImpulse + lambda, 0.0);\n lambda = newImpulse - vcp.normalImpulse;\n vcp.normalImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, normal);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n } else {\n // Block solver developed in collaboration with Dirk Gregorius (back in\n // 01/07 on Box2D_Lite).\n // Build the mini LCP for this contact patch\n //\n // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i =\n // 1..2\n //\n // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n )\n // b = vn0 - velocityBias\n //\n // The system is solved using the \"Total enumeration method\" (s. Murty).\n // The complementary constraint vn_i * x_i\n // implies that we must have in any solution either vn_i = 0 or x_i = 0.\n // So for the 2D contact problem the cases\n // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and\n // vn1 = 0 need to be tested. The first valid\n // solution that satisfies the problem is chosen.\n //\n // In order to account of the accumulated impulse 'a' (because of the\n // iterative nature of the solver which only requires\n // that the accumulated impulse is clamped and not the incremental\n // impulse) we change the impulse variable (x_i).\n //\n // Substitute:\n //\n // x = a + d\n //\n // a := old total impulse\n // x := new total impulse\n // d := incremental impulse\n //\n // For the current iteration we extend the formula for the incremental\n // impulse\n // to compute the new total impulse:\n //\n // vn = A * d + b\n // = A * (x - a) + b\n // = A * x + b - A * a\n // = A * x + b'\n // b' = b - A * a;\n\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const a = Vec2.neo(vcp1.normalImpulse, vcp2.normalImpulse);\n _ASSERT && common.assert(a.x >= 0.0 && a.y >= 0.0);\n\n // Relative velocity at contact\n let dv1 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp1.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp1.rA));\n let dv2 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp2.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp2.rA));\n\n // Compute normal velocity\n let vn1 = Vec2.dot(dv1, normal);\n let vn2 = Vec2.dot(dv2, normal);\n\n const b = Vec2.neo(vn1 - vcp1.velocityBias, vn2 - vcp2.velocityBias);\n\n // Compute b'\n b.sub(Mat22.mulVec2(this.v_K, a));\n\n const k_errorTol = 1e-3;\n // NOT_USED(k_errorTol);\n\n while (true) {\n //\n // Case 1: vn = 0\n //\n // 0 = A * x + b'\n //\n // Solve for x:\n //\n // x = - inv(A) * b'\n //\n const x = Mat22.mulVec2(this.v_normalMass, b).neg();\n\n if (x.x >= 0.0 && x.y >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n dv1 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA)));\n dv2 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA)));\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && common.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n _ASSERT && common.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 2: vn1 = 0 and x2 = 0\n //\n // 0 = a11 * x1 + a12 * 0 + b1'\n // vn2 = a21 * x1 + a22 * 0 + b2'\n //\n x.x = -vcp1.normalMass * b.x;\n x.y = 0.0;\n vn1 = 0.0;\n vn2 = this.v_K.ex.y * x.x + b.y;\n\n if (x.x >= 0.0 && vn2 >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv1B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB));\n const dv1A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA));\n const dv1 = Vec2.sub(dv1B, dv1A);\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n\n _ASSERT && common.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 3: vn2 = 0 and x1 = 0\n //\n // vn1 = a11 * 0 + a12 * x2 + b1'\n // 0 = a21 * 0 + a22 * x2 + b2'\n //\n x.x = 0.0;\n x.y = -vcp2.normalMass * b.y;\n vn1 = this.v_K.ey.x * x.y + b.x;\n vn2 = 0.0;\n\n if (x.y >= 0.0 && vn1 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv2B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB));\n const dv2A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA));\n const dv1 = Vec2.sub(dv2B, dv2A);\n\n // Compute normal velocity\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && common.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 4: x1 = 0 and x2 = 0\n //\n // vn1 = b1\n // vn2 = b2;\n //\n x.x = 0.0;\n x.y = 0.0;\n vn1 = b.x;\n vn2 = b.y;\n\n if (vn1 >= 0.0 && vn2 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n break;\n }\n\n // No solution, give up. This is hit sometimes, but it doesn't seem to\n // matter.\n break;\n }\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n /**\n * @internal\n */\n static addType(type1: ShapeType, type2: ShapeType, callback: ContactCallback): void {\n s_registers[type1] = s_registers[type1] || {};\n s_registers[type1][type2] = callback;\n }\n\n /**\n * @internal\n */\n static create(fixtureA: Fixture, indexA: number, fixtureB: Fixture, indexB: number): Contact | null {\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // TODO: pool contacts\n let contact;\n let evaluateFcn;\n if (evaluateFcn = s_registers[typeA] && s_registers[typeA][typeB]) {\n contact = new Contact(fixtureA, indexA, fixtureB, indexB, evaluateFcn);\n } else if (evaluateFcn = s_registers[typeB] && s_registers[typeB][typeA]) {\n contact = new Contact(fixtureB, indexB, fixtureA, indexA, evaluateFcn);\n } else {\n return null;\n }\n\n // Contact creation may swap fixtures.\n fixtureA = contact.getFixtureA();\n fixtureB = contact.getFixtureB();\n indexA = contact.getChildIndexA();\n indexB = contact.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Connect to body A\n contact.m_nodeA.contact = contact;\n contact.m_nodeA.other = bodyB;\n\n contact.m_nodeA.prev = null;\n contact.m_nodeA.next = bodyA.m_contactList;\n if (bodyA.m_contactList != null) {\n bodyA.m_contactList.prev = contact.m_nodeA;\n }\n bodyA.m_contactList = contact.m_nodeA;\n\n // Connect to body B\n contact.m_nodeB.contact = contact;\n contact.m_nodeB.other = bodyA;\n\n contact.m_nodeB.prev = null;\n contact.m_nodeB.next = bodyB.m_contactList;\n if (bodyB.m_contactList != null) {\n bodyB.m_contactList.prev = contact.m_nodeB;\n }\n bodyB.m_contactList = contact.m_nodeB;\n\n // Wake up the bodies\n if (fixtureA.isSensor() == false && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n return contact;\n }\n\n /**\n * @internal\n */\n static destroy(contact: Contact, listener: { endContact: (contact: Contact) => void }): void {\n const fixtureA = contact.m_fixtureA;\n const fixtureB = contact.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n if (contact.isTouching()) {\n listener.endContact(contact);\n }\n\n // Remove from body 1\n if (contact.m_nodeA.prev) {\n contact.m_nodeA.prev.next = contact.m_nodeA.next;\n }\n\n if (contact.m_nodeA.next) {\n contact.m_nodeA.next.prev = contact.m_nodeA.prev;\n }\n\n if (contact.m_nodeA == bodyA.m_contactList) {\n bodyA.m_contactList = contact.m_nodeA.next;\n }\n\n // Remove from body 2\n if (contact.m_nodeB.prev) {\n contact.m_nodeB.prev.next = contact.m_nodeB.next;\n }\n\n if (contact.m_nodeB.next) {\n contact.m_nodeB.next.prev = contact.m_nodeB.prev;\n }\n\n if (contact.m_nodeB == bodyB.m_contactList) {\n bodyB.m_contactList = contact.m_nodeB.next;\n }\n\n if (contact.m_manifold.pointCount > 0 && fixtureA.isSensor() == false\n && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // const destroyFcn = s_registers[typeA][typeB].destroyFcn;\n // if (typeof destroyFcn === 'function') {\n // destroyFcn(contact);\n // }\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../Settings';\n\nimport common from '../util/common';\nimport stats from '../util/stats';\nimport Timer from '../util/Timer';\n\nimport Math from '../common/Math';\nimport Vec2 from '../common/Vec2';\nimport Rot from '../common/Rot';\nimport Sweep from '../common/Sweep';\nimport Transform from '../common/Transform';\n\nimport Distance, { DistanceInput, DistanceOutput, DistanceProxy, SimplexCache } from './Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Input parameters for TimeOfImpact.\n */\nexport class TOIInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n sweepA: Sweep = new Sweep();\n sweepB: Sweep = new Sweep();\n /** defines sweep interval [0, tMax] */\n tMax: number | undefined;\n}\n\nexport enum TOIOutputState {\n e_unknown = 0,\n e_failed = 1,\n e_overlapped = 2,\n e_touching = 3,\n e_separated = 4,\n}\n\n/**\n * Output parameters for TimeOfImpact.\n */\nexport class TOIOutput {\n state: TOIOutputState | undefined;\n t: number | undefined;\n}\n\nstats.toiTime = 0;\nstats.toiMaxTime = 0;\nstats.toiCalls = 0;\nstats.toiIters = 0;\nstats.toiMaxIters = 0;\nstats.toiRootIters = 0;\nstats.toiMaxRootIters = 0;\n\n/**\n * Compute the upper bound on time before two shapes penetrate. Time is\n * represented as a fraction between [0,tMax]. This uses a swept separating axis\n * and may miss some intermediate, non-tunneling collision. If you change the\n * time interval, you should call this function again.\n *\n * Note: use Distance to compute the contact point and normal at the time of\n * impact.\n *\n * CCD via the local separating axis method. This seeks progression by computing\n * the largest time at which separation is maintained.\n */\nexport default function TimeOfImpact(output: TOIOutput, input: TOIInput): void {\n const timer = Timer.now();\n\n ++stats.toiCalls;\n\n output.state = TOIOutputState.e_unknown;\n output.t = input.tMax;\n\n const proxyA = input.proxyA; // DistanceProxy\n const proxyB = input.proxyB; // DistanceProxy\n\n const sweepA = input.sweepA; // Sweep\n const sweepB = input.sweepB; // Sweep\n\n // Large rotations can make the root finder fail, so we normalize the\n // sweep angles.\n sweepA.normalize();\n sweepB.normalize();\n\n const tMax = input.tMax;\n\n const totalRadius = proxyA.m_radius + proxyB.m_radius;\n const target = Math.max(Settings.linearSlop, totalRadius - 3.0 * Settings.linearSlop);\n const tolerance = 0.25 * Settings.linearSlop;\n _ASSERT && common.assert(target > tolerance);\n\n let t1 = 0.0;\n const k_maxIterations = Settings.maxTOIIterations;\n let iter = 0;\n\n // Prepare input for distance query.\n const cache = new SimplexCache();\n\n const distanceInput = new DistanceInput();\n distanceInput.proxyA = input.proxyA;\n distanceInput.proxyB = input.proxyB;\n distanceInput.useRadii = false;\n\n // The outer loop progressively attempts to compute new separating axes.\n // This loop terminates when an axis is repeated (no progress is made).\n while (true) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n sweepA.getTransform(xfA, t1);\n sweepB.getTransform(xfB, t1);\n\n // Get the distance between shapes. We can also use the results\n // to get a separating axis.\n distanceInput.transformA = xfA;\n distanceInput.transformB = xfB;\n const distanceOutput = new DistanceOutput();\n Distance(distanceOutput, cache, distanceInput);\n\n // If the shapes are overlapped, we give up on continuous collision.\n if (distanceOutput.distance <= 0.0) {\n // Failure!\n output.state = TOIOutputState.e_overlapped;\n output.t = 0.0;\n break;\n }\n\n if (distanceOutput.distance < target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n break;\n }\n\n // Initialize the separating axis.\n const fcn = new SeparationFunction();\n fcn.initialize(cache, proxyA, sweepA, proxyB, sweepB, t1);\n\n // if (false) {\n // // Dump the curve seen by the root finder\n // const N = 100;\n // const dx = 1.0 / N;\n // const xs = []; // [ N + 1 ];\n // const fs = []; // [ N + 1 ];\n // const x = 0.0;\n // for (const i = 0; i <= N; ++i) {\n // sweepA.getTransform(xfA, x);\n // sweepB.getTransform(xfB, x);\n // const f = fcn.evaluate(xfA, xfB) - target;\n // printf(\"%g %g\\n\", x, f);\n // xs[i] = x;\n // fs[i] = f;\n // x += dx;\n // }\n // }\n\n // Compute the TOI on the separating axis. We do this by successively\n // resolving the deepest point. This loop is bounded by the number of\n // vertices.\n let done = false;\n let t2 = tMax;\n let pushBackIter = 0;\n while (true) {\n // Find the deepest point at t2. Store the witness point indices.\n let s2 = fcn.findMinSeparation(t2);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Is the final configuration separated?\n if (s2 > target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_separated;\n output.t = tMax;\n done = true;\n break;\n }\n\n // Has the separation reached tolerance?\n if (s2 > target - tolerance) {\n // Advance the sweeps\n t1 = t2;\n break;\n }\n\n // Compute the initial separation of the witness points.\n let s1 = fcn.evaluate(t1);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Check for initial overlap. This might happen if the root finder\n // runs out of iterations.\n if (s1 < target - tolerance) {\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n done = true;\n break;\n }\n\n // Check for touching\n if (s1 <= target + tolerance) {\n // Victory! t1 should hold the TOI (could be 0.0).\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n done = true;\n break;\n }\n\n // Compute 1D root of: f(x) - target = 0\n let rootIterCount = 0;\n let a1 = t1;\n let a2 = t2;\n while (true) {\n // Use a mix of the secant rule and bisection.\n let t;\n if (rootIterCount & 1) {\n // Secant rule to improve convergence.\n t = a1 + (target - s1) * (a2 - a1) / (s2 - s1);\n } else {\n // Bisection to guarantee progress.\n t = 0.5 * (a1 + a2);\n }\n\n ++rootIterCount;\n ++stats.toiRootIters;\n\n const s = fcn.evaluate(t);\n const indexA = fcn.indexA;\n const indexB = fcn.indexB;\n\n if (Math.abs(s - target) < tolerance) {\n // t2 holds a tentative value for t1\n t2 = t;\n break;\n }\n\n // Ensure we continue to bracket the root.\n if (s > target) {\n a1 = t;\n s1 = s;\n } else {\n a2 = t;\n s2 = s;\n }\n\n if (rootIterCount === 50) {\n break;\n }\n }\n\n stats.toiMaxRootIters = Math.max(stats.toiMaxRootIters, rootIterCount);\n\n ++pushBackIter;\n\n if (pushBackIter === Settings.maxPolygonVertices) {\n break;\n }\n }\n\n ++iter;\n ++stats.toiIters;\n\n if (done) {\n break;\n }\n\n if (iter === k_maxIterations) {\n // Root finder got stuck. Semi-victory.\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n break;\n }\n }\n\n stats.toiMaxIters = Math.max(stats.toiMaxIters, iter);\n\n const time = Timer.diff(timer);\n stats.toiMaxTime = Math.max(stats.toiMaxTime, time);\n stats.toiTime += time;\n}\n\nenum SeparationFunctionType {\n e_points = 1,\n e_faceA = 2,\n e_faceB = 3,\n}\n\nclass SeparationFunction {\n m_proxyA: DistanceProxy = new DistanceProxy();\n m_proxyB: DistanceProxy = new DistanceProxy();\n m_sweepA: Sweep;\n m_sweepB: Sweep;\n indexA: number;\n indexB: number;\n m_type: SeparationFunctionType;\n m_localPoint: Vec2 = Vec2.zero();\n m_axis: Vec2 = Vec2.zero();\n\n // TODO_ERIN might not need to return the separation\n\n initialize(cache: SimplexCache, proxyA: DistanceProxy, sweepA: Sweep, proxyB: DistanceProxy, sweepB: Sweep, t1: number): number {\n this.m_proxyA = proxyA;\n this.m_proxyB = proxyB;\n const count = cache.count;\n _ASSERT && common.assert(0 < count && count < 3);\n\n this.m_sweepA = sweepA;\n this.m_sweepB = sweepB;\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t1);\n this.m_sweepB.getTransform(xfB, t1);\n\n if (count === 1) {\n this.m_type = SeparationFunctionType.e_points;\n const localPointA = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n this.m_axis.setCombine(1, pointB, -1, pointA);\n const s = this.m_axis.normalize();\n return s;\n\n } else if (cache.indexA[0] === cache.indexA[1]) {\n // Two points on B and one on A.\n this.m_type = SeparationFunctionType.e_faceB;\n const localPointB1 = proxyB.getVertex(cache.indexB[0]);\n const localPointB2 = proxyB.getVertex(cache.indexB[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointB2, localPointB1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointB1, localPointB2);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n const localPointA = proxyA.getVertex(cache.indexA[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n let s = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n\n } else {\n // Two points on A and one or two points on B.\n this.m_type = SeparationFunctionType.e_faceA;\n const localPointA1 = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointA2 = this.m_proxyA.getVertex(cache.indexA[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointA2, localPointA1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointA1, localPointA2);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n let s = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n }\n }\n\n compute(find: boolean, t: number): number {\n // It was findMinSeparation and evaluate\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t);\n this.m_sweepB.getTransform(xfB, t);\n\n switch (this.m_type) {\n case SeparationFunctionType.e_points: {\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, this.m_axis);\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(this.m_axis));\n\n this.indexA = this.m_proxyA.getSupport(axisA);\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, this.m_axis) - Vec2.dot(pointA, this.m_axis);\n return sep;\n }\n\n case SeparationFunctionType.e_faceA: {\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n if (find) {\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(normal));\n\n this.indexA = -1;\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n return sep;\n }\n\n case SeparationFunctionType.e_faceB: {\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, Vec2.neg(normal));\n\n this.indexB = -1;\n this.indexA = this.m_proxyA.getSupport(axisA);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n const sep = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n return sep;\n }\n\n default:\n _ASSERT && common.assert(false);\n if (find) {\n this.indexA = -1;\n this.indexB = -1;\n }\n return 0.0;\n }\n }\n\n findMinSeparation(t: number): number {\n return this.compute(true, t);\n }\n\n evaluate(t: number): number {\n return this.compute(false, t);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport type Vec2 from '../common/Vec2';\nimport type Body from './Body';\nimport { TimeStep } from \"./Solver\";\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n/**\n * A joint edge is used to connect bodies and joints together in a joint graph\n * where each body is a node and each joint is an edge. A joint edge belongs to\n * a doubly linked list maintained in each attached body. Each joint has two\n * joint nodes, one for each attached body.\n */\nexport class JointEdge {\n /**\n * provides quick access to the other body attached.\n */\n other: Body | null = null;\n /**\n * the joint\n */\n joint: Joint | null = null;\n /**\n * prev the previous joint edge in the body's joint list\n */\n prev: JointEdge | null = null;\n /**\n * the next joint edge in the body's joint list\n */\n next: JointEdge | null = null;\n}\n\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointOpt {\n /**\n * Use this to attach application specific data to your joints.\n */\n userData?: any;\n /**\n * Set this flag to true if the attached bodies\n * should collide.\n */\n collideConnected?: boolean;\n}\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointDef extends JointOpt {\n /**\n * The first attached body.\n */\n bodyA: Body;\n /**\n * The second attached body.\n */\n bodyB: Body;\n}\n\nconst DEFAULTS = {\n userData : null,\n collideConnected : false\n};\n\n/**\n * The base joint class. Joints are used to constraint two bodies together in\n * various fashions. Some joints also feature limits and motors.\n */\nexport default abstract class Joint {\n\n /** @internal */ m_type: string = 'unknown-joint';\n\n /** @internal */ m_bodyA: Body;\n /** @internal */ m_bodyB: Body;\n\n /** @internal */ m_collideConnected: boolean;\n\n /** @internal */ m_prev: Joint | null = null;\n /** @internal */ m_next: Joint | null = null;\n\n /** @internal */ m_edgeA: JointEdge = new JointEdge();\n /** @internal */ m_edgeB: JointEdge = new JointEdge();\n\n /** @internal */ m_islandFlag: boolean = false;\n /** @internal */ m_userData: unknown;\n\n constructor(def: JointDef);\n constructor(def: JointOpt, bodyA: Body, bodyB: Body);\n constructor(def: JointDef | JointOpt, bodyA?: Body, bodyB?: Body) {\n bodyA = 'bodyA' in def ? def.bodyA : bodyA;\n bodyB = 'bodyB' in def ? def.bodyB : bodyB;\n\n _ASSERT && common.assert(!!bodyA);\n _ASSERT && common.assert(!!bodyB);\n _ASSERT && common.assert(bodyA != bodyB);\n\n this.m_bodyA = bodyA!;\n this.m_bodyB = bodyB!;\n\n this.m_collideConnected = !!def.collideConnected;\n this.m_userData = def.userData;\n }\n\n /**\n * Short-cut function to determine if either body is inactive.\n */\n isActive(): boolean {\n return this.m_bodyA.isActive() && this.m_bodyB.isActive();\n }\n\n /**\n * Get the type of the concrete joint.\n */\n getType(): string {\n return this.m_type;\n }\n\n /**\n * Get the first body attached to this joint.\n */\n getBodyA(): Body {\n return this.m_bodyA;\n }\n\n /**\n * Get the second body attached to this joint.\n */\n getBodyB(): Body {\n return this.m_bodyB;\n }\n\n /**\n * Get the next joint the world joint list.\n */\n getNext(): Joint {\n return this.m_next;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get collide connected. Note: modifying the collide connect flag won't work\n * correctly because the flag is only checked when fixture AABBs begin to\n * overlap.\n */\n getCollideConnected(): boolean {\n return this.m_collideConnected;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n abstract getAnchorA(): Vec2;\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n abstract getAnchorB(): Vec2;\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n abstract getReactionForce(inv_dt: number): Vec2;\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n abstract getReactionTorque(inv_dt: number): number;\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2): void {}\n\n abstract initVelocityConstraints(step: TimeStep): void;\n\n abstract solveVelocityConstraints(step: TimeStep): void;\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n abstract solvePositionConstraints(step: TimeStep): boolean;\n\n}\n","export const now = function(): number {\n return Date.now();\n};\n\nexport const diff = function(time: number): number {\n return Date.now() - time;\n};\n\nexport default {\n now,\n diff,\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../Settings';\nimport common from '../util/common';\nimport Vec2 from '../common/Vec2';\nimport Math from '../common/Math';\nimport Body from './Body';\nimport Contact from './Contact';\nimport Joint from './Joint';\nimport TimeOfImpact, { TOIInput, TOIOutput, TOIOutputState } from '../collision/TimeOfImpact';\nimport Distance, { DistanceInput, DistanceOutput, SimplexCache } from '../collision/Distance';\nimport World from \"./World\";\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport class TimeStep {\n /** time step */\n dt: number = 0;\n /** inverse time step (0 if dt == 0) */\n inv_dt: number = 0;\n velocityIterations: number = 0;\n positionIterations: number = 0;\n warmStarting: boolean = false;\n blockSolve: boolean = true;\n\n /** timestep ratio for variable timestep */\n inv_dt0: number = 0.0;\n /** dt * inv_dt0 */\n dtRatio: number = 1;\n\n reset(dt: number): void {\n if (this.dt > 0.0) {\n this.inv_dt0 = this.inv_dt;\n }\n this.dt = dt;\n this.inv_dt = dt == 0 ? 0 : 1 / dt;\n this.dtRatio = dt * this.inv_dt0;\n }\n}\n\n// reuse\nconst s_subStep = new TimeStep();\n\n/**\n * Contact impulses for reporting. Impulses are used instead of forces because\n * sub-step forces may approach infinity for rigid body collisions. These match\n * up one-to-one with the contact points in Manifold.\n */\nexport class ContactImpulse {\n // TODO: merge with Contact class?\n\n private readonly contact: Contact;\n private readonly normals: number[];\n private readonly tangents: number[];\n\n constructor(contact: Contact) {\n this.contact = contact;\n this.normals = [];\n this.tangents = [];\n }\n\n get normalImpulses(): number[] {\n const contact = this.contact;\n const normals = this.normals;\n normals.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n normals.push(contact.v_points[p].normalImpulse);\n }\n return normals;\n }\n\n get tangentImpulses(): number[] {\n const contact = this.contact;\n const tangents = this.tangents;\n tangents.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n tangents.push(contact.v_points[p].tangentImpulse);\n }\n return tangents;\n }\n}\n\n/**\n * Finds and solves islands. An island is a connected subset of the world.\n */\nexport default class Solver {\n m_world: World;\n m_stack: Body[];\n m_bodies: Body[];\n m_contacts: Contact[];\n m_joints: Joint[];\n\n constructor(world: World) {\n this.m_world = world;\n this.m_stack = [];\n this.m_bodies = [];\n this.m_contacts = [];\n this.m_joints = [];\n }\n\n clear(): void {\n this.m_stack.length = 0;\n this.m_bodies.length = 0;\n this.m_contacts.length = 0;\n this.m_joints.length = 0;\n }\n\n addBody(body: Body): void {\n _ASSERT && common.assert(body instanceof Body, 'Not a Body!', body);\n this.m_bodies.push(body);\n // why?\n // body.c_position.c.setZero();\n // body.c_position.a = 0;\n // body.c_velocity.v.setZero();\n // body.c_velocity.w = 0;\n }\n\n addContact(contact: Contact): void {\n _ASSERT && common.assert(contact instanceof Contact, 'Not a Contact!', contact);\n this.m_contacts.push(contact);\n }\n\n addJoint(joint: Joint): void {\n _ASSERT && common.assert(joint instanceof Joint, 'Not a Joint!', joint);\n this.m_joints.push(joint);\n }\n\n solveWorld(step: TimeStep): void {\n const world = this.m_world;\n\n // Clear all the island flags.\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n }\n for (let c = world.m_contactList; c; c = c.m_next) {\n c.m_islandFlag = false;\n }\n for (let j = world.m_jointList; j; j = j.m_next) {\n j.m_islandFlag = false;\n }\n\n // Build and simulate all awake islands.\n const stack = this.m_stack;\n let loop = -1;\n for (let seed = world.m_bodyList; seed; seed = seed.m_next) {\n loop++;\n if (seed.m_islandFlag) {\n continue;\n }\n\n if (seed.isAwake() == false || seed.isActive() == false) {\n continue;\n }\n\n // The seed can be dynamic or kinematic.\n if (seed.isStatic()) {\n continue;\n }\n\n // Reset island and stack.\n this.clear();\n\n stack.push(seed);\n\n seed.m_islandFlag = true;\n\n // Perform a depth first search (DFS) on the constraint graph.\n while (stack.length > 0) {\n // Grab the next body off the stack and add it to the island.\n const b = stack.pop();\n _ASSERT && common.assert(b.isActive() == true);\n this.addBody(b);\n\n // Make sure the body is awake.\n b.setAwake(true);\n\n // To keep islands as small as possible, we don't\n // propagate islands across static bodies.\n if (b.isStatic()) {\n continue;\n }\n\n // Search all contacts connected to this body.\n for (let ce = b.m_contactList; ce; ce = ce.next) {\n const contact = ce.contact;\n\n // Has this contact already been added to an island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Is this contact solid and touching?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n this.addContact(contact);\n contact.m_islandFlag = true;\n\n const other = ce.other;\n\n // Was the other body already added to this island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && common.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n\n // Search all joints connect to this body.\n for (let je = b.m_jointList; je; je = je.next) {\n if (je.joint.m_islandFlag == true) {\n continue;\n }\n\n const other = je.other;\n\n // Don't simulate joints connected to inactive bodies.\n if (other.isActive() == false) {\n continue;\n }\n\n this.addJoint(je.joint);\n je.joint.m_islandFlag = true;\n\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && common.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n }\n\n this.solveIsland(step);\n\n // Post solve cleanup.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n // Allow static bodies to participate in other islands.\n // TODO: are they added at all?\n const b = this.m_bodies[i];\n if (b.isStatic()) {\n b.m_islandFlag = false;\n }\n }\n }\n }\n\n solveIsland(step: TimeStep): void {\n // B2: Island Solve\n const world = this.m_world;\n const gravity = world.m_gravity;\n const allowSleep = world.m_allowSleep;\n\n const h = step.dt;\n\n // Integrate velocities and apply damping. Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.m_sweep.c);\n const a = body.m_sweep.a;\n const v = Vec2.clone(body.m_linearVelocity);\n let w = body.m_angularVelocity;\n\n // Store positions for continuous collision.\n body.m_sweep.c0.setVec2(body.m_sweep.c);\n body.m_sweep.a0 = body.m_sweep.a;\n\n if (body.isDynamic()) {\n // Integrate velocities.\n v.addMul(h * body.m_gravityScale, gravity);\n v.addMul(h * body.m_invMass, body.m_force);\n w += h * body.m_invI * body.m_torque;\n /**\n *
\n         * Apply damping.\n         * ODE: dv/dt + c * v = 0\n         * Solution: v(t) = v0 * exp(-c * t)\n         * Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)\n         * v2 = exp(-c * dt) * v1\n         * Pade approximation:\n         * v2 = v1 * 1 / (1 + c * dt)\n         * 
\n */\n v.mul(1.0 / (1.0 + h * body.m_linearDamping));\n w *= 1.0 / (1.0 + h * body.m_angularDamping);\n }\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(step);\n }\n\n _DEBUG && this.printBodies('M: ');\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(step);\n }\n\n _DEBUG && this.printBodies('R: ');\n\n if (step.warmStarting) {\n // Warm start.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.warmStartConstraint(step);\n }\n }\n\n _DEBUG && this.printBodies('Q: ');\n\n for (let i = 0; i < this.m_joints.length; ++i) {\n const joint = this.m_joints[i];\n joint.initVelocityConstraints(step);\n }\n\n _DEBUG && this.printBodies('E: ');\n\n // Solve velocity constraints\n for (let i = 0; i < step.velocityIterations; ++i) {\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n joint.solveVelocityConstraints(step);\n }\n\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(step);\n }\n }\n\n _DEBUG && this.printBodies('D: ');\n\n // Store impulses for warm starting\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.storeConstraintImpulses(step);\n }\n\n _DEBUG && this.printBodies('C: ');\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.lengthSquared(translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c.setVec2(c);\n body.c_position.a = a;\n body.c_velocity.v.setVec2(v);\n body.c_velocity.w = w;\n }\n\n _DEBUG && this.printBodies('B: ');\n\n // Solve position constraints\n let positionSolved = false;\n for (let i = 0; i < step.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraint(step);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -3.0 * Settings.linearSlop;\n\n let jointsOkay = true;\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n const jointOkay = joint.solvePositionConstraints(step);\n jointsOkay = jointsOkay && jointOkay;\n }\n\n if (contactsOkay && jointsOkay) {\n // Exit early if the position errors are small.\n positionSolved = true;\n break;\n }\n }\n\n _DEBUG && this.printBodies('L: ');\n\n // Copy state buffers back to the bodies\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n body.m_sweep.c.setVec2(body.c_position.c);\n body.m_sweep.a = body.c_position.a;\n body.m_linearVelocity.setVec2(body.c_velocity.v);\n body.m_angularVelocity = body.c_velocity.w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n\n if (allowSleep) {\n let minSleepTime = Infinity;\n\n const linTolSqr = Settings.linearSleepToleranceSqr;\n const angTolSqr = Settings.angularSleepToleranceSqr;\n\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n if (body.isStatic()) {\n continue;\n }\n\n if ((body.m_autoSleepFlag == false)\n || (body.m_angularVelocity * body.m_angularVelocity > angTolSqr)\n || (Vec2.lengthSquared(body.m_linearVelocity) > linTolSqr)) {\n body.m_sleepTime = 0.0;\n minSleepTime = 0.0;\n } else {\n body.m_sleepTime += h;\n minSleepTime = Math.min(minSleepTime, body.m_sleepTime);\n }\n }\n\n if (minSleepTime >= Settings.timeToSleep && positionSolved) {\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.setAwake(false);\n }\n }\n }\n }\n\n /** @internal */\n printBodies(tag: string): void {\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const b = this.m_bodies[i];\n common.debug(tag, b.c_position.a, b.c_position.c.x, b.c_position.c.y, b.c_velocity.w, b.c_velocity.v.x, b.c_velocity.v.y);\n }\n }\n\n /**\n * Find TOI contacts and solve them.\n */\n solveWorldTOI(step: TimeStep): void {\n const world = this.m_world;\n\n if (world.m_stepComplete) {\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n b.m_sweep.alpha0 = 0.0;\n }\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Invalidate TOI\n c.m_toiFlag = false;\n c.m_islandFlag = false;\n c.m_toiCount = 0;\n c.m_toi = 1.0;\n }\n }\n\n // Find TOI events and solve them.\n while (true) {\n // Find the first TOI.\n let minContact = null; // Contact\n let minAlpha = 1.0;\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Is this contact disabled?\n if (c.isEnabled() == false) {\n continue;\n }\n\n // Prevent excessive sub-stepping.\n if (c.m_toiCount > Settings.maxSubSteps) {\n continue;\n }\n\n let alpha = 1.0;\n if (c.m_toiFlag) {\n // This contact has a valid cached TOI.\n alpha = c.m_toi;\n } else {\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n // Is there a sensor?\n if (fA.isSensor() || fB.isSensor()) {\n continue;\n }\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n _ASSERT && common.assert(bA.isDynamic() || bB.isDynamic());\n\n const activeA = bA.isAwake() && !bA.isStatic();\n const activeB = bB.isAwake() && !bB.isStatic();\n\n // Is at least one body active (awake and dynamic or kinematic)?\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const collideA = bA.isBullet() || !bA.isDynamic();\n const collideB = bB.isBullet() || !bB.isDynamic();\n\n // Are these two non-bullet dynamic bodies?\n if (collideA == false && collideB == false) {\n continue;\n }\n\n // Compute the TOI for this contact.\n // Put the sweeps onto the same time interval.\n let alpha0 = bA.m_sweep.alpha0;\n\n if (bA.m_sweep.alpha0 < bB.m_sweep.alpha0) {\n alpha0 = bB.m_sweep.alpha0;\n bA.m_sweep.advance(alpha0);\n } else if (bB.m_sweep.alpha0 < bA.m_sweep.alpha0) {\n alpha0 = bA.m_sweep.alpha0;\n bB.m_sweep.advance(alpha0);\n }\n\n _ASSERT && common.assert(alpha0 < 1.0);\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const sweepA = bA.m_sweep;\n const sweepB = bB.m_sweep;\n\n // Compute the time of impact in interval [0, minTOI]\n const input = new TOIInput(); // TODO: reuse\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.sweepA.set(bA.m_sweep);\n input.sweepB.set(bB.m_sweep);\n input.tMax = 1.0;\n\n const output = new TOIOutput(); // TODO: reuse\n TimeOfImpact(output, input);\n\n // Beta is the fraction of the remaining portion of the [time?].\n const beta = output.t;\n if (output.state == TOIOutputState.e_touching) {\n alpha = Math.min(alpha0 + (1.0 - alpha0) * beta, 1.0);\n } else {\n alpha = 1.0;\n }\n\n c.m_toi = alpha;\n c.m_toiFlag = true;\n }\n\n if (alpha < minAlpha) {\n // This is the minimum TOI found so far.\n minContact = c;\n minAlpha = alpha;\n }\n }\n\n if (minContact == null || 1.0 - 10.0 * Math.EPSILON < minAlpha) {\n // No more TOI events. Done!\n world.m_stepComplete = true;\n break;\n }\n\n // Advance the bodies to the TOI.\n const fA = minContact.getFixtureA();\n const fB = minContact.getFixtureB();\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const backup1 = bA.m_sweep.clone();\n const backup2 = bB.m_sweep.clone();\n\n bA.advance(minAlpha);\n bB.advance(minAlpha);\n\n // The TOI contact likely has some new contact points.\n minContact.update(world);\n minContact.m_toiFlag = false;\n ++minContact.m_toiCount;\n\n // Is the contact solid?\n if (minContact.isEnabled() == false || minContact.isTouching() == false) {\n // Restore the sweeps.\n minContact.setEnabled(false);\n bA.m_sweep.set(backup1);\n bB.m_sweep.set(backup2);\n bA.synchronizeTransform();\n bB.synchronizeTransform();\n continue;\n }\n\n bA.setAwake(true);\n bB.setAwake(true);\n\n // Build the island\n this.clear();\n this.addBody(bA);\n this.addBody(bB);\n this.addContact(minContact);\n\n bA.m_islandFlag = true;\n bB.m_islandFlag = true;\n minContact.m_islandFlag = true;\n\n // Get contacts on bodyA and bodyB.\n const bodies = [ bA, bB ];\n for (let i = 0; i < bodies.length; ++i) {\n const body = bodies[i];\n if (body.isDynamic()) {\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n // if (this.m_bodyCount == this.m_bodyCapacity) { break; }\n // if (this.m_contactCount == this.m_contactCapacity) { break; }\n\n const contact = ce.contact;\n\n // Has this contact already been added to the island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Only add if either is static, kinematic or bullet.\n const other = ce.other;\n if (other.isDynamic() && !body.isBullet() && !other.isBullet()) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n // Tentatively advance the body to the TOI.\n const backup = other.m_sweep.clone();\n if (other.m_islandFlag == false) {\n other.advance(minAlpha);\n }\n\n // Update the contact points\n contact.update(world);\n\n // Was the contact disabled by the user?\n // Are there contact points?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n other.m_sweep.set(backup);\n other.synchronizeTransform();\n continue;\n }\n\n // Add the contact to the island\n contact.m_islandFlag = true;\n this.addContact(contact);\n\n // Has the other body already been added to the island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // Add the other body to the island.\n other.m_islandFlag = true;\n\n if (!other.isStatic()) {\n other.setAwake(true);\n }\n\n this.addBody(other);\n }\n }\n }\n\n s_subStep.reset((1.0 - minAlpha) * step.dt);\n s_subStep.dtRatio = 1.0;\n s_subStep.positionIterations = 20;\n s_subStep.velocityIterations = step.velocityIterations;\n s_subStep.warmStarting = false;\n\n this.solveIslandTOI(s_subStep, bA, bB);\n\n // Reset island flags and synchronize broad-phase proxies.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.m_islandFlag = false;\n\n if (!body.isDynamic()) {\n continue;\n }\n\n body.synchronizeFixtures();\n\n // Invalidate all contact TOIs on this displaced body.\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n ce.contact.m_toiFlag = false;\n ce.contact.m_islandFlag = false;\n }\n }\n\n // Commit fixture proxy movements to the broad-phase so that new contacts\n // are created.\n // Also, some contacts can be destroyed.\n world.findNewContacts();\n\n if (world.m_subStepping) {\n world.m_stepComplete = false;\n break;\n }\n }\n\n if (_DEBUG) for (let b = world.m_bodyList; b; b = b.m_next) {\n const c = b.m_sweep.c;\n const a = b.m_sweep.a;\n const v = b.m_linearVelocity;\n const w = b.m_angularVelocity;\n }\n }\n\n solveIslandTOI(subStep: TimeStep, toiA: Body, toiB: Body): void {\n const world = this.m_world;\n\n // Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.c_position.c.setVec2(body.m_sweep.c);\n body.c_position.a = body.m_sweep.a;\n body.c_velocity.v.setVec2(body.m_linearVelocity);\n body.c_velocity.w = body.m_angularVelocity;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(subStep);\n }\n\n // Solve position constraints.\n for (let i = 0; i < subStep.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraintTOI(subStep, toiA, toiB);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -1.5 * Settings.linearSlop;\n if (contactsOkay) {\n break;\n }\n }\n\n if (false) {\n // Is the new position really safe?\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const c = this.m_contacts[i];\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const input = new DistanceInput();\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.transformA = bA.getTransform();\n input.transformB = bB.getTransform();\n input.useRadii = false;\n\n const output = new DistanceOutput();\n const cache = new SimplexCache();\n Distance(output, cache, input);\n\n if (output.distance == 0 || cache.count == 3) {\n cache.count += 0;\n }\n }\n }\n\n // Leap of faith to new safe state.\n toiA.m_sweep.c0.setVec2(toiA.c_position.c);\n toiA.m_sweep.a0 = toiA.c_position.a;\n toiB.m_sweep.c0.setVec2(toiB.c_position.c);\n toiB.m_sweep.a0 = toiB.c_position.a;\n\n // No warm starting is needed for TOI events because warm\n // starting impulses were applied in the discrete solver.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(subStep);\n }\n\n // Solve velocity constraints.\n for (let i = 0; i < subStep.velocityIterations; ++i) {\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(subStep);\n }\n }\n\n // Don't store the TOI contact forces for warm starting\n // because they can be quite large.\n\n const h = subStep.dt;\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.dot(translation, translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n\n // Sync bodies\n body.m_sweep.c = c;\n body.m_sweep.a = a;\n body.m_linearVelocity = v;\n body.m_angularVelocity = w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n }\n\n /** @internal */\n postSolveIsland(): void {\n for (let c = 0; c < this.m_contacts.length; ++c) {\n const contact = this.m_contacts[c];\n this.m_world.postSolve(contact, contact.m_impulse);\n }\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../util/options';\nimport common from '../util/common';\nimport Vec2 from '../common/Vec2';\nimport BroadPhase from '../collision/BroadPhase';\nimport Solver, { ContactImpulse, TimeStep } from './Solver';\nimport Body, { BodyDef } from './Body';\nimport Joint from './Joint';\nimport Contact from './Contact';\nimport AABB, { RayCastInput, RayCastOutput } from \"../collision/AABB\";\nimport Fixture, { FixtureProxy } from \"./Fixture\";\nimport Manifold from \"../collision/Manifold\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * @prop gravity [{ x : 0, y : 0}]\n * @prop allowSleep [true]\n * @prop warmStarting [true]\n * @prop continuousPhysics [true]\n * @prop subStepping [false]\n * @prop blockSolve [true]\n * @prop velocityIterations [8] For the velocity constraint solver.\n * @prop positionIterations [3] For the position constraint solver.\n */\nexport interface WorldDef {\n gravity?: Vec2;\n allowSleep?: boolean;\n warmStarting?: boolean;\n continuousPhysics?: boolean;\n subStepping?: boolean;\n blockSolve?: boolean;\n velocityIterations?: number;\n positionIterations?: number;\n}\n\nconst WorldDefDefault: WorldDef = {\n gravity : Vec2.zero(),\n allowSleep : true,\n warmStarting : true,\n continuousPhysics : true,\n subStepping : false,\n blockSolve : true,\n velocityIterations : 8,\n positionIterations : 3\n};\n\n/**\n * Callback function for ray casts, see {@link World.rayCast}.\n *\n * Called for each fixture found in the query. You control how the ray cast\n * proceeds by returning a float: return -1: ignore this fixture and continue\n * return 0: terminate the ray cast return fraction: clip the ray to this point\n * return 1: don't clip the ray and continue\n *\n * @param fixture The fixture hit by the ray\n * @param point The point of initial intersection\n * @param normal The normal vector at the point of intersection\n * @param fraction\n *\n * @return -1 to filter, 0 to terminate, fraction to clip the ray for closest hit, 1 to continue\n */\nexport type WorldRayCastCallback = (fixture: Fixture, point: Vec2, normal: Vec2, fraction: number) => number;\n\n/**\n * Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\nexport type WorldAABBQueryCallback = (fixture: Fixture) => boolean;\n\nexport default class World {\n /** @internal */ m_solver: Solver;\n /** @internal */ m_broadPhase: BroadPhase;\n /** @internal */ m_contactList: Contact | null;\n /** @internal */ m_contactCount: number;\n /** @internal */ m_bodyList: Body | null;\n /** @internal */ m_bodyCount: number;\n /** @internal */ m_jointList: Joint | null;\n /** @internal */ m_jointCount: number;\n /** @internal */ m_stepComplete: boolean;\n /** @internal */ m_allowSleep: boolean;\n /** @internal */ m_gravity: Vec2;\n /** @internal */ m_clearForces: boolean;\n /** @internal */ m_newFixture: boolean;\n /** @internal */ m_locked: boolean;\n /** @internal */ m_warmStarting: boolean;\n /** @internal */ m_continuousPhysics: boolean;\n /** @internal */ m_subStepping: boolean;\n /** @internal */ m_blockSolve: boolean;\n /** @internal */ m_velocityIterations: number;\n /** @internal */ m_positionIterations: number;\n /** @internal */ m_t: number;\n\n // TODO\n /** @internal */ _listeners: {\n [key: string]: any[]\n };\n\n /**\n * @param def World definition or gravity vector.\n */\n constructor(def?: WorldDef | Vec2 | null) {\n if (!(this instanceof World)) {\n return new World(def);\n }\n\n if (def && Vec2.isValid(def)) {\n def = { gravity: def as Vec2 };\n }\n\n def = options(def, WorldDefDefault) as WorldDef;\n\n this.m_solver = new Solver(this);\n\n this.m_broadPhase = new BroadPhase();\n\n this.m_contactList = null;\n this.m_contactCount = 0;\n\n this.m_bodyList = null;\n this.m_bodyCount = 0;\n\n this.m_jointList = null;\n this.m_jointCount = 0;\n\n this.m_stepComplete = true;\n\n this.m_allowSleep = def.allowSleep;\n this.m_gravity = Vec2.clone(def.gravity);\n\n this.m_clearForces = true;\n this.m_newFixture = false;\n this.m_locked = false;\n\n // These are for debugging the solver.\n this.m_warmStarting = def.warmStarting;\n this.m_continuousPhysics = def.continuousPhysics;\n this.m_subStepping = def.subStepping;\n\n this.m_blockSolve = def.blockSolve;\n this.m_velocityIterations = def.velocityIterations;\n this.m_positionIterations = def.positionIterations;\n\n this.m_t = 0;\n }\n\n /** @internal */\n _serialize(): object {\n const bodies = [];\n const joints = [];\n\n for (let b = this.getBodyList(); b; b = b.getNext()) {\n bodies.push(b);\n }\n\n for (let j = this.getJointList(); j; j = j.getNext()) {\n // @ts-ignore\n if (typeof j._serialize === 'function') {\n joints.push(j);\n }\n }\n\n return {\n gravity: this.m_gravity,\n bodies,\n joints,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, context: any, restore: any): World {\n if (!data) {\n return new World();\n }\n\n const world = new World(data.gravity);\n\n if (data.bodies) {\n for (let i = data.bodies.length - 1; i >= 0; i -= 1) {\n world._addBody(restore(Body, data.bodies[i], world));\n }\n }\n\n if (data.joints) {\n for (let i = data.joints.length - 1; i >= 0; i--) {\n world.createJoint(restore(Joint, data.joints[i], world));\n }\n }\n\n return world;\n }\n\n /**\n * Get the world body list. With the returned body, use Body.getNext to get the\n * next body in the world list. A null body indicates the end of the list.\n *\n * @return the head of the world body list.\n */\n getBodyList(): Body | null {\n return this.m_bodyList;\n }\n\n /**\n * Get the world joint list. With the returned joint, use Joint.getNext to get\n * the next joint in the world list. A null joint indicates the end of the list.\n *\n * @return the head of the world joint list.\n */\n getJointList(): Joint | null {\n return this.m_jointList;\n }\n\n /**\n * Get the world contact list. With the returned contact, use Contact.getNext to\n * get the next contact in the world list. A null contact indicates the end of\n * the list.\n *\n * Warning: contacts are created and destroyed in the middle of a time step.\n * Use ContactListener to avoid missing contacts.\n *\n * @return the head of the world contact list.\n */\n getContactList(): Contact | null {\n return this.m_contactList;\n }\n\n getBodyCount(): number {\n return this.m_bodyCount;\n }\n\n getJointCount(): number {\n return this.m_jointCount;\n }\n\n /**\n * Get the number of contacts (each may have 0 or more contact points).\n */\n getContactCount(): number {\n return this.m_contactCount;\n }\n\n /**\n * Change the global gravity vector.\n */\n setGravity(gravity: Vec2): void {\n this.m_gravity = gravity;\n }\n\n /**\n * Get the global gravity vector.\n */\n getGravity(): Vec2 {\n return this.m_gravity;\n }\n\n /**\n * Is the world locked (in the middle of a time step).\n */\n isLocked(): boolean {\n return this.m_locked;\n }\n\n /**\n * Enable/disable sleep.\n */\n setAllowSleeping(flag: boolean): void {\n if (flag == this.m_allowSleep) {\n return;\n }\n\n this.m_allowSleep = flag;\n if (this.m_allowSleep == false) {\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.setAwake(true);\n }\n }\n }\n\n getAllowSleeping(): boolean {\n return this.m_allowSleep;\n }\n\n /**\n * Enable/disable warm starting. For testing.\n */\n setWarmStarting(flag: boolean): void {\n this.m_warmStarting = flag;\n }\n\n getWarmStarting(): boolean {\n return this.m_warmStarting;\n }\n\n /**\n * Enable/disable continuous physics. For testing.\n */\n setContinuousPhysics(flag: boolean): void {\n this.m_continuousPhysics = flag;\n }\n\n getContinuousPhysics(): boolean {\n return this.m_continuousPhysics;\n }\n\n /**\n * Enable/disable single stepped continuous physics. For testing.\n */\n setSubStepping(flag: boolean): void {\n this.m_subStepping = flag;\n }\n\n getSubStepping(): boolean {\n return this.m_subStepping;\n }\n\n /**\n * Set flag to control automatic clearing of forces after each time step.\n */\n setAutoClearForces(flag: boolean): void {\n this.m_clearForces = flag;\n }\n\n /**\n * Get the flag that controls automatic clearing of forces after each time step.\n */\n getAutoClearForces(): boolean {\n return this.m_clearForces;\n }\n\n /**\n * Manually clear the force buffer on all bodies. By default, forces are cleared\n * automatically after each call to step. The default behavior is modified by\n * calling setAutoClearForces. The purpose of this function is to support\n * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step\n * under a variable frame-rate. When you perform sub-stepping you will disable\n * auto clearing of forces and instead call clearForces after all sub-steps are\n * complete in one pass of your game loop.\n *\n * See {@link World.setAutoClearForces}\n */\n clearForces(): void {\n for (let body = this.m_bodyList; body; body = body.getNext()) {\n body.m_force.setZero();\n body.m_torque = 0.0;\n }\n }\n\n /**\n * Query the world for all fixtures that potentially overlap the provided AABB.\n *\n * @param aabb The query box.\n * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\n queryAABB(aabb: AABB, callback: WorldAABBQueryCallback): void {\n _ASSERT && common.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n this.m_broadPhase.query(aabb, function(proxyId: number): boolean { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n return callback(proxy.fixture);\n });\n }\n\n /**\n * Ray-cast the world for all fixtures in the path of the ray. Your callback\n * controls whether you get the closest point, any point, or n-points. The\n * ray-cast ignores shapes that contain the starting point.\n *\n * @param point1 The ray starting point\n * @param point2 The ray ending point\n * @param callback A user implemented callback function.\n */\n rayCast(point1: Vec2, point2: Vec2, callback: WorldRayCastCallback): void {\n _ASSERT && common.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n\n this.m_broadPhase.rayCast({\n maxFraction : 1.0,\n p1 : point1,\n p2 : point2\n }, function(input: RayCastInput, proxyId: number): number { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n const fixture = proxy.fixture;\n const index = proxy.childIndex;\n // @ts-ignore\n const output: RayCastOutput = {}; // TODO GC\n const hit = fixture.rayCast(output, input, index);\n if (hit) {\n const fraction = output.fraction;\n const point = Vec2.add(Vec2.mulNumVec2((1.0 - fraction), input.p1), Vec2.mulNumVec2(fraction, input.p2));\n return callback(fixture, point, output.normal, fraction);\n }\n return input.maxFraction;\n });\n }\n\n /**\n * Get the number of broad-phase proxies.\n */\n getProxyCount(): number {\n return this.m_broadPhase.getProxyCount();\n }\n\n /**\n * Get the height of broad-phase dynamic tree.\n */\n getTreeHeight(): number {\n return this.m_broadPhase.getTreeHeight();\n }\n\n /**\n * Get the balance of broad-phase dynamic tree.\n */\n getTreeBalance(): number {\n return this.m_broadPhase.getTreeBalance();\n }\n\n /**\n * Get the quality metric of broad-phase dynamic tree. The smaller the better.\n * The minimum is 1.\n */\n getTreeQuality(): number {\n return this.m_broadPhase.getTreeQuality();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The body shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n _ASSERT && common.assert(this.m_locked == false);\n if (this.m_locked) {\n return;\n }\n\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.m_xf.p.sub(newOrigin);\n b.m_sweep.c0.sub(newOrigin);\n b.m_sweep.c.sub(newOrigin);\n }\n\n for (let j = this.m_jointList; j; j = j.m_next) {\n j.shiftOrigin(newOrigin);\n }\n\n this.m_broadPhase.shiftOrigin(newOrigin);\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addBody(body: Body): void {\n _ASSERT && common.assert(this.isLocked() === false);\n if (this.isLocked()) {\n return;\n }\n\n // Add to world doubly linked list.\n body.m_prev = null;\n body.m_next = this.m_bodyList;\n if (this.m_bodyList) {\n this.m_bodyList.m_prev = body;\n }\n this.m_bodyList = body;\n ++this.m_bodyCount;\n }\n\n /**\n * Create a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This function is locked during callbacks.\n */\n createBody(def?: BodyDef): Body;\n createBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createBody(arg1?, arg2?) {\n _ASSERT && common.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n\n const body = new Body(this, def);\n this._addBody(body);\n return body;\n }\n\n createDynamicBody(def?: BodyDef): Body;\n createDynamicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createDynamicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'dynamic';\n return this.createBody(def);\n }\n\n createKinematicBody(def?: BodyDef): Body;\n createKinematicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createKinematicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'kinematic';\n return this.createBody(def);\n }\n\n /**\n * Destroy a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This automatically deletes all associated shapes and joints.\n *\n * Warning: This function is locked during callbacks.\n */\n destroyBody(b: Body): boolean {\n _ASSERT && common.assert(this.m_bodyCount > 0);\n _ASSERT && common.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n if (b.m_destroyed) {\n return false;\n }\n\n // Delete the attached joints.\n let je = b.m_jointList;\n while (je) {\n const je0 = je;\n je = je.next;\n\n this.publish('remove-joint', je0.joint);\n this.destroyJoint(je0.joint);\n\n b.m_jointList = je;\n }\n b.m_jointList = null;\n\n // Delete the attached contacts.\n let ce = b.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n\n this.destroyContact(ce0.contact);\n\n b.m_contactList = ce;\n }\n b.m_contactList = null;\n\n // Delete the attached fixtures. This destroys broad-phase proxies.\n let f = b.m_fixtureList;\n while (f) {\n const f0 = f;\n f = f.m_next;\n\n this.publish('remove-fixture', f0);\n f0.destroyProxies(this.m_broadPhase);\n\n b.m_fixtureList = f;\n }\n b.m_fixtureList = null;\n\n // Remove world body list.\n if (b.m_prev) {\n b.m_prev.m_next = b.m_next;\n }\n\n if (b.m_next) {\n b.m_next.m_prev = b.m_prev;\n }\n\n if (b == this.m_bodyList) {\n this.m_bodyList = b.m_next;\n }\n\n b.m_destroyed = true;\n\n --this.m_bodyCount;\n\n this.publish('remove-body', b);\n\n return true;\n }\n\n /**\n * Create a joint to constrain bodies together. No reference to the definition\n * is retained. This may cause the connected bodies to cease colliding.\n *\n * Warning: This function is locked during callbacks.\n */\n createJoint(joint: T): T | null {\n _ASSERT && common.assert(!!joint.m_bodyA);\n _ASSERT && common.assert(!!joint.m_bodyB);\n _ASSERT && common.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n // Connect to the world list.\n joint.m_prev = null;\n joint.m_next = this.m_jointList;\n if (this.m_jointList) {\n this.m_jointList.m_prev = joint;\n }\n this.m_jointList = joint;\n ++this.m_jointCount;\n\n // Connect to the bodies' doubly linked lists.\n joint.m_edgeA.joint = joint;\n joint.m_edgeA.other = joint.m_bodyB;\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = joint.m_bodyA.m_jointList;\n if (joint.m_bodyA.m_jointList)\n joint.m_bodyA.m_jointList.prev = joint.m_edgeA;\n joint.m_bodyA.m_jointList = joint.m_edgeA;\n\n joint.m_edgeB.joint = joint;\n joint.m_edgeB.other = joint.m_bodyA;\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = joint.m_bodyB.m_jointList;\n if (joint.m_bodyB.m_jointList)\n joint.m_bodyB.m_jointList.prev = joint.m_edgeB;\n joint.m_bodyB.m_jointList = joint.m_edgeB;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n for (let edge = joint.m_bodyB.getContactList(); edge; edge = edge.next) {\n if (edge.other == joint.m_bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n }\n }\n\n // Note: creating a joint doesn't wake the bodies.\n\n return joint;\n }\n\n /**\n * Destroy a joint. This may cause the connected bodies to begin colliding.\n * Warning: This function is locked during callbacks.\n */\n destroyJoint(joint: Joint): void {\n _ASSERT && common.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n // Remove from the doubly linked list.\n if (joint.m_prev) {\n joint.m_prev.m_next = joint.m_next;\n }\n\n if (joint.m_next) {\n joint.m_next.m_prev = joint.m_prev;\n }\n\n if (joint == this.m_jointList) {\n this.m_jointList = joint.m_next;\n }\n\n // Disconnect from bodies.\n const bodyA = joint.m_bodyA;\n const bodyB = joint.m_bodyB;\n\n // Wake up connected bodies.\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n\n // Remove from body 1.\n if (joint.m_edgeA.prev) {\n joint.m_edgeA.prev.next = joint.m_edgeA.next;\n }\n\n if (joint.m_edgeA.next) {\n joint.m_edgeA.next.prev = joint.m_edgeA.prev;\n }\n\n if (joint.m_edgeA == bodyA.m_jointList) {\n bodyA.m_jointList = joint.m_edgeA.next;\n }\n\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = null;\n\n // Remove from body 2\n if (joint.m_edgeB.prev) {\n joint.m_edgeB.prev.next = joint.m_edgeB.next;\n }\n\n if (joint.m_edgeB.next) {\n joint.m_edgeB.next.prev = joint.m_edgeB.prev;\n }\n\n if (joint.m_edgeB == bodyB.m_jointList) {\n bodyB.m_jointList = joint.m_edgeB.next;\n }\n\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = null;\n\n _ASSERT && common.assert(this.m_jointCount > 0);\n --this.m_jointCount;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n let edge = bodyB.getContactList();\n while (edge) {\n if (edge.other == bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n }\n\n this.publish('remove-joint', joint);\n }\n\n /** @internal */\n s_step: TimeStep = new TimeStep(); // reuse\n\n /**\n * Take a time step. This performs collision detection, integration, and\n * constraint solution.\n *\n * Broad-phase, narrow-phase, solve and solve time of impacts.\n *\n * @param timeStep Time step, this should not vary.\n */\n step(timeStep: number, velocityIterations?: number, positionIterations?: number): void {\n this.publish('pre-step', timeStep);\n\n if ((velocityIterations | 0) !== velocityIterations) {\n // TODO: remove this in future\n velocityIterations = 0;\n }\n\n velocityIterations = velocityIterations || this.m_velocityIterations;\n positionIterations = positionIterations || this.m_positionIterations;\n\n // If new fixtures were added, we need to find the new contacts.\n if (this.m_newFixture) {\n this.findNewContacts();\n this.m_newFixture = false;\n }\n\n this.m_locked = true;\n\n this.s_step.reset(timeStep);\n this.s_step.velocityIterations = velocityIterations;\n this.s_step.positionIterations = positionIterations;\n this.s_step.warmStarting = this.m_warmStarting;\n this.s_step.blockSolve = this.m_blockSolve;\n\n // Update contacts. This is where some contacts are destroyed.\n this.updateContacts();\n\n // Integrate velocities, solve velocity constraints, and integrate positions.\n if (this.m_stepComplete && timeStep > 0.0) {\n this.m_solver.solveWorld(this.s_step);\n\n // Synchronize fixtures, check for out of range bodies.\n for (let b = this.m_bodyList; b; b = b.getNext()) {\n // If a body was not in an island then it did not move.\n if (b.m_islandFlag == false) {\n continue;\n }\n\n if (b.isStatic()) {\n continue;\n }\n\n // Update fixtures (for broad-phase).\n b.synchronizeFixtures();\n }\n // Look for new contacts.\n this.findNewContacts();\n }\n\n // Handle TOI events.\n if (this.m_continuousPhysics && timeStep > 0.0) {\n this.m_solver.solveWorldTOI(this.s_step);\n }\n\n if (this.m_clearForces) {\n this.clearForces();\n }\n\n this.m_locked = false;\n\n this.publish('post-step', timeStep);\n }\n\n /**\n * @internal\n * Call this method to find new contacts.\n */\n findNewContacts(): void {\n this.m_broadPhase.updatePairs(this.createContact);\n }\n\n /**\n * @internal\n * Callback for broad-phase.\n */\n createContact = (proxyA: FixtureProxy, proxyB: FixtureProxy): void => {\n const fixtureA = proxyA.fixture;\n const fixtureB = proxyB.fixture;\n\n const indexA = proxyA.childIndex;\n const indexB = proxyB.childIndex;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Are the fixtures on the same body?\n if (bodyA == bodyB) {\n return;\n }\n\n // TODO_ERIN use a hash table to remove a potential bottleneck when both\n // bodies have a lot of contacts.\n // Does a contact already exist?\n let edge = bodyB.getContactList(); // ContactEdge\n while (edge) {\n if (edge.other == bodyA) {\n const fA = edge.contact.getFixtureA();\n const fB = edge.contact.getFixtureB();\n const iA = edge.contact.getChildIndexA();\n const iB = edge.contact.getChildIndexB();\n\n if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) {\n // A contact already exists.\n return;\n }\n\n if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) {\n // A contact already exists.\n return;\n }\n }\n\n edge = edge.next;\n }\n\n if (bodyB.shouldCollide(bodyA) == false) {\n return;\n }\n if (fixtureB.shouldCollide(fixtureA) == false) {\n return;\n }\n\n // Call the factory.\n const contact = Contact.create(fixtureA, indexA, fixtureB, indexB);\n if (contact == null) {\n return;\n }\n\n // Insert into the world.\n contact.m_prev = null;\n if (this.m_contactList != null) {\n contact.m_next = this.m_contactList;\n this.m_contactList.m_prev = contact;\n }\n this.m_contactList = contact;\n\n ++this.m_contactCount;\n }\n\n /**\n * @internal\n * Removes old non-overlapping contacts, applies filters and updates contacts.\n */\n updateContacts(): void {\n // Update awake contacts.\n let c;\n let next_c = this.m_contactList;\n while (c = next_c) {\n next_c = c.getNext();\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Is this contact flagged for filtering?\n if (c.m_filterFlag) {\n if (bodyB.shouldCollide(bodyA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n if (fixtureB.shouldCollide(fixtureA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n // Clear the filtering flag.\n c.m_filterFlag = false;\n }\n\n const activeA = bodyA.isAwake() && !bodyA.isStatic();\n const activeB = bodyB.isAwake() && !bodyB.isStatic();\n\n // At least one body must be awake and it must be dynamic or kinematic.\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const proxyIdA = fixtureA.m_proxies[indexA].proxyId;\n const proxyIdB = fixtureB.m_proxies[indexB].proxyId;\n const overlap = this.m_broadPhase.testOverlap(proxyIdA, proxyIdB);\n\n // Here we destroy contacts that cease to overlap in the broad-phase.\n if (overlap == false) {\n this.destroyContact(c);\n continue;\n }\n\n // The contact persists.\n c.update(this);\n }\n }\n\n /**\n * @internal\n */\n destroyContact(contact: Contact): void {\n Contact.destroy(contact, this);\n\n // Remove from the world.\n if (contact.m_prev) {\n contact.m_prev.m_next = contact.m_next;\n }\n if (contact.m_next) {\n contact.m_next.m_prev = contact.m_prev;\n }\n if (contact == this.m_contactList) {\n this.m_contactList = contact.m_next;\n }\n\n --this.m_contactCount;\n }\n\n\n /**\n * Called when two fixtures begin to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'begin-contact', listener: (contact: Contact) => void): World;\n /**\n * Called when two fixtures cease to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'end-contact', listener: (contact: Contact) => void): World;\n /**\n * This is called after a contact is updated. This allows you to inspect a\n * contact before it goes to the solver. If you are careful, you can modify the\n * contact manifold (e.g. disable contact). A copy of the old manifold is\n * provided so that you can detect changes. Note: this is called only for awake\n * bodies. Note: this is called even when the number of contact points is zero.\n * Note: this is not called for sensors. Note: if you set the number of contact\n * points to zero, you will not get an endContact callback. However, you may get\n * a beginContact callback the next step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n /**\n * This lets you inspect a contact after the solver is finished. This is useful\n * for inspecting impulses. Note: the contact manifold does not include time of\n * impact impulses, which can be arbitrarily large if the sub-step is small.\n * Hence the impulse is provided explicitly in a separate data structure. Note:\n * this is only called for contacts that are touching, solid, and awake.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n /** Listener is called whenever a body is removed. */\n on(name: 'remove-body', listener: (body: Body) => void): World;\n /** Listener is called whenever a joint is removed implicitly or explicitly. */\n on(name: 'remove-joint', listener: (joint: Joint) => void): World;\n /** Listener is called whenever a fixture is removed implicitly or explicitly. */\n on(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Register an event listener.\n */\n // tslint:disable-next-line:typedef\n on(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n if (!this._listeners) {\n this._listeners = {};\n }\n if (!this._listeners[name]) {\n this._listeners[name] = [];\n }\n this._listeners[name].push(listener);\n return this;\n }\n\n off(name: 'begin-contact', listener: (contact: Contact) => void): World;\n off(name: 'end-contact', listener: (contact: Contact) => void): World;\n off(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n off(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n off(name: 'remove-body', listener: (body: Body) => void): World;\n off(name: 'remove-joint', listener: (joint: Joint) => void): World;\n off(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Remove an event listener.\n */\n // tslint:disable-next-line:typedef\n off(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return this;\n }\n const index = listeners.indexOf(listener);\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n publish(name: string, arg1?: any, arg2?: any, arg3?: any): number {\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return 0;\n }\n for (let l = 0; l < listeners.length; l++) {\n listeners[l].call(this, arg1, arg2, arg3);\n }\n return listeners.length;\n }\n\n /**\n * @internal\n */\n beginContact(contact: Contact): void {\n this.publish('begin-contact', contact);\n }\n\n /**\n * @internal\n */\n endContact(contact: Contact): void {\n this.publish('end-contact', contact);\n }\n\n /**\n * @internal\n */\n preSolve(contact: Contact, oldManifold: Manifold): void {\n this.publish('pre-solve', contact, oldManifold);\n }\n\n /**\n * @internal\n */\n postSolve(contact: Contact, impulse: ContactImpulse): void {\n this.publish('post-solve', contact, impulse);\n }\n\n /**\n * Joints and fixtures are destroyed when their associated body is destroyed.\n * Register a destruction listener so that you may nullify references to these\n * joints and shapes.\n *\n * `function(object)` is called when any joint or fixture is about to\n * be destroyed due to the destruction of one of its attached or parent bodies.\n */\n\n /**\n * Register a contact filter to provide specific control over collision.\n * Otherwise the default filter is used (defaultFilter). The listener is owned\n * by you and must remain in scope.\n *\n * Moved to Fixture.\n */\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Math from './Math';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport default class Vec3 {\n x: number;\n y: number;\n z: number;\n\n constructor(x: number, y: number, z: number);\n constructor(obj: { x: number, y: number, z: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?, z?) {\n if (!(this instanceof Vec3)) {\n return new Vec3(x, y, z);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n this.z = x.z;\n } else {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n _ASSERT && Vec3.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y,\n z: this.z\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = data.x;\n obj.y = data.y;\n obj.z = data.z;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number, z: number): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = x;\n obj.y = y;\n obj.z = z;\n return obj;\n }\n\n static zero(): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = 0;\n obj.y = 0;\n obj.z = 0;\n return obj;\n }\n\n static clone(v: Vec3): Vec3 {\n _ASSERT && Vec3.assert(v);\n return Vec3.neo(v.x, v.y, v.z);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y) && Math.isFinite(obj.z);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Vec3.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Vec3!');\n }\n }\n\n setZero(): Vec3 {\n this.x = 0.0;\n this.y = 0.0;\n this.z = 0.0;\n return this;\n }\n\n set(x: number, y: number, z: number): Vec3 {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n\n add(w: Vec3): Vec3 {\n this.x += w.x;\n this.y += w.y;\n this.z += w.z;\n return this;\n }\n\n sub(w: Vec3): Vec3 {\n this.x -= w.x;\n this.y -= w.y;\n this.z -= w.z;\n return this;\n }\n\n mul(m: number): Vec3 {\n this.x *= m;\n this.y *= m;\n this.z *= m;\n return this;\n }\n\n static areEqual(v: Vec3, w: Vec3): boolean {\n _ASSERT && Vec3.assert(v);\n _ASSERT && Vec3.assert(w);\n return v === w ||\n typeof v === 'object' && v !== null &&\n typeof w === 'object' && w !== null &&\n v.x === w.x && v.y === w.y && v.z === w.z;\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec3, w: Vec3): number {\n return v.x * w.x + v.y * w.y + v.z * w.z;\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static cross(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(\n v.y * w.z - v.z * w.y,\n v.z * w.x - v.x * w.z,\n v.x * w.y - v.y * w.x\n );\n }\n\n static add(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x + w.x, v.y + w.y, v.z + w.z);\n }\n\n static sub(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x - w.x, v.y - w.y, v.z - w.z);\n }\n\n static mul(v: Vec3, m: number): Vec3 {\n return new Vec3(m * v.x, m * v.y, m * v.z);\n }\n\n neg(): Vec3 {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n }\n\n static neg(v: Vec3): Vec3 {\n return new Vec3(-v.x, -v.y, -v.z);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Settings from '../../Settings';\nimport Shape from '../Shape';\nimport Transform from '../../common/Transform';\nimport Rot from '../../common/Rot';\nimport Vec2 from '../../common/Vec2';\nimport AABB, { RayCastInput, RayCastOutput } from '../AABB';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n/**\n * A line segment (edge) shape. These can be connected in chains or loops to\n * other edge shapes. The connectivity information is used to ensure correct\n * contact normals.\n */\nexport default class EdgeShape extends Shape {\n static TYPE = 'edge' as const;\n\n // These are the edge vertices\n m_vertex1: Vec2;\n m_vertex2: Vec2;\n\n // Optional adjacent vertices. These are used for smooth collision.\n // Used by chain shape.\n m_vertex0: Vec2;\n m_vertex3: Vec2;\n m_hasVertex0: boolean;\n m_hasVertex3: boolean;\n\n constructor(v1?: Vec2, v2?: Vec2) {\n // @ts-ignore\n if (!(this instanceof EdgeShape)) {\n return new EdgeShape(v1, v2);\n }\n\n super();\n\n this.m_type = EdgeShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n\n\n this.m_vertex1 = v1 ? Vec2.clone(v1) : Vec2.zero();\n this.m_vertex2 = v2 ? Vec2.clone(v2) : Vec2.zero();\n\n this.m_vertex0 = Vec2.zero();\n this.m_vertex3 = Vec2.zero();\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertex1: this.m_vertex1,\n vertex2: this.m_vertex2,\n\n vertex0: this.m_vertex0,\n vertex3: this.m_vertex3,\n hasVertex0: this.m_hasVertex0,\n hasVertex3: this.m_hasVertex3,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): EdgeShape {\n const shape = new EdgeShape(data.vertex1, data.vertex2);\n if (shape.m_hasVertex0) {\n shape.setPrevVertex(data.vertex0);\n }\n if (shape.m_hasVertex3) {\n shape.setNextVertex(data.vertex3);\n }\n return shape;\n }\n\n /** @internal @deprecated */\n setNext(v?: Vec2): EdgeShape {\n return this.setNextVertex(v);\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n setNextVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex3.setVec2(v);\n this.m_hasVertex3 = true;\n } else {\n this.m_vertex3.setZero();\n this.m_hasVertex3 = false;\n }\n return this;\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n getNextVertex(): Vec2 {\n return this.m_vertex3;\n }\n\n /** @internal @deprecated */\n setPrev(v?: Vec2): EdgeShape {\n return this.setPrevVertex(v);\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n setPrevVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex0.setVec2(v);\n this.m_hasVertex0 = true;\n } else {\n this.m_vertex0.setZero();\n this.m_hasVertex0 = false;\n }\n return this;\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n getPrevVertex(): Vec2 {\n return this.m_vertex0;\n }\n\n /**\n * Set this as an isolated edge.\n */\n _set(v1: Vec2, v2: Vec2): EdgeShape {\n this.m_vertex1.setVec2(v1);\n this.m_vertex2.setVec2(v2);\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): EdgeShape {\n const clone = new EdgeShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_vertex1.setVec2(this.m_vertex1);\n clone.m_vertex2.setVec2(this.m_vertex2);\n clone.m_vertex0.setVec2(this.m_vertex0);\n clone.m_vertex3.setVec2(this.m_vertex3);\n clone.m_hasVertex0 = this.m_hasVertex0;\n clone.m_hasVertex3 = this.m_hasVertex3;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // p = p1 + t * d\n // v = v1 + s * e\n // p1 + t * d = v1 + s * e\n // s * e - t * d = p1 - v1\n\n // NOT_USED(childIndex);\n\n // Put the ray into the edge's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n const v1 = this.m_vertex1;\n const v2 = this.m_vertex2;\n const e = Vec2.sub(v2, v1);\n const normal = Vec2.neo(e.y, -e.x);\n normal.normalize();\n\n // q = p1 + t * d\n // dot(normal, q - v1) = 0\n // dot(normal, p1 - v1) + t * dot(normal, d) = 0\n const numerator = Vec2.dot(normal, Vec2.sub(v1, p1));\n const denominator = Vec2.dot(normal, d);\n\n if (denominator == 0.0) {\n return false;\n }\n\n const t = numerator / denominator;\n if (t < 0.0 || input.maxFraction < t) {\n return false;\n }\n\n const q = Vec2.add(p1, Vec2.mulNumVec2(t, d));\n\n // q = v1 + s * r\n // s = dot(q - v1, r) / dot(r, r)\n const r = Vec2.sub(v2, v1);\n const rr = Vec2.dot(r, r);\n if (rr == 0.0) {\n return false;\n }\n\n const s = Vec2.dot(Vec2.sub(q, v1), r) / rr;\n if (s < 0.0 || 1.0 < s) {\n return false;\n }\n\n output.fraction = t;\n if (numerator > 0.0) {\n output.normal = Rot.mulVec2(xf.q, normal).neg();\n } else {\n output.normal = Rot.mulVec2(xf.q, normal);\n }\n return true;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const v1 = Transform.mulVec2(xf, this.m_vertex1);\n const v2 = Transform.mulVec2(xf, this.m_vertex2);\n\n aabb.combinePoints(v1, v2);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center.setCombine(0.5, this.m_vertex1, 0.5, this.m_vertex2);\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_vertex1);\n proxy.m_vertices.push(this.m_vertex2);\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport AABB, { RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport common from '../../util/common';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Settings from '../../Settings';\nimport Shape from '../Shape';\nimport EdgeShape from './EdgeShape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A chain shape is a free form sequence of line segments. The chain has\n * two-sided collision, so you can use inside and outside collision. Therefore,\n * you may use any winding order. Connectivity information is used to create\n * smooth collisions.\n *\n * WARNING: The chain will not collide properly if there are self-intersections.\n */\nexport default class ChainShape extends Shape {\n static TYPE = 'chain' as const;\n\n m_vertices: Vec2[];\n m_count: number;\n m_prevVertex: Vec2 | null;\n m_nextVertex: Vec2 | null;\n m_hasPrevVertex: boolean;\n m_hasNextVertex: boolean;\n\n m_isLoop: boolean;\n\n constructor(vertices?: Vec2[], loop?: boolean) {\n // @ts-ignore\n if (!(this instanceof ChainShape)) {\n return new ChainShape(vertices, loop);\n }\n\n super();\n\n this.m_type = ChainShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_vertices = [];\n this.m_count = 0;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n\n this.m_isLoop = !!loop;\n\n if (vertices && vertices.length) {\n if (loop) {\n this._createLoop(vertices);\n } else {\n this._createChain(vertices);\n }\n }\n }\n\n /** @internal */\n _serialize(): object {\n const data = {\n type: this.m_type,\n vertices: this.m_vertices,\n isLoop: this.m_isLoop,\n hasPrevVertex: this.m_hasPrevVertex,\n hasNextVertex: this.m_hasNextVertex,\n prevVertex: null as Vec2 | null,\n nextVertex: null as Vec2 | null,\n };\n if (this.m_prevVertex) {\n data.prevVertex = this.m_prevVertex;\n }\n if (this.m_nextVertex) {\n data.nextVertex = this.m_nextVertex;\n }\n return data;\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): ChainShape {\n const vertices = [] as Vec2[];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n const shape = new ChainShape(vertices, data.isLoop);\n if (data.prevVertex) {\n shape.setPrevVertex(data.prevVertex);\n }\n if (data.nextVertex) {\n shape.setNextVertex(data.nextVertex);\n }\n return shape;\n }\n\n // clear() {\n // this.m_vertices.length = 0;\n // this.m_count = 0;\n // }\n\n /**\n * @internal\n * Create a loop. This automatically adjusts connectivity.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createLoop(vertices: Vec2[]): ChainShape {\n _ASSERT && common.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && common.assert(vertices.length >= 3);\n for (let i = 1; i < vertices.length; ++i) {\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n // If the code crashes here, it means your vertices are too close together.\n _ASSERT && common.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_vertices = [];\n this.m_count = vertices.length + 1;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n this.m_vertices[vertices.length] = Vec2.clone(vertices[0]);\n\n this.m_prevVertex = this.m_vertices[this.m_count - 2];\n this.m_nextVertex = this.m_vertices[1];\n this.m_hasPrevVertex = true;\n this.m_hasNextVertex = true;\n return this;\n }\n\n /**\n * @internal\n * Create a chain with isolated end vertices.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createChain(vertices: Vec2[]): ChainShape {\n _ASSERT && common.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && common.assert(vertices.length >= 2);\n for (let i = 1; i < vertices.length; ++i) {\n // If the code crashes here, it means your vertices are too close together.\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n _ASSERT && common.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_count = vertices.length;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n return this;\n }\n\n /** @internal */\n _reset(): void {\n if (this.m_isLoop) {\n this._createLoop(this.m_vertices);\n } else {\n this._createChain(this.m_vertices);\n }\n }\n\n /**\n * Establish connectivity to a vertex that precedes the first vertex. Don't call\n * this for loops.\n */\n setPrevVertex(prevVertex: Vec2): void {\n this.m_prevVertex = prevVertex;\n this.m_hasPrevVertex = true;\n }\n\n getPrevVertex(): Vec2 {\n return this.m_prevVertex;\n }\n\n /**\n * Establish connectivity to a vertex that follows the last vertex. Don't call\n * this for loops.\n */\n setNextVertex(nextVertex: Vec2): void {\n this.m_nextVertex = nextVertex;\n this.m_hasNextVertex = true;\n }\n\n getNextVertex(): Vec2 {\n return this.m_nextVertex;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): ChainShape {\n const clone = new ChainShape();\n clone._createChain(this.m_vertices);\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_prevVertex = this.m_prevVertex;\n clone.m_nextVertex = this.m_nextVertex;\n clone.m_hasPrevVertex = this.m_hasPrevVertex;\n clone.m_hasNextVertex = this.m_hasNextVertex;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): number {\n // edge count = vertex count - 1\n return this.m_count - 1;\n }\n\n // Get a child edge.\n getChildEdge(edge: EdgeShape, childIndex: number): void {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count - 1);\n edge.m_type = EdgeShape.TYPE;\n edge.m_radius = this.m_radius;\n\n edge.m_vertex1 = this.m_vertices[childIndex];\n edge.m_vertex2 = this.m_vertices[childIndex + 1];\n\n if (childIndex > 0) {\n edge.m_vertex0 = this.m_vertices[childIndex - 1];\n edge.m_hasVertex0 = true;\n } else {\n edge.m_vertex0 = this.m_prevVertex;\n edge.m_hasVertex0 = this.m_hasPrevVertex;\n }\n\n if (childIndex < this.m_count - 2) {\n edge.m_vertex3 = this.m_vertices[childIndex + 2];\n edge.m_hasVertex3 = true;\n } else {\n edge.m_vertex3 = this.m_nextVertex;\n edge.m_hasVertex3 = this.m_hasNextVertex;\n }\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && common.assert(0 <= index && index <= this.m_count);\n if (index < this.m_count) {\n return this.m_vertices[index];\n } else {\n return this.m_vertices[0];\n }\n }\n\n isLoop(): boolean {\n return this.m_isLoop;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * This always return false.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count);\n\n const edgeShape = new EdgeShape(this.getVertex(childIndex), this.getVertex(childIndex + 1));\n return edgeShape.rayCast(output, input, xf, 0);\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count);\n\n const v1 = Transform.mulVec2(xf, this.getVertex(childIndex));\n const v2 = Transform.mulVec2(xf, this.getVertex(childIndex + 1));\n\n aabb.combinePoints(v1, v2);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * Chains have zero mass.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center = Vec2.zero();\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void {\n _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count);\n proxy.m_buffer[0] = this.getVertex(childIndex);\n proxy.m_buffer[1] = this.getVertex(childIndex + 1);\n proxy.m_vertices = proxy.m_buffer;\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport AABB, { RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport common from '../../util/common';\nimport Math from '../../common/Math';\nimport Transform from '../../common/Transform';\nimport Rot from '../../common/Rot';\nimport Vec2 from '../../common/Vec2';\nimport Settings from '../../Settings';\nimport Shape from '../Shape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A convex polygon. It is assumed that the interior of the polygon is to the\n * left of each edge. Polygons have a maximum number of vertices equal to\n * Settings.maxPolygonVertices. In most cases you should not need many vertices\n * for a convex polygon. extends Shape\n */\nexport default class PolygonShape extends Shape {\n static TYPE = 'polygon' as const;\n\n m_centroid: Vec2;\n m_vertices: Vec2[]; // [Settings.maxPolygonVertices]\n m_normals: Vec2[]; // [Settings.maxPolygonVertices]\n m_count: number;\n\n // @ts-ignore\n constructor(vertices?: Vec2[]) {\n // @ts-ignore\n if (!(this instanceof PolygonShape)) {\n return new PolygonShape(vertices);\n }\n\n super();\n\n this.m_type = PolygonShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_centroid = Vec2.zero();\n this.m_vertices = [];\n this.m_normals = [];\n this.m_count = 0;\n\n if (vertices && vertices.length) {\n this._set(vertices);\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertices: this.m_vertices,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): PolygonShape {\n const vertices = [] as Vec2[];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n\n const shape = new PolygonShape(vertices);\n return shape;\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && common.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): PolygonShape {\n const clone = new PolygonShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_count = this.m_count;\n clone.m_centroid.setVec2(this.m_centroid);\n for (let i = 0; i < this.m_count; i++) {\n clone.m_vertices.push(this.m_vertices[i].clone());\n }\n for (let i = 0; i < this.m_normals.length; i++) {\n clone.m_normals.push(this.m_normals[i].clone());\n }\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /** @internal */\n _reset(): void {\n this._set(this.m_vertices);\n }\n\n /**\n * @internal\n *\n * Create a convex hull from the given array of local points. The count must be\n * in the range [3, Settings.maxPolygonVertices].\n *\n * Warning: the points may be re-ordered, even if they form a convex polygon\n * Warning: collinear points are handled but not removed. Collinear points may\n * lead to poor stacking behavior.\n */\n _set(vertices: Vec2[]): void {\n _ASSERT && common.assert(3 <= vertices.length && vertices.length <= Settings.maxPolygonVertices);\n if (vertices.length < 3) {\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n let n = Math.min(vertices.length, Settings.maxPolygonVertices);\n\n // Perform welding and copy vertices into local buffer.\n const ps = [] as Vec2[]; // [Settings.maxPolygonVertices];\n for (let i = 0; i < n; ++i) {\n const v = vertices[i];\n\n let unique = true;\n for (let j = 0; j < ps.length; ++j) {\n if (Vec2.distanceSquared(v, ps[j]) < 0.25 * Settings.linearSlopSquared) {\n unique = false;\n break;\n }\n }\n\n if (unique) {\n ps.push(v);\n }\n }\n\n n = ps.length;\n if (n < 3) {\n // Polygon is degenerate.\n _ASSERT && common.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n // Create the convex hull using the Gift wrapping algorithm\n // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm\n\n // Find the right most point on the hull (in case of multiple points bottom most is used)\n let i0 = 0;\n let x0 = ps[0].x;\n for (let i = 1; i < n; ++i) {\n const x = ps[i].x;\n if (x > x0 || (x === x0 && ps[i].y < ps[i0].y)) {\n i0 = i;\n x0 = x;\n }\n }\n\n const hull = [] as number[]; // [Settings.maxPolygonVertices];\n let m = 0;\n let ih = i0;\n\n while (true) {\n hull[m] = ih;\n\n let ie = 0;\n for (let j = 1; j < n; ++j) {\n if (ie === ih) {\n ie = j;\n continue;\n }\n\n const r = Vec2.sub(ps[ie], ps[hull[m]]);\n const v = Vec2.sub(ps[j], ps[hull[m]]);\n const c = Vec2.crossVec2Vec2(r, v);\n // c < 0 means counter-clockwise wrapping, c > 0 means clockwise wrapping\n if (c < 0.0) {\n ie = j;\n }\n\n // Collinearity check\n if (c === 0.0 && v.lengthSquared() > r.lengthSquared()) {\n ie = j;\n }\n }\n\n ++m;\n ih = ie;\n\n if (ie === i0) {\n break;\n }\n }\n\n if (m < 3) {\n // Polygon is degenerate.\n _ASSERT && common.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n this.m_count = m;\n\n // Copy vertices.\n this.m_vertices = [];\n for (let i = 0; i < m; ++i) {\n this.m_vertices[i] = ps[hull[i]];\n }\n\n // Compute normals. Ensure the edges have non-zero length.\n for (let i = 0; i < m; ++i) {\n const i1 = i;\n const i2 = i + 1 < m ? i + 1 : 0;\n const edge = Vec2.sub(this.m_vertices[i2], this.m_vertices[i1]);\n _ASSERT && common.assert(edge.lengthSquared() > Math.EPSILON * Math.EPSILON);\n this.m_normals[i] = Vec2.crossVec2Num(edge, 1.0);\n this.m_normals[i].normalize();\n }\n\n // Compute the polygon centroid.\n this.m_centroid = ComputeCentroid(this.m_vertices, m);\n }\n\n /** @internal */\n _setAsBox(hx: number, hy: number, center?: Vec2, angle?: number): void {\n // start with right-bottom, counter-clockwise, as in Gift wrapping algorithm in PolygonShape._set()\n this.m_vertices[0] = Vec2.neo(hx, -hy);\n this.m_vertices[1] = Vec2.neo(hx, hy);\n this.m_vertices[2] = Vec2.neo(-hx, hy);\n this.m_vertices[3] = Vec2.neo(-hx, -hy);\n\n this.m_normals[0] = Vec2.neo(1.0, 0.0);\n this.m_normals[1] = Vec2.neo(0.0, 1.0);\n this.m_normals[2] = Vec2.neo(-1.0, 0.0);\n this.m_normals[3] = Vec2.neo(0.0, -1.0);\n\n this.m_count = 4;\n\n if (Vec2.isValid(center)) {\n angle = angle || 0;\n\n this.m_centroid.setVec2(center);\n\n const xf = Transform.identity();\n xf.p.setVec2(center);\n xf.q.setAngle(angle);\n\n // Transform vertices and normals.\n for (let i = 0; i < this.m_count; ++i) {\n this.m_vertices[i] = Transform.mulVec2(xf, this.m_vertices[i]);\n this.m_normals[i] = Rot.mulVec2(xf.q, this.m_normals[i]);\n }\n }\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): boolean {\n const pLocal = Rot.mulTVec2(xf.q, Vec2.sub(p, xf.p));\n\n for (let i = 0; i < this.m_count; ++i) {\n const dot = Vec2.dot(this.m_normals[i], Vec2.sub(pLocal, this.m_vertices[i]));\n if (dot > 0.0) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n\n // Put the ray into the polygon's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n let lower = 0.0;\n let upper = input.maxFraction;\n\n let index = -1;\n\n for (let i = 0; i < this.m_count; ++i) {\n // p = p1 + a * d\n // dot(normal, p - v) = 0\n // dot(normal, p1 - v) + a * dot(normal, d) = 0\n const numerator = Vec2.dot(this.m_normals[i], Vec2.sub(this.m_vertices[i], p1));\n const denominator = Vec2.dot(this.m_normals[i], d);\n\n if (denominator == 0.0) {\n if (numerator < 0.0) {\n return false;\n }\n } else {\n // Note: we want this predicate without division:\n // lower < numerator / denominator, where denominator < 0\n // Since denominator < 0, we have to flip the inequality:\n // lower < numerator / denominator <==> denominator * lower > numerator.\n if (denominator < 0.0 && numerator < lower * denominator) {\n // Increase lower.\n // The segment enters this half-space.\n lower = numerator / denominator;\n index = i;\n } else if (denominator > 0.0 && numerator < upper * denominator) {\n // Decrease upper.\n // The segment exits this half-space.\n upper = numerator / denominator;\n }\n }\n\n // The use of epsilon here causes the assert on lower to trip\n // in some cases. Apparently the use of epsilon was to make edge\n // shapes work, but now those are handled separately.\n // if (upper < lower - Math.EPSILON)\n if (upper < lower) {\n return false;\n }\n }\n\n _ASSERT && common.assert(0.0 <= lower && lower <= input.maxFraction);\n\n if (index >= 0) {\n output.fraction = lower;\n output.normal = Rot.mulVec2(xf.q, this.m_normals[index]);\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < this.m_count; ++i) {\n const v = Transform.mulVec2(xf, this.m_vertices[i]);\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, v.y);\n maxY = Math.max(maxY, v.y);\n }\n\n aabb.lowerBound.setNum(minX, minY);\n aabb.upperBound.setNum(maxX, maxY);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n // Polygon mass, centroid, and inertia.\n // Let rho be the polygon density in mass per unit area.\n // Then:\n // mass = rho * int(dA)\n // centroid.x = (1/mass) * rho * int(x * dA)\n // centroid.y = (1/mass) * rho * int(y * dA)\n // I = rho * int((x*x + y*y) * dA)\n //\n // We can compute these integrals by summing all the integrals\n // for each triangle of the polygon. To evaluate the integral\n // for a single triangle, we make a change of variables to\n // the (u,v) coordinates of the triangle:\n // x = x0 + e1x * u + e2x * v\n // y = y0 + e1y * u + e2y * v\n // where 0 <= u && 0 <= v && u + v <= 1.\n //\n // We integrate u from [0,1-v] and then v from [0,1].\n // We also need to use the Jacobian of the transformation:\n // D = cross(e1, e2)\n //\n // Simplification: triangle centroid = (1/3) * (p1 + p2 + p3)\n //\n // The rest of the derivation is handled by computer algebra.\n\n _ASSERT && common.assert(this.m_count >= 3);\n\n const center = Vec2.zero();\n let area = 0.0;\n let I = 0.0;\n\n // s is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const s = Vec2.zero();\n\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < this.m_count; ++i) {\n s.add(this.m_vertices[i]);\n }\n s.mul(1.0 / this.m_count);\n\n const k_inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < this.m_count; ++i) {\n // Triangle vertices.\n const e1 = Vec2.sub(this.m_vertices[i], s);\n const e2 = i + 1 < this.m_count ? Vec2.sub(this.m_vertices[i + 1], s) : Vec2 .sub(this.m_vertices[0], s);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n center.addCombine(triangleArea * k_inv3, e1, triangleArea * k_inv3, e2);\n\n const ex1 = e1.x;\n const ey1 = e1.y;\n const ex2 = e2.x;\n const ey2 = e2.y;\n\n const intx2 = ex1 * ex1 + ex2 * ex1 + ex2 * ex2;\n const inty2 = ey1 * ey1 + ey2 * ey1 + ey2 * ey2;\n\n I += (0.25 * k_inv3 * D) * (intx2 + inty2);\n }\n\n // Total mass\n massData.mass = density * area;\n\n // Center of mass\n _ASSERT && common.assert(area > Math.EPSILON);\n center.mul(1.0 / area);\n massData.center.setCombine(1, center, 1, s);\n\n // Inertia tensor relative to the local origin (point s).\n massData.I = density * I;\n\n // Shift to center of mass then to original body origin.\n massData.I += massData.mass * (Vec2.dot(massData.center, massData.center) - Vec2.dot(center, center));\n }\n\n /**\n * Validate convexity. This is a very time consuming operation.\n * @returns true if valid\n */\n validate(): boolean {\n for (let i = 0; i < this.m_count; ++i) {\n const i1 = i;\n const i2 = i < this.m_count - 1 ? i1 + 1 : 0;\n const p = this.m_vertices[i1];\n const e = Vec2.sub(this.m_vertices[i2], p);\n\n for (let j = 0; j < this.m_count; ++j) {\n if (j == i1 || j == i2) {\n continue;\n }\n\n const v = Vec2.sub(this.m_vertices[j], p);\n const c = Vec2.crossVec2Vec2(e, v);\n if (c < 0.0) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices = this.m_vertices;\n proxy.m_count = this.m_count;\n proxy.m_radius = this.m_radius;\n }\n}\n\nfunction ComputeCentroid(vs: Vec2[], count: number): Vec2 {\n _ASSERT && common.assert(count >= 3);\n\n const c = Vec2.zero();\n let area = 0.0;\n\n // pRef is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const pRef = Vec2.zero();\n if (false) {\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < count; ++i) {\n pRef.add(vs[i]);\n }\n pRef.mul(1.0 / count);\n }\n\n const inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < count; ++i) {\n // Triangle vertices.\n const p1 = pRef;\n const p2 = vs[i];\n const p3 = i + 1 < count ? vs[i + 1] : vs[0];\n\n const e1 = Vec2.sub(p2, p1);\n const e2 = Vec2.sub(p3, p1);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n c.addMul(triangleArea * inv3, p1);\n c.addMul(triangleArea * inv3, p2);\n c.addMul(triangleArea * inv3, p3);\n }\n\n // Centroid\n _ASSERT && common.assert(area > Math.EPSILON);\n c.mul(1.0 / area);\n return c;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type Vec2 from '../../common/Vec2';\nimport PolygonShape from './PolygonShape';\n\n/**\n * A rectangle polygon which extend PolygonShape.\n */\nexport default class BoxShape extends PolygonShape {\n static TYPE = 'polygon' as const;\n\n constructor(hx: number, hy: number, center?: Vec2, angle?: number) {\n // @ts-ignore\n if (!(this instanceof BoxShape)) {\n return new BoxShape(hx, hy, center, angle);\n }\n\n super();\n\n this._setAsBox(hx, hy, center, angle);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Math from '../../common/Math';\nimport Rot from '../../common/Rot';\nimport Vec2 from '../../common/Vec2';\nimport Shape from '../Shape';\nimport AABB, { RayCastInput, RayCastOutput } from '../AABB';\nimport Transform from '../../common/Transform';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport default class CircleShape extends Shape {\n static TYPE = 'circle' as const;\n\n m_p: Vec2;\n\n constructor(position: Vec2, radius?: number);\n constructor(radius?: number);\n // tslint:disable-next-line:typedef\n constructor(a, b?) {\n // @ts-ignore\n if (!(this instanceof CircleShape)) {\n return new CircleShape(a, b);\n }\n\n super();\n\n this.m_type = CircleShape.TYPE;\n this.m_p = Vec2.zero();\n this.m_radius = 1;\n\n if (typeof a === 'object' && Vec2.isValid(a)) {\n this.m_p.setVec2(a);\n\n if (typeof b === 'number') {\n this.m_radius = b;\n }\n\n } else if (typeof a === 'number') {\n this.m_radius = a;\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n p: this.m_p,\n radius: this.m_radius,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): CircleShape {\n return new CircleShape(data.p, data.radius);\n }\n\n // TODO: already defined in Shape\n getRadius(): number {\n return this.m_radius;\n }\n\n getCenter(): Vec2 {\n return this.m_p;\n }\n\n getVertex(index: 0): Vec2 {\n _ASSERT && common.assert(index == 0);\n return this.m_p;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): CircleShape {\n const clone = new CircleShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_p = this.m_p.clone();\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): boolean {\n const center = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const d = Vec2.sub(p, center);\n return Vec2.dot(d, d) <= this.m_radius * this.m_radius;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // Collision Detection in Interactive 3D Environments by Gino van den Bergen\n // From Section 3.1.2\n // x = s + a * r\n // norm(x) = radius\n\n const position = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const s = Vec2.sub(input.p1, position);\n const b = Vec2.dot(s, s) - this.m_radius * this.m_radius;\n\n // Solve quadratic equation.\n const r = Vec2.sub(input.p2, input.p1);\n const c = Vec2.dot(s, r);\n const rr = Vec2.dot(r, r);\n const sigma = c * c - rr * b;\n\n // Check for negative discriminant and short segment.\n if (sigma < 0.0 || rr < Math.EPSILON) {\n return false;\n }\n\n // Find the point of intersection of the line with the circle.\n let a = -(c + Math.sqrt(sigma));\n\n // Is the intersection point on the segment?\n if (0.0 <= a && a <= input.maxFraction * rr) {\n a /= rr;\n output.fraction = a;\n output.normal = Vec2.add(s, Vec2.mulNumVec2(a, r));\n output.normal.normalize();\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const p = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n aabb.lowerBound.setNum(p.x - this.m_radius, p.y - this.m_radius);\n aabb.upperBound.setNum(p.x + this.m_radius, p.y + this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n massData.mass = density * Math.PI * this.m_radius * this.m_radius;\n massData.center = this.m_p;\n // inertia about the local origin\n massData.I = massData.mass\n * (0.5 * this.m_radius * this.m_radius + Vec2.dot(this.m_p, this.m_p));\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_p);\n proxy.m_count = 1;\n proxy.m_radius = this.m_radius;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. A value of 0 disables softness.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * Distance length.\n */\n length?: number;\n}\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointDef extends JointDef, DistanceJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0\n};\n\n/**\n * A distance joint constrains two points on two bodies to remain at a fixed\n * distance from each other. You can view this as a massless, rigid rod.\n *\n * @param anchorA Anchor A in global coordination.\n * @param anchorB Anchor B in global coordination.\n */\nexport default class DistanceJoint extends Joint {\n static TYPE = 'distance-joint' as const;\n\n // Solver shared\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_length: number;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_gamma: number;\n /** @internal */ m_bias: number;\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: DistanceJointDef);\n constructor(def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2);\n constructor(def: DistanceJointDef, bodyA?: Body, bodyB?: Body, anchorA?: Vec2, anchorB?: Vec2) {\n // @ts-ignore\n if (!(this instanceof DistanceJoint)) {\n return new DistanceJoint(def, bodyA, bodyB, anchorA, anchorB);\n }\n\n // order of constructor arguments is changed in v0.2\n if (bodyB && anchorA && ('m_type' in anchorA) && ('x' in bodyB) && ('y' in bodyB)) {\n const temp = bodyB;\n bodyB = anchorA;\n anchorA = temp;\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = DistanceJoint.TYPE;\n\n // Solver shared\n this.m_localAnchorA = Vec2.clone(anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.zero());\n this.m_length = Math.isFinite(def.length) ? def.length :\n Vec2.distance(bodyA.getWorldPoint(this.m_localAnchorA), bodyB.getWorldPoint(this.m_localAnchorB));\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n this.m_impulse = 0.0;\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n\n // 1-D constrained system\n // m (v2 - v1) = lambda\n // v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass.\n // x2 = x1 + h * v2\n\n // 1-D mass-damper-spring system\n // m (v2 - v1) + h * d * v2 + h * k *\n\n // C = norm(p2 - p1) - L\n // u = (p2 - p1) / norm(p2 - p1)\n // Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1))\n // J = [-u -cross(r1, u) u cross(r2, u)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n length: this.m_length,\n\n impulse: this.m_impulse,\n gamma: this.m_gamma,\n bias: this.m_bias,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): DistanceJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new DistanceJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n length?: number,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.length > 0) {\n this.m_length = +def.length;\n } else if (def.length < 0) { // don't change length\n } else if (def.anchorA || def.anchorA || def.anchorA || def.anchorA) {\n this.m_length = Vec2.distance(\n this.m_bodyA.getWorldPoint(this.m_localAnchorA),\n this.m_bodyB.getWorldPoint(this.m_localAnchorB)\n );\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the natural length. Manipulating the length can lead to non-physical\n * behavior when the frequency is zero.\n */\n setLength(length: number): void {\n this.m_length = length;\n }\n\n /**\n * Get the natural length.\n */\n getLength(): number {\n return this.m_length;\n }\n\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n this.m_u = Vec2.sub(Vec2.add(cB, this.m_rB), Vec2.add(cA, this.m_rA));\n\n // Handle singularity.\n const length = this.m_u.length();\n if (length > Settings.linearSlop) {\n this.m_u.mul(1.0 / length);\n } else {\n this.m_u.setNum(0.0, 0.0);\n }\n\n const crAu = Vec2.crossVec2Vec2(this.m_rA, this.m_u);\n const crBu = Vec2.crossVec2Vec2(this.m_rB, this.m_u);\n let invMass = this.m_invMassA + this.m_invIA * crAu * crAu + this.m_invMassB\n + this.m_invIB * crBu * crBu;\n\n // Compute the effective mass matrix.\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (this.m_frequencyHz > 0.0) {\n const C = length - this.m_length;\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * this.m_mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = this.m_mass * omega * omega;\n\n // magic formulas\n const h = step.dt;\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invMass += this.m_gamma;\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n } else {\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n const Cdot = Vec2.dot(this.m_u, vpB) - Vec2.dot(this.m_u, vpA);\n\n const impulse = -this.m_mass\n * (Cdot + this.m_bias + this.m_gamma * this.m_impulse);\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u);\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n if (this.m_frequencyHz > 0.0) {\n // There is no position correction for soft distance constraints.\n return true;\n }\n\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA));\n\n const length = u.normalize();\n let C = length - this.m_length;\n C = Math\n .clamp(C, -Settings.maxLinearCorrection, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C;\n const P = Vec2.mulNumVec2(impulse, u);\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Mat22 from '../../common/Mat22';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointOpt extends JointOpt {\n /**\n * The maximum friction force in N.\n */\n maxForce?: number;\n /**\n * The maximum friction torque in N-m.\n */\n maxTorque?: number;\n}\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointDef extends JointDef, FrictionJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n maxTorque : 0.0,\n};\n\n/**\n * Friction joint. This is used for top-down friction. It provides 2D\n * translational friction and angular friction.\n *\n * @param anchor Anchor in global coordination.\n */\nexport default class FrictionJoint extends Joint {\n static TYPE = 'friction-joint' as const;\n\n /** @internal */ m_type: 'friction-joint';\n\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n // Solver shared\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: FrictionJointDef);\n constructor(def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: FrictionJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (!(this instanceof FrictionJoint)) {\n return new FrictionJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = FrictionJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n\n // Solver shared\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): FrictionJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new FrictionJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && common.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && common.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y\n * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x\n * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt; // float\n\n // Solve angular friction\n {\n const Cdot = wB - wA; // float\n let impulse = -this.m_angularMass * Cdot; // float\n\n const oldImpulse = this.m_angularImpulse; // float\n const maxImpulse = h * this.m_maxTorque; // float\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)), Vec2.add(vA,\n Vec2.crossNumVec2(wA, this.m_rA))); // Vec2\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); // Vec2\n const oldImpulse = this.m_linearImpulse; // Vec2\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce; // float\n\n if (this.m_linearImpulse.lengthSquared() > maxImpulse * maxImpulse) {\n this.m_linearImpulse.normalize();\n this.m_linearImpulse.mul(maxImpulse);\n }\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../util/common';\nimport Vec2 from './Vec2';\nimport Vec3 from './Vec3';\n\n\nconst _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG;\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 3-by-3 matrix. Stored in column-major order.\n */\nexport default class Mat33 {\n ex: Vec3;\n ey: Vec3;\n ez: Vec3;\n\n constructor(a: Vec3, b: Vec3, c: Vec3);\n constructor();\n constructor(a?: Vec3, b?: Vec3, c?: Vec3) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec3.clone(a);\n this.ey = Vec3.clone(b);\n this.ez = Vec3.clone(c);\n } else {\n this.ex = Vec3.zero();\n this.ey = Vec3.zero();\n this.ez = Vec3.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec3.isValid(obj.ex) && Vec3.isValid(obj.ey) && Vec3.isValid(obj.ez);\n }\n\n static assert(o: any): void {\n if (!_ASSERT) return;\n if (!Mat33.isValid(o)) {\n _DEBUG && common.debug(o);\n throw new Error('Invalid Mat33!');\n }\n }\n\n /**\n * Set this matrix to all zeros.\n */\n setZero(): Mat33 {\n this.ex.setZero();\n this.ey.setZero();\n this.ez.setZero();\n return this;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve33(v: Vec3): Vec3 {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = new Vec3();\n r.x = det * Vec3.dot(v, Vec3.cross(this.ey, this.ez));\n r.y = det * Vec3.dot(this.ex, Vec3.cross(v, this.ez));\n r.z = det * Vec3.dot(this.ex, Vec3.cross(this.ey, v));\n return r;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix\n * equation.\n */\n solve22(v: Vec2): Vec2 {\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a21 = this.ex.y;\n const a22 = this.ey.y;\n let det = a11 * a22 - a12 * a21;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = Vec2.zero();\n r.x = det * (a22 * v.x - a12 * v.y);\n r.y = det * (a11 * v.y - a21 * v.x);\n return r;\n }\n\n /**\n * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if\n * singular.\n */\n getInverse22(M: Mat33): void {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n M.ex.x = det * d;\n M.ey.x = -det * b;\n M.ex.z = 0.0;\n M.ex.y = -det * c;\n M.ey.y = det * a;\n M.ey.z = 0.0;\n M.ez.x = 0.0;\n M.ez.y = 0.0;\n M.ez.z = 0.0;\n }\n\n /**\n * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix\n * if singular.\n */\n getSymInverse33(M: Mat33): void {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a13 = this.ez.x;\n const a22 = this.ey.y;\n const a23 = this.ez.y;\n const a33 = this.ez.z;\n\n M.ex.x = det * (a22 * a33 - a23 * a23);\n M.ex.y = det * (a13 * a23 - a12 * a33);\n M.ex.z = det * (a12 * a23 - a13 * a22);\n\n M.ey.x = M.ex.y;\n M.ey.y = det * (a11 * a33 - a13 * a13);\n M.ey.z = det * (a13 * a12 - a11 * a23);\n\n M.ez.x = M.ex.z;\n M.ez.y = M.ey.z;\n M.ez.z = det * (a11 * a22 - a12 * a12);\n }\n\n /**\n * Multiply a matrix times a vector.\n */\n static mul(a: Mat33, b: Vec2): Vec2;\n static mul(a: Mat33, b: Vec3): Vec3;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n _ASSERT && Mat33.assert(a);\n if (b && 'z' in b && 'y' in b && 'x' in b) {\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n\n } else if (b && 'y' in b && 'x' in b) {\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n _ASSERT && common.assert(false);\n }\n\n static mulVec3(a: Mat33, b: Vec3): Vec3 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n }\n\n static mulVec2(a: Mat33, b: Vec2): Vec2 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n static add(a: Mat33, b: Mat33): Mat33 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Mat33.assert(b);\n return new Mat33(\n Vec3.add(a.ex, b.ex),\n Vec3.add(a.ey, b.ey),\n Vec3.add(a.ez, b.ez)\n );\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Vec3 from '../../common/Vec3';\nimport Mat22 from '../../common/Mat22';\nimport Mat33 from '../../common/Mat33';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointOpt extends JointOpt {\n /**\n * The lower angle for the joint limit (radians).\n */\n lowerAngle?: number;\n /**\n * The upper angle for the joint limit (radians).\n */\n upperAngle?: number;\n /**\n * The maximum motor torque used to achieve the desired motor speed. Usually\n * in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed. Usually in radians per second.\n */\n motorSpeed?: number;\n /**\n * A flag to enable joint limits.\n */\n enableLimit?: boolean;\n /**\n * A flag to enable the joint motor.\n */\n enableMotor?: boolean;\n}\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointDef extends JointDef, RevoluteJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n lowerAngle : 0.0,\n upperAngle : 0.0,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n enableLimit : false,\n enableMotor : false\n};\n\n/**\n * A revolute joint constrains two bodies to share a common point while they are\n * free to rotate about the point. The relative rotation about the shared point\n * is the joint angle. You can limit the relative rotation with a joint limit\n * that specifies a lower and upper angle. You can use a motor to drive the\n * relative rotation about the shared point. A maximum motor torque is provided\n * so that infinite forces are not generated.\n */\nexport default class RevoluteJoint extends Joint {\n static TYPE = 'revolute-joint' as const;\n\n /** @internal */ m_type: 'revolute-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerAngle: number;\n /** @internal */ m_upperAngle: number;\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n // effective mass for point-to-point constraint.\n /** @internal */ m_mass: Mat33 = new Mat33();\n // effective mass for motor/limit angular constraint.\n /** @internal */ m_motorMass: number;\n /** @internal */ m_limitState: number = inactiveLimit; // TODO enum\n\n constructor(def: RevoluteJointDef);\n constructor(def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n // @ts-ignore\n constructor(def: RevoluteJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (!(this instanceof RevoluteJoint)) {\n return new RevoluteJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RevoluteJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorImpulse = 0.0;\n\n this.m_lowerAngle = def.lowerAngle;\n this.m_upperAngle = def.upperAngle;\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Motor constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerAngle: this.m_lowerAngle,\n upperAngle: this.m_upperAngle,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any):RevoluteJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RevoluteJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle in radians.\n */\n getJointAngle(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle speed in radians per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_angularVelocity - bA.m_angularVelocity;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Get the current motor torque given the inverse time step. Unit is N*m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set the motor speed in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set the maximum motor torque, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit in radians.\n */\n getLowerLimit(): number {\n return this.m_lowerAngle;\n }\n\n /**\n * Get the upper joint limit in radians.\n */\n getUpperLimit(): number {\n return this.m_upperAngle;\n }\n\n /**\n * Set the joint limits in radians.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && common.assert(lower <= upper);\n\n if (lower != this.m_lowerAngle || upper != this.m_upperAngle) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_impulse.z = 0.0;\n this.m_lowerAngle = lower;\n this.m_upperAngle = upper;\n }\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force given the inverse time step. Unit is N.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque due to the joint limit given the inverse time step.\n * Unit is N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n this.m_mass.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y\n * this.m_rB.y * iB;\n this.m_mass.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y\n * this.m_rB.x * iB;\n this.m_mass.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n this.m_mass.ex.y = this.m_mass.ey.x;\n this.m_mass.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x\n * this.m_rB.x * iB;\n this.m_mass.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n this.m_mass.ex.z = this.m_mass.ez.x;\n this.m_mass.ey.z = this.m_mass.ez.y;\n this.m_mass.ez.z = iA + iB;\n\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n\n if (this.m_enableMotor == false || fixedRotation) {\n this.m_motorImpulse = 0.0;\n }\n\n if (this.m_enableLimit && fixedRotation == false) {\n const jointAngle = aB - aA - this.m_referenceAngle; // float\n\n if (Math.abs(this.m_upperAngle - this.m_lowerAngle) < 2.0 * Settings.angularSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointAngle <= this.m_lowerAngle) {\n if (this.m_limitState != atLowerLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atLowerLimit;\n\n } else if (jointAngle >= this.m_upperAngle) {\n if (this.m_limitState != atUpperLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atUpperLimit;\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_motorImpulse + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_motorImpulse + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n // Solve motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits\n && fixedRotation == false) {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const impulse = Vec3.neg(this.m_mass.solve33(Cdot)); // Vec3\n\n if (this.m_limitState == equalLimits) {\n this.m_impulse.add(impulse);\n\n } else if (this.m_limitState == atLowerLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse < 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n\n } else if (this.m_limitState == atUpperLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse > 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n\n } else {\n // Solve point-to-point constraint\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const impulse = this.m_mass.solve22(Vec2.neg(Cdot)); // Vec2\n\n this.m_impulse.x += impulse.x;\n this.m_impulse.y += impulse.y;\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n let angularError = 0.0; // float\n let positionError = 0.0; // float\n\n const fixedRotation = (this.m_invIA + this.m_invIB == 0.0); // bool\n\n // Solve angular limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const angle = aB - aA - this.m_referenceAngle; // float\n let limitImpulse = 0.0; // float\n\n if (this.m_limitState == equalLimits) {\n // Prevent large angular corrections\n const C = Math.clamp(angle - this.m_lowerAngle,\n -Settings.maxAngularCorrection, Settings.maxAngularCorrection); // float\n limitImpulse = -this.m_motorMass * C;\n angularError = Math.abs(C);\n\n } else if (this.m_limitState == atLowerLimit) {\n let C = angle - this.m_lowerAngle; // float\n angularError = -C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C + Settings.angularSlop, -Settings.maxAngularCorrection,\n 0.0);\n limitImpulse = -this.m_motorMass * C;\n\n } else if (this.m_limitState == atUpperLimit) {\n let C = angle - this.m_upperAngle; // float\n angularError = C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C - Settings.angularSlop, 0.0,\n Settings.maxAngularCorrection);\n limitImpulse = -this.m_motorMass * C;\n }\n\n aA -= this.m_invIA * limitImpulse;\n aB += this.m_invIB * limitImpulse;\n }\n\n // Solve point-to-point constraint.\n {\n qA.setAngle(aA);\n qB.setAngle(aB);\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n\n const C = Vec2.zero();\n C.addCombine(1, cB, 1, rB);\n C.subCombine(1, cA, 1, rA);\n positionError = C.length();\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y;\n K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x;\n\n const impulse = Vec2.neg(K.solve(C)); // Vec2\n\n cA.subMul(mA, impulse);\n aA -= iA * Vec2.crossVec2Vec2(rA, impulse);\n\n cB.addMul(mB, impulse);\n aB += iB * Vec2.crossVec2Vec2(rB, impulse);\n }\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Vec3 from '../../common/Vec3';\nimport Mat22 from '../../common/Mat22';\nimport Mat33 from '../../common/Mat33';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointOpt extends JointOpt {\n /**\n * Enable/disable the joint limit.\n */\n enableLimit?: boolean;\n /**\n * The lower translation limit, usually in meters.\n */\n lowerTranslation?: number;\n /**\n * The upper translation limit, usually in meters.\n */\n upperTranslation?: number;\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorForce?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n}\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointDef extends JointDef, PrismaticJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation unit axis in bodyA.\n */\n localAxisA: Vec2;\n /**\n * referenceAngle The constrained angle between the bodies:\n * bodyB_angle - bodyA_angle.\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n enableLimit : false,\n lowerTranslation : 0.0,\n upperTranslation : 0.0,\n enableMotor : false,\n maxMotorForce : 0.0,\n motorSpeed : 0.0\n};\n\n/**\n * A prismatic joint. This joint provides one degree of freedom: translation\n * along an axis fixed in bodyA. Relative rotation is prevented. You can use a\n * joint limit to restrict the range of motion and a joint motor to drive the\n * motion or to model joint friction.\n */\nexport default class PrismaticJoint extends Joint {\n static TYPE = 'prismatic-joint' as const;\n\n /** @internal */ m_type: 'prismatic-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerTranslation: number;\n /** @internal */ m_upperTranslation: number;\n /** @internal */ m_maxMotorForce: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n /** @internal */ m_limitState: number; // TODO enum\n /** @internal */ m_axis: Vec2;\n /** @internal */ m_perp: Vec2;\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_s1: number;\n /** @internal */ m_s2: number;\n /** @internal */ m_a1: number;\n /** @internal */ m_a2: number;\n /** @internal */ m_K: Mat33;\n\n constructor(def: PrismaticJointDef);\n constructor(def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n constructor(def: PrismaticJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (!(this instanceof PrismaticJoint)) {\n return new PrismaticJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PrismaticJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || Vec2.neo(1.0, 0.0));\n this.m_localXAxisA.normalize();\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n\n this.m_lowerTranslation = def.lowerTranslation;\n this.m_upperTranslation = def.upperTranslation;\n this.m_maxMotorForce = def.maxMotorForce;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n this.m_limitState = inactiveLimit;\n\n this.m_axis = Vec2.zero();\n this.m_perp = Vec2.zero();\n\n this.m_K = new Mat33();\n\n // Linear constraint (point-to-line)\n // d = p2 - p1 = x2 + r2 - x1 - r1\n // C = dot(perp, d)\n // Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 -\n // cross(w1, r1))\n // = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) +\n // dot(cross(r2, perp), v2)\n // J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)]\n //\n // Angular constraint\n // C = a2 - a1 + a_initial\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n //\n // K = J * invM * JT\n //\n // J = [-a -s1 a s2]\n // [0 -1 0 1]\n // a = perp\n // s1 = cross(d + r1, a) = cross(p2 - x1, a)\n // s2 = cross(r2, a) = cross(p2 - x2, a)\n\n // Motor/Limit linear constraint\n // C = dot(ax1, d)\n // Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) +\n // dot(cross(r2, ax1), v2)\n // J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)]\n\n // Block Solver\n // We develop a block solver that includes the joint limit. This makes the\n // limit stiff (inelastic) even\n // when the mass has poor distribution (leading to large torques about the\n // joint anchor points).\n //\n // The Jacobian has 3 rows:\n // J = [-uT -s1 uT s2] // linear\n // [0 -1 0 1] // angular\n // [-vT -a1 vT a2] // limit\n //\n // u = perp\n // v = axis\n // s1 = cross(d + r1, u), s2 = cross(r2, u)\n // a1 = cross(d + r1, v), a2 = cross(r2, v)\n\n // M * (v2 - v1) = JT * df\n // J * v2 = bias\n //\n // v2 = v1 + invM * JT * df\n // J * (v1 + invM * JT * df) = bias\n // K * df = bias - J * v1 = -Cdot\n // K = J * invM * JT\n // Cdot = J * v1 - bias\n //\n // Now solve for f2.\n // df = f2 - f1\n // K * (f2 - f1) = -Cdot\n // f2 = invK * (-Cdot) + f1\n //\n // Clamp accumulated limit impulse.\n // lower: f2(3) = max(f2(3), 0)\n // upper: f2(3) = min(f2(3), 0)\n //\n // Solve for correct f2(1:2)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1\n // = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) +\n // K(1:2,1:2) * f1(1:2)\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n //\n // Now compute impulse to be applied:\n // df = f2 - f1\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerTranslation: this.m_lowerTranslation,\n upperTranslation: this.m_upperTranslation,\n maxMotorForce: this.m_maxMotorForce,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PrismaticJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.localAxisA = Vec2.clone(data.localAxisA);\n const joint = new PrismaticJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const pA = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const pB = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const d = Vec2.sub(pB, pA);\n const axis = this.m_bodyA.getWorldVector(this.m_localXAxisA);\n\n const translation = Vec2.dot(d, axis);\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const rA = Rot.mulVec2(bA.m_xf.q, Vec2.sub(this.m_localAnchorA, bA.m_sweep.localCenter)); // Vec2\n const rB = Rot.mulVec2(bB.m_xf.q, Vec2.sub(this.m_localAnchorB, bB.m_sweep.localCenter)); // Vec2\n const p1 = Vec2.add(bA.m_sweep.c, rA); // Vec2\n const p2 = Vec2.add(bB.m_sweep.c, rB); // Vec2\n const d = Vec2.sub(p2, p1); // Vec2\n const axis = Rot.mulVec2(bA.m_xf.q, this.m_localXAxisA); // Vec2\n\n const vA = bA.m_linearVelocity; // Vec2\n const vB = bB.m_linearVelocity; // Vec2\n const wA = bA.m_angularVelocity; // float\n const wB = bB.m_angularVelocity; // float\n\n const speed = Vec2.dot(d, Vec2.crossNumVec2(wA, axis))\n + Vec2.dot(axis, Vec2.sub(Vec2.addCrossNumVec2(vB, wB, rB), Vec2.addCrossNumVec2(vA, wA, rA))); // float\n return speed;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit, usually in meters.\n */\n getLowerLimit(): number {\n return this.m_lowerTranslation;\n }\n\n /**\n * Get the upper joint limit, usually in meters.\n */\n getUpperLimit(): number {\n return this.m_upperTranslation;\n }\n\n /**\n * Set the joint limits, usually in meters.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && common.assert(lower <= upper);\n if (lower != this.m_lowerTranslation || upper != this.m_upperTranslation) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_lowerTranslation = lower;\n this.m_upperTranslation = upper;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in meters per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Set the maximum motor force, usually in N.\n */\n setMaxMotorForce(force: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorForce = force;\n }\n\n getMaxMotorForce(): number {\n return this.m_maxMotorForce;\n }\n\n /**\n * Get the motor speed, usually in meters per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Get the current motor force given the inverse time step, usually in N.\n */\n getMotorForce(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + this.m_impulse.z, this.m_axis).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.y;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute motor Jacobian and effective mass.\n {\n this.m_axis = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_axis);\n this.m_a2 = Vec2.crossVec2Vec2(rB, this.m_axis);\n\n this.m_motorMass = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2\n * this.m_a2;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n }\n\n // Prismatic constraint.\n {\n this.m_perp = Rot.mulVec2(qA, this.m_localYAxisA);\n\n this.m_s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_perp);\n this.m_s2 = Vec2.crossVec2Vec2(rB, this.m_perp);\n\n const s1test = Vec2.crossVec2Vec2(rA, this.m_perp);\n\n const k11 = mA + mB + iA * this.m_s1 * this.m_s1 + iB * this.m_s2 * this.m_s2;\n const k12 = iA * this.m_s1 + iB * this.m_s2;\n const k13 = iA * this.m_s1 * this.m_a1 + iB * this.m_s2 * this.m_a2;\n let k22 = iA + iB;\n if (k22 == 0.0) {\n // For bodies with fixed rotation.\n k22 = 1.0;\n }\n const k23 = iA * this.m_a1 + iB * this.m_a2;\n const k33 = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 * this.m_a2;\n\n this.m_K.ex.set(k11, k12, k13);\n this.m_K.ey.set(k12, k22, k23);\n this.m_K.ez.set(k13, k23, k33);\n }\n\n // Compute motor and limit terms.\n if (this.m_enableLimit) {\n\n const jointTranslation = Vec2.dot(this.m_axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * Settings.linearSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointTranslation <= this.m_lowerTranslation) {\n if (this.m_limitState != atLowerLimit) {\n this.m_limitState = atLowerLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else if (jointTranslation >= this.m_upperTranslation) {\n if (this.m_limitState != atUpperLimit) {\n this.m_limitState = atUpperLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n if (this.m_enableMotor == false) {\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse\n + this.m_impulse.z, this.m_axis);\n const LA = this.m_impulse.x * this.m_s1 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1;\n const LB = this.m_impulse.x * this.m_s2 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Solve linear motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits) {\n const Cdot = Vec2.dot(this.m_axis, Vec2.sub(vB, vA)) + this.m_a2 * wB\n - this.m_a1 * wA;\n let impulse = this.m_motorMass * (this.m_motorSpeed - Cdot);\n const oldImpulse = this.m_motorImpulse;\n const maxImpulse = step.dt * this.m_maxMotorForce;\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_axis);\n const LA = impulse * this.m_a1;\n const LB = impulse * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n const Cdot1 = Vec2.zero();\n Cdot1.x += Vec2.dot(this.m_perp, vB) + this.m_s2 * wB;\n Cdot1.x -= Vec2.dot(this.m_perp, vA) + this.m_s1 * wA;\n Cdot1.y = wB - wA;\n\n if (this.m_enableLimit && this.m_limitState != inactiveLimit) {\n // Solve prismatic and limit constraint in block form.\n let Cdot2 = 0;\n Cdot2 += Vec2.dot(this.m_axis, vB) + this.m_a2 * wB;\n Cdot2 -= Vec2.dot(this.m_axis, vA) + this.m_a1 * wA;\n\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const f1 = Vec3.clone(this.m_impulse);\n let df = this.m_K.solve33(Vec3.neg(Cdot)); // Vec3\n this.m_impulse.add(df);\n\n if (this.m_limitState == atLowerLimit) {\n this.m_impulse.z = Math.max(this.m_impulse.z, 0.0);\n } else if (this.m_limitState == atUpperLimit) {\n this.m_impulse.z = Math.min(this.m_impulse.z, 0.0);\n }\n\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n const b = Vec2.combine(-1, Cdot1, -(this.m_impulse.z - f1.z), Vec2.neo(this.m_K.ez.x, this.m_K.ez.y)); // Vec2\n const f2r = Vec2.add(this.m_K.solve22(b), Vec2.neo(f1.x, f1.y)); // Vec2\n this.m_impulse.x = f2r.x;\n this.m_impulse.y = f2r.y;\n\n df = Vec3.sub(this.m_impulse, f1);\n\n const P = Vec2.combine(df.x, this.m_perp, df.z, this.m_axis); // Vec2\n const LA = df.x * this.m_s1 + df.y + df.z * this.m_a1; // float\n const LB = df.x * this.m_s2 + df.y + df.z * this.m_a2; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n // Limit is inactive, just solve the prismatic constraint in block form.\n const df = this.m_K.solve22(Vec2.neg(Cdot1)); // Vec2\n this.m_impulse.x += df.x;\n this.m_impulse.y += df.y;\n\n const P = Vec2.mulNumVec2(df.x, this.m_perp); // Vec2\n const LA = df.x * this.m_s1 + df.y; // float\n const LB = df.x * this.m_s2 + df.y; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute fresh Jacobians\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n const d = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); // Vec2\n\n const axis = Rot.mulVec2(qA, this.m_localXAxisA); // Vec2\n const a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), axis); // float\n const a2 = Vec2.crossVec2Vec2(rB, axis); // float\n const perp = Rot.mulVec2(qA, this.m_localYAxisA); // Vec2\n\n const s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), perp); // float\n const s2 = Vec2.crossVec2Vec2(rB, perp); // float\n\n let impulse = new Vec3();\n const C1 = Vec2.zero(); // Vec2\n C1.x = Vec2.dot(perp, d);\n C1.y = aB - aA - this.m_referenceAngle;\n\n let linearError = Math.abs(C1.x); // float\n const angularError = Math.abs(C1.y); // float\n\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n let active = false; // bool\n let C2 = 0.0; // float\n if (this.m_enableLimit) {\n\n const translation = Vec2.dot(axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * linearSlop) {\n // Prevent large angular corrections\n C2 = Math.clamp(translation, -maxLinearCorrection, maxLinearCorrection);\n linearError = Math.max(linearError, Math.abs(translation));\n active = true;\n\n } else if (translation <= this.m_lowerTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_lowerTranslation + linearSlop,\n -maxLinearCorrection, 0.0);\n linearError = Math\n .max(linearError, this.m_lowerTranslation - translation);\n active = true;\n\n } else if (translation >= this.m_upperTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_upperTranslation - linearSlop, 0.0,\n maxLinearCorrection);\n linearError = Math\n .max(linearError, translation - this.m_upperTranslation);\n active = true;\n }\n }\n\n if (active) {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n const k13 = iA * s1 * a1 + iB * s2 * a2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n // For fixed rotation\n k22 = 1.0;\n }\n const k23 = iA * a1 + iB * a2; // float\n const k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; // float\n\n const K = new Mat33();\n K.ex.set(k11, k12, k13);\n K.ey.set(k12, k22, k23);\n K.ez.set(k13, k23, k33);\n\n const C = new Vec3();\n C.x = C1.x;\n C.y = C1.y;\n C.z = C2;\n\n impulse = K.solve33(Vec3.neg(C));\n } else {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n k22 = 1.0;\n }\n\n const K = new Mat22();\n K.ex.setNum(k11, k12);\n K.ey.setNum(k12, k22);\n\n const impulse1 = K.solve(Vec2.neg(C1)); // Vec2\n impulse.x = impulse1.x;\n impulse.y = impulse1.y;\n impulse.z = 0.0;\n }\n\n const P = Vec2.combine(impulse.x, perp, impulse.z, axis); // Vec2\n const LA = impulse.x * s1 + impulse.y + impulse.z * a1; // float\n const LB = impulse.x * s2 + impulse.y + impulse.z * a2; // float\n\n cA.subMul(mA, P);\n aA -= iA * LA;\n cB.addMul(mB, P);\n aB += iB * LB;\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport RevoluteJoint from './RevoluteJoint';\nimport PrismaticJoint from './PrismaticJoint';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Gear joint definition.\n */\nexport interface GearJointOpt extends JointOpt {\n /**\n * The gear ratio. See {@link GearJoint} for explanation.\n */\n ratio?: number;\n}\n/**\n * Gear joint definition.\n */\nexport interface GearJointDef extends JointDef, GearJointOpt {\n /**\n * The first revolute/prismatic joint attached to the gear joint.\n */\n joint1: RevoluteJoint | PrismaticJoint;\n /**\n * The second prismatic/revolute joint attached to the gear joint.\n */\n joint2: RevoluteJoint | PrismaticJoint;\n}\n\nconst DEFAULTS = {\n ratio : 1.0\n};\n\n/**\n * A gear joint is used to connect two joints together. Either joint can be a\n * revolute or prismatic joint. You specify a gear ratio to bind the motions\n * together: coordinate1 + ratio * coordinate2 = constant\n *\n * The ratio can be negative or positive. If one joint is a revolute joint and\n * the other joint is a prismatic joint, then the ratio will have units of\n * length or units of 1/length. Warning: You have to manually destroy the gear\n * joint if joint1 or joint2 is destroyed.\n *\n * This definition requires two existing revolute or prismatic joints (any\n * combination will work).\n */\nexport default class GearJoint extends Joint {\n static TYPE = 'gear-joint' as const;\n\n /** @internal */ m_type: 'gear-joint';\n /** @internal */ m_joint1: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_joint2: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_type1: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_type2: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_bodyC: Body;\n /** @internal */ m_localAnchorC: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_referenceAngleA: number;\n /** @internal */ m_localAxisC: Vec2;\n /** @internal */ m_bodyD: Body;\n /** @internal */ m_localAnchorD: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngleB: number;\n /** @internal */ m_localAxisD: Vec2;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_lcA: Vec2;\n /** @internal */ m_lcB: Vec2;\n /** @internal */ m_lcC: Vec2;\n /** @internal */ m_lcD: Vec2;\n /** @internal */ m_mA: number;\n /** @internal */ m_mB: number;\n /** @internal */ m_mC: number;\n /** @internal */ m_mD: number;\n /** @internal */ m_iA: number;\n /** @internal */ m_iB: number;\n /** @internal */ m_iC: number;\n /** @internal */ m_iD: number;\n /** @internal */ m_JvAC: Vec2;\n /** @internal */ m_JvBD: Vec2;\n /** @internal */ m_JwA: number;\n /** @internal */ m_JwB: number;\n /** @internal */ m_JwC: number;\n /** @internal */ m_JwD: number;\n /** @internal */ m_mass: number;\n\n constructor(def: GearJointDef);\n constructor(def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number);\n constructor(def: GearJointDef, bodyA?: Body, bodyB?: Body, joint1?: RevoluteJoint | PrismaticJoint, joint2?: RevoluteJoint | PrismaticJoint, ratio?: number) {\n // @ts-ignore\n if (!(this instanceof GearJoint)) {\n return new GearJoint(def, bodyA, bodyB, joint1, joint2, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = GearJoint.TYPE;\n\n _ASSERT && common.assert(joint1.m_type === RevoluteJoint.TYPE\n || joint1.m_type === PrismaticJoint.TYPE);\n _ASSERT && common.assert(joint2.m_type === RevoluteJoint.TYPE\n || joint2.m_type === PrismaticJoint.TYPE);\n\n this.m_joint1 = joint1 ? joint1 : def.joint1;\n this.m_joint2 = joint2 ? joint2 : def.joint2;\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n this.m_type1 = this.m_joint1.getType() as 'revolute-joint' | 'prismatic-joint';\n this.m_type2 = this.m_joint2.getType() as 'revolute-joint' | 'prismatic-joint';\n\n // joint1 connects body A to body C\n // joint2 connects body B to body D\n\n let coordinateA: number;\n let coordinateB: number;\n\n // TODO_ERIN there might be some problem with the joint edges in Joint.\n\n this.m_bodyC = this.m_joint1.getBodyA();\n this.m_bodyA = this.m_joint1.getBodyB();\n\n // Get geometry of joint1\n const xfA = this.m_bodyA.m_xf;\n const aA = this.m_bodyA.m_sweep.a;\n const xfC = this.m_bodyC.m_xf;\n const aC = this.m_bodyC.m_sweep.a;\n\n if (this.m_type1 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint1 as RevoluteJoint;\n this.m_localAnchorC = revolute.m_localAnchorA;\n this.m_localAnchorA = revolute.m_localAnchorB;\n this.m_referenceAngleA = revolute.m_referenceAngle;\n this.m_localAxisC = Vec2.zero();\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const prismatic = this.m_joint1 as PrismaticJoint;\n this.m_localAnchorC = prismatic.m_localAnchorA;\n this.m_localAnchorA = prismatic.m_localAnchorB;\n this.m_referenceAngleA = prismatic.m_referenceAngle;\n this.m_localAxisC = prismatic.m_localXAxisA;\n\n const pC = this.m_localAnchorC;\n const pA = Rot.mulTVec2(xfC.q, Vec2.add(Rot.mulVec2(xfA.q, this.m_localAnchorA), Vec2.sub(xfA.p, xfC.p)));\n coordinateA = Vec2.dot(pA, this.m_localAxisC) - Vec2.dot(pC, this.m_localAxisC);\n }\n\n this.m_bodyD = this.m_joint2.getBodyA();\n this.m_bodyB = this.m_joint2.getBodyB();\n\n // Get geometry of joint2\n const xfB = this.m_bodyB.m_xf;\n const aB = this.m_bodyB.m_sweep.a;\n const xfD = this.m_bodyD.m_xf;\n const aD = this.m_bodyD.m_sweep.a;\n\n if (this.m_type2 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint2 as RevoluteJoint;\n this.m_localAnchorD = revolute.m_localAnchorA;\n this.m_localAnchorB = revolute.m_localAnchorB;\n this.m_referenceAngleB = revolute.m_referenceAngle;\n this.m_localAxisD = Vec2.zero();\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const prismatic = this.m_joint2 as PrismaticJoint;\n this.m_localAnchorD = prismatic.m_localAnchorA;\n this.m_localAnchorB = prismatic.m_localAnchorB;\n this.m_referenceAngleB = prismatic.m_referenceAngle;\n this.m_localAxisD = prismatic.m_localXAxisA;\n\n const pD = this.m_localAnchorD;\n const pB = Rot.mulTVec2(xfD.q, Vec2.add(Rot.mulVec2(xfB.q, this.m_localAnchorB), Vec2.sub(xfB.p, xfD.p)));\n coordinateB = Vec2.dot(pB, this.m_localAxisD) - Vec2.dot(pD, this.m_localAxisD);\n }\n\n this.m_constant = coordinateA + this.m_ratio * coordinateB;\n\n this.m_impulse = 0.0;\n\n // Gear Joint:\n // C0 = (coordinate1 + ratio * coordinate2)_initial\n // C = (coordinate1 + ratio * coordinate2) - C0 = 0\n // J = [J1 ratio * J2]\n // K = J * invM * JT\n // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T\n //\n // Revolute:\n // coordinate = rotation\n // Cdot = angularVelocity\n // J = [0 0 1]\n // K = J * invM * JT = invI\n //\n // Prismatic:\n // coordinate = dot(p - pg, ug)\n // Cdot = dot(v + cross(w, r), ug)\n // J = [ug cross(r, ug)]\n // K = J * invM * JT = invMass + invI * cross(r, ug)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n joint1: this.m_joint1,\n joint2: this.m_joint2,\n ratio: this.m_ratio,\n\n // _constant: this.m_constant,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): GearJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.joint1 = restore(Joint, data.joint1, world);\n data.joint2 = restore(Joint, data.joint2, world);\n const joint = new GearJoint(data);\n // if (data._constant) joint.m_constant = data._constant;\n return joint;\n }\n\n /**\n * Get the first joint.\n */\n getJoint1(): Joint {\n return this.m_joint1;\n }\n\n /**\n * Get the second joint.\n */\n getJoint2(): Joint {\n return this.m_joint2;\n }\n\n /**\n * Set the gear ratio.\n */\n setRatio(ratio: number): void {\n _ASSERT && common.assert(Math.isFinite(ratio));\n this.m_ratio = ratio;\n }\n\n /**\n * Get the gear ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_JvAC).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n const L = this.m_impulse * this.m_JwA; // float\n return inv_dt * L;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_lcA = this.m_bodyA.m_sweep.localCenter;\n this.m_lcB = this.m_bodyB.m_sweep.localCenter;\n this.m_lcC = this.m_bodyC.m_sweep.localCenter;\n this.m_lcD = this.m_bodyD.m_sweep.localCenter;\n this.m_mA = this.m_bodyA.m_invMass;\n this.m_mB = this.m_bodyB.m_invMass;\n this.m_mC = this.m_bodyC.m_invMass;\n this.m_mD = this.m_bodyD.m_invMass;\n this.m_iA = this.m_bodyA.m_invI;\n this.m_iB = this.m_bodyB.m_invI;\n this.m_iC = this.m_bodyC.m_invI;\n this.m_iD = this.m_bodyD.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const aC = this.m_bodyC.c_position.a;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n\n const aD = this.m_bodyD.c_position.a;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n this.m_mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n this.m_JvAC = Vec2.zero();\n this.m_JwA = 1.0;\n this.m_JwC = 1.0;\n this.m_mass += this.m_iA + this.m_iC;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n this.m_JvAC = u;\n this.m_JwC = Vec2.crossVec2Vec2(rC, u);\n this.m_JwA = Vec2.crossVec2Vec2(rA, u);\n this.m_mass += this.m_mC + this.m_mA + this.m_iC * this.m_JwC * this.m_JwC + this.m_iA * this.m_JwA * this.m_JwA;\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n this.m_JvBD = Vec2.zero();\n this.m_JwB = this.m_ratio;\n this.m_JwD = this.m_ratio;\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD); // Vec2\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); // Vec2\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); // Vec2\n this.m_JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n this.m_JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n this.m_JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD * this.m_JwD * this.m_JwD + this.m_iB * this.m_JwB * this.m_JwB;\n }\n\n // Compute effective mass.\n this.m_mass = this.m_mass > 0.0 ? 1.0 / this.m_mass : 0.0;\n\n if (step.warmStarting) {\n vA.addMul(this.m_mA * this.m_impulse, this.m_JvAC);\n wA += this.m_iA * this.m_impulse * this.m_JwA;\n\n vB.addMul(this.m_mB * this.m_impulse, this.m_JvBD);\n wB += this.m_iB * this.m_impulse * this.m_JwB;\n\n vC.subMul(this.m_mC * this.m_impulse, this.m_JvAC);\n wC -= this.m_iC * this.m_impulse * this.m_JwC;\n\n vD.subMul(this.m_mD * this.m_impulse, this.m_JvBD);\n wD -= this.m_iD * this.m_impulse * this.m_JwD;\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n let Cdot = Vec2.dot(this.m_JvAC, vA) - Vec2.dot(this.m_JvAC, vC)\n + Vec2.dot(this.m_JvBD, vB) - Vec2.dot(this.m_JvBD, vD); // float\n Cdot += (this.m_JwA * wA - this.m_JwC * wC)\n + (this.m_JwB * wB - this.m_JwD * wD);\n\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n vA.addMul(this.m_mA * impulse, this.m_JvAC);\n wA += this.m_iA * impulse * this.m_JwA;\n vB.addMul(this.m_mB * impulse, this.m_JvBD);\n wB += this.m_iB * impulse * this.m_JwB;\n vC.subMul(this.m_mC * impulse, this.m_JvAC);\n wC -= this.m_iC * impulse * this.m_JwC;\n vD.subMul(this.m_mD * impulse, this.m_JvBD);\n wD -= this.m_iD * impulse * this.m_JwD;\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n const cC = this.m_bodyC.c_position.c;\n let aC = this.m_bodyC.c_position.a;\n const cD = this.m_bodyD.c_position.c;\n let aD = this.m_bodyD.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n const linearError = 0.0;\n\n let coordinateA: number;\n let coordinateB: number;\n\n let JvAC: Vec2;\n let JvBD: Vec2;\n let JwA: number;\n let JwB: number;\n let JwC: number;\n let JwD: number;\n let mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n JvAC = Vec2.zero();\n JwA = 1.0;\n JwC = 1.0;\n mass += this.m_iA + this.m_iC;\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n JvAC = u;\n JwC = Vec2.crossVec2Vec2(rC, u);\n JwA = Vec2.crossVec2Vec2(rA, u);\n mass += this.m_mC + this.m_mA + this.m_iC * JwC * JwC + this.m_iA * JwA * JwA;\n\n const pC = Vec2.sub(this.m_localAnchorC, this.m_lcC); // Vec2\n const pA = Rot.mulTVec2(qC, Vec2.add(rA, Vec2.sub(cA, cC))); // Vec2\n coordinateA = Vec2.dot(Vec2.sub(pA, pC), this.m_localAxisC);\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n JvBD = Vec2.zero();\n JwB = this.m_ratio;\n JwD = this.m_ratio;\n mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD);\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB);\n JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD\n * JwD * JwD + this.m_iB * JwB * JwB;\n\n const pD = Vec2.sub(this.m_localAnchorD, this.m_lcD); // Vec2\n const pB = Rot.mulTVec2(qD, Vec2.add(rB, Vec2.sub(cB, cD))); // Vec2\n coordinateB = Vec2.dot(pB, this.m_localAxisD)\n - Vec2.dot(pD, this.m_localAxisD);\n }\n\n const C = (coordinateA + this.m_ratio * coordinateB) - this.m_constant; // float\n\n let impulse = 0.0; // float\n if (mass > 0.0) {\n impulse = -C / mass;\n }\n\n cA.addMul(this.m_mA * impulse, JvAC);\n aA += this.m_iA * impulse * JwA;\n cB.addMul(this.m_mB * impulse, JvBD);\n aB += this.m_iB * impulse * JwB;\n cC.subMul(this.m_mC * impulse, JvAC);\n aC -= this.m_iC * impulse * JwC;\n cD.subMul(this.m_mD * impulse, JvBD);\n aD -= this.m_iD * impulse * JwD;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n this.m_bodyC.c_position.c.setVec2(cC);\n this.m_bodyC.c_position.a = aC;\n this.m_bodyD.c_position.c.setVec2(cD);\n this.m_bodyD.c_position.a = aD;\n\n // TODO_ERIN not implemented\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Mat22 from '../../common/Mat22';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Motor joint definition.\n */\nexport interface MotorJointOpt extends JointOpt {\n /**\n * The bodyB angle minus bodyA angle in radians.\n */\n angularOffset?: number;\n /**\n * The maximum motor force in N.\n */\n maxForce?: number;\n /**\n * The maximum motor torque in N-m.\n */\n maxTorque?: number;\n /**\n * Position correction factor in the range [0,1].\n */\n correctionFactor?: number;\n /**\n * Position of bodyB minus the position of bodyA, in bodyA's frame, in meters.\n */\n linearOffset?: Vec2;\n}\n/**\n * Motor joint definition.\n */\nexport interface MotorJointDef extends JointDef, MotorJointOpt {\n}\n\nconst DEFAULTS = {\n maxForce : 1.0,\n maxTorque : 1.0,\n correctionFactor : 0.3\n};\n\n/**\n * A motor joint is used to control the relative motion between two bodies. A\n * typical usage is to control the movement of a dynamic body with respect to\n * the ground.\n */\nexport default class MotorJoint extends Joint {\n static TYPE = 'motor-joint' as const;\n\n /** @internal */ m_type: 'motor-joint';\n /** @internal */ m_linearOffset: Vec2;\n /** @internal */ m_angularOffset: number;\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n /** @internal */ m_correctionFactor: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_linearError: Vec2;\n /** @internal */ m_angularError: number;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: MotorJointDef);\n constructor(def: MotorJointOpt, bodyA: Body, bodyB: Body);\n constructor(def: MotorJointDef | MotorJointOpt, bodyA?: Body, bodyB?: Body) {\n // @ts-ignore\n if (!(this instanceof MotorJoint)) {\n return new MotorJoint(def, bodyA, bodyB);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MotorJoint.TYPE;\n\n this.m_linearOffset = Math.isFinite(def.linearOffset) ? def.linearOffset : bodyA.getLocalPoint(bodyB.getPosition());\n this.m_angularOffset = Math.isFinite(def.angularOffset) ? def.angularOffset : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n this.m_correctionFactor = def.correctionFactor;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n correctionFactor: this.m_correctionFactor,\n\n linearOffset: this.m_linearOffset,\n angularOffset: this.m_angularOffset,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MotorJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new MotorJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {}): void {\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && common.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && common.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Set the position correction factor in the range [0,1].\n */\n setCorrectionFactor(factor: number): void {\n _ASSERT && common.assert(Math.isFinite(factor) && 0.0 <= factor && factor <= 1.0);\n this.m_correctionFactor = factor;\n }\n\n /**\n * Get the position correction factor in the range [0,1].\n */\n getCorrectionFactor(): number {\n return this.m_correctionFactor;\n }\n\n /**\n * Set/get the target linear offset, in frame A, in meters.\n */\n setLinearOffset(linearOffset: Vec2): void {\n if (linearOffset.x != this.m_linearOffset.x\n || linearOffset.y != this.m_linearOffset.y) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_linearOffset = linearOffset;\n }\n }\n\n getLinearOffset(): Vec2 {\n return this.m_linearOffset;\n }\n\n /**\n * Set/get the target angular offset, in radians.\n */\n setAngularOffset(angularOffset: number): void {\n if (angularOffset != this.m_angularOffset) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_angularOffset = angularOffset;\n }\n }\n\n getAngularOffset(): number {\n return this.m_angularOffset;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getPosition();\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getPosition();\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.neg(this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.neg(this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n this.m_linearError = Vec2.zero();\n this.m_linearError.addCombine(1, cB, 1, this.m_rB);\n this.m_linearError.subCombine(1, cA, 1, this.m_rA);\n this.m_linearError.sub(Rot.mulVec2(qA, this.m_linearOffset));\n\n this.m_angularError = aB - aA - this.m_angularOffset;\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt;\n const inv_h = step.inv_dt;\n\n // Solve angular friction\n {\n const Cdot = wB - wA + inv_h * this.m_correctionFactor * this.m_angularError;\n let impulse = -this.m_angularMass * Cdot;\n\n const oldImpulse = this.m_angularImpulse;\n const maxImpulse = h * this.m_maxTorque;\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n Cdot.addMul(inv_h * this.m_correctionFactor, this.m_linearError);\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot));\n const oldImpulse = Vec2.clone(this.m_linearImpulse);\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce;\n\n this.m_linearImpulse.clamp(maxImpulse);\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Mat22 from '../../common/Mat22';\nimport Rot from '../../common/Rot';\nimport Transform from '../../common/Transform';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointOpt extends JointOpt {\n /**\n * [maxForce = 0.0] The maximum constraint force that can be exerted to move\n * the candidate body. Usually you will express as some multiple of the\n * weight (multiplier * mass * gravity).\n */\n maxForce?: number;\n /**\n * [frequencyHz = 5.0] The response speed.\n */\n frequencyHz?: number;\n /**\n * [dampingRatio = 0.7] The damping ratio. 0 = no damping, 1 = critical\n * damping.\n */\n dampingRatio?: number;\n}\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointDef extends JointDef, MouseJointOpt {\n /**\n * The initial world target point. This is assumed to coincide with the body\n * anchor initially.\n */\n target: Vec2;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n frequencyHz : 5.0,\n dampingRatio : 0.7\n};\n\n/**\n * A mouse joint is used to make a point on a body track a specified world\n * point. This a soft constraint with a maximum force. This allows the\n * constraint to stretch and without applying huge forces.\n *\n * NOTE: this joint is not documented in the manual because it was developed to\n * be used in the testbed. If you want to learn how to use the mouse joint, look\n * at the testbed.\n */\nexport default class MouseJoint extends Joint {\n static TYPE = 'mouse-joint' as const;\n\n /** @internal */ m_type: 'mouse-joint';\n /** @internal */ m_targetA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_impulse: Vec2;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_beta: number;\n /** @internal */ m_gamma: number;\n // Solver temp\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat22;\n /** @internal */ m_C: Vec2;\n\n constructor(def: MouseJointDef);\n constructor(def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2);\n constructor(def: MouseJointDef, bodyA?: Body, bodyB?: Body, target?: Vec2) {\n // @ts-ignore\n if (!(this instanceof MouseJoint)) {\n return new MouseJoint(def, bodyA, bodyB, target);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MouseJoint.TYPE;\n\n _ASSERT && common.assert(Math.isFinite(def.maxForce) && def.maxForce >= 0.0);\n _ASSERT && common.assert(Math.isFinite(def.frequencyHz) && def.frequencyHz >= 0.0);\n _ASSERT && common.assert(Math.isFinite(def.dampingRatio) && def.dampingRatio >= 0.0);\n\n this.m_targetA = target ? Vec2.clone(target) : def.target || Vec2.zero();\n this.m_localAnchorB = Transform.mulTVec2(bodyB.getTransform(), this.m_targetA);\n\n this.m_maxForce = def.maxForce;\n this.m_impulse = Vec2.zero();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_beta = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rB = Vec2.zero();\n this.m_localCenterB = Vec2.zero();\n this.m_invMassB = 0.0;\n this.m_invIB = 0.0;\n this.m_mass = new Mat22();\n this.m_C = Vec2.zero();\n\n // p = attached point, m = mouse point\n // C = p - m\n // Cdot = v\n // = v + cross(w, r)\n // J = [I r_skew]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n target: this.m_targetA,\n maxForce: this.m_maxForce,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n _localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MouseJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.target = Vec2.clone(data.target);\n const joint = new MouseJoint(data);\n if (data._localAnchorB) {\n joint.m_localAnchorB = data._localAnchorB;\n }\n return joint;\n }\n\n /**\n * Use this to update the target point.\n */\n setTarget(target: Vec2): void {\n if (this.m_bodyB.isAwake() == false) {\n this.m_bodyB.setAwake(true);\n }\n this.m_targetA = Vec2.clone(target);\n }\n\n getTarget(): Vec2 {\n return this.m_targetA;\n }\n\n /**\n * Set the maximum force in Newtons.\n */\n setMaxForce(force: number): void {\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum force in Newtons.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the frequency in Hertz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get the frequency in Hertz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set the damping ratio (dimensionless).\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get the damping ratio (dimensionless).\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return Vec2.clone(this.m_targetA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_impulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * 0.0;\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_targetA.sub(newOrigin);\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const position = this.m_bodyB.c_position;\n const velocity = this.m_bodyB.c_velocity;\n\n const cB = position.c;\n const aB = position.a;\n const vB = velocity.v;\n let wB = velocity.w;\n\n const qB = Rot.neo(aB);\n\n const mass = this.m_bodyB.getMass();\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = mass * (omega * omega);\n\n // magic formulas\n // gamma has units of inverse mass.\n // beta has units of inverse time.\n const h = step.dt;\n _ASSERT && common.assert(d + h * k > Math.EPSILON);\n this.m_gamma = h * (d + h * k);\n if (this.m_gamma != 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n this.m_beta = h * k * this.m_gamma;\n\n // Compute the effective mass matrix.\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) *\n // invI2 * skew(r2)]\n // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y\n // -r1.x*r1.y]\n // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x]\n const K = new Mat22();\n K.ex.x = this.m_invMassB + this.m_invIB * this.m_rB.y * this.m_rB.y\n + this.m_gamma;\n K.ex.y = -this.m_invIB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = this.m_invMassB + this.m_invIB * this.m_rB.x * this.m_rB.x\n + this.m_gamma;\n\n this.m_mass = K.getInverse();\n\n this.m_C.setVec2(cB);\n this.m_C.addCombine(1, this.m_rB, -1, this.m_targetA);\n this.m_C.mul(this.m_beta);\n\n // Cheat with some damping\n wB *= 0.98;\n\n if (step.warmStarting) {\n this.m_impulse.mul(step.dtRatio);\n vB.addMul(this.m_invMassB, this.m_impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, this.m_impulse);\n\n } else {\n this.m_impulse.setZero();\n }\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const velocity = this.m_bodyB.c_velocity;\n const vB = Vec2.clone(velocity.v);\n let wB = velocity.w;\n\n // Cdot = v + cross(w, r)\n\n const Cdot = Vec2.crossNumVec2(wB, this.m_rB);\n Cdot.add(vB);\n\n Cdot.addCombine(1, this.m_C, this.m_gamma, this.m_impulse);\n Cdot.neg();\n\n let impulse = Mat22.mulVec2(this.m_mass, Cdot);\n\n const oldImpulse = Vec2.clone(this.m_impulse);\n this.m_impulse.add(impulse);\n const maxImpulse = step.dt * this.m_maxForce;\n this.m_impulse.clamp(maxImpulse);\n impulse = Vec2.sub(this.m_impulse, oldImpulse);\n\n vB.addMul(this.m_invMassB, impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\n// tslint:disable-next-line:no-empty-interface\nexport interface PulleyJointOpt extends JointOpt {\n}\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\nexport interface PulleyJointDef extends JointDef, PulleyJointOpt {\n /**\n * The first ground anchor in world coordinates. This point never moves.\n */\n groundAnchorA: Vec2;\n /**\n * The second ground anchor in world coordinates. This point never moves.\n */\n groundAnchorB: Vec2;\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The reference length for the segment attached to bodyA.\n */\n lengthA: number;\n /**\n * The reference length for the segment attached to bodyB.\n */\n lengthB: number;\n /**\n * The pulley ratio, used to simulate a block-and-tackle.\n */\n ratio: number;\n}\n\nconst DEFAULTS = {\n collideConnected : true\n};\n\n/**\n * The pulley joint is connected to two bodies and two fixed ground points. The\n * pulley supports a ratio such that: length1 + ratio * length2 <= constant\n *\n * Yes, the force transmitted is scaled by the ratio.\n *\n * Warning: the pulley joint can get a bit squirrelly by itself. They often work\n * better when combined with prismatic joints. You should also cover the the\n * anchor points with static shapes to prevent one side from going to zero\n * length.\n */\nexport default class PulleyJoint extends Joint {\n static TYPE = 'pulley-joint' as const;\n // static MIN_PULLEY_LENGTH: number = 2.0; // TODO where this is used?\n\n /** @internal */ m_type: 'pulley-joint';\n /** @internal */ m_groundAnchorA: Vec2;\n /** @internal */ m_groundAnchorB: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_lengthA: number;\n /** @internal */ m_lengthB: number;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_uA: Vec2;\n /** @internal */ m_uB: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: PulleyJointDef);\n constructor(def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number);\n constructor(def: PulleyJointDef, bodyA?: Body, bodyB?: Body, groundA?: Vec2, groundB?: Vec2, anchorA?: Vec2, anchorB?: Vec2, ratio?: number) {\n // @ts-ignore\n if (!(this instanceof PulleyJoint)) {\n return new PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PulleyJoint.TYPE;\n this.m_groundAnchorA = groundA ? groundA : def.groundAnchorA || Vec2.neo(-1.0, 1.0);\n this.m_groundAnchorB = groundB ? groundB : def.groundAnchorB || Vec2.neo(1.0, 1.0);\n this.m_localAnchorA = anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n this.m_lengthA = Math.isFinite(def.lengthA) ? def.lengthA : Vec2.distance(anchorA, groundA);\n this.m_lengthB = Math.isFinite(def.lengthB) ? def.lengthB : Vec2.distance(anchorB, groundB);\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n _ASSERT && common.assert(ratio > Math.EPSILON);\n\n this.m_constant = this.m_lengthA + this.m_ratio * this.m_lengthB;\n\n this.m_impulse = 0.0;\n\n // Pulley:\n // length1 = norm(p1 - s1)\n // length2 = norm(p2 - s2)\n // C0 = (length1 + ratio * length2)_initial\n // C = C0 - (length1 + ratio * length2)\n // u1 = (p1 - s1) / norm(p1 - s1)\n // u2 = (p2 - s2) / norm(p2 - s2)\n // Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2))\n // J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 *\n // cross(r2, u2)^2)\n }\n\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n groundAnchorA: this.m_groundAnchorA,\n groundAnchorB: this.m_groundAnchorB,\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n lengthA: this.m_lengthA,\n lengthB: this.m_lengthB,\n ratio: this.m_ratio,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PulleyJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new PulleyJoint(data);\n return joint;\n }\n\n /**\n * Get the first ground anchor.\n */\n getGroundAnchorA(): Vec2 {\n return this.m_groundAnchorA;\n }\n\n /**\n * Get the second ground anchor.\n */\n getGroundAnchorB(): Vec2 {\n return this.m_groundAnchorB;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getLengthA(): number {\n return this.m_lengthA;\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getLengthB(): number {\n return this.m_lengthB;\n }\n\n /**\n * Get the pulley ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getCurrentLengthA(): number {\n const p = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const s = this.m_groundAnchorA;\n return Vec2.distance(p, s);\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getCurrentLengthB(): number {\n const p = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const s = this.m_groundAnchorB;\n return Vec2.distance(p, s);\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n *\n * @param newOrigin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_groundAnchorA.sub(newOrigin);\n this.m_groundAnchorB.sub(newOrigin);\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_uB).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n this.m_uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n this.m_uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = this.m_uA.length();\n const lengthB = this.m_uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n this.m_uA.mul(1.0 / lengthA);\n } else {\n this.m_uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n this.m_uB.mul(1.0 / lengthB);\n } else {\n this.m_uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(this.m_rA, this.m_uA); // float\n const ruB = Vec2.crossVec2Vec2(this.m_rB, this.m_uB); // float\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n this.m_mass = mA + this.m_ratio * this.m_ratio * mB;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support variable time steps.\n this.m_impulse *= step.dtRatio;\n\n // Warm starting.\n const PA = Vec2.mulNumVec2(-this.m_impulse, this.m_uA);\n const PB = Vec2.mulNumVec2(-this.m_ratio * this.m_impulse, this.m_uB);\n\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n\n const Cdot = -Vec2.dot(this.m_uA, vpA) - this.m_ratio\n * Vec2.dot(this.m_uB, vpB); // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const PA = Vec2.mulNumVec2(-impulse, this.m_uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, this.m_uB); // Vec2\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n const uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n const uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = uA.length();\n const lengthB = uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n uA.mul(1.0 / lengthA);\n } else {\n uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n uB.mul(1.0 / lengthB);\n } else {\n uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(rA, uA);\n const ruB = Vec2.crossVec2Vec2(rB, uB);\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n let mass = mA + this.m_ratio * this.m_ratio * mB; // float\n\n if (mass > 0.0) {\n mass = 1.0 / mass;\n }\n\n const C = this.m_constant - lengthA - this.m_ratio * lengthB; // float\n const linearError = Math.abs(C); // float\n\n const impulse = -mass * C; // float\n\n const PA = Vec2.mulNumVec2(-impulse, uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, uB); // Vec2\n\n cA.addMul(this.m_invMassA, PA);\n aA += this.m_invIA * Vec2.crossVec2Vec2(rA, PA);\n cB.addMul(this.m_invMassB, PB);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, PB);\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointOpt extends JointOpt {\n /**\n * The maximum length of the rope.\n * Warning: this must be larger than linearSlop or the joint will have no effect.\n */\n maxLength?: number;\n}\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointDef extends JointDef, RopeJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxLength : 0.0,\n};\n\n/**\n * A rope joint enforces a maximum distance between two points on two bodies. It\n * has no other effect.\n *\n * Warning: if you attempt to change the maximum length during the simulation\n * you will get some non-physical behavior.\n *\n * A model that would allow you to dynamically modify the length would have some\n * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you\n * want to dynamically control length.\n */\nexport default class RopeJoint extends Joint {\n static TYPE = 'rope-joint' as const;\n\n /** @internal */ m_type: 'rope-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n /** @internal */ m_maxLength: number;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_length: number;\n /** @internal */ m_state: number; // TODO enum\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n constructor(def: RopeJointDef);\n constructor(def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: RopeJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (!(this instanceof RopeJoint)) {\n return new RopeJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RopeJoint.TYPE;\n this.m_localAnchorA = anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n\n this.m_maxLength = def.maxLength;\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_length = 0.0;\n this.m_state = inactiveLimit;\n\n // Limit:\n // C = norm(pB - pA) - L\n // u = (pB - pA) / norm(pB - pA)\n // Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA))\n // J = [-u -cross(rA, u) u cross(rB, u)]\n // K = J * invM * JT\n // = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n maxLength: this.m_maxLength,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): RopeJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RopeJoint(data);\n return joint;\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum length of the rope.\n */\n setMaxLength(length: number): void {\n this.m_maxLength = length;\n }\n\n /**\n * Get the maximum length of the rope.\n */\n getMaxLength(): number {\n return this.m_maxLength;\n }\n\n getLimitState(): number {\n // TODO LimitState\n return this.m_state;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n this.m_rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n this.m_u = Vec2.zero();\n this.m_u.addCombine(1, cB, 1, this.m_rB);\n this.m_u.subCombine(1, cA, 1, this.m_rA); // Vec2\n\n this.m_length = this.m_u.length();\n\n const C = this.m_length - this.m_maxLength; // float\n if (C > 0.0) {\n this.m_state = atUpperLimit;\n } else {\n this.m_state = inactiveLimit;\n }\n\n if (this.m_length > Settings.linearSlop) {\n this.m_u.mul(1.0 / this.m_length);\n } else {\n this.m_u.setZero();\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n return;\n }\n\n // Compute effective mass.\n const crA = Vec2.crossVec2Vec2(this.m_rA, this.m_u); // float\n const crB = Vec2.crossVec2Vec2(this.m_rB, this.m_u); // float\n const invMass = this.m_invMassA + this.m_invIA * crA * crA + this.m_invMassB\n + this.m_invIB * crB * crB; // float\n\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.addCrossNumVec2(vA, wA, this.m_rA); // Vec2\n const vpB = Vec2.addCrossNumVec2(vB, wB, this.m_rB); // Vec2\n const C = this.m_length - this.m_maxLength; // float\n let Cdot = Vec2.dot(this.m_u, Vec2.sub(vpB, vpA)); // float\n\n // Predictive constraint.\n if (C < 0.0) {\n Cdot += step.inv_dt * C;\n }\n\n let impulse = -this.m_mass * Cdot; // float\n const oldImpulse = this.m_impulse; // float\n this.m_impulse = Math.min(0.0, this.m_impulse + impulse);\n impulse = this.m_impulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u); // Vec2\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c; // Vec2\n let aA = this.m_bodyA.c_position.a; // float\n const cB = this.m_bodyB.c_position.c; // Vec2\n let aB = this.m_bodyB.c_position.a; // float\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.zero();\n u.addCombine(1, cB, 1, rB);\n u.subCombine(1, cA, 1, rA); // Vec2\n\n const length = u.normalize(); // float\n let C = length - this.m_maxLength; // float\n\n C = Math.clamp(C, 0.0, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C; // float\n const P = Vec2.mulNumVec2(impulse, u); // Vec2\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return length - this.m_maxLength < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Vec3 from '../../common/Vec3';\nimport Mat33 from '../../common/Mat33';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n *\n * @prop {float} frequencyHz\n * @prop {float} dampingRatio\n *\n * @prop {Vec2} localAnchorA\n * @prop {Vec2} localAnchorB\n * @prop {float} referenceAngle\n */\nexport interface WeldJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. Rotation only. Disable softness\n * with a value of 0.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle?: number;\n}\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n */\nexport interface WeldJointDef extends JointDef, WeldJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0,\n};\n\n/**\n * A weld joint essentially glues two bodies together. A weld joint may distort\n * somewhat because the island constraint solver is approximate.\n */\nexport default class WeldJoint extends Joint {\n static TYPE = 'weld-joint' as const\n\n /** @internal */ m_type: 'weld-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_impulse: Vec3;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat33;\n\n constructor(def: WeldJointDef);\n constructor(def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: WeldJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (!(this instanceof WeldJoint)) {\n return new WeldJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WeldJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_impulse = new Vec3();\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rA; // Vec2\n this.m_rB; // Vec2\n this.m_localCenterA; // Vec2\n this.m_localCenterB; // Vec2\n this.m_invMassA; // float\n this.m_invMassB; // float\n this.m_invIA; // float\n this.m_invIB; // float\n this.m_mass = new Mat33();\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // / = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // C = angle2 - angle1 - referenceAngle\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WeldJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WeldJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Set frequency in Hz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get frequency in Hz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set damping ratio.\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get damping ratio.\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat33();\n K.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y * this.m_rB.y\n * iB;\n K.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y * this.m_rB.x * iB;\n K.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x * this.m_rB.x\n * iB;\n K.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n K.getInverse22(this.m_mass);\n\n let invM = iA + iB; // float\n const m = invM > 0.0 ? 1.0 / invM : 0.0; // float\n\n const C = aB - aA - this.m_referenceAngle; // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const d = 2.0 * m * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = m * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invM += this.m_gamma;\n this.m_mass.ez.z = invM != 0.0 ? 1.0 / invM : 0.0;\n } else if (K.ez.z == 0.0) {\n K.getInverse22(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n } else {\n K.getSymInverse33(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n if (this.m_frequencyHz > 0.0) {\n const Cdot2 = wB - wA; // float\n\n const impulse2 = -this.m_mass.ez.z\n * (Cdot2 + this.m_bias + this.m_gamma * this.m_impulse.z); // float\n this.m_impulse.z += impulse2;\n\n wA -= iA * impulse2;\n wB += iB * impulse2;\n\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n\n const impulse1 = Vec2.neg(Mat33.mulVec2(this.m_mass, Cdot1)); // Vec2\n this.m_impulse.x += impulse1.x;\n this.m_impulse.y += impulse1.y;\n\n const P = Vec2.clone(impulse1); // Vec2\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, P);\n } else {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); // Vec3\n\n const impulse = Vec3.neg(Mat33.mulVec3(this.m_mass, Cdot)); // Vec3\n this.m_impulse.add(impulse);\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n let positionError: number;\n let angularError: number;\n\n const K = new Mat33();\n K.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB;\n K.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB;\n K.ez.x = -rA.y * iA - rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB;\n K.ez.y = rA.x * iA + rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA); // Vec2\n\n positionError = C1.length();\n angularError = 0.0;\n\n const P = Vec2.neg(K.solve22(C1)); // Vec2\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n } else {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA);\n\n const C2 = aB - aA - this.m_referenceAngle; // float\n\n positionError = C1.length();\n angularError = Math.abs(C2);\n\n const C = new Vec3(C1.x, C1.y, C2);\n\n let impulse = new Vec3();\n if (K.ez.z > 0.0) {\n impulse = Vec3.neg(K.solve33(C));\n } else {\n const impulse2 = Vec2.neg(K.solve22(C1));\n impulse.set(impulse2.x, impulse2.y, 0.0);\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n cA.subMul(mA, P);\n aA -= iA * (Vec2.crossVec2Vec2(rA, P) + impulse.z);\n\n cB.addMul(mB, P);\n aB += iB * (Vec2.crossVec2Vec2(rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport options from '../../util/options';\nimport Settings from '../../Settings';\nimport Math from '../../common/Math';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Joint, { JointOpt, JointDef } from '../Joint';\nimport Body from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointOpt extends JointOpt {\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n /**\n * Suspension frequency, zero indicates no suspension.\n */\n frequencyHz?: number;\n /**\n * Suspension damping ratio, one indicates critical damping.\n */\n dampingRatio?: number;\n}\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointDef extends JointDef, WheelJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation axis in bodyA.\n */\n localAxisA: Vec2;\n}\n\nconst DEFAULTS = {\n enableMotor : false,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n frequencyHz : 2.0,\n dampingRatio : 0.7,\n};\n\n/**\n * A wheel joint. This joint provides two degrees of freedom: translation along\n * an axis fixed in bodyA and rotation in the plane. In other words, it is a\n * point to line constraint with a rotational motor and a linear spring/damper.\n * This joint is designed for vehicle suspensions.\n */\nexport default class WheelJoint extends Joint {\n static TYPE = 'wheel-joint' as const;\n\n /** @internal */ m_type: 'wheel-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_springMass: number;\n /** @internal */ m_springImpulse: number;\n\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableMotor: boolean;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n /** @internal */ m_ax: Vec2 = Vec2.zero();\n /** @internal */ m_ay: Vec2 = Vec2.zero();\n /** @internal */ m_sAx: number;\n /** @internal */ m_sBx: number;\n /** @internal */ m_sAy: number;\n /** @internal */ m_sBy: number;\n\n constructor(def: WheelJointDef);\n constructor(def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n // @ts-ignore\n constructor(def: WheelJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (!(this instanceof WheelJoint)) {\n return new WheelJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WheelJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n // @ts-ignore localAxis\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || def.localAxis || Vec2.neo(1.0, 0.0));\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n this.m_springMass = 0.0;\n this.m_springImpulse = 0.0;\n\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableMotor = def.enableMotor;\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Linear constraint (point-to-line)\n // d = pB - pA = xB + rB - xA - rA\n // C = dot(ay, d)\n // Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA,\n // rA))\n // = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB,\n // ay), vB)\n // J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)]\n\n // Spring linear constraint\n // C = dot(ax, d)\n // Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) +\n // dot(cross(rB, ax), vB)\n // J = [-ax -cross(d+rA, ax) ax cross(rB, ax)]\n\n // Motor rotational constraint\n // Cdot = wB - wA\n // J = [0 0 -1 0 0 1]\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n enableMotor: this.m_enableMotor,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WheelJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WheelJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const pA = bA.getWorldPoint(this.m_localAnchorA); // Vec2\n const pB = bB.getWorldPoint(this.m_localAnchorB); // Vec2\n const d = Vec2.sub(pB, pA); // Vec2\n const axis = bA.getWorldVector(this.m_localXAxisA); // Vec2\n\n const translation = Vec2.dot(d, axis); // float\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const wA = this.m_bodyA.m_angularVelocity;\n const wB = this.m_bodyB.m_angularVelocity;\n return wB - wA;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed, usually in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set/Get the maximum motor force, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Get the current motor torque given the inverse time step, usually in N-m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set/Get the spring frequency in hertz. Setting the frequency to zero disables\n * the spring.\n */\n setSpringFrequencyHz(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getSpringFrequencyHz(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set/Get the spring damping ratio\n */\n setSpringDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getSpringDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA); // Vec2\n\n // Point to line constraint\n {\n this.m_ay = Rot.mulVec2(qA, this.m_localYAxisA);\n this.m_sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ay);\n this.m_sBy = Vec2.crossVec2Vec2(rB, this.m_ay);\n\n this.m_mass = mA + mB + iA * this.m_sAy * this.m_sAy + iB * this.m_sBy\n * this.m_sBy;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n }\n\n // Spring constraint\n this.m_springMass = 0.0;\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n if (this.m_frequencyHz > 0.0) {\n this.m_ax = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_sAx = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ax);\n this.m_sBx = Vec2.crossVec2Vec2(rB, this.m_ax);\n\n const invMass = mA + mB + iA * this.m_sAx * this.m_sAx + iB * this.m_sBx\n * this.m_sBx; // float\n\n if (invMass > 0.0) {\n this.m_springMass = 1.0 / invMass;\n\n const C = Vec2.dot(d, this.m_ax); // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const damp = 2.0 * this.m_springMass * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = this.m_springMass * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (damp + h * k);\n if (this.m_gamma > 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n\n this.m_bias = C * h * k * this.m_gamma;\n\n this.m_springMass = invMass + this.m_gamma;\n if (this.m_springMass > 0.0) {\n this.m_springMass = 1.0 / this.m_springMass;\n }\n }\n } else {\n this.m_springImpulse = 0.0;\n }\n\n // Rotational motor\n if (this.m_enableMotor) {\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n } else {\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse *= step.dtRatio;\n this.m_springImpulse *= step.dtRatio;\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax);\n const LA = this.m_impulse * this.m_sAy + this.m_springImpulse * this.m_sAx + this.m_motorImpulse;\n const LB = this.m_impulse * this.m_sBy + this.m_springImpulse * this.m_sBx + this.m_motorImpulse;\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * LA;\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * LB;\n\n } else {\n this.m_impulse = 0.0;\n this.m_springImpulse = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Solve spring constraint\n {\n const Cdot = Vec2.dot(this.m_ax, vB) - Vec2.dot(this.m_ax, vA) + this.m_sBx\n * wB - this.m_sAx * wA; // float\n const impulse = -this.m_springMass\n * (Cdot + this.m_bias + this.m_gamma * this.m_springImpulse); // float\n this.m_springImpulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ax); // Vec2\n const LA = impulse * this.m_sAx; // float\n const LB = impulse * this.m_sBx; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n // Solve rotational motor constraint\n {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve point to line constraint\n {\n const Cdot = Vec2.dot(this.m_ay, vB) - Vec2.dot(this.m_ay, vA) + this.m_sBy\n * wB - this.m_sAy * wA; // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ay); // Vec2\n const LA = impulse * this.m_sAy; // float\n const LB = impulse * this.m_sBy; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const ay = Rot.mulVec2(qA, this.m_localYAxisA);\n\n const sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), ay); // float\n const sBy = Vec2.crossVec2Vec2(rB, ay); // float\n\n const C = Vec2.dot(d, ay); // float\n\n const k = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_sAy\n * this.m_sAy + this.m_invIB * this.m_sBy * this.m_sBy; // float\n\n let impulse; // float\n if (k != 0.0) {\n impulse = -C / k;\n } else {\n impulse = 0.0;\n }\n\n const P = Vec2.mulNumVec2(impulse, ay); // Vec2\n const LA = impulse * sAy; // float\n const LB = impulse * sBy; // float\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * LA;\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * LB;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) <= Settings.linearSlop;\n }\n\n}\n","// tslint:disable:typedef\nimport World from '../dynamics/World';\nimport Body from '../dynamics/Body';\nimport Joint from '../dynamics/Joint';\nimport Fixture from '../dynamics/Fixture';\nimport Shape from '../collision/Shape';\nimport Vec2 from '../common/Vec2';\nimport Vec3 from '../common/Vec3';\nimport ChainShape from \"../collision/shape/ChainShape\";\nimport BoxShape from \"../collision/shape/BoxShape\";\nimport EdgeShape from \"../collision/shape/EdgeShape\";\nimport PolygonShape from \"../collision/shape/PolygonShape\";\nimport CircleShape from \"../collision/shape/CircleShape\";\nimport DistanceJoint from \"../dynamics/joint/DistanceJoint\";\nimport FrictionJoint from \"../dynamics/joint/FrictionJoint\";\nimport GearJoint from \"../dynamics/joint/GearJoint\";\nimport MotorJoint from \"../dynamics/joint/MotorJoint\";\nimport MouseJoint from \"../dynamics/joint/MouseJoint\";\nimport PrismaticJoint from \"../dynamics/joint/PrismaticJoint\";\nimport PulleyJoint from \"../dynamics/joint/PulleyJoint\";\nimport RevoluteJoint from \"../dynamics/joint/RevoluteJoint\";\nimport RopeJoint from \"../dynamics/joint/RopeJoint\";\nimport WeldJoint from \"../dynamics/joint/WeldJoint\";\nimport WheelJoint from \"../dynamics/joint/WheelJoint\";\n\nlet SID = 0;\n\nfunction Serializer(opts?) {\n opts = opts || {};\n\n const rootClass = opts.rootClass || World;\n\n const preSerialize = opts.preSerialize || function(obj) { return obj; };\n const postSerialize = opts.postSerialize || function(data, obj) { return data; };\n\n const preDeserialize = opts.preDeserialize || function(data) { return data; };\n const postDeserialize = opts.postDeserialize || function(obj, data) { return obj; };\n\n // This is used to create ref objects during serialize\n const refTypes = {\n World,\n Body,\n Joint,\n Fixture,\n Shape,\n };\n\n // This is used by restore to deserialize objects and refs\n const restoreTypes = {\n Vec2,\n Vec3,\n ...refTypes\n };\n\n const CLASS_BY_TYPE_PROP = {\n [Body.STATIC]: Body,\n [Body.DYNAMIC]: Body,\n [Body.KINEMATIC]: Body,\n [ChainShape.TYPE]: ChainShape,\n [BoxShape.TYPE]: BoxShape,\n [EdgeShape.TYPE]: EdgeShape,\n [PolygonShape.TYPE]: PolygonShape,\n [CircleShape.TYPE]: CircleShape,\n [DistanceJoint.TYPE]: DistanceJoint,\n [FrictionJoint.TYPE]: FrictionJoint,\n [GearJoint.TYPE]: GearJoint,\n [MotorJoint.TYPE]: MotorJoint,\n [MouseJoint.TYPE]: MouseJoint,\n [PrismaticJoint.TYPE]: PrismaticJoint,\n [PulleyJoint.TYPE]: PulleyJoint,\n [RevoluteJoint.TYPE]: RevoluteJoint,\n [RopeJoint.TYPE]: RopeJoint,\n [WeldJoint.TYPE]: WeldJoint,\n [WheelJoint.TYPE]: WheelJoint,\n }\n\n this.toJson = function(root) {\n const json = [];\n\n const queue = [root];\n const refMap = {};\n\n function storeRef(value, typeName) {\n value.__sid = value.__sid || ++SID;\n if (!refMap[value.__sid]) {\n queue.push(value);\n const index = json.length + queue.length;\n const ref = {\n refIndex: index,\n refType: typeName\n };\n refMap[value.__sid] = ref;\n }\n return refMap[value.__sid];\n }\n\n function serialize(obj) {\n obj = preSerialize(obj);\n let data = obj._serialize();\n data = postSerialize(data, obj);\n return data;\n }\n\n function toJson(value, top?) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (typeof value._serialize === 'function') {\n if (value !== top) {\n // tslint:disable-next-line:no-for-in\n for (const typeName in refTypes) {\n if (value instanceof refTypes[typeName]) {\n return storeRef(value, typeName);\n }\n }\n }\n value = serialize(value);\n }\n if (Array.isArray(value)) {\n const newValue = [];\n for (let key = 0; key < value.length; key++) {\n newValue[key] = toJson(value[key]);\n }\n value = newValue;\n\n } else {\n const newValue = {};\n // tslint:disable-next-line:no-for-in\n for (const key in value) {\n if (value.hasOwnProperty(key)) {\n newValue[key] = toJson(value[key]);\n }\n }\n value = newValue;\n }\n return value;\n }\n\n while (queue.length) {\n const obj = queue.shift();\n const str = toJson(obj, obj);\n json.push(str);\n }\n\n return json;\n };\n\n this.fromJson = function(json: object) {\n const refMap = {};\n\n function findDeserilizer(data, cls) {\n if (!cls || !cls._deserialize) {\n cls = CLASS_BY_TYPE_PROP[data.type]\n }\n return cls && cls._deserialize;\n }\n\n /**\n * Deserialize a data object.\n */\n function deserialize(cls, data, ctx) {\n const deserializer = findDeserilizer(data, cls);\n if (!deserializer) {\n return;\n }\n data = preDeserialize(data);\n let obj = deserializer(data, ctx, restoreRef);\n obj = postDeserialize(obj, data);\n return obj;\n }\n\n /**\n * Restore a ref object or deserialize a data object.\n *\n * This is passed as callback to class deserializers.\n */\n function restoreRef(cls, ref, ctx) {\n if (!ref.refIndex) {\n return cls && cls._deserialize && deserialize(cls, ref, ctx);\n }\n cls = restoreTypes[ref.refType] || cls;\n const index = ref.refIndex;\n if (!refMap[index]) {\n const data = json[index];\n const obj = deserialize(cls, data, ctx);\n refMap[index] = obj;\n }\n return refMap[index];\n }\n\n const root = rootClass._deserialize(json[0], null, restoreRef);\n\n return root;\n };\n}\n\nconst serializer = new Serializer();\n\nSerializer.toJson = serializer.toJson;\nSerializer.fromJson = serializer.fromJson;\n\nexport default Serializer;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nimport common from '../../util/common';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Contact from '../../dynamics/Contact';\nimport CircleShape from './CircleShape';\nimport Manifold, { ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact);\n\nfunction CircleCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == CircleShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE);\n CollideCircles(manifold, fixtureA.getShape() as CircleShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport function CollideCircles(manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n const pA = Transform.mulVec2(xfA, circleA.m_p);\n const pB = Transform.mulVec2(xfB, circleB.m_p);\n\n const distSqr = Vec2.distanceSquared(pB, pA);\n const rA = circleA.m_radius;\n const rB = circleB.m_radius;\n const radius = rA + rB;\n if (distSqr > radius * radius) {\n return;\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localPoint.setVec2(circleA.m_p);\n manifold.localNormal.setZero();\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Contact from '../../dynamics/Contact';\nimport EdgeShape from './EdgeShape';\nimport ChainShape from './ChainShape';\nimport CircleShape from './CircleShape';\nimport Manifold, { ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, CircleShape.TYPE, EdgeCircleContact);\nContact.addType(ChainShape.TYPE, CircleShape.TYPE, ChainCircleContact);\n\nfunction EdgeCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == EdgeShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const shapeA = fixtureA.getShape() as EdgeShape;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\nfunction ChainCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == ChainShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const chain = fixtureA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n const shapeA = edge;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\n// Compute contact points for edge versus circle.\n// This accounts for edge connectivity.\nexport function CollideEdgeCircle(manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle in frame of edge\n const Q = Transform.mulTVec2(xfA, Transform.mulVec2(xfB, circleB.m_p));\n\n const A = edgeA.m_vertex1;\n const B = edgeA.m_vertex2;\n const e = Vec2.sub(B, A);\n\n // Barycentric coordinates\n const u = Vec2.dot(e, Vec2.sub(B, Q));\n const v = Vec2.dot(e, Vec2.sub(Q, A));\n\n const radius = edgeA.m_radius + circleB.m_radius;\n\n // Region A\n if (v <= 0.0) {\n const P = Vec2.clone(A);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to A?\n if (edgeA.m_hasVertex0) {\n const A1 = edgeA.m_vertex0;\n const B1 = A;\n const e1 = Vec2.sub(B1, A1);\n const u1 = Vec2.dot(e1, Vec2.sub(B1, Q));\n\n // Is the circle in Region AB of the previous edge?\n if (u1 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region B\n if (u <= 0.0) {\n const P = Vec2.clone(B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to B?\n if (edgeA.m_hasVertex3) {\n const B2 = edgeA.m_vertex3;\n const A2 = B;\n const e2 = Vec2.sub(B2, A2);\n const v2 = Vec2.dot(e2, Vec2.sub(Q, A2));\n\n // Is the circle in Region AB of the next edge?\n if (v2 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 1;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region AB\n const den = Vec2.dot(e, e);\n _ASSERT && common.assert(den > 0.0);\n const P = Vec2.combine(u / den, A, v / den, B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n const n = Vec2.neo(-e.y, e.x);\n if (Vec2.dot(n, Vec2.sub(Q, A)) < 0.0) {\n n.setNum(-n.x, -n.y);\n }\n n.normalize();\n\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal = n;\n manifold.localPoint.setVec2(A);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_face;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Transform from '../../common/Transform';\nimport Rot from '../../common/Rot';\nimport Vec2 from '../../common/Vec2';\nimport Settings from '../../Settings';\nimport Manifold, { clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport Contact from '../../dynamics/Contact';\nimport PolygonShape from './PolygonShape';\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, PolygonShape.TYPE, PolygonContact);\n\nfunction PolygonContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == PolygonShape.TYPE);\n CollidePolygons(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as PolygonShape, xfB);\n}\n\ninterface MaxSeparation {\n maxSeparation: number;\n bestIndex: number;\n}\n\n/**\n * Find the max separation between poly1 and poly2 using edge normals from\n * poly1.\n */\nfunction findMaxSeparation(poly1: PolygonShape, xf1: Transform, poly2: PolygonShape, xf2: Transform, output: MaxSeparation): void {\n const count1 = poly1.m_count;\n const count2 = poly2.m_count;\n const n1s = poly1.m_normals;\n const v1s = poly1.m_vertices;\n const v2s = poly2.m_vertices;\n const xf = Transform.mulTXf(xf2, xf1);\n\n let bestIndex = 0;\n let maxSeparation = -Infinity;\n for (let i = 0; i < count1; ++i) {\n // Get poly1 normal in frame2.\n const n = Rot.mulVec2(xf.q, n1s[i]);\n const v1 = Transform.mulVec2(xf, v1s[i]);\n\n // Find deepest point for normal i.\n let si = Infinity;\n for (let j = 0; j < count2; ++j) {\n const sij = Vec2.dot(n, v2s[j]) - Vec2.dot(n, v1);\n if (sij < si) {\n si = sij;\n }\n }\n\n if (si > maxSeparation) {\n maxSeparation = si;\n bestIndex = i;\n }\n }\n\n // used to keep last FindMaxSeparation call values\n output.maxSeparation = maxSeparation;\n output.bestIndex = bestIndex;\n}\n\nfunction findIncidentEdge(c: ClipVertex[], poly1: PolygonShape, xf1: Transform, edge1: number, poly2: PolygonShape, xf2: Transform): void {\n const normals1 = poly1.m_normals;\n\n const count2 = poly2.m_count;\n const vertices2 = poly2.m_vertices;\n const normals2 = poly2.m_normals;\n\n _ASSERT && common.assert(0 <= edge1 && edge1 < poly1.m_count);\n\n // Get the normal of the reference edge in poly2's frame.\n const normal1 = Rot.mulTVec2(xf2.q, Rot.mulVec2(xf1.q, normals1[edge1]));\n\n // Find the incident edge on poly2.\n let index = 0;\n let minDot = Infinity;\n for (let i = 0; i < count2; ++i) {\n const dot = Vec2.dot(normal1, normals2[i]);\n if (dot < minDot) {\n minDot = dot;\n index = i;\n }\n }\n\n // Build the clip vertices for the incident edge.\n const i1 = index;\n const i2 = i1 + 1 < count2 ? i1 + 1 : 0;\n\n c[0].v = Transform.mulVec2(xf2, vertices2[i1]);\n c[0].id.cf.indexA = edge1;\n c[0].id.cf.indexB = i1;\n c[0].id.cf.typeA = ContactFeatureType.e_face;\n c[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n c[1].v = Transform.mulVec2(xf2, vertices2[i2]);\n c[1].id.cf.indexA = edge1;\n c[1].id.cf.indexB = i2;\n c[1].id.cf.typeA = ContactFeatureType.e_face;\n c[1].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n\nconst maxSeparation = {\n maxSeparation: 0,\n bestIndex: 0,\n};\n\n/**\n *\n * Find edge normal of max separation on A - return if separating axis is found
\n * Find edge normal of max separation on B - return if separation axis is found
\n * Choose reference edge as min(minA, minB)
\n * Find incident edge
\n * Clip\n *\n * The normal points from 1 to 2\n */\nexport function CollidePolygons(manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform): void {\n manifold.pointCount = 0;\n const totalRadius = polyA.m_radius + polyB.m_radius;\n\n findMaxSeparation(polyA, xfA, polyB, xfB, maxSeparation);\n const edgeA = maxSeparation.bestIndex;\n const separationA = maxSeparation.maxSeparation;\n if (separationA > totalRadius)\n return;\n\n findMaxSeparation(polyB, xfB, polyA, xfA, maxSeparation);\n const edgeB = maxSeparation.bestIndex;\n const separationB = maxSeparation.maxSeparation;\n if (separationB > totalRadius)\n return;\n\n let poly1; // reference polygon\n let poly2; // incident polygon\n let xf1;\n let xf2;\n let edge1; // reference edge\n let flip;\n const k_tol = 0.1 * Settings.linearSlop;\n\n if (separationB > separationA + k_tol) {\n poly1 = polyB;\n poly2 = polyA;\n xf1 = xfB;\n xf2 = xfA;\n edge1 = edgeB;\n manifold.type = ManifoldType.e_faceB;\n flip = 1;\n } else {\n poly1 = polyA;\n poly2 = polyB;\n xf1 = xfA;\n xf2 = xfB;\n edge1 = edgeA;\n manifold.type = ManifoldType.e_faceA;\n flip = 0;\n }\n\n const incidentEdge = [ new ClipVertex(), new ClipVertex() ];\n findIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);\n\n const count1 = poly1.m_count;\n const vertices1 = poly1.m_vertices;\n\n const iv1 = edge1;\n const iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0;\n\n let v11 = vertices1[iv1];\n let v12 = vertices1[iv2];\n\n const localTangent = Vec2.sub(v12, v11);\n localTangent.normalize();\n\n const localNormal = Vec2.crossVec2Num(localTangent, 1.0);\n const planePoint = Vec2.combine(0.5, v11, 0.5, v12);\n\n const tangent = Rot.mulVec2(xf1.q, localTangent);\n const normal = Vec2.crossVec2Num(tangent, 1.0);\n\n v11 = Transform.mulVec2(xf1, v11);\n v12 = Transform.mulVec2(xf1, v12);\n\n // Face offset.\n const frontOffset = Vec2.dot(normal, v11);\n\n // Side offsets, extended by polytope skin thickness.\n const sideOffset1 = -Vec2.dot(tangent, v11) + totalRadius;\n const sideOffset2 = Vec2.dot(tangent, v12) + totalRadius;\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, incidentEdge, Vec2.neg(tangent), sideOffset1, iv1);\n\n if (np < 2) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2);\n\n if (np < 2) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n manifold.localNormal = localNormal;\n manifold.localPoint = planePoint;\n\n let pointCount = 0;\n for (let i = 0; i < clipPoints2.length/* maxManifoldPoints */; ++i) {\n const separation = Vec2.dot(normal, clipPoints2[i].v) - frontOffset;\n\n if (separation <= totalRadius) {\n const cp = manifold.points[pointCount];\n cp.localPoint.setVec2(Transform.mulTVec2(xf2, clipPoints2[i].v));\n cp.id = clipPoints2[i].id;\n if (flip) {\n // Swap features\n const cf = cp.id.cf;\n const indexA = cf.indexA;\n const indexB = cf.indexB;\n const typeA = cf.typeA;\n const typeB = cf.typeB;\n cf.indexA = indexB;\n cf.indexB = indexA;\n cf.typeA = typeB;\n cf.typeB = typeA;\n }\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Math from '../../common/Math';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Rot from '../../common/Rot';\nimport Settings from '../../Settings';\nimport Contact from '../../dynamics/Contact';\nimport Manifold, { clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport EdgeShape from './EdgeShape';\nimport ChainShape from './ChainShape';\nimport PolygonShape from './PolygonShape';\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, PolygonShape.TYPE, EdgePolygonContact);\nContact.addType(ChainShape.TYPE, PolygonShape.TYPE, ChainPolygonContact);\n\nfunction EdgePolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fA.getType() == EdgeShape.TYPE);\n _ASSERT && common.assert(fB.getType() == PolygonShape.TYPE);\n\n CollideEdgePolygon(manifold, fA.getShape() as EdgeShape, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nfunction ChainPolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fA.getType() == ChainShape.TYPE);\n _ASSERT && common.assert(fB.getType() == PolygonShape.TYPE);\n\n const chain = fA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n CollideEdgePolygon(manifold, edge, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nenum EPAxisType {\n e_unknown = -1,\n e_edgeA = 1,\n e_edgeB = 2,\n}\n\n// unused?\nenum VertexType {\n e_isolated = 0,\n e_concave = 1,\n e_convex = 2,\n}\n\n/**\n * This structure is used to keep track of the best separating axis.\n */\nclass EPAxis {\n type: EPAxisType;\n index: number;\n separation: number;\n}\n\n/**\n * This holds polygon B expressed in frame A.\n */\nclass TempPolygon {\n vertices: Vec2[] = []; // [Settings.maxPolygonVertices]\n normals: Vec2[] = []; // [Settings.maxPolygonVertices];\n count: number = 0;\n}\n\n/**\n * Reference face used for clipping\n */\nclass ReferenceFace {\n i1: number;\n i2: number;\n v1: Vec2;\n v2: Vec2;\n normal: Vec2 = Vec2.zero();\n sideNormal1: Vec2 = Vec2.zero();\n sideOffset1: number;\n sideNormal2: Vec2 = Vec2.zero();\n sideOffset2: number;\n}\n\n// reused\nconst edgeAxis = new EPAxis();\nconst polygonAxis = new EPAxis();\nconst polygonBA = new TempPolygon();\nconst rf = new ReferenceFace();\n\n/**\n * This function collides and edge and a polygon, taking into account edge\n * adjacency.\n */\nexport function CollideEdgePolygon(manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform): void {\n // Algorithm:\n // 1. Classify v1 and v2\n // 2. Classify polygon centroid as front or back\n // 3. Flip normal if necessary\n // 4. Initialize normal range to [-pi, pi] about face normal\n // 5. Adjust normal range according to adjacent edges\n // 6. Visit each separating axes, only accept axes within the range\n // 7. Return if _any_ axis indicates separation\n // 8. Clip\n\n // let m_type1: VertexType;\n // let m_type2: VertexType;\n\n const xf = Transform.mulTXf(xfA, xfB);\n\n const centroidB = Transform.mulVec2(xf, polygonB.m_centroid);\n\n const v0 = edgeA.m_vertex0;\n const v1 = edgeA.m_vertex1;\n const v2 = edgeA.m_vertex2;\n const v3 = edgeA.m_vertex3;\n\n const hasVertex0 = edgeA.m_hasVertex0;\n const hasVertex3 = edgeA.m_hasVertex3;\n\n const edge1 = Vec2.sub(v2, v1);\n edge1.normalize();\n const normal1 = Vec2.neo(edge1.y, -edge1.x);\n const offset1 = Vec2.dot(normal1, Vec2.sub(centroidB, v1));\n let offset0 = 0.0;\n let offset2 = 0.0;\n let convex1 = false;\n let convex2 = false;\n\n let normal0;\n let normal2;\n\n // Is there a preceding edge?\n if (hasVertex0) {\n const edge0 = Vec2.sub(v1, v0);\n edge0.normalize();\n normal0 = Vec2.neo(edge0.y, -edge0.x);\n convex1 = Vec2.crossVec2Vec2(edge0, edge1) >= 0.0;\n offset0 = Vec2.dot(normal0, centroidB) - Vec2.dot(normal0, v0);\n }\n\n // Is there a following edge?\n if (hasVertex3) {\n const edge2 = Vec2.sub(v3, v2);\n edge2.normalize();\n normal2 = Vec2.neo(edge2.y, -edge2.x);\n convex2 = Vec2.crossVec2Vec2(edge1, edge2) > 0.0;\n offset2 = Vec2.dot(normal2, centroidB) - Vec2.dot(normal2, v2);\n }\n\n let front;\n const normal = Vec2.zero();\n const lowerLimit = Vec2.zero();\n const upperLimit = Vec2.zero();\n\n // Determine front or back collision. Determine collision normal limits.\n if (hasVertex0 && hasVertex3) {\n if (convex1 && convex2) {\n front = offset0 >= 0.0 || offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex1) {\n front = offset0 >= 0.0 || (offset1 >= 0.0 && offset2 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex2) {\n front = offset2 >= 0.0 || (offset0 >= 0.0 && offset1 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal0);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex0) {\n if (convex1) {\n front = offset0 >= 0.0 || offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex3) {\n if (convex2) {\n front = offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n }\n } else {\n front = offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setVec2(normal1);\n }\n }\n } else {\n front = offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n }\n }\n\n // Get polygonB in frameA\n polygonBA.count = polygonB.m_count;\n for (let i = 0; i < polygonB.m_count; ++i) {\n polygonBA.vertices[i] = Transform.mulVec2(xf, polygonB.m_vertices[i]);\n polygonBA.normals[i] = Rot.mulVec2(xf.q, polygonB.m_normals[i]);\n }\n\n const radius = 2.0 * Settings.polygonRadius;\n\n manifold.pointCount = 0;\n\n { // ComputeEdgeSeparation\n edgeAxis.type = EPAxisType.e_edgeA;\n edgeAxis.index = front ? 0 : 1;\n edgeAxis.separation = Infinity;\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const s = Vec2.dot(normal, Vec2.sub(polygonBA.vertices[i], v1));\n if (s < edgeAxis.separation) {\n edgeAxis.separation = s;\n }\n }\n }\n\n // If no valid normal can be found than this edge should not collide.\n // @ts-ignore\n if (edgeAxis.type == EPAxisType.e_unknown) {\n return;\n }\n\n if (edgeAxis.separation > radius) {\n return;\n }\n\n { // ComputePolygonSeparation\n polygonAxis.type = EPAxisType.e_unknown;\n polygonAxis.index = -1;\n polygonAxis.separation = -Infinity;\n\n const perp = Vec2.neo(-normal.y, normal.x);\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const n = Vec2.neg(polygonBA.normals[i]);\n\n const s1 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v1));\n const s2 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v2));\n const s = Math.min(s1, s2);\n\n if (s > radius) {\n // No collision\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n break;\n }\n\n // Adjacency\n if (Vec2.dot(n, perp) >= 0.0) {\n if (Vec2.dot(Vec2.sub(n, upperLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n } else {\n if (Vec2.dot(Vec2.sub(n, lowerLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n }\n\n if (s > polygonAxis.separation) {\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n }\n }\n }\n\n if (polygonAxis.type != EPAxisType.e_unknown && polygonAxis.separation > radius) {\n return;\n }\n\n // Use hysteresis for jitter reduction.\n const k_relativeTol = 0.98;\n const k_absoluteTol = 0.001;\n\n let primaryAxis;\n if (polygonAxis.type == EPAxisType.e_unknown) {\n primaryAxis = edgeAxis;\n } else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) {\n primaryAxis = polygonAxis;\n } else {\n primaryAxis = edgeAxis;\n }\n\n const ie = [ new ClipVertex(), new ClipVertex() ];\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.type = ManifoldType.e_faceA;\n\n // Search for the polygon normal that is most anti-parallel to the edge\n // normal.\n let bestIndex = 0;\n let bestValue = Vec2.dot(normal, polygonBA.normals[0]);\n for (let i = 1; i < polygonBA.count; ++i) {\n const value = Vec2.dot(normal, polygonBA.normals[i]);\n if (value < bestValue) {\n bestValue = value;\n bestIndex = i;\n }\n }\n\n const i1 = bestIndex;\n const i2 = i1 + 1 < polygonBA.count ? i1 + 1 : 0;\n\n ie[0].v = polygonBA.vertices[i1];\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = i1;\n ie[0].id.cf.typeA = ContactFeatureType.e_face;\n ie[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n ie[1].v = polygonBA.vertices[i2];\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = i2;\n ie[1].id.cf.typeA = ContactFeatureType.e_face;\n ie[1].id.cf.typeB = ContactFeatureType.e_vertex;\n\n if (front) {\n rf.i1 = 0;\n rf.i2 = 1;\n rf.v1 = v1;\n rf.v2 = v2;\n rf.normal.setVec2(normal1);\n } else {\n rf.i1 = 1;\n rf.i2 = 0;\n rf.v1 = v2;\n rf.v2 = v1;\n rf.normal.setMul(-1, normal1);\n }\n } else {\n manifold.type = ManifoldType.e_faceB;\n\n ie[0].v = v1;\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = primaryAxis.index;\n ie[0].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[0].id.cf.typeB = ContactFeatureType.e_face;\n\n ie[1].v = v2;\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = primaryAxis.index;\n ie[1].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[1].id.cf.typeB = ContactFeatureType.e_face;\n\n rf.i1 = primaryAxis.index;\n rf.i2 = rf.i1 + 1 < polygonBA.count ? rf.i1 + 1 : 0;\n rf.v1 = polygonBA.vertices[rf.i1];\n rf.v2 = polygonBA.vertices[rf.i2];\n rf.normal.setVec2(polygonBA.normals[rf.i1]);\n }\n\n rf.sideNormal1.setNum(rf.normal.y, -rf.normal.x);\n rf.sideNormal2.setMul(-1, rf.sideNormal1);\n rf.sideOffset1 = Vec2.dot(rf.sideNormal1, rf.v1);\n rf.sideOffset2 = Vec2.dot(rf.sideNormal2, rf.v2);\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.localNormal = Vec2.clone(rf.normal);\n manifold.localPoint = Vec2.clone(rf.v1);\n } else {\n manifold.localNormal = Vec2.clone(polygonB.m_normals[rf.i1]);\n manifold.localPoint = Vec2.clone(polygonB.m_vertices[rf.i1]);\n }\n\n let pointCount = 0;\n for (let i = 0; i < Settings.maxManifoldPoints; ++i) {\n const separation = Vec2.dot(rf.normal, Vec2.sub(clipPoints2[i].v, rf.v1));\n\n if (separation <= radius) {\n const cp = manifold.points[pointCount]; // ManifoldPoint\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n cp.localPoint = Transform.mulTVec2(xf, clipPoints2[i].v);\n cp.id = clipPoints2[i].id;\n } else {\n cp.localPoint = clipPoints2[i].v;\n cp.id.cf.typeA = clipPoints2[i].id.cf.typeB;\n cp.id.cf.typeB = clipPoints2[i].id.cf.typeA;\n cp.id.cf.indexA = clipPoints2[i].id.cf.indexB;\n cp.id.cf.indexB = clipPoints2[i].id.cf.indexA;\n }\n\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport common from '../../util/common';\nimport Math from '../../common/Math';\nimport Transform from '../../common/Transform';\nimport Vec2 from '../../common/Vec2';\nimport Contact from '../../dynamics/Contact';\nimport CircleShape from './CircleShape';\nimport PolygonShape from './PolygonShape';\nimport Manifold, { ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport Fixture from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, CircleShape.TYPE, PolygonCircleContact);\n\nfunction PolygonCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && common.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE);\n CollidePolygonCircle(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport function CollidePolygonCircle(manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle position in the frame of the polygon.\n const c = Transform.mulVec2(xfB, circleB.m_p);\n const cLocal = Transform.mulTVec2(xfA, c);\n\n // Find the min separating edge.\n let normalIndex = 0;\n let separation = -Infinity;\n const radius = polygonA.m_radius + circleB.m_radius;\n const vertexCount = polygonA.m_count;\n const vertices = polygonA.m_vertices;\n const normals = polygonA.m_normals;\n\n for (let i = 0; i < vertexCount; ++i) {\n const s = Vec2.dot(normals[i], Vec2.sub(cLocal, vertices[i]));\n\n if (s > radius) {\n // Early out.\n return;\n }\n\n if (s > separation) {\n separation = s;\n normalIndex = i;\n }\n }\n\n // Vertices that subtend the incident face.\n const vertIndex1 = normalIndex;\n const vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0;\n const v1 = vertices[vertIndex1];\n const v2 = vertices[vertIndex2];\n\n // If the center is inside the polygon ...\n if (separation < Math.EPSILON) {\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[normalIndex]);\n manifold.localPoint.setCombine(0.5, v1, 0.5, v2);\n manifold.points[0].localPoint = circleB.m_p;\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Compute barycentric coordinates\n const u1 = Vec2.dot(Vec2.sub(cLocal, v1), Vec2.sub(v2, v1));\n const u2 = Vec2.dot(Vec2.sub(cLocal, v2), Vec2.sub(v1, v2));\n if (u1 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v1) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v1);\n manifold.localNormal.normalize();\n manifold.localPoint = v1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else if (u2 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v2) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v2);\n manifold.localNormal.normalize();\n manifold.localPoint.setVec2(v2);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else {\n const faceCenter = Vec2.mid(v1, v2);\n const separation = Vec2.dot(cLocal, normals[vertIndex1]) - Vec2.dot(faceCenter, normals[vertIndex1]);\n if (separation > radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[vertIndex1]);\n manifold.localPoint.setVec2(faceCenter);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n }\n}\n","export { default as Serializer } from './serializer/index';\n\nexport { default as Math } from './common/Math';\nexport { default as Vec2 } from './common/Vec2';\nexport { default as Vec3 } from './common/Vec3';\nexport { default as Mat22 } from './common/Mat22';\nexport { default as Mat33 } from './common/Mat33';\nexport { default as Transform } from './common/Transform';\nexport { default as Rot } from './common/Rot';\n\nexport { default as AABB } from './collision/AABB';\n\nexport { default as Shape } from './collision/Shape';\nexport { default as Fixture } from './dynamics/Fixture';\nexport { default as Body } from './dynamics/Body';\nexport { default as Contact } from './dynamics/Contact';\nexport { default as Joint } from './dynamics/Joint';\nexport { default as World } from './dynamics/World';\n\nexport { default as Circle } from './collision/shape/CircleShape';\nexport { default as Edge } from './collision/shape/EdgeShape';\nexport { default as Polygon } from './collision/shape/PolygonShape';\nexport { default as Chain } from './collision/shape/ChainShape';\nexport { default as Box } from './collision/shape/BoxShape';\n\nexport { CollideCircles } from './collision/shape/CollideCircle';\nexport { CollideEdgeCircle } from './collision/shape/CollideEdgeCircle';\nexport { CollidePolygons } from './collision/shape/CollidePolygon';\nexport { CollidePolygonCircle } from './collision/shape/CollideCirclePolygone';\nexport { CollideEdgePolygon } from './collision/shape/CollideEdgePolygon';\n\nexport { default as DistanceJoint } from './dynamics/joint/DistanceJoint';\nexport { default as FrictionJoint } from './dynamics/joint/FrictionJoint';\nexport { default as GearJoint } from './dynamics/joint/GearJoint';\nexport { default as MotorJoint } from './dynamics/joint/MotorJoint';\nexport { default as MouseJoint } from './dynamics/joint/MouseJoint';\nexport { default as PrismaticJoint } from './dynamics/joint/PrismaticJoint';\nexport { default as PulleyJoint } from './dynamics/joint/PulleyJoint';\nexport { default as RevoluteJoint } from './dynamics/joint/RevoluteJoint';\nexport { default as RopeJoint } from './dynamics/joint/RopeJoint';\nexport { default as WeldJoint } from './dynamics/joint/WeldJoint';\nexport { default as WheelJoint } from './dynamics/joint/WheelJoint';\n\nexport { default as Settings } from './Settings';\n\nexport { default as Sweep } from './common/Sweep';\nexport { default as Manifold } from './collision/Manifold';\nexport { default as Distance } from './collision/Distance';\nexport { default as TimeOfImpact } from './collision/TimeOfImpact';\nexport { default as DynamicTree } from './collision/DynamicTree';\n\nimport Solver, { TimeStep } from './dynamics/Solver';\nimport { CollidePolygons } from './collision/shape/CollidePolygon';\nimport { default as Settings } from './Settings';\nimport { default as Sweep } from './common/Sweep';\nimport { default as Manifold } from './collision/Manifold';\nimport { default as Distance, DistanceInput, DistanceOutput, DistanceProxy, SimplexCache, testOverlap } from './collision/Distance';\nimport { default as TimeOfImpact, TOIInput, TOIOutput } from './collision/TimeOfImpact';\nimport { default as DynamicTree } from './collision/DynamicTree';\n\nimport { default as stats } from './util/stats'; // todo: what to do with this?\n\nimport { ContactImpulse } from './dynamics/Solver';\ntype _ContactImpulse = InstanceType;\nexport type { _ContactImpulse as ContactImpulse }\n\n/** @deprecated Merged with main namespace */\nexport const internal = {};\n\n// @ts-ignore\ninternal.CollidePolygons = CollidePolygons;\n// @ts-ignore\ninternal.Settings = Settings;\n// @ts-ignore\ninternal.Sweep = Sweep;\n// @ts-ignore\ninternal.Manifold = Manifold;\n// @ts-ignore\ninternal.Distance = Distance;\n// @ts-ignore\ninternal.TimeOfImpact = TimeOfImpact;\n// @ts-ignore\ninternal.DynamicTree = DynamicTree;\n// @ts-ignore\ninternal.stats = stats;\n\n// @ts-ignore\nSolver.TimeStep = TimeStep;\n\n// @ts-ignore\nDistance.testOverlap = testOverlap;\n// @ts-ignore\nDistance.Input = DistanceInput;\n// @ts-ignore\nDistance.Output = DistanceOutput;\n// @ts-ignore\nDistance.Proxy = DistanceProxy;\n// @ts-ignore\nDistance.Cache = SimplexCache;\n\n// @ts-ignore\nTimeOfImpact.Input = TOIInput;\n// @ts-ignore\nTimeOfImpact.Output = TOIOutput;\n"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","__assign","assign","t","s","i","n","arguments","length","apply","input","defaults","output","key","getOwnPropertySymbols","symbols","symbol","propertyIsEnumerable","_i","rest","math","Math","EPSILON","isFinite","x","isNaN","assert","invSqrt","sqrt","nextPowerOfTwo","isPowerOfTwo","mod","num","min","max","clamp","random","ManifoldType","ContactFeatureType","PointState","y","Vec2","data","obj","v","neo","JSON","stringify","o","clone","value","a","w","setCombine","setMul","addCombine","addMul","subCombine","subMul","m","lengthOf","lengthSquared","invLength","dx","dy","combine","mulNumVec2","zero","abs","lengthSqr","lower","upper","AABB","lowerBound","upperBound","setVec2","isValid","sub","lowerA","upperA","lowerB","upperB","lowerX","lowerY","upperX","upperY","setNum","aabb","result","extend","d1x","d2x","d1y","d2y","areEqual","wD","hD","tmin","Infinity","tmax","p1","p2","absD","normal","f","inv_d","t1","t2","temp","setZero","maxFraction","fraction","Settings","linearSlop","maxTranslation","maxRotation","pow","linearSleepTolerance","angularSleepTolerance","PI","opts","_list","_max","_createFn","_outFn","allocate","_inFn","release","_discardFn","discard","Pool","item","shift","_createCount","_outCount","_inCount","push","_discardCount","id","TreeNode","userData","child1","stack","Iterator","iterator","close","m_root","m_nodes","m_lastProxyId","m_pool","DynamicTree","node","parent","child2","height","allocateNode","set","aabbExtension","insertLeaf","removeLeaf","freeNode","contains","aabbMultiplier","leaf","leafAABB","index","isLeaf","area","getPerimeter","combinedAABB","combinedArea","cost","inheritanceCost","cost1","oldArea","cost2","sibling","oldParent","newParent","balance","grandParent","iA","A","B","C","F","G","D","E","rootArea","totalArea","it","iteratorPool","preorder","next","height1","computeHeight","height2","validateStructure","validateMetrics","maxBalance","nodes","count","minCost","iMin","jMin","aabbi","j","aabbj","parent_1","validate","newOrigin","queryCallback","stackPool","pop","testOverlap","rayCastCallback","r","normalize","crossNumVec2","abs_v","segmentAABB","combinePoints","subInput","inputPool","c","getCenter","h","getExtents","dot","root","parents","states","_this","m_tree","query","proxyId","m_queryProxyId","proxyIdA","proxyIdB","userDataA","getUserData","userDataB","m_callback","BroadPhase","aabbA","getFatAABB","aabbB","m_proxyCount","getHeight","getMaxBalance","getAreaRatio","rayCast","shiftOrigin","createProxy","bufferMove","unbufferMove","destroyProxy","displacement","moveProxy","m_moveBuffer","addPairCallback","fatAABB","angle","Rot","setAngle","setRot","setIdentity","rot","sin","cos","atan2","qr","identity","position","rotation","Transform","q","xf","isArray","arr","mul","mulVec2","mulXf","mulRot","add","mulTVec2","mulTXf","px","py","mulTRot","localCenter","alpha0","c0","a0","Sweep","getAngle","beta","alpha","that","Position","Shape","m_type","m_radius","FixtureDefDefault","friction","restitution","density","isSensor","filterGroupIndex","filterCategoryBits","filterMaskBits","fixture","childIndex","body","shape","def","options","m_body","m_friction","m_restitution","m_density","m_isSensor","m_filterGroupIndex","m_filterCategoryBits","m_filterMaskBits","m_shape","m_next","m_proxies","childCount","getChildCount","FixtureProxy","m_userData","Fixture","getBody","broadPhase","m_world","m_broadPhase","destroyProxies","_reset","createProxies","m_xf","resetMassData","restore","getType","sensor","setAwake","testPoint","getTransform","massData","computeMass","proxy","computeAABB","xf1","xf2","aabb1","aabb2","filter","groupIndex","categoryBits","maskBits","refilter","edge","getContactList","contact","fixtureA","getFixtureA","fixtureB","getFixtureB","flagForFiltering","world","getWorld","touchProxy","collideA","collideB","STATIC","KINEMATIC","DYNAMIC","BodyDefDefault","type","linearVelocity","angularVelocity","linearDamping","angularDamping","fixedRotation","bullet","gravityScale","allowSleep","awake","active","m_awakeFlag","m_autoSleepFlag","m_bulletFlag","m_fixedRotationFlag","m_activeFlag","m_islandFlag","m_toiFlag","m_mass","m_invMass","m_I","m_invI","m_sweep","setTransform","c_velocity","Velocity","c_position","m_force","m_torque","m_linearVelocity","m_angularVelocity","m_linearDamping","m_angularDamping","m_gravityScale","m_sleepTime","m_jointList","m_contactList","m_fixtureList","m_prev","m_destroyed","Body","fixtures","_addFixture","isLocked","setType","isWorldLocked","forward","synchronizeFixtures","ce","ce0","destroyContact","proxyCount","flag","synchronize","advance","worldPoint","localPoint","getLinearVelocityFromWorldPoint","getWorldPoint","scale","mass","I","getInertia","center","isStatic","isKinematic","MassData","getMassData","oldCenter","setLocalCenter","force","point","wake","crossVec2Vec2","torque","impulse","jn","other","joint","m_collideConnected","m_newFixture","fixdef","publish","localVector","worldVector","ex","ey","Mat22","det","imx","mx","mx1","mx2","ContactID","ClipVertex","ManifoldPoint","Manifold","wm","xfA","radiusA","xfB","radiusB","pointCount","WorldManifold","points","separations","e_circles","pointA","pointB","dist","cA","cB","mid","e_faceA","localNormal","planePoint","clipPoint","e_faceB","clipSegmentToLine","getPointStates","ContactFeature","cf","indexA","indexB","typeA","typeB","state1","state2","manifold1","manifold2","removeState","persistState","addState","vOut","vIn","offset","vertexIndexA","numOut","distance0","distance1","interp","e_vertex","e_face","gjkCalls","gjkIters","gjkMaxIters","toiTime","toiMaxTime","toiCalls","toiIters","toiMaxIters","toiRootIters","toiMaxRootIters","toString","newline","string","name_1","stats","DistanceProxy","Distance","cache","proxyA","proxyB","transformA","transformB","simplex","Simplex","readCache","vertices","m_v","k_maxIters","maxDistnceIterations","saveA","saveB","saveCount","iter","m_count","solve","getClosestPoint","getSearchDirection","vertex","getSupport","neg","wA","getVertex","wB","duplicate","getWitnessPoints","distance","iterations","writeCache","useRadii","rA","rB","m_buffer","m_vertices","bestIndex","bestValue","computeDistanceProxy","SimplexVertex","m_v1","m_v2","m_v3","wALocal","wBLocal","metric1","metric","metric2","getMetric","e12","crossVec2Num","pA","pB","solve2","solve3","w1","w2","d12_2","d12_1","inv_d12","w3","w1e12","e13","w1e13","d13_1","d13_2","e23","w2e23","d23_1","d23_2","n123","d123_1","d123_2","d123_3","inv_d13","inv_d23","inv_d123","shapeA","shapeB","DistanceInput","SimplexCache","DistanceOutput","mixFriction","friction1","friction2","mixRestitution","restitution1","restitution2","TOIOutputState","s_registers","fA","fB","evaluateFcn","ContactImpulse","m_nodeA","ContactEdge","m_nodeB","m_fixtureA","m_fixtureB","m_indexA","m_indexB","m_evaluateFcn","Contact","step","getShape","bodyA","bodyB","manifold","getManifold","v_invMassA","v_invMassB","v_invIA","v_invIB","v_friction","v_restitution","v_tangentSpeed","m_tangentSpeed","v_pointCount","v_K","v_normalMass","p_invMassA","p_invMassB","p_invIA","p_invIB","p_localCenterA","p_localCenterB","p_radiusA","p_radiusB","p_type","p_localNormal","p_localPoint","p_pointCount","cp","vcp","v_points","VelocityConstraintPoint","warmStarting","normalImpulse","dtRatio","tangentImpulse","normalMass","tangentMass","velocityBias","p_localPoints","m_manifold","worldManifold","getWorldManifold","m_enabledFlag","m_touchingFlag","m_filterFlag","speed","listener","oldManifold","touching","wasTouching","sensorA","sensorB","evaluate","nmp","omp","beginContact","endContact","preSolve","_solvePositionConstraint","toiA","toiB","toi","positionA","positionB","localCenterA","localCenterB","mA","mB","iB","aA","aB","minSeparation","separation","baumgarte","toiBaugarte","maxLinearCorrection","rnA","rnB","K","P","velocityA","velocityB","vA","vB","v_normal","kNormal","tangent","rtA","rtB","kTangent","vRel","velocityThreshold","blockSolve","vcp1","vcp2","rn1A","rn1B","rn2A","rn2B","k11","k22","k12","getInverse","dv","vt","lambda","maxFriction","newImpulse","vn","dv1","dv2","vn1","vn2","P1","P2","type1","type2","callback","getChildIndexA","getChildIndexB","prev","isTouching","JointEdge","m_bodyA","m_bodyB","collideConnected","Joint","isActive","Date","now","time","SeparationFunctionType","TimeOfImpact","timer","Timer","state","e_unknown","tMax","sweepA","sweepB","totalRadius","target","tolerance","k_maxIterations","maxTOIIterations","distanceInput","distanceOutput","e_overlapped","e_touching","fcn","SeparationFunction","initialize","done","pushBackIter","s2","findMinSeparation","e_separated","s1","e_failed","rootIterCount","a1","a2","maxPolygonVertices","m_proxyA","m_proxyB","m_sweepA","m_sweepB","e_points","localPointA","localPointB","m_axis","localPointB1","localPointB2","m_localPoint","localPointA1","localPointA2","find","axisA","axisB","compute","TimeStep","dt","inv_dt0","inv_dt","s_subStep","normals","tangents","m_stack","m_bodies","m_contacts","m_joints","Solver","m_bodyList","seed","isAwake","clear","addBody","isEnabled","addContact","je","addJoint","solveIsland","gravity","m_gravity","m_allowSleep","isDynamic","initConstraint","initVelocityConstraint","warmStartConstraint","initVelocityConstraints","velocityIterations","solveVelocityConstraints","solveVelocityConstraint","storeConstraintImpulses","translation","maxTranslationSquared","ratio","maxRotationSquared","positionSolved","positionIterations","solvePositionConstraint","contactsOkay","jointsOkay","jointOkay","solvePositionConstraints","synchronizeTransform","postSolveIsland","minSleepTime","linTolSqr","linearSleepToleranceSqr","angTolSqr","angularSleepToleranceSqr","timeToSleep","tag","common","m_stepComplete","m_toiCount","m_toi","minContact","minAlpha","maxSubSteps","fA_1","fB_1","bA_1","bB_1","activeA","activeB","isBullet","TOIInput","TOIOutput","bA","bB","backup1","backup2","update","bodies","backup","reset","solveIslandTOI","findNewContacts","m_subStepping","setEnabled","subStep","solvePositionConstraintTOI","postSolve","m_impulse","WorldDefDefault","continuousPhysics","subStepping","shouldCollide","m_contactCount","World","m_solver","m_bodyCount","m_jointCount","m_clearForces","m_locked","m_warmStarting","m_continuousPhysics","m_blockSolve","m_velocityIterations","m_positionIterations","m_t","joints","getBodyList","getNext","getJointList","_serialize","context","_addBody","createJoint","point1","point2","getProxyCount","getTreeHeight","getTreeBalance","getTreeQuality","arg1","arg2","createBody","je0","destroyJoint","f0","m_edgeA","m_edgeB","timeStep","s_step","updateContacts","solveWorld","solveWorldTOI","clearForces","updatePairs","createContact","next_c","destroy","name","_listeners","listeners","indexOf","splice","arg3","l","z","Vec3","v1","v2","EdgeShape","_super","TYPE","polygonRadius","m_vertex1","m_vertex2","m_vertex0","m_vertex3","m_hasVertex0","m_hasVertex3","vertex1","vertex2","vertex0","vertex3","hasVertex0","hasVertex3","setPrevVertex","setNextVertex","e","numerator","denominator","rr","loop","ChainShape","m_prevVertex","m_nextVertex","m_hasPrevVertex","m_hasNextVertex","m_isLoop","_createLoop","_createChain","isLoop","hasPrevVertex","hasNextVertex","prevVertex","nextVertex","PolygonShape","m_centroid","m_normals","_set","_setAsBox","ps","unique","distanceSquared","linearSlopSquared","i0","x0","hull","ih","ie","i1","i2","vs","pRef","inv3","p3","e1","e2","triangleArea","ComputeCentroid","hx","hy","pLocal","minX","minY","maxX","maxY","k_inv3","ex1","ey1","ex2","ey2","BoxShape","CircleShape","m_p","radius","sigma","DEFAULTS","frequencyHz","dampingRatio","anchorA","anchorB","DistanceJoint","m_localAnchorA","getLocalPoint","localAnchorA","m_localAnchorB","localAnchorB","m_length","m_frequencyHz","m_dampingRatio","m_gamma","m_bias","gamma","bias","hz","m_u","m_localCenterA","m_localCenterB","m_invMassA","m_invMassB","m_invIA","m_invIB","qA","qB","m_rA","m_rB","crAu","crBu","invMass","omega","k","vpA","vpB","Cdot","mulSub","u","maxForce","maxTorque","anchor","FrictionJoint","m_linearImpulse","m_angularImpulse","m_maxForce","m_maxTorque","m_linearMass","m_angularMass","oldImpulse","maxImpulse","ez","Mat33","cross","a11","a12","a21","a22","M","a13","a23","a33","lowerAngle","upperAngle","maxMotorTorque","motorSpeed","enableLimit","enableMotor","RevoluteJoint","m_referenceAngle","referenceAngle","m_motorImpulse","m_lowerAngle","m_upperAngle","m_maxMotorTorque","m_motorSpeed","m_enableLimit","m_enableMotor","m_motorMass","jointAngle","angularSlop","m_limitState","Cdot1","Cdot2","solve33","rhs","reduced","solve22","positionError","angularError","limitImpulse","maxAngularCorrection","lowerTranslation","upperTranslation","maxMotorForce","axis","PrismaticJoint","m_localXAxisA","getLocalVector","localAxisA","m_localYAxisA","m_lowerTranslation","m_upperTranslation","m_maxMotorForce","m_perp","m_K","getWorldVector","addCrossNumVec2","m_a1","m_a2","m_s1","m_s2","k13","k23","k33","jointTranslation","LA","LB","f1","df","f2r","perp","C1","linearError","C2","impulse1","joint1","joint2","coordinateA","coordinateB","GearJoint","m_joint1","m_joint2","m_ratio","m_type1","m_type2","m_bodyC","getBodyA","getBodyB","xfC","aC","revolute","m_localAnchorC","m_referenceAngleA","m_localAxisC","prismatic","pC","m_bodyD","xfD","aD","m_localAnchorD","m_referenceAngleB","m_localAxisD","pD","m_constant","m_JvAC","m_JwA","m_lcA","m_lcB","m_lcC","m_lcD","m_mA","m_mB","m_mC","m_mD","m_iA","m_iB","m_iC","m_iD","vC","wC","vD","qC","qD","m_JwC","rC","m_JvBD","m_JwB","m_JwD","rD","JvAC","JvBD","JwA","JwB","JwC","JwD","cC","cD","correctionFactor","MotorJoint","m_linearOffset","linearOffset","getPosition","m_angularOffset","angularOffset","m_correctionFactor","factor","m_linearError","m_angularError","inv_h","MouseJoint","m_targetA","m_beta","m_C","_localAnchorB","velocity","getMass","groundA","groundB","PulleyJoint","m_groundAnchorA","groundAnchorA","m_groundAnchorB","groundAnchorB","m_lengthA","lengthA","m_lengthB","lengthB","m_uB","m_uA","ruA","ruB","PA","PB","uA","uB","maxLength","RopeJoint","m_maxLength","m_state","crA","crB","WeldJoint","getInverse22","invM","getSymInverse33","impulse2","mulVec3","WheelJoint","localAxis","m_springMass","m_springImpulse","m_ay","m_ax","m_sAy","m_sBy","m_sAx","m_sBx","damp","ay","sAy","sBy","SID","Serializer","rootClass","preSerialize","postSerialize","preDeserialize","postDeserialize","refTypes","restoreTypes","CLASS_BY_TYPE_PROP","_a","toJson","json","queue","refMap","storeRef","typeName","__sid","ref","refIndex","refType","top","serialize","newValue","str","fromJson","deserialize","cls","ctx","deserializer","_deserialize","findDeserilizer","restoreRef","serializer","CollideCircles","circleA","circleB","distSqr","CollideEdgeCircle","edgeA","Q","P_1","d_1","A1","B1","P_2","d_2","B2","A2","den","findMaxSeparation","poly1","poly2","count1","count2","n1s","v1s","v2s","maxSeparation","si","sij","addType","chain","getChildEdge","CollidePolygons","EPAxisType","VertexType","polyA","polyB","separationA","edgeB","separationB","edge1","flip","incidentEdge","normals1","vertices2","normals2","normal1","minDot","findIncidentEdge","vertices1","iv1","iv2","v11","v12","localTangent","frontOffset","sideOffset1","sideOffset2","clipPoints1","clipPoints2","CollidePolygonCircle","polygonA","cLocal","normalIndex","vertexCount","vertIndex1","vertIndex2","u1","u2","faceCenter","CollideEdgePolygon","edgeAxis","EPAxis","polygonAxis","polygonBA","TempPolygon","rf","ReferenceFace","polygonB","centroidB","v0","v3","normal0","normal2","front","offset1","offset0","offset2","convex1","convex2","edge0","edge2","lowerLimit","upperLimit","e_edgeA","e_edgeB","primaryAxis","sideNormal1","sideNormal2","maxManifoldPoints","internal","Input","Output","Proxy","Cache"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"planck.min.js","sources":["../node_modules/tslib/tslib.es6.js","../src/util/options.ts","../src/common/Math.ts","../src/common/Vec2.ts","../src/collision/AABB.ts","../src/Settings.ts","../src/util/Pool.ts","../src/collision/DynamicTree.ts","../src/collision/BroadPhase.ts","../src/common/Rot.ts","../src/common/Transform.ts","../src/common/Sweep.ts","../src/dynamics/Velocity.ts","../src/dynamics/Position.ts","../src/collision/Shape.ts","../src/dynamics/Fixture.ts","../src/dynamics/Body.ts","../src/dynamics/Joint.ts","../src/util/stats.ts","../src/util/Timer.ts","../src/collision/Distance.ts","../src/collision/TimeOfImpact.ts","../src/dynamics/Solver.ts","../src/common/Mat22.ts","../src/collision/Manifold.ts","../src/dynamics/Contact.ts","../src/dynamics/World.ts","../src/common/Vec3.ts","../src/collision/shape/EdgeShape.ts","../src/collision/shape/ChainShape.ts","../src/collision/shape/PolygonShape.ts","../src/collision/shape/BoxShape.ts","../src/collision/shape/CircleShape.ts","../src/dynamics/joint/DistanceJoint.ts","../src/dynamics/joint/FrictionJoint.ts","../src/common/Mat33.ts","../src/dynamics/joint/RevoluteJoint.ts","../src/dynamics/joint/PrismaticJoint.ts","../src/dynamics/joint/GearJoint.ts","../src/dynamics/joint/MotorJoint.ts","../src/dynamics/joint/MouseJoint.ts","../src/dynamics/joint/PulleyJoint.ts","../src/dynamics/joint/RopeJoint.ts","../src/dynamics/joint/WeldJoint.ts","../src/dynamics/joint/WheelJoint.ts","../src/serializer/index.ts","../src/collision/shape/CollideCircle.ts","../src/collision/shape/CollideEdgeCircle.ts","../src/collision/shape/CollidePolygon.ts","../src/collision/shape/CollideCirclePolygon.ts","../src/collision/shape/CollideEdgePolygon.ts","../src/index.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","export const options = function(input: T, defaults: object): T {\n if (input === null || typeof input === 'undefined') {\n // tslint:disable-next-line:no-object-literal-type-assertion\n input = {} as T;\n }\n\n const output = {...input};\n\n // tslint:disable-next-line:no-for-in\n for (const key in defaults) {\n if (defaults.hasOwnProperty(key) && typeof input[key] === 'undefined') {\n output[key] = defaults[key];\n }\n }\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n const symbols = Object.getOwnPropertySymbols(defaults);\n for (let i = 0; i < symbols.length; i++) {\n const symbol = symbols[i];\n if (defaults.propertyIsEnumerable(symbol) && typeof input[symbol] === 'undefined') {\n output[symbol] = defaults[symbol];\n }\n }\n }\n\n return output;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\nexport const math = Object.assign(Object.create(Math) as typeof Math, {\n EPSILON: 1e-9, // TODO\n\n /**\n * This function is used to ensure that a floating point number is not a NaN or\n * infinity.\n */\n isFinite: function(x: unknown): boolean {\n return (typeof x === 'number') && isFinite(x) && !isNaN(x);\n },\n\n assert: function(x: any): void {\n _ASSERT && console.assert(!math.isFinite(x), 'Invalid Number!', x);\n },\n\n /**\n * Next Largest Power of 2 Given a binary integer value x, the next largest\n * power of 2 can be computed by a SWAR algorithm that recursively \"folds\" the\n * upper bits into the lower bits. This process yields a bit vector with the\n * same most significant 1 as x, but all 1's below it. Adding 1 to that value\n * yields the next largest power of 2. For a 32-bit value:\n */\n nextPowerOfTwo: function(x: number): number {\n // TODO\n x |= (x >> 1);\n x |= (x >> 2);\n x |= (x >> 4);\n x |= (x >> 8);\n x |= (x >> 16);\n return x + 1;\n },\n\n isPowerOfTwo: function(x: number): boolean {\n return x > 0 && (x & (x - 1)) === 0;\n },\n\n mod: function(num: number, min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n if (max > min) {\n num = (num - min) % (max - min);\n return num + (num < 0 ? max : min);\n } else {\n num = (num - max) % (min - max);\n return num + (num <= 0 ? min : max);\n }\n },\n /**\n * Returns a min if num is less than min, and max if more than max, otherwise returns num.\n */\n clamp: function(num: number, min: number, max: number): number {\n if (num < min) {\n return min;\n } else if (num > max) {\n return max;\n } else {\n return num;\n }\n },\n /**\n * Returns a random number between min and max when two arguments are provided.\n * If one arg is provided between 0 to max.\n * If one arg is passed between 0 to 1.\n */\n random: function(min?: number, max?: number): number {\n if (typeof min === 'undefined') {\n max = 1;\n min = 0;\n } else if (typeof max === 'undefined') {\n max = min;\n min = 0;\n }\n return min === max ? min : Math.random() * (max - min) + min;\n }\n});\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport interface Vec2Value {\n x: number;\n y: number;\n}\n\nexport class Vec2 {\n x: number;\n y: number;\n\n constructor(x: number, y: number);\n constructor(obj: { x: number, y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Vec2)) {\n return new Vec2(x, y);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n } else {\n this.x = x;\n this.y = y;\n }\n _ASSERT && Vec2.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = data.x;\n obj.y = data.y;\n return obj;\n }\n\n static zero(): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = 0;\n obj.y = 0;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number): Vec2 {\n const obj = Object.create(Vec2.prototype);\n obj.x = x;\n obj.y = y;\n return obj;\n }\n\n static clone(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(v.x, v.y);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Vec2.isValid(o), 'Invalid Vec2!', o);\n }\n\n clone(): Vec2 {\n return Vec2.clone(this);\n }\n\n /**\n * Set this vector to all zeros.\n *\n * @returns this\n */\n setZero(): Vec2 {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n set(x: number, y: number): Vec2;\n set(value: Vec2Value): Vec2;\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n // tslint:disable-next-line:typedef\n set(x, y?) {\n if (typeof x === 'object') {\n _ASSERT && Vec2.assert(x);\n this.x = x.x;\n this.y = x.y;\n } else {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n }\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setNum(x: number, y: number) {\n _ASSERT && Math.assert(x);\n _ASSERT && Math.assert(y);\n this.x = x;\n this.y = y;\n\n return this;\n }\n\n /**\n * Set this vector to some specified coordinates.\n *\n * @returns this\n */\n setVec2(value: Vec2Value) {\n _ASSERT && Vec2.assert(value);\n this.x = value.x;\n this.y = value.y;\n\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use setCombine or setMul\n */\n wSet(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.setCombine(a, v, b, w);\n } else {\n return this.setMul(a, v);\n }\n }\n\n /**\n * Set linear combination of v and w: `a * v + b * w`\n */\n setCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x = x;\n this.y = y;\n return this;\n }\n\n setMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x = x;\n this.y = y;\n return this;\n }\n\n /**\n * Add a vector to this vector.\n *\n * @returns this\n */\n add(w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x += w.x;\n this.y += w.y;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Use addCombine or addMul\n */\n wAdd(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.addCombine(a, v, b, w);\n } else {\n return this.addMul(a, v);\n }\n }\n\n /**\n * Add linear combination of v and w: `a * v + b * w`\n */\n addCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x += x;\n this.y += y;\n return this;\n }\n\n addMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x += x;\n this.y += y;\n return this;\n }\n\n /**\n * @deprecated Use subCombine or subMul\n */\n wSub(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return this.subCombine(a, v, b, w);\n } else {\n return this.subMul(a, v);\n }}\n\n /**\n * Subtract linear combination of v and w: `a * v + b * w`\n */\n subCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(b);\n _ASSERT && Vec2.assert(w);\n const x = a * v.x + b * w.x;\n const y = a * v.y + b * w.y;\n\n // `this` may be `w`\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n subMul(a: number, v: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(v);\n const x = a * v.x;\n const y = a * v.y;\n\n this.x -= x;\n this.y -= y;\n return this;\n }\n\n /**\n * Subtract a vector from this vector\n *\n * @returns this\n */\n sub(w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(w);\n this.x -= w.x;\n this.y -= w.y;\n return this;\n }\n\n /**\n * Multiply this vector by a scalar.\n *\n * @returns this\n */\n mul(m: number): Vec2 {\n _ASSERT && Math.assert(m);\n this.x *= m;\n this.y *= m;\n return this;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n length(): number {\n return Vec2.lengthOf(this);\n }\n\n /**\n * Get the length squared.\n */\n lengthSquared(): number {\n return Vec2.lengthSquared(this);\n }\n\n /**\n * Convert this vector into a unit vector.\n *\n * @returns old length\n */\n normalize(): number {\n const length = this.length();\n if (length < Math.EPSILON) {\n return 0.0;\n }\n const invLength = 1.0 / length;\n this.x *= invLength;\n this.y *= invLength;\n return length;\n }\n\n /**\n * Get the length of this vector (the norm).\n *\n * For performance, use this instead of lengthSquared (if possible).\n */\n static lengthOf(v: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n return Math.sqrt(v.x * v.x + v.y * v.y);\n }\n\n /**\n * Get the length squared.\n */\n static lengthSquared(v: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n return v.x * v.x + v.y * v.y;\n }\n\n static distance(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n static distanceSquared(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n const dx = v.x - w.x;\n const dy = v.y - w.y;\n return dx * dx + dy * dy;\n }\n\n static areEqual(v: Vec2Value, w: Vec2Value): boolean {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v === w || typeof w === 'object' && w !== null && v.x === w.x && v.y === w.y;\n }\n\n /**\n * Get the skew vector such that dot(skew_vec, other) == cross(vec, other)\n */\n static skew(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.y, v.x);\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.x + v.y * w.y;\n }\n\n static cross(v: Vec2Value, w: Vec2Value): number;\n static cross(v: Vec2Value, w: number): Vec2;\n static cross(v: number, w: Vec2Value): Vec2;\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n *\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n // tslint:disable-next-line:typedef\n static cross(v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n\n } else {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static crossVec2Vec2(v: Vec2Value, w: Vec2Value): number {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return v.x * w.y - v.y * w.x;\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossVec2Num(v: Vec2Value, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y, -w * v.x);\n }\n\n /**\n * Perform the cross product on a vector and a scalar. In 2D this produces a\n * vector.\n */\n static crossNumVec2(v: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y, v * w.x);\n }\n\n static addCross(a: Vec2Value, v: Vec2Value, w: number): Vec2;\n static addCross(a: Vec2Value, v: number, w: Vec2Value): Vec2;\n /**\n * Returns `a + (v x w)`\n */\n // tslint:disable-next-line:typedef\n static addCross(a, v, w) {\n if (typeof w === 'number') {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n\n } else if (typeof v === 'number') {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n _ASSERT && console.assert(false);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossVec2Num(a: Vec2Value, v: Vec2Value, w: number): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Math.assert(w);\n return Vec2.neo(w * v.y + a.x, -w * v.x + a.y);\n }\n\n /**\n * Returns `a + (v x w)`\n */\n static addCrossNumVec2(a: Vec2Value, v: number, w: Vec2Value): Vec2 {\n _ASSERT && Math.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(-v * w.y + a.x, v * w.x + a.y);\n }\n\n static add(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x + w.x, v.y + w.y);\n }\n\n /** @internal @deprecated */\n static wAdd(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n if (typeof b !== 'undefined' || typeof w !== 'undefined') {\n return Vec2.combine(a, v, b, w);\n } else {\n return Vec2.mulNumVec2(a, v);\n }\n }\n\n static combine(a: number, v: Vec2, b: number, w: Vec2): Vec2 {\n return Vec2.zero().setCombine(a, v, b, w);\n }\n\n static sub(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(v.x - w.x, v.y - w.y);\n }\n\n static mul(a: Vec2Value, b: number): Vec2;\n static mul(a: number, b: Vec2Value): Vec2;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (typeof a === 'object') {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n\n } else if (typeof b === 'object') {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n }\n\n static mulVec2Num(a: Vec2Value, b: number): Vec2 {\n _ASSERT && Vec2.assert(a);\n _ASSERT && Math.assert(b);\n return Vec2.neo(a.x * b, a.y * b);\n }\n\n static mulNumVec2(a: number, b: Vec2Value): Vec2 {\n _ASSERT && Math.assert(a);\n _ASSERT && Vec2.assert(b);\n return Vec2.neo(a * b.x, a * b.y);\n }\n\n neg(): Vec2 {\n this.x = -this.x;\n this.y = -this.y;\n return this;\n }\n\n static neg(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(-v.x, -v.y);\n }\n\n static abs(v: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Math.abs(v.x), Math.abs(v.y));\n }\n\n static mid(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo((v.x + w.x) * 0.5, (v.y + w.y) * 0.5);\n }\n\n static upper(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.max(v.x, w.x), Math.max(v.y, w.y));\n }\n\n static lower(v: Vec2Value, w: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(v);\n _ASSERT && Vec2.assert(w);\n return Vec2.neo(Math.min(v.x, w.x), Math.min(v.y, w.y));\n }\n\n clamp(max: number): Vec2 {\n const lengthSqr = this.x * this.x + this.y * this.y;\n if (lengthSqr > max * max) {\n const scale = max / Math.sqrt(lengthSqr);\n this.x *= scale;\n this.y *= scale;\n }\n return this;\n }\n\n static clamp(v: Vec2Value, max: number): Vec2 {\n const r = Vec2.neo(v.x, v.y);\n r.clamp(max);\n return r;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static scaleFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x * x, v.y * y);\n };\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static translateFn(x: number, y: number) {\n return function(v: Vec2): Vec2 {\n return Vec2.neo(v.x + x, v.y + y);\n };\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../common/Math';\nimport { Vec2, Vec2Value } from '../common/Vec2';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n */\nexport interface RayCastInput {\n p1: Vec2;\n p2: Vec2;\n maxFraction: number;\n}\n\nexport type RayCastCallback = (subInput: RayCastInput, id: number) => number;\n\n/**\n * Ray-cast output data. The ray hits at `p1 + fraction * (p2 - p1)`,\n * where `p1` and `p2` come from RayCastInput.\n */\nexport interface RayCastOutput {\n normal: Vec2;\n fraction: number;\n}\n\nexport class AABB {\n lowerBound: Vec2;\n upperBound: Vec2;\n\n constructor(lower?: Vec2Value, upper?: Vec2Value) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof AABB)) {\n return new AABB(lower, upper);\n }\n\n this.lowerBound = Vec2.zero();\n this.upperBound = Vec2.zero();\n\n if (typeof lower === 'object') {\n this.lowerBound.setVec2(lower);\n }\n if (typeof upper === 'object') {\n this.upperBound.setVec2(upper);\n } else if (typeof lower === 'object') {\n this.upperBound.setVec2(lower);\n }\n }\n\n /**\n * Verify that the bounds are sorted.\n */\n isValid(): boolean {\n return AABB.isValid(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.lowerBound) && Vec2.isValid(obj.upperBound) && Vec2.sub(obj.upperBound, obj.lowerBound).lengthSquared() >= 0;\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!AABB.isValid(o), 'Invalid AABB!', o);\n }\n\n /**\n * Get the center of the AABB.\n */\n getCenter(): Vec2 {\n return Vec2.neo((this.lowerBound.x + this.upperBound.x) * 0.5, (this.lowerBound.y + this.upperBound.y) * 0.5);\n }\n\n /**\n * Get the extents of the AABB (half-widths).\n */\n getExtents(): Vec2 {\n return Vec2.neo((this.upperBound.x - this.lowerBound.x) * 0.5, (this.upperBound.y - this.lowerBound.y) * 0.5);\n }\n\n /**\n * Get the perimeter length.\n */\n getPerimeter(): number {\n return 2.0 * (this.upperBound.x - this.lowerBound.x + this.upperBound.y - this.lowerBound.y);\n }\n\n /**\n * Combine one or two AABB into this one.\n */\n combine(a: AABB, b?: AABB): void {\n b = b || this;\n\n const lowerA = a.lowerBound;\n const upperA = a.upperBound;\n const lowerB = b.lowerBound;\n const upperB = b.upperBound;\n\n const lowerX = Math.min(lowerA.x, lowerB.x);\n const lowerY = Math.min(lowerA.y, lowerB.y);\n const upperX = Math.max(upperB.x, upperA.x);\n const upperY = Math.max(upperB.y, upperA.y);\n\n this.lowerBound.setNum(lowerX, lowerY);\n this.upperBound.setNum(upperX, upperY);\n }\n\n combinePoints(a: Vec2Value, b: Vec2Value): void {\n this.lowerBound.setNum(Math.min(a.x, b.x), Math.min(a.y, b.y));\n this.upperBound.setNum(Math.max(a.x, b.x), Math.max(a.y, b.y));\n }\n\n set(aabb: AABB): void {\n this.lowerBound.setNum(aabb.lowerBound.x, aabb.lowerBound.y);\n this.upperBound.setNum(aabb.upperBound.x, aabb.upperBound.y);\n }\n\n contains(aabb: AABB): boolean {\n let result = true;\n result = result && this.lowerBound.x <= aabb.lowerBound.x;\n result = result && this.lowerBound.y <= aabb.lowerBound.y;\n result = result && aabb.upperBound.x <= this.upperBound.x;\n result = result && aabb.upperBound.y <= this.upperBound.y;\n return result;\n }\n\n extend(value: number): AABB {\n AABB.extend(this, value);\n return this;\n }\n\n static extend(aabb: AABB, value: number): void {\n aabb.lowerBound.x -= value;\n aabb.lowerBound.y -= value;\n aabb.upperBound.x += value;\n aabb.upperBound.y += value;\n }\n\n static testOverlap(a: AABB, b: AABB): boolean {\n const d1x = b.lowerBound.x - a.upperBound.x;\n const d2x = a.lowerBound.x - b.upperBound.x;\n\n const d1y = b.lowerBound.y - a.upperBound.y;\n const d2y = a.lowerBound.y - b.upperBound.y;\n\n if (d1x > 0 || d1y > 0 || d2x > 0 || d2y > 0) {\n return false;\n }\n return true;\n }\n\n static areEqual(a: AABB, b: AABB): boolean {\n return Vec2.areEqual(a.lowerBound, b.lowerBound) && Vec2.areEqual(a.upperBound, b.upperBound);\n }\n\n static diff(a: AABB, b: AABB): number {\n const wD = Math.max(0, Math.min(a.upperBound.x, b.upperBound.x) - Math.max(b.lowerBound.x, a.lowerBound.x));\n const hD = Math.max(0, Math.min(a.upperBound.y, b.upperBound.y) - Math.max(b.lowerBound.y, a.lowerBound.y));\n\n const wA = a.upperBound.x - a.lowerBound.x;\n const hA = a.upperBound.y - a.lowerBound.y;\n\n const wB = b.upperBound.x - b.lowerBound.x;\n const hB = b.upperBound.y - b.lowerBound.y;\n\n return wA * hA + wB * hB - wD * hD;\n }\n\n rayCast(output: RayCastOutput, input: RayCastInput): boolean {\n // From Real-time Collision Detection, p179.\n\n let tmin = -Infinity;\n let tmax = Infinity;\n\n const p = input.p1;\n const d = Vec2.sub(input.p2, input.p1);\n const absD = Vec2.abs(d);\n\n const normal = Vec2.zero();\n\n for (let f: 'x' | 'y' = 'x'; f !== null; f = (f === 'x' ? 'y' : null)) {\n if (absD.x < Math.EPSILON) {\n // Parallel.\n if (p[f] < this.lowerBound[f] || this.upperBound[f] < p[f]) {\n return false;\n }\n } else {\n const inv_d = 1.0 / d[f];\n let t1 = (this.lowerBound[f] - p[f]) * inv_d;\n let t2 = (this.upperBound[f] - p[f]) * inv_d;\n\n // Sign of the normal vector.\n let s = -1.0;\n\n if (t1 > t2) {\n const temp = t1;\n t1 = t2;\n t2 = temp;\n s = 1.0;\n }\n\n // Push the min up\n if (t1 > tmin) {\n normal.setZero();\n normal[f] = s;\n tmin = t1;\n }\n\n // Pull the max down\n tmax = Math.min(tmax, t2);\n\n if (tmin > tmax) {\n return false;\n }\n }\n }\n\n // Does the ray start inside the box?\n // Does the ray intersect beyond the max fraction?\n if (tmin < 0.0 || input.maxFraction < tmin) {\n return false;\n }\n\n // Intersection.\n output.fraction = tmin;\n output.normal = normal;\n return true;\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n// TODO merge with World options?\n\n/**\n * Tuning constants based on meters-kilograms-seconds (MKS) units.\n */\n// tslint:disable-next-line:no-unnecessary-class\nexport class Settings {\n // Collision\n /**\n * The maximum number of contact points between two convex shapes. Do not change\n * this value.\n */\n static maxManifoldPoints: number = 2;\n\n /**\n * The maximum number of vertices on a convex polygon. You cannot increase this\n * too much because BlockAllocator has a maximum object size.\n */\n static maxPolygonVertices: number = 12;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This allows proxies to move\n * by a small amount without triggering a tree adjustment. This is in meters.\n */\n static aabbExtension: number = 0.1;\n\n /**\n * This is used to fatten AABBs in the dynamic tree. This is used to predict the\n * future position based on the current displacement. This is a dimensionless\n * multiplier.\n */\n static aabbMultiplier: number = 2.0;\n\n /**\n * A small length used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static linearSlop: number = 0.005;\n static get linearSlopSquared(): number { return Settings.linearSlop * Settings.linearSlop; }\n\n /**\n * A small angle used as a collision and constraint tolerance. Usually it is\n * chosen to be numerically significant, but visually insignificant.\n */\n static angularSlop: number = (2.0 / 180.0 * Math.PI);\n\n /**\n * The radius of the polygon/edge shape skin. This should not be modified.\n * Making this smaller means polygons will have an insufficient buffer for\n * continuous collision. Making it larger may create artifacts for vertex\n * collision.\n */\n static get polygonRadius(): number { return 2.0 * Settings.linearSlop; }\n\n /**\n * Maximum number of sub-steps per contact in continuous physics simulation.\n */\n static maxSubSteps: number = 8;\n\n// Dynamics\n\n /**\n * Maximum number of contacts to be handled to solve a TOI impact.\n */\n static maxTOIContacts: number = 32;\n\n /**\n * Maximum iterations to solve a TOI.\n */\n static maxTOIIterations: number = 20;\n\n /**\n * Maximum iterations to find Distance.\n */\n static maxDistnceIterations: number = 20;\n\n /**\n * A velocity threshold for elastic collisions. Any collision with a relative\n * linear velocity below this threshold will be treated as inelastic.\n */\n static velocityThreshold: number = 1.0;\n\n /**\n * The maximum linear position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxLinearCorrection: number = 0.2;\n\n /**\n * The maximum angular position correction used when solving constraints. This\n * helps to prevent overshoot.\n */\n static maxAngularCorrection: number = (8.0 / 180.0 * Math.PI);\n\n /**\n * The maximum linear velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxTranslation: number = 2.0;\n static get maxTranslationSquared(): number { return Settings.maxTranslation * Settings.maxTranslation; }\n\n /**\n * The maximum angular velocity of a body. This limit is very large and is used\n * to prevent numerical problems. You shouldn't need to adjust Settings.\n */\n static maxRotation: number = (0.5 * Math.PI);\n static get maxRotationSquared(): number { return Settings.maxRotation * Settings.maxRotation; }\n\n /**\n * This scale factor controls how fast overlap is resolved. Ideally this would\n * be 1 so that overlap is removed in one time step. However using values close\n * to 1 often lead to overshoot.\n */\n static baumgarte: number = 0.2;\n static toiBaugarte: number = 0.75;\n\n // Sleep\n\n /**\n * The time that a body must be still before it will go to sleep.\n */\n static timeToSleep: number = 0.5;\n\n /**\n * A body cannot sleep if its linear velocity is above this tolerance.\n */\n static linearSleepTolerance: number = 0.01;\n static get linearSleepToleranceSqr(): number { return Math.pow(Settings.linearSleepTolerance, 2); }\n\n /**\n * A body cannot sleep if its angular velocity is above this tolerance.\n */\n static angularSleepTolerance: number = (2.0 / 180.0 * Math.PI);\n static get angularSleepToleranceSqr(): number { return Math.pow(Settings.angularSleepTolerance, 2); }\n\n}\n","/*\n * Copyright (c) 2016-2018 Ali Shakiba http://shakiba.me/planck.js\n *\n * This software is provided 'as-is', without any express or implied\n * warranty. In no event will the authors be held liable for any damages\n * arising from the use of this software.\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n * 1. The origin of this software must not be misrepresented; you must not\n * claim that you wrote the original software. If you use this software\n * in a product, an acknowledgment in the product documentation would be\n * appreciated but is not required.\n * 2. Altered source versions must be plainly marked as such, and must not be\n * misrepresented as being the original software.\n * 3. This notice may not be removed or altered from any source distribution.\n */\n\nexport class Pool {\n _list: T[] = [];\n _max: number = Infinity;\n\n _createFn: () => T;\n _outFn: (item: T) => void;\n _inFn: (item: T) => void;\n _discardFn: (item: T) => T;\n\n _createCount: number = 0;\n _outCount: number = 0;\n _inCount: number = 0;\n _discardCount: number = 0;\n\n constructor(opts: {\n max?: number,\n create?: () => T,\n allocate?: (item: T) => void,\n release?: (item: T) => void,\n discard?: (item: T) => T,\n }) {\n this._list = [];\n this._max = opts.max || this._max;\n\n this._createFn = opts.create;\n this._outFn = opts.allocate;\n this._inFn = opts.release;\n this._discardFn = opts.discard;\n }\n\n max(n?: number): number | Pool {\n if (typeof n === 'number') {\n this._max = n;\n return this;\n }\n return this._max;\n }\n\n size(): number {\n return this._list.length;\n }\n\n allocate(): T {\n let item: T;\n if (this._list.length > 0) {\n item = this._list.shift();\n } else {\n this._createCount++;\n if (typeof this._createFn === 'function') {\n item = this._createFn();\n } else {\n // tslint:disable-next-line:no-object-literal-type-assertion\n item = {} as T;\n }\n }\n this._outCount++;\n if (typeof this._outFn === 'function') {\n this._outFn(item);\n }\n return item;\n }\n\n release(item: T): void {\n if (this._list.length < this._max) {\n this._inCount++;\n if (typeof this._inFn === 'function') {\n this._inFn(item);\n }\n this._list.push(item);\n } else {\n this._discardCount++;\n if (typeof this._discardFn === 'function') {\n item = this._discardFn(item);\n }\n }\n }\n\n /** @internal */\n toString(): string {\n return \" +\" + this._createCount + \" >\" + this._outCount + \" <\" + this._inCount + \" -\"\n + this._discardCount + \" =\" + this._list.length + \"/\" + this._max;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { Pool } from '../util/Pool';\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { AABB, RayCastCallback, RayCastInput } from './AABB';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport type DynamicTreeQueryCallback = (nodeId: number) => boolean;\n\n/**\n * A node in the dynamic tree. The client does not interact with this directly.\n */\nexport class TreeNode {\n id: number;\n /** Enlarged AABB */\n aabb: AABB = new AABB();\n userData: T = null;\n parent: TreeNode = null;\n child1: TreeNode = null;\n child2: TreeNode = null;\n /** 0: leaf, -1: free node */\n height: number = -1;\n\n constructor(id?: number) {\n this.id = id;\n }\n\n /** @internal */\n toString(): string {\n return this.id + \": \" + this.userData;\n }\n\n isLeaf(): boolean {\n return this.child1 == null;\n }\n}\n\n/**\n * A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A\n * dynamic tree arranges data in a binary tree to accelerate queries such as\n * volume queries and ray casts. Leafs are proxies with an AABB. In the tree we\n * expand the proxy AABB by `aabbExtension` so that the proxy AABB is bigger\n * than the client object. This allows the client object to move by small\n * amounts without triggering a tree update.\n *\n * Nodes are pooled and relocatable, so we use node indices rather than\n * pointers.\n */\nexport class DynamicTree {\n m_root: TreeNode;\n m_lastProxyId: number;\n m_nodes: {\n [id: number]: TreeNode\n };\n m_pool: Pool>;\n\n constructor() {\n this.m_root = null;\n this.m_nodes = {};\n this.m_lastProxyId = 0;\n\n this.m_pool = new Pool>({\n create(): TreeNode {\n return new TreeNode();\n }\n });\n }\n\n /**\n * Get proxy user data.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getUserData(id: number): T {\n const node = this.m_nodes[id];\n _ASSERT && console.assert(!!node);\n return node.userData;\n }\n\n /**\n * Get the fat AABB for a node id.\n *\n * @return the proxy user data or 0 if the id is invalid.\n */\n getFatAABB(id: number): AABB {\n const node = this.m_nodes[id];\n _ASSERT && console.assert(!!node);\n return node.aabb;\n }\n\n allocateNode(): TreeNode {\n const node = this.m_pool.allocate();\n node.id = ++this.m_lastProxyId;\n node.userData = null;\n node.parent = null;\n node.child1 = null;\n node.child2 = null;\n node.height = -1;\n this.m_nodes[node.id] = node;\n return node;\n }\n\n freeNode(node: TreeNode): void {\n this.m_pool.release(node);\n node.height = -1;\n // tslint:disable-next-line:no-dynamic-delete\n delete this.m_nodes[node.id];\n }\n\n /**\n * Create a proxy in the tree as a leaf node. We return the index of the node\n * instead of a pointer so that we can grow the node pool.\n *\n * Create a proxy. Provide a tight fitting AABB and a userData pointer.\n */\n createProxy(aabb: AABB, userData: T): number {\n _ASSERT && console.assert(AABB.isValid(aabb));\n\n const node = this.allocateNode();\n\n node.aabb.set(aabb);\n\n // Fatten the aabb.\n AABB.extend(node.aabb, Settings.aabbExtension);\n\n node.userData = userData;\n node.height = 0;\n\n this.insertLeaf(node);\n\n return node.id;\n }\n\n /**\n * Destroy a proxy. This asserts if the id is invalid.\n */\n destroyProxy(id: number): void {\n const node = this.m_nodes[id];\n\n _ASSERT && console.assert(!!node);\n _ASSERT && console.assert(node.isLeaf());\n\n this.removeLeaf(node);\n this.freeNode(node);\n }\n\n /**\n * Move a proxy with a swepted AABB. If the proxy has moved outside of its\n * fattened AABB, then the proxy is removed from the tree and re-inserted.\n * Otherwise the function returns immediately.\n *\n * @param d Displacement\n *\n * @return true if the proxy was re-inserted.\n */\n moveProxy(id: number, aabb: AABB, d: Vec2): boolean {\n _ASSERT && console.assert(AABB.isValid(aabb));\n _ASSERT && console.assert(!d || Vec2.isValid(d));\n\n const node = this.m_nodes[id];\n\n _ASSERT && console.assert(!!node);\n _ASSERT && console.assert(node.isLeaf());\n\n if (node.aabb.contains(aabb)) {\n return false;\n }\n\n this.removeLeaf(node);\n\n node.aabb.set(aabb);\n\n // Extend AABB.\n aabb = node.aabb;\n AABB.extend(aabb, Settings.aabbExtension);\n\n // Predict AABB displacement.\n // const d = Vec2.mul(Settings.aabbMultiplier, displacement);\n\n if (d.x < 0.0) {\n aabb.lowerBound.x += d.x * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.x += d.x * Settings.aabbMultiplier;\n }\n\n if (d.y < 0.0) {\n aabb.lowerBound.y += d.y * Settings.aabbMultiplier;\n } else {\n aabb.upperBound.y += d.y * Settings.aabbMultiplier;\n }\n\n this.insertLeaf(node);\n\n return true;\n }\n\n insertLeaf(leaf: TreeNode): void {\n _ASSERT && console.assert(AABB.isValid(leaf.aabb));\n\n if (this.m_root == null) {\n this.m_root = leaf;\n this.m_root.parent = null;\n return;\n }\n\n // Find the best sibling for this node\n const leafAABB = leaf.aabb;\n let index = this.m_root;\n while (!index.isLeaf()) {\n const child1 = index.child1;\n const child2 = index.child2;\n\n const area = index.aabb.getPerimeter();\n\n const combinedAABB = new AABB();\n combinedAABB.combine(index.aabb, leafAABB);\n const combinedArea = combinedAABB.getPerimeter();\n\n // Cost of creating a new parent for this node and the new leaf\n const cost = 2.0 * combinedArea;\n\n // Minimum cost of pushing the leaf further down the tree\n const inheritanceCost = 2.0 * (combinedArea - area);\n\n // Cost of descending into child1\n let cost1;\n if (child1.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n cost1 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child1.aabb);\n const oldArea = child1.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost1 = (newArea - oldArea) + inheritanceCost;\n }\n\n // Cost of descending into child2\n let cost2;\n if (child2.isLeaf()) {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n cost2 = aabb.getPerimeter() + inheritanceCost;\n } else {\n const aabb = new AABB();\n aabb.combine(leafAABB, child2.aabb);\n const oldArea = child2.aabb.getPerimeter();\n const newArea = aabb.getPerimeter();\n cost2 = newArea - oldArea + inheritanceCost;\n }\n\n // Descend according to the minimum cost.\n if (cost < cost1 && cost < cost2) {\n break;\n }\n\n // Descend\n if (cost1 < cost2) {\n index = child1;\n } else {\n index = child2;\n }\n }\n\n const sibling = index;\n\n // Create a new parent.\n const oldParent = sibling.parent;\n const newParent = this.allocateNode();\n newParent.parent = oldParent;\n newParent.userData = null;\n newParent.aabb.combine(leafAABB, sibling.aabb);\n newParent.height = sibling.height + 1;\n\n if (oldParent != null) {\n // The sibling was not the root.\n if (oldParent.child1 === sibling) {\n oldParent.child1 = newParent;\n } else {\n oldParent.child2 = newParent;\n }\n\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n } else {\n // The sibling was the root.\n newParent.child1 = sibling;\n newParent.child2 = leaf;\n sibling.parent = newParent;\n leaf.parent = newParent;\n this.m_root = newParent;\n }\n\n // Walk back up the tree fixing heights and AABBs\n index = leaf.parent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n _ASSERT && console.assert(child1 != null);\n _ASSERT && console.assert(child2 != null);\n\n index.height = 1 + Math.max(child1.height, child2.height);\n index.aabb.combine(child1.aabb, child2.aabb);\n\n index = index.parent;\n }\n\n // validate();\n }\n\n removeLeaf(leaf: TreeNode): void {\n if (leaf === this.m_root) {\n this.m_root = null;\n return;\n }\n\n const parent = leaf.parent;\n const grandParent = parent.parent;\n let sibling;\n if (parent.child1 === leaf) {\n sibling = parent.child2;\n } else {\n sibling = parent.child1;\n }\n\n if (grandParent != null) {\n // Destroy parent and connect sibling to grandParent.\n if (grandParent.child1 === parent) {\n grandParent.child1 = sibling;\n } else {\n grandParent.child2 = sibling;\n }\n sibling.parent = grandParent;\n this.freeNode(parent);\n\n // Adjust ancestor bounds.\n let index = grandParent;\n while (index != null) {\n index = this.balance(index);\n\n const child1 = index.child1;\n const child2 = index.child2;\n\n index.aabb.combine(child1.aabb, child2.aabb);\n index.height = 1 + Math.max(child1.height, child2.height);\n\n index = index.parent;\n }\n } else {\n this.m_root = sibling;\n sibling.parent = null;\n this.freeNode(parent);\n }\n\n // validate();\n }\n\n /**\n * Perform a left or right rotation if node A is imbalanced. Returns the new\n * root index.\n */\n balance(iA: TreeNode): TreeNode {\n _ASSERT && console.assert(iA != null);\n\n const A = iA;\n if (A.isLeaf() || A.height < 2) {\n return iA;\n }\n\n const B = A.child1;\n const C = A.child2;\n\n const balance = C.height - B.height;\n\n // Rotate C up\n if (balance > 1) {\n const F = C.child1;\n const G = C.child2;\n\n // Swap A and C\n C.child1 = A;\n C.parent = A.parent;\n A.parent = C;\n\n // A's old parent should point to C\n if (C.parent != null) {\n if (C.parent.child1 === iA) {\n C.parent.child1 = C;\n } else {\n C.parent.child2 = C;\n }\n } else {\n this.m_root = C;\n }\n\n // Rotate\n if (F.height > G.height) {\n C.child2 = F;\n A.child2 = G;\n G.parent = A;\n A.aabb.combine(B.aabb, G.aabb);\n C.aabb.combine(A.aabb, F.aabb);\n\n A.height = 1 + Math.max(B.height, G.height);\n C.height = 1 + Math.max(A.height, F.height);\n } else {\n C.child2 = G;\n A.child2 = F;\n F.parent = A;\n A.aabb.combine(B.aabb, F.aabb);\n C.aabb.combine(A.aabb, G.aabb);\n\n A.height = 1 + Math.max(B.height, F.height);\n C.height = 1 + Math.max(A.height, G.height);\n }\n\n return C;\n }\n\n // Rotate B up\n if (balance < -1) {\n const D = B.child1;\n const E = B.child2;\n\n // Swap A and B\n B.child1 = A;\n B.parent = A.parent;\n A.parent = B;\n\n // A's old parent should point to B\n if (B.parent != null) {\n if (B.parent.child1 === A) {\n B.parent.child1 = B;\n } else {\n B.parent.child2 = B;\n }\n } else {\n this.m_root = B;\n }\n\n // Rotate\n if (D.height > E.height) {\n B.child2 = D;\n A.child1 = E;\n E.parent = A;\n A.aabb.combine(C.aabb, E.aabb);\n B.aabb.combine(A.aabb, D.aabb);\n\n A.height = 1 + Math.max(C.height, E.height);\n B.height = 1 + Math.max(A.height, D.height);\n } else {\n B.child2 = E;\n A.child1 = D;\n D.parent = A;\n A.aabb.combine(C.aabb, D.aabb);\n B.aabb.combine(A.aabb, E.aabb);\n\n A.height = 1 + Math.max(C.height, D.height);\n B.height = 1 + Math.max(A.height, E.height);\n }\n\n return B;\n }\n\n return A;\n }\n\n /**\n * Compute the height of the binary tree in O(N) time. Should not be called\n * often.\n */\n getHeight(): number {\n if (this.m_root == null) {\n return 0;\n }\n\n return this.m_root.height;\n }\n\n /**\n * Get the ratio of the sum of the node areas to the root area.\n */\n getAreaRatio(): number {\n if (this.m_root == null) {\n return 0.0;\n }\n\n const root = this.m_root;\n const rootArea = root.aabb.getPerimeter();\n\n let totalArea = 0.0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // Free node in pool\n continue;\n }\n\n totalArea += node.aabb.getPerimeter();\n }\n\n this.iteratorPool.release(it);\n\n return totalArea / rootArea;\n }\n\n /**\n * Compute the height of a sub-tree.\n */\n computeHeight(id?: number): number {\n let node;\n if (typeof id !== 'undefined') {\n node = this.m_nodes[id];\n } else {\n node = this.m_root;\n }\n\n // _ASSERT && console.assert(0 <= id && id < this.m_nodeCapacity);\n\n if (node.isLeaf()) {\n return 0;\n }\n\n const height1 = this.computeHeight(node.child1.id);\n const height2 = this.computeHeight(node.child2.id);\n return 1 + Math.max(height1, height2);\n }\n\n validateStructure(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n if (node === this.m_root) {\n _ASSERT && console.assert(node.parent == null);\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && console.assert(child1 == null);\n _ASSERT && console.assert(child2 == null);\n _ASSERT && console.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && console.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && console.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n _ASSERT && console.assert(child1.parent === node);\n _ASSERT && console.assert(child2.parent === node);\n\n this.validateStructure(child1);\n this.validateStructure(child2);\n }\n\n validateMetrics(node: TreeNode): void {\n if (node == null) {\n return;\n }\n\n const child1 = node.child1;\n const child2 = node.child2;\n\n if (node.isLeaf()) {\n _ASSERT && console.assert(child1 == null);\n _ASSERT && console.assert(child2 == null);\n _ASSERT && console.assert(node.height === 0);\n return;\n }\n\n // _ASSERT && console.assert(0 <= child1 && child1 < this.m_nodeCapacity);\n // _ASSERT && console.assert(0 <= child2 && child2 < this.m_nodeCapacity);\n\n const height1 = child1.height;\n const height2 = child2.height;\n const height = 1 + Math.max(height1, height2);\n _ASSERT && console.assert(node.height === height);\n\n const aabb = new AABB();\n aabb.combine(child1.aabb, child2.aabb);\n\n _ASSERT && console.assert(AABB.areEqual(aabb, node.aabb));\n\n this.validateMetrics(child1);\n this.validateMetrics(child2);\n }\n\n /**\n * Validate this tree. For testing.\n */\n validate(): void {\n this.validateStructure(this.m_root);\n this.validateMetrics(this.m_root);\n _ASSERT && console.assert(this.getHeight() === this.computeHeight());\n }\n\n /**\n * Get the maximum balance of an node in the tree. The balance is the difference\n * in height of the two children of a node.\n */\n getMaxBalance(): number {\n let maxBalance = 0;\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height <= 1) {\n continue;\n }\n\n _ASSERT && console.assert(!node.isLeaf());\n\n const balance = Math.abs(node.child2.height - node.child1.height);\n maxBalance = Math.max(maxBalance, balance);\n }\n this.iteratorPool.release(it);\n\n return maxBalance;\n }\n\n /**\n * Build an optimal tree. Very expensive. For testing.\n */\n rebuildBottomUp(): void {\n const nodes = [];\n let count = 0;\n\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n if (node.height < 0) {\n // free node in pool\n continue;\n }\n\n if (node.isLeaf()) {\n node.parent = null;\n nodes[count] = node;\n ++count;\n } else {\n this.freeNode(node);\n }\n }\n this.iteratorPool.release(it);\n\n while (count > 1) {\n let minCost = Infinity;\n let iMin = -1;\n let jMin = -1;\n for (let i = 0; i < count; ++i) {\n const aabbi = nodes[i].aabb;\n for (let j = i + 1; j < count; ++j) {\n const aabbj = nodes[j].aabb;\n const b = new AABB();\n b.combine(aabbi, aabbj);\n const cost = b.getPerimeter();\n if (cost < minCost) {\n iMin = i;\n jMin = j;\n minCost = cost;\n }\n }\n }\n\n const child1 = nodes[iMin];\n const child2 = nodes[jMin];\n\n const parent = this.allocateNode();\n parent.child1 = child1;\n parent.child2 = child2;\n parent.height = 1 + Math.max(child1.height, child2.height);\n parent.aabb.combine(child1.aabb, child2.aabb);\n parent.parent = null;\n\n child1.parent = parent;\n child2.parent = parent;\n\n nodes[jMin] = nodes[count - 1];\n nodes[iMin] = parent;\n --count;\n }\n\n this.m_root = nodes[0];\n\n _ASSERT && this.validate();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n // Build array of leaves. Free the rest.\n let node;\n const it = this.iteratorPool.allocate().preorder(this.m_root);\n while (node = it.next()) {\n const aabb = node.aabb;\n aabb.lowerBound.x -= newOrigin.x;\n aabb.lowerBound.y -= newOrigin.y;\n aabb.upperBound.x -= newOrigin.x;\n aabb.upperBound.y -= newOrigin.y;\n }\n this.iteratorPool.release(it);\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query(aabb: AABB, queryCallback: DynamicTreeQueryCallback): void {\n _ASSERT && console.assert(typeof queryCallback === 'function');\n const stack = this.stackPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, aabb)) {\n if (node.isLeaf()) {\n const proceed = queryCallback(node.id);\n if (proceed === false) {\n return;\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n }\n\n this.stackPool.release(stack);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n // TODO: GC\n _ASSERT && console.assert(typeof rayCastCallback === 'function');\n const p1 = input.p1;\n const p2 = input.p2;\n const r = Vec2.sub(p2, p1);\n _ASSERT && console.assert(r.lengthSquared() > 0.0);\n r.normalize();\n\n // v is perpendicular to the segment.\n const v = Vec2.crossNumVec2(1.0, r);\n const abs_v = Vec2.abs(v);\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n\n let maxFraction = input.maxFraction;\n\n // Build a bounding box for the segment.\n const segmentAABB = new AABB();\n let t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n\n const stack = this.stackPool.allocate();\n const subInput = this.inputPool.allocate();\n\n stack.push(this.m_root);\n while (stack.length > 0) {\n const node = stack.pop();\n if (node == null) {\n continue;\n }\n\n if (AABB.testOverlap(node.aabb, segmentAABB) === false) {\n continue;\n }\n\n // Separating axis for segment (Gino, p80).\n // |dot(v, p1 - c)| > dot(|v|, h)\n const c = node.aabb.getCenter();\n const h = node.aabb.getExtents();\n const separation = Math.abs(Vec2.dot(v, Vec2.sub(p1, c))) - Vec2.dot(abs_v, h);\n if (separation > 0.0) {\n continue;\n }\n\n if (node.isLeaf()) {\n subInput.p1 = Vec2.clone(input.p1);\n subInput.p2 = Vec2.clone(input.p2);\n subInput.maxFraction = maxFraction;\n\n const value = rayCastCallback(subInput, node.id);\n\n if (value === 0.0) {\n // The client has terminated the ray cast.\n return;\n }\n\n if (value > 0.0) {\n // update segment bounding box.\n maxFraction = value;\n t = Vec2.combine((1 - maxFraction), p1, maxFraction, p2);\n segmentAABB.combinePoints(p1, t);\n }\n } else {\n stack.push(node.child1);\n stack.push(node.child2);\n }\n }\n this.stackPool.release(stack);\n this.inputPool.release(subInput);\n }\n\n private inputPool: Pool = new Pool({\n create(): RayCastInput {\n // tslint:disable-next-line:no-object-literal-type-assertion\n return {} as RayCastInput;\n },\n release(stack: RayCastInput): void {\n }\n });\n\n private stackPool: Pool>> = new Pool>>({\n create(): Array> {\n return [];\n },\n release(stack: Array>): void {\n stack.length = 0;\n }\n });\n\n private iteratorPool: Pool> = new Pool>({\n create(): Iterator {\n return new Iterator();\n },\n release(iterator: Iterator): void {\n iterator.close();\n }\n });\n\n}\n\nclass Iterator {\n parents: Array> = [];\n states: number[] = [];\n preorder(root: TreeNode): Iterator {\n this.parents.length = 0;\n this.parents.push(root);\n this.states.length = 0;\n this.states.push(0);\n return this;\n }\n next(): TreeNode {\n while (this.parents.length > 0) {\n const i = this.parents.length - 1;\n const node = this.parents[i];\n if (this.states[i] === 0) {\n this.states[i] = 1;\n return node;\n }\n if (this.states[i] === 1) {\n this.states[i] = 2;\n if (node.child1) {\n this.parents.push(node.child1);\n this.states.push(1);\n return node.child1;\n }\n }\n if (this.states[i] === 2) {\n this.states[i] = 3;\n if (node.child2) {\n this.parents.push(node.child2);\n this.states.push(1);\n return node.child2;\n }\n }\n this.parents.pop();\n this.states.pop();\n }\n }\n close(): void {\n this.parents.length = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { AABB, RayCastCallback, RayCastInput } from './AABB';\nimport { DynamicTree, DynamicTreeQueryCallback } from './DynamicTree';\nimport { FixtureProxy } from \"../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * The broad-phase wraps and extends a dynamic-tree to keep track of moved\n * objects and query them on update.\n */\nexport class BroadPhase {\n m_tree: DynamicTree = new DynamicTree();\n m_proxyCount: number = 0;\n m_moveBuffer: number[] = [];\n\n m_callback: (userDataA: any, userDataB: any) => void;\n m_queryProxyId: number;\n\n /**\n * Get user data from a proxy. Returns null if the id is invalid.\n */\n getUserData(proxyId: number): FixtureProxy {\n return this.m_tree.getUserData(proxyId);\n }\n\n /**\n * Test overlap of fat AABBs.\n */\n testOverlap(proxyIdA: number, proxyIdB: number): boolean {\n const aabbA = this.m_tree.getFatAABB(proxyIdA);\n const aabbB = this.m_tree.getFatAABB(proxyIdB);\n return AABB.testOverlap(aabbA, aabbB);\n }\n\n /**\n * Get the fat AABB for a proxy.\n */\n getFatAABB(proxyId: number): AABB {\n return this.m_tree.getFatAABB(proxyId);\n }\n\n /**\n * Get the number of proxies.\n */\n getProxyCount(): number {\n return this.m_proxyCount;\n }\n\n /**\n * Get the height of the embedded tree.\n */\n getTreeHeight(): number {\n return this.m_tree.getHeight();\n }\n\n /**\n * Get the balance (integer) of the embedded tree.\n */\n getTreeBalance(): number {\n return this.m_tree.getMaxBalance();\n }\n\n /**\n * Get the quality metric of the embedded tree.\n */\n getTreeQuality(): number {\n return this.m_tree.getAreaRatio();\n }\n\n /**\n * Query an AABB for overlapping proxies. The callback class is called for each\n * proxy that overlaps the supplied AABB.\n */\n query = (aabb: AABB, queryCallback: DynamicTreeQueryCallback): void => {\n this.m_tree.query(aabb, queryCallback);\n }\n\n /**\n * Ray-cast against the proxies in the tree. This relies on the callback to\n * perform a exact ray-cast in the case were the proxy contains a shape. The\n * callback also performs the any collision filtering. This has performance\n * roughly equal to k * log(n), where k is the number of collisions and n is the\n * number of proxies in the tree.\n *\n * @param input The ray-cast input data. The ray extends from `p1` to `p1 + maxFraction * (p2 - p1)`.\n * @param rayCastCallback A function that is called for each proxy that is hit by the ray.\n */\n rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void {\n this.m_tree.rayCast(input, rayCastCallback);\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_tree.shiftOrigin(newOrigin);\n }\n\n /**\n * Create a proxy with an initial AABB. Pairs are not reported until UpdatePairs\n * is called.\n */\n createProxy(aabb: AABB, userData: FixtureProxy): number {\n _ASSERT && console.assert(AABB.isValid(aabb));\n const proxyId = this.m_tree.createProxy(aabb, userData);\n this.m_proxyCount++;\n this.bufferMove(proxyId);\n return proxyId;\n }\n\n /**\n * Destroy a proxy. It is up to the client to remove any pairs.\n */\n destroyProxy(proxyId: number): void {\n this.unbufferMove(proxyId);\n this.m_proxyCount--;\n this.m_tree.destroyProxy(proxyId);\n }\n\n /**\n * Call moveProxy as many times as you like, then when you are done call\n * UpdatePairs to finalized the proxy pairs (for your time step).\n */\n moveProxy(proxyId: number, aabb: AABB, displacement: Vec2): void {\n _ASSERT && console.assert(AABB.isValid(aabb));\n const changed = this.m_tree.moveProxy(proxyId, aabb, displacement);\n if (changed) {\n this.bufferMove(proxyId);\n }\n }\n\n /**\n * Call to trigger a re-processing of it's pairs on the next call to\n * UpdatePairs.\n */\n touchProxy(proxyId: number): void {\n this.bufferMove(proxyId);\n }\n\n bufferMove(proxyId: number): void {\n this.m_moveBuffer.push(proxyId);\n }\n\n unbufferMove(proxyId: number): void {\n for (let i = 0; i < this.m_moveBuffer.length; ++i) {\n if (this.m_moveBuffer[i] === proxyId) {\n this.m_moveBuffer[i] = null;\n }\n }\n }\n\n /**\n * Update the pairs. This results in pair callbacks. This can only add pairs.\n */\n updatePairs(addPairCallback: (userDataA: FixtureProxy, userDataB: FixtureProxy) => void): void {\n _ASSERT && console.assert(typeof addPairCallback === 'function');\n this.m_callback = addPairCallback;\n\n // Perform tree queries for all moving proxies.\n while (this.m_moveBuffer.length > 0) {\n this.m_queryProxyId = this.m_moveBuffer.pop();\n if (this.m_queryProxyId === null) {\n continue;\n }\n\n // We have to query the tree with the fat AABB so that\n // we don't fail to create a pair that may touch later.\n const fatAABB = this.m_tree.getFatAABB(this.m_queryProxyId);\n\n // Query tree, create pairs and add them pair buffer.\n this.m_tree.query(fatAABB, this.queryCallback);\n }\n\n // Try to keep the tree balanced.\n // this.m_tree.rebalance(4);\n }\n\n queryCallback = (proxyId: number): boolean => {\n // A proxy cannot form a pair with itself.\n if (proxyId === this.m_queryProxyId) {\n return true;\n }\n\n const proxyIdA = Math.min(proxyId, this.m_queryProxyId);\n const proxyIdB = Math.max(proxyId, this.m_queryProxyId);\n\n // TODO: Skip any duplicate pairs.\n\n const userDataA = this.m_tree.getUserData(proxyIdA);\n const userDataB = this.m_tree.getUserData(proxyIdB);\n\n // Send the pairs back to the client.\n this.m_callback(userDataA, userDataB);\n\n return true;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2, Vec2Value } from './Vec2';\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class Rot {\n s: number;\n c: number;\n\n /** Initialize from an angle in radians. */\n constructor(angle?: number | Rot) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Rot)) {\n return new Rot(angle);\n }\n if (typeof angle === 'number') {\n this.setAngle(angle);\n } else if (typeof angle === 'object') {\n this.setRot(angle);\n } else {\n this.setIdentity();\n }\n }\n\n /** @internal */\n static neo(angle: number): Rot {\n const obj = Object.create(Rot.prototype);\n obj.setAngle(angle);\n return obj;\n }\n\n static clone(rot: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n const obj = Object.create(Rot.prototype);\n obj.s = rot.s;\n obj.c = rot.c;\n return obj;\n }\n\n static identity(): Rot {\n const obj = Object.create(Rot.prototype);\n obj.s = 0.0;\n obj.c = 1.0;\n return obj;\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.s) && Math.isFinite(obj.c);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Rot.isValid(o), 'Invalid Rot!', o);\n }\n\n /** Set to the identity rotation. */\n setIdentity(): void {\n this.s = 0.0;\n this.c = 1.0;\n }\n\n set(angle: number | Rot): void {\n if (typeof angle === 'object') {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n\n } else {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n }\n\n setRot(angle: Rot): void {\n _ASSERT && Rot.assert(angle);\n this.s = angle.s;\n this.c = angle.c;\n }\n\n /** Set using an angle in radians. */\n setAngle(angle: number): void {\n _ASSERT && Math.assert(angle);\n // TODO_ERIN optimize\n this.s = Math.sin(angle);\n this.c = Math.cos(angle);\n }\n\n /** Get the angle in radians. */\n getAngle(): number {\n return Math.atan2(this.s, this.c);\n }\n\n /** Get the x-axis. */\n getXAxis(): Vec2 {\n return Vec2.neo(this.c, this.s);\n }\n\n /** Get the u-axis. */\n getYAxis(): Vec2 {\n return Vec2.neo(-this.s, this.c);\n }\n\n /** Multiply two rotations: q * r */\n static mul(rot: Rot, m: Rot): Rot;\n /** Rotate a vector */\n static mul(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(rot, m) {\n _ASSERT && Rot.assert(rot);\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Multiply two rotations: q * r */\n static mulRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Rot.assert(m);\n // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc]\n // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc]\n // s = qs * rc + qc * rs\n // c = qc * rc - qs * rs\n const qr = Rot.identity();\n qr.s = rot.s * m.c + rot.c * m.s;\n qr.c = rot.c * m.c - rot.s * m.s;\n return qr;\n }\n\n /** Rotate a vector */\n static mulVec2(rot: Rot, m: Vec2): Vec2 {\n _ASSERT && Rot.assert(rot);\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x - rot.s * m.y, rot.s * m.x + rot.c * m.y);\n }\n\n static mulSub(rot: Rot, v: Vec2, w: Vec2): Vec2 {\n const x = rot.c * (v.x - w.x) - rot.s * (v.y - w.y);\n const y = rot.s * (v.x - w.x) + rot.c * (v.y - w.y);\n return Vec2.neo(x, y);\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulT(rot: Rot, m: Rot): Rot;\n /** Inverse rotate a vector */\n static mulT(rot: Rot, m: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(rot, m) {\n if ('c' in m && 's' in m) {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n\n } else if ('x' in m && 'y' in m) {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n }\n\n /** Transpose multiply two rotations: qT * r */\n static mulTRot(rot: Rot, m: Rot): Rot {\n _ASSERT && Rot.assert(m);\n // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc]\n // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc]\n // s = qc * rs - qs * rc\n // c = qc * rc + qs * rs\n const qr = Rot.identity();\n qr.s = rot.c * m.s - rot.s * m.c;\n qr.c = rot.c * m.c + rot.s * m.s;\n return qr;\n }\n\n /** Inverse rotate a vector */\n static mulTVec2(rot: Rot, m: Vec2Value): Vec2 {\n _ASSERT && Vec2.assert(m);\n return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2, Vec2Value } from './Vec2';\nimport { Rot } from './Rot';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A transform contains translation and rotation. It is used to represent the\n * position and orientation of rigid frames. Initialize using a position vector\n * and a rotation.\n */\nexport class Transform {\n /** position */\n p: Vec2;\n\n /** rotation */\n q: Rot;\n\n constructor(position?: Vec2Value, rotation?: number) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Transform)) {\n return new Transform(position, rotation);\n }\n this.p = Vec2.zero();\n this.q = Rot.identity();\n if (typeof position !== 'undefined') {\n this.p.setVec2(position);\n }\n if (typeof rotation !== 'undefined') {\n this.q.setAngle(rotation);\n }\n }\n\n static clone(xf: Transform): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(xf.p);\n obj.q = Rot.clone(xf.q);\n return obj;\n }\n\n /** @internal */\n static neo(position: Vec2, rotation: Rot): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.clone(position);\n obj.q = Rot.clone(rotation);\n return obj;\n }\n\n static identity(): Transform {\n const obj = Object.create(Transform.prototype);\n obj.p = Vec2.zero();\n obj.q = Rot.identity();\n return obj;\n }\n\n /**\n * Set this to the identity transform.\n */\n setIdentity(): void {\n this.p.setZero();\n this.q.setIdentity();\n }\n\n set(position: Vec2, rotation: number): void;\n set(xf: Transform): void;\n /**\n * Set this based on the position and angle.\n */\n // tslint:disable-next-line:typedef\n set(a, b?) {\n if (typeof b === 'undefined') {\n this.p.set(a.p);\n this.q.set(a.q);\n } else {\n this.p.set(a);\n this.q.set(b);\n }\n }\n\n /**\n * Set this based on the position and angle.\n */\n setNum(position: Vec2, rotation: number) {\n this.p.setVec2(position);\n this.q.setAngle(rotation);\n }\n\n setTransform(xf: Transform): void {\n this.p.setVec2(xf.p);\n this.q.setRot(xf.q);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.p) && Rot.isValid(obj.q);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Transform.isValid(o), 'Invalid Transform!', o);\n }\n\n static mul(a: Transform, b: Vec2Value): Vec2;\n static mul(a: Transform, b: Transform): Transform;\n // static mul(a: Transform, b: Vec2Value[]): Vec2[];\n // static mul(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n if (Array.isArray(b)) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n\n } else if ('x' in b && 'y' in b) {\n return Transform.mulVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulXf(a, b);\n }\n }\n\n static mulAll(a: Transform, b: Vec2Value[]): Vec2[];\n static mulAll(a: Transform, b: Transform[]): Transform[];\n // tslint:disable-next-line:typedef\n static mulAll(a: Transform, b) {\n _ASSERT && Transform.assert(a);\n const arr = [];\n for (let i = 0; i < b.length; i++) {\n arr[i] = Transform.mul(a, b[i]);\n }\n return arr;\n }\n\n /** @internal @deprecated */\n // tslint:disable-next-line:typedef\n static mulFn(a: Transform) {\n _ASSERT && Transform.assert(a);\n return function(b: Vec2Value): Vec2 {\n return Transform.mul(a, b);\n };\n }\n\n static mulVec2(a: Transform, b: Vec2Value): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = (a.q.c * b.x - a.q.s * b.y) + a.p.x;\n const y = (a.q.s * b.x + a.q.c * b.y) + a.p.y;\n return Vec2.neo(x, y);\n }\n\n static mulXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p\n // = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p\n const xf = Transform.identity();\n xf.q = Rot.mulRot(a.q, b.q);\n xf.p = Vec2.add(Rot.mulVec2(a.q, b.p), a.p);\n return xf;\n }\n\n static mulT(a: Transform, b: Vec2Value): Vec2;\n static mulT(a: Transform, b: Transform): Transform;\n // tslint:disable-next-line:typedef\n static mulT(a, b) {\n if ('x' in b && 'y' in b) {\n return Transform.mulTVec2(a, b);\n\n } else if ('p' in b && 'q' in b) {\n return Transform.mulTXf(a, b);\n }\n }\n\n static mulTVec2(a: Transform, b: Vec2Value): Vec2 {\n _ASSERT && Transform.assert(a);\n _ASSERT && Vec2.assert(b);\n const px = b.x - a.p.x;\n const py = b.y - a.p.y;\n const x = (a.q.c * px + a.q.s * py);\n const y = (-a.q.s * px + a.q.c * py);\n return Vec2.neo(x, y);\n }\n\n static mulTXf(a: Transform, b: Transform): Transform {\n _ASSERT && Transform.assert(a);\n _ASSERT && Transform.assert(b);\n // v2 = A.q' * (B.q * v1 + B.p - A.p)\n // = A.q' * B.q * v1 + A.q' * (B.p - A.p)\n const xf = Transform.identity();\n xf.q.setRot(Rot.mulTRot(a.q, b.q));\n xf.p.setVec2(Rot.mulTVec2(a.q, Vec2.sub(b.p, a.p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\nimport { Vec2 } from './Vec2';\nimport { Rot } from './Rot';\nimport { Transform } from './Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * This describes the motion of a body/shape for TOI computation. Shapes are\n * defined with respect to the body origin, which may not coincide with the\n * center of mass. However, to support dynamics we must interpolate the center\n * of mass position.\n */\nexport class Sweep {\n /** Local center of mass position */\n localCenter: Vec2;\n\n /** World center position */\n c: Vec2;\n\n /** World angle */\n a: number;\n\n /** Fraction of the current time step in the range [0,1], c0 and a0 are c and a at alpha0. */\n alpha0: number;\n\n c0: Vec2;\n a0: number;\n\n constructor(c?: Vec2, a?: number) {\n _ASSERT && console.assert(typeof c === 'undefined');\n _ASSERT && console.assert(typeof a === 'undefined');\n this.localCenter = Vec2.zero();\n this.c = Vec2.zero();\n this.a = 0;\n this.alpha0 = 0;\n this.c0 = Vec2.zero();\n this.a0 = 0;\n }\n\n setTransform(xf: Transform): void {\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n\n this.a = xf.q.getAngle();\n this.a0 = xf.q.getAngle();\n }\n\n setLocalCenter(localCenter: Vec2, xf: Transform): void {\n this.localCenter.setVec2(localCenter);\n\n const c = Transform.mulVec2(xf, this.localCenter);\n this.c.setVec2(c);\n this.c0.setVec2(c);\n }\n\n /**\n * Get the interpolated transform at a specific time.\n *\n * @param xf\n * @param beta A factor in [0,1], where 0 indicates alpha0\n */\n getTransform(xf: Transform, beta: number = 0): void {\n xf.q.setAngle((1.0 - beta) * this.a0 + beta * this.a);\n xf.p.setCombine((1.0 - beta), this.c0, beta, this.c);\n\n // shift to origin\n xf.p.sub(Rot.mulVec2(xf.q, this.localCenter));\n }\n\n /**\n * Advance the sweep forward, yielding a new initial state.\n *\n * @param alpha The new initial time\n */\n advance(alpha: number): void {\n _ASSERT && console.assert(this.alpha0 < 1.0);\n const beta = (alpha - this.alpha0) / (1.0 - this.alpha0);\n this.c0.setCombine(beta, this.c, 1 - beta, this.c0);\n this.a0 = beta * this.a + (1 - beta) * this.a0;\n this.alpha0 = alpha;\n }\n\n forward(): void {\n this.a0 = this.a;\n this.c0.setVec2(this.c);\n }\n\n /**\n * normalize the angles in radians to be between -pi and pi.\n */\n normalize(): void {\n const a0 = Math.mod(this.a0, -Math.PI, +Math.PI);\n this.a -= this.a0 - a0;\n this.a0 = a0;\n }\n\n clone(): Sweep {\n const clone = new Sweep();\n clone.localCenter.setVec2(this.localCenter);\n clone.alpha0 = this.alpha0;\n clone.a0 = this.a0;\n clone.a = this.a;\n clone.c0.setVec2(this.c0);\n clone.c.setVec2(this.c);\n return clone;\n }\n\n set(that: Sweep): void {\n this.localCenter.setVec2(that.localCenter);\n this.alpha0 = that.alpha0;\n this.a0 = that.a0;\n this.a = that.a;\n this.c0.setVec2(that.c0);\n this.c.setVec2(that.c);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\n\nexport class Velocity {\n /** linear */\n v: Vec2;\n\n /** angular */\n w: number;\n\n constructor() {\n this.v = Vec2.zero();\n this.w = 0;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Transform } from '../common/Transform';\n\n\nexport class Position {\n /** location */\n c: Vec2;\n\n /** angle */\n a: number;\n\n constructor() {\n this.c = Vec2.zero();\n this.a = 0;\n }\n\n getTransform(xf: Transform, p: Vec2): Transform {\n xf.q.setAngle(this.a);\n xf.p.setVec2(Vec2.sub(this.c, Rot.mulVec2(xf.q, p)));\n return xf;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from './AABB';\nimport { DistanceProxy } from './Distance';\nimport type { Transform } from '../common/Transform';\nimport type { Vec2Value } from '../common/Vec2';\n\n// todo make shape an interface\n\n/**\n * A shape is used for collision detection. You can create a shape however you\n * like. Shapes used for simulation in World are created automatically when a\n * Fixture is created. Shapes may encapsulate one or more child shapes.\n */\nexport abstract class Shape {\n m_type: ShapeType;\n m_radius: number;\n\n /** @internal */\n abstract _reset(): void;\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return typeof obj.m_type === 'string' && typeof obj.m_radius === 'number';\n }\n\n abstract getRadius(): number;\n\n /**\n * Get the type of this shape. You can use this to down cast to the concrete\n * shape.\n *\n * @return the shape type.\n */\n abstract getType(): ShapeType;\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n abstract _clone(): Shape;\n\n /**\n * Get the number of child primitives.\n */\n abstract getChildCount(): number;\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n abstract testPoint(xf: Transform, p: Vec2Value): boolean;\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n abstract rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean;\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n abstract computeAABB(aabb: AABB, xf: Transform, childIndex: number): void;\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n abstract computeMass(massData: MassData, density?: number): void;\n\n abstract computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void;\n\n}\n\nexport type ShapeType = \"circle\" | \"edge\" | \"polygon\" | \"chain\";\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { math as Math } from '../common/Math';\nimport { Vec2, Vec2Value } from '../common/Vec2';\nimport { AABB, RayCastInput, RayCastOutput } from '../collision/AABB';\nimport { Shape, ShapeType } from '../collision/Shape';\nimport { Body, MassData } from \"./Body\";\nimport { BroadPhase } from \"../collision/BroadPhase\";\nimport { Transform } from \"../common/Transform\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A fixture definition is used to create a fixture. This class defines an\n * abstract fixture definition. You can reuse fixture definitions safely.\n */\nexport interface FixtureOpt {\n userData?: unknown;\n /**\n * The friction coefficient, usually in the range [0,1]\n */\n friction?: number;\n /**\n * The restitution (elasticity) usually in the range [0,1]\n */\n restitution?: number;\n /**\n * The density, usually in kg/m^2\n */\n density?: number;\n /**\n * A sensor shape collects contact information but never generates a collision response.\n */\n isSensor?: boolean;\n /**\n * Zero, positive or negative collision group.\n * Fixtures with same positive groupIndex always collide and fixtures with same negative groupIndex never collide.\n */\n filterGroupIndex?: number;\n /**\n * Collision category bit or bits that this fixture belongs to.\n * If groupIndex is zero or not matching, then at least one bit in this fixture categoryBits should match other fixture maskBits and vice versa.\n */\n filterCategoryBits?: number;\n /**\n * Collision category bit or bits that this fixture accept for collision.\n */\n filterMaskBits?: number;\n}\n\nexport interface FixtureDef extends FixtureOpt {\n shape: Shape;\n}\n\nconst FixtureDefDefault: FixtureOpt = {\n userData : null,\n friction : 0.2,\n restitution : 0.0,\n density : 0.0,\n isSensor : false,\n\n filterGroupIndex : 0,\n filterCategoryBits : 0x0001,\n filterMaskBits : 0xFFFF\n};\n\n/**\n * This proxy is used internally to connect shape children to the broad-phase.\n */\nexport class FixtureProxy {\n aabb: AABB;\n fixture: Fixture;\n childIndex: number;\n proxyId: number;\n constructor(fixture: Fixture, childIndex: number) {\n this.aabb = new AABB();\n this.fixture = fixture;\n this.childIndex = childIndex;\n this.proxyId;\n }\n}\n\n/**\n * A fixture is used to attach a shape to a body for collision detection. A\n * fixture inherits its transform from its parent. Fixtures hold additional\n * non-geometric data such as friction, collision filters, etc.\n *\n * To create a new Fixture use {@link Body.createFixture}.\n */\nexport class Fixture {\n /** @internal */ m_body: Body;\n /** @internal */ m_friction: number;\n /** @internal */ m_restitution: number;\n /** @internal */ m_density: number;\n /** @internal */ m_isSensor: boolean;\n /** @internal */ m_filterGroupIndex: number;\n /** @internal */ m_filterCategoryBits: number;\n /** @internal */ m_filterMaskBits: number;\n /** @internal */ m_shape: Shape;\n /** @internal */ m_next: Fixture | null;\n /** @internal */ m_proxies: FixtureProxy[];\n /** @internal */ m_proxyCount: number;\n /** @internal */ m_userData: unknown;\n\n constructor(body: Body, def: FixtureDef);\n constructor(body: Body, shape: Shape, def?: FixtureOpt);\n constructor(body: Body, shape: Shape, density?: number);\n // tslint:disable-next-line:typedef\n /** @internal */ constructor(body: Body, shape?, def?) {\n if (shape.shape) {\n def = shape;\n shape = shape.shape;\n\n } else if (typeof def === 'number') {\n def = {density : def};\n }\n\n def = options(def, FixtureDefDefault);\n\n this.m_body = body;\n\n this.m_friction = def.friction;\n this.m_restitution = def.restitution;\n this.m_density = def.density;\n this.m_isSensor = def.isSensor;\n\n this.m_filterGroupIndex = def.filterGroupIndex;\n this.m_filterCategoryBits = def.filterCategoryBits;\n this.m_filterMaskBits = def.filterMaskBits;\n\n // TODO validate shape\n this.m_shape = shape; // .clone();\n\n this.m_next = null;\n\n this.m_proxies = [];\n this.m_proxyCount = 0;\n\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n\n this.m_userData = def.userData;\n }\n\n /**\n * Re-setup fixture.\n * @internal\n */\n _reset(): void {\n const body = this.getBody();\n const broadPhase = body.m_world.m_broadPhase;\n this.destroyProxies(broadPhase);\n if (this.m_shape._reset) {\n this.m_shape._reset();\n }\n const childCount = this.m_shape.getChildCount();\n for (let i = 0; i < childCount; ++i) {\n this.m_proxies[i] = new FixtureProxy(this, i);\n }\n this.createProxies(broadPhase, body.m_xf);\n body.resetMassData();\n }\n\n /** @internal */\n _serialize(): object {\n return {\n friction: this.m_friction,\n restitution: this.m_restitution,\n density: this.m_density,\n isSensor: this.m_isSensor,\n\n filterGroupIndex: this.m_filterGroupIndex,\n filterCategoryBits: this.m_filterCategoryBits,\n filterMaskBits: this.m_filterMaskBits,\n\n shape: this.m_shape,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, body: any, restore: any): Fixture {\n const shape = restore(Shape, data.shape);\n const fixture = shape && new Fixture(body, shape, data);\n return fixture;\n }\n\n /**\n * Get the type of the child shape. You can use this to down cast to the\n * concrete shape.\n */\n getType(): ShapeType {\n return this.m_shape.getType();\n }\n\n /**\n * Get the child shape. You can modify the child shape, however you should not\n * change the number of vertices because this will crash some collision caching\n * mechanisms. Manipulating the shape may lead to non-physical behavior.\n */\n getShape(): Shape {\n return this.m_shape;\n }\n\n /**\n * A sensor shape collects contact information but never generates a collision\n * response.\n */\n isSensor(): boolean {\n return this.m_isSensor;\n }\n\n /**\n * Set if this fixture is a sensor.\n */\n setSensor(sensor: boolean): void {\n if (sensor != this.m_isSensor) {\n this.m_body.setAwake(true);\n this.m_isSensor = sensor;\n }\n }\n\n // /**\n // * Get the contact filtering data.\n // */\n // getFilterData() {\n // return this.m_filter;\n // }\n\n /**\n * Get the user data that was assigned in the fixture definition. Use this to\n * store your application specific data.\n */\n getUserData(): unknown {\n return this.m_userData;\n }\n\n /**\n * Set the user data. Use this to store your application specific data.\n */\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get the parent body of this fixture. This is null if the fixture is not\n * attached.\n */\n getBody(): Body {\n return this.m_body;\n }\n\n /**\n * Get the next fixture in the parent body's fixture list.\n */\n getNext(): Fixture | null {\n return this.m_next;\n }\n\n /**\n * Get the density of this fixture.\n */\n getDensity(): number {\n return this.m_density;\n }\n\n /**\n * Set the density of this fixture. This will _not_ automatically adjust the\n * mass of the body. You must call Body.resetMassData to update the body's mass.\n */\n setDensity(density: number): void {\n _ASSERT && console.assert(Math.isFinite(density) && density >= 0.0);\n this.m_density = density;\n }\n\n /**\n * Get the coefficient of friction, usually in the range [0,1].\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Set the coefficient of friction. This will not change the friction of\n * existing contacts.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the coefficient of restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Set the coefficient of restitution. This will not change the restitution of\n * existing contacts.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Test a point in world coordinates for containment in this fixture.\n */\n testPoint(p: Vec2Value): boolean {\n return this.m_shape.testPoint(this.m_body.getTransform(), p);\n }\n\n /**\n * Cast a ray against this shape.\n */\n rayCast(output: RayCastOutput, input: RayCastInput, childIndex: number): boolean {\n return this.m_shape.rayCast(output, input, this.m_body.getTransform(), childIndex);\n }\n\n /**\n * Get the mass data for this fixture. The mass data is based on the density and\n * the shape. The rotational inertia is about the shape's origin. This operation\n * may be expensive.\n */\n getMassData(massData: MassData): void {\n this.m_shape.computeMass(massData, this.m_density);\n }\n\n /**\n * Get the fixture's AABB. This AABB may be enlarge and/or stale. If you need a\n * more accurate AABB, compute it using the shape and the body transform.\n */\n getAABB(childIndex: number): AABB {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_proxies.length);\n return this.m_proxies[childIndex].aabb;\n }\n\n /**\n * These support body activation/deactivation.\n */\n createProxies(broadPhase: BroadPhase, xf: Transform): void {\n _ASSERT && console.assert(this.m_proxyCount == 0);\n\n // Create proxies in the broad-phase.\n this.m_proxyCount = this.m_shape.getChildCount();\n\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n this.m_shape.computeAABB(proxy.aabb, xf, i);\n proxy.proxyId = broadPhase.createProxy(proxy.aabb, proxy);\n }\n }\n\n destroyProxies(broadPhase: BroadPhase): void {\n // Destroy proxies in the broad-phase.\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n broadPhase.destroyProxy(proxy.proxyId);\n proxy.proxyId = null;\n }\n\n this.m_proxyCount = 0;\n }\n\n /**\n * Updates this fixture proxy in broad-phase (with combined AABB of current and\n * next transformation).\n */\n synchronize(broadPhase: BroadPhase, xf1: Transform, xf2: Transform): void {\n for (let i = 0; i < this.m_proxyCount; ++i) {\n const proxy = this.m_proxies[i];\n // Compute an AABB that covers the swept shape (may miss some rotation\n // effect).\n const aabb1 = new AABB();\n const aabb2 = new AABB();\n this.m_shape.computeAABB(aabb1, xf1, proxy.childIndex);\n this.m_shape.computeAABB(aabb2, xf2, proxy.childIndex);\n\n proxy.aabb.combine(aabb1, aabb2);\n\n const displacement = Vec2.sub(xf2.p, xf1.p);\n\n broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement);\n }\n }\n\n /**\n * Set the contact filtering data. This will not update contacts until the next\n * time step when either parent body is active and awake. This automatically\n * calls refilter.\n */\n setFilterData(filter: { groupIndex: number, categoryBits: number, maskBits: number }): void {\n this.m_filterGroupIndex = filter.groupIndex;\n this.m_filterCategoryBits = filter.categoryBits;\n this.m_filterMaskBits = filter.maskBits;\n this.refilter();\n }\n\n getFilterGroupIndex(): number {\n return this.m_filterGroupIndex;\n }\n\n setFilterGroupIndex(groupIndex: number): void {\n this.m_filterGroupIndex = groupIndex;\n }\n\n getFilterCategoryBits(): number {\n return this.m_filterCategoryBits;\n }\n\n setFilterCategoryBits(categoryBits: number): void {\n this.m_filterCategoryBits = categoryBits;\n }\n\n getFilterMaskBits(): number {\n return this.m_filterMaskBits;\n }\n\n setFilterMaskBits(maskBits: number): void {\n this.m_filterMaskBits = maskBits;\n }\n\n /**\n * Call this if you want to establish collision that was previously disabled by\n * ContactFilter.\n */\n refilter(): void {\n if (this.m_body == null) {\n return;\n }\n\n // Flag associated contacts for filtering.\n let edge = this.m_body.getContactList();\n while (edge) {\n const contact = edge.contact;\n const fixtureA = contact.getFixtureA();\n const fixtureB = contact.getFixtureB();\n if (fixtureA == this || fixtureB == this) {\n contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n\n const world = this.m_body.getWorld();\n\n if (world == null) {\n return;\n }\n\n // Touch each proxy so that new pairs may be created\n const broadPhase = world.m_broadPhase;\n for (let i = 0; i < this.m_proxyCount; ++i) {\n broadPhase.touchProxy(this.m_proxies[i].proxyId);\n }\n }\n\n /**\n * Implement this method to provide collision filtering, if you want finer\n * control over contact creation.\n *\n * Return true if contact calculations should be performed between these two\n * fixtures.\n *\n * Warning: for performance reasons this is only called when the AABBs begin to\n * overlap.\n */\n shouldCollide(that: Fixture): boolean {\n\n if (that.m_filterGroupIndex === this.m_filterGroupIndex && that.m_filterGroupIndex !== 0) {\n return that.m_filterGroupIndex > 0;\n }\n\n const collideA = (that.m_filterMaskBits & this.m_filterCategoryBits) !== 0;\n const collideB = (that.m_filterCategoryBits & this.m_filterMaskBits) !== 0;\n const collide = collideA && collideB;\n return collide;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { Vec2, Vec2Value } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { math as Math } from '../common/Math';\nimport { Sweep } from '../common/Sweep';\nimport { Transform } from '../common/Transform';\nimport { Velocity } from './Velocity';\nimport { Position } from './Position';\nimport { Fixture, FixtureDef, FixtureOpt } from './Fixture';\nimport { Shape } from '../collision/Shape';\nimport { JointEdge } from \"./Joint\";\nimport { World } from \"./World\";\nimport { ContactEdge } from \"./Contact\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport type BodyType = 'static' | 'kinematic' | 'dynamic';\n\nconst STATIC = 'static';\nconst KINEMATIC = 'kinematic';\nconst DYNAMIC = 'dynamic';\n\nexport interface BodyDef {\n /**\n * Body types are static, kinematic, or dynamic. Note: if a dynamic\n * body would have zero mass, the mass is set to one.\n */\n type?: BodyType;\n /**\n * The world position of the body. Avoid creating bodies at the\n * origin since this can lead to many overlapping shapes.\n */\n position?: Vec2;\n /**\n * The world angle of the body in radians.\n */\n angle?: number;\n /**\n * The linear velocity of the body's origin in world co-ordinates.\n */\n linearVelocity?: Vec2;\n angularVelocity?: number;\n /**\n * Linear damping is use to reduce the linear velocity. The\n * damping parameter can be larger than 1.0 but the damping effect becomes\n * sensitive to the time step when the damping parameter is large.\n */\n linearDamping?: number;\n /**\n * Angular damping is use to reduce the angular velocity.\n * The damping parameter can be larger than 1.0 but the damping effect\n * becomes sensitive to the time step when the damping parameter is large.\n */\n angularDamping?: number;\n /**\n * Should this body be prevented from rotating? Useful for characters.\n */\n fixedRotation?: boolean;\n /**\n * Is this a fast moving body that should be prevented from\n * tunneling through other moving bodies? Note that all bodies are\n * prevented from tunneling through kinematic and static bodies. This\n * setting is only considered on dynamic bodies. Warning: You should use\n * this flag sparingly since it increases processing time.\n */\n bullet?: boolean;\n gravityScale?: number;\n /**\n * Set this flag to false if this body should never fall asleep. Note that this increases CPU usage.\n */\n allowSleep?: boolean;\n /**\n * Is this body initially awake or sleeping?\n */\n awake?: boolean;\n /**\n * Does this body start out active?\n */\n active?: boolean;\n userData?: any;\n}\n\nconst BodyDefDefault: BodyDef = {\n type : STATIC,\n position : Vec2.zero(),\n angle : 0.0,\n\n linearVelocity : Vec2.zero(),\n angularVelocity : 0.0,\n\n linearDamping : 0.0,\n angularDamping : 0.0,\n\n fixedRotation : false,\n bullet : false,\n gravityScale : 1.0,\n\n allowSleep : true,\n awake : true,\n active : true,\n\n userData : null\n};\n\n/**\n * MassData This holds the mass data computed for a shape.\n */\nexport class MassData {\n /** The mass of the shape, usually in kilograms. */\n mass: number = 0;\n /** The position of the shape's centroid relative to the shape's origin. */\n center: Vec2 = Vec2.zero();\n /** The rotational inertia of the shape about the local origin. */\n I: number = 0;\n}\n\n/**\n * A rigid body composed of one or more fixtures.\n *\n * To create a new Body use {@link World.createBody}.\n */\nexport class Body {\n /**\n * A static body does not move under simulation and behaves as if it has infinite mass.\n * Internally, zero is stored for the mass and the inverse mass.\n * Static bodies can be moved manually by the user.\n * A static body has zero velocity.\n * Static bodies do not collide with other static or kinematic bodies.\n */\n static readonly STATIC: BodyType = 'static';\n /**\n * A kinematic body moves under simulation according to its velocity.\n * Kinematic bodies do not respond to forces.\n * They can be moved manually by the user, but normally a kinematic body is moved by setting its velocity.\n * A kinematic body behaves as if it has infinite mass, however, zero is stored for the mass and the inverse mass.\n * Kinematic bodies do not collide with other kinematic or static bodies.\n */\n static readonly KINEMATIC: BodyType = 'kinematic';\n\n /**\n * A dynamic body is fully simulated.\n * They can be moved manually by the user, but normally they move according to forces.\n * A dynamic body can collide with all body types.\n * A dynamic body always has finite, non-zero mass.\n * If you try to set the mass of a dynamic body to zero, it will automatically acquire a mass of one kilogram and it won't rotate.\n */\n static readonly DYNAMIC: BodyType = 'dynamic';\n\n /** @internal */ m_world: World;\n /** @internal */ m_awakeFlag: boolean;\n /** @internal */ m_autoSleepFlag: boolean;\n /** @internal */ m_bulletFlag: boolean;\n /** @internal */ m_fixedRotationFlag: boolean;\n /** @internal */ m_activeFlag: boolean;\n /** @internal */ m_islandFlag: boolean;\n /** @internal */ m_toiFlag: boolean;\n /** @internal */ m_userData: unknown;\n /** @internal */ m_type: BodyType;\n /** @internal */ m_mass: number;\n /** @internal */ m_invMass: number;\n /** @internal Rotational inertia about the center of mass. */\n m_I: number;\n /** @internal */ m_invI: number;\n /** @internal the body origin transform */\n m_xf: Transform;\n /** @internal the swept motion for CCD */\n m_sweep: Sweep;\n // position and velocity correction\n /** @internal */ c_velocity: Velocity;\n /** @internal */ c_position: Position;\n /** @internal */ m_force: Vec2;\n /** @internal */ m_torque: number;\n /** @internal */ m_linearVelocity: Vec2;\n /** @internal */ m_angularVelocity: number;\n /** @internal */ m_linearDamping: number;\n /** @internal */ m_angularDamping: number;\n /** @internal */ m_gravityScale: number;\n /** @internal */ m_sleepTime: number;\n /** @internal */ m_jointList: JointEdge | null;\n /** @internal */ m_contactList: ContactEdge | null;\n /** @internal */ m_fixtureList: Fixture | null;\n /** @internal */ m_prev: Body | null;\n /** @internal */ m_next: Body | null;\n /** @internal */ m_destroyed: boolean;\n\n /** @internal */\n constructor(world: World, def: BodyDef) {\n def = options(def, BodyDefDefault);\n\n _ASSERT && console.assert(Vec2.isValid(def.position));\n _ASSERT && console.assert(Vec2.isValid(def.linearVelocity));\n _ASSERT && console.assert(Math.isFinite(def.angle));\n _ASSERT && console.assert(Math.isFinite(def.angularVelocity));\n _ASSERT && console.assert(Math.isFinite(def.angularDamping) && def.angularDamping >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.linearDamping) && def.linearDamping >= 0.0);\n\n this.m_world = world;\n\n this.m_awakeFlag = def.awake;\n this.m_autoSleepFlag = def.allowSleep;\n this.m_bulletFlag = def.bullet;\n this.m_fixedRotationFlag = def.fixedRotation;\n this.m_activeFlag = def.active;\n\n this.m_islandFlag = false;\n this.m_toiFlag = false;\n\n this.m_userData = def.userData;\n this.m_type = def.type;\n\n if (this.m_type == DYNAMIC) {\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n } else {\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n }\n\n // Rotational inertia about the center of mass.\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n // the body origin transform\n this.m_xf = Transform.identity();\n this.m_xf.p = Vec2.clone(def.position);\n this.m_xf.q.setAngle(def.angle);\n\n // the swept motion for CCD\n this.m_sweep = new Sweep();\n this.m_sweep.setTransform(this.m_xf);\n\n // position and velocity correction\n this.c_velocity = new Velocity();\n this.c_position = new Position();\n\n this.m_force = Vec2.zero();\n this.m_torque = 0.0;\n\n this.m_linearVelocity = Vec2.clone(def.linearVelocity);\n this.m_angularVelocity = def.angularVelocity;\n\n this.m_linearDamping = def.linearDamping;\n this.m_angularDamping = def.angularDamping;\n this.m_gravityScale = def.gravityScale;\n\n this.m_sleepTime = 0.0;\n\n this.m_jointList = null;\n this.m_contactList = null;\n this.m_fixtureList = null;\n\n this.m_prev = null;\n this.m_next = null;\n\n this.m_destroyed = false;\n }\n\n /** @internal */\n _serialize(): object {\n const fixtures = [];\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n fixtures.push(f);\n }\n return {\n type: this.m_type,\n bullet: this.m_bulletFlag,\n position: this.m_xf.p,\n angle: this.m_xf.q.getAngle(),\n linearVelocity: this.m_linearVelocity,\n angularVelocity: this.m_angularVelocity,\n fixtures,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): Body {\n const body = new Body(world, data);\n\n if (data.fixtures) {\n for (let i = data.fixtures.length - 1; i >= 0; i--) {\n const fixture = restore(Fixture, data.fixtures[i], body);\n body._addFixture(fixture);\n }\n }\n return body;\n }\n\n isWorldLocked(): boolean {\n return this.m_world && this.m_world.isLocked() ? true : false;\n }\n\n getWorld(): World {\n return this.m_world;\n }\n\n getNext(): Body | null {\n return this.m_next;\n }\n\n setUserData(data: any): void {\n this.m_userData = data;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n getFixtureList(): Fixture | null {\n return this.m_fixtureList;\n }\n\n getJointList(): JointEdge | null {\n return this.m_jointList;\n }\n\n /**\n * Warning: this list changes during the time step and you may miss some\n * collisions if you don't use ContactListener.\n */\n getContactList(): ContactEdge | null {\n return this.m_contactList;\n }\n\n isStatic(): boolean {\n return this.m_type == STATIC;\n }\n\n isDynamic(): boolean {\n return this.m_type == DYNAMIC;\n }\n\n isKinematic(): boolean {\n return this.m_type == KINEMATIC;\n }\n\n /**\n * This will alter the mass and velocity.\n */\n setStatic(): Body {\n this.setType(STATIC);\n return this;\n }\n\n setDynamic(): Body {\n this.setType(DYNAMIC);\n return this;\n }\n\n setKinematic(): Body {\n this.setType(KINEMATIC);\n return this;\n }\n\n /**\n * @internal\n */\n getType(): BodyType {\n return this.m_type;\n }\n\n /**\n * @internal\n */\n setType(type: BodyType): void {\n _ASSERT && console.assert(type === STATIC || type === KINEMATIC || type === DYNAMIC);\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type == type) {\n return;\n }\n\n this.m_type = type;\n\n this.resetMassData();\n\n if (this.m_type == STATIC) {\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_sweep.forward();\n this.synchronizeFixtures();\n }\n\n this.setAwake(true);\n\n this.m_force.setZero();\n this.m_torque = 0.0;\n\n // Delete the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n\n // Touch the proxies so that new contacts will be created (when appropriate)\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n const proxyCount = f.m_proxyCount;\n for (let i = 0; i < proxyCount; ++i) {\n broadPhase.touchProxy(f.m_proxies[i].proxyId);\n }\n }\n }\n\n isBullet(): boolean {\n return this.m_bulletFlag;\n }\n\n /**\n * Should this body be treated like a bullet for continuous collision detection?\n */\n setBullet(flag: boolean): void {\n this.m_bulletFlag = !!flag;\n }\n\n isSleepingAllowed(): boolean {\n return this.m_autoSleepFlag;\n }\n\n setSleepingAllowed(flag: boolean): void {\n this.m_autoSleepFlag = !!flag;\n if (this.m_autoSleepFlag == false) {\n this.setAwake(true);\n }\n }\n\n isAwake(): boolean {\n return this.m_awakeFlag;\n }\n\n /**\n * Set the sleep state of the body. A sleeping body has very low CPU cost.\n *\n * @param flag Set to true to wake the body, false to put it to sleep.\n */\n setAwake(flag: boolean): void {\n if (flag) {\n if (this.m_awakeFlag == false) {\n this.m_awakeFlag = true;\n this.m_sleepTime = 0.0;\n }\n } else {\n this.m_awakeFlag = false;\n this.m_sleepTime = 0.0;\n this.m_linearVelocity.setZero();\n this.m_angularVelocity = 0.0;\n this.m_force.setZero();\n this.m_torque = 0.0;\n }\n }\n\n isActive(): boolean {\n return this.m_activeFlag;\n }\n\n /**\n * Set the active state of the body. An inactive body is not simulated and\n * cannot be collided with or woken up. If you pass a flag of true, all fixtures\n * will be added to the broad-phase. If you pass a flag of false, all fixtures\n * will be removed from the broad-phase and all contacts will be destroyed.\n * Fixtures and joints are otherwise unaffected.\n *\n * You may continue to create/destroy fixtures and joints on inactive bodies.\n * Fixtures on an inactive body are implicitly inactive and will not participate\n * in collisions, ray-casts, or queries. Joints connected to an inactive body\n * are implicitly inactive. An inactive body is still owned by a World object\n * and remains\n */\n setActive(flag: boolean): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (flag == this.m_activeFlag) {\n return;\n }\n\n this.m_activeFlag = !!flag;\n\n if (this.m_activeFlag) {\n // Create all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.createProxies(broadPhase, this.m_xf);\n }\n // Contacts are created the next time step.\n\n } else {\n // Destroy all proxies.\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.destroyProxies(broadPhase);\n }\n\n // Destroy the attached contacts.\n let ce = this.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n this.m_world.destroyContact(ce0.contact);\n }\n this.m_contactList = null;\n }\n }\n\n isFixedRotation(): boolean {\n return this.m_fixedRotationFlag;\n }\n\n /**\n * Set this body to have fixed rotation. This causes the mass to be reset.\n */\n setFixedRotation(flag: boolean): void {\n if (this.m_fixedRotationFlag == flag) {\n return;\n }\n\n this.m_fixedRotationFlag = !!flag;\n\n this.m_angularVelocity = 0.0;\n\n this.resetMassData();\n }\n\n /**\n * Get the world transform for the body's origin.\n */\n getTransform(): Transform {\n return this.m_xf;\n }\n\n /**\n * Set the position of the body's origin and rotation. Manipulating a body's\n * transform may cause non-physical behavior. Note: contacts are updated on the\n * next call to World.step.\n *\n * @param position The world position of the body's local origin.\n * @param angle The world rotation in radians.\n */\n setTransform(position: Vec2, angle: number): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n this.m_xf.setNum(position, angle);\n this.m_sweep.setTransform(this.m_xf);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, this.m_xf, this.m_xf);\n }\n }\n\n synchronizeTransform(): void {\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Update fixtures in broad-phase.\n */\n synchronizeFixtures(): void {\n const xf = Transform.identity();\n\n this.m_sweep.getTransform(xf, 0);\n\n const broadPhase = this.m_world.m_broadPhase;\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n f.synchronize(broadPhase, xf, this.m_xf);\n }\n }\n\n /**\n * Used in TOI.\n */\n advance(alpha: number): void {\n // Advance to the new safe time. This doesn't sync the broad-phase.\n this.m_sweep.advance(alpha);\n this.m_sweep.c.setVec2(this.m_sweep.c0);\n this.m_sweep.a = this.m_sweep.a0;\n this.m_sweep.getTransform(this.m_xf, 1);\n }\n\n /**\n * Get the world position for the body's origin.\n */\n getPosition(): Vec2 {\n return this.m_xf.p;\n }\n\n setPosition(p: Vec2): void {\n this.setTransform(p, this.m_sweep.a);\n }\n\n /**\n * Get the current world rotation angle in radians.\n */\n getAngle(): number {\n return this.m_sweep.a;\n }\n\n setAngle(angle: number): void {\n this.setTransform(this.m_xf.p, angle);\n }\n\n /**\n * Get the world position of the center of mass.\n */\n getWorldCenter(): Vec2 {\n return this.m_sweep.c;\n }\n\n /**\n * Get the local position of the center of mass.\n */\n getLocalCenter(): Vec2 {\n return this.m_sweep.localCenter;\n }\n\n /**\n * Get the linear velocity of the center of mass.\n *\n * @return the linear velocity of the center of mass.\n */\n getLinearVelocity(): Vec2 {\n return this.m_linearVelocity;\n }\n\n /**\n * Get the world linear velocity of a world point attached to this body.\n *\n * @param worldPoint A point in world coordinates.\n */\n getLinearVelocityFromWorldPoint(worldPoint: Vec2): Vec2 {\n const localCenter = Vec2.sub(worldPoint, this.m_sweep.c);\n return Vec2.add(this.m_linearVelocity, Vec2.crossNumVec2(this.m_angularVelocity,\n localCenter));\n }\n\n /**\n * Get the world velocity of a local point.\n *\n * @param localPoint A point in local coordinates.\n */\n getLinearVelocityFromLocalPoint(localPoint: Vec2): Vec2 {\n return this.getLinearVelocityFromWorldPoint(this.getWorldPoint(localPoint));\n }\n\n /**\n * Set the linear velocity of the center of mass.\n *\n * @param v The new linear velocity of the center of mass.\n */\n setLinearVelocity(v: Vec2): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (Vec2.dot(v, v) > 0.0) {\n this.setAwake(true);\n }\n this.m_linearVelocity.setVec2(v);\n }\n\n /**\n * Get the angular velocity.\n *\n * @returns the angular velocity in radians/second.\n */\n getAngularVelocity(): number {\n return this.m_angularVelocity;\n }\n\n /**\n * Set the angular velocity.\n *\n * @param omega The new angular velocity in radians/second.\n */\n setAngularVelocity(w: number): void {\n if (this.m_type == STATIC) {\n return;\n }\n if (w * w > 0.0) {\n this.setAwake(true);\n }\n this.m_angularVelocity = w;\n }\n\n getLinearDamping(): number {\n return this.m_linearDamping;\n }\n\n setLinearDamping(linearDamping: number): void {\n this.m_linearDamping = linearDamping;\n }\n\n getAngularDamping(): number {\n return this.m_angularDamping;\n }\n\n setAngularDamping(angularDamping: number): void {\n this.m_angularDamping = angularDamping;\n }\n\n getGravityScale(): number {\n return this.m_gravityScale;\n }\n\n /**\n * Scale the gravity applied to this body.\n */\n setGravityScale(scale: number): void {\n this.m_gravityScale = scale;\n }\n\n /**\n * Get the total mass of the body.\n *\n * @returns The mass, usually in kilograms (kg).\n */\n getMass(): number {\n return this.m_mass;\n }\n\n /**\n * Get the rotational inertia of the body about the local origin.\n *\n * @return the rotational inertia, usually in kg-m^2.\n */\n getInertia(): number {\n return this.m_I + this.m_mass\n * Vec2.dot(this.m_sweep.localCenter, this.m_sweep.localCenter);\n }\n\n /**\n * Copy the mass data of the body to data.\n */\n getMassData(data: MassData): void {\n data.mass = this.m_mass;\n data.I = this.getInertia();\n data.center.setVec2(this.m_sweep.localCenter);\n }\n\n /**\n * This resets the mass properties to the sum of the mass properties of the\n * fixtures. This normally does not need to be called unless you called\n * SetMassData to override the mass and you later want to reset the mass.\n */\n resetMassData(): void {\n // Compute mass data from shapes. Each shape has its own density.\n this.m_mass = 0.0;\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n this.m_sweep.localCenter.setZero();\n\n // Static and kinematic bodies have zero mass.\n if (this.isStatic() || this.isKinematic()) {\n this.m_sweep.c0.setVec2(this.m_xf.p);\n this.m_sweep.c.setVec2(this.m_xf.p);\n this.m_sweep.a0 = this.m_sweep.a;\n return;\n }\n\n _ASSERT && console.assert(this.isDynamic());\n\n // Accumulate mass over all fixtures.\n const localCenter = Vec2.zero();\n for (let f = this.m_fixtureList; f; f = f.m_next) {\n if (f.m_density == 0.0) {\n continue;\n }\n\n const massData = new MassData();\n f.getMassData(massData);\n this.m_mass += massData.mass;\n localCenter.addMul(massData.mass, massData.center);\n this.m_I += massData.I;\n }\n\n // Compute center of mass.\n if (this.m_mass > 0.0) {\n this.m_invMass = 1.0 / this.m_mass;\n localCenter.mul(this.m_invMass);\n\n } else {\n // Force all dynamic bodies to have a positive mass.\n this.m_mass = 1.0;\n this.m_invMass = 1.0;\n }\n\n if (this.m_I > 0.0 && this.m_fixedRotationFlag == false) {\n // Center the inertia about the center of mass.\n this.m_I -= this.m_mass * Vec2.dot(localCenter, localCenter);\n _ASSERT && console.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n\n } else {\n this.m_I = 0.0;\n this.m_invI = 0.0;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(localCenter, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Set the mass properties to override the mass properties of the fixtures. Note\n * that this changes the center of mass position. Note that creating or\n * destroying fixtures can also alter the mass. This function has no effect if\n * the body isn't dynamic.\n *\n * @param massData The mass properties.\n */\n setMassData(massData: MassData): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n if (this.isWorldLocked() == true) {\n return;\n }\n\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n this.m_invMass = 0.0;\n this.m_I = 0.0;\n this.m_invI = 0.0;\n\n this.m_mass = massData.mass;\n if (this.m_mass <= 0.0) {\n this.m_mass = 1.0;\n }\n\n this.m_invMass = 1.0 / this.m_mass;\n\n if (massData.I > 0.0 && this.m_fixedRotationFlag == false) {\n this.m_I = massData.I - this.m_mass\n * Vec2.dot(massData.center, massData.center);\n _ASSERT && console.assert(this.m_I > 0.0);\n this.m_invI = 1.0 / this.m_I;\n }\n\n // Move center of mass.\n const oldCenter = Vec2.clone(this.m_sweep.c);\n this.m_sweep.setLocalCenter(massData.center, this.m_xf);\n\n // Update center of mass velocity.\n this.m_linearVelocity.add(Vec2.crossNumVec2(this.m_angularVelocity, Vec2.sub(\n this.m_sweep.c, oldCenter)));\n }\n\n /**\n * Apply a force at a world point. If the force is not applied at the center of\n * mass, it will generate a torque and affect the angular velocity. This wakes\n * up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyForce(force: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping.\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n this.m_torque += Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), force);\n }\n }\n\n /**\n * Apply a force to the center of mass. This wakes up the body.\n *\n * @param force The world force vector, usually in Newtons (N).\n * @param wake Also wake up the body\n */\n applyForceToCenter(force: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_force.add(force);\n }\n }\n\n /**\n * Apply a torque. This affects the angular velocity without affecting the\n * linear velocity of the center of mass. This wakes up the body.\n *\n * @param torque About the z-axis (out of the screen), usually in N-m.\n * @param wake Also wake up the body\n */\n applyTorque(torque: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate a force if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_torque += torque;\n }\n }\n\n /**\n * Apply an impulse at a point. This immediately modifies the velocity. It also\n * modifies the angular velocity if the point of application is not at the\n * center of mass. This wakes up the body.\n *\n * @param impulse The world impulse vector, usually in N-seconds or kg-m/s.\n * @param point The world position of the point of application.\n * @param wake Also wake up the body\n */\n applyLinearImpulse(impulse: Vec2, point: Vec2, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_linearVelocity.addMul(this.m_invMass, impulse);\n this.m_angularVelocity += this.m_invI * Vec2.crossVec2Vec2(Vec2.sub(point, this.m_sweep.c), impulse);\n }\n }\n\n /**\n * Apply an angular impulse.\n *\n * @param impulse The angular impulse in units of kg*m*m/s\n * @param wake Also wake up the body\n */\n applyAngularImpulse(impulse: number, wake: boolean = true): void {\n if (this.m_type != DYNAMIC) {\n return;\n }\n\n if (wake && this.m_awakeFlag == false) {\n this.setAwake(true);\n }\n // Don't accumulate velocity if the body is sleeping\n if (this.m_awakeFlag) {\n this.m_angularVelocity += this.m_invI * impulse;\n }\n }\n\n /**\n * This is used to prevent connected bodies (by joints) from colliding,\n * depending on the joint's collideConnected flag.\n */\n shouldCollide(that: Body): boolean {\n // At least one body should be dynamic.\n if (this.m_type != DYNAMIC && that.m_type != DYNAMIC) {\n return false;\n }\n // Does a joint prevent collision?\n for (let jn = this.m_jointList; jn; jn = jn.next) {\n if (jn.other == that) {\n if (jn.joint.m_collideConnected == false) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addFixture(fixture: Fixture): Fixture {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.createProxies(broadPhase, this.m_xf);\n }\n\n fixture.m_next = this.m_fixtureList;\n this.m_fixtureList = fixture;\n\n // Adjust mass properties if needed.\n if (fixture.m_density > 0.0) {\n this.resetMassData();\n }\n\n // Let the world know we have a new fixture. This will cause new contacts\n // to be created at the beginning of the next time step.\n this.m_world.m_newFixture = true;\n\n return fixture;\n }\n\n /**\n * Creates a fixture and attach it to this body.\n *\n * If the density is non-zero, this function automatically updates the mass of\n * the body.\n *\n * Contacts are not created until the next time step.\n *\n * Warning: This function is locked during callbacks.\n */\n createFixture(def: FixtureDef): Fixture;\n createFixture(shape: Shape, opt?: FixtureOpt): Fixture;\n createFixture(shape: Shape, density?: number): Fixture;\n // tslint:disable-next-line:typedef\n createFixture(shape, fixdef?) {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return null;\n }\n\n const fixture = new Fixture(this, shape, fixdef);\n this._addFixture(fixture);\n return fixture;\n }\n\n /**\n * Destroy a fixture. This removes the fixture from the broad-phase and destroys\n * all contacts associated with this fixture. This will automatically adjust the\n * mass of the body if the body is dynamic and the fixture has positive density.\n * All fixtures attached to a body are implicitly destroyed when the body is\n * destroyed.\n *\n * Warning: This function is locked during callbacks.\n *\n * @param fixture The fixture to be removed.\n */\n destroyFixture(fixture: Fixture): void {\n _ASSERT && console.assert(this.isWorldLocked() == false);\n\n if (this.isWorldLocked() == true) {\n return;\n }\n\n _ASSERT && console.assert(fixture.m_body == this);\n\n // Remove the fixture from this body's singly linked list.\n let found = false;\n if (this.m_fixtureList === fixture) {\n this.m_fixtureList = fixture.m_next;\n found = true;\n\n } else {\n let node = this.m_fixtureList;\n while (node != null) {\n if (node.m_next === fixture) {\n node.m_next = fixture.m_next;\n found = true;\n break;\n }\n node = node.m_next;\n }\n }\n\n // You tried to remove a shape that is not attached to this body.\n _ASSERT && console.assert(found);\n\n // Destroy any contacts associated with the fixture.\n let edge = this.m_contactList;\n while (edge) {\n const c = edge.contact;\n edge = edge.next;\n\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n\n if (fixture == fixtureA || fixture == fixtureB) {\n // This destroys the contact and removes it from\n // this body's contact list.\n this.m_world.destroyContact(c);\n }\n }\n\n if (this.m_activeFlag) {\n const broadPhase = this.m_world.m_broadPhase;\n fixture.destroyProxies(broadPhase);\n }\n\n fixture.m_body = null;\n fixture.m_next = null;\n\n this.m_world.publish('remove-fixture', fixture);\n\n // Reset the mass data.\n this.resetMassData();\n }\n\n /**\n * Get the corresponding world point of a local point.\n */\n getWorldPoint(localPoint: Vec2): Vec2 {\n return Transform.mulVec2(this.m_xf, localPoint);\n }\n\n /**\n * Get the corresponding world vector of a local vector.\n */\n getWorldVector(localVector: Vec2): Vec2 {\n return Rot.mulVec2(this.m_xf.q, localVector);\n }\n\n /**\n * Gets the corresponding local point of a world point.\n */\n getLocalPoint(worldPoint: Vec2Value): Vec2 {\n return Transform.mulTVec2(this.m_xf, worldPoint);\n }\n\n /**\n * Gets the corresponding local vector of a world vector.\n */\n getLocalVector(worldVector: Vec2Value): Vec2 {\n return Rot.mulTVec2(this.m_xf.q, worldVector);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { Vec2 } from '../common/Vec2';\nimport type { Body } from './Body';\nimport { TimeStep } from \"./Solver\";\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n/**\n * A joint edge is used to connect bodies and joints together in a joint graph\n * where each body is a node and each joint is an edge. A joint edge belongs to\n * a doubly linked list maintained in each attached body. Each joint has two\n * joint nodes, one for each attached body.\n */\nexport class JointEdge {\n /**\n * provides quick access to the other body attached.\n */\n other: Body | null = null;\n /**\n * the joint\n */\n joint: Joint | null = null;\n /**\n * prev the previous joint edge in the body's joint list\n */\n prev: JointEdge | null = null;\n /**\n * the next joint edge in the body's joint list\n */\n next: JointEdge | null = null;\n}\n\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointOpt {\n /**\n * Use this to attach application specific data to your joints.\n */\n userData?: any;\n /**\n * Set this flag to true if the attached bodies\n * should collide.\n */\n collideConnected?: boolean;\n}\n/**\n * Joint definitions are used to construct joints.\n */\nexport interface JointDef extends JointOpt {\n /**\n * The first attached body.\n */\n bodyA: Body;\n /**\n * The second attached body.\n */\n bodyB: Body;\n}\n\nconst DEFAULTS = {\n userData : null,\n collideConnected : false\n};\n\n/**\n * The base joint class. Joints are used to constraint two bodies together in\n * various fashions. Some joints also feature limits and motors.\n */\nexport abstract class Joint {\n\n /** @internal */ m_type: string = 'unknown-joint';\n\n /** @internal */ m_bodyA: Body;\n /** @internal */ m_bodyB: Body;\n\n /** @internal */ m_collideConnected: boolean;\n\n /** @internal */ m_prev: Joint | null = null;\n /** @internal */ m_next: Joint | null = null;\n\n /** @internal */ m_edgeA: JointEdge = new JointEdge();\n /** @internal */ m_edgeB: JointEdge = new JointEdge();\n\n /** @internal */ m_islandFlag: boolean = false;\n /** @internal */ m_userData: unknown;\n\n constructor(def: JointDef);\n constructor(def: JointOpt, bodyA: Body, bodyB: Body);\n constructor(def: JointDef | JointOpt, bodyA?: Body, bodyB?: Body) {\n bodyA = 'bodyA' in def ? def.bodyA : bodyA;\n bodyB = 'bodyB' in def ? def.bodyB : bodyB;\n\n _ASSERT && console.assert(!!bodyA);\n _ASSERT && console.assert(!!bodyB);\n _ASSERT && console.assert(bodyA != bodyB);\n\n this.m_bodyA = bodyA!;\n this.m_bodyB = bodyB!;\n\n this.m_collideConnected = !!def.collideConnected;\n this.m_userData = def.userData;\n }\n\n /**\n * Short-cut function to determine if either body is inactive.\n */\n isActive(): boolean {\n return this.m_bodyA.isActive() && this.m_bodyB.isActive();\n }\n\n /**\n * Get the type of the concrete joint.\n */\n getType(): string {\n return this.m_type;\n }\n\n /**\n * Get the first body attached to this joint.\n */\n getBodyA(): Body {\n return this.m_bodyA;\n }\n\n /**\n * Get the second body attached to this joint.\n */\n getBodyB(): Body {\n return this.m_bodyB;\n }\n\n /**\n * Get the next joint the world joint list.\n */\n getNext(): Joint {\n return this.m_next;\n }\n\n getUserData(): unknown {\n return this.m_userData;\n }\n\n setUserData(data: unknown): void {\n this.m_userData = data;\n }\n\n /**\n * Get collide connected. Note: modifying the collide connect flag won't work\n * correctly because the flag is only checked when fixture AABBs begin to\n * overlap.\n */\n getCollideConnected(): boolean {\n return this.m_collideConnected;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n abstract getAnchorA(): Vec2;\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n abstract getAnchorB(): Vec2;\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n abstract getReactionForce(inv_dt: number): Vec2;\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n abstract getReactionTorque(inv_dt: number): number;\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2): void {}\n\n abstract initVelocityConstraints(step: TimeStep): void;\n\n abstract solveVelocityConstraints(step: TimeStep): void;\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n abstract solvePositionConstraints(step: TimeStep): boolean;\n\n}\n","export const stats = {\n gjkCalls: 0,\n gjkIters: 0,\n gjkMaxIters: 0,\n\n toiTime: 0,\n toiMaxTime: 0,\n toiCalls: 0,\n toiIters: 0,\n toiMaxIters: 0,\n toiRootIters: 0,\n toiMaxRootIters: 0,\n\n toString(newline?: string): string {\n newline = typeof newline === 'string' ? newline : '\\n';\n let string = \"\";\n // tslint:disable-next-line:no-for-in\n for (const name in this) {\n if (typeof this[name] !== 'function' && typeof this[name] !== 'object') {\n string += name + ': ' + this[name] + newline;\n }\n }\n return string;\n }\n};\n","export const now = function(): number {\n return Date.now();\n};\n\nexport const diff = function(time: number): number {\n return Date.now() - time;\n};\n\nexport default {\n now,\n diff,\n};\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { stats } from '../util/stats';\nimport { Shape } from './Shape';\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Transform } from '../common/Transform';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates.\n */\n\nstats.gjkCalls = 0;\nstats.gjkIters = 0;\nstats.gjkMaxIters = 0;\n\n/**\n * Input for Distance. You have to option to use the shape radii in the\n * computation. Even\n */\nexport class DistanceInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n transformA: Transform | null = null;\n transformB: Transform | null = null;\n useRadii: boolean = false;\n}\n\n/**\n * Output for Distance.\n *\n * @prop {Vec2} pointA closest point on shapeA\n * @prop {Vec2} pointB closest point on shapeB\n * @prop distance\n * @prop iterations number of GJK iterations used\n */\nexport class DistanceOutput {\n pointA: Vec2 = Vec2.zero();\n pointB: Vec2 = Vec2.zero();\n distance: number;\n iterations: number;\n}\n\n/**\n * Used to warm start Distance. Set count to zero on first call.\n *\n * @prop {number} metric length or area\n * @prop {array} indexA vertices on shape A\n * @prop {array} indexB vertices on shape B\n * @prop {number} count\n */\nexport class SimplexCache {\n metric: number = 0;\n indexA: number[] = [];\n indexB: number[] = [];\n count: number = 0;\n}\n\n/**\n * Compute the closest points between two shapes. Supports any combination of:\n * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On\n * the first call set SimplexCache.count to zero.\n */\nexport const Distance = function (output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void {\n ++stats.gjkCalls;\n\n const proxyA = input.proxyA;\n const proxyB = input.proxyB;\n const xfA = input.transformA;\n const xfB = input.transformB;\n\n // Initialize the simplex.\n const simplex = new Simplex();\n simplex.readCache(cache, proxyA, xfA, proxyB, xfB);\n\n // Get simplex vertices as an array.\n const vertices = simplex.m_v;\n const k_maxIters = Settings.maxDistnceIterations;\n\n // These store the vertices of the last simplex so that we\n // can check for duplicates and prevent cycling.\n const saveA = [];\n const saveB = []; // int[3]\n let saveCount = 0;\n\n let distanceSqr1 = Infinity;\n let distanceSqr2 = Infinity;\n\n // Main iteration loop.\n let iter = 0;\n while (iter < k_maxIters) {\n // Copy simplex so we can identify duplicates.\n saveCount = simplex.m_count;\n for (let i = 0; i < saveCount; ++i) {\n saveA[i] = vertices[i].indexA;\n saveB[i] = vertices[i].indexB;\n }\n\n simplex.solve();\n\n // If we have 3 points, then the origin is in the corresponding triangle.\n if (simplex.m_count === 3) {\n break;\n }\n\n // Compute closest point.\n const p = simplex.getClosestPoint();\n distanceSqr2 = p.lengthSquared();\n\n // Ensure progress\n if (distanceSqr2 >= distanceSqr1) {\n // break;\n }\n distanceSqr1 = distanceSqr2;\n\n // Get search direction.\n const d = simplex.getSearchDirection();\n\n // Ensure the search direction is numerically fit.\n if (d.lengthSquared() < Math.EPSILON * Math.EPSILON) {\n // The origin is probably contained by a line segment\n // or triangle. Thus the shapes are overlapped.\n\n // We can't return zero here even though there may be overlap.\n // In case the simplex is a point, segment, or triangle it is difficult\n // to determine if the origin is contained in the CSO or very close to it.\n break;\n }\n\n // Compute a tentative new simplex vertex using support points.\n const vertex = vertices[simplex.m_count]; // SimplexVertex\n\n vertex.indexA = proxyA.getSupport(Rot.mulTVec2(xfA.q, Vec2.neg(d)));\n vertex.wA = Transform.mulVec2(xfA, proxyA.getVertex(vertex.indexA));\n\n vertex.indexB = proxyB.getSupport(Rot.mulTVec2(xfB.q, d));\n vertex.wB = Transform.mulVec2(xfB, proxyB.getVertex(vertex.indexB));\n\n vertex.w = Vec2.sub(vertex.wB, vertex.wA);\n\n // Iteration count is equated to the number of support point calls.\n ++iter;\n ++stats.gjkIters;\n\n // Check for duplicate support points. This is the main termination\n // criteria.\n let duplicate = false;\n for (let i = 0; i < saveCount; ++i) {\n if (vertex.indexA === saveA[i] && vertex.indexB === saveB[i]) {\n duplicate = true;\n break;\n }\n }\n\n // If we found a duplicate support point we must exit to avoid cycling.\n if (duplicate) {\n break;\n }\n\n // New vertex is ok and needed.\n ++simplex.m_count;\n }\n\n stats.gjkMaxIters = Math.max(stats.gjkMaxIters, iter);\n\n // Prepare output.\n simplex.getWitnessPoints(output.pointA, output.pointB);\n output.distance = Vec2.distance(output.pointA, output.pointB);\n output.iterations = iter;\n\n // Cache the simplex.\n simplex.writeCache(cache);\n\n // Apply radii if requested.\n if (input.useRadii) {\n const rA = proxyA.m_radius;\n const rB = proxyB.m_radius;\n\n if (output.distance > rA + rB && output.distance > Math.EPSILON) {\n // Shapes are still no overlapped.\n // Move the witness points to the outer surface.\n output.distance -= rA + rB;\n const normal = Vec2.sub(output.pointB, output.pointA);\n normal.normalize();\n output.pointA.addMul(rA, normal);\n output.pointB.subMul(rB, normal);\n } else {\n // Shapes are overlapped when radii are considered.\n // Move the witness points to the middle.\n const p = Vec2.mid(output.pointA, output.pointB);\n output.pointA.setVec2(p);\n output.pointB.setVec2(p);\n output.distance = 0.0;\n }\n }\n}\n\n/**\n * A distance proxy is used by the GJK algorithm. It encapsulates any shape.\n */\nexport class DistanceProxy {\n /** internal */ m_buffer: Vec2[];\n /** internal */ m_vertices: Vec2[];\n /** internal */ m_count: number;\n /** internal */ m_radius: number;\n\n\n constructor() {\n this.m_buffer = []; // Vec2[2]\n this.m_vertices = []; // Vec2[]\n this.m_count = 0;\n this.m_radius = 0;\n }\n\n /**\n * Get the vertex count.\n */\n getVertexCount(): number {\n return this.m_count;\n }\n\n /**\n * Get a vertex by index. Used by Distance.\n */\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * Get the supporting vertex index in the given direction.\n */\n getSupport(d: Vec2): number {\n let bestIndex = 0;\n let bestValue = Vec2.dot(this.m_vertices[0], d);\n for (let i = 0; i < this.m_count; ++i) {\n const value = Vec2.dot(this.m_vertices[i], d);\n if (value > bestValue) {\n bestIndex = i;\n bestValue = value;\n }\n }\n return bestIndex;\n }\n\n /**\n * Get the supporting vertex in the given direction.\n */\n getSupportVertex(d: Vec2): Vec2 {\n return this.m_vertices[this.getSupport(d)];\n }\n\n /**\n * Initialize the proxy using the given shape. The shape must remain in scope\n * while the proxy is in use.\n */\n set(shape: Shape, index: number): void {\n // TODO remove, use shape instead\n _ASSERT && console.assert(typeof shape.computeDistanceProxy === 'function');\n shape.computeDistanceProxy(this, index);\n }\n}\n\nclass SimplexVertex {\n /** support point in proxyA */\n wA: Vec2 = Vec2.zero();\n /** wA index */\n indexA: number;\n\n /** support point in proxyB */\n wB: Vec2 = Vec2.zero();\n /** wB index */\n indexB: number;\n\n /** wB - wA; */\n w: Vec2 = Vec2.zero();\n /** barycentric coordinate for closest point */\n a: number;\n\n set(v: SimplexVertex): void {\n this.indexA = v.indexA;\n this.indexB = v.indexB;\n this.wA = Vec2.clone(v.wA);\n this.wB = Vec2.clone(v.wB);\n this.w = Vec2.clone(v.w);\n this.a = v.a;\n }\n}\n\nclass Simplex {\n m_v1: SimplexVertex;\n m_v2: SimplexVertex;\n m_v3: SimplexVertex;\n m_v: SimplexVertex[];\n m_count: number;\n\n constructor() {\n this.m_v1 = new SimplexVertex();\n this.m_v2 = new SimplexVertex();\n this.m_v3 = new SimplexVertex();\n this.m_v = [ this.m_v1, this.m_v2, this.m_v3 ];\n this.m_count;\n }\n\n /** @internal */\n toString(): string {\n if (this.m_count === 3) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y,\n this.m_v3.a, this.m_v3.wA.x, this.m_v3.wA.y, this.m_v3.wB.x, this.m_v3.wB.y\n ].toString();\n\n } else if (this.m_count === 2) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y,\n this.m_v2.a, this.m_v2.wA.x, this.m_v2.wA.y, this.m_v2.wB.x, this.m_v2.wB.y\n ].toString();\n\n } else if (this.m_count === 1) {\n return [\"+\" + this.m_count,\n this.m_v1.a, this.m_v1.wA.x, this.m_v1.wA.y, this.m_v1.wB.x, this.m_v1.wB.y\n ].toString();\n\n } else {\n return \"+\" + this.m_count;\n }\n }\n\n readCache(cache: SimplexCache, proxyA: DistanceProxy, transformA: Transform, proxyB: DistanceProxy, transformB: Transform): void {\n _ASSERT && console.assert(cache.count <= 3);\n\n // Copy data from cache.\n this.m_count = cache.count;\n for (let i = 0; i < this.m_count; ++i) {\n const v = this.m_v[i];\n v.indexA = cache.indexA[i];\n v.indexB = cache.indexB[i];\n const wALocal = proxyA.getVertex(v.indexA);\n const wBLocal = proxyB.getVertex(v.indexB);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 0.0;\n }\n\n // Compute the new simplex metric, if it is substantially different than\n // old metric then flush the simplex.\n if (this.m_count > 1) {\n const metric1 = cache.metric;\n const metric2 = this.getMetric();\n if (metric2 < 0.5 * metric1 || 2.0 * metric1 < metric2\n || metric2 < Math.EPSILON) {\n // Reset the simplex.\n this.m_count = 0;\n }\n }\n\n // If the cache is empty or invalid...\n if (this.m_count === 0) {\n const v = this.m_v[0];\n v.indexA = 0;\n v.indexB = 0;\n const wALocal = proxyA.getVertex(0);\n const wBLocal = proxyB.getVertex(0);\n v.wA = Transform.mulVec2(transformA, wALocal);\n v.wB = Transform.mulVec2(transformB, wBLocal);\n v.w = Vec2.sub(v.wB, v.wA);\n v.a = 1.0;\n this.m_count = 1;\n }\n }\n\n writeCache(cache: SimplexCache): void {\n cache.metric = this.getMetric();\n cache.count = this.m_count;\n for (let i = 0; i < this.m_count; ++i) {\n cache.indexA[i] = this.m_v[i].indexA;\n cache.indexB[i] = this.m_v[i].indexB;\n }\n }\n\n getSearchDirection(): Vec2 {\n switch (this.m_count) {\n case 1:\n return Vec2.neg(this.m_v1.w);\n\n case 2: {\n const e12 = Vec2.sub(this.m_v2.w, this.m_v1.w);\n const sgn = Vec2.crossVec2Vec2(e12, Vec2.neg(this.m_v1.w));\n if (sgn > 0.0) {\n // Origin is left of e12.\n return Vec2.crossNumVec2(1.0, e12);\n } else {\n // Origin is right of e12.\n return Vec2.crossVec2Num(e12, 1.0);\n }\n }\n\n default:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n }\n }\n\n getClosestPoint(): Vec2 {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n\n case 1:\n return Vec2.clone(this.m_v1.w);\n\n case 2:\n return Vec2.combine(this.m_v1.a, this.m_v1.w, this.m_v2.a, this.m_v2.w);\n\n case 3:\n return Vec2.zero();\n\n default:\n _ASSERT && console.assert(false);\n return Vec2.zero();\n }\n }\n\n getWitnessPoints(pA: Vec2, pB: Vec2): void {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n break;\n\n case 1:\n pA.setVec2(this.m_v1.wA);\n pB.setVec2(this.m_v1.wB);\n break;\n\n case 2:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pB.setCombine(this.m_v1.a, this.m_v1.wB, this.m_v2.a, this.m_v2.wB);\n break;\n\n case 3:\n pA.setCombine(this.m_v1.a, this.m_v1.wA, this.m_v2.a, this.m_v2.wA);\n pA.addMul(this.m_v3.a, this.m_v3.wA);\n pB.setVec2(pA);\n break;\n\n default:\n _ASSERT && console.assert(false);\n break;\n }\n }\n\n getMetric(): number {\n switch (this.m_count) {\n case 0:\n _ASSERT && console.assert(false);\n return 0.0;\n\n case 1:\n return 0.0;\n\n case 2:\n return Vec2.distance(this.m_v1.w, this.m_v2.w);\n\n case 3:\n return Vec2.crossVec2Vec2(Vec2.sub(this.m_v2.w, this.m_v1.w), Vec2.sub(this.m_v3.w,\n this.m_v1.w));\n\n default:\n _ASSERT && console.assert(false);\n return 0.0;\n }\n }\n\n solve(): void {\n switch (this.m_count) {\n case 1:\n break;\n\n case 2:\n this.solve2();\n break;\n\n case 3:\n this.solve3();\n break;\n\n default:\n _ASSERT && console.assert(false);\n }\n }\n\n// Solve a line segment using barycentric coordinates.\n//\n// p = a1 * w1 + a2 * w2\n// a1 + a2 = 1\n//\n// The vector from the origin to the closest point on the line is\n// perpendicular to the line.\n// e12 = w2 - w1\n// dot(p, e) = 0\n// a1 * dot(w1, e) + a2 * dot(w2, e) = 0\n//\n// 2-by-2 linear system\n// [1 1 ][a1] = [1]\n// [w1.e12 w2.e12][a2] = [0]\n//\n// Define\n// d12_1 = dot(w2, e12)\n// d12_2 = -dot(w1, e12)\n// d12 = d12_1 + d12_2\n//\n// Solution\n// a1 = d12_1 / d12\n// a2 = d12_2 / d12\n solve2(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const e12 = Vec2.sub(w2, w1);\n\n // w1 region\n const d12_2 = -Vec2.dot(w1, e12);\n if (d12_2 <= 0.0) {\n // a2 <= 0, so we clamp it to 0\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // w2 region\n const d12_1 = Vec2.dot(w2, e12);\n if (d12_1 <= 0.0) {\n // a1 <= 0, so we clamp it to 0\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // Must be in e12 region.\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n }\n\n// Possible regions:\n// - points[2]\n// - edge points[0]-points[2]\n// - edge points[1]-points[2]\n// - inside the triangle\n solve3(): void {\n const w1 = this.m_v1.w;\n const w2 = this.m_v2.w;\n const w3 = this.m_v3.w;\n\n // Edge12\n // [1 1 ][a1] = [1]\n // [w1.e12 w2.e12][a2] = [0]\n // a3 = 0\n const e12 = Vec2.sub(w2, w1);\n const w1e12 = Vec2.dot(w1, e12);\n const w2e12 = Vec2.dot(w2, e12);\n const d12_1 = w2e12;\n const d12_2 = -w1e12;\n\n // Edge13\n // [1 1 ][a1] = [1]\n // [w1.e13 w3.e13][a3] = [0]\n // a2 = 0\n const e13 = Vec2.sub(w3, w1);\n const w1e13 = Vec2.dot(w1, e13);\n const w3e13 = Vec2.dot(w3, e13);\n const d13_1 = w3e13;\n const d13_2 = -w1e13;\n\n // Edge23\n // [1 1 ][a2] = [1]\n // [w2.e23 w3.e23][a3] = [0]\n // a1 = 0\n const e23 = Vec2.sub(w3, w2);\n const w2e23 = Vec2.dot(w2, e23);\n const w3e23 = Vec2.dot(w3, e23);\n const d23_1 = w3e23;\n const d23_2 = -w2e23;\n\n // Triangle123\n const n123 = Vec2.crossVec2Vec2(e12, e13);\n\n const d123_1 = n123 * Vec2.crossVec2Vec2(w2, w3);\n const d123_2 = n123 * Vec2.crossVec2Vec2(w3, w1);\n const d123_3 = n123 * Vec2.crossVec2Vec2(w1, w2);\n\n // w1 region\n if (d12_2 <= 0.0 && d13_2 <= 0.0) {\n this.m_v1.a = 1.0;\n this.m_count = 1;\n return;\n }\n\n // e12\n if (d12_1 > 0.0 && d12_2 > 0.0 && d123_3 <= 0.0) {\n const inv_d12 = 1.0 / (d12_1 + d12_2);\n this.m_v1.a = d12_1 * inv_d12;\n this.m_v2.a = d12_2 * inv_d12;\n this.m_count = 2;\n return;\n }\n\n // e13\n if (d13_1 > 0.0 && d13_2 > 0.0 && d123_2 <= 0.0) {\n const inv_d13 = 1.0 / (d13_1 + d13_2);\n this.m_v1.a = d13_1 * inv_d13;\n this.m_v3.a = d13_2 * inv_d13;\n this.m_count = 2;\n this.m_v2.set(this.m_v3);\n return;\n }\n\n // w2 region\n if (d12_1 <= 0.0 && d23_2 <= 0.0) {\n this.m_v2.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v2);\n return;\n }\n\n // w3 region\n if (d13_1 <= 0.0 && d23_1 <= 0.0) {\n this.m_v3.a = 1.0;\n this.m_count = 1;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // e23\n if (d23_1 > 0.0 && d23_2 > 0.0 && d123_1 <= 0.0) {\n const inv_d23 = 1.0 / (d23_1 + d23_2);\n this.m_v2.a = d23_1 * inv_d23;\n this.m_v3.a = d23_2 * inv_d23;\n this.m_count = 2;\n this.m_v1.set(this.m_v3);\n return;\n }\n\n // Must be in triangle123\n const inv_d123 = 1.0 / (d123_1 + d123_2 + d123_3);\n this.m_v1.a = d123_1 * inv_d123;\n this.m_v2.a = d123_2 * inv_d123;\n this.m_v3.a = d123_3 * inv_d123;\n this.m_count = 3;\n }\n}\n\n/**\n * Determine if two generic shapes overlap.\n */\nexport const testOverlap = function (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform): boolean {\n const input = new DistanceInput();\n input.proxyA.set(shapeA, indexA);\n input.proxyB.set(shapeB, indexB);\n input.transformA = xfA;\n input.transformB = xfB;\n input.useRadii = true;\n\n const cache = new SimplexCache();\n const output = new DistanceOutput();\n\n Distance(output, cache, input);\n\n return output.distance < 10.0 * Math.EPSILON;\n}\n\n// legacy exports\nDistance.testOverlap = testOverlap;\nDistance.Input = DistanceInput;\nDistance.Output = DistanceOutput;\nDistance.Proxy = DistanceProxy;\nDistance.Cache = SimplexCache;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { stats } from '../util/stats';\nimport Timer from '../util/Timer';\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Rot } from '../common/Rot';\nimport { Sweep } from '../common/Sweep';\nimport { Transform } from '../common/Transform';\n\nimport { Distance, DistanceInput, DistanceOutput, DistanceProxy, SimplexCache } from './Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n/**\n * Input parameters for TimeOfImpact.\n */\nexport class TOIInput {\n proxyA: DistanceProxy = new DistanceProxy();\n proxyB: DistanceProxy = new DistanceProxy();\n sweepA: Sweep = new Sweep();\n sweepB: Sweep = new Sweep();\n /** defines sweep interval [0, tMax] */\n tMax: number | undefined;\n}\n\nexport enum TOIOutputState {\n e_unknown = 0,\n e_failed = 1,\n e_overlapped = 2,\n e_touching = 3,\n e_separated = 4,\n}\n\n/**\n * Output parameters for TimeOfImpact.\n */\nexport class TOIOutput {\n state: TOIOutputState | undefined;\n t: number | undefined;\n}\n\nstats.toiTime = 0;\nstats.toiMaxTime = 0;\nstats.toiCalls = 0;\nstats.toiIters = 0;\nstats.toiMaxIters = 0;\nstats.toiRootIters = 0;\nstats.toiMaxRootIters = 0;\n\n/**\n * Compute the upper bound on time before two shapes penetrate. Time is\n * represented as a fraction between [0,tMax]. This uses a swept separating axis\n * and may miss some intermediate, non-tunneling collision. If you change the\n * time interval, you should call this function again.\n *\n * Note: use Distance to compute the contact point and normal at the time of\n * impact.\n *\n * CCD via the local separating axis method. This seeks progression by computing\n * the largest time at which separation is maintained.\n */\nexport const TimeOfImpact = function (output: TOIOutput, input: TOIInput): void {\n const timer = Timer.now();\n\n ++stats.toiCalls;\n\n output.state = TOIOutputState.e_unknown;\n output.t = input.tMax;\n\n const proxyA = input.proxyA; // DistanceProxy\n const proxyB = input.proxyB; // DistanceProxy\n\n const sweepA = input.sweepA; // Sweep\n const sweepB = input.sweepB; // Sweep\n\n // Large rotations can make the root finder fail, so we normalize the\n // sweep angles.\n sweepA.normalize();\n sweepB.normalize();\n\n const tMax = input.tMax;\n\n const totalRadius = proxyA.m_radius + proxyB.m_radius;\n const target = Math.max(Settings.linearSlop, totalRadius - 3.0 * Settings.linearSlop);\n const tolerance = 0.25 * Settings.linearSlop;\n _ASSERT && console.assert(target > tolerance);\n\n let t1 = 0.0;\n const k_maxIterations = Settings.maxTOIIterations;\n let iter = 0;\n\n // Prepare input for distance query.\n const cache = new SimplexCache();\n\n const distanceInput = new DistanceInput();\n distanceInput.proxyA = input.proxyA;\n distanceInput.proxyB = input.proxyB;\n distanceInput.useRadii = false;\n\n // The outer loop progressively attempts to compute new separating axes.\n // This loop terminates when an axis is repeated (no progress is made).\n while (true) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n sweepA.getTransform(xfA, t1);\n sweepB.getTransform(xfB, t1);\n\n // Get the distance between shapes. We can also use the results\n // to get a separating axis.\n distanceInput.transformA = xfA;\n distanceInput.transformB = xfB;\n const distanceOutput = new DistanceOutput();\n Distance(distanceOutput, cache, distanceInput);\n\n // If the shapes are overlapped, we give up on continuous collision.\n if (distanceOutput.distance <= 0.0) {\n // Failure!\n output.state = TOIOutputState.e_overlapped;\n output.t = 0.0;\n break;\n }\n\n if (distanceOutput.distance < target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n break;\n }\n\n // Initialize the separating axis.\n const fcn = new SeparationFunction();\n fcn.initialize(cache, proxyA, sweepA, proxyB, sweepB, t1);\n\n // if (false) {\n // // Dump the curve seen by the root finder\n // const N = 100;\n // const dx = 1.0 / N;\n // const xs = []; // [ N + 1 ];\n // const fs = []; // [ N + 1 ];\n // const x = 0.0;\n // for (const i = 0; i <= N; ++i) {\n // sweepA.getTransform(xfA, x);\n // sweepB.getTransform(xfB, x);\n // const f = fcn.evaluate(xfA, xfB) - target;\n // printf(\"%g %g\\n\", x, f);\n // xs[i] = x;\n // fs[i] = f;\n // x += dx;\n // }\n // }\n\n // Compute the TOI on the separating axis. We do this by successively\n // resolving the deepest point. This loop is bounded by the number of\n // vertices.\n let done = false;\n let t2 = tMax;\n let pushBackIter = 0;\n while (true) {\n // Find the deepest point at t2. Store the witness point indices.\n let s2 = fcn.findMinSeparation(t2);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Is the final configuration separated?\n if (s2 > target + tolerance) {\n // Victory!\n output.state = TOIOutputState.e_separated;\n output.t = tMax;\n done = true;\n break;\n }\n\n // Has the separation reached tolerance?\n if (s2 > target - tolerance) {\n // Advance the sweeps\n t1 = t2;\n break;\n }\n\n // Compute the initial separation of the witness points.\n let s1 = fcn.evaluate(t1);\n // const indexA = fcn.indexA;\n // const indexB = fcn.indexB;\n\n // Check for initial overlap. This might happen if the root finder\n // runs out of iterations.\n if (s1 < target - tolerance) {\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n done = true;\n break;\n }\n\n // Check for touching\n if (s1 <= target + tolerance) {\n // Victory! t1 should hold the TOI (could be 0.0).\n output.state = TOIOutputState.e_touching;\n output.t = t1;\n done = true;\n break;\n }\n\n // Compute 1D root of: f(x) - target = 0\n let rootIterCount = 0;\n let a1 = t1;\n let a2 = t2;\n while (true) {\n // Use a mix of the secant rule and bisection.\n let t;\n if (rootIterCount & 1) {\n // Secant rule to improve convergence.\n t = a1 + (target - s1) * (a2 - a1) / (s2 - s1);\n } else {\n // Bisection to guarantee progress.\n t = 0.5 * (a1 + a2);\n }\n\n ++rootIterCount;\n ++stats.toiRootIters;\n\n const s = fcn.evaluate(t);\n const indexA = fcn.indexA;\n const indexB = fcn.indexB;\n\n if (Math.abs(s - target) < tolerance) {\n // t2 holds a tentative value for t1\n t2 = t;\n break;\n }\n\n // Ensure we continue to bracket the root.\n if (s > target) {\n a1 = t;\n s1 = s;\n } else {\n a2 = t;\n s2 = s;\n }\n\n if (rootIterCount === 50) {\n break;\n }\n }\n\n stats.toiMaxRootIters = Math.max(stats.toiMaxRootIters, rootIterCount);\n\n ++pushBackIter;\n\n if (pushBackIter === Settings.maxPolygonVertices) {\n break;\n }\n }\n\n ++iter;\n ++stats.toiIters;\n\n if (done) {\n break;\n }\n\n if (iter === k_maxIterations) {\n // Root finder got stuck. Semi-victory.\n output.state = TOIOutputState.e_failed;\n output.t = t1;\n break;\n }\n }\n\n stats.toiMaxIters = Math.max(stats.toiMaxIters, iter);\n\n const time = Timer.diff(timer);\n stats.toiMaxTime = Math.max(stats.toiMaxTime, time);\n stats.toiTime += time;\n}\n\nenum SeparationFunctionType {\n e_points = 1,\n e_faceA = 2,\n e_faceB = 3,\n}\n\nclass SeparationFunction {\n m_proxyA: DistanceProxy = new DistanceProxy();\n m_proxyB: DistanceProxy = new DistanceProxy();\n m_sweepA: Sweep;\n m_sweepB: Sweep;\n indexA: number;\n indexB: number;\n m_type: SeparationFunctionType;\n m_localPoint: Vec2 = Vec2.zero();\n m_axis: Vec2 = Vec2.zero();\n\n // TODO_ERIN might not need to return the separation\n\n initialize(cache: SimplexCache, proxyA: DistanceProxy, sweepA: Sweep, proxyB: DistanceProxy, sweepB: Sweep, t1: number): number {\n this.m_proxyA = proxyA;\n this.m_proxyB = proxyB;\n const count = cache.count;\n _ASSERT && console.assert(0 < count && count < 3);\n\n this.m_sweepA = sweepA;\n this.m_sweepB = sweepB;\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t1);\n this.m_sweepB.getTransform(xfB, t1);\n\n if (count === 1) {\n this.m_type = SeparationFunctionType.e_points;\n const localPointA = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n this.m_axis.setCombine(1, pointB, -1, pointA);\n const s = this.m_axis.normalize();\n return s;\n\n } else if (cache.indexA[0] === cache.indexA[1]) {\n // Two points on B and one on A.\n this.m_type = SeparationFunctionType.e_faceB;\n const localPointB1 = proxyB.getVertex(cache.indexB[0]);\n const localPointB2 = proxyB.getVertex(cache.indexB[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointB2, localPointB1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointB1, localPointB2);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n const localPointA = proxyA.getVertex(cache.indexA[0]);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n let s = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n\n } else {\n // Two points on A and one or two points on B.\n this.m_type = SeparationFunctionType.e_faceA;\n const localPointA1 = this.m_proxyA.getVertex(cache.indexA[0]);\n const localPointA2 = this.m_proxyA.getVertex(cache.indexA[1]);\n\n this.m_axis = Vec2.crossVec2Num(Vec2.sub(localPointA2, localPointA1), 1.0);\n this.m_axis.normalize();\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n\n this.m_localPoint = Vec2.mid(localPointA1, localPointA2);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n const localPointB = this.m_proxyB.getVertex(cache.indexB[0]);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n let s = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n if (s < 0.0) {\n this.m_axis = Vec2.neg(this.m_axis);\n s = -s;\n }\n return s;\n }\n }\n\n compute(find: boolean, t: number): number {\n // It was findMinSeparation and evaluate\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n this.m_sweepA.getTransform(xfA, t);\n this.m_sweepB.getTransform(xfB, t);\n\n switch (this.m_type) {\n case SeparationFunctionType.e_points: {\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, this.m_axis);\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(this.m_axis));\n\n this.indexA = this.m_proxyA.getSupport(axisA);\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n\n const pointA = Transform.mulVec2(xfA, localPointA);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, this.m_axis) - Vec2.dot(pointA, this.m_axis);\n return sep;\n }\n\n case SeparationFunctionType.e_faceA: {\n const normal = Rot.mulVec2(xfA.q, this.m_axis);\n const pointA = Transform.mulVec2(xfA, this.m_localPoint);\n\n if (find) {\n const axisB = Rot.mulTVec2(xfB.q, Vec2.neg(normal));\n\n this.indexA = -1;\n this.indexB = this.m_proxyB.getSupport(axisB);\n }\n\n const localPointB = this.m_proxyB.getVertex(this.indexB);\n const pointB = Transform.mulVec2(xfB, localPointB);\n\n const sep = Vec2.dot(pointB, normal) - Vec2.dot(pointA, normal);\n return sep;\n }\n\n case SeparationFunctionType.e_faceB: {\n const normal = Rot.mulVec2(xfB.q, this.m_axis);\n const pointB = Transform.mulVec2(xfB, this.m_localPoint);\n\n if (find) {\n const axisA = Rot.mulTVec2(xfA.q, Vec2.neg(normal));\n\n this.indexB = -1;\n this.indexA = this.m_proxyA.getSupport(axisA);\n }\n\n const localPointA = this.m_proxyA.getVertex(this.indexA);\n const pointA = Transform.mulVec2(xfA, localPointA);\n\n const sep = Vec2.dot(pointA, normal) - Vec2.dot(pointB, normal);\n return sep;\n }\n\n default:\n _ASSERT && console.assert(false);\n if (find) {\n this.indexA = -1;\n this.indexB = -1;\n }\n return 0.0;\n }\n }\n\n findMinSeparation(t: number): number {\n return this.compute(true, t);\n }\n\n evaluate(t: number): number {\n return this.compute(false, t);\n }\n}\n\nconst separationFunction_reuse = new SeparationFunction();\n\n// legacy exports\nTimeOfImpact.Input = TOIInput;\nTimeOfImpact.Output = TOIOutput;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../Settings';\nimport { Vec2 } from '../common/Vec2';\nimport { math as Math } from '../common/Math';\nimport { Body } from './Body';\nimport type { Contact } from './Contact';\nimport { Joint } from './Joint';\nimport { TimeOfImpact, TOIInput, TOIOutput, TOIOutputState } from '../collision/TimeOfImpact';\nimport { Distance, DistanceInput, DistanceOutput, SimplexCache } from '../collision/Distance';\nimport { World } from \"./World\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nexport class TimeStep {\n /** time step */\n dt: number = 0;\n /** inverse time step (0 if dt == 0) */\n inv_dt: number = 0;\n velocityIterations: number = 0;\n positionIterations: number = 0;\n warmStarting: boolean = false;\n blockSolve: boolean = true;\n\n /** timestep ratio for variable timestep */\n inv_dt0: number = 0.0;\n /** dt * inv_dt0 */\n dtRatio: number = 1;\n\n reset(dt: number): void {\n if (this.dt > 0.0) {\n this.inv_dt0 = this.inv_dt;\n }\n this.dt = dt;\n this.inv_dt = dt == 0 ? 0 : 1 / dt;\n this.dtRatio = dt * this.inv_dt0;\n }\n}\n\n// reuse\nconst s_subStep = new TimeStep();\n\n/**\n * Contact impulses for reporting. Impulses are used instead of forces because\n * sub-step forces may approach infinity for rigid body collisions. These match\n * up one-to-one with the contact points in Manifold.\n */\nexport class ContactImpulse {\n // TODO: merge with Contact class?\n\n private readonly contact: Contact;\n private readonly normals: number[];\n private readonly tangents: number[];\n\n constructor(contact: Contact) {\n this.contact = contact;\n this.normals = [];\n this.tangents = [];\n }\n\n get normalImpulses(): number[] {\n const contact = this.contact;\n const normals = this.normals;\n normals.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n normals.push(contact.v_points[p].normalImpulse);\n }\n return normals;\n }\n\n get tangentImpulses(): number[] {\n const contact = this.contact;\n const tangents = this.tangents;\n tangents.length = 0;\n for (let p = 0; p < contact.v_points.length; ++p) {\n tangents.push(contact.v_points[p].tangentImpulse);\n }\n return tangents;\n }\n}\n\n/**\n * Finds and solves islands. An island is a connected subset of the world.\n */\nexport class Solver {\n m_world: World;\n m_stack: Body[];\n m_bodies: Body[];\n m_contacts: Contact[];\n m_joints: Joint[];\n\n constructor(world: World) {\n this.m_world = world;\n this.m_stack = [];\n this.m_bodies = [];\n this.m_contacts = [];\n this.m_joints = [];\n }\n\n clear(): void {\n this.m_stack.length = 0;\n this.m_bodies.length = 0;\n this.m_contacts.length = 0;\n this.m_joints.length = 0;\n }\n\n addBody(body: Body): void {\n _ASSERT && console.assert(body instanceof Body, 'Not a Body!', body);\n this.m_bodies.push(body);\n // why?\n // body.c_position.c.setZero();\n // body.c_position.a = 0;\n // body.c_velocity.v.setZero();\n // body.c_velocity.w = 0;\n }\n\n addContact(contact: Contact): void {\n // _ASSERT && console.assert(contact instanceof Contact, 'Not a Contact!', contact);\n this.m_contacts.push(contact);\n }\n\n addJoint(joint: Joint): void {\n _ASSERT && console.assert(joint instanceof Joint, 'Not a Joint!', joint);\n this.m_joints.push(joint);\n }\n\n solveWorld(step: TimeStep): void {\n const world = this.m_world;\n\n // Clear all the island flags.\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n }\n for (let c = world.m_contactList; c; c = c.m_next) {\n c.m_islandFlag = false;\n }\n for (let j = world.m_jointList; j; j = j.m_next) {\n j.m_islandFlag = false;\n }\n\n // Build and simulate all awake islands.\n const stack = this.m_stack;\n let loop = -1;\n for (let seed = world.m_bodyList; seed; seed = seed.m_next) {\n loop++;\n if (seed.m_islandFlag) {\n continue;\n }\n\n if (seed.isAwake() == false || seed.isActive() == false) {\n continue;\n }\n\n // The seed can be dynamic or kinematic.\n if (seed.isStatic()) {\n continue;\n }\n\n // Reset island and stack.\n this.clear();\n\n stack.push(seed);\n\n seed.m_islandFlag = true;\n\n // Perform a depth first search (DFS) on the constraint graph.\n while (stack.length > 0) {\n // Grab the next body off the stack and add it to the island.\n const b = stack.pop();\n _ASSERT && console.assert(b.isActive() == true);\n this.addBody(b);\n\n // Make sure the body is awake.\n b.setAwake(true);\n\n // To keep islands as small as possible, we don't\n // propagate islands across static bodies.\n if (b.isStatic()) {\n continue;\n }\n\n // Search all contacts connected to this body.\n for (let ce = b.m_contactList; ce; ce = ce.next) {\n const contact = ce.contact;\n\n // Has this contact already been added to an island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Is this contact solid and touching?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n this.addContact(contact);\n contact.m_islandFlag = true;\n\n const other = ce.other;\n\n // Was the other body already added to this island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && console.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n\n // Search all joints connect to this body.\n for (let je = b.m_jointList; je; je = je.next) {\n if (je.joint.m_islandFlag == true) {\n continue;\n }\n\n const other = je.other;\n\n // Don't simulate joints connected to inactive bodies.\n if (other.isActive() == false) {\n continue;\n }\n\n this.addJoint(je.joint);\n je.joint.m_islandFlag = true;\n\n if (other.m_islandFlag) {\n continue;\n }\n\n // _ASSERT && console.assert(stack.length < world.m_bodyCount);\n stack.push(other);\n other.m_islandFlag = true;\n }\n }\n\n this.solveIsland(step);\n\n // Post solve cleanup.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n // Allow static bodies to participate in other islands.\n // TODO: are they added at all?\n const b = this.m_bodies[i];\n if (b.isStatic()) {\n b.m_islandFlag = false;\n }\n }\n }\n }\n\n solveIsland(step: TimeStep): void {\n // B2: Island Solve\n const world = this.m_world;\n const gravity = world.m_gravity;\n const allowSleep = world.m_allowSleep;\n\n const h = step.dt;\n\n // Integrate velocities and apply damping. Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.m_sweep.c);\n const a = body.m_sweep.a;\n const v = Vec2.clone(body.m_linearVelocity);\n let w = body.m_angularVelocity;\n\n // Store positions for continuous collision.\n body.m_sweep.c0.setVec2(body.m_sweep.c);\n body.m_sweep.a0 = body.m_sweep.a;\n\n if (body.isDynamic()) {\n // Integrate velocities.\n v.addMul(h * body.m_gravityScale, gravity);\n v.addMul(h * body.m_invMass, body.m_force);\n w += h * body.m_invI * body.m_torque;\n /**\n *
\n         * Apply damping.\n         * ODE: dv/dt + c * v = 0\n         * Solution: v(t) = v0 * exp(-c * t)\n         * Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt)\n         * v2 = exp(-c * dt) * v1\n         * Pade approximation:\n         * v2 = v1 * 1 / (1 + c * dt)\n         * 
\n */\n v.mul(1.0 / (1.0 + h * body.m_linearDamping));\n w *= 1.0 / (1.0 + h * body.m_angularDamping);\n }\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(step);\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(step);\n }\n\n if (step.warmStarting) {\n // Warm start.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.warmStartConstraint(step);\n }\n }\n\n for (let i = 0; i < this.m_joints.length; ++i) {\n const joint = this.m_joints[i];\n joint.initVelocityConstraints(step);\n }\n\n // Solve velocity constraints\n for (let i = 0; i < step.velocityIterations; ++i) {\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n joint.solveVelocityConstraints(step);\n }\n\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(step);\n }\n }\n\n // Store impulses for warm starting\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.storeConstraintImpulses(step);\n }\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.lengthSquared(translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c.setVec2(c);\n body.c_position.a = a;\n body.c_velocity.v.setVec2(v);\n body.c_velocity.w = w;\n }\n\n // Solve position constraints\n let positionSolved = false;\n for (let i = 0; i < step.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraint(step);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -3.0 * Settings.linearSlop;\n\n let jointsOkay = true;\n for (let j = 0; j < this.m_joints.length; ++j) {\n const joint = this.m_joints[j];\n const jointOkay = joint.solvePositionConstraints(step);\n jointsOkay = jointsOkay && jointOkay;\n }\n\n if (contactsOkay && jointsOkay) {\n // Exit early if the position errors are small.\n positionSolved = true;\n break;\n }\n }\n\n // Copy state buffers back to the bodies\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n body.m_sweep.c.setVec2(body.c_position.c);\n body.m_sweep.a = body.c_position.a;\n body.m_linearVelocity.setVec2(body.c_velocity.v);\n body.m_angularVelocity = body.c_velocity.w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n\n if (allowSleep) {\n let minSleepTime = Infinity;\n\n const linTolSqr = Settings.linearSleepToleranceSqr;\n const angTolSqr = Settings.angularSleepToleranceSqr;\n\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n if (body.isStatic()) {\n continue;\n }\n\n if ((body.m_autoSleepFlag == false)\n || (body.m_angularVelocity * body.m_angularVelocity > angTolSqr)\n || (Vec2.lengthSquared(body.m_linearVelocity) > linTolSqr)) {\n body.m_sleepTime = 0.0;\n minSleepTime = 0.0;\n } else {\n body.m_sleepTime += h;\n minSleepTime = Math.min(minSleepTime, body.m_sleepTime);\n }\n }\n\n if (minSleepTime >= Settings.timeToSleep && positionSolved) {\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.setAwake(false);\n }\n }\n }\n }\n\n /**\n * Find TOI contacts and solve them.\n */\n solveWorldTOI(step: TimeStep): void {\n const world = this.m_world;\n\n if (world.m_stepComplete) {\n for (let b = world.m_bodyList; b; b = b.m_next) {\n b.m_islandFlag = false;\n b.m_sweep.alpha0 = 0.0;\n }\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Invalidate TOI\n c.m_toiFlag = false;\n c.m_islandFlag = false;\n c.m_toiCount = 0;\n c.m_toi = 1.0;\n }\n }\n\n // Find TOI events and solve them.\n while (true) {\n // Find the first TOI.\n let minContact = null; // Contact\n let minAlpha = 1.0;\n\n for (let c = world.m_contactList; c; c = c.m_next) {\n // Is this contact disabled?\n if (c.isEnabled() == false) {\n continue;\n }\n\n // Prevent excessive sub-stepping.\n if (c.m_toiCount > Settings.maxSubSteps) {\n continue;\n }\n\n let alpha = 1.0;\n if (c.m_toiFlag) {\n // This contact has a valid cached TOI.\n alpha = c.m_toi;\n } else {\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n // Is there a sensor?\n if (fA.isSensor() || fB.isSensor()) {\n continue;\n }\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n _ASSERT && console.assert(bA.isDynamic() || bB.isDynamic());\n\n const activeA = bA.isAwake() && !bA.isStatic();\n const activeB = bB.isAwake() && !bB.isStatic();\n\n // Is at least one body active (awake and dynamic or kinematic)?\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const collideA = bA.isBullet() || !bA.isDynamic();\n const collideB = bB.isBullet() || !bB.isDynamic();\n\n // Are these two non-bullet dynamic bodies?\n if (collideA == false && collideB == false) {\n continue;\n }\n\n // Compute the TOI for this contact.\n // Put the sweeps onto the same time interval.\n let alpha0 = bA.m_sweep.alpha0;\n\n if (bA.m_sweep.alpha0 < bB.m_sweep.alpha0) {\n alpha0 = bB.m_sweep.alpha0;\n bA.m_sweep.advance(alpha0);\n } else if (bB.m_sweep.alpha0 < bA.m_sweep.alpha0) {\n alpha0 = bA.m_sweep.alpha0;\n bB.m_sweep.advance(alpha0);\n }\n\n _ASSERT && console.assert(alpha0 < 1.0);\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const sweepA = bA.m_sweep;\n const sweepB = bB.m_sweep;\n\n // Compute the time of impact in interval [0, minTOI]\n const input = new TOIInput(); // TODO: reuse\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.sweepA.set(bA.m_sweep);\n input.sweepB.set(bB.m_sweep);\n input.tMax = 1.0;\n\n const output = new TOIOutput(); // TODO: reuse\n TimeOfImpact(output, input);\n\n // Beta is the fraction of the remaining portion of the [time?].\n const beta = output.t;\n if (output.state == TOIOutputState.e_touching) {\n alpha = Math.min(alpha0 + (1.0 - alpha0) * beta, 1.0);\n } else {\n alpha = 1.0;\n }\n\n c.m_toi = alpha;\n c.m_toiFlag = true;\n }\n\n if (alpha < minAlpha) {\n // This is the minimum TOI found so far.\n minContact = c;\n minAlpha = alpha;\n }\n }\n\n if (minContact == null || 1.0 - 10.0 * Math.EPSILON < minAlpha) {\n // No more TOI events. Done!\n world.m_stepComplete = true;\n break;\n }\n\n // Advance the bodies to the TOI.\n const fA = minContact.getFixtureA();\n const fB = minContact.getFixtureB();\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const backup1 = bA.m_sweep.clone();\n const backup2 = bB.m_sweep.clone();\n\n bA.advance(minAlpha);\n bB.advance(minAlpha);\n\n // The TOI contact likely has some new contact points.\n minContact.update(world);\n minContact.m_toiFlag = false;\n ++minContact.m_toiCount;\n\n // Is the contact solid?\n if (minContact.isEnabled() == false || minContact.isTouching() == false) {\n // Restore the sweeps.\n minContact.setEnabled(false);\n bA.m_sweep.set(backup1);\n bB.m_sweep.set(backup2);\n bA.synchronizeTransform();\n bB.synchronizeTransform();\n continue;\n }\n\n bA.setAwake(true);\n bB.setAwake(true);\n\n // Build the island\n this.clear();\n this.addBody(bA);\n this.addBody(bB);\n this.addContact(minContact);\n\n bA.m_islandFlag = true;\n bB.m_islandFlag = true;\n minContact.m_islandFlag = true;\n\n // Get contacts on bodyA and bodyB.\n const bodies = [ bA, bB ];\n for (let i = 0; i < bodies.length; ++i) {\n const body = bodies[i];\n if (body.isDynamic()) {\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n // if (this.m_bodyCount == this.m_bodyCapacity) { break; }\n // if (this.m_contactCount == this.m_contactCapacity) { break; }\n\n const contact = ce.contact;\n\n // Has this contact already been added to the island?\n if (contact.m_islandFlag) {\n continue;\n }\n\n // Only add if either is static, kinematic or bullet.\n const other = ce.other;\n if (other.isDynamic() && !body.isBullet() && !other.isBullet()) {\n continue;\n }\n\n // Skip sensors.\n const sensorA = contact.m_fixtureA.m_isSensor;\n const sensorB = contact.m_fixtureB.m_isSensor;\n if (sensorA || sensorB) {\n continue;\n }\n\n // Tentatively advance the body to the TOI.\n const backup = other.m_sweep.clone();\n if (other.m_islandFlag == false) {\n other.advance(minAlpha);\n }\n\n // Update the contact points\n contact.update(world);\n\n // Was the contact disabled by the user?\n // Are there contact points?\n if (contact.isEnabled() == false || contact.isTouching() == false) {\n other.m_sweep.set(backup);\n other.synchronizeTransform();\n continue;\n }\n\n // Add the contact to the island\n contact.m_islandFlag = true;\n this.addContact(contact);\n\n // Has the other body already been added to the island?\n if (other.m_islandFlag) {\n continue;\n }\n\n // Add the other body to the island.\n other.m_islandFlag = true;\n\n if (!other.isStatic()) {\n other.setAwake(true);\n }\n\n this.addBody(other);\n }\n }\n }\n\n s_subStep.reset((1.0 - minAlpha) * step.dt);\n s_subStep.dtRatio = 1.0;\n s_subStep.positionIterations = 20;\n s_subStep.velocityIterations = step.velocityIterations;\n s_subStep.warmStarting = false;\n\n this.solveIslandTOI(s_subStep, bA, bB);\n\n // Reset island flags and synchronize broad-phase proxies.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.m_islandFlag = false;\n\n if (!body.isDynamic()) {\n continue;\n }\n\n body.synchronizeFixtures();\n\n // Invalidate all contact TOIs on this displaced body.\n for (let ce = body.m_contactList; ce; ce = ce.next) {\n ce.contact.m_toiFlag = false;\n ce.contact.m_islandFlag = false;\n }\n }\n\n // Commit fixture proxy movements to the broad-phase so that new contacts\n // are created.\n // Also, some contacts can be destroyed.\n world.findNewContacts();\n\n if (world.m_subStepping) {\n world.m_stepComplete = false;\n break;\n }\n }\n }\n\n solveIslandTOI(subStep: TimeStep, toiA: Body, toiB: Body): void {\n const world = this.m_world;\n\n // Initialize the body state.\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n body.c_position.c.setVec2(body.m_sweep.c);\n body.c_position.a = body.m_sweep.a;\n body.c_velocity.v.setVec2(body.m_linearVelocity);\n body.c_velocity.w = body.m_angularVelocity;\n }\n\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initConstraint(subStep);\n }\n\n // Solve position constraints.\n for (let i = 0; i < subStep.positionIterations; ++i) {\n let minSeparation = 0.0;\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n const separation = contact.solvePositionConstraintTOI(subStep, toiA, toiB);\n minSeparation = Math.min(minSeparation, separation);\n }\n // We can't expect minSpeparation >= -Settings.linearSlop because we don't\n // push the separation above -Settings.linearSlop.\n const contactsOkay = minSeparation >= -1.5 * Settings.linearSlop;\n if (contactsOkay) {\n break;\n }\n }\n\n if (false) {\n // Is the new position really safe?\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const c = this.m_contacts[i];\n const fA = c.getFixtureA();\n const fB = c.getFixtureB();\n\n const bA = fA.getBody();\n const bB = fB.getBody();\n\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n\n const input = new DistanceInput();\n input.proxyA.set(fA.getShape(), indexA);\n input.proxyB.set(fB.getShape(), indexB);\n input.transformA = bA.getTransform();\n input.transformB = bB.getTransform();\n input.useRadii = false;\n\n const output = new DistanceOutput();\n const cache = new SimplexCache();\n Distance(output, cache, input);\n\n if (output.distance == 0 || cache.count == 3) {\n cache.count += 0;\n }\n }\n }\n\n // Leap of faith to new safe state.\n toiA.m_sweep.c0.setVec2(toiA.c_position.c);\n toiA.m_sweep.a0 = toiA.c_position.a;\n toiB.m_sweep.c0.setVec2(toiB.c_position.c);\n toiB.m_sweep.a0 = toiB.c_position.a;\n\n // No warm starting is needed for TOI events because warm\n // starting impulses were applied in the discrete solver.\n for (let i = 0; i < this.m_contacts.length; ++i) {\n const contact = this.m_contacts[i];\n contact.initVelocityConstraint(subStep);\n }\n\n // Solve velocity constraints.\n for (let i = 0; i < subStep.velocityIterations; ++i) {\n for (let j = 0; j < this.m_contacts.length; ++j) {\n const contact = this.m_contacts[j];\n contact.solveVelocityConstraint(subStep);\n }\n }\n\n // Don't store the TOI contact forces for warm starting\n // because they can be quite large.\n\n const h = subStep.dt;\n\n // Integrate positions\n for (let i = 0; i < this.m_bodies.length; ++i) {\n const body = this.m_bodies[i];\n\n const c = Vec2.clone(body.c_position.c);\n let a = body.c_position.a;\n const v = Vec2.clone(body.c_velocity.v);\n let w = body.c_velocity.w;\n\n // Check for large velocities\n const translation = Vec2.mulNumVec2(h, v);\n if (Vec2.dot(translation, translation) > Settings.maxTranslationSquared) {\n const ratio = Settings.maxTranslation / translation.length();\n v.mul(ratio);\n }\n\n const rotation = h * w;\n if (rotation * rotation > Settings.maxRotationSquared) {\n const ratio = Settings.maxRotation / Math.abs(rotation);\n w *= ratio;\n }\n\n // Integrate\n c.addMul(h, v);\n a += h * w;\n\n body.c_position.c = c;\n body.c_position.a = a;\n body.c_velocity.v = v;\n body.c_velocity.w = w;\n\n // Sync bodies\n body.m_sweep.c = c;\n body.m_sweep.a = a;\n body.m_linearVelocity = v;\n body.m_angularVelocity = w;\n body.synchronizeTransform();\n }\n\n this.postSolveIsland();\n }\n\n /** @internal */\n postSolveIsland(): void {\n for (let c = 0; c < this.m_contacts.length; ++c) {\n const contact = this.m_contacts[c];\n this.m_world.postSolve(contact, contact.m_impulse);\n }\n }\n}\n\n// @ts-ignore\nSolver.TimeStep = TimeStep;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from './Vec2';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 2-by-2 matrix. Stored in column-major order.\n */\nexport class Mat22 {\n ex: Vec2;\n ey: Vec2;\n\n constructor(a: number, b: number, c: number, d: number);\n constructor(a: { x: number; y: number }, b: { x: number; y: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(a?, b?, c?, d?) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec2.clone(a);\n this.ey = Vec2.clone(b);\n } else if (typeof a === 'number') {\n this.ex = Vec2.neo(a, c);\n this.ey = Vec2.neo(b, d);\n } else {\n this.ex = Vec2.zero();\n this.ey = Vec2.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec2.isValid(obj.ex) && Vec2.isValid(obj.ey);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Mat22.isValid(o), 'Invalid Mat22!', o);\n }\n\n set(a: Mat22): void;\n set(a: Vec2, b: Vec2): void;\n set(a: number, b: number, c: number, d: number): void;\n // tslint:disable-next-line:typedef\n set(a, b?, c?, d?): void {\n if (typeof a === 'number' && typeof b === 'number' && typeof c === 'number'\n && typeof d === 'number') {\n this.ex.setNum(a, c);\n this.ey.setNum(b, d);\n\n } else if (typeof a === 'object' && typeof b === 'object') {\n this.ex.setVec2(a);\n this.ey.setVec2(b);\n\n } else if (typeof a === 'object') {\n _ASSERT && Mat22.assert(a);\n this.ex.setVec2(a.ex);\n this.ey.setVec2(a.ey);\n\n } else {\n _ASSERT && console.assert(false);\n }\n }\n\n setIdentity(): void {\n this.ex.x = 1.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 1.0;\n }\n\n setZero(): void {\n this.ex.x = 0.0;\n this.ey.x = 0.0;\n this.ex.y = 0.0;\n this.ey.y = 0.0;\n }\n\n getInverse(): Mat22 {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const imx = new Mat22();\n imx.ex.x = det * d;\n imx.ey.x = -det * b;\n imx.ex.y = -det * c;\n imx.ey.y = det * a;\n return imx;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve(v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const w = Vec2.zero();\n w.x = det * (d * v.x - b * v.y);\n w.y = det * (a * v.y - c * v.x);\n return w;\n }\n\n /**\n * Multiply a matrix times a vector. If a rotation matrix is provided, then this\n * transforms the vector from one frame to another.\n */\n static mul(mx: Mat22, my: Mat22): Mat22;\n static mul(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mul(mx, v) {\n if (v && 'x' in v && 'y' in v) {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Vec2.assert(v);\n const x = mx.ex.x * v.x + mx.ey.x * v.y;\n const y = mx.ex.y * v.x + mx.ey.y * v.y;\n return Vec2.neo(x, y);\n }\n\n static mulMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(v);\n // return new Mat22(Vec2.mul(mx, v.ex), Vec2.mul(mx, v.ey));\n const a = mx.ex.x * v.ex.x + mx.ey.x * v.ex.y;\n const b = mx.ex.x * v.ey.x + mx.ey.x * v.ey.y;\n const c = mx.ex.y * v.ex.x + mx.ey.y * v.ex.y;\n const d = mx.ex.y * v.ey.x + mx.ey.y * v.ey.y;\n return new Mat22(a, b, c, d);\n }\n\n /**\n * Multiply a matrix transpose times a vector. If a rotation matrix is provided,\n * then this transforms the vector from one frame to another (inverse\n * transform).\n */\n static mulT(mx: Mat22, my: Mat22): Mat22;\n static mulT(mx: Mat22, v: Vec2): Vec2;\n // tslint:disable-next-line:typedef\n static mulT(mx, v) {\n if (v && 'x' in v && 'y' in v) { // Vec2\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n\n } else if (v && 'ex' in v && 'ey' in v) { // Mat22\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulTVec2(mx: Mat22, v: Vec2): Vec2 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Vec2.assert(v);\n return Vec2.neo(Vec2.dot(v, mx.ex), Vec2.dot(v, mx.ey));\n }\n\n static mulTMat22(mx: Mat22, v: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n _ASSERT && Mat22.assert(v);\n const c1 = Vec2.neo(Vec2.dot(mx.ex, v.ex), Vec2.dot(mx.ey, v.ex));\n const c2 = Vec2.neo(Vec2.dot(mx.ex, v.ey), Vec2.dot(mx.ey, v.ey));\n return new Mat22(c1, c2);\n }\n\n static abs(mx: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx);\n return new Mat22(Vec2.abs(mx.ex), Vec2.abs(mx.ey));\n }\n\n static add(mx1: Mat22, mx2: Mat22): Mat22 {\n _ASSERT && Mat22.assert(mx1);\n _ASSERT && Mat22.assert(mx2);\n return new Mat22(Vec2.add(mx1.ex, mx2.ex), Vec2.add(mx1.ey, mx2.ey));\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from '../common/Vec2';\nimport { Transform } from '../common/Transform';\nimport { math as Math } from '../common/Math';\nimport { Rot } from '../common/Rot';\n\nexport enum ManifoldType {\n e_circles = 0,\n e_faceA = 1,\n e_faceB = 2\n}\n\nexport enum ContactFeatureType {\n e_vertex = 0,\n e_face = 1\n}\n\n/**\n * This is used for determining the state of contact points.\n */\n export enum PointState {\n /** Point does not exist */\n nullState = 0,\n /** Point was added in the update */\n addState = 1,\n /** Point persisted across the update */\n persistState = 2,\n /** Point was removed in the update */\n removeState = 3\n}\n\n/**\n * Used for computing contact manifolds.\n */\n export class ClipVertex {\n v: Vec2 = Vec2.zero();\n id: ContactID = new ContactID();\n\n set(o: ClipVertex): void {\n this.v.setVec2(o.v);\n this.id.set(o.id);\n }\n}\n\n/**\n * A manifold for two touching convex shapes. Manifolds are created in `evaluate`\n * method of Contact subclasses.\n *\n * Supported manifold types are e_faceA or e_faceB for clip point versus plane\n * with radius and e_circles point versus point with radius.\n *\n * We store contacts in this way so that position correction can account for\n * movement, which is critical for continuous physics. All contact scenarios\n * must be expressed in one of these types. This structure is stored across time\n * steps, so we keep it small.\n *\n * @prop type e_circle, e_faceA, e_faceB\n * @prop localPoint Usage depends on manifold type:
\n * e_circles: the local center of circleA
\n * e_faceA: the center of faceA
\n * e_faceB: the center of faceB\n * @prop localNormal Usage depends on manifold type:
\n * e_circles: not used
\n * e_faceA: the normal on polygonA
\n * e_faceB: the normal on polygonB\n * @prop points The points of contact {ManifoldPoint[]}\n * @prop pointCount The number of manifold points\n */\nexport class Manifold {\n type: ManifoldType;\n localNormal: Vec2 = Vec2.zero();\n localPoint: Vec2 = Vec2.zero();\n points: ManifoldPoint[] = [ new ManifoldPoint(), new ManifoldPoint() ];\n pointCount: number = 0;\n\n /**\n * Evaluate the manifold with supplied transforms. This assumes modest motion\n * from the original state. This does not change the point count, impulses, etc.\n * The radii must come from the shapes that generated the manifold.\n */\n getWorldManifold(wm: WorldManifold | undefined, xfA: Transform, radiusA: number, xfB: Transform, radiusB: number): WorldManifold {\n if (this.pointCount == 0) {\n return;\n }\n\n wm = wm || new WorldManifold();\n\n let normal = wm.normal;\n const points = wm.points;\n const separations = wm.separations;\n\n // TODO: improve\n switch (this.type) {\n case ManifoldType.e_circles: {\n normal = Vec2.neo(1.0, 0.0);\n const pointA = Transform.mulVec2(xfA, this.localPoint);\n const pointB = Transform.mulVec2(xfB, this.points[0].localPoint);\n const dist = Vec2.sub(pointB, pointA);\n if (Vec2.lengthSquared(dist) > Math.EPSILON * Math.EPSILON) {\n normal.setVec2(dist);\n normal.normalize();\n }\n const cA = pointA.clone().addMul(radiusA, normal);\n const cB = pointB.clone().addMul(-radiusB, normal);\n points[0] = Vec2.mid(cA, cB);\n separations[0] = Vec2.dot(Vec2.sub(cB, cA), normal);\n points.length = 1;\n separations.length = 1;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfA, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfB, this.points[i].localPoint);\n const cA = Vec2.clone(clipPoint).addMul(radiusA - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cB = Vec2.clone(clipPoint).subMul(radiusB, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cB, cA), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.localNormal);\n const planePoint = Transform.mulVec2(xfB, this.localPoint);\n\n for (let i = 0; i < this.pointCount; ++i) {\n const clipPoint = Transform.mulVec2(xfA, this.points[i].localPoint);\n const cB = Vec2.combine(1, clipPoint, radiusB - Vec2.dot(Vec2.sub(clipPoint, planePoint), normal), normal);\n const cA = Vec2.combine(1, clipPoint, -radiusA, normal);\n points[i] = Vec2.mid(cA, cB);\n separations[i] = Vec2.dot(Vec2.sub(cA, cB), normal);\n }\n points.length = this.pointCount;\n separations.length = this.pointCount;\n // Ensure normal points from A to B.\n normal.mul(-1);\n break;\n }\n }\n\n wm.normal = normal;\n wm.points = points;\n wm.separations = separations;\n return wm;\n }\n\n static clipSegmentToLine = clipSegmentToLine;\n static ClipVertex = ClipVertex;\n static getPointStates = getPointStates;\n static PointState = PointState;\n}\n\n/**\n * A manifold point is a contact point belonging to a contact manifold. It holds\n * details related to the geometry and dynamics of the contact points.\n *\n * This structure is stored across time steps, so we keep it small.\n *\n * Note: impulses are used for internal caching and may not provide reliable\n * contact forces, especially for high speed collisions.\n */\nexport class ManifoldPoint {\n /**\n * Usage depends on manifold type.\n * e_circles: the local center of circleB,\n * e_faceA: the local center of cirlceB or the clip point of polygonB,\n * e_faceB: the clip point of polygonA.\n */\n localPoint: Vec2 = Vec2.zero();\n /**\n * The non-penetration impulse\n */\n normalImpulse: number = 0;\n /**\n * The friction impulse\n */\n tangentImpulse: number = 0;\n /**\n * Uniquely identifies a contact point between two shapes to facilatate warm starting\n */\n id: ContactID = new ContactID();\n}\n\n/**\n * Contact ids to facilitate warm starting.\n */\nexport class ContactID {\n cf: ContactFeature = new ContactFeature();\n\n /**\n * Used to quickly compare contact ids.\n */\n get key(): number {\n return this.cf.indexA + this.cf.indexB * 4 + this.cf.typeA * 16 + this.cf.typeB * 64;\n }\n\n set(o: ContactID): void {\n // this.key = o.key;\n this.cf.set(o.cf);\n }\n}\n\n/**\n * The features that intersect to form the contact point.\n */\nexport class ContactFeature {\n /**\n * Feature index on shapeA\n */\n indexA: number;\n /**\n * Feature index on shapeB\n */\n indexB: number;\n /**\n * The feature type on shapeA\n */\n typeA: ContactFeatureType;\n /**\n * The feature type on shapeB\n */\n typeB: ContactFeatureType;\n set(o: ContactFeature): void {\n this.indexA = o.indexA;\n this.indexB = o.indexB;\n this.typeA = o.typeA;\n this.typeB = o.typeB;\n }\n}\n\n/**\n * This is used to compute the current state of a contact manifold.\n */\nexport class WorldManifold {\n /**\n * World vector pointing from A to B\n */\n normal: Vec2;\n /**\n * World contact point (point of intersection)\n */\n points: Vec2[] = []; // [maxManifoldPoints]\n /**\n * A negative value indicates overlap, in meters\n */\n separations: number[] = []; // [maxManifoldPoints]\n}\n\n/**\n * Compute the point states given two manifolds. The states pertain to the\n * transition from manifold1 to manifold2. So state1 is either persist or remove\n * while state2 is either add or persist.\n */\nexport function getPointStates(\n state1: PointState[],\n state2: PointState[],\n manifold1: Manifold,\n manifold2: Manifold\n): void {\n // state1, state2: PointState[Settings.maxManifoldPoints]\n\n // for (var i = 0; i < Settings.maxManifoldPoints; ++i) {\n // state1[i] = PointState.nullState;\n // state2[i] = PointState.nullState;\n // }\n\n // Detect persists and removes.\n for (let i = 0; i < manifold1.pointCount; ++i) {\n const id = manifold1.points[i].id;\n\n state1[i] = PointState.removeState;\n\n for (let j = 0; j < manifold2.pointCount; ++j) {\n if (manifold2.points[j].id.key == id.key) {\n state1[i] = PointState.persistState;\n break;\n }\n }\n }\n\n // Detect persists and adds.\n for (let i = 0; i < manifold2.pointCount; ++i) {\n const id = manifold2.points[i].id;\n\n state2[i] = PointState.addState;\n\n for (let j = 0; j < manifold1.pointCount; ++j) {\n if (manifold1.points[j].id.key == id.key) {\n state2[i] = PointState.persistState;\n break;\n }\n }\n }\n}\n\n/**\n * Clipping for contact manifolds. Sutherland-Hodgman clipping.\n */\nexport function clipSegmentToLine(\n vOut: ClipVertex[],\n vIn: ClipVertex[],\n normal: Vec2,\n offset: number,\n vertexIndexA: number\n): number {\n // Start with no output points\n let numOut = 0;\n\n // Calculate the distance of end points to the line\n const distance0 = Vec2.dot(normal, vIn[0].v) - offset;\n const distance1 = Vec2.dot(normal, vIn[1].v) - offset;\n\n // If the points are behind the plane\n if (distance0 <= 0.0)\n vOut[numOut++].set(vIn[0]);\n if (distance1 <= 0.0)\n vOut[numOut++].set(vIn[1]);\n\n // If the points are on different sides of the plane\n if (distance0 * distance1 < 0.0) {\n // Find intersection point of edge and plane\n const interp = distance0 / (distance0 - distance1);\n vOut[numOut].v.setCombine(1 - interp, vIn[0].v, interp, vIn[1].v);\n\n // VertexA is hitting edgeB.\n vOut[numOut].id.cf.indexA = vertexIndexA;\n vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB;\n vOut[numOut].id.cf.typeA = ContactFeatureType.e_vertex;\n vOut[numOut].id.cf.typeB = ContactFeatureType.e_face;\n ++numOut;\n }\n\n return numOut;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { ShapeType } from \"../collision/Shape\";\nimport { math as Math } from '../common/Math';\nimport { Vec2 } from '../common/Vec2';\nimport { Transform } from '../common/Transform';\nimport { Mat22 } from '../common/Mat22';\nimport { Rot } from '../common/Rot';\nimport { Settings } from '../Settings';\nimport { Manifold, ManifoldType, WorldManifold } from '../collision/Manifold';\nimport { testOverlap } from '../collision/Distance';\nimport { Fixture } from \"./Fixture\";\nimport { Body } from \"./Body\";\nimport { ContactImpulse, TimeStep } from \"./Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nconst DEBUG_SOLVER = false;\n\n/**\n * A contact edge is used to connect bodies and contacts together in a contact\n * graph where each body is a node and each contact is an edge. A contact edge\n * belongs to a doubly linked list maintained in each attached body. Each\n * contact has two contact nodes, one for each attached body.\n *\n * @prop {Contact} contact The contact\n * @prop {ContactEdge} prev The previous contact edge in the body's contact list\n * @prop {ContactEdge} next The next contact edge in the body's contact list\n * @prop {Body} other Provides quick access to the other body attached.\n */\nexport class ContactEdge {\n contact: Contact;\n prev: ContactEdge | undefined;\n next: ContactEdge | undefined;\n other: Body | undefined;\n constructor(contact: Contact) {\n this.contact = contact;\n }\n}\n\nexport type EvaluateFunction = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void;\n\nexport type ContactCallback = (\n manifold: Manifold,\n xfA: Transform,\n fixtureA: Fixture,\n indexA: number,\n xfB: Transform,\n fixtureB: Fixture,\n indexB: number\n) => void /* & { destroyFcn?: (contact: Contact) => void }*/;\n\n\n/**\n * Friction mixing law. The idea is to allow either fixture to drive the\n * restitution to zero. For example, anything slides on ice.\n */\nexport function mixFriction(friction1: number, friction2: number): number {\n return Math.sqrt(friction1 * friction2);\n}\n\n/**\n * Restitution mixing law. The idea is allow for anything to bounce off an\n * inelastic surface. For example, a superball bounces on anything.\n */\nexport function mixRestitution(restitution1: number, restitution2: number): number {\n return restitution1 > restitution2 ? restitution1 : restitution2;\n}\n\n// TODO: move this to Settings?\nconst s_registers = [];\n\n// TODO: merge with ManifoldPoint?\nexport class VelocityConstraintPoint {\n rA: Vec2 = Vec2.zero();\n rB: Vec2 = Vec2.zero();\n normalImpulse: number = 0;\n tangentImpulse: number = 0;\n normalMass: number = 0;\n tangentMass: number = 0;\n velocityBias: number = 0;\n}\n\n/**\n * The class manages contact between two shapes. A contact exists for each\n * overlapping AABB in the broad-phase (except if filtered). Therefore a contact\n * object may exist that has no contact points.\n */\nexport class Contact {\n /** @internal */\n m_nodeA: ContactEdge;\n /** @internal */\n m_nodeB: ContactEdge;\n /** @internal */\n m_fixtureA: Fixture;\n /** @internal */\n m_fixtureB: Fixture;\n /** @internal */\n m_indexA: number;\n /** @internal */\n m_indexB: number;\n /** @internal */\n m_evaluateFcn: EvaluateFunction;\n /** @internal */\n m_manifold: Manifold = new Manifold();\n /** @internal */\n m_prev: Contact | null = null;\n /** @internal */\n m_next: Contact | null = null;\n /** @internal */\n m_toi: number = 1.0;\n /** @internal */\n m_toiCount: number = 0;\n /** @internal This contact has a valid TOI in m_toi */\n m_toiFlag: boolean = false;\n /** @internal */\n m_friction: number;\n /** @internal */\n m_restitution: number;\n /** @internal */\n m_tangentSpeed: number = 0.0;\n /** @internal This contact can be disabled (by user) */\n m_enabledFlag: boolean = true;\n /** @internal Used when crawling contact graph when forming islands. */\n m_islandFlag: boolean = false;\n /** @internal Set when the shapes are touching. */\n m_touchingFlag: boolean = false;\n /** @internal This contact needs filtering because a fixture filter was changed. */\n m_filterFlag: boolean = false;\n /** @internal This bullet contact had a TOI event */\n m_bulletHitFlag: boolean = false;\n\n /** @internal Contact reporting impulse object cache */\n m_impulse: ContactImpulse = new ContactImpulse(this);\n\n // VelocityConstraint\n /** @internal */ v_points: VelocityConstraintPoint[] = []; // [maxManifoldPoints];\n /** @internal */ v_normal: Vec2 = Vec2.zero();\n /** @internal */ v_normalMass: Mat22 = new Mat22();\n /** @internal */ v_K: Mat22 = new Mat22();\n /** @internal */ v_pointCount: number;\n /** @internal */ v_tangentSpeed: number | undefined;\n /** @internal */ v_friction: number | undefined;\n /** @internal */ v_restitution: number | undefined;\n /** @internal */ v_invMassA: number | undefined;\n /** @internal */ v_invMassB: number | undefined;\n /** @internal */ v_invIA: number | undefined;\n /** @internal */ v_invIB: number | undefined;\n\n // PositionConstraint\n /** @internal */ p_localPoints: Vec2[] = []; // [maxManifoldPoints];\n /** @internal */ p_localNormal: Vec2 = Vec2.zero();\n /** @internal */ p_localPoint: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterA: Vec2 = Vec2.zero();\n /** @internal */ p_localCenterB: Vec2 = Vec2.zero();\n /** @internal */ p_type: ManifoldType | undefined;\n /** @internal */ p_radiusA: number | undefined;\n /** @internal */ p_radiusB: number | undefined;\n /** @internal */ p_pointCount: number | undefined;\n /** @internal */ p_invMassA: number | undefined;\n /** @internal */ p_invMassB: number | undefined;\n /** @internal */ p_invIA: number | undefined;\n /** @internal */ p_invIB: number | undefined;\n\n constructor(fA: Fixture, indexA: number, fB: Fixture, indexB: number, evaluateFcn: EvaluateFunction) {\n // Nodes for connecting bodies.\n this.m_nodeA = new ContactEdge(this);\n this.m_nodeB = new ContactEdge(this);\n\n this.m_fixtureA = fA;\n this.m_fixtureB = fB;\n\n this.m_indexA = indexA;\n this.m_indexB = indexB;\n\n this.m_evaluateFcn = evaluateFcn;\n\n this.m_friction = mixFriction(this.m_fixtureA.m_friction, this.m_fixtureB.m_friction);\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution, this.m_fixtureB.m_restitution);\n }\n\n initConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const shapeA = fixtureA.getShape();\n const shapeB = fixtureB.getShape();\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const manifold = this.getManifold();\n\n const pointCount = manifold.pointCount;\n _ASSERT && console.assert(pointCount > 0);\n\n this.v_invMassA = bodyA.m_invMass;\n this.v_invMassB = bodyB.m_invMass;\n this.v_invIA = bodyA.m_invI;\n this.v_invIB = bodyB.m_invI;\n\n this.v_friction = this.m_friction;\n this.v_restitution = this.m_restitution;\n this.v_tangentSpeed = this.m_tangentSpeed;\n\n this.v_pointCount = pointCount;\n\n this.v_K.setZero();\n this.v_normalMass.setZero();\n\n this.p_invMassA = bodyA.m_invMass;\n this.p_invMassB = bodyB.m_invMass;\n this.p_invIA = bodyA.m_invI;\n this.p_invIB = bodyB.m_invI;\n this.p_localCenterA = Vec2.clone(bodyA.m_sweep.localCenter);\n this.p_localCenterB = Vec2.clone(bodyB.m_sweep.localCenter);\n\n this.p_radiusA = shapeA.m_radius;\n this.p_radiusB = shapeB.m_radius;\n\n this.p_type = manifold.type;\n this.p_localNormal = Vec2.clone(manifold.localNormal);\n this.p_localPoint = Vec2.clone(manifold.localPoint);\n this.p_pointCount = pointCount;\n\n for (let j = 0; j < pointCount; ++j) {\n const cp = manifold.points[j];\n const vcp = this.v_points[j] = new VelocityConstraintPoint();\n\n if (step.warmStarting) {\n vcp.normalImpulse = step.dtRatio * cp.normalImpulse;\n vcp.tangentImpulse = step.dtRatio * cp.tangentImpulse;\n\n } else {\n vcp.normalImpulse = 0.0;\n vcp.tangentImpulse = 0.0;\n }\n\n vcp.rA.setZero();\n vcp.rB.setZero();\n vcp.normalMass = 0.0;\n vcp.tangentMass = 0.0;\n vcp.velocityBias = 0.0;\n\n this.p_localPoints[j] = Vec2.clone(cp.localPoint);\n\n }\n }\n\n /**\n * Get the contact manifold. Do not modify the manifold unless you understand\n * the internals of the library.\n */\n getManifold(): Manifold {\n return this.m_manifold;\n }\n\n /**\n * Get the world manifold.\n */\n getWorldManifold(worldManifold: WorldManifold | null | undefined): WorldManifold | undefined {\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n\n return this.m_manifold.getWorldManifold(worldManifold, bodyA.getTransform(),\n shapeA.m_radius, bodyB.getTransform(), shapeB.m_radius);\n }\n\n /**\n * Enable/disable this contact. This can be used inside the pre-solve contact\n * listener. The contact is only disabled for the current time step (or sub-step\n * in continuous collisions).\n */\n setEnabled(flag: boolean): void {\n this.m_enabledFlag = !!flag;\n }\n\n /**\n * Has this contact been disabled?\n */\n isEnabled(): boolean {\n return this.m_enabledFlag;\n }\n\n /**\n * Is this contact touching?\n */\n isTouching(): boolean {\n return this.m_touchingFlag;\n }\n\n /**\n * Get the next contact in the world's contact list.\n */\n getNext(): Contact | null {\n return this.m_next;\n }\n\n /**\n * Get fixture A in this contact.\n */\n getFixtureA(): Fixture {\n return this.m_fixtureA;\n }\n\n /**\n * Get fixture B in this contact.\n */\n getFixtureB(): Fixture {\n return this.m_fixtureB;\n }\n\n /**\n * Get the child primitive index for fixture A.\n */\n getChildIndexA(): number {\n return this.m_indexA;\n }\n\n /**\n * Get the child primitive index for fixture B.\n */\n getChildIndexB(): number {\n return this.m_indexB;\n }\n\n /**\n * Flag this contact for filtering. Filtering will occur the next time step.\n */\n flagForFiltering(): void {\n this.m_filterFlag = true;\n }\n\n /**\n * Override the default friction mixture. You can call this in\n * ContactListener.preSolve. This value persists until set or reset.\n */\n setFriction(friction: number): void {\n this.m_friction = friction;\n }\n\n /**\n * Get the friction.\n */\n getFriction(): number {\n return this.m_friction;\n }\n\n /**\n * Reset the friction mixture to the default value.\n */\n resetFriction(): void {\n this.m_friction = mixFriction(this.m_fixtureA.m_friction,\n this.m_fixtureB.m_friction);\n }\n\n /**\n * Override the default restitution mixture. You can call this in\n * ContactListener.preSolve. The value persists until you set or reset.\n */\n setRestitution(restitution: number): void {\n this.m_restitution = restitution;\n }\n\n /**\n * Get the restitution.\n */\n getRestitution(): number {\n return this.m_restitution;\n }\n\n /**\n * Reset the restitution to the default value.\n */\n resetRestitution(): void {\n this.m_restitution = mixRestitution(this.m_fixtureA.m_restitution,\n this.m_fixtureB.m_restitution);\n }\n\n /**\n * Set the desired tangent speed for a conveyor belt behavior. In meters per\n * second.\n */\n setTangentSpeed(speed: number): void {\n this.m_tangentSpeed = speed;\n }\n\n /**\n * Get the desired tangent speed. In meters per second.\n */\n getTangentSpeed(): number {\n return this.m_tangentSpeed;\n }\n\n /**\n * Called by Update method, and implemented by subclasses.\n */\n evaluate(manifold: Manifold, xfA: Transform, xfB: Transform): void {\n this.m_evaluateFcn(manifold, xfA, this.m_fixtureA, this.m_indexA, xfB,\n this.m_fixtureB, this.m_indexB);\n }\n\n /**\n * Updates the contact manifold and touching status.\n *\n * Note: do not assume the fixture AABBs are overlapping or are valid.\n *\n * @param listener.beginContact\n * @param listener.endContact\n * @param listener.preSolve\n */\n update(listener?: {\n beginContact(contact: Contact): void,\n endContact(contact: Contact): void,\n preSolve(contact: Contact, oldManifold: Manifold): void\n }): void {\n\n // Re-enable this contact.\n this.m_enabledFlag = true;\n\n let touching = false;\n const wasTouching = this.m_touchingFlag;\n\n const sensorA = this.m_fixtureA.isSensor();\n const sensorB = this.m_fixtureB.isSensor();\n const sensor = sensorA || sensorB;\n\n const bodyA = this.m_fixtureA.getBody();\n const bodyB = this.m_fixtureB.getBody();\n const xfA = bodyA.getTransform();\n const xfB = bodyB.getTransform();\n\n let oldManifold;\n\n // Is this contact a sensor?\n if (sensor) {\n const shapeA = this.m_fixtureA.getShape();\n const shapeB = this.m_fixtureB.getShape();\n touching = testOverlap(shapeA, this.m_indexA, shapeB, this.m_indexB, xfA, xfB);\n\n // Sensors don't generate manifolds.\n this.m_manifold.pointCount = 0;\n } else {\n\n // TODO reuse manifold\n oldManifold = this.m_manifold;\n this.m_manifold = new Manifold();\n\n this.evaluate(this.m_manifold, xfA, xfB);\n touching = this.m_manifold.pointCount > 0;\n\n // Match old contact ids to new contact ids and copy the\n // stored impulses to warm start the solver.\n for (let i = 0; i < this.m_manifold.pointCount; ++i) {\n const nmp = this.m_manifold.points[i];\n nmp.normalImpulse = 0.0;\n nmp.tangentImpulse = 0.0;\n\n for (let j = 0; j < oldManifold.pointCount; ++j) {\n const omp = oldManifold.points[j];\n if (omp.id.key == nmp.id.key) {\n nmp.normalImpulse = omp.normalImpulse;\n nmp.tangentImpulse = omp.tangentImpulse;\n break;\n }\n }\n }\n\n if (touching != wasTouching) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n }\n\n this.m_touchingFlag = touching;\n\n if (!wasTouching && touching && listener) {\n listener.beginContact(this);\n }\n\n if (wasTouching && !touching && listener) {\n listener.endContact(this);\n }\n\n if (!sensor && touching && listener) {\n listener.preSolve(this, oldManifold);\n }\n }\n\n solvePositionConstraint(step: TimeStep): number {\n return this._solvePositionConstraint(step);\n }\n\n solvePositionConstraintTOI(step: TimeStep, toiA: Body, toiB: Body): number {\n return this._solvePositionConstraint(step, toiA, toiB);\n }\n\n private _solvePositionConstraint(step: TimeStep, toiA?: Body, toiB?: Body): number {\n const toi: boolean = !!toiA && !!toiB;\n\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n let mA = 0.0;\n let iA = 0.0;\n if (!toi || (bodyA == toiA || bodyA == toiB)) {\n mA = this.p_invMassA;\n iA = this.p_invIA;\n }\n\n let mB = 0.0;\n let iB = 0.0;\n if (!toi || (bodyB == toiA || bodyB == toiB)) {\n mB = this.p_invMassB;\n iB = this.p_invIB;\n }\n\n const cA = Vec2.clone(positionA.c);\n let aA = positionA.a;\n\n const cB = Vec2.clone(positionB.c);\n let aB = positionB.a;\n\n let minSeparation = 0.0;\n\n // Solve normal constraints\n for (let j = 0; j < this.p_pointCount; ++j) {\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p = Vec2.sub(cA, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p = Vec2.sub(cB, Rot.mulVec2(xfB.q, localCenterB));\n\n // PositionSolverManifold\n let normal;\n let point;\n let separation;\n switch (this.p_type) {\n case ManifoldType.e_circles: {\n const pointA = Transform.mulVec2(xfA, this.p_localPoint);\n const pointB = Transform.mulVec2(xfB, this.p_localPoints[0]);\n normal = Vec2.sub(pointB, pointA);\n normal.normalize();\n point = Vec2.combine(0.5, pointA, 0.5, pointB);\n separation = Vec2.dot(Vec2.sub(pointB, pointA), normal) - this.p_radiusA - this.p_radiusB;\n break;\n }\n\n case ManifoldType.e_faceA: {\n normal = Rot.mulVec2(xfA.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfA, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfB, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n break;\n }\n\n case ManifoldType.e_faceB: {\n normal = Rot.mulVec2(xfB.q, this.p_localNormal);\n const planePoint = Transform.mulVec2(xfB, this.p_localPoint);\n const clipPoint = Transform.mulVec2(xfA, this.p_localPoints[j]);\n separation = Vec2.dot(Vec2.sub(clipPoint, planePoint), normal) - this.p_radiusA - this.p_radiusB;\n point = clipPoint;\n\n // Ensure normal points from A to B\n normal.mul(-1);\n break;\n }\n }\n\n const rA = Vec2.sub(point, cA);\n const rB = Vec2.sub(point, cB);\n\n // Track max constraint error.\n minSeparation = Math.min(minSeparation, separation);\n\n const baumgarte = toi ? Settings.toiBaugarte : Settings.baumgarte;\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n // Prevent large corrections and allow slop.\n const C = Math.clamp(baumgarte * (separation + linearSlop), -maxLinearCorrection, 0.0);\n\n // Compute the effective mass.\n const rnA = Vec2.crossVec2Vec2(rA, normal);\n const rnB = Vec2.crossVec2Vec2(rB, normal);\n const K = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n // Compute normal impulse\n const impulse = K > 0.0 ? -C / K : 0.0;\n\n const P = Vec2.mulNumVec2(impulse, normal);\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n\n return minSeparation;\n }\n\n initVelocityConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const radiusA = this.p_radiusA;\n const radiusB = this.p_radiusB;\n const manifold = this.getManifold();\n\n const mA = this.v_invMassA;\n const mB = this.v_invMassB;\n const iA = this.v_invIA;\n const iB = this.v_invIB;\n const localCenterA = Vec2.clone(this.p_localCenterA);\n const localCenterB = Vec2.clone(this.p_localCenterB);\n\n const cA = Vec2.clone(positionA.c);\n const aA = positionA.a;\n const vA = Vec2.clone(velocityA.v);\n const wA = velocityA.w;\n\n const cB = Vec2.clone(positionB.c);\n const aB = positionB.a;\n const vB = Vec2.clone(velocityB.v);\n const wB = velocityB.w;\n\n _ASSERT && console.assert(manifold.pointCount > 0);\n\n const xfA = Transform.identity();\n const xfB = Transform.identity();\n xfA.q.setAngle(aA);\n xfB.q.setAngle(aB);\n xfA.p.setCombine(1, cA, -1, Rot.mulVec2(xfA.q, localCenterA));\n xfB.p.setCombine(1, cB, -1, Rot.mulVec2(xfB.q, localCenterB));\n\n const worldManifold = manifold.getWorldManifold(null, xfA, radiusA, xfB, radiusB);\n\n this.v_normal.setVec2(worldManifold.normal);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n vcp.rA.setVec2(Vec2.sub(worldManifold.points[j], cA));\n vcp.rB.setVec2(Vec2.sub(worldManifold.points[j], cB));\n\n const rnA = Vec2.crossVec2Vec2(vcp.rA, this.v_normal);\n const rnB = Vec2.crossVec2Vec2(vcp.rB, this.v_normal);\n\n const kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB;\n\n vcp.normalMass = kNormal > 0.0 ? 1.0 / kNormal : 0.0;\n\n const tangent = Vec2.crossVec2Num(this.v_normal, 1.0);\n\n const rtA = Vec2.crossVec2Vec2(vcp.rA, tangent);\n const rtB = Vec2.crossVec2Vec2(vcp.rB, tangent);\n\n const kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB;\n\n vcp.tangentMass = kTangent > 0.0 ? 1.0 / kTangent : 0.0;\n\n // Setup a velocity bias for restitution.\n vcp.velocityBias = 0.0;\n const vRel = Vec2.dot(this.v_normal, vB)\n + Vec2.dot(this.v_normal, Vec2.crossNumVec2(wB, vcp.rB))\n - Vec2.dot(this.v_normal, vA)\n - Vec2.dot(this.v_normal, Vec2.crossNumVec2(wA, vcp.rA));\n if (vRel < -Settings.velocityThreshold) {\n vcp.velocityBias = -this.v_restitution * vRel;\n }\n }\n\n // If we have two points, then prepare the block solver.\n if (this.v_pointCount == 2 && step.blockSolve) {\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const rn1A = Vec2.crossVec2Vec2(vcp1.rA, this.v_normal);\n const rn1B = Vec2.crossVec2Vec2(vcp1.rB, this.v_normal);\n const rn2A = Vec2.crossVec2Vec2(vcp2.rA, this.v_normal);\n const rn2B = Vec2.crossVec2Vec2(vcp2.rB, this.v_normal);\n\n const k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B;\n const k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B;\n const k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B;\n\n // Ensure a reasonable condition number.\n const k_maxConditionNumber = 1000.0;\n if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) {\n // K is safe to invert.\n this.v_K.ex.setNum(k11, k12);\n this.v_K.ey.setNum(k12, k22);\n this.v_normalMass.set(this.v_K.getInverse());\n } else {\n // The constraints are redundant, just use one.\n // TODO_ERIN use deepest?\n this.v_pointCount = 1;\n }\n }\n\n positionA.c.setVec2(cA);\n positionA.a = aA;\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n positionB.c.setVec2(cB);\n positionB.a = aB;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n warmStartConstraint(step: TimeStep): void {\n const fixtureA = this.m_fixtureA;\n const fixtureB = this.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n const velocityA = bodyA.c_velocity;\n const velocityB = bodyB.c_velocity;\n const positionA = bodyA.c_position;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n const P = Vec2.combine(vcp.normalImpulse, normal, vcp.tangentImpulse, tangent);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n vA.subMul(mA, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n vB.addMul(mB, P);\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n storeConstraintImpulses(step: TimeStep): void {\n const manifold = this.m_manifold;\n for (let j = 0; j < this.v_pointCount; ++j) {\n manifold.points[j].normalImpulse = this.v_points[j].normalImpulse;\n manifold.points[j].tangentImpulse = this.v_points[j].tangentImpulse;\n }\n }\n\n solveVelocityConstraint(step: TimeStep): void {\n const bodyA = this.m_fixtureA.m_body;\n const bodyB = this.m_fixtureB.m_body;\n\n const velocityA = bodyA.c_velocity;\n const positionA = bodyA.c_position;\n\n const velocityB = bodyB.c_velocity;\n const positionB = bodyB.c_position;\n\n const mA = this.v_invMassA;\n const iA = this.v_invIA;\n const mB = this.v_invMassB;\n const iB = this.v_invIB;\n\n const vA = Vec2.clone(velocityA.v);\n let wA = velocityA.w;\n const vB = Vec2.clone(velocityB.v);\n let wB = velocityB.w;\n\n const normal = this.v_normal;\n const tangent = Vec2.crossVec2Num(normal, 1.0);\n const friction = this.v_friction;\n\n _ASSERT && console.assert(this.v_pointCount == 1 || this.v_pointCount == 2);\n\n // Solve tangent constraints first because non-penetration is more important\n // than friction.\n for (let j = 0; j < this.v_pointCount; ++j) {\n const vcp = this.v_points[j]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute tangent force\n const vt = Vec2.dot(dv, tangent) - this.v_tangentSpeed;\n let lambda = vcp.tangentMass * (-vt);\n\n // Clamp the accumulated force\n const maxFriction = friction * vcp.normalImpulse;\n const newImpulse = Math.clamp(vcp.tangentImpulse + lambda, -maxFriction, maxFriction);\n lambda = newImpulse - vcp.tangentImpulse;\n vcp.tangentImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, tangent);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n\n // Solve normal constraints\n if (this.v_pointCount == 1 || step.blockSolve == false) {\n for (let i = 0; i < this.v_pointCount; ++i) {\n const vcp = this.v_points[i]; // VelocityConstraintPoint\n\n // Relative velocity at contact\n const dv = Vec2.zero();\n dv.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, vcp.rB));\n dv.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, vcp.rA));\n\n // Compute normal impulse\n const vn = Vec2.dot(dv, normal);\n let lambda = -vcp.normalMass * (vn - vcp.velocityBias);\n\n // Clamp the accumulated impulse\n const newImpulse = Math.max(vcp.normalImpulse + lambda, 0.0);\n lambda = newImpulse - vcp.normalImpulse;\n vcp.normalImpulse = newImpulse;\n\n // Apply contact impulse\n const P = Vec2.mulNumVec2(lambda, normal);\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(vcp.rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(vcp.rB, P);\n }\n } else {\n // Block solver developed in collaboration with Dirk Gregorius (back in\n // 01/07 on Box2D_Lite).\n // Build the mini LCP for this contact patch\n //\n // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i =\n // 1..2\n //\n // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n )\n // b = vn0 - velocityBias\n //\n // The system is solved using the \"Total enumeration method\" (s. Murty).\n // The complementary constraint vn_i * x_i\n // implies that we must have in any solution either vn_i = 0 or x_i = 0.\n // So for the 2D contact problem the cases\n // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and\n // vn1 = 0 need to be tested. The first valid\n // solution that satisfies the problem is chosen.\n //\n // In order to account of the accumulated impulse 'a' (because of the\n // iterative nature of the solver which only requires\n // that the accumulated impulse is clamped and not the incremental\n // impulse) we change the impulse variable (x_i).\n //\n // Substitute:\n //\n // x = a + d\n //\n // a := old total impulse\n // x := new total impulse\n // d := incremental impulse\n //\n // For the current iteration we extend the formula for the incremental\n // impulse\n // to compute the new total impulse:\n //\n // vn = A * d + b\n // = A * (x - a) + b\n // = A * x + b - A * a\n // = A * x + b'\n // b' = b - A * a;\n\n const vcp1 = this.v_points[0]; // VelocityConstraintPoint\n const vcp2 = this.v_points[1]; // VelocityConstraintPoint\n\n const a = Vec2.neo(vcp1.normalImpulse, vcp2.normalImpulse);\n _ASSERT && console.assert(a.x >= 0.0 && a.y >= 0.0);\n\n // Relative velocity at contact\n let dv1 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp1.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp1.rA));\n let dv2 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp2.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp2.rA));\n\n // Compute normal velocity\n let vn1 = Vec2.dot(dv1, normal);\n let vn2 = Vec2.dot(dv2, normal);\n\n const b = Vec2.neo(vn1 - vcp1.velocityBias, vn2 - vcp2.velocityBias);\n\n // Compute b'\n b.sub(Mat22.mulVec2(this.v_K, a));\n\n const k_errorTol = 1e-3;\n // NOT_USED(k_errorTol);\n\n while (true) {\n //\n // Case 1: vn = 0\n //\n // 0 = A * x + b'\n //\n // Solve for x:\n //\n // x = - inv(A) * b'\n //\n const x = Mat22.mulVec2(this.v_normalMass, b).neg();\n\n if (x.x >= 0.0 && x.y >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n dv1 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA)));\n dv2 = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB)), Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA)));\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && console.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n _ASSERT && console.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 2: vn1 = 0 and x2 = 0\n //\n // 0 = a11 * x1 + a12 * 0 + b1'\n // vn2 = a21 * x1 + a22 * 0 + b2'\n //\n x.x = -vcp1.normalMass * b.x;\n x.y = 0.0;\n vn1 = 0.0;\n vn2 = this.v_K.ex.y * x.x + b.y;\n\n if (x.x >= 0.0 && vn2 >= 0.0) {\n // Get the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv1B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp1.rB));\n const dv1A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp1.rA));\n const dv1 = Vec2.sub(dv1B, dv1A);\n\n // Compute normal velocity\n vn1 = Vec2.dot(dv1, normal);\n\n _ASSERT && console.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 3: vn2 = 0 and x1 = 0\n //\n // vn1 = a11 * 0 + a12 * x2 + b1'\n // 0 = a21 * 0 + a22 * x2 + b2'\n //\n x.x = 0.0;\n x.y = -vcp2.normalMass * b.y;\n vn1 = this.v_K.ey.x * x.y + b.x;\n vn2 = 0.0;\n\n if (x.y >= 0.0 && vn1 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n if (DEBUG_SOLVER) {\n // Postconditions\n const dv2B = Vec2.add(vB, Vec2.crossNumVec2(wB, vcp2.rB));\n const dv2A = Vec2.add(vA, Vec2.crossNumVec2(wA, vcp2.rA));\n const dv1 = Vec2.sub(dv2B, dv2A);\n\n // Compute normal velocity\n vn2 = Vec2.dot(dv2, normal);\n\n _ASSERT && console.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol);\n }\n break;\n }\n\n //\n // Case 4: x1 = 0 and x2 = 0\n //\n // vn1 = b1\n // vn2 = b2;\n //\n x.x = 0.0;\n x.y = 0.0;\n vn1 = b.x;\n vn2 = b.y;\n\n if (vn1 >= 0.0 && vn2 >= 0.0) {\n // Resubstitute for the incremental impulse\n const d = Vec2.sub(x, a);\n\n // Apply incremental impulse\n const P1 = Vec2.mulNumVec2(d.x, normal);\n const P2 = Vec2.mulNumVec2(d.y, normal);\n vA.subCombine(mA, P1, mA, P2);\n wA -= iA * (Vec2.crossVec2Vec2(vcp1.rA, P1) + Vec2.crossVec2Vec2(vcp2.rA, P2));\n\n vB.addCombine(mB, P1, mB, P2);\n wB += iB * (Vec2.crossVec2Vec2(vcp1.rB, P1) + Vec2.crossVec2Vec2(vcp2.rB, P2));\n\n // Accumulate\n vcp1.normalImpulse = x.x;\n vcp2.normalImpulse = x.y;\n\n break;\n }\n\n // No solution, give up. This is hit sometimes, but it doesn't seem to\n // matter.\n break;\n }\n }\n\n velocityA.v.setVec2(vA);\n velocityA.w = wA;\n\n velocityB.v.setVec2(vB);\n velocityB.w = wB;\n }\n\n /**\n * @internal\n */\n static addType(type1: ShapeType, type2: ShapeType, callback: ContactCallback): void {\n s_registers[type1] = s_registers[type1] || {};\n s_registers[type1][type2] = callback;\n }\n\n /**\n * @internal\n */\n static create(fixtureA: Fixture, indexA: number, fixtureB: Fixture, indexB: number): Contact | null {\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // TODO: pool contacts\n let contact;\n let evaluateFcn;\n if (evaluateFcn = s_registers[typeA] && s_registers[typeA][typeB]) {\n contact = new Contact(fixtureA, indexA, fixtureB, indexB, evaluateFcn);\n } else if (evaluateFcn = s_registers[typeB] && s_registers[typeB][typeA]) {\n contact = new Contact(fixtureB, indexB, fixtureA, indexA, evaluateFcn);\n } else {\n return null;\n }\n\n // Contact creation may swap fixtures.\n fixtureA = contact.getFixtureA();\n fixtureB = contact.getFixtureB();\n indexA = contact.getChildIndexA();\n indexB = contact.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Connect to body A\n contact.m_nodeA.contact = contact;\n contact.m_nodeA.other = bodyB;\n\n contact.m_nodeA.prev = null;\n contact.m_nodeA.next = bodyA.m_contactList;\n if (bodyA.m_contactList != null) {\n bodyA.m_contactList.prev = contact.m_nodeA;\n }\n bodyA.m_contactList = contact.m_nodeA;\n\n // Connect to body B\n contact.m_nodeB.contact = contact;\n contact.m_nodeB.other = bodyA;\n\n contact.m_nodeB.prev = null;\n contact.m_nodeB.next = bodyB.m_contactList;\n if (bodyB.m_contactList != null) {\n bodyB.m_contactList.prev = contact.m_nodeB;\n }\n bodyB.m_contactList = contact.m_nodeB;\n\n // Wake up the bodies\n if (fixtureA.isSensor() == false && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n return contact;\n }\n\n /**\n * @internal\n */\n static destroy(contact: Contact, listener: { endContact: (contact: Contact) => void }): void {\n const fixtureA = contact.m_fixtureA;\n const fixtureB = contact.m_fixtureB;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n if (contact.isTouching()) {\n listener.endContact(contact);\n }\n\n // Remove from body 1\n if (contact.m_nodeA.prev) {\n contact.m_nodeA.prev.next = contact.m_nodeA.next;\n }\n\n if (contact.m_nodeA.next) {\n contact.m_nodeA.next.prev = contact.m_nodeA.prev;\n }\n\n if (contact.m_nodeA == bodyA.m_contactList) {\n bodyA.m_contactList = contact.m_nodeA.next;\n }\n\n // Remove from body 2\n if (contact.m_nodeB.prev) {\n contact.m_nodeB.prev.next = contact.m_nodeB.next;\n }\n\n if (contact.m_nodeB.next) {\n contact.m_nodeB.next.prev = contact.m_nodeB.prev;\n }\n\n if (contact.m_nodeB == bodyB.m_contactList) {\n bodyB.m_contactList = contact.m_nodeB.next;\n }\n\n if (contact.m_manifold.pointCount > 0 && fixtureA.isSensor() == false\n && fixtureB.isSensor() == false) {\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n }\n\n const typeA = fixtureA.getType();\n const typeB = fixtureB.getType();\n\n // const destroyFcn = s_registers[typeA][typeB].destroyFcn;\n // if (typeof destroyFcn === 'function') {\n // destroyFcn(contact);\n // }\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../util/options';\nimport { Vec2 } from '../common/Vec2';\nimport { BroadPhase } from '../collision/BroadPhase';\nimport { Solver, ContactImpulse, TimeStep } from './Solver';\nimport { Body, BodyDef } from './Body';\nimport { Joint } from './Joint';\nimport { Contact } from './Contact';\nimport { AABB, RayCastInput, RayCastOutput } from \"../collision/AABB\";\nimport { Fixture, FixtureProxy } from \"./Fixture\";\nimport { Manifold } from \"../collision/Manifold\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * @prop gravity [{ x : 0, y : 0}]\n * @prop allowSleep [true]\n * @prop warmStarting [true]\n * @prop continuousPhysics [true]\n * @prop subStepping [false]\n * @prop blockSolve [true]\n * @prop velocityIterations [8] For the velocity constraint solver.\n * @prop positionIterations [3] For the position constraint solver.\n */\nexport interface WorldDef {\n gravity?: Vec2;\n allowSleep?: boolean;\n warmStarting?: boolean;\n continuousPhysics?: boolean;\n subStepping?: boolean;\n blockSolve?: boolean;\n velocityIterations?: number;\n positionIterations?: number;\n}\n\nconst WorldDefDefault: WorldDef = {\n gravity : Vec2.zero(),\n allowSleep : true,\n warmStarting : true,\n continuousPhysics : true,\n subStepping : false,\n blockSolve : true,\n velocityIterations : 8,\n positionIterations : 3\n};\n\n/**\n * Callback function for ray casts, see {@link World.rayCast}.\n *\n * Called for each fixture found in the query. You control how the ray cast\n * proceeds by returning a float: return -1: ignore this fixture and continue\n * return 0: terminate the ray cast return fraction: clip the ray to this point\n * return 1: don't clip the ray and continue\n *\n * @param fixture The fixture hit by the ray\n * @param point The point of initial intersection\n * @param normal The normal vector at the point of intersection\n * @param fraction\n *\n * @return -1 to filter, 0 to terminate, fraction to clip the ray for closest hit, 1 to continue\n */\nexport type WorldRayCastCallback = (fixture: Fixture, point: Vec2, normal: Vec2, fraction: number) => number;\n\n/**\n * Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\nexport type WorldAABBQueryCallback = (fixture: Fixture) => boolean;\n\nexport class World {\n /** @internal */ m_solver: Solver;\n /** @internal */ m_broadPhase: BroadPhase;\n /** @internal */ m_contactList: Contact | null;\n /** @internal */ m_contactCount: number;\n /** @internal */ m_bodyList: Body | null;\n /** @internal */ m_bodyCount: number;\n /** @internal */ m_jointList: Joint | null;\n /** @internal */ m_jointCount: number;\n /** @internal */ m_stepComplete: boolean;\n /** @internal */ m_allowSleep: boolean;\n /** @internal */ m_gravity: Vec2;\n /** @internal */ m_clearForces: boolean;\n /** @internal */ m_newFixture: boolean;\n /** @internal */ m_locked: boolean;\n /** @internal */ m_warmStarting: boolean;\n /** @internal */ m_continuousPhysics: boolean;\n /** @internal */ m_subStepping: boolean;\n /** @internal */ m_blockSolve: boolean;\n /** @internal */ m_velocityIterations: number;\n /** @internal */ m_positionIterations: number;\n /** @internal */ m_t: number;\n\n // TODO\n /** @internal */ _listeners: {\n [key: string]: any[]\n };\n\n /**\n * @param def World definition or gravity vector.\n */\n constructor(def?: WorldDef | Vec2 | null) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof World)) {\n return new World(def);\n }\n\n this.s_step = new TimeStep();\n\n\n if (def && Vec2.isValid(def)) {\n def = { gravity: def as Vec2 };\n }\n\n def = options(def, WorldDefDefault) as WorldDef;\n\n this.m_solver = new Solver(this);\n\n this.m_broadPhase = new BroadPhase();\n\n this.m_contactList = null;\n this.m_contactCount = 0;\n\n this.m_bodyList = null;\n this.m_bodyCount = 0;\n\n this.m_jointList = null;\n this.m_jointCount = 0;\n\n this.m_stepComplete = true;\n\n this.m_allowSleep = def.allowSleep;\n this.m_gravity = Vec2.clone(def.gravity);\n\n this.m_clearForces = true;\n this.m_newFixture = false;\n this.m_locked = false;\n\n // These are for debugging the solver.\n this.m_warmStarting = def.warmStarting;\n this.m_continuousPhysics = def.continuousPhysics;\n this.m_subStepping = def.subStepping;\n\n this.m_blockSolve = def.blockSolve;\n this.m_velocityIterations = def.velocityIterations;\n this.m_positionIterations = def.positionIterations;\n\n this.m_t = 0;\n }\n\n /** @internal */\n _serialize(): object {\n const bodies = [];\n const joints = [];\n\n for (let b = this.getBodyList(); b; b = b.getNext()) {\n bodies.push(b);\n }\n\n for (let j = this.getJointList(); j; j = j.getNext()) {\n // @ts-ignore\n if (typeof j._serialize === 'function') {\n joints.push(j);\n }\n }\n\n return {\n gravity: this.m_gravity,\n bodies,\n joints,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, context: any, restore: any): World {\n if (!data) {\n return new World();\n }\n\n const world = new World(data.gravity);\n\n if (data.bodies) {\n for (let i = data.bodies.length - 1; i >= 0; i -= 1) {\n world._addBody(restore(Body, data.bodies[i], world));\n }\n }\n\n if (data.joints) {\n for (let i = data.joints.length - 1; i >= 0; i--) {\n world.createJoint(restore(Joint, data.joints[i], world));\n }\n }\n\n return world;\n }\n\n /**\n * Get the world body list. With the returned body, use Body.getNext to get the\n * next body in the world list. A null body indicates the end of the list.\n *\n * @return the head of the world body list.\n */\n getBodyList(): Body | null {\n return this.m_bodyList;\n }\n\n /**\n * Get the world joint list. With the returned joint, use Joint.getNext to get\n * the next joint in the world list. A null joint indicates the end of the list.\n *\n * @return the head of the world joint list.\n */\n getJointList(): Joint | null {\n return this.m_jointList;\n }\n\n /**\n * Get the world contact list. With the returned contact, use Contact.getNext to\n * get the next contact in the world list. A null contact indicates the end of\n * the list.\n *\n * Warning: contacts are created and destroyed in the middle of a time step.\n * Use ContactListener to avoid missing contacts.\n *\n * @return the head of the world contact list.\n */\n getContactList(): Contact | null {\n return this.m_contactList;\n }\n\n getBodyCount(): number {\n return this.m_bodyCount;\n }\n\n getJointCount(): number {\n return this.m_jointCount;\n }\n\n /**\n * Get the number of contacts (each may have 0 or more contact points).\n */\n getContactCount(): number {\n return this.m_contactCount;\n }\n\n /**\n * Change the global gravity vector.\n */\n setGravity(gravity: Vec2): void {\n this.m_gravity = gravity;\n }\n\n /**\n * Get the global gravity vector.\n */\n getGravity(): Vec2 {\n return this.m_gravity;\n }\n\n /**\n * Is the world locked (in the middle of a time step).\n */\n isLocked(): boolean {\n return this.m_locked;\n }\n\n /**\n * Enable/disable sleep.\n */\n setAllowSleeping(flag: boolean): void {\n if (flag == this.m_allowSleep) {\n return;\n }\n\n this.m_allowSleep = flag;\n if (this.m_allowSleep == false) {\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.setAwake(true);\n }\n }\n }\n\n getAllowSleeping(): boolean {\n return this.m_allowSleep;\n }\n\n /**\n * Enable/disable warm starting. For testing.\n */\n setWarmStarting(flag: boolean): void {\n this.m_warmStarting = flag;\n }\n\n getWarmStarting(): boolean {\n return this.m_warmStarting;\n }\n\n /**\n * Enable/disable continuous physics. For testing.\n */\n setContinuousPhysics(flag: boolean): void {\n this.m_continuousPhysics = flag;\n }\n\n getContinuousPhysics(): boolean {\n return this.m_continuousPhysics;\n }\n\n /**\n * Enable/disable single stepped continuous physics. For testing.\n */\n setSubStepping(flag: boolean): void {\n this.m_subStepping = flag;\n }\n\n getSubStepping(): boolean {\n return this.m_subStepping;\n }\n\n /**\n * Set flag to control automatic clearing of forces after each time step.\n */\n setAutoClearForces(flag: boolean): void {\n this.m_clearForces = flag;\n }\n\n /**\n * Get the flag that controls automatic clearing of forces after each time step.\n */\n getAutoClearForces(): boolean {\n return this.m_clearForces;\n }\n\n /**\n * Manually clear the force buffer on all bodies. By default, forces are cleared\n * automatically after each call to step. The default behavior is modified by\n * calling setAutoClearForces. The purpose of this function is to support\n * sub-stepping. Sub-stepping is often used to maintain a fixed sized time step\n * under a variable frame-rate. When you perform sub-stepping you will disable\n * auto clearing of forces and instead call clearForces after all sub-steps are\n * complete in one pass of your game loop.\n *\n * See {@link World.setAutoClearForces}\n */\n clearForces(): void {\n for (let body = this.m_bodyList; body; body = body.getNext()) {\n body.m_force.setZero();\n body.m_torque = 0.0;\n }\n }\n\n /**\n * Query the world for all fixtures that potentially overlap the provided AABB.\n *\n * @param aabb The query box.\n * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query.\n */\n queryAABB(aabb: AABB, callback: WorldAABBQueryCallback): void {\n _ASSERT && console.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n this.m_broadPhase.query(aabb, function(proxyId: number): boolean { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n return callback(proxy.fixture);\n });\n }\n\n /**\n * Ray-cast the world for all fixtures in the path of the ray. Your callback\n * controls whether you get the closest point, any point, or n-points. The\n * ray-cast ignores shapes that contain the starting point.\n *\n * @param point1 The ray starting point\n * @param point2 The ray ending point\n * @param callback A user implemented callback function.\n */\n rayCast(point1: Vec2, point2: Vec2, callback: WorldRayCastCallback): void {\n _ASSERT && console.assert(typeof callback === 'function');\n const broadPhase = this.m_broadPhase;\n\n this.m_broadPhase.rayCast({\n maxFraction : 1.0,\n p1 : point1,\n p2 : point2\n }, function(input: RayCastInput, proxyId: number): number { // TODO GC\n const proxy = broadPhase.getUserData(proxyId);\n const fixture = proxy.fixture;\n const index = proxy.childIndex;\n // @ts-ignore\n const output: RayCastOutput = {}; // TODO GC\n const hit = fixture.rayCast(output, input, index);\n if (hit) {\n const fraction = output.fraction;\n const point = Vec2.add(Vec2.mulNumVec2((1.0 - fraction), input.p1), Vec2.mulNumVec2(fraction, input.p2));\n return callback(fixture, point, output.normal, fraction);\n }\n return input.maxFraction;\n });\n }\n\n /**\n * Get the number of broad-phase proxies.\n */\n getProxyCount(): number {\n return this.m_broadPhase.getProxyCount();\n }\n\n /**\n * Get the height of broad-phase dynamic tree.\n */\n getTreeHeight(): number {\n return this.m_broadPhase.getTreeHeight();\n }\n\n /**\n * Get the balance of broad-phase dynamic tree.\n */\n getTreeBalance(): number {\n return this.m_broadPhase.getTreeBalance();\n }\n\n /**\n * Get the quality metric of broad-phase dynamic tree. The smaller the better.\n * The minimum is 1.\n */\n getTreeQuality(): number {\n return this.m_broadPhase.getTreeQuality();\n }\n\n /**\n * Shift the world origin. Useful for large worlds. The body shift formula is:\n * position -= newOrigin\n *\n * @param newOrigin The new origin with respect to the old origin\n */\n shiftOrigin(newOrigin: Vec2): void {\n _ASSERT && console.assert(this.m_locked == false);\n if (this.m_locked) {\n return;\n }\n\n for (let b = this.m_bodyList; b; b = b.m_next) {\n b.m_xf.p.sub(newOrigin);\n b.m_sweep.c0.sub(newOrigin);\n b.m_sweep.c.sub(newOrigin);\n }\n\n for (let j = this.m_jointList; j; j = j.m_next) {\n j.shiftOrigin(newOrigin);\n }\n\n this.m_broadPhase.shiftOrigin(newOrigin);\n }\n\n /**\n * @internal Used for deserialize.\n */\n _addBody(body: Body): void {\n _ASSERT && console.assert(this.isLocked() === false);\n if (this.isLocked()) {\n return;\n }\n\n // Add to world doubly linked list.\n body.m_prev = null;\n body.m_next = this.m_bodyList;\n if (this.m_bodyList) {\n this.m_bodyList.m_prev = body;\n }\n this.m_bodyList = body;\n ++this.m_bodyCount;\n }\n\n /**\n * Create a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This function is locked during callbacks.\n */\n createBody(def?: BodyDef): Body;\n createBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createBody(arg1?, arg2?) {\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n\n const body = new Body(this, def);\n this._addBody(body);\n return body;\n }\n\n createDynamicBody(def?: BodyDef): Body;\n createDynamicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createDynamicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'dynamic';\n return this.createBody(def);\n }\n\n createKinematicBody(def?: BodyDef): Body;\n createKinematicBody(position: Vec2, angle?: number): Body;\n // tslint:disable-next-line:typedef\n createKinematicBody(arg1?, arg2?) {\n let def: BodyDef = {};\n if (!arg1) {\n } else if (Vec2.isValid(arg1)) {\n def = { position : arg1, angle: arg2 };\n } else if (typeof arg1 === 'object') {\n def = arg1;\n }\n def.type = 'kinematic';\n return this.createBody(def);\n }\n\n /**\n * Destroy a rigid body given a definition. No reference to the definition is\n * retained.\n *\n * Warning: This automatically deletes all associated shapes and joints.\n *\n * Warning: This function is locked during callbacks.\n */\n destroyBody(b: Body): boolean {\n _ASSERT && console.assert(this.m_bodyCount > 0);\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n if (b.m_destroyed) {\n return false;\n }\n\n // Delete the attached joints.\n let je = b.m_jointList;\n while (je) {\n const je0 = je;\n je = je.next;\n\n this.publish('remove-joint', je0.joint);\n this.destroyJoint(je0.joint);\n\n b.m_jointList = je;\n }\n b.m_jointList = null;\n\n // Delete the attached contacts.\n let ce = b.m_contactList;\n while (ce) {\n const ce0 = ce;\n ce = ce.next;\n\n this.destroyContact(ce0.contact);\n\n b.m_contactList = ce;\n }\n b.m_contactList = null;\n\n // Delete the attached fixtures. This destroys broad-phase proxies.\n let f = b.m_fixtureList;\n while (f) {\n const f0 = f;\n f = f.m_next;\n\n this.publish('remove-fixture', f0);\n f0.destroyProxies(this.m_broadPhase);\n\n b.m_fixtureList = f;\n }\n b.m_fixtureList = null;\n\n // Remove world body list.\n if (b.m_prev) {\n b.m_prev.m_next = b.m_next;\n }\n\n if (b.m_next) {\n b.m_next.m_prev = b.m_prev;\n }\n\n if (b == this.m_bodyList) {\n this.m_bodyList = b.m_next;\n }\n\n b.m_destroyed = true;\n\n --this.m_bodyCount;\n\n this.publish('remove-body', b);\n\n return true;\n }\n\n /**\n * Create a joint to constrain bodies together. No reference to the definition\n * is retained. This may cause the connected bodies to cease colliding.\n *\n * Warning: This function is locked during callbacks.\n */\n createJoint(joint: T): T | null {\n _ASSERT && console.assert(!!joint.m_bodyA);\n _ASSERT && console.assert(!!joint.m_bodyB);\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return null;\n }\n\n // Connect to the world list.\n joint.m_prev = null;\n joint.m_next = this.m_jointList;\n if (this.m_jointList) {\n this.m_jointList.m_prev = joint;\n }\n this.m_jointList = joint;\n ++this.m_jointCount;\n\n // Connect to the bodies' doubly linked lists.\n joint.m_edgeA.joint = joint;\n joint.m_edgeA.other = joint.m_bodyB;\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = joint.m_bodyA.m_jointList;\n if (joint.m_bodyA.m_jointList)\n joint.m_bodyA.m_jointList.prev = joint.m_edgeA;\n joint.m_bodyA.m_jointList = joint.m_edgeA;\n\n joint.m_edgeB.joint = joint;\n joint.m_edgeB.other = joint.m_bodyA;\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = joint.m_bodyB.m_jointList;\n if (joint.m_bodyB.m_jointList)\n joint.m_bodyB.m_jointList.prev = joint.m_edgeB;\n joint.m_bodyB.m_jointList = joint.m_edgeB;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n for (let edge = joint.m_bodyB.getContactList(); edge; edge = edge.next) {\n if (edge.other == joint.m_bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n }\n }\n\n // Note: creating a joint doesn't wake the bodies.\n\n return joint;\n }\n\n /**\n * Destroy a joint. This may cause the connected bodies to begin colliding.\n * Warning: This function is locked during callbacks.\n */\n destroyJoint(joint: Joint): void {\n _ASSERT && console.assert(this.isLocked() == false);\n if (this.isLocked()) {\n return;\n }\n\n // Remove from the doubly linked list.\n if (joint.m_prev) {\n joint.m_prev.m_next = joint.m_next;\n }\n\n if (joint.m_next) {\n joint.m_next.m_prev = joint.m_prev;\n }\n\n if (joint == this.m_jointList) {\n this.m_jointList = joint.m_next;\n }\n\n // Disconnect from bodies.\n const bodyA = joint.m_bodyA;\n const bodyB = joint.m_bodyB;\n\n // Wake up connected bodies.\n bodyA.setAwake(true);\n bodyB.setAwake(true);\n\n // Remove from body 1.\n if (joint.m_edgeA.prev) {\n joint.m_edgeA.prev.next = joint.m_edgeA.next;\n }\n\n if (joint.m_edgeA.next) {\n joint.m_edgeA.next.prev = joint.m_edgeA.prev;\n }\n\n if (joint.m_edgeA == bodyA.m_jointList) {\n bodyA.m_jointList = joint.m_edgeA.next;\n }\n\n joint.m_edgeA.prev = null;\n joint.m_edgeA.next = null;\n\n // Remove from body 2\n if (joint.m_edgeB.prev) {\n joint.m_edgeB.prev.next = joint.m_edgeB.next;\n }\n\n if (joint.m_edgeB.next) {\n joint.m_edgeB.next.prev = joint.m_edgeB.prev;\n }\n\n if (joint.m_edgeB == bodyB.m_jointList) {\n bodyB.m_jointList = joint.m_edgeB.next;\n }\n\n joint.m_edgeB.prev = null;\n joint.m_edgeB.next = null;\n\n _ASSERT && console.assert(this.m_jointCount > 0);\n --this.m_jointCount;\n\n // If the joint prevents collisions, then flag any contacts for filtering.\n if (joint.m_collideConnected == false) {\n let edge = bodyB.getContactList();\n while (edge) {\n if (edge.other == bodyA) {\n // Flag the contact for filtering at the next time step (where either\n // body is awake).\n edge.contact.flagForFiltering();\n }\n\n edge = edge.next;\n }\n }\n\n this.publish('remove-joint', joint);\n }\n\n /** @internal */\n s_step: TimeStep; // reuse\n\n /**\n * Take a time step. This performs collision detection, integration, and\n * constraint solution.\n *\n * Broad-phase, narrow-phase, solve and solve time of impacts.\n *\n * @param timeStep Time step, this should not vary.\n */\n step(timeStep: number, velocityIterations?: number, positionIterations?: number): void {\n this.publish('pre-step', timeStep);\n\n if ((velocityIterations | 0) !== velocityIterations) {\n // TODO: remove this in future\n velocityIterations = 0;\n }\n\n velocityIterations = velocityIterations || this.m_velocityIterations;\n positionIterations = positionIterations || this.m_positionIterations;\n\n // If new fixtures were added, we need to find the new contacts.\n if (this.m_newFixture) {\n this.findNewContacts();\n this.m_newFixture = false;\n }\n\n this.m_locked = true;\n\n this.s_step.reset(timeStep);\n this.s_step.velocityIterations = velocityIterations;\n this.s_step.positionIterations = positionIterations;\n this.s_step.warmStarting = this.m_warmStarting;\n this.s_step.blockSolve = this.m_blockSolve;\n\n // Update contacts. This is where some contacts are destroyed.\n this.updateContacts();\n\n // Integrate velocities, solve velocity constraints, and integrate positions.\n if (this.m_stepComplete && timeStep > 0.0) {\n this.m_solver.solveWorld(this.s_step);\n\n // Synchronize fixtures, check for out of range bodies.\n for (let b = this.m_bodyList; b; b = b.getNext()) {\n // If a body was not in an island then it did not move.\n if (b.m_islandFlag == false) {\n continue;\n }\n\n if (b.isStatic()) {\n continue;\n }\n\n // Update fixtures (for broad-phase).\n b.synchronizeFixtures();\n }\n // Look for new contacts.\n this.findNewContacts();\n }\n\n // Handle TOI events.\n if (this.m_continuousPhysics && timeStep > 0.0) {\n this.m_solver.solveWorldTOI(this.s_step);\n }\n\n if (this.m_clearForces) {\n this.clearForces();\n }\n\n this.m_locked = false;\n\n this.publish('post-step', timeStep);\n }\n\n /**\n * @internal\n * Call this method to find new contacts.\n */\n findNewContacts(): void {\n this.m_broadPhase.updatePairs(\n (proxyA: FixtureProxy, proxyB: FixtureProxy) => this.createContact(proxyA, proxyB)\n );\n }\n\n /**\n * @internal\n * Callback for broad-phase.\n */\n createContact(proxyA: FixtureProxy, proxyB: FixtureProxy): void {\n const fixtureA = proxyA.fixture;\n const fixtureB = proxyB.fixture;\n\n const indexA = proxyA.childIndex;\n const indexB = proxyB.childIndex;\n\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Are the fixtures on the same body?\n if (bodyA == bodyB) {\n return;\n }\n\n // TODO_ERIN use a hash table to remove a potential bottleneck when both\n // bodies have a lot of contacts.\n // Does a contact already exist?\n let edge = bodyB.getContactList(); // ContactEdge\n while (edge) {\n if (edge.other == bodyA) {\n const fA = edge.contact.getFixtureA();\n const fB = edge.contact.getFixtureB();\n const iA = edge.contact.getChildIndexA();\n const iB = edge.contact.getChildIndexB();\n\n if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) {\n // A contact already exists.\n return;\n }\n\n if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) {\n // A contact already exists.\n return;\n }\n }\n\n edge = edge.next;\n }\n\n if (bodyB.shouldCollide(bodyA) == false) {\n return;\n }\n if (fixtureB.shouldCollide(fixtureA) == false) {\n return;\n }\n\n // Call the factory.\n const contact = Contact.create(fixtureA, indexA, fixtureB, indexB);\n if (contact == null) {\n return;\n }\n\n // Insert into the world.\n contact.m_prev = null;\n if (this.m_contactList != null) {\n contact.m_next = this.m_contactList;\n this.m_contactList.m_prev = contact;\n }\n this.m_contactList = contact;\n\n ++this.m_contactCount;\n }\n\n /**\n * @internal\n * Removes old non-overlapping contacts, applies filters and updates contacts.\n */\n updateContacts(): void {\n // Update awake contacts.\n let c;\n let next_c = this.m_contactList;\n while (c = next_c) {\n next_c = c.getNext();\n const fixtureA = c.getFixtureA();\n const fixtureB = c.getFixtureB();\n const indexA = c.getChildIndexA();\n const indexB = c.getChildIndexB();\n const bodyA = fixtureA.getBody();\n const bodyB = fixtureB.getBody();\n\n // Is this contact flagged for filtering?\n if (c.m_filterFlag) {\n if (bodyB.shouldCollide(bodyA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n if (fixtureB.shouldCollide(fixtureA) == false) {\n this.destroyContact(c);\n continue;\n }\n\n // Clear the filtering flag.\n c.m_filterFlag = false;\n }\n\n const activeA = bodyA.isAwake() && !bodyA.isStatic();\n const activeB = bodyB.isAwake() && !bodyB.isStatic();\n\n // At least one body must be awake and it must be dynamic or kinematic.\n if (activeA == false && activeB == false) {\n continue;\n }\n\n const proxyIdA = fixtureA.m_proxies[indexA].proxyId;\n const proxyIdB = fixtureB.m_proxies[indexB].proxyId;\n const overlap = this.m_broadPhase.testOverlap(proxyIdA, proxyIdB);\n\n // Here we destroy contacts that cease to overlap in the broad-phase.\n if (overlap == false) {\n this.destroyContact(c);\n continue;\n }\n\n // The contact persists.\n c.update(this);\n }\n }\n\n /**\n * @internal\n */\n destroyContact(contact: Contact): void {\n Contact.destroy(contact, this);\n\n // Remove from the world.\n if (contact.m_prev) {\n contact.m_prev.m_next = contact.m_next;\n }\n if (contact.m_next) {\n contact.m_next.m_prev = contact.m_prev;\n }\n if (contact == this.m_contactList) {\n this.m_contactList = contact.m_next;\n }\n\n --this.m_contactCount;\n }\n\n\n /**\n * Called when two fixtures begin to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'begin-contact', listener: (contact: Contact) => void): World;\n /**\n * Called when two fixtures cease to touch.\n *\n * Implement contact callbacks to get contact information. You can use these\n * results for things like sounds and game logic. You can also get contact\n * results by traversing the contact lists after the time step. However, you\n * might miss some contacts because continuous physics leads to sub-stepping.\n * Additionally you may receive multiple callbacks for the same contact in a\n * single time step. You should strive to make your callbacks efficient because\n * there may be many callbacks per time step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'end-contact', listener: (contact: Contact) => void): World;\n /**\n * This is called after a contact is updated. This allows you to inspect a\n * contact before it goes to the solver. If you are careful, you can modify the\n * contact manifold (e.g. disable contact). A copy of the old manifold is\n * provided so that you can detect changes. Note: this is called only for awake\n * bodies. Note: this is called even when the number of contact points is zero.\n * Note: this is not called for sensors. Note: if you set the number of contact\n * points to zero, you will not get an endContact callback. However, you may get\n * a beginContact callback the next step.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n /**\n * This lets you inspect a contact after the solver is finished. This is useful\n * for inspecting impulses. Note: the contact manifold does not include time of\n * impact impulses, which can be arbitrarily large if the sub-step is small.\n * Hence the impulse is provided explicitly in a separate data structure. Note:\n * this is only called for contacts that are touching, solid, and awake.\n *\n * Warning: You cannot create/destroy world entities inside these callbacks.\n */\n on(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n /** Listener is called whenever a body is removed. */\n on(name: 'remove-body', listener: (body: Body) => void): World;\n /** Listener is called whenever a joint is removed implicitly or explicitly. */\n on(name: 'remove-joint', listener: (joint: Joint) => void): World;\n /** Listener is called whenever a fixture is removed implicitly or explicitly. */\n on(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Register an event listener.\n */\n // tslint:disable-next-line:typedef\n on(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n if (!this._listeners) {\n this._listeners = {};\n }\n if (!this._listeners[name]) {\n this._listeners[name] = [];\n }\n this._listeners[name].push(listener);\n return this;\n }\n\n off(name: 'begin-contact', listener: (contact: Contact) => void): World;\n off(name: 'end-contact', listener: (contact: Contact) => void): World;\n off(name: 'pre-solve', listener: (contact: Contact, oldManifold: Manifold) => void): World;\n off(name: 'post-solve', listener: (contact: Contact, impulse: ContactImpulse) => void): World;\n off(name: 'remove-body', listener: (body: Body) => void): World;\n off(name: 'remove-joint', listener: (joint: Joint) => void): World;\n off(name: 'remove-fixture', listener: (fixture: Fixture) => void): World;\n /**\n * Remove an event listener.\n */\n // tslint:disable-next-line:typedef\n off(name, listener) {\n if (typeof name !== 'string' || typeof listener !== 'function') {\n return this;\n }\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return this;\n }\n const index = listeners.indexOf(listener);\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n publish(name: string, arg1?: any, arg2?: any, arg3?: any): number {\n const listeners = this._listeners && this._listeners[name];\n if (!listeners || !listeners.length) {\n return 0;\n }\n for (let l = 0; l < listeners.length; l++) {\n listeners[l].call(this, arg1, arg2, arg3);\n }\n return listeners.length;\n }\n\n /**\n * @internal\n */\n beginContact(contact: Contact): void {\n this.publish('begin-contact', contact);\n }\n\n /**\n * @internal\n */\n endContact(contact: Contact): void {\n this.publish('end-contact', contact);\n }\n\n /**\n * @internal\n */\n preSolve(contact: Contact, oldManifold: Manifold): void {\n this.publish('pre-solve', contact, oldManifold);\n }\n\n /**\n * @internal\n */\n postSolve(contact: Contact, impulse: ContactImpulse): void {\n this.publish('post-solve', contact, impulse);\n }\n\n /**\n * Joints and fixtures are destroyed when their associated body is destroyed.\n * Register a destruction listener so that you may nullify references to these\n * joints and shapes.\n *\n * `function(object)` is called when any joint or fixture is about to\n * be destroyed due to the destruction of one of its attached or parent bodies.\n */\n\n /**\n * Register a contact filter to provide specific control over collision.\n * Otherwise the default filter is used (defaultFilter). The listener is owned\n * by you and must remain in scope.\n *\n * Moved to Fixture.\n */\n}","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from './Math';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class Vec3 {\n x: number;\n y: number;\n z: number;\n\n constructor(x: number, y: number, z: number);\n constructor(obj: { x: number, y: number, z: number });\n constructor();\n // tslint:disable-next-line:typedef\n constructor(x?, y?, z?) {\n if (_CONSTRUCTOR_FACTORY && !(this instanceof Vec3)) {\n return new Vec3(x, y, z);\n }\n if (typeof x === 'undefined') {\n this.x = 0;\n this.y = 0;\n this.z = 0;\n } else if (typeof x === 'object') {\n this.x = x.x;\n this.y = x.y;\n this.z = x.z;\n } else {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n _ASSERT && Vec3.assert(this);\n }\n\n /** @internal */\n _serialize(): object {\n return {\n x: this.x,\n y: this.y,\n z: this.z\n };\n }\n\n /** @internal */\n static _deserialize(data: any): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = data.x;\n obj.y = data.y;\n obj.z = data.z;\n return obj;\n }\n\n /** @internal */\n static neo(x: number, y: number, z: number): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = x;\n obj.y = y;\n obj.z = z;\n return obj;\n }\n\n static zero(): Vec3 {\n const obj = Object.create(Vec3.prototype);\n obj.x = 0;\n obj.y = 0;\n obj.z = 0;\n return obj;\n }\n\n static clone(v: Vec3): Vec3 {\n _ASSERT && Vec3.assert(v);\n return Vec3.neo(v.x, v.y, v.z);\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n /**\n * Does this vector contain finite coordinates?\n */\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Math.isFinite(obj.x) && Math.isFinite(obj.y) && Math.isFinite(obj.z);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Vec3.isValid(o), 'Invalid Vec3!', o);\n }\n\n setZero(): Vec3 {\n this.x = 0.0;\n this.y = 0.0;\n this.z = 0.0;\n return this;\n }\n\n set(x: number, y: number, z: number): Vec3 {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n\n add(w: Vec3): Vec3 {\n this.x += w.x;\n this.y += w.y;\n this.z += w.z;\n return this;\n }\n\n sub(w: Vec3): Vec3 {\n this.x -= w.x;\n this.y -= w.y;\n this.z -= w.z;\n return this;\n }\n\n mul(m: number): Vec3 {\n this.x *= m;\n this.y *= m;\n this.z *= m;\n return this;\n }\n\n static areEqual(v: Vec3, w: Vec3): boolean {\n _ASSERT && Vec3.assert(v);\n _ASSERT && Vec3.assert(w);\n return v === w ||\n typeof v === 'object' && v !== null &&\n typeof w === 'object' && w !== null &&\n v.x === w.x && v.y === w.y && v.z === w.z;\n }\n\n /**\n * Perform the dot product on two vectors.\n */\n static dot(v: Vec3, w: Vec3): number {\n return v.x * w.x + v.y * w.y + v.z * w.z;\n }\n\n /**\n * Perform the cross product on two vectors. In 2D this produces a scalar.\n */\n static cross(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(\n v.y * w.z - v.z * w.y,\n v.z * w.x - v.x * w.z,\n v.x * w.y - v.y * w.x\n );\n }\n\n static add(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x + w.x, v.y + w.y, v.z + w.z);\n }\n\n static sub(v: Vec3, w: Vec3): Vec3 {\n return new Vec3(v.x - w.x, v.y - w.y, v.z - w.z);\n }\n\n static mul(v: Vec3, m: number): Vec3 {\n return new Vec3(m * v.x, m * v.y, m * v.z);\n }\n\n neg(): Vec3 {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n }\n\n static neg(v: Vec3): Vec3 {\n return new Vec3(-v.x, -v.y, -v.z);\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { AABB, RayCastInput, RayCastOutput } from '../AABB';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A line segment (edge) shape. These can be connected in chains or loops to\n * other edge shapes. The connectivity information is used to ensure correct\n * contact normals.\n */\nexport class EdgeShape extends Shape {\n static TYPE = 'edge' as const;\n m_type: 'edge';\n\n m_radius: number;\n\n // These are the edge vertices\n m_vertex1: Vec2;\n m_vertex2: Vec2;\n\n // Optional adjacent vertices. These are used for smooth collision.\n // Used by chain shape.\n m_vertex0: Vec2;\n m_vertex3: Vec2;\n m_hasVertex0: boolean;\n m_hasVertex3: boolean;\n\n constructor(v1?: Vec2Value, v2?: Vec2Value) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof EdgeShape)) {\n return new EdgeShape(v1, v2);\n }\n\n super();\n\n this.m_type = EdgeShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n\n this.m_vertex1 = v1 ? Vec2.clone(v1) : Vec2.zero();\n this.m_vertex2 = v2 ? Vec2.clone(v2) : Vec2.zero();\n\n this.m_vertex0 = Vec2.zero();\n this.m_vertex3 = Vec2.zero();\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertex1: this.m_vertex1,\n vertex2: this.m_vertex2,\n\n vertex0: this.m_vertex0,\n vertex3: this.m_vertex3,\n hasVertex0: this.m_hasVertex0,\n hasVertex3: this.m_hasVertex3,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): EdgeShape {\n const shape = new EdgeShape(data.vertex1, data.vertex2);\n if (shape.m_hasVertex0) {\n shape.setPrevVertex(data.vertex0);\n }\n if (shape.m_hasVertex3) {\n shape.setNextVertex(data.vertex3);\n }\n return shape;\n }\n\n /** @internal */\n _reset(): void {\n // noop\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getType(): 'edge' {\n return this.m_type;\n }\n\n /** @internal @deprecated */\n setNext(v?: Vec2): EdgeShape {\n return this.setNextVertex(v);\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n setNextVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex3.setVec2(v);\n this.m_hasVertex3 = true;\n } else {\n this.m_vertex3.setZero();\n this.m_hasVertex3 = false;\n }\n return this;\n }\n\n /**\n * Optional next vertex, used for smooth collision.\n */\n getNextVertex(): Vec2 {\n return this.m_vertex3;\n }\n\n /** @internal @deprecated */\n setPrev(v?: Vec2): EdgeShape {\n return this.setPrevVertex(v);\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n setPrevVertex(v?: Vec2): EdgeShape {\n if (v) {\n this.m_vertex0.setVec2(v);\n this.m_hasVertex0 = true;\n } else {\n this.m_vertex0.setZero();\n this.m_hasVertex0 = false;\n }\n return this;\n }\n\n /**\n * Optional prev vertex, used for smooth collision.\n */\n getPrevVertex(): Vec2 {\n return this.m_vertex0;\n }\n\n /**\n * Set this as an isolated edge.\n */\n _set(v1: Vec2, v2: Vec2): EdgeShape {\n this.m_vertex1.setVec2(v1);\n this.m_vertex2.setVec2(v2);\n this.m_hasVertex0 = false;\n this.m_hasVertex3 = false;\n return this;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): EdgeShape {\n const clone = new EdgeShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_vertex1.setVec2(this.m_vertex1);\n clone.m_vertex2.setVec2(this.m_vertex2);\n clone.m_vertex0.setVec2(this.m_vertex0);\n clone.m_vertex3.setVec2(this.m_vertex3);\n clone.m_hasVertex0 = this.m_hasVertex0;\n clone.m_hasVertex3 = this.m_hasVertex3;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // p = p1 + t * d\n // v = v1 + s * e\n // p1 + t * d = v1 + s * e\n // s * e - t * d = p1 - v1\n\n // NOT_USED(childIndex);\n\n // Put the ray into the edge's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n const v1 = this.m_vertex1;\n const v2 = this.m_vertex2;\n const e = Vec2.sub(v2, v1);\n const normal = Vec2.neo(e.y, -e.x);\n normal.normalize();\n\n // q = p1 + t * d\n // dot(normal, q - v1) = 0\n // dot(normal, p1 - v1) + t * dot(normal, d) = 0\n const numerator = Vec2.dot(normal, Vec2.sub(v1, p1));\n const denominator = Vec2.dot(normal, d);\n\n if (denominator == 0.0) {\n return false;\n }\n\n const t = numerator / denominator;\n if (t < 0.0 || input.maxFraction < t) {\n return false;\n }\n\n const q = Vec2.add(p1, Vec2.mulNumVec2(t, d));\n\n // q = v1 + s * r\n // s = dot(q - v1, r) / dot(r, r)\n const r = Vec2.sub(v2, v1);\n const rr = Vec2.dot(r, r);\n if (rr == 0.0) {\n return false;\n }\n\n const s = Vec2.dot(Vec2.sub(q, v1), r) / rr;\n if (s < 0.0 || 1.0 < s) {\n return false;\n }\n\n output.fraction = t;\n if (numerator > 0.0) {\n output.normal = Rot.mulVec2(xf.q, normal).neg();\n } else {\n output.normal = Rot.mulVec2(xf.q, normal);\n }\n return true;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const v1 = Transform.mulVec2(xf, this.m_vertex1);\n const v2 = Transform.mulVec2(xf, this.m_vertex2);\n\n aabb.combinePoints(v1, v2);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center.setCombine(0.5, this.m_vertex1, 0.5, this.m_vertex2);\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_vertex1);\n proxy.m_vertices.push(this.m_vertex2);\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n}\n\nexport const Edge = EdgeShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport { Transform } from '../../common/Transform';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\nimport { EdgeShape } from './EdgeShape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A chain shape is a free form sequence of line segments. The chain has\n * two-sided collision, so you can use inside and outside collision. Therefore,\n * you may use any winding order. Connectivity information is used to create\n * smooth collisions.\n *\n * WARNING: The chain will not collide properly if there are self-intersections.\n */\nexport class ChainShape extends Shape {\n static TYPE = 'chain' as const;\n m_type: 'chain';\n\n m_radius: number;\n\n m_vertices: Vec2[];\n m_count: number;\n m_prevVertex: Vec2 | null;\n m_nextVertex: Vec2 | null;\n m_hasPrevVertex: boolean;\n m_hasNextVertex: boolean;\n\n m_isLoop: boolean;\n\n constructor(vertices?: Vec2Value[], loop?: boolean) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof ChainShape)) {\n return new ChainShape(vertices, loop);\n }\n\n super();\n\n this.m_type = ChainShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_vertices = [];\n this.m_count = 0;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n\n this.m_isLoop = !!loop;\n\n if (vertices && vertices.length) {\n if (loop) {\n this._createLoop(vertices);\n } else {\n this._createChain(vertices);\n }\n }\n }\n\n /** @internal */\n _serialize(): object {\n const data = {\n type: this.m_type,\n vertices: this.m_vertices,\n isLoop: this.m_isLoop,\n hasPrevVertex: this.m_hasPrevVertex,\n hasNextVertex: this.m_hasNextVertex,\n prevVertex: null as Vec2 | null,\n nextVertex: null as Vec2 | null,\n };\n if (this.m_prevVertex) {\n data.prevVertex = this.m_prevVertex;\n }\n if (this.m_nextVertex) {\n data.nextVertex = this.m_nextVertex;\n }\n return data;\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): ChainShape {\n const vertices: Vec2[] = [];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n const shape = new ChainShape(vertices, data.isLoop);\n if (data.prevVertex) {\n shape.setPrevVertex(data.prevVertex);\n }\n if (data.nextVertex) {\n shape.setNextVertex(data.nextVertex);\n }\n return shape;\n }\n\n // clear() {\n // this.m_vertices.length = 0;\n // this.m_count = 0;\n // }\n\n getType(): 'chain' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n /**\n * @internal\n * Create a loop. This automatically adjusts connectivity.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createLoop(vertices: Vec2Value[]): ChainShape {\n _ASSERT && console.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && console.assert(vertices.length >= 3);\n for (let i = 1; i < vertices.length; ++i) {\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n // If the code crashes here, it means your vertices are too close together.\n _ASSERT && console.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_vertices = [];\n this.m_count = vertices.length + 1;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n this.m_vertices[vertices.length] = Vec2.clone(vertices[0]);\n\n this.m_prevVertex = this.m_vertices[this.m_count - 2];\n this.m_nextVertex = this.m_vertices[1];\n this.m_hasPrevVertex = true;\n this.m_hasNextVertex = true;\n return this;\n }\n\n /**\n * @internal\n * Create a chain with isolated end vertices.\n *\n * @param vertices an array of vertices, these are copied\n * @param count the vertex count\n */\n _createChain(vertices: Vec2Value[]): ChainShape {\n _ASSERT && console.assert(this.m_vertices.length == 0 && this.m_count == 0);\n _ASSERT && console.assert(vertices.length >= 2);\n for (let i = 1; i < vertices.length; ++i) {\n // If the code crashes here, it means your vertices are too close together.\n const v1 = vertices[i - 1];\n const v2 = vertices[i];\n _ASSERT && console.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared);\n }\n\n this.m_count = vertices.length;\n for (let i = 0; i < vertices.length; ++i) {\n this.m_vertices[i] = Vec2.clone(vertices[i]);\n }\n\n this.m_hasPrevVertex = false;\n this.m_hasNextVertex = false;\n this.m_prevVertex = null;\n this.m_nextVertex = null;\n return this;\n }\n\n /** @internal */\n _reset(): void {\n if (this.m_isLoop) {\n this._createLoop(this.m_vertices);\n } else {\n this._createChain(this.m_vertices);\n }\n }\n\n /**\n * Establish connectivity to a vertex that precedes the first vertex. Don't call\n * this for loops.\n */\n setPrevVertex(prevVertex: Vec2): void {\n this.m_prevVertex = prevVertex;\n this.m_hasPrevVertex = true;\n }\n\n getPrevVertex(): Vec2 {\n return this.m_prevVertex;\n }\n\n /**\n * Establish connectivity to a vertex that follows the last vertex. Don't call\n * this for loops.\n */\n setNextVertex(nextVertex: Vec2): void {\n this.m_nextVertex = nextVertex;\n this.m_hasNextVertex = true;\n }\n\n getNextVertex(): Vec2 {\n return this.m_nextVertex;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): ChainShape {\n const clone = new ChainShape();\n clone._createChain(this.m_vertices);\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_prevVertex = this.m_prevVertex;\n clone.m_nextVertex = this.m_nextVertex;\n clone.m_hasPrevVertex = this.m_hasPrevVertex;\n clone.m_hasNextVertex = this.m_hasNextVertex;\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): number {\n // edge count = vertex count - 1\n return this.m_count - 1;\n }\n\n // Get a child edge.\n getChildEdge(edge: EdgeShape, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count - 1);\n edge.m_type = EdgeShape.TYPE;\n edge.m_radius = this.m_radius;\n\n edge.m_vertex1 = this.m_vertices[childIndex];\n edge.m_vertex2 = this.m_vertices[childIndex + 1];\n\n if (childIndex > 0) {\n edge.m_vertex0 = this.m_vertices[childIndex - 1];\n edge.m_hasVertex0 = true;\n } else {\n edge.m_vertex0 = this.m_prevVertex;\n edge.m_hasVertex0 = this.m_hasPrevVertex;\n }\n\n if (childIndex < this.m_count - 2) {\n edge.m_vertex3 = this.m_vertices[childIndex + 2];\n edge.m_hasVertex3 = true;\n } else {\n edge.m_vertex3 = this.m_nextVertex;\n edge.m_hasVertex3 = this.m_hasNextVertex;\n }\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index <= this.m_count);\n if (index < this.m_count) {\n return this.m_vertices[index];\n } else {\n return this.m_vertices[0];\n }\n }\n\n isLoop(): boolean {\n return this.m_isLoop;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * This always return false.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): false {\n return false;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n\n const edgeShape = new EdgeShape(this.getVertex(childIndex), this.getVertex(childIndex + 1));\n return edgeShape.rayCast(output, input, xf, 0);\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n\n const v1 = Transform.mulVec2(xf, this.getVertex(childIndex));\n const v2 = Transform.mulVec2(xf, this.getVertex(childIndex + 1));\n\n aabb.combinePoints(v1, v2);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * Chains have zero mass.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density?: number): void {\n massData.mass = 0.0;\n massData.center = Vec2.zero();\n massData.I = 0.0;\n }\n\n computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void {\n _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count);\n proxy.m_buffer[0] = this.getVertex(childIndex);\n proxy.m_buffer[1] = this.getVertex(childIndex + 1);\n proxy.m_vertices = proxy.m_buffer;\n proxy.m_count = 2;\n proxy.m_radius = this.m_radius;\n }\n}\n\nexport const Chain = ChainShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { MassData } from '../../dynamics/Body';\nimport { AABB, RayCastOutput, RayCastInput } from '../AABB';\nimport { DistanceProxy } from '../Distance';\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Shape } from '../Shape';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A convex polygon. It is assumed that the interior of the polygon is to the\n * left of each edge. Polygons have a maximum number of vertices equal to\n * Settings.maxPolygonVertices. In most cases you should not need many vertices\n * for a convex polygon. extends Shape\n */\nexport class PolygonShape extends Shape {\n static TYPE = 'polygon' as const;\n m_type: 'polygon';\n\n m_centroid: Vec2;\n m_vertices: Vec2[]; // [Settings.maxPolygonVertices]\n m_normals: Vec2[]; // [Settings.maxPolygonVertices]\n m_count: number;\n m_radius: number;\n\n // @ts-ignore\n constructor(vertices?: Vec2Value[]) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PolygonShape)) {\n return new PolygonShape(vertices);\n }\n\n super();\n\n this.m_type = PolygonShape.TYPE;\n this.m_radius = Settings.polygonRadius;\n this.m_centroid = Vec2.zero();\n this.m_vertices = [];\n this.m_normals = [];\n this.m_count = 0;\n\n if (vertices && vertices.length) {\n this._set(vertices);\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n vertices: this.m_vertices,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, fixture: any, restore: any): PolygonShape {\n const vertices: Vec2[] = [];\n if (data.vertices) {\n for (let i = 0; i < data.vertices.length; i++) {\n vertices.push(restore(Vec2, data.vertices[i]));\n }\n }\n\n const shape = new PolygonShape(vertices);\n return shape;\n }\n\n getType(): 'polygon' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getVertex(index: number): Vec2 {\n _ASSERT && console.assert(0 <= index && index < this.m_count);\n return this.m_vertices[index];\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): PolygonShape {\n const clone = new PolygonShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_count = this.m_count;\n clone.m_centroid.setVec2(this.m_centroid);\n for (let i = 0; i < this.m_count; i++) {\n clone.m_vertices.push(this.m_vertices[i].clone());\n }\n for (let i = 0; i < this.m_normals.length; i++) {\n clone.m_normals.push(this.m_normals[i].clone());\n }\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /** @internal */\n _reset(): void {\n this._set(this.m_vertices);\n }\n\n /**\n * @internal\n *\n * Create a convex hull from the given array of local points. The count must be\n * in the range [3, Settings.maxPolygonVertices].\n *\n * Warning: the points may be re-ordered, even if they form a convex polygon\n * Warning: collinear points are handled but not removed. Collinear points may\n * lead to poor stacking behavior.\n */\n _set(vertices: Vec2Value[]): void {\n _ASSERT && console.assert(3 <= vertices.length && vertices.length <= Settings.maxPolygonVertices);\n if (vertices.length < 3) {\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n let n = Math.min(vertices.length, Settings.maxPolygonVertices);\n\n // Perform welding and copy vertices into local buffer.\n const ps: Vec2[] = []; // [Settings.maxPolygonVertices];\n for (let i = 0; i < n; ++i) {\n const v = vertices[i];\n\n let unique = true;\n for (let j = 0; j < ps.length; ++j) {\n if (Vec2.distanceSquared(v, ps[j]) < 0.25 * Settings.linearSlopSquared) {\n unique = false;\n break;\n }\n }\n\n if (unique) {\n ps.push(Vec2.clone(v));\n }\n }\n\n n = ps.length;\n if (n < 3) {\n // Polygon is degenerate.\n _ASSERT && console.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n // Create the convex hull using the Gift wrapping algorithm\n // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm\n\n // Find the right most point on the hull (in case of multiple points bottom most is used)\n let i0 = 0;\n let x0 = ps[0].x;\n for (let i = 1; i < n; ++i) {\n const x = ps[i].x;\n if (x > x0 || (x === x0 && ps[i].y < ps[i0].y)) {\n i0 = i;\n x0 = x;\n }\n }\n\n const hull = [] as number[]; // [Settings.maxPolygonVertices];\n let m = 0;\n let ih = i0;\n\n while (true) {\n hull[m] = ih;\n\n let ie = 0;\n for (let j = 1; j < n; ++j) {\n if (ie === ih) {\n ie = j;\n continue;\n }\n\n const r = Vec2.sub(ps[ie], ps[hull[m]]);\n const v = Vec2.sub(ps[j], ps[hull[m]]);\n const c = Vec2.crossVec2Vec2(r, v);\n // c < 0 means counter-clockwise wrapping, c > 0 means clockwise wrapping\n if (c < 0.0) {\n ie = j;\n }\n\n // Collinearity check\n if (c === 0.0 && v.lengthSquared() > r.lengthSquared()) {\n ie = j;\n }\n }\n\n ++m;\n ih = ie;\n\n if (ie === i0) {\n break;\n }\n }\n\n if (m < 3) {\n // Polygon is degenerate.\n _ASSERT && console.assert(false);\n this._setAsBox(1.0, 1.0);\n return;\n }\n\n this.m_count = m;\n\n // Copy vertices.\n this.m_vertices = [];\n for (let i = 0; i < m; ++i) {\n this.m_vertices[i] = ps[hull[i]];\n }\n\n // Compute normals. Ensure the edges have non-zero length.\n for (let i = 0; i < m; ++i) {\n const i1 = i;\n const i2 = i + 1 < m ? i + 1 : 0;\n const edge = Vec2.sub(this.m_vertices[i2], this.m_vertices[i1]);\n _ASSERT && console.assert(edge.lengthSquared() > Math.EPSILON * Math.EPSILON);\n this.m_normals[i] = Vec2.crossVec2Num(edge, 1.0);\n this.m_normals[i].normalize();\n }\n\n // Compute the polygon centroid.\n this.m_centroid = ComputeCentroid(this.m_vertices, m);\n }\n\n /** @internal */\n _setAsBox(hx: number, hy: number, center?: Vec2Value, angle?: number): void {\n // start with right-bottom, counter-clockwise, as in Gift wrapping algorithm in PolygonShape._set()\n this.m_vertices[0] = Vec2.neo(hx, -hy);\n this.m_vertices[1] = Vec2.neo(hx, hy);\n this.m_vertices[2] = Vec2.neo(-hx, hy);\n this.m_vertices[3] = Vec2.neo(-hx, -hy);\n\n this.m_normals[0] = Vec2.neo(1.0, 0.0);\n this.m_normals[1] = Vec2.neo(0.0, 1.0);\n this.m_normals[2] = Vec2.neo(-1.0, 0.0);\n this.m_normals[3] = Vec2.neo(0.0, -1.0);\n\n this.m_count = 4;\n\n if (Vec2.isValid(center)) {\n angle = angle || 0;\n\n this.m_centroid.setVec2(center);\n\n const xf = Transform.identity();\n xf.p.setVec2(center);\n xf.q.setAngle(angle);\n\n // Transform vertices and normals.\n for (let i = 0; i < this.m_count; ++i) {\n this.m_vertices[i] = Transform.mulVec2(xf, this.m_vertices[i]);\n this.m_normals[i] = Rot.mulVec2(xf.q, this.m_normals[i]);\n }\n }\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2): boolean {\n const pLocal = Rot.mulTVec2(xf.q, Vec2.sub(p, xf.p));\n\n for (let i = 0; i < this.m_count; ++i) {\n const dot = Vec2.dot(this.m_normals[i], Vec2.sub(pLocal, this.m_vertices[i]));\n if (dot > 0.0) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n\n // Put the ray into the polygon's frame of reference.\n const p1 = Rot.mulTVec2(xf.q, Vec2.sub(input.p1, xf.p));\n const p2 = Rot.mulTVec2(xf.q, Vec2.sub(input.p2, xf.p));\n const d = Vec2.sub(p2, p1);\n\n let lower = 0.0;\n let upper = input.maxFraction;\n\n let index = -1;\n\n for (let i = 0; i < this.m_count; ++i) {\n // p = p1 + a * d\n // dot(normal, p - v) = 0\n // dot(normal, p1 - v) + a * dot(normal, d) = 0\n const numerator = Vec2.dot(this.m_normals[i], Vec2.sub(this.m_vertices[i], p1));\n const denominator = Vec2.dot(this.m_normals[i], d);\n\n if (denominator == 0.0) {\n if (numerator < 0.0) {\n return false;\n }\n } else {\n // Note: we want this predicate without division:\n // lower < numerator / denominator, where denominator < 0\n // Since denominator < 0, we have to flip the inequality:\n // lower < numerator / denominator <==> denominator * lower > numerator.\n if (denominator < 0.0 && numerator < lower * denominator) {\n // Increase lower.\n // The segment enters this half-space.\n lower = numerator / denominator;\n index = i;\n } else if (denominator > 0.0 && numerator < upper * denominator) {\n // Decrease upper.\n // The segment exits this half-space.\n upper = numerator / denominator;\n }\n }\n\n // The use of epsilon here causes the assert on lower to trip\n // in some cases. Apparently the use of epsilon was to make edge\n // shapes work, but now those are handled separately.\n // if (upper < lower - Math.EPSILON)\n if (upper < lower) {\n return false;\n }\n }\n\n _ASSERT && console.assert(0.0 <= lower && lower <= input.maxFraction);\n\n if (index >= 0) {\n output.fraction = lower;\n output.normal = Rot.mulVec2(xf.q, this.m_normals[index]);\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < this.m_count; ++i) {\n const v = Transform.mulVec2(xf, this.m_vertices[i]);\n minX = Math.min(minX, v.x);\n maxX = Math.max(maxX, v.x);\n minY = Math.min(minY, v.y);\n maxY = Math.max(maxY, v.y);\n }\n\n aabb.lowerBound.setNum(minX, minY);\n aabb.upperBound.setNum(maxX, maxY);\n aabb.extend(this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n // Polygon mass, centroid, and inertia.\n // Let rho be the polygon density in mass per unit area.\n // Then:\n // mass = rho * int(dA)\n // centroid.x = (1/mass) * rho * int(x * dA)\n // centroid.y = (1/mass) * rho * int(y * dA)\n // I = rho * int((x*x + y*y) * dA)\n //\n // We can compute these integrals by summing all the integrals\n // for each triangle of the polygon. To evaluate the integral\n // for a single triangle, we make a change of variables to\n // the (u,v) coordinates of the triangle:\n // x = x0 + e1x * u + e2x * v\n // y = y0 + e1y * u + e2y * v\n // where 0 <= u && 0 <= v && u + v <= 1.\n //\n // We integrate u from [0,1-v] and then v from [0,1].\n // We also need to use the Jacobian of the transformation:\n // D = cross(e1, e2)\n //\n // Simplification: triangle centroid = (1/3) * (p1 + p2 + p3)\n //\n // The rest of the derivation is handled by computer algebra.\n\n _ASSERT && console.assert(this.m_count >= 3);\n\n const center = Vec2.zero();\n let area = 0.0;\n let I = 0.0;\n\n // s is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const s = Vec2.zero();\n\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < this.m_count; ++i) {\n s.add(this.m_vertices[i]);\n }\n s.mul(1.0 / this.m_count);\n\n const k_inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < this.m_count; ++i) {\n // Triangle vertices.\n const e1 = Vec2.sub(this.m_vertices[i], s);\n const e2 = i + 1 < this.m_count ? Vec2.sub(this.m_vertices[i + 1], s) : Vec2 .sub(this.m_vertices[0], s);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n center.addCombine(triangleArea * k_inv3, e1, triangleArea * k_inv3, e2);\n\n const ex1 = e1.x;\n const ey1 = e1.y;\n const ex2 = e2.x;\n const ey2 = e2.y;\n\n const intx2 = ex1 * ex1 + ex2 * ex1 + ex2 * ex2;\n const inty2 = ey1 * ey1 + ey2 * ey1 + ey2 * ey2;\n\n I += (0.25 * k_inv3 * D) * (intx2 + inty2);\n }\n\n // Total mass\n massData.mass = density * area;\n\n // Center of mass\n _ASSERT && console.assert(area > Math.EPSILON);\n center.mul(1.0 / area);\n massData.center.setCombine(1, center, 1, s);\n\n // Inertia tensor relative to the local origin (point s).\n massData.I = density * I;\n\n // Shift to center of mass then to original body origin.\n massData.I += massData.mass * (Vec2.dot(massData.center, massData.center) - Vec2.dot(center, center));\n }\n\n /**\n * Validate convexity. This is a very time consuming operation.\n * @returns true if valid\n */\n validate(): boolean {\n for (let i = 0; i < this.m_count; ++i) {\n const i1 = i;\n const i2 = i < this.m_count - 1 ? i1 + 1 : 0;\n const p = this.m_vertices[i1];\n const e = Vec2.sub(this.m_vertices[i2], p);\n\n for (let j = 0; j < this.m_count; ++j) {\n if (j == i1 || j == i2) {\n continue;\n }\n\n const v = Vec2.sub(this.m_vertices[j], p);\n const c = Vec2.crossVec2Vec2(e, v);\n if (c < 0.0) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices = this.m_vertices;\n proxy.m_count = this.m_count;\n proxy.m_radius = this.m_radius;\n }\n}\n\nfunction ComputeCentroid(vs: Vec2[], count: number): Vec2 {\n _ASSERT && console.assert(count >= 3);\n\n const c = Vec2.zero();\n let area = 0.0;\n\n // pRef is the reference point for forming triangles.\n // It's location doesn't change the result (except for rounding error).\n const pRef = Vec2.zero();\n if (false) {\n // This code would put the reference point inside the polygon.\n for (let i = 0; i < count; ++i) {\n pRef.add(vs[i]);\n }\n pRef.mul(1.0 / count);\n }\n\n const inv3 = 1.0 / 3.0;\n\n for (let i = 0; i < count; ++i) {\n // Triangle vertices.\n const p1 = pRef;\n const p2 = vs[i];\n const p3 = i + 1 < count ? vs[i + 1] : vs[0];\n\n const e1 = Vec2.sub(p2, p1);\n const e2 = Vec2.sub(p3, p1);\n\n const D = Vec2.crossVec2Vec2(e1, e2);\n\n const triangleArea = 0.5 * D;\n area += triangleArea;\n\n // Area weighted centroid\n c.addMul(triangleArea * inv3, p1);\n c.addMul(triangleArea * inv3, p2);\n c.addMul(triangleArea * inv3, p3);\n }\n\n // Centroid\n _ASSERT && console.assert(area > Math.EPSILON);\n c.mul(1.0 / area);\n return c;\n}\n\nexport const Polygon = PolygonShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport type { Vec2Value } from '../../common/Vec2';\nimport { PolygonShape } from './PolygonShape';\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * A rectangle polygon which extend PolygonShape.\n */\nexport class BoxShape extends PolygonShape {\n static TYPE = 'polygon' as const;\n\n constructor(hx: number, hy: number, center?: Vec2Value, angle?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof BoxShape)) {\n return new BoxShape(hx, hy, center, angle);\n }\n\n super();\n\n this._setAsBox(hx, hy, center, angle);\n }\n}\n\nexport const Box = BoxShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Rot } from '../../common/Rot';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Shape } from '../Shape';\nimport { AABB, RayCastInput, RayCastOutput } from '../AABB';\nimport { Transform } from '../../common/Transform';\nimport { MassData } from '../../dynamics/Body';\nimport { DistanceProxy } from '../Distance';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nexport class CircleShape extends Shape {\n static TYPE = 'circle' as const;\n m_type: 'circle';\n\n m_p: Vec2;\n m_radius: number;\n\n constructor(position: Vec2Value, radius?: number);\n constructor(radius?: number);\n // tslint:disable-next-line:typedef\n constructor(a, b?) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof CircleShape)) {\n return new CircleShape(a, b);\n }\n\n super();\n\n this.m_type = CircleShape.TYPE;\n this.m_p = Vec2.zero();\n this.m_radius = 1;\n\n if (typeof a === 'object' && Vec2.isValid(a)) {\n this.m_p.setVec2(a);\n\n if (typeof b === 'number') {\n this.m_radius = b;\n }\n\n } else if (typeof a === 'number') {\n this.m_radius = a;\n }\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n\n p: this.m_p,\n radius: this.m_radius,\n };\n }\n\n /** @internal */\n static _deserialize(data: any): CircleShape {\n return new CircleShape(data.p, data.radius);\n }\n\n /** @internal */\n _reset(): void {\n // noop\n }\n\n getType(): 'circle' {\n return this.m_type;\n }\n\n getRadius(): number {\n return this.m_radius;\n }\n\n getCenter(): Vec2 {\n return this.m_p;\n }\n\n getVertex(index: 0): Vec2 {\n _ASSERT && console.assert(index == 0);\n return this.m_p;\n }\n\n /**\n * @internal\n * @deprecated Shapes should be treated as immutable.\n *\n * clone the concrete shape.\n */\n _clone(): CircleShape {\n const clone = new CircleShape();\n clone.m_type = this.m_type;\n clone.m_radius = this.m_radius;\n clone.m_p = this.m_p.clone();\n return clone;\n }\n\n /**\n * Get the number of child primitives.\n */\n getChildCount(): 1 {\n return 1;\n }\n\n /**\n * Test a point for containment in this shape. This only works for convex\n * shapes.\n *\n * @param xf The shape world transform.\n * @param p A point in world coordinates.\n */\n testPoint(xf: Transform, p: Vec2Value): boolean {\n const center = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const d = Vec2.sub(p, center);\n return Vec2.dot(d, d) <= this.m_radius * this.m_radius;\n }\n\n /**\n * Cast a ray against a child shape.\n *\n * @param output The ray-cast results.\n * @param input The ray-cast input parameters.\n * @param xf The transform to be applied to the shape.\n * @param childIndex The child shape index\n */\n rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean {\n // Collision Detection in Interactive 3D Environments by Gino van den Bergen\n // From Section 3.1.2\n // x = s + a * r\n // norm(x) = radius\n\n const position = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n const s = Vec2.sub(input.p1, position);\n const b = Vec2.dot(s, s) - this.m_radius * this.m_radius;\n\n // Solve quadratic equation.\n const r = Vec2.sub(input.p2, input.p1);\n const c = Vec2.dot(s, r);\n const rr = Vec2.dot(r, r);\n const sigma = c * c - rr * b;\n\n // Check for negative discriminant and short segment.\n if (sigma < 0.0 || rr < Math.EPSILON) {\n return false;\n }\n\n // Find the point of intersection of the line with the circle.\n let a = -(c + Math.sqrt(sigma));\n\n // Is the intersection point on the segment?\n if (0.0 <= a && a <= input.maxFraction * rr) {\n a /= rr;\n output.fraction = a;\n output.normal = Vec2.add(s, Vec2.mulNumVec2(a, r));\n output.normal.normalize();\n return true;\n }\n\n return false;\n }\n\n /**\n * Given a transform, compute the associated axis aligned bounding box for a\n * child shape.\n *\n * @param aabb Returns the axis aligned box.\n * @param xf The world transform of the shape.\n * @param childIndex The child shape\n */\n computeAABB(aabb: AABB, xf: Transform, childIndex: number): void {\n const p = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p));\n aabb.lowerBound.setNum(p.x - this.m_radius, p.y - this.m_radius);\n aabb.upperBound.setNum(p.x + this.m_radius, p.y + this.m_radius);\n }\n\n /**\n * Compute the mass properties of this shape using its dimensions and density.\n * The inertia tensor is computed about the local origin.\n *\n * @param massData Returns the mass data for this shape.\n * @param density The density in kilograms per meter squared.\n */\n computeMass(massData: MassData, density: number): void {\n massData.mass = density * Math.PI * this.m_radius * this.m_radius;\n massData.center = this.m_p;\n // inertia about the local origin\n massData.I = massData.mass\n * (0.5 * this.m_radius * this.m_radius + Vec2.dot(this.m_p, this.m_p));\n }\n\n computeDistanceProxy(proxy: DistanceProxy): void {\n proxy.m_vertices.push(this.m_p);\n proxy.m_count = 1;\n proxy.m_radius = this.m_radius;\n }\n\n}\n\nexport const Circle = CircleShape;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. A value of 0 disables softness.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * Distance length.\n */\n length?: number;\n}\n/**\n * Distance joint definition. This requires defining an anchor point on both\n * bodies and the non-zero length of the distance joint. The definition uses\n * local anchor points so that the initial configuration can violate the\n * constraint slightly. This helps when saving and loading a game. Warning: Do\n * not use a zero or short length.\n */\nexport interface DistanceJointDef extends JointDef, DistanceJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0\n};\n\n/**\n * A distance joint constrains two points on two bodies to remain at a fixed\n * distance from each other. You can view this as a massless, rigid rod.\n *\n * @param anchorA Anchor A in global coordination.\n * @param anchorB Anchor B in global coordination.\n */\nexport class DistanceJoint extends Joint {\n static TYPE = 'distance-joint' as const;\n\n // Solver shared\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_length: number;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_gamma: number;\n /** @internal */ m_bias: number;\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: DistanceJointDef);\n constructor(def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2);\n constructor(def: DistanceJointDef, bodyA?: Body, bodyB?: Body, anchorA?: Vec2, anchorB?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof DistanceJoint)) {\n return new DistanceJoint(def, bodyA, bodyB, anchorA, anchorB);\n }\n\n // order of constructor arguments is changed in v0.2\n if (bodyB && anchorA && ('m_type' in anchorA) && ('x' in bodyB) && ('y' in bodyB)) {\n const temp = bodyB;\n bodyB = anchorA as any as Body;\n anchorA = temp as any as Vec2;\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = DistanceJoint.TYPE;\n\n // Solver shared\n this.m_localAnchorA = Vec2.clone(anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.zero());\n this.m_length = Math.isFinite(def.length) ? def.length :\n Vec2.distance(bodyA.getWorldPoint(this.m_localAnchorA), bodyB.getWorldPoint(this.m_localAnchorB));\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n this.m_impulse = 0.0;\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n\n // 1-D constrained system\n // m (v2 - v1) = lambda\n // v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass.\n // x2 = x1 + h * v2\n\n // 1-D mass-damper-spring system\n // m (v2 - v1) + h * d * v2 + h * k *\n\n // C = norm(p2 - p1) - L\n // u = (p2 - p1) / norm(p2 - p1)\n // Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1))\n // J = [-u -cross(r1, u) u cross(r2, u)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n length: this.m_length,\n\n impulse: this.m_impulse,\n gamma: this.m_gamma,\n bias: this.m_bias,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): DistanceJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new DistanceJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n length?: number,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.length > 0) {\n this.m_length = +def.length;\n } else if (def.length < 0) { // don't change length\n } else if (def.anchorA || def.anchorA || def.anchorA || def.anchorA) {\n this.m_length = Vec2.distance(\n this.m_bodyA.getWorldPoint(this.m_localAnchorA),\n this.m_bodyB.getWorldPoint(this.m_localAnchorB)\n );\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the natural length. Manipulating the length can lead to non-physical\n * behavior when the frequency is zero.\n */\n setLength(length: number): void {\n this.m_length = length;\n }\n\n /**\n * Get the natural length.\n */\n getLength(): number {\n return this.m_length;\n }\n\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n this.m_u = Vec2.sub(Vec2.add(cB, this.m_rB), Vec2.add(cA, this.m_rA));\n\n // Handle singularity.\n const length = this.m_u.length();\n if (length > Settings.linearSlop) {\n this.m_u.mul(1.0 / length);\n } else {\n this.m_u.setNum(0.0, 0.0);\n }\n\n const crAu = Vec2.crossVec2Vec2(this.m_rA, this.m_u);\n const crBu = Vec2.crossVec2Vec2(this.m_rB, this.m_u);\n let invMass = this.m_invMassA + this.m_invIA * crAu * crAu + this.m_invMassB\n + this.m_invIB * crBu * crBu;\n\n // Compute the effective mass matrix.\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (this.m_frequencyHz > 0.0) {\n const C = length - this.m_length;\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * this.m_mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = this.m_mass * omega * omega;\n\n // magic formulas\n const h = step.dt;\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invMass += this.m_gamma;\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n } else {\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n const Cdot = Vec2.dot(this.m_u, vpB) - Vec2.dot(this.m_u, vpA);\n\n const impulse = -this.m_mass\n * (Cdot + this.m_bias + this.m_gamma * this.m_impulse);\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u);\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n if (this.m_frequencyHz > 0.0) {\n // There is no position correction for soft distance constraints.\n return true;\n }\n\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA));\n\n const length = u.normalize();\n let C = length - this.m_length;\n C = Math\n .clamp(C, -Settings.maxLinearCorrection, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C;\n const P = Vec2.mulNumVec2(impulse, u);\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointOpt extends JointOpt {\n /**\n * The maximum friction force in N.\n */\n maxForce?: number;\n /**\n * The maximum friction torque in N-m.\n */\n maxTorque?: number;\n}\n/**\n * Friction joint definition.\n */\nexport interface FrictionJointDef extends JointDef, FrictionJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n maxTorque : 0.0,\n};\n\n/**\n * Friction joint. This is used for top-down friction. It provides 2D\n * translational friction and angular friction.\n *\n * @param anchor Anchor in global coordination.\n */\nexport class FrictionJoint extends Joint {\n static TYPE = 'friction-joint' as const;\n\n /** @internal */ m_type: 'friction-joint';\n\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n // Solver shared\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: FrictionJointDef);\n constructor(def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: FrictionJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof FrictionJoint)) {\n return new FrictionJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = FrictionJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n\n // Solver shared\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): FrictionJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new FrictionJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && console.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && console.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y\n * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x\n * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt; // float\n\n // Solve angular friction\n {\n const Cdot = wB - wA; // float\n let impulse = -this.m_angularMass * Cdot; // float\n\n const oldImpulse = this.m_angularImpulse; // float\n const maxImpulse = h * this.m_maxTorque; // float\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.sub(Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB)), Vec2.add(vA,\n Vec2.crossNumVec2(wA, this.m_rA))); // Vec2\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot)); // Vec2\n const oldImpulse = this.m_linearImpulse; // Vec2\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce; // float\n\n if (this.m_linearImpulse.lengthSquared() > maxImpulse * maxImpulse) {\n this.m_linearImpulse.normalize();\n this.m_linearImpulse.mul(maxImpulse);\n }\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Vec2 } from './Vec2';\nimport { Vec3 } from './Vec3';\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\n/**\n * A 3-by-3 matrix. Stored in column-major order.\n */\nexport class Mat33 {\n ex: Vec3;\n ey: Vec3;\n ez: Vec3;\n\n constructor(a: Vec3, b: Vec3, c: Vec3);\n constructor();\n constructor(a?: Vec3, b?: Vec3, c?: Vec3) {\n if (typeof a === 'object' && a !== null) {\n this.ex = Vec3.clone(a);\n this.ey = Vec3.clone(b);\n this.ez = Vec3.clone(c);\n } else {\n this.ex = Vec3.zero();\n this.ey = Vec3.zero();\n this.ez = Vec3.zero();\n }\n }\n\n /** @internal */\n toString(): string {\n return JSON.stringify(this);\n }\n\n static isValid(obj: any): boolean {\n if (obj === null || typeof obj === 'undefined') {\n return false;\n }\n return Vec3.isValid(obj.ex) && Vec3.isValid(obj.ey) && Vec3.isValid(obj.ez);\n }\n\n static assert(o: any): void {\n _ASSERT && console.assert(!Mat33.isValid(o), 'Invalid Mat33!', o);\n }\n\n /**\n * Set this matrix to all zeros.\n */\n setZero(): Mat33 {\n this.ex.setZero();\n this.ey.setZero();\n this.ez.setZero();\n return this;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases.\n */\n solve33(v: Vec3): Vec3 {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = new Vec3();\n r.x = det * Vec3.dot(v, Vec3.cross(this.ey, this.ez));\n r.y = det * Vec3.dot(this.ex, Vec3.cross(v, this.ez));\n r.z = det * Vec3.dot(this.ex, Vec3.cross(this.ey, v));\n return r;\n }\n\n /**\n * Solve A * x = b, where b is a column vector. This is more efficient than\n * computing the inverse in one-shot cases. Solve only the upper 2-by-2 matrix\n * equation.\n */\n solve22(v: Vec2): Vec2 {\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a21 = this.ex.y;\n const a22 = this.ey.y;\n let det = a11 * a22 - a12 * a21;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const r = Vec2.zero();\n r.x = det * (a22 * v.x - a12 * v.y);\n r.y = det * (a11 * v.y - a21 * v.x);\n return r;\n }\n\n /**\n * Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if\n * singular.\n */\n getInverse22(M: Mat33): void {\n const a = this.ex.x;\n const b = this.ey.x;\n const c = this.ex.y;\n const d = this.ey.y;\n let det = a * d - b * c;\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n M.ex.x = det * d;\n M.ey.x = -det * b;\n M.ex.z = 0.0;\n M.ex.y = -det * c;\n M.ey.y = det * a;\n M.ey.z = 0.0;\n M.ez.x = 0.0;\n M.ez.y = 0.0;\n M.ez.z = 0.0;\n }\n\n /**\n * Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix\n * if singular.\n */\n getSymInverse33(M: Mat33): void {\n let det = Vec3.dot(this.ex, Vec3.cross(this.ey, this.ez));\n if (det !== 0.0) {\n det = 1.0 / det;\n }\n const a11 = this.ex.x;\n const a12 = this.ey.x;\n const a13 = this.ez.x;\n const a22 = this.ey.y;\n const a23 = this.ez.y;\n const a33 = this.ez.z;\n\n M.ex.x = det * (a22 * a33 - a23 * a23);\n M.ex.y = det * (a13 * a23 - a12 * a33);\n M.ex.z = det * (a12 * a23 - a13 * a22);\n\n M.ey.x = M.ex.y;\n M.ey.y = det * (a11 * a33 - a13 * a13);\n M.ey.z = det * (a13 * a12 - a11 * a23);\n\n M.ez.x = M.ex.z;\n M.ez.y = M.ey.z;\n M.ez.z = det * (a11 * a22 - a12 * a12);\n }\n\n /**\n * Multiply a matrix times a vector.\n */\n static mul(a: Mat33, b: Vec2): Vec2;\n static mul(a: Mat33, b: Vec3): Vec3;\n // tslint:disable-next-line:typedef\n static mul(a, b) {\n _ASSERT && Mat33.assert(a);\n if (b && 'z' in b && 'y' in b && 'x' in b) {\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n\n } else if (b && 'y' in b && 'x' in b) {\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n _ASSERT && console.assert(false);\n }\n\n static mulVec3(a: Mat33, b: Vec3): Vec3 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec3.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y + a.ez.x * b.z;\n const y = a.ex.y * b.x + a.ey.y * b.y + a.ez.y * b.z;\n const z = a.ex.z * b.x + a.ey.z * b.y + a.ez.z * b.z;\n return new Vec3(x, y, z);\n }\n\n static mulVec2(a: Mat33, b: Vec2): Vec2 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Vec2.assert(b);\n const x = a.ex.x * b.x + a.ey.x * b.y;\n const y = a.ex.y * b.x + a.ey.y * b.y;\n return Vec2.neo(x, y);\n }\n\n static add(a: Mat33, b: Mat33): Mat33 {\n _ASSERT && Mat33.assert(a);\n _ASSERT && Mat33.assert(b);\n return new Mat33(\n Vec3.add(a.ex, b.ex),\n Vec3.add(a.ey, b.ey),\n Vec3.add(a.ez, b.ez)\n );\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat22 } from '../../common/Mat22';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointOpt extends JointOpt {\n /**\n * The lower angle for the joint limit (radians).\n */\n lowerAngle?: number;\n /**\n * The upper angle for the joint limit (radians).\n */\n upperAngle?: number;\n /**\n * The maximum motor torque used to achieve the desired motor speed. Usually\n * in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed. Usually in radians per second.\n */\n motorSpeed?: number;\n /**\n * A flag to enable joint limits.\n */\n enableLimit?: boolean;\n /**\n * A flag to enable the joint motor.\n */\n enableMotor?: boolean;\n}\n/**\n * Revolute joint definition. This requires defining an anchor point where the\n * bodies are joined. The definition uses local anchor points so that the\n * initial configuration can violate the constraint slightly. You also need to\n * specify the initial relative angle for joint limits. This helps when saving\n * and loading a game.\n *\n * The local anchor points are measured from the body's origin rather than the\n * center of mass because: 1. you might not know where the center of mass will\n * be. 2. if you add/remove shapes from a body and recompute the mass, the\n * joints will be broken.\n */\nexport interface RevoluteJointDef extends JointDef, RevoluteJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n lowerAngle : 0.0,\n upperAngle : 0.0,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n enableLimit : false,\n enableMotor : false\n};\n\n/**\n * A revolute joint constrains two bodies to share a common point while they are\n * free to rotate about the point. The relative rotation about the shared point\n * is the joint angle. You can limit the relative rotation with a joint limit\n * that specifies a lower and upper angle. You can use a motor to drive the\n * relative rotation about the shared point. A maximum motor torque is provided\n * so that infinite forces are not generated.\n */\nexport class RevoluteJoint extends Joint {\n static TYPE = 'revolute-joint' as const;\n\n /** @internal */ m_type: 'revolute-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerAngle: number;\n /** @internal */ m_upperAngle: number;\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n // effective mass for point-to-point constraint.\n /** @internal */ m_mass: Mat33 = new Mat33();\n // effective mass for motor/limit angular constraint.\n /** @internal */ m_motorMass: number;\n /** @internal */ m_limitState: number = inactiveLimit; // TODO enum\n\n constructor(def: RevoluteJointDef);\n constructor(def: RevoluteJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n // @ts-ignore\n constructor(def: RevoluteJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof RevoluteJoint)) {\n return new RevoluteJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RevoluteJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorImpulse = 0.0;\n\n this.m_lowerAngle = def.lowerAngle;\n this.m_upperAngle = def.upperAngle;\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Motor constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerAngle: this.m_lowerAngle,\n upperAngle: this.m_upperAngle,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any):RevoluteJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RevoluteJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle in radians.\n */\n getJointAngle(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_sweep.a - bA.m_sweep.a - this.m_referenceAngle;\n }\n\n /**\n * Get the current joint angle speed in radians per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n return bB.m_angularVelocity - bA.m_angularVelocity;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Get the current motor torque given the inverse time step. Unit is N*m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set the motor speed in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set the maximum motor torque, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit in radians.\n */\n getLowerLimit(): number {\n return this.m_lowerAngle;\n }\n\n /**\n * Get the upper joint limit in radians.\n */\n getUpperLimit(): number {\n return this.m_upperAngle;\n }\n\n /**\n * Set the joint limits in radians.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && console.assert(lower <= upper);\n\n if (lower != this.m_lowerAngle || upper != this.m_upperAngle) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_impulse.z = 0.0;\n this.m_lowerAngle = lower;\n this.m_upperAngle = upper;\n }\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force given the inverse time step. Unit is N.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque due to the joint limit given the inverse time step.\n * Unit is N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n this.m_mass.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y\n * this.m_rB.y * iB;\n this.m_mass.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y\n * this.m_rB.x * iB;\n this.m_mass.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n this.m_mass.ex.y = this.m_mass.ey.x;\n this.m_mass.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x\n * this.m_rB.x * iB;\n this.m_mass.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n this.m_mass.ex.z = this.m_mass.ez.x;\n this.m_mass.ey.z = this.m_mass.ez.y;\n this.m_mass.ez.z = iA + iB;\n\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n\n if (this.m_enableMotor == false || fixedRotation) {\n this.m_motorImpulse = 0.0;\n }\n\n if (this.m_enableLimit && fixedRotation == false) {\n const jointAngle = aB - aA - this.m_referenceAngle; // float\n\n if (Math.abs(this.m_upperAngle - this.m_lowerAngle) < 2.0 * Settings.angularSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointAngle <= this.m_lowerAngle) {\n if (this.m_limitState != atLowerLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atLowerLimit;\n\n } else if (jointAngle >= this.m_upperAngle) {\n if (this.m_limitState != atUpperLimit) {\n this.m_impulse.z = 0.0;\n }\n this.m_limitState = atUpperLimit;\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_motorImpulse + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_motorImpulse + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const fixedRotation = (iA + iB === 0.0); // bool\n\n // Solve motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits\n && fixedRotation == false) {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const impulse = Vec3.neg(this.m_mass.solve33(Cdot)); // Vec3\n\n if (this.m_limitState == equalLimits) {\n this.m_impulse.add(impulse);\n\n } else if (this.m_limitState == atLowerLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse < 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n\n } else if (this.m_limitState == atUpperLimit) {\n const newImpulse = this.m_impulse.z + impulse.z; // float\n\n if (newImpulse > 0.0) {\n const rhs = Vec2.combine(-1, Cdot1, this.m_impulse.z, Vec2.neo(this.m_mass.ez.x, this.m_mass.ez.y)); // Vec2\n const reduced = this.m_mass.solve22(rhs); // Vec2\n impulse.x = reduced.x;\n impulse.y = reduced.y;\n impulse.z = -this.m_impulse.z;\n this.m_impulse.x += reduced.x;\n this.m_impulse.y += reduced.y;\n this.m_impulse.z = 0.0;\n\n } else {\n this.m_impulse.add(impulse);\n }\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n\n } else {\n // Solve point-to-point constraint\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n const impulse = this.m_mass.solve22(Vec2.neg(Cdot)); // Vec2\n\n this.m_impulse.x += impulse.x;\n this.m_impulse.y += impulse.y;\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n let angularError = 0.0; // float\n let positionError = 0.0; // float\n\n const fixedRotation = (this.m_invIA + this.m_invIB == 0.0); // bool\n\n // Solve angular limit constraint.\n if (this.m_enableLimit && this.m_limitState != inactiveLimit\n && fixedRotation == false) {\n const angle = aB - aA - this.m_referenceAngle; // float\n let limitImpulse = 0.0; // float\n\n if (this.m_limitState == equalLimits) {\n // Prevent large angular corrections\n const C = Math.clamp(angle - this.m_lowerAngle,\n -Settings.maxAngularCorrection, Settings.maxAngularCorrection); // float\n limitImpulse = -this.m_motorMass * C;\n angularError = Math.abs(C);\n\n } else if (this.m_limitState == atLowerLimit) {\n let C = angle - this.m_lowerAngle; // float\n angularError = -C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C + Settings.angularSlop, -Settings.maxAngularCorrection,\n 0.0);\n limitImpulse = -this.m_motorMass * C;\n\n } else if (this.m_limitState == atUpperLimit) {\n let C = angle - this.m_upperAngle; // float\n angularError = C;\n\n // Prevent large angular corrections and allow some slop.\n C = Math.clamp(C - Settings.angularSlop, 0.0,\n Settings.maxAngularCorrection);\n limitImpulse = -this.m_motorMass * C;\n }\n\n aA -= this.m_invIA * limitImpulse;\n aB += this.m_invIB * limitImpulse;\n }\n\n // Solve point-to-point constraint.\n {\n qA.setAngle(aA);\n qB.setAngle(aB);\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n\n const C = Vec2.zero();\n C.addCombine(1, cB, 1, rB);\n C.subCombine(1, cA, 1, rA);\n positionError = C.length();\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y;\n K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x;\n\n const impulse = Vec2.neg(K.solve(C)); // Vec2\n\n cA.subMul(mA, impulse);\n aA -= iA * Vec2.crossVec2Vec2(rA, impulse);\n\n cB.addMul(mB, impulse);\n aB += iB * Vec2.crossVec2Vec2(rB, impulse);\n }\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat22 } from '../../common/Mat22';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointOpt extends JointOpt {\n /**\n * Enable/disable the joint limit.\n */\n enableLimit?: boolean;\n /**\n * The lower translation limit, usually in meters.\n */\n lowerTranslation?: number;\n /**\n * The upper translation limit, usually in meters.\n */\n upperTranslation?: number;\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorForce?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n}\n/**\n * Prismatic joint definition. This requires defining a line of motion using an\n * axis and an anchor point. The definition uses local anchor points and a local\n * axis so that the initial configuration can violate the constraint slightly.\n * The joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface PrismaticJointDef extends JointDef, PrismaticJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation unit axis in bodyA.\n */\n localAxisA: Vec2;\n /**\n * referenceAngle The constrained angle between the bodies:\n * bodyB_angle - bodyA_angle.\n */\n referenceAngle: number;\n}\n\nconst DEFAULTS = {\n enableLimit : false,\n lowerTranslation : 0.0,\n upperTranslation : 0.0,\n enableMotor : false,\n maxMotorForce : 0.0,\n motorSpeed : 0.0\n};\n\n/**\n * A prismatic joint. This joint provides one degree of freedom: translation\n * along an axis fixed in bodyA. Relative rotation is prevented. You can use a\n * joint limit to restrict the range of motion and a joint motor to drive the\n * motion or to model joint friction.\n */\nexport class PrismaticJoint extends Joint {\n static TYPE = 'prismatic-joint' as const;\n\n /** @internal */ m_type: 'prismatic-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n /** @internal */ m_referenceAngle: number;\n /** @internal */ m_impulse: Vec3;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_lowerTranslation: number;\n /** @internal */ m_upperTranslation: number;\n /** @internal */ m_maxMotorForce: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableLimit: boolean;\n /** @internal */ m_enableMotor: boolean;\n /** @internal */ m_limitState: number; // TODO enum\n /** @internal */ m_axis: Vec2;\n /** @internal */ m_perp: Vec2;\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_s1: number;\n /** @internal */ m_s2: number;\n /** @internal */ m_a1: number;\n /** @internal */ m_a2: number;\n /** @internal */ m_K: Mat33;\n\n constructor(def: PrismaticJointDef);\n constructor(def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n constructor(def: PrismaticJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PrismaticJoint)) {\n return new PrismaticJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PrismaticJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || Vec2.neo(1.0, 0.0));\n this.m_localXAxisA.normalize();\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_impulse = new Vec3();\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n\n this.m_lowerTranslation = def.lowerTranslation;\n this.m_upperTranslation = def.upperTranslation;\n this.m_maxMotorForce = def.maxMotorForce;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableLimit = def.enableLimit;\n this.m_enableMotor = def.enableMotor;\n this.m_limitState = inactiveLimit;\n\n this.m_axis = Vec2.zero();\n this.m_perp = Vec2.zero();\n\n this.m_K = new Mat33();\n\n // Linear constraint (point-to-line)\n // d = p2 - p1 = x2 + r2 - x1 - r1\n // C = dot(perp, d)\n // Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 -\n // cross(w1, r1))\n // = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) +\n // dot(cross(r2, perp), v2)\n // J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)]\n //\n // Angular constraint\n // C = a2 - a1 + a_initial\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n //\n // K = J * invM * JT\n //\n // J = [-a -s1 a s2]\n // [0 -1 0 1]\n // a = perp\n // s1 = cross(d + r1, a) = cross(p2 - x1, a)\n // s2 = cross(r2, a) = cross(p2 - x2, a)\n\n // Motor/Limit linear constraint\n // C = dot(ax1, d)\n // Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) +\n // dot(cross(r2, ax1), v2)\n // J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)]\n\n // Block Solver\n // We develop a block solver that includes the joint limit. This makes the\n // limit stiff (inelastic) even\n // when the mass has poor distribution (leading to large torques about the\n // joint anchor points).\n //\n // The Jacobian has 3 rows:\n // J = [-uT -s1 uT s2] // linear\n // [0 -1 0 1] // angular\n // [-vT -a1 vT a2] // limit\n //\n // u = perp\n // v = axis\n // s1 = cross(d + r1, u), s2 = cross(r2, u)\n // a1 = cross(d + r1, v), a2 = cross(r2, v)\n\n // M * (v2 - v1) = JT * df\n // J * v2 = bias\n //\n // v2 = v1 + invM * JT * df\n // J * (v1 + invM * JT * df) = bias\n // K * df = bias - J * v1 = -Cdot\n // K = J * invM * JT\n // Cdot = J * v1 - bias\n //\n // Now solve for f2.\n // df = f2 - f1\n // K * (f2 - f1) = -Cdot\n // f2 = invK * (-Cdot) + f1\n //\n // Clamp accumulated limit impulse.\n // lower: f2(3) = max(f2(3), 0)\n // upper: f2(3) = min(f2(3), 0)\n //\n // Solve for correct f2(1:2)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1\n // = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3)\n // K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) +\n // K(1:2,1:2) * f1(1:2)\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n //\n // Now compute impulse to be applied:\n // df = f2 - f1\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n lowerTranslation: this.m_lowerTranslation,\n upperTranslation: this.m_upperTranslation,\n maxMotorForce: this.m_maxMotorForce,\n motorSpeed: this.m_motorSpeed,\n enableLimit: this.m_enableLimit,\n enableMotor: this.m_enableMotor,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PrismaticJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.localAxisA = Vec2.clone(data.localAxisA);\n const joint = new PrismaticJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const pA = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const pB = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const d = Vec2.sub(pB, pA);\n const axis = this.m_bodyA.getWorldVector(this.m_localXAxisA);\n\n const translation = Vec2.dot(d, axis);\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const rA = Rot.mulVec2(bA.m_xf.q, Vec2.sub(this.m_localAnchorA, bA.m_sweep.localCenter)); // Vec2\n const rB = Rot.mulVec2(bB.m_xf.q, Vec2.sub(this.m_localAnchorB, bB.m_sweep.localCenter)); // Vec2\n const p1 = Vec2.add(bA.m_sweep.c, rA); // Vec2\n const p2 = Vec2.add(bB.m_sweep.c, rB); // Vec2\n const d = Vec2.sub(p2, p1); // Vec2\n const axis = Rot.mulVec2(bA.m_xf.q, this.m_localXAxisA); // Vec2\n\n const vA = bA.m_linearVelocity; // Vec2\n const vB = bB.m_linearVelocity; // Vec2\n const wA = bA.m_angularVelocity; // float\n const wB = bB.m_angularVelocity; // float\n\n const speed = Vec2.dot(d, Vec2.crossNumVec2(wA, axis))\n + Vec2.dot(axis, Vec2.sub(Vec2.addCrossNumVec2(vB, wB, rB), Vec2.addCrossNumVec2(vA, wA, rA))); // float\n return speed;\n }\n\n /**\n * Is the joint limit enabled?\n */\n isLimitEnabled(): boolean {\n return this.m_enableLimit;\n }\n\n /**\n * Enable/disable the joint limit.\n */\n enableLimit(flag: boolean): void {\n if (flag != this.m_enableLimit) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableLimit = flag;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Get the lower joint limit, usually in meters.\n */\n getLowerLimit(): number {\n return this.m_lowerTranslation;\n }\n\n /**\n * Get the upper joint limit, usually in meters.\n */\n getUpperLimit(): number {\n return this.m_upperTranslation;\n }\n\n /**\n * Set the joint limits, usually in meters.\n */\n setLimits(lower: number, upper: number): void {\n _ASSERT && console.assert(lower <= upper);\n if (lower != this.m_lowerTranslation || upper != this.m_upperTranslation) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_lowerTranslation = lower;\n this.m_upperTranslation = upper;\n this.m_impulse.z = 0.0;\n }\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in meters per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Set the maximum motor force, usually in N.\n */\n setMaxMotorForce(force: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorForce = force;\n }\n\n getMaxMotorForce(): number {\n return this.m_maxMotorForce;\n }\n\n /**\n * Get the motor speed, usually in meters per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Get the current motor force given the inverse time step, usually in N.\n */\n getMotorForce(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse + this.m_impulse.z, this.m_axis).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.y;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute motor Jacobian and effective mass.\n {\n this.m_axis = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_axis);\n this.m_a2 = Vec2.crossVec2Vec2(rB, this.m_axis);\n\n this.m_motorMass = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2\n * this.m_a2;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n }\n\n // Prismatic constraint.\n {\n this.m_perp = Rot.mulVec2(qA, this.m_localYAxisA);\n\n this.m_s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_perp);\n this.m_s2 = Vec2.crossVec2Vec2(rB, this.m_perp);\n\n const s1test = Vec2.crossVec2Vec2(rA, this.m_perp);\n\n const k11 = mA + mB + iA * this.m_s1 * this.m_s1 + iB * this.m_s2 * this.m_s2;\n const k12 = iA * this.m_s1 + iB * this.m_s2;\n const k13 = iA * this.m_s1 * this.m_a1 + iB * this.m_s2 * this.m_a2;\n let k22 = iA + iB;\n if (k22 == 0.0) {\n // For bodies with fixed rotation.\n k22 = 1.0;\n }\n const k23 = iA * this.m_a1 + iB * this.m_a2;\n const k33 = mA + mB + iA * this.m_a1 * this.m_a1 + iB * this.m_a2 * this.m_a2;\n\n this.m_K.ex.set(k11, k12, k13);\n this.m_K.ey.set(k12, k22, k23);\n this.m_K.ez.set(k13, k23, k33);\n }\n\n // Compute motor and limit terms.\n if (this.m_enableLimit) {\n\n const jointTranslation = Vec2.dot(this.m_axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * Settings.linearSlop) {\n this.m_limitState = equalLimits;\n\n } else if (jointTranslation <= this.m_lowerTranslation) {\n if (this.m_limitState != atLowerLimit) {\n this.m_limitState = atLowerLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else if (jointTranslation >= this.m_upperTranslation) {\n if (this.m_limitState != atUpperLimit) {\n this.m_limitState = atUpperLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n } else {\n this.m_limitState = inactiveLimit;\n this.m_impulse.z = 0.0;\n }\n\n if (this.m_enableMotor == false) {\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse.mul(step.dtRatio);\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse.x, this.m_perp, this.m_motorImpulse\n + this.m_impulse.z, this.m_axis);\n const LA = this.m_impulse.x * this.m_s1 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1;\n const LB = this.m_impulse.x * this.m_s2 + this.m_impulse.y\n + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n this.m_impulse.setZero();\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Solve linear motor constraint.\n if (this.m_enableMotor && this.m_limitState != equalLimits) {\n const Cdot = Vec2.dot(this.m_axis, Vec2.sub(vB, vA)) + this.m_a2 * wB\n - this.m_a1 * wA;\n let impulse = this.m_motorMass * (this.m_motorSpeed - Cdot);\n const oldImpulse = this.m_motorImpulse;\n const maxImpulse = step.dt * this.m_maxMotorForce;\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_axis);\n const LA = impulse * this.m_a1;\n const LB = impulse * this.m_a2;\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n const Cdot1 = Vec2.zero();\n Cdot1.x += Vec2.dot(this.m_perp, vB) + this.m_s2 * wB;\n Cdot1.x -= Vec2.dot(this.m_perp, vA) + this.m_s1 * wA;\n Cdot1.y = wB - wA;\n\n if (this.m_enableLimit && this.m_limitState != inactiveLimit) {\n // Solve prismatic and limit constraint in block form.\n let Cdot2 = 0;\n Cdot2 += Vec2.dot(this.m_axis, vB) + this.m_a2 * wB;\n Cdot2 -= Vec2.dot(this.m_axis, vA) + this.m_a1 * wA;\n\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2);\n\n const f1 = Vec3.clone(this.m_impulse);\n let df = this.m_K.solve33(Vec3.neg(Cdot)); // Vec3\n this.m_impulse.add(df);\n\n if (this.m_limitState == atLowerLimit) {\n this.m_impulse.z = Math.max(this.m_impulse.z, 0.0);\n } else if (this.m_limitState == atUpperLimit) {\n this.m_impulse.z = Math.min(this.m_impulse.z, 0.0);\n }\n\n // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) +\n // f1(1:2)\n const b = Vec2.combine(-1, Cdot1, -(this.m_impulse.z - f1.z), Vec2.neo(this.m_K.ez.x, this.m_K.ez.y)); // Vec2\n const f2r = Vec2.add(this.m_K.solve22(b), Vec2.neo(f1.x, f1.y)); // Vec2\n this.m_impulse.x = f2r.x;\n this.m_impulse.y = f2r.y;\n\n df = Vec3.sub(this.m_impulse, f1);\n\n const P = Vec2.combine(df.x, this.m_perp, df.z, this.m_axis); // Vec2\n const LA = df.x * this.m_s1 + df.y + df.z * this.m_a1; // float\n const LB = df.x * this.m_s2 + df.y + df.z * this.m_a2; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n } else {\n // Limit is inactive, just solve the prismatic constraint in block form.\n const df = this.m_K.solve22(Vec2.neg(Cdot1)); // Vec2\n this.m_impulse.x += df.x;\n this.m_impulse.y += df.y;\n\n const P = Vec2.mulNumVec2(df.x, this.m_perp); // Vec2\n const LA = df.x * this.m_s1 + df.y; // float\n const LB = df.x * this.m_s2 + df.y; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n // Compute fresh Jacobians\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA)); // Vec2\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB)); // Vec2\n const d = Vec2.sub(Vec2.add(cB, rB), Vec2.add(cA, rA)); // Vec2\n\n const axis = Rot.mulVec2(qA, this.m_localXAxisA); // Vec2\n const a1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), axis); // float\n const a2 = Vec2.crossVec2Vec2(rB, axis); // float\n const perp = Rot.mulVec2(qA, this.m_localYAxisA); // Vec2\n\n const s1 = Vec2.crossVec2Vec2(Vec2.add(d, rA), perp); // float\n const s2 = Vec2.crossVec2Vec2(rB, perp); // float\n\n let impulse = new Vec3();\n const C1 = Vec2.zero(); // Vec2\n C1.x = Vec2.dot(perp, d);\n C1.y = aB - aA - this.m_referenceAngle;\n\n let linearError = Math.abs(C1.x); // float\n const angularError = Math.abs(C1.y); // float\n\n const linearSlop = Settings.linearSlop;\n const maxLinearCorrection = Settings.maxLinearCorrection;\n\n let active = false; // bool\n let C2 = 0.0; // float\n if (this.m_enableLimit) {\n\n const translation = Vec2.dot(axis, d); // float\n if (Math.abs(this.m_upperTranslation - this.m_lowerTranslation) < 2.0 * linearSlop) {\n // Prevent large angular corrections\n C2 = Math.clamp(translation, -maxLinearCorrection, maxLinearCorrection);\n linearError = Math.max(linearError, Math.abs(translation));\n active = true;\n\n } else if (translation <= this.m_lowerTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_lowerTranslation + linearSlop,\n -maxLinearCorrection, 0.0);\n linearError = Math\n .max(linearError, this.m_lowerTranslation - translation);\n active = true;\n\n } else if (translation >= this.m_upperTranslation) {\n // Prevent large linear corrections and allow some slop.\n C2 = Math.clamp(translation - this.m_upperTranslation - linearSlop, 0.0,\n maxLinearCorrection);\n linearError = Math\n .max(linearError, translation - this.m_upperTranslation);\n active = true;\n }\n }\n\n if (active) {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n const k13 = iA * s1 * a1 + iB * s2 * a2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n // For fixed rotation\n k22 = 1.0;\n }\n const k23 = iA * a1 + iB * a2; // float\n const k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; // float\n\n const K = new Mat33();\n K.ex.set(k11, k12, k13);\n K.ey.set(k12, k22, k23);\n K.ez.set(k13, k23, k33);\n\n const C = new Vec3();\n C.x = C1.x;\n C.y = C1.y;\n C.z = C2;\n\n impulse = K.solve33(Vec3.neg(C));\n } else {\n const k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; // float\n const k12 = iA * s1 + iB * s2; // float\n let k22 = iA + iB; // float\n if (k22 == 0.0) {\n k22 = 1.0;\n }\n\n const K = new Mat22();\n K.ex.setNum(k11, k12);\n K.ey.setNum(k12, k22);\n\n const impulse1 = K.solve(Vec2.neg(C1)); // Vec2\n impulse.x = impulse1.x;\n impulse.y = impulse1.y;\n impulse.z = 0.0;\n }\n\n const P = Vec2.combine(impulse.x, perp, impulse.z, axis); // Vec2\n const LA = impulse.x * s1 + impulse.y + impulse.z * a1; // float\n const LB = impulse.x * s2 + impulse.y + impulse.z * a2; // float\n\n cA.subMul(mA, P);\n aA -= iA * LA;\n cB.addMul(mB, P);\n aB += iB * LB;\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError <= Settings.linearSlop\n && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { RevoluteJoint } from './RevoluteJoint';\nimport { PrismaticJoint } from './PrismaticJoint';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Gear joint definition.\n */\nexport interface GearJointOpt extends JointOpt {\n /**\n * The gear ratio. See {@link GearJoint} for explanation.\n */\n ratio?: number;\n}\n/**\n * Gear joint definition.\n */\nexport interface GearJointDef extends JointDef, GearJointOpt {\n /**\n * The first revolute/prismatic joint attached to the gear joint.\n */\n joint1: RevoluteJoint | PrismaticJoint;\n /**\n * The second prismatic/revolute joint attached to the gear joint.\n */\n joint2: RevoluteJoint | PrismaticJoint;\n}\n\nconst DEFAULTS = {\n ratio : 1.0\n};\n\n/**\n * A gear joint is used to connect two joints together. Either joint can be a\n * revolute or prismatic joint. You specify a gear ratio to bind the motions\n * together: coordinate1 + ratio * coordinate2 = constant\n *\n * The ratio can be negative or positive. If one joint is a revolute joint and\n * the other joint is a prismatic joint, then the ratio will have units of\n * length or units of 1/length. Warning: You have to manually destroy the gear\n * joint if joint1 or joint2 is destroyed.\n *\n * This definition requires two existing revolute or prismatic joints (any\n * combination will work).\n */\nexport class GearJoint extends Joint {\n static TYPE = 'gear-joint' as const;\n\n /** @internal */ m_type: 'gear-joint';\n /** @internal */ m_joint1: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_joint2: RevoluteJoint | PrismaticJoint;\n /** @internal */ m_type1: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_type2: 'revolute-joint' | 'prismatic-joint';\n /** @internal */ m_bodyC: Body;\n /** @internal */ m_localAnchorC: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_referenceAngleA: number;\n /** @internal */ m_localAxisC: Vec2;\n /** @internal */ m_bodyD: Body;\n /** @internal */ m_localAnchorD: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngleB: number;\n /** @internal */ m_localAxisD: Vec2;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_lcA: Vec2;\n /** @internal */ m_lcB: Vec2;\n /** @internal */ m_lcC: Vec2;\n /** @internal */ m_lcD: Vec2;\n /** @internal */ m_mA: number;\n /** @internal */ m_mB: number;\n /** @internal */ m_mC: number;\n /** @internal */ m_mD: number;\n /** @internal */ m_iA: number;\n /** @internal */ m_iB: number;\n /** @internal */ m_iC: number;\n /** @internal */ m_iD: number;\n /** @internal */ m_JvAC: Vec2;\n /** @internal */ m_JvBD: Vec2;\n /** @internal */ m_JwA: number;\n /** @internal */ m_JwB: number;\n /** @internal */ m_JwC: number;\n /** @internal */ m_JwD: number;\n /** @internal */ m_mass: number;\n\n constructor(def: GearJointDef);\n constructor(def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number);\n constructor(def: GearJointDef, bodyA?: Body, bodyB?: Body, joint1?: RevoluteJoint | PrismaticJoint, joint2?: RevoluteJoint | PrismaticJoint, ratio?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof GearJoint)) {\n return new GearJoint(def, bodyA, bodyB, joint1, joint2, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = GearJoint.TYPE;\n\n _ASSERT && console.assert(joint1.m_type === RevoluteJoint.TYPE\n || joint1.m_type === PrismaticJoint.TYPE);\n _ASSERT && console.assert(joint2.m_type === RevoluteJoint.TYPE\n || joint2.m_type === PrismaticJoint.TYPE);\n\n this.m_joint1 = joint1 ? joint1 : def.joint1;\n this.m_joint2 = joint2 ? joint2 : def.joint2;\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n this.m_type1 = this.m_joint1.getType() as 'revolute-joint' | 'prismatic-joint';\n this.m_type2 = this.m_joint2.getType() as 'revolute-joint' | 'prismatic-joint';\n\n // joint1 connects body A to body C\n // joint2 connects body B to body D\n\n let coordinateA: number;\n let coordinateB: number;\n\n // TODO_ERIN there might be some problem with the joint edges in Joint.\n\n this.m_bodyC = this.m_joint1.getBodyA();\n this.m_bodyA = this.m_joint1.getBodyB();\n\n // Get geometry of joint1\n const xfA = this.m_bodyA.m_xf;\n const aA = this.m_bodyA.m_sweep.a;\n const xfC = this.m_bodyC.m_xf;\n const aC = this.m_bodyC.m_sweep.a;\n\n if (this.m_type1 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint1 as RevoluteJoint;\n this.m_localAnchorC = revolute.m_localAnchorA;\n this.m_localAnchorA = revolute.m_localAnchorB;\n this.m_referenceAngleA = revolute.m_referenceAngle;\n this.m_localAxisC = Vec2.zero();\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const prismatic = this.m_joint1 as PrismaticJoint;\n this.m_localAnchorC = prismatic.m_localAnchorA;\n this.m_localAnchorA = prismatic.m_localAnchorB;\n this.m_referenceAngleA = prismatic.m_referenceAngle;\n this.m_localAxisC = prismatic.m_localXAxisA;\n\n const pC = this.m_localAnchorC;\n const pA = Rot.mulTVec2(xfC.q, Vec2.add(Rot.mulVec2(xfA.q, this.m_localAnchorA), Vec2.sub(xfA.p, xfC.p)));\n coordinateA = Vec2.dot(pA, this.m_localAxisC) - Vec2.dot(pC, this.m_localAxisC);\n }\n\n this.m_bodyD = this.m_joint2.getBodyA();\n this.m_bodyB = this.m_joint2.getBodyB();\n\n // Get geometry of joint2\n const xfB = this.m_bodyB.m_xf;\n const aB = this.m_bodyB.m_sweep.a;\n const xfD = this.m_bodyD.m_xf;\n const aD = this.m_bodyD.m_sweep.a;\n\n if (this.m_type2 === RevoluteJoint.TYPE) {\n const revolute = this.m_joint2 as RevoluteJoint;\n this.m_localAnchorD = revolute.m_localAnchorA;\n this.m_localAnchorB = revolute.m_localAnchorB;\n this.m_referenceAngleB = revolute.m_referenceAngle;\n this.m_localAxisD = Vec2.zero();\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const prismatic = this.m_joint2 as PrismaticJoint;\n this.m_localAnchorD = prismatic.m_localAnchorA;\n this.m_localAnchorB = prismatic.m_localAnchorB;\n this.m_referenceAngleB = prismatic.m_referenceAngle;\n this.m_localAxisD = prismatic.m_localXAxisA;\n\n const pD = this.m_localAnchorD;\n const pB = Rot.mulTVec2(xfD.q, Vec2.add(Rot.mulVec2(xfB.q, this.m_localAnchorB), Vec2.sub(xfB.p, xfD.p)));\n coordinateB = Vec2.dot(pB, this.m_localAxisD) - Vec2.dot(pD, this.m_localAxisD);\n }\n\n this.m_constant = coordinateA + this.m_ratio * coordinateB;\n\n this.m_impulse = 0.0;\n\n // Gear Joint:\n // C0 = (coordinate1 + ratio * coordinate2)_initial\n // C = (coordinate1 + ratio * coordinate2) - C0 = 0\n // J = [J1 ratio * J2]\n // K = J * invM * JT\n // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T\n //\n // Revolute:\n // coordinate = rotation\n // Cdot = angularVelocity\n // J = [0 0 1]\n // K = J * invM * JT = invI\n //\n // Prismatic:\n // coordinate = dot(p - pg, ug)\n // Cdot = dot(v + cross(w, r), ug)\n // J = [ug cross(r, ug)]\n // K = J * invM * JT = invMass + invI * cross(r, ug)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n joint1: this.m_joint1,\n joint2: this.m_joint2,\n ratio: this.m_ratio,\n\n // _constant: this.m_constant,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): GearJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.joint1 = restore(Joint, data.joint1, world);\n data.joint2 = restore(Joint, data.joint2, world);\n const joint = new GearJoint(data);\n // if (data._constant) joint.m_constant = data._constant;\n return joint;\n }\n\n /**\n * Get the first joint.\n */\n getJoint1(): Joint {\n return this.m_joint1;\n }\n\n /**\n * Get the second joint.\n */\n getJoint2(): Joint {\n return this.m_joint2;\n }\n\n /**\n * Set the gear ratio.\n */\n setRatio(ratio: number): void {\n _ASSERT && console.assert(Math.isFinite(ratio));\n this.m_ratio = ratio;\n }\n\n /**\n * Get the gear ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_JvAC).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n const L = this.m_impulse * this.m_JwA; // float\n return inv_dt * L;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_lcA = this.m_bodyA.m_sweep.localCenter;\n this.m_lcB = this.m_bodyB.m_sweep.localCenter;\n this.m_lcC = this.m_bodyC.m_sweep.localCenter;\n this.m_lcD = this.m_bodyD.m_sweep.localCenter;\n this.m_mA = this.m_bodyA.m_invMass;\n this.m_mB = this.m_bodyB.m_invMass;\n this.m_mC = this.m_bodyC.m_invMass;\n this.m_mD = this.m_bodyD.m_invMass;\n this.m_iA = this.m_bodyA.m_invI;\n this.m_iB = this.m_bodyB.m_invI;\n this.m_iC = this.m_bodyC.m_invI;\n this.m_iD = this.m_bodyD.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const aC = this.m_bodyC.c_position.a;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n\n const aD = this.m_bodyD.c_position.a;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n this.m_mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n this.m_JvAC = Vec2.zero();\n this.m_JwA = 1.0;\n this.m_JwC = 1.0;\n this.m_mass += this.m_iA + this.m_iC;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n this.m_JvAC = u;\n this.m_JwC = Vec2.crossVec2Vec2(rC, u);\n this.m_JwA = Vec2.crossVec2Vec2(rA, u);\n this.m_mass += this.m_mC + this.m_mA + this.m_iC * this.m_JwC * this.m_JwC + this.m_iA * this.m_JwA * this.m_JwA;\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n this.m_JvBD = Vec2.zero();\n this.m_JwB = this.m_ratio;\n this.m_JwD = this.m_ratio;\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD); // Vec2\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD); // Vec2\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB); // Vec2\n this.m_JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n this.m_JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n this.m_JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n this.m_mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD * this.m_JwD * this.m_JwD + this.m_iB * this.m_JwB * this.m_JwB;\n }\n\n // Compute effective mass.\n this.m_mass = this.m_mass > 0.0 ? 1.0 / this.m_mass : 0.0;\n\n if (step.warmStarting) {\n vA.addMul(this.m_mA * this.m_impulse, this.m_JvAC);\n wA += this.m_iA * this.m_impulse * this.m_JwA;\n\n vB.addMul(this.m_mB * this.m_impulse, this.m_JvBD);\n wB += this.m_iB * this.m_impulse * this.m_JwB;\n\n vC.subMul(this.m_mC * this.m_impulse, this.m_JvAC);\n wC -= this.m_iC * this.m_impulse * this.m_JwC;\n\n vD.subMul(this.m_mD * this.m_impulse, this.m_JvBD);\n wD -= this.m_iD * this.m_impulse * this.m_JwD;\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n const vC = this.m_bodyC.c_velocity.v;\n let wC = this.m_bodyC.c_velocity.w;\n const vD = this.m_bodyD.c_velocity.v;\n let wD = this.m_bodyD.c_velocity.w;\n\n let Cdot = Vec2.dot(this.m_JvAC, vA) - Vec2.dot(this.m_JvAC, vC)\n + Vec2.dot(this.m_JvBD, vB) - Vec2.dot(this.m_JvBD, vD); // float\n Cdot += (this.m_JwA * wA - this.m_JwC * wC)\n + (this.m_JwB * wB - this.m_JwD * wD);\n\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n vA.addMul(this.m_mA * impulse, this.m_JvAC);\n wA += this.m_iA * impulse * this.m_JwA;\n vB.addMul(this.m_mB * impulse, this.m_JvBD);\n wB += this.m_iB * impulse * this.m_JwB;\n vC.subMul(this.m_mC * impulse, this.m_JvAC);\n wC -= this.m_iC * impulse * this.m_JwC;\n vD.subMul(this.m_mD * impulse, this.m_JvBD);\n wD -= this.m_iD * impulse * this.m_JwD;\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n this.m_bodyC.c_velocity.v.setVec2(vC);\n this.m_bodyC.c_velocity.w = wC;\n this.m_bodyD.c_velocity.v.setVec2(vD);\n this.m_bodyD.c_velocity.w = wD;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n const cC = this.m_bodyC.c_position.c;\n let aC = this.m_bodyC.c_position.a;\n const cD = this.m_bodyD.c_position.c;\n let aD = this.m_bodyD.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n const qC = Rot.neo(aC);\n const qD = Rot.neo(aD);\n\n const linearError = 0.0;\n\n let coordinateA: number;\n let coordinateB: number;\n\n let JvAC: Vec2;\n let JvBD: Vec2;\n let JwA: number;\n let JwB: number;\n let JwC: number;\n let JwD: number;\n let mass = 0.0;\n\n if (this.m_type1 == RevoluteJoint.TYPE) {\n JvAC = Vec2.zero();\n JwA = 1.0;\n JwC = 1.0;\n mass += this.m_iA + this.m_iC;\n\n coordinateA = aA - aC - this.m_referenceAngleA;\n } else {\n const u = Rot.mulVec2(qC, this.m_localAxisC); // Vec2\n const rC = Rot.mulSub(qC, this.m_localAnchorC, this.m_lcC); // Vec2\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_lcA); // Vec2\n JvAC = u;\n JwC = Vec2.crossVec2Vec2(rC, u);\n JwA = Vec2.crossVec2Vec2(rA, u);\n mass += this.m_mC + this.m_mA + this.m_iC * JwC * JwC + this.m_iA * JwA * JwA;\n\n const pC = Vec2.sub(this.m_localAnchorC, this.m_lcC); // Vec2\n const pA = Rot.mulTVec2(qC, Vec2.add(rA, Vec2.sub(cA, cC))); // Vec2\n coordinateA = Vec2.dot(Vec2.sub(pA, pC), this.m_localAxisC);\n }\n\n if (this.m_type2 == RevoluteJoint.TYPE) {\n JvBD = Vec2.zero();\n JwB = this.m_ratio;\n JwD = this.m_ratio;\n mass += this.m_ratio * this.m_ratio * (this.m_iB + this.m_iD);\n\n coordinateB = aB - aD - this.m_referenceAngleB;\n } else {\n const u = Rot.mulVec2(qD, this.m_localAxisD);\n const rD = Rot.mulSub(qD, this.m_localAnchorD, this.m_lcD);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_lcB);\n JvBD = Vec2.mulNumVec2(this.m_ratio, u);\n JwD = this.m_ratio * Vec2.crossVec2Vec2(rD, u);\n JwB = this.m_ratio * Vec2.crossVec2Vec2(rB, u);\n mass += this.m_ratio * this.m_ratio * (this.m_mD + this.m_mB) + this.m_iD\n * JwD * JwD + this.m_iB * JwB * JwB;\n\n const pD = Vec2.sub(this.m_localAnchorD, this.m_lcD); // Vec2\n const pB = Rot.mulTVec2(qD, Vec2.add(rB, Vec2.sub(cB, cD))); // Vec2\n coordinateB = Vec2.dot(pB, this.m_localAxisD)\n - Vec2.dot(pD, this.m_localAxisD);\n }\n\n const C = (coordinateA + this.m_ratio * coordinateB) - this.m_constant; // float\n\n let impulse = 0.0; // float\n if (mass > 0.0) {\n impulse = -C / mass;\n }\n\n cA.addMul(this.m_mA * impulse, JvAC);\n aA += this.m_iA * impulse * JwA;\n cB.addMul(this.m_mB * impulse, JvBD);\n aB += this.m_iB * impulse * JwB;\n cC.subMul(this.m_mC * impulse, JvAC);\n aC -= this.m_iC * impulse * JwC;\n cD.subMul(this.m_mD * impulse, JvBD);\n aD -= this.m_iD * impulse * JwD;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n this.m_bodyC.c_position.c.setVec2(cC);\n this.m_bodyC.c_position.a = aC;\n this.m_bodyD.c_position.c.setVec2(cD);\n this.m_bodyD.c_position.a = aD;\n\n // TODO_ERIN not implemented\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Motor joint definition.\n */\nexport interface MotorJointOpt extends JointOpt {\n /**\n * The bodyB angle minus bodyA angle in radians.\n */\n angularOffset?: number;\n /**\n * The maximum motor force in N.\n */\n maxForce?: number;\n /**\n * The maximum motor torque in N-m.\n */\n maxTorque?: number;\n /**\n * Position correction factor in the range [0,1].\n */\n correctionFactor?: number;\n /**\n * Position of bodyB minus the position of bodyA, in bodyA's frame, in meters.\n */\n linearOffset?: Vec2;\n}\n/**\n * Motor joint definition.\n */\nexport interface MotorJointDef extends JointDef, MotorJointOpt {\n}\n\nconst DEFAULTS = {\n maxForce : 1.0,\n maxTorque : 1.0,\n correctionFactor : 0.3\n};\n\n/**\n * A motor joint is used to control the relative motion between two bodies. A\n * typical usage is to control the movement of a dynamic body with respect to\n * the ground.\n */\nexport class MotorJoint extends Joint {\n static TYPE = 'motor-joint' as const;\n\n /** @internal */ m_type: 'motor-joint';\n /** @internal */ m_linearOffset: Vec2;\n /** @internal */ m_angularOffset: number;\n /** @internal */ m_linearImpulse: Vec2;\n /** @internal */ m_angularImpulse: number;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_maxTorque: number;\n /** @internal */ m_correctionFactor: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_linearError: Vec2;\n /** @internal */ m_angularError: number;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_linearMass: Mat22;\n /** @internal */ m_angularMass: number;\n\n constructor(def: MotorJointDef);\n constructor(def: MotorJointOpt, bodyA: Body, bodyB: Body);\n constructor(def: MotorJointDef | MotorJointOpt, bodyA?: Body, bodyB?: Body) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof MotorJoint)) {\n return new MotorJoint(def, bodyA, bodyB);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MotorJoint.TYPE;\n\n this.m_linearOffset = Math.isFinite(def.linearOffset) ? def.linearOffset : bodyA.getLocalPoint(bodyB.getPosition());\n this.m_angularOffset = Math.isFinite(def.angularOffset) ? def.angularOffset : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_linearImpulse = Vec2.zero();\n this.m_angularImpulse = 0.0;\n\n this.m_maxForce = def.maxForce;\n this.m_maxTorque = def.maxTorque;\n this.m_correctionFactor = def.correctionFactor;\n\n // Point-to-point constraint\n // Cdot = v2 - v1\n // = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n maxForce: this.m_maxForce,\n maxTorque: this.m_maxTorque,\n correctionFactor: this.m_correctionFactor,\n\n linearOffset: this.m_linearOffset,\n angularOffset: this.m_angularOffset,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MotorJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new MotorJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {}): void {\n }\n\n /**\n * Set the maximum friction force in N.\n */\n setMaxForce(force: number): void {\n _ASSERT && console.assert(Math.isFinite(force) && force >= 0.0);\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum friction force in N.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the maximum friction torque in N*m.\n */\n setMaxTorque(torque: number): void {\n _ASSERT && console.assert(Math.isFinite(torque) && torque >= 0.0);\n this.m_maxTorque = torque;\n }\n\n /**\n * Get the maximum friction torque in N*m.\n */\n getMaxTorque(): number {\n return this.m_maxTorque;\n }\n\n /**\n * Set the position correction factor in the range [0,1].\n */\n setCorrectionFactor(factor: number): void {\n _ASSERT && console.assert(Math.isFinite(factor) && 0.0 <= factor && factor <= 1.0);\n this.m_correctionFactor = factor;\n }\n\n /**\n * Get the position correction factor in the range [0,1].\n */\n getCorrectionFactor(): number {\n return this.m_correctionFactor;\n }\n\n /**\n * Set/get the target linear offset, in frame A, in meters.\n */\n setLinearOffset(linearOffset: Vec2): void {\n if (linearOffset.x != this.m_linearOffset.x\n || linearOffset.y != this.m_linearOffset.y) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_linearOffset = linearOffset;\n }\n }\n\n getLinearOffset(): Vec2 {\n return this.m_linearOffset;\n }\n\n /**\n * Set/get the target angular offset, in radians.\n */\n setAngularOffset(angularOffset: number): void {\n if (angularOffset != this.m_angularOffset) {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_angularOffset = angularOffset;\n }\n }\n\n getAngularOffset(): number {\n return this.m_angularOffset;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getPosition();\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getPosition();\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_linearImpulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_angularImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective mass matrix.\n this.m_rA = Rot.mulVec2(qA, Vec2.neg(this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.neg(this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat22();\n K.ex.x = mA + mB + iA * this.m_rA.y * this.m_rA.y + iB * this.m_rB.y * this.m_rB.y;\n K.ex.y = -iA * this.m_rA.x * this.m_rA.y - iB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = mA + mB + iA * this.m_rA.x * this.m_rA.x + iB * this.m_rB.x * this.m_rB.x;\n\n this.m_linearMass = K.getInverse();\n\n this.m_angularMass = iA + iB;\n if (this.m_angularMass > 0.0) {\n this.m_angularMass = 1.0 / this.m_angularMass;\n }\n\n this.m_linearError = Vec2.zero();\n this.m_linearError.addCombine(1, cB, 1, this.m_rB);\n this.m_linearError.subCombine(1, cA, 1, this.m_rA);\n this.m_linearError.sub(Rot.mulVec2(qA, this.m_linearOffset));\n\n this.m_angularError = aB - aA - this.m_angularOffset;\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_linearImpulse.mul(step.dtRatio);\n this.m_angularImpulse *= step.dtRatio;\n\n const P = Vec2.neo(this.m_linearImpulse.x, this.m_linearImpulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_angularImpulse);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_angularImpulse);\n\n } else {\n this.m_linearImpulse.setZero();\n this.m_angularImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const h = step.dt;\n const inv_h = step.inv_dt;\n\n // Solve angular friction\n {\n const Cdot = wB - wA + inv_h * this.m_correctionFactor * this.m_angularError;\n let impulse = -this.m_angularMass * Cdot;\n\n const oldImpulse = this.m_angularImpulse;\n const maxImpulse = h * this.m_maxTorque;\n this.m_angularImpulse = Math.clamp(this.m_angularImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_angularImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve linear friction\n {\n const Cdot = Vec2.zero();\n Cdot.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA));\n Cdot.addMul(inv_h * this.m_correctionFactor, this.m_linearError);\n\n let impulse = Vec2.neg(Mat22.mulVec2(this.m_linearMass, Cdot));\n const oldImpulse = Vec2.clone(this.m_linearImpulse);\n this.m_linearImpulse.add(impulse);\n\n const maxImpulse = h * this.m_maxForce;\n\n this.m_linearImpulse.clamp(maxImpulse);\n\n impulse = Vec2.sub(this.m_linearImpulse, oldImpulse);\n\n vA.subMul(mA, impulse);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, impulse);\n\n vB.addMul(mB, impulse);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { math as Math } from '../../common/Math';\nimport { Vec2, Vec2Value } from '../../common/Vec2';\nimport { Mat22 } from '../../common/Mat22';\nimport { Rot } from '../../common/Rot';\nimport { Transform } from '../../common/Transform';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointOpt extends JointOpt {\n /**\n * [maxForce = 0.0] The maximum constraint force that can be exerted to move\n * the candidate body. Usually you will express as some multiple of the\n * weight (multiplier * mass * gravity).\n */\n maxForce?: number;\n /**\n * [frequencyHz = 5.0] The response speed.\n */\n frequencyHz?: number;\n /**\n * [dampingRatio = 0.7] The damping ratio. 0 = no damping, 1 = critical\n * damping.\n */\n dampingRatio?: number;\n}\n/**\n * Mouse joint definition. This requires a world target point, tuning\n * parameters, and the time step.\n */\nexport interface MouseJointDef extends JointDef, MouseJointOpt {\n /**\n * The initial world target point. This is assumed to coincide with the body\n * anchor initially.\n */\n target: Vec2Value;\n}\n\nconst DEFAULTS = {\n maxForce : 0.0,\n frequencyHz : 5.0,\n dampingRatio : 0.7\n};\n\n/**\n * A mouse joint is used to make a point on a body track a specified world\n * point. This a soft constraint with a maximum force. This allows the\n * constraint to stretch and without applying huge forces.\n *\n * NOTE: this joint is not documented in the manual because it was developed to\n * be used in the testbed. If you want to learn how to use the mouse joint, look\n * at the testbed.\n */\nexport class MouseJoint extends Joint {\n static TYPE = 'mouse-joint' as const;\n\n /** @internal */ m_type: 'mouse-joint';\n /** @internal */ m_targetA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_maxForce: number;\n /** @internal */ m_impulse: Vec2;\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n /** @internal */ m_beta: number;\n /** @internal */ m_gamma: number;\n // Solver temp\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat22;\n /** @internal */ m_C: Vec2;\n\n constructor(def: MouseJointDef);\n constructor(def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2);\n constructor(def: MouseJointDef, bodyA?: Body, bodyB?: Body, target?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof MouseJoint)) {\n return new MouseJoint(def, bodyA, bodyB, target);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = MouseJoint.TYPE;\n\n _ASSERT && console.assert(Math.isFinite(def.maxForce) && def.maxForce >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.frequencyHz) && def.frequencyHz >= 0.0);\n _ASSERT && console.assert(Math.isFinite(def.dampingRatio) && def.dampingRatio >= 0.0);\n\n if (Vec2.isValid(target)) {\n this.m_targetA = Vec2.clone(target);\n } else if (Vec2.isValid(def.target)) {\n this.m_targetA = Vec2.clone(def.target);\n } else {\n this.m_targetA = Vec2.zero();\n }\n\n this.m_localAnchorB = Transform.mulTVec2(bodyB.getTransform(), this.m_targetA);\n\n this.m_maxForce = def.maxForce;\n this.m_impulse = Vec2.zero();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_beta = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rB = Vec2.zero();\n this.m_localCenterB = Vec2.zero();\n this.m_invMassB = 0.0;\n this.m_invIB = 0.0;\n this.m_mass = new Mat22();\n this.m_C = Vec2.zero();\n\n // p = attached point, m = mouse point\n // C = p - m\n // Cdot = v\n // = v + cross(w, r)\n // J = [I r_skew]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n target: this.m_targetA,\n maxForce: this.m_maxForce,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n _localAnchorB: this.m_localAnchorB,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): MouseJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n data.target = Vec2.clone(data.target);\n const joint = new MouseJoint(data);\n if (data._localAnchorB) {\n joint.m_localAnchorB = data._localAnchorB;\n }\n return joint;\n }\n\n /**\n * Use this to update the target point.\n */\n setTarget(target: Vec2Value): void {\n if (this.m_bodyB.isAwake() == false) {\n this.m_bodyB.setAwake(true);\n }\n this.m_targetA = Vec2.clone(target);\n }\n\n getTarget(): Vec2 {\n return this.m_targetA;\n }\n\n /**\n * Set the maximum force in Newtons.\n */\n setMaxForce(force: number): void {\n this.m_maxForce = force;\n }\n\n /**\n * Get the maximum force in Newtons.\n */\n getMaxForce(): number {\n return this.m_maxForce;\n }\n\n /**\n * Set the frequency in Hertz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get the frequency in Hertz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set the damping ratio (dimensionless).\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get the damping ratio (dimensionless).\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return Vec2.clone(this.m_targetA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(inv_dt, this.m_impulse);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * 0.0;\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n */\n shiftOrigin(newOrigin: Vec2Value): void {\n this.m_targetA.sub(newOrigin);\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const position = this.m_bodyB.c_position;\n const velocity = this.m_bodyB.c_velocity;\n\n const cB = position.c;\n const aB = position.a;\n const vB = velocity.v;\n let wB = velocity.w;\n\n const qB = Rot.neo(aB);\n\n const mass = this.m_bodyB.getMass();\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz;\n\n // Damping coefficient\n const d = 2.0 * mass * this.m_dampingRatio * omega;\n\n // Spring stiffness\n const k = mass * (omega * omega);\n\n // magic formulas\n // gamma has units of inverse mass.\n // beta has units of inverse time.\n const h = step.dt;\n _ASSERT && console.assert(d + h * k > Math.EPSILON);\n this.m_gamma = h * (d + h * k);\n if (this.m_gamma != 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n this.m_beta = h * k * this.m_gamma;\n\n // Compute the effective mass matrix.\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) *\n // invI2 * skew(r2)]\n // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y\n // -r1.x*r1.y]\n // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x]\n const K = new Mat22();\n K.ex.x = this.m_invMassB + this.m_invIB * this.m_rB.y * this.m_rB.y\n + this.m_gamma;\n K.ex.y = -this.m_invIB * this.m_rB.x * this.m_rB.y;\n K.ey.x = K.ex.y;\n K.ey.y = this.m_invMassB + this.m_invIB * this.m_rB.x * this.m_rB.x\n + this.m_gamma;\n\n this.m_mass = K.getInverse();\n\n this.m_C.setVec2(cB);\n this.m_C.addCombine(1, this.m_rB, -1, this.m_targetA);\n this.m_C.mul(this.m_beta);\n\n // Cheat with some damping\n wB *= 0.98;\n\n if (step.warmStarting) {\n this.m_impulse.mul(step.dtRatio);\n vB.addMul(this.m_invMassB, this.m_impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, this.m_impulse);\n\n } else {\n this.m_impulse.setZero();\n }\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const velocity = this.m_bodyB.c_velocity;\n const vB = Vec2.clone(velocity.v);\n let wB = velocity.w;\n\n // Cdot = v + cross(w, r)\n\n const Cdot = Vec2.crossNumVec2(wB, this.m_rB);\n Cdot.add(vB);\n\n Cdot.addCombine(1, this.m_C, this.m_gamma, this.m_impulse);\n Cdot.neg();\n\n let impulse = Mat22.mulVec2(this.m_mass, Cdot);\n\n const oldImpulse = Vec2.clone(this.m_impulse);\n this.m_impulse.add(impulse);\n const maxImpulse = step.dt * this.m_maxForce;\n this.m_impulse.clamp(maxImpulse);\n impulse = Vec2.sub(this.m_impulse, oldImpulse);\n\n vB.addMul(this.m_invMassB, impulse);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, impulse);\n\n velocity.v.setVec2(vB);\n velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n return true;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\n// tslint:disable-next-line:no-empty-interface\nexport interface PulleyJointOpt extends JointOpt {\n}\n/**\n * Pulley joint definition. This requires two ground anchors, two dynamic body\n * anchor points, and a pulley ratio.\n */\nexport interface PulleyJointDef extends JointDef, PulleyJointOpt {\n /**\n * The first ground anchor in world coordinates. This point never moves.\n */\n groundAnchorA: Vec2;\n /**\n * The second ground anchor in world coordinates. This point never moves.\n */\n groundAnchorB: Vec2;\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The reference length for the segment attached to bodyA.\n */\n lengthA: number;\n /**\n * The reference length for the segment attached to bodyB.\n */\n lengthB: number;\n /**\n * The pulley ratio, used to simulate a block-and-tackle.\n */\n ratio: number;\n}\n\nconst DEFAULTS = {\n collideConnected : true\n};\n\n/**\n * The pulley joint is connected to two bodies and two fixed ground points. The\n * pulley supports a ratio such that: length1 + ratio * length2 <= constant\n *\n * Yes, the force transmitted is scaled by the ratio.\n *\n * Warning: the pulley joint can get a bit squirrelly by itself. They often work\n * better when combined with prismatic joints. You should also cover the the\n * anchor points with static shapes to prevent one side from going to zero\n * length.\n */\nexport class PulleyJoint extends Joint {\n static TYPE = 'pulley-joint' as const;\n // static MIN_PULLEY_LENGTH: number = 2.0; // TODO where this is used?\n\n /** @internal */ m_type: 'pulley-joint';\n /** @internal */ m_groundAnchorA: Vec2;\n /** @internal */ m_groundAnchorB: Vec2;\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_lengthA: number;\n /** @internal */ m_lengthB: number;\n /** @internal */ m_ratio: number;\n /** @internal */ m_constant: number;\n /** @internal */ m_impulse: number;\n\n // Solver temp\n /** @internal */ m_uA: Vec2;\n /** @internal */ m_uB: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: number;\n\n constructor(def: PulleyJointDef);\n constructor(def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number);\n constructor(def: PulleyJointDef, bodyA?: Body, bodyB?: Body, groundA?: Vec2, groundB?: Vec2, anchorA?: Vec2, anchorB?: Vec2, ratio?: number) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof PulleyJoint)) {\n return new PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = PulleyJoint.TYPE;\n this.m_groundAnchorA = groundA ? groundA : def.groundAnchorA || Vec2.neo(-1.0, 1.0);\n this.m_groundAnchorB = groundB ? groundB : def.groundAnchorB || Vec2.neo(1.0, 1.0);\n this.m_localAnchorA = anchorA ? bodyA.getLocalPoint(anchorA) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchorB ? bodyB.getLocalPoint(anchorB) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n this.m_lengthA = Math.isFinite(def.lengthA) ? def.lengthA : Vec2.distance(anchorA, groundA);\n this.m_lengthB = Math.isFinite(def.lengthB) ? def.lengthB : Vec2.distance(anchorB, groundB);\n this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio;\n\n _ASSERT && console.assert(ratio > Math.EPSILON);\n\n this.m_constant = this.m_lengthA + this.m_ratio * this.m_lengthB;\n\n this.m_impulse = 0.0;\n\n // Pulley:\n // length1 = norm(p1 - s1)\n // length2 = norm(p2 - s2)\n // C0 = (length1 + ratio * length2)_initial\n // C = C0 - (length1 + ratio * length2)\n // u1 = (p1 - s1) / norm(p1 - s1)\n // u2 = (p2 - s2) / norm(p2 - s2)\n // Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2))\n // J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)]\n // K = J * invM * JT\n // = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 *\n // cross(r2, u2)^2)\n }\n\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n groundAnchorA: this.m_groundAnchorA,\n groundAnchorB: this.m_groundAnchorB,\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n lengthA: this.m_lengthA,\n lengthB: this.m_lengthB,\n ratio: this.m_ratio,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): PulleyJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new PulleyJoint(data);\n return joint;\n }\n\n /**\n * Get the first ground anchor.\n */\n getGroundAnchorA(): Vec2 {\n return this.m_groundAnchorA;\n }\n\n /**\n * Get the second ground anchor.\n */\n getGroundAnchorB(): Vec2 {\n return this.m_groundAnchorB;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getLengthA(): number {\n return this.m_lengthA;\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getLengthB(): number {\n return this.m_lengthB;\n }\n\n /**\n * Get the pulley ratio.\n */\n getRatio(): number {\n return this.m_ratio;\n }\n\n /**\n * Get the current length of the segment attached to bodyA.\n */\n getCurrentLengthA(): number {\n const p = this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n const s = this.m_groundAnchorA;\n return Vec2.distance(p, s);\n }\n\n /**\n * Get the current length of the segment attached to bodyB.\n */\n getCurrentLengthB(): number {\n const p = this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n const s = this.m_groundAnchorB;\n return Vec2.distance(p, s);\n }\n\n /**\n * Shift the origin for any points stored in world coordinates.\n *\n * @param newOrigin\n */\n shiftOrigin(newOrigin: Vec2): void {\n this.m_groundAnchorA.sub(newOrigin);\n this.m_groundAnchorB.sub(newOrigin);\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_uB).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n this.m_uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n this.m_uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = this.m_uA.length();\n const lengthB = this.m_uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n this.m_uA.mul(1.0 / lengthA);\n } else {\n this.m_uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n this.m_uB.mul(1.0 / lengthB);\n } else {\n this.m_uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(this.m_rA, this.m_uA); // float\n const ruB = Vec2.crossVec2Vec2(this.m_rB, this.m_uB); // float\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n this.m_mass = mA + this.m_ratio * this.m_ratio * mB;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support variable time steps.\n this.m_impulse *= step.dtRatio;\n\n // Warm starting.\n const PA = Vec2.mulNumVec2(-this.m_impulse, this.m_uA);\n const PB = Vec2.mulNumVec2(-this.m_ratio * this.m_impulse, this.m_uB);\n\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const vpA = Vec2.add(vA, Vec2.crossNumVec2(wA, this.m_rA));\n const vpB = Vec2.add(vB, Vec2.crossNumVec2(wB, this.m_rB));\n\n const Cdot = -Vec2.dot(this.m_uA, vpA) - this.m_ratio\n * Vec2.dot(this.m_uB, vpB); // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const PA = Vec2.mulNumVec2(-impulse, this.m_uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, this.m_uB); // Vec2\n vA.addMul(this.m_invMassA, PA);\n wA += this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, PA);\n vB.addMul(this.m_invMassB, PB);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, PB);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // Get the pulley axes.\n const uA = Vec2.sub(Vec2.add(cA, this.m_rA), this.m_groundAnchorA);\n const uB = Vec2.sub(Vec2.add(cB, this.m_rB), this.m_groundAnchorB);\n\n const lengthA = uA.length();\n const lengthB = uB.length();\n\n if (lengthA > 10.0 * Settings.linearSlop) {\n uA.mul(1.0 / lengthA);\n } else {\n uA.setZero();\n }\n\n if (lengthB > 10.0 * Settings.linearSlop) {\n uB.mul(1.0 / lengthB);\n } else {\n uB.setZero();\n }\n\n // Compute effective mass.\n const ruA = Vec2.crossVec2Vec2(rA, uA);\n const ruB = Vec2.crossVec2Vec2(rB, uB);\n\n const mA = this.m_invMassA + this.m_invIA * ruA * ruA; // float\n const mB = this.m_invMassB + this.m_invIB * ruB * ruB; // float\n\n let mass = mA + this.m_ratio * this.m_ratio * mB; // float\n\n if (mass > 0.0) {\n mass = 1.0 / mass;\n }\n\n const C = this.m_constant - lengthA - this.m_ratio * lengthB; // float\n const linearError = Math.abs(C); // float\n\n const impulse = -mass * C; // float\n\n const PA = Vec2.mulNumVec2(-impulse, uA); // Vec2\n const PB = Vec2.mulNumVec2(-this.m_ratio * impulse, uB); // Vec2\n\n cA.addMul(this.m_invMassA, PA);\n aA += this.m_invIA * Vec2.crossVec2Vec2(rA, PA);\n cB.addMul(this.m_invMassB, PB);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, PB);\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return linearError < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\nconst inactiveLimit = 0;\nconst atLowerLimit = 1;\nconst atUpperLimit = 2;\nconst equalLimits = 3;\n\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointOpt extends JointOpt {\n /**\n * The maximum length of the rope.\n * Warning: this must be larger than linearSlop or the joint will have no effect.\n */\n maxLength?: number;\n}\n/**\n * Rope joint definition. This requires two body anchor points and a maximum\n * lengths. Note: by default the connected objects will not collide. see\n * collideConnected in JointDef.\n */\nexport interface RopeJointDef extends JointDef, RopeJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n maxLength : 0.0,\n};\n\n/**\n * A rope joint enforces a maximum distance between two points on two bodies. It\n * has no other effect.\n *\n * Warning: if you attempt to change the maximum length during the simulation\n * you will get some non-physical behavior.\n *\n * A model that would allow you to dynamically modify the length would have some\n * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you\n * want to dynamically control length.\n */\nexport class RopeJoint extends Joint {\n static TYPE = 'rope-joint' as const;\n\n /** @internal */ m_type: 'rope-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n\n /** @internal */ m_maxLength: number;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_length: number;\n /** @internal */ m_state: number; // TODO enum\n\n // Solver temp\n /** @internal */ m_u: Vec2;\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n constructor(def: RopeJointDef);\n constructor(def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: RopeJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof RopeJoint)) {\n return new RopeJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = RopeJoint.TYPE;\n this.m_localAnchorA = anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.neo(-1.0, 0.0);\n this.m_localAnchorB = anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.neo(1.0, 0.0);\n\n this.m_maxLength = def.maxLength;\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_length = 0.0;\n this.m_state = inactiveLimit;\n\n // Limit:\n // C = norm(pB - pA) - L\n // u = (pB - pA) / norm(pB - pA)\n // Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA))\n // J = [-u -cross(rA, u) u cross(rB, u)]\n // K = J * invM * JT\n // = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n maxLength: this.m_maxLength,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): RopeJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new RopeJoint(data);\n return joint;\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Set the maximum length of the rope.\n */\n setMaxLength(length: number): void {\n this.m_maxLength = length;\n }\n\n /**\n * Get the maximum length of the rope.\n */\n getMaxLength(): number {\n return this.m_maxLength;\n }\n\n getLimitState(): number {\n // TODO LimitState\n return this.m_state;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.mulNumVec2(this.m_impulse, this.m_u).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return 0.0;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n this.m_rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n this.m_u = Vec2.zero();\n this.m_u.addCombine(1, cB, 1, this.m_rB);\n this.m_u.subCombine(1, cA, 1, this.m_rA); // Vec2\n\n this.m_length = this.m_u.length();\n\n const C = this.m_length - this.m_maxLength; // float\n if (C > 0.0) {\n this.m_state = atUpperLimit;\n } else {\n this.m_state = inactiveLimit;\n }\n\n if (this.m_length > Settings.linearSlop) {\n this.m_u.mul(1.0 / this.m_length);\n } else {\n this.m_u.setZero();\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n return;\n }\n\n // Compute effective mass.\n const crA = Vec2.crossVec2Vec2(this.m_rA, this.m_u); // float\n const crB = Vec2.crossVec2Vec2(this.m_rB, this.m_u); // float\n const invMass = this.m_invMassA + this.m_invIA * crA * crA + this.m_invMassB\n + this.m_invIB * crB * crB; // float\n\n this.m_mass = invMass != 0.0 ? 1.0 / invMass : 0.0;\n\n if (step.warmStarting) {\n // Scale the impulse to support a variable time step.\n this.m_impulse *= step.dtRatio;\n\n const P = Vec2.mulNumVec2(this.m_impulse, this.m_u);\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n } else {\n this.m_impulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Cdot = dot(u, v + cross(w, r))\n const vpA = Vec2.addCrossNumVec2(vA, wA, this.m_rA); // Vec2\n const vpB = Vec2.addCrossNumVec2(vB, wB, this.m_rB); // Vec2\n const C = this.m_length - this.m_maxLength; // float\n let Cdot = Vec2.dot(this.m_u, Vec2.sub(vpB, vpA)); // float\n\n // Predictive constraint.\n if (C < 0.0) {\n Cdot += step.inv_dt * C;\n }\n\n let impulse = -this.m_mass * Cdot; // float\n const oldImpulse = this.m_impulse; // float\n this.m_impulse = Math.min(0.0, this.m_impulse + impulse);\n impulse = this.m_impulse - oldImpulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_u); // Vec2\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * Vec2.crossVec2Vec2(this.m_rA, P);\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * Vec2.crossVec2Vec2(this.m_rB, P);\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c; // Vec2\n let aA = this.m_bodyA.c_position.a; // float\n const cB = this.m_bodyB.c_position.c; // Vec2\n let aB = this.m_bodyB.c_position.a; // float\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulSub(qA, this.m_localAnchorA, this.m_localCenterA);\n const rB = Rot.mulSub(qB, this.m_localAnchorB, this.m_localCenterB);\n const u = Vec2.zero();\n u.addCombine(1, cB, 1, rB);\n u.subCombine(1, cA, 1, rA); // Vec2\n\n const length = u.normalize(); // float\n let C = length - this.m_maxLength; // float\n\n C = Math.clamp(C, 0.0, Settings.maxLinearCorrection);\n\n const impulse = -this.m_mass * C; // float\n const P = Vec2.mulNumVec2(impulse, u); // Vec2\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * Vec2.crossVec2Vec2(rA, P);\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * Vec2.crossVec2Vec2(rB, P);\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return length - this.m_maxLength < Settings.linearSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Vec3 } from '../../common/Vec3';\nimport { Mat33 } from '../../common/Mat33';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n *\n * @prop {float} frequencyHz\n * @prop {float} dampingRatio\n *\n * @prop {Vec2} localAnchorA\n * @prop {Vec2} localAnchorB\n * @prop {float} referenceAngle\n */\nexport interface WeldJointOpt extends JointOpt {\n /**\n * The mass-spring-damper frequency in Hertz. Rotation only. Disable softness\n * with a value of 0.\n */\n frequencyHz?: number;\n /**\n * The damping ratio. 0 = no damping, 1 = critical damping.\n */\n dampingRatio?: number;\n /**\n * The bodyB angle minus bodyA angle in the reference state (radians).\n */\n referenceAngle?: number;\n}\n/**\n * Weld joint definition. You need to specify local anchor points where they are\n * attached and the relative body angle. The position of the anchor points is\n * important for computing the reaction torque.\n */\nexport interface WeldJointDef extends JointDef, WeldJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n}\n\nconst DEFAULTS = {\n frequencyHz : 0.0,\n dampingRatio : 0.0,\n};\n\n/**\n * A weld joint essentially glues two bodies together. A weld joint may distort\n * somewhat because the island constraint solver is approximate.\n */\nexport class WeldJoint extends Joint {\n static TYPE = 'weld-joint' as const\n\n /** @internal */ m_type: 'weld-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_referenceAngle: number;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_impulse: Vec3;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_rA: Vec2;\n /** @internal */ m_rB: Vec2;\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n /** @internal */ m_mass: Mat33;\n\n constructor(def: WeldJointDef);\n constructor(def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2);\n constructor(def: WeldJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof WeldJoint)) {\n return new WeldJoint(def, bodyA, bodyB, anchor);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WeldJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n this.m_referenceAngle = Math.isFinite(def.referenceAngle) ? def.referenceAngle : bodyB.getAngle() - bodyA.getAngle();\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_impulse = new Vec3();\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Solver temp\n this.m_rA; // Vec2\n this.m_rB; // Vec2\n this.m_localCenterA; // Vec2\n this.m_localCenterB; // Vec2\n this.m_invMassA; // float\n this.m_invMassB; // float\n this.m_invIA; // float\n this.m_invIB; // float\n this.m_mass = new Mat33();\n\n // Point-to-point constraint\n // C = p2 - p1\n // Cdot = v2 - v1\n // / = v2 + cross(w2, r2) - v1 - cross(w1, r1)\n // J = [-I -r1_skew I r2_skew ]\n // Identity used:\n // w k % (rx i + ry j) = w * (-ry i + rx j)\n\n // Angle constraint\n // C = angle2 - angle1 - referenceAngle\n // Cdot = w2 - w1\n // J = [0 0 -1 0 0 1]\n // K = invI1 + invI2\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n referenceAngle: this.m_referenceAngle,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WeldJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WeldJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * Get the reference angle.\n */\n getReferenceAngle(): number {\n return this.m_referenceAngle;\n }\n\n /**\n * Set frequency in Hz.\n */\n setFrequency(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n /**\n * Get frequency in Hz.\n */\n getFrequency(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set damping ratio.\n */\n setDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n /**\n * Get damping ratio.\n */\n getDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.neo(this.m_impulse.x, this.m_impulse.y).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_impulse.z;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n this.m_rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n this.m_rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n // J = [-I -r1_skew I r2_skew]\n // [ 0 -1 0 1]\n // r_skew = [-ry; rx]\n\n // Matlab\n // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB]\n // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB]\n // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB]\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const K = new Mat33();\n K.ex.x = mA + mB + this.m_rA.y * this.m_rA.y * iA + this.m_rB.y * this.m_rB.y\n * iB;\n K.ey.x = -this.m_rA.y * this.m_rA.x * iA - this.m_rB.y * this.m_rB.x * iB;\n K.ez.x = -this.m_rA.y * iA - this.m_rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + this.m_rA.x * this.m_rA.x * iA + this.m_rB.x * this.m_rB.x\n * iB;\n K.ez.y = this.m_rA.x * iA + this.m_rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n K.getInverse22(this.m_mass);\n\n let invM = iA + iB; // float\n const m = invM > 0.0 ? 1.0 / invM : 0.0; // float\n\n const C = aB - aA - this.m_referenceAngle; // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const d = 2.0 * m * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = m * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (d + h * k);\n this.m_gamma = this.m_gamma != 0.0 ? 1.0 / this.m_gamma : 0.0;\n this.m_bias = C * h * k * this.m_gamma;\n\n invM += this.m_gamma;\n this.m_mass.ez.z = invM != 0.0 ? 1.0 / invM : 0.0;\n } else if (K.ez.z == 0.0) {\n K.getInverse22(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n } else {\n K.getSymInverse33(this.m_mass);\n this.m_gamma = 0.0;\n this.m_bias = 0.0;\n }\n\n if (step.warmStarting) {\n // Scale impulses to support a variable time step.\n this.m_impulse.mul(step.dtRatio);\n\n const P = Vec2.neo(this.m_impulse.x, this.m_impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + this.m_impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + this.m_impulse.z);\n\n } else {\n this.m_impulse.setZero();\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n if (this.m_frequencyHz > 0.0) {\n const Cdot2 = wB - wA; // float\n\n const impulse2 = -this.m_mass.ez.z\n * (Cdot2 + this.m_bias + this.m_gamma * this.m_impulse.z); // float\n this.m_impulse.z += impulse2;\n\n wA -= iA * impulse2;\n wB += iB * impulse2;\n\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n\n const impulse1 = Vec2.neg(Mat33.mulVec2(this.m_mass, Cdot1)); // Vec2\n this.m_impulse.x += impulse1.x;\n this.m_impulse.y += impulse1.y;\n\n const P = Vec2.clone(impulse1); // Vec2\n\n vA.subMul(mA, P);\n wA -= iA * Vec2.crossVec2Vec2(this.m_rA, P);\n\n vB.addMul(mB, P);\n wB += iB * Vec2.crossVec2Vec2(this.m_rB, P);\n } else {\n const Cdot1 = Vec2.zero();\n Cdot1.addCombine(1, vB, 1, Vec2.crossNumVec2(wB, this.m_rB));\n Cdot1.subCombine(1, vA, 1, Vec2.crossNumVec2(wA, this.m_rA)); // Vec2\n const Cdot2 = wB - wA; // float\n const Cdot = new Vec3(Cdot1.x, Cdot1.y, Cdot2); // Vec3\n\n const impulse = Vec3.neg(Mat33.mulVec3(this.m_mass, Cdot)); // Vec3\n this.m_impulse.add(impulse);\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n vA.subMul(mA, P);\n wA -= iA * (Vec2.crossVec2Vec2(this.m_rA, P) + impulse.z);\n\n vB.addMul(mB, P);\n wB += iB * (Vec2.crossVec2Vec2(this.m_rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_velocity.v = vA;\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v = vB;\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB;\n const iA = this.m_invIA;\n const iB = this.m_invIB;\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n\n let positionError: number;\n let angularError: number;\n\n const K = new Mat33();\n K.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB;\n K.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB;\n K.ez.x = -rA.y * iA - rB.y * iB;\n K.ex.y = K.ey.x;\n K.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB;\n K.ez.y = rA.x * iA + rB.x * iB;\n K.ex.z = K.ez.x;\n K.ey.z = K.ez.y;\n K.ez.z = iA + iB;\n\n if (this.m_frequencyHz > 0.0) {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA); // Vec2\n\n positionError = C1.length();\n angularError = 0.0;\n\n const P = Vec2.neg(K.solve22(C1)); // Vec2\n\n cA.subMul(mA, P);\n aA -= iA * Vec2.crossVec2Vec2(rA, P);\n\n cB.addMul(mB, P);\n aB += iB * Vec2.crossVec2Vec2(rB, P);\n } else {\n const C1 = Vec2.zero();\n C1.addCombine(1, cB, 1, rB);\n C1.subCombine(1, cA, 1, rA);\n\n const C2 = aB - aA - this.m_referenceAngle; // float\n\n positionError = C1.length();\n angularError = Math.abs(C2);\n\n const C = new Vec3(C1.x, C1.y, C2);\n\n let impulse = new Vec3();\n if (K.ez.z > 0.0) {\n impulse = Vec3.neg(K.solve33(C));\n } else {\n const impulse2 = Vec2.neg(K.solve22(C1));\n impulse.set(impulse2.x, impulse2.y, 0.0);\n }\n\n const P = Vec2.neo(impulse.x, impulse.y);\n\n cA.subMul(mA, P);\n aA -= iA * (Vec2.crossVec2Vec2(rA, P) + impulse.z);\n\n cB.addMul(mB, P);\n aB += iB * (Vec2.crossVec2Vec2(rB, P) + impulse.z);\n }\n\n this.m_bodyA.c_position.c = cA;\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c = cB;\n this.m_bodyB.c_position.a = aB;\n\n return positionError <= Settings.linearSlop && angularError <= Settings.angularSlop;\n }\n\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { options } from '../../util/options';\nimport { Settings } from '../../Settings';\nimport { math as Math } from '../../common/Math';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Joint, JointOpt, JointDef } from '../Joint';\nimport { Body } from '../Body';\nimport { TimeStep } from \"../Solver\";\n\n\nconst _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY;\n\n\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointOpt extends JointOpt {\n /**\n * Enable/disable the joint motor.\n */\n enableMotor?: boolean;\n /**\n * The maximum motor torque, usually in N-m.\n */\n maxMotorTorque?: number;\n /**\n * The desired motor speed in radians per second.\n */\n motorSpeed?: number;\n /**\n * Suspension frequency, zero indicates no suspension.\n */\n frequencyHz?: number;\n /**\n * Suspension damping ratio, one indicates critical damping.\n */\n dampingRatio?: number;\n}\n/**\n * Wheel joint definition. This requires defining a line of motion using an axis\n * and an anchor point. The definition uses local anchor points and a local axis\n * so that the initial configuration can violate the constraint slightly. The\n * joint translation is zero when the local anchor points coincide in world\n * space. Using local anchors and a local axis helps when saving and loading a\n * game.\n */\nexport interface WheelJointDef extends JointDef, WheelJointOpt {\n /**\n * The local anchor point relative to bodyA's origin.\n */\n localAnchorA: Vec2;\n /**\n * The local anchor point relative to bodyB's origin.\n */\n localAnchorB: Vec2;\n /**\n * The local translation axis in bodyA.\n */\n localAxisA: Vec2;\n}\n\nconst DEFAULTS = {\n enableMotor : false,\n maxMotorTorque : 0.0,\n motorSpeed : 0.0,\n frequencyHz : 2.0,\n dampingRatio : 0.7,\n};\n\n/**\n * A wheel joint. This joint provides two degrees of freedom: translation along\n * an axis fixed in bodyA and rotation in the plane. In other words, it is a\n * point to line constraint with a rotational motor and a linear spring/damper.\n * This joint is designed for vehicle suspensions.\n */\nexport class WheelJoint extends Joint {\n static TYPE = 'wheel-joint' as const;\n\n /** @internal */ m_type: 'wheel-joint';\n /** @internal */ m_localAnchorA: Vec2;\n /** @internal */ m_localAnchorB: Vec2;\n /** @internal */ m_localXAxisA: Vec2;\n /** @internal */ m_localYAxisA: Vec2;\n\n /** @internal */ m_mass: number;\n /** @internal */ m_impulse: number;\n /** @internal */ m_motorMass: number;\n /** @internal */ m_motorImpulse: number;\n /** @internal */ m_springMass: number;\n /** @internal */ m_springImpulse: number;\n\n /** @internal */ m_maxMotorTorque: number;\n /** @internal */ m_motorSpeed: number;\n /** @internal */ m_enableMotor: boolean;\n\n /** @internal */ m_frequencyHz: number;\n /** @internal */ m_dampingRatio: number;\n\n /** @internal */ m_bias: number;\n /** @internal */ m_gamma: number;\n\n // Solver temp\n /** @internal */ m_localCenterA: Vec2;\n /** @internal */ m_localCenterB: Vec2;\n /** @internal */ m_invMassA: number;\n /** @internal */ m_invMassB: number;\n /** @internal */ m_invIA: number;\n /** @internal */ m_invIB: number;\n\n /** @internal */ m_ax: Vec2 = Vec2.zero();\n /** @internal */ m_ay: Vec2 = Vec2.zero();\n /** @internal */ m_sAx: number;\n /** @internal */ m_sBx: number;\n /** @internal */ m_sAy: number;\n /** @internal */ m_sBy: number;\n\n constructor(def: WheelJointDef);\n constructor(def: WheelJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2);\n // @ts-ignore\n constructor(def: WheelJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) {\n // @ts-ignore\n if (_CONSTRUCTOR_FACTORY && !(this instanceof WheelJoint)) {\n return new WheelJoint(def, bodyA, bodyB, anchor, axis);\n }\n\n def = options(def, DEFAULTS);\n super(def, bodyA, bodyB);\n bodyA = this.m_bodyA;\n bodyB = this.m_bodyB;\n\n this.m_type = WheelJoint.TYPE;\n\n this.m_localAnchorA = Vec2.clone(anchor ? bodyA.getLocalPoint(anchor) : def.localAnchorA || Vec2.zero());\n this.m_localAnchorB = Vec2.clone(anchor ? bodyB.getLocalPoint(anchor) : def.localAnchorB || Vec2.zero());\n // @ts-ignore localAxis\n this.m_localXAxisA = Vec2.clone(axis ? bodyA.getLocalVector(axis) : def.localAxisA || def.localAxis || Vec2.neo(1.0, 0.0));\n this.m_localYAxisA = Vec2.crossNumVec2(1.0, this.m_localXAxisA);\n\n this.m_mass = 0.0;\n this.m_impulse = 0.0;\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n this.m_springMass = 0.0;\n this.m_springImpulse = 0.0;\n\n this.m_maxMotorTorque = def.maxMotorTorque;\n this.m_motorSpeed = def.motorSpeed;\n this.m_enableMotor = def.enableMotor;\n\n this.m_frequencyHz = def.frequencyHz;\n this.m_dampingRatio = def.dampingRatio;\n\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n\n // Linear constraint (point-to-line)\n // d = pB - pA = xB + rB - xA - rA\n // C = dot(ay, d)\n // Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA,\n // rA))\n // = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB,\n // ay), vB)\n // J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)]\n\n // Spring linear constraint\n // C = dot(ax, d)\n // Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) +\n // dot(cross(rB, ax), vB)\n // J = [-ax -cross(d+rA, ax) ax cross(rB, ax)]\n\n // Motor rotational constraint\n // Cdot = wB - wA\n // J = [0 0 -1 0 0 1]\n }\n\n /** @internal */\n _serialize(): object {\n return {\n type: this.m_type,\n bodyA: this.m_bodyA,\n bodyB: this.m_bodyB,\n collideConnected: this.m_collideConnected,\n\n enableMotor: this.m_enableMotor,\n maxMotorTorque: this.m_maxMotorTorque,\n motorSpeed: this.m_motorSpeed,\n frequencyHz: this.m_frequencyHz,\n dampingRatio: this.m_dampingRatio,\n\n localAnchorA: this.m_localAnchorA,\n localAnchorB: this.m_localAnchorB,\n localAxisA: this.m_localXAxisA,\n };\n }\n\n /** @internal */\n static _deserialize(data: any, world: any, restore: any): WheelJoint {\n data = {...data};\n data.bodyA = restore(Body, data.bodyA, world);\n data.bodyB = restore(Body, data.bodyB, world);\n const joint = new WheelJoint(data);\n return joint;\n }\n\n /** @internal */\n _setAnchors(def: {\n anchorA?: Vec2,\n localAnchorA?: Vec2,\n anchorB?: Vec2,\n localAnchorB?: Vec2,\n localAxisA?: Vec2,\n }): void {\n if (def.anchorA) {\n this.m_localAnchorA.setVec2(this.m_bodyA.getLocalPoint(def.anchorA));\n } else if (def.localAnchorA) {\n this.m_localAnchorA.setVec2(def.localAnchorA);\n }\n\n if (def.anchorB) {\n this.m_localAnchorB.setVec2(this.m_bodyB.getLocalPoint(def.anchorB));\n } else if (def.localAnchorB) {\n this.m_localAnchorB.setVec2(def.localAnchorB);\n }\n\n if (def.localAxisA) {\n this.m_localXAxisA.setVec2(def.localAxisA);\n this.m_localYAxisA.setVec2(Vec2.crossNumVec2(1.0, def.localAxisA));\n }\n }\n\n /**\n * The local anchor point relative to bodyA's origin.\n */\n getLocalAnchorA(): Vec2 {\n return this.m_localAnchorA;\n }\n\n /**\n * The local anchor point relative to bodyB's origin.\n */\n getLocalAnchorB(): Vec2 {\n return this.m_localAnchorB;\n }\n\n /**\n * The local joint axis relative to bodyA.\n */\n getLocalAxisA(): Vec2 {\n return this.m_localXAxisA;\n }\n\n /**\n * Get the current joint translation, usually in meters.\n */\n getJointTranslation(): number {\n const bA = this.m_bodyA;\n const bB = this.m_bodyB;\n\n const pA = bA.getWorldPoint(this.m_localAnchorA); // Vec2\n const pB = bB.getWorldPoint(this.m_localAnchorB); // Vec2\n const d = Vec2.sub(pB, pA); // Vec2\n const axis = bA.getWorldVector(this.m_localXAxisA); // Vec2\n\n const translation = Vec2.dot(d, axis); // float\n return translation;\n }\n\n /**\n * Get the current joint translation speed, usually in meters per second.\n */\n getJointSpeed(): number {\n const wA = this.m_bodyA.m_angularVelocity;\n const wB = this.m_bodyB.m_angularVelocity;\n return wB - wA;\n }\n\n /**\n * Is the joint motor enabled?\n */\n isMotorEnabled(): boolean {\n return this.m_enableMotor;\n }\n\n /**\n * Enable/disable the joint motor.\n */\n enableMotor(flag: boolean): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_enableMotor = flag;\n }\n\n /**\n * Set the motor speed, usually in radians per second.\n */\n setMotorSpeed(speed: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_motorSpeed = speed;\n }\n\n /**\n * Get the motor speed, usually in radians per second.\n */\n getMotorSpeed(): number {\n return this.m_motorSpeed;\n }\n\n /**\n * Set/Get the maximum motor force, usually in N-m.\n */\n setMaxMotorTorque(torque: number): void {\n this.m_bodyA.setAwake(true);\n this.m_bodyB.setAwake(true);\n this.m_maxMotorTorque = torque;\n }\n\n getMaxMotorTorque(): number {\n return this.m_maxMotorTorque;\n }\n\n /**\n * Get the current motor torque given the inverse time step, usually in N-m.\n */\n getMotorTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n /**\n * Set/Get the spring frequency in hertz. Setting the frequency to zero disables\n * the spring.\n */\n setSpringFrequencyHz(hz: number): void {\n this.m_frequencyHz = hz;\n }\n\n getSpringFrequencyHz(): number {\n return this.m_frequencyHz;\n }\n\n /**\n * Set/Get the spring damping ratio\n */\n setSpringDampingRatio(ratio: number): void {\n this.m_dampingRatio = ratio;\n }\n\n getSpringDampingRatio(): number {\n return this.m_dampingRatio;\n }\n\n /**\n * Get the anchor point on bodyA in world coordinates.\n */\n getAnchorA(): Vec2 {\n return this.m_bodyA.getWorldPoint(this.m_localAnchorA);\n }\n\n /**\n * Get the anchor point on bodyB in world coordinates.\n */\n getAnchorB(): Vec2 {\n return this.m_bodyB.getWorldPoint(this.m_localAnchorB);\n }\n\n /**\n * Get the reaction force on bodyB at the joint anchor in Newtons.\n */\n getReactionForce(inv_dt: number): Vec2 {\n return Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax).mul(inv_dt);\n }\n\n /**\n * Get the reaction torque on bodyB in N*m.\n */\n getReactionTorque(inv_dt: number): number {\n return inv_dt * this.m_motorImpulse;\n }\n\n initVelocityConstraints(step: TimeStep): void {\n this.m_localCenterA = this.m_bodyA.m_sweep.localCenter;\n this.m_localCenterB = this.m_bodyB.m_sweep.localCenter;\n this.m_invMassA = this.m_bodyA.m_invMass;\n this.m_invMassB = this.m_bodyB.m_invMass;\n this.m_invIA = this.m_bodyA.m_invI;\n this.m_invIB = this.m_bodyB.m_invI;\n\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const cA = this.m_bodyA.c_position.c;\n const aA = this.m_bodyA.c_position.a;\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n\n const cB = this.m_bodyB.c_position.c;\n const aB = this.m_bodyB.c_position.a;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n // Compute the effective masses.\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA); // Vec2\n\n // Point to line constraint\n {\n this.m_ay = Rot.mulVec2(qA, this.m_localYAxisA);\n this.m_sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ay);\n this.m_sBy = Vec2.crossVec2Vec2(rB, this.m_ay);\n\n this.m_mass = mA + mB + iA * this.m_sAy * this.m_sAy + iB * this.m_sBy\n * this.m_sBy;\n\n if (this.m_mass > 0.0) {\n this.m_mass = 1.0 / this.m_mass;\n }\n }\n\n // Spring constraint\n this.m_springMass = 0.0;\n this.m_bias = 0.0;\n this.m_gamma = 0.0;\n if (this.m_frequencyHz > 0.0) {\n this.m_ax = Rot.mulVec2(qA, this.m_localXAxisA);\n this.m_sAx = Vec2.crossVec2Vec2(Vec2.add(d, rA), this.m_ax);\n this.m_sBx = Vec2.crossVec2Vec2(rB, this.m_ax);\n\n const invMass = mA + mB + iA * this.m_sAx * this.m_sAx + iB * this.m_sBx\n * this.m_sBx; // float\n\n if (invMass > 0.0) {\n this.m_springMass = 1.0 / invMass;\n\n const C = Vec2.dot(d, this.m_ax); // float\n\n // Frequency\n const omega = 2.0 * Math.PI * this.m_frequencyHz; // float\n\n // Damping coefficient\n const damp = 2.0 * this.m_springMass * this.m_dampingRatio * omega; // float\n\n // Spring stiffness\n const k = this.m_springMass * omega * omega; // float\n\n // magic formulas\n const h = step.dt; // float\n this.m_gamma = h * (damp + h * k);\n if (this.m_gamma > 0.0) {\n this.m_gamma = 1.0 / this.m_gamma;\n }\n\n this.m_bias = C * h * k * this.m_gamma;\n\n this.m_springMass = invMass + this.m_gamma;\n if (this.m_springMass > 0.0) {\n this.m_springMass = 1.0 / this.m_springMass;\n }\n }\n } else {\n this.m_springImpulse = 0.0;\n }\n\n // Rotational motor\n if (this.m_enableMotor) {\n this.m_motorMass = iA + iB;\n if (this.m_motorMass > 0.0) {\n this.m_motorMass = 1.0 / this.m_motorMass;\n }\n } else {\n this.m_motorMass = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n if (step.warmStarting) {\n // Account for variable time step.\n this.m_impulse *= step.dtRatio;\n this.m_springImpulse *= step.dtRatio;\n this.m_motorImpulse *= step.dtRatio;\n\n const P = Vec2.combine(this.m_impulse, this.m_ay, this.m_springImpulse, this.m_ax);\n const LA = this.m_impulse * this.m_sAy + this.m_springImpulse * this.m_sAx + this.m_motorImpulse;\n const LB = this.m_impulse * this.m_sBy + this.m_springImpulse * this.m_sBx + this.m_motorImpulse;\n\n vA.subMul(this.m_invMassA, P);\n wA -= this.m_invIA * LA;\n\n vB.addMul(this.m_invMassB, P);\n wB += this.m_invIB * LB;\n\n } else {\n this.m_impulse = 0.0;\n this.m_springImpulse = 0.0;\n this.m_motorImpulse = 0.0;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n solveVelocityConstraints(step: TimeStep): void {\n const mA = this.m_invMassA;\n const mB = this.m_invMassB; // float\n const iA = this.m_invIA;\n const iB = this.m_invIB; // float\n\n const vA = this.m_bodyA.c_velocity.v;\n let wA = this.m_bodyA.c_velocity.w;\n const vB = this.m_bodyB.c_velocity.v;\n let wB = this.m_bodyB.c_velocity.w;\n\n // Solve spring constraint\n {\n const Cdot = Vec2.dot(this.m_ax, vB) - Vec2.dot(this.m_ax, vA) + this.m_sBx\n * wB - this.m_sAx * wA; // float\n const impulse = -this.m_springMass\n * (Cdot + this.m_bias + this.m_gamma * this.m_springImpulse); // float\n this.m_springImpulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ax); // Vec2\n const LA = impulse * this.m_sAx; // float\n const LB = impulse * this.m_sBx; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n // Solve rotational motor constraint\n {\n const Cdot = wB - wA - this.m_motorSpeed; // float\n let impulse = -this.m_motorMass * Cdot; // float\n\n const oldImpulse = this.m_motorImpulse; // float\n const maxImpulse = step.dt * this.m_maxMotorTorque; // float\n this.m_motorImpulse = Math.clamp(this.m_motorImpulse + impulse,\n -maxImpulse, maxImpulse);\n impulse = this.m_motorImpulse - oldImpulse;\n\n wA -= iA * impulse;\n wB += iB * impulse;\n }\n\n // Solve point to line constraint\n {\n const Cdot = Vec2.dot(this.m_ay, vB) - Vec2.dot(this.m_ay, vA) + this.m_sBy\n * wB - this.m_sAy * wA; // float\n const impulse = -this.m_mass * Cdot; // float\n this.m_impulse += impulse;\n\n const P = Vec2.mulNumVec2(impulse, this.m_ay); // Vec2\n const LA = impulse * this.m_sAy; // float\n const LB = impulse * this.m_sBy; // float\n\n vA.subMul(mA, P);\n wA -= iA * LA;\n\n vB.addMul(mB, P);\n wB += iB * LB;\n }\n\n this.m_bodyA.c_velocity.v.setVec2(vA);\n this.m_bodyA.c_velocity.w = wA;\n this.m_bodyB.c_velocity.v.setVec2(vB);\n this.m_bodyB.c_velocity.w = wB;\n }\n\n /**\n * This returns true if the position errors are within tolerance.\n */\n solvePositionConstraints(step: TimeStep): boolean {\n const cA = this.m_bodyA.c_position.c;\n let aA = this.m_bodyA.c_position.a;\n const cB = this.m_bodyB.c_position.c;\n let aB = this.m_bodyB.c_position.a;\n\n const qA = Rot.neo(aA);\n const qB = Rot.neo(aB);\n\n const rA = Rot.mulVec2(qA, Vec2.sub(this.m_localAnchorA, this.m_localCenterA));\n const rB = Rot.mulVec2(qB, Vec2.sub(this.m_localAnchorB, this.m_localCenterB));\n const d = Vec2.zero();\n d.addCombine(1, cB, 1, rB);\n d.subCombine(1, cA, 1, rA);\n\n const ay = Rot.mulVec2(qA, this.m_localYAxisA);\n\n const sAy = Vec2.crossVec2Vec2(Vec2.add(d, rA), ay); // float\n const sBy = Vec2.crossVec2Vec2(rB, ay); // float\n\n const C = Vec2.dot(d, ay); // float\n\n const k = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_sAy\n * this.m_sAy + this.m_invIB * this.m_sBy * this.m_sBy; // float\n\n let impulse; // float\n if (k != 0.0) {\n impulse = -C / k;\n } else {\n impulse = 0.0;\n }\n\n const P = Vec2.mulNumVec2(impulse, ay); // Vec2\n const LA = impulse * sAy; // float\n const LB = impulse * sBy; // float\n\n cA.subMul(this.m_invMassA, P);\n aA -= this.m_invIA * LA;\n cB.addMul(this.m_invMassB, P);\n aB += this.m_invIB * LB;\n\n this.m_bodyA.c_position.c.setVec2(cA);\n this.m_bodyA.c_position.a = aA;\n this.m_bodyB.c_position.c.setVec2(cB);\n this.m_bodyB.c_position.a = aB;\n\n return Math.abs(C) <= Settings.linearSlop;\n }\n\n}\n","// tslint:disable:typedef\nimport { World } from '../dynamics/World';\nimport { Body } from '../dynamics/Body';\nimport { Joint } from '../dynamics/Joint';\nimport { Fixture } from '../dynamics/Fixture';\nimport { Shape } from '../collision/Shape';\nimport { Vec2 } from '../common/Vec2';\nimport { Vec3 } from '../common/Vec3';\nimport { ChainShape } from \"../collision/shape/ChainShape\";\nimport { BoxShape } from \"../collision/shape/BoxShape\";\nimport { EdgeShape } from \"../collision/shape/EdgeShape\";\nimport { PolygonShape } from \"../collision/shape/PolygonShape\";\nimport { CircleShape } from \"../collision/shape/CircleShape\";\nimport { DistanceJoint } from \"../dynamics/joint/DistanceJoint\";\nimport { FrictionJoint } from \"../dynamics/joint/FrictionJoint\";\nimport { GearJoint } from \"../dynamics/joint/GearJoint\";\nimport { MotorJoint } from \"../dynamics/joint/MotorJoint\";\nimport { MouseJoint } from \"../dynamics/joint/MouseJoint\";\nimport { PrismaticJoint } from \"../dynamics/joint/PrismaticJoint\";\nimport { PulleyJoint } from \"../dynamics/joint/PulleyJoint\";\nimport { RevoluteJoint } from \"../dynamics/joint/RevoluteJoint\";\nimport { RopeJoint } from \"../dynamics/joint/RopeJoint\";\nimport { WeldJoint } from \"../dynamics/joint/WeldJoint\";\nimport { WheelJoint } from \"../dynamics/joint/WheelJoint\";\n\nlet SID = 0;\n\nexport function Serializer(opts?) {\n opts = opts || {};\n\n const rootClass = opts.rootClass || World;\n\n const preSerialize = opts.preSerialize || function(obj) { return obj; };\n const postSerialize = opts.postSerialize || function(data, obj) { return data; };\n\n const preDeserialize = opts.preDeserialize || function(data) { return data; };\n const postDeserialize = opts.postDeserialize || function(obj, data) { return obj; };\n\n // This is used to create ref objects during serialize\n const refTypes = {\n World,\n Body,\n Joint,\n Fixture,\n Shape,\n };\n\n // This is used by restore to deserialize objects and refs\n const restoreTypes = {\n Vec2,\n Vec3,\n ...refTypes\n };\n\n const CLASS_BY_TYPE_PROP = {\n [Body.STATIC]: Body,\n [Body.DYNAMIC]: Body,\n [Body.KINEMATIC]: Body,\n [ChainShape.TYPE]: ChainShape,\n [BoxShape.TYPE]: BoxShape,\n [EdgeShape.TYPE]: EdgeShape,\n [PolygonShape.TYPE]: PolygonShape,\n [CircleShape.TYPE]: CircleShape,\n [DistanceJoint.TYPE]: DistanceJoint,\n [FrictionJoint.TYPE]: FrictionJoint,\n [GearJoint.TYPE]: GearJoint,\n [MotorJoint.TYPE]: MotorJoint,\n [MouseJoint.TYPE]: MouseJoint,\n [PrismaticJoint.TYPE]: PrismaticJoint,\n [PulleyJoint.TYPE]: PulleyJoint,\n [RevoluteJoint.TYPE]: RevoluteJoint,\n [RopeJoint.TYPE]: RopeJoint,\n [WeldJoint.TYPE]: WeldJoint,\n [WheelJoint.TYPE]: WheelJoint,\n }\n\n this.toJson = function(root) {\n const json = [];\n\n const queue = [root];\n const refMap = {};\n\n function storeRef(value, typeName) {\n value.__sid = value.__sid || ++SID;\n if (!refMap[value.__sid]) {\n queue.push(value);\n const index = json.length + queue.length;\n const ref = {\n refIndex: index,\n refType: typeName\n };\n refMap[value.__sid] = ref;\n }\n return refMap[value.__sid];\n }\n\n function serialize(obj) {\n obj = preSerialize(obj);\n let data = obj._serialize();\n data = postSerialize(data, obj);\n return data;\n }\n\n function toJson(value, top?) {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n if (typeof value._serialize === 'function') {\n if (value !== top) {\n // tslint:disable-next-line:no-for-in\n for (const typeName in refTypes) {\n if (value instanceof refTypes[typeName]) {\n return storeRef(value, typeName);\n }\n }\n }\n value = serialize(value);\n }\n if (Array.isArray(value)) {\n const newValue = [];\n for (let key = 0; key < value.length; key++) {\n newValue[key] = toJson(value[key]);\n }\n value = newValue;\n\n } else {\n const newValue = {};\n // tslint:disable-next-line:no-for-in\n for (const key in value) {\n if (value.hasOwnProperty(key)) {\n newValue[key] = toJson(value[key]);\n }\n }\n value = newValue;\n }\n return value;\n }\n\n while (queue.length) {\n const obj = queue.shift();\n const str = toJson(obj, obj);\n json.push(str);\n }\n\n return json;\n };\n\n this.fromJson = function(json: object) {\n const refMap = {};\n\n function findDeserilizer(data, cls) {\n if (!cls || !cls._deserialize) {\n cls = CLASS_BY_TYPE_PROP[data.type]\n }\n return cls && cls._deserialize;\n }\n\n /**\n * Deserialize a data object.\n */\n function deserialize(cls, data, ctx) {\n const deserializer = findDeserilizer(data, cls);\n if (!deserializer) {\n return;\n }\n data = preDeserialize(data);\n let obj = deserializer(data, ctx, restoreRef);\n obj = postDeserialize(obj, data);\n return obj;\n }\n\n /**\n * Restore a ref object or deserialize a data object.\n *\n * This is passed as callback to class deserializers.\n */\n function restoreRef(cls, ref, ctx) {\n if (!ref.refIndex) {\n return cls && cls._deserialize && deserialize(cls, ref, ctx);\n }\n cls = restoreTypes[ref.refType] || cls;\n const index = ref.refIndex;\n if (!refMap[index]) {\n const data = json[index];\n const obj = deserialize(cls, data, ctx);\n refMap[index] = obj;\n }\n return refMap[index];\n }\n\n const root = rootClass._deserialize(json[0], null, restoreRef);\n\n return root;\n };\n}\n\nconst serializer = new Serializer();\n\nSerializer.toJson = serializer.toJson;\nSerializer.fromJson = serializer.fromJson;\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { CircleShape } from './CircleShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact);\n\nfunction CircleCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == CircleShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n CollideCircles(manifold, fixtureA.getShape() as CircleShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport const CollideCircles = function (manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n const pA = Transform.mulVec2(xfA, circleA.m_p);\n const pB = Transform.mulVec2(xfB, circleB.m_p);\n\n const distSqr = Vec2.distanceSquared(pB, pA);\n const rA = circleA.m_radius;\n const rB = circleB.m_radius;\n const radius = rA + rB;\n if (distSqr > radius * radius) {\n return;\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localPoint.setVec2(circleA.m_p);\n manifold.localNormal.setZero();\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { EdgeShape } from './EdgeShape';\nimport { ChainShape } from './ChainShape';\nimport { CircleShape } from './CircleShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, CircleShape.TYPE, EdgeCircleContact);\nContact.addType(ChainShape.TYPE, CircleShape.TYPE, ChainCircleContact);\n\nfunction EdgeCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == EdgeShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const shapeA = fixtureA.getShape() as EdgeShape;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\nfunction ChainCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == ChainShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n\n const chain = fixtureA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n const shapeA = edge;\n const shapeB = fixtureB.getShape() as CircleShape;\n\n CollideEdgeCircle(manifold, shapeA, xfA, shapeB, xfB);\n}\n\n// Compute contact points for edge versus circle.\n// This accounts for edge connectivity.\nexport const CollideEdgeCircle = function (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle in frame of edge\n const Q = Transform.mulTVec2(xfA, Transform.mulVec2(xfB, circleB.m_p));\n\n const A = edgeA.m_vertex1;\n const B = edgeA.m_vertex2;\n const e = Vec2.sub(B, A);\n\n // Barycentric coordinates\n const u = Vec2.dot(e, Vec2.sub(B, Q));\n const v = Vec2.dot(e, Vec2.sub(Q, A));\n\n const radius = edgeA.m_radius + circleB.m_radius;\n\n // Region A\n if (v <= 0.0) {\n const P = Vec2.clone(A);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to A?\n if (edgeA.m_hasVertex0) {\n const A1 = edgeA.m_vertex0;\n const B1 = A;\n const e1 = Vec2.sub(B1, A1);\n const u1 = Vec2.dot(e1, Vec2.sub(B1, Q));\n\n // Is the circle in Region AB of the previous edge?\n if (u1 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region B\n if (u <= 0.0) {\n const P = Vec2.clone(B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n // Is there an edge connected to B?\n if (edgeA.m_hasVertex3) {\n const B2 = edgeA.m_vertex3;\n const A2 = B;\n const e2 = Vec2.sub(B2, A2);\n const v2 = Vec2.dot(e2, Vec2.sub(Q, A2));\n\n // Is the circle in Region AB of the next edge?\n if (v2 > 0.0) {\n return;\n }\n }\n\n manifold.type = ManifoldType.e_circles;\n manifold.localNormal.setZero();\n manifold.localPoint.setVec2(P);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 1;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Region AB\n const den = Vec2.dot(e, e);\n _ASSERT && console.assert(den > 0.0);\n const P = Vec2.combine(u / den, A, v / den, B);\n const d = Vec2.sub(Q, P);\n const dd = Vec2.dot(d, d);\n if (dd > radius * radius) {\n return;\n }\n\n const n = Vec2.neo(-e.y, e.x);\n if (Vec2.dot(n, Vec2.sub(Q, A)) < 0.0) {\n n.setNum(-n.x, -n.y);\n }\n n.normalize();\n\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal = n;\n manifold.localPoint.setVec2(A);\n manifold.pointCount = 1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_face;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Transform } from '../../common/Transform';\nimport { Rot } from '../../common/Rot';\nimport { Vec2 } from '../../common/Vec2';\nimport { Settings } from '../../Settings';\nimport { Manifold, clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport { Contact } from '../../dynamics/Contact';\nimport { PolygonShape } from './PolygonShape';\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, PolygonShape.TYPE, PolygonContact);\n\nfunction PolygonContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == PolygonShape.TYPE);\n CollidePolygons(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as PolygonShape, xfB);\n}\n\ninterface MaxSeparation {\n maxSeparation: number;\n bestIndex: number;\n}\n\n/**\n * Find the max separation between poly1 and poly2 using edge normals from\n * poly1.\n */\nfunction findMaxSeparation(poly1: PolygonShape, xf1: Transform, poly2: PolygonShape, xf2: Transform, output: MaxSeparation): void {\n const count1 = poly1.m_count;\n const count2 = poly2.m_count;\n const n1s = poly1.m_normals;\n const v1s = poly1.m_vertices;\n const v2s = poly2.m_vertices;\n const xf = Transform.mulTXf(xf2, xf1);\n\n let bestIndex = 0;\n let maxSeparation = -Infinity;\n for (let i = 0; i < count1; ++i) {\n // Get poly1 normal in frame2.\n const n = Rot.mulVec2(xf.q, n1s[i]);\n const v1 = Transform.mulVec2(xf, v1s[i]);\n\n // Find deepest point for normal i.\n let si = Infinity;\n for (let j = 0; j < count2; ++j) {\n const sij = Vec2.dot(n, v2s[j]) - Vec2.dot(n, v1);\n if (sij < si) {\n si = sij;\n }\n }\n\n if (si > maxSeparation) {\n maxSeparation = si;\n bestIndex = i;\n }\n }\n\n // used to keep last FindMaxSeparation call values\n output.maxSeparation = maxSeparation;\n output.bestIndex = bestIndex;\n}\n\nfunction findIncidentEdge(c: ClipVertex[], poly1: PolygonShape, xf1: Transform, edge1: number, poly2: PolygonShape, xf2: Transform): void {\n const normals1 = poly1.m_normals;\n\n const count2 = poly2.m_count;\n const vertices2 = poly2.m_vertices;\n const normals2 = poly2.m_normals;\n\n _ASSERT && console.assert(0 <= edge1 && edge1 < poly1.m_count);\n\n // Get the normal of the reference edge in poly2's frame.\n const normal1 = Rot.mulTVec2(xf2.q, Rot.mulVec2(xf1.q, normals1[edge1]));\n\n // Find the incident edge on poly2.\n let index = 0;\n let minDot = Infinity;\n for (let i = 0; i < count2; ++i) {\n const dot = Vec2.dot(normal1, normals2[i]);\n if (dot < minDot) {\n minDot = dot;\n index = i;\n }\n }\n\n // Build the clip vertices for the incident edge.\n const i1 = index;\n const i2 = i1 + 1 < count2 ? i1 + 1 : 0;\n\n c[0].v = Transform.mulVec2(xf2, vertices2[i1]);\n c[0].id.cf.indexA = edge1;\n c[0].id.cf.indexB = i1;\n c[0].id.cf.typeA = ContactFeatureType.e_face;\n c[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n c[1].v = Transform.mulVec2(xf2, vertices2[i2]);\n c[1].id.cf.indexA = edge1;\n c[1].id.cf.indexB = i2;\n c[1].id.cf.typeA = ContactFeatureType.e_face;\n c[1].id.cf.typeB = ContactFeatureType.e_vertex;\n}\n\nconst maxSeparation = {\n maxSeparation: 0,\n bestIndex: 0,\n};\n\n/**\n *\n * Find edge normal of max separation on A - return if separating axis is found
\n * Find edge normal of max separation on B - return if separation axis is found
\n * Choose reference edge as min(minA, minB)
\n * Find incident edge
\n * Clip\n *\n * The normal points from 1 to 2\n */\nexport const CollidePolygons = function (manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform): void {\n manifold.pointCount = 0;\n const totalRadius = polyA.m_radius + polyB.m_radius;\n\n findMaxSeparation(polyA, xfA, polyB, xfB, maxSeparation);\n const edgeA = maxSeparation.bestIndex;\n const separationA = maxSeparation.maxSeparation;\n if (separationA > totalRadius)\n return;\n\n findMaxSeparation(polyB, xfB, polyA, xfA, maxSeparation);\n const edgeB = maxSeparation.bestIndex;\n const separationB = maxSeparation.maxSeparation;\n if (separationB > totalRadius)\n return;\n\n let poly1; // reference polygon\n let poly2; // incident polygon\n let xf1;\n let xf2;\n let edge1; // reference edge\n let flip;\n const k_tol = 0.1 * Settings.linearSlop;\n\n if (separationB > separationA + k_tol) {\n poly1 = polyB;\n poly2 = polyA;\n xf1 = xfB;\n xf2 = xfA;\n edge1 = edgeB;\n manifold.type = ManifoldType.e_faceB;\n flip = 1;\n } else {\n poly1 = polyA;\n poly2 = polyB;\n xf1 = xfA;\n xf2 = xfB;\n edge1 = edgeA;\n manifold.type = ManifoldType.e_faceA;\n flip = 0;\n }\n\n const incidentEdge = [ new ClipVertex(), new ClipVertex() ];\n findIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);\n\n const count1 = poly1.m_count;\n const vertices1 = poly1.m_vertices;\n\n const iv1 = edge1;\n const iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0;\n\n let v11 = vertices1[iv1];\n let v12 = vertices1[iv2];\n\n const localTangent = Vec2.sub(v12, v11);\n localTangent.normalize();\n\n const localNormal = Vec2.crossVec2Num(localTangent, 1.0);\n const planePoint = Vec2.combine(0.5, v11, 0.5, v12);\n\n const tangent = Rot.mulVec2(xf1.q, localTangent);\n const normal = Vec2.crossVec2Num(tangent, 1.0);\n\n v11 = Transform.mulVec2(xf1, v11);\n v12 = Transform.mulVec2(xf1, v12);\n\n // Face offset.\n const frontOffset = Vec2.dot(normal, v11);\n\n // Side offsets, extended by polytope skin thickness.\n const sideOffset1 = -Vec2.dot(tangent, v11) + totalRadius;\n const sideOffset2 = Vec2.dot(tangent, v12) + totalRadius;\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, incidentEdge, Vec2.neg(tangent), sideOffset1, iv1);\n\n if (np < 2) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2);\n\n if (np < 2) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n manifold.localNormal = localNormal;\n manifold.localPoint = planePoint;\n\n let pointCount = 0;\n for (let i = 0; i < clipPoints2.length/* maxManifoldPoints */; ++i) {\n const separation = Vec2.dot(normal, clipPoints2[i].v) - frontOffset;\n\n if (separation <= totalRadius) {\n const cp = manifold.points[pointCount];\n cp.localPoint.setVec2(Transform.mulTVec2(xf2, clipPoints2[i].v));\n cp.id = clipPoints2[i].id;\n if (flip) {\n // Swap features\n const cf = cp.id.cf;\n const indexA = cf.indexA;\n const indexB = cf.indexB;\n const typeA = cf.typeA;\n const typeB = cf.typeB;\n cf.indexA = indexB;\n cf.indexB = indexA;\n cf.typeA = typeB;\n cf.typeB = typeA;\n }\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Contact } from '../../dynamics/Contact';\nimport { CircleShape } from './CircleShape';\nimport { PolygonShape } from './PolygonShape';\nimport { Manifold, ContactFeatureType, ManifoldType } from \"../Manifold\";\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(PolygonShape.TYPE, CircleShape.TYPE, PolygonCircleContact);\n\nfunction PolygonCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fixtureA.getType() == PolygonShape.TYPE);\n _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE);\n CollidePolygonCircle(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as CircleShape, xfB);\n}\n\nexport const CollidePolygonCircle = function (manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void {\n manifold.pointCount = 0;\n\n // Compute circle position in the frame of the polygon.\n const c = Transform.mulVec2(xfB, circleB.m_p);\n const cLocal = Transform.mulTVec2(xfA, c);\n\n // Find the min separating edge.\n let normalIndex = 0;\n let separation = -Infinity;\n const radius = polygonA.m_radius + circleB.m_radius;\n const vertexCount = polygonA.m_count;\n const vertices = polygonA.m_vertices;\n const normals = polygonA.m_normals;\n\n for (let i = 0; i < vertexCount; ++i) {\n const s = Vec2.dot(normals[i], Vec2.sub(cLocal, vertices[i]));\n\n if (s > radius) {\n // Early out.\n return;\n }\n\n if (s > separation) {\n separation = s;\n normalIndex = i;\n }\n }\n\n // Vertices that subtend the incident face.\n const vertIndex1 = normalIndex;\n const vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0;\n const v1 = vertices[vertIndex1];\n const v2 = vertices[vertIndex2];\n\n // If the center is inside the polygon ...\n if (separation < Math.EPSILON) {\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[normalIndex]);\n manifold.localPoint.setCombine(0.5, v1, 0.5, v2);\n manifold.points[0].localPoint = circleB.m_p;\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n return;\n }\n\n // Compute barycentric coordinates\n const u1 = Vec2.dot(Vec2.sub(cLocal, v1), Vec2.sub(v2, v1));\n const u2 = Vec2.dot(Vec2.sub(cLocal, v2), Vec2.sub(v1, v2));\n if (u1 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v1) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v1);\n manifold.localNormal.normalize();\n manifold.localPoint = v1;\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else if (u2 <= 0.0) {\n if (Vec2.distanceSquared(cLocal, v2) > radius * radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setCombine(1, cLocal, -1, v2);\n manifold.localNormal.normalize();\n manifold.localPoint.setVec2(v2);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n } else {\n const faceCenter = Vec2.mid(v1, v2);\n const separation = Vec2.dot(cLocal, normals[vertIndex1]) - Vec2.dot(faceCenter, normals[vertIndex1]);\n if (separation > radius) {\n return;\n }\n\n manifold.pointCount = 1;\n manifold.type = ManifoldType.e_faceA;\n manifold.localNormal.setVec2(normals[vertIndex1]);\n manifold.localPoint.setVec2(faceCenter);\n manifold.points[0].localPoint.setVec2(circleB.m_p);\n\n // manifold.points[0].id.key = 0;\n manifold.points[0].id.cf.indexA = 0;\n manifold.points[0].id.cf.typeA = ContactFeatureType.e_vertex;\n manifold.points[0].id.cf.indexB = 0;\n manifold.points[0].id.cf.typeB = ContactFeatureType.e_vertex;\n }\n}\n","/*\n * Planck.js\n * The MIT License\n * Copyright (c) 2021 Erin Catto, Ali Shakiba\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { math as Math } from '../../common/Math';\nimport { Transform } from '../../common/Transform';\nimport { Vec2 } from '../../common/Vec2';\nimport { Rot } from '../../common/Rot';\nimport { Settings } from '../../Settings';\nimport { Contact } from '../../dynamics/Contact';\nimport { Manifold, clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold';\nimport { EdgeShape } from './EdgeShape';\nimport { ChainShape } from './ChainShape';\nimport { PolygonShape } from './PolygonShape';\nimport { Fixture } from \"../../dynamics/Fixture\";\n\n\nconst _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT;\n\n\nContact.addType(EdgeShape.TYPE, PolygonShape.TYPE, EdgePolygonContact);\nContact.addType(ChainShape.TYPE, PolygonShape.TYPE, ChainPolygonContact);\n\nfunction EdgePolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fA.getType() == EdgeShape.TYPE);\n _ASSERT && console.assert(fB.getType() == PolygonShape.TYPE);\n\n CollideEdgePolygon(manifold, fA.getShape() as EdgeShape, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nfunction ChainPolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void {\n _ASSERT && console.assert(fA.getType() == ChainShape.TYPE);\n _ASSERT && console.assert(fB.getType() == PolygonShape.TYPE);\n\n const chain = fA.getShape() as ChainShape;\n const edge = new EdgeShape();\n chain.getChildEdge(edge, indexA);\n\n CollideEdgePolygon(manifold, edge, xfA, fB.getShape() as PolygonShape, xfB);\n}\n\nenum EPAxisType {\n e_unknown = -1,\n e_edgeA = 1,\n e_edgeB = 2,\n}\n\n// unused?\nenum VertexType {\n e_isolated = 0,\n e_concave = 1,\n e_convex = 2,\n}\n\n/**\n * This structure is used to keep track of the best separating axis.\n */\nclass EPAxis {\n type: EPAxisType;\n index: number;\n separation: number;\n}\n\n/**\n * This holds polygon B expressed in frame A.\n */\nclass TempPolygon {\n vertices: Vec2[] = []; // [Settings.maxPolygonVertices]\n normals: Vec2[] = []; // [Settings.maxPolygonVertices];\n count: number = 0;\n}\n\n/**\n * Reference face used for clipping\n */\nclass ReferenceFace {\n i1: number;\n i2: number;\n v1: Vec2;\n v2: Vec2;\n normal: Vec2 = Vec2.zero();\n sideNormal1: Vec2 = Vec2.zero();\n sideOffset1: number;\n sideNormal2: Vec2 = Vec2.zero();\n sideOffset2: number;\n}\n\n// reused\nconst edgeAxis = new EPAxis();\nconst polygonAxis = new EPAxis();\nconst polygonBA = new TempPolygon();\nconst rf = new ReferenceFace();\n\n/**\n * This function collides and edge and a polygon, taking into account edge\n * adjacency.\n */\nexport const CollideEdgePolygon = function (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform): void {\n // Algorithm:\n // 1. Classify v1 and v2\n // 2. Classify polygon centroid as front or back\n // 3. Flip normal if necessary\n // 4. Initialize normal range to [-pi, pi] about face normal\n // 5. Adjust normal range according to adjacent edges\n // 6. Visit each separating axes, only accept axes within the range\n // 7. Return if _any_ axis indicates separation\n // 8. Clip\n\n // let m_type1: VertexType;\n // let m_type2: VertexType;\n\n const xf = Transform.mulTXf(xfA, xfB);\n\n const centroidB = Transform.mulVec2(xf, polygonB.m_centroid);\n\n const v0 = edgeA.m_vertex0;\n const v1 = edgeA.m_vertex1;\n const v2 = edgeA.m_vertex2;\n const v3 = edgeA.m_vertex3;\n\n const hasVertex0 = edgeA.m_hasVertex0;\n const hasVertex3 = edgeA.m_hasVertex3;\n\n const edge1 = Vec2.sub(v2, v1);\n edge1.normalize();\n const normal1 = Vec2.neo(edge1.y, -edge1.x);\n const offset1 = Vec2.dot(normal1, Vec2.sub(centroidB, v1));\n let offset0 = 0.0;\n let offset2 = 0.0;\n let convex1 = false;\n let convex2 = false;\n\n let normal0;\n let normal2;\n\n // Is there a preceding edge?\n if (hasVertex0) {\n const edge0 = Vec2.sub(v1, v0);\n edge0.normalize();\n normal0 = Vec2.neo(edge0.y, -edge0.x);\n convex1 = Vec2.crossVec2Vec2(edge0, edge1) >= 0.0;\n offset0 = Vec2.dot(normal0, centroidB) - Vec2.dot(normal0, v0);\n }\n\n // Is there a following edge?\n if (hasVertex3) {\n const edge2 = Vec2.sub(v3, v2);\n edge2.normalize();\n normal2 = Vec2.neo(edge2.y, -edge2.x);\n convex2 = Vec2.crossVec2Vec2(edge1, edge2) > 0.0;\n offset2 = Vec2.dot(normal2, centroidB) - Vec2.dot(normal2, v2);\n }\n\n let front;\n const normal = Vec2.zero();\n const lowerLimit = Vec2.zero();\n const upperLimit = Vec2.zero();\n\n // Determine front or back collision. Determine collision normal limits.\n if (hasVertex0 && hasVertex3) {\n if (convex1 && convex2) {\n front = offset0 >= 0.0 || offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex1) {\n front = offset0 >= 0.0 || (offset1 >= 0.0 && offset2 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal1);\n }\n } else if (convex2) {\n front = offset2 >= 0.0 || (offset0 >= 0.0 && offset1 >= 0.0);\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal0);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex0) {\n if (convex1) {\n front = offset0 >= 0.0 || offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal0);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n }\n } else {\n front = offset0 >= 0.0 && offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setMul(-1, normal0);\n }\n }\n } else if (hasVertex3) {\n if (convex2) {\n front = offset1 >= 0.0 || offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal2);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n }\n } else {\n front = offset1 >= 0.0 && offset2 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setVec2(normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setMul(-1, normal2);\n upperLimit.setVec2(normal1);\n }\n }\n } else {\n front = offset1 >= 0.0;\n if (front) {\n normal.setVec2(normal1);\n lowerLimit.setMul(-1, normal1);\n upperLimit.setMul(-1, normal1);\n } else {\n normal.setMul(-1, normal1);\n lowerLimit.setVec2(normal1);\n upperLimit.setVec2(normal1);\n }\n }\n\n // Get polygonB in frameA\n polygonBA.count = polygonB.m_count;\n for (let i = 0; i < polygonB.m_count; ++i) {\n polygonBA.vertices[i] = Transform.mulVec2(xf, polygonB.m_vertices[i]);\n polygonBA.normals[i] = Rot.mulVec2(xf.q, polygonB.m_normals[i]);\n }\n\n const radius = 2.0 * Settings.polygonRadius;\n\n manifold.pointCount = 0;\n\n { // ComputeEdgeSeparation\n edgeAxis.type = EPAxisType.e_edgeA;\n edgeAxis.index = front ? 0 : 1;\n edgeAxis.separation = Infinity;\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const s = Vec2.dot(normal, Vec2.sub(polygonBA.vertices[i], v1));\n if (s < edgeAxis.separation) {\n edgeAxis.separation = s;\n }\n }\n }\n\n // If no valid normal can be found than this edge should not collide.\n // @ts-ignore\n if (edgeAxis.type == EPAxisType.e_unknown) {\n return;\n }\n\n if (edgeAxis.separation > radius) {\n return;\n }\n\n { // ComputePolygonSeparation\n polygonAxis.type = EPAxisType.e_unknown;\n polygonAxis.index = -1;\n polygonAxis.separation = -Infinity;\n\n const perp = Vec2.neo(-normal.y, normal.x);\n\n for (let i = 0; i < polygonBA.count; ++i) {\n const n = Vec2.neg(polygonBA.normals[i]);\n\n const s1 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v1));\n const s2 = Vec2.dot(n, Vec2.sub(polygonBA.vertices[i], v2));\n const s = Math.min(s1, s2);\n\n if (s > radius) {\n // No collision\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n break;\n }\n\n // Adjacency\n if (Vec2.dot(n, perp) >= 0.0) {\n if (Vec2.dot(Vec2.sub(n, upperLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n } else {\n if (Vec2.dot(Vec2.sub(n, lowerLimit), normal) < -Settings.angularSlop) {\n continue;\n }\n }\n\n if (s > polygonAxis.separation) {\n polygonAxis.type = EPAxisType.e_edgeB;\n polygonAxis.index = i;\n polygonAxis.separation = s;\n }\n }\n }\n\n if (polygonAxis.type != EPAxisType.e_unknown && polygonAxis.separation > radius) {\n return;\n }\n\n // Use hysteresis for jitter reduction.\n const k_relativeTol = 0.98;\n const k_absoluteTol = 0.001;\n\n let primaryAxis;\n if (polygonAxis.type == EPAxisType.e_unknown) {\n primaryAxis = edgeAxis;\n } else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) {\n primaryAxis = polygonAxis;\n } else {\n primaryAxis = edgeAxis;\n }\n\n const ie = [ new ClipVertex(), new ClipVertex() ];\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.type = ManifoldType.e_faceA;\n\n // Search for the polygon normal that is most anti-parallel to the edge\n // normal.\n let bestIndex = 0;\n let bestValue = Vec2.dot(normal, polygonBA.normals[0]);\n for (let i = 1; i < polygonBA.count; ++i) {\n const value = Vec2.dot(normal, polygonBA.normals[i]);\n if (value < bestValue) {\n bestValue = value;\n bestIndex = i;\n }\n }\n\n const i1 = bestIndex;\n const i2 = i1 + 1 < polygonBA.count ? i1 + 1 : 0;\n\n ie[0].v = polygonBA.vertices[i1];\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = i1;\n ie[0].id.cf.typeA = ContactFeatureType.e_face;\n ie[0].id.cf.typeB = ContactFeatureType.e_vertex;\n\n ie[1].v = polygonBA.vertices[i2];\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = i2;\n ie[1].id.cf.typeA = ContactFeatureType.e_face;\n ie[1].id.cf.typeB = ContactFeatureType.e_vertex;\n\n if (front) {\n rf.i1 = 0;\n rf.i2 = 1;\n rf.v1 = v1;\n rf.v2 = v2;\n rf.normal.setVec2(normal1);\n } else {\n rf.i1 = 1;\n rf.i2 = 0;\n rf.v1 = v2;\n rf.v2 = v1;\n rf.normal.setMul(-1, normal1);\n }\n } else {\n manifold.type = ManifoldType.e_faceB;\n\n ie[0].v = v1;\n ie[0].id.cf.indexA = 0;\n ie[0].id.cf.indexB = primaryAxis.index;\n ie[0].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[0].id.cf.typeB = ContactFeatureType.e_face;\n\n ie[1].v = v2;\n ie[1].id.cf.indexA = 0;\n ie[1].id.cf.indexB = primaryAxis.index;\n ie[1].id.cf.typeA = ContactFeatureType.e_vertex;\n ie[1].id.cf.typeB = ContactFeatureType.e_face;\n\n rf.i1 = primaryAxis.index;\n rf.i2 = rf.i1 + 1 < polygonBA.count ? rf.i1 + 1 : 0;\n rf.v1 = polygonBA.vertices[rf.i1];\n rf.v2 = polygonBA.vertices[rf.i2];\n rf.normal.setVec2(polygonBA.normals[rf.i1]);\n }\n\n rf.sideNormal1.setNum(rf.normal.y, -rf.normal.x);\n rf.sideNormal2.setMul(-1, rf.sideNormal1);\n rf.sideOffset1 = Vec2.dot(rf.sideNormal1, rf.v1);\n rf.sideOffset2 = Vec2.dot(rf.sideNormal2, rf.v2);\n\n // Clip incident edge against extruded edge1 side edges.\n const clipPoints1 = [ new ClipVertex(), new ClipVertex() ];\n const clipPoints2 = [ new ClipVertex(), new ClipVertex() ];\n\n let np;\n\n // Clip to box side 1\n np = clipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Clip to negative box side 1\n np = clipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2);\n\n if (np < Settings.maxManifoldPoints) {\n return;\n }\n\n // Now clipPoints2 contains the clipped points.\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n manifold.localNormal = Vec2.clone(rf.normal);\n manifold.localPoint = Vec2.clone(rf.v1);\n } else {\n manifold.localNormal = Vec2.clone(polygonB.m_normals[rf.i1]);\n manifold.localPoint = Vec2.clone(polygonB.m_vertices[rf.i1]);\n }\n\n let pointCount = 0;\n for (let i = 0; i < Settings.maxManifoldPoints; ++i) {\n const separation = Vec2.dot(rf.normal, Vec2.sub(clipPoints2[i].v, rf.v1));\n\n if (separation <= radius) {\n const cp = manifold.points[pointCount]; // ManifoldPoint\n\n if (primaryAxis.type == EPAxisType.e_edgeA) {\n cp.localPoint = Transform.mulTVec2(xf, clipPoints2[i].v);\n cp.id = clipPoints2[i].id;\n } else {\n cp.localPoint = clipPoints2[i].v;\n cp.id.cf.typeA = clipPoints2[i].id.cf.typeB;\n cp.id.cf.typeB = clipPoints2[i].id.cf.typeA;\n cp.id.cf.indexA = clipPoints2[i].id.cf.indexB;\n cp.id.cf.indexB = clipPoints2[i].id.cf.indexA;\n }\n\n ++pointCount;\n }\n }\n\n manifold.pointCount = pointCount;\n}\n","export * from './serializer/index';\n\nexport * from './common/Math';\n\nexport * from './common/Vec2';\nexport * from './common/Vec3';\nexport * from './common/Mat22';\nexport * from './common/Mat33';\nexport * from './common/Transform';\nexport * from './common/Rot';\n\nexport * from './collision/AABB';\n\nexport * from './collision/Shape';\nexport * from './dynamics/Fixture';\nexport * from './dynamics/Body';\nexport * from './dynamics/Contact';\nexport * from './dynamics/Joint';\nexport * from './dynamics/World';\n\nexport * from './collision/shape/CircleShape';\nexport * from './collision/shape/EdgeShape';\nexport * from './collision/shape/PolygonShape';\nexport * from './collision/shape/ChainShape';\nexport * from './collision/shape/BoxShape';\n\nexport * from './collision/shape/CollideCircle';\nexport * from './collision/shape/CollideEdgeCircle';\nexport * from './collision/shape/CollidePolygon';\nexport * from './collision/shape/CollideCirclePolygon';\nexport * from './collision/shape/CollideEdgePolygon';\n\nexport * from './dynamics/joint/DistanceJoint';\nexport * from './dynamics/joint/FrictionJoint';\nexport * from './dynamics/joint/GearJoint';\nexport * from './dynamics/joint/MotorJoint';\nexport * from './dynamics/joint/MouseJoint';\nexport * from './dynamics/joint/PrismaticJoint';\nexport * from './dynamics/joint/PulleyJoint';\nexport * from './dynamics/joint/RevoluteJoint';\nexport * from './dynamics/joint/RopeJoint';\nexport * from './dynamics/joint/WeldJoint';\nexport * from './dynamics/joint/WheelJoint';\n\nexport * from './Settings';\n\nexport * from './common/Sweep';\nexport * from './collision/Manifold';\nexport * from './collision/Distance';\nexport * from './collision/TimeOfImpact';\nexport * from './collision/DynamicTree';\nexport * from './util/stats';\n\nimport { CollidePolygons } from './collision/shape/CollidePolygon';\nimport { Settings } from './Settings';\nimport { Sweep } from './common/Sweep';\nimport { DynamicTree } from './collision/DynamicTree';\nimport { Manifold } from './collision/Manifold';\nimport { Distance } from './collision/Distance';\nimport { TimeOfImpact } from './collision/TimeOfImpact';\nimport { stats } from './util/stats';\n\n/** @deprecated Merged with main namespace */\nexport const internal = {\n CollidePolygons,\n Settings,\n Sweep,\n Manifold,\n Distance,\n TimeOfImpact,\n DynamicTree,\n stats\n};\n"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","__assign","assign","t","s","i","n","arguments","length","apply","options","input","defaults","output","key","getOwnPropertySymbols","symbols","symbol","propertyIsEnumerable","math","Math","EPSILON","isFinite","x","isNaN","assert","nextPowerOfTwo","isPowerOfTwo","mod","num","min","max","clamp","random","Vec2","y","_serialize","_deserialize","data","obj","zero","neo","clone","v","toString","JSON","stringify","isValid","o","setZero","set","setNum","setVec2","value","wSet","a","w","setCombine","setMul","add","wAdd","addCombine","addMul","wSub","subCombine","subMul","sub","mul","m","lengthOf","lengthSquared","normalize","invLength","sqrt","distance","dx","dy","distanceSquared","areEqual","skew","dot","cross","crossVec2Vec2","crossVec2Num","crossNumVec2","addCross","addCrossVec2Num","addCrossNumVec2","combine","mulNumVec2","mulVec2Num","neg","abs","mid","upper","lower","lengthSqr","scale","r","scaleFn","translateFn","AABB","lowerBound","upperBound","getCenter","getExtents","getPerimeter","lowerA","upperA","lowerB","upperB","lowerX","lowerY","upperX","upperY","combinePoints","aabb","contains","result","extend","testOverlap","d1x","d2x","d1y","d2y","diff","wD","hD","rayCast","tmin","Infinity","tmax","p1","p2","absD","normal","f","inv_d","t1","t2","temp","maxFraction","fraction","Settings","defineProperty","linearSlop","maxTranslation","maxRotation","get","pow","linearSleepTolerance","angularSleepTolerance","maxManifoldPoints","maxPolygonVertices","aabbExtension","aabbMultiplier","angularSlop","PI","maxSubSteps","maxTOIContacts","maxTOIIterations","maxDistnceIterations","velocityThreshold","maxLinearCorrection","maxAngularCorrection","baumgarte","toiBaugarte","timeToSleep","Pool","opts","_list","_max","_createCount","_outCount","_inCount","_discardCount","_createFn","_outFn","allocate","_inFn","release","_discardFn","discard","size","item","shift","push","TreeNode","id","userData","parent","child1","child2","height","isLeaf","DynamicTree","inputPool","stack","stackPool","iteratorPool","Iterator","iterator","close","m_root","m_nodes","m_lastProxyId","m_pool","getUserData","getFatAABB","allocateNode","node","freeNode","createProxy","insertLeaf","destroyProxy","removeLeaf","moveProxy","leaf","leafAABB","index","area","combinedAABB","combinedArea","cost","inheritanceCost","cost1","oldArea","cost2","sibling","oldParent","newParent","balance","grandParent","iA","A","B","C","F","G","D","E","getHeight","getAreaRatio","rootArea","totalArea","it","preorder","next","computeHeight","height1","height2","validateStructure","validateMetrics","validate","getMaxBalance","maxBalance","rebuildBottomUp","nodes","count","minCost","iMin","jMin","aabbi","j","aabbj","parent_1","shiftOrigin","newOrigin","query","queryCallback","pop","rayCastCallback","abs_v","segmentAABB","subInput","c","h","parents","states","root","BroadPhase","_this","m_tree","m_proxyCount","m_moveBuffer","proxyId","m_queryProxyId","proxyIdA","proxyIdB","userDataA","userDataB","m_callback","aabbA","aabbB","getProxyCount","getTreeHeight","getTreeBalance","getTreeQuality","bufferMove","unbufferMove","displacement","touchProxy","updatePairs","addPairCallback","fatAABB","Rot","angle","setAngle","setRot","setIdentity","rot","identity","sin","cos","getAngle","atan2","getXAxis","getYAxis","qr","mulRot","mulVec2","mulSub","mulT","mulTRot","mulTVec2","Transform","position","rotation","q","xf","setTransform","isArray","arr","mulXf","mulAll","mulFn","mulTXf","px","py","Sweep","localCenter","alpha0","c0","a0","setLocalCenter","getTransform","beta","advance","alpha","forward","that","Velocity","Position","Shape","m_type","m_radius","FixtureDefDefault","friction","restitution","density","isSensor","filterGroupIndex","filterCategoryBits","filterMaskBits","FixtureProxy","fixture","childIndex","Fixture","body","shape","def","m_body","m_friction","m_restitution","m_density","m_isSensor","m_filterGroupIndex","m_filterCategoryBits","m_filterMaskBits","m_shape","m_next","m_proxies","childCount","getChildCount","m_userData","_reset","getBody","broadPhase","m_world","m_broadPhase","destroyProxies","createProxies","m_xf","resetMassData","restore","getType","getShape","setSensor","sensor","setAwake","setUserData","getNext","getDensity","setDensity","getFriction","setFriction","getRestitution","setRestitution","testPoint","getMassData","massData","computeMass","getAABB","proxy","computeAABB","synchronize","xf1","xf2","aabb1","aabb2","setFilterData","filter","groupIndex","categoryBits","maskBits","refilter","getFilterGroupIndex","setFilterGroupIndex","getFilterCategoryBits","setFilterCategoryBits","getFilterMaskBits","setFilterMaskBits","edge","getContactList","contact","fixtureA","getFixtureA","fixtureB","getFixtureB","flagForFiltering","world","getWorld","shouldCollide","collideA","collideB","STATIC","KINEMATIC","DYNAMIC","BodyDefDefault","type","linearVelocity","angularVelocity","linearDamping","angularDamping","fixedRotation","bullet","gravityScale","allowSleep","awake","active","MassData","mass","center","I","Body","m_awakeFlag","m_autoSleepFlag","m_bulletFlag","m_fixedRotationFlag","m_activeFlag","m_islandFlag","m_toiFlag","m_mass","m_invMass","m_I","m_invI","m_sweep","c_velocity","c_position","m_force","m_torque","m_linearVelocity","m_angularVelocity","m_linearDamping","m_angularDamping","m_gravityScale","m_sleepTime","m_jointList","m_contactList","m_fixtureList","m_prev","m_destroyed","fixtures","_addFixture","isWorldLocked","isLocked","getFixtureList","getJointList","isStatic","isDynamic","isKinematic","setStatic","setType","setDynamic","setKinematic","synchronizeFixtures","ce","ce0","destroyContact","proxyCount","isBullet","setBullet","flag","isSleepingAllowed","setSleepingAllowed","isAwake","isActive","setActive","isFixedRotation","setFixedRotation","synchronizeTransform","getPosition","setPosition","getWorldCenter","getLocalCenter","getLinearVelocity","getLinearVelocityFromWorldPoint","worldPoint","getLinearVelocityFromLocalPoint","localPoint","getWorldPoint","setLinearVelocity","getAngularVelocity","setAngularVelocity","getLinearDamping","setLinearDamping","getAngularDamping","setAngularDamping","getGravityScale","setGravityScale","getMass","getInertia","oldCenter","setMassData","applyForce","force","point","wake","applyForceToCenter","applyTorque","torque","applyLinearImpulse","impulse","applyAngularImpulse","jn","other","joint","m_collideConnected","m_newFixture","createFixture","fixdef","destroyFixture","publish","getWorldVector","localVector","getLocalPoint","getLocalVector","worldVector","JointEdge","prev","Joint","bodyA","bodyB","m_edgeA","m_edgeB","m_bodyA","m_bodyB","collideConnected","getBodyA","getBodyB","getCollideConnected","stats","gjkCalls","gjkIters","gjkMaxIters","toiTime","toiMaxTime","toiCalls","toiIters","toiMaxIters","toiRootIters","toiMaxRootIters","newline","string","name_1","Timer","Date","now","time","DistanceInput","proxyA","DistanceProxy","proxyB","transformA","transformB","useRadii","DistanceOutput","pointA","pointB","SimplexCache","metric","indexA","indexB","Distance","cache","xfA","xfB","simplex","Simplex","readCache","vertices","m_v","k_maxIters","saveA","saveB","saveCount","iter","m_count","solve","getClosestPoint","getSearchDirection","vertex","getSupport","wA","getVertex","wB","duplicate","getWitnessPoints","iterations","writeCache","rA","rB","m_buffer","m_vertices","getVertexCount","bestIndex","bestValue","getSupportVertex","computeDistanceProxy","SimplexVertex","m_v1","m_v2","m_v3","wALocal","wBLocal","metric1","metric2","getMetric","e12","pA","pB","solve2","solve3","w1","w2","d12_2","d12_1","inv_d12","w3","w1e12","e13","w1e13","d13_1","d13_2","e23","w2e23","d23_1","d23_2","n123","d123_1","d123_2","d123_3","inv_d13","inv_d23","inv_d123","shapeA","shapeB","Input","Output","Proxy","Cache","TOIOutputState","TOIInput","sweepA","sweepB","exports","TOIOutput","SeparationFunctionType","TimeOfImpact","timer","state","e_unknown","tMax","totalRadius","target","tolerance","k_maxIterations","distanceInput","distanceOutput","e_overlapped","e_touching","fcn","SeparationFunction","initialize","done","pushBackIter","s2","findMinSeparation","e_separated","s1","evaluate","e_failed","rootIterCount","a1","a2","m_proxyA","m_proxyB","m_localPoint","m_axis","m_sweepA","m_sweepB","e_points","localPointA","localPointB","e_faceB","localPointB1","localPointB2","e_faceA","localPointA1","localPointA2","compute","find","axisA","axisB","TimeStep","dt","inv_dt","velocityIterations","positionIterations","warmStarting","blockSolve","inv_dt0","dtRatio","reset","s_subStep","ContactImpulse","normals","tangents","v_points","normalImpulse","tangentImpulse","Solver","m_stack","m_bodies","m_contacts","m_joints","clear","addBody","addContact","addJoint","solveWorld","step","m_bodyList","seed","isEnabled","isTouching","sensorA","m_fixtureA","sensorB","m_fixtureB","je","solveIsland","gravity","m_gravity","m_allowSleep","initConstraint","initVelocityConstraint","warmStartConstraint","initVelocityConstraints","solveVelocityConstraints","solveVelocityConstraint","storeConstraintImpulses","translation","maxTranslationSquared","ratio","maxRotationSquared","positionSolved","minSeparation","separation","solvePositionConstraint","contactsOkay","jointsOkay","jointOkay","solvePositionConstraints","postSolveIsland","minSleepTime","linTolSqr","linearSleepToleranceSqr","angTolSqr","angularSleepToleranceSqr","solveWorldTOI","m_stepComplete","m_toiCount","m_toi","minContact","minAlpha","fA_1","fB_1","bA_1","bB_1","activeA","activeB","getChildIndexA","getChildIndexB","fA","fB","bA","bB","backup1","backup2","update","bodies","backup","solveIslandTOI","findNewContacts","m_subStepping","setEnabled","subStep","toiA","toiB","solvePositionConstraintTOI","postSolve","m_impulse","ManifoldType","ContactFeatureType","PointState","Mat22","ex","ey","getInverse","det","imx","mx","mulMat22","mulTMat22","mx1","mx2","ClipVertex","ContactID","Manifold","localNormal","points","ManifoldPoint","pointCount","getWorldManifold","wm","radiusA","radiusB","WorldManifold","separations","e_circles","dist","cA","cB","planePoint","clipPoint","clipSegmentToLine","getPointStates","cf","ContactFeature","typeA","typeB","state1","state2","manifold1","manifold2","removeState","persistState","addState","vOut","vIn","offset","vertexIndexA","numOut","distance0","distance1","interp","e_vertex","e_face","ContactEdge","mixFriction","friction1","friction2","mixRestitution","restitution1","restitution2","s_registers","VelocityConstraintPoint","normalMass","tangentMass","velocityBias","Contact","evaluateFcn","m_manifold","m_tangentSpeed","m_enabledFlag","m_touchingFlag","m_filterFlag","m_bulletHitFlag","v_normal","v_normalMass","v_K","p_localPoints","p_localNormal","p_localPoint","p_localCenterA","p_localCenterB","m_nodeA","m_nodeB","m_indexA","m_indexB","m_evaluateFcn","manifold","getManifold","v_invMassA","v_invMassB","v_invIA","v_invIB","v_friction","v_restitution","v_tangentSpeed","v_pointCount","p_invMassA","p_invMassB","p_invIA","p_invIB","p_radiusA","p_radiusB","p_type","p_pointCount","cp","vcp","worldManifold","resetFriction","resetRestitution","setTangentSpeed","speed","getTangentSpeed","listener","oldManifold","touching","wasTouching","nmp","omp","beginContact","endContact","preSolve","_solvePositionConstraint","toi","positionA","positionB","localCenterA","localCenterB","mA","mB","iB","aA","aB","rnA","rnB","K","P","velocityA","velocityB","vA","vB","kNormal","tangent","rtA","rtB","kTangent","vRel","vcp1","vcp2","rn1A","rn1B","rn2A","rn2B","k11","k22","k12","dv","vt","lambda","maxFriction","newImpulse","vn","dv1","dv2","vn1","vn2","P1","P2","addType","type1","type2","callback","destroy","WorldDefDefault","continuousPhysics","subStepping","World","s_step","m_solver","m_contactCount","m_bodyCount","m_jointCount","m_clearForces","m_locked","m_warmStarting","m_continuousPhysics","m_blockSolve","m_velocityIterations","m_positionIterations","m_t","joints","getBodyList","context","_addBody","createJoint","getBodyCount","getJointCount","getContactCount","setGravity","getGravity","setAllowSleeping","getAllowSleeping","setWarmStarting","getWarmStarting","setContinuousPhysics","getContinuousPhysics","setSubStepping","getSubStepping","setAutoClearForces","getAutoClearForces","clearForces","queryAABB","point1","point2","createBody","arg1","arg2","createDynamicBody","createKinematicBody","destroyBody","je0","destroyJoint","f0","timeStep","updateContacts","createContact","next_c","on","name","_listeners","off","listeners","indexOf","splice","arg3","l","Vec3","z","EdgeShape","_super","v1","v2","TYPE","polygonRadius","m_vertex1","m_vertex2","m_vertex0","m_vertex3","m_hasVertex0","m_hasVertex3","vertex1","vertex2","vertex0","vertex3","hasVertex0","hasVertex3","setPrevVertex","setNextVertex","getRadius","setNext","getNextVertex","setPrev","getPrevVertex","_set","_clone","e","numerator","denominator","rr","Edge","ChainShape","loop","m_prevVertex","m_nextVertex","m_hasPrevVertex","m_hasNextVertex","m_isLoop","_createLoop","_createChain","isLoop","hasPrevVertex","hasNextVertex","prevVertex","nextVertex","getChildEdge","Chain","PolygonShape","m_centroid","m_normals","_setAsBox","ps","unique","linearSlopSquared","i0","x0","hull","ih","ie","i1","i2","vs","pRef","inv3","p3","e1","e2","triangleArea","ComputeCentroid","hx","hy","pLocal","minX","minY","maxX","maxY","k_inv3","ex1","ey1","ex2","ey2","Polygon","BoxShape","Box","CircleShape","m_p","radius","sigma","Circle","DEFAULTS","frequencyHz","dampingRatio","DistanceJoint","anchorA","anchorB","m_localAnchorA","localAnchorA","m_localAnchorB","localAnchorB","m_length","m_frequencyHz","m_dampingRatio","m_gamma","m_bias","gamma","bias","_setAnchors","getLocalAnchorA","getLocalAnchorB","setLength","getLength","setFrequency","hz","getFrequency","setDampingRatio","getDampingRatio","getAnchorA","getAnchorB","getReactionForce","m_u","getReactionTorque","m_localCenterA","m_localCenterB","m_invMassA","m_invMassB","m_invIA","m_invIB","qA","qB","m_rA","m_rB","crAu","crBu","invMass","omega","k","vpA","vpB","Cdot","u","maxForce","maxTorque","FrictionJoint","anchor","m_linearImpulse","m_angularImpulse","m_maxForce","m_maxTorque","setMaxForce","getMaxForce","setMaxTorque","getMaxTorque","m_linearMass","m_angularMass","oldImpulse","maxImpulse","Mat33","ez","solve33","solve22","a11","a12","a21","a22","getInverse22","M","getSymInverse33","a13","a23","a33","mulVec3","lowerAngle","upperAngle","maxMotorTorque","motorSpeed","enableLimit","enableMotor","RevoluteJoint","m_limitState","m_referenceAngle","referenceAngle","m_motorImpulse","m_lowerAngle","m_upperAngle","m_maxMotorTorque","m_motorSpeed","m_enableLimit","m_enableMotor","getReferenceAngle","getJointAngle","getJointSpeed","isMotorEnabled","getMotorTorque","setMotorSpeed","getMotorSpeed","setMaxMotorTorque","getMaxMotorTorque","isLimitEnabled","getLowerLimit","getUpperLimit","setLimits","m_motorMass","jointAngle","Cdot1","Cdot2","rhs","reduced","positionError","angularError","limitImpulse","lowerTranslation","upperTranslation","maxMotorForce","PrismaticJoint","axis","m_localXAxisA","localAxisA","m_localYAxisA","m_lowerTranslation","m_upperTranslation","m_maxMotorForce","m_perp","m_K","getLocalAxisA","getJointTranslation","setMaxMotorForce","getMaxMotorForce","getMotorForce","m_a1","m_a2","m_s1","m_s2","k13","k23","k33","jointTranslation","LA","LB","f1","df","f2r","perp","C1","linearError","C2","impulse1","GearJoint","joint1","joint2","coordinateA","coordinateB","m_joint1","m_joint2","m_ratio","m_type1","m_type2","m_bodyC","xfC","aC","revolute","m_localAnchorC","m_referenceAngleA","m_localAxisC","prismatic","pC","m_bodyD","xfD","aD","m_localAnchorD","m_referenceAngleB","m_localAxisD","pD","m_constant","getJoint1","getJoint2","setRatio","getRatio","m_JvAC","m_JwA","m_lcA","m_lcB","m_lcC","m_lcD","m_mA","m_mB","m_mC","m_mD","m_iA","m_iB","m_iC","m_iD","vC","wC","vD","qC","qD","m_JwC","rC","m_JvBD","m_JwB","m_JwD","rD","JvAC","JvBD","JwA","JwB","JwC","JwD","cC","cD","correctionFactor","MotorJoint","m_linearOffset","linearOffset","m_angularOffset","angularOffset","m_correctionFactor","setCorrectionFactor","factor","getCorrectionFactor","setLinearOffset","getLinearOffset","setAngularOffset","getAngularOffset","m_linearError","m_angularError","inv_h","MouseJoint","m_targetA","m_beta","m_C","_localAnchorB","setTarget","getTarget","velocity","PulleyJoint","groundA","groundB","m_groundAnchorA","groundAnchorA","m_groundAnchorB","groundAnchorB","m_lengthA","lengthA","m_lengthB","lengthB","getGroundAnchorA","getGroundAnchorB","getLengthA","getLengthB","getCurrentLengthA","getCurrentLengthB","m_uB","m_uA","ruA","ruB","PA","PB","uA","uB","maxLength","RopeJoint","m_maxLength","m_state","setMaxLength","getMaxLength","getLimitState","crA","crB","WeldJoint","invM","impulse2","WheelJoint","m_ax","m_ay","localAxis","m_springMass","m_springImpulse","setSpringFrequencyHz","getSpringFrequencyHz","setSpringDampingRatio","getSpringDampingRatio","m_sAy","m_sBy","m_sAx","m_sBx","damp","ay","sAy","sBy","SID","Serializer","rootClass","preSerialize","postSerialize","preDeserialize","postDeserialize","refTypes","restoreTypes","CLASS_BY_TYPE_PROP","_a","toJson","json","queue","refMap","storeRef","typeName","__sid","ref","refIndex","refType","top","serialize","newValue","str","fromJson","deserialize","cls","ctx","deserializer","findDeserilizer","restoreRef","serializer","CollideCircles","circleA","circleB","distSqr","CollideEdgeCircle","chain","edgeA","Q","P_1","d_1","A1","B1","P_2","d_2","B2","A2","den","findMaxSeparation","poly1","poly2","count1","count2","n1s","v1s","v2s","maxSeparation","si","sij","CollidePolygons","polyA","polyB","separationA","edgeB","separationB","edge1","flip","incidentEdge","normals1","vertices2","normals2","normal1","minDot","findIncidentEdge","vertices1","iv1","iv2","v11","v12","localTangent","frontOffset","sideOffset1","sideOffset2","clipPoints1","clipPoints2","CollidePolygonCircle","EPAxisType","VertexType","polygonA","cLocal","normalIndex","vertexCount","vertIndex1","vertIndex2","u1","u2","faceCenter","CollideEdgePolygon","EPAxis","TempPolygon","ReferenceFace","sideNormal1","sideNormal2","edgeAxis","polygonAxis","polygonBA","rf","polygonB","centroidB","v0","v3","normal0","normal2","front","offset1","offset0","offset2","convex1","convex2","edge0","edge2","lowerLimit","upperLimit","e_edgeA","e_edgeB","primaryAxis","internal"],"mappings":"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"} \ No newline at end of file diff --git a/index.d.ts b/index.d.ts index fd997107..d0da6bd7 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,4 +1 @@ -export as namespace planck; - -// export * from "./dist/planck"; -export * from "./dist/planck-with-testbed"; +export * from './dist/planck-with-testbed'; \ No newline at end of file diff --git a/index.test-d.ts b/index.test-d.ts deleted file mode 100644 index 67f500be..00000000 --- a/index.test-d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import * as planck from '.' - -const world = planck.World() - -const body = world.createBody() -const shape = planck.Circle(3) - -body.createFixture({ - shape, -}) diff --git a/package-lock.json b/package-lock.json index 74f7b134..96bfa16d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "planck", - "version": "1.0.0-alpha.4", + "version": "1.0.0-beta.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "planck", - "version": "1.0.0-alpha.4", + "version": "1.0.0-beta.0", "license": "MIT", "dependencies": { - "stage-js": "^0.9.4" + "stage-js": "github:piqnt/stage.js#v1-alpha" }, "devDependencies": { "@babel/plugin-proposal-class-properties": "^7.13.0", @@ -18,31 +18,36 @@ "@rollup/plugin-commonjs": "^17.1.0", "@rollup/plugin-node-resolve": "^11.2.0", "@rollup/plugin-replace": "^2.4.1", + "@types/chai": "^4.3.5", "@types/estree": "^0.0.50", - "@types/mocha": "^8.2.2", + "@types/mocha": "^9.1.1", "@typescript-eslint/eslint-plugin": "^5.2.0", "@typescript-eslint/parser": "^5.2.0", "ajv": "^6.10.2", - "chai": "^4.3.3", + "chai": "^4.3.7", "dtslint": "^3.6.9", "eslint": "^8.1.0", "esm": "^3.2.25", "express": "^4.17.1", "handlebars": "^4.7.6", "is-core-module": "^2.2.0", - "mocha": "^8.3.1", + "mocha": "^10.2.0", "nyc": "^15.1.0", - "rollup": "^2.40.0", + "rollup": "^2.77.4", "rollup-plugin-filesize": "^9.1.1", "rollup-plugin-license": "^2.3.0", "rollup-plugin-terser": "^7.0.2", "rollup-plugin-ts": "^1.3.10", - "sinon": "^9.2.4", - "ts-node": "^9.1.1", - "tsd": "^0.18.0", + "sinon": "^15.2.0", + "ts-mocha": "^10.0.0", + "ts-node": "^10.9.1", + "tsd": "^0.28.1", "typedoc": "^0.17.8", "typedoc-plugin-markdown": "^2.3.1", "typescript": "^4.0.0-beta" + }, + "engines": { + "node": ">=14.0" } }, "node_modules/@babel/code-frame": { @@ -1338,6 +1343,18 @@ "to-fast-properties": "^2.0.0" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@definitelytyped/header-parser": { "version": "0.0.80", "resolved": "https://registry.npmjs.org/@definitelytyped/header-parser/-/header-parser-0.0.80.tgz", @@ -1420,23 +1437,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", @@ -1608,6 +1608,43 @@ "node": ">=8" } }, + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@mdn/browser-compat-data": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-3.3.3.tgz", @@ -1844,39 +1881,54 @@ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/@sinonjs/samsam": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz", - "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.6.0", + "@sinonjs/commons": "^2.0.0", "lodash.get": "^4.4.2", "type-detect": "^4.0.8" } }, + "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, "node_modules/@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, "node_modules/@tootallnate/once": { @@ -1888,15 +1940,35 @@ "node": ">= 6" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "node_modules/@tsd/typescript": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-4.4.4.tgz", - "integrity": "sha512-XNaotnbhU6sKSXYg9rVz4L9i9g+j+x1IIgMPztK8KumtMEsrLXcqPBKp/qzmUKwAZEqgHs4+TTz90dUu5/aIqQ==", - "dev": true, - "bin": { - "tsc": "typescript/bin/tsc", - "tsserver": "typescript/bin/tsserver" - } + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-YQi2lvZSI+xidKeUjlbv6b6Zw7qB3aXHw5oGJLs5OOGAEqKIOvz5UIAkWyg0bJbkSUWPBEtaOHpVxU4EYBO1Jg==", + "dev": true }, "node_modules/@types/babel__core": { "version": "7.1.14", @@ -1939,6 +2011,12 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, "node_modules/@types/eslint": { "version": "7.28.2", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.2.tgz", @@ -1961,6 +2039,13 @@ "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "optional": true + }, "node_modules/@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", @@ -1968,9 +2053,9 @@ "dev": true }, "node_modules/@types/mocha": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz", - "integrity": "sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", "dev": true }, "node_modules/@types/node": { @@ -2050,23 +2135,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", @@ -2185,23 +2253,6 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.2.0.tgz", @@ -2259,23 +2310,6 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -2329,12 +2363,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, "node_modules/@wessberg/browserslist-generator": { "version": "1.0.47", "resolved": "https://registry.npmjs.org/@wessberg/browserslist-generator/-/browserslist-generator-1.0.47.tgz", @@ -2462,6 +2490,15 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -2628,9 +2665,9 @@ } }, "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", @@ -3438,15 +3475,16 @@ "dev": true }, "node_modules/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", + "loupe": "^2.3.1", "pathval": "^1.1.1", "type-detect": "^4.0.5" }, @@ -3487,24 +3525,30 @@ } }, "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "glob-parent": "~5.1.0", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, "node_modules/chownr": { @@ -3854,9 +3898,9 @@ } }, "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -3902,15 +3946,15 @@ } }, "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, "dependencies": { "type-detect": "^4.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=6" } }, "node_modules/deep-is": { @@ -3991,6 +4035,15 @@ "node": ">=0.3.1" } }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -4597,23 +4650,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/eslint/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -4662,18 +4698,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/eslint/node_modules/semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -5322,9 +5346,9 @@ } }, "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -5397,15 +5421,6 @@ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -5930,6 +5945,18 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -6082,6 +6109,100 @@ "node": ">=8" } }, + "node_modules/jest-diff": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz", + "integrity": "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", @@ -6124,9 +6245,9 @@ "dev": true }, "node_modules/js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { "argparse": "^2.0.1" @@ -6319,7 +6440,7 @@ "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, "node_modules/lodash.merge": { @@ -6329,15 +6450,19 @@ "dev": true }, "node_modules/log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "dependencies": { - "chalk": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/log-symbols/node_modules/ansi-styles": { @@ -6410,6 +6535,15 @@ "node": ">=8" } }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6694,10 +6828,13 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/minimist-options": { "version": "4.1.0", @@ -6835,43 +6972,39 @@ } }, "node_modules/mocha": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", - "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, "dependencies": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.1", - "debug": "4.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", + "glob": "7.2.0", "he": "1.2.0", - "js-yaml": "4.0.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.1.20", - "serialize-javascript": "5.0.1", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.1.0", + "workerpool": "6.2.1", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "bin": { "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "mocha": "bin/mocha.js" }, "engines": { - "node": ">= 10.12.0" + "node": ">= 14.0.0" }, "funding": { "type": "opencollective", @@ -6887,6 +7020,15 @@ "node": ">=8" } }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/mocha/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -6916,26 +7058,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/mocha/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6954,6 +7076,18 @@ "node": ">=8" } }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -7056,9 +7190,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -7089,22 +7223,31 @@ "dev": true }, "node_modules/nise": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz", - "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" } }, + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, "node_modules/nise/node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true }, "node_modules/nise/node_modules/path-to-regexp": { @@ -8100,6 +8243,32 @@ "node": ">= 0.8.0" } }, + "node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -8254,6 +8423,12 @@ "node": ">= 0.8" } }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, "node_modules/read-package-json-fast": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.2.tgz", @@ -8376,9 +8551,9 @@ } }, "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { "picomatch": "^2.2.1" @@ -8626,9 +8801,9 @@ } }, "node_modules/rollup": { - "version": "2.47.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.47.0.tgz", - "integrity": "sha512-rqBjgq9hQfW0vRmz+0S062ORRNJXvwRpzxhFXORvar/maZqY6za3rgQ/p1Glg+j1hnc1GtYyQCPiAei95uTElg==", + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -8637,7 +8812,7 @@ "node": ">=10.0.0" }, "optionalDependencies": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, "node_modules/rollup-plugin-filesize": { @@ -8953,9 +9128,9 @@ "dev": true }, "node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "dependencies": { "randombytes": "^2.1.0" @@ -9033,17 +9208,17 @@ "dev": true }, "node_modules/sinon": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", - "integrity": "sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", + "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.8.1", - "@sinonjs/fake-timers": "^6.0.1", - "@sinonjs/samsam": "^5.3.1", - "diff": "^4.0.2", - "nise": "^4.0.4", - "supports-color": "^7.1.0" + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^10.3.0", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.1.0", + "nise": "^5.1.4", + "supports-color": "^7.2.0" }, "funding": { "type": "opencollective", @@ -9051,9 +9226,9 @@ } }, "node_modules/sinon/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", "dev": true, "engines": { "node": ">=0.3.1" @@ -9297,9 +9472,9 @@ } }, "node_modules/stage-js": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/stage-js/-/stage-js-0.9.4.tgz", - "integrity": "sha512-fNN6rkYD55T4NUxJE71hixXYS9DoyHVX5S8sQcq5yiozX1kqHP/wnByZwFfdAGNZjb5rROJ90zwb0EbM9U2Jqg==" + "version": "1.0.0-alpha.1", + "resolved": "git+ssh://git@github.com/piqnt/stage.js.git#88376e007f1db3859332482be3fb461b7c5a818d", + "license": "MIT" }, "node_modules/statuses": { "version": "1.5.0", @@ -9572,30 +9747,108 @@ "node": ">=8" } }, - "node_modules/ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "node_modules/ts-mocha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz", + "integrity": "sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==", + "dev": true, + "dependencies": { + "ts-node": "7.0.1" + }, + "bin": { + "ts-mocha": "bin/ts-mocha" + }, + "engines": { + "node": ">= 6.X.X" + }, + "optionalDependencies": { + "tsconfig-paths": "^3.5.0" + }, + "peerDependencies": { + "mocha": "^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X" + } + }, + "node_modules/ts-mocha/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/ts-mocha/node_modules/ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", "dev": true, "dependencies": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "bin": { + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ts-mocha/node_modules/yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.17", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "bin": { "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" }, - "engines": { - "node": ">=10.0.0" - }, "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, "node_modules/ts-node/node_modules/diff": { @@ -9607,15 +9860,52 @@ "node": ">=0.3.1" } }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "optional": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "optional": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=4" + } + }, "node_modules/tsd": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.18.0.tgz", - "integrity": "sha512-UIkxm2CLmSjXlQs4zqxgVV9UmzK8VgJ63eBpgkH/ZsMkiUdzxxHvdCCg8F314HDxzfQl2muJEy/TEcXHIFIPXg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.28.1.tgz", + "integrity": "sha512-FeYrfJ05QgEMW/qOukNCr4fAJHww4SaKnivAXRv4g5kj4FeLpNV7zH4dorzB9zAfVX4wmA7zWu/wQf7kkcvfbw==", "dev": true, "dependencies": { - "@tsd/typescript": "~4.4.3", + "@tsd/typescript": "~5.0.2", "eslint-formatter-pretty": "^4.1.0", "globby": "^11.0.1", + "jest-diff": "^29.0.3", "meow": "^9.0.0", "path-exists": "^4.0.0", "read-pkg-up": "^7.0.0" @@ -9624,7 +9914,7 @@ "tsd": "dist/cli.js" }, "engines": { - "node": ">=12" + "node": ">=14.16" } }, "node_modules/tslib": { @@ -9992,6 +10282,12 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -10142,9 +10438,9 @@ "dev": true }, "node_modules/workerpool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", - "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, "node_modules/wrap-ansi": { @@ -11555,6 +11851,15 @@ "to-fast-properties": "^2.0.0" } }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, "@definitelytyped/header-parser": { "version": "0.0.80", "resolved": "https://registry.npmjs.org/@definitelytyped/header-parser/-/header-parser-0.0.80.tgz", @@ -11627,19 +11932,10 @@ "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "ms": "2.1.2" + "sprintf-js": "~1.0.2" } }, "globals": { @@ -11769,6 +12065,37 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@mdn/browser-compat-data": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-3.3.3.tgz", @@ -11954,39 +12281,56 @@ } } }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^3.0.0" } }, "@sinonjs/samsam": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz", - "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", "dev": true, "requires": { - "@sinonjs/commons": "^1.6.0", + "@sinonjs/commons": "^2.0.0", "lodash.get": "^4.4.2", "type-detect": "^4.0.8" + }, + "dependencies": { + "@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + } } }, "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, "@tootallnate/once": { @@ -11995,10 +12339,34 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "@tsd/typescript": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-4.4.4.tgz", - "integrity": "sha512-XNaotnbhU6sKSXYg9rVz4L9i9g+j+x1IIgMPztK8KumtMEsrLXcqPBKp/qzmUKwAZEqgHs4+TTz90dUu5/aIqQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-YQi2lvZSI+xidKeUjlbv6b6Zw7qB3aXHw5oGJLs5OOGAEqKIOvz5UIAkWyg0bJbkSUWPBEtaOHpVxU4EYBO1Jg==", "dev": true }, "@types/babel__core": { @@ -12042,6 +12410,12 @@ "@babel/types": "^7.3.0" } }, + "@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, "@types/eslint": { "version": "7.28.2", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.2.tgz", @@ -12064,6 +12438,13 @@ "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "optional": true + }, "@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", @@ -12071,9 +12452,9 @@ "dev": true }, "@types/mocha": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz", - "integrity": "sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", "dev": true }, "@types/node": { @@ -12137,15 +12518,6 @@ "tsutils": "^3.21.0" }, "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, "ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", @@ -12220,17 +12592,6 @@ "@typescript-eslint/types": "5.2.0", "@typescript-eslint/typescript-estree": "5.2.0", "debug": "^4.3.2" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } } }, "@typescript-eslint/scope-manager": { @@ -12264,15 +12625,6 @@ "tsutils": "^3.21.0" }, "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -12309,12 +12661,6 @@ "eslint-visitor-keys": "^3.0.0" } }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, "@wessberg/browserslist-generator": { "version": "1.0.47", "resolved": "https://registry.npmjs.org/@wessberg/browserslist-generator/-/browserslist-generator-1.0.47.tgz", @@ -12398,6 +12744,12 @@ "dev": true, "requires": {} }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -12522,9 +12874,9 @@ } }, "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -13142,15 +13494,16 @@ "dev": true }, "chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", + "loupe": "^2.3.1", "pathval": "^1.1.1", "type-detect": "^4.0.5" } @@ -13182,19 +13535,19 @@ "dev": true }, "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" } }, "chownr": { @@ -13478,9 +13831,9 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -13511,9 +13864,9 @@ } }, "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, "requires": { "type-detect": "^4.0.0" @@ -13579,6 +13932,12 @@ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, + "diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -13905,15 +14264,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -13944,15 +14294,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -14601,9 +14942,9 @@ } }, "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -14657,12 +14998,6 @@ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, "gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -15060,6 +15395,12 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -15183,6 +15524,75 @@ "istanbul-lib-report": "^3.0.0" } }, + "jest-diff": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz", + "integrity": "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true + }, "jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", @@ -15218,9 +15628,9 @@ "dev": true }, "js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { "argparse": "^2.0.1" @@ -15377,7 +15787,7 @@ "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, "lodash.merge": { @@ -15387,12 +15797,13 @@ "dev": true }, "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { - "chalk": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "dependencies": { "ansi-styles": { @@ -15446,6 +15857,15 @@ } } }, + "loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -15656,9 +16076,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "minimist-options": { @@ -15767,33 +16187,29 @@ } }, "mocha": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", - "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, "requires": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.1", - "debug": "4.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", + "glob": "7.2.0", "he": "1.2.0", - "js-yaml": "4.0.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.1.20", - "serialize-javascript": "5.0.1", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.1.0", + "workerpool": "6.2.1", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" @@ -15805,6 +16221,15 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -15828,20 +16253,6 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -15854,6 +16265,15 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -15931,9 +16351,9 @@ "dev": true }, "nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true }, "natural-compare": { @@ -15955,22 +16375,31 @@ "dev": true }, "nise": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz", - "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" }, "dependencies": { + "@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true }, "path-to-regexp": { @@ -16737,6 +17166,25 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -16849,6 +17297,12 @@ "unpipe": "1.0.0" } }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, "read-package-json-fast": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.2.tgz", @@ -16945,9 +17399,9 @@ } }, "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { "picomatch": "^2.2.1" @@ -17140,12 +17594,12 @@ } }, "rollup": { - "version": "2.47.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.47.0.tgz", - "integrity": "sha512-rqBjgq9hQfW0vRmz+0S062ORRNJXvwRpzxhFXORvar/maZqY6za3rgQ/p1Glg+j1hnc1GtYyQCPiAei95uTElg==", + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "dev": true, "requires": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, "rollup-plugin-filesize": { @@ -17389,9 +17843,9 @@ } }, "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -17454,23 +17908,23 @@ "dev": true }, "sinon": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", - "integrity": "sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", + "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", "dev": true, "requires": { - "@sinonjs/commons": "^1.8.1", - "@sinonjs/fake-timers": "^6.0.1", - "@sinonjs/samsam": "^5.3.1", - "diff": "^4.0.2", - "nise": "^4.0.4", - "supports-color": "^7.1.0" + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^10.3.0", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.1.0", + "nise": "^5.1.4", + "supports-color": "^7.2.0" }, "dependencies": { "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", "dev": true }, "has-flag": { @@ -17675,9 +18129,8 @@ } }, "stage-js": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/stage-js/-/stage-js-0.9.4.tgz", - "integrity": "sha512-fNN6rkYD55T4NUxJE71hixXYS9DoyHVX5S8sQcq5yiozX1kqHP/wnByZwFfdAGNZjb5rROJ90zwb0EbM9U2Jqg==" + "version": "git+ssh://git@github.com/piqnt/stage.js.git#88376e007f1db3859332482be3fb461b7c5a818d", + "from": "stage-js@github:piqnt/stage.js#v1-alpha" }, "statuses": { "version": "1.5.0", @@ -17890,17 +18343,64 @@ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, - "ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "ts-mocha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz", + "integrity": "sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==", "dev": true, "requires": { + "ts-node": "7.0.1", + "tsconfig-paths": "^3.5.0" + }, + "dependencies": { + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + } + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "dev": true + } + } + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.17", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "dependencies": { @@ -17912,15 +18412,48 @@ } } }, + "tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "optional": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "optional": true + } + } + }, "tsd": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.18.0.tgz", - "integrity": "sha512-UIkxm2CLmSjXlQs4zqxgVV9UmzK8VgJ63eBpgkH/ZsMkiUdzxxHvdCCg8F314HDxzfQl2muJEy/TEcXHIFIPXg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.28.1.tgz", + "integrity": "sha512-FeYrfJ05QgEMW/qOukNCr4fAJHww4SaKnivAXRv4g5kj4FeLpNV7zH4dorzB9zAfVX4wmA7zWu/wQf7kkcvfbw==", "dev": true, "requires": { - "@tsd/typescript": "~4.4.3", + "@tsd/typescript": "~5.0.2", "eslint-formatter-pretty": "^4.1.0", "globby": "^11.0.1", + "jest-diff": "^29.0.3", "meow": "^9.0.0", "path-exists": "^4.0.0", "read-pkg-up": "^7.0.0" @@ -18200,6 +18733,12 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -18322,9 +18861,9 @@ "dev": true }, "workerpool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", - "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, "wrap-ansi": { diff --git a/package.json b/package.json index 869a1b00..30f59308 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "planck", - "version": "1.0.0-alpha.4", + "version": "1.0.0-beta.0", "description": "2D JavaScript/TypeScript physics engine for cross-platform HTML5 game development", "homepage": "https://github.com/shakiba/planck.js", "keywords": [ @@ -19,16 +19,38 @@ "type": "git", "url": "git://github.com/shakiba/planck.js.git" }, - "main": "dist/planck.js", - "types": "index.d.ts", "author": "Ali Shakiba", "contributors": [ "Erin Catto", "Ali Shakiba", "Oliver Zell" ], + "type": "module", + "module": "dist/planck.js", + "main": "dist/planck.js", + "jsdelivr": "dist/planck.min.js", + "unpkg": "dist/planck.min.js", + "types": "index.d.ts", + "exports": { + ".": { + "types": "./dist/planck.d.ts", + "umd": "./dist/planck.min.js", + "require": "./dist/planck.cjs", + "default": "./dist/planck.js" + }, + "./with-testbed": { + "types": "./dist/planck-with-testbed.d.ts", + "umd": "./dist/planck-with-testbed.min.js", + "require": "./dist/planck-with-testbed.cjs", + "default": "./dist/planck-with-testbed.js" + }, + "./dist/*": "./dist/*" + }, + "engines": { + "node": ">=14.0" + }, "dependencies": { - "stage-js": "^0.9.4" + "stage-js": "github:piqnt/stage.js#v1-alpha" }, "devDependencies": { "@babel/plugin-proposal-class-properties": "^7.13.0", @@ -37,41 +59,43 @@ "@rollup/plugin-commonjs": "^17.1.0", "@rollup/plugin-node-resolve": "^11.2.0", "@rollup/plugin-replace": "^2.4.1", + "@types/chai": "^4.3.5", "@types/estree": "^0.0.50", - "@types/mocha": "^8.2.2", + "@types/mocha": "^9.1.1", "@typescript-eslint/eslint-plugin": "^5.2.0", "@typescript-eslint/parser": "^5.2.0", "ajv": "^6.10.2", - "chai": "^4.3.3", + "chai": "^4.3.7", "dtslint": "^3.6.9", "eslint": "^8.1.0", "esm": "^3.2.25", "express": "^4.17.1", "handlebars": "^4.7.6", "is-core-module": "^2.2.0", - "mocha": "^8.3.1", + "mocha": "^10.2.0", "nyc": "^15.1.0", - "rollup": "^2.40.0", + "rollup": "^2.77.4", "rollup-plugin-filesize": "^9.1.1", "rollup-plugin-license": "^2.3.0", "rollup-plugin-terser": "^7.0.2", "rollup-plugin-ts": "^1.3.10", - "sinon": "^9.2.4", - "ts-node": "^9.1.1", - "tsd": "^0.18.0", + "sinon": "^15.2.0", + "ts-mocha": "^10.0.0", + "ts-node": "^10.9.1", + "tsd": "^0.28.1", "typedoc": "^0.17.8", "typedoc-plugin-markdown": "^2.3.1", "typescript": "^4.0.0-beta" }, "scripts": { "lint": "eslint './src/**/*.ts'", - "test": "mocha 'src/**/__test__/*.test.*' --require ts-node/register", - "test:coverage": "nyc --reporter=text mocha 'src/**/__test__/*.test.*' --require ts-node/register", - "test:coverage:html": "nyc --reporter=html mocha 'src/**/__test__/*.test.*' --require ts-node/register", - "test:types": "tsd", + "test": "mocha 'src/**/__test__/*.test.*'", + "test:coverage": "nyc --reporter=text mocha 'src/**/__test__/*.test.*'", + "test:coverage:html": "nyc --reporter=html mocha 'src/**/__test__/*.test.*'", + "test:types": "tsd --typings=./dist/planck.d.ts && tsd --typings=./dist/planck-with-testbed.d.ts", "build": "rollup -c", "watch": "rollup -c --watch", - "testbed": "node testbed/server.js", + "testbed": "node testbed/server.cjs", "typedoc": "typedoc --options typedoc.json" } } diff --git a/rollup.config.js b/rollup.config.cjs similarity index 54% rename from rollup.config.js rename to rollup.config.cjs index 91eaf859..a239bd71 100644 --- a/rollup.config.js +++ b/rollup.config.cjs @@ -1,38 +1,61 @@ -import { terser } from "rollup-plugin-terser"; -import license from 'rollup-plugin-license'; -import replace from '@rollup/plugin-replace'; -import filesize from 'rollup-plugin-filesize'; -import typescript from 'rollup-plugin-ts'; -import { nodeResolve } from '@rollup/plugin-node-resolve'; -import commonjs from '@rollup/plugin-commonjs'; -import declarationTransformer from './build-utils/declarationTransformer'; +const { terser } = require('rollup-plugin-terser'); +const license = require('rollup-plugin-license'); +const replace = require('@rollup/plugin-replace'); +const filesize = require('rollup-plugin-filesize'); +const typescript = require('rollup-plugin-ts'); +const { nodeResolve } = require('@rollup/plugin-node-resolve'); +const declarationTransformer = require('./build-utils/declarationTransformer.cjs'); -import licenseBanner from './build-utils/license'; +const licenseBanner = require('./build-utils/license.cjs'); -export default [ +module.exports = [ { - src: 'src/index.ts', + format: 'es', + src: 'src/main.ts', dest: 'dist/planck.js', minimize: false, + sourcemap: false, declaration: true, }, { - src: 'src/index.ts', + format: 'cjs', + src: 'src/main.ts', + dest: 'dist/planck.cjs', + minimize: false, + sourcemap: false, + declaration: false, + }, + { + format: 'umd', + src: 'src/main.ts', dest: 'dist/planck.min.js', minimize: true, + sourcemap: true, declaration: false, }, { - src: 'testbed/index.ts', + format: 'es', + src: 'testbed/main.ts', dest: 'dist/planck-with-testbed.js', minimize: false, + sourcemap: false, declaration: true, }, { - src: 'testbed/index.ts', + format: 'cjs', + src: 'testbed/main.ts', + dest: 'dist/planck-with-testbed.cjs', + minimize: false, + sourcemap: false, + declaration: false, + }, + { + format: 'umd', + src: 'testbed/main.ts', dest: 'dist/planck-with-testbed.min.js', minimize: true, + sourcemap: true, declaration: false, } ].map(options => { @@ -41,25 +64,27 @@ export default [ output: { name: 'planck', file: options.dest, - format: 'umd', + format: options.format, sourcemap: true, }, plugins: [ replace({ preventAssignment: true, values: { - 'DEBUG': JSON.stringify(false), 'ASSERT': JSON.stringify(false), + '_ASSERT': JSON.stringify(false), + // we are still compiling to ES5, so we keep constructor factories until v2 + 'CONSTRUCTOR_FACTORY': JSON.stringify(true), + '_CONSTRUCTOR_FACTORY': JSON.stringify(true), }, }), nodeResolve(), - commonjs({ - include: ['node_modules/stage-js/**'] - }), typescript({ + sourceMap: false, tsconfig: resolvedConfig => ({ ...resolvedConfig, - declaration: options.declaration + declaration: options.declaration, + declarationMap: options.declaration }), transformers: { afterDeclarations: [ diff --git a/src/Settings.ts b/src/Settings.ts index 9b9d55a2..eb5406f2 100644 --- a/src/Settings.ts +++ b/src/Settings.ts @@ -28,7 +28,7 @@ * Tuning constants based on meters-kilograms-seconds (MKS) units. */ // tslint:disable-next-line:no-unnecessary-class -export default class Settings { +export class Settings { // Collision /** * The maximum number of contact points between two convex shapes. Do not change diff --git a/src/__test__/Basic.test.ts b/src/__test__/Basic.test.ts index 5b977049..21ba0162 100644 --- a/src/__test__/Basic.test.ts +++ b/src/__test__/Basic.test.ts @@ -1,8 +1,8 @@ import { expect } from 'chai'; -import Vec2 from '../common/Vec2'; -import Circle from '../collision/shape/CircleShape'; -import World from '../dynamics/World'; +import { Vec2 } from '../common/Vec2'; +import { CircleShape } from '../collision/shape/CircleShape'; +import { World } from '../dynamics/World'; import '../collision/shape/CollideCircle'; @@ -12,7 +12,7 @@ describe('Basic', function(): void { var world = new World(); - var circle = new Circle(1); + var circle = new CircleShape(1); var b1 = world.createBody({ position : new Vec2(0, 0), diff --git a/src/__test__/CCD.test.ts b/src/__test__/CCD.test.ts index 5675fb0d..d7a09ecb 100644 --- a/src/__test__/CCD.test.ts +++ b/src/__test__/CCD.test.ts @@ -1,16 +1,16 @@ import { expect } from 'chai'; -import Vec2 from '../common/Vec2'; -import Transform from '../common/Transform'; -import Sweep from '../common/Sweep'; -import Circle from '../collision/shape/CircleShape'; -import TimeOfImpact, {TOIInput, TOIOutput} from '../collision/TimeOfImpact'; -import Distance, {SimplexCache, DistanceOutput, DistanceInput} from '../collision/Distance'; +import { Vec2 } from '../common/Vec2'; +import { Transform } from '../common/Transform'; +import { Sweep } from '../common/Sweep'; +import { CircleShape } from '../collision/shape/CircleShape'; +import { TimeOfImpact, TOIInput, TOIOutput } from '../collision/TimeOfImpact'; +import { Distance, SimplexCache, DistanceOutput, DistanceInput } from '../collision/Distance'; describe('CCD', function(): void { it('Distance', function(): void { - var c1 = new Circle(1); + var c1 = new CircleShape(1); var input = new DistanceInput(); input.proxyA.set(c1, 0); @@ -40,7 +40,7 @@ describe('CCD', function(): void { }); it('TimeOfImpact', function(): void { - var c1 = new Circle(1); + var c1 = new CircleShape(1); var input = new TOIInput(); input.proxyA.set(c1, 0); diff --git a/src/__test__/Collision.test.ts b/src/__test__/Collision.test.ts index 005d9557..8fd321d4 100644 --- a/src/__test__/Collision.test.ts +++ b/src/__test__/Collision.test.ts @@ -1,11 +1,11 @@ import { expect } from 'chai'; import * as sinon from 'sinon'; -import Vec2 from '../common/Vec2'; -import AABB from '../collision/AABB'; -import DynamicTree from '../collision/DynamicTree'; -import BroadPhase from '../collision/BroadPhase'; -import { FixtureProxy } from "../dynamics/Fixture"; +import { Vec2 } from '../common/Vec2'; +import { AABB } from '../collision/AABB'; +import { DynamicTree } from '../collision/DynamicTree'; +import { BroadPhase } from '../collision/BroadPhase'; + describe('Collision', function(): void { diff --git a/src/__test__/Math.test.ts b/src/__test__/Math.test.ts index 5181ee53..605bb4c1 100644 --- a/src/__test__/Math.test.ts +++ b/src/__test__/Math.test.ts @@ -1,8 +1,8 @@ import { expect } from 'chai'; -import Math from '../common/Math'; -import Vec2 from '../common/Vec2'; -import Vec3 from '../common/Vec3'; +import { math as Math } from '../common/Math'; +import { Vec2 } from '../common/Vec2'; +import { Vec3 } from '../common/Vec3'; describe('Math', function(): void { diff --git a/src/__test__/Pool.test.ts b/src/__test__/Pool.test.ts index 7755d5e7..2934713f 100644 --- a/src/__test__/Pool.test.ts +++ b/src/__test__/Pool.test.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import Pool from '../util/Pool'; +import { Pool } from '../util/Pool'; describe('Pool', function(): void { it('Pool', function(): void { diff --git a/src/__test__/World.test.ts b/src/__test__/World.test.ts index 555f300e..73d17878 100644 --- a/src/__test__/World.test.ts +++ b/src/__test__/World.test.ts @@ -1,8 +1,8 @@ import { expect } from 'chai'; -import Vec2 from '../common/Vec2'; -import World from '../dynamics/World'; -import Box from '../collision/shape/BoxShape'; +import { Vec2 } from '../common/Vec2'; +import { World } from '../dynamics/World'; +import { BoxShape } from '../collision/shape/BoxShape'; // registers Box-Box collision import '../collision/shape/CollidePolygon'; @@ -24,7 +24,7 @@ describe('World', function(): void { }); // The extents are the half-widths of the box. - var groundBox = new Box(50.0, 10.0); + var groundBox = new BoxShape(50.0, 10.0); // Add the ground fixture to the ground body. groundBody.createFixture(groundBox, 0.0); @@ -35,7 +35,7 @@ describe('World', function(): void { }); // Define another box shape for our dynamic body. - var dynamicBox = new Box(1.0, 1.0); + var dynamicBox = new BoxShape(1.0, 1.0); // Add the shape to the body. body.createFixture(dynamicBox, { // Set the box density to be non-zero, so it will be dynamic. diff --git a/src/collision/AABB.ts b/src/collision/AABB.ts index a6ffd294..7bae2a2b 100644 --- a/src/collision/AABB.ts +++ b/src/collision/AABB.ts @@ -22,13 +22,12 @@ * SOFTWARE. */ -import common from '../util/common'; -import Math from '../common/Math'; -import Vec2 from '../common/Vec2'; +import { math as Math } from '../common/Math'; +import { Vec2, Vec2Value } from '../common/Vec2'; -const _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; /** @@ -51,12 +50,12 @@ export interface RayCastOutput { fraction: number; } -export default class AABB { +export class AABB { lowerBound: Vec2; upperBound: Vec2; - constructor(lower?: Vec2, upper?: Vec2) { - if (!(this instanceof AABB)) { + constructor(lower?: Vec2Value, upper?: Vec2Value) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof AABB)) { return new AABB(lower, upper); } @@ -88,11 +87,7 @@ export default class AABB { } static assert(o: any): void { - if (!_ASSERT) return; - if (!AABB.isValid(o)) { - _DEBUG && common.debug(o); - throw new Error('Invalid AABB!'); - } + _ASSERT && console.assert(!AABB.isValid(o), 'Invalid AABB!', o); } /** @@ -136,7 +131,7 @@ export default class AABB { this.upperBound.setNum(upperX, upperY); } - combinePoints(a: Vec2, b: Vec2): void { + combinePoints(a: Vec2Value, b: Vec2Value): void { this.lowerBound.setNum(Math.min(a.x, b.x), Math.min(a.y, b.y)); this.upperBound.setNum(Math.max(a.x, b.x), Math.max(a.y, b.y)); } diff --git a/src/collision/BroadPhase.ts b/src/collision/BroadPhase.ts index df8fd082..186e5d2c 100644 --- a/src/collision/BroadPhase.ts +++ b/src/collision/BroadPhase.ts @@ -22,11 +22,10 @@ * SOFTWARE. */ -import common from '../util/common'; -import Vec2 from '../common/Vec2'; -import Math from '../common/Math'; -import AABB, { RayCastCallback, RayCastInput } from './AABB'; -import DynamicTree, { DynamicTreeQueryCallback } from './DynamicTree'; +import { Vec2 } from '../common/Vec2'; +import { math as Math } from '../common/Math'; +import { AABB, RayCastCallback, RayCastInput } from './AABB'; +import { DynamicTree, DynamicTreeQueryCallback } from './DynamicTree'; import { FixtureProxy } from "../dynamics/Fixture"; @@ -37,7 +36,7 @@ const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; * The broad-phase wraps and extends a dynamic-tree to keep track of moved * objects and query them on update. */ -export default class BroadPhase { +export class BroadPhase { m_tree: DynamicTree = new DynamicTree(); m_proxyCount: number = 0; m_moveBuffer: number[] = []; @@ -133,7 +132,7 @@ export default class BroadPhase { * is called. */ createProxy(aabb: AABB, userData: FixtureProxy): number { - _ASSERT && common.assert(AABB.isValid(aabb)); + _ASSERT && console.assert(AABB.isValid(aabb)); const proxyId = this.m_tree.createProxy(aabb, userData); this.m_proxyCount++; this.bufferMove(proxyId); @@ -154,7 +153,7 @@ export default class BroadPhase { * UpdatePairs to finalized the proxy pairs (for your time step). */ moveProxy(proxyId: number, aabb: AABB, displacement: Vec2): void { - _ASSERT && common.assert(AABB.isValid(aabb)); + _ASSERT && console.assert(AABB.isValid(aabb)); const changed = this.m_tree.moveProxy(proxyId, aabb, displacement); if (changed) { this.bufferMove(proxyId); @@ -185,7 +184,7 @@ export default class BroadPhase { * Update the pairs. This results in pair callbacks. This can only add pairs. */ updatePairs(addPairCallback: (userDataA: FixtureProxy, userDataB: FixtureProxy) => void): void { - _ASSERT && common.assert(typeof addPairCallback === 'function'); + _ASSERT && console.assert(typeof addPairCallback === 'function'); this.m_callback = addPairCallback; // Perform tree queries for all moving proxies. diff --git a/src/collision/Distance.ts b/src/collision/Distance.ts index bfad8581..ffbf32a3 100644 --- a/src/collision/Distance.ts +++ b/src/collision/Distance.ts @@ -22,15 +22,13 @@ * SOFTWARE. */ -import Settings from '../Settings'; -import stats from '../util/stats'; -import common from '../util/common'; - -import Shape from './Shape'; -import Math from '../common/Math'; -import Vec2 from '../common/Vec2'; -import Rot from '../common/Rot'; -import Transform from '../common/Transform'; +import { Settings } from '../Settings'; +import { stats } from '../util/stats'; +import { Shape } from './Shape'; +import { math as Math } from '../common/Math'; +import { Vec2 } from '../common/Vec2'; +import { Rot } from '../common/Rot'; +import { Transform } from '../common/Transform'; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; @@ -91,7 +89,7 @@ export class SimplexCache { * CircleShape, PolygonShape, EdgeShape. The simplex cache is input/output. On * the first call set SimplexCache.count to zero. */ -export default function Distance(output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void { +export const Distance = function (output: DistanceOutput, cache: SimplexCache, input: DistanceInput): void { ++stats.gjkCalls; const proxyA = input.proxyA; @@ -253,7 +251,7 @@ export class DistanceProxy { * Get a vertex by index. Used by Distance. */ getVertex(index: number): Vec2 { - _ASSERT && common.assert(0 <= index && index < this.m_count); + _ASSERT && console.assert(0 <= index && index < this.m_count); return this.m_vertices[index]; } @@ -286,7 +284,7 @@ export class DistanceProxy { */ set(shape: Shape, index: number): void { // TODO remove, use shape instead - _ASSERT && common.assert(typeof shape.computeDistanceProxy === 'function'); + _ASSERT && console.assert(typeof shape.computeDistanceProxy === 'function'); shape.computeDistanceProxy(this, index); } } @@ -358,7 +356,7 @@ class Simplex { } readCache(cache: SimplexCache, proxyA: DistanceProxy, transformA: Transform, proxyB: DistanceProxy, transformB: Transform): void { - _ASSERT && common.assert(cache.count <= 3); + _ASSERT && console.assert(cache.count <= 3); // Copy data from cache. this.m_count = cache.count; @@ -428,7 +426,7 @@ class Simplex { } default: - _ASSERT && common.assert(false); + _ASSERT && console.assert(false); return Vec2.zero(); } } @@ -436,7 +434,7 @@ class Simplex { getClosestPoint(): Vec2 { switch (this.m_count) { case 0: - _ASSERT && common.assert(false); + _ASSERT && console.assert(false); return Vec2.zero(); case 1: @@ -449,7 +447,7 @@ class Simplex { return Vec2.zero(); default: - _ASSERT && common.assert(false); + _ASSERT && console.assert(false); return Vec2.zero(); } } @@ -457,7 +455,7 @@ class Simplex { getWitnessPoints(pA: Vec2, pB: Vec2): void { switch (this.m_count) { case 0: - _ASSERT && common.assert(false); + _ASSERT && console.assert(false); break; case 1: @@ -477,7 +475,7 @@ class Simplex { break; default: - _ASSERT && common.assert(false); + _ASSERT && console.assert(false); break; } } @@ -485,7 +483,7 @@ class Simplex { getMetric(): number { switch (this.m_count) { case 0: - _ASSERT && common.assert(false); + _ASSERT && console.assert(false); return 0.0; case 1: @@ -499,7 +497,7 @@ class Simplex { this.m_v1.w)); default: - _ASSERT && common.assert(false); + _ASSERT && console.assert(false); return 0.0; } } @@ -518,7 +516,7 @@ class Simplex { break; default: - _ASSERT && common.assert(false); + _ASSERT && console.assert(false); } } @@ -684,11 +682,10 @@ class Simplex { } } - /** * Determine if two generic shapes overlap. */ -export function testOverlap(shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform): boolean { +export const testOverlap = function (shapeA: Shape, indexA: number, shapeB: Shape, indexB: number, xfA: Transform, xfB: Transform): boolean { const input = new DistanceInput(); input.proxyA.set(shapeA, indexA); input.proxyB.set(shapeB, indexB); @@ -703,3 +700,10 @@ export function testOverlap(shapeA: Shape, indexA: number, shapeB: Shape, indexB return output.distance < 10.0 * Math.EPSILON; } + +// legacy exports +Distance.testOverlap = testOverlap; +Distance.Input = DistanceInput; +Distance.Output = DistanceOutput; +Distance.Proxy = DistanceProxy; +Distance.Cache = SimplexCache; diff --git a/src/collision/DynamicTree.ts b/src/collision/DynamicTree.ts index 0fd648bf..42b55c1d 100644 --- a/src/collision/DynamicTree.ts +++ b/src/collision/DynamicTree.ts @@ -22,12 +22,11 @@ * SOFTWARE. */ -import Settings from '../Settings'; -import common from '../util/common'; -import Pool from '../util/Pool'; -import Vec2 from '../common/Vec2'; -import Math from '../common/Math'; -import AABB, { RayCastCallback, RayCastInput } from './AABB'; +import { Settings } from '../Settings'; +import { Pool } from '../util/Pool'; +import { Vec2 } from '../common/Vec2'; +import { math as Math } from '../common/Math'; +import { AABB, RayCastCallback, RayCastInput } from './AABB'; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; @@ -74,7 +73,7 @@ export class TreeNode { * Nodes are pooled and relocatable, so we use node indices rather than * pointers. */ -export default class DynamicTree { +export class DynamicTree { m_root: TreeNode; m_lastProxyId: number; m_nodes: { @@ -101,7 +100,7 @@ export default class DynamicTree { */ getUserData(id: number): T { const node = this.m_nodes[id]; - _ASSERT && common.assert(!!node); + _ASSERT && console.assert(!!node); return node.userData; } @@ -112,7 +111,7 @@ export default class DynamicTree { */ getFatAABB(id: number): AABB { const node = this.m_nodes[id]; - _ASSERT && common.assert(!!node); + _ASSERT && console.assert(!!node); return node.aabb; } @@ -142,7 +141,7 @@ export default class DynamicTree { * Create a proxy. Provide a tight fitting AABB and a userData pointer. */ createProxy(aabb: AABB, userData: T): number { - _ASSERT && common.assert(AABB.isValid(aabb)); + _ASSERT && console.assert(AABB.isValid(aabb)); const node = this.allocateNode(); @@ -165,8 +164,8 @@ export default class DynamicTree { destroyProxy(id: number): void { const node = this.m_nodes[id]; - _ASSERT && common.assert(!!node); - _ASSERT && common.assert(node.isLeaf()); + _ASSERT && console.assert(!!node); + _ASSERT && console.assert(node.isLeaf()); this.removeLeaf(node); this.freeNode(node); @@ -182,13 +181,13 @@ export default class DynamicTree { * @return true if the proxy was re-inserted. */ moveProxy(id: number, aabb: AABB, d: Vec2): boolean { - _ASSERT && common.assert(AABB.isValid(aabb)); - _ASSERT && common.assert(!d || Vec2.isValid(d)); + _ASSERT && console.assert(AABB.isValid(aabb)); + _ASSERT && console.assert(!d || Vec2.isValid(d)); const node = this.m_nodes[id]; - _ASSERT && common.assert(!!node); - _ASSERT && common.assert(node.isLeaf()); + _ASSERT && console.assert(!!node); + _ASSERT && console.assert(node.isLeaf()); if (node.aabb.contains(aabb)) { return false; @@ -223,7 +222,7 @@ export default class DynamicTree { } insertLeaf(leaf: TreeNode): void { - _ASSERT && common.assert(AABB.isValid(leaf.aabb)); + _ASSERT && console.assert(AABB.isValid(leaf.aabb)); if (this.m_root == null) { this.m_root = leaf; @@ -330,8 +329,8 @@ export default class DynamicTree { const child1 = index.child1; const child2 = index.child2; - _ASSERT && common.assert(child1 != null); - _ASSERT && common.assert(child2 != null); + _ASSERT && console.assert(child1 != null); + _ASSERT && console.assert(child2 != null); index.height = 1 + Math.max(child1.height, child2.height); index.aabb.combine(child1.aabb, child2.aabb); @@ -394,7 +393,7 @@ export default class DynamicTree { * root index. */ balance(iA: TreeNode): TreeNode { - _ASSERT && common.assert(iA != null); + _ASSERT && console.assert(iA != null); const A = iA; if (A.isLeaf() || A.height < 2) { @@ -550,7 +549,7 @@ export default class DynamicTree { node = this.m_root; } - // _ASSERT && common.assert(0 <= id && id < this.m_nodeCapacity); + // _ASSERT && console.assert(0 <= id && id < this.m_nodeCapacity); if (node.isLeaf()) { return 0; @@ -567,24 +566,24 @@ export default class DynamicTree { } if (node === this.m_root) { - _ASSERT && common.assert(node.parent == null); + _ASSERT && console.assert(node.parent == null); } const child1 = node.child1; const child2 = node.child2; if (node.isLeaf()) { - _ASSERT && common.assert(child1 == null); - _ASSERT && common.assert(child2 == null); - _ASSERT && common.assert(node.height === 0); + _ASSERT && console.assert(child1 == null); + _ASSERT && console.assert(child2 == null); + _ASSERT && console.assert(node.height === 0); return; } - // _ASSERT && common.assert(0 <= child1 && child1 < this.m_nodeCapacity); - // _ASSERT && common.assert(0 <= child2 && child2 < this.m_nodeCapacity); + // _ASSERT && console.assert(0 <= child1 && child1 < this.m_nodeCapacity); + // _ASSERT && console.assert(0 <= child2 && child2 < this.m_nodeCapacity); - _ASSERT && common.assert(child1.parent === node); - _ASSERT && common.assert(child2.parent === node); + _ASSERT && console.assert(child1.parent === node); + _ASSERT && console.assert(child2.parent === node); this.validateStructure(child1); this.validateStructure(child2); @@ -599,24 +598,24 @@ export default class DynamicTree { const child2 = node.child2; if (node.isLeaf()) { - _ASSERT && common.assert(child1 == null); - _ASSERT && common.assert(child2 == null); - _ASSERT && common.assert(node.height === 0); + _ASSERT && console.assert(child1 == null); + _ASSERT && console.assert(child2 == null); + _ASSERT && console.assert(node.height === 0); return; } - // _ASSERT && common.assert(0 <= child1 && child1 < this.m_nodeCapacity); - // _ASSERT && common.assert(0 <= child2 && child2 < this.m_nodeCapacity); + // _ASSERT && console.assert(0 <= child1 && child1 < this.m_nodeCapacity); + // _ASSERT && console.assert(0 <= child2 && child2 < this.m_nodeCapacity); const height1 = child1.height; const height2 = child2.height; const height = 1 + Math.max(height1, height2); - _ASSERT && common.assert(node.height === height); + _ASSERT && console.assert(node.height === height); const aabb = new AABB(); aabb.combine(child1.aabb, child2.aabb); - _ASSERT && common.assert(AABB.areEqual(aabb, node.aabb)); + _ASSERT && console.assert(AABB.areEqual(aabb, node.aabb)); this.validateMetrics(child1); this.validateMetrics(child2); @@ -628,8 +627,7 @@ export default class DynamicTree { validate(): void { this.validateStructure(this.m_root); this.validateMetrics(this.m_root); - - _ASSERT && common.assert(this.getHeight() === this.computeHeight()); + _ASSERT && console.assert(this.getHeight() === this.computeHeight()); } /** @@ -645,7 +643,7 @@ export default class DynamicTree { continue; } - _ASSERT && common.assert(!node.isLeaf()); + _ASSERT && console.assert(!node.isLeaf()); const balance = Math.abs(node.child2.height - node.child1.height); maxBalance = Math.max(maxBalance, balance); @@ -720,7 +718,7 @@ export default class DynamicTree { this.m_root = nodes[0]; - this.validate(); + _ASSERT && this.validate(); } /** @@ -748,7 +746,7 @@ export default class DynamicTree { * proxy that overlaps the supplied AABB. */ query(aabb: AABB, queryCallback: DynamicTreeQueryCallback): void { - _ASSERT && common.assert(typeof queryCallback === 'function'); + _ASSERT && console.assert(typeof queryCallback === 'function'); const stack = this.stackPool.allocate(); stack.push(this.m_root); @@ -786,11 +784,11 @@ export default class DynamicTree { */ rayCast(input: RayCastInput, rayCastCallback: RayCastCallback): void { // TODO: GC - _ASSERT && common.assert(typeof rayCastCallback === 'function'); + _ASSERT && console.assert(typeof rayCastCallback === 'function'); const p1 = input.p1; const p2 = input.p2; const r = Vec2.sub(p2, p1); - _ASSERT && common.assert(r.lengthSquared() > 0.0); + _ASSERT && console.assert(r.lengthSquared() > 0.0); r.normalize(); // v is perpendicular to the segment. diff --git a/src/collision/Manifold.ts b/src/collision/Manifold.ts index c14fc973..f882c32b 100644 --- a/src/collision/Manifold.ts +++ b/src/collision/Manifold.ts @@ -22,10 +22,10 @@ * SOFTWARE. */ -import Vec2 from '../common/Vec2'; -import Transform from '../common/Transform'; -import Math from '../common/Math'; -import Rot from '../common/Rot'; +import { Vec2 } from '../common/Vec2'; +import { Transform } from '../common/Transform'; +import { math as Math } from '../common/Math'; +import { Rot } from '../common/Rot'; export enum ManifoldType { e_circles = 0, @@ -89,7 +89,7 @@ export enum ContactFeatureType { * @prop points The points of contact {ManifoldPoint[]} * @prop pointCount The number of manifold points */ -export default class Manifold { +export class Manifold { type: ManifoldType; localNormal: Vec2 = Vec2.zero(); localPoint: Vec2 = Vec2.zero(); diff --git a/src/collision/Shape.ts b/src/collision/Shape.ts index 430c51cb..b5b1c3b2 100644 --- a/src/collision/Shape.ts +++ b/src/collision/Shape.ts @@ -23,24 +23,24 @@ */ import type { MassData } from '../dynamics/Body'; -import AABB, { RayCastOutput, RayCastInput } from './AABB'; +import { AABB, RayCastOutput, RayCastInput } from './AABB'; import { DistanceProxy } from './Distance'; -import type Transform from '../common/Transform'; -import type Vec2 from '../common/Vec2'; +import type { Transform } from '../common/Transform'; +import type { Vec2Value } from '../common/Vec2'; +// todo make shape an interface /** * A shape is used for collision detection. You can create a shape however you * like. Shapes used for simulation in World are created automatically when a * Fixture is created. Shapes may encapsulate one or more child shapes. */ -export default abstract class Shape { +export abstract class Shape { m_type: ShapeType; m_radius: number; /** @internal */ - _reset(): void { - } + abstract _reset(): void; static isValid(obj: any): boolean { if (obj === null || typeof obj === 'undefined') { @@ -49,9 +49,7 @@ export default abstract class Shape { return typeof obj.m_type === 'string' && typeof obj.m_radius === 'number'; } - getRadius(): number { - return this.m_radius; - } + abstract getRadius(): number; /** * Get the type of this shape. You can use this to down cast to the concrete @@ -59,9 +57,7 @@ export default abstract class Shape { * * @return the shape type. */ - getType(): ShapeType { - return this.m_type; - } + abstract getType(): ShapeType; /** * @internal @@ -83,7 +79,7 @@ export default abstract class Shape { * @param xf The shape world transform. * @param p A point in world coordinates. */ - abstract testPoint(xf: Transform, p: Vec2): boolean; + abstract testPoint(xf: Transform, p: Vec2Value): boolean; /** * Cast a ray against a child shape. diff --git a/src/collision/TimeOfImpact.ts b/src/collision/TimeOfImpact.ts index 8a558c2e..859b328e 100644 --- a/src/collision/TimeOfImpact.ts +++ b/src/collision/TimeOfImpact.ts @@ -22,24 +22,20 @@ * SOFTWARE. */ -import Settings from '../Settings'; - -import common from '../util/common'; -import stats from '../util/stats'; +import { Settings } from '../Settings'; +import { stats } from '../util/stats'; import Timer from '../util/Timer'; +import { math as Math } from '../common/Math'; +import { Vec2 } from '../common/Vec2'; +import { Rot } from '../common/Rot'; +import { Sweep } from '../common/Sweep'; +import { Transform } from '../common/Transform'; -import Math from '../common/Math'; -import Vec2 from '../common/Vec2'; -import Rot from '../common/Rot'; -import Sweep from '../common/Sweep'; -import Transform from '../common/Transform'; - -import Distance, { DistanceInput, DistanceOutput, DistanceProxy, SimplexCache } from './Distance'; +import { Distance, DistanceInput, DistanceOutput, DistanceProxy, SimplexCache } from './Distance'; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; - /** * Input parameters for TimeOfImpact. */ @@ -88,7 +84,7 @@ stats.toiMaxRootIters = 0; * CCD via the local separating axis method. This seeks progression by computing * the largest time at which separation is maintained. */ -export default function TimeOfImpact(output: TOIOutput, input: TOIInput): void { +export const TimeOfImpact = function (output: TOIOutput, input: TOIInput): void { const timer = Timer.now(); ++stats.toiCalls; @@ -112,7 +108,7 @@ export default function TimeOfImpact(output: TOIOutput, input: TOIInput): void { const totalRadius = proxyA.m_radius + proxyB.m_radius; const target = Math.max(Settings.linearSlop, totalRadius - 3.0 * Settings.linearSlop); const tolerance = 0.25 * Settings.linearSlop; - _ASSERT && common.assert(target > tolerance); + _ASSERT && console.assert(target > tolerance); let t1 = 0.0; const k_maxIterations = Settings.maxTOIIterations; @@ -325,7 +321,7 @@ class SeparationFunction { this.m_proxyA = proxyA; this.m_proxyB = proxyB; const count = cache.count; - _ASSERT && common.assert(0 < count && count < 3); + _ASSERT && console.assert(0 < count && count < 3); this.m_sweepA = sweepA; this.m_sweepB = sweepB; @@ -457,7 +453,7 @@ class SeparationFunction { } default: - _ASSERT && common.assert(false); + _ASSERT && console.assert(false); if (find) { this.indexA = -1; this.indexB = -1; @@ -474,3 +470,9 @@ class SeparationFunction { return this.compute(false, t); } } + +const separationFunction_reuse = new SeparationFunction(); + +// legacy exports +TimeOfImpact.Input = TOIInput; +TimeOfImpact.Output = TOIOutput; diff --git a/src/collision/shape/BoxShape.ts b/src/collision/shape/BoxShape.ts index e6ed4176..4da95d6c 100644 --- a/src/collision/shape/BoxShape.ts +++ b/src/collision/shape/BoxShape.ts @@ -22,18 +22,22 @@ * SOFTWARE. */ -import type Vec2 from '../../common/Vec2'; -import PolygonShape from './PolygonShape'; +import type { Vec2Value } from '../../common/Vec2'; +import { PolygonShape } from './PolygonShape'; + + +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; + /** * A rectangle polygon which extend PolygonShape. */ -export default class BoxShape extends PolygonShape { +export class BoxShape extends PolygonShape { static TYPE = 'polygon' as const; - constructor(hx: number, hy: number, center?: Vec2, angle?: number) { + constructor(hx: number, hy: number, center?: Vec2Value, angle?: number) { // @ts-ignore - if (!(this instanceof BoxShape)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof BoxShape)) { return new BoxShape(hx, hy, center, angle); } @@ -42,3 +46,5 @@ export default class BoxShape extends PolygonShape { this._setAsBox(hx, hy, center, angle); } } + +export const Box = BoxShape; diff --git a/src/collision/shape/ChainShape.ts b/src/collision/shape/ChainShape.ts index 0c3922df..9b4c12a4 100644 --- a/src/collision/shape/ChainShape.ts +++ b/src/collision/shape/ChainShape.ts @@ -23,17 +23,17 @@ */ import type { MassData } from '../../dynamics/Body'; -import AABB, { RayCastOutput, RayCastInput } from '../AABB'; +import { AABB, RayCastOutput, RayCastInput } from '../AABB'; import { DistanceProxy } from '../Distance'; -import common from '../../util/common'; -import Transform from '../../common/Transform'; -import Vec2 from '../../common/Vec2'; -import Settings from '../../Settings'; -import Shape from '../Shape'; -import EdgeShape from './EdgeShape'; +import { Transform } from '../../common/Transform'; +import { Vec2, Vec2Value } from '../../common/Vec2'; +import { Settings } from '../../Settings'; +import { Shape } from '../Shape'; +import { EdgeShape } from './EdgeShape'; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; /** @@ -44,8 +44,11 @@ const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; * * WARNING: The chain will not collide properly if there are self-intersections. */ -export default class ChainShape extends Shape { +export class ChainShape extends Shape { static TYPE = 'chain' as const; + m_type: 'chain'; + + m_radius: number; m_vertices: Vec2[]; m_count: number; @@ -56,9 +59,9 @@ export default class ChainShape extends Shape { m_isLoop: boolean; - constructor(vertices?: Vec2[], loop?: boolean) { + constructor(vertices?: Vec2Value[], loop?: boolean) { // @ts-ignore - if (!(this instanceof ChainShape)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof ChainShape)) { return new ChainShape(vertices, loop); } @@ -106,7 +109,7 @@ export default class ChainShape extends Shape { /** @internal */ static _deserialize(data: any, fixture: any, restore: any): ChainShape { - const vertices = [] as Vec2[]; + const vertices: Vec2[] = []; if (data.vertices) { for (let i = 0; i < data.vertices.length; i++) { vertices.push(restore(Vec2, data.vertices[i])); @@ -127,6 +130,14 @@ export default class ChainShape extends Shape { // this.m_count = 0; // } + getType(): 'chain' { + return this.m_type; + } + + getRadius(): number { + return this.m_radius; + } + /** * @internal * Create a loop. This automatically adjusts connectivity. @@ -134,14 +145,14 @@ export default class ChainShape extends Shape { * @param vertices an array of vertices, these are copied * @param count the vertex count */ - _createLoop(vertices: Vec2[]): ChainShape { - _ASSERT && common.assert(this.m_vertices.length == 0 && this.m_count == 0); - _ASSERT && common.assert(vertices.length >= 3); + _createLoop(vertices: Vec2Value[]): ChainShape { + _ASSERT && console.assert(this.m_vertices.length == 0 && this.m_count == 0); + _ASSERT && console.assert(vertices.length >= 3); for (let i = 1; i < vertices.length; ++i) { const v1 = vertices[i - 1]; const v2 = vertices[i]; // If the code crashes here, it means your vertices are too close together. - _ASSERT && common.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared); + _ASSERT && console.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared); } this.m_vertices = []; @@ -165,14 +176,14 @@ export default class ChainShape extends Shape { * @param vertices an array of vertices, these are copied * @param count the vertex count */ - _createChain(vertices: Vec2[]): ChainShape { - _ASSERT && common.assert(this.m_vertices.length == 0 && this.m_count == 0); - _ASSERT && common.assert(vertices.length >= 2); + _createChain(vertices: Vec2Value[]): ChainShape { + _ASSERT && console.assert(this.m_vertices.length == 0 && this.m_count == 0); + _ASSERT && console.assert(vertices.length >= 2); for (let i = 1; i < vertices.length; ++i) { // If the code crashes here, it means your vertices are too close together. const v1 = vertices[i - 1]; const v2 = vertices[i]; - _ASSERT && common.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared); + _ASSERT && console.assert(Vec2.distanceSquared(v1, v2) > Settings.linearSlopSquared); } this.m_count = vertices.length; @@ -250,7 +261,7 @@ export default class ChainShape extends Shape { // Get a child edge. getChildEdge(edge: EdgeShape, childIndex: number): void { - _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count - 1); + _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count - 1); edge.m_type = EdgeShape.TYPE; edge.m_radius = this.m_radius; @@ -275,7 +286,7 @@ export default class ChainShape extends Shape { } getVertex(index: number): Vec2 { - _ASSERT && common.assert(0 <= index && index <= this.m_count); + _ASSERT && console.assert(0 <= index && index <= this.m_count); if (index < this.m_count) { return this.m_vertices[index]; } else { @@ -296,7 +307,7 @@ export default class ChainShape extends Shape { * @param xf The shape world transform. * @param p A point in world coordinates. */ - testPoint(xf: Transform, p: Vec2): false { + testPoint(xf: Transform, p: Vec2Value): false { return false; } @@ -309,7 +320,7 @@ export default class ChainShape extends Shape { * @param childIndex The child shape index */ rayCast(output: RayCastOutput, input: RayCastInput, xf: Transform, childIndex: number): boolean { - _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count); + _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count); const edgeShape = new EdgeShape(this.getVertex(childIndex), this.getVertex(childIndex + 1)); return edgeShape.rayCast(output, input, xf, 0); @@ -324,7 +335,7 @@ export default class ChainShape extends Shape { * @param childIndex The child shape */ computeAABB(aabb: AABB, xf: Transform, childIndex: number): void { - _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count); + _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count); const v1 = Transform.mulVec2(xf, this.getVertex(childIndex)); const v2 = Transform.mulVec2(xf, this.getVertex(childIndex + 1)); @@ -348,7 +359,7 @@ export default class ChainShape extends Shape { } computeDistanceProxy(proxy: DistanceProxy, childIndex: number): void { - _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_count); + _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_count); proxy.m_buffer[0] = this.getVertex(childIndex); proxy.m_buffer[1] = this.getVertex(childIndex + 1); proxy.m_vertices = proxy.m_buffer; @@ -356,3 +367,5 @@ export default class ChainShape extends Shape { proxy.m_radius = this.m_radius; } } + +export const Chain = ChainShape; diff --git a/src/collision/shape/CircleShape.ts b/src/collision/shape/CircleShape.ts index 334ac7c2..d7b7e42e 100644 --- a/src/collision/shape/CircleShape.ts +++ b/src/collision/shape/CircleShape.ts @@ -22,31 +22,33 @@ * SOFTWARE. */ -import common from '../../util/common'; -import Math from '../../common/Math'; -import Rot from '../../common/Rot'; -import Vec2 from '../../common/Vec2'; -import Shape from '../Shape'; -import AABB, { RayCastInput, RayCastOutput } from '../AABB'; -import Transform from '../../common/Transform'; +import { math as Math } from '../../common/Math'; +import { Rot } from '../../common/Rot'; +import { Vec2, Vec2Value } from '../../common/Vec2'; +import { Shape } from '../Shape'; +import { AABB, RayCastInput, RayCastOutput } from '../AABB'; +import { Transform } from '../../common/Transform'; import { MassData } from '../../dynamics/Body'; import { DistanceProxy } from '../Distance'; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; -export default class CircleShape extends Shape { +export class CircleShape extends Shape { static TYPE = 'circle' as const; + m_type: 'circle'; m_p: Vec2; + m_radius: number; - constructor(position: Vec2, radius?: number); + constructor(position: Vec2Value, radius?: number); constructor(radius?: number); // tslint:disable-next-line:typedef constructor(a, b?) { // @ts-ignore - if (!(this instanceof CircleShape)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof CircleShape)) { return new CircleShape(a, b); } @@ -83,7 +85,15 @@ export default class CircleShape extends Shape { return new CircleShape(data.p, data.radius); } - // TODO: already defined in Shape + /** @internal */ + _reset(): void { + // noop + } + + getType(): 'circle' { + return this.m_type; + } + getRadius(): number { return this.m_radius; } @@ -93,7 +103,7 @@ export default class CircleShape extends Shape { } getVertex(index: 0): Vec2 { - _ASSERT && common.assert(index == 0); + _ASSERT && console.assert(index == 0); return this.m_p; } @@ -125,7 +135,7 @@ export default class CircleShape extends Shape { * @param xf The shape world transform. * @param p A point in world coordinates. */ - testPoint(xf: Transform, p: Vec2): boolean { + testPoint(xf: Transform, p: Vec2Value): boolean { const center = Vec2.add(xf.p, Rot.mulVec2(xf.q, this.m_p)); const d = Vec2.sub(p, center); return Vec2.dot(d, d) <= this.m_radius * this.m_radius; @@ -211,3 +221,5 @@ export default class CircleShape extends Shape { } } + +export const Circle = CircleShape; diff --git a/src/collision/shape/CollideCircle.ts b/src/collision/shape/CollideCircle.ts index dd4496e5..72fd7eac 100644 --- a/src/collision/shape/CollideCircle.ts +++ b/src/collision/shape/CollideCircle.ts @@ -23,13 +23,12 @@ */ -import common from '../../util/common'; -import Transform from '../../common/Transform'; -import Vec2 from '../../common/Vec2'; -import Contact from '../../dynamics/Contact'; -import CircleShape from './CircleShape'; -import Manifold, { ContactFeatureType, ManifoldType } from "../Manifold"; -import Fixture from "../../dynamics/Fixture"; +import { Transform } from '../../common/Transform'; +import { Vec2 } from '../../common/Vec2'; +import { Contact } from '../../dynamics/Contact'; +import { CircleShape } from './CircleShape'; +import { Manifold, ContactFeatureType, ManifoldType } from "../Manifold"; +import { Fixture } from "../../dynamics/Fixture"; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; @@ -38,12 +37,12 @@ const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; Contact.addType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact); function CircleCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void { - _ASSERT && common.assert(fixtureA.getType() == CircleShape.TYPE); - _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE); + _ASSERT && console.assert(fixtureA.getType() == CircleShape.TYPE); + _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE); CollideCircles(manifold, fixtureA.getShape() as CircleShape, xfA, fixtureB.getShape() as CircleShape, xfB); } -export function CollideCircles(manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void { +export const CollideCircles = function (manifold: Manifold, circleA: CircleShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void { manifold.pointCount = 0; const pA = Transform.mulVec2(xfA, circleA.m_p); diff --git a/src/collision/shape/CollideCirclePolygon.ts b/src/collision/shape/CollideCirclePolygon.ts index 955bf5a4..b53482f1 100644 --- a/src/collision/shape/CollideCirclePolygon.ts +++ b/src/collision/shape/CollideCirclePolygon.ts @@ -22,15 +22,14 @@ * SOFTWARE. */ -import common from '../../util/common'; -import Math from '../../common/Math'; -import Transform from '../../common/Transform'; -import Vec2 from '../../common/Vec2'; -import Contact from '../../dynamics/Contact'; -import CircleShape from './CircleShape'; -import PolygonShape from './PolygonShape'; -import Manifold, { ContactFeatureType, ManifoldType } from "../Manifold"; -import Fixture from "../../dynamics/Fixture"; +import { math as Math } from '../../common/Math'; +import { Transform } from '../../common/Transform'; +import { Vec2 } from '../../common/Vec2'; +import { Contact } from '../../dynamics/Contact'; +import { CircleShape } from './CircleShape'; +import { PolygonShape } from './PolygonShape'; +import { Manifold, ContactFeatureType, ManifoldType } from "../Manifold"; +import { Fixture } from "../../dynamics/Fixture"; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; @@ -39,12 +38,12 @@ const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; Contact.addType(PolygonShape.TYPE, CircleShape.TYPE, PolygonCircleContact); function PolygonCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void { - _ASSERT && common.assert(fixtureA.getType() == PolygonShape.TYPE); - _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE); + _ASSERT && console.assert(fixtureA.getType() == PolygonShape.TYPE); + _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE); CollidePolygonCircle(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as CircleShape, xfB); } -export function CollidePolygonCircle(manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void { +export const CollidePolygonCircle = function (manifold: Manifold, polygonA: PolygonShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void { manifold.pointCount = 0; // Compute circle position in the frame of the polygon. diff --git a/src/collision/shape/CollideEdgeCircle.ts b/src/collision/shape/CollideEdgeCircle.ts index 86ade88c..5ac43edb 100644 --- a/src/collision/shape/CollideEdgeCircle.ts +++ b/src/collision/shape/CollideEdgeCircle.ts @@ -22,15 +22,14 @@ * SOFTWARE. */ -import common from '../../util/common'; -import Transform from '../../common/Transform'; -import Vec2 from '../../common/Vec2'; -import Contact from '../../dynamics/Contact'; -import EdgeShape from './EdgeShape'; -import ChainShape from './ChainShape'; -import CircleShape from './CircleShape'; -import Manifold, { ContactFeatureType, ManifoldType } from "../Manifold"; -import Fixture from "../../dynamics/Fixture"; +import { Transform } from '../../common/Transform'; +import { Vec2 } from '../../common/Vec2'; +import { Contact } from '../../dynamics/Contact'; +import { EdgeShape } from './EdgeShape'; +import { ChainShape } from './ChainShape'; +import { CircleShape } from './CircleShape'; +import { Manifold, ContactFeatureType, ManifoldType } from "../Manifold"; +import { Fixture } from "../../dynamics/Fixture"; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; @@ -40,8 +39,8 @@ Contact.addType(EdgeShape.TYPE, CircleShape.TYPE, EdgeCircleContact); Contact.addType(ChainShape.TYPE, CircleShape.TYPE, ChainCircleContact); function EdgeCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void { - _ASSERT && common.assert(fixtureA.getType() == EdgeShape.TYPE); - _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE); + _ASSERT && console.assert(fixtureA.getType() == EdgeShape.TYPE); + _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE); const shapeA = fixtureA.getShape() as EdgeShape; const shapeB = fixtureB.getShape() as CircleShape; @@ -50,8 +49,8 @@ function EdgeCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture } function ChainCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void { - _ASSERT && common.assert(fixtureA.getType() == ChainShape.TYPE); - _ASSERT && common.assert(fixtureB.getType() == CircleShape.TYPE); + _ASSERT && console.assert(fixtureA.getType() == ChainShape.TYPE); + _ASSERT && console.assert(fixtureB.getType() == CircleShape.TYPE); const chain = fixtureA.getShape() as ChainShape; const edge = new EdgeShape(); @@ -65,7 +64,7 @@ function ChainCircleContact(manifold: Manifold, xfA: Transform, fixtureA: Fixtur // Compute contact points for edge versus circle. // This accounts for edge connectivity. -export function CollideEdgeCircle(manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void { +export const CollideEdgeCircle = function (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, circleB: CircleShape, xfB: Transform): void { manifold.pointCount = 0; // Compute circle in frame of edge @@ -155,7 +154,7 @@ export function CollideEdgeCircle(manifold: Manifold, edgeA: EdgeShape, xfA: Tra // Region AB const den = Vec2.dot(e, e); - _ASSERT && common.assert(den > 0.0); + _ASSERT && console.assert(den > 0.0); const P = Vec2.combine(u / den, A, v / den, B); const d = Vec2.sub(Q, P); const dd = Vec2.dot(d, d); diff --git a/src/collision/shape/CollideEdgePolygon.ts b/src/collision/shape/CollideEdgePolygon.ts index 6158e1cd..b68f9ba5 100644 --- a/src/collision/shape/CollideEdgePolygon.ts +++ b/src/collision/shape/CollideEdgePolygon.ts @@ -22,18 +22,17 @@ * SOFTWARE. */ -import common from '../../util/common'; -import Math from '../../common/Math'; -import Transform from '../../common/Transform'; -import Vec2 from '../../common/Vec2'; -import Rot from '../../common/Rot'; -import Settings from '../../Settings'; -import Contact from '../../dynamics/Contact'; -import Manifold, { clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold'; -import EdgeShape from './EdgeShape'; -import ChainShape from './ChainShape'; -import PolygonShape from './PolygonShape'; -import Fixture from "../../dynamics/Fixture"; +import { math as Math } from '../../common/Math'; +import { Transform } from '../../common/Transform'; +import { Vec2 } from '../../common/Vec2'; +import { Rot } from '../../common/Rot'; +import { Settings } from '../../Settings'; +import { Contact } from '../../dynamics/Contact'; +import { Manifold, clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold'; +import { EdgeShape } from './EdgeShape'; +import { ChainShape } from './ChainShape'; +import { PolygonShape } from './PolygonShape'; +import { Fixture } from "../../dynamics/Fixture"; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; @@ -43,15 +42,15 @@ Contact.addType(EdgeShape.TYPE, PolygonShape.TYPE, EdgePolygonContact); Contact.addType(ChainShape.TYPE, PolygonShape.TYPE, ChainPolygonContact); function EdgePolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void { - _ASSERT && common.assert(fA.getType() == EdgeShape.TYPE); - _ASSERT && common.assert(fB.getType() == PolygonShape.TYPE); + _ASSERT && console.assert(fA.getType() == EdgeShape.TYPE); + _ASSERT && console.assert(fB.getType() == PolygonShape.TYPE); CollideEdgePolygon(manifold, fA.getShape() as EdgeShape, xfA, fB.getShape() as PolygonShape, xfB); } function ChainPolygonContact(manifold: Manifold, xfA: Transform, fA: Fixture, indexA: number, xfB: Transform, fB: Fixture, indexB: number): void { - _ASSERT && common.assert(fA.getType() == ChainShape.TYPE); - _ASSERT && common.assert(fB.getType() == PolygonShape.TYPE); + _ASSERT && console.assert(fA.getType() == ChainShape.TYPE); + _ASSERT && console.assert(fB.getType() == PolygonShape.TYPE); const chain = fA.getShape() as ChainShape; const edge = new EdgeShape(); @@ -116,7 +115,7 @@ const rf = new ReferenceFace(); * This function collides and edge and a polygon, taking into account edge * adjacency. */ -export function CollideEdgePolygon(manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform): void { +export const CollideEdgePolygon = function (manifold: Manifold, edgeA: EdgeShape, xfA: Transform, polygonB: PolygonShape, xfB: Transform): void { // Algorithm: // 1. Classify v1 and v2 // 2. Classify polygon centroid as front or back diff --git a/src/collision/shape/CollidePolygon.ts b/src/collision/shape/CollidePolygon.ts index 6f3b6f1f..e3a3fd04 100644 --- a/src/collision/shape/CollidePolygon.ts +++ b/src/collision/shape/CollidePolygon.ts @@ -22,15 +22,14 @@ * SOFTWARE. */ -import common from '../../util/common'; -import Transform from '../../common/Transform'; -import Rot from '../../common/Rot'; -import Vec2 from '../../common/Vec2'; -import Settings from '../../Settings'; -import Manifold, { clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold'; -import Contact from '../../dynamics/Contact'; -import PolygonShape from './PolygonShape'; -import Fixture from "../../dynamics/Fixture"; +import { Transform } from '../../common/Transform'; +import { Rot } from '../../common/Rot'; +import { Vec2 } from '../../common/Vec2'; +import { Settings } from '../../Settings'; +import { Manifold, clipSegmentToLine, ClipVertex, ContactFeatureType, ManifoldType } from '../Manifold'; +import { Contact } from '../../dynamics/Contact'; +import { PolygonShape } from './PolygonShape'; +import { Fixture } from "../../dynamics/Fixture"; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; @@ -39,8 +38,8 @@ const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; Contact.addType(PolygonShape.TYPE, PolygonShape.TYPE, PolygonContact); function PolygonContact(manifold: Manifold, xfA: Transform, fixtureA: Fixture, indexA: number, xfB: Transform, fixtureB: Fixture, indexB: number): void { - _ASSERT && common.assert(fixtureA.getType() == PolygonShape.TYPE); - _ASSERT && common.assert(fixtureB.getType() == PolygonShape.TYPE); + _ASSERT && console.assert(fixtureA.getType() == PolygonShape.TYPE); + _ASSERT && console.assert(fixtureB.getType() == PolygonShape.TYPE); CollidePolygons(manifold, fixtureA.getShape() as PolygonShape, xfA, fixtureB.getShape() as PolygonShape, xfB); } @@ -95,7 +94,7 @@ function findIncidentEdge(c: ClipVertex[], poly1: PolygonShape, xf1: Transform, const vertices2 = poly2.m_vertices; const normals2 = poly2.m_normals; - _ASSERT && common.assert(0 <= edge1 && edge1 < poly1.m_count); + _ASSERT && console.assert(0 <= edge1 && edge1 < poly1.m_count); // Get the normal of the reference edge in poly2's frame. const normal1 = Rot.mulTVec2(xf2.q, Rot.mulVec2(xf1.q, normals1[edge1])); @@ -143,7 +142,7 @@ const maxSeparation = { * * The normal points from 1 to 2 */ -export function CollidePolygons(manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform): void { +export const CollidePolygons = function (manifold: Manifold, polyA: PolygonShape, xfA: Transform, polyB: PolygonShape, xfB: Transform): void { manifold.pointCount = 0; const totalRadius = polyA.m_radius + polyB.m_radius; diff --git a/src/collision/shape/EdgeShape.ts b/src/collision/shape/EdgeShape.ts index ed06c01f..8d8acedd 100644 --- a/src/collision/shape/EdgeShape.ts +++ b/src/collision/shape/EdgeShape.ts @@ -22,22 +22,29 @@ * SOFTWARE. */ -import Settings from '../../Settings'; -import Shape from '../Shape'; -import Transform from '../../common/Transform'; -import Rot from '../../common/Rot'; -import Vec2 from '../../common/Vec2'; -import AABB, { RayCastInput, RayCastOutput } from '../AABB'; +import { Settings } from '../../Settings'; +import { Shape } from '../Shape'; +import { Transform } from '../../common/Transform'; +import { Rot } from '../../common/Rot'; +import { Vec2, Vec2Value } from '../../common/Vec2'; +import { AABB, RayCastInput, RayCastOutput } from '../AABB'; import { MassData } from '../../dynamics/Body'; import { DistanceProxy } from '../Distance'; + +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; + + /** * A line segment (edge) shape. These can be connected in chains or loops to * other edge shapes. The connectivity information is used to ensure correct * contact normals. */ -export default class EdgeShape extends Shape { +export class EdgeShape extends Shape { static TYPE = 'edge' as const; + m_type: 'edge'; + + m_radius: number; // These are the edge vertices m_vertex1: Vec2; @@ -50,9 +57,9 @@ export default class EdgeShape extends Shape { m_hasVertex0: boolean; m_hasVertex3: boolean; - constructor(v1?: Vec2, v2?: Vec2) { + constructor(v1?: Vec2Value, v2?: Vec2Value) { // @ts-ignore - if (!(this instanceof EdgeShape)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof EdgeShape)) { return new EdgeShape(v1, v2); } @@ -61,7 +68,6 @@ export default class EdgeShape extends Shape { this.m_type = EdgeShape.TYPE; this.m_radius = Settings.polygonRadius; - this.m_vertex1 = v1 ? Vec2.clone(v1) : Vec2.zero(); this.m_vertex2 = v2 ? Vec2.clone(v2) : Vec2.zero(); @@ -98,6 +104,19 @@ export default class EdgeShape extends Shape { return shape; } + /** @internal */ + _reset(): void { + // noop + } + + getRadius(): number { + return this.m_radius; + } + + getType(): 'edge' { + return this.m_type; + } + /** @internal @deprecated */ setNext(v?: Vec2): EdgeShape { return this.setNextVertex(v); @@ -194,7 +213,7 @@ export default class EdgeShape extends Shape { * @param xf The shape world transform. * @param p A point in world coordinates. */ - testPoint(xf: Transform, p: Vec2): false { + testPoint(xf: Transform, p: Vec2Value): false { return false; } @@ -299,5 +318,6 @@ export default class EdgeShape extends Shape { proxy.m_count = 2; proxy.m_radius = this.m_radius; } - } + +export const Edge = EdgeShape; diff --git a/src/collision/shape/PolygonShape.ts b/src/collision/shape/PolygonShape.ts index 635d3424..174b4ad3 100644 --- a/src/collision/shape/PolygonShape.ts +++ b/src/collision/shape/PolygonShape.ts @@ -23,18 +23,18 @@ */ import type { MassData } from '../../dynamics/Body'; -import AABB, { RayCastOutput, RayCastInput } from '../AABB'; +import { AABB, RayCastOutput, RayCastInput } from '../AABB'; import { DistanceProxy } from '../Distance'; -import common from '../../util/common'; -import Math from '../../common/Math'; -import Transform from '../../common/Transform'; -import Rot from '../../common/Rot'; -import Vec2 from '../../common/Vec2'; -import Settings from '../../Settings'; -import Shape from '../Shape'; +import { math as Math } from '../../common/Math'; +import { Transform } from '../../common/Transform'; +import { Rot } from '../../common/Rot'; +import { Vec2, Vec2Value } from '../../common/Vec2'; +import { Settings } from '../../Settings'; +import { Shape } from '../Shape'; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; /** @@ -43,18 +43,20 @@ const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; * Settings.maxPolygonVertices. In most cases you should not need many vertices * for a convex polygon. extends Shape */ -export default class PolygonShape extends Shape { +export class PolygonShape extends Shape { static TYPE = 'polygon' as const; + m_type: 'polygon'; m_centroid: Vec2; m_vertices: Vec2[]; // [Settings.maxPolygonVertices] m_normals: Vec2[]; // [Settings.maxPolygonVertices] m_count: number; + m_radius: number; // @ts-ignore - constructor(vertices?: Vec2[]) { + constructor(vertices?: Vec2Value[]) { // @ts-ignore - if (!(this instanceof PolygonShape)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof PolygonShape)) { return new PolygonShape(vertices); } @@ -83,7 +85,7 @@ export default class PolygonShape extends Shape { /** @internal */ static _deserialize(data: any, fixture: any, restore: any): PolygonShape { - const vertices = [] as Vec2[]; + const vertices: Vec2[] = []; if (data.vertices) { for (let i = 0; i < data.vertices.length; i++) { vertices.push(restore(Vec2, data.vertices[i])); @@ -94,8 +96,16 @@ export default class PolygonShape extends Shape { return shape; } + getType(): 'polygon' { + return this.m_type; + } + + getRadius(): number { + return this.m_radius; + } + getVertex(index: number): Vec2 { - _ASSERT && common.assert(0 <= index && index < this.m_count); + _ASSERT && console.assert(0 <= index && index < this.m_count); return this.m_vertices[index]; } @@ -142,8 +152,8 @@ export default class PolygonShape extends Shape { * Warning: collinear points are handled but not removed. Collinear points may * lead to poor stacking behavior. */ - _set(vertices: Vec2[]): void { - _ASSERT && common.assert(3 <= vertices.length && vertices.length <= Settings.maxPolygonVertices); + _set(vertices: Vec2Value[]): void { + _ASSERT && console.assert(3 <= vertices.length && vertices.length <= Settings.maxPolygonVertices); if (vertices.length < 3) { this._setAsBox(1.0, 1.0); return; @@ -152,7 +162,7 @@ export default class PolygonShape extends Shape { let n = Math.min(vertices.length, Settings.maxPolygonVertices); // Perform welding and copy vertices into local buffer. - const ps = [] as Vec2[]; // [Settings.maxPolygonVertices]; + const ps: Vec2[] = []; // [Settings.maxPolygonVertices]; for (let i = 0; i < n; ++i) { const v = vertices[i]; @@ -165,14 +175,14 @@ export default class PolygonShape extends Shape { } if (unique) { - ps.push(v); + ps.push(Vec2.clone(v)); } } n = ps.length; if (n < 3) { // Polygon is degenerate. - _ASSERT && common.assert(false); + _ASSERT && console.assert(false); this._setAsBox(1.0, 1.0); return; } @@ -229,7 +239,7 @@ export default class PolygonShape extends Shape { if (m < 3) { // Polygon is degenerate. - _ASSERT && common.assert(false); + _ASSERT && console.assert(false); this._setAsBox(1.0, 1.0); return; } @@ -247,7 +257,7 @@ export default class PolygonShape extends Shape { const i1 = i; const i2 = i + 1 < m ? i + 1 : 0; const edge = Vec2.sub(this.m_vertices[i2], this.m_vertices[i1]); - _ASSERT && common.assert(edge.lengthSquared() > Math.EPSILON * Math.EPSILON); + _ASSERT && console.assert(edge.lengthSquared() > Math.EPSILON * Math.EPSILON); this.m_normals[i] = Vec2.crossVec2Num(edge, 1.0); this.m_normals[i].normalize(); } @@ -257,7 +267,7 @@ export default class PolygonShape extends Shape { } /** @internal */ - _setAsBox(hx: number, hy: number, center?: Vec2, angle?: number): void { + _setAsBox(hx: number, hy: number, center?: Vec2Value, angle?: number): void { // start with right-bottom, counter-clockwise, as in Gift wrapping algorithm in PolygonShape._set() this.m_vertices[0] = Vec2.neo(hx, -hy); this.m_vertices[1] = Vec2.neo(hx, hy); @@ -365,7 +375,7 @@ export default class PolygonShape extends Shape { } } - _ASSERT && common.assert(0.0 <= lower && lower <= input.maxFraction); + _ASSERT && console.assert(0.0 <= lower && lower <= input.maxFraction); if (index >= 0) { output.fraction = lower; @@ -434,7 +444,7 @@ export default class PolygonShape extends Shape { // // The rest of the derivation is handled by computer algebra. - _ASSERT && common.assert(this.m_count >= 3); + _ASSERT && console.assert(this.m_count >= 3); const center = Vec2.zero(); let area = 0.0; @@ -480,7 +490,7 @@ export default class PolygonShape extends Shape { massData.mass = density * area; // Center of mass - _ASSERT && common.assert(area > Math.EPSILON); + _ASSERT && console.assert(area > Math.EPSILON); center.mul(1.0 / area); massData.center.setCombine(1, center, 1, s); @@ -526,7 +536,7 @@ export default class PolygonShape extends Shape { } function ComputeCentroid(vs: Vec2[], count: number): Vec2 { - _ASSERT && common.assert(count >= 3); + _ASSERT && console.assert(count >= 3); const c = Vec2.zero(); let area = 0.0; @@ -565,7 +575,9 @@ function ComputeCentroid(vs: Vec2[], count: number): Vec2 { } // Centroid - _ASSERT && common.assert(area > Math.EPSILON); + _ASSERT && console.assert(area > Math.EPSILON); c.mul(1.0 / area); return c; } + +export const Polygon = PolygonShape; diff --git a/src/common/Jacobian.ts b/src/common/Jacobian.ts index de111f73..f9781274 100644 --- a/src/common/Jacobian.ts +++ b/src/common/Jacobian.ts @@ -22,9 +22,9 @@ * SOFTWARE. */ -import Vec2 from './Vec2'; +import { Vec2 } from './Vec2'; -export default class Jacobian { +export class Jacobian { linear: Vec2; angularA: number; angularB: number; diff --git a/src/common/Mat22.ts b/src/common/Mat22.ts index 754edfae..d2441f4c 100644 --- a/src/common/Mat22.ts +++ b/src/common/Mat22.ts @@ -22,18 +22,16 @@ * SOFTWARE. */ -import common from '../util/common'; -import Vec2 from './Vec2'; +import { Vec2 } from './Vec2'; -const _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; /** * A 2-by-2 matrix. Stored in column-major order. */ -export default class Mat22 { +export class Mat22 { ex: Vec2; ey: Vec2; @@ -67,11 +65,7 @@ export default class Mat22 { } static assert(o: any): void { - if (!_ASSERT) return; - if (!Mat22.isValid(o)) { - _DEBUG && common.debug(o); - throw new Error('Invalid Mat22!'); - } + _ASSERT && console.assert(!Mat22.isValid(o), 'Invalid Mat22!', o); } set(a: Mat22): void; @@ -94,7 +88,7 @@ export default class Mat22 { this.ey.setVec2(a.ey); } else { - _ASSERT && common.assert(false); + _ASSERT && console.assert(false); } } @@ -173,7 +167,7 @@ export default class Mat22 { return new Mat22(a, b, c, d); } - _ASSERT && common.assert(false); + _ASSERT && console.assert(false); } static mulVec2(mx: Mat22, v: Vec2): Vec2 { @@ -213,7 +207,7 @@ export default class Mat22 { return new Mat22(c1, c2); } - _ASSERT && common.assert(false); + _ASSERT && console.assert(false); } static mulTVec2(mx: Mat22, v: Vec2): Vec2 { diff --git a/src/common/Mat33.ts b/src/common/Mat33.ts index 336abee1..f6a2bb33 100644 --- a/src/common/Mat33.ts +++ b/src/common/Mat33.ts @@ -22,19 +22,17 @@ * SOFTWARE. */ -import common from '../util/common'; -import Vec2 from './Vec2'; -import Vec3 from './Vec3'; +import { Vec2 } from './Vec2'; +import { Vec3 } from './Vec3'; -const _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; /** * A 3-by-3 matrix. Stored in column-major order. */ -export default class Mat33 { +export class Mat33 { ex: Vec3; ey: Vec3; ez: Vec3; @@ -66,11 +64,7 @@ export default class Mat33 { } static assert(o: any): void { - if (!_ASSERT) return; - if (!Mat33.isValid(o)) { - _DEBUG && common.debug(o); - throw new Error('Invalid Mat33!'); - } + _ASSERT && console.assert(!Mat33.isValid(o), 'Invalid Mat33!', o); } /** @@ -194,7 +188,7 @@ export default class Mat33 { return Vec2.neo(x, y); } - _ASSERT && common.assert(false); + _ASSERT && console.assert(false); } static mulVec3(a: Mat33, b: Vec3): Vec3 { diff --git a/src/common/Math.ts b/src/common/Math.ts index 47ebd7d8..033b226d 100644 --- a/src/common/Math.ts +++ b/src/common/Math.ts @@ -22,25 +22,24 @@ * SOFTWARE. */ -import common from '../util/common'; - -const _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; +export const math = Object.assign(Object.create(Math) as typeof Math, { + EPSILON: 1e-9, // TODO -const math: Math & { - readonly EPSILON: number; /** * This function is used to ensure that a floating point number is not a NaN or * infinity. */ - isFinite(x: any): boolean; - assert(x: any): void; - /** - * This is a approximate yet fast inverse square-root (todo). - */ - invSqrt(x: number): number; + isFinite: function(x: unknown): boolean { + return (typeof x === 'number') && isFinite(x) && !isNaN(x); + }, + + assert: function(x: any): void { + _ASSERT && console.assert(!math.isFinite(x), 'Invalid Number!', x); + }, + /** * Next Largest Power of 2 Given a binary integer value x, the next largest * power of 2 can be computed by a SWAR algorithm that recursively "folds" the @@ -48,92 +47,61 @@ const math: Math & { * same most significant 1 as x, but all 1's below it. Adding 1 to that value * yields the next largest power of 2. For a 32-bit value: */ - nextPowerOfTwo(x: number): number; - isPowerOfTwo(x: number): boolean; - mod(num: number, min?: number, max?: number): number; + nextPowerOfTwo: function(x: number): number { + // TODO + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + return x + 1; + }, + + isPowerOfTwo: function(x: number): boolean { + return x > 0 && (x & (x - 1)) === 0; + }, + + mod: function(num: number, min?: number, max?: number): number { + if (typeof min === 'undefined') { + max = 1; + min = 0; + } else if (typeof max === 'undefined') { + max = min; + min = 0; + } + if (max > min) { + num = (num - min) % (max - min); + return num + (num < 0 ? max : min); + } else { + num = (num - max) % (min - max); + return num + (num <= 0 ? min : max); + } + }, /** * Returns a min if num is less than min, and max if more than max, otherwise returns num. */ - clamp(num: number, min: number, max: number): number; + clamp: function(num: number, min: number, max: number): number { + if (num < min) { + return min; + } else if (num > max) { + return max; + } else { + return num; + } + }, /** * Returns a random number between min and max when two arguments are provided. * If one arg is provided between 0 to max. * If one arg is passed between 0 to 1. */ - random(min?: number, max?: number): number; -} = Object.create(Math); - -export default math; - -// @ts-ignore -// noinspection JSConstantReassignment -math.EPSILON = 1e-9; // TODO - -math.isFinite = function(x: unknown): boolean { - return (typeof x === 'number') && isFinite(x) && !isNaN(x); -}; - -math.assert = function(x: any): void { - if (!_ASSERT) return; - if (!math.isFinite(x)) { - _DEBUG && common.debug(x); - throw new Error('Invalid Number!'); - } -}; - -math.invSqrt = function(x: number): number { - // TODO: - return 1 / Math.sqrt(x); -}; - -math.nextPowerOfTwo = function(x: number): number { - // TODO - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - return x + 1; -}; - -math.isPowerOfTwo = function(x: number): boolean { - return x > 0 && (x & (x - 1)) === 0; -}; - -math.mod = function(num: number, min?: number, max?: number): number { - if (typeof min === 'undefined') { - max = 1; - min = 0; - } else if (typeof max === 'undefined') { - max = min; - min = 0; - } - if (max > min) { - num = (num - min) % (max - min); - return num + (num < 0 ? max : min); - } else { - num = (num - max) % (min - max); - return num + (num <= 0 ? min : max); - } -}; - -math.clamp = function(num: number, min: number, max: number): number { - if (num < min) { - return min; - } else if (num > max) { - return max; - } else { - return num; - } -}; - -math.random = function(min?: number, max?: number): number { - if (typeof min === 'undefined') { - max = 1; - min = 0; - } else if (typeof max === 'undefined') { - max = min; - min = 0; + random: function(min?: number, max?: number): number { + if (typeof min === 'undefined') { + max = 1; + min = 0; + } else if (typeof max === 'undefined') { + max = min; + min = 0; + } + return min === max ? min : Math.random() * (max - min) + min; } - return min === max ? min : Math.random() * (max - min) + min; -}; +}); diff --git a/src/common/Rot.ts b/src/common/Rot.ts index 5e483dc9..d0a1a9be 100644 --- a/src/common/Rot.ts +++ b/src/common/Rot.ts @@ -22,22 +22,21 @@ * SOFTWARE. */ -import common from '../util/common'; -import Vec2 from './Vec2'; -import Math from './Math'; +import { Vec2, Vec2Value } from './Vec2'; +import { math as Math } from './Math'; -const _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; -export default class Rot { +export class Rot { s: number; c: number; /** Initialize from an angle in radians. */ constructor(angle?: number | Rot) { - if (!(this instanceof Rot)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof Rot)) { return new Rot(angle); } if (typeof angle === 'number') { @@ -79,11 +78,7 @@ export default class Rot { } static assert(o: any): void { - if (!_ASSERT) return; - if (!Rot.isValid(o)) { - _DEBUG && common.debug(o); - throw new Error('Invalid Rot!'); - } + _ASSERT && console.assert(!Rot.isValid(o), 'Invalid Rot!', o); } /** Set to the identity rotation. */ @@ -223,7 +218,7 @@ export default class Rot { } /** Inverse rotate a vector */ - static mulTVec2(rot: Rot, m: Vec2): Vec2 { + static mulTVec2(rot: Rot, m: Vec2Value): Vec2 { _ASSERT && Vec2.assert(m); return Vec2.neo(rot.c * m.x + rot.s * m.y, -rot.s * m.x + rot.c * m.y); } diff --git a/src/common/Sweep.ts b/src/common/Sweep.ts index 5321696a..b57877b4 100644 --- a/src/common/Sweep.ts +++ b/src/common/Sweep.ts @@ -22,11 +22,10 @@ * SOFTWARE. */ -import common from '../util/common'; -import Math from './Math'; -import Vec2 from './Vec2'; -import Rot from './Rot'; -import Transform from './Transform'; +import { math as Math } from './Math'; +import { Vec2 } from './Vec2'; +import { Rot } from './Rot'; +import { Transform } from './Transform'; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; @@ -38,7 +37,7 @@ const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; * center of mass. However, to support dynamics we must interpolate the center * of mass position. */ -export default class Sweep { +export class Sweep { /** Local center of mass position */ localCenter: Vec2; @@ -55,8 +54,8 @@ export default class Sweep { a0: number; constructor(c?: Vec2, a?: number) { - _ASSERT && common.assert(typeof c === 'undefined'); - _ASSERT && common.assert(typeof a === 'undefined'); + _ASSERT && console.assert(typeof c === 'undefined'); + _ASSERT && console.assert(typeof a === 'undefined'); this.localCenter = Vec2.zero(); this.c = Vec2.zero(); this.a = 0; @@ -102,7 +101,7 @@ export default class Sweep { * @param alpha The new initial time */ advance(alpha: number): void { - _ASSERT && common.assert(this.alpha0 < 1.0); + _ASSERT && console.assert(this.alpha0 < 1.0); const beta = (alpha - this.alpha0) / (1.0 - this.alpha0); this.c0.setCombine(beta, this.c, 1 - beta, this.c0); this.a0 = beta * this.a + (1 - beta) * this.a0; diff --git a/src/common/Transform.ts b/src/common/Transform.ts index ec0bf87f..8d304aba 100644 --- a/src/common/Transform.ts +++ b/src/common/Transform.ts @@ -22,13 +22,12 @@ * SOFTWARE. */ -import common from '../util/common'; -import Vec2 from './Vec2'; -import Rot from './Rot'; +import { Vec2, Vec2Value } from './Vec2'; +import { Rot } from './Rot'; -const _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; /** @@ -36,15 +35,15 @@ const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; * position and orientation of rigid frames. Initialize using a position vector * and a rotation. */ -export default class Transform { +export class Transform { /** position */ p: Vec2; /** rotation */ q: Rot; - constructor(position?: Vec2, rotation?: number) { - if (!(this instanceof Transform)) { + constructor(position?: Vec2Value, rotation?: number) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof Transform)) { return new Transform(position, rotation); } this.p = Vec2.zero(); @@ -124,16 +123,12 @@ export default class Transform { } static assert(o: any): void { - if (!_ASSERT) return; - if (!Transform.isValid(o)) { - _DEBUG && common.debug(o); - throw new Error('Invalid Transform!'); - } + _ASSERT && console.assert(!Transform.isValid(o), 'Invalid Transform!', o); } - static mul(a: Transform, b: Vec2): Vec2; + static mul(a: Transform, b: Vec2Value): Vec2; static mul(a: Transform, b: Transform): Transform; - // static mul(a: Transform, b: Vec2[]): Vec2[]; + // static mul(a: Transform, b: Vec2Value[]): Vec2[]; // static mul(a: Transform, b: Transform[]): Transform[]; // tslint:disable-next-line:typedef static mul(a, b) { @@ -153,7 +148,7 @@ export default class Transform { } } - static mulAll(a: Transform, b: Vec2[]): Vec2[]; + static mulAll(a: Transform, b: Vec2Value[]): Vec2[]; static mulAll(a: Transform, b: Transform[]): Transform[]; // tslint:disable-next-line:typedef static mulAll(a: Transform, b) { @@ -169,12 +164,12 @@ export default class Transform { // tslint:disable-next-line:typedef static mulFn(a: Transform) { _ASSERT && Transform.assert(a); - return function(b: Vec2): Vec2 { + return function(b: Vec2Value): Vec2 { return Transform.mul(a, b); }; } - static mulVec2(a: Transform, b: Vec2): Vec2 { + static mulVec2(a: Transform, b: Vec2Value): Vec2 { _ASSERT && Transform.assert(a); _ASSERT && Vec2.assert(b); const x = (a.q.c * b.x - a.q.s * b.y) + a.p.x; @@ -193,7 +188,7 @@ export default class Transform { return xf; } - static mulT(a: Transform, b: Vec2): Vec2; + static mulT(a: Transform, b: Vec2Value): Vec2; static mulT(a: Transform, b: Transform): Transform; // tslint:disable-next-line:typedef static mulT(a, b) { @@ -205,7 +200,7 @@ export default class Transform { } } - static mulTVec2(a: Transform, b: Vec2): Vec2 { + static mulTVec2(a: Transform, b: Vec2Value): Vec2 { _ASSERT && Transform.assert(a); _ASSERT && Vec2.assert(b); const px = b.x - a.p.x; diff --git a/src/common/Vec2.ts b/src/common/Vec2.ts index dfdb8b6e..df70df39 100644 --- a/src/common/Vec2.ts +++ b/src/common/Vec2.ts @@ -22,15 +22,19 @@ * SOFTWARE. */ -import common from '../util/common'; -import Math from './Math'; +import { math as Math } from './Math'; -const _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; -export default class Vec2 { +export interface Vec2Value { + x: number; + y: number; +} + +export class Vec2 { x: number; y: number; @@ -39,7 +43,7 @@ export default class Vec2 { constructor(); // tslint:disable-next-line:typedef constructor(x?, y?) { - if (!(this instanceof Vec2)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof Vec2)) { return new Vec2(x, y); } if (typeof x === 'undefined') { @@ -86,7 +90,7 @@ export default class Vec2 { return obj; } - static clone(v: Vec2): Vec2 { + static clone(v: Vec2Value): Vec2 { _ASSERT && Vec2.assert(v); return Vec2.neo(v.x, v.y); } @@ -107,11 +111,7 @@ export default class Vec2 { } static assert(o: any): void { - if (!_ASSERT) return; - if (!Vec2.isValid(o)) { - _DEBUG && common.debug(o); - throw new Error('Invalid Vec2!'); - } + _ASSERT && console.assert(!Vec2.isValid(o), 'Invalid Vec2!', o); } clone(): Vec2 { @@ -130,7 +130,7 @@ export default class Vec2 { } set(x: number, y: number): Vec2; - set(value: Vec2): Vec2; + set(value: Vec2Value): Vec2; /** * Set this vector to some specified coordinates. * @@ -170,7 +170,7 @@ export default class Vec2 { * * @returns this */ - setVec2(value: Vec2) { + setVec2(value: Vec2Value) { _ASSERT && Vec2.assert(value); this.x = value.x; this.y = value.y; @@ -182,7 +182,7 @@ export default class Vec2 { * @internal * @deprecated Use setCombine or setMul */ - wSet(a: number, v: Vec2, b?: number, w?: Vec2): Vec2 { + wSet(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 { if (typeof b !== 'undefined' || typeof w !== 'undefined') { return this.setCombine(a, v, b, w); } else { @@ -193,7 +193,7 @@ export default class Vec2 { /** * Set linear combination of v and w: `a * v + b * w` */ - setCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2 { + setCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 { _ASSERT && Math.assert(a); _ASSERT && Vec2.assert(v); _ASSERT && Math.assert(b); @@ -207,7 +207,7 @@ export default class Vec2 { return this; } - setMul(a: number, v: Vec2): Vec2 { + setMul(a: number, v: Vec2Value): Vec2 { _ASSERT && Math.assert(a); _ASSERT && Vec2.assert(v); const x = a * v.x; @@ -223,7 +223,7 @@ export default class Vec2 { * * @returns this */ - add(w: Vec2): Vec2 { + add(w: Vec2Value): Vec2 { _ASSERT && Vec2.assert(w); this.x += w.x; this.y += w.y; @@ -234,7 +234,7 @@ export default class Vec2 { * @internal * @deprecated Use addCombine or addMul */ - wAdd(a: number, v: Vec2, b?: number, w?: Vec2): Vec2 { + wAdd(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 { if (typeof b !== 'undefined' || typeof w !== 'undefined') { return this.addCombine(a, v, b, w); } else { @@ -245,7 +245,7 @@ export default class Vec2 { /** * Add linear combination of v and w: `a * v + b * w` */ - addCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2 { + addCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 { _ASSERT && Math.assert(a); _ASSERT && Vec2.assert(v); _ASSERT && Math.assert(b); @@ -260,7 +260,7 @@ export default class Vec2 { return this; } - addMul(a: number, v: Vec2): Vec2 { + addMul(a: number, v: Vec2Value): Vec2 { _ASSERT && Math.assert(a); _ASSERT && Vec2.assert(v); const x = a * v.x; @@ -274,7 +274,7 @@ export default class Vec2 { /** * @deprecated Use subCombine or subMul */ - wSub(a: number, v: Vec2, b?: number, w?: Vec2): Vec2 { + wSub(a: number, v: Vec2Value, b?: number, w?: Vec2Value): Vec2 { if (typeof b !== 'undefined' || typeof w !== 'undefined') { return this.subCombine(a, v, b, w); } else { @@ -284,7 +284,7 @@ export default class Vec2 { /** * Subtract linear combination of v and w: `a * v + b * w` */ - subCombine(a: number, v: Vec2, b: number, w: Vec2): Vec2 { + subCombine(a: number, v: Vec2Value, b: number, w: Vec2Value): Vec2 { _ASSERT && Math.assert(a); _ASSERT && Vec2.assert(v); _ASSERT && Math.assert(b); @@ -298,7 +298,7 @@ export default class Vec2 { return this; } - subMul(a: number, v: Vec2): Vec2 { + subMul(a: number, v: Vec2Value): Vec2 { _ASSERT && Math.assert(a); _ASSERT && Vec2.assert(v); const x = a * v.x; @@ -314,7 +314,7 @@ export default class Vec2 { * * @returns this */ - sub(w: Vec2): Vec2 { + sub(w: Vec2Value): Vec2 { _ASSERT && Vec2.assert(w); this.x -= w.x; this.y -= w.y; @@ -370,7 +370,7 @@ export default class Vec2 { * * For performance, use this instead of lengthSquared (if possible). */ - static lengthOf(v: Vec2): number { + static lengthOf(v: Vec2Value): number { _ASSERT && Vec2.assert(v); return Math.sqrt(v.x * v.x + v.y * v.y); } @@ -378,12 +378,12 @@ export default class Vec2 { /** * Get the length squared. */ - static lengthSquared(v: Vec2): number { + static lengthSquared(v: Vec2Value): number { _ASSERT && Vec2.assert(v); return v.x * v.x + v.y * v.y; } - static distance(v: Vec2, w: Vec2): number { + static distance(v: Vec2Value, w: Vec2Value): number { _ASSERT && Vec2.assert(v); _ASSERT && Vec2.assert(w); const dx = v.x - w.x; @@ -391,7 +391,7 @@ export default class Vec2 { return Math.sqrt(dx * dx + dy * dy); } - static distanceSquared(v: Vec2, w: Vec2): number { + static distanceSquared(v: Vec2Value, w: Vec2Value): number { _ASSERT && Vec2.assert(v); _ASSERT && Vec2.assert(w); const dx = v.x - w.x; @@ -399,7 +399,7 @@ export default class Vec2 { return dx * dx + dy * dy; } - static areEqual(v: Vec2, w: Vec2): boolean { + static areEqual(v: Vec2Value, w: Vec2Value): boolean { _ASSERT && Vec2.assert(v); _ASSERT && Vec2.assert(w); return v === w || typeof w === 'object' && w !== null && v.x === w.x && v.y === w.y; @@ -408,7 +408,7 @@ export default class Vec2 { /** * Get the skew vector such that dot(skew_vec, other) == cross(vec, other) */ - static skew(v: Vec2): Vec2 { + static skew(v: Vec2Value): Vec2 { _ASSERT && Vec2.assert(v); return Vec2.neo(-v.y, v.x); } @@ -416,15 +416,15 @@ export default class Vec2 { /** * Perform the dot product on two vectors. */ - static dot(v: Vec2, w: Vec2): number { + static dot(v: Vec2Value, w: Vec2Value): number { _ASSERT && Vec2.assert(v); _ASSERT && Vec2.assert(w); return v.x * w.x + v.y * w.y; } - static cross(v: Vec2, w: Vec2): number; - static cross(v: Vec2, w: number): Vec2; - static cross(v: number, w: Vec2): Vec2; + static cross(v: Vec2Value, w: Vec2Value): number; + static cross(v: Vec2Value, w: number): Vec2; + static cross(v: number, w: Vec2Value): Vec2; /** * Perform the cross product on two vectors. In 2D this produces a scalar. * @@ -453,7 +453,7 @@ export default class Vec2 { /** * Perform the cross product on two vectors. In 2D this produces a scalar. */ - static crossVec2Vec2(v: Vec2, w: Vec2): number { + static crossVec2Vec2(v: Vec2Value, w: Vec2Value): number { _ASSERT && Vec2.assert(v); _ASSERT && Vec2.assert(w); return v.x * w.y - v.y * w.x; @@ -463,7 +463,7 @@ export default class Vec2 { * Perform the cross product on a vector and a scalar. In 2D this produces a * vector. */ - static crossVec2Num(v: Vec2, w: number): Vec2 { + static crossVec2Num(v: Vec2Value, w: number): Vec2 { _ASSERT && Vec2.assert(v); _ASSERT && Math.assert(w); return Vec2.neo(w * v.y, -w * v.x); @@ -473,14 +473,14 @@ export default class Vec2 { * Perform the cross product on a vector and a scalar. In 2D this produces a * vector. */ - static crossNumVec2(v: number, w: Vec2): Vec2 { + static crossNumVec2(v: number, w: Vec2Value): Vec2 { _ASSERT && Math.assert(v); _ASSERT && Vec2.assert(w); return Vec2.neo(-v * w.y, v * w.x); } - static addCross(a: Vec2, v: Vec2, w: number): Vec2; - static addCross(a: Vec2, v: number, w: Vec2): Vec2; + static addCross(a: Vec2Value, v: Vec2Value, w: number): Vec2; + static addCross(a: Vec2Value, v: number, w: Vec2Value): Vec2; /** * Returns `a + (v x w)` */ @@ -497,13 +497,13 @@ export default class Vec2 { return Vec2.neo(-v * w.y + a.x, v * w.x + a.y); } - _ASSERT && common.assert(false); + _ASSERT && console.assert(false); } /** * Returns `a + (v x w)` */ - static addCrossVec2Num(a: Vec2, v: Vec2, w: number): Vec2 { + static addCrossVec2Num(a: Vec2Value, v: Vec2Value, w: number): Vec2 { _ASSERT && Vec2.assert(v); _ASSERT && Math.assert(w); return Vec2.neo(w * v.y + a.x, -w * v.x + a.y); @@ -512,13 +512,13 @@ export default class Vec2 { /** * Returns `a + (v x w)` */ - static addCrossNumVec2(a: Vec2, v: number, w: Vec2): Vec2 { + static addCrossNumVec2(a: Vec2Value, v: number, w: Vec2Value): Vec2 { _ASSERT && Math.assert(v); _ASSERT && Vec2.assert(w); return Vec2.neo(-v * w.y + a.x, v * w.x + a.y); } - static add(v: Vec2, w: Vec2): Vec2 { + static add(v: Vec2Value, w: Vec2Value): Vec2 { _ASSERT && Vec2.assert(v); _ASSERT && Vec2.assert(w); return Vec2.neo(v.x + w.x, v.y + w.y); @@ -537,14 +537,14 @@ export default class Vec2 { return Vec2.zero().setCombine(a, v, b, w); } - static sub(v: Vec2, w: Vec2): Vec2 { + static sub(v: Vec2Value, w: Vec2Value): Vec2 { _ASSERT && Vec2.assert(v); _ASSERT && Vec2.assert(w); return Vec2.neo(v.x - w.x, v.y - w.y); } - static mul(a: Vec2, b: number): Vec2; - static mul(a: number, b: Vec2): Vec2; + static mul(a: Vec2Value, b: number): Vec2; + static mul(a: number, b: Vec2Value): Vec2; // tslint:disable-next-line:typedef static mul(a, b) { if (typeof a === 'object') { @@ -559,13 +559,13 @@ export default class Vec2 { } } - static mulVec2Num(a: Vec2, b: number): Vec2 { + static mulVec2Num(a: Vec2Value, b: number): Vec2 { _ASSERT && Vec2.assert(a); _ASSERT && Math.assert(b); return Vec2.neo(a.x * b, a.y * b); } - static mulNumVec2(a: number, b: Vec2): Vec2 { + static mulNumVec2(a: number, b: Vec2Value): Vec2 { _ASSERT && Math.assert(a); _ASSERT && Vec2.assert(b); return Vec2.neo(a * b.x, a * b.y); @@ -577,29 +577,29 @@ export default class Vec2 { return this; } - static neg(v: Vec2): Vec2 { + static neg(v: Vec2Value): Vec2 { _ASSERT && Vec2.assert(v); return Vec2.neo(-v.x, -v.y); } - static abs(v: Vec2): Vec2 { + static abs(v: Vec2Value): Vec2 { _ASSERT && Vec2.assert(v); return Vec2.neo(Math.abs(v.x), Math.abs(v.y)); } - static mid(v: Vec2, w: Vec2): Vec2 { + static mid(v: Vec2Value, w: Vec2Value): Vec2 { _ASSERT && Vec2.assert(v); _ASSERT && Vec2.assert(w); return Vec2.neo((v.x + w.x) * 0.5, (v.y + w.y) * 0.5); } - static upper(v: Vec2, w: Vec2): Vec2 { + static upper(v: Vec2Value, w: Vec2Value): Vec2 { _ASSERT && Vec2.assert(v); _ASSERT && Vec2.assert(w); return Vec2.neo(Math.max(v.x, w.x), Math.max(v.y, w.y)); } - static lower(v: Vec2, w: Vec2): Vec2 { + static lower(v: Vec2Value, w: Vec2Value): Vec2 { _ASSERT && Vec2.assert(v); _ASSERT && Vec2.assert(w); return Vec2.neo(Math.min(v.x, w.x), Math.min(v.y, w.y)); @@ -608,17 +608,17 @@ export default class Vec2 { clamp(max: number): Vec2 { const lengthSqr = this.x * this.x + this.y * this.y; if (lengthSqr > max * max) { - const invLength = Math.invSqrt(lengthSqr); - this.x *= invLength * max; - this.y *= invLength * max; + const scale = max / Math.sqrt(lengthSqr); + this.x *= scale; + this.y *= scale; } return this; } - static clamp(v: Vec2, max: number): Vec2 { - v = Vec2.neo(v.x, v.y); - v.clamp(max); - return v; + static clamp(v: Vec2Value, max: number): Vec2 { + const r = Vec2.neo(v.x, v.y); + r.clamp(max); + return r; } /** @internal @deprecated */ diff --git a/src/common/Vec3.ts b/src/common/Vec3.ts index b81ab149..ebd0e8d5 100644 --- a/src/common/Vec3.ts +++ b/src/common/Vec3.ts @@ -22,15 +22,14 @@ * SOFTWARE. */ -import common from '../util/common'; -import Math from './Math'; +import { math as Math } from './Math'; -const _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; -export default class Vec3 { +export class Vec3 { x: number; y: number; z: number; @@ -40,7 +39,7 @@ export default class Vec3 { constructor(); // tslint:disable-next-line:typedef constructor(x?, y?, z?) { - if (!(this instanceof Vec3)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof Vec3)) { return new Vec3(x, y, z); } if (typeof x === 'undefined') { @@ -115,11 +114,7 @@ export default class Vec3 { } static assert(o: any): void { - if (!_ASSERT) return; - if (!Vec3.isValid(o)) { - _DEBUG && common.debug(o); - throw new Error('Invalid Vec3!'); - } + _ASSERT && console.assert(!Vec3.isValid(o), 'Invalid Vec3!', o); } setZero(): Vec3 { diff --git a/src/dynamics/Body.ts b/src/dynamics/Body.ts index 2110ff14..7c12f1bf 100644 --- a/src/dynamics/Body.ts +++ b/src/dynamics/Body.ts @@ -22,24 +22,24 @@ * SOFTWARE. */ - -import common from '../util/common'; -import options from '../util/options'; -import Vec2 from '../common/Vec2'; -import Rot from '../common/Rot'; -import Math from '../common/Math'; -import Sweep from '../common/Sweep'; -import Transform from '../common/Transform'; -import Velocity from './Velocity'; -import Position from './Position'; -import Fixture, { FixtureDef, FixtureOpt } from './Fixture'; -import Shape from '../collision/Shape'; +import { options } from '../util/options'; +import { Vec2, Vec2Value } from '../common/Vec2'; +import { Rot } from '../common/Rot'; +import { math as Math } from '../common/Math'; +import { Sweep } from '../common/Sweep'; +import { Transform } from '../common/Transform'; +import { Velocity } from './Velocity'; +import { Position } from './Position'; +import { Fixture, FixtureDef, FixtureOpt } from './Fixture'; +import { Shape } from '../collision/Shape'; import { JointEdge } from "./Joint"; -import World from "./World"; +import { World } from "./World"; import { ContactEdge } from "./Contact"; + const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; + export type BodyType = 'static' | 'kinematic' | 'dynamic'; const STATIC = 'static'; @@ -145,7 +145,7 @@ export class MassData { * * To create a new Body use {@link World.createBody}. */ -export default class Body { +export class Body { /** * A static body does not move under simulation and behaves as if it has infinite mass. * Internally, zero is stored for the mass and the inverse mass. @@ -213,12 +213,12 @@ export default class Body { constructor(world: World, def: BodyDef) { def = options(def, BodyDefDefault); - _ASSERT && common.assert(Vec2.isValid(def.position)); - _ASSERT && common.assert(Vec2.isValid(def.linearVelocity)); - _ASSERT && common.assert(Math.isFinite(def.angle)); - _ASSERT && common.assert(Math.isFinite(def.angularVelocity)); - _ASSERT && common.assert(Math.isFinite(def.angularDamping) && def.angularDamping >= 0.0); - _ASSERT && common.assert(Math.isFinite(def.linearDamping) && def.linearDamping >= 0.0); + _ASSERT && console.assert(Vec2.isValid(def.position)); + _ASSERT && console.assert(Vec2.isValid(def.linearVelocity)); + _ASSERT && console.assert(Math.isFinite(def.angle)); + _ASSERT && console.assert(Math.isFinite(def.angularVelocity)); + _ASSERT && console.assert(Math.isFinite(def.angularDamping) && def.angularDamping >= 0.0); + _ASSERT && console.assert(Math.isFinite(def.linearDamping) && def.linearDamping >= 0.0); this.m_world = world; @@ -388,8 +388,8 @@ export default class Body { * @internal */ setType(type: BodyType): void { - _ASSERT && common.assert(type === STATIC || type === KINEMATIC || type === DYNAMIC); - _ASSERT && common.assert(this.isWorldLocked() == false); + _ASSERT && console.assert(type === STATIC || type === KINEMATIC || type === DYNAMIC); + _ASSERT && console.assert(this.isWorldLocked() == false); if (this.isWorldLocked() == true) { return; @@ -499,7 +499,7 @@ export default class Body { * and remains */ setActive(flag: boolean): void { - _ASSERT && common.assert(this.isWorldLocked() == false); + _ASSERT && console.assert(this.isWorldLocked() == false); if (flag == this.m_activeFlag) { return; @@ -568,7 +568,7 @@ export default class Body { * @param angle The world rotation in radians. */ setTransform(position: Vec2, angle: number): void { - _ASSERT && common.assert(this.isWorldLocked() == false); + _ASSERT && console.assert(this.isWorldLocked() == false); if (this.isWorldLocked() == true) { return; } @@ -791,7 +791,7 @@ export default class Body { return; } - _ASSERT && common.assert(this.isDynamic()); + _ASSERT && console.assert(this.isDynamic()); // Accumulate mass over all fixtures. const localCenter = Vec2.zero(); @@ -821,7 +821,7 @@ export default class Body { if (this.m_I > 0.0 && this.m_fixedRotationFlag == false) { // Center the inertia about the center of mass. this.m_I -= this.m_mass * Vec2.dot(localCenter, localCenter); - _ASSERT && common.assert(this.m_I > 0.0); + _ASSERT && console.assert(this.m_I > 0.0); this.m_invI = 1.0 / this.m_I; } else { @@ -847,7 +847,7 @@ export default class Body { * @param massData The mass properties. */ setMassData(massData: MassData): void { - _ASSERT && common.assert(this.isWorldLocked() == false); + _ASSERT && console.assert(this.isWorldLocked() == false); if (this.isWorldLocked() == true) { return; } @@ -870,7 +870,7 @@ export default class Body { if (massData.I > 0.0 && this.m_fixedRotationFlag == false) { this.m_I = massData.I - this.m_mass * Vec2.dot(massData.center, massData.center); - _ASSERT && common.assert(this.m_I > 0.0); + _ASSERT && console.assert(this.m_I > 0.0); this.m_invI = 1.0 / this.m_I; } @@ -1013,7 +1013,7 @@ export default class Body { * @internal Used for deserialize. */ _addFixture(fixture: Fixture): Fixture { - _ASSERT && common.assert(this.isWorldLocked() == false); + _ASSERT && console.assert(this.isWorldLocked() == false); if (this.isWorldLocked() == true) { return null; @@ -1054,7 +1054,7 @@ export default class Body { createFixture(shape: Shape, density?: number): Fixture; // tslint:disable-next-line:typedef createFixture(shape, fixdef?) { - _ASSERT && common.assert(this.isWorldLocked() == false); + _ASSERT && console.assert(this.isWorldLocked() == false); if (this.isWorldLocked() == true) { return null; @@ -1077,13 +1077,13 @@ export default class Body { * @param fixture The fixture to be removed. */ destroyFixture(fixture: Fixture): void { - _ASSERT && common.assert(this.isWorldLocked() == false); + _ASSERT && console.assert(this.isWorldLocked() == false); if (this.isWorldLocked() == true) { return; } - _ASSERT && common.assert(fixture.m_body == this); + _ASSERT && console.assert(fixture.m_body == this); // Remove the fixture from this body's singly linked list. let found = false; @@ -1104,7 +1104,7 @@ export default class Body { } // You tried to remove a shape that is not attached to this body. - _ASSERT && common.assert(found); + _ASSERT && console.assert(found); // Destroy any contacts associated with the fixture. let edge = this.m_contactList; @@ -1153,14 +1153,14 @@ export default class Body { /** * Gets the corresponding local point of a world point. */ - getLocalPoint(worldPoint: Vec2): Vec2 { + getLocalPoint(worldPoint: Vec2Value): Vec2 { return Transform.mulTVec2(this.m_xf, worldPoint); } /** * Gets the corresponding local vector of a world vector. */ - getLocalVector(worldVector: Vec2): Vec2 { + getLocalVector(worldVector: Vec2Value): Vec2 { return Rot.mulTVec2(this.m_xf.q, worldVector); } } diff --git a/src/dynamics/Contact.ts b/src/dynamics/Contact.ts index e191ed99..a945ea43 100644 --- a/src/dynamics/Contact.ts +++ b/src/dynamics/Contact.ts @@ -23,17 +23,16 @@ */ import { ShapeType } from "../collision/Shape"; -import common from '../util/common'; -import Math from '../common/Math'; -import Vec2 from '../common/Vec2'; -import Transform from '../common/Transform'; -import Mat22 from '../common/Mat22'; -import Rot from '../common/Rot'; -import Settings from '../Settings'; -import Manifold, { ManifoldType, WorldManifold } from '../collision/Manifold'; +import { math as Math } from '../common/Math'; +import { Vec2 } from '../common/Vec2'; +import { Transform } from '../common/Transform'; +import { Mat22 } from '../common/Mat22'; +import { Rot } from '../common/Rot'; +import { Settings } from '../Settings'; +import { Manifold, ManifoldType, WorldManifold } from '../collision/Manifold'; import { testOverlap } from '../collision/Distance'; -import Fixture from "./Fixture"; -import Body from "./Body"; +import { Fixture } from "./Fixture"; +import { Body } from "./Body"; import { ContactImpulse, TimeStep } from "./Solver"; @@ -119,7 +118,7 @@ export class VelocityConstraintPoint { * overlapping AABB in the broad-phase (except if filtered). Therefore a contact * object may exist that has no contact points. */ -export default class Contact { +export class Contact { /** @internal */ m_nodeA: ContactEdge; /** @internal */ @@ -225,7 +224,7 @@ export default class Contact { const manifold = this.getManifold(); const pointCount = manifold.pointCount; - _ASSERT && common.assert(pointCount > 0); + _ASSERT && console.assert(pointCount > 0); this.v_invMassA = bodyA.m_invMass; this.v_invMassB = bodyB.m_invMass; @@ -688,7 +687,7 @@ export default class Contact { const vB = Vec2.clone(velocityB.v); const wB = velocityB.w; - _ASSERT && common.assert(manifold.pointCount > 0); + _ASSERT && console.assert(manifold.pointCount > 0); const xfA = Transform.identity(); const xfB = Transform.identity(); @@ -846,7 +845,7 @@ export default class Contact { const tangent = Vec2.crossVec2Num(normal, 1.0); const friction = this.v_friction; - _ASSERT && common.assert(this.v_pointCount == 1 || this.v_pointCount == 2); + _ASSERT && console.assert(this.v_pointCount == 1 || this.v_pointCount == 2); // Solve tangent constraints first because non-penetration is more important // than friction. @@ -952,7 +951,7 @@ export default class Contact { const vcp2 = this.v_points[1]; // VelocityConstraintPoint const a = Vec2.neo(vcp1.normalImpulse, vcp2.normalImpulse); - _ASSERT && common.assert(a.x >= 0.0 && a.y >= 0.0); + _ASSERT && console.assert(a.x >= 0.0 && a.y >= 0.0); // Relative velocity at contact let dv1 = Vec2.zero().add(vB).add(Vec2.crossNumVec2(wB, vcp1.rB)).sub(vA).sub(Vec2.crossNumVec2(wA, vcp1.rA)); @@ -1009,8 +1008,8 @@ export default class Contact { vn1 = Vec2.dot(dv1, normal); vn2 = Vec2.dot(dv2, normal); - _ASSERT && common.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol); - _ASSERT && common.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol); + _ASSERT && console.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol); + _ASSERT && console.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol); } break; } @@ -1052,7 +1051,7 @@ export default class Contact { // Compute normal velocity vn1 = Vec2.dot(dv1, normal); - _ASSERT && common.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol); + _ASSERT && console.assert(Math.abs(vn1 - vcp1.velocityBias) < k_errorTol); } break; } @@ -1094,7 +1093,7 @@ export default class Contact { // Compute normal velocity vn2 = Vec2.dot(dv2, normal); - _ASSERT && common.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol); + _ASSERT && console.assert(Math.abs(vn2 - vcp2.velocityBias) < k_errorTol); } break; } diff --git a/src/dynamics/Fixture.ts b/src/dynamics/Fixture.ts index 37852cf2..2115d42b 100644 --- a/src/dynamics/Fixture.ts +++ b/src/dynamics/Fixture.ts @@ -22,15 +22,14 @@ * SOFTWARE. */ -import common from '../util/common'; -import options from '../util/options'; -import Math from '../common/Math'; -import Vec2 from '../common/Vec2'; -import AABB, { RayCastInput, RayCastOutput } from '../collision/AABB'; -import Shape, { ShapeType } from '../collision/Shape'; -import Body, { MassData } from "./Body"; -import BroadPhase from "../collision/BroadPhase"; -import Transform from "../common/Transform"; +import { options } from '../util/options'; +import { math as Math } from '../common/Math'; +import { Vec2, Vec2Value } from '../common/Vec2'; +import { AABB, RayCastInput, RayCastOutput } from '../collision/AABB'; +import { Shape, ShapeType } from '../collision/Shape'; +import { Body, MassData } from "./Body"; +import { BroadPhase } from "../collision/BroadPhase"; +import { Transform } from "../common/Transform"; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; @@ -113,7 +112,7 @@ export class FixtureProxy { * * To create a new Fixture use {@link Body.createFixture}. */ -export default class Fixture { +export class Fixture { /** @internal */ m_body: Body; /** @internal */ m_friction: number; /** @internal */ m_restitution: number; @@ -296,7 +295,7 @@ export default class Fixture { * mass of the body. You must call Body.resetMassData to update the body's mass. */ setDensity(density: number): void { - _ASSERT && common.assert(Math.isFinite(density) && density >= 0.0); + _ASSERT && console.assert(Math.isFinite(density) && density >= 0.0); this.m_density = density; } @@ -333,7 +332,7 @@ export default class Fixture { /** * Test a point in world coordinates for containment in this fixture. */ - testPoint(p: Vec2): boolean { + testPoint(p: Vec2Value): boolean { return this.m_shape.testPoint(this.m_body.getTransform(), p); } @@ -358,7 +357,7 @@ export default class Fixture { * more accurate AABB, compute it using the shape and the body transform. */ getAABB(childIndex: number): AABB { - _ASSERT && common.assert(0 <= childIndex && childIndex < this.m_proxyCount); + _ASSERT && console.assert(0 <= childIndex && childIndex < this.m_proxies.length); return this.m_proxies[childIndex].aabb; } @@ -366,7 +365,7 @@ export default class Fixture { * These support body activation/deactivation. */ createProxies(broadPhase: BroadPhase, xf: Transform): void { - _ASSERT && common.assert(this.m_proxyCount == 0); + _ASSERT && console.assert(this.m_proxyCount == 0); // Create proxies in the broad-phase. this.m_proxyCount = this.m_shape.getChildCount(); diff --git a/src/dynamics/Joint.ts b/src/dynamics/Joint.ts index 2bd79ab9..1a1bc72f 100644 --- a/src/dynamics/Joint.ts +++ b/src/dynamics/Joint.ts @@ -22,9 +22,8 @@ * SOFTWARE. */ -import common from '../util/common'; -import type Vec2 from '../common/Vec2'; -import type Body from './Body'; +import type { Vec2 } from '../common/Vec2'; +import type { Body } from './Body'; import { TimeStep } from "./Solver"; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; @@ -91,7 +90,7 @@ const DEFAULTS = { * The base joint class. Joints are used to constraint two bodies together in * various fashions. Some joints also feature limits and motors. */ -export default abstract class Joint { +export abstract class Joint { /** @internal */ m_type: string = 'unknown-joint'; @@ -115,9 +114,9 @@ export default abstract class Joint { bodyA = 'bodyA' in def ? def.bodyA : bodyA; bodyB = 'bodyB' in def ? def.bodyB : bodyB; - _ASSERT && common.assert(!!bodyA); - _ASSERT && common.assert(!!bodyB); - _ASSERT && common.assert(bodyA != bodyB); + _ASSERT && console.assert(!!bodyA); + _ASSERT && console.assert(!!bodyB); + _ASSERT && console.assert(bodyA != bodyB); this.m_bodyA = bodyA!; this.m_bodyB = bodyB!; diff --git a/src/dynamics/Position.ts b/src/dynamics/Position.ts index 918a81bd..9fac37af 100644 --- a/src/dynamics/Position.ts +++ b/src/dynamics/Position.ts @@ -22,12 +22,12 @@ * SOFTWARE. */ -import Vec2 from '../common/Vec2'; -import Rot from '../common/Rot'; -import Transform from '../common/Transform'; +import { Vec2 } from '../common/Vec2'; +import { Rot } from '../common/Rot'; +import { Transform } from '../common/Transform'; -export default class Position { +export class Position { /** location */ c: Vec2; diff --git a/src/dynamics/Rope-ts b/src/dynamics/Rope-ts index cfa651ec..26f59e43 100644 --- a/src/dynamics/Rope-ts +++ b/src/dynamics/Rope-ts @@ -22,9 +22,8 @@ * SOFTWARE. */ -import common from '../util/common'; import { Vec2 } from "../index"; -import options from "../util/options"; +import { options } from "../util/options"; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; @@ -52,7 +51,7 @@ const RopeDefDefault: RopeDef = { k3 : 0.1 }; -export default class Rope { +export class Rope { m_gravity = Vec2.zero(); m_damping: number; @@ -68,7 +67,7 @@ export default class Rope { m_k3 = 0.1; constructor(def) { - _ASSERT && common.assert(def.count >= 3); + _ASSERT && console.assert(def.count >= 3); def = options(def, RopeDefDefault); diff --git a/src/dynamics/Solver.ts b/src/dynamics/Solver.ts index 3fb53bdc..aaa2dc6d 100644 --- a/src/dynamics/Solver.ts +++ b/src/dynamics/Solver.ts @@ -22,19 +22,17 @@ * SOFTWARE. */ -import Settings from '../Settings'; -import common from '../util/common'; -import Vec2 from '../common/Vec2'; -import Math from '../common/Math'; -import Body from './Body'; -import Contact from './Contact'; -import Joint from './Joint'; -import TimeOfImpact, { TOIInput, TOIOutput, TOIOutputState } from '../collision/TimeOfImpact'; -import Distance, { DistanceInput, DistanceOutput, SimplexCache } from '../collision/Distance'; -import World from "./World"; - - -const _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG; +import { Settings } from '../Settings'; +import { Vec2 } from '../common/Vec2'; +import { math as Math } from '../common/Math'; +import { Body } from './Body'; +import type { Contact } from './Contact'; +import { Joint } from './Joint'; +import { TimeOfImpact, TOIInput, TOIOutput, TOIOutputState } from '../collision/TimeOfImpact'; +import { Distance, DistanceInput, DistanceOutput, SimplexCache } from '../collision/Distance'; +import { World } from "./World"; + + const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; @@ -108,7 +106,7 @@ export class ContactImpulse { /** * Finds and solves islands. An island is a connected subset of the world. */ -export default class Solver { +export class Solver { m_world: World; m_stack: Body[]; m_bodies: Body[]; @@ -131,7 +129,7 @@ export default class Solver { } addBody(body: Body): void { - _ASSERT && common.assert(body instanceof Body, 'Not a Body!', body); + _ASSERT && console.assert(body instanceof Body, 'Not a Body!', body); this.m_bodies.push(body); // why? // body.c_position.c.setZero(); @@ -141,12 +139,12 @@ export default class Solver { } addContact(contact: Contact): void { - _ASSERT && common.assert(contact instanceof Contact, 'Not a Contact!', contact); + // _ASSERT && console.assert(contact instanceof Contact, 'Not a Contact!', contact); this.m_contacts.push(contact); } addJoint(joint: Joint): void { - _ASSERT && common.assert(joint instanceof Joint, 'Not a Joint!', joint); + _ASSERT && console.assert(joint instanceof Joint, 'Not a Joint!', joint); this.m_joints.push(joint); } @@ -193,7 +191,7 @@ export default class Solver { while (stack.length > 0) { // Grab the next body off the stack and add it to the island. const b = stack.pop(); - _ASSERT && common.assert(b.isActive() == true); + _ASSERT && console.assert(b.isActive() == true); this.addBody(b); // Make sure the body is awake. @@ -236,7 +234,7 @@ export default class Solver { continue; } - // _ASSERT && common.assert(stack.length < world.m_bodyCount); + // _ASSERT && console.assert(stack.length < world.m_bodyCount); stack.push(other); other.m_islandFlag = true; } @@ -261,7 +259,7 @@ export default class Solver { continue; } - // _ASSERT && common.assert(stack.length < world.m_bodyCount); + // _ASSERT && console.assert(stack.length < world.m_bodyCount); stack.push(other); other.m_islandFlag = true; } @@ -333,15 +331,11 @@ export default class Solver { contact.initConstraint(step); } - _DEBUG && this.printBodies('M: '); - for (let i = 0; i < this.m_contacts.length; ++i) { const contact = this.m_contacts[i]; contact.initVelocityConstraint(step); } - _DEBUG && this.printBodies('R: '); - if (step.warmStarting) { // Warm start. for (let i = 0; i < this.m_contacts.length; ++i) { @@ -350,15 +344,11 @@ export default class Solver { } } - _DEBUG && this.printBodies('Q: '); - for (let i = 0; i < this.m_joints.length; ++i) { const joint = this.m_joints[i]; joint.initVelocityConstraints(step); } - _DEBUG && this.printBodies('E: '); - // Solve velocity constraints for (let i = 0; i < step.velocityIterations; ++i) { for (let j = 0; j < this.m_joints.length; ++j) { @@ -372,16 +362,12 @@ export default class Solver { } } - _DEBUG && this.printBodies('D: '); - // Store impulses for warm starting for (let i = 0; i < this.m_contacts.length; ++i) { const contact = this.m_contacts[i]; contact.storeConstraintImpulses(step); } - _DEBUG && this.printBodies('C: '); - // Integrate positions for (let i = 0; i < this.m_bodies.length; ++i) { const body = this.m_bodies[i]; @@ -414,8 +400,6 @@ export default class Solver { body.c_velocity.w = w; } - _DEBUG && this.printBodies('B: '); - // Solve position constraints let positionSolved = false; for (let i = 0; i < step.positionIterations; ++i) { @@ -443,8 +427,6 @@ export default class Solver { } } - _DEBUG && this.printBodies('L: '); - // Copy state buffers back to the bodies for (let i = 0; i < this.m_bodies.length; ++i) { const body = this.m_bodies[i]; @@ -490,14 +472,6 @@ export default class Solver { } } - /** @internal */ - printBodies(tag: string): void { - for (let i = 0; i < this.m_bodies.length; ++i) { - const b = this.m_bodies[i]; - common.debug(tag, b.c_position.a, b.c_position.c.x, b.c_position.c.y, b.c_velocity.w, b.c_velocity.v.x, b.c_velocity.v.y); - } - } - /** * Find TOI contacts and solve them. */ @@ -552,7 +526,7 @@ export default class Solver { const bA = fA.getBody(); const bB = fB.getBody(); - _ASSERT && common.assert(bA.isDynamic() || bB.isDynamic()); + _ASSERT && console.assert(bA.isDynamic() || bB.isDynamic()); const activeA = bA.isAwake() && !bA.isStatic(); const activeB = bB.isAwake() && !bB.isStatic(); @@ -582,7 +556,7 @@ export default class Solver { bB.m_sweep.advance(alpha0); } - _ASSERT && common.assert(alpha0 < 1.0); + _ASSERT && console.assert(alpha0 < 1.0); const indexA = c.getChildIndexA(); const indexB = c.getChildIndexB(); @@ -770,13 +744,6 @@ export default class Solver { break; } } - - if (_DEBUG) for (let b = world.m_bodyList; b; b = b.m_next) { - const c = b.m_sweep.c; - const a = b.m_sweep.a; - const v = b.m_linearVelocity; - const w = b.m_angularVelocity; - } } solveIslandTOI(subStep: TimeStep, toiA: Body, toiB: Body): void { @@ -918,3 +885,6 @@ export default class Solver { } } } + +// @ts-ignore +Solver.TimeStep = TimeStep; diff --git a/src/dynamics/Velocity.ts b/src/dynamics/Velocity.ts index 9c0fa50c..b863e681 100644 --- a/src/dynamics/Velocity.ts +++ b/src/dynamics/Velocity.ts @@ -22,9 +22,9 @@ * SOFTWARE. */ -import Vec2 from '../common/Vec2'; +import { Vec2 } from '../common/Vec2'; -export default class Velocity { +export class Velocity { /** linear */ v: Vec2; diff --git a/src/dynamics/World.ts b/src/dynamics/World.ts index 3aedc556..942e08da 100644 --- a/src/dynamics/World.ts +++ b/src/dynamics/World.ts @@ -22,20 +22,20 @@ * SOFTWARE. */ -import options from '../util/options'; -import common from '../util/common'; -import Vec2 from '../common/Vec2'; -import BroadPhase from '../collision/BroadPhase'; -import Solver, { ContactImpulse, TimeStep } from './Solver'; -import Body, { BodyDef } from './Body'; -import Joint from './Joint'; -import Contact from './Contact'; -import AABB, { RayCastInput, RayCastOutput } from "../collision/AABB"; -import Fixture, { FixtureProxy } from "./Fixture"; -import Manifold from "../collision/Manifold"; +import { options } from '../util/options'; +import { Vec2 } from '../common/Vec2'; +import { BroadPhase } from '../collision/BroadPhase'; +import { Solver, ContactImpulse, TimeStep } from './Solver'; +import { Body, BodyDef } from './Body'; +import { Joint } from './Joint'; +import { Contact } from './Contact'; +import { AABB, RayCastInput, RayCastOutput } from "../collision/AABB"; +import { Fixture, FixtureProxy } from "./Fixture"; +import { Manifold } from "../collision/Manifold"; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; /** @@ -92,7 +92,7 @@ export type WorldRayCastCallback = (fixture: Fixture, point: Vec2, normal: Vec2, */ export type WorldAABBQueryCallback = (fixture: Fixture) => boolean; -export default class World { +export class World { /** @internal */ m_solver: Solver; /** @internal */ m_broadPhase: BroadPhase; /** @internal */ m_contactList: Contact | null; @@ -124,7 +124,7 @@ export default class World { * @param def World definition or gravity vector. */ constructor(def?: WorldDef | Vec2 | null) { - if (!(this instanceof World)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof World)) { return new World(def); } @@ -379,7 +379,7 @@ export default class World { * @param callback Called for each fixture found in the query AABB. It may return `false` to terminate the query. */ queryAABB(aabb: AABB, callback: WorldAABBQueryCallback): void { - _ASSERT && common.assert(typeof callback === 'function'); + _ASSERT && console.assert(typeof callback === 'function'); const broadPhase = this.m_broadPhase; this.m_broadPhase.query(aabb, function(proxyId: number): boolean { // TODO GC const proxy = broadPhase.getUserData(proxyId); @@ -397,7 +397,7 @@ export default class World { * @param callback A user implemented callback function. */ rayCast(point1: Vec2, point2: Vec2, callback: WorldRayCastCallback): void { - _ASSERT && common.assert(typeof callback === 'function'); + _ASSERT && console.assert(typeof callback === 'function'); const broadPhase = this.m_broadPhase; this.m_broadPhase.rayCast({ @@ -456,7 +456,7 @@ export default class World { * @param newOrigin The new origin with respect to the old origin */ shiftOrigin(newOrigin: Vec2): void { - _ASSERT && common.assert(this.m_locked == false); + _ASSERT && console.assert(this.m_locked == false); if (this.m_locked) { return; } @@ -478,7 +478,7 @@ export default class World { * @internal Used for deserialize. */ _addBody(body: Body): void { - _ASSERT && common.assert(this.isLocked() === false); + _ASSERT && console.assert(this.isLocked() === false); if (this.isLocked()) { return; } @@ -503,7 +503,7 @@ export default class World { createBody(position: Vec2, angle?: number): Body; // tslint:disable-next-line:typedef createBody(arg1?, arg2?) { - _ASSERT && common.assert(this.isLocked() == false); + _ASSERT && console.assert(this.isLocked() == false); if (this.isLocked()) { return null; } @@ -560,8 +560,8 @@ export default class World { * Warning: This function is locked during callbacks. */ destroyBody(b: Body): boolean { - _ASSERT && common.assert(this.m_bodyCount > 0); - _ASSERT && common.assert(this.isLocked() == false); + _ASSERT && console.assert(this.m_bodyCount > 0); + _ASSERT && console.assert(this.isLocked() == false); if (this.isLocked()) { return; } @@ -637,9 +637,9 @@ export default class World { * Warning: This function is locked during callbacks. */ createJoint(joint: T): T | null { - _ASSERT && common.assert(!!joint.m_bodyA); - _ASSERT && common.assert(!!joint.m_bodyB); - _ASSERT && common.assert(this.isLocked() == false); + _ASSERT && console.assert(!!joint.m_bodyA); + _ASSERT && console.assert(!!joint.m_bodyB); + _ASSERT && console.assert(this.isLocked() == false); if (this.isLocked()) { return null; } @@ -691,7 +691,7 @@ export default class World { * Warning: This function is locked during callbacks. */ destroyJoint(joint: Joint): void { - _ASSERT && common.assert(this.isLocked() == false); + _ASSERT && console.assert(this.isLocked() == false); if (this.isLocked()) { return; } @@ -749,7 +749,7 @@ export default class World { joint.m_edgeB.prev = null; joint.m_edgeB.next = null; - _ASSERT && common.assert(this.m_jointCount > 0); + _ASSERT && console.assert(this.m_jointCount > 0); --this.m_jointCount; // If the joint prevents collisions, then flag any contacts for filtering. diff --git a/src/dynamics/joint/DistanceJoint.ts b/src/dynamics/joint/DistanceJoint.ts index d82d44df..fb0e2dd6 100644 --- a/src/dynamics/joint/DistanceJoint.ts +++ b/src/dynamics/joint/DistanceJoint.ts @@ -22,15 +22,19 @@ * SOFTWARE. */ -import options from '../../util/options'; -import Settings from '../../Settings'; -import Math from '../../common/Math'; -import Vec2 from '../../common/Vec2'; -import Rot from '../../common/Rot'; -import Joint, { JointOpt, JointDef } from '../Joint'; -import Body from '../Body'; +import { options } from '../../util/options'; +import { Settings } from '../../Settings'; +import { math as Math } from '../../common/Math'; +import { Vec2 } from '../../common/Vec2'; +import { Rot } from '../../common/Rot'; +import { Joint, JointOpt, JointDef } from '../Joint'; +import { Body } from '../Body'; import { TimeStep } from "../Solver"; + +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; + + /** * Distance joint definition. This requires defining an anchor point on both * bodies and the non-zero length of the distance joint. The definition uses @@ -82,7 +86,7 @@ const DEFAULTS = { * @param anchorA Anchor A in global coordination. * @param anchorB Anchor B in global coordination. */ -export default class DistanceJoint extends Joint { +export class DistanceJoint extends Joint { static TYPE = 'distance-joint' as const; // Solver shared @@ -111,7 +115,7 @@ export default class DistanceJoint extends Joint { constructor(def: DistanceJointOpt, bodyA: Body, bodyB: Body, anchorA: Vec2, anchorB: Vec2); constructor(def: DistanceJointDef, bodyA?: Body, bodyB?: Body, anchorA?: Vec2, anchorB?: Vec2) { // @ts-ignore - if (!(this instanceof DistanceJoint)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof DistanceJoint)) { return new DistanceJoint(def, bodyA, bodyB, anchorA, anchorB); } diff --git a/src/dynamics/joint/FrictionJoint.ts b/src/dynamics/joint/FrictionJoint.ts index 851e7274..97a53881 100644 --- a/src/dynamics/joint/FrictionJoint.ts +++ b/src/dynamics/joint/FrictionJoint.ts @@ -22,18 +22,18 @@ * SOFTWARE. */ -import common from '../../util/common'; -import options from '../../util/options'; -import Math from '../../common/Math'; -import Vec2 from '../../common/Vec2'; -import Mat22 from '../../common/Mat22'; -import Rot from '../../common/Rot'; -import Joint, { JointOpt, JointDef } from '../Joint'; -import Body from '../Body'; +import { options } from '../../util/options'; +import { math as Math } from '../../common/Math'; +import { Vec2 } from '../../common/Vec2'; +import { Mat22 } from '../../common/Mat22'; +import { Rot } from '../../common/Rot'; +import { Joint, JointOpt, JointDef } from '../Joint'; +import { Body } from '../Body'; import { TimeStep } from "../Solver"; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; /** @@ -74,7 +74,7 @@ const DEFAULTS = { * * @param anchor Anchor in global coordination. */ -export default class FrictionJoint extends Joint { +export class FrictionJoint extends Joint { static TYPE = 'friction-joint' as const; /** @internal */ m_type: 'friction-joint'; @@ -104,7 +104,7 @@ export default class FrictionJoint extends Joint { constructor(def: FrictionJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); constructor(def: FrictionJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) { // @ts-ignore - if (!(this instanceof FrictionJoint)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof FrictionJoint)) { return new FrictionJoint(def, bodyA, bodyB, anchor); } @@ -201,7 +201,7 @@ export default class FrictionJoint extends Joint { * Set the maximum friction force in N. */ setMaxForce(force: number): void { - _ASSERT && common.assert(Math.isFinite(force) && force >= 0.0); + _ASSERT && console.assert(Math.isFinite(force) && force >= 0.0); this.m_maxForce = force; } @@ -216,7 +216,7 @@ export default class FrictionJoint extends Joint { * Set the maximum friction torque in N*m. */ setMaxTorque(torque: number): void { - _ASSERT && common.assert(Math.isFinite(torque) && torque >= 0.0); + _ASSERT && console.assert(Math.isFinite(torque) && torque >= 0.0); this.m_maxTorque = torque; } diff --git a/src/dynamics/joint/GearJoint.ts b/src/dynamics/joint/GearJoint.ts index 6e445d97..554f8726 100644 --- a/src/dynamics/joint/GearJoint.ts +++ b/src/dynamics/joint/GearJoint.ts @@ -22,20 +22,20 @@ * SOFTWARE. */ -import common from '../../util/common'; -import options from '../../util/options'; -import Settings from '../../Settings'; -import Math from '../../common/Math'; -import Vec2 from '../../common/Vec2'; -import Rot from '../../common/Rot'; -import Joint, { JointOpt, JointDef } from '../Joint'; -import Body from '../Body'; -import RevoluteJoint from './RevoluteJoint'; -import PrismaticJoint from './PrismaticJoint'; +import { options } from '../../util/options'; +import { Settings } from '../../Settings'; +import { math as Math } from '../../common/Math'; +import { Vec2 } from '../../common/Vec2'; +import { Rot } from '../../common/Rot'; +import { Joint, JointOpt, JointDef } from '../Joint'; +import { Body } from '../Body'; +import { RevoluteJoint } from './RevoluteJoint'; +import { PrismaticJoint } from './PrismaticJoint'; import { TimeStep } from "../Solver"; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; /** @@ -78,7 +78,7 @@ const DEFAULTS = { * This definition requires two existing revolute or prismatic joints (any * combination will work). */ -export default class GearJoint extends Joint { +export class GearJoint extends Joint { static TYPE = 'gear-joint' as const; /** @internal */ m_type: 'gear-joint'; @@ -125,7 +125,7 @@ export default class GearJoint extends Joint { constructor(def: GearJointOpt, bodyA: Body, bodyB: Body, joint1: RevoluteJoint | PrismaticJoint, joint2: RevoluteJoint | PrismaticJoint, ratio?: number); constructor(def: GearJointDef, bodyA?: Body, bodyB?: Body, joint1?: RevoluteJoint | PrismaticJoint, joint2?: RevoluteJoint | PrismaticJoint, ratio?: number) { // @ts-ignore - if (!(this instanceof GearJoint)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof GearJoint)) { return new GearJoint(def, bodyA, bodyB, joint1, joint2, ratio); } @@ -136,9 +136,9 @@ export default class GearJoint extends Joint { this.m_type = GearJoint.TYPE; - _ASSERT && common.assert(joint1.m_type === RevoluteJoint.TYPE + _ASSERT && console.assert(joint1.m_type === RevoluteJoint.TYPE || joint1.m_type === PrismaticJoint.TYPE); - _ASSERT && common.assert(joint2.m_type === RevoluteJoint.TYPE + _ASSERT && console.assert(joint2.m_type === RevoluteJoint.TYPE || joint2.m_type === PrismaticJoint.TYPE); this.m_joint1 = joint1 ? joint1 : def.joint1; @@ -284,7 +284,7 @@ export default class GearJoint extends Joint { * Set the gear ratio. */ setRatio(ratio: number): void { - _ASSERT && common.assert(Math.isFinite(ratio)); + _ASSERT && console.assert(Math.isFinite(ratio)); this.m_ratio = ratio; } diff --git a/src/dynamics/joint/MotorJoint.ts b/src/dynamics/joint/MotorJoint.ts index 4d126fab..fa27368d 100644 --- a/src/dynamics/joint/MotorJoint.ts +++ b/src/dynamics/joint/MotorJoint.ts @@ -22,18 +22,18 @@ * SOFTWARE. */ -import common from '../../util/common'; -import options from '../../util/options'; -import Math from '../../common/Math'; -import Vec2 from '../../common/Vec2'; -import Mat22 from '../../common/Mat22'; -import Rot from '../../common/Rot'; -import Joint, { JointOpt, JointDef } from '../Joint'; -import Body from '../Body'; +import { options } from '../../util/options'; +import { math as Math } from '../../common/Math'; +import { Vec2 } from '../../common/Vec2'; +import { Mat22 } from '../../common/Mat22'; +import { Rot } from '../../common/Rot'; +import { Joint, JointOpt, JointDef } from '../Joint'; +import { Body } from '../Body'; import { TimeStep } from "../Solver"; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; /** @@ -78,7 +78,7 @@ const DEFAULTS = { * typical usage is to control the movement of a dynamic body with respect to * the ground. */ -export default class MotorJoint extends Joint { +export class MotorJoint extends Joint { static TYPE = 'motor-joint' as const; /** @internal */ m_type: 'motor-joint'; @@ -108,7 +108,7 @@ export default class MotorJoint extends Joint { constructor(def: MotorJointOpt, bodyA: Body, bodyB: Body); constructor(def: MotorJointDef | MotorJointOpt, bodyA?: Body, bodyB?: Body) { // @ts-ignore - if (!(this instanceof MotorJoint)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof MotorJoint)) { return new MotorJoint(def, bodyA, bodyB); } @@ -176,7 +176,7 @@ export default class MotorJoint extends Joint { * Set the maximum friction force in N. */ setMaxForce(force: number): void { - _ASSERT && common.assert(Math.isFinite(force) && force >= 0.0); + _ASSERT && console.assert(Math.isFinite(force) && force >= 0.0); this.m_maxForce = force; } @@ -191,7 +191,7 @@ export default class MotorJoint extends Joint { * Set the maximum friction torque in N*m. */ setMaxTorque(torque: number): void { - _ASSERT && common.assert(Math.isFinite(torque) && torque >= 0.0); + _ASSERT && console.assert(Math.isFinite(torque) && torque >= 0.0); this.m_maxTorque = torque; } @@ -206,7 +206,7 @@ export default class MotorJoint extends Joint { * Set the position correction factor in the range [0,1]. */ setCorrectionFactor(factor: number): void { - _ASSERT && common.assert(Math.isFinite(factor) && 0.0 <= factor && factor <= 1.0); + _ASSERT && console.assert(Math.isFinite(factor) && 0.0 <= factor && factor <= 1.0); this.m_correctionFactor = factor; } diff --git a/src/dynamics/joint/MouseJoint.ts b/src/dynamics/joint/MouseJoint.ts index be0cef62..c9eb2a84 100644 --- a/src/dynamics/joint/MouseJoint.ts +++ b/src/dynamics/joint/MouseJoint.ts @@ -22,19 +22,19 @@ * SOFTWARE. */ -import common from '../../util/common'; -import options from '../../util/options'; -import Math from '../../common/Math'; -import Vec2 from '../../common/Vec2'; -import Mat22 from '../../common/Mat22'; -import Rot from '../../common/Rot'; -import Transform from '../../common/Transform'; -import Joint, { JointOpt, JointDef } from '../Joint'; -import Body from '../Body'; +import { options } from '../../util/options'; +import { math as Math } from '../../common/Math'; +import { Vec2, Vec2Value } from '../../common/Vec2'; +import { Mat22 } from '../../common/Mat22'; +import { Rot } from '../../common/Rot'; +import { Transform } from '../../common/Transform'; +import { Joint, JointOpt, JointDef } from '../Joint'; +import { Body } from '../Body'; import { TimeStep } from "../Solver"; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; /** @@ -67,7 +67,7 @@ export interface MouseJointDef extends JointDef, MouseJointOpt { * The initial world target point. This is assumed to coincide with the body * anchor initially. */ - target: Vec2; + target: Vec2Value; } const DEFAULTS = { @@ -85,7 +85,7 @@ const DEFAULTS = { * be used in the testbed. If you want to learn how to use the mouse joint, look * at the testbed. */ -export default class MouseJoint extends Joint { +export class MouseJoint extends Joint { static TYPE = 'mouse-joint' as const; /** @internal */ m_type: 'mouse-joint'; @@ -109,7 +109,7 @@ export default class MouseJoint extends Joint { constructor(def: MouseJointOpt, bodyA: Body, bodyB: Body, target: Vec2); constructor(def: MouseJointDef, bodyA?: Body, bodyB?: Body, target?: Vec2) { // @ts-ignore - if (!(this instanceof MouseJoint)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof MouseJoint)) { return new MouseJoint(def, bodyA, bodyB, target); } @@ -120,11 +120,18 @@ export default class MouseJoint extends Joint { this.m_type = MouseJoint.TYPE; - _ASSERT && common.assert(Math.isFinite(def.maxForce) && def.maxForce >= 0.0); - _ASSERT && common.assert(Math.isFinite(def.frequencyHz) && def.frequencyHz >= 0.0); - _ASSERT && common.assert(Math.isFinite(def.dampingRatio) && def.dampingRatio >= 0.0); + _ASSERT && console.assert(Math.isFinite(def.maxForce) && def.maxForce >= 0.0); + _ASSERT && console.assert(Math.isFinite(def.frequencyHz) && def.frequencyHz >= 0.0); + _ASSERT && console.assert(Math.isFinite(def.dampingRatio) && def.dampingRatio >= 0.0); + + if (Vec2.isValid(target)) { + this.m_targetA = Vec2.clone(target); + } else if (Vec2.isValid(def.target)) { + this.m_targetA = Vec2.clone(def.target); + } else { + this.m_targetA = Vec2.zero(); + } - this.m_targetA = target ? Vec2.clone(target) : def.target || Vec2.zero(); this.m_localAnchorB = Transform.mulTVec2(bodyB.getTransform(), this.m_targetA); this.m_maxForce = def.maxForce; @@ -186,7 +193,7 @@ export default class MouseJoint extends Joint { /** * Use this to update the target point. */ - setTarget(target: Vec2): void { + setTarget(target: Vec2Value): void { if (this.m_bodyB.isAwake() == false) { this.m_bodyB.setAwake(true); } @@ -270,7 +277,7 @@ export default class MouseJoint extends Joint { /** * Shift the origin for any points stored in world coordinates. */ - shiftOrigin(newOrigin: Vec2): void { + shiftOrigin(newOrigin: Vec2Value): void { this.m_targetA.sub(newOrigin); } @@ -304,7 +311,7 @@ export default class MouseJoint extends Joint { // gamma has units of inverse mass. // beta has units of inverse time. const h = step.dt; - _ASSERT && common.assert(d + h * k > Math.EPSILON); + _ASSERT && console.assert(d + h * k > Math.EPSILON); this.m_gamma = h * (d + h * k); if (this.m_gamma != 0.0) { this.m_gamma = 1.0 / this.m_gamma; diff --git a/src/dynamics/joint/PrismaticJoint.ts b/src/dynamics/joint/PrismaticJoint.ts index e909dee6..46e753fb 100644 --- a/src/dynamics/joint/PrismaticJoint.ts +++ b/src/dynamics/joint/PrismaticJoint.ts @@ -22,21 +22,21 @@ * SOFTWARE. */ -import common from '../../util/common'; -import options from '../../util/options'; -import Settings from '../../Settings'; -import Math from '../../common/Math'; -import Vec2 from '../../common/Vec2'; -import Vec3 from '../../common/Vec3'; -import Mat22 from '../../common/Mat22'; -import Mat33 from '../../common/Mat33'; -import Rot from '../../common/Rot'; -import Joint, { JointOpt, JointDef } from '../Joint'; -import Body from '../Body'; +import { options } from '../../util/options'; +import { Settings } from '../../Settings'; +import { math as Math } from '../../common/Math'; +import { Vec2 } from '../../common/Vec2'; +import { Vec3 } from '../../common/Vec3'; +import { Mat22 } from '../../common/Mat22'; +import { Mat33 } from '../../common/Mat33'; +import { Rot } from '../../common/Rot'; +import { Joint, JointOpt, JointDef } from '../Joint'; +import { Body } from '../Body'; import { TimeStep } from "../Solver"; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; const inactiveLimit = 0; @@ -121,7 +121,7 @@ const DEFAULTS = { * joint limit to restrict the range of motion and a joint motor to drive the * motion or to model joint friction. */ -export default class PrismaticJoint extends Joint { +export class PrismaticJoint extends Joint { static TYPE = 'prismatic-joint' as const; /** @internal */ m_type: 'prismatic-joint'; @@ -159,7 +159,7 @@ export default class PrismaticJoint extends Joint { constructor(def: PrismaticJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2, axis: Vec2); constructor(def: PrismaticJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) { // @ts-ignore - if (!(this instanceof PrismaticJoint)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof PrismaticJoint)) { return new PrismaticJoint(def, bodyA, bodyB, anchor, axis); } @@ -428,7 +428,7 @@ export default class PrismaticJoint extends Joint { * Set the joint limits, usually in meters. */ setLimits(lower: number, upper: number): void { - _ASSERT && common.assert(lower <= upper); + _ASSERT && console.assert(lower <= upper); if (lower != this.m_lowerTranslation || upper != this.m_upperTranslation) { this.m_bodyA.setAwake(true); this.m_bodyB.setAwake(true); diff --git a/src/dynamics/joint/PulleyJoint.ts b/src/dynamics/joint/PulleyJoint.ts index c12b14ad..15e50385 100644 --- a/src/dynamics/joint/PulleyJoint.ts +++ b/src/dynamics/joint/PulleyJoint.ts @@ -22,18 +22,18 @@ * SOFTWARE. */ -import common from '../../util/common'; -import options from '../../util/options'; -import Settings from '../../Settings'; -import Math from '../../common/Math'; -import Vec2 from '../../common/Vec2'; -import Rot from '../../common/Rot'; -import Joint, { JointOpt, JointDef } from '../Joint'; -import Body from '../Body'; +import { options } from '../../util/options'; +import { Settings } from '../../Settings'; +import { math as Math } from '../../common/Math'; +import { Vec2 } from '../../common/Vec2'; +import { Rot } from '../../common/Rot'; +import { Joint, JointOpt, JointDef } from '../Joint'; +import { Body } from '../Body'; import { TimeStep } from "../Solver"; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; /** @@ -93,7 +93,7 @@ const DEFAULTS = { * anchor points with static shapes to prevent one side from going to zero * length. */ -export default class PulleyJoint extends Joint { +export class PulleyJoint extends Joint { static TYPE = 'pulley-joint' as const; // static MIN_PULLEY_LENGTH: number = 2.0; // TODO where this is used? @@ -125,7 +125,7 @@ export default class PulleyJoint extends Joint { constructor(def: PulleyJointOpt, bodyA: Body, bodyB: Body, groundA: Vec2, groundB: Vec2, anchorA: Vec2, anchorB: Vec2, ratio: number); constructor(def: PulleyJointDef, bodyA?: Body, bodyB?: Body, groundA?: Vec2, groundB?: Vec2, anchorA?: Vec2, anchorB?: Vec2, ratio?: number) { // @ts-ignore - if (!(this instanceof PulleyJoint)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof PulleyJoint)) { return new PulleyJoint(def, bodyA, bodyB, groundA, groundB, anchorA, anchorB, ratio); } @@ -143,7 +143,7 @@ export default class PulleyJoint extends Joint { this.m_lengthB = Math.isFinite(def.lengthB) ? def.lengthB : Vec2.distance(anchorB, groundB); this.m_ratio = Math.isFinite(ratio) ? ratio : def.ratio; - _ASSERT && common.assert(ratio > Math.EPSILON); + _ASSERT && console.assert(ratio > Math.EPSILON); this.m_constant = this.m_lengthA + this.m_ratio * this.m_lengthB; diff --git a/src/dynamics/joint/RevoluteJoint.ts b/src/dynamics/joint/RevoluteJoint.ts index 4560e15a..b6b64ced 100644 --- a/src/dynamics/joint/RevoluteJoint.ts +++ b/src/dynamics/joint/RevoluteJoint.ts @@ -22,21 +22,21 @@ * SOFTWARE. */ -import common from '../../util/common'; -import options from '../../util/options'; -import Settings from '../../Settings'; -import Math from '../../common/Math'; -import Vec2 from '../../common/Vec2'; -import Vec3 from '../../common/Vec3'; -import Mat22 from '../../common/Mat22'; -import Mat33 from '../../common/Mat33'; -import Rot from '../../common/Rot'; -import Joint, { JointOpt, JointDef } from '../Joint'; -import Body from '../Body'; +import { options } from '../../util/options'; +import { Settings } from '../../Settings'; +import { math as Math } from '../../common/Math'; +import { Vec2 } from '../../common/Vec2'; +import { Vec3 } from '../../common/Vec3'; +import { Mat22 } from '../../common/Mat22'; +import { Mat33 } from '../../common/Mat33'; +import { Rot } from '../../common/Rot'; +import { Joint, JointOpt, JointDef } from '../Joint'; +import { Body } from '../Body'; import { TimeStep } from "../Solver"; const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; const inactiveLimit = 0; @@ -127,7 +127,7 @@ const DEFAULTS = { * relative rotation about the shared point. A maximum motor torque is provided * so that infinite forces are not generated. */ -export default class RevoluteJoint extends Joint { +export class RevoluteJoint extends Joint { static TYPE = 'revolute-joint' as const; /** @internal */ m_type: 'revolute-joint'; @@ -163,7 +163,7 @@ export default class RevoluteJoint extends Joint { // @ts-ignore constructor(def: RevoluteJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) { // @ts-ignore - if (!(this instanceof RevoluteJoint)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof RevoluteJoint)) { return new RevoluteJoint(def, bodyA, bodyB, anchor); } @@ -380,7 +380,7 @@ export default class RevoluteJoint extends Joint { * Set the joint limits in radians. */ setLimits(lower: number, upper: number): void { - _ASSERT && common.assert(lower <= upper); + _ASSERT && console.assert(lower <= upper); if (lower != this.m_lowerAngle || upper != this.m_upperAngle) { this.m_bodyA.setAwake(true); diff --git a/src/dynamics/joint/RopeJoint.ts b/src/dynamics/joint/RopeJoint.ts index 7ef6449d..939cd26d 100644 --- a/src/dynamics/joint/RopeJoint.ts +++ b/src/dynamics/joint/RopeJoint.ts @@ -22,15 +22,19 @@ * SOFTWARE. */ -import options from '../../util/options'; -import Settings from '../../Settings'; -import Math from '../../common/Math'; -import Vec2 from '../../common/Vec2'; -import Rot from '../../common/Rot'; -import Joint, { JointOpt, JointDef } from '../Joint'; -import Body from '../Body'; +import { options } from '../../util/options'; +import { Settings } from '../../Settings'; +import { math as Math } from '../../common/Math'; +import { Vec2 } from '../../common/Vec2'; +import { Rot } from '../../common/Rot'; +import { Joint, JointOpt, JointDef } from '../Joint'; +import { Body } from '../Body'; import { TimeStep } from "../Solver"; + +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; + + const inactiveLimit = 0; const atLowerLimit = 1; const atUpperLimit = 2; @@ -79,7 +83,7 @@ const DEFAULTS = { * sponginess, so I chose not to implement it that way. See {@link DistanceJoint} if you * want to dynamically control length. */ -export default class RopeJoint extends Joint { +export class RopeJoint extends Joint { static TYPE = 'rope-joint' as const; /** @internal */ m_type: 'rope-joint'; @@ -108,7 +112,7 @@ export default class RopeJoint extends Joint { constructor(def: RopeJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); constructor(def: RopeJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) { // @ts-ignore - if (!(this instanceof RopeJoint)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof RopeJoint)) { return new RopeJoint(def, bodyA, bodyB, anchor); } diff --git a/src/dynamics/joint/WeldJoint.ts b/src/dynamics/joint/WeldJoint.ts index 5dda0478..45fb25f2 100644 --- a/src/dynamics/joint/WeldJoint.ts +++ b/src/dynamics/joint/WeldJoint.ts @@ -22,18 +22,21 @@ * SOFTWARE. */ -import options from '../../util/options'; -import Settings from '../../Settings'; -import Math from '../../common/Math'; -import Vec2 from '../../common/Vec2'; -import Vec3 from '../../common/Vec3'; -import Mat33 from '../../common/Mat33'; -import Rot from '../../common/Rot'; -import Joint, { JointOpt, JointDef } from '../Joint'; -import Body from '../Body'; +import { options } from '../../util/options'; +import { Settings } from '../../Settings'; +import { math as Math } from '../../common/Math'; +import { Vec2 } from '../../common/Vec2'; +import { Vec3 } from '../../common/Vec3'; +import { Mat33 } from '../../common/Mat33'; +import { Rot } from '../../common/Rot'; +import { Joint, JointOpt, JointDef } from '../Joint'; +import { Body } from '../Body'; import { TimeStep } from "../Solver"; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; + + /** * Weld joint definition. You need to specify local anchor points where they are * attached and the relative body angle. The position of the anchor points is @@ -86,7 +89,7 @@ const DEFAULTS = { * A weld joint essentially glues two bodies together. A weld joint may distort * somewhat because the island constraint solver is approximate. */ -export default class WeldJoint extends Joint { +export class WeldJoint extends Joint { static TYPE = 'weld-joint' as const /** @internal */ m_type: 'weld-joint'; @@ -117,7 +120,7 @@ export default class WeldJoint extends Joint { constructor(def: WeldJointOpt, bodyA: Body, bodyB: Body, anchor: Vec2); constructor(def: WeldJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2) { // @ts-ignore - if (!(this instanceof WeldJoint)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof WeldJoint)) { return new WeldJoint(def, bodyA, bodyB, anchor); } diff --git a/src/dynamics/joint/WheelJoint.ts b/src/dynamics/joint/WheelJoint.ts index cc16e33c..1c527c70 100644 --- a/src/dynamics/joint/WheelJoint.ts +++ b/src/dynamics/joint/WheelJoint.ts @@ -22,16 +22,19 @@ * SOFTWARE. */ -import options from '../../util/options'; -import Settings from '../../Settings'; -import Math from '../../common/Math'; -import Vec2 from '../../common/Vec2'; -import Rot from '../../common/Rot'; -import Joint, { JointOpt, JointDef } from '../Joint'; -import Body from '../Body'; +import { options } from '../../util/options'; +import { Settings } from '../../Settings'; +import { math as Math } from '../../common/Math'; +import { Vec2 } from '../../common/Vec2'; +import { Rot } from '../../common/Rot'; +import { Joint, JointOpt, JointDef } from '../Joint'; +import { Body } from '../Body'; import { TimeStep } from "../Solver"; +const _CONSTRUCTOR_FACTORY = typeof CONSTRUCTOR_FACTORY === 'undefined' ? false : CONSTRUCTOR_FACTORY; + + /** * Wheel joint definition. This requires defining a line of motion using an axis * and an anchor point. The definition uses local anchor points and a local axis @@ -99,7 +102,7 @@ const DEFAULTS = { * point to line constraint with a rotational motor and a linear spring/damper. * This joint is designed for vehicle suspensions. */ -export default class WheelJoint extends Joint { +export class WheelJoint extends Joint { static TYPE = 'wheel-joint' as const; /** @internal */ m_type: 'wheel-joint'; @@ -145,7 +148,7 @@ export default class WheelJoint extends Joint { // @ts-ignore constructor(def: WheelJointDef, bodyA?: Body, bodyB?: Body, anchor?: Vec2, axis?: Vec2) { // @ts-ignore - if (!(this instanceof WheelJoint)) { + if (_CONSTRUCTOR_FACTORY && !(this instanceof WheelJoint)) { return new WheelJoint(def, bodyA, bodyB, anchor, axis); } diff --git a/src/dynamics/joint/__test__/DistanceJoint.test.ts b/src/dynamics/joint/__test__/DistanceJoint.test.ts index f9ae472b..becc1a9d 100644 --- a/src/dynamics/joint/__test__/DistanceJoint.test.ts +++ b/src/dynamics/joint/__test__/DistanceJoint.test.ts @@ -1,19 +1,19 @@ import { expect } from 'chai'; -import Vec2 from '../../../common/Vec2'; -import Circle from '../../../collision/shape/CircleShape'; -import Box from '../../../collision/shape/BoxShape'; -import World from '../../World'; +import { Vec2 } from '../../../common/Vec2'; +import { CircleShape } from '../../../collision/shape/CircleShape'; +import { BoxShape } from '../../../collision/shape/BoxShape'; +import { World } from '../../World'; -import DistanceJoint from '../DistanceJoint'; +import { DistanceJoint } from '../DistanceJoint'; describe('DistanceJoint', function(): void { it('calculates local anchors from global', function(): void { var world = new World(); - var circle = new Circle(1); - var box = new Box(1, 1); + var circle = new CircleShape(1); + var box = new BoxShape(1, 1); var b1 = world.createBody({ position : new Vec2(0, 0), @@ -41,8 +41,8 @@ describe('DistanceJoint', function(): void { it('moves attached body', function(): void { var world = new World(); - var circle = new Circle(1); - var box = new Box(1, 1); + var circle = new CircleShape(1); + var box = new BoxShape(1, 1); var b1 = world.createBody({ position : new Vec2(0, 0), diff --git a/src/index.ts b/src/index.ts index db3fc6d7..04bf712f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,104 +1,73 @@ -export { default as Serializer } from './serializer/index'; +export * from './serializer/index'; + +export * from './common/Math'; + +export * from './common/Vec2'; +export * from './common/Vec3'; +export * from './common/Mat22'; +export * from './common/Mat33'; +export * from './common/Transform'; +export * from './common/Rot'; + +export * from './collision/AABB'; + +export * from './collision/Shape'; +export * from './dynamics/Fixture'; +export * from './dynamics/Body'; +export * from './dynamics/Contact'; +export * from './dynamics/Joint'; +export * from './dynamics/World'; + +export * from './collision/shape/CircleShape'; +export * from './collision/shape/EdgeShape'; +export * from './collision/shape/PolygonShape'; +export * from './collision/shape/ChainShape'; +export * from './collision/shape/BoxShape'; + +export * from './collision/shape/CollideCircle'; +export * from './collision/shape/CollideEdgeCircle'; +export * from './collision/shape/CollidePolygon'; +export * from './collision/shape/CollideCirclePolygon'; +export * from './collision/shape/CollideEdgePolygon'; + +export * from './dynamics/joint/DistanceJoint'; +export * from './dynamics/joint/FrictionJoint'; +export * from './dynamics/joint/GearJoint'; +export * from './dynamics/joint/MotorJoint'; +export * from './dynamics/joint/MouseJoint'; +export * from './dynamics/joint/PrismaticJoint'; +export * from './dynamics/joint/PulleyJoint'; +export * from './dynamics/joint/RevoluteJoint'; +export * from './dynamics/joint/RopeJoint'; +export * from './dynamics/joint/WeldJoint'; +export * from './dynamics/joint/WheelJoint'; + +export * from './Settings'; + +export * from './common/Sweep'; +export * from './collision/Manifold'; +export * from './collision/Distance'; +export * from './collision/TimeOfImpact'; +export * from './collision/DynamicTree'; +export * from './util/stats'; -export { default as Math } from './common/Math'; -export { default as Vec2 } from './common/Vec2'; -export { default as Vec3 } from './common/Vec3'; -export { default as Mat22 } from './common/Mat22'; -export { default as Mat33 } from './common/Mat33'; -export { default as Transform } from './common/Transform'; -export { default as Rot } from './common/Rot'; - -export { default as AABB } from './collision/AABB'; - -export { default as Shape } from './collision/Shape'; -export { default as Fixture } from './dynamics/Fixture'; -export { default as Body } from './dynamics/Body'; -export { default as Contact } from './dynamics/Contact'; -export { default as Joint } from './dynamics/Joint'; -export { default as World } from './dynamics/World'; - -export { default as Circle } from './collision/shape/CircleShape'; -export { default as Edge } from './collision/shape/EdgeShape'; -export { default as Polygon } from './collision/shape/PolygonShape'; -export { default as Chain } from './collision/shape/ChainShape'; -export { default as Box } from './collision/shape/BoxShape'; - -export { CollideCircles } from './collision/shape/CollideCircle'; -export { CollideEdgeCircle } from './collision/shape/CollideEdgeCircle'; -export { CollidePolygons } from './collision/shape/CollidePolygon'; -export { CollidePolygonCircle } from './collision/shape/CollideCirclePolygon'; -export { CollideEdgePolygon } from './collision/shape/CollideEdgePolygon'; - -export { default as DistanceJoint } from './dynamics/joint/DistanceJoint'; -export { default as FrictionJoint } from './dynamics/joint/FrictionJoint'; -export { default as GearJoint } from './dynamics/joint/GearJoint'; -export { default as MotorJoint } from './dynamics/joint/MotorJoint'; -export { default as MouseJoint } from './dynamics/joint/MouseJoint'; -export { default as PrismaticJoint } from './dynamics/joint/PrismaticJoint'; -export { default as PulleyJoint } from './dynamics/joint/PulleyJoint'; -export { default as RevoluteJoint } from './dynamics/joint/RevoluteJoint'; -export { default as RopeJoint } from './dynamics/joint/RopeJoint'; -export { default as WeldJoint } from './dynamics/joint/WeldJoint'; -export { default as WheelJoint } from './dynamics/joint/WheelJoint'; - -export { default as Settings } from './Settings'; - -export { default as Sweep } from './common/Sweep'; -export { default as Manifold } from './collision/Manifold'; -export { default as Distance } from './collision/Distance'; -export { default as TimeOfImpact } from './collision/TimeOfImpact'; -export { default as DynamicTree } from './collision/DynamicTree'; - -import Solver, { TimeStep } from './dynamics/Solver'; import { CollidePolygons } from './collision/shape/CollidePolygon'; -import { default as Settings } from './Settings'; -import { default as Sweep } from './common/Sweep'; -import { default as Manifold } from './collision/Manifold'; -import { default as Distance, DistanceInput, DistanceOutput, DistanceProxy, SimplexCache, testOverlap } from './collision/Distance'; -import { default as TimeOfImpact, TOIInput, TOIOutput } from './collision/TimeOfImpact'; -import { default as DynamicTree } from './collision/DynamicTree'; - -import { default as stats } from './util/stats'; // todo: what to do with this? - -import { ContactImpulse } from './dynamics/Solver'; -type _ContactImpulse = InstanceType; -export type { _ContactImpulse as ContactImpulse } +import { Settings } from './Settings'; +import { Sweep } from './common/Sweep'; +import { DynamicTree } from './collision/DynamicTree'; +import { Manifold } from './collision/Manifold'; +import { Distance } from './collision/Distance'; +import { TimeOfImpact } from './collision/TimeOfImpact'; +import { stats } from './util/stats'; /** @deprecated Merged with main namespace */ -export const internal = {}; - -// @ts-ignore -internal.CollidePolygons = CollidePolygons; -// @ts-ignore -internal.Settings = Settings; -// @ts-ignore -internal.Sweep = Sweep; -// @ts-ignore -internal.Manifold = Manifold; -// @ts-ignore -internal.Distance = Distance; -// @ts-ignore -internal.TimeOfImpact = TimeOfImpact; -// @ts-ignore -internal.DynamicTree = DynamicTree; -// @ts-ignore -internal.stats = stats; - -// @ts-ignore -Solver.TimeStep = TimeStep; - -// @ts-ignore -Distance.testOverlap = testOverlap; -// @ts-ignore -Distance.Input = DistanceInput; -// @ts-ignore -Distance.Output = DistanceOutput; -// @ts-ignore -Distance.Proxy = DistanceProxy; -// @ts-ignore -Distance.Cache = SimplexCache; - -// @ts-ignore -TimeOfImpact.Input = TOIInput; -// @ts-ignore -TimeOfImpact.Output = TOIOutput; +export const internal = { + CollidePolygons, + Settings, + Sweep, + Manifold, + Distance, + TimeOfImpact, + DynamicTree, + stats +}; diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 00000000..e31a70ea --- /dev/null +++ b/src/main.ts @@ -0,0 +1,3 @@ +export * from './index'; +import * as planck from './index'; +export default planck; diff --git a/src/serializer/__test__/Serialize.test.ts b/src/serializer/__test__/Serialize.test.ts index f6ed743b..3f2cccc9 100644 --- a/src/serializer/__test__/Serialize.test.ts +++ b/src/serializer/__test__/Serialize.test.ts @@ -1,21 +1,21 @@ -// import util from 'util'; +// import { util } from 'util'; import { expect } from 'chai'; -import Vec2 from '../../common/Vec2'; -import Circle from '../../collision/shape/CircleShape'; -import Box from '../../collision/shape/BoxShape'; -import DistanceJoint from '../../dynamics/joint/DistanceJoint'; -import World from '../../dynamics/World'; +import { Vec2 } from '../../common/Vec2'; +import { CircleShape } from '../../collision/shape/CircleShape'; +import { BoxShape } from '../../collision/shape/BoxShape'; +import { DistanceJoint } from '../../dynamics/joint/DistanceJoint'; +import { World } from '../../dynamics/World'; -import Serializer from '../../serializer'; +import { Serializer } from '../../serializer'; describe('Serializer', function(): void { it('saves and loads to JSON', function(): void { var world = new World(); - var circle = new Circle(1); - var box = new Box(1, 1); + var circle = new CircleShape(1); + var box = new BoxShape(1, 1); var b1 = world.createBody({ position : new Vec2(0, 0), diff --git a/src/serializer/__test__/Validator.test.ts b/src/serializer/__test__/Validator.test.js similarity index 50% rename from src/serializer/__test__/Validator.test.ts rename to src/serializer/__test__/Validator.test.js index 8a24562d..7653123c 100644 --- a/src/serializer/__test__/Validator.test.ts +++ b/src/serializer/__test__/Validator.test.js @@ -1,25 +1,27 @@ -import { expect } from 'chai'; +const { expect } = await import('chai'); +const { default: Ajv } = await import('ajv'); -import * as Ajv from 'ajv'; +const { Vec2 } = await import( '../../common/Vec2'); +const { CircleShape } = await import( '../../collision/shape/CircleShape'); +const { BoxShape } = await import( '../../collision/shape/BoxShape'); +const { DistanceJoint } = await import( '../../dynamics/joint/DistanceJoint'); +const { World } = await import( '../../dynamics/World'); -import Vec2 from '../../common/Vec2'; -import Circle from '../../collision/shape/CircleShape'; -import Box from '../../collision/shape/BoxShape'; -import DistanceJoint from '../../dynamics/joint/DistanceJoint'; -import World from '../../dynamics/World'; +const { Serializer } = await import( '../'); -import Serializer from '../'; -const schema = require('../schema.json'); +const schema = await import('../schema.json', { + assert: { type: 'json' } +}); -describe('Serializer', function(): void { +describe('Serializer', function() { var ajv = new Ajv(); var validate = ajv.compile(schema); - it('produces valid schema', function(): void { + it('produces valid schema', function() { var world = new World(); - var circle = new Circle(1); - var box = new Box(1, 1); + var circle = new CircleShape(1); + var box = new BoxShape(1, 1); var b1 = world.createBody({ position : new Vec2(0, 0), diff --git a/src/serializer/index.ts b/src/serializer/index.ts index 414d19f0..23e94afa 100644 --- a/src/serializer/index.ts +++ b/src/serializer/index.ts @@ -1,31 +1,31 @@ // tslint:disable:typedef -import World from '../dynamics/World'; -import Body from '../dynamics/Body'; -import Joint from '../dynamics/Joint'; -import Fixture from '../dynamics/Fixture'; -import Shape from '../collision/Shape'; -import Vec2 from '../common/Vec2'; -import Vec3 from '../common/Vec3'; -import ChainShape from "../collision/shape/ChainShape"; -import BoxShape from "../collision/shape/BoxShape"; -import EdgeShape from "../collision/shape/EdgeShape"; -import PolygonShape from "../collision/shape/PolygonShape"; -import CircleShape from "../collision/shape/CircleShape"; -import DistanceJoint from "../dynamics/joint/DistanceJoint"; -import FrictionJoint from "../dynamics/joint/FrictionJoint"; -import GearJoint from "../dynamics/joint/GearJoint"; -import MotorJoint from "../dynamics/joint/MotorJoint"; -import MouseJoint from "../dynamics/joint/MouseJoint"; -import PrismaticJoint from "../dynamics/joint/PrismaticJoint"; -import PulleyJoint from "../dynamics/joint/PulleyJoint"; -import RevoluteJoint from "../dynamics/joint/RevoluteJoint"; -import RopeJoint from "../dynamics/joint/RopeJoint"; -import WeldJoint from "../dynamics/joint/WeldJoint"; -import WheelJoint from "../dynamics/joint/WheelJoint"; +import { World } from '../dynamics/World'; +import { Body } from '../dynamics/Body'; +import { Joint } from '../dynamics/Joint'; +import { Fixture } from '../dynamics/Fixture'; +import { Shape } from '../collision/Shape'; +import { Vec2 } from '../common/Vec2'; +import { Vec3 } from '../common/Vec3'; +import { ChainShape } from "../collision/shape/ChainShape"; +import { BoxShape } from "../collision/shape/BoxShape"; +import { EdgeShape } from "../collision/shape/EdgeShape"; +import { PolygonShape } from "../collision/shape/PolygonShape"; +import { CircleShape } from "../collision/shape/CircleShape"; +import { DistanceJoint } from "../dynamics/joint/DistanceJoint"; +import { FrictionJoint } from "../dynamics/joint/FrictionJoint"; +import { GearJoint } from "../dynamics/joint/GearJoint"; +import { MotorJoint } from "../dynamics/joint/MotorJoint"; +import { MouseJoint } from "../dynamics/joint/MouseJoint"; +import { PrismaticJoint } from "../dynamics/joint/PrismaticJoint"; +import { PulleyJoint } from "../dynamics/joint/PulleyJoint"; +import { RevoluteJoint } from "../dynamics/joint/RevoluteJoint"; +import { RopeJoint } from "../dynamics/joint/RopeJoint"; +import { WeldJoint } from "../dynamics/joint/WeldJoint"; +import { WheelJoint } from "../dynamics/joint/WheelJoint"; let SID = 0; -function Serializer(opts?) { +export function Serializer(opts?) { opts = opts || {}; const rootClass = opts.rootClass || World; @@ -198,5 +198,3 @@ const serializer = new Serializer(); Serializer.toJson = serializer.toJson; Serializer.fromJson = serializer.fromJson; - -export default Serializer; diff --git a/src/util/Pool.ts b/src/util/Pool.ts index 9af3d6d5..f1decea1 100644 --- a/src/util/Pool.ts +++ b/src/util/Pool.ts @@ -16,7 +16,7 @@ * 3. This notice may not be removed or altered from any source distribution. */ -export default class Pool { +export class Pool { _list: T[] = []; _max: number = Infinity; diff --git a/src/util/common.ts b/src/util/common.ts deleted file mode 100644 index a0bdb369..00000000 --- a/src/util/common.ts +++ /dev/null @@ -1,19 +0,0 @@ -const _DEBUG = typeof DEBUG === 'undefined' ? false : DEBUG; -const _ASSERT = typeof ASSERT === 'undefined' ? false : ASSERT; - -export const debug = function(...rest: any[]): void { - if (!_DEBUG) return; - console.log.apply(console, arguments); -}; - -export const assert = function(statement: boolean, err?: string, log?: any): void { - if (!_ASSERT) return; - if (statement) return; - log && console.log(log); - throw new Error(err); -}; - -export default { - assert, - debug, -}; diff --git a/src/util/options.ts b/src/util/options.ts index 899daa20..1425f394 100644 --- a/src/util/options.ts +++ b/src/util/options.ts @@ -1,4 +1,4 @@ -export default function(input: T, defaults: object): T { +export const options = function(input: T, defaults: object): T { if (input === null || typeof input === 'undefined') { // tslint:disable-next-line:no-object-literal-type-assertion input = {} as T; diff --git a/src/util/stats.ts b/src/util/stats.ts index a87623b0..84d0e954 100644 --- a/src/util/stats.ts +++ b/src/util/stats.ts @@ -1,4 +1,4 @@ -export default { +export const stats = { gjkCalls: 0, gjkIters: 0, gjkMaxIters: 0, diff --git a/test-d/planck-with-testbed.test-d.ts b/test-d/planck-with-testbed.test-d.ts new file mode 100644 index 00000000..ac1419d9 --- /dev/null +++ b/test-d/planck-with-testbed.test-d.ts @@ -0,0 +1,5 @@ +import planck from '../dist/planck-with-testbed'; + +planck.testbed(function(testebd) { + return new planck.World(); +}); diff --git a/test-d/planck.test-d.ts b/test-d/planck.test-d.ts new file mode 100644 index 00000000..b849e263 --- /dev/null +++ b/test-d/planck.test-d.ts @@ -0,0 +1,10 @@ +import { World, Circle } from '..'; + +const world = new World(); + +const body = world.createBody(); +const shape = new Circle(3); + +body.createFixture({ + shape, +}); diff --git a/testbed/index.hbs b/testbed/index.hbs index c346e9b1..23fa2775 100644 --- a/testbed/index.hbs +++ b/testbed/index.hbs @@ -29,7 +29,7 @@
- + diff --git a/testbed/index.ts b/testbed/index.ts index 9694664d..35606dca 100644 --- a/testbed/index.ts +++ b/testbed/index.ts @@ -1,3 +1,7 @@ +import Stage from 'stage-js'; + +export * from '../src/index'; + import { AABB, Body, @@ -7,7 +11,6 @@ import { Vec2, World } from '../src/index'; -import { default as Stage } from 'stage-js/platform/web'; export interface ActiveKeys { 0?: boolean; @@ -117,8 +120,9 @@ export function testbed(opts, callback?) { opts = null; } - Stage(function(stage, canvas) { - + (function() { + const stage = Stage.mount(); + const canvas = stage.dom; stage.on(Stage.Mouse.START, function() { window.focus(); // @ts-ignore @@ -126,7 +130,7 @@ export function testbed(opts, callback?) { canvas.focus(); }); - stage.MAX_ELAPSE = 1000 / 30; + (stage as any).MAX_ELAPSE = 1000 / 30; // @ts-ignore const testbed: Testbed = {}; @@ -148,9 +152,11 @@ export function testbed(opts, callback?) { paused ? testbed.resume() : testbed.pause(); }; testbed.pause = function() { + // @ts-ignore stage.pause(); }; testbed.resume = function() { + // @ts-ignore stage.resume(); testbed.focus(); }; @@ -461,12 +467,11 @@ export function testbed(opts, callback?) { activeKeys.down = downKeys[40] || activeKeys['S']; activeKeys.fire = downKeys[32] || downKeys[13] ; } - - }); + })(); } -Viewer._super = Stage; -Viewer.prototype = Stage._create(Viewer._super.prototype); +Viewer._super = Stage.Node; +Viewer.prototype = Object.create(Viewer._super.prototype); function Viewer(world, opts) { Viewer._super.call(this); @@ -820,111 +825,3 @@ Viewer.prototype.drawChain = function(shape, options) { const node = Stage.create().append(image); return node; }; - - -// Everything below this is copied from ../src/index.ts - -export { default as Serializer } from '../src/serializer/index'; - -export { default as Math } from '../src/common/Math'; -export { default as Vec2 } from '../src/common/Vec2'; -export { default as Vec3 } from '../src/common/Vec3'; -export { default as Mat22 } from '../src/common/Mat22'; -export { default as Mat33 } from '../src/common/Mat33'; -export { default as Transform } from '../src/common/Transform'; -export { default as Rot } from '../src/common/Rot'; - -export { default as AABB } from '../src/collision/AABB'; - -export { default as Shape } from '../src/collision/Shape'; -export { default as Fixture } from '../src/dynamics/Fixture'; -export { default as Body } from '../src/dynamics/Body'; -export { default as Contact } from '../src/dynamics/Contact'; -export { default as Joint } from '../src/dynamics/Joint'; -export { default as World } from '../src/dynamics/World'; - -export { default as Circle } from '../src/collision/shape/CircleShape'; -export { default as Edge } from '../src/collision/shape/EdgeShape'; -export { default as Polygon } from '../src/collision/shape/PolygonShape'; -export { default as Chain } from '../src/collision/shape/ChainShape'; -export { default as Box } from '../src/collision/shape/BoxShape'; - -export { CollideCircles } from '../src/collision/shape/CollideCircle'; -export { CollideEdgeCircle } from '../src/collision/shape/CollideEdgeCircle'; -export { CollidePolygons } from '../src/collision/shape/CollidePolygon'; -export { CollidePolygonCircle } from '../src/collision/shape/CollideCirclePolygon'; -export { CollideEdgePolygon } from '../src/collision/shape/CollideEdgePolygon'; - -export { default as DistanceJoint } from '../src/dynamics/joint/DistanceJoint'; -export { default as FrictionJoint } from '../src/dynamics/joint/FrictionJoint'; -export { default as GearJoint } from '../src/dynamics/joint/GearJoint'; -export { default as MotorJoint } from '../src/dynamics/joint/MotorJoint'; -export { default as MouseJoint } from '../src/dynamics/joint/MouseJoint'; -export { default as PrismaticJoint } from '../src/dynamics/joint/PrismaticJoint'; -export { default as PulleyJoint } from '../src/dynamics/joint/PulleyJoint'; -export { default as RevoluteJoint } from '../src/dynamics/joint/RevoluteJoint'; -export { default as RopeJoint } from '../src/dynamics/joint/RopeJoint'; -export { default as WeldJoint } from '../src/dynamics/joint/WeldJoint'; -export { default as WheelJoint } from '../src/dynamics/joint/WheelJoint'; - -export { default as Settings } from '../src/Settings'; - -export { default as Sweep } from '../src/common/Sweep'; -export { default as Manifold } from '../src/collision/Manifold'; -export { default as Distance } from '../src/collision/Distance'; -export { default as TimeOfImpact } from '../src/collision/TimeOfImpact'; -export { default as DynamicTree } from '../src/collision/DynamicTree'; - -import Solver, { TimeStep } from '../src/dynamics/Solver'; -import { CollidePolygons } from '../src/collision/shape/CollidePolygon'; -import { default as Settings } from '../src/Settings'; -import { default as Sweep } from '../src/common/Sweep'; -import { default as Manifold } from '../src/collision/Manifold'; -import { default as Distance, DistanceInput, DistanceOutput, DistanceProxy, SimplexCache, testOverlap } from '../src/collision/Distance'; -import { default as TimeOfImpact, TOIInput, TOIOutput } from '../src/collision/TimeOfImpact'; -import { default as DynamicTree } from '../src/collision/DynamicTree'; - -import { default as stats } from '../src/util/stats'; // todo: what to do with this? - -import { ContactImpulse } from '../src/dynamics/Solver'; -type _ContactImpulse = InstanceType; -export type { _ContactImpulse as ContactImpulse } - -/** @deprecated Merged with main namespace */ -export const internal = {}; - -// @ts-ignore -internal.CollidePolygons = CollidePolygons; -// @ts-ignore -internal.Settings = Settings; -// @ts-ignore -internal.Sweep = Sweep; -// @ts-ignore -internal.Manifold = Manifold; -// @ts-ignore -internal.Distance = Distance; -// @ts-ignore -internal.TimeOfImpact = TimeOfImpact; -// @ts-ignore -internal.DynamicTree = DynamicTree; -// @ts-ignore -internal.stats = stats; - -// @ts-ignore -Solver.TimeStep = TimeStep; - -// @ts-ignore -Distance.testOverlap = testOverlap; -// @ts-ignore -Distance.Input = DistanceInput; -// @ts-ignore -Distance.Output = DistanceOutput; -// @ts-ignore -Distance.Proxy = DistanceProxy; -// @ts-ignore -Distance.Cache = SimplexCache; - -// @ts-ignore -TimeOfImpact.Input = TOIInput; -// @ts-ignore -TimeOfImpact.Output = TOIOutput; diff --git a/testbed/main.ts b/testbed/main.ts new file mode 100644 index 00000000..e31a70ea --- /dev/null +++ b/testbed/main.ts @@ -0,0 +1,3 @@ +export * from './index'; +import * as planck from './index'; +export default planck; diff --git a/testbed/server.js b/testbed/server.cjs similarity index 96% rename from testbed/server.js rename to testbed/server.cjs index 1fc6954d..ceadd27b 100644 --- a/testbed/server.js +++ b/testbed/server.cjs @@ -52,13 +52,13 @@ app.listen(app.get('port'), function() { const loadConfigFile = require('rollup/dist/loadConfigFile'); -loadConfigFile(path.resolve(__dirname, '../rollup.config.js')).then( +loadConfigFile(path.resolve(__dirname, '../rollup.config.cjs')).then( async ({ options, warnings }) => { console.log(`We currently have ${warnings.count} warnings`); warnings.flush(); options = options - .filter(opt => opt.output[0].file.indexOf('.min.js') === -1) + .filter(opt => opt.output[0].file.endsWith('planck-with-testbed.min.js')) .map(opt => ({...opt, treeshake: false })); const watcher = rollup.watch(options); diff --git a/tsconfig.json b/tsconfig.json index 7ba8311f..8e89ae6d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,11 +5,18 @@ } }, "compilerOptions": { - "module": "commonjs", + "module": "ES2015", // "strictNullChecks": true, // "noImplicitAny": true, "lib": ["ES2015", "DOM"], "stripInternal": true, - "target": "ES5" - } + "target": "ES5", + "esModuleInterop": true, + "moduleResolution": "Node", + "resolveJsonModule": true, + }, + "exclude": [ + "node_modules", + "dist" + ] } diff --git a/types/globals/index.d.ts b/types/globals/index.d.ts index 74dc17bc..f0a13ab3 100644 --- a/types/globals/index.d.ts +++ b/types/globals/index.d.ts @@ -1,2 +1,2 @@ -declare const DEBUG: boolean; +declare const CONSTRUCTOR_FACTORY: boolean; declare const ASSERT: boolean;